Title: 'CBIOS for Terminet and Time Card' * * This is for the Terminet and Selectric, with all * the verbiage stripped out. * * This program contains the time display routine. * NOTE: Drives C and D no longer available - allocation * blocks stripped out to make room. * * * Modified for ZCPR2 installation 21 May 83 GLH * revnum equ 31 ;Cbios revision number cpmrev equ 22 ;CP/M revision number version equ 16 ;Local revision number origin equ 0E000H djram equ origin+400h ;Disk Jockey 2D RAM address djcin equ djram+3h ;Disk Jockey 2D character input routine djcout equ djram+6h ;Disk Jockey 2D character output routine djhome equ djram+9h ;Disk Jockey 2D track zero seek djtrk equ djram+0ch ;Disk Jockey 2D track seek routine djsec equ djram+0fh ;Disk Jockey 2D set sector routine djdma equ djram+012h ;Disk Jockey 2D set DMA address djread equ djram+15h ;Disk Jockey 2D read routine djwrite equ djram+18h ;Disk Jockey 2D write routine djsel equ djram+1bh ;Disk Jockey 2D select drive routine djtstat equ djram+21h ;Disk Jockey 2D terminal status routine djstat equ djram+27h ;Disk Jockey 2D status routine djerr equ djram+2ah ;Disk Jockey 2D error, flash led djden equ djram+2dh ;Disk Jockey 2D set density routine djside equ djram+30h ;Disk Jockey 2D set side routine msize equ 56 ;Memory size of target CP/M bias equ (msize-20)*1024 ;Memory offset from 20k system ccp equ 2d00h+bias ;Console command processor bdos equ ccp+800h ;BDOS address bios equ ccp+1600h ;CBIOS address cdisk equ 4 ;Address of last logged disk buff equ 80h ;Default buffer address tpa equ 100h ;Transient memory intioby equ 0 ;Initial IOBYTE iobyte equ 3 ;IOBYTE location wbot equ 0 ;Warm boot jump address entry equ 5 ;BDOS entry jump address retries equ 10 ;Max retries on disk i/o before error acr equ 0dh ;A carriage return alf equ 0ah ;A line feed aetx equ 3 ;A ETX char aack equ 6 ;A ACK char clear equ 1ah ;Clear screen char on ADM3 terminal maxdisk equ 4 ;Maximum # of disk drives dblsid equ 8 ;Side bit from controller Šescape equ 1bh ;Escape character eot equ 04h ;End of text character form equ 0ch ;Form feed character org bios ;CBIOS starting address jmp cboot ;Cold boot entry point wboote jmp wboot ;Warm boot entry point jmp const ;Console status routine jmp conin ;Console input cout jmp conout ;Console output jmp list ;List device output jmp punch ;Punch device output jmp reader ;Reader device input jmp home ;Home drive jmp setdrv ;Select disk jmp settrk ;Set track jmp setsec ;Set sector jmp setdma ;Set DMA address jmp read ;Read the disk jmp write ;Write the disk jmp listst ;List device status jmp sectran ;Sector translation djdrv jmp djsel ;Hook for SINGLE.COM program termon jmp motoron ;Start the Terminet 1200 termoff jmp motorof ;Turn off the Terminet. prompt db acr,alf,alf db acr,alf db 'CCPZ Terminet CP/M V2.2 ' db acr,alf db 'Master Catalog Disc: 001 ' db acr,alf db ' ' db acr,alf,0 message mov a,m ;Get a character of the message inx h ;Bump text pointer ana a ;Test for end rz ;Return if done push h ;Save pointer to text mov c,a ;Output character in C call cout ;Output the character pop h ;Restore the pointer jmp message ;Continue until null reached cboot lxi sp,tpa ;Set up stack call tinit ;Initialize the terminal lxi h,prompt ;Prep for sending signon message call message ;Send the prompt xra a ;Select disk A sta cpmdrv sta cdisk Š gocpm lxi h,buff ;Set up initial DMA address call setdma mvi a,(jmp) ;Initialize jump to warm boot sta wbot sta entry ;Initialize jump to BDOS lxi h,wboote ;Address in warm boot jump shld wbot+1 lxi h,bdos+6 ;Address in BDOS jump shld entry+1 xra a ;A <- 0 sta bufsec ;Disk Jockey buffer empty sta bufwrtn ;Set buffer not dirty flag lda cdisk ;Jump to CP/M with currently selected disk in C mov c,a lxi d,cmndbeg ;Beginning of initial command lxi h,ccp+8 ;Command buffer mvi a,cmndend-cmndbeg+1 ;Length of command sta ccp+7 mov b,a call movlop lda cwflg ana a lda autoflg jz cldbot rar cldbot rar jc ccp jmp ccp+3 ;Enter CP/M cwflg db 0 ;Cold/warm boot flag autoflg db 1 ;Auto command feature cmndbeη   dβ 'DUMMYARG ANOTHER1' ;For direct replacement.  cmndend db 0 wboot lxi sp,tpa ;Set up stack pointer mvi a,1 wflg equ $-1 ;Test if beginning or ana a ; ending a warm boot mvi a,1 sta wflg sta cwflg ;Set cold/warm boot flag jz gocpm xra a sta wflg mov c,a call djdrv ;Select drive A mvi c,0 ;Select single density call djden mvi c,0 ;Select side 0 call djside Š mvi a,15 ;Initialize the sector to read sta newsec lxi h,ccp-100h ;And the DMA address shld newdma call warmlod ;Read in CP/M lxi b,ccp+500h ;Load address for rest of warm boot call djdma mvi c,8 call djsec call warmrd jmp ccp+503h warmlod mvi a,15 ;Previous sector newsec equ $-1 inr a ;Update the previous sector inr a cpi 27 ;Was it the last ? jc nowrap sui 9 ;Yes cpi 19 rz lhld newdma lxi d,-480h dad d shld newdma nowrap sta newsec ;Save the new sector to read mov c,a call djsec lxi h,ccp-100h ;Get the previous DMA address newdma equ $-2 lxi d,100h ;Update the DMA address dad d shld newdma ;Save the DMA address mov b,h mov c,l call djdma ;Set the DMA address call warmrd jmp warmlod warmrd lxi b,retries*100h+0;Maximum # of errors wrmread push b call djtrk ;Set the track call djread ;Read the sector pop b rnc ;Continue if successful dcr b jnz wrmread ;Keep trying jmp djerr setsec mov a,c ;Save the sector number sta cpmsec ;CP/M sector # ret setdma mov h,b ;hl <- bc mov l,c Š shld cpmdma ;CP/M dma address ret home mvi c,0 ;Track to seek to settrk mov a,c ;A <- track # sta cpmtrk ;CP/M track # ret sectran inx b push d ;Save table address push b ;Save sector # call getdpb ;Get DPB address into HL mov a,m ;Get # of CP/M sectors/track ora a ;Clear cary rar ;Divide by two sub c push psw ;Save adjusted sector jm sidetwo sidea pop psw ;Discard adjusted sector pop b ;Restore sector requested pop d ;Restor address of xlt table sideone xchg ;hl <- &(translation table) dad b ;bc = offset into qu 22 ;CP/M revision number mov l,m mvi h,0 ret sidetwo lxi b,15 dad b mov a,m ani 8 jz sidea ;Media is only single sided pop psw ;Retrieve adjusted sector pop b cma ;Make sector request positive inr a mov c,a ;Make new sector the requested sector pop d call sideone mvi a,80h ;Side two bit ora l ; and sector mov l,a ret setdrv mov a,c ;Save the drive # sta cpmdrv cpi maxdisk ;Check for a valid drive # jnc zret ;Illegal drive # mov a,e ;Test if drive ever logged in before ani 1 jnz setdrv1 ;Bit 0 of E = 0 -> Never selected before mvi a,1 ;Select sector 1 of track 1 sta truesec Š sta cpmtrk call fill ;Flush buffer and refill jc zret ;Test for error return call djstat ;Get status on current drive ani 0ch ;Strip off unwanted bits push psw ;Used to select a DPB rar lxi h,xlts ;Table of XLT addresses mov e,a mvi d,0 dad d push h ;Save pointer to proper XLT call getdpb ;Get DPH pointer into DE xchg ; pop d mvi b,2 ;Number of bytes to move call movlop ;Move the address of XLT lxi d,8 ;Offset to DPB pointer dad d ;HL <- &DPH.DPB push h lhld origin+7 ;Get address of DJ terminal out routine inx h ;Bump to look at address of ; uart status location mov a,m xri 3 ;Adjust for proper rev DJ mov l,a mvi h,(origin+300h)/100h mov a,m ani dblsid ;Check double sided bit lxi d,dpb128s ;Base for single sided DPB's jnz sideok lxi d,dpb128d ;Base of double sided DPB's sideok xchg ;HL <- DBP base, DE <- &DPH.DPB pop d ;Restore DE (pointer into DPH) pop psw ;Offset to correct DPB ral ral mov c,a mvi b,0 dad b xchg ;Put DPB address in DPH mov m,e inx h mov m,d setdrv1 call getdpb ;Get address of DPB in HL lxi b,15 ;Offset to sector size dad b mov a,m ;Get sector size ani 7h sta secsiz mov a,m rar rar rar rar Š ani 0fh sta secpsec xchg ;HL <- DPH ret zret lxi h,0 ;Seldrv error exit ret getdpb lda cpmdrv ;Get drive # mov l,a ;Form offset mvi h,0 dad h dad h dad h dad h lxi d,dpzero ;Base of DPH's dad d push h ;Save address of DPH lxi d,10 ;Offset to DPB dad d mov a,m ;Get low byte of DPB address inx h mov h,m ;Get low byte of DPB mov l,a pop d ret xlts dw xlt128 ;Xlt for 128 byte sectors dw xlt256 ;Xlt for 256 byte sectors dw xlt512 ;Xlt for 512 byte sectors dw xlt124 ;Xlt for 1024 byte sectors write mov a,c ;Save write command type sta writtyp mvi a,1 ;Set write command db (mvi) or (b*8) ;This "mvi b" instruction causes ; the following "xra a" to ; be skipped over. read xra a ;Set the command type to read sta rdwr ;Save command type redwrt mvi b,0 ;The 0 is modified to contain the log2 secsiz equ $-1 ; of the physical sector size/128 ; on the currently selected disk. lda cpmsec ;Get the desired CP/M sector # push psw ;Temporary save ani 80h ;Save only the side bit mov c,a ;Remember the side pop psw ;Get the sector back ani 7fh ;Forget the side bit dcr a ;Temporary adjustment divloop dcr b ;Update repeat count Š jz divdone ora a ;Clear the cary flag rar ;Divide the CP/M sector # by the size ; of the physical sectors jmp divloop ; divdone inr a ora c ;Restore the side bit sta truesec ;Save the physical sector number lxi h,cpmdrv ;Pointer to desired drive,track, and sector lxi d,bufdrv ;Pointer to buffer drive,track, and sector mvi b,4 ;Count loop dtslop dcr b ;Test if done with compare jz move ;Yes, match. Go move the data ldax d ;Get a byte to compare cmp m ;Test for match inx h ;Bump pointers to next data item inx d jz dtslop ;Match, continue testing call fill ;Fill the buffer with correct physical sector rc ;No good, return with error indication move lda cpmsec ;Get the CP/M sector to transfer dcr a ;Adjust to proper sector in buffer ani 0 ;Strip off high ordered bits secpsec equ $-1 ;The 0 is modified to represent the # of ; CP/M sectors per physical sectors mov l,a ;Put into HL mvi h,0 dad h ;Form offset into buffer dad h dad h dad h dad h dad h dad h lxi d,buffer ;Beginning address of buffer dad d ;Form beginning address of sector to transfer xchg ;DE = address in buffer lxi h,0 ;Get DMA address, the 0 is modified to ; contain the DMA address cpmdma equ $-2 mvi a,0 ;The zero gets modified to contain ; a zero if a read, or a 1 if write rdwr equ $-1 ana a ;Test which kind of operation jnz into ;Transfer data into the buffer outof call mover xra a ret into xchg ; call mover ;Move the data, HL = destination ; DE = source mvi a,1 Š sta bufwrtn ;Set buffer written into flag mvi a,0 ;Check for directory write writtyp equ $-1 dcr a mvi a,0 sta writtyp ;Set no directory write rnz ;No error exit flush mvi a,0 ;The 0 is modified to reflect if ; the buffer has been written into bufwrtn equ $-1 ana a ;Test if written into rz ;Not written, all done lxi h,djwrite ;Write operation prep xra a ;Reset buffer written flag sta bufwrtn shld retryop ;Set up the read/write operation mvi b,retries ;Maximum number of retries to attempt retrylp push b ;Save the retry count lda bufdrv ;Get drive number involved in the operation mov c,a call djdrv ;Select the drive lda buftrk ana a ;Test for track zero mov c,a push b cz djhome ;Home the drive if track 0 pop b ;Restore track # call djtrk ;Seek to proper track lda bufsec ;Get sector involved in operation push psw ;Save the sector # rlc ;Bit 0 of A equals side # ani 1 ;Strip off unnecessary bits mov c,a ;C <- side # call djside ;Select the side pop psw ;A <- sector # ani 7fh ;Strip off side bit mov c,a ;C <- sector # call djsec ;Set the sector to transfer lxi b,buffer ;Set the DMA address call djdma call djread ;The read operation is modified to write retryop equ $-2 pop b ;Restore the retry counter mvi a,0 ;No error exit status rnc ;Return no error dcr b ;Update the retry counter stc ;Assume retry count expired mvi a,0ffh ;Error return rz jmp retrylp ;Try again fill call flush ;Flush buffer first rc ;Check for error Š lxi d,cpmdrv ;Update the drive, track, and sector lxi h,bufdrv mvi b,3 ;Number of bytes to move call movlop ;Copy the data lxi h,djread jmp prep ;Select drive, track, and sector. ; Then read the buffer mover mvi b,128 ;Length of transfer movlop ldax d ;Get a bte of source mov m,a ;Move it inx d ;Bump pointers inx h dcr b ;Update counter jnz movlop ;Continue moving until done ret motoron call motoron0 call formfd ret motorof call form2fd call motorof0 ret form2fd call formfd formfd mvi c,form call colpt ret motoron0 mvi c,escape call colpt mvi c,'H' call colpt ret motorof0 mvi c,eot call colpt ret IOSTART citty equ 0ff2bh ;Input from VIO routines. cotty equ 0fcbeh ;Output from VIO routines> video mov a,c ;Load the character jmp 0f803h ; and display on screen. const lxi h,cstble ;Beginning of jump table jmp conin1 ;Select correct jump csreadr lxi h,csrtble ;Beginning of reader status table jmp readera conin call flush ;Flush the disk buffer lxi h,citble ;Beginning of character input table conin1 lda iobyte ral seldev ani 6h ;Strip off unwanted bits Š mvi d,0 ;Form offset mov e,a dad d ;Add offset mov a,m ;Pick up high byte inx h mov h,m ;Pick up low byte mov l,a ;Form address pchl ;Go there ! conout push b ;Save the character call flush ;Flush the disk buffer pop b ;Restore the character lxi h,cotble ;Beginning of the character out table jmp conin1 ;Do the decode reader lxi h,rtble ;Beginning of reader input table readera lda iobyte readr1 rar jmp seldev punch lxi h,ptble ;Beginning of punch table lda iobyte pnch1 rar rar jmp readr1 list lxi h,ltble ;Beginning of the list device routines list1 lda iobyte rar rar jmp pnch1 listst lxi h,lstble ;Beginning of the list device status jmp list1 citble dw ciuc1 ;Input from keyboard (parallel port ; 02h, status port 03h). dw cicrt ;Same parameters as the previous ; entry for ciuc1. dw reader ;Input from reader (depends on reader ; selection) dw ciuc1 ;Same parameters as the previous ; entry> cotble dw video ;Output to the display screen via ; the VIO routine. dw colpt ;Output to the main printer - ; the Terminet1200. dw list ;Output to list device (depends on ; bits 6&7 of iobyte) dw couc1 ;Output to user console 1 (currently Š ; SWITCHBOARD serial port 1) ltble dw colpt ;Output to the printer: presently ; the Terminet1200. dw cosel ;Output to the secondary printer: ; the Selectric) dw colpt ; ; dw colpt ; ptble dw coptp ;Output to the punch routine ; using 02h and echo. dw coptp ; Same. ; dw coup1 ; Same. ; dw coup2 ; Same. ; rtble dw citty ;Input from tty (currently assigned ; by intioby, input from 2d) dw ciptr ;Input from paper tape reader (currently ; SWITCHBOARD serial port 1) dw ciur1 ;Input from user reader 1 (currently ; SWITCHBOARD serial port 1) dw ciur2 ;Input from user reader 2 (currently ; SWITCHBOARD serial port 1) cstble dw cscrt ;Status from keyboard - assigned to ; port02h, status 03h. dw cscrt ;Same as above. ; dw csreadr ;Status from reader (depends on reader device ) dw csuc1 ;Status from user console 1 (currently ; SWITCHBOARD serial port 1) csrtble dw cstty ;Status from tty (currently assigned ; by intioby, status of 2d) dw csptr ;Status from paper tape reader (currently ; SWITCHBOARD serial port 1) dw csur1 ;Status from user reader 1 (currently ; SWITCHBOARD serial port 1) dw csur2 ;Status of user reader 2 (currently ; SWITCHBOARD serial port 1) lstble dw ready ;Console always ready dw ready ;Get list status dw lslpt dw lslpt ;PRINT couc1 equ $ ;Output from user console 1 couc2 equ $ coup1 equ $ ;Output from user punch 1 coup2 equ $ ;Output from user punch 2 colpt mov a,c Š cpi 0AH jz lines cpi 0Ch jz formf cpi 0Dh jz carrt call djcout ret lines call djcout lxi b,0800h jmp sdelay carrt call djcout lxi b,0f00h jmp sdelay formf call djcout lxi b,0000h lxi d,0105h jmp ldelay sdelay dcr c jnz sdelay dcr b jnz sdelay ret ldelay call sdelay dcr e jnz ldelay dcr d jnz ldelay ret cosel in 03h ani 60h jnz cosel mov a,c out 1 ret ;INPUT ciuc1 equ $ ;Input from user console 1 cicrt equ $ ;Input from crt ciur1 equ $ ;Input from user reader 1 ciur2 equ $ ;Input from user reader 2 ciptr in 03h ani 02h call time ;display current time jz ciptr in 02h ani 7fh ret ;PUNCH coptp ret Š ;CONSTAT cstty call djtstat ;Status from Disk Jockey 2D stat mvi a,0 ;Prep for zero return rnz ;Nothing found dcr a ;Return with 0FFH ret csur1 equ $ ;Status of user reader 1 csur2 equ $ ;Status of user reader 2 csptr equ $ ;Status of paper tape reader csuc1 equ $ ;Status of user console 1 cscrt in 03h ani 02h xri 02h jmp stat lslpt in 03h ani 01h rz ready mvi a,0ffh ret tinit mvi c,clear ;Initialize the terminal routine mvi a,intioby ;Initialize IOBYTE sta iobyte lxi d,iodrivers ;default I/O drivers lxi h,iobase ;base address of drivers call mover lxi d,path ;copy coldboot path lxi h,pathbase ;into system external path area mvi b,9 ;always nine bytes call movlop call 0f800h ;Initialize the VIO/C board. if multcmd ;multiple commands allowed lxi d,cmdset ;set buffers for multiple lxi h,clbase ;command line base call mover ;copy arbitrary 128 bytes endif if ndir ;named directory base in memory lxi d,ndvals ;initial values in directory lxi h,ndbase ;named directory base call mover endif jmp cout ; IOSTOP clock equ 0080h ;Clock port address screen equ 0F046h ;Display address time: push psw ! push b ! push d ! push h lxi h,screen ;Point to hour mvi d,0 ;Select hour tens digit call ddigit ;Read hour tens and unit inx h ;step over ":" call ddigit ;read minutes tens and unit inx h ;step over ":" call ddigit ;read seconds tens and unit pop h ! pop d ! pop b ! pop psw ret ddigit: call digit ;read and store two digits digit: mov a,d ;move digit seclect code to a Š call rdigit ;read a clock digit ori 30h ;convert digits to ascii cpi 03fh ;test for blanked leading zero jnz store ;store digit if not blanked mvi a,030h ;restore blank to ascii 0 store: mov m,a ;store the digit in message buffer inx h inr d ;step to next digit ani 00fh ;mask off high nibble ret ;return with digit in a rdigit: out clock ;select digit mvi a,0 dcr a ;....some delay time for settling. jnz $-1 dcr a jnz $-1 dcr a jnz $-1 in clock ;read a digit ret ;return with digit in a xlt128 db 0 db 1,7,13,19,25 db 5,11,17,23 db 3,9,15,21 db 2,8,14,20,26 db 6,12,18,24 db 4,10,16,22 xlt256 db 0 db 1,2,19,20,37,38 db 3,4,21,22,39,40 db 5,6,23,24,41,42 db 7,8,25,26,43,44 db 9,10,27,28,45,46 db 11,12,29,30,47,48 db 13,14,31,32,49,50 db 15,16,33,34,51,52 db 17,18,35,36 xlt512 db 0 db 1,2,3,4,17,18,19,20 db 33,34,35,36,49,50,51,52 db 5,6,7,8,21,22,23,24 db 37,38,39,40,53,54,55,56 db 9,10,11,12,25,26,27,28 db 41,42,43,44,57,58,59,60 db 13,14,15,16,29,30,31,32 db 45,46,47,48 xlt124 db 0 db 1,2,3,4,5,6,7,8 db 25,26,27,28,29,30,31,32 db 49,50,51,52,53,54,55,56 db 9,10,11,12,13,14,15,16 Š db 33,34,35,36,37,38,39,40 db 57,58,59,60,61,62,63,64 db 17,18,19,20,21,22,23,24 db 41,42,43,44,45,46,47,48 dpb128s dw 26 ;CP/M sectors/track db 3 ;BSH db 7 ;BLM db 0 ;EXM dw 242 ;DSM dw 63 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 16 ;CKS dw 2 ;OFF db 1h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dpb256s dw 52 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 242 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 12h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dpb512s dw 60 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 280 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dp1024s dw 64 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 299 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS Š dw 2 ;OFF db 74h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dpb128d dw 52 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 242 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 9h dpb256d dw 104 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 486 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 1ah dpb512d dw 120 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 561 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 3bh dp1024d dw 128 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 599 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 7ch dpzero dw 0 ;Address of translation table (filled ; in by setdrv) Š dw 0,0,0 ;Used by BDOS dw dirbuf ;Address of directory buffer dw 0 ;Address of DPB (filled in by setdrv) dw csv0 ;Directory check vector dw alv0 ;Allocation vector dpone dw 0 dw 0,0,0 dw dirbuf dw 0 dw csv1 dw alv1 dptwo dw 0 dw 0,0,0 dw dirbuf dw 0 dw csv2 dw alv2 dpthre dw 0 dw 0,0,0 dw dirbuf dw 0 dw csv3 dw alv3 cpmsec db 0 ;CP/M sector # cpmdrv db 0 ;CP/M drive # cpmtrk db 0 ;CP/M track # truesec db 0 ;Disk Jockey sector that contains CP/M sector bufdrv db 0 ;Drive that buffer belongs to buftrk db 0 ;Track that buffer belongs to bufsec db 0 ;Sector that buffer belongs to buffer ds 1024 ;Maximum size buffer for 1K sectors alv0 ds 75 ;Allocation vector for drive A alv1 ds 75 ;Allocation vector for drive B alv2 ds 1 * ds 75 ;Allocation vector for drive C alv3 ds 1 * ds 75 ;Allocation vector for drive D csv0 ds 64 ;Directory check vector for drive A csv1 ds 64 ;Directory check vector for drive B csv2 ds 1 * ds 64 ;Directory check vector for drive C csv3 ds 1 * ds 64 ;Directory check vector for drive D dirbuf ds 128 ;Directory buffer end