; ; Search directory for filename ; $search ld a,(de) cp '?' call nz,drvok2 jr c,pgmccb0 call pgmc370 call pgmcd29 call pgmc252 ex de,hl ld (datcce7),hl ex de,hl pgmcc8c call gtdrv2 call setdrv$ set 1,(ix+050h) ld a,(de) cp 03fh jr z,pgmcc9f res 1,(ix+050h) pgmcc9f ld hl,0ch add hl,de ld a,(hl) cp 03fh jr z,pgmccad call pgmcaeb jr pgmccb0 ; pgmccad call pgmcc0f pgmccb0 ld a,0ffh jp c,usra ld (ix+u.rl),l ld (ix+u.rh),h ld de,(usrtab$) ld hl,75h add hl,de ex de,hl ld bc,4dh add hl,bc ld bc,28h ldir bit 6,(ix+050h) jr z,pgmccde bit 5,(ix+050h) jr nz,pgmccde ld a,(ix+04fh) jr pgmcce2 ; pgmccde ld a,(ix+04dh) dec a pgmcce2 and 003h jp usra ; datcce7 dw 00 ; ; Find next directory entry ; $findnx push de ld de,(usrtab$) ld hl,4dh add hl,de ex de,hl ld bc,75h add hl,bc ld bc,28h ldir pop de ld a,d or e jr nz,pgmcd05 ld hl,(datcce7) ex de,hl pgmcd05 ld a,(de) cp 03fh call nz,drvok2 jr c,pgmccb0 call pgmcd29 jp pgmcc8c ; ; Update directory entry ; $dirupd call drvok2 jr c,pgmcd26 call pgmcd29 pgmcd1b call gtdrv2 pgmcd1e ld c,u.ddiskb call getusr$ call pgmc2c3 pgmcd26 jp usra ; pgmcd29 push hl push de push bc ld c,u.diskb call getusr$ ex de,hl ld c,u.ddiskb call setusrx pop bc pop de pop hl ret ; ; Delete file ; $delete call drvok2 jr c,pgmcd61 call pgmc370 call pgmc252 ld bc,00 pgmcd49 push bc call pgmcbff jr nc,pgmcd5a pgmcd4f pop bc ld a,b and a ld a,0ffh jr nz,pgmcd57 ld a,c pgmcd57 jp usra ; pgmcd5a call pgmcd83 pop bc inc bc jr pgmcd49 ; pgmcd61 sub a jr pgmcd57 ; ; Delete extents ; $delext call drvok2 jr c,pgmcd80 call pgmc370 call pgmc252 call pgmcae7 jr c,pgmcd80 bit 7,(hl) jr nz,pgmcd80 call pgmcd83 ld a,001h pgmcd7d jp usra ; pgmcd80 sub a jr pgmcd7d ; pgmcd83 push de ld (hl),0e5h ld bc,0fh add hl,bc call gtdrv2 push hl push de push bc inc hl sub a call pgmc464 pop bc pop de pop hl ld a,(hl) or a jr z,pgmcdc2 dec a call pgmc5fb inc a call gtdrv2 ld c,a inc hl push hl ld l,00dh call gtddat$ ld a,(hl) pop hl pgmcdae ld d,000h ld e,(hl) bit 7,a jr z,pgmcdb7 inc hl ld d,(hl) pgmcdb7 inc hl push hl push af call pgmc329 pop af pop hl dec c jr nz,pgmcdae pgmcdc2 pop de push de call pgmcd1b pop de ret ; ; Rename file ; $rename call drvok2 ld a,0 jp c,usra call pgmc370 call pgmc252 ld bc,00 push bc push de ld hl,10h add hl,de ex de,hl call pgmcc05 pop de jp nc,pgmcd4f call pgmc252 pgmcdeb call pgmcbff jp c,pgmcd4f push de push af ld bc,11h ex de,hl add hl,bc ex de,hl inc hl ld b,00bh pgmcdfc ld a,(de) cp 03fh jr z,pgmce02 ld (hl),a pgmce02 inc hl inc de djnz pgmcdfc pop af pop de push de push af call pgmcd1b pop af pop de pop bc inc bc push bc jr pgmcdeb ; ; Set file attributes ; $setatt call drvok2 ld a,000h jp c,usra call pgmc370 call pgmc252 ld hl,00 pgmce25 push hl ld c,b push bc call pgmcc05 pop bc jp c,pgmcd4f ld a,(hl) and 004h res 2,c or c bit 0,a jr z,pgmce3a or (hl) pgmce3a and 0fch ld (hl),a push bc push de call pgmcd1b pop de pop bc pop hl inc hl jr pgmce25 ; pgmce48 cp 061h ret c and 05fh ret ; ; Close disk file ; $close call drvok2 jp c,usra call pgmc9e4 ld a,0 jp z,usra call pgmc252 call pgmcae7 ld a,0ffh jp c,usra call pgmce6d jp pgmc9bc ; pgmce6d push hl push bc push de call pgmceb5 call gtdrv2 call pgmc238 bit 7,a jr nz,pgmcea9 call pgmc163 and a jr nz,pgmceb1 pop de push de push bc push hl ld hl,0fh add hl,de ld c,(hl) ld hl,0ch add hl,de ld a,(hl) pop de ld hl,0ch add hl,de cp (hl) jr c,pgmcead ld (hl),a ld hl,0eh add hl,de ld a,(hl) jr nz,pgmcea4 cp c jr nc,pgmcead pgmcea4 ld (hl),c pop bc call pgmcd1e pgmcea9 pop de pop bc pop hl ret ; pgmcead sub a pop bc jr pgmcea9 ; pgmceb1 ld a,0ffh jr pgmcea9 ; pgmceb5 push bc push hl push de ld b,01fh pgmceba inc de inc hl ld a,(de) cp (hl) jr nz,pgmcec5 djnz pgmceba sub a jr pgmcee9 ; pgmcec5 pop de pop hl push hl push de ld bc,dat001f inc de inc hl call pgmdbe3 pop de push de call gtdrv2 push bc call pgmcd1b and a jr nz,pgmceed pop bc pop de push de ld hl,10h add hl,de ld a,001h call pgmc464 pgmcee9 pop de pop hl pop bc ret ; pgmceed pop bc ld a,0ffh and a jr pgmcee9 ; ; Write next record ; $wrnext push iy push de pop iy call $wrcurr and a jr nz,pgmcf38 ld hl,20h add hl,de inc (hl) ld a,080h cp (hl) jr nz,pgmcf33 call pgmc9e4 jr z,pgmcf33 call $close cp 0ffh ld a,001h jr z,pgmcf35 ld a,(iy+00ch) cp 0ffh jr z,pgmcf35 inc a ld (iy+00ch),a ld (iy+020h),000h call $open cp 0ffh jr nz,pgmcf33 call $create cp 0ffh jr z,pgmcf38 pgmcf33 ld a,000h pgmcf35 call usra pgmcf38 pop iy ret ; ; Write current record ; $wrcurr ld a,(de) rlca ld a,001h jr c,pgmcf73 ld hl,20h add hl,de ld a,(hl) and a ld a,001h jp m,pgmcf73 push de ld hl,20h add hl,de ld a,(hl) call pgmcf76 pop de jr c,pgmcf73 ld c,007h push de call pgmcad9 pop de or a ld a,001h jr nz,pgmcf73 ld hl,20h add hl,de ld a,(hl) ld hl,0fh add hl,de cp (hl) jr c,pgmcf72 inc a ld (hl),a pgmcf72 sub a pgmcf73 jp usra ; pgmcf76 push af push de call gtdrv2 call pgmca65 jr nc,pgmcf9e ex de,hl pop de push de push hl push bc call gtdrv2 call pgmc2d8 jr c,pgmcf9a pop bc pop hl ld (hl),e bit 7,b jr z,pgmcf96 inc hl ld (hl),d pgmcf96 pop de pop af jr pgmcf76 ; pgmcf9a ld a,002h pop bc pop hl pgmcf9e pop de ex (sp),hl pop hl ret ; pgmcfa2 ld a,h cpl ld h,a ld a,l cpl ld l,a inc hl ret ; ; Link to program ; $lnkpgm ld hl,9 add hl,de ld a,0ffh call usra ld a,'C' cp (hl) ret nz inc hl ld a,'O' cp (hl) ret nz inc hl ld a,'M' ret nz ld hl,(usrtab$) ld bc,u.sdiskb add hl,bc ld bc,tbase ld (hl),c inc hl ld (hl),b ld c,u.re call getusr$ ex de,hl ld c,02ch call getusrp push hl ld bc,20h call pgmdbe3 ld (hl),000h pop de ld hl,0ch add hl,de ld (hl),000h call $open cp 0ffh ret z ld a,(de) and 03fh ld (de),a ld hl,(usrtab$) ld de,u.sdiskb add hl,de ld de,tbase pgmcffc ld (hl),e inc hl ld (hl),d dec hl push de push hl ld hl,80h add hl,de ex de,hl ld hl,(ramtopv) ld a,l sub e ld a,h sbc a,d jr nc,pgmd039 ld c,u.pgmnam call getusrp ld e,0bh pcomnxt ld a,(hl) call outch inc hl dec e jr nz,pcomnxt ld hl,bigprgm call fprint jp modbd4a ; bigprgm db '-program too big',0 ; pgmd039 ld c,02ch call getusrp ex de,hl call $rdnext pop de pop hl ld bc,80h add hl,bc ex de,hl or a jr z,pgmcffc ld de,80h ld (hl),e inc hl ld (hl),d ld a,(date528) and a jr z,pgmd05d ld hl,(ramtopv) jr pgmd064 ; pgmd05d ld hl,(usrtab$) ld bc,4dh add hl,bc pgmd064 ld sp,hl ld hl,modbd4a push hl ld c,u.trap$ call getusr$ ld a,h and l cp 0ffh ld de,00 call nz,$setabo ld c,u.curdsk call getusrp ld b,(hl) ld c,u.prgret call getusrp ld a,(hl) ld (hl),000h ld hl,(rambotm) jp (hl) ; ; Check if allocated ; $chkall call drvok2 jr c,pgmd097 call pgmd09b ld a,0ffh jr c,pgmd097 sub a pgmd097 jp usra ; sys9b ret ; pgmd09b call gtdrv2 ld hl,20h add hl,de ld a,(hl) jp pgmca93 ; ; Create file ; $create call drvok2 jp c,usra ld hl,date5c4 ld (ix+u.sdiskb),l ld (ix+u.sdiskb+1),h call pgmc370 call pgmc9e4 jr z,pgmd113 call pgmc252 call gtdrv2 pgmd0c3 call pgmcb53 jr c,pgmd0fe ld a,(hl) cp 0e5h jr z,pgmd0c3 ld a,(iy+00ch) bit 2,(hl) jr nz,pgmd0f1 push hl ld l,00dh call gtddat$ bit 6,(hl) pop hl jr nz,pgmd0ec push de ex de,hl ld hl,0ch add hl,de cp (hl) ex de,hl pop de jr z,pgmd113 jr pgmd0c3 ; pgmd0ec call pgmd12a jr pgmd0f9 ; pgmd0f1 push af call pgmc9cb pop af call pgmd1b3 pgmd0f9 and a jr nz,pgmd113 jr pgmd10d ; pgmd0fe call pgmd258 jr c,pgmd113 sub a call pgmd21d call pgmcd1b and a jr nz,pgmd113 pgmd10d call savdskb jp pgmc9bc ; pgmd113 ld a,0ffh call savdskb jp usra ; savdskb push hl ld l,(ix+u.diskb) ld h,(ix+u.diskb+1) ld (ix+u.sdiskb),l ld (ix+u.sdiskb+1),h pop hl ret ; pgmd12a push bc push de push hl push af call pgmd188 sub a call pgmd22f pop af push af cp (ix+038h) jr z,pgmd178 ld c,(ix+038h) call pgmd26d call pgmd19e pop af push af and 0fch ld c,a ld a,(ix+038h) and 0fch cp c jr nz,pgmd172 pop af push af call pgmc191 pop af push af ld c,a sub a call pgmd23c call $wrnext and a jr nz,pgmd178 pop af push af call pgmd2d7 and a jr nz,pgmd178 pop af call pgmd22f jr pgmd17e ; pgmd172 call $wrnext and a jr z,pgmd182 pgmd178 pop af call pgmd22f ld a,0ffh pgmd17e pop hl pop de pop bc ret ; pgmd182 pop af pop hl pop de pop bc jr pgmd1b3 ; pgmd188 push bc push de push hl ld hl,(usrtab$) ld de,2ch add hl,de ex de,hl pop hl push hl ld bc,dat0021 ldir pop hl pop de pop bc ret ; pgmd19e push bc push de push hl ld hl,(usrtab$) ld de,2ch add hl,de pop de push de ld bc,20h ldir pop hl pop de pop bc ret ; pgmd1b3 push bc push de push hl push af srl a srl a ld (iy+020h),a call $rdcurr and a jr z,pgmd1ee cp 001h jr z,pgmd1e6 pop af push af ld c,a call pgmd26d and a jr nz,pgmd213 pop af push af ld c,a sub a call pgmd23c call $wrnext and a jr nz,pgmd213 call pgmd2ad and a jr nz,pgmd213 jr pgmd205 ; pgmd1e6 pop af push af call pgmd306 and a jr nz,pgmd213 pgmd1ee pop af push af call pgmc191 ld a,(hl) cp 0e5h jr nz,pgmd213 pop af push af ld c,a sub a call pgmd23c call $wrnext and a jr nz,pgmd213 pgmd205 pop af push af call pgmd2d7 and a jr nz,pgmd213 pop af call pgmd22f jr pgmd219 ; pgmd213 pop af call pgmd22f ld a,0ffh pgmd219 pop hl pop de pop bc ret ; pgmd21d push hl push de push bc call pgmd24b pgmd223 inc de inc hl ld (de),a ld (hl),a djnz pgmd223 inc de ld (de),a pop bc pop de pop hl ret ; pgmd22f push hl push de push bc ld hl,0ch add hl,de ld (hl),a ld b,014h sub a jr pgmd243 ; pgmd23c push hl push de push bc call pgmd24b ld (hl),c pgmd243 inc hl ld (hl),a djnz pgmd243 pop bc pop de pop hl ret ; pgmd24b ld (hl),a ld b,00ch pgmd24e inc de inc hl ld a,(de) ld (hl),a djnz pgmd24e ld b,013h sub a ret ; pgmd258 push de push bc call gtdrv2 call pgmc252 pgmd260 call pgmc1b7 jr c,pgmd26a ld a,(hl) cp 0e5h jr nz,pgmd260 pgmd26a pop bc pop de ret ; pgmd26d push bc push de call pgmd329 ld l,005h call gtddat$ ld e,l ld d,000h push de ld l,c ld h,000h srl l srl l call divhlde ld a,e pop de push af call mlthlde ld b,l pop af pop de push de ld hl,20h add hl,de ld (hl),b and a jr z,pgmd2a4 pgmd297 pop de push de push af call $wrnext and a jr nz,pgmd2aa pop af dec a jr nz,pgmd297 pgmd2a4 pop de pop bc ld a,c jp pgmc191 ; pgmd2aa pop de pop bc ret ; pgmd2ad push hl push bc push de call pgmd329 pgmd2b3 ld l,005h call gtddat$ ld a,l pop de push de ld hl,20h add hl,de ld l,(hl) ld h,000h ld e,a ld d,h call divhlde ld a,e and a jr z,pgmd2d3 pop de push de call $wrnext and a jr z,pgmd2b3 pgmd2d3 pop de pop bc pop hl ret ; pgmd2d7 push hl push bc push de push af call gtdrv2 call pgmc238 call pgmc163 and a jr nz,pgmd301 pop af pop de push de push hl ld hl,0ch add hl,de cp (hl) jr c,pgmd2f7 ld (hl),a inc hl inc hl ld (hl),000h pgmd2f7 pop hl set 2,(hl) call pgmceb5 pgmd2fd pop de pop bc pop hl ret ; pgmd301 pop af ld a,0ffh jr pgmd2fd ; pgmd306 push hl push bc push de push af call pgmd329 ld a,(iy+00fh) ld (iy+020h),a pgmd313 pop af push af srl a srl a sub (iy+020h) jr z,pgmd324 call $wrnext and a jr z,pgmd313 pgmd324 pop de pop de pop bc pop hl ret ; pgmd329 push hl push de push bc call pgmc277 ld e,l ld d,h ld (hl),0e5h inc de ld bc,dat007f ldir pop bc pop de pop hl ret ; readcon push hl push de push bc pgmd340 call inch jr c,pgmd350 or a jr z,pgmd340 ld (hl),0 pgmd34a and 07fh pop bc pop de pop hl ret ; pgmd350 ld (hl),0 call i.cin jr pgmd34a ; ; Read console with no echo ; $conin call readcon jp usra ; ; Read console with echo ; $conine call readcon call usra cp 07fh ret z cp 020h jr nc,pgmd373 ld hl,datd376 ld bc,5 cpir ret nz pgmd373 jp echo ; datd376 db bell,0,cr,lf,tab ; ; Write console ; $conout ld a,e jp outch ; ; Read reader ; $rdrin ld hl,i.rstat ld bc,i.rin call pgmd399 jp usra ; ; Write punch ; $punout ld hl,i.prdy ld bc,i.pout jr pgmd399 ; ; Write list ; $lstout ld hl,i.lrdy ld bc,i.lout pgmd399 push bc push de push hl pgmd39c call inch ld a,(hl) pop hl cp 005h jr z,pgmd3b1 push hl call pgmd3b0 and a jr z,pgmd39c pop hl pop de ld a,e pop hl pgmd3b0 jp (hl) ; pgmd3b1 ld a,01ah pop de pop bc ret ; ; Get iobyte ; $getiob ld a,(iobyte) jp usra ; ; Set iobyte ; $setiob ld a,e ld (iobyte),a ret ; ; Print buffered line ; $wrline ld a,(de) cp 024h ret z call outch inc de jr sys09 ; ; Input buffered line ; $rdline ex de,hl ld e,(hl) ld d,000h inc hl ld (hl),e inc hl pgmd3d2 push hl push de call readcon pop de pop hl call pgmd3de jr pgmd3d2 ; pgmd3de ld bc,datd3e3 jr pgmd407 ; datd3e3 db 003h dw pgmd423 db 005h dw pgmd429 db 008h dw pgmd42c db 012h dw pgmd43c db 015h dw pgmd453 db 016h dw pgmd461 db 018h dw pgmd467 db 05fh dw pgmd42c db 07fh dw pgmd42c db 00dh dw pgmd498 db 01bh dw pgmd49d db 0ffh dw pgmd4b8 ; pgmd407 push hl push de push af push bc pop hl ld d,a pgmd40d ld a,(hl) cp 0ffh jr z,pgmd41a cp d jr z,pgmd41a inc hl inc hl inc hl jr pgmd40d ; pgmd41a inc hl ld a,(hl) inc hl ld h,(hl) ld l,a pop af pop de ex (sp),hl ret ; pgmd423 call pgmd4c0 jp trapcc ; pgmd429 jp pgmd4dd ; pgmd42c ld a,d or a ret z dec d dec hl call backspc ld a,(hl) cp 020h call c,backspc scf ret ; pgmd43c call pgmd4c0 call pgmd4dd ld a,d or a ret z push iy pop hl ld b,d inc hl inc hl pgmd44b ld a,(hl) call pgmd4c0 inc hl djnz pgmd44b ret ; pgmd453 call pgmd4c0 call pgmd4dd push iy pop hl ld d,000h inc hl inc hl ret ; pgmd461 call pgmd42c jr c,pgmd461 ret ; pgmd467 ld a,d and a ret z ld a,05ch call echo call echo call echo pgmd475 dec d dec hl ld a,(hl) call echo pgmd47b call readcon cp 018h jr nz,pgmd488 ld a,d or a jr z,pgmd47b jr pgmd475 ; pgmd488 push af ld a,02fh call echo call echo call echo pop af jp pgmd3de ; pgmd498 call echo jr pgmd4ad ; pgmd49d bit 2,(ix+u.opts) jr z,pgmd4b8 ld a,d cp e jr nz,pgmd4a9 dec d dec hl pgmd4a9 ld (hl),01bh inc d inc hl pgmd4ad ld a,d cp e jr z,pgmd4b6 ld (hl),000h ld (iy+001h),d pgmd4b6 pop hl ret ; pgmd4b8 ld b,a ld a,e cp d ret z ld (hl),b inc hl inc d ld a,b pgmd4c0 cp ' ' jr nc,pgmd4cd push af ld a,'^' call echo pop af or 040h pgmd4cd jr echo ; backspc ld a,bs call echo ld a,' ' call echo ld a,bs jr echo ; pgmd4dd ld a,cr call echo ld a,lf echo bit 6,(ix+u.opts) ret nz cp cr jr nz,pgmd4f2 bit 3,(ix+u.opts) ret nz pgmd4f2 jp outch ; ; Test console ready ; $consta call inch or a jr z,pgmd4fd ld a,-1 pgmd4fd jp usra ; ; CP/M jump table ; cpmjtab jp idle cwboot jp $abort jp i.cstat jp i.cin jp conout jp clist jp cpunch jp i.rin jp chome jp cseldsk jp csettrk jp csetsec jp setdma jp cdskrd jp cdskwr ; conout ld a,c jp i.cout ; clist ld a,c jp i.lout ; cpunch ld a,c jp i.pout ; cseldsk push bc ld c,u.curdsk call getusrp pop bc ld (hl),c ret ; csettrk ld a,c ld (cpmtrk),a ret ; csetsec ld a,c ld (cpmsec),a ret ; setdma ld d,b ld e,c ld c,u.diskb jp setusrx ; chome xor a ld (cpmtrk),a ld c,u.curdsk call getusr$ ld b,l ld c,0 jp axdskop ; cdskrd ld a,004h jr pgmd568 ; cdskwr ld a,006h pgmd568 push af ld de,dat001a ld hl,(cpmtrk) call mlthlde ld hl,(cpmsec) dec hl add hl,de ex de,hl ld c,u.curdsk call getusr$ ld b,l ld c,u.diskb call getusr$ pop af ld c,a sub a jp axdskop ; cpmtrk dw 00 ; cpmsec dw 00 ; gtop$ push hl push bc ld de,7 add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl ld b,0 add hl,bc ld e,(hl) inc hl ld d,(hl) pop bc pop hl ret ; gtddat$ push de ex de,hl call getdrv$ jr pgmd5ac ; gtdfn$ push de ex de,hl ld hl,(adfn$) pgmd5ac ld d,0 add hl,de pop de ret ; setdrv$ push hl push de ld hl,(drives$) ld e,b ld d,0 inc hl add hl,de add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl call savdsk$ pop de pop hl ret ; getdrv$ push de call loddsk$ ld e,(hl) inc hl ld d,(hl) ex de,hl pop de ret ; savdsk$ push de push hl call loddsk$ pop de push de ld (hl),e inc hl ld (hl),d pop hl pop de ret ; loddsk$ ld hl,(usrtab$) ld de,u.ddat add hl,de ret ; axdskop push af call gistat di ld (iflag),a pop af push ix push iy ld iy,aderchk call setupdd jr nc,pgmd643 ld hl,(mtrtim) ld (datd65e),hl ld hl,00 ld (mtrtim),hl ld a,(adopno) cp 010h jr nc,pgmd651 ld b,a add a,a add a,b ld hl,datd660 add a,l ld l,a jr nc,pgmd619 inc h pgmd619 ld e,(hl) inc hl ld d,(hl) inc hl push hl bit 7,(hl) jr z,pgmd627 push de call adwrite pop de pgmd627 ex de,hl call jumphl2 pop hl push af ld a,(hl) ld hl,00 bit 4,a jr nz,pgmd63f ld hl,datd65e bit 5,a jr nz,pgmd63f ld hl,-1 pgmd63f ld (mtrtim),hl pop af pgmd643 pop iy pop ix push af ld a,(iflag) and a jr z,pgmd64f ei pgmd64f pop af ret ; pgmd651 ld a,002h call aderchk jr c,pgmd651 jr pgmd643 ; iflag db 0 ; jumphl2 jp (hl) ; mtrtim dw -1 ; datd65e dw 00 ; datd660 dw adauxop db 0c0h dw adauxop db 010h dw adauxop db 0c0h dw adauxop db 0a0h dw adsecrw db 040h dw adsecrw db 040h dw adsecrw db 040h dw adsecrw db 040h dw addummy db 020h dw adwrite db 040h dw adlogin db 0c0h dw addummy db 020h dw adtrkrw db 0c0h dw adtrkrw db 0c0h dw adtrkrw db 0c0h dw adtrkrw db 0c0h ; addummy sub a ret ; adsecrw call pgmd746 ret nc ld hl,adflags ld a,(adr.s) dec a jp z,adskrw call adwrver push af ld a,(datdb54) ld hl,(datd8b3) ld de,80h and a jr z,pgmd6b4 pgmd6b0 add hl,de dec a jr nz,pgmd6b0 pgmd6b4 ld de,(adbuf$) ld bc,80h ld a,(adflags) bit 1,a jr z,pgmd6c3 ex de,hl pgmd6c3 ldir pop af ret ; adtrkrw ld a,(lgclerb) ld (adsurf),a cp (ix+d.nsurf) jp nc,pgmd80e ld hl,(lgclerc) call adsttrk ret nc sub a ld (adsect),a ld a,h or l jr nz,pgmd6e9 ld a,(adsurf) and a jr nz,pgmd6e9 scf pgmd6e9 call adstpar ld h,000h ld l,c ld a,(adr.s) ld e,a ld d,h call divhlde ld a,l ld (sqscnt),a call adgtskw ld (sqsec$),bc ld hl,adflags jp adskrw ; setupdd ld (lgclerb),a ld a,c ld (adopno),a ld a,b ld (addisk),a ld (adbuf$),hl ex de,hl ld (lgclerc),hl ld hl,(drives$) ld a,b cp (hl) jp nc,pgmd80e call setdrv$ push hl call getdrv$ push hl pop ix pop hl ld (addat$),ix ld l,(ix+d.epl) ld h,(ix+d.eph) ld (adfn$),hl ld a,(ix+002h) ld (adlun),a sub a ld (datdb57),a scf ret ; pgmd746 ld hl,(lgclerc) ld a,(lgclerb) ld e,a ld d,000h ld a,e and a jr nz,pgmd75e ld c,(ix+01eh) ld b,000h and a sbc hl,bc jr nc,pgmd75e dec de pgmd75e push hl push de call adstpar pop de pop hl add hl,bc jr nc,pgmd769 inc de pgmd769 call div32 ld a,e ld (adsect),a ld e,(ix+021h) call divhlde ld a,e ld (adsurf),a call adsttrk ret nc ld a,(adsect) ld l,a ld h,000h ld a,(adr.s) ld e,a ld d,h call divhlde ld a,e ld (datdb54),a ld a,l inc a ld (adsect),a call adsctrt scf ret ; adstpar push af ld a,(ix+d.r.sect) ld (adr.s),a ld c,(ix+d.sr.trk) sub a ld (addens),a bit 6,(ix+d.dconfig) jr z,pgmd7c2 pop af jr c,pgmd7bb ld c,(ix+d.dr.trk) ld a,001h ld (addens),a jr pgmd7c3 ; pgmd7bb ld a,001h ld (adr.s),a jr pgmd7c3 ; pgmd7c2 pop af pgmd7c3 push bc call adstflg ld a,(adr.s) ld e,a ld d,000h and a rra ld h,a ld a,000h rra ld l,a ld (adbfsiz),hl pop bc ret ; adstflg ld a,(adopno) and 00bh bit 7,(ix+d.config) jr z,pgmd7f1 ld hl,(usrtab$) ld de,u.opts add hl,de bit 1,(hl) jr z,pgmd7f1 set 7,a pgmd7f1 ld c,a ld a,(addens) and a jr z,pgmd7fa set 2,c pgmd7fa ld a,c ld (adflags),a ret ; adsttrk ld (adtrack),hl ld e,(ix+d.t.surf) ld d,(ix+d.t.surf+1) and a push hl sbc hl,de pop hl ret c pgmd80e ld a,003h call aderchk jr c,pgmd80e and a ret ; adsctrt call adgtskw ret z ld a,(adsect) ld l,a ld h,000h add hl,bc dec hl ld a,(hl) ld (adsect),a ret ; adgtskw ld bc,00 ld a,(adopno) and 001h ret z ld a,(addens) and a jr nz,pgmd83e ld l,000h call gtdfn$ jr pgmd843 ; pgmd83e ld l,008h call gtdfn$ pgmd843 ld c,(hl) inc hl ld b,(hl) ld a,b or c ret ; adwrver push hl ld de,adpars+1 inc hl ld b,006h pgmd850 ld a,(de) cp (hl) jr nz,pgmd866 inc de inc hl djnz pgmd850 pop hl push hl ld a,(hl) bit 1,a jr z,pgmd863 ld hl,adpars ld (hl),a pgmd863 sub a jr pgmd87f ; pgmd866 call adwrite pop hl push hl ld de,adpars ld bc,0dh ldir ld hl,adpars ld b,(hl) push bc res 1,(hl) call adskrw pop bc ld (hl),b pgmd87f pop hl ret ; adwrite ld a,(adpars) bit 1,a jr z,pgmd8a1 ld hl,adpars push ix push hl ld de,9 add hl,de ld e,(hl) inc hl ld d,(hl) push de pop ix pop hl call adskrw pop ix and a jr z,pgmd8a1 pgmd8a1 sub a ld (adpars),a ret ; adpars db 0 adpars+1 db -1,-1,-1,-1,-1 db 0,0,0,0,0,0,0 ; datd8b3 db 0b9h,0fdh ; adskrw ld (adpar$),hl pgmd8b8 sub a ld (datdb57),a call adseek jr c,pgmd8b8 push hl ld de,adrwret push de ld c,004h call gtop$ push de ld c,(hl) ld de,0bh add hl,de ld e,(hl) inc hl ld d,(hl) inc hl ld b,(hl) inc hl ld h,(hl) ld l,b ret ; adrwret and a jr z,pgmd8e5 call aderchk jr nc,pgmd8e5 pop hl jr pgmd8b8 ; pgmd8e5 pop hl ret ; adseek push hl ld de,adskret push de ld c,002h call gtop$ push de ld a,(hl) inc hl ld b,(hl) inc hl ld c,(hl) inc hl ld e,(hl) inc hl ld d,(hl) inc hl ld h,(hl) ld l,d ret ; adskret and a call nz,aderchk pop hl ret ; adlogin ld a,0ffh ld (adpars+1),a adauxop ld hl,adflags ld (adpar$),hl sub a ld (datdb57),a ld a,(adopno) ld e,000h call pgmd92b and a ret z call aderchk jr c,adauxop ret ; pgmd924 push af ld a,001h ld (datdb57),a pop af pgmd92b ld c,a ld hl,(adpar$) push bc ld c,006h call gtop$ pop bc push de inc hl ld a,(hl) ld b,a ld a,c ld hl,(datd8b3) ret ; removdk ld a,041h add a,b ld (rmvdrvn),a ld hl,rmvdskm call fprint call i.cin xor a ret ; rmvdskm db 'Remove disk in drive ' rmvdrvn db 0,'; press any key' db ' to continue ',cr,lf,0 ; gtltrk$ ld l,003h call gtddat$ ret ; aderchk push af ld a,(datdb57) and a jr nz,pgmd99c pop af call addkerr ret c and a ret p jp cwboot ; pgmd99c pop af ret ; addkerr ld (lgclern),a push af ld hl,(adpar$) push de ld de,6 add hl,de pop de ld a,(hl) add a,041h ld (lgclerd),a ld (derdrv1),a ld (derdrv2),a ld (derdrv3),a ld (derdrv4),a pop af cp 0fbh jr z,wpdrve cp 0fch jr z,wpdisk cp 0fdh jr z,pgmda01 cp 0feh jr z,nrdydrv cp 0ffh jr z,pdskerm ld hl,lgclerm jr prermsg ; pdskerm push de ld l,b ld h,0 add hl,hl add hl,hl add hl,hl ld de,dertypt add hl,de call fprint ld hl,dermsg1 call fprint pop hl prermsg call fprint jp derresp ; nrdydrv ld hl,dermsg2 jr prermsg ; wpdisk ld hl,wpdkmsg jr prermsg ; wpdrve ld hl,wpdrmsg jr prermsg ; pgmda01 ld a,b ret ; dertypt db cr,lf,'Seek',0,0 db cr,lf,'Write',0 db cr,lf,'Read',0,0 db cr,lf,'Home',0,0 db cr,lf,'Read-after-write',0 ; lgclerm db cr,lf,'Logical disk error ',80h lgclern db 0,0,'h, drive ' lgclerd db 0,', block ',80h lgclerb db 0,0,81h lgclerc db 0,0,'h',cr,lf,0 ; dermsg1 db ' error: Drive ' derdrv1 db 0,0 ; dermsg2 db cr,lf,'Drive ' derdrv2 db 0,' not ready',cr,lf,0 ; wpdkmsg db cr,lf,'Diskette in drive ' derdrv3 db ' is write-protected',cr,lf,0 ; wpdrmsg db cr,lf,'Drive ' derdrv4 db ' is write-protected',cr,lf,0 ; derresp ld a,001h call pgmd924 call i.cin cp 003h jr z,pgmdb15 and 05fh cp 052h jr z,rspr ld hl,rspim sub 049h jr z,rspi sub 0fah jr nz,derresp ld hl,rspcm inc a rspi push af call fprint pop af pgmdb00 push af ld a,(adpars) res 1,a ld (adpars),a pop af pgmdb0a push af sub a call pgmd924 sub a ld (datdb57),a pop af ret ; pgmdb15 call pgmdb00 sub a ld (adpars),a jp cwboot ; rspr ld hl,rsprm call fprint sub a scf jr pgmdb0a ; rsprm db 'Retry',cr,lf,0 rspim db 'Ignore',cr,lf,0 rspcm db 'Continue',cr,lf,0 ; gistat ld a,i ;(9)Read interrupt enable ld a,1 ;(9)result goes in Parity bit ret pe ;((5)/11)return if not enabled ld a,i ;(9)test it again ld a,1 ;(7)sillyness ret pe ;(5/11)return if same way sub a ;(7)return with zero in a pgmdb50 ret ;(10) ; adopno db 0 addens db 0 adr.s db 0 datdb54 db 0 adpar$ dw 00 datdb57 db 0 adflags db 0 adlun db 0 adsurf db 0 adsect db 0 adtrack dw 00 addisk db 0 adfn$ db 0 datdb60 db 0 addat$ dw 00 adbfsiz dw 00 adbuf$ dw 00 sqsec$ dw 00 sqscnt db 0 ; i.cinit call callio db 000h ; i.cstat call callio db 002h ; i.cin call callio db 004h ; i.crdy call callio db 006h ; i.cout call callio db 008h ; ; Set special crt function ; $setspe call callio db 010h ; i.rinit call callio db 020h ; i.rstat call callio db 022h ; i.rin call callio db 024h ; i.pinit call callio db 030h ; i.prdy call callio db 032h ; i.pout call callio db 034h ; i.linit call callio db 040h ; i.lrdy call callio db 042h ; i.lout call callio db 044h ; i.wrclk call callio db 050h ; i.rdclk call callio db 052h ; callio ex (sp),hl push bc push de push af ld b,h ld c,l ld a,(bc) rrca rrca rrca ld hl,io$tab call pgmdbd8 ld a,(bc) call pgmdbd8 pop af pop de push de ld bc,pgmdbd4 push bc push hl ld hl,9 add hl,sp ld b,(hl) dec hl ld c,(hl) ld l,c ld h,b ret ; pgmdbd4 pop de pop bc pop hl ret ; pgmdbd8 and 00eh ld e,a ld d,0 add hl,de ld e,(hl) inc hl ld d,(hl) ex de,hl ret ; pgmdbe3 ld a,b or c ret z ex de,hl ldir ex de,hl sub a ret ; mlthlde push bc push hl ld b,d ld c,e call mlt32 ex de,hl pop hl pop bc ret ; divhlde push bc ld b,d ld c,e call div16 pop bc ret ; hexa ld d,a rra rra rra rra call pgmdc09 ld a,d ld d,e pgmdc09 and 00fh add a,'0' cp 03ah ld e,a ret c add a,7 ld e,a ret ; phex.hl ld a,(hl) call hexa ld a,d call outch ld a,e jp outch ; fprint push ix pgmdc23 ld ix,(usrtab$) ld a,(hl) or a jr z,pgmdc43 jp m,pgmdc34 call outch inc hl jr pgmdc23 ; pgmdc34 inc hl inc hl and 1 call nz,phex.hl dec hl call phex.hl inc hl inc hl jr pgmdc23 ; pgmdc43 pop ix ret ; inch call mtrtout ld hl,(usrtab$) ld de,10h add hl,de push hl call i.cstat pop hl push hl jr c,pgmdc8d or a ld a,(hl) jr z,pgmdc5f call i.cin pgmdc5f pop hl ld (hl),0 or a ret z push hl cp 010h jr nz,pgmdc74 ld a,(ix+u.opts) xor 001h ld (ix+u.opts),a xor a pop hl ret ; pgmdc74 cp 013h jr nz,pgmdc89 pgmdc78 call i.cstat or a jr z,pgmdc78 call i.cin cp ctrlc call z,trapcc xor a pop hl ret ; pgmdc89 pop hl ld (hl),a and a ret ; pgmdc8d ld a,(hl) and a jr nz,pgmdc5f scf pop hl ret ; outch push hl push de and 07fh push af call inch pop af cp 017h jr nz,pgmdca8 set 0,(ix+u.opts) pop de pop hl ret ; pgmdca8 cp 014h jr nz,pgmdcb3 res 0,(ix+u.opts) pop de pop hl ret ; pgmdcb3 cp cr jr nz,pgmdcbd ld (ix+u.lcnt),0 jr pgmdcda ; pgmdcbd cp tab jr nz,pgmdcda ld l,(ix+u.lcnt) ld de,8 ld h,d call divhlde ld a,8 sub e ld e,a pgmdccf ld a,' ' call ouch dec e jr nz,pgmdccf pop de pop hl ret ; pgmdcda call ouch pop de pop hl ret ; ouch push de push hl push af call i.cout pgmdce6 bit 0,(ix+u.opts) jr z,pgmdcfa call inch call i.lrdy or a jr z,pgmdce6 pop af push af call i.lout pgmdcfa pop af pop hl pop de cp ' ' ret m inc (ix+u.lcnt) ret ; setusr$ ex de,hl setusrx call getusrp ld (hl),e inc hl ld (hl),d ret ; getusr$ push af call getusrp ld a,(hl) inc hl ld h,(hl) ld l,a pop af ret ; getusrp push bc ld b,0 ld hl,(usrtab$) add hl,bc pop bc ret ; mlt32 ld de,00 ex de,hl ld a,010h pgmdd25 or a bit 0,e jr z,pgmdd2b add hl,bc pgmdd2b rr h rr l rr d rr e dec a jr nz,pgmdd25 ex de,hl ret ; div16 ld de,00 div32 ld a,d cp b jr nz,pgmdd41 ld a,e cp c pgmdd41 ccf ret c ex de,hl ld a,010h pgmdd46 scf rl e rl d rl l rl h jr nc,pgmdd56 or a sbc hl,bc jr pgmdd5c ; pgmdd56 sbc hl,bc jr nc,pgmdd5c dec e add hl,bc pgmdd5c dec a jr nz,pgmdd46 ex de,hl or a ret ; mtrtout ld hl,(mtrtim) ld a,l or h ret z dec hl ld (mtrtim),hl ld a,l or h ret nz call getdrv$ push hl call $mtroff pop hl call savdsk$ ld hl,00 ld (mtrtim),hl ret ; ; Turn motors off ; $mtroff ld hl,(drives$) ld b,(hl) inc hl ld c,0 pgmdd88 ld a,(hl) inc hl or (hl) inc hl jr z,pgmdd98 push bc push hl ld b,c ld c,1 call axdskop pop hl pop bc pgmdd98 inc c djnz pgmdd88 ret ; idle jp idle ; end