IMD 1.16: 1/06/2007 9:53:15 FOGCPM.161 --FOGCPM161DRAW COM*DRAWDEMOCOM* HI-RES DOCHI-RES DOCZ !"#$%&'()*-03-00 87 HI-RES MAC+,-./0123456789:HI-RES MAC7;<=>?@A-CPM161 DOCGRPH-MODDRWBCDEFGHIJKLMNOPQGRPH-MODDRW4RSTUVWXFONT PIXYPIXGEN BASZ[\]^_`abcdefghiPIXGEN BASjPIXGEN DOC0klmnopPIXRN DATqSCRPRINTCOMrSCRPRINTDOCstuKEYTEST COMvKEYTEST MACwxyzMAKE COM{|}~MAKE DOC&MAKE CQ ?MAKEFILE CEN-INP COMCEN-INP MQCOThis is the disk name. SANSB16 FON@ OSANSB18 FON lgldSANSC14 FON5y 5SANSC16 FON{ DSANSC18 FON6~ USANSI14 FON O CSANSI16 FONR TSANSI18 FON p OiSANSC20 FONn gSANSC24 FON̄ SANSB24 FONk" SANSI20 FONX ܂4.2Installed printer - Epson MX-80 with graftraA2L 1@@!=@! ͡!?w .2 Draw Program V2.0 - Copyright (c) 1986 by Digital Arts This program may be copied and shared but not sold or included with any other items for sale without the written permission of Digital Arts.*BRW Character(s) in use -! RW Character(s) still available  Clear screen and begin a new drawing Draw (Resume current drawing) Help Load ASCII character set from disk

Print Read a file Quit and exit to CP/M Write a file Press "C", "D", "H", "L", "P", "R", "Q" or "W"CDHLPRQW  ] 5 G  Ready to load character set from disk.!GC  Draw Routine Subcommands - Press any key to exit. If you run out of characters, try the ^R command. ------------------------------------------------ | 7 | 8 | 9 | | Up and left | Up | Up and right| |----------------------------------------------| | 4 | 5 | 6 | | Left | Center cursor | Right | |----------------------------------------------| | 1 | 2 | 3 | |Down and left | Down |Down and right| |----------------------------------------------| | 0 | . | | | Reset bit | Set bit | | ------------------------------------------------ ^D = Draw (set bits) ^E = Erase (reset bits) ^K = Put next keypress in drawing ^M = Move cursor ^R = Redraw and recover unused characters ^P = Print Exits to main menul @!?w .B;@l x;@ͬ  ( #|(+>0R0!X C.;@0;@ ʬ  B 8#9 6 3+2+1 4 7 #5!?w)@ :ͨ !GK( !GK87 ($ This is not a drawing filed !?wl _;@ !. !. !:W;@8  {# {, _:{ y#[R O!. > !. O:y :G x]T +R8R0 + +(a{_>ͨ >ͨ >=ͨ > ͨ > ͨ __>ͨ 7 ~ͨ ~#( ~#(* >w o&6 l _NY 7 ͇ :  YeN K Press to continuel  ɒ 0 _͝))))0 O( %9y 1 45F#~ #ɧRЯogRROe)8,>!#jB0 = }z x OGz o>g>_W A Я_>W>OG> !#jjB0 = }!)0xzA xi`A MDo>g>_W>!)0 0= x_ R8xG90͝v8))))0ͨ _(y(  {ͨ x>0ܨ i {))))_YP i KBz | ))))>O\.(  File not foundd \1.ĉ8@8<>> x <> This file already exists! \ Do you want to overwrite it? (Y/N) ?͇ Error reading frowriting t diskd 7\. Enter the file name:! > 7" S bk6# ͇\͇<\͠#!!~#fo\ͻ$!!~#fo^#)"!#_^#V_^#VOF#~#^#V#(N#l @8_kbA(#> ͨ ͨ y "d^#*!ܷ͘8@_ \ Which drive (A-P)ͷͨ l ~ AQ?|AN_|OGN!N!`Nx2"#7:QO<2y:>OgB ain or lternate character setMA( ͯԯsB1GC>>>>>A͚B{BsB1GC{BsB1GC>>ھ@}G7O<<<y?ھ@Do> AEOhAz ## ~١&͆Aھ@xAz̃B( yOMAw@{B{րz8&>_>W))))z OzW oz<  >_>W)=|ge.<@~怳w ~揲wz( ( ( ~yy/yXA> ͼAGKz(^#V#z< ͥA8++s#r#*B>> 8]T#"B!)0>!))0 0= Oe)8,6# x sB1GCA!"B!GK!P^#V# #+r+s##{րz܃B8ͥA܃B+r+s##@yA # y {B))))GC !"B2B!GK6#6# AY4.2Installed printer - Epson MX-80 with graftraA2L 1@@!;@! ͟!?w .2 Draw Demo V2.0 - Copyright (c) 1986 by Digital Arts This program may be copied and shared but not sold or included with any other items for sale without the written permission of Digital Arts.*BRU Character(s) in use -! RU Character(s) still available  Clear screen and begin a new drawing Draw (Resume current drawing) Help Load ASCII character set from disk

Print Read a file Quit and exit to CP/M Write a file Press "C", "D", "H", "L", "P", "R", "Q" or "W"CDHLPRQW  [ 3 E  Ready to load character set from disk.!*C  Draw Routine Subcommands - Press any key to exit. If you run out of characters, try the ^R command. ------------------------------------------------ | 7 | 8 | 9 | | Up and left | Up | Up and right| |----------------------------------------------| | 4 | 5 | 6 | | Left | Center cursor | Right | |----------------------------------------------| | 1 | 2 | 3 | |Down and left | Down |Down and right| |----------------------------------------------| | 0 | . | | | Reset bit | Set bit | | ------------------------------------------------ ^D = Draw (set bits) ^E = Erase (reset bits) ^K = Put next keypress in drawing ^M = Move cursor ^R = Redraw and recover unused characters ^P = Print Exits to main menuj @!?w .A@j x@ͪ  ( #|(+>0R0!X C.@0@ ʪ ʾ A 8#9 6 3+2+1 4 7 #5!?w@ :ͦ !*K& !*K87 ($ This is not a drawing fileb !?wj _@ !, !, !:W@8  {# {* _:{ y#[R O!, > !, O:y :G x]T +R8R0 + +(a{_>ͦ >ͦ >=ͦ > ͦ > ͦ __>ͦ 7 ~ͦ ~#(   ~#(* >w o&6 j _NY 7 ͅ 8  YeN I Press to continuej  ɐ 0 _͛))))0 O& %9y / 45F#~ #ɧRЯogRROe)8,>!#jB0 = }z x OGz o>g>_W ? Я_>W>OG> !#jjB0 = }!)0xz? xi`? MDo>g>_W>!)0 0= x_ R8xG90͛t8))))0ͦ _(y(  {ͦ x>0ܦ g {))))_YP g KBz | ))))>O\,(  File not foundb \/,ć8>8<>> x <> This file already exists! Z Do you want to overwrite it? (Y/N) ?ͅ Error reading frowriting t diskb 7\, Enter the file name:! > 7" S bk6# ͅ\ͅ<\͞#!!~#fo\͹$!!~#fo^#)"!#_^#V_^#VOF#~#^#V#(N#j @8_kbA(#> ͦ ͦ y "b^#*!͖ܵ8@_ \ Which drive (A-P)͵ͦ j | AQ?|AL_|OGL!L!`Lx2 !7:QO<2y:>Oe@ ain or lternate character setMA( ͭԭsB1*CA}B{BsB1*C{BsB1*C>>ڡ@}G7O<<<y?ڡ@Do> AEOKAz ## ~١&iAڡ@x@zfB( yO0Awͮ@{B{րz8&>_>W))))z OzW oz<  >_>W)=|ge.<@~怳w ~揲wz( ( ( ~yy/yXͮA> ͟A*Kz(^#V#z< ͈A8++s#r#*B>> 8]T#"B!)0>!))0 0= Oe)8,6# x sB1*CA!"B!*K!P^#V# #+r+s##{րzfB8͈AfB+r+s##ͮ@y@ # y {B))))*C !"B2B!*K6#6# AYHI-RES.DOC Copyright (c) 1986 by Digital Arts Nov. 6, 1986 Digital Arts Don Rowe (home) P. O. Box 50105 4052 Oregon St. #2 San Diego, CA 92105 San Diego, CA 92104 (619) 299-4536 Thi i par o packag o five copyrighted files: HI-RES.DOC (The file you are reading now) DRAWDEMO.CO ( hig resolutio drawin progra whic work wit standar Executive) DRAW.CO ( drawin progra whic require specia hardwar upgrade) GRPH-MOD.DR (Schemati fo th hardwar modification require b DRAW.CO whic i readabl b DRAW.CO bu no b DRAWDEMO.COM) HI-RES.MA (Z8 sourc cod fo th graphic drive routines) Yo ma mak copie fo you ow us an shar the wit other bu non o thes file ma b sol o include wit an othe item fo sal withou th writte permissio o Digita Arts I yo lik thes programs contributio ma b sen t th abov address Contribution o $25.0 o mor wil b acknowledge an yo wil receiv th lates update wil d m bes t respon t reasonabl question o comment i yo enclos a SASE. *** Introduction *** On thin standar Executiv lack i tru graphic capabilities Ther i limite graphic characte se whic i usabl fo relativel larg object an th programmabl characte se allow contro o individua pixels bu onl 25 character ar available Eve i yo reprogramme al th characters yo coul onl fil abou line o th displa wit hig resolutio graphics Yo coul creat you ow bloc graphi characte se b dividin a 8*1 pixe characte cel int equa blocks eac pixel wid an pixel high Yo coul ge bette resolutio a th expens o equa bloc siz b dividin th characte cel int blocks 4 o th block bein pixel wid b pixel hig an th othe block bein pixel wid b pixel high Dividin th characte cel int block require 25 distinc character t allo fo al possibl combination o bloc pattern withi characte cell I yo ge sneaky yo ca cu th numbe o character programme i hal b usin revers video bloc o an block of i th sam a bloc of an block o i revers video. Resolutio ca b increase greatl wit hardwar modification Wit tw inexpensiv TT chip an tw ne memor chips yo ca increas th numbe o character availabl t 1024 Yo ca fil ove hal th scree wit hig resolutio graphic an yo ge t choos whic hal t fill Yo ca hav tal skinn block shor fa on o us rectangl i th cente o th scree fo 510 b 20 pixe graphic display I you graphic displa leave nearl hal o th characte cell blank yo ca us th ful 64 b 24 pixe capabilitie o th Executive A lon a yo don' reprogra th mai characte set yo ca mi tex an graphic a will I lowe resolutio bloc graphic mode yo ca divid eac characte cel int 1 block pixel wid an pixel high Thi give yo 102 combination o block withi eac characte cell I yo us th revers vide attribute yo nee onl progra 51 distinc characters leavin yo anothe 51 character fo specia uses. *** DRAWDEMO.COM *** Thi progra wil wor wit standar Executive I allow hig resolutio drawing erasing movin th cursor settin o resettin individua pixels savin an loadin drawing fro disk an printin you masterpiec whe i i complete I work b programmin custo character a needed I wil us al 12 character o th alternat characte se an th 3 specia graphic character o th mai characte set Onc al 16 availabl character ar use up you drawin i finishe whethe yo lik i o not I you drawin i small ther wil b n problem Yo could fo instance creat 12 b 10 pixe drawin i th cente o th screen Thi woul b 1 characte cell wid b 1 characte cell tall usin al availabl characters I yo leav som characte cell blank thes ar availabl t expan th heigh o widt o you drawing Th mai men alway show th numbe o character remaining littl experimentatio shoul clarif th capabilities. Onc yo loa DRAWDEMO yo wil b aske whethe yo wan t loa th characte se fro driv o driv B Thi load th regula ASCI character o th mai characte set allowin the t b include i yo drawin o printed Onc th characte se i loade yo wil se th mai men whic show ho man character remai an give yo numbe o options Yo ma sav o loa drawin fro disk eras th curren  drawin an begi ne one continu drawin i progress o prin th drawing Th "Help optio display th key an subcommand availabl whil drawing Yo ma exi th drawin a an tim b pressin Thi return yo t th mai men allowin yo t prin o sav you drawin o disk T retur t you drawin i progres fro th mai menu us th "Draw option. Afte drawin fo awhile yo wil finall ge t poin wher al availabl character ar use up Th curso wil simpl refus t move Sometimes th ^ (Redraw comman wil b abl t picku littl extr space quic retur t th mai men wil sho yo ho man character remain Whe th scree i redrawn an character tha hav sinc becom completel blan ar recovere an mak availabl again Thi als happen whe yo retur t th mai men an the continu drawing Eve thoug yo ru ou o ne characters yo ca continu t chang existin section o th drawing Changin th drawin simpl reprogram th character alread ther instea o creatin ne ones I yo eras portion o you drawin wit th "Erase comman o pu space int th drawin wit th ^ (Keypress comman an the us th "Redraw command yo ca gai fe mor character t allo yo t continu littl longer Remembe tha eve movin th curso ma requir programmin ne temporar character whic ma onl be recovered with ^R. * Customizing DRAWDEMO or DRAW * Severa installatio option ar available Thes ar th sam fo bot DRAWDEM an DRAW Address Size in bytes Description 103H 1 Curso typ t restor o exit Thi i th las byt o th command ES perio IF MESG .PRINTX * MESG is on * ELSE .PRINTX * MESG is off * ENDIF ENDM ;The low X and Y coordinates must be the lower left of a character cell ;The high X and Y coordinates must be the upper right of a character cell LOCOL EQU 0 ;Offset to add to X coordinate for current window HICOL EQU 640-1 ;Max X coordinate for current window LOROW EQU 0 ;Offset to add to Y coordinate for current window HIROW EQU 240-1 ;Max Y coordinate for current window ;Validity check on above equates TEMP ASET LOCOL - 8*(LOCOL/8) TEMP ASET TEMP + (HICOL+1) - 8*((HICOL+1)/8) TEMP ASET TEMP + (HIROW+1) - 10*((HIROW+1)/10) TEMP ASET TEMP + LOROW - 10*(LOROW/10) IF TEMP NE 0 .PRINTX ! Error in LOCOL, HICOL, LOROW or HIROW equates ! ENDIF ROW_BYTS EQU (HICOL-LOCOL+1)/8 ;Number of bytes in a row COL_BYTS EQU (HIROW-LOROW+1)/10 ;Number of bytes in a column ;Character mask allows wrap-around to use lower 32 graphics characters ;Set to 0 to disable wraparound IF DEMO CHARMASK EQU 256-1 ;Wrap around to 0 after 255 ELSE CHARMASK EQU 1024-1 ;Wrap around to 0 after 1023 ENDIF ;These equates determine the lowest and highest usable graphics characters LOCHAR EQU 128 ;1st character (of 1024) available IF DEMO HICHAR EQU 256+(32 AND CHARMASK)-1 ;Highest character to use ELSE HICHAR EQU 1024+(32 AND CHARMASK)-1 ;Highest character to use ENDIF ;Command equates passed in register B CMDSET EQU 0 ;Command to set bit CMDRST EQU 1 ;Command to reset bit CMDTOG EQU 2 ;Command to toggle bit CMDGET EQU 3 ;Command to return bit status in A CMDASC EQU 4 ;Put ASCII character in DE at cursor position ;------------- ;Fixed Equates ;------------- VIDMEM EQU 0C000H ;Video character memory VIDATRB EQU 0D000H ;Video attribute memory CHRBNK1 EQU 10000000B ;Bank select code for 1st 4 character sets CHRBNK2 EQU 10100000B ;Bank select code for 2nd 4 character sets VIDBANK EQU 01000000B ;Bank select for video memory PBANK EQU 0 ;Bank select port PGRDAT EQU 1CH+2 ;Graphics data port PGRCTR EQU PGRDAT+1 ;Control port BGRPH EQU 1 ;Control bit for graphics hardware ;Low = graphics enabled. ;----------------------------- ;Program begins executing here ;----------------------------- COD_BEG: INIT: LD (MSTACK),SP ;Save current stack LD SP,STACK ;New stack ;Setup graphics mode in hardware IF NOT DEMO ;No hardware mod if demo version LD A,4 ;Select data register OUT (PGRCTR),A LD A,0FFH ;Make all bits high OUT (PGRDAT),A XOR A OUT (PGRCTR),A ;Select direction register LD A,0FFH OUT (PGRDAT),A ;Make all bits outputs LD A,4 OUT (PGRCTR),A ;Select data register again LD A,NOT BGRPH OUT (PGRDAT),A ;Make only this bit low ENDIF CALL CLEAR ;Clear screen CALL RESET ;Reset all graphics characters LD SP,(MSTACK) RET ;------------------------- ;Disable graphics hardware ;------------------------- DE_INIT: LD (MSTACK),SP ;Save current stack LD SP,STACK ;New stack ;Turn off graphics mode in hardware IF NOT DEMO ;No hardware mod if demo version IN A,(PGRDAT) OR BGRPH OUT (PGRDAT),A ;Make it high now ENDIF ;Copy ASCII character images back to bank 8 IF ASCII AND LOCHAR LT 128 IN A,(PBANK) PUSH AF OR CHRBNK1 ;Enable bank 8 OUT (PBANK),A LD BC,16*(128-LOCHAR) ;Number of bytes to move LD DE,16*LOCHAR ;Target address LD HL,MCHARDAT+(16*LOCHAR) ;ASCII character data LDIR POP AF OUT (PBANK),A ;Original bank selection restored ENDIF LD SP,(MSTACK) RET  .COMMENT ~ Manipulate bit: C = Y coordinate, HL = X coordinate Register B holds code for action to take CMDSET = Set bit CMDRST = Reset bit CMDTOG = Toggle bit CMDGET = Return status of bit in A CMDASC = Display ASCII character in DE at cursor position No registers are altered except AF Interrupts are disabled on entry and enabled on exit Returns Carry if unable to display because of range errors or because available characters are exhausted ~ DSPBIT: DI ;Make everything go faster LD (MSTACK),SP ;Save current stack LD SP,STACK ;New stack PUSH BC PUSH DE PUSH HL EXX PUSH BC PUSH DE PUSH HL EXX ;Engage main registers again ;Switch to alternate registers for now, need bit column in HL' PUSH BC ;Copy command in B to D' PUSH HL ;Bit column to HL' EXX POP HL POP DE IF LOCOL NE 0 ;Add offset if any LD BC,LOCOL ;Column offset ADD HL,BC JP C,DSPX ;Wrap around not allowed ENDIF ;Make sure column is within range LD A,LOW HICOL   SUB L LD A,HIGH HICOL SBC A,H JP C,DSPX ;Can't do it if column past max ;Convert column in HL to character column (0-79) in HL' and bit mask in C' LD A,L AND 111B ;Get bit within column ;Convert value in A (0-7) to bit pattern (10000000-00000001) LD B,A ;Counter XOR A ;Clear A to start INC B ;In case it was 0 SCF ;Bit to shift NXTB: RRA ;Shift bit DJNZ NXTB LD C,A ;Bit pattern now in C' ;Get character column in HL' now REPT 3 SRL H RR L ENDM ;HL = HL/8 ;Column (0-79) now in HL', bit within column in C' ;If this is a new column, clear saved column image data IF NOT FULSCRN ;Only keep image for current column if false LD A,(MNXTCOL) ;Current column in use CP L LD A,L LD (MNXTCOL),A ;Update current column CALL NZ,CLRCOL ENDIF EXX ;Bank to main registers LD A,C ;Need row in A ;Get row now IF LOROW NE 0 ADD A,LOROW JP C,DSPX ;Wraparound not allowed ENDIF ;Check row for valid range CP HIROW+1 CCF JP C,DSPX ;Can't do it if row too big ;Convert row to offset from top of screen NEG ADD A,240-1 ;Convert row to offset from top LD L,A ;Row to L LD A,10 CALL DIVLA ;L r A = L/A LD B,L ;Need row in B LD C,A ;Remainder in C ;Character row is in B, vertical offset from top row is in C ;Character column in HL', bit to manipulate in C' ;Command is in D' ;Find character image with current column data CALL CHARADR ;Get address of character image in HL ;If fetching bit image, do it now and get out quick EXX LD A,D ;Command EXX CP CMDGET JR NZ,NOTGET ;Not fetching, proceed as usual ;Fetching, HL holds base address, C holds offset, E holds bit mask ;Load masked bit into A and set flags LD B,0 INC HL INC HL ;Point to 1st byte of image ADD HL,BC ;Byte to fetch LD A,(HL) EXX AND C ;Bit mask JR DSPX ;Done NOTGET: CALL SETCHAR ;Set code in DE and (HL), assign if needed ;HL => character bit image, B holds row for display ;Carry set if no character available for display JP C,DSPX ;No character available if C LD A,B ;Row for display in A CALL DSPCHAR ;Load character in DE into video memory ;If just displaying ASCII, all done EXX LD A,D EXX CP CMDASC PUSH AF CALL Z,LOADASCI ;Copy ASCII image if C POP AF JR Z,DSPX ;All done ;Character stored, update bit image in memory ;Move pointer to proper byte within character PUSH HL ;Save base pointer LD B,0 ;BC = offset to top of character image ADD HL,BC ;HL => to byte for this pixel EXX LD A,C ;Character bit mask EXX ;Process bit command in D', bit pattern in C LD C,A ;Bit to process CALL CMDSUB LD (HL),A ;Bit pattern updated POP HL ;Base pointer restored ;Write character to memory CALL DSPBITS ;Load bit pattern into character memory DSPX: POP HL POP DE POP BC EXX POP HL POP DE POP BC LD SP,(MSTACK) EI RET ;---------------------------------------------------- ;Load character bit pattern into character memory ;DE holds character, HL = base address of bit patterns ;If character is < LOCHAR, do nothing ;----------------------------------------------------- DSPBITS: PUSH BC PUSH DE PUSH HL LD A,E SUB LOW LOCHAR LD A,D SBC A,HIGH LOCHAR JR C,DSPBTX ;Wrap around to 0 if needed IF CHARMASK LD A,LOW CHARMASK AND E LD E,A LD A,HIGH CHARMASK AND D LD D,A ENDIF EX DE,HL ;Base pointer to DE, character code to HL REPT 4 ;Multiply by 16 ADD HL,HL ENDM EX DE,HL ;Target address to DE, source in HL ;Extract bit 13 from character address LD A,D AND 00100000B LD C,A LD A,D AND 00011111B ;Mask off bit 13 LD D,A ;HL holds target address ;Source address in DE, switch in bank and move character pattern IN A,(PBANK) PUSH AF OR CHRBNK1 OR C ;Select correct chip OUT (PBANK),A LD BC,10 ;Number of bytes to move LDIR POP AF OUT (PBANK),A DSPBTX: POP HL POP DE POP BC RET ;----------------------------------------------------- ;Display character in DE in video memory ;If character is undefined (FFFF) just display a blank ;A holds row, HL' holds column ;----------------------------------------------------- DSPCHAR: PUSH BC PUSH DE PUSH HL LD L,A ;Row to L ;If DE = FFFF, then display a blank LD A,D AND E INC A ;A will be 0 if DE was FFFF JR NZ,DSPCHR1 LD DE,20H ;ASCII blank DSPCHR1: ;Wrap around to 0 if needed IF CHARMASK LD A,LOW CHARMASK AND E LD E,A LD A,HIGH CHARMASK AND D LD D,A ENDIF EX DE,HL ;Move character code into HL ADD HL,HL ;Bit 7 of L to bit 0 of H SRL L ;7 LS bits in L, 3 MS bits in H LD A,H REPT 4 ;Multply by 16 ADD A,A ENDM LD H,A ;Attributes set in H EX DE,HL ;Bit pattern in DE, row in L ;Get row address for video memory LD H,L LD L,0 SRL H RR L ;HL = HL * 128 ;Get column address EXX PUSH HL ;Column on stack EXX EX DE,HL ;Row address to DE EX (SP),HL ;Column address to HL ADD HL,DE ;Complete offset in HL LD DE,VIDMEM ADD HL,DE ;Actual absolute address now in HL POP DE ;Restore character bits ;Merge in character with current attributes IN A,(PBANK) PUSH AF OR VIDBANK OUT (PBANK),A ;Switch in video memory bank LD A,(HL) AND 80H OR E LD (HL),A ;LSB of character written LD BC,VIDATRB-VIDMEM ADD HL,BC ;Advance HL LD A,(HL) AND NOT 70H OR D LD (HL),A ;Complete character stored POP AF OUT (PBANK),A ;Turn off video bank POP HL POP DE POP BC RET ;----------------------------------------------------------------- ;Process command in D, SET, RESET, TOGGLE, etc. ;D holds command, A holds bit to process, (HL) holds current image ;----------------------------------------------------------------- CMDSUB: ;Try set first EXX LD A,D ;Command to process EXX CP CMDSET JR Z,DOSET ;Try reset next CP CMDRST JR Z,DORST ;Try toggle or cursor CP CMDTOG ;Toggle JR Z,DOTOG ;None of the above LD A,(HL) ;Don't change anything RET DOSET: LD A,C OR (HL) RET DORST: LD A,C CPL AND (HL) RET DOTOG: LD A,C XOR (HL) RET ;--------------------------------------------------------- ;Get pointer to character bit pattern in MCOLDAT in HL ;1st 2 bytes of bit pattern is character to display ;On entry, row must be in B, col. in HL' ;--------------------------------------------------------- CHARADR: PUSH BC PUSH DE ;Adjust for window offset if needed IF HIROW NE 240-1 LD A,B SUB 0+((240-1)-HIROW)/10 ;Offset from top of screen LD E,A ELSE LD E,B ENDIF LD D,0 ;Row within window in DE IF FULSCRN LD BC,12*ROW_BYTS ;Number of bytes in row CALL MLTBCDE ;DEHL = BC * DE PUSH HL ;Save current partial pointer EXX PUSH HL ;Get column EXX ;Adjust for window column offset if needed IF LOCOL EQ 0 POP DE ;Column to DE ELSE POP HL LD DE,LOCOL/8 ;Offset within window AND A SBC HL,DE EX DE,HL ;Corrected column to DE ENDIF LD A,10+2 ;Length of each column entry CALL MLTADE ;AHL = A * DE POP DE ;Previous partial product ADD HL,DE ;Complete pointer now in HL ELSE LD A,10+2 ;Number of bytes/character image CALL MLTADE ;AHL = A * DE ENDIF LD DE,MCOLDAT ;Base address ADD HL,DE ;HL => this character image POP DE POP BC RET ;---------------------------------------------------------------- ;Return character code in DE and (HL), HL must point to bit image ;If displaying ASCII, use that code ;Use current code if assigned ;Assign new code if none, Carry set if all characters used up ;On return, HL points to first byte of bit image ;---------------------------------------------------------------- SETCHAR: PUSH BC ;If CMDASC, then display ASCII character in DE EXX LD A,D ;Command EXX CP CMDASC JR Z,SETCH1 LD E,(HL) INC HL LD D,(HL) ;Current character in DE INC HL ;Advance to bit pattern ;See if this character is already assigned LD A,D AND E ;Both will be FF if no character assigned INC A ;0 if not yet assigned JR NZ,SETCHX ;Already there if NZ ;Assign a character to this character cell and put into video memory CALL GET_NEXT ;Get next character in DE ;DE holds next available character, if none, DE=" " and carry is set JR C,SETCHX ;Can't display if C ;Store character in column image data area DEC HL DEC HL ;Back to beginning SETCH1: LD (HL),E ;Character code stored INC HL LD (HL),D INC HL ;Back to image data AND A ;Clear carry SETCHX: POP BC RET ;--------------------------------------------------- ;Load DE with next available character from (MNXTCHR ;If no more characters are available, DE = " " ;and the carry flag is set ;--------------------------------------------------- GET_NEXT: PUSH HL LD HL,(MNXTCHR) ;Next character code ;Make sure another character is available LD A,LOW HICHAR SUB L LD A,HIGH HICHAR SBC A,H LD DE,20H ;In case nothing available JR C,GETNX1 ;Can't display if C ;OK so far, increment next character LD E,L LD D,H ;Character to DE INC HL LD (MNXTCHR),HL GETNX1: POP HL RET ;------------------------------- ;Multiply A * DE, product in AHL ;------------------------------- MLTADE: PUSH BC LD B,8 ;Counter LD HL,0 ;Initialize product MLTLP: ADD HL,HL ;Shift product RLA ;Rotate multiplier JR NC,MLT1 ADD HL,DE MLT1: DJNZ MLTLP POP BC RET ;--------------------------------- ;Multiply BC * DE, product in DEHL ;--------------------------------- MLTBCDE: LD A,16 ;Counter LD HL,0 ;Initialize product MLTBCLP: ADD HL,HL ;Rotate product EX DE,HL ADD HL,HL ;Rotate multiplier EX DE,HL JR NC,MLTBC1 ADD HL,BC JR NC,MLTBC1 INC DE MLTBC1: DEC A JR NZ,MLTBCLP ;Go for the count RET ;-------------------------------------------- ;Divide L by A, quotient in L, remainder in A ;-------------------------------------------- DIVLA: PUSH BC LD C,A ;Divisor to C LD B,8 ;Number of bits to divide LD H,L ;Need dividend here XOR A ;Initialize remainder DIVLP: ADD HL,HL ;Rotate 1st bit of dividend RLA ;Shift divisor into A CP C JR C,DIVNXT ;Can't do it if Carry SUB C ;Do it for real this time INC L ;Set bit in quotient DIVNXT: DJNZ DIVLP POP BC RET ;--------------------------------- ;Clear screen and character memory ;--------------------------------- CLEAR: PUSH BC PUSH DE PUSH HL LD C,6 LD E,"Z"-40H CALL 5 ;Clear screen POP HL POP DE POP BC RET HIRSFILL: LD (HL),0 INC HL DEC BC LD A,B OR C JR NZ,HIRSFILL RET .COMMENT ~ Clear screen and compress graphic codes, recovering any that have been abandoned. Any characters that are FFFF or have all bits set to 0s will be ignored. All valid characters will have new codes assigned and will be redisplayed. ~ COMPRES: IF FULSCRN ;Only possible with full screen images DI LD (MSTACK),SP ;Save current stack LD SP,STACK ;New stack PUSH AF PUSH BC PUSH DE PUSH HL EXX PUSH HL EXX CALL CLEAR ;Clear screen LD HL,LOCHAR ;Next available character LD (MNXTCHR),HL ;Store it here LD HL,MCOLDAT ;Character images LD C,0+((240-1)-HIROW)/10 ;1st absolute character row ;Do one complete row CMPROW: EXX LD HL,LOCOL/8 ;Absolute character column EXX LD B,ROW_BYTS ;Number of bytes in a row CMPLP: PUSH BC ;This isn't needed for now ;Check current character to see if it is defined LD E,(HL) INC HL LD D,(HL) ;Current character in DE INC HL ;Point to character image ;Make sure all bits are not 0 PUSH HL ;Save pointer LD B,10 ;Number of bytes to check XOR A BIT0CHK: OR (HL) JR NZ,KEEPCHR ;This is a keeper if NZ INC HL ;Next byte DJNZ BIT0CHK ;Check all bytes ;All bits are 0, zap this character LD DE,0FFFFH ;Delete this character POP HL DEC HL LD (HL),D DEC HL LD (HL),E ;Clear in MCOLDAT too INC HL INC HL JR CMPDSP ;Just advance to display ;Assign it a code if not null or ASCII and load into memory KEEPCHR: POP HL ;Restore pointer ;Check to see if this is an ASCII character LD A,E SUB LOW LOCHAR LD A,D SBC A,HIGH LOCHAR IF ASCII PUSH AF CALL C,LOADASCI POP AF ENDIF JR C,CMPDSP ;Don't assign new code to ASCII CALL GET_NEXT ;Get next character in DE CALL C,LOADASCI ;Blank bit image if no more characters DEC HL LD (HL),D DEC HL LD (HL),E ;New code assigned INC HL INC HL ;Advance to bit image data CALL DSPBITS ;Load into character memory CMPDSP: LD A,C ;Need row in A CALL DSPCHAR ;Load into video memory CMPNEXT: LD BC,10 ;Offset to next character ADD HL,BC ;Advance pointer POP BC ;Recover row and column counter ;Advance to next column EXX INC HL ;Advance to next column EXX DJNZ CMPLP ;Do next character of current row ;One row done, advance to next one INC C  LD A,C CP 0+(240-LOROW)/10 ;Max character row JR NZ,CMPROW ;Do another row if any left ;All done, restore registers and exit EXX POP HL EXX POP HL POP DE POP BC POP AF LD SP,(MSTACK) EI ENDIF ;End of IF FULSCRN RET ;---------------------------- ;DE holds character code ;HL points to MCOLDAT image ;Copy ASCII character pattern ;---------------------------- LOADASCI: IF ASCII ;This is an ASCII character, copy image to (HL) PUSH BC PUSH DE PUSH HL PUSH HL ;Save target address EX DE,HL ;Character code to HL REPT 4 ADD HL,HL ;Multiply by 16 ENDM LD DE,MCHARDAT ;Base address of character data ADD HL,DE ;HL points to source POP DE ;Target for move LD BC,10 ;Number of bytes to move LDIR POP HL POP DE POP BC ENDIF ;End of IF ASCII RET ;-------------------------------------------------- ;Reset all graphics characters, start in 1st column ;-------------------------------------------------- RESET: LD HL,LOCHAR ;1st character to use LD (MNXTCHR),HL ;Next character to use XOR A ;Start all over in column 0 LD (MNXTCOL),A ;Current column in use ;Fall through to clear column data routine ;------------------------- ;Clear current column data ;------------------------- CLRCOL: PUSH BC PUSH DE PUSH HL LD HL,MCOLDAT ;Beginning of column storage PUSH HL ;Save beginning address LD (HL),0FFH INC HL LD (HL),0FFH ;FFFF means no character currently entered INC HL LD BC,10 ;Number of bytes of character data CALL HIRSFILL ;Fill HL with 0 for count in BC EX DE,HL ;Current pointer to DE POP HL ;Beginning of table IF FULSCRN LD BC,12*ROW_BYTS*COL_BYTS-12 ELSE LD BC,12*COL_BYTS-12 ;Remaining bytes in table ENDIF LDIR POP HL POP DE POP BC RET COD_END: ;Define end of program code for block moves MNXTCOL: DS 1 ;Current column in use MNXTCHR: DS 2 ;Next available character ;Stack space MSTACK: DS 2 ;Storage for previous stack  DS 80H STACK: ;Storage for character data (ASCII characters) MCHARDAT: DATASIZE ASET MCHARDAT-COD_END ;Size of data area IF ASCII DATASIZE ASET DATASIZE + 16*128 ;Storage for ASCII characters ENDIF ;Storage for current column under construction ;For each character cell in the column there is: ;2 byte character code, FFFF if no entry so far ;10 bytes character data, all 0s if blank ; 1st byte is top row, bit 7 is left side of character MCOLDAT EQU COD_END+DATASIZE IF FULSCRN DATASIZE ASET DATASIZE + (2+10)*ROW_BYTS*COL_BYTS ELSE DATASIZE ASET DATASIZE + COL_BYTS*(2+10) ENDIF PRTSIZE MACRO VAL .PRINTX ~ HI-RES.MAC is VAL (hex) bytes ~ ENDM TEMP ASET DATASIZE+(COD_END-COD_BEG+1) .RADIX 16 PRTSIZE %TEMP .RADIX 10 ;End of HI-RES.MAC G8D@@LD<rXd@@@a4LDL4pXdDdX@@h@@XdDDDic8@@@8s<@8xMDlTTTDDo8DDD8d4LDL47| @4(H|L@@@@@@|S8D@8D808DLTdD888DD8DD8a4LDL4nXdDDDd4LDL47| @4(H|L@@@@@@|S8D@8D81085|@xD87| @??000?1080000000000p88p+|5|@xD828D8@@|08DLTdD80000000007| @4(H|S8D@8D83|D87| @4(H|28D8@@|000000000010898DD<p@4(H|.7| @KDHP`PHD7| @4(H|L@@@@@@|S8D@8D81085|@xD87| @000000000 @  3|D800000000008||810888DD8DD8 @@PxDDx@@@inXdDDD108UDDDDDD8C8D@@@D81083|D8108S8D@8D8L@@@@@@|C8D@@@D8+|5|@xD8 1086 @xDD8000000000 0` @ 4(H|0000000000 8|108 7| @4(H|L@@@@@@|S8D@8D808DLTdD888DD8DD8  1084(H| 8|1087| @ @ PxDDx@@@inXdDDD28D8@@|UDDDDDD8DxDDDDDx1085|@xD828D8@@|A(DD|DD08DLTdD8O8DDDDD8E|@@x@@| 1085|@xD8000000000|8  !"#$|8%&'()*+,-./012345678 9:;<5|@xD8=0000000000>28D8@@|?@AB CD@@@@@@@EF1083|D8G8|H1086 @xDD8IJ3|D8KBxDDxDDx08DLTdD8L 1084(H|MNOPQRS000000000TUVWXY@@@@@@@@@@Z[\]^_`a|8bcdefghijklmnopqrstuvwx yz{|6 @xDD8}00000000003|D8~  @!!!!!!!10828D8@@|1085|@xD8PxDDx@@@inXdDDD28D8@@|3|D86 @xDD828D8@@|6 @xDD84(H|4(H|YDD(08DLTdD8 1083|D8*T88TG8D@@LD<rXd@@@a4LDL4pXdDdX@@h@@XdDDDic8@@@8s<@8x000000000 !  S8D@8D8e8D|@<le8D|@<c8@@@8t87| @0000000000 4(H|@  @1081081084(H|PxDDx@@@inXdDDD7| @UDDDDDD8DxDDDDDx10828D8@@|5|@xD8A(DD|DD108 10828D8@@|?00000000?@@>>  88DD8DD8 0000000000 5|@xD8  @@@@@@@@@10808DLTdD81083|D86 @xDD8BxDDxDDx108 108108 !"#00000000$ %&'()*@@@@@@@@@@+,-./0123456789:;<=>?@ABCDEFGHI JKLMN98DD<pO0000000000P 6 @xDD8QRS TU@@@VWXY ZAAAAAAAAAA[98DD<p\10828D8@@|]^_`PxDDx@@@inXdDDD28D8@@|6 @xDD828D8@@|6 @xDD84(H|7| @aYDD(108b 10808DLTdD8cdefghij000000000k?lmnopqrs tuvwxyz{|}~ 10808DLTdD800000000007| @G8D@@LD<rXd@@@o8DDD8uDDDL4nXdDDDd4LDL4@  @88DD8DD8108108PxDDx@@@inXdDDD88DD8DD8UDDDDDD8C8D@@@D81083|D888DD8DD8G8D@@LD<NDDdTLDDDxDDDDDx 98DD<p000000000@@@@@@@ 000000??@@     @@@>> !"#$%&'()*+,-./0123456789: U U U U U  < ~ ~ <   10 '------------------------------------------------------------------------ 20 '| PIXGEN.BAS, Version 1.0, 10 April 1984 | 30 '| | 40 '| With this program, you can design literal or graphic characters on | 50 '| the CRT. The program calculates the byte values for each column of | 60 '| dots for output to the Epson printer. You can store, retrieve, | 70 '| edit, and test-print your creations. You can also print a full | 80 '| listing of your font file. The program creates two files on disk | 90 '| B: "FONT.PIX", which is a random access file containing the ascii | 100 '| printable codes, and "PIXRN.DAT", which stores the last record number| 110 '| of the random access file. The variables are listed beg.line 60000. | 120 '| | 130 '| By Jim Shoemaker,1743-B So Hayes St Arl VA 22202 (703) 892-8567 | 140 '------------------------------------------------------------------------ 200 ' main program 202 ' 204 CLEAR 205 GOSUB 60000 'initialize variables 206 ON ERROR GOTO 235 208 PRINT CURSOFF$ 'turn off cursor temporarily 210 PRINT CL$ 'clear screen 212 RC$=FNS$(2,50) 'row/column coordinates 215 PRINT RC$ "Designing new char " 220 GOSUB 1000 'draw grid 230 GOSUB 1100 'display menu 232 PRINT CURSON$ 'turn cursor back on 235 R=2:C=2 'set row/col coordinates 240 RC$=FNS$(R,C):PRINT RC$; 'position cursor 260 Q$=INKEY$ 'accept keyboard input 261 IF Q$="" THEN 260 'null input 262 Q = ASC(Q$) 270 GOTO 350  'test if statements 315 END 316 ' 345 '-------------------------------- menu selections----------------------- 350 IF Q = 46 THEN GOSUB 1500:GOTO 260 'turn dot cell on/off 355 IF Q = 83 OR Q = 115 THEN GOTO 1900 'save 360 IF Q = 84 OR T = 116 THEN GOTO 1700 'test print char 365 IF Q = 76 OR Q = 108 THEN GOTO 9000 'list char codes 370 IF Q = 99 OR Q = 67 THEN CL=1:GOTO 600 'clear char 375 IF Q = 80 OR Q = 112 THEN GOTO 10200 'print char chart 380 IF Q = 81 OR Q = 113 THEN GOTO 1600 'quit 385 IF Q = 73 OR Q = 105 THEN GOTO 600 'invert char 390 IF Q = 69 OR Q = 101 THEN GOTO 1800 'edit char from disk 391 IF Q = 55 THEN GOTO 235 'home cursor 392 IF Q = 57 THEN R=2:C=CM+2:GOTO 240 'cursor top right corner 393 IF Q = 49 THEN R=RM+2:C=2:GOTO 240 'cursor bottom left corner 394 IF Q = 51 THEN R=RM+2:C=CM+2:GOTO 240  'cursor bottom right corner 395 IF Q = 52 THEN R=R:C=2:GOTO 240 'cursor to left margin 396 IF Q = 54 THEN R=R:C=CM+2:GOTO 240 'cursor to right margin 397 IF Q = 56 THEN R=2:C=C:GOTO 240 'cursor to top margin 398 IF Q = 50 THEN R=RM+2:C=C:GOTO 240 'cursor to bottom margin 399 GOSUB 1300:GOTO 260 'arrow key pressed 400 '--------------------------------- file field statements----------------- 402 ' 410 FIELD#2,3 AS FB0$,3 AS FB1$,3 AS FB2$,3 AS FB3$,3 AS FB4$,3 AS FB5$,3 AS FB6$,3 AS FB7$,3 AS FB8$,3 AS FB9$,3 AS FB10$ 420 RETURN 600 '--------------------------------- invert or clear char ----------------- 601 ' 605 'If menu selection is "c" then ONOFF = 0 ELSE W 610 OUT 0,65 620 FOR C = 0 TO CM 630 FOR R = 0 TO RM 640 P = (CH+O)+((2+R)*W)+(2+C) 650 CB = PEEK(P) 'look at cell attribute 655 IF CL = 1 THEN ONOFF = 0 ELSE ONOFF = W 660 IF CB < W THEN CB = CB + ONOFF ELSE CB = CB - W 670 POKE P,CB 680 NEXT R 690 NEXT C 692 OUT 0,1 693 EOPTION=0 694 GOTO 235 999 ' 1000 '-------------------------------- draw grid ---------------------------- 1003 ' 1010 U = CH+(2*W)+2 'starting cell of grid 1020 O = 4096 'diff from attribute bank 1025 OUT 0,65 'enable video bank 1030 FOR C = 0 TO CM 1040 FOR R = 0 TO RM 1045 P=U+(R*W)+C 1050 POKE P,D:POKE P+O,H 'draw grid 1060 NEXT R 1070 NEXT C 1080 OUT 0,1 'restore bank 1090 RETURN 1099 ' 1100 '-------------------------------- display menu ------------------------ 1102 ' 1105 RC$=FNS$(11,2) 1110 PRINT RC$ "WELCOME TO PIXGEN" 1115 PRINT 1120 PRINT " Use cursors to move around grid." 1122 PRINT " Use number pad to skip to corners (odd) and sides (even)" 1125 PRINT 1130 PRINT ' (.) = DOT on/off 's' = Save char on disk" 1140 PRINT " 't' = Test char on printer 'e' = Edit char from disk" 1150 PRINT " 'l' = List char codes 'p' = Print char code chart" 1160 PRINT " 'i' = Invert char 'c' = Clear char 1170 PRINT " 'q' = Quit" 1180 RETURN 1299 ' 1300 '-------------------------------- cursor position --------------------- 1311 ' 1340 IF Q = 12 THEN C = C + 1: R = R 'cursor right 1350 IF Q = 10 THEN R = R + 1: C = C 'cursor down 1360 IF Q = 11 THEN R = R - 1: C = C 'cursor up 1365 IF Q = 8 THEN C = C - 1: R = R 'cursor left 1370 IF C = CM+3 THEN C = 2: R = R 'margin checks 1380 IF C = 1 THEN C = CM+2: R = R 1390 IF R = RM+3 THEN R = 2: C = C 1400 IF R = 1 THEN R = RM+2: C = C 1410 RC$ = FNS$(R,C):PRINT RC$;:RETURN 'reset cursor 1499 ' 1500 '-------------------------------- turn dots on/off -------------------- 1502 ' 1505 OUT 0,65 'enable video 1508 P = CH + O + (R*W) + C 1510 CB = PEEK(P) 'look at cell attribute 1520 IF CB < W THEN CB=CB+W ELSE CB=CB-W 'if bright, make dim 1530 POKE P, CB 1535 OUT 0,1 'restore video state 1540 RETURN 1599 ' 1600 '-------------------------------- quit routine ------------------------ 1610 ' 1615 RC$=FNS$(22,0) 1620 PRINT RC$:PRINT "Quit? (y/n)"; 1630 Q$ = INKEY$: IF Q$ = "" THEN 1630 1640 IF ASC(Q$) = 89 OR ASC(Q$) = 121 THEN 1680 ELSE 1650 1645 RC$=FNS$(22,0) 1650 PRINT RC$:PRINT SPC(11):GOTO 235 1680 PRINT CL$ 1682 RC$=FNS$(10,10) 1685 PRINT RC$ "To restart, type 'RUN'," 1690 GOTO 315 'end 1699 ' 1700 '-------------------------------- test print char --------------------- 1702 ' 1703 PPF=1 1704 RC$=FNS$(22,0) 1705 PRINT RC$ 1706 PRINT "Be sure printer is on line. When ready, press any key."; 1707 Q$=INPUT$(1) 1709 PRINT RC$:PRINT SPC(65) 1710 RC$=FNS$(2,50) 1711 PRINT RC$ 1712 PRINT RC$ "Testing char nr. "+F$; 1715 C=2:R=2:GOSUB 2120 1720 LPRINT ESC$+"L"+CHR$(CM+1)+CHR$(0); 'prepare printer buffer 1730 FOR C=0 TO CM 1740 LPRINT CHR$(B(C)); 'output byte to printer 1750 NEXT C 1775 PPF=0 1777 LPRINT ESC$+"@"; 'reset printer codes 1780 GOTO 235 'return to menu 1799 ' 1800 '-------------------------------- load pixel -------------------------- 1801 ' 1811 CLOSE 1815 OPEN "I",#3,"B:PIXRN.DAT":INPUT#3,RN:CLOSE#3 1818 RC$=FNS$(22,0) 1820 PRINT RC$ "Ascii code you wish to edit? (000 - "; 1822 IF RN<10 THEN PRINT USING "00#";RN;:GOTO 1829 1824 IF RN>9 AND RN<99 THEN PRINT USING "0##";RN;:GOTO 1829 1826 IF RN>99 THEN PRINT USING "###";RN; 1829 PRINT ")"; 1830 INPUT;F$ 1832 RC$ = FNS$(22,0) 1835 PRINT RC$ + SP$ 1840 IF LEN(F$) <> 3 THEN PRINT BEEP$;:GOTO 235 'try again 1845 RC$ = FNS$(2,50) 1850 PRINT RC$ + "Editing char nr. ";F$ 1860 OPEN "R",#2,"B:FONT.PIX",N 'open random access file 1862 GOSUB 400 'field statements 1864 COUNT=VAL(F$) 1865 GET#2,COUNT+1 'bring in a record 1866 ' 1872 B(0) = CVI(FB0$) 'convert variables 1873 B(1) = CVI(FB1$) 1874 B(2) = CVI(FB2$) 1875 B(3) = CVI(FB3$) 1876 B(4) = CVI(FB4$) 1877 B(5) = CVI(FB5$) 1878 B(6) = CVI(FB6$) 1879 B(7) = CVI(FB7$) 1880 B(8) = CVI(FB8$) 1881 B(9) = CVI(FB9$) 1882 B(10)=CVI(FB10$) 1883 ' 1884 OUT 0,65 'enable video 1885 FOR R = 0 TO RM 'calculate whether each 1886 FOR C = 0 TO CM 'bit is on or off 1887 IF B(C)/(2^(RM-R))=>1 THEN D(C,R)=W ELSE D(C,R)=0 1888 IF (2^(RM-R)) > B(C) THEN B(C)=B(C) ELSE B(C)=B(C)-(2^(RM-R)) 1889 P=U+(R*W)+C:POKE P,D:POKE P+O,D(C,R) 1890 NEXT C 1892 NEXT R 1893 OUT 0,1 'restore bank 1894 CLOSE 1897 GOTO 235 'back to menu 1899 ' 1900 '-------------------------------- save ------------------------------- 1915 ' 1918 LET GARBAGE = FRE("A") 1920 RC$=FNS$(22,0) 1930 PRINT RC$ "Ascii code for byte? (3 digits less than 256)"; 1935 INPUT;F$ 1940 RC$=FNS$(22,0) 1950 PRINT RC$ + SP$ 1956 IF LEN(F$) <> 3 THEN PRINT BEEP$;:GOTO 235 'try again 1959 RC$=FNS$(2,50):PRINT RC$ " Saving char nr.";F$; 2000 ' 2010 'Begin saving byte values on disk 2015 ' 2120 COUNT = 14 'screen pos for msg 2122 OUT 0,65 'enable video 2125 FOR C = 0 TO CM 2130 FOR R = 0 TO RM 2140 P = (U + O) + (R*W) + C 2150 CB = PEEK(P) 2160 IF CB > W THEN D(R,C) = 2 ^ (RM-R) ELSE D(R,C) = 0 2165 CL(R,C)=P-O:AL(R,C)=P 2167 AB(R,C)=CB:IF PPF=1 THEN 2170 2170 NEXT R 2175 B(C)=D(0,C)+D(1,C)+D(2,C)+D(3,C)+D(4,C)+D(5,C)+D(6,C)+D(7,C) 2176 COUNT=COUNT+3 2178 PRINT FNS$(C+2,COUNT);USING "####";B(C) 2180 NEXT C 2190 OUT 0,1 'restore bank 2192 COL = 0 2195 IF PPF=1 THEN RETURN 2204 ' 2205 ' store codes into random access file 2206 ' 2210 OPEN "R",#2,"B:FONT.PIX",N 2215 OPEN "I",#3,"B:PIXRN.DAT" 2218 INPUT#3,RN:CLOSE#3 'get stored record total 2220 GOSUB 400 'field statements 2221 ' 2260 LSET FB0$=MKI$(B(0)) 2270 LSET FB1$=MKI$(B(1)) 2280 LSET FB2$=MKI$(B(2)) 2290 LSET FB3$=MKI$(B(3)) 2300 LSET FB4$=MKI$(B(4)) 2310 LSET FB5$=MKI$(B(5)) 2320 LSET FB6$=MKI$(B(6)) 2330 LSET FB7$=MKI$(B(7)) 2340 LSET FB8$=MKI$(B(8)) 2350 LSET FB9$=MKI$(B(9)) 2360 LSET FB10$=MKI$(B(10)) 2361 ' 2369 COUNT=(VAL(F$))+1 2370 PUT#2,COUNT 'write code record to file 2375 CLOSE#3 2378 IF VAL(F$)>RN THEN RN=VAL(F$) 2380 OPEN "O",#3,"B:PIXRN.DAT":PRINT#3,RN 'store new record total 2390 CLOSE 2395 PRINT ESC$+LOCK$; 'lock keyboard for a bit 2396 FOR X=1 TO 100:COUNT=COUNT+X^2:NEXT X 'time filler 2397 PRINT ESC$+UNLOCK$; 'unlock keyboard again 2398 PRINT BEEP$; 2400 GOTO 235 'back to original menu 8999 ' 9000 ' ------------------------------ view pixel file --------------------- 9001 ' 9005 PRINT CL$ 9010 OPEN "R",#2,"B:FONT.PIX",N 9020 GOSUB 400 'field statements 9050 OPEN "I",#3,"B:PIXRN.DAT" 9060 INPUT#3,RN 9065 COUNT=0 'page counter 9070 FOR X = 1 TO RN+1 9080 GET#2,X 9085 COUNT=COUNT+1:IF COUNT=22 THEN COUNT=0 ELSE 9110 9090 PRINT:PRINT "Press any key to see next page...":Q$=INPUT$(1) 9110 GOSUB 10000 'prog/field var conversions 9190 PRINT USING "####";X-1; 9192 PRINT " -- "; 9195 PRINT USING "####";B0; 9197 PRINT USING "####";B1; 9199 PRINT USING "####";B2; 9200 PRINT USING "####";B3; 9210 PRINT USING "####";B4; 9212 PRINT USING "####";B5; 9214 PRINT USING "####";B6; 9216 PRINT USING "####";B7; 9217 PRINT USING "####";B8; 9218 PRINT USING "####";B9; 9219 PRINT USING "####";B10 9220 NEXT X 9225 PRINT:PRINT "Press any key to return to grid screen..."; 9230 CLOSE 9240 Q$=INKEY$:IF Q$="" THEN 9240 9250 GOTO 210 'back to menu 9999 ' 10000 '---------------------------- conversions --------------------------- 10001 ' 10110 B0 = CVI(FB0$) 10120 B1 = CVI(FB1$) 10130 B2 = CVI(FB2$) 10140 B3 = CVI(FB3$) 10150 B4 = CVI(FB4$) 10160 B5 = CVI(FB5$) 10170 B6 = CVI(FB6$) 10180 B7 = CVI(FB7$) 10181 B8 = CVI(FB8$) 10182 B9 = CVI(FB9$) 10183 B10=CVI(FB10$) 10190 RETURN 10199 ' 10200 '---------------------------- print code chart ---------------------- 10201 ' 10205 RC$=FNS$(22,0) 10210 PRINT RC$ "Press any key when printer is on-line... "; 10220 Q$=INPUT$(1) 10222 PRINT RC$:PRINT SPC(50); 10225 COUNT=0 10230 OPEN "R",#2,"B:FONT.PIX",N 10235 OPEN "I",#3,"B:PIXRN.DAT":INPUT#3,RN:CLOSE#3 10240 ' 10245 COUNT=COUNT+1 10247 IF COUNT>RN THEN 10490 'end of file reached 10250 GOSUB 400 'field statements 10260 GET#2,COUNT 10270 GOSUB 10000 'conversions 10280 LPRINT ESC$+"L"+CHR$(CM+1)+CHR$(0); 'prepare printer buffer 10290 LPRINT CHR$(B0);CHR$(B1);CHR$(B2);CHR$(B3);CHR$(B4);CHR$(B5); 10300 LPRINT CHR$(B6);CHR$(B7);CHR$(B8);CHR$(B9);CHR$(B10); 10400 LPRINT " ASCII="; 10402 LPRINT USING "####";COUNT-1; 10404 LPRINT " PRINTER CODES = "; 10410 LPRINT USING "####";B0; 10420 LPRINT USING "####";B1; 10430 LPRINT USING "####";B3; 10440 LPRINT USING "####";B4; 10450 LPRINT USING "####";B5; 10460 LPRINT USING "####";B6; 10470 LPRINT USING "####";B7; 10472 LPRINT USING "####";B8; 10474 LPRINT USING "####";B9; 10476 LPRINT USING "####";B10 10480 GOTO 10240 'loop 10490 LPRINT ESC$+"@" 'reset printer 10500 CLOSE 10510 GOTO 235 'return to menu 10520 ' 60000 '--------------------------------- variables ------------------------- 60005 ' 60008 W = 128 'page width 60010 L = 22 'page length 60020 CH = 49152! 'top of character memory 60030 AH = 53258! 'top of attribute memory 60035 S = 32 'screen offset 60037 ESC$ = CHR$(27) 'escape 60038 CL$ = CHR$(26) 'clear screen 60040 DEF FNS$(R,C)=ESC$+"="+CHR$(S+R)+CHR$(S+C) 'locate cursor 60050 H = 0 'half intensity mode 60060 DIM CL(8,11) 'character location 60070 DIM AB(8,11)  'attribute bit 60080 DIM AL(8,11) 'attribute location 60082 DIM B(11) 'bytes 60084 DIM D(11,11) 'dots 60090 PPF=0 'print routine flag 60095 BEEP$ = CHR$(7) 'beeper sound 60100 'CB 'character bit 60110 'AB 'attribute bit 60115 'RC$ 'cursor row/column address 60120 ONOFF = W 'bit on/off value 60130 CURSON$ = ESC$ + "." + "3" 'turn cursor on 60140 CURSOFF$ = ESC$ + "." + "0" 'turn cursor off 60150 RM = 7 'max rows dots -1 60160 CM = 10 'max cols dots -1 60170 COUNT = 0 'general counter 60180 'Q$  'general input variable 60190 D = 13 'dot graphic 60200 CL = 0 'clear routine flag 60210 'Q 'ascii code variable 60212 N = (CM+1) * 3 'record length 60214 F$ = "???" 'record i.d. 60216 SP$ = SPACE$(70) 'blank spaces 60218 WIDTH 128 'display width 60220 LOCK$ = CHR$(35) 'lock keyboard 60230 UNLOCK$ = CHR$(34) 'unlock keyboard 60240 RETURN 'back to main program 60300 '------------------------ end of file --------------------------------  'back to main program 60300 '------------------------ end of file --.PO0 Jim Shoemaker 1743-B So Hayes St Arlington, VA 22202 (703) 892-8567 20 April 1984 HOW TO USE PIXGEN.BAS (Version 1.0) PURPOSE: This program makes it easy for you to design literal and block graphic characters pixel by pixel on the screen using a matrix of dots which you can interactively edit, save, retrieve, and print. The program automatically calculates the byte string values needed for output to the Epson MX printer and stores them in a random access file for retrieval. The data generated by this program can be used in the data statements in other programs exploiting graphic characters, symbols, pictures, and logos. REQUIREMENTS: This program will run only on the Osborne Executive double density computer in conjunction with the Epson MX-80 printer with Graftrax. However, the MBASIC code is well-commented and can easily be modified for other machines and printers. All pointers, memory locations, and other factors are stored in variables all located in one subroutine of the program. A word of caution: In order for this program to work correctly, you must have a copy of a file by the name of PIXRN.DAT on the same diskette as PIXGEN.BAS. This file is a pointer file which contains the last record filled in the FONT.PIX random access file generated by the program. If you do not have it, you can generate it by running the following one line MBASIC program before you start: 10 OPEN "O",#3,"B:PIXRN.DAT":PRINT#3,0:CLOSE. GETTING STARTED: Put your MBASIC program diskette in drive A. Put the PIXGEN.BAS diskette in drive B, then hit . When the CP/M prompt appears (>), type MBASIC B:PIXGEN. Now you're off and running! FEATURES: 1) DESIGN CHARACTER: You are presented with an 11 x 8 matrix of dots which represent the pattern of dots to be sent to the printer. To move around the grid, use the arrows. If you wish to go quickly from corner to corner, use the corner keys of the number pad. Similarly, if you want to go quickly from one side of the grid to the other, use the side keys (even numbers) of the number pad. When you come to a dot which you wish to "turn on", press the period (.). The period acts as a toggle and will turn a dot cell on or off. You have the option of clearing (erasing) the grid and starting over by pressing "c". You also have the option of reversing all the dot cells, creating a negative or inverse image of your character. Use "i" to do this. 2) TEST PRINT CHARACTER: Once you are tentatively satisfied with your character design, you can test it immediately on the printer by pressing "t" for test. Be sure the printer is on-line. Before printing takes place, the byte string values of the character will be calculated and displayed on the CRT and you will be prompted to hit a key to activate printing. 3) SAVE CHARACTER TO FILE: If you are pleased with the way the design came out on the printer, you can save the byte string values of the character to a file on diskette B by pressing "s" for save. The computer will again calculate the values, display them, and write them to a random access file called B:FONT.PIX. In order for this feature to work, there must already be a file on diskette B called PIXRN.DAT which contains the last record number of the font file. You will be prompted for the Ascii value under which you wish to store the character attributes. You must respond with a 3-digit number between 000 and 256. The Ascii value will equate to the record number of the byte sequence. If you want to save your character as the 50th record, give it an Ascii value of "050". If you fail at this point to enter an appropriate response, the program will return you to the design screen. 4) LIST FONT FILE: If you would like to scan the font file on the screen page by page, press "l" for list. Here, you can see which records have been completed. Intervening unfilled records will have zeros or garbage. 5) EDIT FONT CHARACTERS: To retrieve and edit a particular character design which you previously saved to disk, press "e" for edit. You will be prompted for the Ascii value (or record number) of the character to be retrieved. You can make whatever changes you wish and save it to the same record or a different record. 6) PRINT FONT CHART: After you have designed and save a whole series of characters or graphic symbols, you can print the results in the form of a chart on the MX-80 printer. To do this, press "p" for print. The chart will reproduce the graphic characters and list the corresponding record/Ascii numbers and byte string values. Caution: If a particular record in the middle of your file is blank, the program will take it as an end-of-file and will cease printing prematurely. If this happens, reset the printer. To avoid this, save your designs to the font file in sequence so as not to leave blank records. Or, if you skip around, preview the file before printing it and if there are blank records, fill them with zeros by editing and saving blank characters. 7) QUIT: Terminate the program and return to the MBASIC prompt by hitting "q" for quit. To return to the program, type RUN. To exit from any running portion of the program, you can press control-C as an immediate escape. MODIFYING THE PROGRAM: If would like to use a grid of a different size, change the values for the variables RM (row maximum) and CM (column maximum), which are given in subroutine 60000. Similarly, you can change the dots to rectangles or whatever by altering the value for variable D. Users of the Osborne I will have to make more extensive changes because of the particular ways in which the Executive handles video output. -----------------------------------------------------------------------------  10 1Ox1!6/<12og))B DM!BS ͒_}!77Fwx# `͂$:$a>!J5FO:6a *6|a:&6ɀSR SCRPRINT 1.0 - E.Meyer 1/85 :_Ft*|ҡ++ Address Error ++ (Delete an existing RSX and try again) <SCRPRINT RSX no longer in RAM.The SCRPRINT RSX has been installed. To print screen, type ctl-underline (^_).O_㯆#SCRPRT10"y2N\ s2j<@ O >2  ʫë{NN N zʊ *#~_~Q :!_~ʢ6!;ë>A!P~# _ ¶     0ô> *:O! $BA!$H  @  SCRPRINT.DOC ------------ Documentation for SCRPRINT.COM v1.0 - E. Meyer 1/85 [Note: for the Osborne Executive computer only.] SCRPRINT allows you to get a printout of whatever is currently on your Osborne Executive CRT screen at any time, without disturbing the screen or any software you may currently be running. To install it: A>SCRPRINT [or SCRPRINT ON] To remove it: A>SCRPRINT OFF To print the screen: type control-underline (^_) When "installed", SCRPRINT remains part of your CP/M Plus operating system - technically, an RSX (Resident System Extension). It does nothing until you type ^_, at which point it will print the screen. When it's done, it will beep once, and you will be right back where you were before, ready for input to whatever program (if any) you were running. Do not install it more than once: multiple copies of the RSX waste your RAM space, and may interfere with one another. RESTRICTIONS ON USE There are several restrictions on the use of SCRPRINT. First, since it has to access video RAM, switching bank 7 in must not disturb the RSX itself: it must lie safely above address E000h. If there are already RSXs installed, and the installation of SCRPRINT would place it below E000h, you will get the error message "++ Address Error ++", and SCRPRINT will not install. Second, remember that sometimes CP/M does input by line, rather than by character (for example, from the A> prompt). In this case your ^_ character will not be recognized until you hit RETURN; then the screen will print. Third, an RSX can only intercept BDOS calls. Consequently, SCRPRINT can only be called from within software that gets its keyboard input through BDOS calls. Unfortunately, much CP/M software uses direct BIOS calls for this purpose. In order to get SCRPRINT to work from inside such programs, you will have to patch them to use a BDOS call (typically BDOS 6) instead. In practice this is not difficult. ch programs, you will have to patch them to use a BDOS call (typically BDOS 6) instead. In practice .0=#8Executive keyboard Test Program=$9Copyright (c) 1986 by Don Rowe=%9Press to exit>>=>(>%>O—/>>–>/|.4>0> _G> ~~#>O—/>>–>/|.4>0> _G> ;Keyboard test program 5/16/86 ;This program reads the keyboard of the Executive and displays a matrix ;of 1s and 0s ;Don Rowe ;P. O. Box 50105 ;San Diego, CA 92105 ;(619) 299-4536 BDOS EQU 5 PKEY EQU 14H ;Keyboard port BYTESC EQU 1BH ;Center text - requires that ROW be SET to current cursor row ;On exit, ROW is incremented CENTER MACRO TEXT LENGTH ASET 80+2 ;Quotes add 2 more to length ;Get length of TEXT IRPC X, LENGTH ASET LENGTH-1 ENDM ;Set cursor position DB BYTESC,"=",ROW+32,LENGTH/2+32 ROW ASET ROW+1 DB TEXT ENDM CRLF MACRO DB 1FH ;New line ENDM MSGEND MACRO DB 1FH+80H ;New line, end of message ENDM SETCRSR MACRO @ROW,@COL PUSH PSW MVI A,BYTESC CALL WRTCON MVI A,"=" CALL WRTCON MVI A,@ROW+32 CALL WRTCON MVI A,@COL+32 CALL WRTCON POP PSW ENDM ;****************************** ;Program execution begins here. ;****************************** ;Set cursor row ROW ASET 3 CALL STRSP DB 1AH ;Clear screen DB BYTESC,".0" ;Make cursor invisible CENTER "Executive keyboard Test Program" CRLF CENTER "Copyright (c) 1986 by Don Rowe" CRLF CENTER "Press to exit" CRLF MSGEND DI ;Don't want these interfering ;Turn off disk drives IN 2 ;Disk drive control port ORI 2+4 ;Both drives off OUT 2 LOOP1: SETCRSR 8,5 ;Put cursor in row 8, column 5 MVI B,8 ;Number of rows in matrix MVI A,1 ;1st row to test LOOP2: PUSH PSW GETKEY: ;Read port twice, make sure same value read both times IN PKEY ;Get keyboard port MOV C,A POP PSW PUSH PSW ;Recover bit to test IN PKEY CMP C JNZ GETKEY CMA ;Complement bits CALL DSPKEY MVI A,1FH ;Drop down one line CALL WRTCON MVI A,5 ;Number of spaces to display CALL SPACES POP PSW ANA A ;Clear carry RAL ;Next key row DCR B JNZ LOOP2 ;Check for SHIFT CTRL ESC to exit MVI A,1 IN PKEY CMA ANI 10101B CPI 10101B JNZ LOOP1 ;Do this forever EI CALL STRSP CRLF CRLF BYTESC,".4" MSGEND JMP 0 ;Display bit pattern in A as 0s and 1s with intervening spaces DSPKEY: PUSH B MVI B,8 ;Number of bits to do DSPKLP: RAR ;Shift 1 bit into Carry PUSH PSW MVI A,"0" ;Will be 0 or 1 ACI 0 ;If bit was 1, display a "1" CALL WRTCON MVI A," " CALL WRTCON ;Intervening space POP PSW ;Bit pattern restored DCR B JNZ DSPKLP POP B RET ; ********************** ; Display character in A ; ********************** ; WRTCON: PUSH B PUSH D PUSH H MVI C,6 ;Write to console MOV E,A ;Get character to send CALL BDOS POP H POP D POP B RET ;Display number of spaces in A SPACES: PUSH B MOV B,A ;Number of spaces to do SPAC1: MVI A," " CALL WRTCON DCR B JNZ SPAC1 POP B RET ; ******************************************************** ; Output string pointed to by top of stack until bit 7 set ; Needs WRTCON ; ******************************************************** STRSP: XTHL STROT1: MOV A,M ;1st character to output ANI NOT 80H ;Bit 7 must be off CALL WRTCON ;Send to console MOV A,M ANI 80H ;Check for bit 7 set INX H ;Point to next character JZ STROT1 XTHL RET STACK EQU $+80H ;Keep it out of the way END É$͍8!9^#V!9^#V!Mͭ2*C|X!g!Zv"C|X!i!l>!&*C|†!e3"C*C^#V*Cs#r!*C##s#r*C^#V!9s#r*C|!"C*C^#Vͪ*C|*C|*C^#V!!l>*C^#V!!l>*C##^#V"CÓ*C|D*C|D!!*C*C!!!!X!!/;5L!ͭ2execmake.subexecmake.subwcan't create execute file. '%s' is up to date don't know how to make '%s' erase %s execmake.subSUBMIT %s execmake.subexecmake.sub͍8!"C!"C!"C!9s#r!"C!! 9s#r5! 9~#fo#s#r! 9^#V!9~#fo_=3! 9^#V)!9~#fo^#V^!-%=! 9^#V)!9~#fo^#V#^`8! 9~#fo#s#r!9~#fo_=! 9^#V)!9~#fo^#V͜!&!!9s#rZ!"C!"CZ͌=FLN0! 9^#V)!9~#fo^#V&!9~#P!Q͜P!&makefile͍8!v!l>!&usage: make [-n] [-l] [-f makefile] [filename ...] ͍8*C!9s#r!9~#!9^#V!9^#V^#V)7!9^#V! ^#V!9s#rû!9~#T!"C!9!9^#Vx#9!99{9L!9^#V!!l>!&T!99!9^#V##~#s!9^#V!9!9 9#9!9^#V!^#V!9s#r!9~#!9! 9959!9^#V^#Vͪ59L!9#9!9^#V!^#V!9s#rØ!"C!9^#V!959! 99C9< !9^#V!~#!9^#V! ^#V! 9s#r! 9~#ʍ! 9^#V^#V!*C|v! 9^#V^#V!*C! 9^#V##^#V! 9s#r5!9^#V!ͻ#9!!9^#V##s#r!9^#V! ~#!"C!9^#V!9can't make '%s' %s %s ͍8!e3! 9s#r!9^#V! 9^#Vs#r!! 9^#V##s#r! 9^#V^#V*C|S! 9^#V"CÛ*C!9s#r!9^#V##~#ʅ!9^#V##^#V!9s#r^! 9^#V! 9^#V##s#r͍8!t!F9^#Vv!>9s#rz!D9^#V!v!l>!!>9^#V!!97p!!97!9+s!9~!9^! 4=~ !9!29!!94=_!9!!l>!e3!09s#r*C|…!09^#V"C*C!.9s#r!.9^#V! ~#ʹ!.9^#V! ^#V!.9s#rÐ!09^#V!09^#V! s#r!297#e3!29^#Vs#r!29!29^#V^#Va7!!29^#V##s#r!09^#V!!29^#V^#Vx#9*C|ʃ !9!29^#V!959͋!29^#V^#V!!l>!9!!l>!!29^#V!s#r!!29^#V! s#r!!29^#V! s#r!!:9s#r!:9^#V!9^!?#^!< !:9~#fo#s#r !:9^#V!9^!?#^!<< !:9^#V!9~< !:9~#fo#s#r !!<9s#r!<9~#{ !:9^#V!9^!?#^!<ʃ !:9~#fo#s#rQ !:9^#V!9~¢ !!<9s#rG !!89s#r!:9^#V!9^!?#^!< !:9^#V!9~ !:9~#fo#s#r+!9^!:9~#fo#s#r+!49sí !!:9^#V!49s!!49)7z !>9^#V!!97!!97!9+s!9!!:9s#rQ !297#e3!,9s#r!09^#V!~#¼ !,9^#V!29^#V!s#r !09^#V!^#V!*9s#r!*9^#V!~# !*9^#V!^#V!*9s#r !,9^#V!,9^#V!s#r!297#e3!.9^#Vs#r!29!.9^#V^#Va7*C|e !,9^#V^#V!!l>!!.9^#V!s#rG m!09~#¨ !!l>!9!!l>!!:9s#r !:9~#fo#s#r!:9^#V!9^!?#^!< ö !:9^#V!97m!e3!(9s#r!09^#V! ~#L !(9^#V!29^#V! s#r*C|I !!l>Þ !09^#V! ^#V!&9s#r!&9^#V##~#ʈ !&9^#V##^#V!&9s#ra !(9^#V!(9^#V##s#r!97!:9~#fo̓=#e3!*9^#Vs#r!!89s#r!:9^#V!9~!:9~#fo#s#r+!9^!:9~#fo#s#r+!,9^#V^#Vs !!*9^#V^#V!:9~#fos*C|[!(9^#V^#V!!l>!!*9^#V##s#r!rcouldn't open '%s' %s can't scan '%s' file = '%s', last modified %s depends on: \ %s howto line w/o definition '%s' how to make: %s ͍8 ! 9~#fo#s#r! 9^#V~K! 9^#V^v8!9^#Vs͍8! 99!99*]@=́!9:c@ :d@!9~#fo##s#r++^#V!Y@9#9!Y@95"'>! 9~2#>G+V+^+6"!>+N+V+^!%>w#y/$>~:#>G!%>>w#!(>>^)|/g,'s+="Z!f~*!>+"!>w!%>#Q*!>d+6-0123456789abcdefͮ8#DM|Š!! 9^#V! 9^#Vͮ͢8! 9^#V!!)>DM`iDMx!"C!! 9^#V)7ü! ^#V! 9^#V͐'"@%= !*@!9^#V!s!!9^#V!s! 9^#Vͮ8!9^#V"@! 9~#fo+s#r!`=ʒ! 9^#VDM4=ʒ`i*@#"@+s`i %=’H!*@s`i%=ʼ*@!9~#fo%=ʼ!!9^#Vͮ8!9N#F$ "@4= !*@<"@ !`in =s!͌=  *@ͮ8!9N#F! ^#V`i^#Vͳ= ! ^!! 9^#V!ͮ8!9N#F`i %=L!! 9^#V! [!%=L!!! 9^#V[!ͮ8! 9N#F! ^#V`i^#Vͳ=ʑ!!9^#V!DM`i>=!`i DM!þ!ͮ8!9N#F!"@`i~L"! ^!<"!Y""@! ^ )*@ ="@! ^!"C;$>í$ͮ8!!@!8!:o&<@s!&"@!@DM!"`A*`A_=ʌ&`i^! %=&%`i^! %=.%`i#DM %`i~ʌ&`i^!>%=L%!"dA`%`i^!<%==&!"dA`i#DM^! %=%`i^! %=ʂ%`%`i"bA`i#DM~ʿ%`i^! %=­%`i^! %=ʼ%!`i#DM+sÿ%Ç%*dA )*dA|%!*bAo'"dA%!*bA͐'"dA*dA%=:&!&!a7*bA!}7!&!}7!! ;5! &É&`i*`A#"`A+)@s#r`i#DM~ʉ&`i^! %=w&`i^! %=ʆ&!`i#DM+sÉ&Q&$!@*`A!&Can't open file for redirection: $ͮ8*Q?͌8!DM`i _=&`i#DM+ )&!9~#'!;5<'!'ͭ2ͭ$A:$$$.SUBͮ8!"C!ͮ8!con:CON:lst:LST:prn:PRN:pun:PUN:rdr:RDR:ͮ8! 9^#V!! 9^#V͐'ͮ8!>"fA!"jAö'*fA"fA*jA#"jA*jA _='*fA^#V!#'%='å'!"C!!k?DM'`iDM`i~#(!9^#V`i^#V)7('! ^#V"hA! 9^#V!<#"lA*lADM! ^#V! ^#V͌8!9s#r!! s! s! s`is!#'! s#r!9^#Vͮ8!nADMê)`i'DM`iB=)`i%~)â)!"C!! 9^#V5"B%=)!"C!*B%=*6"B*B7! 9^#V!<&*!;5!;5%=l*! 9^#V!<\*!;5%=i*!"C7!Ï*! 9^#V!<%=ʏ*!"C7!!!! s#r!# s!$ s*B!& s`i!9^#V!s#r! 9^#V!<#!% s!+!9^#V!s#r! 9^#V!<*07!ͮ8!9N#F͒1!& ^7!;57!!% s!ͮ8!9^#V)))>DM! 9^#V! 9^#V! ^#V`i^)?^#V͌8ͮ8!DM!9^#V"B*B&^7*B$~+*B$^!̓=DM! 9~#fo=+! 9^#VBK! 9^#V*Bͣ,+7!! 9^#V`i̓=<"B|L,*B! 9^#V`i*BR2"B|L,7*B*B̓=DM! 9^#V! 9^#V! ^#V! ^)?^#V͌8ͮ8!DM!9^#V"C*C&^7*C$~.*C$^!̓=DM! 9~#fo=.! 9^#VBK! 9^#V*Cͧ/.7!! 9^#V`i̓=<"C|P/*C! 9^#V`i*CZ2"C|P/7*C*C̓=^8!_28"*B@!"B@*@@˜2*@@!4Š2#4*D@+"D@}`2ʨ2ʨ2o&"C*D@ͮ8!9!29^#V5DM7!9!;5DM7`i%=2!"C!!ͮ8!9N#F! ^#V+))"C 5! 9^#Ve3"C|a3*CPY4=a3! 9^#V*C=M3*CU3! 9^#V*C8*Cͮ8!9^#V###<#"C*C"C|˜3!C"C"C"C*C##^#VBKó3`i"C! ^#VBK! ^#V`i4=24! ^#V`i^#V))PY%=24! ^#V*C%=4! ^#V##^#V"C! ^#V^#V`i~#fos#r! ^#V##^#V! s#ró3`i^#V*Cͳ=ʿ4`i^#V*C%=b4! ^#V*C##s#rç4*C))PY"C*C*C##s#r! ^#V*C##s#r`i^#V*C̓=*Cs#r*C`is#r*C"C!! s#r`i`i*C%=5!ͻ6DM%=4!!`is#r!! s#r`i 5*CDMå3ͮ8!9^#V!"C*C##~#-5!*CDM>5! ^#VBK`i*C=]5! ^#V*C=ʑ5! ^#V`iͳ=ʎ5*CPY=‘5! ^#V*C=‘555! ^#V*C##s#r*C! s#r`i"C!858*@@DM*B@og!9N#F#^#Vkb6#> 6 #=5>6#=5yʖ6 6 65 ͯ6#60_zW 6/-606 : >[6 Aږ6[L6@X6aږ6{Җ6`w# .v6ʏ6^6͝6w#_6{o|g ʏ6͝6w#€6&jz!|*¦6 >?a{ 0:ҹ67!9^#V*>6*C}|6*>">|!=!9}_|#W"C8 o&8 2?:@@ _8 :?_!9=7!9F+N+V+^+~+ngx[7[7[7# F7og!9V+^+~+ngwy7#n7|!9Ñ7!9F+N+V+^+~+ng対ʣ7#Û7xʴ7wʴ7# ã7w|!9^#V#n~77#7!|!9~#fo7#7}!9^#V#N#F#nx 8s# 8! 9F+N+V+^+~+ngJ8.8}J8^8 >8++w x>8ɯT8~# xT8!9~aq8{q8 o&!9~Aڇ8[҇8 o&DM!99`i͌8|DM!99!8`i~# x8!98@@~#8!88|!@9!@~#~#~#~@w#w#w#w!@*@*@"@"@*@*@"@"@*@*@"@"@!@>w#q9!@~;#€9÷;=ɯ<@!@~Oô9@!@ڍ9‘9+²9@!@#9@!@#9@!@#9@!@# :@!@#:!@~/w#.::@?*@*@))L:,=D:"@"@_::@:@?|:W!@~w+p:i:!Nyn9@~:@~:y:k9@~:y@~::@!@w#:k9::@!@w#:!@w#:> !@~w#:O@!@#;y-;!@4=:=^;!@~w#9;O@!@#L;y-;#;@!@#g;!@@~6#z;> !@~w#;Ҫ;@!@#¡;=†;͕9;!͕9ʷ;!<͕9;÷;͕9;;÷;͕9;;͕9;ʷ;;ͩ9;÷;ͩ9;;÷;ͩ9;;ͩ9;ʷ;;"@!"@"@|))ҏ<, ڠ<}o|g=‡<=‡))Ҷ< =®<}{_<|<|7g}o<{_<)<}{_<|g}o<|g}o|/g}/o|g}o|g}o|>=/=}/=|>=!}>=|/=!}|W=}|?>o&zo&|q=}|>o&|o&}/o|/g#}}o|gBK^#Vz=#yʦ=###Ô=#x¡=#~#fo}|>?o&}|>o&ɮABCDEFabcdef9876543210   rr+ww+a a+ xx+C???????????3'3'3'#'#'#'#'#'#'#'#'3'3'3'3')='S?B'S?G'Y?L'Y?Q'Y?V'Y?['Y?`'Y?e'_?j'_?e?#'}+-- #'t.00 00000 @@@@@@@@@@@@@@@ @@@@@@@ @@@@@ @@@@  MAKE.COM -- Tom Morris, Morris Code Works, 8/5/85 Adapted from MAKE.C86 for CP/M+ with time stamping. Thi i calle 'Make an i muc simplifie versio o th mak utilit o UNI ( trademar o somethin o AT&T writte usin th Azte compiler Thi versio i adapte fro th versio writte i Lattic compile fo th IB Persona Computer Th Lattic packag i availabl fro Lifeboa Assoc 165 Thir Avenu Ne York N 1012 . 'Make take fil o dependencie ( 'makefile' an decide wha command hav t b execute t brin th file u t date Thes command ar eithe execute directl fro 'Make o writte t th standar outpu withou executin them. 'Makefile' format: - Ther mus b 'makefile' yo can' tak inpu fro the standard input. - Th defaul nam o th 'makefile i 'MAKEFILE o th defaul disk Differen 'makefiles ca b specifie usin th '-f optio o th comman line I th '-f optio i used th defaul 'makefile i no processed. - Any blank lines in the 'makefile(s)' are ignored. - lin i 'makefile tha start wit ta characte i 'howto lin an consist o comman nam followe b arguments Th comman nam mus b fil name e.g 'cc' 'Howto line appl t th mos recentl precedin 'dependency line I i a erro fo 'howto lin t preced th firs 'dependency line. - An othe non-blan lin i 'dependency line 'Dependency line consis o filenam followe b (possibl empty lis o dependen filenames. Operation: Syntax: make [-l] [-f makefilename] [-n] [filename] -l means list the makefile showing dependencies and 'howto' lines that are encountered. - mean don' execut th commands jus writ th one tha shoul b execute t th standar output Thi i usefu fo creatin batc files fo example. - specifie tha th followin argumen i th nam o makefil t b use instea o th defaul (MAKEFILE). Al argument ma b repeate an relativ positio o th argument i no important I multipl definition o fil ar found onl th firs on i significant. First 'Make read al o th makefiles I the proceed throug al o th filenam arguments 'making eac on i turn fil i remad i i i ou o dat wit respec t th file i depend o o i non-existent Dependencie ar processe i 'tree fashion s tha th lowest-orde file ar remad first. 'Make create submi fil whic i automaticall ru a th en o th 'make reques unles th - optio i used. Al definition an howto' ar store i dynamicall allocate struct's 'Make' REQUIRES CP/M 3.0 (or higher?). The default makefile name is MAKEFILE. An example follows: = ASCII 09 make.com make.o ln -t -o make.com make.o -l0/a:c sidsym make.sym make.sym make.o make.c stdio.h cz -i0/a: make as -zap make A explanation make.co i dependen file I i dependen o make.o make. i dependen o make. an stdio.h I th followin comman i issued:MAK make.co the mak wil chec t se i eithe make. o stdio. ha newe date&tim tha make.o I s the th compil instruction ar issued, the th lin instructio wil b issued I onl make. i newe tha make.co the onl th lin ste woul b executed. Hints Dependencie ca b i an order Mak wil resolv the correctly.  How to lines must begin with a not just 7 spaces. Th comman lin nee no specif wha fil yo wis t make I no specifie the th firs definitio encounter wil b th fil tha i 'made' Mor tha o fil ma b specifie o th comman lin i desired.Yo ma hav mor tha on se o fil definition i makefile I yo d yo ma ru ou o memory haven' ru int thi ye bu suppos i i possible. Sinc 'make build submi fil ther i n wa t kno i a erro ha bee encounter durin th make. vKMAKE.C[  !"#$%&'()*+,-./o0123456789:;<=>?@ABCDEFGHIJKLMNuOPQRSTUVWXYZ4Up旕_J#2e@Fg2Wb׌)P5j+PB|˷;%5S/~~uͯ@ ǯm~*V_pǷ Tv'hU6$EbE+r$ON m؊OW̋>MoLH f~p3ts6 )W+"_is]iWqnn+mR~pM6UŃ[FjT[V\WhUŁrfH{IUڰWqn*>Pa(#5 ]@F(T$RWp3Ƚ*m؊9+JۍP@dÓ X 6UŁr@$x'6UŃ[FjRJ*΍@E"5 ]@E*m+m*΍"5| 7CK҆s8H B*JJms8PH ֫J(.R}pF+钚YQS DjFrpJ+k땕\i˷;+m)nRܼA)nJfH7o/*mɆtCmWi͐"S!IUيU-R4+yF^h"%E*[l ,w?﾿ |CWiöKjfEp --کd(.y Ӯ8a撣UZx(N$;&RRfVbk$*m.jq҆Zֆ=l8H䱱oH0{FX:AІmi\m8aG+mWzF!H Sk״J (A҆9zu8J#W*mWХ #JF^4"CRXR$LB I#W*mEqKTn)P!z$A 4!56lM-Wx7aG+mȻ`e/?U0OZW[GIxnEB$5GTτ~ --M)waf[Z܈[nN^«@1pwsrIѓ\m:%M҆ JVTiUW8 Nv 7aJ7{WU0_k\mˆj(tkmEO[$L)ܫB]R3+ǏR &R :\i\rJN)&Otw_ߡa.M\H0ow6̶T$[*w#{t0ǒ0+^ŹQ։GІȻ`e{kmHj"P|8N.b)F*£c^H!ؚ$Mj6͐"J*΍"5goW賊ϕ6pV#Z(AaJu\iU"5UhYQD+^p7JCpRߣIuMK$A7pVpTa~_ߵE) KB^{)f@$O`J: mvKM"x{8J]6!nCpK+ mؖ+#{t0W[0"x[iT{•6Yg^U0/[S(tû=:m9YQRWiÜU|>.UpUkm&R Sbkj1/z>Sc)P5_h )r+mow[Wڰ Vh vfHV?/VRǯ^TڰWqn*>PBH~a(#5y>Pϕ6UŃ[Fj2n+mR~ozm'jJnyߟ\T̋^E+_h /zx2 |nlPlMڰ--bk(.+St'p sъ*-  ;IwOrGWiIQZv҆цEِ-Vh_?\ލx|Jf+:*$ u =*^* em/цٖVj+t~rqdNf^qNr y mqTi --VFaERTpBK*0s䩅 aE ),]$*Vl`E9X)BfMJmV8q݈[t҆g%G+*P+6Iv I{V] 'L6|6̼!%s/a@E2F^ŹQT$RÔ5-3«87 DjСaErP$*R[/af[Z*R[0x|i@EjF*+mjO҆ggT^Ul9ؚZ*GKލx|igT$?B*PJ^*GKF*+;3_k 3/zXʦ`6H>%Mm3Ô5-5I +š*m٫QD+X)] 3*9+"xyEԨ9=f m9P|8N.b)`K[k;Q@E(i"t6lKze%Õ6>+9ZQWb\I #vn:y[,|Or҆/ɇV[^ۉZ*[,J^«@1p('?] 3_ḱ1P& F<>6H>T#JfT$B*Px|+maEqKlg+j(ƒGІ=^07F i" m9;'6̼lM-95Jmγi6;_i>ZXyv>~V<;w#vO';tlW0󢇸%j2g i"~ 3'T[!xy҆Żj+W0&IC^-[S }N R[:tv--V<;qdWEpBˆ׿=UEDY҆gbIwjaB tVj+t]N^Rܹn/0JmγE Ϭwn/0bt٢'-GDY)rTjVB^«LV8}z:Eq :\iRХBm/![X o~B5J^R[sbMZPwɮ҆/j$O-V] _d1҆/6N9&I\ikmx}!%s/Y1*΍BAaJu^Śa[t6>[H!*(5H\A\[/--ɇcL#{tE"p Iwr՞p _#ɇcLJ^Xr~>.Uw#{tr~ƈ@9?B*P@9?B*Pƈ@9WZ@9&ˆRDaJu^Śa[t6>*6EGI`8t6>Emi%G+*P+>INW(i"t6> (tex|+mZkm+^HʡB0--G<>p JVTiUW8R9V˅Cb*INUhE^q'wOr akmyC]PqӔ$,RxVBf..cI}N R[ mv]6̼a @`=H V6PEZ!յk"L4!I@=6lK bM⣕ g/݈t҆gRHZ«87 B^ n1*΍T׮iɕ^ŹQ2R] =R A W0emBІgT$[*q~WE"pR92W--j땕N^hE^q-tC?] Ϯ՞p _ n1"P|8n\ _,[S-(tĻ=:mx-3F nGK5e _ nGK5%F n+mx}v =ѸiJP[! mx}6e>l܄m3!Ô5-5I +B] ϊ-,FTR[ލ=*tpܲqӹn/0JmγE ̇FNv6>Emi%G+*P+>INW2[6nBWi-(tĈLJ҆aֆHjow*mѦvKM£ӦRW\izw#vO' ~E s1B-)=JkmۍP@dSlVxNYN6VxUis GRs G¿#^h3Ɇ_ښ^ۉZIӦRHJۍP@dN6mWi͐"4qQi ZIPW*mؓhj4oX{t6*8yҼBWiÑrMyu t*mfo7B c|m'j;mYN6\dv6UŰ!)be'ц_[ܞ ] GRsN6->*;:t6h3ɆlZ46͐"6W,nj'^xSiÑ6+h_Jmx1śJm_#|~[hE ˼bDO.*&^ThÑt6h\HZi%_TDX(R^J+mWyňϟ/*Un16ܫbD*QE͵64CWD-ޤzG E!R UMIBى/ۍP@doR]iicfH+m^QD3Ƚϕ6^%e*΍b"EQR))*)p3t_D7q ~K +~+~uN_τNE+fp2Zjs]iURa+:Qw7:+m Z OVx߮v'+] o*)0( 5B+}6175B+Xhe~ +ߤzoEQTJUpq)G[Q%՟/ҽBs>#z[t6G<+"$ pw(J?%EG+4n:)#=~ [S#BVEI˧t+m!{ц=FGxǿGWiXn)EBH!{6GHhdC HSbe=@ {JBD ,#BH=?(.%BF^(v3GmLN5X/bɉ#ڐ==dWqvmHp{aɮ>#v] !oS ܞtbwyňRۓ[Nv!oîF^N+A KEQR))WBCn1mߊ(}t˓aɮ҆[hߊ(}G\[Nv6܇bǮ҆[h۷(J?%E_ZyG8<)؝*myň(OIїVfEqryR:l;Up2}6IQZnZ^ڰ--bk(.+St'p sъ*-  ;IwOrGWiIQZv҆цmake.com make.o ln -t -o make.com make.o -l0/a:c sidsym make.sym make.sym make.o make.c cc make cd.com cd.o getline.o ln -t -o cd.com cd.o getline.o -l0/a:c sidsym cd.sym cd.sym cd.o cd.c cc cd getline.o getline.c cc getline PIXGEN DOC kPIXRN DAT qSCRPRINTCOM rSCRPRINTDOC s KEYTEST COM vKEYTEST MAC w MAKE COM {?MAKE DOC 1*"22!6 #:]A0y Bad file name entered>2>>2>?>>͏> ͙KZReady when you are, Ace. Press ^C to abort. >͙(/ (w# >͏> !Q]T! + 6 #*Rܢe: >2>͙R6#͢y File received and written to diskQ^˻~#(Q:\/GG:,\(eK File already exists, do you want to overwrite it_Y,N y Returning to CP/M\(H>2\ѧ , RMD> !BB y Disk error PIXGEN DOC kPIXRN DAT qSCRPRINTCOM rSCRPRINTDOC s KEYTEST COM vKEYTEST MAC w MAKE COM {?MAKE DOC vCEN-INP.MACa  !"#$%&'()*+,-./0123456789:;<o=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`O.[oߵz{{`l6dǩ ޴߼rˋYppAV'кO}@b:T5ۛVZimҸGڲDBcϓaXz˒K,O' q(AioZyTĸ`7, lJ;.'a[+3<*b\}VKg ƇxƖ!23Ob n}ĭ"8oIʌ2Cf/ +23}2T8VZmfFGk 3(6x.%8EaC_N23zwb5UcK~Fpц3df ^ ġiQr#(VZ탰1R"a6Cng[2  GJ^ה;u}I߲_p,'ѪmOGOt}XPޞƏp,'Ѫ![Q~ ʇzV؝6p,'Ѫ7}XP>qhVj7,1yUvZi5IDׇQ^p/,ڬ({? k.q%ΈVCOt [^ź3Ve'uA]J,jMP~߶D(V(x,j]ERA#h] l@1᳍F+$YQ~CK'^< k/7rD.hU}K2Ot><\Z|dņ3`x@ j>(liz LKAa?\hSU_!ƞlBf{!Ƈhź`ܬvmUN4nV6a#[ޅ8 Uld9 ÑGW0|;Sp8p m6ZDI @`~ /gY3V.({?Q}K2|dņ3`4Π᳍F+dDDFa b]Ǜ+,7Ih&e'((^ 8xVٺnӌ=\-Q>%{.t`rr Y"/*i1UNZDk'C~݁p*jw e'z ʳVpjuնj){?џQ%wA+q(]_cԪMv#e'Q^8nJ6_3Ot}A-Vfl69^jݐ){?vA?mhlɸ2c[IUTnDׇQ^.2[2nV-lsh&iCZ_FȽ8נ%ʌm<'ًVmҞZ/}Xaa_cDcIUÆ]/ gp×C2PkUf){?Dy5s7g`r^5e'znD>,'AS3a9 l@kQ+ e'@ .°!9hV*L^8jjzJ><,z{JnV!Y73ðL&hR~jAo9a.J^ *['iK>}OR^ ƕ77 PxVZ# %dfD aGg.(]źCG6%##kU_4qM]jEiB{n:sъ҄ˇVT' -.ɴ4.{) {9 |Q3hl8LMF+[Q ='楫)ߖ,K4d+Px =>__(ߖ4Dភb]kPxZQ"vYݍoZQPmVwVfu҄KצU+گ+ZZQcֻ(78FpasuQ g) ОlV&Tw۪ [k񽰁kؒ?VT DF ї@cKFGaÅVcEۯ| ۠%##Cf6UuRy!13ÇhEIKժK]ҭVT[2?28.>iU>`ZZi_7_)M]# ܒ8CȂ‹UXýXiCC]mV/]M9>(l8ź ]WD>,'&YN7ZNKWkEiBuL+ڝ6qNzjzj(MuݦYtF"jPE vZMKWkUWK߸Y0-1PpJ+J^ж#u}I +@{?`E+467=Q>`^ 3c/K.tF4kzV~nhEU&&# ~nt3TwCԛ #NtF`#J|žqBe/8rZiEU]6jEIKv^U 9hEIO+3\oC'(iZu鶫V]Պ> c?UpF>iEIKժK]?|XhU:wذ.`hs _)kEiBu׶VTiJmRoQ>=Q[xJ+o)ُCQ+҄7ՊujUyҹΰ C¢VoN^ؠ13V_S=uRo^(VZ8\0{Szlxd#goVZQ5D#AkUoV Ƈx1Z: #Nq?FV+h1vъzП |d jE:o*O\$/8sD\DvȢVzjE@5v?V[}zMa40z"hE:o* 3 +ZiE-%qH?jE@stV%VV+Cz]ᄂY[TFm .Ҋ[uV ][Wk^׻/i`E+:MMMӊ4kuU&f'ufoSY+҄y+ ъujU^>􌥳Ago83 8Ai¢V_WHxg, F+VZяucU)⭠q  igAa60 lYОƏyJ+J=NSjziȂٞgʫ4΀C@hc.he{a6.K%ZiE-%qH?jE~K*jE4KZ6M9^Z+%VddJ+$#S ġqYV shEnEZ&d/]Mbl8CmV qAT+҄i7nViK(Ɔ3ġqYVTu"Fv-R(['VZpH?2AhEiBYjEiBI + X: l$ӊ҄i_>  C?s(*J2|p6ġQ^p (M6qYfh/p*['+ shE@ϋE+nd넴$(ɴ$hjEɏ7Ix%h Hm Dw5V-PxV 8tEF\6@dmp34SYjzWv-Rhjn" Myt( ЊVV+>Su(&c8aqH2(Mhvϋ]vBžgJFgQދuA+ۊidDy5sG6Mn3%YHGqHNS/M{RXa4dDiؠR+4Xj3pZi'6.KcgmX lJ+J Q-3Fភb]kPxZQN֊~#h[}NwA+hnd?G4dQ+Unjե[H* OZQN[4jEiBϫח֊~h97o83Vy](\ 05 Ca |(?hvޏ&Twm{?jEU&&w0 l@#VpV+JJ.['wㇿdnjE:Z+ۊidDyLKCcM.p /(M?,MA8ƖVZw'8LMS8P7› gpkVZmi{~4Ee=mE%?hOV+4/M{_aj6ZQU)e(iZu鶫V]Պ>mm0ܳ}>5VġVZiʓqF6.Kqt623kdfD73#N&aX&"Af/ 176qZi]6~3=KH?2i3 |Qcg XZQU)-һl$13 V}qx)Q="`X&p(ъVF+_]6qYǨ#όA8.XOff>  (#C`Fdy6(\`.TXF  q>F>J6O.L&t*_X:$Bdf4D" 8rOZoZiH+ qAm qAI.RP=/ go|/l _U6ҟL+J6}BnDG Ca76V4-RӔd7jEnE {^/DykFdC13kEuET+o.)e^l8c bKpkGџ_Њ@I J+Ze*_hfj~&q7|Y 7q؈:X?8#P :\UdfF.`'` 8>bi8F.:7(l\!313cl.  df4D/ 1̈P@ZjuUvC+Wv-R|blq8re/ZQU)-һl$@fƑcg֊҄9_6/ZQN&Gf>\d[cE8@ o}nCZ8Tï;V&TumRQ+JJn[ZQU)n$ʫEFcK֊~ v*ڴ-n8љ zD4ўlqXp86` bK4|2 .i<eyx#G23[2m/  ,[cE8@ 0, |F#.0ʏ ̌m68LMæ)l/ A 23hGoK(0\i26X~n5V'cЊ~ ݐ)ڒKþ-96XJ|dmؒa#|i4kݐ4$U qAT+46ٍD3g?mhlZѰhjE@(8pZя}ٗ>2-Ap8zgʷdҰ/.6J_ l6F=5VX+~6ǯTiJ8eVTtU.jEIEdҰ/.6JP8\܄[+ +V&Tum_h8 ZZQU)n$ʿx+h _cԊ@T+ i zY+Vco~ Z+X[[y>R[A >}giI+ʇOXa4dh L+vVTiJF+JZV]UnO+juI+ʰG[4dZg_+ U]կV&dݶj4.hjEU&Q+v-Ra]x"zW0g8-dNJu_Vl<3B+-6°/.[c!N+n_)M@Iֵ6[Q& o4díZQP]4d|ڼt5eQx[cє՗fy҄MV+NをL+NVTiJm78LM( Ǩ U] V&dݶjNSjH1VqGh Ha7PiE:Z+jV'6ހqV}$V&VQ&@J@n֊$EڵV}$)Q>8 l@aZ^J|qPƊpߠqGgX+h8 ZZQN֊ƶE%V&TuV&v |MA>zl8pm VTJ݊D '3\?|"amЊ@T+jJ n$(9F<pơt GoC{dXAnVZQ"v(s~&F@v3%YHEA"!OA?{{aq5VX+}˩`ppyq̌4l8asuQ g؀G ƚ(X:#_{\SuT+>8t(DVT' -Ү} 9z7nӊ</"Պ@m~e)ɺEJ/RKgDCm%Zv}a7PiEnҊVF+gPp/\h՗&[Ұ(ɴa7P[iEU}ojեۮZuV+J*x6ƙI+F\fx>jVZ-wWJF@? _c*_6_)J" opk0ҟZ}~d+Q& \‹GSV:_)i.k6GXCZenUnD:?%['wUqjOۯa%#}Xq{jW(i߈ڰǁgi8Eї Z6[}ͷdaVHKEYTEST COM vKEYTEST MAC w MAKE COM {?MAKE DOC  This is the release date of the disk. KEYTEST COM vKEYTEST MAC w MAKE COM {?MAKE DOC MAKE CQ MAKEFILE CEN-INP COM CEN-INP MQC 'SCRPRINT.COM EF EC 1024 8 SCRPRINT.DOC 4E 38 2304 18 KEYTEST .COM 73 5D 384 3 KEYTEST .MAC 66 26 3456 27 MAKE .COM D0 11 16256 127 MAKE .DOC 54 A1 4864 38 MAKE .CQ 29 CA 8064 63 MAKEFILE. 8A 0D 256 2 CEN-INP .COM 91 96 768 6 CEN-INP .MQC 75 07 10112 79 $ Fog Library Disk FOG-CPM.161 Copyright (1987) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Graphics programs for the Osborne Executive as well as other CPM+ utilities. Filename Description -03-00 .87 This is the release date of the disk. -CPM161 .DOC This is the description of the disk contents. DRAW .COM 2D54 6K [Draw 1 of 6] This is a graphics program with a demo. The Demo works on the Osborne Executive. Requires some hardware mods to completely implement. DRAWDEMO.COM B88B 6K [Draw 2 of 6] HI-RES .DOC B7BB 28K [Draw 3 of 6] HI-RES .MAC 8F37 23K [Draw 4 of 6] GRPH-MOD.DRW 6DDC 23K [Draw 5 of 6] FONT .PIX 3B53 1K [Draw 6 of 6] PIXGEN .BAS E883 17K [Pixgen 1 of 3] Design graphics for the Epson printer on the Executive screen This comes with MBasic source code, so it could be modified for other hardware combinations. PIXGEN .DOC 15C5 6K [Pixgen 2 of 3] PIXRN .DAT 1D8D 1K [Pixgen 3 of 3] SCRPRINT.COM EFEC 1K [Screen Print 1 of 2] This is a memory resident screen print utility for the Osborne Executive. SCRPRINT.DOC 4E38 3K [Screen Print 2 of 2] KEYTEST .COM 735D 1K [Key Tester 1 of 2] This is a test program for the keyboard of the Executive. It comes with Assembler source. KEYTEST .MAC 6626 4K [Key Tester 2 of 2] MAKE .COM D011 16K [Make 1 of 4] This is similar to the Unix MAKE command. It is a type of submit file builder that follows a written script. Source code in (squeezed) Aztec 'C' has been included. MAKE .DOC 54A1 5K [Make 2 of 4] MAKE .CQ 29CA 8K [Make 3 of 4] MAKEFILE. 8A0D 1K [Make 4 of 4] CEN-INP .COM 9196 1K [Centronics Import 1 of 2] This program makes the Executive parallel port resemble a printer to another computer. This can be helpful for file transfers. CEN-INP .MQC 7507 10K [Centronics Import 2 of 2]  code in (squeezed) Aztec 'C' has been included. MAKE .DOC 54A1 5K [Make 2 of 4] MAKE .CQ 29CA 8K [Make 3 of 4] MAKEFILE. 8A0D 1K [Make 4 of 4] CEN-INP .COM 9196 1K [Centronics Import 1 of 2] This program makes the Executive parallel port resemble a printer to another compu%&'