10 PRINT CHR$(26)
20 GOSUB 1000
30 TOP = 0 : BOTTOM = 23 : LEFT = 0 : RIGHT = 79
40 CHARACTER = OXEGE.OUTLINE.DIM : ATTRIBUTE = ATTRIBUTE.BIT.ALTERNATE.FONT
50 GOSUB 2040
60 TOP = 1 : BOTTOM = 22 : LEFT = 1 : RIGHT = 78
70 CHARACTER = OXEGE.FILL.QUARTER
80 GOSUB 1890
90 TOP = 3 : BOTTOM = 9 : LEFT = 40 : RIGHT = 60
100 CHARACTER = 32
110 ATTRIBUTE = 0
120 GOSUB 1890
130 CHARACTER = OXEGE.OUTLINE.FULL : ATTRIBUTE = ATTRIBUTE.BIT.ALTERNATE.FONT
140 GOSUB 2040
150 I$ = INKEY$ : IF I$ = "" THEN 150
160 PRINT CHR$(26)
170 END
1000 REM =============================
1010 REM        OXEGE.ASC
1020 REM
1030 REM     The Osborne Executive
1040 REM  Enhanced Graphics Environment
1050 REM
1060 REM ==============================
1070 REM
1080 REM     by Ted A. Campbell
1090 REM     Raleigh Osborne Computer Club
1100 REM     Email:  tcamp@ecsvax
1110 REM
1120 REM =================================
1130 REM
1140 REM
1150 REM     OXEGE.ASC is a series of BASIC
1160 REM subroutines to handle special graphics
1170 REM for the Osborne Executive (tm) com-
1180 REM puter.  These subroutines require
1190 REM that the special character set 
1200 REM OXEGE.CHR be loaded into font RAM
1210 REM before the program will execute
1220 REM properly.
1230 REM
1240 REM =================================
1250 REM 
1260 REM Subroutine 1240: INITIALIZE
1270 REM     This subroutine sets up variables
1280 REM     used in OXEGE.  call it first
1290 REM     in any program using OXEGE.
1300 REM
1310 VIDEO.RAM.CHARACTER.LOCATION! = &HC000
1320 VIDEO.RAM.ATTRIBUTE.LOCATION! = &HD000
1330 ATTRIBUTE.BIT.INVERSE = 128
1340 ATTRIBUTE.BIT.BRIGHT  = 128
1350 ATTRIBUTE.BIT.UNDERLINE = 64
1360 ATTRIBUTE.BIT.BLINK     = 32
1370 ATTRIBUTE.BIT.ALTERNATE.FONT = 16
1380 DATE.LOCATION = 63732!
1390 TIME.LOCATION.HOUR = 63734!
1400 TIME.LOCATION.MINUTE = 63735!
1410 TIME.LOCATION.SECOND = 63736!
1420 CONSOLE.READY = 1
1430 AUXILIARY.READY = 255
1440 OXEGE.OUTLINE.DIM   = 117
1450 OXEGE.OUTLINE.FULL  = 109
1600 OXEGE.FILL.FULL           = 127 
1610 OXEGE.FILL.THREE.FOURTHS  = 125 + ATTRIBUTE.BIT.INVERSE
1620 OXEGE.FILL.HALF           = 126
1630 OXEGE.FILL.QUARTER        = 125
1640 RETURN
1650 REM ====================================================
1660 REM
1670 REM   Subroutine  CPOKE
1680 REM
1690 REM   Pokes a chatacter into Video RAM
1700 REM
1710 REM      Input:   CHARACTER, LINE, COLUMN
1720 REM
1725 LOCATION!=VIDEO.RAM.CHARACTER.LOCATION!+(DISPLAY.LINE*128)+DISPLAY.COLUMN
1730 OUT 0,65
1740 POKE LOCATION!,CHARACTER
1750 OUT 0,1
1760 RETURN
1770 REM ==============================================================
1780 REM
1790 REM    Subroutine  APOKE
1800 REM    
1810 REM    Pokes an attribute into Video RAM
1820 REM    
1830 REM       Input:    ATTRIBUTE, LINE, COLUMN
1840 REM
1845 LOCATION!=VIDEO.RAM.ATTRIBUTE.LOCATION!+(DISPLAY.LINE*128)+DISPLAY.COLUMN
1850 OUT 0,65
1860 POKE LOCATION!,ATTRIBUTE
1870 OUT 0,1
1880 RETURN
1890 REM ==============================================================
1900 REM
1910 REM   Subroutine   FILL
1920 REM
1930 REM   Fill a screen area with a specific character and attribute
1940 REM
1950 REM      Input:   TOP, LEFT, BOTTOM, RIGHT
1960 REM               CHARACTER, ATTRIBUTE
1970 FOR DISPLAY.LINE = TOP TO BOTTOM
1980     FOR DISPLAY.COLUMN = LEFT TO RIGHT
1990         GOSUB 1650
2000         GOSUB 1770
2010     NEXT DISPLAY.COLUMN
2020 NEXT DISPLAY.LINE
2030 RETURN
2040 REM ==============================================================
2050 REM
2060 REM   Subroutine OUTLINE
2070 REM
2080 REM   Draws an outline using OXEGE characters
2090 REM
2100 REM       Input:  TOP, LEFT, BOTTOM, RIGHT, CHARACTER, ATTRIBUTE
2110 REM
2120 SAVE.CHARACTER = CHARACTER
2130 CHARACTER = SAVE.CHARACTER+2
2140 DISPLAY.LINE = TOP
2150 FOR DISPLAY.COLUMN = LEFT+1 TO RIGHT -1
2160     GOSUB 1650
2170     GOSUB 1770
2180 NEXT DISPLAY.COLUMN
2190 DISPLAY.COLUMN = RIGHT : CHARACTER = SAVE.CHARACTER+5
2200     GOSUB 1650
2210     GOSUB 1770
2220 CHARACTER = SAVE.CHARACTER+1
2230 FOR DISPLAY.LINE = TOP+1 TO BOTTOM-1
2240     GOSUB 1650
2250     GOSUB 1770
2260 NEXT DISPLAY.LINE
2270 DISPLAY.LINE = BOTTOM : CHARACTER = SAVE.CHARACTER+7
2280     GOSUB 1650
2290     GOSUB 1770
2300 CHARACTER = SAVE.CHARACTER+3
2310 FOR DISPLAY.COLUMN = RIGHT-1 TO LEFT+1 STEP -1
2320     GOSUB 1650
2330     GOSUB 1770
2340 NEXT DISPLAY.COLUMN
2350 DISPLAY.COLUMN = LEFT : CHARACTER = SAVE.CHARACTER+6
2360     GOSUB 1650
2370     GOSUB 1770
2380 CHARACTER = SAVE.CHARACTER+0
2390 FOR DISPLAY.LINE = BOTTOM-1 TO TOP+1 STEP -1
2400     GOSUB 1650
2410     GOSUB 1770
2420 NEXT DISPLAY.LINE
2430 CHARACTER = SAVE.CHARACTER+4 : DISPLAY.LINE = TOP
2440     GOSUB 1650
2450     GOSUB 1770
2460 RETURN
T DISPLAY