IMD 1.17: 2/06/2011 15:23:10 superbios v2.3  >o:~W!{> " OC > S>O:31!2|}N#Fx2CN#FC$#^#V^#VS#~2#~2<2###~2#^#VSN#FCC*KB0KC:( [0!'}#"* (,*#"+))[R#}! !!Ax͎qput+[[R8 utx7?R#|(/ sr +utwwNFqpnf^:(#~W#:G)[7?K R0! !;NFx(ENF C$7?KnfB8C[0MD!' {:m!;!NFnfB#>,(0W}_nfRut;RDM!A76! [36:G6!w0 ͖!2͖ !͗>O3F#Nů  SYS: Which .SYS file to load 0 = CPM 1 = OSLOAD ? SelectReadFile not found error: file *+":*+"/:*+"^:*+":!":"5:"d:":!":"7:"f:"::8*9:8=o&))8  ^#V!q;p+q!r;6>!r;2*r;&;) p;3>L ~ÒÃG3x(OxAG:xG~ > 2v:nO y~ 8 q!*z~(ͭ8͏ͷ:q2t>2>2yKc> 2v> :yG /_~(!` *k:t{  _!c(  :v= L{((ZZ:nhZ:thZ:xhZZ>2v ~  ( w:q2rF8 <2ty2x:qW:j*mKoB(7:rGz?"|*m"o:qG2rxG![k2jG!> z{2n2xw<2q*k!` "kͱ"k: (8 ~Zd>w(>>w~Can't recognize density of disk in$Read$Write$Seek$ error on track $ sector $ side $ drive $ $!\6͂ !!y;6͂6 :y;- !Ͱ ͭ :s;:| :\:y;HZ !:]A<2\O>n !*y;&\ 6 ì !y;6:s;.¨ ͭ͂ڨ :y; ڟ !Ͱ ͭÌ ! :y;<2y;O!\ :s;w:s;0O> :s;02s;> :s;AO> :s;A 2s;>>!"z; :s;<:s;]:s; HҀ :s;S¸ !96ͭ} :s;P !96 "9} :s;D !96 "9} :s;L "8} :s;M *M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ ÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O* Creatin bootabl SUPERBIO dis fo customer wh alread ow CP/M 1 Patc you cop o MOVCPM.CO a describe i th attache Digita Researc Note Thi i necessar becaus th SUPERBIO use secto blocking/deblockin algorith (differen tha th Digita Researc algorithm tha use th director writ cod i t flus dis buffer afte fil closing. 2) Make a copy of your SUPERBIOS distribution disk to work on. Do PIP B:=*.*[vo] then use SYSGEN to transfer the loader. 3 Pu th cop o o th SUPERBIO distributio dis i you secon flopp driv (B:) an you curren CP/ syste dis (wit th patche MOVCPM.COM i th firs flopp driv (A:). 4) Run MOVCPM and DDT to create a system file. A>MOVCP 61 61 i th norma syste siz ) CONTSTRUCTING 61K CP/M V2.2 READY FOR "SYSGEN" OR "SAVE 34 CPM61.COM" A>SAVE 34 B:CPM61.COM A>B: B>A:DDԠ CPM61.CO Us you DD t brin iCP/M ) NEXT PC 2300 0100 -M980,1F7F,100 ( Move the CCP and BDOS to 100H ) -ICPM.SYS -R1600 ( The CPM.SYS file has the BIOS image ) -M2D00,3700,1700 ( Move the new BIOS to 1700H ) -l1700,1702 ( Make sure move went OK ) 1700 JMP FA00 -G0 ( Exit and save ) B>ERA CPM.SYS B>SAVE 34 CPM.SYS 5 Yo no hav bootabl syste dis equivalen t thos sen to customers who have purchased CP/M from Advanced Micro Digital.  driv (B:) an you curren CP/ syste dis (wit th patche MOVCPM.COM i th firs flopp driv (A:). 4) Run MOVCPM and DDT to create a system file. A>MOVCP 61 61 i th norma syste siz ) CONTSTRUCTING 61K CP/M V2.2 READY FOR "SYSGEN" OR "SAVE 34 CPM61.COM" A>SAVE 34 B:CPM61.COM A>B: B>A:DDԠ CPM61.CO Us title 'Initial Program Loader and Generator V1.1" name ('iplgen') ; date 21-Jun-83 ; ; .z80 ; Z-80 coding is used ; ; aseg ; ; *** ASCII Constants *** ; cr equ 0dh lf equ 0ah bell equ 07h eom equ '$' retry equ 10 ; ; ; ; ; *** Port Assignments *** ; SCSI$base equ 0050h ; SCSI Interface board base QUAD$eia equ 0010h ; Base port for QUAD. eia board crtstatus equ QUAD$eia+4 ; Status port for console crtdata equ QUAD$eia+5 ; Data port for console ; txrdy equ 0001h ; Tx. Ready bit in 8251 usart rxrdy equ 0002h ; Rx. Ready bit in 8251 usart ; ; *** SCSI Port assignments *** ; ; * bit,byte and port assigments for * ; * SCSI host interface adaptor * ; datai equ SCSI$base ; data in register datao equ SCSI$base+2 ; data out register bstat equ SCSI$base+1 ; bus status selport equ SCSI$base ; select port adr. clrint equ SCSI$base+1 ; clr. intrrupt port dmaport equ SCSI$base+3 ; dma address port cparity equ SCSI$base+4 ; clear parity port busy equ 80h ; controler busy bit cd equ 40h ; command/data bit direc equ 20h ; directon bit req equ 10h ; request bit msg equ 08h ; end message bit perr equ 04h ; perr error bit bdack equ 02h ; board ack. signal lint equ 01h ; interupte bit ; ; cseg ; start:: ld sp,stack ; set up the stack pointer call txout .xlist defb cr,lf defb 'IPLGEN00 -- Initial Program Booter and' defb ' System Generator V1.1' defb cr,lf,lf defb 'For 60k Systems',cr,lf,lf,lf defb 'L)oad or M)ake System Track --->',eom call ci ; get answer cp 'M' ; see if make system jp z,make$system ; brif so cp 'L' ; see if load system jp z,load$system ; brif so call txout defb cr,lf,lf defb 'ERROR: Please Type "M" or "L"' defb cr,lf,lf,eom jp start ;* ;** ;* ;+ txout:: ;- ex (sp),hl ; hl @ data ld a,(hl) ; a = data inc hl ; put back pointer ex (sp),hl ; cp eom ; end of message??? ret z ; return if so ld e,a ; else e = character ld c,2 ; console output code call 0005h ; do the bdos stuff jp txout ; and repeat ;* ;** ;* ;+ ci:: ;- ld c,1 call 0005h ret ;* ;** ;* ;+ make$system:: ;- call txout .xlist defb cr,lf,lf defb 'Please Enter Name of GEN''ed CP/M System --->',eom .list ld hl,line$buffer ; hl @ line buffer ld (hl),80 ; max. line size = 80 characters ex de,hl ; de @ line buffer ld c,10 ; read console buffer call 0005h ; ld hl,fcb ; clear out fcb ld de,fcb+1 ; ld bc,33 ; ld (hl),00 ; prime the routine ldir ; perform the operation ld de,fcb+1 ; de @ filename ld hl,line$buffer+1 ; hl @ filename line ld c,(hl) ; c = size of line inc hl ; point to data part of line ld b,8 ; b = size of filename ms010:: ld a,(hl) ; a = data from line cp '.' ; is it a dot?? jp z,ms020 ; brif so ld (de),a ; else stuff to fcb inc hl ; inc de ; increment pointers djnz ms010 ; ms030:: ld a,(hl) ; skip past '.' cp '.' ; jp z,ms020 ; brif found inc hl ; jp ms030 ; and countine ;* ms020:: inc hl ; point past '.' ld a,b ; see if all filename is filed or a ; jp z,ms040 ; brif so ms050:: ld a,' ' ; pad with spaces ld (de),a ; inc de ; djnz ms050 ; ms040:: ld bc,3 ; ldir ; trnsfr rest of file name ld de,fcb ; try to open ld c,15 ; call 0005h ; cp 0ffh ; check for error jp nz,ms060 ; brif ok call txout ; defb cr,lf,lf defb 'ERROR: Cannot Open File ',eom ld de,(line$buffer+1) ld hl,line$buffer+2 ld d,0 add hl,de ld (hl),'$' ld de,line$buffer+2 ld c,9 call 0005h jp make$system ;* ms060:: call txout defb cr,lf defb 'Loading File ...',eom ld hl,buffer ms070:: ex de,hl ; de @ dma buffer push de ; save ld c,26 ; set dma call 0005h ; ld de,fcb ; de @ fcb ld c,20 ; go read a record call 0005h ; perform the read or a ; check for errors jp nz,ms080 ; brif done pop hl ; increment dma ld de,128 ; add hl,de ; jp ms070 ; ;* ms080:: call txout ; defb cr,lf,'OK',cr,lf,eom call get$drive ; go get the proper drive code ld hl,buffer+0880h ; start = buffer ld (begin),hl ; pop hl ; end = last dma ld (last),hl ; ld a,03 ; command is write ld (command),a ; call doio ; and do the i/o call txout defb cr,lf,lf defb 'Operation Completed',cr,lf,eom jp 0000 ;* ;** ;* ;+ get$drive: ;- call txout defb cr,lf defb 'Enter 0 (Drive #0) or 1 (Drive #1) -->',eom call ci cp '0' jp z,gd99 cp '1' jp nz,gd010 ld a,20h ld (drive),a gd99: call txout defb cr,lf defb 'OK',cr,lf,eom ret ;* gd010: call txout defb cr,lf defb 'ERROR: Please Enter Either 0 or 1',cr,lf,eom jp get$drive ;* ;** ;* ;+ load$system:: ;- call txout defb cr,lf,lf defb 'Load System Function Selected',cr,lf,eom call get$drive ld hl,0d400h ld (begin),hl ld hl,0f700h ld (last),hl ld a,1 ld (command),a call txout defb cr,lf,lf defb 'Loading System ...',eom call doio jp 0ea00h ;* ;** ;* ;+ doio:: ;- ld hl,command ld a,(drive) or (hl) ld (hl),a ld de,(begin) ld (dma),de ld a,1 ld (command+2),a ld (command+4),a doio10:: ld hl,command call docmd jr z,doio20 call txout defb cr,lf,lf defb 'ERROR: Disk I/O Error Detected, Operation Aborted' defb cr,lf,eom jp 0000 ;* doio20:: ld hl,command+2 inc (hl) ld hl,dma+1 inc (hl) ld hl,(dma) ld de,(last) or a sbc hl,de jp c,doio10 ret ;* ;** ;* ; ;* start of protocal handling routnes * ; ;+ docmd: ;-op: issue command to SCSI host adaptor ;-pp: hl @ command bytes to send ;- @actsec & @rpntr are valid ;-rc: no - zero : error in command (a = error bits) ;- zero : command was executed successfully ;- ld (lcmd@),hl ; save command @ ld a,retry ; get retry count ld (trycntr),a ; reset counter out (cparity),a ; reset parity error dcmd1: push bc ; save counter call ?putdma ; set dma address call ?select ; go select controler pop bc ; recover bc ; wait: ; ;* here we must wait for execution * ; in a,(bstat) ; a <--- buss status and cd+req ; check for data jr nz,wait ; brif still data in a,(datai) ; a <-- completion status push af ; save ending status wait1: in a,(bstat) ; wait for req. and msg. and req+msg ; jr nz,wait1 ; in a,(datai) ; get byte of zero pop af ; recover status and 00011111b ; mask out errors jr nz,wait4 ; brif not ok in a,(bstat) ; check for parity and perr ; out (clrint),a ; clear interrupt ld a,0ffh ; jr nz,wait4 ; brif error xor a ; exit with zero ret ; and exit ;* ;* wait7: pop af ; clear out stack wait4: bit 2,a ; hardware busy?? jr z,wait6 ; brif not call txout defb cr defb 'Please Wait, Drive is Spining Up',eom jr wait5 ; and continue ;* wait6: ld hl,trycntr ; see if retry up dec (hl) ; jr z,wait2 ; brif retry is up  wait5: ld hl,(lcmd@) ; recover last command jp dcmd1 ; and try again ;* wait2: out (clrint),a ; clear interrupt or a ; exit with non-zero ret ; and exit ;* ;** ;* ;+ ?putdma: ;-op: send dma address to host adapter ;-pp: rpntr has dma address ;- ld a,(hidma) ; set hi-byte out (dmaport),a ; high byte always zero ld de,(dma) ; de @ dma address ld a,d out (dmaport),a ; send byte 1 ld a,e out (dmaport),a ; send byte 2 ret ; and exit ;* ;** ;* ;+ ?select: ;-op: select controler ;- in a,(bstat) ; is controler busy?? and busy ; wait for not busy jr z,?select ; wait if so sel2: ld a,01h ; select controler #1 out (datao),a ; out (selport),a ; and select controler sel1: in a,(bstat) ; wait for req and req ; jr nz,sel1 ; ld d,a ; d=0, mark first command ; ;* now fall on thru to output command bytes * ; ;+ ?outcmd: ;-op: issue command bytes to host adaptor ;-pp: hl @ command bytes ;- in a,(bstat) ; grab buss status ld c,a ; save status and cd ; see if data ret nz ; exit if data ld a,c ; check for direc and direc ; ret z ; exit if input ld a,req+bdack ; bit 0,d ; see if first cmd. jr nz,?oc5 ; brif not ld a,req ; else just check for req. ?oc5: and c ; check for ready jr nz,?outcmd ; brif not (1.75/1.17) ?oc1: ld a,(hl) ; get command byte (1.75/1.17) out (datao),a ; send to controler (2.75/1.83) inc hl ; point next (1.5/1.0) ld d,1 ; mark not first command jr ?outcmd ; and do it again! ;* ;** ;* ; ; dseg line$buffer:: defs 80+2 last:: defw 00 begin:: defw 00 hidma:: defw 00 drive:: defw 00 dma:: defw 00 lcmd@:: defw 00 trycntr:: defw 00 command:: defw 00,00,00,00 fcb:: defs 36 defw 100 stack:: buffer:: end mmand bytes * ; ;+ ?outcmd: ;-op: issue command bytes to host adaptor ;-pp: hl @ command bytes ;- in a,(bstat) ; grab  eVKj'S a]L6Ku0׎;fc a݌4+v0ΦjGOWp,!;[`pu2YX9i֧>-0%sY$|i`701 ?K5>-0 `VKl KbSh3EՔ'vegiM O~'7Ho3i-MG !8G i +xNiv3PŸ<fc Bu *@`'nH$f'cA02=y#S"1xFVjBN@)wf! ;VKx@ ny2OK1@ '%C4<*>&kYWhdIg<' v3\njue;Yk5jf6cv3Gnjo;GN@ ?IG*YhdO!:AŒGf^ ͦ`Q_x`28!0c#L -FF{3K1NdZk(k2A !`QnH< ٚ_xw$O1 m%cڢ =l >#L/GG,! %2md@ Bx6!_xK1@a"[6<ݒ*5 (2 0.ez82 F#/2~X4@s[E=2# v# v&QGv|i^0?eٯ'{@Ovhm/P1 0~ 8`'Ae9Fy@vB42  BIt0 S 4 !D`@@+-a 0.ez82 F#/2~X4@s[E=2# y`0 :y@F7^'1gh@@ ' @/@0`p0@Иd `xT@``H0po8Hޏw *ZzWh~@@` p8@     P**Z*z M~`@ ` p( @ 84&!p$@ A.[- > (2 0.ez82 F#/2~X4@s[E=2#:20EA0000C300F5C341EBC396EAC39AEAC39EEAC3A2EAC3C6EAC3BCEAC370EAC3C0F1C37487 :20EA2000EAC378EAC3C0EDC37CEAC380EAC3A6EAC31DF100D406DC00000000000000000027 :20EA40000000000000000000000000000000000000550BC2472B0C0DCA472BF5CD0E0CC42D :20EA600089EC89EC89EC89EC89EC89EC4EEC89EC1600180E1606180A16091806160C180236 :20EA8000160F3A94EA2100EB875F7A16001956235F7EEBE900C91600181816031814160664 :20EAA000181016091802160C3A030007072129EB18063A03002121EBE60318CC1603213193 :20EAC000EB3A0300180A16062139EB3A03001F1F1F1F18E43EFE20C07B3DF8CA9D04FE1091 :20EAE000D29D043C32F13CAF676BC3341BCDC4287AB7C29D043AEC3CB7C87BB7CAE18000EA :20EB0000ED00ED01ED02ED030000000000000000000000000000000000000000000000003B :20EB200000EC00EC0100000000EC02EC0100000000EC01EC0000000000EC01EC000000006F :20EB400000F33164000E00CDC0F17CB5CAD0EB5E2356ED53CEEB2A33EAFD2131EAE511069F :20EB600000FD19FD4E00FD460178B12842CD74EAFD4E02FD46030BED43CCEBC1C5CDC0EDAD :20EB8000373FED4BCCEB03FD6E04FD6605ED42E138CBED43CCEB11800019E5ED5BCEEBCDDF :20EBA0001DF14D44CD78EACD7CEAB7202318CC2A35EA2206002103EA2201003EC3320000A1 :20EBC0003205002A33EA3A04004FFBE9CC2C000011D7EBCD08F2765761726D20626F6F74D3 :20EBE000206572726F722D72657365742073797374656D0D0A24D23DC3B126F53E0132E983 :20EC0000C317ECC32DECC38CECC39AECC3ABEC534243494F20202087280A3C4FED78E60114 :20EC2000C83EFFC92A3FF27C95C83EFFC947CD17EC7828F98728064FED78E67FC9F326006C :20EC40001160F2197D3CE61F323FF2FB7EC9ED7394F23194F2E5D5F52A3FF2247DE61FBCCC :20EC6000200ADB00AF0E07CD8CEC1816ED5B40F216002160F219DB00E67F777D3CE61F3295 :20EC800040F2F1D1E1ED7B94F2FBED4D41873C4FED78E60428FA0DED41C9FE0228414759AB :20ECA000CDAFECB77828F90DED59C9FE022812873C4F3E10ED79ED78E60CFE0C3EFFC82FEB :20ECC000C93AF0ECB72810D3063ECFD3073E1FD307AFD30532F0ECDB05E601C83EFFC9CD78 :20ECE000C1ECB728FA79D3043E80D305AFD305C90FA82FF121EC3C347E3DC25A2E215D3F42 :20ED0000C3B4EDC3C5EDC3B6EDC3BBEDC36AEFC3B2EEC332EF464C4F505059202000001AB2 :20ED20000000001A0000001A0000001A009AED00000000000000F56DEDCCF980F99AED00EA :20ED4000000000000000F56DED38FAECF99AED00000000000000F56DEDA4FA58FA9AED0000 :20ED6000000000000000F56DED10FBC4FA1A00030700F2003F00C000100002004000040F01 :20ED8000002F017F00C000200001008000040F005F02FF00F0002000010001070D13190599 :20EDA0000B111703090F1502080E141A060C1218040A10160E0079322BF2C979322EF2C907 :20EDC000ED43FEEAC947CD28F1B72038DD2239F2DD7E003C47215EED110F001910FD4D44CB :20EDE0003A2AF2CD0EEEDD7E00B72806AF7723771806119AED732372110900197123702BD4 :20EE00002BED52C93A36F2322AF2210000C9878787876F2600112DED19C9DD7E00B7280924 :20EE20003E08473A37F20707B0473A2AF2B0D314DD7E03D30D3E02323EF23ED0D30CE3E35D :20EE4000E3E3DB0CE680C8213EF23520ED11F5F2CD08F2CD7DF011ADF3CD08F2116DF3CD95 :20EE600008F2CD9AEAFE0320D1E13E01C93E0A3234F23A2BF24FDB0D91200D3A2AF2473AA9 :20EE8000B1EE90C816141802161C79D30FDD7E01B2F3D30C3A2AF232B1EEDB14FB17380A60 :20EEA000DB0CE6992004DD7103C91E1CCD2AF018C100DD2A39F2DD7E00B728503E02B928D7 :20EEC000063DB928211826CD32EFB7C03A2EF2E6F8322FF2EE103230F2CDE2F0EBEDB03E08 :20EEE000FF3233F22FC9CDEDEEB7C01845CDC1F030E77AE6F8573A30F2BA2023CDCAF038EC :20EF00001ECD32EFB7C02F3230F218CD3A2EF23231F23EA33222F03EAC3238F2C39EEFCDCF :20EF200032EFB7C02F3230F2CDA3F0CD94EFB7C018A73A33F2B73EFF3232F22FC8DDE5DD91 :20EF40002A3BF23EA33222F03EAC3238F22A2AF2E52A2CF2222AF23A2FF2CDABF0CD9EEF21 :20EF6000E1222AF2DDE13233F2C9DD2A39F2DD7E00B7281ACDC1F03806CDE2F0EDB0C9CD80 :20EF800032EFB7C0CDA3F0CD94EFB7C018EB3A2EF23231F23EA23222F03E8C3238F2CD1ACF :20EFA000EECD6DEE3E0A3234F23ED0D30C3A38F2470E0FE3E3E3E3F3DB0CE6200F0F0F2F1E :20EFC000A05FDD7E00B7160128072180F5160818032AFEEA3A31F2D30E7BD30CCD1BF0DBAE :20EFE0000CFB5FB0C87BE6BF3A38F22023FEAC201F11F5F2CD08F2CD7DF01107F3CD08F2B8 :20F00000116DF3CD08F2CD9AEAFE03209C3E01C957CD2AF0CD72EEB7288FC90680DB14B7D4 :20F02000F0EDA220F81520F318F33A34F23D3234F220577BFE1C280EFEAC280511B9F21824 :20F040000811BEF2180311C4F2CD08F211C9F2CD08F23A2BF2CD15F211DAF2CD08F23A3171 :20F06000F2CD15F211E4F2CD08F23A37F2CD15F2CD7DF011F3EBCD08F23E01E1C911ECF21D :20F08000CD08F23A2AF2CD15F2C9DB0CE610C8DD7E01F60CD30CDB0CE60428FAAFD30DDD75 :20F0A0007703C93A2EF2E6F8322FF20F0F0FDD4602B80E003802900C3C3231F2793237F22F :20F0C000C93A2EF2573A32F21FD82A2AF2ED4B2CF2ED42280237C93A2FF2477A90D8FE08E2 :20F0E0003FC9DD223BF22A2AF2222CF23A2EF247E6F8322FF278E60747042100F51180002D :20F100001910FD018000ED5BFEEAAF3232F2C94704DD2119ED110400DD1910FCC97AB36985 :20F1200060C8EB096E2600C979B7200D503A3DF2B7CAB3F13E00323DF22AAFE950CB597DC9 :20F1400028037CCB9841041F10FD3867D5CD32EFD1B7C03ED0D30C3A2AF23236F27A322A17 :20F16000F2CD0FF1D314CD8FF0AF322BF23237F2DD77003C322EF22AFEEAE52180F522FEB5 :20F18000EACD8EEFE122FEEAB7C03AFFF5B72812D6E5FE03380C1196F2CD08F2CD7DF03EE2 :20F1A000FFC9DD7700B728043E0818023E1ADD7702AFC97A322AF2CD0FF1DD7E0018E301DE :20F1C0003A94EAB9200706001603C382EA1100EB875F1A4779875F1AB728296790CAEFF1E4 :20F1E00044C5D51612CD82EAD1C1B720173C60472E03C5131AD5CD93EAD1C17CB5C87932F5 :20F2000094EAAFC9210000C91AFE24C84F13D5CD9EEAD118F3F51F1F1F1FCD1EF2F1E60F6E :20F22000C69027CE40274FC39EEA0013DAFB32E5EB7CFF0000000000001DED1DEDFF00000A :20F2400000CD52333E05F5AF0603298F05C21B33C630CD5233F13DC21733C3363344CD3EA2 :20F260003345CD3E330C0DC03E30C36633781F1F1F1FCD473378E60FC630FE3ADA5233C63A :20F28000070C0DC26633FE30C84FFE3ADA66333E30CD663379E543616E2774207265636F5B :20F2A000676E697A652064656E73697479206F66206469736B20696E2452656164245772CD :20F2C000697465245365656B24206572726F72206F6E20747261636B20242020736563746D :20F2E0006F72202420207369646520242020647269766520240D0A546865206469736B65BA :20F3000074746520696E242069732077726974652D70726F7465637465642E202052656DB5 :20F320006F766520746865206469736B6574746520616E640D0A707574206F6E2074686584 :20F340002077726974652070726F74656374207461622C207468656E207479706520616E1E :20F3600079206368617261637465722E240D0A54797065206120636F6E74726F6C2D43200A :20F38000696620796F75207769736820746F2061626F727420746865206F70657261746996 :20F3A0006F6E20696E73746561640D0A24206973206E6F742072656164792E0D0A496E731C :20F3C000657274206469736B657474652C20636C6F736520647269766520646F6F722C20A9 :20F3E000616E64207479706520616E792063686172616374657220746F20636F6E74696E15 :20F4000075652E24D5CD723AB7CA083511483DCD883ACDD833FE0DC2E034E5C52A0140E5DC :20F420002A0340E52AFF3FE9D1E122FF3FE1220340E1220140EBE90B626BC3AB343AFA3FCC :20F44000B7CAE504320640C1E1D1112B35D5E5C5AF320540C3400BC3C1043A0640B7CA8A20 :20F4600035C101DE01C5CD550BFE3ACC550BCD1505C0B7F04FE608C25E3579E610C26635B4 :20F4800079E620C26E3579E640C27B35C93A05403D320540C93A05403C320540C93A054038 :20F4A000B7C03AF33CB7C8C3EA283A0540B7C0237EFE08C83EFFC35029C1D1E121CC02E5F3 :20F4C000D5C5C9B7F5CDFE2F220740CD69324F3A113EFE20CAB0352A0740CD8A30F1C97982 :20F4E00036002BFE2CC49D04F1F5CAEC35CD290BFE3CC49D04F177E5F50E002B3A113EFEA9 :20F50000CD06F5C3AFEB2145F601010AEDB3214FF601030CEDB32160EA7CED47ED5EAF3261 :20F5200003003204001179F5CD08F23A05EAC606CB3FCB3FCD35F6C548CD9EEAC1CD9EEAD3 :20F5400011BFF5CD08F23A22EBC6314FCD9EEA11F6F5CD08F23A2AEBFE023808110CF6CD0B :20F5600008F2180EF51124F6CD08F2F1C6314FCD9EEA1131F6CD08F2C90D0A53757065720A :20F5800020517561642043502F4D20762058322E300D0A5370656369616C2038222D35221D :20F5A0002042494F530D0A54797065616865616420696E7374616C6C65640D0A0D0A244BD5 :20F5C0002043502F4D20322E3220696E7374616C6C65640D0A0A44656661756C7420636F92 :20F5E0006E736F6C652069732073657269616C20706F727420240D0A44656661756C742029 :20F600007072696E7465722069732024706172616C6C656C207072696E74657220647269D6 :20F620007665722473657269616C20706F727420240D0A0A24010AFF049130FC81C6304FDA :20F640003E308047C918011803C1044405EA00180104026003C1044405EA002A0B40E5C5E7 :20F66000C3ED340B626BD1C3F136CDC80BFE0DCA9D044FCDEE4ACD290BFE0DCA5637CDEE8B :20F680004AB9C247373E0DCDEE4A3E0ACDEE4A3A113EFE20C0C3400BCDC80BFE0DCA9D04FF :20F6A000320D404FCDEA0AFE0DCA8437B9CA400BC37537E1D1C1018D37C35C34C1015E340F :20F6C000C521483D3A0D404F7EB9CAA537FE0DC823C39937C1D1E121CC02E5D5C5C9B7CD55 :20F6E000D40D2322F63F7EF62877CDFE2F2207400E00C5CD6932C10CFE2CCAC337AF772BF2 :20F70000320F403215403C772B221140221340360079321A40CD3B3AAFCD3B3AC1D1E12119 :20F72000F737E5D5C5C9C1015E34C52A2540E5AF320F40321040CDF033F5CD4830DA1C38BC :20F74000CA4F38F1320F40E1C38736F1CD550BC49D042A1340F5C231383A15403C32154013 :20F7600011E93D1A3C4F1A772B130DC237383600221340F1FE2CCA1D38E1222540C9F1E1B8 :20F78000AF222540CD3B3ACD9E3A2A234011050019EB2A1D40193A1540772A2340EB2AF667 :20F7A0003F23D5E55E23567AB3C49439E1D17323722A0740CD8A30C1D1E121CC02E5D5C505 :20F7C000C9E537CD930DCDFE2F36002B3601220B402B0E00CD8C32470CCD360BCDC80BFE15 :20F7E0000DCACD38FE3BCACD38FE2CCAA53878FE20CAA538FE09C4CD04C3A538E323235E54 :20F800002356EBCD883AE3B7CAEA38B9CAEA38DAEA3836002B0CC3DC3836002BCD2E30E11D :20F82000C1CD883AE52A1640E5C54F060009221640C12A0B40E521CC02E5111139D5C5C9E6 :20F84000CDF934E1220B40E1221840E1AF321040CD723AB7CA493911483DCD723AB7FCEEC7 :20F8600031CDED3ACDD833FE0DC22B39E52A1840E52A0B40E5C3ED342A0B4023AF32064011 :20F88000C3C6347D935F7C9A57C93AE43DB7C2C704CD83203A113EFE20C032E43D78E6805F :20F8A000C29D0478E60332E73D2AD23DEBCD5439EB22E53DC93AE43DB7CCCD04AF32E43D07 :20F8C000C3400B2121404E73234672CDA639CDAF39712370C92A1D40195E23562BC92A1D1C :20F8E000401923235E23562BC92A21407DB4CACF39EBD5CDAF39EB222140D1C3FB392A1F1C :20F9000040112000EB19221F40D5EB2A2940CD8D0DD1DA493B2AF83F253AFA3FB7CD8D0DF1 :20F92000DA493B2A1D40EBCD5439D5CDA639EB2A2540EB7BE6E05F7BB2C20F3AD1D57323A3 :20F9400072233E00772377CDAF39D1CA253A732372C32A3AEB222340EB2A2340D5EBCDA6CA :20F9600039D17323727BF6045FC9D5F52A2540EB7BE61FCCBA392A1D4019F1F5777BE61FD8 :20F98000FE1FCA573A13CC613AEB222540F1D1C97BE6E05FCDAF397AB3CABA3913131313ED :20F9A000C9D5EB2A1D40EB7DE61FC2823A7DF6046FEB197EEBD1C9CD723AF5D5EB7BE61FB1 :20F9C000FE1FCA973A13CC613AEBD1F1C9EB7BE6E05FD5CDAF397BB2C1C8AF7723772A1DAD :20F9E0004019732372C5CD9439C12A2340EBCDA639712370C92A2540D5EB7BE61F1BFE04A9 :20FA0000CCE13A2A1D40EB222540EB197EEBD1C97BE6E05FCDA6397BF61F5FC9D5F5EB7BCB :20FA2000E61FFE1FCAF93A13CC613AEBF1D1C92A1F40EB2AF83F3AFA3FB7C2123B2A294016 :20FA400025CD5439DA6F0D7AB7CA6F0D1F577B1F5FD52A1D40EB2A1F40CD5439424BD12A39 :20FA60001F40EB19221F4078B1CA453B2B1B1A770BC3383B221D40C9CD4F3BC3CF39D52AAE :20FA8000413DEB2A1D40CD5439DA6F0D7AFE03DA6F0D1F577B1F5FE1C5E52A1D40EBE3CDD9  :20FAA0005439424BD12A1D40E52A413D19E5221D4009221F40E1D178B1CA953B0B1A77230C :20FAC00013C3883BC1C932C13E32C23E4F06215E235623E5C5CDB73BC1E105C2A03B3AC188 :20FAE0003EB9C45A1AC9010000C57AB3CAC718EBE55E23567BB2C2C03BE17DB4C8CDE63B19 :20FB00002B2B562B5E7BB2CACA3BAF7723772B2B2BE5C3C03B010400094623223F3D7EE657 :10FB200040C0237EE680C4D43C7E235E2356C5E5D8 :00000001FF 02B2B562B5E7BB2CF397AB3CABA3913131313ED :20F9A000C9D5EB2A1D40EB7DE61FC2823A7DF6046FEB197EEBD1C9CD723AF5D5EB7BE61FB1 :20F9C000FE1FCA973A13CC613AEBD1F1C9EB7BE6E05FD5CDAF397BB2C1C8AF7723772A1DAD :20F9E0004019732372C5CD9439C12A2340EBCDA639712370C92A2540D5EB7BE61F1BFE04A9 :20FA0000CCE13A2A1D40EB222540EB197EEBD1C97BE6E05FCDA6397BF61F5FC9D5F5EB7BCB :20FA2000E61FFE1FCAF93A13CC613AEBF1D1C92A1F40EB2AF83F3AFA3FB7C2123B2A294016 :20FA400025CD5439DA6F0D7AB7CA6F0D1F577B1F5FD52A1D40EB2A1F40CD5439424BD12A39 :20FA60001F40EB19221F4078B1CA453B2B1B1A770BC3383B221D40C9CD4F3BC3CF39D52AAE :20FA8000413DEB2A1D40CD5439DA6F0D7AFE03DA6F0D1F577B1F5FE1C5E52A1D40EBE3CDD9 \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ԯ2 Շ!۶2:2a{_:۷ʖ:۷>Ľʖ:=2–!B!6#5ʖ:۷Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ַ"͌#>?͌͘ =_.:;<> Oօo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 3ׯ21y_͸2y2ͽ:Է˜1͘A͌>>͌92^ :۷¥.!_~#fow]٭ڎڥ!v"!çREAD ERRORçNO FILE^:۷ ! ~ 3#0 Wx x ր ւ G ~ # 3x~#B!Y~ɯ2:۷=!۾ý:۷=!۾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ٯw4!Y~ʆ͌†t=ʆf ^ T ٯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yڸpsp2mÆÆf ͧÆFILE EXISTS _: É: :۷ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ۯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !۶ Â$$$ SUBgܙܥܫܱ"C{2!"E9"1A߯22!ty)K!G_^#V*Cސ~E ,&-AGMSߛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :߷E B 2>: ߷b# : ߷y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ߾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ݯ2 H! >w_: ! ߾5ͤNkͱ¦ͱxʊ#Nx: ߷! ߖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:页o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*鯆# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A߾#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:E߷ẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E߷͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!B߾w!>2*C~=2u:B2~2wE:A*C߶w>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2a×âÐÙëül.oÀgÅÛtU G+ G+ Ď((T ^hp!p:!x:!:!x:????!p:??!x:!:'_^#V([!{<2~(y*|>>/s1H*|<(2\!w͙h(p(y>> >/͏(y>>1͝2.|'^#VS*3!1NFx(BoNF Cg7?KnfB8C[tMD̀ͅ >2!"2*5":O*3!vy2l!=8"j~(##^#V( (!Sw CCnz( Ni`Chɯ2>2;͵:ɯ22y2ͩ͝͵;͵: >2:̝::z2m:[hg:}2q:[hg:{2p:!h_>p!a"r:[hgSt:~[q2v:l![n*y:p!j:q!jͩ*t[y͝![vF:–ͩͩ͝ :2!j[*::~!p#=[!>w( KQ (͚( K| (ͥ:'''!!Kxy:K!!:˗!X[~ ~w(:!w(x(~9:KY(<>0Ͱ> :G!a::G!a:( ((:<22Cɯ2*j~*~!H[l~2y< P# kz͜:yw*j~@(8#~2y>=9!y:y_>=?͘:!yI :y! g( !so(!%_( W(s#rI:y_ ag( o(ys#r:y!:g( !o(!R_(  W(*js#r!:yw:y͵> =G͵x> _  w !a> k_ (!a> _ !> _ > _:yg(! O ! O(! _z((!:lA%͐(> >2~#$% O͙!H6#!X[lw*j##^#V*j^#V>= ɧ:=#={z͑{M Warm Boot Error - Reset System$ Bios Err on $: Drive Not Ready$: Write Protected Disk$ 3w+ Ô2"{3q3(:> :<.33PX 2|2>:f3)0R3>::cR{?@/ _ `     "?/c4> \^4U :U H0ʄ4H=;: y4ɯ;:͞:!*#@*?!!44͍ 4:@¾C02@*?r:5H=͈:3 4*@*@*?"?"@"@ bkë4:?2@+5ů2@@ :@ʊ5-? M? @ ?  +,ĝ5) <ĝw+:> G6G5͌2 D6>R? ? @, `     \4>Ô5^4*%@>2@3H0ʱ6 ʶ1;ʫ1'ʡ6"ʡ6>1Ç6G͕0 ʶ1ʛ6â6"%@;:͞:!*#@* @*?!!64>2@" @͍ 7:@6x 7* @##~#7+4r:47H=r:1:3 7* @1>2>2!>~ '#F ###^#V!~!~p= !1 !; !`|G^>>>:??C!  00G>0O Super Bios v. 2.3 K CP/M 2.2 installed $D`DÇ6U ĝ*@18:@<2@= 2=xx2=*=T9"=:=2=@ !!@Ns#Frͦ9ͯ9q#p*@^#V+*@##^#V+*!@}9ͯ9"!@9*@ "@*)@͍ I;*?%:?͍ I;*@T9ͦ9*%@{_{:s#r#>w#wͯ9%:s#r*:"#@*#@ͦ9s#r{_*%@{̺9*@w{W:a:"%@{_ͯ9zʺ9*@}‚:}o~r:{ʗ:a:{_ͯ9{ȯw#w*@s#r͔9*#@ͦ9q#p*%@{:*@"%@~{_ͦ9{_{:a:*@*?:?;*)@%T9o zo W{_*@*@T9BK*s#r͔9*#@ͦ9q#p*%@{w# øa*$wxw# Ó'~#fo&'q#p:B(* ͅ ~'M(:J2A(*;" 2 U6+:A(wAMz(2A(7(:B((*;" :A(2B(*;r#s+:A(i(*;͢(" 2A(2B(!* p# P(!HN#*~# ^(Ar#s *){ʅ({ƀ_҅(zʞ()Å(ͣ) *)!.*ʹ)!.*V#^(((!((ʹ)(z(!.*ʹ)(ͣ)z{7. SUPERBIOS distribution diskette contents: CPM.SYS i memor imag o CP/͠ wit th SUPERBIOS Customer wh hav no purchase CP/ fro Advance Micr Digita wil receiv CPM.SY wit th CC an䠠 BDOӠ zeroe out Se堠 CPMINSTA.DOà fo installatio procedure. USER.DOC give basi informatio necessar fo th operatio o CP/ wit th SUPERBIOS a wel a descriptio o th content o al th .DO files- CPMINSTA.DOC NEWSIZE.DOC FORMAT.DOC INTRFACE.DOC SUPRBIOS.MAC i th sourc fil fo th SUPERBIOS I ca b edite䠠 an reassemble i modificatio o th SUPERBIOӠ i desired Th堠 procedur堠 fo incorporatin砠 ᠠ ne BIOӠ i describe䠠 i NEWSIZE.DOC. FORMAT.COM i th SUPERBIO flopp dis forma program I wil onl ru o th SUPE QUA SBC bu wil ru unde th previou BIOS Interna detail o th disk formats are described in FORMAT.DOC. LDRGEN.COM i th equivalen o SYSGEN.CO i norma CP/ system LDRGEN.CO͠ transfer th SUPERBIOӠ col star loade fro sourc (usuall disk t destination Detail o th loade operatio ar i LOADER.DOC. FORMAT.ASM is the source file for FORMAT.COM. SBCBOOT.ASM i th sourc fil fo th col loade o trac zer sector one, which is brought in by the monitor PROM. SBCBOOT.HEX i th assemble SBCBOOT.ASM fo installatio i customized loaders. LDRBDOS.MAC i th sourc fil fo th logica (non-hardwar dependent) portion of the loader. LDRBIOS.MAC i th sourc fil fo th hardwar driver t mak th loade wor wit th SUPE QUAĠ flopp dis controller. rmats are described in FORMAT.DOC. LDRGEN.COM i th equivalen o SYSGEN.CO i norma CP/ system LDRGEN.CO͠ transfer th SUPERBIOӠ col star loade fro sourc (usuall disk t destination Detail o th loade operatio ar i LOADER.DOC. FORMAT.ASM is the source file for FORMAT.COM. SBCBOOT.ASM i th sourc fil fo th col loade o trac zer sector one, which is brought in by the monitor PROM. SBCBOOT.HEX i th assemble SBCBOOT.ASM fo installatio i customized loaders. LDRBDOS.MAC i th sourc fil fo th logica (non-hardwar dependent) portion of the loader. LDRBIOS.MAC i th sourc fil fo th hardwar driver t mak th loade wor wit th SUPE QUAĠ flopp dis  CP/M MODEM PROGRAM DOCUMENTATION 05/18/82 Thi progra use th fil transfe routine writte b War Christense i hi CP/ fil transfe progra (V2. a o 8/6/79 an i compatabl wit hi progra i singl fil transfe mode Multi-fil transfer ar onl possibl betwee tw system runnin th progra describe below. This program has two functions: 1. Communication 2. Program transfer COMMUNICATIONS Th progra ma emulat termina o ech dat bac t sende (ac a computer). Terminal Mode - 'T' Option Th termina mod ma b calle wit o withou fil name I fil i specifie (i shoul b ne file) the anythin receive b th mode ma b save i memor an late writte o disk Th sav featur i toggle ON/OF b Control-Y colo (: wil b printe a th beginnin o eac lin whe memor sav i active Th colo wil no b transmitte ove th mode no wil i b save i memory. I fil i no specified the memor sav ca no b activated. I th memor buffe i ful (th buffe i fro th to o th progra t th botto o BDOS) th content ar automa- ticall writte t dis (bu th fil i no ye closed) Communication ma the continu wit th buffe reinitial- ized Th compute wit whic yo ar communicatin mus accep th X-O an X-OF (Control- an Control-S conven- tion o dat wil b lost. Whe communication ar over us Control- t exi fro th Termina mod an ente th Menu Th fil t whic yo ar  writin mus the b close b usin th 'WRT command I thi i no done al dat wil b lost decide no t clos th fil automaticall sinc ther wil b time whe yo leav termina mod an the decid t re-enter Thi ma b don whil i th Men b usin th 'RET command Yo ma re-ente Termina mod an sav i th sam fil a man time a yo wis a lon a yo hav no close th fil wit th 'WRT command. Whil i Termina mode Control- wil pu yo i Fil Transfe mode Thi wil allo yo t sen th content o a ASCIɠ fil ove th modem Thi routin doe n erro checkin an ther ar n protocol specifie betwee thi progra an th receivin compute othe tha tha i shoul b read t receiv dat vi th modem Control-ؠ wil cance th transfer. Computer mode - 'E' Option Thi mod echo dat receive b othe computer Onl on compute ma b i thi mod a on time Ther i n sav featur i thi mode Usefu i yo wis t communicat wit somebod runnin th termina portio o th program. File transfer - 'S' and 'R' Options Thes feature ar th sam a i th CP/͠ Mode progra writte b War Christense excep tha upo completio o th transfer contro return t th Men unles th secon- dar 'T optio ha bee selected I th latte case contro return t Termina mode Remembe tha i yo ar operatin remot compute usin timesharin progra (suc a War Christensen' "BYE") th remot shoul b instructe t sen o receiv i th quie (Q mod a secondar option Example o command fo sendin an re- ceivin ar liste below. Multi-file transfers Usin th (batch secondar option mor tha on fil an ambiguou filename ma b transferred T sen files us th primar optio "S an th secondar optio "B (alon wit an othe secondar options) T receiv th file bein sent us th "R primar optio an th "B secondar option File ma no b name sinc filename ar sen b th sendin program bu dis driv ma b specifie (o els th file ar writte t th defaul drive). Backup option Ther i byt a th beginnin o th progra (106H tha wil creat backu fil i fil o th dis ha th sam nam a th fil bein receive i multi-fil transfe (se MODEM.SET) I thi byt i se t 0FFH backu fil wil b created I i i zer th fil o th dis wil b delete befor th ne fil i received I yo ar runnin CP/͠ an fil o th dis i designate R/ o SYS backu wil b create whethe th byt a 106 i se o not. B carefu - i yo ar runnin CP/ an th driv o whic yo ar receivin ha a R/ fil wit th sam nam create b CP/ 2 th R/ fil ca no b accesse (found changed erased etc. b CP/ 1 Yo wil therefor hav tw file wit th sam nam whe yo ar runnin CP/ 2 T fi thi problem us CP/ t chang th nam o th fil tha i no R/O The us CP/ t d wha yo wan wit th R/ file. Examples: Th sende enter SB B:*.CO t sen al th CO file o dis B Als specifie wa retur t termina mod whe done. Th receive enter R t receiv al th file bein sen o th defaul drive. Th sende enter th comman S ASM.CO *.HE B:M*. whic wil sen ASM.CO fro th defaul drive al th HE file fro th defaul drive an al th file startin wit "M fro th drive. Multifil transfer ma onl b don fro th menu I ma no b specifie whe th MODE progra i called I othe word A>MODE͠ SA *.CO wil resul i a INVALIĠ OPTIO erro message. Return to Menu - 'M' option When asked to select an option, 'M' returns to Menu. The MENU I th Mode progra i entere wit n option th Men i called Th Men give th choic o selectin th standar option a define b War Christense (T E R an S) Th Termina mod ha bee greatl expande a describe above Th "R an "S command mus b calle wit filenam o yo wil b require t ente th primar comman ( o R an th filenam agai (bu NO th secondar options) I yo wan multi-fil transfers the th "R optio doe no nee filename. REԠ - Yo ma als ente termina mod usin th 'RET command bu n dat wil b save sinc fil ma no b name wit 'RET' Us th 'RET comman t RE-ENTE Termina mod afte i ha firs bee entere wit th 'T option I thi i done yo wil stil b abl t sav th communication i yo wer doin s befor yo exitte th termina mode. WR - Th 'WRT comman mus b use afte leavin Termina mode Thi write th las buffe t dis an close th file Failur t us th 'WRT comman result i los o al dat an fil o lengt zero. DE̠ - Th 'DEL comman erase th mos recen fil accesse i Termina mode Usefu i yo decid afte communication tha yo don' wan t sav informatio jus gathered. CPM - The 'CPM' command reboots and returns to CP/M. XPҠ - Th 'XPR comman i toggl whic cause th men t b printe o no printed Initiall th men i o unles th progra i calle wit th "X optio (ie A>MODE ). DIҠ - Th 'DIR comman list th director o CP/͠ disk driv ma b specifie (ie DI B: o th defaul driv wil b listed Afte th director i listed th men wil no b printe whethe XP mod i o o off I XP mod i o an yo wis t se th menu hi return. LISTING OF COMMANDS AND OPTIONS Primary options S - send a CP/M file (must specify file/s) R - receive a CP/M file (must name file unless B sec opt used) T - terminal mode (specify file if memory save wanted) E - terminal mode with echo M - return to menu X - used only when program is called to initially toggle menu off Secondary options B - multi-file mode for sending and receiving files T - return to terminal mode after transfer (memory save off) R - view what is received in file transfer S - view what is being sent in file transfer V - view what is being sent or received in file transfer T - Terminal mode (used with remotely controlled computer) EXAMPLES (fn = filename, ft = filetype) Send another file S fn.ft Receiv fil o drive vie wha i bein received retur t termina mod RRT B:fn.ft Sen al CO files n message o console SBQ *.COM Send two files from two different drives SB A:fn1.ft1 B:fn2.ft2 Receive files being sent by above on drive A RB A: Termina mode sav communicatio i file (i termina mus typ CTRL- t star save i men mus typ "WRT t clos file.) T fn.ft COMPUTER TO COMPUTER TRANSFERS T us thi progra fo transfe o file betwee tw compu- ter tha eac ar runnin thi progra an ar directl connecte togethe b a RS-23 seria lin i i necessar t b careful i connectin them Eac computer' sen dat lin mus b connecte t th other receiv dat line. EXAMPLE: pins pins /----------\ RS-232 CABLE /----------\ | |2____________________________________3| | | Computer | | Computer | | # 1 |3____________________________________2| # 2 | | | | | | |7____________________________________7| | \----------/ \----------/  SUPRBIOS loader operation Th SUPERBIO make us o syste fil loade t brin th syste int memor o col boot Th loade i allowe t b maximu o C80 byte long I th standar implementation th loade look fo th fil CPM.SY o flopp driv (tha is tha driv whic repond t th physica lin Driv Selec ) I th fil i no present th loade wil respon wit a erro messag t th terminal Otherwise th loade wil loa th syste fil int memor startin a som buffe locatio (normall 2000H) Th loade the determine th loa addres o th CP/ syste an blockmove i t tha address Th loade als fill i tabl i th SUPERBIO whic contain ma o wher o th dis th fil CPM.SY i located Thi informatio i necessar s tha th SUPERBIO ca reloa th CC an BDO o war boot Tha i wh yo mus no chang densit o th syste dis i i i  floppy sinc disk o differen densit hav th CPM.SY fil i differen places an changin dis density makes a warm boot impossible. Th LDRGE progra i th equivalen t SYSGE i standar system I transfer th oute trac onl fro th sourc dis t th destination Afte runnin LDRGEN yo mus transfe valid CPM.SYS file to the disk for it to be bootable. Customizing the loader: Th loade i .CO fil whic execute a 100H I yo wis t boo of dis othe tha flopp drive yo mus integrat customize BIO fo th loader Th BIO i org' a 500Ƞ wit standar BIO jum table an mus suppor consol outpu an al dis function excep writ (fo th singl boo disk). Sinc th loade i .CO file yo ca debu i b runnin th loade a norma transien progra unde you debugger Whe th custo loade i debugged i ca b LDRGEN' ont dis b passing the filename as a command parameter to LDRGEN: LDRGEN B:CUSTMLDR.COM Th loade sourc i include fo you use Th loagica functio o th loade i findin fil o th defaul dis ca b use t suppor loadin o syste file fro boo volum t volatil syste volum (e.g memor disk) Modif th loade s tha afte th syste i loade an blockmoved th coldboo routin return t th loader The rea th syste fil fro th boo volum an writ the t th syste dis usin BDO calls. g' a 500Ƞ wit standar BIO jum table an mus suppor consol outpu an al dis function excep writ (fo th singl boo disk). Sinc th loade i .CO file yo ca debu i b runnin th loade a norma transien progra unde you debugger Whe th custo loade i debugged i ca b LDRGEN' ont dis b passing the file Welcome to the SUPERBIOS Thi i onl a introduction Se th followin file fo additional information: FORMAT.DOC for detailed information on the disk format. CPMINSTA.DOà fo installatio o th syste fo user wh already own CP/M. NEWSIZE.DOà t regenerat th syste fo differen memor size. INTRFACE.DOC for information on modifying the BIOS. Generating a new system disk: Assumin yo alread hav bootabl syste disk eithe b purchas o CP/ fro Advance Micr Digita o b followin th steps outlined in CPMINSTA.DOC- Us FORMAT.CO t forma blan dis i th desire forma (Standar eigh inc singl densit disk generall don' nee refomatting) Plac you syste dis i A an th destinatio disk in B:. Run LDRGEN from A to B. Us PIР t transfe th fil CPM.SY fro t B Fo optimu performance CPM.SY shoul b th firs fil yo writ  t an syste disk Thi i becaus th syste mus acces thi fil o eac war boo (control-C) an th acces i muc faste i th fil i o th outermos track o th dis (file ar writen to a new disk from the outer tracks in). .pa Operation of the SUPERBIOS: Th SUPERBIO behave i genera a an norma CP/ system However yo mus no chang densit o disk withou doin control-C Thi i becaus th SUPERBIO check onl onc afte each warm boot to see what density each disk is. I general yo ma chang syste disk a an tim provided: 1) The system disks are the same density. 2) CPM.SYS is the first file on each disk. I yo wis t chang densit o syste disk yo mus reboot the system (push the reset button and type control-C). Printer Selection: Th SUPERBIOӠ contain cod t driv bot th paralle printe interfac an th seria interfac a th CP/͠ lis device Th distributio versio ha th paralle printe a th default Th defaul printe ca b change b patchin th byt i CPM.SY wit DDT (byt 1829 - se t fo parallel fo serial). Th syste display th defaul printe o col boot Th printe ma b change a an tim t th alternat b changin th iobyt a locatio 3 STAԠ LST:=CRT wil selec th alternate printer, STAT LST:=TTY: restores the default. NOTICE: A shipped th SUPERBIO ca suppor eigh inc doubl side doubl densit drive o th firs tw drive an ) I th thir driv driv i als doubl side doubl density the yo canno ru fourt drive I th thir driv i singl side doubl density the yo ca ru fourt driv if it is also single sided. Thi limitatio come fro th fac tha ther i n roo i th BIOӠ fo th allocatio vecto necessar fo fou doubl side disks I yo nee t ru fou drives o whic mor ths tw ar doubl sided yo wil hav t chang th SUPERBIO Allocatio Vecto t th sam siz a vecto 0 an generat 61K CP/M by the procedure outlined in NEWSIZE.DOC. e o col boot Th printe ma b change a an tim t th alternat b changin th iobyt a locatio 3 STAԠ LST:=CRT wil selec th alternate printer, STAT LST:=TTY: restores the default. NOTICE: A shipped th SUPERBIO ca suppor eigh inc doubl side doubl densit drive o th firs tw drive an ) I th thir driv driv i als doubl side doubl density the yo canno ru fourt drive I th thir driv i singl side doubl density the yo ca ru fourt driv if it is also single sided. Thi limitatio come fro th fac tha ther i n roo i th BIOӠ fo th allocatio vecto necessar fo fou doubl side disks I yo nee SUPRERBIOS internal interface specifications Th SUPERBIO i modular tabl drive progra designe for easy expansion and modification. Th firs tw memor page o th SUPERBIOӠ perfor mappin fro logica unit t physica drivers Thi par o th program will not normally need to be changed. Th logica t physica devic assignmen tabl i a 100 relativ t th star o th BIOS I contain sixtee dis entries fou consol entries fou lis entries on reader an on punch tabl entr consist o tw bytes Th firs byt i th hig orde byt o th addres o th devic handler Th handle module alway star o pag boundary s thi byt i sufficien t specif th addres o al th routine i th handler Th secon byt i devic numbe withi th handler Fo example har dis formatte a tw logica drive woul b addresse b tw tabl entries bot wit th sam addres bu with two device numbers (0 and 1, usually). Thi mappin syste make i possibl t reconfigur th system without having to reassemble the BIOS. Drive module com i tw flavors characte i/ handler (console an lis devices an dis handlers Eac handle module starts on a page boundary with a jump table. Character handlers: The jump table is : table+0 jp poll console character in table+3 jp console character input table+6 jp console character output table+9 jp list character output table+0C jp list status table+0F eight character ASCII name for module Th routine receiv exactl th sam paramter a describe i th CP/͠ Alteratio Guide I addition eac routin receive th devic numbe i A Th routine wil retur t their caller whatever the normal code for CP/M 2 would be. .pa Disk Handlers: The jump table is : table+0 jp  home table+3 jp select disk table+6 jp set track table+9 jp set sector table+0C jp read sector table+0F jp write sector table+12H jp flush buffers Eac routin excep flus receive th norma parameter passe accordin t th CP/ Alteratio guide Th writ routin wil receiv th deblockin informatio i describe i th appendi o secto blocking/deblocking (Se als th cod fo rea an writ i th flopp modul o th SUPERBIOS) Th device number is passed in A. Selec dis receive tw addtiona paramters O th firs cal t selec give dis afte war boot bi o wil b set I th selec i successfu (know b th selec routin returnin nonzer valu i HL) th bi wil b reset an bi 7 of A will be reset until the next warm boot. Selec als receive paramete i B i zer o entr t selec i th las dis succesfull selecte wa i th sam modul a th ne dis bein selected Thi informatio ma b useful in determining buffer flushing strategies. Th flus entr poin i use b th logica dis selec handler Flus i calle o th currentl selecte dis wheneve dis i differen modul i selected Thi i sig tha an share buffer mus b flushed Flus shoul retur i i th flus wa successful nonzer i a erro occured I flush returns an error code, the new disk select will be denied. DMA address handling: Unde certai conditions th BDO wil issu selec dis cal t ne disk an expec th previou DM addres t remai i force Therefore th Se DM addres BIO cal simpl store th valu a fixe locatio (F an F relativ t th star o th BIOS) You rea an writ routine wil hav t ge th DM address from this location before each operation. .pa Interrupt handlers: A th moment th SUPERBIO doe no hav an interrupt- drive code However futur release wil us interrupt fo typeahead har dis controller an possibl othe use a well Th us o th Z8 alternat registe se i reserve fo syste us ONLY Thi wil enabl improve performanc i a interrupt- drive enviromen sinc contex switchin wil b堠 fast Therefore w recommen tha an modification yo mak t th cod d no us th alternat registers excep i you interrup handlers. Ver fe CP/ program us th alternat registe set I yo us on o thos tha does w sugges yo includ fla byt t indicat t you interrup handler tha they mus sav registers Thi wil b include i th nex releas o th SUPERBIOS. Th SUPERBIO disable interrupt whe th CP i waitin o a INTR o DR fro th FDC durin see an secto read/write Interrupt canno b enable durin th secto read/write bu th see ca b rewritte t b polle i yo nee th CPՠ t sampl interrupt durin th see period realtim cloc usin 6 H interrup wi los tim durin dis access bu H clock should be OK. Example SUPERBIOS module: Th fil RAMDISK.MA i include a a exampl o modula dis driver I show th us o th dis calls an ca b use as is. dlers. Ver fe CP/ program us th alternat registe set I yo us on o thos tha does w sugges yo includ fla byt t indicat t you interrup handler tha they mus sav registers Thi wil b include i th nex releas o th SUPERBIOS. Th SUPERBIO disable interrupt whe th CP i waitin o a INTR o DR fro th FDC durin see an secto read/write Interrupt canno b enable durin th secto read/write bu th see  SUPERBIOS disk formats Th SUPERBIO singl densit eigh inc forma i completel IB͠ standar 3740 Th disk shoul b readabl b an CP/ standar singl densit system Not tha th Advance Micr Digita forma progra fill al sector wit E5' i accordanc with standard practice. Som eigh inc singl densit disk fro othe system ma no b readabl a firs wit th SUPERBIOS Thi i becaus the hav od byte locate wher th doubl densit cod i suppose t be Th SUPERBIO interpret eithe 0 o E t b singl density anythin els (othe tha th SUPERBIOӠ doubl densit codes causin a error I yo ar unabl t rea supposedl standar singl densit disk tr runnin th SUPERBIOӠ forma progra wit th FORMAԠ SYSTE͠ TRACKӠ ONL option Thi wil fil th oute tw track wit E an no hur any of the data. Th SUPERBIO doubl densit forma fo eigh inc disk ha th firs trac o eac dis b singl density i accordanc wit IB͠ practice Al track o minifloppie ar doubl density Byt 7 o trac zero secto i cod byt (thi i th standar location) Ou code ar E fo singl density E fo singl side doubl density an E fo doubl side doubl density Ther i n doubl side singl densit format a ther ar n standard availabl fo suc disks. Doubl densit disk hav onl on reserve track Th sector ar 102 byte i length Eigh inc disk hav eigh sector pe track fiv inc disk hav four Th physica ske o th dis i thre fo eigh inch tw fo fiv inch Thes number wer chose t optimiz sequentia secto operation suc a progra loads sinc thes operation ar th mos sensityiv to the skew factor.  Hard Disk Superbios Documentation Update Thi fil i designe t explai som o th change i th superbio tha hav bee mad fo th har dis an t describ some of the new programs that have been added. SUPER BIOS Th superbio ha ha driver fo th Advance Digita HDC100 Har Dis controller interrup consol inpu an outpu an war boo fro pro instea o fro dis include i it Thes driver ca b selecte vi conditiona assembl switches whethe the ar include a al an wha typ o har dis drive t suppor i included. Ther ar als assembl switche fo th numbe o flopp drive an whethe th floppie ar th firs logica drive o not. Th har dis drive wil suppor mos an SA100 o ST50 interfac har dis i an combinatio a lon a yo don' tr t mi SA100 interfac wit ST506 A supplie th bio contain equates for the following disk drives: SEAGATE TECHNOLOGY ST503 ST506 TANDON MAGNETICS TM601S TM602S TM603S TM603SE TM501 TM502 TM503 SHUGART ASSOCIATES SA602 SA604 SA606 SA1002 SA1004 QUANTUM Q2010 Q2020 Q2030 Q2040 MINISCRIBE 4010 4020 other drives can be added without a lot of difficulty. A mentione abov th bio no include suppor fo interrup inpu and/o outpu o th consol port Thi ca b selecte fo eithe inpu o outpu o bot o neithe a desire by the user. Th war boo fro pro allow th dis i driv A: t b change t differen densitie o t disk withou a operatin syste a war boo time Thi i don b relocatin th CC fro pro t ra an reinitializin BDO instea o readin the i fro th disk Thi proces require cop o th CCР i relocatabl forma t b i th to 2.25 o th o boar boo prom. Contact the factory for implementation of this option. FMTHD & HDBADMPR FMTHĠ i th forma routin fo th HDC100 har dis controller. The format used is 16 512 byte sectors per track. HDBADMPҠ i progra whic wil ma ou on ba secto pe track Thi ca b use i th medi o you har dis driv ha defects in it. LDRGEN Thi i ne cop o th loade generato progra se u t handle the hard disk drive. LDRBDOS & LODRBIOS Thes ar ne copie o th loade bdo an loade bio modified for use with the hard disk. SBCBOOT Thi i ne cop o th secto boo modifie fo us with the Microsoft M80 assembler. SBCHBOOT This is the sector 0 boot routine for the hard disk. ementation of this option. FMTHD & HDBADMPR FMTHĠ i th forma routin fo th HDC100 har dis controller. The format used is 16 512 byte sectors per track. HDBADMPҠ i progra whic wil ma ou on ba secto pe track Thi ca b use i th medi o you har dis driv ha defects in it. LDRGEN Thi i ne cop o th loade generato progra se u t handle the hard disk drive. LDRBDOS & LODRBIOS Thes ar ne copie o th loade bdo an loa;--------------------------------------------------------------------------- ; ; SUPERBIOS implementation example - Memory disk ; ;-------------------------------------------------------------------------- nbanks equ 4 ;number of 16K banks available memory equ 16h ;SBC memory control port bnkslct equ 40h ;bank select for memory disk rambase equ 4000h ;bank address - 4000h recommended dirbuf equ 0F900h ;for standard system secbuf equ 0F980h ;use floppy deblocking buffer for two-stage transfer .z80 ; org at 0 code relative, control location at link time jp ramhome jp ramsel jp rsettrk jp rsetsec jp rsetdma jp ramread jp ramwrite ret nop nop ;no flush needed db 'RAMDISK ' ;module name for display in more advanced loader ramhome: ld C,0 rsettrk: ld A,C ld (ramtrk),A ret rsetsec: ld A,C ld (ramsec),A ret rsetdma: ld (ramdma),BC ret ramsel: ld HL,ramdph ret page 60 ; Disk tables for memory disk - see CP/M 2 Alteration Guide for details ramdph: dw 0,0,0,0 ;no sector translate dw dirbuf ;use dirbuf in floppy module dw ramdpb dw 0 ;no directory check dw ramalv ;allocation vector ramdpb: dw 128 ;128 sectors per track - each 16K bank is a one ;track db 3 ;BSH - use 1K blocks if <257K memory db 7 ;BLM db 0 ;EXM dw 16*banks-1 ;if using 1K blocks dw 63 ;64 directories should be enough db 0c0h ;two directory blocks db 0 dw 0 ;no directory check dw 0 ;no system tracks ramalv: 2*nbanks-1 ;for 1K blocks ramtrk: ds 1 ramsec: ds 1 ramdma: ds 2 page ;------------------------------------------------------------------------- ; ; The only actual i/o involved is blockmoves between the memory bank ; and the user's DMA area. If the DMA area is masked by the bank ; address, we must transfer through a secondary buffer. ; ;------------------------------------------------------------------------- ramread: ld C,0 ;read/write flag jr ramio ramwrite: ld C,0ffh ramio: ld HL,(ramdma) ld B,H ld A,11000000b and B ;get two high order bits of address dec A ;if bank addressed at 4000h jr nz,onetran ;DMA address is masked by memory bank ld A,C or A jr z,dblread ;must do write through secondary buffer ld DE,secbuf ld BC,128 ldir ;move from DMA to secondary buffer ld HL,secbuf ;make onetran think this is DMA address ld C,A ;read/write flag jr onetran dblread: ld HL,secbuf call onetran ;read from bank to secondary buffer ld DE,(ramdma) ld HL,secbuf ld BC,128 ldir ;move from secondary buffer to user DMA ret ;A set to 0 in onetran page onetran: call bankon ;turn on memory bank ld A,(ramsec) srl A ld DE,rambase rr E ;put low order bit of A (odd number of sectors) add A,D ;in E and base + sectors/2 in D ld D,A ld A,C ;readwrite flag ld BC,128 or A jr nz,dowrite ;write operation ex DE,HL ;set to read to user DMA dowrite: ldir call bankoff ;restore SBC memory xor A ret ;return with no errors bankon:  ;turn on 16K bank at 4000h ;can use A,B,DE ld A,00101101b ;turn off 4000h bank on SBC out (memory),A ld A,(ramtrk) ;each track is one 16K bank dec A ld B,A ld A,1 jr z,setbnk ;bank 0 shift: add A,A djnz shift ;A now has one bit set at position (ramtrk) setbnk: out (bnkslct),A ;for boards with one bit per bank ret bankoff: xor A out (bnkslct),A ;turn of memory board ld A,00101111b ;turn on 4000h bank of SBC memory ret end  BC,128 ldir ;move from secondary buffer to user DMA ret ;A set to 0 in onetran page onetran: call bankon ;turn on memory bank ld A,(ramsec) srl A ld DE,rambase rr E ;put low order bit of A (odd number of sectors) add A,D ;in E and base + sectors/2 in D ld D,A ld A,C ;readwrite flag ld BC,128 or A jr nz,dowrite ;write operation ex DE,HL ;set to read to user DMA dowrite: ldir call bankoff ;restore SBC memory xor A ret ;return with no errors bankon:  P<d Z80RELCOMHEXLST$$1SUBMACQNCopyright (c) 1983 by SLR Systems, Butler PA**CHRIST is the Answer**79䆊<9897 9;ҷؼ@"372+G/Oe&Hf܂+IeӂN15M5L;39ͦ)z-./01dM+Ȳ̳дԵضܷ)=ˢȲ̳дԵضܷ)L 2ʍ2w G 2] ,2\  2U c 2y 2 2 273@36@JJJJJAJwJLL0LGL_LmLqL16@8ʱȇڶ8ƷȲ 6ʳ6@@@Ȍ@!±ִܳ@7@@#6ʈ@:@ܳ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(:9ڲȴ:98<9ʹ7@9906ʳ6@1غ@#6ܼ@޶ڷܹ#677\( ҹܳ@$7'ҹܳ@ҹܳ@7'ز@'¶ڶ<:297:<R@8ʱNN<:2ܲ8ʱܲ@*޷@&7ΐR@!7Z@73@8@8ʱȍ"XP@798@8ʱȅ9Ȳ̆@10 ^d _ܭd̶DCt?x@D حޭt¶ܭd*@tͶ@T6P@enL;PtͶ@TpA`pp+TX/@|d̶d2]*S"A@TtͶ@tޭP d̶DA D6Q0tͶ@W.I0M(pf^0Ov >k> B<Þց?F3/pf^T=tͶہ­o0b1Tج?apdLحڑ7o?o}͇@l0xx@t7dF/F+ F/F+T)Lt7{ܭFBAAD6䛜F.\7B@)\h+}hlB¬?o0B qBqBqt PϪ-\`^|"HSB HqB®qBIqB[?F3'L[+Dج^1 +s?@݁sa)|d BP tAs Vh|d®k1B"amd_7BeL ʭ VT貑@BtPP|oĭoV<ƭt .gd.gdD.B B>k_VDKTDbXt!p{zdB+|dhVhd΁TDb-XB'<4BAbtAbC(pod+!D04@{0F/F+&&$$ ِDO|04njB} a"ZX+ه280ytݶ)t+P_TtB bqc@|dD++ptkہ*7BWC +^7M} TD0 +#@+@=t@:thέo&+t7@  ot'P p|d)tPBmt/|Z d0or/" F. 7BnO+|dhd/D鬐/"!"lX?NhVGN/D+tDt+t2_+F+lF~0 B謻ۭ+|jZlF+Bh *FFBi+oӹV9ۭ+|jZo@$PzDFTF@D鬐+j YFF+|_ ĵFc+.b#PPב/zF/׼T˶PzT?0|d"j|d" B̶?oc+F?P}DPc+F6k?F3|V}=0T=Vk$Dج?p5P 2PBjPɢ0|ۭ=oP:\r `fL 0|ۭ=)PP;04k OZ ]\ 0b|*V}mGۭdVc+)p|dԶlDojۭtl |PTc+?5P@F?P=ZF?`)_$xF?7,V ,6b`F?9X `0F?^ 7ش19*6ʳ6@а7@8: D@P所~\SC^ uLU]EYaNTqPa"XwrG@.0R1!P!TBvpMpgrBrKnrtQtv~+g~ +~+ H YUn9t+z`Nlv &AςI#vvvx6v ᚢ$ ᡢfᚢᚢhᚢ%|ĐKMᚢhÙᚢ&Ô$`S#kf|&hoᙦ(ᗣ0䦇ږÙtۚ᱔R"5ᚢ"ᚢᾚh "LH  Hu*@gL""L{A#c|櫈`t QTkFV)PTkV\tԶc <䐳PPPPPTaV`ˀH<++B( ( HHۥ!Pĵ( ( qcBp?dD"Tkخ0T6n\x:勄/F+B" }F@/F+H `خ0h {T6FFPVVFV FF/F+?F[6t@BGok+PPP9VVV q& thb|d'o BHOTȶ0F p8)z)P2_Ɏ ~4"e8+@D )I$l F8108 Dȶ'@''Bʶ੫|dʶDH2& %۩t @溪 0Э"@r"( @ s|!dJTɶ>id溪ۭ&( o+z>P>>̓0F'F#F⫈a2胄D묐jDD PBV _ʭdͶDdB@/  &'FL&k36PzPzPO0|0|03l׉0f|4l B)c+ &$@nE FD?Fە0644@4@6|0|*$ &?Q(@PVoP$ׇ&tە&ۉ­` .nד<*`F?70<0<- ޑ`02270,? P*@( n"& 9Q F?o0F_},` 80F?77F?q`F?*ד`0pF?:@m 40f p2Pbs`O [R,`Q0NF?@KO n`30B_F?p{P4G?`P00F?8>0?8`p4P6P7`R X)P(=PS, (UZ\h_F?5=P;P@F?;y0"6)F?3P;Q yK{`0?7PP; 5T)?7P P@F?50>F?7;09F?P3P P03S 0*0?8Pj=P"P4P)P:P 06F?pP_-P *`F?@`0F?q`F?*ד7爻V)FW?pqfPnkz4 *`"8J6` c4PTG?9PO: /d*!`F?P̋F?71.m֋3PaЋ [` ;0?Pp;PP ~30;0F?0+F?8O30F? ]07`b 8`F?7P0`XΑ\h_pPY7`0 N$`0F?;g J m]`0P70?:P;P`F?P3@P0F?ZP>0F?3P  0DlRN pJ \ P 502T) `ґ\h_0F?k0?P7P:PP0F?P;@F?pdCP8Á mo ]` E E -!   *# ڀ%;01F?HP/0.F?23|;}}`d <R$`F?7"P : &/`L0F?q`F?*ד'0x ׀)40sK VǍ\)L `M ` {0F?P[` ;0RaF?7 36DجTC @de+Bet_ )F?:@"t6wJ6`"6uJ6Ս )F?5P:)"6mJ6eoe 9Pg:PP =P> "x64}`&- F? F?PP7Y)x4ύe)ܵʵ;β:ܸȱܻ̳ʱܵ7:49Աι;ʲ9޳;8=̳Аɢ1B?@BM: Z/a8PPP_ tkX/`B.aGBH<,A:d'dD.Balq&/"Un_PP0_ |d` `'d`"඀XtA>.D.JPPP_ "`&)"`,)xDDɢ1+.pD-lX|d+͇Ptk"íBŭaPX_ "&)",)xíDdkۡ-<-D*a+̓70 dp 2`_*dƨL1#6ڲ@99'زBb:溪B'B8$ ۭB?owXBrۭTD@2l DȶDɶ1_B'?h@BGk+PPP!ۭ׍BJ\BDGܓֲ@#6+o+ۭ+(hk ˄Dۭ+*lD梏0T!D )D⛨>0n<*t1@B.a BҮtݶz梪"&)",)xĭ_D.BƮT)p@RT*HHXBp?JJ**B>'L#@)B+ۭ+|moT)Tꬁ\&d Bʶ2="|mdO>0T)pׄÕ+ۭ|moT"k 묁X6꬀0!!V MR<EL( ## tWەFl@)<gPmFg+lF4|dD J(`_,B ?o  +t < J_+_]+dBB@?o4]+D٬,2F42 ddݶRx D DJT^jtzG4& 4+T ꛭlF[r曔i\ +\ ΚSpTb\|T tf[r80曔|rp%& c+.((Pd̶/|0kpme+rљPTb\|0S4{+f8曔lǧ c+@RLj @ &0R\lo Ji\RΚSpTb\|ftf4Xh꛳j:pTb\|me+rљ$lHF[r@l J PTb\|rB>fLT@ l m+:lP>fLT@ މ4l މ4lpi\iSM|r "p`r曔 FDCc+nclFtf0+0\@RPP`pTb\0 p46<aM+**,$  p+RMNk4 }B fLT曔i\P|r |0{R@|rB4>,fLT 曔i\ `\tdXr TXr jmofLT⛶T|曔YjmM"X r+Tљ@|a+fztffTb\| a+tf曔0B26kpPp0MP P0Trt+Ml {+|rΚp`R@Ta+@\@|rb2曔TΚSiM{+SRS+f@R@|r>+0xS : 曔RaM|r6aMRS+i\dT T$ T1։ T׻F* ,ĵ&ꋀ<|r|0{ |0vBa,|}P}P $& 'ܑF0 "a,0Ba,|0PPP} 7oa c+ː[+Dج+cc+TD&&_FFaV梖Bc+&2Vm &eΕ@PN &DD݅|0PPPPwPuV .MtVPzҕP|$PPP0PoP3p PP/@l@iPlFX_F/F+BY@F/F+VV9V6ȶەD7$tVdVPD|0ATج|cDجPaZvۥ!׹F9Fthb|d+j BHOTD 2?dX#"@?oyͿ`c DL?F3ZP?o F@0 V 4$@Tˈ2/F+R&Px*2/F+2Px ?0" DȶlTD"F=gdׄD'Zd(Z" $F'1P5od|s A_@l")"FX & }1?o@ܣV?o $&'%1 5וV~$$|Z bXT[2,B@/4L` P}z4Pzz<@v /F N@|49 /F PV 47/F Py0`0`p۷0Z懖۷F۷P$$|p ۷p$tc & `\p$\p$>>\͇p$ `"xP &" P &"NP &"{P &c`$2p~)zؑ`ؓB ۃ@tج4ht?o}͇P r`0͇Dn:dVc+_zD`Ba00Z"^Hdad"`]0,d"` c"^"W^P*"^"` ѐlf10*"^"W^ W(P)P"^ꭝB`,2'B"`?`cv W)P(f d"`dVc+ۣE`?)@BdlT`x`Ba?͇  E`דt@Ta]Pz@ ξ^Da+d"|pu}a"\|pkTܬq+a+XbP^@7Hꀻ:<`Bଈq+a$@T^D^q+dw+o dݬ }+#+)d_+0BB\|X`a|Xb1րlXblHpPpb o䫕V!Aan&&&s ˑ&AAoz<`@)`HPz|؇b`{oy+)`w+# w+0t_@m+26eד>Eד>Uד)"P22Ro "5)`2._dftxvxT`l@Xn*@"dVc+0%" ZlPzۭc+& @ & @tAجufs+0͇`s_ T`Qdp.l- P>P!M@(n0a?CodxdL  1_h$JhÃXr(`++mlۓ ZdhV_    +WlW RtV̀?o}N͇tBպ?x$"պͤ@lFWWl)BJBV?oPnlFlFlBպˉ r4@#pVX|aTج |*F_` }lˑ}?@7Dج ?@1lDج"Hdknh>kd_F@o׈`)ˈ2/F+ _FT  kd(@i\Vo&&Pf b_4_bt¶!\ t@taPtT\ t@uta0r.#p++ Fc+0\ a 0gB?o:TfۭoDCd¶L7oP+VOvʭV>k`D n"D*TD2/F+YPR& ېDȶDɶ 4 4 47oTDFTD>k`v$QpX͇PwdVc+10uTt`tL?P {TA`F/F+מLדحPb rޭ {ܭoeBr#TD?oxxd"x F"Ot)׹F9tudVc+ct{Vzd1Lηdaaۥd梖B֬c+F?@ˈX]P@V?F@x24ЁuBP}P{S0qt b 0|B_0`l䛪vDs8 d檝@͇P0}pכ >k0F_7Be ʭFʭ7BX0t[+DجvaL+G ,QBj/PPPXd_X/"dVF?1`$FPP$ 0|$ ~Vn>l6.IP$ 0|$ ~Vc+_301Hctclۓߓctc듐!DΆ+D+0 ˆ7B<;B"!o䛝F?xPyːەD7$:l~FJlFlF*&&V$_ 0)׹F9"VV_s#9Bx Kz B֬c+Bۥd۬"G_FFۡdn 70ꛨZꛅV &+D)H<ׅXGx!|F?xːەD7$:lFlFlF*&&0)׹F9"VV_s#v9:"*X?ra(PtaM !TD"F=g T묈&2!׎0V}TSz$ }_ 6=Ng=׹V9V+0F/F+ޭFF/F+ˉ&+_V.~DFmhF/F+VV9V/F+&Xn7$6 P@vBح򬕼F@L ǐDحڕtVP|xd7?x|DAAA"AAۭ+6 6 6F9FۭحDN$p{L5h0w$1Œ<%𬐅D_٢oyͿppp!pp ` B󬞇B+p*xt\Đ:4Px@F/F+?osV۷@F?F[V@l0_j(&h&|۷0a|0 ]UsIsj|G &? APF (&|p   F/F+ 9(&t&|O  PT,2@Ʈ$ ~)< c vvlsdF/F+ۭo4Đ׌H 汣`4l{A+d t@ t\P⛕p ۭo0׌<V2ۭo10P $P|@ &0BBd7ޭPP/F+F=g<""XB7(&h& T>k)(&_T5(&|%|d¶ dP|x {+d{ ၥ` $( 2 6:B* . 1%pPzככW(&|    (&v+ | j $ B_PkÞh/F+B|A &|o _.$:  |0Ȯj嗢ή PjW(&|  W&|dϘ&"@FF/F+ _z#c(&PtP  d?&  @so Zj  >(&(&(&F/F+8VV Í͇:P@o++"6ʳ6@7::H0c {+dB+"!F۩V|c+F?o +_++0ph|ߛo߇oDĒBĒ-D|U!d"dX'0xBB/F+F=g0|o'?o+F B ?xF 20@||AP|?F@bl |/F+ |{$o(lO lt|Ʈ"jۭήo2@BƮlˈ 2'?͇lF?V")FbbVbڑDtۉBc_F.T+uT>kbէToډuϧۥ!bէTu BỨ$99PR:2\9޳":Ĺ6:&ķع@":ʱ|$|\@ &ऩķ6"®Xt@"1zdd+lB+|d d( 4P(0hT@}lF.D(?͇F/F+2BhFۭ+ )x &|$ ~۩+4F&ĵR<9V1։lX9V09޹̲ܱ("®"Xt@L"t"BhF.D740 d"򛸠FF/F+/_F+PTtmmNV|Z@ & uˍ۩+F.|0gC|$.0Lt'L0Ft_)/ȤlFZlF)te)BE)BG KlF/aofrBp#_Bƨ'tXPBk#lBj'l\4bqtXP)$:@ܼ@ʼB)BhhV ۩+ᣨ 29@@&7TD8@_PPO}d|$PPP̷)xd$0| X/溪 >4B)PRXPB歩t2PHT>kH?z梪,o4ή2=gdg,gήX)0|dkí4" n)BBp?dƨ*odtj*溪=lۑ PZ PcPP aہB[!_aBj M~ƨjf|0>kۭʮۥƮ|}|Aué0tT>kd溪=ή t P 2rۭҮP ۭҮ*ᆩ"ҹ6BZ}d?-אƮXZ-"a?o}i*F@:(tPOOOa"Ӻ)%7#1æ9Š9æ¼%7%6àũ8ç:';"ʱ(pogpfgpfoocetqtgrvktrktre7T>kH?z梪,o4ή2=gdg,gήX)0|dkí4" n)BBp?dƨ*odtj*溪=lۑ PZ PcPP aہB[!_aBj M~ƨjf|0>kۭʮۥƮ|}|Aué0tT>kd溪=ή t P 2rۭҮP ۭҮ*ᆩ"ҹ6BZ}d?-אƮXZ-"a?o}i*F@:? +w#2h2j:\?2!6":h!">2\!ƀ_*V#"VO: >J! ~ ! ~Gb# QsPYʩ! M*T#"T*\#"\*!"#+wyŽxŽbk6V  V###F#~#_ »:d)=NyxyOxyx! :f/*T#"T*\"{|^!"}*{:2GH}o|gW*{"{"y!v:yl!_p#}p#=„p|<^>2DMo&)))) ~!ʳ!:¼##>."*y+"y|:=’Ì*{}<:2> "*}3!!K*}3!*Zͼ!*Vͻ!*\ͻ!:y*Tͻ!!*Xͼ!:¦*i#*V{ozgͻ!>" :_:_*wbV*m|:GW7_%:_: :_*gaDM~_)# x%*g#}o|g"X:dO) M"X~# Vɴ|g}o a0O0ڄ:҄0AOx2!2Ú!;6N#F*e}& /oa*Z"Z2>2>DM<!6 `i"!~"#> "͟ͻ>K_1>Q{_ F F*!"#+wyŽxŽbk6V  V###F#~#_ »:d)=NyxyOxyx! :f/*T#"T*\"{|^!"}*{:2GH}o|gW*{"{"y!v:yl!_p#}p#=„p|<^>2DMo&)))) ~!ʳ!:¼##>."*y+"y|:=’Ì*{}<:2*+"S" " " " go"Q"`2 2!2!2X2Z2]2^2c2_2\2W!*" " " " "=";!" " " " 2 2 !" ?No Start Address?Loading Error?Nothing Loaded?Out of memory?Illegal Polish Exp:!‡!!!2!!!2*S! ~ 4!>2 2Y:c2c ,/MEG@RSUXYE{ O :Ù&O†2WHO2WG:c2c:'>`͇Ax¹'"U _2:f Ğ2U!c~w:f ~w:f 2Yæ2Y*`|##yȷ#jC~@#I" #ͬ*`|#*U~ !:Y:c~ G@x k o Link-80 3.44 09-Dec-81 Copyright (c) 1981 Microsoft ?Command Error~P#~#  `{ +!~G #~ ex+#<~: /͔>*P d> P:e!fo>g6 7ʌʌ  y:+y#P2\2f g !  :\GO: " " " " * * " ";* * BK* * "=2 G<2 z6#z: O4ͅ {Ҏ!y yBKO!; s#r! s#r! s#rͅ ڬ! s#r!; s#ry ! ~#fo! ѵ! }_|W>2 * * <* * : <ͅ P* * W{_* #" " "=:WGO0ڗ xڗ)))ҖʌҖ)o>gdy +%Overlaying areaDataProgramÔ!! ~#fo!ͅ ͅ ͅ &}< = yy7yM7>,>#ͅ !M> _!h >?P~#P!yk!:!ʆ!; Not Found> P> P>2 g 28: _<2 !~g ! w#! wO |!y:!(͔*QDMÙ&[Begin execution]:Z:X* * ͅ ~`~¨@w+++o>GO ~+t>ʊ6 #=ƒ* ! ͮ 2X * ~O_+++y++:XK͔:c2c *Q>[P"N!C \* s#r!I    \! ~# != = = \* ͅ = *ͅ = s#r"N2 * * ͅ ʐ ʅ 2 M\: z x/Gy/O~w#~wM M" z _z! ^#V   $ 2 = ] m `i ^+V! 4* M ! 4Ð ! 5 PY\  s #r lg   # |/g}/o   DM!>= ))K K z zi  BK}o|g҄ : ʫ ͅ ҫ | >]P͔: : $>2*Q"!o&'  d   >0G /}o|g x0   > xPH>G~#' j~@+^+V$MEMRY$$PROG$COMNM*QA!Hw#] j{ ~@{ +^+V"Q! 2A! ?Start symbol - - undefinedg  ~#³ ͞ REL7*`}2X:c` j: j͔ p @p ͔`p p p * } , >wk  :`? !K * !b  Undefined Global(s) Bytes Free 2bP  ~O~>-ʑ > >/P+^+V+~P ™ /PN~ ʼ !ÿ "~ N+^+V>>PN:b?2b̔>wt :bȯ2bk [ M  ~++GOŸ& H+D ; & yE >  * [ S } 7~k ~~r <</_* Å |}! 6S#6Y#6M<$>* * ͅ ~O~@ +^+V > h%+~h% > h%= >~ <</O ß ͑&%|}G[h%> h%> h%:WG)0P) 60P3|L}U[P0:͔! ~#foN"N"N>>PÔRQUESTͬæ* : * ͅ ~_~@+++~#* BK" ö+++ö2!2 2 2 : go" " " 2X" <2 : * * * * *=͝QiEZͿE! ~#foBK#: =ʝ: ”* |ʊҔ}Ҕ͝p#: ”* |ʲҔ·}ҔÔ: =: Uw+p+q+p+q#Bi++s" ͇:7>[?@2g ԇx " h 5)> F6 #=>x2f y.̇p xanbʃ!p ~ ƒ6R#6E#6Ly[ҥ0ڥAҡ:ҥÊ[ʡ]ʡ@ʡ\ʡ^ʡ_ʡOb: : 2 BK|A~_q#Vp\AU: =>@w+r+s+@1: 2 r+sA: =* >jV/o/g ڮA~@w:]2^s+++~ s2^q+p:^O!;>2 }|!; s#rͅ y A!>/P͔A~W+++~P+%2nd COMMON Larger /*;" |2 * ͅ A> j~@wA7U: >8: =->G: =7>@w@w+w++1: 2 : : =r+sA!HIF5#wj~+ܾU6+6++r+sA*K:J2 fU: ;: =>@w+6++r+sA:!A>.2!2P* !J͞!g2!+}2_! w#!ڐ ‚! \" " : :Z!ګ!  w#! ¸+w2!͞A!!?/D illegal with common runtime?No code can be loaded before program withcommon runtime not found, please create header file?End of file on common runtime header!aǗzʣ̈́"Qb! ^#V! ͪ!;ͪyک: * * ͅ * " * '* * * BK* " ͅ " " ";" " ͅ 7* * * ͅ ]!* * * BK* * * * * " * * BK* * " " " "; ~w#~wPYb>̈́BKj~@: ~@w+~_q+U: =>Cw+p+q+r+sA! ͔A%Mult. Def. Global ~@*`+"`PYb>̈́BKůj~+nN+F@‡: ›:B(b: =›zAA;|A: ›r#sA: ›|A\zA#U: =ʯ>Bw+r+s+r+sA*`#"`!7~#46+wxG ɯ2 7Y!HYH!Hw74#6 _Gw#;!T"7O<2 XP̊wwO!9 N#F 2[: ʚ2[AC( r>-: " *=>2 * ͅ A*=>j+^+V\"?Ab: =#<2 =A: A*= APY7* K" !*="=* !" }2 <2 A:[* * |G}ʼ~O©H©A+++¨+—~ y/O oHOx_Ow#2 +w+w+w+ w+w+" 7ɩ))'):B($: ̈́: r2 * * DM* " *= "=* BK" " " " * " Ͷ'* |‡}ʠ~_|!^#V* " (M\~#+>>><2Z=O! $! ^#V0y=Uy?\ͅ ?\|y! i! us#rx^#V͞! p#”* ! N#F#~#fo! ^#V  ! ~#foͅ H! {_{_~H! ^q#Vp! ~s#_~rW}&: $#qͅ {_! 6)`i{ڠ! #Yš* * 6* " * * " ͞* ͅ ҙ" ! yڬ! ^#V ڻ F#fh! ^#V ^#Vy! ^#V^#V! s#r Gyx! @s#r#1xS|W}_x2 * 2 yoxg* " *="=*?PYͅ ڙ"?: ʹ=¯* !" * * ͅ үï͝*={OzG* * DM7xw#  +x~+ xw+ : 7={O>: 7J?Intersecting wO* ͅ <26: ?Oʣ: Jͅ Jͅ J!M>,P*6&0M^#Vy!HF#~#P>(P>)P: " Start = External Public = %*"!2Z!:Z?!͙!͙! y-!* * ͅ #* " ͅ |!*Sͅ "yb!*Sͅ "ͅ ڵ!*Sͅ ڮ!!!ù!!!!!!!2 YxbelowaboveOrigin loader memory, move anyway(Y or N)?ͅ 0"ͅ D" "!ͅ D"yS": W"*Sʀ"a"Oͅ €"y*S€"! ͅ ҇"!9;;;;;;ͅ "ͅ ڣ"z"&'7"ڿ"""ͅ #ͅ #"z"7* ";* "=* *;)##+#KP*;";!* BK*;* *=l#ʮ#l#O* * " * *=BK* *="=#PY* " * " Ø#* *=#BK* * " * * " " *=" *;" ! 8$~R#~E#~L4$:c)$7$w+)$COMHEX`$  <%2 : $}$* * ͅ $!c~ʌ$ ~$:\ʲ$: µ$*Q\" " &yO: &w&%*Q|$ͅ $%ͅ $ͅ $.%>%7Ԓ%R%: %yO%>%R%: Ă% <%>h%*Q}h%|h%سȯh%zG%%z~#h%\%!: _w{<%2  %%"%yO#"%!%\%.%fh%¹%! ~+ x :_*Q:_*Q\!%?Can't save object file{{ _zW;&> A&{ H&O>:h%y Y~# c&+&>:h%G*Q >>h%!*'͞'!0'͞'!3'͞'!9'͞'##²&##͞'##¿&#͞'!z'͞'!'͞'* "'* "'* "'* "'* "'* "'&'m&'͓','V'G'V'l'|'V'l'|'V'l'|'!' N#F#^#V#~#fo|} +x~+ q'xw# |'xw# Ó'~#fo&'q#p:B(* ͅ ~'M(:J2A(*;" 2 U6+:A(wAMz(2A(7(:B((*;" :A(2B(*;r#s+:A(i(*;͢(" 2A(2B(!* p# P(!HN#*~# ^(Ar#s *){ʅ({ƀ_҅(zʞ()Å(ͣ) *)!.*ʹ)!.*V#^(((!((ʹ)(z(!.*ʹ)(ͣ)z{7. *z w#)0:ww:*!;) )+ )!1)?Segment , file not foundcan't create fileread errorDisk is full)!@))!O))ͣ)!a))ͣ)!l).***‹)*—).**o:~W!{> " OC > S>O:31!2|}N#Fx2CN#FC$#^#V^#VS#~2#~2<2###~2#^#VSN#FCC*KB0KC:( [0!'}#"* (,*#"+))[R#}! !!Ax͎qput+[[R8 utx7?R#|(/ sr +utwwNFqpnf^:(#~W#:G)[7?K R0! !;NFx(ENF C$7?KnfB8C[0MD!' {:m!;!NFnfB#>,(0W}_nfRut;RDM!A76! [36:G6!w0 ͖!2͖ !͗>O3F#Nů  SYS: Which .SYS file to load 0 = CPM 1 = OSLOAD ? SelectReadFile not found error: file *+":*+"/:*+"^:*+":!":"5:"d:":!":"7:"f:"::8*9:8=o&))8  ^#V!q;p+q!r;6>!r;2*r;&;) p;3>L ~ÒÃG3x(OxAG:xG~ > 2v:nO y~ 8 q!*z~(ͭ8͏ͷ:q2t>2>2yKc> 2v> :yG /_~(!` *k:t{  _!c(  :v= L{((ZZ:nhZ:thZ:xhZZ>2v ~ ( w:q2rF8 <2ty2x:qW:j*mKoB(7:rGz?"|*m"o:qG2rxG![k2jG!> z{2n2xw<2q*k!` "kͱ"k: (8 ~Zd>w(>>w~Can't recognize density of disk in$Read$Write$Seek$ error on track $ sector $ side $ drive $ $!\6͂ !!y;6͂6 :y;- !Ͱ ͭ :s;:| :\:y;HZ !:]A<2\O>n !*y;&\ 6 ì !y;6:s;.¨ ͭ͂ڨ :y; ڟ !Ͱ ͭÌ ! :y;<2y;O!\ :s;w:s;0O> :s;02s;> :s;AO> :s;A 2s;>>!"z;͆ :s;<:s;]:s; HҀ :s;S¸ !96ͭ} :s;P !96 "9} :s;D !96 "9} :s;L "8} :s;M q!*z~(ͭ8͏ͷ:q2t>2>2yKc> 2v> :yG /_~(!` *k:t{  _!c(  :v= L{((ZZ:nhZ:thZ:xhZZ>2v ~ ( w:q2rF8 <2ty2x:qW:j*mKoB(7:rGz?"|*m"o:qG2rxG![k2jG!> z{2n2xw<2q*k!` "kͱ"k: (8 ~Zd>w(>>w~Ca1S!M:] 7\-<72| 2\(ѷ G!!m2 wH(F !͎2:hw!͎2:w:( ! GHʹF !͎2::%:͵G!͎2:̀G22 z2~ !2:2 !z2~ :2 ! z2~  !ͨ>  22 >2 !:0:2 >2 !L:2 >2 !a !ͨ>>  (: : ! >  :>2 ͨ w(!Gõ! { > zG2 >'> '(K!gC9 >'> '(# >'> '( !S ! z> '>'Syf2> 2~  >'> '(K!5C >'> '(# >'> '( !S ! z>0'S'y:''''(: G: Q: G: fͨ! { > z G0ڎ4Ҏ> ! O ! O( ! (z(!Gì>= __> >  ~#!Z2i!] LDRGEN 2.5 Can'nt open file: Read loader from Hard or Floppy drive (H,F) : Write loader to Hard or Floppy drive (H,F) : Physical drive no. of loader source (0-3) : Physical drive no. of loader destination (0-3) : Write loader to cartriage or fixed (C,F) : Read loader from cartrige or fixed (C,F) : Drive Not Ready : Disk Write Protected : Cannot Read Track 000Cannot Write Track 000Cannot Read Track 1 1=1O+1 0x+~10:@*@~<1=11O+ck 000Cannot Write Track 000Cannot Read Tra2> 2~  >'> '(K!5C >'> '(# >'> '( !S ! z>0'S'y:''''(: G: Q: G: fͨ! { > z G0ڎ4Ҏ> ! O ! O( ! (z(!Gì>= _ !  GMAC"'@!+@=~vO#~ Q w#6 #wD̈́K>2<2@2>2-=2<2<2=2<2?2=!= w#—<2(=2.=2/=2=> 2<:@2<:@2*=>;23=<22=!"4=+"@+"6=*'@!!62[?21=2+=29=2?<2)=?!H="F= ~# R*4=#"4=!"6=:2==23=!9=>2@2@͖ CCl CC0Cw#C!H= ʎ ~w# Žw:9==28=͖q:,=ʨNЯ2,=4OMگ!F> 2H=J> J7ò- !"C=20==2?*="=:H=*>$2H=$2E=U :ʋ:E=$:==$U !=~4#>$Nwy#*F=+~# ʿ+U ~#~"RR *F=+"F=:(=k+s -"x-ʯ7D-"F=+ÿ:(=ʹ1 -"C=j # :µ@ U 6 :(= ʒ8 :(=l`k#~! _^#V#N1! ; !H="F=*C=|U :(=lÍ'!==Nwy#3!>">!> q#K6 U l;l:<—:>VʋMʋDʋX2[?~+ACDEMNOPQRUVX!>~ p:>2>%No END statement:=.ʊ$ʒ[YTE3ALLSALL1Cj?CF1M/MA?MCMP2NC2NZOMMONOND1PQ PrPDsPDR2PE*PIrPIsPIRj/PL2POSEG1Z'AAj'AA ADBC"CR CXR ECEFB"EFLEFMEFSEFWIiISJNZSSEGWIiILSE ND NDC NDIF NDM NTRY QUQXjXXXITMXTXTERNALXTRN LOBALkvALTvLTF2FB9FDIFFEFF:FIDN3FNBFTaM)NQNRNC8NCLUDErNDsNDRrNIsNIR"NRNXF1F2FDEFFNDEFRPRPC1C1M2MP2NC2NZ1PQP2PE2POQR1ZQD2:DA DAXrDDsDDRrDIsDIR3*HLDOCALJXI8ACLIBACRO:@OVBVIAMErDEGOPjOPQRRARG*RIsTDRsTIR*UTR UTsUTDsUTIAGECHLOPR"OP UBLICUSHS$USHALARC!EPTZ&ESETR(ETsMETIsEETN IMY*LjLALCZ,LCkLCAroLDMNCNZPPEPOY.RjRARCZ0RCkRCArgRD"STR2STZBB*BIR4BCj7CFZ6ET"ET3"HLD0IMZ8LAPHLZ:RAZUB#UBTTL*UI$ITLECHGR@ORRA*RITHL680807Z80%COMMENT&CREF'DEPHASE(LALL;LFCOND)LIST*PASS2+PHASE,PRINTX-RADIX5REQUEST.SALL(('()-((5*5,,))))))))h6f6(5C,~&+*A4**i7+9M+ +[9;7+U+\+!++))*+++,))d+h+m+'-@  F"  (85vCd} *F=~#"F= oA 0 : 7}ɷ[ a { } 6 *F=+"F=*F=#"F= aS 6 != q#a !=6#ͱ  2<a w# yʟ ͱ x җ x Gy2=xͱ җ × $.@?_// // &:? ͱ & 6 ͱ 7 G!r?:=' " 2=~!?  "p?^#V!g? w#: !=~K 6!=N zʾ ^#V#^#V#~=y =G‹ #n #~=¸ #"?=#~+?j?!g?w#Ÿ w#s#rP P +>Ð <*A=~*@####~7#_"@:=$.?_ ;O$ "?=͓ *n?z :m?O s#rw# & =7 >wG#w"?=#w#w#w###w#I "A=####p*@͍ ;*?=|>!x F?Symbol table full |}:<:@:-=*?=~@ڹ >>vL!=F#~vL *p?  G~8#~ +~w#~w#s#r#*=s#r~@w:<# ~a~a#^#V#͍ R*=xD{a#za:> *?=# :0=a*?=~*?=#~wxGõ>LyL@ Z6LZ@LZRLZRLyZOLyym-LZRO*ZRv̝LZR*ZOLyZ@*m-L6 ,ɷÝKN͝Ým-zf<ĝ{Y! ^#N! ^#VZԝBxL{?LZ8ĝBLNܝc:<Ü̓ :>H:<0:<Ü>L:< L>2<:<<=<2<ů2< 6 (-2LKҫ:<ԝ Om-ͷyHLyL:>G¯BxGj*=*=͍ j##T9zC<xxm-ë*ů2< 6 (2L{Nԝ:<ĝc:<=ĝNԝc>LcnAÜNԝcn [:<ĝ>Lĝ;{:<=ĝ>L@ÜNܝ*e R:<fĝ[NܝcH:<(:<ĝ>LcNܝe ĝ>LcNܝ:< ĝ:<ĝ>LZԝO*k7:<(>Lں{:<̝ :<Lcĝ>L[/k:<̝"(:< :<*cy  :<Ü:<Ü>%{ :L/:<L>FL;{N*c:<ʴ ĝ:<ĝ>LyBONĝe ̝c:<ĝ5N*c:<ʴ(:<ĝ â:<Nܝe ̝c:<̝Gxĝ> Ü:<ĝ :<[4:<:<ʙԝ c:<ĝÜ([:>:> c:<̝ ڱ:LyC͜(2>2>:<(>"LÒ:<ĝ>2LÒ:< :< ĝ:< `ƝL͜ĝc:<ĝ>L2*L>LyK͜c:<} :<^:<;͜{:<  s:<񇇇@OÜ :<ĝ>LGÜ:<( c`ƝLp:<͜(@{ĝ>:L[ĝ:< Ü;c>6LKB(@{(YPy:<O:<ĝ>LyWÜ!>?AFwx# 3:<G:<7b*=#"='h'*>'>͍ +*>:@`))0) ‘0Ž:>:>6!6"6'6*#">ßG:>@2>:2>!>~ͯ~@ô~ʹ#~?Gxʚ#~72>>A;hS#^#V"=G̓2>#^#V">>C1#^#V+~z><2>= G>>B#~Š:>@>§>2>>A;''2>{2>!>"?=ͩ:<*=##"=:>G:>@x̓:>G̓*>#">C'B'x&x746!96**>##~#fo6"6'##">̓xP:>@xʈ:C+B+x*=++*>#:=G~w#s#r#*=s#rC'B'b:>2>:>x̓³z ĩ2>*>#~2>*>#>͍ +*>:@)0) 0">DExx0:(:*=G:)=G:(=N:/=S:> ~:> o:@+2+>ÿ>+2+>:> ¿:.=:> :1=:,=>C2*>:[?:/=:> !3=4:2=p:[?:@>vL!> ~#d:+=Z:?=##:?#!9=~#06d(>C:8=H> d!H=~# Z dK> d> dO:[?yvLJ>23=:/=ʍ> vL!1>!*4=#|+:/=ʤ*6=#"6=:/=|ʾ>-vLZ!>ZZ>SvLä~#vLPX |>:d MACRO-80 3.44 09-Dec-81 PAGE :> Q)*<#"<*<#" !>">O!f ~*>w!>"> '"!*=:=*=:=:=x¦*=*=͍ "?="=ĩ:A> y> C+B+y*?=+~xGW> #######FyxG+#W>_xGxGFɯFxGF .7FxFx!>~w#4ZL>2>U C \ \'"(ʬ)ʯ+ʲ-ʵ*ʸ/ʻ;ʨ,ʨ >>>> > > >!G) # ) o2=) # x) eo) n==x*F=+H 2=*F=++"F=H "F=GHg:<o|DHB} |BwDʕHʝOdQ•ͼOqQ þ!H Bq0Ի)z#zͥDnHn!H 0)T]))_è!H 0Ի)))_ÿ!H G0 ))))_Hû:<4!H 00 ܻO:<=ܻ<_Pc$ =ͥ=ͼ6 q6 :=2=ҿ=$ ʿ!  ʿo#g=b#t!S ~Œ2< ;ʹ ʹ° & × °6 þ*F= # #7 -#~G ĵxw+!"F=$ t:<ʮ:<7͓ $ !*@w!7 Gx22>">ĩ:<>C~@x##^#VOQb#^#V"=y y¾þ7͓ "?=~Bڨ~8:<2<##~2  þ:=X # '¿ 'n$¿j OþXOR AND NOT MOD SHL SHR OR EQ NE LT LE GT GE LOW HIGHNUL TYPE :< :<:2>2=2<2>2>2>2<2<9">*)@͍ 4\!]!~!! f!O2>̓!=y "" "?"y2W?͎! 6 ,8!:>8!2>> ß!:W?O:>O!f! "x̓!G:W?O`!"f!ó _y{y!*=YGó !"_~xž!ůG|2>?"y2W?͎!!F%:W?Of!è!@ 2W?:W?G2>O! x怱!>w*F=+N{*>2>z |= yWx=z6"z6"ʳ 6"6"6" >G̓!Gó "Y?zR" ͪ""=">y2W?͎!"ʡ"2X?ʋ"ʋ"ʋ"ʋ"ʋ"ͪ":X?*Y?!#o>g~#fo:W?O*Y?ʶ"y}!"=y%"*="""*>"{%z%   P#Z#d#n###N$$%##Q%\%h%u%{%%%%#%&&&-&C&c&̈́$zW{_̈́$zW{_̈́$zW{_*>|/W}/_:W?O>%%*>|/W}/_:W?O>%%̈́$zʬ#)â#̈́$#+}zW{_ò#*>:W?y#:W?O2>:W? #*="=*>͔$>%%*>G$:W?%$%$y%$$$:W?%$ ?$=:W?9$y9$2>:W?O>%%{_zW*>i$:W?O> %%i$ DM!>=ʂ$))p$p$:W? *>:W?y*>ͳ$:W?O> %%zzB%|G|$|%$%|/G}/O!>$ $7>{_zW}o|g=$|g}oɯO_yW*>z5%|5%|ͳ$%:W?O> %%>O!G͙%͍ o%͙%͍ ?o%͙%͍ W_ ͙%È%͙%͍ o%͙%{_zo%7o%?o%:W?L&*>*>\W:W?O>%*>]W:W?O>:>@2>!>4~?%o%$w5y%:>2>̈́$}R_̈́$}R_̈́$}@_̈́$}6_̈́$}Ro{R_̈́$}?_*=*=͍ :W?_ :> Ox&> 2>,̓ x 2=xGʱ&:=±&*=*=͍ :=G*="=:<ă"= :=&:<ĩ:\?2':\?ȯ2\?U 2'1>G2=<2\?2=*=õ&2'1>2\?G2=*=õ&2'1>2\?G2=*=õ&:\?,:==`'o& ^#V*=͍ s#r2=*=##K':<ʇ':=ʇ'*= ͩ2=1 6 "ʠ''(G) ) *F=++' ) '³' ʳ'6 ,';'' "F=(y(# G) ) 'L) ȸ'# ( ,ʍ'LÍ'Z:=y,ʍ'̓ x1 "N('ĝO) d( o(GŷLP(xx|(L,A(1(h'y,›(ZCä(:@ʹ(z*=#"=:<'ä(*=:=Gõ&2(:<:>U<2>1h'̓ y,(:<=)G2<:<=)2<:<<2(=?)2<@ ͣ:<ģ:<̣!<;)=@ 4=2(=<2<@ 51):<_2>W!<7~?)<\)w!<4:(=2(=!b*T],l*zr* Y*#*F=z̝}O|G:> U Oĝ7 -#~@w ~ĵwy,ʉ*1>O*>; *F=+~# ****#"F= () 'O*6 ) )ĝ@ >2/=Y+2/=Y+2-=Y+U G+ G+ $ :+~@w,U ,+>2-=>2.=Y+2.=@ >2.=Y+}+>}+:@/o:22<(2 {=ʝҝ<2 +{22=+?pU :=+>!=w#"?=:<ĩ,+:,= *F=+qN1,4O=2,=*F=~#"F=!5, () 'U ') )@ :<:=x,>=!]?G~µw#„,p, /U ,/@ #~µ~$w2'+"=>2=!"=ñ&>2=:=U - -~w#~d -~w,,͝-w͵,~Bدw#w#w#wU ~#~>-,"C=m-:>21=Ux¯x 20=*C="?= x4̓ :>"C=~w|21=m-x¯*C=-#~µ~@ w#s#r#*=s#r4͸K:?w/:<Ĩ/!<4~=Z.!]?~-!1>~-!@#]?~# . .. . -!V?p#"?=ͩ2'!5O"@ A."?=~w#~@k/~.#^#Vͩ.*= ͩ *={ĩn*F=ԃ +!"4="6=}2/=p!/!3=44!r?>͗;Z:3=8p!3=44!/!?>͗;Zʹ/*<|.:@<2[?2[?.!L//!O//*<|/>,vL:@<>,J:@<2[?2[?!_//ʹ//̓ͩ*>|,/F/ͩ+:@C/>vLKLNo Fatal error(s) Warning(s):=Gͩ./!//)ô/REPT/IRP/IRPC/MACROUnterminated /!//)> Z> Z:@<> J> J!/:@0"?%O;.0~<=r0:@<2@:@:@=2@<#~^0:@^0:@^07"?:?=2? &0*F=~ 0 0U 0"F=0>&2?>1&0:?0>&;:2?*@~ 1=1O+1 0x+~10:@*@~<1=11O+11 #1x+~111<*F=U 0w1G~# \1 d10P1x0G0&06 "F= ʐ1 ʐ16 Ö10}1ͱ k1å1ͱ k10ß1 ;1ù1:0 ʞ: ù1:: 1 1:"%@ʞ: ʞ:> ;:Þ::@1*@4I2* @~82G+#2~/_2~F2=G+~F23*2+<=C2+;2~>.33?*@O DEU Ă2=ʦ3%2,ʰ3 ʰ3 ʰ3;ʰ3!) 3w+ Ô2"{3q3(:> 63:<.33PX 2|2>:f3)0R3>)30R3=363D>3E>3 >0f3xG3x0:R3 f30O:f3>0f3y*{3w+"{36 *{32Ow+ ʏ3 3~3w+ ~3Ô2ʢ3w+22322{=*F=+~ 6 6 ʵ3õ3!=͍ 3#6 +>1&3:>1!  4>1!4r ?Stack overflow, try more P switches (:> O4"?/c4> \^4U :U H0ʄ4H=;: y4ɯ;:͞:!*#@*?!!44͍ 4:@¾4x4*?͔9͊02@*?r:5H=͈:3 4*@*@*?"?"@"@ bkë4:?2@+5ů2@@ :@ʊ5U :U O^5yf5y n5y@{5:@=2@:@<2@:@:<(:@#~>P)!ɷ/"@i2O:> ʰ5*@͊0y6+,ĝ5) <ĝw+:> G6G5͌2 D6>G65# <2@ 5 =6:@6G6 ;,76<36>76G67676 w+5:@G66+.0xĝ" @&i"?m6\4>Ô5^4*%@>2@3H0ʱ6 ʶ1;ʫ1'ʡ6"ʡ6>1Ç6G͕0 ʶ1ʛ6â6"%@;:͞:!*#@* @*?!!64>2@" @͍ 7:@6x 7* @##~#7+4r:47H=r:1:3 7* @4 bk6 ʝOJ) V7JG7> J> J:> @ ʝ2 @O ʄ7@ u77\4^4!H=: @O~ʥ7 #Ù7!ɷ #"?~(w/"@i2 ,7w+2@2@ 2=xx2=*=T9"=:=2=@ !!@Ns#Frͦ9ͯ9q#p*@^#V+*@##^#V+*!@}9ͯ9"!@9*@ "@*)@͍ I;*?%:?͍ I;*@T9ͦ9*%@{_{:s#r#>w#wͯ9%:s#r*:"#@*#@ͦ9s#r{_*%@{̺9*@w{W:a:"%@{_ͯ9zʺ9*@}‚:}o~r:{ʗ:a:{_ͯ9{ȯw#w*@s#r͔9*#@ͦ9q#p*%@{:*@"%@~{_ͦ9{_{:a:*@*?:?;*)@%T9o zo W{_*@*@T9BK*@"@xE;+w 8;"@O;9*A=*@T9o zo W{_*@T9BK*@*A="@ "@xʕ; w#È;2>2>O!^#V#ͷ; ;:>Zz^#V{;};++V+^{;w#w+++; F#"?=~@#~<~#^#VG5<<_<{…<{@Đ<{ʈ<{_!f~vLz<###~#vL;<>L<5m<:>wZ!3=4:2=p*?=~@w> |<> vL>*>M>C>UvL2<*?=#{G#^#V#^#V"=̓"?=#~ ĩ>IvL!>">*>6!>~G#^#VͩQAQBQCQDQEQHQLQMbSPcPSWQIQR bBCbDEbHLbAFjIXDjIYdrNZqZrNCqPrPOrPE RELCRFPRNP?Command error?File not found?Can't enter file~J#F!FF!FF!FFXGCOMSCNF",AF2@!@͸H> 2-A25A2,Ay,2@G:@2@H>A:@G;AH-A:,A2@ 2@G:@@2@!@͸Hy=7H 7H,A#H 7!@͸H:@!@ܘH!@:@SH@;A> =IHܘH:@hH:@hH:@2@ _2̈́K%K;K*@##:@2@G,A ~²HHw# ¨H #èH w#»H:@!5A~ Hw#H*J:7>IxHJOx=y&I[A@2,A*Jx I -AoIJIT?IJT7JY7ILYIJS7JT7>IR7JD7R7>I> ڀI6 #=xIy.2@*J5AxژIʥIJÙIy/yJL¾I2@JOæINI2@÷IOI2@÷IRI2@÷ICI2@2@÷IMI2@÷IIJ2@÷IXJ>2@÷IZJ2@÷IP7:@<2@÷IJ[HJ0HJADJ:HJ-JO!~6GzJ#~ cJUJHFx+#tJ~iJ2@ÚJ2@:@JK>*J GF> J:HF!IF"Fo>g6 #> w:@J!IF~ JaJJAw#þJ~# J J K#"F_*F+~ #KJ#"F+~7ȷ> J> JEB!"CB!@:@NKCA!"AA!@:@K~K͡K vL> vL>vL*CBEB@NLEB@K:@ʰH:@K>L*AACA@NLCA@K|}YLƀ)`iíL> vL> vL> vL:@ʰH:@¡M =­L!CA>!@íL:@ʰH:@J*AA|=L#"AABAw:@<KM*ED|%M#"EDFDKGD>@=NM!=*M!>JM_!@ sM qM vL~zMËM7ȷ!MF@@²M> J!MFKDISK FULL!M:>ŒN@Nw#2@.ʷN!ڷNw#N2@.ʾN!ҥNþN6 #·N:@.Nw#NpMMN2M2M:M=OMM0O!M"M>2M*M~+O70O#"M0!"EDGD!@~KsK w#ªKw@KGD:@ʰH:@ vL> vL>vL*CBEB@NLEB@K:@ʰH:@K>L*AACA@NLCA@K|}YLƀ)`iíL> vL> vL> vL:@ʰH:@¡M =­L!CA>!@íL:@ʰH:@J*AA|=L#"AABAQSe4dT %=M%jMXLD64 e5541=MRALLFPYTQ U5D%H =1 >WBOOTAUГ T45H =9%:CONOUTT UT4IJHOMESe4UEE$MQMSETDMAPQ Uu$DX1%MQMRSECTRA`d$D4 ==Q 2SERINTSU e$T5cM-)5BCURDSKUPdE44)A!2CONJMPT Tt$E(%=5FPY`d$DU( ==Qa2BOOTDOQE4x I1PSERINTTSe4U$UH1MQ=URPOLLSTQdUEE( U%:INPBUFdE$MIMRPLIST `e4U$A=1A1&FRSTPASU TdXM1NFSETTRU`Te$TH]I%QFFLUSHTddE$QI9NDIRBUFTe554DEMMBDSDDDPRST4T8Q:FBADSERddtUDE UIAfSELDPHUSeUDE(Q5ABSELDRVUSDTHIeQIfTSTRDYTEE%h9QIeABORTMQRe$UE%8M,DIFTRK e4E$M-JDISKERԕӑeT%I RWRTNORPd$ij%4X5=Y]IRMKBUFAԕST%Th]IQ 2INBUF2PdE$=AJSTRTSEQT`e$TE( UY2BLKPTRS d$ĴE%hM%2RDSNGLT Te$H%M-%>IOTRYPTSe5E%DI]I%RNOWPTTDIMQ=JPSEEKEԒU`U$DU%(AIIQfWRTERRTTeE$U%(A!bSECERRQTdE%dU%(IMQ<TK0WAITQL U%EE$M!PGETPART `de%5E4X1=%:LOGDRVSd$D4HM91MBPUTPSPd4tE4IMQ%6BADSELSQSSDU9]AfCINITRTS`T4(M%9=:TWODECTQӌe$4xMIAI:PARPRNTTe4U%8M%8NXTTENMVt)P@XvXfvxhwoufu^v` _viwuPo Zb@H V$ āT+`0````砰2VηH``(`H``8CJ@Ca ! .`ai a 9|>rK@P T( @@6^;*` 1r@eN?HPBf@8#n`Y` n?v` n?LWi 8eHw0"\fPbi^n j"4 Dc d '2#uYW0tNG#yZr2̧As:MPZâL:ZñL;4õ`E2 Oq@(xOv@QpU>H.x>P1=xs/10#H'>2%sjET\ H}sׂSlٶ00v@X!;G`ʌݤ xOvAC _!AYf%PK,PC <9`GW n(4{L>e|`W0>Y n(}Z`AW| cvt cvL PXv(BHy@Y +*\U<O@ <_?@Иd `xT@``H0e@'dHwGfupQ<#iD  3o0t[kFr@+JLP CsxaKt[#AuCuu@ 0tiG!4`m@ DЍfvmUЖmЖmf٠ @p,(eCT D#H"A A`n+'L:A+ >SlLӈ 3h0anCt[ PEBVs>T!PmuVʅ ,ۊ`2 0sς.6m(n@@a:*>Q(X2 : ͡@veB[VœuBʅ +tUD1+T@ U@"AͰ` P eB-Un q@ifAfmv, `3k36X H@D2@`ʈ3o6C*>h4 Gn79x<^/OX(lPXꄄ4Ƕ1|[`}`=  Fڄ3o;6n8C6ihK6l N,63jP"Pd QQ0Pʆ pP+Py 5 0@mؐmP0m٠mPm@mPmfP`fqmP md`!~0cl J5wGT!Ppx<#T$ 2 +P@}*A]v!$uA礃a[*&*A*:w3eA`9!A2~Pin+T(!G7D4d "7C!$4ILdVi@uEB> @e|e @A83Y(` 0` pAe@fpexʁ xCt 0@9D6(E" v-&5X!xٵT|dN>CtWOC*ͼ0@69|4G<᥸RgH289 [\bMVmhOVAee ?xMͳ s;8''Z-KB%!Рt"Z-T&9@r2sqe 㙤y!kMBdFHS2MbAr7pr0b @s2ΆH &C(H F@$(i9̧C@i7 r4 Ӂt2ΆS @ )M@t4DCIe:  A : t2#yc:@t4MeMǑa9LgC)\$@al0o:擙@t7 &#y : yr0 &pn9  4$Nbq 9L&Cȸ $fS@d4fS,͆@d9NQo9 q@t<  1 '# e9n:MS(I- f`PYjxX v5#K 2 5)xTecm5 bxͳ~ͼDٶx#}uJ_! #Cٷ0zi [6X{6i[6Ae9 'S @C( ɢ2 c4MZ5DyL *NS a2 &l6LP4$%ey4@2 qa6 @h(D2'Sa@c7fa@i9fSl #H  c tFqrNb!r0 S`r4Sr4!!r4Mt P #0';$0 B  @# "]@ lt0:[-8KBr zlq0 &#(,ur "z|uX#! !Gw "*dt!"'&2JzJt #!&%)A2bZ"tL#!&%*)GA2bZ*t!'!&Gkrzz"|w@!'"Gezzb|w8!',&GO@2Jtt(#!*+ GL2 v!#)AJrJu!"@zb"|vh$Gl2zrRjvx!'Ge*zrt *|bb4vP!")@22u"$*)%@"J4v"$"G@"JZ*u"$jAr"j Jtv#")+")GX""""v ")G`2"ZRjtt") Gw2 ",u#"(! I@2"B t(##&*Gl2:*"v0$'@2u)"Gh2Jlw #))( EB22,vt#)")d2*,v8#)*)Gb22J,t#""Gy:* v#+"t*:z"t<"$"G}B*u$'DB*Bvd!*GhJr1t#$(!*GF2JrLv$ $*)"G*Jz"j t#$)+*GA*Jz*w$) G@*Jz\v),QBJJz u<.Gd"RBdp%"%Vb $u+& & rb"z2v&$Gi2bJuP#&'%bbz:"Jtt&')+G}Abbzzv&)%&Ghbzvh &)'GbA2bZ$v&* TAjjz$v&+*G<2jb!t4#'"(,urzJrJw'*G[Brr",t/',**"GD"z*t\#'(*)GC tuT(")+GHA*w($"GwbJv (&)'xj@G!>0w#w!4~:60+4~u!N#F! x, # =!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m ʅ xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  w#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 00 CPM00.COM"$*|  CONSTRUCTING 00k CP/M vers 2.2$>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*1y{0!B0}y|zx0y0{00 \X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2 !2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q =qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUBg"C {2!"E 9" 1A 22!ty)K!G_^#V*C   ~E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > ! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#:A #~$=2E k͌ : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# #  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4!i w: Z!E ~=26 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2óadjmrux}çìûpñns ns<nskLns{?      00k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j<Oͧ>~ͻ>2!"2!"28!"9:O R![?boot  ç!y2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kw ?L:f>g yxzӉxӊY?28L28L8 >:fIyۉ:fV{ۋ:fcxۈ@$@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I(  BIB@!  ! !! D 15D715E0AB :100A700015E615EC15F515FE1504160A1611162CBB :100A80000E17161D1626162D16411647164D160E54 :100A9000155316040C040C9B1@$@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$ COPYRIGHT(C) 1980 MICROPRO INTERNATIONAL, SAN RAFAEL, CALIFORNIA, USA. ALL RIGHTS RESERVED. WordStar 2.1 Message Texts bvC < t(1p Y#`$y$%$$%%>&l&&&&'i"%W&&bb=bsrbb((9)w)))P*Z*n****b*;+T++++b}0?~C]f\:LzR JbEbbbbbb"+#$!&b$$$K,bV,V,V,V,l,l,V,b,,b- -'-]---b.".bb.b?..b../5/@/L/k/m////(b//b0bK0bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb D=create or edit a Document file H=set Help level  N=create or edit a Non-document file X=eXit to system  M=Merge-print a file P=  F=File directory+ Y=delete a file  L=change Logged disk drive O=cOpy a file  R=Run a program E=rEname a file  For maximum help (full menu display),  select Help Level 3 by typing ^JH3.  This message will clear when a key is pressed.  TO HYPHENATE, PRESS -. Before pressing -, you may  move cursor: ^S=cursor left, ^D=cursor right.  If hyphenation not desired, type ^B.  CURSOR: ^A=left word ^S=left char ^D=right char ^F=right word  ^E=up line ^X=down line  SCROLL: ^Z=up line ^W=down line ^C=up screen ^R=down screen  DELETE: DEL=char left ^G=char right ^T=word right ^Y=entire line  OTHER: ^V=insert off/on ^I=tab RETURN=end para ^U=stop  ^N=insert a RETURN ^B=reform to end para ^L=find/replace again  HELP: ^J displays menu of information commands  PREFIX KEYS ^Q ^J ^K ^O ^P display menus of additional commands CURSOR: ^A=left word ^S=left char ^D=right char  ^F=right word ^E=up line ^X=down line SCROLL: ^Z=up line ^W=down ^C=up screen ^R=downDELETE: DEL=char left ^G=right ^T=word ^Y=lineOTHER: ^V=insert off/on ^I=tab RETURN=end para ^U=stop ^N=insert a RETURN ^B=reform ^L=find/replace againPREFIX KEYS ^Q ^J ^K ^O ^P display addition al menus  ^Q PREFIX (to cancel prefix, press SPACE bar) CURSOR: S=left Side E=top X=bottom D=right enD line  R=beginning file C=end file 0-9,B,K,V,P=to markerSCROLL: Z=continuous up W=continuous down DELETE TO END LINE: DEL=left Y=right FIND, REPLACE: F=Find a string A=find And substituteREPEAT NEXT COMMAND: Q=repeat until key pressed  ^Q PREFIX (to cancel prefix, press SPACE bar)  CURSOR: S=left Side screen E=top screen X=bottom D=right enD line  R=beginning file C=end file 0-9, B, K, V, P = to marker  SCROLL: Z=continuous up W=continuous down  DELETE TO END LINE: DEL=left Y=right  FIND, REPLACE: F=Find a string A=find And substitute  REPEAT NEXT COMMAND: Q=repeat until key pressed  ^K PREFIX (to cancel prefix, press SPACE bar) END EDIT/SAVE: D=Done X=done,eXit S=Save,reedit Q=abandonMARK BLOCK: B=Block start K=blocK end H=Hide/displayBLOCK OPERATIONS: V=moVe block C=Copy block Y=delete blockADDITIONAL FILES R=Read file W=Write block J=delete file & PRINTING: O=cOpy file E=rEname P=DISK & DIRECTORY: L=Log disk F=File directory+PLACE MARKERS: 0-9 = set/hide place marker 0-9  ^K PREFIX (to cancel prefix, press SPACE bar)  END EDIT/SAVE: D=Done edit X=done, eXit S=Save, reedit Q=abandon  MARK BLOCK: B=Block start K=blocK end H=Hide/display  BLOCK OPERATIONS: V=moVe block C=Copy block Y=delete block W=Write  ADDITIONAL FILES R=Read file W=Write block J=delete file  & PRINTING: O=cOpy file E=rEname file P=  DISK & DIRECTORY: L=change Logged disk F=File directory+  PLACE MARKERS: 0-9 = set/hide place marker 0-9 ^P PREFIX: Put Control Character in File V=subscript T=superscript Y=ribbon color changeS=underScore B=Boldface D=Double strike A=alternate pitch N=standard pitch X=strikeout begin/endO=non-break space F=phantom space G=phantom rubout C=pause H=overprint char RETURN=overprint lineQ,W,E,R=user printer controls SPACE=cancel prefix ^P PREFIX: Put Control Character in File  V=subscript begin/end T=superscript begin/end Y=ribbon color change  S=underScore begin/end B=Boldface begin/end D=Double strike begin/end  A=alternate pitch N=standard pitch X=strikeout begin/end  O=non-break space F=phantom space G=ph. rubout (see manual)  C=pause when printing H=overprint next character RETURN=overprint next line  Q, W, E, R = user printer controls SPACE=cancel prefix ^O PREFIX: on-screen formatting commands S=line Spacing C=Center cursor line F=margins/tabs from lineL=Left margin X=margin release E=soft Entry #R=Right margin W=Word wrap  D= , ctrl dspy%I=set tab stop J=Justify! P=Page display (N=clear tab V=Var tabs" T=ruler display&G=para tab H=Hyphen-Help$ SPACE=cancel prefix ^O PREFIX: on-screen formatting commands  S=set line Spacing C=Center cursor line F=margins/tabs from File line  L=set Left margin X=margin release E=soft hyphen Entry#  R=set Right margin W=Word wrap  D= , print ctrl dspy%  I=set tab stop J=Justification! P=Page break display (  N=clear tab stop V=Variable tabs" T=ruler display &  G=paraGraph tab H=Hyphen-Help$ SPACE=cancel prefix  ^J PREFIX: help commands  H = display and set Help level M = Margins and tabs  F = Flags in right screen column S = Status line  I = command Index; entering text R = Ruler line  B = paragraph reform (^B command) V = moVing text  D = Dot commands, print controls P = Place markers  SPACE=cancel prefix  ^S=delete character ^Y=delete entry ^F=File directory  ^D=restore character ^R=Restore entry ^U=cancel command  TYPE ^KP TO CONTINUE PRINT  TO RETURN CURSOR TO POSITION BEFORE SAVE,  TYPE ^QP BEFORE TYPING ANYTHING ELSE.  TYPE 1-9 TO VARY SPEED, SPACE TO STOP *** WARNING:  WRONG VERSION OF WSMSGS.OVR --  SOME MESSAGES MAY BE INCORRECT. *** *** WARNING  SCREENS OVER 48 LINES HIGH OR 120 COLUMNS WIDE  HAVE NOT BEEN TESTED AND DEBUGGED. PROCEED WITH  CAUTION; REDUCE WIDTH IF BUGS ENCOUNTERED. *** WARNING: DISK FULL,  DELETING OLD .BAK FILE TO MAKE SPACE  (NORMALLY, THE PREVIOUS BACKUP FILE IS DELETED  ONLY AFTER EDIT IS SUCCESSFULLY COMPLETED).  CAN'T DISPLAY PAGE BREAKS IN A NON-DOCUMENT FILE *** WARNING: WORD TOO LONG TO FIT MARGINS  PUT AT FILE BEGINNING FOR CORRECT PAGE BREAK DISPLAY  Normally press RETURN only, or enter one or more of:  number=repeat count, B=search Backwards, W=whole Words only, U=ignore case, N=replace w/o asking, G=replace in entire file. HELP LEVELS  3 all menus and explanations displayed  2 main editing menu (1-control-char commands) suppressed  1 prefix menus (2-character commands) also suppressed  0 command explanations (including this) also suppressed  CURRENT HELP LEVEL IS  ENTER Space OR NEW HELP LEVEL (0, 1, 2, OR 3):  The LOGGED DISK (or Current Disk or Default Disk) is the  disk drive used for files except those files for which  you enter a disk drive name as part of the file name.  WordStar displays the File Directory of the Logged Disk.  THE LOGGED DISK DRIVE IS NOW  NEW LOGGED DISK DRIVE (letter, colon, RETURN)?  Use this command to create and alter program source files  and other non-documents. Word wrap defaults off;  tabbing defaults to fixed (TAB chars in file; 8-col stops);  page breaks not shown; hi bit flags not used in file.  For normal word processing uses, use the "D" command instead.  Use this command to create a new document file,  or to initiate alteration of an existing document file.  A file name is 1-8 letters/digits, a period,  and an optional 0-3 character type.  File name may be preceded by disk drive letter A-D  and colon, otherwise current logged disk is used.  WARNING: You are editing the same file as you are printing.  WordStar will not allow you to save the edited version  until the print has completed or has been abandoned.  ALLOW PRINT TO FINISH BEFORE EDITING A FILE.  YOUR SYSTEM DOES NOT HAVE ENOUGH MEMORY TO  PERMIT SIMULTANEOUS EDITING AND PRINTING.  CAN'T EDIT A FILE WHILE MERGE-PRINTING --  FINISH OR ABANDON MERGE-PRINT BEFORE EDITING  FINISHING PRINT BEFORE EXIT  (type ^U to cancel exit command) ... FINISHING PRINT OF SAME FILE BEFORE SAVING  (Type ^U to cancel Save command) ...  FINISHING PRINT OF .BAK FILE BEFORE SAVING  (Type ^U to cancel Save command) ...  ABANDONING UNCHANGED  ABANDON EDITED VERSION OF INVALID  NAME:    NOT FOUND  Now printing file  "Y" TO ABANDON PRINT, "N" TO RESUME, ^U TO HOLD: PRINT?  For default press RETURN for each question: START AT PAGE NUMBER (RETURN for beginning)?  STOP AFTER PAGE NUMBER (RETURN for end)?  NUMBER OF COPIES (RETURN for 1)?  DISK  OUTPUT (Y/N):  OUTPUT  NAME?  USE FORM FEEDS (Y/N):  SUPPRESS PAGE FORMATTING (Y/N):  PAUSE FOR PAPER CHANGE BETWEEN PAGES (Y/N):  Ready printer, press RETURN: WARNING: You are printing the same file as you are editing.  The last saved version will be printed, not reflecting un-  saved changes. Furthermore, WordStar will not allow you to  save the file being edited while the print is in progress.  END EDIT (^KD) BEFORE STARTING PRINT.  YOUR SYSTEM DOES NOT HAVE ENOUGH MEMORY TO  PERMIT SIMULTANEOUS EDITING AND PRINTING.  TOO LITTLE MEMORY FOR MERGE-PRINT  *** PRINT OUTPUT DISK IS FULL. PRINT PAUSED. *** THAT PLACE MARKER NOT SETBLOCK  BEGINNING NOT MARKED  (OR MARKER IS UNDISPLAYED)BLOCK END NOT MARKED  (OR MARKER IS UNDISPLAYED)BLOCK END MARKER BEFORE BEGINNING MARKERBLOCK TOO LONG -  MOVE OR DELETE IN TWO SMALLER BLOCKSTHAT FILE EXISTS ON DESTINATION DISK.  DELETE EXISTING FILE FIRST,  OR USE A DIFFERENT DISKETTE.DISK FULLINVALID COPY LENGTHADDRESS IN "HOLE" (TSTADR)MEMORY FULL (MAK256)MEMORY SHORTAGE (MKSP)POINTER > 64K FROM CURSOR (PPTOAD)NOT ENOUGH MEMORY  OR YOUR OPERATING SYSTEM IS NOT  RELOCATED TO MAKE ALL RAM AVAILABLE DISKETTE DIRECTORY FULL CLOSE FAILURE -  SYSTEM FAILURE, OR YOU CHANGED DISKETTES RENAME FAILURE -  SYSTEM FAILURE, OR YOU CHANGED DISKETTES INVALID SCREEN HEIGHT OR WIDTH  MESSAGE  Can't edit a file of type .BAK or .$$$  -- rEname or cOpy before editing BAD OVLY #BAD OVERLAY FILE, OR  WRONG VERSION OVERLAY FILE Overlay file  Not Found FILE  NOT FOUND  (The seperately sold file   is required for use of Merge-print.)  NOT FOUNDPROGRAM IS AN EMPTY FILE!?PROGRAM TOO BIG FOR  MEMORY AVAILABLE UNDER WordStar LET PRINT COMPLETE BEFORE RUNNING A PROGRAM  NOT ENOUGH MEMORY TO USE "RUN PROGRAM" COMMAND  File  Not Found --  Can't Run a program unless  is available.  FILE  ALREADY EXISTS FILE  NOT ON SAME DRIVE  TOO LITTLE MEMORY TO COPY WHILE  EDITING OR MERGE-PRINTING  FILE  EXISTS -- OVERWRITE? (Y/N): FILE  IN USE BY WordStar   P=   Press space bar after reading screen: *** Invalid Dot Command Ignored: *** File Not Found *** But found, and will use, *** Cannot change disk in drive , request ignored Insert diskette with file then press RETURN: *** No .DF before .RV: *** WARNING: Overlong data value truncated *** Invalid variable name in .RV command ignored *** WARNING: Data exhausted, null value(s) used ***** Print Directives *****  PRINT CONTROL CHARACTERS may be entered anywhere in a line  to invoke underlining, boldface, subscripts, pauses, etc.  They are entered by typing ^P and a letter. A directory  of most print controls is given on the ^P PREFIX MENU;  see manual for more.  DOT COMMANDS are special lines beginning with a period and  a two-letter code. They control page breaks, headings,  page numbering, page layout, etc. Dot commands are  typed in like other text.  Space bar for DOT COMMAND SUMMARY, ^U to return to editing:  ***** Dot Commands *****  PUT EACH DOT COMMAND ON SEPARATE LINE, WITH . IN COL 1  .PA new PAge  .CP n new page if less than n lines left on this page  .OP Omit Page numbers when printing, starting this page  .PN print Page Numbers, starting this page (default)  .PN n set Page Number to n, print page numbers  .PC n Page number Column (default 33 (30 if 64-col screen))  .PO n Page Offset: extra indent when printed (default 8)  .. text comment, not printed  press space bar for next frame:  .HE text HEading used until next .HE (default blank)  .FO text FOooting (replaces page number) (blank)  .PL n Paper Length: total number of lines (default 66)  .MT n Margin at Top: # lines, top paper to text (3)  .MB n Margin at Bottom: # lines, end text to end paper (8)  # lines text on page is PL - MT - MB (defaults to 55)  .HM n Heading Margin: blank lines between head and text (2)  .FM n Footing Margin: blank lines, text to footing (2)  FOR PAGE BREAKS TO DISPLAY AS THEY WILL PRINT, USE  .PL,.MT,.MB, AND .LH (next frame) AT FILE BEGINNING ONLY.  Depress space bar for next frame:  THE FOLLOWING WORK ONLY WITH INCREMENTAL PRINTERS:  .LH n Line Height in 48ths of an inch (default 8)  .CW n Character Width in 120ths of an inch, for standard or  alternate pitch, whichever is in use (see ^P menu).  (default 12 for standard, 10 for alternate)  .SR n Subscript / Superscript Roll in 48ths of an inch (3)  .UJ OFF/ON "MicroJustification" off/on (default ON)  Use insure that printed column alignment exactly  matches screen, e.g. for tabular material:  Put .UJ OFF before table, put .UJ ON after table.  Space for next frame, ^U to return to editing:  SPECIAL CHARACTERS in HEADINGS (.HE) and FOOTINGS (.FO):  # prints as current page number  \ do not interpret next character as a special character  ^K do not print following spaces if on even-numbered page  PAGE NUMBER POSITIONING: If a footing text is specified (.FO  dot command), the default bottom center page number is not  printed. Use a # in heading or footing to position page  number where desired. ^K followed by spaces followed by #  may be used to produce alternating left/right page numbers.  Space for next frame, ^U to return to editing:  ***** Merge-Print Dot Commands *****  .DF filename specify Data File for .RV  .RV name,name,name,... Read Variable values from data file  .AV "prompt",name Ask operator for Variable value  &name& anywhere in doc't prints as variable value. variable names are letter then 0-39 letters, digits, -'s. .FI filename Insert document File  .DM message Display Message  See manual for details and additional commands. Merge-Print  is an optional feature, operational only if MERGPRIN.OVR is  on your diskette. Press any key to return to editing:  ***** STATUS LINE (top line of screen) *****  ^JS at left end of line is command now executing  A:NAME.TYP is name of file you are now editing  PAGE n is page number of cursor (disregards .PN's)  LINE n is printout line on page of cursor position  COL n is printout column on line of cursor position  INSERT ON shows if character insertion is on (^V command)  MAR REL shows if margins are released (^OX command)  decimal shows during decimal tabbing  LINE SPACING n shows if line spacing is not 1 (^OS command)  PRINT PAUSE shows if printer is stopped (^KP to resume)  when WAIT appears, stop typing. Press space bar:  If page break display is OFF (^OP command) or edit  was started with N command, then Status Line shows  FC=nnnn FL=nnnn in place of PAGE n LINE n .   FC=nnnn cursor position in characters (bytes) from  beginning of file  FL=nnnn cursor position in file lines from beginning  of file, including dot command lines   space bar:  ***** FLAG CHARACTERS (rightmost column of screen) *****  < line ends in "hard" carriage return, entered by user  space this line break arose from word wrap or paragraph  reform, and may moved on subsequent reform  + this line of document continues on next screen line  - next line will overprint this line  ? unrecognized or incomplete dot command  M Merge-Print (optional feature) dot command  P page break  : this screen line is before beginning of document  . after end of document press space bar:  COMMANDS TO -- ARE --  move cursor on main and ^Q menus  scroll file up or down on main menu; also find (^QF)  delete text on main and ^Q menus; also ^KY  move or copy text on ^K menu  end edit / save file ^KD; see ^K menu  print (while editing) ^KP  set tabs and margins on ^O menu  reformat text ^B; ^JB gives info  find a string; replace ^QF; ^QA; ^L repeats last  press space bar for "entering text":  ***** ENTERING TEXT *****  To enter text at cursor position, just type the text.  Use RETURN key for paragraph end or other fixed line break;  let word wrap form lines within paragraph.  Type ^V to turn insertion off (to overtype) or back on.    ^N may be used to create blank lines ahead of cursor,  as before inserting a paragraph.  Use ^B to realign margins after corrections.  ^JM shows info on margins, tabs, table entry, outline entry. press space bar after reading:  ***** TO MOVE A BLOCK OF TEXT *****  1. Put cursor on first character, type ^KB to mark start.  2. Put cursor after last character, type ^KK to mark end  (for end line, use start next line to include RETURN).  3. Put cursor at destination, type ^KV to move the text,  or ^KC to make a duplicate copy.  To undisplay markers afterwards, use ^KH.  ^KB and ^KK may be entered in either order, with or without  other intervening commands.  All above commands are on ^K menu. press space bar:  ***** PARAGRAPH REFORM (^B) *****  To realign margins of a paragraph after corrections, place  cursor at beginning of paragraph and type ^B.  To change margins of paragraph already entered, set margins  (^OL, ^OR), place cursor at paragraph beginning, type ^B. To change between justified and ragged right, or change line  spacing, set desired justification (^OJ) & line spacing  (^OS), place cursor at paragraph beginning, and type ^B.  To obtain WordStar's help in hyphenating long words, place  cursor at beginning of paragraph and type ^B.  press space bar for more:  ^B reforms lines to end of paragraph as indicated by "hard"  carriage return (< in rightmost column).  Thus, it is important not to use RETURN between lines  within a paragraph when entering text.  ^B may be used to form hanging indents, change margins in  mid-paragraph, etc. The exact rule is:  "^B starts on the cursor line, at the left margin col-  umn, or at the cursor position, whichever is farther  left, and proceeds to the next 'hard' carriage return".  press space bar:  ***** Hyphen-Help *****   ^B will occasionally stop before the end of the paragraph  and ask you whether you wish a word hyphenated.  Following the instructions that appear on the screen, move  the cursor if desired to adjust the hyphen position,  then press "-" to hyphenate, or ^B to not hyphenate.  To turn off "hyphen-help", type ^OH.  press space bar:  ***** MARGINS *****  To set left margin: Type ^OL. WordStar will asks for column.  Type desired column number 1-240 and press RETURN.  Or, to use column of cursor in file, just press ESCAPE.  To set right margin: type ^OR, proceed as above.  To set both margins to match text in a line already entered:  place cursor in that line, type ^OF.  To temporarily set left margin to next tab stop: type ^OG.  Margins apply to text subsequently entered. To remarginate  text already entered: set margins and use ^B.  press space bar after reading:  ***** LINE SPACING AND JUSTIFICATION *****   To set line spacing: type ^OS. WordStar will ask for line  spacing. Enter a digit 1 thru 9.  To turn justification off (for ragged right format),  or to turn justification back on: type ^OJ.  Line spacing and justification settings apply to text  subsequently entered; they may be applied to previously  entered text with the paragraph reform command (^B).  press space bar for "Tab Stops":  ***** TAB STOPS *****   To set a tab: type ^OI. WordStar will ask for column number.  Type column number and press RETURN. Or, to use cursor  column, press the ESCAPE key. To set a decimal tab stop,  type "#" before typing column number or pressing ESCAPE.  To clear a tab stop or all tab stops: type ^ON.  To tab: type ^I, or press TAB key if present. Tabbing  inserts spaces to next tab stop if insertion (^V) is on.  Tabbing advances cursor over text if insertion is off.  press space bar:  ENTERING A COLUMNAR TABLE -- We Suggest:   Set a tab stop for each column of table.  Clear all other tab stops.  If not at end file, turn on insertion (^V),  or use ^N to make blank lines.  Tab (^I) after entering each table item. After last column  on a line, tabbing will move to first item on next line.  space bar:  OUTLINE FORMAT TEXT ENTRY -- We Suggest:  Set tab stops at desired indentations.  Set right margin as desired.  For each item:  Type ^OG's as required for item number indentation.  Type item number.  Type ^OG.  Type text of item, without using RETURN.  At end of item, press RETURN. Left margin resets.  Press RETURN again if blank line desired.  press space bar:  ***** RULER LINE *****   L----!----!----!----!----!----!----!----!---------R   L Left margin (set with ^OL)  R Right margin (set with ^OR)  ! regular tab stop (set with ^OI, clear with ^ON)  # decimal tab stop (set with ^OI, clear with ^ON)  - other positions between margins   press space bar after reading:  ***** PLACE MARKERS *****   Up to 10 place markers, identified by numbers (n) 0-9,  may be set in a file while the file is being edited.  To set place marker n at the cursor position: type ^Kn.  will display to indicate the marker position.  To return the cursor to place marker n: type ^Qn any  time during the same edit.  To remove the from the display: type ^Kn when the  cursor is already at the marker position.  press space bar:  ***** OTHER MARKER & RELATED COMMANDS *****   The block beginning marker, ¾, and the block end marker,  ˾, are set and moved to in a similar manner; the  text between these markers can be moved (^KV), copied  (^KC), deleted (^KY), or written to a file (^KW).   ^QP moves cursor to its position before preceding command.   ^QV moves cursor to start of last find/replace, or to  source of text for last block move or copy.  press space bar:  IF THIS DISPLAYS YOU ARE USING WRONG VERSION OF WSMSGS.OVR ext for last block move or copy.  press spaceg edited.  To set place marker n at the cursor position: type ^Kn.  will display to indicate the marker position.  To return the cursor to place marker n: type ^Qn any  time during the same edit.  To remove the from the display: type ^Kn when the  cursor is already at the marker position.  press space bar:  ***** OTHER MARKER & RELATED COMMANDS *****   The block beginning marker, ¾, and the block end marker,  ˾, are set and moved to in a similar manner; the  text between these markers can be moved (^KV), copied  (^KC), deleted (^KY), or wri  COPYRIGHT (C) 1980, MICROPRO INTERNATIONAL, SAN RAFAEL, CALIFORNIA, USA. ALL RIGHTS RESERVED. WordStar release 2.10 overlay file number 1. overlays for no-file commands and editing  NOSEY, AREN'T YOU?   PDý>BE>?>O>Z>c>I>08y>͍>@2>͖> i>͖>i>/y>:>:>̍>7>>x ʡ>/{/:>><2X?>2<)@*R=>6#"R=B[>D?B *C 3C DC8@,B  @ :?@:?-C6#J? J?~<`~CO?s?H@*f<:j2<2<:{@>@>čA#*S ͍A"h<"R={2j2{<AA:<@3B!%<B#|k/"6<:.<_ C*6<|*9>/ C  >͉C!#>+D:O|kjC!oC/yKʁCyOҁC#zx!a:5*=+D×C*4<*7>+kC*8)SC";<*8+DñC͉C&!aD!,!D> (D>!,>*<-,BGDͱB+D!"  Ln~an#.:*? п́#~+:Šn~Ҋn@##|7sm"lnʤnnhmÔn`m$lʏn!8ʼnͽP:nnͽN:nhmén!8 6á8!z6>l!l!7+o:8o!\+o!lq+o:7'o!<+o:G6! =+o# _ͽ\:'oosm&l`m(lIoʎonlonhmToͽV:q$ͷ&!ʇo#~͂copK>2l:7!G6!8wGOy*@98ͩox27lqNl:\2l:lq2\3ͯ$:8§lͽ9?o$ólͽ9EoSo&lqllol8l282O8:+26:6+).m:t8m3\!2l͂lq!eÂ5m&Nm5mm!D9K*D9yLlq$!L9xMͲL6LyhL6L!"o8!L9xJ*J9͈EdKcm6LͿl:7,ͯ$i$9͑0̀ ķ&:7:7,Ám9åm9>2A7G*7|!:Œo:7uoͯ$:6m!9L$:T82V8&$\!N6m,l2l3$q$*+2*6"g8"!8*g8!L$#+w#W$~OnuncnFnncnǴcnxGxL$}!++)ͽ :a$": nկ {nnͬn.“n#ͬn ʨń7nʿn ¬nn¸n>  n~n#.:*? п́#~+:n~n@##|7ͯ$:7ėooi$:'o:7Đo:oi$:͑0̀ ķ&:7*oi$.lEoÑ0ͽ0l!d6q$ͽ*lio!eo#~Âq$ͷ&*:9*L9/!)k?!9"7!8Ûo!\< _7?]n JlOlUl4EDBACKUP$$$BAKNEW FILE>2A7`l͐l͟lMm3:L6:b26>.m:2626:I!چl~<26>2L6!qe >2qe!l]ʼl!l]l!:"7-!q !28 2[2h2k2}.*!9"q"L9l*:9*L9/|<2828|D!"{8>28#m)"}8*m28!B7wȷ!  >2%!:7!G6w!\~zwlq:lrmw:\~m>2s88 !l~8!l !N6\:s8ʽm6 #:lq !d6lq!6~:s8lq> (&\>m2[m2t8ͽl$uq!l:A7.m:+26:6+);):7Hn*n!:"7:6=*7!a!6Gn5!9"7m8!z6#$>$q$O*+2*6"g8"!8*g8!L$#+w#W$~[m͉momomGy=ʁmxL$}!++)ͽ :a$": ma$$: mկ mmm.§m#m ʼḿ7mm mmm>  m~m#.:*? п́#~+:n~n@##|7:q!qʛnf!qf>(&>(&ͧn!qgqRNzWqbNof!@9K*@9ͳI2!qof}nͧn}nDn!qfoq&9gʘnEÉn}n!qf!qfo7n*>9*L9/*qk> (&2NI&[ ixg"q8!B9I*H9*B9w# n"B9z̈EEn!o!qf:q>(&:q>(&:q>(&p çlïl2m#9IWWFIND? REPLACE WITH? OPTIONS? (? FOR INFO) *** NOT FOUND: "REPLACE\(Y/N):  ???6"2m>ôl2m>267O#$$ͽlq$!6#247yl>,ͽlq$! 7#247>)L$*6!77 >297287:47/m!ͽl!)7 #nl5mԸ':@7Hm:77g"g*97";74n&!qͬf͚mqm*;7|!l!lR&:67m*;7|ʄm+";7:=7Qm&:77LYL2͞ ̈́nr͞oڲm̈́nm͈E&͍mңm:77"gg7 :77:57+n:87$nĞnm:77:57*H9BÈE͔d:57*H9BE*29! 7cnͮI:77:7+n[ 0*F9IÈE!6r:>7Incn[ncn>+wy<<+w#y257~~nwn>  > # fn+q#:>7:77–nMÙn_M?ÈE! l"_8\2.'0n@Yʺn>N!6͂̓ 7*-9~͊ $̓ *a8!$n#!!n&ͷ́n͗ooo#?oa$z97B"o-(o>277G6o>2@72=7N@o287WKo>2>7UVo>2?7> ͽ"l͂ͽ$lq$7~͗o#bk))ܓo0_ܓo"97ro!0?::77o!H9o*H9oÈE!D9o*F9IpòoKGyOxG-pp p#o+Wp#oo#Bpp #&ppWppѷ p 8pWp# 2p2p7 Mp+Wp GpGp7ɮ`p jpˆpAډpG[҄p:?7ʄpxxɮʺpʪpȮ>ʸp~͗o>Ҩp~>ɛmllll(l:lÈlÙlmTMbM7lͣ+lE%cͷMMMlͣ@l#F*+q:%8O~`oly\olol Zl~~wy\…lDM2q6͇RzfTMbM͋͝dËl:Lq*6Weڳl*6+++͈hڶl*6"62Lq!qͱf(*=8"08!:8{!Tal!a"38>2:8!"08:Q8*]q:\qlq.M2m!qg*`qTM2mm%c!qqa>2Q87ɯ2bq{͹mm6m{͹m*m7?Cmͧm{xm͹m͓mʆmͧm>2bq͹m͓msmE7:bq7͹mSʝmD m͹m-7+q͏N"`q#{ʿm&bM? ܀ ڿm7*mɾ#45mo3OmemtmÎmnJnmmmmn nânnmm9s{IQ0 ENTER space OR NEW LINE SPACING (1-9): LEFT MARGIN COLUMN NUMBERumn)? (ESCAPE for cursor col RIGHT For decimal tab stop enter "#" and decimal point column  SETJUMNF TAB AT COL CLEAR./; A for all)? i$?lͷ͂1< 2)!28~6qm6(!D7Alͳm2626<<<26===!6w!6wzo(=xm*"q|}m>m<>! n!!{!"{!#{!${!%{2!&({:'!(m!9"7El!P7oͶm_z#6n_n_n(y!5 ÁnGl!P7Áo;nͶm_{m!5Bzn)))){/w!=6+ʙn~ʈn™n{25(xgon+E!qͱf7o*eq*6/*6*cq|n[}n!qg> kF-n!qgxgoo+͈E4o:cq~m:eq=͘m(nTM*Oq"cq͎g͊7͟gͯo *cq"OqTM*Oq"eq:Oq_͎g͊͟gͯJoBo!1n#6n-]nBoÁo$L$#Gy¯ó#ʭo!¯oW#́7oó{ƒo҃o~:0#bk))BoOpl !/ COMMAND? WHAT???   NOT FOUND  Enter name of program you wish to Run,  optionally followed by appropriate arguments.  Example (shows disk space): STAT :7m!F:"7,/~k!H:m28>3!|!  !͞!J:m!~!"|~2|!=8"|ͯ$:6!lZ$:T82V8&$$a$l$ͽlL$!QpM#ḿyoңmͽlwm!y6C#6O#6M̞mͽlwmy͒n#y͒n23y4y~# myL$!+~w2Z8͑0w="w*y A,/! !5!~y/++/.!yy//!yy8!5|y8̓oo!~5|8! Dկ ˜nfon.°n#n ń7nn*n nnn>?nn> n n~o#.: пկ ofo4o.,o#4oõnRoGo 4oRo@o>  Ho~]o#*?ó#~+:~o~~o@##|7~#fo"o#/"ooooooog*os#zw+|o~w#+|›o*oF#"oxG o8 Hit`m a66m3fmm6`mٳ `16lٶt found *** *** file  bad (too big ??!@&*) *** *** file  bad (too short~$zn++Ts#r+##s#ra++nT#r+s+r+saT8ɛ{1g|*"g|*"i|k|q{9o|t{y{ʃz{ʃzڃz!\!yt{!4yt{@{{>1e|*g|"*i|"!!k|l{!x|l{|{z!|{ͦ{!|{{ |{||$:||*|:||> 2]!|{ͦ{!|{yʁz {*g|>2n|{2n|x|"{:n|"{1e|!|{Áz!y"*!={l{!!i{l{!r|"q{${:|x~# t{^#V+~#ʕ{͠{Æ{!~͆{Æ{O> ì{2n|>*_y;{{N#!Ϳ{5x>4!||!||!||!|!|{{!|{ͦ{8d Hit any key to return to WordStar: Replace diskette with file , hit any key: *** file  still not found *** *** file  bad (too big ??!@&*) *** *** file  bad (too short) *** ***  found is bad or incompatible version *** ^C Cannot return to WordStar. Replace system disk (if removed), Hit any key to return to Operating System: WS.COM zo(ll:8:77E4>ul:7ul!7~6Cl:73 >2 <ͯ$:8]lͽ9!6ͽ9m>2 <27/2 <27:8ao<! < G6!ͯ$m>$q$O*+2*6"g8*g8!L$#+w#W$~Pn~ndndnGy=vnxL$}!++)ͽ :a$":na$$:nկ „nn͵n.œn#͵n ʱń7nn µnnn>  n~n#.:*? п́#~+:o~o@##|7͘$*6&!bkL$#́68qNʲEڵE*H98"H9`i ͧGG>ͧGGG:GG*q͙Gs#r!"q*q#"q*q&)*qg:'2Hq|bk+5\:kq*q*q:'HͼG!GG!G% HHLHTHPLiHMToHMBuHCP0HPAH͗% G> ͧG*q#"q͗% H>ͧGHGY%H͗% H*q*q#k%HHY%HH͗%g}2 qÑH! qxH!qxH!qY%HH͗%vW{͘HͰH| HO: q* !f q*q*q* q/|H`h: q/<_H Hi`"qa 2qx%I  II HJI`IH:'IJI`I3IH:qOqI*q+"q:XIJI>2q!q454%*q+"q*q+"q͙GX"q*D9/A|#O ʋI wIxMI:q1I*F9NͽL*F9qI͋Ig2OI JIIºI ͐F  *F9*H9k!F9!F9KxaͣJz{JKI>G&>28!D9jJ*q*u8k-J"u8!H9jJYJ/*w8kGJ"w8*y8kUJ"y8a*8*~/K`i)\wJ!<9#k+ڐJJͺJJ!J9kaJ++++ÓJ!:9K ͺJҫJ####K9kK++Ts#r+##s#ra++KT#r+s+r+sa!H9T86KͣKa:8GO ͣK3K (KaKdKa!n84F!8HK=O:8=GdKaK VK`*o8*F9/*D9k*q*u8klqҎK;ÛK$*u8#"u8"D9*J9ͲL»K:8WIzLK*q8*H9kڻL*w8YJkK\BL*y8YJk8L;L$*y8+"y8ͲL"J9;G+~# %L> .LaͲLͣJ6KM*}8!L9MhLͲL6L!L9L*J9́LԚLwL28"J9 kLaK&87İ[7ĩ~ʫL#œL7>>:[!87:kq76LK!D9L*D9&lqͰaK"D9 LaK6K*}8ͣJkM*{8)$$MMO>G&xJͣJk*M)|Lɯ2 qNDM*H92 q/2 q*F9NM*J98K*H92 qTMxlM~# ! q~6ʋM2 q*H9*J98xq͏N9L2Mx7*J9ɯ2 qN*H9ұM*D98>2 q*F9îMͷMxM+~ ! q~6M=2 q!D9T8xq͏NͽLͣMx7RNg>_q:~EW o g _ Wz}|{ wN*F9k*H9k>G&͚NcNqNʽN*F9ڭN*H9}o|g_P&!\öNRNN{O>G&z$O*H9*J9/#k+NYLN*H9>-O<>G&*F9*D9/k$OͽL O*F9z7>2 q&:H!EAO~=2)8=2,8=2+8 ]`i"-q "/q͠H>28a/]P*38:kʣO::8ʣO!;8~6AP0͛_ڟO:98*78*387O2:82;8Oͫ&*y /OyªO!ax ڪO*38"58"38"78y2>8x2=8:.8!:8O2-8÷/qRNqbNñf:68P.'$:T8> l2\22T8[ ͯ$,2Z$:T82V8ɯ2T82O8:6!a$9M _M͈E_MͣOPmPZP!%ʊP ܀ %7]P!?8~6%QcTP`i+~+++°P6! ^#V{P\?Gͱ2G:)8P>Px=]MTckbN7>~\͇R/S+Q*-q~Q[|RQ] +Q \#SQ*S|RKRP͝Qq͓Q{<%cq͓Q{%cq͓Q{c[ 2Hq:6!qͱfGuQ!qg*/qDM9gĈEg26:Hq*S+QRN :%8]`i"+qRNmV:%q2&8*&q" q""q:(q2q[ :q\Z R:q=]!ER R RRNmV*Dq*"q""qQ>?2$q!@8~6/[ #R#!̓ !:28=2R>R9R7>R(!285whԁhZ|RcT\ER!+8!HoRͷZ#SKR)\͝2*SKR>ÄR:)8]2q:qW!ER! 45ʧRYTÑR=6++++!ERR! ~ʷRYT!ERRRRNVSmV#N S͆\[9TRzbg 整9TMTzWbN͆\bN:,8=,S>]! BS~wSS MS~SS_SVSMT0T1SRN:q!EmV MT!E$TzS $T $T#NR͆\ SmV#NSZ9TMTR:q!E$TåS9ToS #T#NS$TZRS͆\ T$T $T WbNMT!ET$TbN0TbS:)8 TʮU:DqU/U:%ʾU4UU@U:!6T̀ NU:%pU>^TʮU@TʮÙ UUV!ʍU;U*Dq##"DqaU> &™U>~ʯU!Gqw#: qU*Bq"Dq*@q*>q: qUɯ2 qz2%q*DqzB"&q:Gq2(q!6! qF6TOx2 qy*Dq V*Dq++"Dq͟MM/V͚NͷMEVxbV+~  2V#xbV+~ # +HV>M#1qbNz2:q>29q2=qvX.M> 2Fq!"DqU:I_*29::q`WìVTEW:Gq! qW:;qVV{=VyWO VVw# Vxg{_zWy8O:;q2;q">q"@q*Dq"Bq*>q!;q5'XbMVWʴW ʮW~W ʙW ¦VÐW+2 q:pW W:pWW:iWW 2FqiW:9q29q#,YʐW:iW:W:iWW,Y> ʦVTEWsW ÄW:÷W:iWbMW WW,YWW#:pW@+> O;U*DqzB"Dq5q:9q͏NwXX6Y:GqGXw#X:Fqw[ 5qRN:>ULW͚NvXW22Gq!;q4aXa o  }!;qзXz!=qد2;qz2?ͫYiW͉Y`i{=ʴY~ʴY#ͫYw#͢ÑY!Gq!6:iWlY:':(7XZ9vYLHYPLYMTYMBYHMlYFMlYPClYPOlYSRlYUJlYBPlYCWlYPAkYCPlYPNkYOPkYHEkYFOkYIGkYPFYOJYIJYLMYLSYRMYCSYDMYSVYAVYRPYDFYRVYFIY!a1q͟MM%gZM"YkZ][ Z ̠ZMT!)8Zg2RNmV *q͑ͱ2͚\h[ \×\[ͱ2[ì\]!)8\\2h[\×\][!)8[\[W:6[:{'[þ\=[=[!!{j&!!:'8W"͞ *+98*)98 W͒\:6¹[:t[>[þ\:+ƒ[:T8!W8ʡ[:A8ʃ[2O8e)(]"> Jì\[[!t1[:'8W" [||g}oqPY!r8!pg2`iq\q\PY!r8![ \=+\͚NH\DMRNb\ԥ\g2cTԥ\K\r:EW |\|\#Nʋ\҆\i\7 †\::,8 ]ͥ\ ~q!E\:E ]!E/\W:Eq_\ \Gͱ2Oxͱ2!)8/<ͱ22qog))r DM!r [}:)3]>!6FO:28A] *_8|L]:7!s8O!\ #~ g] _]:I'}]'!N6s(,Yʡ]B(E*q#͊^b(E*q#͊^]B(E:q_*q-(͊^:$q(*_8| ^>+'p(*29*c8/e."a8:6!28'~#^>B( E:Lq1^>B($E=^>%B("E:)S^>0B((E0(`^g^+|g^xʊ^`i`^(Iz :^8:\8W(O*29:I=G:&^:+:6^_{!6z^!6w# ^^6+i,ä^> ^w#^6 i,z2]8>2^8{!6,__\:+8] àZ:+!E8\)*-q++++~a:%8!+8`Za:{!6]àZ*-q~͝2 \*Saa bMͣ+!6{:6:q=%cuc*F9++͈E>2q26a͸'P0*6ͷ2982/8;'! aNbbÔd!Iq6298-'b!Q845%brg!#45'b>Nb- ~:O8/!Iq!:8O2=8bcgG1cxGܔdlb!qJxkF ܔd!A85bhʔd2Q8_Mڲb͝ ܔd1c:6”d~ ܔdE*+q~###b~bw+w+w###rkҵb 1c!qͱf!qgM cMc#͙c!Mq4cF*"q+""qg*q-!c!ę!"Lq"Q8:Lq:67:q=ȷ%cͭćhYc!28~6(!A85:)=mc=cc!645ʂc͔d> kF> kFTMbMڤc›c+ J5\w#ͣ…cÈE͈EQ\xc:6!6w(Ը'͞ c[=ćRaeÝ2Ը'͞ c)\*S] c[́Rac\g?<:q%cM`F@d*+q~~wÑd_M͕aO͎d!q~y@d4 :Lq!Mq~Td5!qͱf!qg> kFͱf:qg_MͩM͓TMm`̏`%cEzf*+q:!q¨d: q Ұd~~w++++~~w>2Iq%cd:Lq!"q$"qͷMMd͙d#qÏNTed!""q[cz:60eTM*"q͈h҈EbM-e+͝-e#!"qqe͈EQ\> g:"> lb*"q͈h> kFGe*"q:"le{_ÎezʂeZe& 7 [e{teͰeZe2Lq2«e*6͈hte*6͈hZe 7ȷ{!5B~eo&" q*+q~e++++e~`e"+qDM#`_.MfÈE!")q* qU|f{bM+Bf͝#!)qq#:!q?ff+zf+͈EMGfͽfܝ2~###f6?\ͳf?\͋f!qw2a:6qRNz>q >#N>6qf6#w#w#w/}))q~wwf~~wwffͽff>(&>2WDM9gaz&͈E2n8g!qf_M&2!]N͈E"g[ RN{pg{\gTg|kg!kgkF 7> GJgOͯĠ2!"qyq́hͪg>2Iq2Nq͔hohhQ\oh*Zq*6/"]q+|ch͠k:!jQ\%cjQ\9h͈E2Q8*"q*6Èh*6*"qzʑh7?{xgTM*OqzhbM͊7ʽh+sjh~w#͟gÚh͈E*Oq*6"Oq/ErkTM&q>͏N!Qq  4ih> 2Yq:Uq:Xqi!9"74i!Yq5i*Vq"Zq*q"q*q"qnjͅj Fi͕a7͊7Ti>+w#_͛iW*Oq͟g*6*Oqti#͈hҔi:Vq”i"Vq+q>͏N:Vq{jʲizj>ʽi{ͯʶi2Xqzͯ>G!Qq~p#wzͷxiO#~q#wz2\q*Oqi#"Zq!Uq4+xq>͏N=j: q͟MMw2 q&q͟MMW&j6.M2njEjͅjWͯ,j͊7+͈E:)=_&>kF> kFMj&*6"OqErkTM:Nq͚Nq#N7bMʕjʕj+͈ETMbMڹjʜjQ\µj͕aÜj+ͿjE_M͙ zjͯ+6 -:RqG:]q!gq64j!TqjwO k!_q4 k<552hqx!Tq2iqq.MbM`kk&!Rq5_k͵:gqBk!Tq5Qk!hq5Qk!iq5Qk=<kckTMk:]q͈E!]qnk~G~w&xk>OxGkͳIrk:$/!Nq:Rq!!]q3 nlm{n!! k8l:81l>3l!9"7!@9Pn*<9"P="L="J="N="X="`="\="Z=6#"T="R= 6#"V="^="F="H="< s#r" <>s#r#:7l*@9 kl!v:"7">92>2<:G6m::l>2<=/l2<2<>m:>m:>m/2:G6! Wm:i!8i"_*]a"_a*?a"Aaw*Qa"`"`*=aw*daw*Sa"Waw+w/2_2_:2_>27:7ʀ 3 ,3%nͱ *F=3w#6*H=w#62-<:<2.<:2/<2<*":ėC!%<U<@!">2<[z?*R=S>>6#"R=!&>!<455Y?D>͓>>E? /C /C `??!B T? ʉ>6#͵> ͯ> #ͯ> ¥>~ɯ!<4͵>~<`~Cú>!<~X?~62<?2k<*h<͓>>#!k<44ͪ>~>"R=͙?*f<:j<?:k!<`B H:<̔B:<:%Dy!a %C+C *C*C!?<4x!:<4:<ͳC!a:=CG]C̀C!"<[:[nCͩC]C:=(=LX:Ox 3 O[[:%=7=Rd*<#WC:?<=2?<> ;CóC:=C͗CC!<C6C6:<ͩCCD!<4:=>2<ͩCD~D5>KC͗C!<~4:=:<?8D!Ca:<Da:MC>:zB:(>><2[2<͇?*R=[>¶>6#"R=!<>͢>hC C C C?A k? ʘ>o?ʘ>C6#ͨ> ͨ>~<`~Cí>>ͦ?*f<:j!9BK/!%<2z~6# Ox@?"f2<2<:{ @ +~<.@*V=++~*<>B@>B@>@#*SO#x@{a@> @"h<"R={2j2{<MAMAMAVAC'A2<͌BB~B5>1BzB!<~4:=:<? C!Ba*-<&(MC~#CPY{C*/<&!,<CB<=BAC:z2@<2A<>>">5>ɯC>!\=) K>w#"\=!\=T/zK>6#?>ͨ! <~6!Z=) ҁ> =2w>!|9"7͠K>"Z=N>͓ *`="Z="\=ɛ B:(<: !a æC:<!a:=BGCBfB!"<[:[TB͌BCB:=(=LX:Ox 3 O[:%=7=Rd*<#=B:=BzBڶB!<¯B6¶B6:<͌BÖBB!<4:=>2<͌BB~B5>1BzB!<~4:=:<,,O -  COPYRIGHT (C) 1980 MicroPro International Corporation  MicroPro WordStar release 2.10 serial # WS500108  Lear-Siegler ADM-3A terminal  Teletype-like printer  No communications protocol  CP/M List Output driver (LST:) "=8f4PP=   @ sB@ @..Y[]{}AEIOU.:+-JP aJacc d d+d@BBDtdarg:a d Cca  BHf KIf 0Mf 1Nf 2Of 3Pf 4Qf 5Rf 6Sf 7Tf 8Uf 9Vf     D2w0         )       "$4& (*,.068F2       (EU)\)D20}b   -__7777w} nwWx2z7W:Go~~56   YZRCDTTVV2CCTTBT2STTTTTTTTTTCBTTTTVUUUVUUVVSSVUfVVTVVTUVVgVVUTVTVUTTTTTTSTTRRTRfTTTTSSSTTfTTTTVTVU!>6NIQYdXfjly%27?QXivYN @@@@ on () off () INTERNAL ERRORFATAL NAME OF  TO FILEMERGE-Print a file РԠ Š *** FATAL ERR F25: NOT ENUF MEMORY $ File  not found. Menus &  messages will display as @@@@ only.  WAIT  PRINT\PAUSED merge-printing\ \editing\no\file\ ڽ ׽ *** Press ESCAPE Key *** INTERRUPTED***  E*** I***   F: G! B~x7Ɂ*<:27i[ i*7|/͓ i* x:<*P="J="L=ͨ*N=k [ <ͩ "L= ͓ !J=T8Tk> > * W_ !2<{ ȯ2wͱ n!<>( !<% ñ !<@ !<@ !<@ !<@ O >( !<H !<~ H > B>2o3w#͞%  ͞% w#- 6> Y% ! > ONOFI%% }Y% &͞%9/& rh !I6_d&ax>2G:I6!< !<͡*F=ͺ!<͡!<á*<*2<>*<_:<<=* &7*H=#~+º:<}:<3! &͢ 2 &> '#~+}:<3~ #~U\#~U#*<͢ :<#~U  +&!vo:<}D>:<:!Z>GO o>^#~ > Gm*<:<ʌ/|: &> Gî> &+|#>Ä!".g|,-:G6G}> GG!<~6!I6x!<^3f x!g2GO!<> C>~M>- ? i!<~<> ?@W w!"<2 2*<&*<"<**<> :H6*<|:<* G*<|ʮÝ @C̀ 6?!<~5^@@!<4!xt:G6>:H6/!J6!<6> ͈̈:<7*<*27Ó &͓ iª:̓ ²iē :G6͖>:G6>:&:< =!"7"7<=G:776*T=~76p#~<`"T=xG:7x* P_x20<:z<*2<ʱ*%<:-~5*<:žx ʞg> n> ڞ!B:)<~ˆ=<<*<-ʜҚ<>P Ix_&.y2<:<!~<4!<4x*<:-2< :<=|g}o|*<&*<*G  +~ x 6# $%%$o>g/DMxɅo|gg}o|g^#V#~#fo# _Gzt{xɾ~~/w~͙#Á à ͩ :.,;?!0?:[A?a{ɷ @&N#w@w#6:#6 9 46.#:6 Dw# 9Sg2 [{:m|S|_ {26_|=!•sn)|Gʵ°HGxy"!8.&*w8"y88n):88͝2*6!!ͽx9!:8!8~68<>.&g!Bɷ (&;F>!#X |G!"X}O)|! ʧ!!~6w<§x7ʰQ! q#~w&^#V#[ J^#V+ѷJ~[ u#͢:8298͞>28!94!N98ͩ!9́́*N9*kC!P9"7:8M9k?:kʱX%}):9=!;ʞ=ʛz29!:8ͩگ[ >Bͩگ!:B;k~!L͑0ʷ:19*-9+##+!<~/͊ $͞ ~͊ $ ̓ -6#~<!Z7"X7(:7/3̀ [ <*X7~Ͳ3*7*7"7kU2O8:7/*6.'!ʏʏ͙~p>!J>O ͝2*X7~*V7~Ͳw#~<®!Z7"V7:6/!:O *-9+w*|6!2#8:ͺa>:ͽa>!a*Byę!Z7"V7"X7P  G:6Ox_:I x  yON#F ܀ څ_p+qʀ À&![ *29:IO&:H=!µ D":6#  + `c"ͬ ͞  !6 ͬ6*6>+̬,&e":6 ͬ*6-e">u͑ʊJʷ !>B:7PNR:7T:7VL$ͷ&ͯ$G*!8*!86*29G͂#͢^#͢V=BXZ++O:6Gy_f:Lm>~G. ˆ> ͦ:6xã Ҡ ʠ ʠ>^ͦ@ͦ ڬ:6 z Ԋ O ͞ !6  4*-9w# 6*/9+4:H= :I*/9B"/9*-9B5*#9͞ *I&*)98&&> -C O:] yO:u y"*6g2> Ou ͊ !6 w!!:6 *-9~G:19w2$8͞ "-9:6 !$8~ 5*-9~w219*6c":T8o& !&!*6kc"i*%8:'8o*6}9!o!'8:Y!<=&=Q!I!:6~<=#~O `!!g2:H=!:I…!=O":6!~ £!# –!yB +~ ʩ!̓ !!m~@!!A> O !͞ 6 # ! !~!!@!:6:"":">2626'":26ͤ!@!]"͞ *6À"6"!@!ͧ*H-&"6" "/9:6!̓ ͐":H!:d"*^\:]¥"!J͹"!S͹"!X^!^!:`G{O O I"d*#9*/98*-9/o&U\*#9:IO" "*+#}!++)>2P8*6"e8ͷ $ $$&!,#T#T#c#*e8l!c"'#!~y#y#y#™# $ʌ#ʌ# ܌#*6%! ¨##Þ#!µ##-#!#45#>!))#U)#\)!̷oy^͂>IÂy <2P8+q#ͯ$:6:H͊$<2Z82Y82X82V8ͯ$ >\$y$Z$$ >!69!l2×2:U8!V8$~:6!)8!"X8"Z82V82U82O82S8!͊$2T8×2͊$!:$:$:$:GOi%:7$ ỳ x$i!͞%2%͞%_:%W~C%#4%###$%~.%#^#VE%&͞% I% I%!I%ړ%ʕ%0ړ% ғ%T])))_͞%ڎ%ʐ%0ڎ% o%|7͞%×%x 7 7 77?999999999999999999999999999999999999&:9*:,:.:0:2:4:6:9::<:999@:B:D:99!J&&]"ͽ&,!&2S/:[82Y8!͘$&ͽ>ͽ21q$2Z8:[82Y8ͷ!—&2V8Ϳ$a/!#8~6*X7~1!:86:8ďI!!R&i:#8&o&)%^#Vo&DIͽ:8/!7)'5:$8z *6! !ͽp!̞ z *_8|!7D'[ g227*29"c8͝':7^'b(r:8Œ':7ʆ'':7{'b(tb(v!6s(b(x)]:IO'!õ::8*08'*-8':/8(>':=82-8*29"c8͝'O×'G:IPx''*29*c8/'> (}(| (>^(@!6\#(> (( )(#*49++*c8wk?(#"c8:7](:)Z(:6!28''^#V#p(~#(s(:&!+!8“(2]8(!]8N6ͱ2q!\8FwO(:^8(:&>(2]8!)8(2]82\8/2^82^854:I=G(= (y2:6!5)~[ :8͕^:]8͗2an):+/+)>!+Fw>2O82D8e)w)2B8 :)8Q)2C8:E8ʆ)G:+:T8•)o#}!W8w=Ң)<<)x:+;)[ ):D8=͗2aw)!W8wG:)8 )!B8e):F8B):B8!T88:B8W:C8;)_:F8!E8<~*:G8~** +:N8/<_y!E8;**qy!F8m*<2F8i,z<2D8[ !L8:8m*:E8m*z2C8{*z{*!C8*2D8*29"c8:E8O:G8G/!zp(b(||*c8 "c8&x/*!~p(y**>B(:I':B8Wi,!P8452G82N8*89"J8:L8+2M87\\,ͧ+:M82L8p,a:IO *296 #=+#7+ x G +:G8G*J8+F+N 2G8a~++++DM>2N8>.!7,### k+#~‚+  +7,~+2L8*89"J8*696+r+s k+:M8+++~wT,ø+*H8 !3, ~.,#+ ,~$,&,6.#w#w#> *H8BAINuHEvREwCOxOVy$$z7c"H8&>2M8j͑*89},#p+q&+F+N <Ú,#Vp+^qBKÚ,+V+^ ov,ڋ,˜, ,,à,!915>,!915,:7!,3H"*525!9"5=-̈́.:] -3$a/>/:K6,:U7,*57-(&a/-Ä.:]!W-!l ,!4~Ļ7 !L6 d!7 :26-!V.!!!S!m!ͺ-#ͺ-#ͺ-#ͺ-:`26:c2+|26ͽjd!7 :26-6"Q.:6Â*."49:II++"29"89a."69"9"!9*:6).*HL&bj ./+#"#9"-9*H-"")9"+9."'9/"%9:6*Hm-Y.|!]p.>o&))))>.go/2ʹ..>2'8:H2)8=2,8=2+8.:;9*L9>.& 8!!6~..6!n"7*\":9"<9">9*>9"@9"B9"D9"F9"H9"J9*!9"L9:H'/y'/6 /:I@'/'/~!9"7>.&!* /,/ 5!"o8"q82n8*52:8/2?8S/!"_8"X8"Z8:T8͗2!m/ͫ&>2P8!7~/++! ,3:8hO*w/د283;':7/*<9">922P8|=4/=S_/^#V,32-82.82/82V8Ϳ$>2P8]1͋0/2-8G:8(0x t0?G~t080+0#~x0:8<#^#V++P2P8͋0902.8O~x0###~t0#]0d07#^#V|N9!E$0*6[ \20[ ̩00Y8ʼ0=!ͽ!$0=!ͽp9.'>2@8\20̓ #!!ͪ)}(:8 1ͱ2=!%8\2:8ĀZ.'[ :W8!D8wo:801:)8o:T8Y1!B8G1!D8S1o&&![ l!<31):Q8!A8\26<:8G:6O*7|!O8ʃ16:Q8!S8ᠡʓ16[ 2;'ͯ$:7!t9:7!v9:Q812S8ͽr91x/1,21.!"%8Z$:T82W8:Q81!S8~6!r9*7|!"7Z$:T82U82>2O8!7~6ȯ2O8:IP92!N9:5̓ 6"8͝22O8a/:8ďP!T8u2w:8ʅ2:+8=2w~=!B8e)!\8(ͣ2ì\ͣ2û\:8ʭ233:T8!W8w!D8w!]8w*>9"@9"B9>2?8: /!28!7 ! 7!76.!86/:28ɯ2727~#28~28#"8O3}28|28"8O3~#28~#28"8:8=>$G&{3Ē3i`)`4^#V*8 *8)))f4N!8 :86i`)`4^#V#^#V#E4~#fo)DM!"q#p#N#Fi4 ~>)(& 36464 3~>'(&#:8>,(&8 >*(&w!84>+(&# 4^#V>((&!8:8wͩ>&(&Q4!$~(&͞>>Ely'76'77 77277#77`7g77n77'7,7]7  ******************************************************************************************************YOU MAY NOW REPLACE THE DISKS YOU REMOVED EARLER.******8*********** FAILURE *******************ORDSTAR HAS FAILED INTHE DETERMINATION IT AS ATTEMPTING.PLEASECHECKYOUR RINTE AND SYSTEM.IF ALL ELSE FAILS RESET OUR SYSTEM AND TRY INSTALLING AAINoDTTO RERY THS OPEZ7Z7???????????!*8!S*8"8You are trying to run an uninstalled WORDSTAR.Plea*(&w!84>+(&# 4^#V>((&!8:8wͩ>&(&Q4!$~(&͞>>Ely'76'77 77277#77`7g77n77'7,7]7=COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# z8O!B N#N ¾SP.* |} !9":q!"28!"9:] !í 1͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  # ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  ! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_)*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_E  RELRELSUBSYMCOMCIMHEXCopyright (c) 1983 by SLR Systems, Butler, PA**CHRIST is the Answer**TD?DD۽ؑdkBdBBWd>ƀPPqPPj  ׄ0( À04Ld$ Oay󀛱k"4Þ[/F+B':@8زڲ:2 _DBkDBgUz.PB"ز@'¶ʟUBBa敋TB>{BDB>QQ&lX0 B@DB>4s"o>*soa9TT>B>)`n"o> s.U"o>Xe.B>lT{B"DTT>B>)PXPHPP | J@z tD0f"o> s.ۭBD9FF !dDcBD ~"$TD8lF4lBDtD.f gDD, d0TB>@ۑkk 0Uz0"KBAAAՁ.{B XB *'"@*DBo:R.ހ&9ҳ7@b`$ۭՐ XۥQ HaBBBa6PPP_ |dU> H_=: "BXBAAA$dU>6F쀛 )$DBcs_B ډdB|dOB|d@&ķ:@@"ҹ6@T>>k,DNB T>>k BT>DqdBdV>">XG_FFFBB'F#Fkdd> a/F+۩5gd@ 0kB |!2@"k" & 2tB $ƀPq& &< 0X,^$@ &ӐUP@ &@ƀ0ztkBPT>>k; ">XBWoPPP_ ">sxLl0Pt`F敊|d@ۓ~_ 5T>B>__ܓ87@#6 ز@'¶ܳt t &  |!0tpۭ4XN@F^>6ppp`RRk0j۩Lt<:2B|!2@$<@"ҳ:!LcY!pYR<EL ## B J`_ 0|0|d>۩c 2 dvBdBTJՐB BaQ">lXB@?oDDfB 6F ;89ܵ9@89ҳ:@@rfļ@)@ڹ@)6ʰ@\r V@&!@@@)&c`Nfk ۭ__P6TTT|dF> aPPP_ ۭ_.P BT>@2ހBM ;sڑ/F+۩sVHZl(s"osBPpF?p` l"D 4?Fs  s4n P8_0DT>H׌ ( 2c @oeZT>2/F+w>kaހBr. |$t@ۑiB <.ۭss_ڑVQQQ&7ܳxdGDBY@wBaPJC YYVVDDD5FY}@Jo~ p?@_f,Y$ 0tBc f,אX0m* oaKTD(DB >)VVDB栈CDBY0lT5F?T5F?FkF@$"B'a D5FDB 0jD5Fd""aB"X 0V?D> Yo}dV洆 |0 ,k!Bk k k k  kþ g2/F+\->-"洆TBV洆q] qDB `pVcD \1 \$ #-6ITS>DS>ӈ0w"6 ӈqDN{!|dN" tV>ۙV-0`"t6 w0[|d\>B>8BZ>Y ӆJ浊D`PJ@tB Y\9(ׄ"aB"Y$P "HdB?F`悆͇PYYoBz,z BQB?F3ތ_ (|?|sVVۑ_VPB`PZ,<76@'IJሆːj0 䇮$_ZP\ꋀf,*>!Pו(qh֑hAh ԑD>0V_Y 0xpp*ptppPpmpPjzHkFkT߆,ز@9:  [0TJYV ;)0LpXp`p͇PkVY0@ߙV]VqB`FزBDDDDtBە[ڑD5F朇PtB@t_BPPP@0tBc f, אaPP0 yԑD>䛶,aYdB ԑD>;T>ԑD>?@FaPP栈 洆'woy洆 }\ ʇχ.8E  +   l >(C*  P|*wo&**kD^B{|*}pppo\ފoBBFP|***kDB{Bk ޶ڷ7Ȳ̴ܲPr"BD"B@ؑBaB}@B=05BdBqې$BBKP' @ TMB>k."aB &Cu0k ۭ9DNB=g#F9BaBa$$BB' X/},@BaB?Fk|Pz?F/F+kMHDS>BB?j ׉BBa浊?|PlF/F+_ ?$P(  *2b?oaD k*朇dBzelzev0pyucXeimq`ab|nBށohB4" fڶ7B?" ޶ڷγ9א2`ftBc ,V9VːXTB>D> BDB">א2F8TB>kdm*B ۥF/⑬8YTB{BnZ)p/F+>k9Vb .6ұ:16B$$ !2@а7m*B[V[0 T{Bn)pb/⑬8@qۭo אKjfy T>F9F&TBD>l ,>GDDtA@sDDD>TB2oDB@PP@ۭ o`Dt-&BډB|d-B)D{B>^ޑDBDB>Q B|d-TBQoT>B o"T5FD5F??f,>!ÁP\TB oξ^FT{B ۭ2ni 朇 DDtA@sDDD> kDDDBDB 9(󐛴*(@)@@"*)@|$g<@ & &"7Foq@108B|B/t|Bk"|$ ~(o$TD>k .ۥ(PB)(/TDD B>?lobB\>?loB.BFTBQoT>P|d>tkBT)T C*|!$ * ~ ">( }_ .C* BB\0B`F\朇PtB@t_BҊ(ۑTDPTDPTD2BF\ n䛶,[F[T>FV"V*Vq k ׹F9B4,AAAAAXBC>`ˀf,>!ÁP\|@dC>(BH>BBBjBBE>BFBPBT> 0BnZx:勄/F+B"aB }F@/F+ۓ D, 0en ՐoՐۭ(h0T>uB) ,#@)B0 .s. $"7F3.ċ.P.xċ.P..wo @ &g?o_PF?P$F$ ?\ &AAAB.'Fa$@||$ܹ6ʐܑ0D 242 P)B>DyB0DxBfyBxB_PPՀ0: ">0۩ۡᐓ򋈽.P"o> sB 0 .䈴@#6ؐB?o|F 0y ķ:BD/0fT>)P۩c ِ}d. ofwz+ 2 2 2HBP 2鐛22X "`F ">( oz>P>>̓X 0Z ">( otۑtPTZ>"́@62́@|dg2&Ð:@ È 4`&& ׈|$PPP$F@ &J"rBm|h8t &|$/%7#1æ9Š9æ¼%7%6àũ8ç:';"ʱ]Pz@ ξ^0 MFDS> pwu} pmXB4Þ MlHFF9FMMVV?~lDS>`4a44664c4j4|46444444U4Y4\444)PBB_ _1_2oYξg>EUξW)"P22Ro "5)`2.磓odxdB6<@8ׇ-@:@ܳ򍛆.@H@jYoaᴆ8ᴆ83Z@j#o+P/ᴆ8Z@sb{ᴆ8B ntV>@8p h`f,V&Bב洆ᴆB)8 #7ҹ9Yo8? YobqtNPB`N?A<h 4 4kFFF Sa f,͇TNVVT{B0`p۷0w8۷F۷P$$|p ۷p$tc &  `"xƎP &" ƎP &"NƎP &"{ƎP &c`$2p~)zؑ`ؓ0TMB>khȏ05"7F? $|$XlFlB7F /F+>k ov "o>XB AAA$敋B.jx:l 0. DodPH&|<@<@wTBlFܑ0ܑDB:=o,TBg<@ &FF Jx < 2B>n<͇p$"bT>)F,,V,ڑD>TB>ܑg<Z &QV@lFTT>B>!g@8p h`f,V&Bב洆ᴆB)8 #7ҹ9Yo8? YobqtNPB`N?A<h 4 4kFFF Sa f,͇TNVVT{B0`p۷0w8۷F۷P$$| !RELRELSUBNEWLIB $$$Copyright (c) 1984 by SLR Systems, Butler, PA**CHRIST is the Answer**T"?D"0lw@۽! d 6X^F@ 4 0{t bt b90 GU}؀p ` BӐ6ʶ7Ȑco|x4PP B7`" &槅BXaXᧅ8:@#6<ҹXز@2@v s0aDgs0B xaPPP_ B o_PB۽!@*47β@:9;ʐᧅ" od_! s,B,!2@:ҷ17:ҷܐs&ķ:@@"ҹ6@B<9;ʐU Pq`o$ 0ňD1$lt F$؀P& &< 06B,X$^x &ӐP@ &@"q" 0|@V@0\>$0Xl\$|pB &0 &@y_ &PPĵV  & & 1 & 6^ 0zB aPPP_ "244槅"槅x"lVTa >k`"ːDD$!2@޶ڰ2@7ܓ87@#6 ز@'¶ܳ!`! R<EL ## B J`_ 0|0|d9 ۩ 2 d] d  D\ K͂" XBaF lF'l۹!"2$D Bawd &17@89ҳ:@@rhļ@)@ڹ@)6ʰ@\r3H3Df&ۭP6TTT|d"FaPPP_ BD 槅x$CD: "l<{Tl>kdl; lBlF?oD" B"#TG"۩0Ϳ P!$P wT?z oXb TH׌(  @oegT2/F+z>kaB; < |$Jᧅl9VDlD>kd""TTTܲ@*޷@&7dedT1$? x@D"D" ۑ4@T1$|D1$ד dr EPBT1$?F oBB':@@;62@)@#9ڰز@$77@#6 F &CuHV?xF t@t dY 䳐 ld B .@B ?@_|dB 汄T"T"0s,&"b ' ads8(de/@dqD o}x kkkkJ|kk6>Pz\PzPzeznP-B/օ|d ] F Al0͛d: d 槄0Û casߙJ濄D: ?xa[": &AA}F?@0" $P Hd;   fz &`ːj枆È ͇Po`0C B `YB24B24ز@9:n`|TFV"V*Vq &׹F9BAAAAAXBg`ˀDD !P򼑬 24_@&x𼑬o`0 {TT\ !D\  ) &˄Dۭq*lBօ*@@"")R>ib" ᧅᧅ"I"3cclFlBI"ZT>kdF?P$F$ ?\ &AAAB'FaBI"e ۭ}oHZŅHB?zy2"& ", x>lFB@}ۭۥ}|} Au@@ ` _ "* o,B䈴@#6ؐB?o|F 0y ķ:Bloo4 B] _ᧅtۑtP槅l_Bօ"9ʱ@#6ؐ|d ltPzo<x"  P[dmd  o, 2 orz "24 T2 o Hx~  X "( o z>P>>̓0eBP^'R"I"ccc懅BI"9޳@=@=|d3 ̇0BBI"OiP?P_ |}%D =Zm0xt3 b D\ DT @}lFlBI"BI" 2 " A_@B3 P@ & `l0\6ұ@ķع@"372t<76@ķع@)397Ʋ2372@7t >>͇p$"3D)FVڑD?zy2"& ", x>lFB@}ۭۥ}|} Au@@ ` _ "* o,B䈴@#6ؐB?o|F 0y ķ:Bloo4 B] _ᧅ title TURBODOS OPERATING SYSTEM - SLAVE PARALLEL PRINTER DRIVER subttl copyright 1983 by software 2000, inc. .z80 ; ; copyright 1983 by software 2000, inc. ; converted to MICROSOFT M80 format by ; Advanced Digital Corp. ; ; version: 02/21/84 doc ; name ('SSLSTPAR') ;module id ; include DREQUATE.LIB ;driver symbolic equivalences ; pio0d equ 20 ;parallel port 0 data port pio0c equ 22 pio1d equ 21 ;parallel port 1 data port pio1c equ 23 ; DSEG ;locate in data area ; parff:: db aff ;form feed character outchr: db 0 ;output character initc: db 0 ;initialization complete flag ; imssph: ;character output semaphore defw 0 ;semaphore count ..imsh: defw ..imsh ;semaphore p/d list head defw ..imsh ; cseg ;locate in program area ; lstdr@:: ld hl,initc ;get initialization complete flag ld a,(hl) or a ;initialization complete flag set? call z,..init ;if not, initialize list channel ld a,e ;get function number cp 2 ;function number=2?  jr z,lstout ;if so, continue cp 7 ;function number=7? jr z,lstwsr ;if so, continue ret ;else, done ..init: dec (hl) ;set initialization complete flag ld a,00fh ;put port a in output mode out (pio0c),a ld a,0cfh ;put port b in bit mode out (pio1c),a ld a,01fh ;bits 0-4 input, bits 5-7 output out (pio1c),a ret ;done ; lstwsr: ld a,(parff) ;get form feed character ld c,a ;form feed character to c-reg ; lstout: ld hl,outchr ;get output character ld (hl),c ;save output character ld de,imspol ;get poll routine address call lnkpol## ;create poll routine call imspr ;execute poll routine ld hl,imssph ;get semaphore address jp wait## ;dispatch if necessary ; imspol: ;parallel out poll routine defw 0 defw 0 ; imspr: in a,(pio1d) ;get printer status and 1 ;printer busy? ret z ;if so, done ld a,(outchr) ;get output character out (pio0d),a ;output it ld a,80h ;toggle data strobe out (pio1d),a xor a out (pio1d),a ld hl,imspol ;get poll routine address call unlink## ;unlink poll routine ld hl,imssph ;get semaphore jp signal## ;signal process as ready ; end it mode out (pio1c),a ld a,01fh ;bits 0-4 input, bits 5-7 output out (pio1c),a ret ;done ; lstwsr: ld a,(parff) ;get form feed character ld c,a ;form feed character to c-reg ; lstout: ld hl,outchr ;get output character ld (hl),c ;save output character ld de,imspol ;get poll routine address call lnkpol## ;create poll routine call imspr ;execute poll routine ld hl,imssph ;get semaphore address jp wait## ;dispatch if necessary ; imspol: ;parallel out poll routine defw 0 defw 0 ; imspr: in a,(pio1d) ;get printer status and 1 ;printer busy? ret z ;if so, done ld a,(outchr) ;get output character out (pio0d),a ;output it ld a,80h ;toggle data strobe out (pio1d),a xor a out (pio1d),a ; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ; ; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; diskdef parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logical disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,...,n-1) ; ; each parameter-list-i takes the form ; dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0] ; where ; dn is the disk number 0,1,...,n-1 ; fsc is the first sector number (usually 0 or 1) ; lsc is the last sector number on a track ; skf is optional "skew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (word) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of tracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defines disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is defined by ; disks 4 ; diskdef 0,1,26,6,1024,243,64,64,2 ; dsk set 0 ; rept 3 ; dsk set dsk+1 ; diskdef %dsk,0 ; endm ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the bios, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is given by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a large disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,0000h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc vectors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter blocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro dn dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw macro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;; produces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variable for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif gcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set statements for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn equ als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocation vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate the block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fills with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not found yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkval set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks) > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; now generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries per block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks else dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb %blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk shr 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate table, if requested if nul skf xlt&dn equ 0 ;no xlate table else if skf = 0 xlt&dn equ 0 ;no xlate table else ;; generate the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn = gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm enddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; = gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm ePCP/M DUMP UTILITY VERS 1.3COPYRIGHT 1978 BY S. J. SINGERLOOK !9" 1 2 :y:og,wqÁ* $| åLOOK $ ô *$ >2 1 2 !"p !s#  >!\!s#  #!A:*!"$B:1P2 6>2 Dx~# 9!@9px?Gk#X 7!@SÈVALIDATE!@SàGROUP@ !@SõG @ !@SMAPژ !@SDIR) !@STRACKM!@ SQUITS !!"QS !35IDy!@HSJT қX~!#PP:{0 ?))) O d`}ڰ 2 !@SÛSECTORڳ!@SðS ҋP:`}ڰ 2 2 "r @S-P:`}ڰ 2 ! G~2 pm9*r @ SEDITm# EDIT - $ !t  s# 2 t >!t SSXWRITE_!t kSoSTOP9Ø!0 O)))) xv u}ҫ.S |µ} "r k  Ɛ'@'_:s :r i  *r ~i  !t s#  t >v u}/.S' :u ?}*r wk  :r <2r !"p ͹*.*"h9, : 7ʊ?ڊO*.!" : M?ڢO*." : _*.'": b DRIVE A -$  TRACK $ !: o)   |{0__9 SECTOR $/ !: ok  C! : 4pÀ DRIVE B -$e >2 >2 m96# > w# ¦ ¹ï .w# 7y#  w# !\͞ e!COM!"p : _\Y \9C': S í!"r *r :q :p d $a ~i  #y ‘i   ni  *r ~ʱ >._#y i   ¤k  - *p "p *r "r K>2 2 : _: M?!O*." : 7>?>O*.!"< *.'"J- : 2 $<2 $: 2  9P:`}ڰ 2  2 , p p: <2 [ 9&: oT))): _><ڄ -2 ~2 2 : _`o"r !" û * $   GROUP ALLOCATION MAP DRIVE $  :   A $  . & B $  *r M $;  ` $^  ~ڍ { 0$y  : <2 Ú Ò 1$  xµ yµ zµ n #X k  3 $  *  AVAILABLE GROUPS, OUT OF 243 $  9È : : _2 <2 : 7\ ?\ O*.!"Z : M?q O*."o *."z *.'" å DIR IS NOT IMPLEMENTED$  9 INPUT ERROR$  9 INCORRECT SECTOR NUMBER$  9 INCORRECT TRACK NUMBER$  9N INCORRECT GROUP NUMBER (GREATER THAN 242)$!  9: ‘ Æ NO FILE BY THAT NAME ON DRIVE A$c  9÷ NO FILE BY THAT NAME ON DRIVE B$  9 DISK DEAD ERROR$  S ERROR IN FILE NAME$  9  ADDRESS ERROR$  H  ERROR - HEX INPUT ONLY $*  k  : _* $ $T NAME ON 9÷ NO FILE BY THAT NAME ON DRIVE B$  9 DISK DEAD ERROR$  S ERROR IN FILE NAME$  9      : <2 Ú Ò 1$  xµ yµ zµ n #X k  3 $  *  AVAILABLE GROUPS, OUT OF 243 $  9È : : _2 <2 : 7\ ?\ O*.!"Z : M?q O*."o *."z *.'" å DIR IS NOT IMPLEMENTED$  9 INPUT ERROR$  9 INCORRECT SECTOR NUMBER$  9 INCORRECT TRACK NUMBER$  9N INCORRECT GROUP NUMBER (GREATER THAN 242)$!  9: ‘ Æ NO FILE BY THAT NAME ON DRIVE A$c  9÷ NO FILE BY THAT NAME ON DRIVE B$  9 DISK DEAD ERROR$  S ERROR IN FILE NAME$ :20EE0000C300F8C341EFC396EEC39AEEC39EEEC3A2EEC3C6EEC3BCEEC370EEC398F5C37484 :20EE2000EEC378EEC398F1C37CEEC380EEC3A6EEC3F5F400D806E000000000000000000050 :20EE40000000000000000000000000000000000000000000000000000000000000000000B2 :20EE600089F089F089F089F089F089F04EF089F01600180E1606180A16091806160C180212 :20EE8000160F3A94EE2100EF875F7A16001956235F7EEBE900C91600181816031814160658 :20EEA000181016091802160C3A030007072129EF18063A03002121EFE60318CC1603213187 :20EEC000EF3A0300180A16062139EF3A03001F1F1F1F18E42AB5ED7723772AB7ED7723770E :20EEE000C9CD27EEC3BBE3CD2AEEB7C82109E0C34AE32AEAED0E02CDEAE422E5ED22800066 :20EF0000F100F101000000000000000000000000000000000000000000000000000000000E :20EF200000F000F00100000000F002F00100000000F001F00000000000F001F0000000004B :20EF400000F33164000E00CD98F57CB5CAD0EF5E2356ED53CEEF2A33EEFD2131EEE51106AF :20EF600000FD19FD4E00FD460178B12842CD74EEFD4E02FD46030BED43CCEFC1C5CD98F1C5 :20EF8000373FED4BCCEF03FD6E04FD6605ED42E138CBED43CCEF11800019E5ED5BCEEFCDCF :20EFA000F5F44D44CD78EECD7CEEB7202318CC2A35EE2206002103EE2201003EC3320000B2 :20EFC0003205002A33EE3A04004FFBE9E3ED000011D7EFCDE0F5765761726D20626F6F7414 :20EFE000206572726F722D72657365742073797374656D0D0A24CDA6E43AC5EDA632E2ED8D :20F00000C317F0C32DF0C38CF0C39AF0C3ABF0534243494F20202087280A3C4FED78E601FC :20F02000C83EFFC92A17F67C95C83EFFC947CD17F07828F98728064FED78E67FC9F3260088 :20F040001120F6197D3CE61F3217F6FB7EC9ED7354F63154F6E5D5F52A17F6247DE61FBCC4 :20F06000200ADB00AF0E07CD8CF01816ED5B18F616002120F619DB00E67F777D3CE61F32ED :20F0800018F6F1D1E1ED7B54F6FBED4D41873C4FED78E60428FA0DED41C9FE022841475907 :20F0A000CDAFF0B77828F90DED59C9FE022812873C4F3E10ED79ED78E60CFE0C3EFFC82FE3 :20F0C000C93AF0F0B72810D3063ECFD3073E1FD307AFD30532F0F0DB05E601C83EFFC9CD6C :20F0E000C1F0B728FA79D3043E80D305AFD305C90FE5C977C9CD9CE5CDE0E50E01CDB8E3FC :20F10000C38CF1C39DF1C38EF1C393F1C342F3C38AF2C30AF3464C4F505059202000001AAA :20F120000000001A0072F100000000000000F845F1CCFC80FC72F100000000000000F84540 :20F14000F138FDECFC1A00030700F2003F00C000100002004000040F002F017F00C0002098 :20F160000001008000040F005F02FF00F0002000010001070D1319050B111703090F1502DF :20F18000080E141A060C1218040A10160E00793203F6C9793206F6C9ED43FEEEC947CD00D7 :20F1A000F5B72038DD2211F6DD7E003C472136F1110F001910FD4D443A02F6CDE6F1DD7E17 :20F1C00000B72806AF77237718061172F1732372110900197123702B2BED52C93A0EF632EB :20F1E00002F6210000C9878787876F26001125F119C9DD7E00B728093E08473A0FF6070756 :20F20000B0473A02F6B0D314DD7E03D30D3E023216F63ED0D30CE3E3E3E3DB0CE680C821C3 :20F2200016F63520ED11B5F6CDE0F5CD55F4116DF7CDE0F5112DF7CDE0F5CD9AEEFE0320A8 :20F24000D1E13E01C93E0A320CF63A03F64FDB0D91200D3A02F6473A89F290C81614180286 :20F26000161C79D30FDD7E01B2F3D30C3A02F63289F2DB14FB17380ADB0CE6992004DD7127 :20F2800003C91E1CCD02F418C100DD2A11F6DD7E00B728503E02B928063DB928211826CDC3 :20F2A0000AF3B7C03A06F6E6F83207F6EE103208F6CDBAF4EBEDB03EFF320BF62FC9CDC56C :20F2C000F2B7C01845CD99F430E77AE6F8573A08F6BA2023CDA2F4381ECD0AF3B7C02F32B8 :20F2E00008F618CD3A06F63209F63EA332FAF33EAC3210F6C376F3CD0AF3B7C02F3208F6D6 :20F30000CD7BF4CD6CF3B7C018A73A0BF6B73EFF320AF62FC8DDE5DD2A13F63EA332FAF325 :20F320003EAC3210F62A02F6E52A04F62202F63A07F6CD83F4CD76F3E12202F6DDE1320BBF :20F34000F6C9DD2A11F6DD7E00B7281ACD99F43806CDBAF4EDB0C9CD0AF3B7C0CD7BF4CDC9 :20F360006CF3B7C018EB3A06F63209F63EA232FAF33E8C3210F6CDF2F1CD45F23E0A320C12 :20F38000F63ED0D30C3A10F6470E0FE3E3E3E3F3DB0CE6200F0F0F2FA05FDD7E00B71601F6 :20F3A00028072180F8160818032AFEEE3A09F6D30E7BD30CCDF3F3DB0CFB5FB0C87BE6BF36 :20F3C0003A10F62023FEAC201F11B5F6CDE0F5CD55F411C7F6CDE0F5112DF7CDE0F5CD9A9F :20F3E000EEFE03209C3E01C957CD02F4CD4AF2B7288FC90680DB14B7F0EDA220F81520F315 :20F4000018F33A0CF63D320CF620577BFE1C280EFEAC28051179F61808117EF61803118446 :20F42000F6CDE0F51189F6CDE0F53A03F6CDEDF5119AF6CDE0F53A09F6CDEDF511A4F6CD7D :20F44000E0F53A0FF6CDEDF5CD55F411F3EFCDE0F53E01E1C911ACF6CDE0F53A02F6CDED14 :20F46000F5C9DB0CE610C8DD7E01F60CD30CDB0CE60428FAAFD30DDD7703C93A06F6E6F836 :20F480003207F60F0F0FDD4602B80E003802900C3C3209F679320FF6C93A06F6573A0AF6A2 :20F4A0001FD82A02F6ED4B04F6ED42280237C93A07F6477A90D8FE083FC9DD2213F62A0206 :20F4C000F62204F63A06F647E6F83207F678E60747042100F81180001910FD018000ED5B47 :20F4E000FEEEAF320AF6C94704DD2119F1110400DD1910FCC97AB36960C8EB096E2600C934 :20F5000079B7200D503A15F6B7CA8BF53E003215F62AAFED50CB597D28037CCB9841041F58 :20F5200010FD3867D5CD0AF3D1B7C03ED0D30C3A02F6320EF67A3202F6CDE7F4D314CD677C :20F54000F4AF3203F6320FF6DD77003C3206F62AFEEEE52180F822FEEECD66F3E122FEEE31 :20F56000B7C03AFFF8B72812D6E5FE03380C1156F6CDE0F5CD55F43EFFC9DD7700B72804A0 :20F580003E0818023E1ADD7702AFC97A3202F6CDE7F4DD7E0018E3013A94EEB920070600A0 :20F5A0001603C382EE1100EF875F1A4779875F1AB728296790CAC7F544C5D51612CD82EE77 :20F5C000D1C1B720173C60472E03C5131AD5CD93EED1C17CB5C8793294EEAFC9210000C968 :20F5E0001AFE24C84F13D5CD9EEED118F3F51F1F1F1FCDF6F5F1E60FC69027CE40274FC3C8 :20F600009EEE002100D8F5CD69E5FF0000000000001DF11DF1FF00000000EBCDD2E4CD5AA6 :20F62000E92145E37EB7C2FEEA3D32E3ED3600C3D2E4AF32D5EDC52A43E3EB212100197E4F :20F64000E67FF57E17237E17E61F4F7E1F1F1F1FE60F47F1236E43616E2774207265636F81 :20F66000676E697A652064656E73697479206F66206469736B20696E245265616424577209 :20F68000697465245365656B24206572726F72206F6E20747261636B2024202073656374A9 :20F6A0006F72202420207369646520242020647269766520240D0A546865206469736B65F6 :20F6C00074746520696E242069732077726974652D70726F7465637465642E202052656DF2 :20F6E0006F766520746865206469736B6574746520616E640D0A707574206F6E20746865C1 :20F700002077726974652070726F74656374207461622C207468656E207479706520616E5A :20F7200079206368617261637465722E240D0A54797065206120636F6E74726F6C2D432046 :20F74000696620796F75207769736820746F2061626F727420746865206F706572617469D2 :20F760006F6E20696E73746561640D0A24206973206E6F742072656164792E0D0A496E7358 :20F78000657274206469736B657474652C20636C6F736520647269766520646F6F722C20E5 :20F7A000616E64207479706520616E792063686172616374657220746F20636F6E74696E51 :20F7C00075652E24EDCDDAE5C321ECCD72E5CD51ECC351E8CD51ECC3A2E80E00EB7EFE3F7F :20F7E000CAC2ECCDA6E47EFE3FC472E5CD51EC0E0FCD18E7C3E9E52AD9ED2243E3CD51EC9E :20F80000CD06F8C3AFEF2145F901010AEDB3214FF901030CEDB32160EE7CED47ED5EAF324D :20F8200003003204001179F8CDE0F53A05EEC606CB3FCB3FCD35F9C548CD9EEEC1CD9EEEE3 :20F8400011BFF8CDE0F53A22EFC6314FCD9EEE11F6F8CDE0F53A2AEFFE023808110CF9CD3D :20F86000E0F5180EF51124F9CDE0F5F1C6314FCD9EEE1131F9CDE0F5C90D0A53757065726C :20F8800020517561642043502F4D20762058322E300D0A5370656369616C2038222D35221A :20F8A0002042494F530D0A54797065616865616420696E7374616C6C65640D0A0D0A244BD2 :20F8C0002043502F4D20322E3220696E7374616C6C65640D0A0A44656661756C7420636F8F :20F8E0006E736F6C652069732073657269616C20706F727420240D0A44656661756C742026 :20F900007072696E7465722069732024706172616C6C656C207072696E74657220647269D3 :20F920007665722473657269616C20706F727420240D0A0A24010AFF049130FC81C6304FD7 :20F940003E308047C918011803C1044405EA00180104026003C1044405EA00EEC3A6EEC3FB :20F96000F5F400D806E0010020003F00020000000B00000000000000000000000000000073 :20F9800000000000000000000000000000000089F089F089F089F089F089F04EF089F016C4 :20F9A00000180E1606180A16091806160C1802160F3A94EE2100EF875F7A16001956235F12 :20F9C0007EEBE900C916001818160318141606181016091802160C3A030007072129EF1846 :20F9E000063A03002121EFE60318CC16032131EF3A0300180A16062139EF3A03001F1F1F0E :20FA00001F18E40000000000000000000000000000000000000000000000000000000000CB :20FA2000000000000000000000000000008000F100F1010000000000000000000000000063 :20FA400000000000000000000000000000000000F000F00100000000F001F00100000000E3 :20FA6000F001F00000000000F001F00000000000F33164000E00CD98F57CB5CAD0EF5E2399 :20FA800056ED53CEEF2A33EEFD2131EEE5110600FD19FD4E00FD460178B12842CD74EEFD2B :20FAA0004E02FD46030BED43CCEFC1C5CD98F1373FED4BCCEF03FD6E04FD6605ED42E13853 :20FAC000CBED43CCEF11800019E5ED5BCEEFCDF5F44D44CD78EECD7CEEB7202318CC2A35EE :20FAE000EE2206002103EE2201003EC33200003205002A33EE3A04004FFBE9000000001184 :20FB0000D7EFCDE0F5765761726D20626F6F74206572726F722D726573657420737973740F :20FB2000656D0D0A2400000000000000000000C317F0C32DF0C38CF0C39AF0C3ABF053428F :20FB400043494F20202087280A3C4FED78E601C83EFFC92A17F67C95C83EFFC947CD17F0DB :20FB60007828F98728064FED78E67FC9F326001120F6197D3CE61F3217F6FB7EC9ED735409 :20FB8000F63154F6E5D5F52A17F6247DE61FBC200ADB00AF0E07CD8CF01816ED5B18F61600 :20FBA000002120F619DB00E67F777D3CE61F3218F6F1D1E1ED7B54F6FBED4D41873C4FED76 :20FBC00078E60428FA0DED41C9FE0228414759CDAFF0B77828F90DED59C9FE022812873CBF :20FBE0004F3E10ED79ED78E60CFE0C3EFFC82FC93AF0F0B72810D3063ECFD3073E1FD307A4 :20FC0000AFD30532F0F0DB05E601C83EFFC9CDC1F0B728FA79D3043E80D305AFD305C90F1A :20FC2000000000000000000000000000000000C38CF1C39DF1C38EF1C393F1C342F3C38A65 :20FC4000F2C30AF3464C4F505059202000001A0000001A0072F100000000000000F845F113 :20FC6000CCFC80FC72F100000000000000F845F138FDECFC1A00030700F2003F00C000106D :20FC80000002004000040F002F017F00C000200001008000040F005F02FF00F0002000017B :20FCA0000001070D1319050B111703090F1502080E141A060C1218040A10160E0079320329 :20FCC000F6C9793206F6C9ED43FEEEC947CD00F5B72038DD2211F6DD7E003C472136F111BB :20FCE0000F001910FD4D443A02F6CDE6F1DD7E00B72806AF77237718061172F173237211BD :20FD00000900197123702B2BED52C93A0EF63202F6210000C9878787876F26001125F1191C :20FD2000C9DD7E00B728093E08473A0FF60707B0473A02F6B0D314DD7E03D30D3E02321657 :18FD4000F63ED0D30CE3E3E3E3DB0CE680C82116F63520ED11B5F6CD2F :00000001FF E08F6FBED4D41873C4FED76 :20FBC00078E60428FA0DED41C9FE0228414759CDAFF0B77828F90DED59C9FE022812873CBF :20FBE0004F3E10ED79ED78E60CFE0C3EFFC82FC93AF0F0B72810D3063ECFD3073E1FD307A4 :20FC0000AFD30532F0F0DB05E601C83EFFC9CDC1F0B728FA79D3043E80D305AFD305C90F1A :20FC2000000000000000000000000000000000C38CF1C39DF1C38EF1C393F1C342F3C38A65 :20FC4000F2C30AF3464C4F505059202000001A0000001A0072F100000000000000F845F113 :20FC6000CCFC80FC72F100000000000000F845F138FDECFC1A00030700F2003F00C000106D :20FC80000002004000040F002F017F00C000200001008000040F005F02FF00F0002000017B :20FCA0000001070D1319050B111703090F1502080E141A060C1218040A10160E0079320329 :20FCC000F6C9793206F6C9ED43FEEEC947CD00F5B72038DD2211F6DD7E003C472136F111BB :20FCE0000F001910FD4D443A02F6CDE6F1DD7E00B72806AF7723 .XLIST .XCREF ; ; ASCII EQUIVALENCES ; ANUL EQU 00H ;NULL ASOH EQU 01H ;SOH ASTX EQU 02H ;STX AETX EQU 03H ;ETX AEOT EQU 04H ;EOT AENQ EQU 05H ;ENQ AACK EQU 06H ;ACK ABEL EQU 07H ;BELL ABS EQU 08H ;BS AHT EQU 09H ;HT ALF EQU 0AH ;LF AVT EQU 0BH ;VT AFF EQU 0CH ;FF ACR EQU 0DH ;CR ASO EQU 0EH ;SO ASI EQU 0FH ;SI ADLE EQU 10H ;DLE ADC1 EQU 11H ;DC1 ADC2 EQU 12H ;DC2 ADC3 EQU 13H ;DC3 ADC4 EQU 14H ;DC4 ANAK EQU 15H ;NAK ASYN EQU 16H ;SYN AETB EQU 17H ;ETB ACAN EQU 18H ;CAN AEM EQU 19H ;EM ASUB EQU 1AH ;SUB AESC EQU 1BH ;ESC AFS EQU 1CH ;FS AGS EQU 1DH ;GS ARS EQU 1EH ;RS AUS EQU 1FH ;US ASP EQU 20H ;SPACE ARUB EQU 7FH ;RUBOUT (DEL) ; WBOOT EQU 0000H ;WARM START ENTRYPOINT IOBYTE EQU 0003H ;I/O CONFIGURATION BYTE CURDRV EQU 0004H ;CURRENT DEFAULT DRIVE OPSYS EQU 0005H ;OPERATING SYSTEM ENTRYPOINT TFCB EQU 005CH ;DEFAULT FILE CONTROL BLOCK TBUF EQU 0080H ;DEFAULT DISK BUFFER ADDRESS TPA EQU 0100H ;TRANSIENT PROGRAM AREA BASE ; ; DISK COMMAND PACKET OFFSETS ; PDRDP EQU 0 ;PD REQUEST DESCRIPTOR PACKET PDRFCN EQU 0 ;PD REQUEST FUNCTION NUMBER PDRDRV EQU 1 ;PD REQUEST DRIVE NUMBER PDRTRK EQU 2 ;PD REQUEST TRACK NUMBER PDRSEC EQU 4 ;PD REQUEST SECTOR NUMBER PDRSC EQU 6 ;PD REQUEST SECTOR COUNT PDRTC EQU 8 ;PD REQUEST TRANSFER COUNT PDRDMA EQU 10 ;PD REQUEST DMA ADDRESS PDRDST EQU 12 ;PD REQUEST DRIVE SPEC TABLE ADDR PDRLEN EQU 14 ;PD REQUEST DESCRIPTOR PACKET LENGTH ; DSKNFO EQU 14 ;DISK TYPE INFORMATION BLKSIZ EQU 14 ;BLOCK SIZE NMBLKS EQU 15 ;NUMBER OF BLOCKS NMBDIR EQU 17 ;NUMBER OF DIRECTORY BLOCKS SECSIZ EQU 18 ;PHYSICAL SECTOR SIZE (2^N*128) SECTRK EQU 19 ;PHYSICAL SECTORS PER TRACK TRKDSK EQU 21 ;PHYSICAL TRACKS PER DISK RESTRK EQU 23 ;NUMBER OF RESERVED TRACKS DNFOL EQU 11 ;DISK INFO LENGTH ; ; .CREF .LIST  005CH ;DEFAULT FILE CONTROL BLOCK TBUF EQU 0080H ;DEFAULT DISK BUFFER ADDRESS TPA EQU 0100H ;TRANSIENT PROGRAM AREA BASE ; ; Z-80 MACRO LIBRARY ; ; THE FOLLOWING MACROS ENABLE ASSEMBLING Z-80 INSTRUCTIONS ; WITH THE DIGITAL RESEARCH MACRO ASSEMBLER. ; ; INVOKE WITH "MACLIB Z80" ; ; ; ; MACRO FORMATS ; ----- ------- ; ; ; MACRO ZILOG TDL ; ----- ----- --- ; ; LDX R,D LD R,(IX+D) MOV R,D(IX) ; LDY R,D LD R,(IY+D) MOV R,D(IY) ; STX R,D LD (IX+D),R MOV D(IX),R ; STY R,D LD (IY+D),R MOV D(IY),R ; MVIX NN,D LD (IX+D),NN MVI D(IX) ; MVIY NN,D LD (IY+D),NN MVI D(IY) ; LDAI LD A,I LDAI ; LDAR LD A,R LDAR ; STAI LD I,A STAI ; STAR LD R,A STAR ; LXIX NNNN LD IX,NNNN LXI IX,NNNN ; LXIY NNNN LD IY,NNNN LXI IY,NNNN ; LBCD NNNN LD BC,(NNNN) LBCD NNNN ; LDED NNNN LD DE,(NNNN) LDED NNNN ; LSPD NNNN LD SP,(NNNN) LSPD NNNN ; LIXD NNNN LD IX,(NNNN) LIXD NNNN ; LIYD NNNN LD IY,(NNNN) LIYD NNNN ; SBCD NNNN LD (NNNN),BC SBCD NNNN ; SDED NNNN LD (NNNN),DE SDED NNNN ; SSPD NNNN LD (NNNN),SP SSPD NNNN ; SIXD NNNN LD (NNNN),IX SIXD NNNN ; SIYD NNNN LD (NNNN),IY SIYD NNNN ; SPIX LD SP,IX SPIX ; SPIY LD SP,IY SPIY ; PUSHIX PUSH IX PUSH IX ; PUSHIY PUSH IY PUSH IY ; POPIX POP IX POP IX ; POPIY POP IY POP IY ; EXAF EX AF,AF' EXAF ; EXX EXX EXX ; XTIX EX (SP),IX XTIX ; XTIY EX (SP),IY XTIY ; LDI LDI LDI ; LDIR LDIR LDIR ; LDD LDD LDD ; LDDR LDDR LDDR ; CCI CPI CCI ; CCIR CPIR CCIR ; CCD CPD CCD ; CCDR CPDR CCDR ; ADDX D ADD (IX+D) ADD D(IX) ; ADDY D ADD (IY+D) ADD D(IY) ; ADCX D ADC (IX+D) ADC D(IX) ; ADCY D ADC (IY+D) ADC D(IY) ; SUBX D SUB (IX+D) SUB D(IX) ; SUBY D SUB (IY+D) SUB D(IY) ; SBCX D SBC (IX+D) SBB D(IX) ; SBCY D SBC (IY+D) SBB D(IY) ; ANDX D AND (IX+D) ANA D(IX) ; ANDY D AND (IY+D) ANA D(IY) ; XORX D XOR (IX+D) XRA D(IX) ; XORY D XOR (IY+D) XRA D(IY) ; ORX D OR (IX+D) ORA D(IX) ; ORY D OR (IY+D) ORA D(IY) ; CMPX D CP (IX+D) CMP D(IX) ; CMPY D CP (IY+D) CMP D(IY) ; INRX D INC (IX+D) INR D(IX) ; INRY D INC (IY+D) INR D(IY) ; DCRX D INC (IX+D) INR D(IX) ; DCRY D DEC (IY+D) DCR D(IY) ; NEG NEG NEG ; IM0 IM0 IM0 ; IM1 IM1 IM1 ; IM2 IM2 IM2 ; DADC RR ADC HL,RR DADC RR ; DSBC RR SBC HL,RR DSBC RR ; DADX RR ADD IX,RR DADX RR ; DADY RR ADD IY,RR DADY RR ; INXIX INC IX INX IX ; INXIY INC IY INX IY ; DCXIX DEC IX DCX IX ; DCXIY DEC IY DCX IY ; BIT B,R BIT B,R BIT B,R ; SETB B,R SET B,R SET B,R ; RES B,R RES B,R RES B,R ; BITX B,D BIT B,(IX+D) BIT B,D(IX) ; BITY B,D BIT B,(IY+D) BIT B,D(IY) ; SETX B,D SET B,(IX+D) SET B,D(IX) ; SETY B,D SET B,(IY+D) SET B,D(IY) ; RESX B,D RES B,(IX+D) RES B,D(IX) ; RESY B,D RES B,(IY+D) RES B,D(IY) ; JR ADDR JR ADDR-$ JMPR ADDR ; JRC ADDR JR C,ADDR-$ JRC ADDR ; JRNC ADDR JR NC,ADDR-$ JRNC ADDR ; JRZ ADDR JR Z,ADDR-$ JRC ADDR ; JRNZ ADDR JR NZ,ADDR-$ JRNZ ADDR ; DJNZ ADDR DJNZ ADDR-$ DJNZ ADDR ; PCIX JMP (IX) PCIX ; PCIY JMP (IY) PCIY ; RETI RETI RETI ; RETN RETN RETN ; INP R IN R,(C) INP R ; OUTP R OUT (C),R OUTP R ; INI INI INI ; INIR INIR INIR ; OUTI OTI OUTI ; OUTIR OTIR OUTIR ; IND IND IND ; INDR INDR INDR ; OUTD OTD OUTD ; OUTDR OTDR OUTDR ; RLCR R RLC R RLCR R ; RLCX D RLC (IX+D) RLCR D(IX) ; RLCY D RLC (IY+D) RLCR D(IY) ; RALR R RL R RALR R ; RALX D RL (IX+D) RALR D(IX) ; RALY D RL (IY+D) RALR D(IY) ; RRCR R RRC R RRCR R ; RRCX D RRC (IX+D) RRCR D(IX) ; RRCY D RRC (IY+D) RRCR D(IY) ; RARR R RR R RARR R ; RARX D RR (IX+D) RARR D(IX) ; RARY D RR (IY+D) RARR D(IY) ; SLAR R SLA R SLAR R ; SLAX D SLA (IX+D) SLAR D(IX) ; SLAY D SLA (IY+D) SLAR D(IY) ; SRAR R SRA R SRAR R ; SRAX D SRA (IX+D) SRAR D(IX) ; SRAY D SRA (IY+D) SRAR D(IY) ; SRLR R SRL R SRLR R ; SRLX D SRL (IX+D) SRLR D(IX) ; SRLY D SRL (IY+D) SRLR D(IY) ; RLD RLD RLD ; RRD RRD RRD ; ; ; ; @CHK MACRO USED FOR CHECKING 8 BIT DISPLACMENTS ; @CHK MACRO ?DD ; USED FOR CHECKING RANGE OF 8-BIT DISP.S IF (?DD GT 7FH) AND (?DD LT 0FF80H) 'DISPLACEMENT RANGE ERROR - Z80 LIB' ENDIF ENDM LDX MACRO ?R,?D @CHK ?D DB 0DDH,?R*8+46H,?D ENDM LDY MACRO ?R,?D @CHK ?D DB 0FDH,?R*8+46H,?D ENDM STX MACRO ?R,?D @CHK ?D DB 0DDH,70H+?R,?D ENDM STY MACRO ?R,?D @CHK ?D DB 0FDH,70H+?R,?D ENDM MVIX MACRO ?N,?D @CHK ?D DB 0DDH,36H,?D,?N ENDM MVIY MACRO ?N,?D @CHK ?D DB 0FDH,36H,?D,?N ENDM LDAI MACRO DB 0EDH,57H ENDM LDAR MACRO DB 0EDH,5FH ENDM STAI MACRO DB 0EDH,47H ENDM STAR MACRO DB 0EDH,4FH ENDM LXIX MACRO ?NNNN DB 0DDH,21H DW ?NNNN ENDM LXIY MACRO ?NNNN DB 0FDH,21H DW ?NNNN ENDM LDED MACRO ?NNNN DB 0EDH,5BH DW ?NNNN ENDM LBCD MACRO ?NNNN DB 0EDH,4BH DW ?NNNN ENDM LSPD MACRO ?NNNN DB 0EDH,07BH DW ?NNNN ENDM LIXD MACRO ?NNNN DB 0DDH,2AH DW ?NNNN ENDM LIYD MACRO ?NNNN DB 0FDH,2AH DW ?NNNN ENDM SBCD MACRO ?NNNN DB 0EDH,43H DW ?NNNN ENDM SDED MACRO ?NNNN DB 0EDH,53H DW ?NNNN ENDM SSPD MACRO ?NNNN DB 0EDH,73H DW ?NNNN ENDM SIXD MACRO ?NNNN DB 0DDH,22H DW ?NNNN ENDM SIYD MACRO ?NNNN DB 0FDH,22H DW ?NNNN ENDM SPIX MACRO DB 0DDH,0F9H ENDM SPIY MACRO DB 0FDH,0F9H ENDM PUSHIX MACRO DB 0DDH,0E5H ENDM PUSHIY MACRO DB 0FDH,0E5H ENDM POPIX MACRO DB 0DDH,0E1H ENDM POPIY MACRO DB 0FDH,0E1H ENDM EXAF MACRO DB 08H ENDM EXX MACRO DB 0D9H ENDM XTIX MACRO DB 0DDH,0E3H ENDM XTIY MACRO DB 0FDH,0E3H ENDM LDI MACRO DB 0EDH,0A0H ENDM LDIR MACRO DB 0EDH,0B0H ENDM LDD MACRO DB 0EDH,0A8H ENDM LDDR MACRO DB 0EDH,0B8H ENDM CCI MACRO DB 0EDH,0A1H ENDM CCIR MACRO DB 0EDH,0B1H ENDM CCD MACRO DB 0EDH,0A9H ENDM CCDR MACRO DB 0EDH,0B9H ENDM ADDX MACRO ?D @CHK ?D DB 0DDH,86H,?D ENDM ADDY MACRO ?D @CHK ?D DB 0FDH,86H,?D ENDM ADCX MACRO ?D @CHK ?D DB 0DDH,8EH,?D ENDM ADCY MACRO ?D @CHK ?D DB 0FDH,8EH,?D ENDM SUBX MACRO ?D @CHK ?D DB 0DDH,96H,?D ENDM SUBY MACRO ?D @CHK ?D DB 0FDH,96H,?D ENDM SBCX MACRO ?D @CHK ?D DB 0DDH,9EH,?D ENDM SBCY MACRO ?D @CHK ?D DB 0FDH,9EH,?D ENDM ANDX MACRO ?D @CHK ?D DB 0DDH,0A6H,?D ENDM ANDY MACRO ?D @CHK ?D DB 0FDH,0A6H,?D ENDM XORX MACRO ?D @CHK ?D DB 0DDH,0AEH,?D ENDM XORY MACRO ?D @CHK ?D DB 0FDH,0AEH,?D ENDM ORX MACRO ?D @CHK ?D DB 0DDH,0B6H,?D ENDM ORY MACRO ?D @CHK ?D DB 0FDH,0B6H,?D ENDM CMPX MACRO ?D @CHK ?D DB 0DDH,0BEH,?D ENDM CMPY MACRO ?D @CHK ?D DB 0FDH,0BEH,?D ENDM INRX MACRO ?D @CHK ?D DB 0DDH,34H,?D ENDM INRY MACRO ?D @CHK ?D DB 0FDH,34H,?D ENDM DCRX MACRO ?D @CHK ?D DB 0DDH,035H,?D ENDM DCRY MACRO ?D @CHK ?D DB 0FDH,35H,?D ENDM NEG MACRO DB 0EDH,44H ENDM IM0 MACRO DB 0EDH,46H ENDM IM1 MACRO DB 0EDH,56H ENDM IM2 MACRO DB 0EDH,5EH ENDM BC EQU 0 DE EQU 2 HL EQU 4 IX EQU 4 IY EQU 4 DADC MACRO ?R DB 0EDH,?R*8+4AH ENDM DSBC MACRO ?R DB 0EDH,?R*8+42H ENDM DADX MACRO ?R DB 0DDH,?R*8+09H ENDM DADY MACRO ?R DB 0FDH,?R*8+09H ENDM INXIX MACRO DB 0DDH,23H ENDM INXIY MACRO DB 0FDH,23H ENDM DCXIX MACRO DB 0DDH,2BH ENDM DCXIY MACRO DB 0FDH,2BH ENDM BIT MACRO ?N,?R DB 0CBH,?N*8+?R+40H ENDM SETB MACRO ?N,?R DB 0CBH,?N*8+?R+0C0H ENDM RES MACRO ?N,?R DB 0CBH,?N*8+?R+80H ENDM BITX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+46H ENDM BITY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+46H ENDM SETX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+0C6H ENDM SETY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+0C6H ENDM RESX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+86H ENDM RESY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+86H ENDM JR MACRO ?N DB 18H,?N-$-1 ENDM JRC MACRO ?N DB 38H,?N-$-1 ENDM JRNC MACRO ?N DB 30H,?N-$-1 ENDM JRZ MACRO ?N DB 28H,?N-$-1 ENDM JRNZ MACRO ?N DB 20H,?N-$-1 ENDM DJNZ MACRO ?N DB 10H,?N-$-1 ENDM PCIX MACRO DB 0DDH,0E9H ENDM PCIY MACRO DB 0FDH,0E9H ENDM RETI MACRO DB 0EDH,4DH ENDM RETN MACRO DB 0EDH,45H ENDM INP MACRO ?R DB 0EDH,?R*8+40H ENDM OUTP MACRO ?R DB 0EDH,?R*8+41H ENDM INI MACRO DB 0EDH,0A2H ENDM INIR MACRO DB 0EDH,0B2H ENDM IND MACRO DB 0EDH,0AAH ENDM INDR MACRO DB 0EDH,0BAH ENDM OUTI MACRO DB 0EDH,0A3H ENDM OUTIR MACRO DB 0EDH,0B3H ENDM OUTD MACRO DB 0EDH,0ABH ENDM OUTDR MACRO DB 0EDH,0BBH ENDM RLCR MACRO ?R DB 0CBH, 00H + ?R ENDM RLCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 06H ENDM RLCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 06H ENDM RALR MACRO ?R DB 0CBH, 10H+?R ENDM RALX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 16H ENDM RALY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 16H ENDM RRCR MACRO ?R DB 0CBH, 08H + ?R ENDM RRCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 0EH ENDM RRCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 0EH ENDM RARR MACRO ?R DB 0CBH, 18H + ?R ENDM RARX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 1EH ENDM RARY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 1EH ENDM SLAR MACRO ?R DB 0CBH, 20H + ?R ENDM SLAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 26H ENDM SLAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 26H ENDM SRAR MACRO ?R DB 0CBH, 28H+?R ENDM SRAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 2EH ENDM SRAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 2EH ENDM SRLR MACRO ?R DB 0CBH, 38H + ?R ENDM SRLX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 3EH ENDM SRLY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 3EH ENDM RLD MACRO DB 0EDH, 6FH ENDM RRD MACRO DB 0EDH, 67H ENDM  DB 0FDH, 0CBH, ?D, 16H ENDM RRCR MACRO ?R DB 0CBH, 08H + ?R ENDM RRCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 0EH ENDM RRCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 0EH ENDM RARR MACRO ?R DB 0CBH, 18H + ?R ENDM RARX MACRO ?D @CHK 1e`r`:0802U>2R:R >`:S >D >2Q`:N(Y :R >2L2O"`:N(Y >2=:Q(>>2T:O >(2L>2M! "D!"F!"H"JN`:U0Yk` Y> YfW2P͔> ͥK`z$! ~ #(! ͽ 2Nµ:= :Q( :P(82P͔ ( ʦB:L(=z>ͥ*D*F>2P͔z *H*J *D*F t```:C 2S`:ʃN :MO"B^#~f(# *BF#~# w#r#:Pw#s#w# :P=G:S:T+w#2Sɯ23  1 >P:3 aX{X__ := `)`K` g`K`z$ DISK ERROR: $  `> "@:M2>2?~:P(>> ( 2N :>=(2>#:?f:?<2? 8`:N`:P1`z$`~$`:N$`:ʦSʆR f2P͔*@%f2P͔S:PG:UX WRITE ERROR: $"@`.G(`Lx@(`?x (6`2x(B`%x(S`x(]` x(g`????1Ɛ'@'Y FORMATTING $FMT548 3.2 $ Enter Disk Drive To Be Formatted (0-3) : $ Enter Density, Single or Double (S,D) : $ Format Single or Double Sided (S,D) : $ Format System Tracks only (Y,N) : $ Supress Format Verification (Y,N) : $ Insert Diskett Into Drive $ And Press The Return Key $ Formatting Complete$ Option (CR to Exit, C to Continue) : $ Option (CR for Same Parameters, N for New Parameters) : $ FORMATTING & VERIFYING$ TRACK $ $ FORMATTING TRACK $ SIDE= $, TRACK= $, SECTOR= $, STATUS= $ FATAL READ VERIFY ERROR DETECTED: $ OPTION (CR to Exit, S to Skip, R to Retry) ? $DRIVE NOT READY$DISK IS WRITE PROTECTED$WRITE FAULT$RECORD NOT FOUND$CRC ERROR$LOST DATA$DATA REQUEST$ FORMATTING ABORTED$   ( fPN 2N N BNfNN|2>:f3)0R3>)30R3=363D>3E>3 >0f3xG3x0:R3 2N N BNfNN|2>:f3)0R3>)30R3=363D>3E>3 >0f3xG3x0:R3ystem Tracks only (Y,N) : $ Supress Format Verification (Y,N) : $ Insert Diskett Into Drive $ And Press The Return Key $ Formatting Complete$ Option (CR to Exit, C to Continue) : $ Option (CR for Same Parameters, N for New Parameters) : $ FORMATTING & VERIFYING$ TRACK $ $ FORMATTING TRACK $ SIDE= $, TRACK= $, SECTOR= $, STATUS= $ FATAL READ VERIFY ERROR DETECTED: $ OPTION (CR to Exit, S to Skip, R to Retry) ? $DRIVE NOT READY$DISK IS WRITE PROTECTED$WRITE FAULT$RECORD NOT FOUND$CRC ERROR$LOST DATA$DATA REQUEST$ FORMATTING ABORTED$   ( f .xlist ;-------------------------------- ; AUTHOR Marcus G. Calescibetta ; DATE May 2, 1984 ; VERSION 2.3 ;-------------------------------- false equ 0 true equ not false ;;--------------- ;; DRIVE EQUATES ;;--------------- ;; ;; high byte = no. of logical drives on physical drive ;; low byte = physical drive type number (a unique no. identifing drive type) ;; nodrive equ 000fh ;; use to skip logigical drives f548 equ 01f0h ;; 5.25" - 48 tpi floppy drive f596 equ 01f1h ;; 5.25" - 96 tpi floppy drive f8 equ 01f2h ;; 8" floppy drive st503 equ 0100h ;; Seagate 503 st506 equ 0101h ;; Seagate 506 tm601s equ 0102h ;; Tandon 601s tm602s equ 0103h ;; Tandon 602s tm603s equ 0104h ;; Tandon 603s tm603se equ 0205h ;; Tandon 603se tm501 equ 0106h ;; Tandon 501 tm502 equ 0207h ;; Tandon 502 tm503 equ 0208h ;; Tandon 503 sa602 equ 0109h ;; Shugart 602 sa604 equ 010ah ;; Shugart 604 sa606 equ 010bh ;; Shugart 606 sa1002 equ 010ch ;; Shugart 1002 sa1004 equ 010dh ;; Shugart 1004 q2010 equ 010eh ;; Quantum 2010 q2020 equ 020fh ;; Quantum 2020 q2030 equ 0310h ;; Quantum 2030 q2040 equ 0411h ;; Quantum 2040 m4010 equ 0112h ;; Mini Scribe 4010 m4020 equ 0213h ;; Mini Scribe 4020 dma5 equ 0114h ;; DMA 5 removable dma55c equ 0215h ;; DMA 5/5 cartriage boot dma55f equ 0216h ;; DMA 5/5 fixed boot maxhst defl 0 ;; maximum host sector size maxusg defl 0 ;; maximum no. phy sec per block frst8 defl 0ffffh ;; first 8" floppy drive flag frst548 defl 0ffffh ;; first 5.25" 48 tpi floppy drive flag frst596 defl 0ffffh ;; first 5.25" 96 tpi floppy drive flag ;;------------------------------------ ;; MACRO - DISK PARAMETER DEFINITIONS ;;------------------------------------ dskdef macro drvstr .lall ;------------------ ; SYSTEM DRIVE MAP ;------------------ .xall hpdno defl 0 ;; hard disk physical drive no. fpdno defl 0 ;; floppy disk physical drive no. dno defl 0 ;; logical drv no. of our drvs cnt defl 0 ;; cnt of how many entrys made drvmap: irp drvtyp, if drvtyp lt 16 xdmap %drvtyp ;; enter previous drv into dmap cnt defl cnt+1 else if drvtyp eq nodrive xxdmap ;; enter no drv entry into dmap cnt defl cnt+1 else if (drvtyp eq f8) or (drvtyp eq f548) or (drvtyp eq f596) dmap %dno,drvtyp,%fpdno fpdno defl fpdno+1 dno defl dno+1 cnt defl cnt+1 else rep (drvty sh 8 ; ente logica drv int dmap dmap %dno,drvtyp,%hpdno dno defl dno+1 cnt defl cnt+1 endm hpdno defl hpdno+1 endif endif endif endm rept (010h-cnt) ;; fill in rest of drive map xxdmap endm dno defl 0 hpdno defl 0 fpdno defl 0 irp drvtyp, ;;-------------------------------- ;; 5.25" 48-TPI FLOPPY DISK DRIVE ;;-------------------------------- if drvtyp eq f548 dph %dno,drvtyp if frst548 eq 0ffffh fdpb548: ;;----------------------------------------------------- ;; XEROX 820, KAYPRO II SINGLE DENSITY FORMAT ;;----------------------------------------------------- ;; ;; dpb 10,18,3,7,0,82,31,8,3,1024 ;; ;;----------------------------------------------------- ;; OSBORNE SINGLE DENSITY FORMAT ;;----------------------------------------------------- ;; ;; dpb 10,20,4,15,1,45,63,16,3,2048 ;; ;;----------------------------------------------------- dpb 10,20,4,15,1,45,63,16,3,2048 dpb 11,32,4,15,0,77,63,32,1,2048 dpb 12,64,4,15,0,155,127,32,1,2048 fddb548: ;;----------------------------------------------------- ;; XEROX 820, KAYPRO II SINGLE DENSITY FORMAT ;;----------------------------------------------------- ;; ;; ddb 10,%fpdno,0,0,1024,128,64,1 ;; ;;----------------------------------------------------- ;; OSBORNE SINGLE DENSITY FORMAT ;;----------------------------------------------------- ;; ;; ddb 10,%fpdno,0,0,2048,256,64,1 ;; ;;----------------------------------------------------- ddb 10,%fpdno,0,0,2048,256,64,1 ddb 11,%fpdno,0,0,2048,1024,4,1 ddb 12,%fpdno,0,0,2048,1024,4,2 tran548: ;;----------------------------------------------------- ;; XEROX 820, KAYPRO II SINGLE DENSITY FORMAT ;;----------------------------------------------------- ;; ;; db 1,6,11,16,3,8,13,18,5 ;; db 10,15,2,7,12,17,4,9,14 ;; ds 8,0ffh ;; ;;----------------------------------------------------- ;; OSBORNE SINGLE DENSITY FORMAT ;;----------------------------------------------------- ;; ;; db 2,3,6,7,10,11,14,15,18,19 ;; db 4,5,8,9,12,13,16,17,20,21 ;; ds 6,0ffh ;; ;;----------------------------------------------------- db 2,3,6,7,10,11,14,15,18,19 db 4,5,8,9,12,13,16,17,20,21 ds 6,0ffh frst548 defl 0 endif alvcsv %dno,155,32 dno defl dno+1 endif ;;-------------------------------- ;; 5.25" 96-TPI FLOPPY DISK DRIVE ;;-------------------------------- if drvtyp eq f596 dph %dno,drvtyp if frst596 eq 0ffffh fdpb596: dpb 20,18,3,7,0,82,63,16,3,1024 dpb 21,32,4,15,0,150,63,32,1,2048 dpb 22,64,4,15,0,300,127,32,1,2048 fddb596: ddb 20,%fpdno,0,0,1024,128,32,1 ddb 21,%fpdno,0,0,2048,1024,4,1 ddb 22,%fpdno,0,0,2048,1024,4,2 tran596: db 1,7,13,19,25,5,11,17,23,3,9,15,21 db 2,8,14,20,26,6,12,18,24,4,10,16,22 frst596 defl 0 endif alvcsv %dno,300,32 dno defl dno+1 endif ;;---------------------- ;; 8" FLOPPY DISK DRIVE ;;---------------------- if drvtyp eq f8 dph %dno,drvtyp if frst8 eq 0ffffh fdpb8: dpb 30,26,3,7,0,242,63,16,2,1024 dpb 31,64,4,15,0,303,127,32,1,2048 dpb 32,128,4,15,0,607,255,32,1,2048 fddb8: ddb 30,%fpdno,0,0,1024,128,32,1 ddb 31,%fpdno,0,0,2048,1024,8,1 ddb 32,%fpdno,0,0,2048,1024,8,2 tran8: db 1,7,13,19,25,5,11,17,23,3,9,15,21 db 2,8,14,20,26,6,12,18,24,4,10,16,22 frst8 defl 0 endif alvcsv %dno,607,32 dno defl dno+1 endif ;;------------------------------------------- ;; DMA MICRO MAGNUM 5/5 HARD DISK FIXED BOOT ;;------------------------------------------- if drvtyp eq dma55f dph %dno dph %dno+1 dpb %dno+0,128,5,31,1,1219,511,0,1,4096 dpb %dno+1,128,5,31,1,1219,511,0,1,4096 ddb %dno+0,%hpdno,2,15,4096,256,32,2 ddb %dno+1,%hpdno,0,15,4096,256,32,2 alvcsv %dno+0,1219,0 alvcsv %dno+1,1219,0 dno defl dno+2 endif ;;----------------------------------------------- ;; DMA MICRO MAGNUM 5/5 HARD DISK CARTRIAGE BOOT ;;----------------------------------------------- if drvtyp eq dma55c dph %dno dph %dno+1 dpb %dno+0,128,5,31,1,1219,511,0,1,4096 dpb %dno+1,128,5,31,1,1219,511,0,1,4096 ddb %dno+0,%hpdno,0,15,4096,256,32,2 ddb %dno+1,%hpdno,2,15,4096,256,32,2 alvcsv %dno+0,1219,0 alvcsv %dno+1,1219,0 dno defl dno+2 endif ;;------------------------------ ;; DMA MICRO MAGNUM 5 HARD DISK ;;------------------------------ if drvtyp eq dma5 dph %dno dpb %dno+0,128,5,31,1,1219,511,0,1,4096 ddb %dno+0,%hpdno,0,15,4096,256,32,2 alvcsv %dno+0,1219,0 dno defl dno+1 endif ;;------------------ ;; ST 503 HARD DISK ;;------------------ if drvtyp eq st503 dph %dno dpb %dno+0,128,5,31,1,607,511,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,2 alvcsv %dno+0,607,0 dno defl dno+1 endif ;;------------------ ;; ST 506 HARD DISK ;;------------------ if drvtyp eq st506 dph %dno dpb %dno+0,256,5,31,1,1215,511,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,4 alvcsv %dno+0,1215,0 dno defl dno+1 endif ;;------------------- ;; TM 601S HARD DISK ;;------------------- if drvtyp eq tm601S dph %dno dpb %dno+0,128,5,31,1,607,511,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,2 alvcsv %dno+0,607,0 dno defl dno+1 endif ;;------------------- ;; TM 602S HARD DISK ;;------------------- if drvtyp eq tm602S dph %dno dpb %dno+0,256,5,31,1,1215,511,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,4 alvcsv %dno+0,1215,0 dno defl dno+1 endif ;;------------------- ;; TM 603S HARD DISK ;;------------------- if drvtyp eq tm603S dph %dno dpb %dno+0,384,5,31,1,1823,1023,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,6 alvcsv %dno+0,1823,0 dno defl dno+1 endif ;;-------------------- ;; TM 603SE HARD DISK ;;-------------------- if drvtyp eq tm603SE dph %dno dph %dno+1 dpb %dno+0,384,5,31,1,2047,1023,0,1,4096 dpb %dno+1,384,5,31,1,699,511,0,172,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,6 ddb %dno+1,%hpdno,0,0,4096,512,16,6 alvcsv %dno+0,2047,0 alvcsv %dno+1,699,0 dno defl dno+2 endif ;;------------------ ;; TM 501 HARD DISK ;;------------------ if drvtyp eq tm501 dph %dno dpb %dno+0,128,5,31,1,1219,511,0,1,4096 ddb %dno+0,%hpdno,0,3,4096,512,16,2 alvcsv %dno+0,1219,0 dno defl dno+1 endif ;;------------------ ;; TM 502 HARD DISK ;;------------------ if drvtyp eq tm502 dph %dno dph %dno+1 dpb %dno+0,256,5,31,1,2047,1023,0,1,4096 dpb %dno+1,256,5,31,1,391,511,0,257,4096 ddb %dno+0,%hpdno,0,3,4096,512,16,4 ddb %dno+1,%hpdno,0,3,4096,512,16,4 alvcsv %dno+0,2047,0 alvcsv %dno+1,391,0 dno defl dno+2 endif ;;------------------ ;; TM 503 HARD DISK ;;------------------ if drvtyp eq tm503 dph %dno dph %dno+1 dpb %dno+0,384,5,31,1,2047,1023,0,1,4096 dpb %dno+1,384,5,31,1,1611,1023,0,172,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,6 ddb %dno+1,%hpdno,0,0,4096,512,16,6 alvcsv %dno+0,2047,0 alvcsv %dno+1,1611,0 dno defl dno+2 endif ;;------------------ ;; SA 602 HARD DISK ;;------------------ if drvtyp eq sa602 dph %dno dpb %dno+0,128,5,31,1,635,511,0,1,4096 ddb %dno+0,%hpdno,0,3,4096,512,16,2 alvcsv %dno+0,635,0 dno defl dno+1 endif ;;------------------ ;; SA 604 HARD DISK ;;------------------ if drvtyp eq sa604 dph %dno dpb %dno+0,256,5,31,1,1271,511,0,1,4096 ddb %dno+0,%hpdno,0,3,4096,512,16,4 alvcsv %dno+0,1271,0 dno defl dno+1 endif ;;------------------ ;; SA 606 HARD DISK ;;------------------ if drvtyp eq sa606 dph %dno dpb %dno+0,384,5,31,1,1907,1023,0,1,4096 ddb %dno+0,%hpdno,0,3,4096,512,16,6 alvcsv %dno+0,1907,0 dno defl dno+1 endif ;;------------------- ;; SA 1002 HARD DISK ;;------------------- if drvtyp eq sa1002 dph %dno dpb %dno+0,128,5,31,1,1019,511,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,2 alvcsv %dno+0,1019,0 dno defl dno+1 endif ;;------------------- ;; SA 1004 HARD DISK ;;------------------- if drvtyp eq sa1004 dph %dno dpb %dno+0,256,5,31,1,2039,1023,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,4 alvcsv %dno+0,2039,0 dno defl dno+1 endif ;;------------------------ ;; QUANTUM 2010 HARD DISK ;;------------------------ if drvtyp eq q2010 dph %dno dpb %dno+0,128,5,31,1,2043,1023,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,2 alvcsv %dno+0,2043,0 dno defl dno+1 endif ;;------------------------ ;; QUANTUM 2020 HARD DISK ;;------------------------ if drvtyp eq q2020 dph %dno dph %dno+1 ;; ;; Partion drive by track offset (use Q2020 loader) ;; ;; dpb %dno+0,256,5,31,1,2047,1023,0,1,4096 ;; dpb %dno+1,256,5,31,1,2039,1023,0,257,4096 ;; ddb %dno+0,%hpdno,0,0,4096,512,16,4 ;; ddb %dno+1,%hpdno,0,0,4096,512,16,4 ;; alvcsv %dno+0,2047,0 ;; alvcsv %dno+1,2039,0 ;; ;; Partion drive by head offset (use Q2010 loader) ;; ;; dpb %dno+0,128,5,31,1,2043,1023,0,1,4096 ;; dpb %dno+1,128,5,31,1,2043,1023,0,1,4096 ;; ddb %dno+0,%hpdno,0,0,4096,512,16,2 ;; ddb %dno+1,%hpdno,2,0,4096,512,16,2 ;; alvcsv %dno+0,2043,0 ;; alvcsv %dno+1,2043,0 ;; dpb %dno+0,256,5,31,1,2047,1023,0,1,4096 dpb %dno+1,256,5,31,1,2039,1023,0,257,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,4 ddb %dno+1,%hpdno,0,0,4096,512,16,4 alvcsv %dno+0,2047,0 alvcsv %dno+1,2039,0 dno defl dno+2 endif ;;------------------------ ;; QUANTUM 2030 HARD DISK ;;------------------------ if drvtyp eq q2030 dph %dno dph %dno+1 dph %dno+2 dpb %dno+0,384,5,31,1,2047,1023,0,1,4096 dpb %dno+1,384,5,31,1,2047,1023,0,172,4096 dpb %dno+2,384,5,31,1,2031,1023,0,343,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,6 ddb %dno+1,%hpdno,0,0,4096,512,16,6 ddb %dno+2,%hpdno,0,0,4096,512,16,6 alvcsv %dno+0,2047,0 alvcsv %dno+1,2047,0 alvcsv %dno+2,2031,0 dno defl dno+3 endif  ;;------------------------ ;; QUANTUM 2040 HARD DISK ;;------------------------ if drvtyp eq q2040 dph %dno dph %dno+1 dph %dno+2 dph %dno+3 dpb %dno+0,512,5,31,1,2047,1023,0,1,4096 dpb %dno+1,512,5,31,1,2047,1023,0,129,4096 dpb %dno+2,512,5,31,1,2047,1023,0,257,4096 dpb %dno+3,512,5,31,1,2031,1023,0,385,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,8 ddb %dno+1,%hpdno,0,0,4096,512,16,8 ddb %dno+2,%hpdno,0,0,4096,512,16,8 ddb %dno+3,%hpdno,0,0,4096,512,16,8 alvcsv %dno+0,2047,0 alvcsv %dno+1,2047,0 alvcsv %dno+2,2047,0 alvcsv %dno+3,2031,0 dno defl dno+4 endif ;;--------------------------- ;; MINISCRIBE 4010 HARD DISK ;;--------------------------- if drvtyp eq m4010 dph %dno dpb %dno+0,128,5,31,1,1915,1023,0,1,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,2 alvcsv %dno+0,1915,0 dno defl dno+1 endif ;;--------------------------- ;; MINISCRIBE 4020 HARD DISK ;;--------------------------- if drvtyp eq m4020 dph %dno dph %dno+1 dpb %dno+0,256,5,31,1,2047,1023,0,1,4096 dpb %dno+1,256,5,31,1,1783,1023,0,257,4096 ddb %dno+0,%hpdno,0,0,4096,512,16,4 ddb %dno+1,%hpdno,0,0,4096,512,16,4 alvcsv %dno+0,2047,0 alvcsv %dno+1,1783,0 dno defl dno+2 endif if (drvtyp eq f8) or (drvtyp eq f548) or (drvtyp eq f596) fpdno defl fpdno+1 else if drvtyp gt 15 hpdno defl hpdno+1 endif endif endm if frst8 eq 0ffffh fdpb8: ; no 8" floppy used but need label fddb8: ; no 8" floppy used but need label tran8: ; no 8" floppy used but need label endif if frst548 eq 0ffffh fdpb548: ; no 5"-48 tpi drv used but need label fddb548: ; no 5"-48 tpi drv used but need label tran548: ; no 5"-48 tpi drv used but need label endif if frst596 eq 0ffffh fdpb596: ; no 5"-96 tpi drv used but need label fddb596: ; no 5"-96 tpi drv used but need label tran596: ; no 5"=96 tpi drv used but need label endif usgblk: ds maxusg ; maximum # host sectors / block dirbuf: ds 128d ; cp/m directory buffer storage hstbuf: ; host buffer follows endm ;;------------------- ;; MACRO - DRIVE MAP ;;------------------- dmap macro dn,drvtyp,pdno if drvtyp eq f548 db 1,pdno ; 5" - 48 tpi floppy dw dph&dn,ddb&10 else if drvtyp eq f596 db 2,pdno ; 5" - 96 tpi floppy dw dph&dn,ddb&20 else if drvtyp eq f8 db 3,pdno ; 8" floppy dw dph&dn,ddb&30 else db 0,pdno ; hard disk dw dph&dn,ddb&dn endif endif endif endm xdmap macro dn db 010h,dn ; other bio's drive dw 0,0 endm xxdmap macro db 0ffh,0ffh ; no drive selected dw 0ffffh,0ffffh endm ;;--------------------------- ;; MACRO - DISK HEADER BLOCK ;;--------------------------- dph macro dn,dtyp .lall ;------------------- ; DISK HEADER BLOCK ;------------------- .xall dph&dn: dw 0000 ; translation vector dw 0000 ; scratch pad 1 dw 0000 ; scratch pad 2 dw 0000 ; scratch pad 3 dw dirbuf ; dirbuf addr ifb dw dpb&dn ; dpb addr for hrd dsk else dw 0 ; dpb addr for fpy filled in dynamicly endif dw csv&dn ; directory check vector dw alv&dn ; disk allocation vector endm ;;------------------------------ ;; MACRO - DISK PARAMETER BLOCK ;;------------------------------ dpb macro dn,spt,bsh,blm,exm,dsm,drm,cks,off,bsiz .lall ;---------------------- ; DISK PARAMETER BLOCK ;---------------------- .xall dpb&dn: dw spt ; cpm sectors per track db bsh ; block shift factor db blm ; block mask db exm ; extent mask dw dsm ; no. blocks on drive dw drm ; no. directory entrys rsvdir dn,drm,bsiz ;;reserved directory blocks dw cks ; no. directory entries to check dw off ; track offset endm ;;------------------------------- ;; MACRO - DISK DEBLOCKING BLOCK ;;------------------------------- ddb macro dn,pd,hdoff,srate,bsiz,hsiz,hsspt,hhd .lall ;----------------------- ; DISK DEBLOCKING BLOCK ;----------------------- .xall ddb&dn: dw hsiz ; host sec size ssiz hsiz ;;sdh register sector size db pd ; physical drive no. db hdoff ; head offset (for partioning by hds) db srate ; cmd register step rate db hsspt-1 ; host sec per trk - 1 (hst sec msk) db (bsiz/hsiz)-1 ; host sec per blk - 1 (blk sec msk) shff ((hsiz/128)*hsspt) ;;calc log2 cpm spt shff (bsiz/128) ;;calc log2 cpm spb db hhd-1 ; heads - 1 shff (hsiz/128) ;;calc log2 cpm sps db (hsiz/128)-1 ; cpm sps - 1 if hsiz gt maxhst maxhst defl hsiz endif if (bsiz/hsiz) gt maxusg maxusg defl (bsiz/hsiz) endif endm ;;-------------------------------------- ;; MACRO - COMPUTE ALV AND CSV BUF SIZE ;;-------------------------------------- alvcsv macro dn,dsm,cks .lall ;--------------------------------------- ; DRIVE ALLOCATION AND CHECK SUM VECTOR ;--------------------------------------- .xall alv&dn: ds (dsm/8)+1 ; drive block allocation vector csv&dn: ds cks ; drive directory check vector endm ;;-------------------------------------- ;; MACRO - COMPUTE NO. DIRECTORY BLOCKS ;;-------------------------------------- rsvdir macro dn,drm,bsiz x defl ((drm+1)/(bsiz/32)) y defl 080h done defl 0 al0&dn defl 0 al1&dn defl 0 rept 8 if x eq 0 db al0&dn ; directory block allocation 0 db al1&dn ; directory block allocation 1 done defl 0ffh exitm endif al0&dn defl al0&dn or y y defl y shr 1 x defl x-1 endm y defl 080h if done eq 0 rept 8 if x eq 0 db al0&dn ; directory block allocation 0 db al1&dn ; directory block allocation 1 done defl 0ffh exitm endif al1&dn defl al1&dn or y y defl y shr 1 x defl x-1 endm endif if done eq 0 db al0&dn ; directory block allocation 0 db al1&dn ; directory block allocation 1 endif endm ;;----------------------------------- ;; MACRO - COMPUTE DRIVE SECTOR SIZE ;;----------------------------------- ssiz macro secsiz if secsiz eq 128 db 060h ; sdh reg sec siz 060 = 128 bps else if secsiz eq 512 db 020h ; sdh reg sec siz 020 = 512 bps else if secsiz eq 256 db 000h ; sdh reg sec siz 000 = 256 bps else db 000h endif endif endif endm ;;------------------------------ ;; MACRO - COMPUTE SHIFT FACTOR ;;------------------------------ shff macro num @y defl num @x defl 0 rept 8 if @y eq 1 db @x ; log2 (num) exitm endif @y defl @y shr 1 @x defl @x + 1 endm endm .list lock allocation 1 done defl 0ffh exitm endif al1&dn defl al1&dn or y y defl y shr 1 x defl x-1 endm endif if done eq 0 db al0&dn ; directory block allocation 0 db al1&dn ; directory block allocation 1 endif endm ;;----------------------------------- ;; MACRO - COMPUTE DRIVE SECTOR SIZE ;;----------------------------------- ssiz macro secsiz if secsiz eq 128 db 060h ; sdh reg sec siz 060 = 128 bps else if secsiz eq 512 db 020h ; sdh reg sec siz 020 = TITLE 'DUMP - Recreated by Z80DIS' ORG 0100H CPM EQU 0005H DFCB EQU 005CH FCBEXT EQU 0065H DUMP LD DE,DFCB LD C,0FH ;SI CALL CPM ;OPENFIL INC A JR NZ,FILEOK LD DE,CANTOPE LD C,09H ;HT CALL CPM ;PRNTSTG RET FILEOK LD HL,FCBEXT LD A,(HL) CP 43H ;'C' JR NZ,NEXTPAGE INC HL LD A,(HL) CP 4FH ;'O' JR NZ,NEXTPAGE INC HL LD A,(HL) CP 4DH ;'M' JR NZ,NEXTPAGE LD HL,DUMP LD (ADDR),HL NEXTPAGE LD E,0CH ;FF LD C,02H ;STX CALL CPM ;CONOUT LD A,08H ;BS LD (PAGECNT),A NEXTSECT LD DE,DFCB LD C,14H ;DC4 CALL CPM ;READSEQ OR A RET NZ LD A,08H ;BS LD (LINECNT),A LD HL,0080H LD (ADDR1),HL NXTLINE LD C,0BH ;VT CALL CPM ;CONSTAT OR A RET NZ LD HL,OUTBUF LD (HL),0DH ;CR INC HL LD (HL),0AH ;LF INC HL LD DE,(ADDR) LD A,D CALL HEXOUT LD A,E CALL HEXOUT LD (HL),20H ;' ' INC HL EX DE,HL LD BC,0010H ADD HL,BC LD (ADDR),HL EX DE,HL LD DE,(ADDR1) LD B,10H ;DLE NXTBYTE LD A,(DE) INC DE CALL HEXOUT LD (HL),20H ;' ' INC HL DJNZ NXTBYTE LD (HL),20H ;' ' INC HL LD (HL),24H ;'$' LD DE,OUTBUF LD C,09H ;HT CALL CPM ;PRNTSTG LD HL,(ADDR1) LD B,10H ;DLE NXTASCI LD A,(HL) INC HL AND 7FH ;DEL CP 20H ;' ' JR C,CTRL CP 7FH ;DEL JR NZ,NOTCTRL CTRL LD A,2EH ;'.' NOTCTRL LD E,A LD C,02H ;STX PUSH BC PUSH HL CALL CPM ;CONOUT POP HL POP BC DJNZ NXTASCI LD (ADDR1),HL LD HL,LINECNT DEC (HL) JP NZ,NXTLINE LD HL,PAGECNT DEC (HL) JP NZ,NEXTSECT JP NEXTPAGE HEXOUT PUSH AF RRA RRA RRA RRA AND 0FH ;SI ADD A,30H ;'0' CP 3AH ;':' JR C,HEX1 ADD A,07H ;BEL HEX1 LD (HL),A INC HL POP AF AND 0FH ;SI ADD A,30H ;'0' CP 3AH ;':' JR C,HEX2 ADD A,07H ;BEL HEX2 LD (HL),A INC HL RET CANTOPE DEFB 43H,61H,6EH,27H,74H,20H ; Can't DEFB 4FH,70H,65H,6EH,20H,46H ; Open F DEFB 69H,6CH,65H,24H ; ile$ LINECNT DEFS 0001H ADDR DEFS 0002H ADDR1 DEFS 0002H PAGECNT DEFS 0001H OUTBUF  DEFS 0004H END 9H ;HT CALL CPM ;PRNTSTG LD HL,(ADDR1) LD B,10H ;DLE NXTASCI LD A,(HL) INC HL AND 7FH ;DEL CP 20H ;' ' JR C,CTRL CP 7FH ;DEL JR NZ,NOTCTRL CTRL LD A,2EH ;'.' NOTCTRL LD E,A LD C,02H ;STX PUSH BC PUSH HL CALL CPM ;CONOUT POP HL POP BC DJNZ NXTASCI LD (ADDR1),HL LD HL,LINECNT DEC (HL) JP NZ,NXTLINE LD HL,PAGECNT DEC (HL) JP NZ,NEXTSECT JP NEXTPAGE HEXOUT PUSH AF RRA RRA RRA RRA AND 0FH ;SI ADD A,30H ;'0' CP 3AH ;':' JR C,HEX1 ADD A,07H ;BEL HEX1 LD (HL),A INC HL POP AF AND 0FH ;SI ADD A,30H ;'0' CP 3AH ;':' JR C,HEX2 ADD A,07H ;BEL HEX2 LD (HL),A INC HL RET CANTOPE DEFB 43H,61H,6EH,27H,74H,20H ; Can't DEFB 4FH,70H,65H,6EH,20H,46H ; Open F DEFB 69H,6CH,65H,24H ; ile$ LINECNT DEFS 0001H ADDR DEFS 0002H ADDR1 DEFS 0002H PAGECNT DEFS 0001H OUTBUF ST&p@sAh@ @0F~Da"{Cp '"\(nO`>@ [4 [/#nzf'k6`"{]nl8l al$ K4 >@ `F?# p f@A"|D/`ՄO_`ta/P|>spc7?CwHfp ' l2'SUPRBIOSBAK+,-./012SUPRBIOSBAK3456789:SUPRBIOSBAK;<SUPRBIOSMAC=>?@ABCDSUPRBIOSMACEFGHIJKLSUPRBIOSMACMNOPQRSTSUPRBIOSMACUVWXYZ[\SUPRBIOSMAC]^UNDELETECOM_Z80ASM COM`abcdefgZ80ASM COM,hijSLRNK COM=klmnSLRIB COMopCONFIG COMqrDUMP Z80stDUMP $$$INTRFACEDOC,MNOZ80 LIBNPQRSTFORMAT DOCULOOK COMVW'DUMP - Recreated by Z80DIS' Z80ASM 1.09 Page 1 DUMP Z80 1 TITLE 'DUMP - Recreated by Z80DIS' 2 0100 3 ORG 0100H 4 0005 5 CPM EQU 0005H 005C 6 DFCB EQU 005CH 0065 7 FCBEXT EQU 0065H 8 0100 9 DUMP 0100 11 005C 10 LD DE,DFCB 0103 0E 0F 11 LD C,0FH ;SI 0105 CD 0005 12 CALL CPM ;OPENFIL 0108 3C 13 INC A 0109 20 09 14 JR NZ,FILEOK 010B 11 01E6 15 LD DE,CANTOPE 010E 0E 09 16 LD C,09H ;HT 0110 CD 0005 17 CALL CPM ;PRNTSTG 0113 C9 18 RET 0114 19 FILEOK 0114 21 0065 20 LD HL,FCBEXT 0117 7E 21 LD A,(HL) 0118 FE 43 22 CP 43H ;'C' 011A 20 12 23 JR NZ,NEXTPAGE 011C 23 24 INC HL 011D 7E 25 LD A,(HL) 011E FE 4F  26 CP 4FH ;'O' 0120 20 0C 27 JR NZ,NEXTPAGE 0122 23 28 INC HL 0123 7E 29 LD A,(HL) 0124 FE 4D 30 CP 4DH ;'M' 0126 20 06 31 JR NZ,NEXTPAGE 0128 21 0100 32 LD HL,DUMP 012B 22 01F7 33 LD (ADDR),HL 012E 34 NEXTPAGE 012E 1E 0C 35 LD E,0CH ;FF 0130 0E 02 36 LD C,02H ;STX 0132 CD 0005 37 CALL CPM ;CONOUT 0135 3E 08 38 LD A,08H ;BS 0137 32 01FB 39 LD (PAGECNT),A 013A 40 NEXTSECT 013A 11 005C 41 LD DE,DFCB 013D 0E 14 42 LD C,14H ;DC4 013F CD 0005 43 CALL CPM ;READSEQ 0142 B7 44 OR A 0143 C0 45 RET NZ 0144 3E 08 46 LD A,08H ;BS 0146 32 01F6 47 LD (LINECNT),A 0149 21 0080 48 LD HL,0080H 014C 22 01F9 49 LD (ADDR1),HL 014F 50 NXTLINE 014F 0E 0B 51 LD C,0BH ;VT 0151 CD 0005 52 CALL CPM ;CONSTAT 0154 B7 53 OR A 0155 C0 54 RET NZ 0156 21 01FC 55 LD HL,OUTBUF 0159 36 0D 56 LD (HL),0DH ;CR 015B 23 57 INC HL 015C 36 0A 58 LD (HL),0AH ;LF 'DUMP - Recreated by Z80DIS' Z80ASM 1.09 Page 2 DUMP Z80 015E 23 59 INC HL 015F ED 5B 01F7 60 LD DE,(ADDR) 0163 7A 61 LD A,D 0164 CD 01C7 62 CALL HEXOUT 0167 7B 63 LD A,E 0168 CD 01C7 64 CALL HEXOUT 016B 36 20 65 LD (HL),20H ;' ' 016D 23 66 INC HL 016E EB 67 EX DE,HL 016F 01 0010 68 LD BC,0010H 0172 09 69 ADD HL,BC 0173 22 01F7 70 LD (ADDR),HL 0176 EB 71 EX DE,HL 0177 ED 5B 01F9 72 LD DE,(ADDR1) 017B 06 10 73 LD B,10H ;DLE 017D 74 NXTBYTE 017D 1A 75 LD A,(DE) 017E 13 76 INC DE 017F CD 01C7 77 CALL HEXOUT 0182 36 20 78 LD (HL),20H ;' ' 0184 23 79 INC HL 0185 10 F6 80 DJNZ NXTBYTE 0187 36 20 81 LD (HL),20H ;' ' 0189 23 82 INC HL 018A 36 24 83 LD (HL),24H ;'$' 018C 11 01FC 84 LD DE,OUTBUF 018F 0E 09 85 LD C,09H ;HT 0191 CD 0005 86 CALL CPM ;PRNTSTG 0194 2A 01F9 87 LD HL,(ADDR1) 0197 06 10 88 LD B,10H ;DLE 0199 89 NXTASCI 0199 7E 90 LD A,(HL) 019A 23 91 INC HL 019B E6 7F 92 AND 7FH ;DEL 019D FE 20 93 CP 20H ;' ' 019F 38 04 94 JR C,CTRL 01A1 FE 7F 95 CP 7FH ;DEL 01A3 20 02 96 JR NZ,NOTCTRL 01A5 97 CTRL 01A5 3E 2E 98 LD A,2EH ;'.' 01A7 99 NOTCTRL 01A7 5F 100 LD E,A 01A8 0E 02 101 LD C,02H ;STX 01AA C5 102 PUSH BC 01AB E5 103 PUSH HL 01AC CD 0005 104 CALL CPM ;CONOUT 01AF E1 105 POP HL 01B0 C1 106 POP BC 01B1 10 E6 107 DJNZ NXTASCI 01B3 22 01F9 108 LD (ADDR1),HL 01B6 21 01F6 109 LD HL,LINECNT 01B9 35 110 DEC (HL) 01BA C2 014F 111 JP NZ,NXTLINE 01BD 21 01FB 112 LD HL,PAGECNT 01C0 35 113 DEC (HL) 01C1 C2 013A 114 JP NZ,NEXTSECT 01C4 C3 012E 115 JP NEXTPAGE 01C7 116 HEXOUT 'DUMP - Recreated by Z80DIS' Z80ASM 1.09 Page 3 DUMP Z80 01C7 F5 117 PUSH AF 01C8 1F 118 RRA 01C9 1F 119 RRA 01CA 1F 120 RRA 01CB 1F 121 RRA 01CC E6 0F 122 AND 0FH ;SI 01CE C6 30 123 ADD A,30H ;'0' 01D0 FE 3A 124 CP 3AH ;':' 01D2 38 02 125 JR C,HEX1 01D4 C6 07 126 ADD A,07H ;BEL 01D6 127 HEX1 01D6 77 128 LD (HL),A 01D7 23 129 INC HL 01D8 F1 130 POP AF 01D9 E6 0F 131 AND 0FH ;SI 01DB C6 30 132 ADD A,30H ;'0' 01DD FE 3A 133 CP 3AH ;':' 01DF 38 02 134 JR C,HEX2 01E1 C6 07 135 ADD A,07H ;BEL 01E3 136 HEX2 01E3 77 137 LD (HL),A 01E4 23 138 INC HL 01E5 C9 139 RET 01E6 140 CANTOPE 01E6 43 61 6E 27 141 DEFB 43H,61H,6EH,27H,74H,20H ; Can't 01EC 4F 70 65 6E 142 DEFB 4FH,70H,65H,6EH,20H,46H ; Open F 01F2 69 6C 65 24 143 DEFB 69H,6CH,65H,24H ; ile$ 01F6 144 LINECNT 01F6 0001 145 DEFS 0001H 01F7 146 ADDR 01F7 0002 147 DEFS 0002H 01F9 148 ADDR1 01F9 0002 149 DEFS 0002H 01FB 150 PAGECNT 01FB 0001 151 DEFS 0001H 01FC 152 OUTBUF 01FC 0004 153 DEFS 0004H 154 END 0 Error(s) Detected. 512 Absolute Bytes. 21 Symbols Detected. 'DUMP - Recreated by Z80DIS' Z80ASM 1.09 Page 4 Symbol Table:  01F7 ADDR 01F9 ADDR1 01E6 CANTOPE 0005 CPM 01A5 CTRL 005C DFCB 0100 DUMP 0065 FCBEXT 0114 FILEOK 01D6 HEX1 01E3 HEX2 01C7 HEXOUT 01F6 LINECNT 012E NEXTPAGE 013A NEXTSECT 01A7 NOTCTRL 0199 NXTASCI 017D NXTBYTE 014F NXTLINE 01FC OUTBUF 01FB PAGECNT 'DUMP - Recreated by Z80DIS' Z80ASM 1.09 Page 5 Cross Reference: 01F7 ADDR 33 60 70 146 01F9 ADDR1 49 72 87 108 148 01E6 CANTOPE 15 140 0005 CPM 5 12 17 37 43 52 86 104 01A5 CTRL 94 97 005C DFCB 6 10 41 0100 DUMP 9 32 0065 FCBEXT 7 20 0114 FILEOK 14 19 01D6 HEX1 125 127 01E3 HEX2 134 136 01C7 HEXOUT 62 64 77 116 01F6 LINECNT 47 109 144 012E NEXTPAGE 23 27 31 34 115 013A NEXTSECT 40 114 01A7 NOTCTRL 96 99 0199 NXTASCI 89 107 017D NXTBYTE 74 80 014F NXTLINE 50 111 01FC OUTBUF 55 84 152 01FB PAGECNT 39 112 150  014F NXTLINE 01FC OUTBUF 01FB PAGECNT 'DUMP - Recreated by Z80DIS' Z80ASM 1.09 Page 5 Cross Reference: 01F7 ADDR 33 60 70 146 01F9 ADDR1 49 72 87 108 148 01E6 CANTOPE 15 140 0005 CPM 5 12 17 37 43 52 86 104 01A5 CTRL 94 97 005C DFCB 6 10 41 0100 DUMP 9 32 0065 FCBEXT 7 20 0114 FILEOK 14 19 01D6 HEX1 125 127 01E3 HEX2 134 136 01C7 HEXOUT 62 64 77 116 1ͫͫͅ0802ͫͅD(S >>2: >#ͫͅS >D >2OͫͅN(Y : >22{ͫͅN(Y >2: >M2:(*!Y "!" ":(>>2!2 !>2!2 "!">2""ͫ:0ͤͫ ͤ> ͤͱW2> ͫz! ~ #((K!  2: :( :(L2 ( B:(Qz : >2z>**,>2z **B**BͫͫͫͅC 2ͫͅʘN :O"^#~f(K# *F#~# w#r#:w#s#w# :=G::+w#2ɯ2   >P: aڣ{ң__ : Xͫͫͫ ͫͫz DISK ERROR: $  ͫ#> ":22~:(>> ( 2 :=(2#:ͱ:<2 8ͫ:#ͫ:͌ͫzͫ~ͫ:6ͫͅSR ͱ2*\ͱ2Ê:G:Gz( : > WRITE ERROR: $"ͫ#yG(gͫLx@(wͫ?x (ͫ2x(ͫ%x(ͫx(ͫ x(ͫ????͌Ɛ'@'ͤ FORMATTING $FMT8 3.2 $ Enter Disk Drive To Be Formatted (0-3) : $ Enter Density, Single or Double (S,D) : $ Format Single or Double Sided (S,D) : $ Format System Tracks only (Y,N) : $ Supress Format Verification (Y,N) : $ Insert Diskett Into Drive $ And Press The Return Key $ Formatting Complete$ Option (CR to Exit, C to Continue) : $ Option (CR for Same Parameters, N for New Parameters) : $ FORMATTING & VERIFYING$ TRACK $ $ FORMATTING TRACK $ SIDE= $, TRACK= $, SECTOR= $, STATUS= $ FATAL READ VERIFY ERROR DETECTED: $ OPTION (CR to Exit, S to Skip, R to Retry) ? $DRIVE NOT READY$DISK IS WRITE PROTECTED$WRITE FAULT$RECORD NOT FOUND$CRC ERROR$LOST DATA$DATA REQUEST$ FORMATTING ABORTED$   ( fPN 2N N BNfNN:f3>0f3y*{3w+"{36 *{32Ow+ ʏ3 3~3w+ ~3Ô2ʢ3w+22 2N N ensity, Single or Double (S,D) : $ Format Single or Double Sided (S,D) : $ Format System Tracks only (Y,N) : $ Supress Format Verification (Y,N) : $ Insert Diskett Into Drive $ And Press The Return Key $ Formatting Complete$ Option (CR to Exit, C to Continue) : $ Option (CR for Same Parameters, N for New Parameters) : $ FORMATTING & VERIFYING$ TRACK $ $ FORMATTING TRACK $ SIDE= $, TRACK= $, SECTOR= $, STATUS= $ FATAL READ VERIFY ERROR DETECTED: $ OPTION (CR to Exit, S to Skip, R to Retry) ? $DRIVE NOT READY$DISK IS WRITE PROTECTED$WRITE FAULT$RECORD NOT FOUND$CRC ERROR$LOST DATA$DATA REQUEST$ FORMATTING ABORTED$ >o:~W!{> " OC > S>O3 setdma ; set dma address jp read ; read disk jp wr1!2|~N#Fx2CN#FC$#^#V^#VS#~2#~2<2###~2#^#VSN#FCC*KB0KC:( [0!'~#"* (,*#"+))[R$~! !!Bx͎qput+[[R8 utx7?R#|(/ sr +utwwNFqpnf^:(#~W#:G)[7?K R0! !<NFx(ENF C$7?KnfB8C[0MD!' |:n!<!NFnfB#>,(0W}_nfRut<RDM!B76! [36:G6!w0 ͗!3͗ !͘>O3F#Nů  SYS out (0),a ret : Which .SYS file to load 0 = CPM 1 = OSLOAD ? SelectReadFile not found error: file 34L9C567Â\ÅÖ}Ûñ8ÊL(T(y>͢( ͮ(!!e ^#V;  ! C C2 z( Ni`C, ɯ2 >2Z Ͳ z: :> 21 :F [, :A 25 :C [, :? 24 :G [, _> !3 "6 :D [, S8 :B [5 2: :0 !J `[2 *L `:4 !N ::5 !O :n*8 [R `m! [: F:Z fnm͔nͲ!. H [ *P :Z ŒÖ:B ! p#=[T ! >wͨ( u Ju:K G :W G:N KL xy:O :W ˗KN A!!! [J ~ W:J _: : :L ({2 x2 :L w:O G:W _(x> lV:U G!3 :V klͨ( ((: <2 2X CL ɯ2 *. ~*H ~! [0 ~2= (ʹ  -\~:= w*. ~(8#~2= >ͤ != := _>ͤ :\ != Ͱ  := ! g( ! o(! _( W(s#rͰ := _ % g(  o( s#r:= ! g( ! o(! _(  W(*. s#r!:= w:=  > ͤ G x>  !3 >  ![ >   > := g(!0 O !9 O(!B  z( Y (! ͂ :0 A͌ ͂ 9(> >2 ~#$Č OC! 6#! [0 w*. ##^#V*. ^#V>= ɧ:=#={z Bios Err on $: Drive Not Ready$a  ? ?@/ _ `     nt),a ; reset retry count ld a,1 ; set operation to read ld (oper),a ; save it for when we do xfer call deblk ; deblock phy sec, buf adr, and blk sec call inbuf ; check if new sector is in buf call xfer ; transfer data outdeblk ; deblock phy sec, buf adr, and blk sec call inbuf ; check if new:20010000115C000E0FCD05003C200911E6010E09CD0500C92165007EFE432012237EFE4F0F :20012000200C237EFE4D200621000122F7011E0C0E02CD05003E0832FB01115C000E14CD69 :200140000500B7C03E0832F60121800022F9010E0BCD0500B7C021FC01360D23360A23EDC1 :200160005BF7017ACDC7017BCDC701362023EB0110000922F701EBED5BF90106101A13CD38 :20018000C70136202310F6362023362411FC010E09CD05002AF90106107E23E67FFE2038B8 :2001A00004FE7F20023E2E5F0E02C5E5CD0500E1C110E622F90121F60135C24F0121FB0115 :2001C00035C23A01C32E01F51F1F1F1FE60FC630FE3A3802C6077723F1E60FC630FE3A387A :1601E00002C6077723C943616E2774204F70656E2046696C6524B4 :00000001FF EX1 ADD A,07H ;BEL HEX1 LD (HL),A INC HL POP AF AND 0FH ;SI ADD A,30H ;'0' CP 3AH ;':' JR C,HEX2 ADD A,07H ;BEL HEX2 LD (HL),A INC HL RET CANTOPE DEFB 43H,61H,6EH,27H,74H,20H ; Can't DEFB 4FH,70H,65H,6EH,20H,46H ; Open F DEFB 69H,6CH,65H,24H ; ile$ LINECNT DEFS 0001H ADDR DEFS 0002H ADDR1 DEFS 0002H PAGECNT DEFS 0001H OUTBUF ,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVALID MEMORY SIZE$!$ʡ~/w/wʔ|g*"z|?¸>@G!>0w#w!4~:60+4~u!N#F! x, # =!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m ʅ xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  w#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 34 CPM60.COM"$*|  CONSTRUCTING 60k CP/M vers 2.2$ ^=>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q*1y{0!B0}y|zx0y0{00Ԁ\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ԯ2 Շ!۶2:2a{_:۷ʖ:۷>Ľʖ:=2–!B!6#5ʖ:۷Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ַ"͌#>?͌͘ =_.:;<> Oօo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 3ׯ21y_͸2y2ͽ:Է1͘A͌>>͌92^ :۷¥.!_~#fow]٭ڎڥ!v"!çREAD ERRORçNO FILE^:۷ ! ~ 3#0 Wx x ր ւ G ~ # 3x~#B!Y~ɯ2:۷=!۾ý:۷=!۾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ٯw4!Y~ʆ͌†t=ʆf ^ T ٯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yڸpsp2mÆÆf ͧÆFILE EXISTS _: É: :۷ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ۯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !۶ Â$$$ SUBgܙܥܫܱ"C{2!"E9"1A߯22!ty)K!G_^#V*Cސ~E ,&-AGMSߛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :߷E B 2>: ߷b# : ߷y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ߾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ݯ2 H! >w_: ! ߾5ͤNkͱ¦ͱxʊ#Nx: ߷! ߖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:页o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*鯆# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A߾#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:E߷ẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E߷͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!B߾w!>2*C~=2u:B2~2wE:A*C߶w>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2óadjmrux}çìûpñns ns<nskLns{?      60k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j>~ͻ>2!"2!"28!"9:O R![?boot  ç!y2fyʒ>0G!h~ϰwi&))))3!jq!kq ~2koi`"l~Oj#!h~w !kw ?L:f>g yxzӉxӊY?28L28L8 >:fIyۉ:fV{ۋ:fcxۈ:ʑw:2E**E}DQ>2óadjmrux}çìûpñns ns<nskLns{?      60k CP/M vers 2.2 1!21 ͻ}ͧͬ,I*lDMͻ:k:j>~ͻ>2!"2!"28!"9:O R![?boot  ç!a×âÐÙëül.oÀgÅÛtU G+ G+ Ď((T ^hp!p:!x:!:!x:????!p:??!x:!:'_^#V([!{<2~(y*|>>/s1H*|<(2\!w͙h(p(y>> >/͏(y>>1͝2.|'^#VS*3!1NFx(BoNF Cg7?KnfB8C[tMD̀ͅ >2!"2*5":O*3!vy2l!=8"j~(##^#V( (!Sw CCnz( Ni`Chɯ2>2;͵:ɯ22y2ͩ͝͵;͵: >2:̝::z2m:[hg:}2q:[hg:{2p:!h_>p!a"r:[hgSt:~[q2v:l![n*y:p!j:q!jͩ*t[y͝![vF:–ͩͩ͝ :2!j[*::~!p#=[!>w( KQ (͚( K| (ͥ:'''!!Kxy:K!!:˗!X[~ ~w(:!w(x(~9:KY(<>0Ͱ> :G!a::G!a:( ((:<22Cɯ2*j~*~!H[l~2y< P# kz͜:yw*j~@(8#~2y>=9!y:y_>=?͘:!yI :y! g( !so(!%_( W(s#rI:y_ ag( o(ys#r:y!:g( !o(!R_(  W(*js#r!:yw:y͵> =G͵x> _  w !a> k_ (!a> _ !> _ > _:yg(! O ! O(! _z((!:lA%͐(> >2~#$% O͙!H6#!X[lw*j##^#V*j^#V>= ɧ:=#={z͑{M Warm Boot Error - Reset System$ Bios Err on $: Drive Not Ready$: Write Protected Disk$ 3w+ 2"{3q3(:> :<.33PX 2|2>:f3)0R3>::cR{?@/ _ `     "?/c4> \^4U :U H0ʄ4H=;: y4ɯ;:͞:!*#@*?!!44͍ 4:@¾C02@*?r:5H=͈:3 4*@*@*?"?"@"@ bkë4:?2@+5ů2@@ :@ʊ5-? M? @ ?  +,ĝ5) <ĝw+:> G6G5͌2 D6>R? ? @, `     \4>Ô5^4*%@>2@3H0ʱ6 ʶ1;ʫ1'ʡ6"ʡ6>1Ç6G͕0 ʶ1ʛ6â6"%@;:͞:!*#@* @*?!!64>2@" @͍ 7:@6x 7* @##~#7+4r:47H=r:1:3 7* @1>2>2!>~ '#F ###^#V!~!~p= !1 !; !`|G^>>>:??C!  00G>0O Super Bios v. 2.3 K CP/M 2.2 installed $D`DÇ6U ĝ*@18:@<2@= 2=xx2=*=T9"=:=2=@ !!@Ns#Frͦ9ͯ9q#p*@^#V+*@##^#V+*!@}9ͯ9"!@9*@ "@*)@͍ I;*?%:?͍ I;*@T9ͦ9*%@{_{:s#r#>w#wͯ9%:s#r*:"#@*#@ͦ9s#r{_*%@{̺9*@w{W:a:"%@{_ͯ9zʺ9*@}‚:}o~r:{ʗ:a:{_ͯ9{ȯw#w*@s#r͔9*#@ͦ9q#p*%@{:*@"%@~{_ͦ9{_{:a:*@*?:?;*)@%T9o zo W{_*@*@T9BK*s#r͔9*#@ͦ9q#p*%@{~ '#F ###^#V!~!~p= !1 !; !`|G^>>>:??C!  00G>0O Super Bios v. 2.3 K CP/M 2.2 installed $D`DÇ6U ĝ*@18:@<2@= 2=xx2=*=T9"=:=2=@ !!@Ns#Frͦ9ͯ9q#p*@^#V+*@##^#V+*!@}9ͯ9"!@9*@ "@*)@͍ I;*?%:?͍ I;*@T9ͦ9*%@{_{:s#r#>w#wͯ9%:s#r*:"#@*#@ͦ9s#r{_*%@{̺9*@w{W:a:"%@{_ͯ9zʺ9*@}‚:}o~r:{ʗ:a:{_ͯ9{ȯw#w*@s#r͔9*#@ͦ9q#p*%@{\X COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ԯ2 Շ!۶2:2a{_:۷ʖ:۷>Ľʖ:=2–!B!6#5ʖ:۷Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ "ַ"͌#>?͌͘ =_.:;<> Oօo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" #~?  xDIR ERA TYPESAVEREN USERg!yO#< Ty#O 3ׯ21y_͸2y2ͽ:Է˜1͘A͌>>͌92^ :۷¥.!_~#fow]٭ڎڥ!v"!çREAD ERRORçNO FILE^:۷ ! ~ 3#0 Wx x ր ւ G ~ # 3x~#B!Y~ɯ2:۷=!۾ý:۷=!۾:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ ٯw4!Y~ʆ͌†t=ʆf ^ T ٯ2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yڸpsp2mÆÆf ͧÆFILE EXISTS _: É: :۷ʉ=2)ͽÉ T!@k!}|q=qf^!~2>`~2ۯ2\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: !۶ Â$$$ SUBgܙܥܫܱ"C{2!"E9"1A߯22!ty)K!G_^#V*Cސ~E ,&-AGMSߛ!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 O͐  :߷E B 2>: ߷b# : ߷y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! ߾ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7ݯ2 H! >w_: ! ߾5ͤNkͱ¦ͱxʊ#Nx: ߷! ߖ2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#2E>! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^"*}:*)=":O:页o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*鯆# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A߾#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:E߷ẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E߷͊:==»y==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!B߾w!>2*C~=2u:B2~2wE:A*C߶w>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2a×âÐÙëül.oÀgÅÛt((T ^hp!p:!x:!:!x:????!p:??!x:!:'_^#V([!{<2~(y*|>>/s1H*|<(2\!w͙h(p(y>> >/͏(y>>1͝2.|'^#VS*3!1NFx(BoNF Cg7?KnfB8C[tMD̀ͅ >2!"2*5":O*3!vy2l!=8"j~(##^#V( (!Sw CCnz( Ni`Chɯ2>2;͵:ɯ22y2ͩ͝͵;͵: >2:̝::z2m:[hg:}2q:[hg:{2p:!h_>p!a"r:[hgSt:~[q2v:l![n*y:p!j:q!jͩ*t[y͝![vF:–ͩͩ͝ :2!j[*::~!p#=[!>w( KQ (͚( K| (ͥ:'''!!Kxy:K!!:˗!X[~ ~w(:!w(x(~9:KY(<>0Ͱ> :G!a::G!a:( ((:<22Cɯ2*j~*~!H[l~2y< P# kz͜:yw*j~@(8#~2y>=9!y:y_>=?͘:!yI :y! g( !so(!%_( W(s#rI:y_ ag( o(ys#r:y!:g( !o(!R_(  W(*js#r!:yw:y͵> =G͵x> _  w !a> k_ (!a> _ !> _ > _:yg(! O ! O(! _z((!:lA%͐(> >2~#$% O͙!H6#!X[lw*j##^#V*j^#V>= ɧ:=#={z͑{M Warm Boot Error - Reset System$ Bios Err on $: Drive Not Ready$: Write Protected Disk$!w4!iw:Z!E~=262*C!!~~#~::cR{?@/ _ `     w!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~C*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;-? M? @ ?  R? ? @, `     N   :!_zV#_~  :!):!!!1: !9:1>2>2!>~ '#F ###^#V!~!~p= !1 !; !`|G^>>>:??C!  00G>0O Super Bios v. 2.3 K CP/M 2.2 installed $D`D( *|>Gx((Ox& }<2~sT1T*$} ͌[! w}<2{TMAyx >/:(>>2>(y>ÌÝÎÓBÊ FLOPPY rErE8?@/ _      y2y2CG 8"~G:G:~ >2> !5 Um-͚ >> 2 :O :G:y~ :28 q*~(P>(=(!& :22ͺ>2 /E͙0zW: #͢8 /2:2 >2>2v /2{l: >2 /*>2>2**":>2 /E͙0zW:w# øa*xxw# Ó'~#fo&'q#p:B(* ͅ ~'M(:J2A(*;" 2 U6+:A(wAMz(2A(7(:B((*;" :A(2B(*;r#s+:A(i(*;͢(" 2A(2B(!* p# P(!HN#*~# ^(Ar#s *){ʅ({ƀ_҅(zʞ()Å(ͣ) *)!.*ʹ)!.*V#^(((!((ʹ)(z(!.*ʹ)(ͣ)z{7.1e`r`:0802U>2R:R >`:S >D >2Q`:N(Y :R >2L2O"`:N(Y >2=:Q(>>2T:O >M2L>2M! "D!"F!"H"JN`:U0Yk` Y> YfW2P͔> ͥK`z$! ~ #(! ͽ 2Nµ:= :Q( :P(82P͔ ( ʦB:L(=z>ͥ*D*F>2P͔z *H*J *D*F t```:C 2S`:ʃN :MO"B^#~f(# *BF#~# w#r#:Pw#s#w# :P=G:S:T+w#2Sɯ23  1 >P:3 aX{X__ := `)`K` g`K`z$ DISK ERROR: $  `> "@:M2>2?~:P(>> ( 2N :>=(2>#:?f:?<2? 8`:N`:P1`z$`~$`:N$`:ʦSʆR f2P͔*@%f2P͔S:PG:UX WRITE ERROR: $"@`.G(`Lx@(`?x (6`2x(B`%x(S`x(]` x(g`????1Ɛ'@'Y FORMATTING $FMT596 3.2 $ Enter Disk Drive To Be Formatted (0-3) : $ Enter Density, Single or Double (S,D) : $ Format Single or Double Sided (S,D) : $ Format System Tracks only (Y,N) : $ Supress Format Verification (Y,N) : $ Insert Diskett Into Drive $ And Press The Return Key $ Formatting Complete$ Option (CR to Exit, C to Continue) : $ Option (CR for Same Parameters, N for New Parameters) : $ FORMATTING & VERIFYING$ TRACK $ $ FORMATTING TRACK $ SIDE= $, TRACK= $, SECTOR= $, STATUS= $ FATAL READ VERIFY ERROR DETECTED: $ OPTION (CR to Exit, S to Skip, R to Retry) ? $DRIVE NOT READY$DISK IS WRITE PROTECTED$WRITE FAULT$RECORD NOT FOUND$CRC ERROR$LOST DATA$DATA REQUEST$ FORMATTING ABORTED$   ( fPN 2N N BNfNN|2>:f3)0R3>)30R3=363D>3E>3 >0f3xG3x0:R3 2N N BNfNN|2>:f3)0R3>)30R3=363D>3E>3 >0f3xG3x0:R3ystem Tracks only (Y,N) : $ Supress Format Verification (Y,N) : $ Insert Diskett Into Drive $ And Press The Return Key $ Formatting Complete$ Option (CR to Exit, C to Continue) : $ Option (CR for Same Parameters, N for New Parameters) : $ FORMATTING & VERIFYING$ TRACK $ $ FORMATTING TRACK $ SIDE= $, TRACK= $, SECTOR= $, STATUS= $ FATAL READ VERIFY ERROR DETECTED: $ OPTION (CR to Exit, S to Skip, R to Retry) ? $DRIVE NOT READY$DISK IS WRITE PROTECTED$WRITE FAULT$RECORD NOT FOUND$CRC ERROR$LOST DATA$DATA REQUEST$ FORMATTING ABORTED$   ( f>o:~W!{> " OC > S>O31!2|~N#Fx2CN#FC$#^#V^#VS#~2#~2<2###~2#^#VSN#FCC*KB0KC:( [0!'~#"* (,*#"+))[R$~! !!Bx͎qput+[[R8 utx7?R#|(/ sr +utwwNFqpnf^:(#~W#:G)[7?K R0! !<NFx(ENF C$7?KnfB8C[0MD!' |:n!<!NFnfB#>,(0W}_nfRut<RDM!B76! [36:G6!w0 ͗!3͗ !͘>O3F#Nů  SYS: Which .SYS file to load 0 = CPM 1 = OSLOAD ? SelectReadFile not found error: file ~# *. ͜:<3C 2> >  (Strike any key to continue)$^#V#N#F_ #wl)) )38=ÂB>V>a>ozi` n&VaoGVx(OxAG:G:~ > 2:O y~ 8 q *~($d8̈́FͶ2:2::2>2>27U> 2> :G /_~(!y*:{  _ U(  := >2 ~ ( w:2F8 <2y2:W::G:(7:Gz?G![G!y> z͗22>wɷw/:}:Gz?G![G!y> z͗22>wɷw/:}:Gz>o:~W!{> " OC > S>O31!2|~N#Fx2CN#FC$#^#V^#VS#~2#~2<2###~2#^#VSN#FCC*KB0KC:( [0!'~#"* (,*#"+))[R$~! !!Bx͎qput+[[R8 utx7?R#|(/ sr +utwwNFqpnf^:(#~W#:G)[7?K R0! !<NFx(ENF C$7?KnfB8C[0MD!' |:n!<!NFnfB#>,(0W}_nfRut<RDM!B76! [36:G6!w0 ͗!3͗ !͘>O3F#Nů  SYS: Which .SYS file to load 0 = CPM 1 = OSLOAD ? SelectReadFile not found error: file ~# *. ͜:<3C 2> >  (Strike any key to continue)$^#V#N#F_ #wl)) )38=ÂB>V>a>ozi` n&VaoGVx(OxAG:G:~ > 2:O y~ 8 q *~($d8̈́FͶ2:2::2>2>27U> 2> :G /_~(!y*:{  _ U(  := >2 ~ ( w:2F8 <2y2:W::G:(7:Gz?G![G!y> z͗22>wɷw/:}:Gz!!8080 CPU?${ͅ; DCON Debugger$| }*|(=g.x( ~#bx( { ~#o}o0.!5!~# ~: #~= #~(~#('08' 80))))o">*20{(  ++ Reloc Ignored ++$ Ý=,y $ 1"! 6 # 5! w # 1A' KByQ180ɾ# * { #z +++ : 1>H2  ~@̿ #  —A #2 HXY": [! x1y! ~14: ]1: 1̈́: ]G: ]G: +-1x1>--x /<2>"! ͏1 y9191=: H1: H1m: HĄX>(5>ÿ* " : 1! x1yc͏Q! 6>!>* w#" /_~ X.X%! 6! 56>!w! ͏ªyƛc irڑ<ʢڱڵ<<(1ER[o{!!Z!Q* yoxg |1}ր!ͿQͿx@cGOc͸ͿZ7G91 <8 b=ÚGLyiÿ Z1cUyi<O cGͽO͵ycC×@O͵øcBG͵Lbi!͵O! vGy(×L¤: 1> : J ͬ C ͬͿyÝR1͏** {zX~#"  : >o&) N>[ ' +-/< ]: H%>X>YyO ~@' # - z8LO! ~ #~ - - L SP' * ! 0 * h!9" :2 !!"<<2 * ! X! ~(5X͌2 W!}p  pppv@jzOʂqme!zL! :W@!z8!6!L6* +" +V'W@!R=!V=ʽ=ʱz!p!5vL!Z6!n!Jz8!:Lrz2 WvvFjzpz Sz4==ʵz"\!ʋz:z!:z!v* #~v~!R!:n!CSJRSzʬ==ʵ!z=( 86n:nF!n!:L?!!:L!:Lz!5W_n!& 5 !N 5! 5  _W! :z 0 ?* !9" ͌" * " * 0 83  Ɛ':' '/7?v (08"*2:DEFGMOVW^_goSI@DLI@DPCI@SPI@XTI@DAD@OTDRINDRCCDRLDDROTIRINIRCCIRLDIROUTDIND CCD LDD OUTIINI CCI LDI RLD RRD LDARIM2 LDAIIM1 STARRETISTAIIM0 RETNNEG DSBCDADCINP OUTPSBCDLBCDSDEDLDEDSHLDLHLDSSPDLSPDRLCRRRCRRALRRARRSLARSRARSLLRSRLRBIT RES SET POP PUSHRST LXI INX DAD DCX STAXLDAXMVI INR DCR ADD ADC SUB SBB ANA XRA ORA CMP MOV CALLJMP LDA STA LHLDSHLDJRC JRNCJRZ JRNZJMPRDJNZCPI ORI XRI ANI SBI IN SUI OUT ACI ADI EI SPHLDI XCHGPCHLXTHLEXX RET HLT CMC STC CMA DAA RAR RAL RRC EXAFRLC NOP *"NZZ NCC POPEP M B C D E H L M A B D @ SP PSW DB 6 > ßüE7göa~.ñ" ! *"< !6 "!""!2 2 2 2 !" " "!" !"'!1!!++"!1!" *R")!s:22!:2%! 6 2&!R>28! "9:] (!%1!! ! 76 .>#ͼ (! 6- 5Aұ_! ^#Vz  H  aE)p"M.Uñů2[\6 >2 ! ""!Rұ : (k =±" Rұ(" =( "=±> 2 ڱʱ= =  ! !"#!(8" =( =± * }o[#!" .7 * " ~>:: (^#V#~͓8 ~#͓8} " : * ͆* } | * ͓ + ±{z͞ |±ʹ }2 .2 " " DM! 6(8"!=( l =(YPl ! ~(+#^#V: (*!{ z " ~62 #w6 1!1!*!*!! ~4(#~#F# x ~#s#r#w> =(#=±.~ᯕo>g~ .F>#z { 8<(>'{>' .*!6##V+^+N+y 5 .6~ 4~+(7 >: ->!2!w.!v:2!(!!:2!(!All regs displayed 8080 regs only Pre-trace display Post-trace display :&!ʱ (w!Rڱ!o& 6 User=!(:%!!>.!.0 Version !ex#y#* !}|@" !: !@ڱ!=: ( ± ! !|±"!! ~(#~#V z :!w  :!ʱ! ~ :!w#s#r  ñ! ~(: (6.~#^#VF !(=±"!!l !~# :]?X ʱ>HXE3*!y\6 |w# Jʱ: W_O { x!(i`"!<w# J±ͿͿGтWx!@8: k >ULT3! !\~# 2|:] ʘ!)X <ʱʘ!8_*! (  8*+ ( (!ڱw{ұ*#^#Vr+s+6@ұ*"s#s#r f!*!*"! .O(,I±=±2"! :"!>=Ox±Oy |±}.!3* !~*!~*+~. SYMBOLS NEXT PC END =±.~: k^#V~~ͼ (U. : >."  (w#- : >- +: (+=±: (s#r#±}w#: (#O>>2 !" #(8 }ʱ=( =±" " 2 :2!( u .͞ ʹ B E#7/ YY.~~ #   G ‰x'± cx/!ozd( !d K D.͝ͼ = +x0)| }0]gA>Ag} ñ | E~!!!!p ͆s#r O B!!3!?(N"(edO(: (Z(y (,( ( (21!ñ>21!(h"/!s(: (("( (_  ("("(s#h(±ѷRڱ")!"'!s.*'!~*)!~:1!*+!K-!:3!sK/!:1!G(4! h#"-!"+!+" !"#! | |7 ?+!!'!:[(_!~(![4\6 2[7.>?   6 ! " > > 4 6_6 ~#a_! ~> ( 5* ~#" 007> >  6 ~: U >.^+~ : U .]>:|}0 0>.* }o|%)*/=@+- , 0 ñ^#V# 8 |{0*!Nyұ* * ͞( ( +  ͡(#^#V" " ~/o>g++" s#r#! 4- + [ ͡+ ͞ - ͞RS *(/ͷ( a)±.@ a^#V= a^'  ڱ' ͡'±S_$ *!^#V#$(^ H(D(7B(Xv#(-͡(mn,-( -(&I͡(YͿ))))o͡ ͡(=͡085 01)DM)) O ͡(͡080 {_zWñ|(}!)0 z l&A}g R0O ! 6# A,>2 dQ AdQ AdQ ± ʱ! 6W6!XN~!t!~] ʃ{_^!!͆^#Vxҷxѷ>-~/~>=/>'~!!!!~͕~.͝#x *!" !6z!o:2! !uR^ èW#~O+" *!~~H#͓ڨʏ^#Vy6‰zS_Fè~*!~¨#^+F*!~G¿xk@xvkx80kx645>=*!~*!%x*!*!: kU kUkx9*!~kk*!~9k4kk#^xdCZMEIABDHSPXY!" 2 "!+"!!91!!91!! *!~: 2 ! ~#^#V#~ R! ~6=G#^#V#~x7#"!!< N#Fʹ 7͔* >7 : ! ~ʙ#~#V*!™z™~=g=2 ~w~: ~u .<!*!F  C7=¸u *!g : * MD* : 7 .R!" ͔2 >**!R" E*!" :2!(. PASS ! ~* +" |8w=2 ~!/ ~##NAZ: * w2 ~CʞE¤ç*!F#;! s!^#V b`=GG8§ç:< := ^#V#^#*!^#V>éçxë8_ç*!§ú+~  : ?*!###çUçU>é{`/<_R~_!ʞʞ"ʞ{pʡ{5ʡ¤á>é><7* |! N*!!>#> : ! &>  =_~/w/w{ & = YP"!pCE" *!##F+N+~~ /o>g{y zy <33Z @ HI@B@HBH!I $$ I!@I !BBA$"B!B$I$ID$ $ $$!$DA$HHD$$@H  A@I @H!$$HD$HHHHBB!HAI$H "!$I$$!DB@"$HH"$BI$I$HI$IHI$ @$I$I$@A$$I$! HI $ BUUUUUU!  DI! $@ B$HH" D@ $$"@@ @@D !$ ""@@ $$D I HI!HDH$ H @IBD" $D$ B "I"$@I D@$BBI$$D@I@ IHBHBI HI !I$A! " I@" A@!"HHA $@@ " D"A D! ! @@H@BBBB@BI $$@H@" !"" BH $I I$IH$ @B$$H$  D! $!D$$I$I$$"A$$I I@!BBIUUUURI! B$ "H@!D@ADAI$ $ $$!$DA$HHD$$@H  A@I @H!$$HD$HHHHBB!HAI$H "!$I$$!DB@"$HH"$BI$I$HI$IHI$ @$I$I$@A$$I$! HI\<  !e~C #~O #~M !" >2\>2!" !6 #6 #[z{6 # "[6 #6 #6$ *~# 8 >._"!5O!5:.0:8w#0:8w#Can't Open File$IPLGEN00COM CPM SYSHSUPRBIOSBAK !"SUPRBIOSBAK#$%&'()*SUPRBIOSBAK+,-./012SUPRBIOSBAK3456789:SUPRBIOSBAK;<SUPRBIOSMAC=>?@ABCDSUPRBIOSMACEFGHIJKLSUPRBIOSMACMNOPQRSTSUPRBIOSMACUVWXYZ[\SUPRBIOSMAC]^UNDELETECOM_Z80ASM COM`abcdefgZ80ASM COM,hijSLRNK COM=klmnSLRIB COMopCONFIG COMqrDUMP Z80stDUMP RELuDUMP LST;vwxyDUMP HEXzDUMP $$$LOOK COMVW U$dh1MQIP5X`P h${wPdGX|i]:8i4fӰa ,iU^ i40,ɉj *Hѕ` Pʩɉ)qP8it mode out (pio1c),a ld a,01fh ;bits 0-4 input, bits 5-7 output out (pio1c),a ret ;done ; lstwsr: ld a,(parff) ;get form feed character ld c,a ;form feed character to c-reg ; lstout: ld hl,outchr ;get output character ld (hl),c ;save output character ld de,imspol ;get poll routine address call lnkpol## ;create poll routine call imspr ;execute poll routine ld hl,imssph ;get semaphore address jp wait## ;dispatch if necessary ; imspol: ;parallel out poll routine defw 0 defw 0 ; imspr: in a,(pio1d) ;get printer status and 1 ;printer busy? ret z ;if so, done ld a,(outchr) ;get output character out (pio0d),a ;output it ld a,80h ;toggle data strobe out (pio1d),a xor a out (pio1d),a  title TURBODOS OPERATING SYSTEM - SUPER SLAVE SERIAL I/O DRIVER FOR TWO PORTS subttl copyright 1983, software 2000, inc. .z80 ; ; copyright 1983, software 2000, inc. ; converted to MICROSOFT M80 format by ; Advaced Digital Corp. ; ; version: 07/12/83 ; name ('SSSIO2') ;module id ; include DREQUATE.LIB ;driver symbolic equivalences ; sioadr equ 00h ;sio port a data register sioacr equ 01h ;sio port a control register siobdr equ 02h ;sio port b data register siobcr equ 03h ;sio port b control register ; ; siobrr equ 10h ;sio baud rate generator register ; rda equ 0 ;received data available bit tbe equ 2 ;transmit buffer empty bit dcd equ 3 ;data carrier detect bit cts equ 3 ;clear to send bit ; DSEG ;locate in data area ; baudrt: db 0 ;baud rate register value ; s0ibsz:: dw 64 ;serial 0 input buffer size s0ibuf: dw 0 ;serial 0 input buffer address s0iptr: dw 0 ;serial 0 input pointer s0optr: dw 0 ;serial 0 output pointer s0icnt: dw 0  ;serial 0 input count s0iwct: db 0 ;serial 0 input wait count s0ochr: db 0 ;serial 0 output character s0br: db 0 ;serial 0 baud rate code ; s0isph: ;serial 0 input semaphore dw 0 ;semaphore count ..s0ih: dw ..s0ih ;semaphore p/d head dw ..s0ih ; ;serial 0 output semaphore s0osph: dw 0 ;semaphore count ..s0oh: dw ..s0oh ;semaphore p/d head dw ..s0oh ; s1ibsz:: dw 16 ;serial 1 input buffer size s1ibuf: dw 0 ;serial 1 input buffer address s1iptr: dw 0 ;serial 1 input pointer s1optr: dw 0 ;serial 1 output pointer s1icnt: dw 0 ;serial 1 input count s1iwct: db 0 ;serial 1 input wait count s1ochr: db 0 ;serial 1 output character s1br: db 0 ;serial 1 baud rate code ; ;serial 1 input semaphore s1isph: dw 0 ;semaphore count ..s1ih: dw ..s1ih ;semaphore p/d head dw ..s1ih ; ;serial 1 output semaphore s1osph: dw 0 ;semaphore count ..s1oh: dw ..s1oh ;semaphore p/d head dw ..s1oh ; COMMON /?init?/ ;locate in initialization area ; sionit:: ld hl,siovec## ;get interrupt vector address ld a,l ;get lsb of interrupt vector ld (wr2cwd),a ;set write register 2 control word ld hl,sioisr ;get interrupt service address ld (siovec##),hl ;set interrupt vector address ld hl,siopgm ;get sio program list ld bc,sioapl shl 8 or sioacr ;b=length/c=control reg otir ;program sio port a ld hl,siopgm ;get sio program list ld bc,siobpl shl 8 or siobcr ;b=length/c=control reg otir ;program sio port b ld hl,(s0ibsz) ;get serial 0 input buffer size call alloc## ;allocate packet for serial buffer ld (s0ibuf),hl ;save serial 0 input buffer address ld (s0iptr),hl ;set serial 0 input pointer ld (s0optr),hl ;set serial 0 output pointer ld hl,(s1ibsz) ;get serial 1 input buffer size call alloc## ;allocate packet for serial buffer ld (s1ibuf),hl ;save serial 1 input buffer address ld (s1iptr),hl ;set serial 1 input pointer ld (s1optr),hl ;set serial 1 output pointer ret ;done ; siopgm: db 18h ;reset channel db 4 ;select wr4 db 44h ;write register 4 control word db 5 ;select wr5 db 0eah ;write register 5 control word db 3 ;select wr3 db 0c1h ;write register 3 control word db 1 ;select wr1 db 10h ;write register 1 control word ; sioapl equ $-siopgm ;sio port a program length ; db 2 ;select wr2 wr2cwd: db 0 ;write register 2 control word ; siobpl equ $-siopgm ;sio port b program length ; cseg ;locate in program area ; serial:: comdrv:: ld a,e ;get function number or a ;function number=0? jr z,serst ;if so, continue cp 10 ;function number=10? jp z,seropt ;if so, continue dec a ;function number=1? jr z,serin ;if so, continue dec a ;function number=2? jp z,serout ;if so, continue dec a ;function number=3? jp z,sersbr ;if so, continue dec a ;function number=4? jp z,serrbr ;if so, continue dec a ;function number=5? jp z,sersmc ;if so, continue dec a ;function number=6? jp z,serrmc ;if so, continue ret ;else, done ; serst: ld a,b ;get channel number ld bc,(s0icnt) ;get serial 0 input buffer count ld hl,(s0optr) ;get serial 0 output pointer or a ;channel number=0 jr z,..com ;if so, continue ld bc,(s1icnt) ;get serial 1 input buffer count ld hl,(s1optr) ;get serial 1 output pointer ..com: ld a,b or c ;serial input buffer count=0? ret z ;if so, done ld c,(hl) ;else, get serial input character ld a,0ffh ;set return code=0ffh ret ;done ; serin: ld a,b ;get channel number or a ;channel number=0? jr nz,..s1i ;if not, continue ..s0i: di ;else, disable interrupts ld hl,(s0icnt) ;get serial 0 input count ld a,h or l ;serial 0 input count=0? jr z,..wt0 ;if so, continue dec hl ;decrement serial 0 input count ld (s0icnt),hl ;update serial 0 input count ld hl,(s0optr) ;get serial 0 output pointer ld a,(hl) ;get character from buffer inc hl ;increment serial 0 output pointer ex de,hl ;serial 0 output pointer to de-reg ld hl,(s0ibsz) ;get serial 0 input buffer size dec hl ;decrement input buffer size ld bc,(s0ibuf) ;get serial 0 input buffer address add hl,bc ;calc last input buffer address sbc hl,de ;buffer wrap-around? jr nc,..nwa0 ;if not, continue ld e,c ;get serial 0 input buffer address ld d,b ..nwa0: ld (s0optr),de ;update serial 0 output pointer ei ;enable interrupts ret ;done ..wt0: ld hl,s0iwct ;get serial 0 input wait count inc (hl) ;increment input wait count ld hl,s0isph ;get serial 0 input semaphore call wait## ;wait for console input jr ..s0i ;continue ..s1i: di ;disable interrupts ld hl,(s1icnt) ;get serial 1 input count ld a,h or l ;serial 1 input count=0? jr z,..wt1 ;if so, continue dec hl ;decrement serial 1 input count ld (s1icnt),hl ;update serial 1 input count ld hl,(s1optr) ;get serial 1 output pointer ld a,(hl) ;get character from buffer inc hl ;increment serial 1 output pointer ex de,hl  ;serial 1 output pointer to de-reg ld hl,(s1ibsz) ;get serial 1 input buffer size dec hl ;decrement input buffer size ld bc,(s1ibuf) ;get serial 1 input buffer address add hl,bc ;calc last input buffer address sbc hl,de ;buffer wrap-around? jr nc,..nwa1 ;if not, continue ld e,c ;get serial 1 input buffer address ld d,b ..nwa1: ld (s1optr),de ;update serial 1 output pointer ei ;enable interrupts ret ;done ..wt1: ld hl,s1iwct ;get serial 1 input wait count inc (hl) ;increment input wait count ld hl,s1isph ;get serial 1 input semaphore call wait## ;wait for console input jr ..s1i ;continue ; seropt: ld a,b ;get channel number or a ;channel number=1? ld a,10h ;get reset external status command jr nz,..s1o ;if channel number=1, continue out (sioacr),a ;else, reset external status in a,(sioacr) ;get sio port a status and 1 shl tbe ;transmit buffer empty? ret z ;if not, done ld a,(s0br) ;else, get serial 0 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr0 ;if not, continue in a,(sioacr) ;else, get sio port a status and 1 shl cts ;check clear to send status ret z ;if clear to send false, done ..nhr0: ld a,c ;get serial 0 output character out (sioadr),a ;output character ld a,0ffh ;set return code=0ffh ret ;done ..s1o: out (siobcr),a ;reset external status in a,(siobcr) ;get sio port b status and 1 shl tbe ;transmit buffer empty? ret z ;if not, done ld a,(s1br) ;else, get serial 1 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr1 ;if not, continue in a,(siobcr) ;else, get sio port b status and 1 shl cts ;check clear to send status ret z ;if clear to send false, done ..nhr1: ld a,c ;get serial 1 output character out (siobdr),a ;output character ld a,0ffh ;set return code=0ffh ret ;done ; serout: ld a,b ;get channel number or a ;channel number=1? ld a,10h ;get reset external status command jr nz,..s1o1 ;if channel number=1, continue out (sioacr),a ;else, reset external status in a,(sioacr) ;get sio port a status and 1 shl tbe ;transmit buffer empty? jr z,..s0nr ;if not, continue ld a,(s0br) ;else, get serial 0 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr2 ;if not, continue in a,(sioacr) ;else, get sio port a status and 1 shl cts ;check clear to send status jr z,..s0nr ;if clear to send false, continue ..nhr2: ld a,c ;get serial 0 output character out (sioadr),a ;output character ret ;done ..s0nr: ld a,c ;get serial 0 output character ld (s0ochr),a ;save output character ld de,s0opol ;get serial 0 out poll routine call lnkpol## ;create poll routine ld hl,s0osph ;get serial 0 out semaphore jp wait## ;dispatch if necessary ..s1o1: out (siobcr),a ;reset external status in a,(siobcr) ;get sio port b status and 1 shl tbe ;transmit buffer empty? jr z,..s1nr ;if not, continue ld a,(s1br) ;else, get serial 1 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr3 ;if not, continue in a,(siobcr) ;else, get sio port b status and 1 shl cts ;check clear to send status jr z,..s1nr ;if clear to send false, continue ..nhr3: ld a,c ;get serial 1 output character out (siobdr),a ;output character ret ;done ..s1nr: ld a,c ;get serial 1 output character ld (s1ochr),a ;save output character ld de,s1opol ;get serial 1 out poll routine call lnkpol## ;create poll routine ld hl,s1osph ;get serial 1 out semaphore jp wait## ;dispatch if necessary ; s0opol: ;serial 0 output poll routine dw 0 ;successor link pointer dw 0 ;predecessor link pointer ; ld a,10h ;get reset external status command out (sioacr),a ;reset external status in a,(sioacr) ;get sio port a status and 1 shl tbe ;transmit buffer empty? ret z ;if not, done ld a,(s0br) ;else, get serial 0 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr ;if not, continue in a,(sioacr) ;else, get sio port a status and 1 shl cts ;check clear to send status ret z ;if clear to send false, done ..nhr: ld a,(s0ochr) ;get serial 0 output character out (sioadr),a ;output character ld hl,s0opol ;get serial 0 out poll routine call unlink## ;unlink poll routine ld hl,s0osph ;get serial 0 out semaphore jp signal## ;signal process as ready ; s1opol: ;serial 1 output poll routine dw 0 ;successor link pointer dw 0 ;predecessor link pointer ; ld a,10h ;get reset external status command out (siobcr),a ;reset external status in a,(siobcr) ;get sio port b status and 1 shl tbe ;transmit buffer empty? ret z ;if not, done ld a,(s1br) ;else, get serial 1 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhra ;if not, continue in a,(siobcr) ;else, get sio port b status and 1 shl cts ;check clear to send status ret z ;if clear to send false, done ..nhra: ld a,(s1ochr) ;get serial 1 output character out (siobdr),a ;output character ld hl,s1opol ;get serial 1 out poll routine call unlink## ;unlink poll routine ld hl,s1osph ;get serial 1 out semaphore jp signal## ;signal process as ready ; sioisr:: ld (intsp##),sp ;save stack pointer ld sp,intstk## ;set up aux stack pointer push af ;save registers push bc push de push hl call ..s0i1 ;check for serial 0 input call ..s1i1 ;check for serial 1 input pop hl ;restore registers pop de pop bc pop af ld sp,(intsp##) ;restore stack pointer ei ;enable interrupts reti ;done ; ..s0i1: in a,(sioacr) ;get sio port a status bit rda,a ;character available ret z ;if not, done in a,(sioadr) ;get sio port a data character ld hl,s0br ;get serial 0 baud rate code bit 5,(hl) ;inhibit input flag set? ret nz ;if so, done ld c,a ;serial 0 data character to c-reg bit 7,(hl) ;sign bit on baud rate code? jr z,..nad0 ;if not, continue res 7,c ;else, strip sign bit on character call slvres## ;check for slave reset ld a,(atnchr##) ;get attention character cp c ;character=attention character? jr nz,..nad0 ;if not, continue ld hl,(s0iptr) ;else, get serial 0 input pointer ld (s0optr),hl ;reset serial 0 output pointer ld hl,0 ld (s0icnt),hl ;set serial 0 input count=0 ..nad0: ld hl,(s0ibsz) ;get serial 0 input buffer size ld de,(s0icnt) ;get serial 0 input count inc de ;increment serial 0 input count or a ;clear carry flag sbc hl,de ;serial 0 input buffer full? ret c ;if so, done ld (s0icnt),de ;else, update serial 0 input count ld hl,(s0iptr) ;get serial 0 input pointer ld (hl),c ;store input character in buffer inc hl ;increment input pointer ex de,hl ;de=input pointer/hl=buffer size ld hl,(s0ibsz) ;get serial 0 input buffer size dec hl ;decrement input buffer size ld bc,(s0ibuf) ;get serial 0 input buffer address add hl,bc ;calc last input buffer address sbc hl,de ;buffer wrap-around? jr nc,..nwa2 ;if not, continue ld e,c ;get serial 0 input buffer address ld d,b ..nwa2: ld (s0iptr),de ;update serial 0 input pointer ld de,s0iwct ;get serial 0 input wait count ld hl,s0isph ;get serial 0 input semaphore call ..sigc ;signal if necessary jr ..s0i1 ;continue ; ..s1i1: in a,(siobcr) ;get sio port b status bit rda,a ;character available ret z ;if not, done in a,(siobdr) ;get sio port b data character ld hl,s1br ;get serial 1 baud rate code bit 5,(hl) ;inhibit input flag set? ret nz ;if so, done ld c,a ;serial 1 data character to c-reg bit 7,(hl) ;attention detection flag set? jr z,..nad1 ;if not, continue res 7,c ;else, strip sign bit on character call slvres## ;check for slave reset ld a,(atnchr##) ;get attention character cp c ;character=attention character? jr nz,..nad1 ;if not, continue ld hl,(s1iptr) ;else, get serial 1 input pointer ld (s1optr),hl ;reset serial 1 output pointer ld hl,0 ld (s1icnt),hl ;set serial 1 input count=1 ..nad1: ld hl,(s1ibsz) ;get serial 1 input buffer size ld de,(s1icnt) ;get serial 1 input count inc de ;increment serial 1 input count or a ;clear carry flag sbc hl,de ;serial 1 input buffer full? ret c ;if so, done ld (s1icnt),de ;else, update serial 1 input count ld hl,(s1iptr) ;get serial 1 input pointer ld (hl),c ;store input character in buffer inc hl ;increment input pointer ex de,hl ;de=input pointer/hl=buffer size ld hl,(s1ibsz) ;get serial 1 input buffer size dec hl ;decrement input buffer size ld bc,(s1ibuf) ;get serial 1 input buffer address add hl,bc ;calc last input buffer address sbc hl,de ;buffer wrap-around? jr nc,..nwa3 ;if not, continue ld e,c ;get serial 1 input buffer address ld d,b ..nwa3: ld (s1iptr),de ;update serial 1 input pointer ld de,s1iwct ;get serial 1 input wait count ld hl,s1isph ;get serial 1 input semaphore call ..sigc ;signal if necessary jr ..s1i1 ;continue ..sigc: ld a,(de) ;get serial input wait count or a ;serial input wait count=0? ret z ;if so, done dec a ;decrement serial input wait count ld (de),a ;update serial input wait count jp signal## ;signal process as ready ; sersbr: ld a,b ;get channel number ld hl,s0br ;get serial 0 baud rate code or a ;channel number=0? jr z,..com1 ;if so, continue ld hl,s1br ;else, get serial 1 baud rate code ..com1: ld (hl),c ;save baud rate code ld a,c ;get requested baud rate code and 0fh ;extract relevant bits ld c,a ;update requested baud rate code ld a,b ;get channel number or a ;channel number=0? ld a,(baudrt) ;get baud rate register value jr z,..ch0 ;if channel number=0, continue and 0fh ;else, strip upper four bits ld b,a ;baud rate register value to b-reg ld a,c ;get requested baud rate code add a,a ;shift baud rate code to msn add a,a add a,a add a,a or b ;combine with baud rate register jr ..com2 ;continue ..ch0: and 0f0h ;strip lower four bits or c ;combine with baud rate register ..com2: out (siobrr),a ;set baud rate generator register ld (baudrt),a ;update baud rate register value ret ;done ; serrbr: ld hl,s0br ;get serial 0 baud rate ld a,b ;get channel number or a ;channel number=0? jr z,..com5 ;if so, continue ld hl,s1br ;else, get serial 1 baud rate ..com5: ld a,(hl) ;get current baud rate code ret ;done ; sersmc: ld a,0eah ;get write register 5 control word and 82h ;strip rts/cts control bits bit 7,c ;rts requested? jr z,..nrts set 1,a ;if so, set rts bit ..nrts: bit 6,c ;dtr requested? jr z,..ndtr set 7,a ;if so, set dtr bit ..ndtr: ld d,a ;requested modem controls to d-reg ld c,sioacr ;get sio port a control register ld a,b ;get channel number or a ;channel number=0? jr z,..com3 ;if so, continue ld c,siobcr ;get sio port b control register ..com3: ld a,5 ;get write register 5 di ;disable interrupts out (c),a ;select write register 5 out (c),d ;output control word ei ;enable interrupts ret ;done ; serrmc: ld c,sioacr ;get sio port a control register ld a,b ;get channel number or a ;channel number=0? jr z,..com4 ;if so, continue ld c,siobcr ;get sio port b control register ..com4: ld a,10h ;get reset external status command out (c),a ;reset external status in d,(c) ;get sio modem status xor a ;clear return vector bit cts,d ;cts set? jr z,..ncts ;if not, continue set 7,a ;else, set cts bit ..ncts: bit dcd,d ;dcd set? ret z ;if not, done set 5,a ;else, set dcd bit ret ;done ; end .ndtr: ld d,a ;requested modem controls to d-reg ld c,sioacr ;get sio port a control register ld a,b ;get channel number or a ;channel number=0? jr z,..com3 ;if so, continue ld c,siobcr ;get sio port b control register ..com3: ld a,5 ;get write register 5 di ;disable interrupts out (c),a ;select write register 5 out (c),d ;output control word ei title TURBODOS OPERATING SYSTEM - SUPER SLAVE SERIAL I/O DRIVER FOR TWO PORTS subttl copyright 1983, software 2000, inc. .z80 ; ; copyright 1983, software 2000, inc. ; converted to MICROSOFT M80 format by ; Advaced Digital Corp. ; ; version: 07/12/83 ; name ('SSSIO2') ;module id ; include DREQUATE.LIB ;driver symbolic equivalences ; sioadr equ 00h ;sio port a data register sioacr equ 01h ;sio port a control register siobdr equ 02h ;sio port b data register siobcr equ 03h ;sio port b control register ; ; siobrr equ 18h ;sio baud rate generator register ; rda equ 0 ;received data available bit tbe equ 2 ;transmit buffer empty bit dcd equ 3 ;data carrier detect bit cts equ 3 ;clear to send bit ; DSEG ;locate in data area ; baudrt: db 0 ;baud rate register value ; s0ibsz:: dw 64 ;serial 0 input buffer size s0ibuf: dw 0 ;serial 0 input buffer address s0iptr: dw 0 ;serial 0 input pointer s0optr: dw 0 ;serial 0 output pointer s0icnt: dw 0  ;serial 0 input count s0iwct: db 0 ;serial 0 input wait count s0ochr: db 0 ;serial 0 output character s0br: db 0 ;serial 0 baud rate code ; s0isph: ;serial 0 input semaphore dw 0 ;semaphore count ..s0ih: dw ..s0ih ;semaphore p/d head dw ..s0ih ; ;serial 0 output semaphore s0osph: dw 0 ;semaphore count ..s0oh: dw ..s0oh ;semaphore p/d head dw ..s0oh ; s1ibsz:: dw 16 ;serial 1 input buffer size s1ibuf: dw 0 ;serial 1 input buffer address s1iptr: dw 0 ;serial 1 input pointer s1optr: dw 0 ;serial 1 output pointer s1icnt: dw 0 ;serial 1 input count s1iwct: db 0 ;serial 1 input wait count s1ochr: db 0 ;serial 1 output character s1br: db 0 ;serial 1 baud rate code ; ;serial 1 input semaphore s1isph: dw 0 ;semaphore count ..s1ih: dw ..s1ih ;semaphore p/d head dw ..s1ih ; ;serial 1 output semaphore s1osph: dw 0 ;semaphore count ..s1oh: dw ..s1oh ;semaphore p/d head dw ..s1oh ; COMMON /?init?/ ;locate in initialization area ; sionit:: ld hl,siovec## ;get interrupt vector address ld a,l ;get lsb of interrupt vector ld (wr2cwd),a ;set write register 2 control word ld hl,sioisr ;get interrupt service address ld (siovec##),hl ;set interrupt vector address ld hl,siopgm ;get sio program list ld bc,sioapl shl 8 or sioacr ;b=length/c=control reg otir ;program sio port a ld hl,siopgm ;get sio program list ld bc,siobpl shl 8 or siobcr ;b=length/c=control reg otir ;program sio port b ld hl,(s0ibsz) ;get serial 0 input buffer size call alloc## ;allocate packet for serial buffer ld (s0ibuf),hl ;save serial 0 input buffer address ld (s0iptr),hl ;set serial 0 input pointer ld (s0optr),hl ;set serial 0 output pointer ld hl,(s1ibsz) ;get serial 1 input buffer size call alloc## ;allocate packet for serial buffer ld (s1ibuf),hl ;save serial 1 input buffer address ld (s1iptr),hl ;set serial 1 input pointer ld (s1optr),hl ;set serial 1 output pointer ret ;done ; siopgm: db 18h ;reset channel db 4 ;select wr4 db 44h ;write register 4 control word db 5 ;select wr5 db 0eah ;write register 5 control word db 3 ;select wr3 db 0c1h ;write register 3 control word db 1 ;select wr1 db 10h ;write register 1 control word ; sioapl equ $-siopgm ;sio port a program length ; db 2 ;select wr2 wr2cwd: db 0 ;write register 2 control word ; siobpl equ $-siopgm ;sio port b program length ; cseg ;locate in program area ; serial:: comdrv:: ld a,e ;get function number or a ;function number=0? jr z,serst ;if so, continue cp 10 ;function number=10? jp z,seropt ;if so, continue dec a ;function number=1? jr z,serin ;if so, continue dec a ;function number=2? jp z,serout ;if so, continue dec a ;function number=3? jp z,sersbr ;if so, continue dec a ;function number=4? jp z,serrbr ;if so, continue dec a ;function number=5? jp z,sersmc ;if so, continue dec a ;function number=6? jp z,serrmc ;if so, continue ret ;else, done ; serst: ld a,b ;get channel number ld bc,(s0icnt) ;get serial 0 input buffer count ld hl,(s0optr) ;get serial 0 output pointer or a ;channel number=0 jr z,..com ;if so, continue ld bc,(s1icnt) ;get serial 1 input buffer count ld hl,(s1optr) ;get serial 1 output pointer ..com: ld a,b or c ;serial input buffer count=0? ret z ;if so, done ld c,(hl) ;else, get serial input character ld a,0ffh ;set return code=0ffh ret ;done ; serin: ld a,b ;get channel number or a ;channel number=0? jr nz,..s1i ;if not, continue ..s0i: di ;else, disable interrupts ld hl,(s0icnt) ;get serial 0 input count ld a,h or l ;serial 0 input count=0? jr z,..wt0 ;if so, continue dec hl ;decrement serial 0 input count ld (s0icnt),hl ;update serial 0 input count ld hl,(s0optr) ;get serial 0 output pointer ld a,(hl) ;get character from buffer inc hl ;increment serial 0 output pointer ex de,hl ;serial 0 output pointer to de-reg ld hl,(s0ibsz) ;get serial 0 input buffer size dec hl ;decrement input buffer size ld bc,(s0ibuf) ;get serial 0 input buffer address add hl,bc ;calc last input buffer address sbc hl,de ;buffer wrap-around? jr nc,..nwa0 ;if not, continue ld e,c ;get serial 0 input buffer address ld d,b ..nwa0: ld (s0optr),de ;update serial 0 output pointer ei ;enable interrupts ret ;done ..wt0: ld hl,s0iwct ;get serial 0 input wait count inc (hl) ;increment input wait count ld hl,s0isph ;get serial 0 input semaphore call wait## ;wait for console input jr ..s0i ;continue ..s1i: di ;disable interrupts ld hl,(s1icnt) ;get serial 1 input count ld a,h or l ;serial 1 input count=0? jr z,..wt1 ;if so, continue dec hl ;decrement serial 1 input count ld (s1icnt),hl ;update serial 1 input count ld hl,(s1optr) ;get serial 1 output pointer ld a,(hl) ;get character from buffer inc hl ;increment serial 1 output pointer ex de,hl  ;serial 1 output pointer to de-reg ld hl,(s1ibsz) ;get serial 1 input buffer size dec hl ;decrement input buffer size ld bc,(s1ibuf) ;get serial 1 input buffer address add hl,bc ;calc last input buffer address sbc hl,de ;buffer wrap-around? jr nc,..nwa1 ;if not, continue ld e,c ;get serial 1 input buffer address ld d,b ..nwa1: ld (s1optr),de ;update serial 1 output pointer ei ;enable interrupts ret ;done ..wt1: ld hl,s1iwct ;get serial 1 input wait count inc (hl) ;increment input wait count ld hl,s1isph ;get serial 1 input semaphore call wait## ;wait for console input jr ..s1i ;continue ; seropt: ld a,b ;get channel number or a ;channel number=1? ld a,10h ;get reset external status command jr nz,..s1o ;if channel number=1, continue out (sioacr),a ;else, reset external status in a,(sioacr) ;get sio port a status and 1 shl tbe ;transmit buffer empty? ret z ;if not, done ld a,(s0br) ;else, get serial 0 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr0 ;if not, continue in a,(sioacr) ;else, get sio port a status and 1 shl cts ;check clear to send status ret z ;if clear to send false, done ..nhr0: ld a,c ;get serial 0 output character out (sioadr),a ;output character ld a,0ffh ;set return code=0ffh ret ;done ..s1o: out (siobcr),a ;reset external status in a,(siobcr) ;get sio port b status and 1 shl tbe ;transmit buffer empty? ret z ;if not, done ld a,(s1br) ;else, get serial 1 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr1 ;if not, continue in a,(siobcr) ;else, get sio port b status and 1 shl cts ;check clear to send status ret z ;if clear to send false, done ..nhr1: ld a,c ;get serial 1 output character out (siobdr),a ;output character ld a,0ffh ;set return code=0ffh ret ;done ; serout: ld a,b ;get channel number or a ;channel number=1? ld a,10h ;get reset external status command jr nz,..s1o1 ;if channel number=1, continue out (sioacr),a ;else, reset external status in a,(sioacr) ;get sio port a status and 1 shl tbe ;transmit buffer empty? jr z,..s0nr ;if not, continue ld a,(s0br) ;else, get serial 0 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr2 ;if not, continue in a,(sioacr) ;else, get sio port a status and 1 shl cts ;check clear to send status jr z,..s0nr ;if clear to send false, continue ..nhr2: ld a,c ;get serial 0 output character out (sioadr),a ;output character ret ;done ..s0nr: ld a,c ;get serial 0 output character ld (s0ochr),a ;save output character ld de,s0opol ;get serial 0 out poll routine call lnkpol## ;create poll routine ld hl,s0osph ;get serial 0 out semaphore jp wait## ;dispatch if necessary ..s1o1: out (siobcr),a ;reset external status in a,(siobcr) ;get sio port b status and 1 shl tbe ;transmit buffer empty? jr z,..s1nr ;if not, continue ld a,(s1br) ;else, get serial 1 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr3 ;if not, continue in a,(siobcr) ;else, get sio port b status and 1 shl cts ;check clear to send status jr z,..s1nr ;if clear to send false, continue ..nhr3: ld a,c ;get serial 1 output character out (siobdr),a ;output character ret ;done ..s1nr: ld a,c ;get serial 1 output character ld (s1ochr),a ;save output character ld de,s1opol ;get serial 1 out poll routine call lnkpol## ;create poll routine ld hl,s1osph ;get serial 1 out semaphore jp wait## ;dispatch if necessary ; s0opol: ;serial 0 output poll routine dw 0 ;successor link pointer dw 0 ;predecessor link pointer ; ld a,10h ;get reset external status command out (sioacr),a ;reset external status in a,(sioacr) ;get sio port a status and 1 shl tbe ;transmit buffer empty? ret z ;if not, done ld a,(s0br) ;else, get serial 0 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhr ;if not, continue in a,(sioacr) ;else, get sio port a status and 1 shl cts ;check clear to send status ret z ;if clear to send false, done ..nhr: ld a,(s0ochr) ;get serial 0 output character out (sioadr),a ;output character ld hl,s0opol ;get serial 0 out poll routine call unlink## ;unlink poll routine ld hl,s0osph ;get serial 0 out semaphore jp signal## ;signal process as ready ; s1opol: ;serial 1 output poll routine dw 0 ;successor link pointer dw 0 ;predecessor link pointer ; ld a,10h ;get reset external status command out (siobcr),a ;reset external status in a,(siobcr) ;get sio port b status and 1 shl tbe ;transmit buffer empty? ret z ;if not, done ld a,(s1br) ;else, get serial 1 baud rate code and 1 shl 6 ;cts handshaking requested? jr z,..nhra ;if not, continue in a,(siobcr) ;else, get sio port b status and 1 shl cts ;check clear to send status ret z ;if clear to send false, done ..nhra: ld a,(s1ochr) ;get serial 1 output character out (siobdr),a ;output character ld hl,s1opol ;get serial 1 out poll routine call unlink## ;unlink poll routine ld hl,s1osph ;get serial 1 out semaphore jp signal## ;signal process as ready ; sioisr:: ld (intsp##),sp ;save stack pointer ld sp,intstk## ;set up aux stack pointer push af ;save registers push bc push de push hl call ..s0i1 ;check for serial 0 input call ..s1i1 ;check for serial 1 input pop hl ;restore registers pop de pop bc pop af ld sp,(intsp##) ;restore stack pointer ei ;enable interrupts reti ;done ; ..s0i1: in a,(sioacr) ;get sio port a status bit rda,a ;character available ret z ;if not, done in a,(sioadr) ;get sio port a data character ld hl,s0br ;get serial 0 baud rate code bit 5,(hl) ;inhibit input flag set? ret nz ;if so, done ld c,a ;serial 0 data character to c-reg bit 7,(hl) ;sign bit on baud rate code? jr z,..nad0 ;if not, continue res 7,c ;else, strip sign bit on character call slvres## ;check for slave reset ld a,(atnchr##) ;get attention character cp c ;character=attention character? jr nz,..nad0 ;if not, continue ld hl,(s0iptr) ;else, get serial 0 input pointer ld (s0optr),hl ;reset serial 0 output pointer ld hl,0 ld (s0icnt),hl ;set serial 0 input count=0 ..nad0: ld hl,(s0ibsz) ;get serial 0 input buffer size ld de,(s0icnt) ;get serial 0 input count inc de ;increment serial 0 input count or a ;clear carry flag sbc hl,de ;serial 0 input buffer full? ret c ;if so, done ld (s0icnt),de ;else, update serial 0 input count ld hl,(s0iptr) ;get serial 0 input pointer ld (hl),c ;store input character in buffer inc hl ;increment input pointer ex de,hl ;de=input pointer/hl=buffer size ld hl,(s0ibsz) ;get serial 0 input buffer size dec hl ;decrement input buffer size ld bc,(s0ibuf) ;get serial 0 input buffer address add hl,bc ;calc last input buffer address sbc hl,de ;buffer wrap-around? jr nc,..nwa2 ;if not, continue ld e,c ;get serial 0 input buffer address ld d,b ..nwa2: ld (s0iptr),de ;update serial 0 input pointer ld de,s0iwct ;get serial 0 input wait count ld hl,s0isph ;get serial 0 input semaphore call ..sigc ;signal if necessary jr ..s0i1 ;continue ; ..s1i1: in a,(siobcr) ;get sio port b status bit rda,a ;character available ret z ;if not, done in a,(siobdr) ;get sio port b data character ld hl,s1br ;get serial 1 baud rate code bit 5,(hl) ;inhibit input flag set? ret nz ;if so, done ld c,a ;serial 1 data character to c-reg bit 7,(hl) ;attention detection flag set? jr z,..nad1 ;if not, continue res 7,c ;else, strip sign bit on character call slvres## ;check for slave reset ld a,(atnchr##) ;get attention character cp c ;character=attention character? jr nz,..nad1 ;if not, continue ld hl,(s1iptr) ;else, get serial 1 input pointer ld (s1optr),hl ;reset serial 1 output pointer ld hl,0 ld (s1icnt),hl ;set serial 1 input count=1 ..nad1: ld hl,(s1ibsz) ;get serial 1 input buffer size ld de,(s1icnt) ;get serial 1 input count inc de ;increment serial 1 input count or a ;clear carry flag sbc hl,de ;serial 1 input buffer full? ret c ;if so, done ld (s1icnt),de ;else, update serial 1 input count ld hl,(s1iptr) ;get serial 1 input pointer ld (hl),c ;store input character in buffer inc hl ;increment input pointer ex de,hl ;de=input pointer/hl=buffer size ld hl,(s1ibsz) ;get serial 1 input buffer size dec hl ;decrement input buffer size ld bc,(s1ibuf) ;get serial 1 input buffer address add hl,bc ;calc last input buffer address sbc hl,de ;buffer wrap-around? jr nc,..nwa3 ;if not, continue ld e,c ;get serial 1 input buffer address ld d,b ..nwa3: ld (s1iptr),de ;update serial 1 input pointer ld de,s1iwct ;get serial 1 input wait count ld hl,s1isph ;get serial 1 input semaphore call ..sigc ;signal if necessary jr ..s1i1 ;continue ..sigc: ld a,(de) ;get serial input wait count or a ;serial input wait count=0? ret z ;if so, done dec a ;decrement serial input wait count ld (de),a ;update serial input wait count jp signal## ;signal process as ready ; sersbr: ld a,b ;get channel number ld hl,s0br ;get serial 0 baud rate code or a ;channel number=0? jr z,..com1 ;if so, continue ld hl,s1br ;else, get serial 1 baud rate code ..com1: ld (hl),c ;save baud rate code ld a,c ;get requested baud rate code and 0fh ;extract relevant bits ld c,a ;update requested baud rate code ld a,b ;get channel number or a ;channel number=0? ld a,(baudrt) ;get baud rate register value jr z,..ch0 ;if channel number=0, continue and 0fh ;else, strip upper four bits ld b,a ;baud rate register value to b-reg ld a,c ;get requested baud rate code add a,a ;shift baud rate code to msn add a,a add a,a add a,a or b ;combine with baud rate register jr ..com2 ;continue ..ch0: and 0f0h ;strip lower four bits or c ;combine with baud rate register ..com2: out (siobrr),a ;set baud rate generator register ld (baudrt),a ;update baud rate register value ret ;done ; serrbr: ld hl,s0br ;get serial 0 baud rate ld a,b ;get channel number or a ;channel number=0? jr z,..com5 ;if so, continue ld hl,s1br ;else, get serial 1 baud rate ..com5: ld a,(hl) ;get current baud rate code ret ;done ; sersmc: ld a,0eah ;get write register 5 control word and 82h ;strip rts/cts control bits bit 7,c ;rts requested? jr z,..nrts set 1,a ;if so, set rts bit ..nrts: bit 6,c ;dtr requested? jr z,..ndtr set 7,a ;if so, set dtr bit ..ndtr: ld d,a ;requested modem controls to d-reg ld c,sioacr ;get sio port a control register ld a,b ;get channel number or a ;channel number=0? jr z,..com3 ;if so, continue ld c,siobcr ;get sio port b control register ..com3: ld a,5 ;get write register 5 di ;disable interrupts out (c),a ;select write register 5 out (c),d ;output control word ei ;enable interrupts ret ;done ; serrmc: ld c,sioacr ;get sio port a control register ld a,b ;get channel number or a ;channel number=0? jr z,..com4 ;if so, continue ld c,siobcr ;get sio port b control register ..com4: ld a,10h ;get reset external status command out (c),a ;reset external status in d,(c) ;get sio modem status xor a ;clear return vector bit cts,d ;cts set? jr z,..ncts ;if not, continue set 7,a ;else, set cts bit ..ncts: bit dcd,d ;dcd set? ret z ;if not, done set 5,a ;else, set dcd bit ret ;done ; end .ndtr: ld d,a ;requested modem controls to d-reg ld c,sioacr ;get sio port a control register ld a,b ;get channel number or a ;channel number=0? jr z,..com3 ;if so, continue ld c,siobcr ;get sio port b control register ..com3: ld a,5 ;get write register 5 di ;disable interrupts out (c),a ;select write register 5 out (c),d ;output control word eiS̠e3%5L% Mj(SUe4HM%=%MJSERIALQ`])p1H)1x/SU2" x]1<n՘3@`Pao!abH`Dl@ʴ@zʻUfg|<;Ix$U;XdIn X$b,*U@n^JCd)p$C טEX#uKÀiH`,<@dq C0<-em\F@9+l2-0i`70:b  L>O q@@)i[`0P`1Pm\@2O#,,CvmA@Du@sCL<(Fh0H 0 l2X4@[`0!: 0@a>4mb`1Pm@4Bͪ"Zë.Ә1ViY `]v[`Yph,'€-r@@ `P,*  ݥ&ô@X#uK`iH`,< `ͫAl#`!&eYPeYuoW"`b VvMn)6u9LȠg"-WO q@^n˴d'˴e&[Zd2ـALLOCdD4(COMDRVπԔE5hINTSTKS0IBSZ e3%5SERIALe4t@SIOISRe4HXSIOVECe4e$U8UNLINKtIyCu`x,Zadphn(q0>u9LȠg"-WO q@^n˴d|<;Ix$U;XdIn X$b,*U@n^JCd)p$C טEX#uKÀiH`,<@dq C0<-em\F@9+l2-0i`70:b  L>O q@@)i[`0P`1Pm\@2O#,,CvmA@Du@sCL<(Fh0H 0 l2X4@[`0!: 0@a>4mb`1Pm@4Bͪ"Zë.Ә1ViY `]v[`Yph,'€-r@@ `P,*  ݥ&ô@X#uK`iH`,< `ͫAl#`!&eYPeYuoW"`b VvMn)6u9LȠg"-WO q@^n˴d TITLE ADVANCED DIGITAL SUPERBIOS FOR SUPER QUAD Dec 18 1982 14:30 ;***************************************************************** ;** ** ;** ADVANCED DIGITAL SUPER QUAD Z80 SBC ** ;** ** ;** SUPER BIOS ** ;** ** ;** This bios contains drivers for: ** ;** ** ;** Floppy disk ** ;** Hard disk ** ;** Two serial ports ** ;** Parallel port ** ;** ** ;** Console input and output can be polled or ** ;** interrupt driven. Seperatly sellected. ** ;** ** ;** Warm boot can be from disk or from prom. ** ;** ** ;** ** ;** Written by: ** ;** ** ;** Scott Carter ** ;** Greg Lindberg ** ;** ** ;***************************************************************** SUBTTL Customization Equates page 60 .z80 true equ 0ffffh false equ 0 mini equ false ;true for minifloppy BIOS special equ true ;true for 8"-5" special board m48tpi equ true ;true for 48tpi mini drives m96tpi equ false ;true for 96tpi mini drives nmbfpy equ 2 ;number of floppy disk drives fpyfrst defl true ;true if floppies are first logical drives ;only valid if hard disk installed prmboot equ true ;true for warmboot from prom (use only with warm boot prom) intrin equ true ;true for interrupt console input (Type ahead) introut equ false ;true for interrupt console output (Buffered console output) parprnt equ false ;true for parallel printer, false for serial printer ;------------------------------------------------------------------------ ; This is the seek rate constant!! seekrt, below, is an offset! seekrate equ 0 ;6ms for 8", 12ms for 5" ;seek rate 0=3ms, 1=6ms, 2=10ms, 3=15ms ;these times double for minifloppies ;*** Hard Disk selection choices *** ST503 EQU 1 ; Seagate Technology ST503 ST506 EQU 2 TM601S EQU 3 ; Tandon Magnetics TM601S TM602S EQU 4 TM603S EQU 5 TM603SE EQU 6 TM501 EQU 7 ; Tandon Magnetics TM501 TM502 EQU 8 TM503 EQU 9 SA602 EQU 10 ; Shugart Associates SA602 SA604 EQU 11 SA606 EQU 12 SA1002 EQU 13 ; Shugart Associates SA1002 SA1004 EQU 14 Q2010 EQU 15 ; Quantum Q2010 Q2020 EQU 16 Q2030 EQU 17 Q2040 EQU 18 M4010 EQU 19 ; MiniScribe 4010 M4020 EQU 20 ;*** HDC1001 Physical drives *** hd0 equ M4020 ; Set to type of drive or false if not used hd1 equ false ; all drives must have same interface type hd2 equ false ; i.e. all SA1000 type or all ST506 type hd3 equ false SUBTTL SYMBOLIC EQUATES page if intrin or introut ints equ true else ints equ false endif ; board hardware equates cmd equ 0ch ;fdc command register trk equ cmd+1 ;track register sec equ cmd+2 ;sector register data equ cmd+3 ;data register wait equ 14h ;INTRQ and DRQ synch port (see manual) pioad equ 4 ;PIO channel A data pioac equ 6 ; " " " control piobd equ 5 ; " " B data piobc equ 7 ; " " " control memry equ 16h ;memory control port ; ; sector deblocking equates ; hstcnt equ 8 ;number of sectors in buffer hstshft equ 3 ;shift factor for # of sectors in buffer if mini ddpspt equ 4 ;double density physical sectors per track if m48tpi tracks equ 39 ;minifloppies else tracks equ 76 ;96tpi drives endif else ddpspt equ 8 ;eight inch tracks equ 76 endif dpblen equ 15 ;length of a DPB ; ; floppy disk hardware parameter offsets ; ****** these are offsets into table do not change ****** ; density equ 0 ;0=single, 1=single side double D, 2= 2S2D seekrt equ 1 ;THIS IS OFFSET INTO TABLE, VALUE IN TABLE CAN BE ;seek rate 0=3ms, 1=6ms, 2=10ms, 3=15ms ;these times double for minifloppies pspt equ 2 ;physical sectors per track (one side) drvtrk equ 3 ;track a floppy is at parmlen equ 4 ;length of the parameter block ; ; miscellaneous equates ; iobyte equ 3 ;used to select various consoles and printers cdisk equ 4 ;default disk user number bdos equ 5 retries equ 10 ;retry count for disk operations inbfsz equ 32 ;size of input buffer for interrupt input must be power of 2 outbfsz equ 64 ;size of output buffer for interrupt output must be power of 2 public savnum,biosiz,mxld64k,kld64k,syssiz,ldofst,allfpy,lastadd SUBTTL Hard disk equates page ;*** HDC1001 Disk equates *** HOFF EQU 1 ; Number of reserved tracks for loader TST MACRO DN ;physical hard disk defined IF HD&DN x defl 1 else x defl 0 endif endm hddsks defl 0 ;number of physical hard disk drives hdldrvs defl 0 ;number of logical hard disk drives hdtst macro rept 4 tst %hddsks ;test all four physical drives iff x exitm endif .lall hddsks defl hddsks+1 .xall endm ;end rept endm ;end hdtst hdtst ;calculate number of physical hard disks if hddsks ;set flag for hard disks hard equ true else hard equ false fpyfrst defl true ;force floppies first if no hard disks endif ; ddb macro data,comm ; define a db statement db data comm endm ; ddw macro data,comm ; define a dw statement dw data comm endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val size defl val&dn defds lb&dn,%size endm .sfcond if hard ;put this stuff in only if needed .lfcond ;*** Port equates for HDC1001 *** HDCBASE EQU 0E0H ; Base of HDC1001 HDCDATA EQU HDCBASE ; Data port WPC EQU HDCBASE+1 ; Write precomp port HDCERR EQU WPC ; Error port SECNT EQU HDCBASE+2 ; Sector count SECNO EQU HDCBASE+3 ; Sector number CYLLO EQU HDCBASE+4 ; Cylinder low CYLHI EQU HDCBASE+5 ; Cylinder high SDH EQU HDCBASE+6 ; Size/Drive/Head COMND EQU HDCBASE+7 ; Command register STATUS EQU COMND ; Status register ;*** Command equates for HDC1001 *** CREST EQU 10H ; Restore command CSEEK EQU 70H ; Seek command CREAD EQU 20H ; Read sector command CWRITE EQU 30H ; Write command CFORM EQU 50H ; Format track inter equ 8 ;hard disk sector interleave factor secs equ 16 ;Physical sectors per track per head hstsiz equ 512 ;size of a hard disk physical sector hdstcnt equ hstsiz/128 ;cp/m sectors per physical sector blksiz equ 4096 ;cp/m block size cpmspt equ hdstcnt*secs ;cp/m sectors per track per head cpmscbk equ blksiz/128 ;cp/m sectors per cp/m block ; dpbg macro dn,secs,bls,blm,ext,dks,dir,al0,al1,cks,off,phys .lall dpb&dn: dw secs ;sec per track db bls ;block shift db blm ;block mask db ext ;extnt mask dw dks ;disk size-1 dw dir ;directory max db al0 ;alloc0 db al1 ;alloc1 dw cks ;check size dw off ;offset db phys ;physical disk drive .xall endm hdscg macro dn,mxcl,mxhd,stprt .lall hdesc&dn: db hdcbase ;base i/o port address db dn ;physical unit no. db inter ;hardware interleave db secs ;sectors per track dw mxcl ;last cylinder db mxhd ;last head db hstsiz/128 ;sector size/128 db stprt ;step rate .xall endm dsktyp macro dn,typ .lall .sfcond if typ eq ST503 hpb&dn macro no dw -1,hdesc&dn als&no defl 004Ch ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,128,5,31,1,607,511,240,0,0,1,%dn hdscg %dn,152,1,3 endm hddr&dn defl 1 endif if typ eq ST506 hpb&dn macro no dw -1,hdesc&dn als&no defl 0098h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,1215,511,240,0,0,1,%dn hdscg %dn,152,3,3 endm hddr&dn defl 1 endif if typ eq TM601S hpb&dn macro no dw -1,hdesc&dn als&no defl 004Ch ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,128,5,31,1,607,511,240,0,0,1,%dn hdsc %dn,152,1,3 endm hddr&dn defl 1 endif if typ eq TM602S hpb&dn macro no dw -1,hdesc&dn als&no defl 0098h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,1215,511,240,0,0,1,%dn hdsc %dn,152,3,3 endm hddr&dn defl 1 endif if typ eq TM603S hpb&dn macro no dw -1,hdesc&dn als&no defl 00E4h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,1823,1023,255,0,0,1,%dn hdscg %dn,152,5,3 endm hddr&dn defl 1 endif if typ eq TM603SE hdpb603E0&dn macro no dw -1,hdesc&dn als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,2047,1023,255,0,0,1,%dn hdscg %dn,229,5,3 endm hdpb603E1&dn macro no als&no defl 00FFh ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,699,511,240,0,0,172,%dn endm hpb&dn macro no local x x defl no hdpb603E0&dn %x x defl x+1 hdpb603E1&dn %x endm hddr&dn defl 2 endif if typ eq TM501 hpb&dn macro no dw -1,hdesc&dn als&no defl 0099h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,128,5,31,1,1219,511,240,0,0,1,%dn hdscg %dn,305,1,3 endm hddr&dn defl 1 endif if typ eq TM502 hdpb5020&dn macro no dw -1,hdesc&dn als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,2047,1023,255,0,0,1,%dn hdscg %dn,305,3,3 endm hdpb5021&dn macro no als&no defl 0031H ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,391,511,240,0,0,257,%dn endm hpb&dn macro no local x x defl no hdpb5020&dn %x x defl x+1 hdpb5021&dn %x endm hddr&dn defl 2 endif if typ eq TM503 hdpb5030&dn macro no dw -1,hdesc&dn als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,2047,1023,255,0,0,1,%dn hdscg %dn,305,5,3 endm hdpb5031&dn macro no als&no defl 00CAH ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,1611,1023,255,0,0,172,%dn endm hpb&dn macro no local x x defl no hdpb5030&dn %x x defl x+1 hdpb5031&dn %x endm hddr&dn defl 2 endif if typ eq SA602 hpb&dn macro no dw -1,hdesc&dn als&no defl 0050h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,128,5,31,1,635,511,240,0,0,1,%dn hdscg %dn,159,1,3 endm hddr&dn defl 1 endif if typ eq SA604 hpb&dn macro no dw -1,hdesc&dn als&no defl 009Fh ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,1271,511,240,0,0,1,%dn hdsc %dn,159,3,3 endm hddr&dn defl 1 endif if typ eq SA606 hpb&dn macro no dw -1,hdesc&dn als&no defl 00EFh ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,1907,1023,255,0,0,1,%dn hdscg %dn,159,5,3 endm hddr&dn defl 1 endif if typ eq SA1002 hpb&dn macro no dw -1,hdesc&dn als&no defl 0080h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,128,5,31,1,1019,511,240,0,0,1,%dn hdscg %dn,255,1,0 endm hddr&dn defl 1 endif if typ eq SA1004 hpb&dn macro no dw -1,hdesc&dn als&no defl 00FFh ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,2039,1023,255,0,0,1,%dn hdscg %dn,255,3,0 endm hddr&dn defl 1 endif if typ eq Q2010 hpb&d macr no dw -1,hdesc&dn als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,128,5,31,1,2043,1023,255,0,0,1,%dn hdscg %dn,511,1,0 endm hddr&dn defl 1 endif if typ eq Q2020 hdpb20&dn macro no dw -1,hdesc&dn als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,2047,1023,255,0,0,1,%dn hdscg %dn,511,3,0 endm hdpb21&dn macro no als&no defl 00FFh ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,2039,1023,255,0,0,257,%dn endm hpb&dn macro no local x x defl no hdpb20&dn %x x defl x+1 hdpb21&dn %x endm hddr&dn defl 2 endif if typ eq Q2030 hdpb30&dn macro no dw -1,hdesc&dn als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,2047,1023,255,0,0,1,%dn hdscg %dn,511,5,0 endm hdpb31&dn macro no als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,2047,1023,255,0,0,172,%dn endm hdpb32&dn macro no als&no defl 00FEh ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,384,5,31,1,2031,1023,255,0,0,343,%dn endm hpb&dn macro no local x x defl no hdpb30&dn %x x defl x+1 hdpb31&dn %x x defl x+1 hdpb32&dn %x endm hddr&dn defl 3 endif if typ eq Q2040 hdpb40&dn macro no dw -1,hdesc&dn als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,512,5,31,1,2047,1023,255,0,0,1,%dn hdscg %dn,511,7,0 endm hdpb41&dn macro no als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,512,5,31,1,2047,1023,255,0,0,129,%dn endm hdpb42&dn macro no als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,512,5,31,1,2047,1023,255,0,0,257,%dn endm hdpb43&dn macro no als&no defl 00FEh ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,512,5,31,1,2031,1023,255,0,0,385,%dn endm hpb&dn macro no local x x defl no hdpb40&dn %x x defl x+1 hdpb41&dn %x x defl x+1 hdpb42&dn %x x defl x+1 hdpb43&dn %x endm hddr&dn defl 4 endif if typ eq M4010 hpb&dn macro no dw -1,hdesc&dn als&no defl 00F0h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,128,5,31,1,1915,1023,255,0,0,1,%dn hdscg %dn,479,1,0 endm hddr&dn defl 1 endif if typ eq M4020 hdpb4020&dn macro no dw -1,hdesc&dn als&no defl 0100h ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,2047,1023,255,0,0,1,%dn hdscg %dn,480,3,0 endm hdpb4021&dn macro no als&no defl 00DFh ;size of allocation vector css&no defl 0 ;number of checksum elements dpbg %no,256,5,31,1,1783,1023,255,0,0,257,%dn endm hpb&dn macro no local x x defl no hdpb4020&dn %x x defl x+1 hdpb4021&dn %x endm hddr&dn defl 2 endif hdldrvs defl hdldrvs+hddr&dn .lfcond .xall endm x defl 0 rept hddsks dsktyp %x,hd%x ;define hard disk parameters x defl x+1 endm ; ; dskhdr macro dn ; define a single disk header list .lall hdph&dn: dw 0000h,0000h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw hdcsv&dn,hdalv&dn ;check, alloc vectors .xall endm ; hddisks macro nd ; define nd disks ndisks defl nd ;for later reference dpbase equ $ ;base of disk parameter blocks ; generate the nd elements dsknxt defl nmbfpy rept nd dskhdr %dsknxt dsknxt defl dsknxt+1 endm endm ; lgdrvs defl 0 ; hdpbs macro dn,lgno hpb&dn lgno lgdrvs defl hddr&dn endm ; hddpbs macro times ;define hard disk parameter blocks local x,y x defl 0 y defl nmbfpy rept times hdpbs %x,%y ;define dpb's for this hd drive x defl x+1 ;bump counters y defl y+lgdrvs endm endm ; hdvect macro ; generate the necessary ram data areas dsknxt defl nmbfpy rept ndisks ;once for each disk lds hdalv,%dsknxt,als lds hdcsv,%dsknxt,css dsknxt defl dsknxt+1 endm endm ; logdsk defl nmbfpy endif ;hard disk definitions .lfcond fdskhdr macro dn .lall fdph&dn: dw trans,0,0,0 dw dirbuf,fdpbase dw chk0&dn,all0&dn .xall endm fdisks macro x defl 0 rept nmbfpy fdskhdr %x x defl x+1 endm endm dwdsk macro drvr,lgdsk dw drvr+lgdsk endm DSKTBL MACRO ;DEFINES DISK ASSIGNMENT TABLE x defl 0 .lall drvtbl equ $+1 .xall if fpyfrst dw fpy rept nmbfpy-1 dwdsk fpy,%x x defl x+1 endm ;rept y defl 0 rept hdldrvs dwdsk hdc,%x iff y ;if first time thru x defl 0 ;reset x for hard disk logical drives starting at 0 y defl y+1 else x defl x+1 endif endm ;rept else ;fpyfrst dw hdc rept hdldrvs-1 dwdsk hdc,%x x defl x+1 endm ;rept y defl 0 rept nmbfpy dwdsk fpy,%x iff y ;if first time thru x defl 0 ;reset x for hard disk logical drives starting at 0 y defl y+1 else x defl x+1 endif endm ;rept endif ddb %x,<;last logical drive> rept 16-nmbfpy-hdldrvs dw 0 endm ;rept endm ;dsktbl SUBTTL BIOS ENTRY AND PUBLIC TABLES page ; ; BIOS jump table start:: jp coldboot wboota:: jp wboot jp const jp conin jp conout jp list jp punch jp reader jp home jp seldsk jp settrk jp setsec jp setdma jp read jp write jp listst jp sectran ccpstart:: dw start-1600h ;CP/M boot address bdosjmp:: dw start-0dfah ;BDOS jump ; ; warm boot table ; filled in by CPMLDR ; ; contains entries of form dw track, dw first sector, dw last sector ; it is a map of where the image of the CCP and BDOS reside on disk bootbl:: dw 0,0,0 ;space for four entries dw 0,0,0 dw 0,0,0 dw 0,0,0 dw 0 ;extra to guarantee 0 track to exit properly page if ints ;interrupt driven i/o ds 16-(($-start) mod 16) ; ; serial channel interrupt vector table ; contains one entry for each interrupt that ; can be generated by sio/dart ; serinttbl:: dw intret ; channel B transmitter buffer empty dw intret ; channel B external interrupts dw intret ; channel B receiver ready dw intret ; channel B special receive interrupt if introut dw tran0int ; channel A transmitter buffer empty else dw intret ; channel A transmitter buffer empty endif dw intret ; channel A external interrupts if intrin dw recv0int ; channel A receiver ready else dw intret ; channel A receiver ready endif dw intret ; channel A special receive interrupt endif SUBTTL Driver dispatcher page home:: ld D,0 jr dskjmp settrk:: ld D,6 jr dskjmp setsec:: ld D,9 jr dskjmp read:: ld D,0ch jr dskjmp write:: ld D,0fh dskjmp:: ;go to correct disk routine ld A,(curdsk) ;current logical drive getvec:: ld HL,drvtbl dskcon:: add A,A ld E,A ld A,D ;low order byte of vector supplied ld D,0 add HL,DE ld D,(HL) ;high order byte of jump vector inc HL ld E,A ;vector lsb ld A,(HL) ;driver number ex DE,HL jphl:: jp (HL) curdsk:: db 0 ;currently selcted logical drive ret ;and leave page ; Console/list vectors const:: ld D,0 jr conjmp conin:: ld D,3 jr conjmp conout:: ld D,6 jr conjmp list:: ld D,9 jr lstjmp listst:: ld D,0ch lstjmp:: ld A,(iobyte) rlca rlca ;make 0-3 ld HL,lsttbl jr jmp2 conjmp:: ;get jump for console drivers ld A,(iobyte) ld HL,contbl jmp2: and 00000011b ;get console field jr dskcon reader:: ld d,3 ld hl,rdrtbl ld a,(iobyte) jr gordr punch:: ld d,6 ld hl,puntbl ld a,(iobyte) rra rra gordr:: rra rra jr jmp2 SUBTTL Configuration tables page ;----------------------------------------------------------------------- ; ; Hardware configuration table ; org 100h-2 iodma:: db 80h ;this is the low order byte ;of the 80h default dsktbl ;define disk assignment table contbl equ $+1 dw cpu dw cpu ;default=serial 0 db 1 ;alternate=serial 1 db 0,0,0 ;space for two more console drivers lsttbl equ $+1 dw cpu if parprnt dw cpu+2 ;default=parallel db 1 ;alternate=serial 1 else dw cpu+1 ;default=serial 1 db 2 ;alternate=parallel endif db 0,0,0 rdrtbl equ $+1 dw cpu dw cpu+1 ;default=serial 1 db 0 ;alternate=serial 0 db 0,0,0 ;space for two more readers drivers puntbl equ $+1 dw cpu dw cpu+1 ;default=serial 1 db 0 ;alternate=serial 0 db 0,0,0,0 ;space for two more punch drivers SUBTTL Warm boot code page ; ; Wboot reads in the CCP and BDOS from the CPM.SYS file ; CPMLDR initializes the bootbl to be a list of items of ; ; track (dw), first sector(db), last sector(db) ; wboot:: if not prmboot ;use this code if warm boot from disk if ints di ;turn interrupts off endif ld SP,100 ;use default buffer ld C,0 ;drive A:: call seldsk ;select drive A:: ld A,H or L jp z,booterr ;bad select ld E,(HL) inc HL ld D,(HL) ;DE=sector translate from DPH ld (bootxlt),DE ld HL,(ccpstart) ;start of CCP-starting DMA ld IY,bootbl-6 ;point to boot table nxttrk: push HL ;current DMA ;read sectors of next track ld DE,6 ;update track pointer add IY,DE ld C,(IY) ld B,(IY+1) ;BC=track ld A,B or C jr z,bootdone ;last track done call settrk ld C,(IY+2) ;get next sector to read ld B,(IY+3) dec BC ;pre decrement it ld (nextsc),BC ;save it nxtsec: pop BC ;DMA push BC call setdma scf ;clear carry flag ccf ld BC,(nextsc) ;get next sector to read inc BC ;update it ld L,(IY+4) ;get last sector ld H,(IY+5) sbc HL,BC ;any more on this track pop HL ;fix stack jr c,nxttrk ;done with last sector ld (nextsc),BC ;save next sector ld DE,128 add HL,DE ;update DMA push HL ld DE,(bootxlt) call sectran ld C,L ld B,H call setsec call read or A jr nz,booterr ;physical read error jr nxtsec endif ;disk boot code bootdone:: ;set low memory if ints and prmboot di ;turn interrupts off endif ld HL,(bdosjmp) ld (6),HL ;normal BDOS jump ld HL,wboota ld (1),HL ;warm boot jump ld A,0c3h ;'JP' intruction ld (0),A ld (5),A if prmboot ;warmboot from prom code ; VROFST EQU 54H ;OFFSET BELOW BIOS FOR BDOS VARIABLE AREA CLRLEN EQU 4DH ;LENGTH OF BDOS VARIABLE AREA TO CLEAR RELCCP EQU 0F800H ;BEGINNING OF RELOCATABLE CCP IN PROM RELTAB EQU RELCCP-100H ;BEGINNING OF RELOCATION TABLE ; ; This routine clears the variable area of bdos for warmboot ; from prom ; CLEAR:: LD HL,START-VROFST ;FIND ADDRESS OF BDOS VARIABLES LD (HL),0E5H ;SET FIRST VARIABLE XOR A ;SET UP FOR NEXT VARIABLES ld (start-0af3h),A ;clear listing toggle INC HL ; LD (HL),A ;CLEAR NEXT INC HL ; LD (HL),A ;CLEAR NEXT INC HL ; LD (HL),A ;CLEAR NEXT INC HL ; LD (HL),A ;CLEAR NEXT INC HL ; LD (HL),80H ;INIT NEXT INC HL ; LD (HL),A ;CLEAR NEXT PUSH HL ;SAVE THIS ADDRESS (SOURCE FOR CLEAR) INC HL ; (DESTINATION) EX DE,HL ;PUT DESTINATION ADDRESS IN DE POP HL ;GET SOURCE ADDRESS BACK LD BC,CLRLEN ;SET LENGTH LDIR ;CLEAR REST OF VARIABLES ; LD DE,CCPMOVER ;DESTINATION FOR CCPMOVER LD HL,WRMLDR ;SOURCE FOR CCPMOVER LD BC,LDRLEN ;LENGTH TO MOVE LDIR ;MOVE CCPMOVER TO LOW MEMORY JP CCPMOVER ;GO DO IT ; WRMLDR:: .PHASE 80H ; ; This routine will relocate the ccp from the on board prom ; to memory regardless of system size. ; ; ccp should be located in upper 2k of onboard prom with ; relocation table in 256 bytes below it. ; CCPMOVER:: LD DE,(CCPSTART) ;GET ADDRESS TO LOAD CCP TO LD A,4FH ;TURN PROM ON OUT (MEMRY),A ; ; STRTMOV:: LD HL,RELCCP ;GET BEGINNING RELOCATABLE CCP LD B,D ;PUT RELOCATION OFFSET INTO B LD IY,RELTAB ;GET ADDRESS OF RELOCATION TABLE LD IX,CCPLEN ;GET ADDRESS OF CCP LENGTH STRTLOP:: LD C,8 ;SET UP RELOCATION BIT COUNTER LD A,(IY+0)  ;GET RELOCATION BYTE MOVLOP:: RLCA ;NEED TO RELOCATE IT PUSH AF ;SAVE AF LD A,(HL) ;GET BYTE TO MOVE JR NC,STOR ;SKIP RELOCATION IF NOT NEEDED FOR THIS BYTE ADD A,B ; OTHERWISE RELOCATE BYTE STOR:: LD (DE),A ;STORE BYTE AT NEW LOCATION POP AF ;GET BACK INC DE ;UPDATE POINTERS INC HL ; DEC (IX+0) ;DONE MOVING YET JR NZ,NOTDNE ;IF LOW BYTE NOT ZERO SKIP REST OF CHECK DEC (IX+1) JR Z,DNEMOV ;IF SO LEAVE NOTDNE:: DEC C ;NEED TO UPDATE RELOCATION BYTE POINTER JR NZ,MOVLOP ;IF NOT GO DO MORE INC IY ; OTHERWISE BUMP POINTER JR STRTLOP ; AND GO TO REINITIALIZE COUNTER ; DNEMOV:: LD A,6FH ;TURN PROM OFF OUT (MEMRY),A ; endif ;prom boot code ld HL,(ccpstart) ld A,(cdisk) ld C,A if ints ei ;turn interrupts on endif jp (HL) ;go to CP/M if prmboot ; ; CCPLEN:: DW 800H ;COUNTER FOR LENGTH OF CCP TO RELOCATE ; LDRLEN EQU $-CCPMOVER ;LENGTH OF CCPMOVER ; .DEPHASE WRMLDRN EQU $ else nextsc: ds 2  ;temp storage for next sector to read an wboot bootxlt:: dw 0 ;boot disk sector translate table endif booterr:: ld DE,badbootmsg call pmsg halt ;must reset system badbootmsg:: db 'Warm boot error-reset system' crlf:: db 0dh,0ah,'$' SUBTTL Console and List drivers page cpuio equ (($-start-1)/256)+1 ; ; Console/list drivers ; All have entry A=driver number, other parameters per CP/M ; A=0 serial port 0; A=1 serial port 1; A=2 parallel (list only) org cpuio*256 cpu:: ;standard console/list routines for CPU serial ports jp pserin ; jp serin ;these three go direct to serial jp serout ; jp lstout jp pollst db 'SBCIO ' ;module name for display pserin:: ;poll serial in-return A=0ff if char ready, else 0 add A,A if intrin jr z,polbuf ;for first serial port endif inc A ;A=command port ld C,A in A,(C) and 1 ret z ;no character waiting ld A,0ffh ret if intrin polbuf:: ld hl,(outptri) ;get pointers input and output locs in buffer ld a,h sub l ;any thing in buffer ret z ;nothing there ld a,0ffh ;there is something ret endif serin:: ld B,A call pserin ld A,B jr z,serin ;loop until character received add A,A if intrin jr z,bufin ;for first serial port endif ld C,A in A,(C) and 7fh ;mask high order bit ret if intrin bufin:: di ;disable interrupts for saftey ld h,0 ;make into offset to retrieve from ld de,inpbuf ;get address of buffer add hl,de ;get address ld a,l ;update pointer inc a and inbfsz-1 ld (outptri),a ei ;ok to turn interrupts on now ld a,(hl) ;get char ret ;all done recv0int:: ld (svstk),SP ;save user stack pointer ld SP,locstk push HL ;save registers push DE push AF ld HL,(outptri) ;check if overflow inc H ld A,L and inbfsz-1 cp H j nz,rcv0 ;ski i roo fo more IN A,(0) ;clear input port xor A ;clear channel no. ld C,07 ;send bell call serout jr rcv02 ;exit rcv0t1: if intrin jp rcv02 ;if interrupt input use that return else pop AF ;restore registors pop DE pop HL ld SP,(svstk) ei ;interrupts back on reti ;and return endif ;intrin endif ;introut page ; these are the drivers modified for use with the printer lstout:: cp 2 ;parallel? jr z,plist ld B,A ;must be serial ld E,C lstot1:: call plserout or A ld A,B jr z,lstot1 dec C out (C),E ret pollst:: cp 2 jr z,polplist plserout:: add A,A ;serial out poll for printer-check busy line inc A ld C,A ld A,10h ;reset DART latch to get current value of BUSY out (C),A in A,(C) and 0ch cp 0ch ld A,0ffh ret z cpl ret page polplist:: ;parallel printer driver poll ld A,(frstpar) ;first time parallel called? or A jr z,noinit ;no, interface already initialized out (pioac),A ;set channel A to output ld A,0cfh out (piobc),A ;set channel B to bit mode ld A,00011111b ;bit 7-5 output, 4-0 input out (piobc),A xor A out (piobd),A ld (frstpar),A ;reset first noinit:: in A,(piobd) and 1 ;test busy bit ret z ;printer busy ld A,0ffh ret ;printer not busy plist:: ;parallel printer driver call polplist or A jr z,plist ld A,C out (pioad),A ;character on PIO A channel ld A,80h out (piobd),A ;strobe printer xor A out (piobd),A ;reset strobe ret frstpar:: db 0fh ;first initialization code for parallel ;printer-flag that PIO has not been initialized SUBTTL Floppy disk driver module page fpyio equ (($-start-1)/256)+1 ;make line up on page boundary ; ; Floppy disk drive driver module ; org fpyio*256 fpy:: ; floppy driver jump table jp fhome jp fseldsk jp fsettrk jp fsetsec jp fread jp fwrite jp fflush db 'FLOPPY ' ;module name for display purposes dskparm:: ;disk hardware parameter block ;one block for each drive rept nmbfpy if (mini and not special) db 1 ;single sided double density else db 0 ;density - 0=single D; 1=1 side, Double D; 2= 2S 2D endif  db seekrate ;seek rate - 0=3ms, 1=6ms, 2=10ms, 3=15ms if (mini and not special) db ddpspt else db 26 ;physical sectors per track - 26 in SD, ddpspt in DD endif db 0 ;track drive currently set at endm page ; ; CP/M disk tables fDPHbase:: fdisks ; defind disk parameter headers for floppys page ; ; DPB's for the three formats of disk:: ; ; 8" Single sided, single density ; 5" Single sided, double density ; 5" Double sided, double density ; fdpbase:: sssddpb:: ;single density (1K block) dw 26 ;sectors per track db 3 ;block shift (log2[block size/128]) db 7 ;block mask ([block size/128]-1) db 0 ;extent mask dw 242 ;highest block on disk (numbered from 0) dw 63 ;directory entries-1 db 0c0h ;alloc0 -first two bits for two blocks for Dir db 0 ;alloc1 dw 16 ;checked directories dw 2 ;track offset (system tracks) page ssdddpb:: ;single sided double density dw 8*ddpspt ;128 byte sectors per track db 4 db 0fh db 0 dw (tracks*ddpspt/2)-1 ;each of 76 tracks has ddpspt/2 2K blocks if mini dw 63 db 80h else dw 127 db 0c0h endif db 0 dw 32 dw 1 dsdddpb:: ;double sided double density dw 16*ddpspt ;one track consists of both sides db 4 db 0fh db 0 dw (tracks*ddpspt)-1 ;each of 76 tracks has ddpspt 2K blocks if mini dw 127 db 0c0h else dw 255 db 0f0h endif db 0 dw 32 dw 1 page trans:: ;single density translate table db 1,7,13,19,25,5,11,17,23,3,9,15,21 ;sectors 1-13 db 2,8,14,20,26,6,12,18,24,4,10,16,22 ;secotrs 14-16 fhome:: ld C,0 fsettrk:: ld A,C ld (iotrk),A ret fsetsec:: ld A,C ld (iosec),A ret setdma:: ld (iodma),BC ;shared among all drivers ret page ; ; Fseldsk selects the physical floppy in A (0-3) ; B=0 if last disk selected was a different floppy ; C=logical disk the floppy corresponds to fseldsk:: ld B,A call getden ;will set density byte if successful or A jr nz,fbadsel ;couldn't get density ;all physical operations OK here ld (hwptr),IX ;store for later use ld A,(IX+density) inc A ;make 1-3 ld B,A ld HL,fdpbase-dpblen ld DE,dpblen fgetdpb:: add HL,DE djnz fgetdpb ;HL=DPB address ld C,L ld B,H ld A,(curfpy) call seldph ld A,(IX+density) or A jr z,setran ;single density,set translate vector xor A ld (HL),A inc HL ld (HL),A jr putdpb setran:: ld DE,trans ;single density translate table ld (HL),E inc HL ld (HL),D putdpb:: ld DE,9 ;offset of DPB in DPH add HL,DE ld (HL),C inc HL ld (HL),B dec HL dec HL sbc HL,DE ;restore DPH (carry reset by or A) ret fbadsel:: ld A,(tempfpy) ld (curfpy),A ;restore changes made by getden ld HL,0 ret ;return error seldph:: add A,A add A,A add A,A add A,A ld L,A ld H,0 ld DE,fdphbase add HL,DE ret page ; ; Seldrv selects the drive from (curfpy), head from (head) ; (bit 0 set for head1), and density from (IX+density) ; it assembles the correct byte and outputs to wait ; and updates the track register with the most recent information seldrv:: ld A,(IX+density) or A jr z,setdens ld A,00001000b ;set double density bit ld B,A ld A,(head) rlca rlca ;move head bit to bit 2 or B setdens:: ld B,A ld A,(curfpy) or B out (wait),A ld A,(IX+drvtrk) ;get track from parameter table ;this may be first physical i/o out (trk),A ld A,2 ;set try flag ld (rdytry),A tstrdy:: ld A,0d0h ;reset status to controller out (cmd),A ex (SP),HL ;wait a bit ex (SP),HL ex (SP),HL ex (SP),HL in A,(cmd) ;drive ready? and 10000000b ret z ;yes ld HL,rdytry ;should we try once again dec (HL) jr nz,tstrdy ;yes ld DE,wpterr call pmsg call pdrv ld DE,ntrdyerr call pmsg ld DE,abortmsg call pmsg call conin cp 3 jr nz,tstrdy pop HL ;abort operation ld A,1 ret page ; ; Seek attempts to step the R/W head to the track in (iotrk) ; seek:: ld A,retries ld (retryc),A seek2:: ld A,(iotrk) ld C,A ;track stays in C in A,(trk) sub C jr nz,diftrk ;different track ld A,(curfpy) ld B,A ld A,(lstskdrv) ;last drive on which a seek took place sub B ret z ;already there ld D,14h ;seek and verify but unload head at beginning jr samtrk diftrk:: ld D,1ch ;seek with verify, load head at beginning samtrk:: ld A,C out (data),A ld A,(IX+seekrt) ;seek rate mask or D di out (cmd),A ld A,(curfpy) ;make current drive last drive ld (lstskdrv),A in A,(wait) ei rla jr c,seekerr ;no INTRQ from FDC in A,(cmd) and 10011001b ;seek error, CRC error, or incomplete jr nz,seekerr ;seek successful ld (IX+drvtrk),C ret seekerr:: ld E,1ch ;seek command call diskerror jr seek2 lstskdrv:: db 0 ;drive on which last disk operation took place page ; write writes the sector to the selected disk fwrite:: ld IX,(hwptr) ;restore IX to parameter block ld A,(IX+density) or A jr z,wrtsngl ld A,2 cp C jr z,unalloc dec A cp C jr z,directry ;directory sector jr wrtnorm unalloc:: ;unallocated sector write (no preread) call fflush or A ret nz ;flush error ld A,(iosec) and not(hstcnt-1) ;get first sector in buffer ld (blksec),A xor hstcnt*2 ld (blk2sec),A ;if this is an unallocated block ;then two physical sectors (2K) were ;unallocated ;here we have a sector to write that ;is currently in the host buffer movwrt:: call mkbufad ;get correct address in buffer ex DE,HL ldir ld A,0ffh ld (wrtpend),A ;write pending cpl ;return with no errors ret directry:: ;write to a directory sector ;the disk may be removed after this ;so we will make this write immediate call wrtnorm ;do a normal write or A ret nz ;error in previous flush or read jr fflush ;and flush this sector wrtnorm:: ;a block that has been written before call inbuf ;returns C flag set if not in buffer jr nc,movwrt ;and A to relative sector if in buffer ;not in buffer but might be sector of other 1k of ;an unallocated 2K data block ld A,D ;iosec and not (hstcnt-1) ld D,A ;first sector of new 1k block ld A,(blk2sec) cp D ; = unalocated block jr nz,wrtdbl ;unless sector of other 1K in ;unallocated data block call inbuf2 ;checks iotrk=blktrk jr c,wrtdbl call fflush ;previously unallocated data or A ret nz cpl ld (blk2sec),A ;clear unallocated sector indicator jr movwrt ;and write this sector wrtsngl:: ld A,(iosec) ld (psec),A ld A,0A3h ;second byte of OUTI instruction ld (iotran+1),A ld A,0ACh ;sector write ld (oper),A jp strtsel ;and do i/o wrtdbl:: call fflush ;flush buffer or A ret nz ;return bad sector if hard flush error cpl ld (blk2sec),A ;clear unalocated sector indicator call sidesec ;set up for new i/o call readprep ;do read to buffer or A ret nz ;physical error jr movwrt ;and move new sector from DMA page fflush:: ;flush deblocking buffer to disk ld A,(wrtpend) ;do we have a write pending? or A ld A,0ffh ld (bufvalid),A ;buffer data not valid cpl ret z push IX ;save pointer (drive may have changed) ld IX,(blkptr) ;for most recently selected drive ;which is the one to flush ld A,0A3h ;second byte of OUTI instruction ld (iotran+1),A ld A,0ACh ;FDC write sector command ld (oper),A ld HL,(iodrvtrk) push HL ld HL,(blkdrvtrk) ld (iodrvtrk),HL ;set drive to select and track ld A,(blksec) call sideflsh ;set up head bit and sector for flush call strtsel ;do physical flush pop HL ld (iodrvtrk),HL ;restore selected drive and track pop IX ld (wrtpend),A ;clear flag if no errors ret page ; ; Read reads the sector from the selected disk ; In double density, the sector may already be in the host buffer ; fread:: ld IX,(hwptr) ;restore parameter pointer ld A,(IX+density) ;density byte or A jr z,rdsngl ;singl density call inbuf jr c,rddbl ;sector not in buffer ; sector is in buffer movrd:: call mkbufad ;HL=start of sector in buffer ldir ret ;transfer done rddbl:: call fflush ;flush previous buffer or A ret nz ;physical error in flush call sidesec call readprep or A ret nz jr movrd rdsngl:: ld A,(iosec) ld (psec),A ;physical sector same as CP/M sector ;in single density readprep:: ld A,0A2h ;second byte of INI instruction ld (iotran+1),A ;patch rdwrite routine ld A,08ch ;sector read command ld (oper),A page strtsel:: call seldrv ;physically select drive and head call seek ;step to correct track ; ; diskio actually reads or writes the necessary sector ; it assumes that the head has already settled on the correct track ; (and that the head has been selected on the correct side!) ; and that the bytes in rdwrite for R/W and sector size have been filled diskio:: ld A,retries ld (retryc),A iotry:: ld A,0d0h ;force interrupt no conditions out (cmd),A ld A,(oper) ld B,A ld C,data ;prepare for indirect I/O instruction ex (SP),HL ;waste some time ex (SP),HL ex (SP),HL ex (SP),HL di ;no interrupts from here to end of transfer in A,(cmd) and 20h ;bit 5=head loaded rrca rrca rrca ;move bit 5 to bit 2 cpl and B ; the purpose of these manipulations has been ; to set bit 2 of the FDC command if the head ; isn't settled. Bit 2 will give a 15 ms delay ld E,A ld A,(IX+density) or A ld D,1 ;one sector i/o transfer for single denisty jr z,dmasingl ;use the CP/M DMA buffer in single density ld HL,hstbuf ;use host buffer for double density operations ld D,hstcnt ;number of 128 byte units to transfer jr strtio dmasingl:: ld HL,(iodma) strtio:: ld A,(psec) out (sec),A ;set physical sector ld A,E out (cmd),A ;start read/write operation call rdwrite ;do the actual i/o in A,(cmd) ei ;now ok to interrupt-status is saved ld E,A ;save status or B ;B returned from rdwrite is lost bytes count ret z ;if status OK and no lost bytes ld A,E and 10111111b ;clear write protect bit ld A,(oper) jr nz,nowpt ;write protect was not the problem cp 0ach ;was it a write operation jr nz,nowpt ;only error was disk write protected ld DE,wpterr call pmsg call pdrv ld DE,wpter2 call pmsg ld DE,abortmsg call pmsg call conin cp 3 ;was it control-C? jr nz,iotry ld A,1 ret ;return to BDOS with error nowpt:: ld D,A call diskerror call seek2 or A jr z,iotry ;if nonzero then hopeless seek error ret ; ; rdwrite does the actual transfer to/from the FDC ; HL set to DMA address on entry, D=number of 128 byte units to transfer ; transfer direction has been set by poking INI or OUTI instruction rdwrite:: ld B,128 ;bytes in one CP/M sector loop:: in A,(wait) or A ret p ;no more DRQ iotran:: ini ;start with read ;the second byte of this instruction is patched to ;be either INI or OUTI depending on need jr nz,loop dec D jr nz,rdwrite jr loop ;sector done, wait for INTRQ from fdc page ; ; disk error will eventually have all kinds of nice messages ; diskerror:: ld A,(retryc) dec A ld (retryc),A jr nz,restore ;more retries to attempt ld A,E cp 1ch ;was it a seek error? jr z,pseekerr cp 0ach ;writing? jr z,pwriterr ld DE,rderr jr perrtyp pwriterr:: ld DE,wrterr jr perrtyp pseekerr:: ld DE,skerr perrtyp:: call pmsg ld DE,trkerr call pmsg ld A,(iotrk) call phex ld DE,secerr call pmsg ld A,(psec) call phex ld DE,siderr call pmsg ld A,(head) call phex call pdrv ld DE,crlf call pmsg ld A,1 pop HL ret ;return to caller of driver with error pdrv:: ld DE,drverr call pmsg ld A,(curfpy) call phex ret page ; ; Restore is called from a disk operation with A=retries left ; restore:: in A,(cmd) and 00010000b ;bit 4=record not found ret z ;try again if record was found but ;read/written with error resto1:: ;restore to track 0 and seek again ld A,(IX+seekrt) ;get seek rate mask or 00001100b ;head load, restore, verify track 0 out (cmd),A tk0wait:: in A,(cmd) and 00000100b ;at track 0 jr z,tk0wait xor A out (trk),A ;back at track 0 ld (IX+drvtrk),A ;update track table ret page ; ; sidesec is the read/write preparation for double density ; sidesec computes the correct physical sector and side ; sidesec:: ld A,(iosec) and not(hstcnt-1) ;computer first CP/M sector in block ld (blksec),A sideflsh:: ;called to set up for a flush rept hstshft rrca endm ;A=physical sector number, but it may ;be on the second side ld B,(IX+pspt) cp B ld C,0 jr c,side0 sub B inc C side0:: inc A ld (psec),A ;physical sector on one side ld A,C ld (head),A ;set head control byte ret page ; ; inbuf returns carry flag set if sector not in buffer ; also returns (iosec) in D ; if sector is in buffer, returns offset (0 - hstcnt-1) in A ; inbuf:: ld A,(iosec) ld D,A ld A,(bufvalid) ;0 if contains valid data, else 255 rra ret c inbuf2:: ld HL,(iodrvtrk) ;check for 2nd sector ;of unallocated block ld BC,(blkdrvtrk) sbc HL,BC ;same drive and track jr z,rttrk scf ret ;not a match rttrk:: ld A,(blksec) ld B,A ld A,D sub B ret C ;sector lower # than buffer cp hstcnt ;carry set if in buffer ccf ret ; stores drive, track, sector of contents of buffer for use by flush ; also saves hardware pointer and sets buffer valid flag ; returns HL=start of sector in buffer, DE=DMA address, BC=128, A=0 mkbufad:: ld (blkptr),IX ld HL,(iodrvtrk) ld (blkdrvtrk),HL ld A,(iosec) ld B,A and not(hstcnt-1) ld (blksec),A ld A,B and hstcnt-1 ld B,A ;B=relative sector in buffer inc B ld HL,hstbuf-128 ld DE,128 shft2:: add HL,DE djnz shft2 ld BC,128 ;make ready for sector LDIR ld DE,(iodma) xor A ld (bufvalid),A ret page ; ; returns IX=start of DHPB (disk hardware parameter block) for ; the drive in A (0-3) ; uses B,DE also, returns D=0