;LOCK - Give "lock (filename or match) (keyword)" base equ 0 dmad1 equ base+80h fcb1 equ base+5ch ftp equ 9 ;file type increment fex equ 12 fss equ 13 frc equ 15 fdd equ 16 fcr equ 32 frr equ 33 secmax equ 32 ;8k buf, read and write interleaved dfldrv:: db 0 ;keeps default drive stackp:: dw 0 ;keeps stack ptr secct:: db 0 ;sector ct, read csecct:: db 0 ;ditto code rdma:: dw 0 ;running dma pj1fl:: db 1 ;page 1 to be written attrb:: db 0 ;keeps r/o attribute byte nunqfl:: db 0 ;indic file spec not unique tmpex:: db 'TMP' prltyp:: db 'PRL' dirpt:: dw 0 ;directory ptr fcb2:: ds 36 fcb3:: ds 36 start:: ld (stackp),sp ld sp,stac0 ld c,19h call base+5 ld (dfldrv),a ;keep default drive call paschc ;ret z if no keyword jp z,nopsds call pascod ;code keyword, ret c if invalid jp c,invdis call dmshmk ;make 1 rec of coded mush and ;write part over keyword call nunqst ;set nunqfl nz if fcb1 has qmks call makdir ;make directory of matched files ;ret z if none, c if more than 32 jp z,nofdis call c,toodis ld hl,0 ld (dirpt),hl ;zero directory ptr codlp:: call getdir ;dir adr of next file to fcb2 ;ret z if no more, c if file empty jr z,reb call c,empdis ;also preserves c flag call nc,codit ;read buf full, code, write, ;del original, rename, msg ;msg and reb if no dir space ;msg and reb if ctrl c jr codlp reb:: ld a,(dfldrv) ld e,a ld c,0eh call base+5 ;reset default drive ld sp,(stackp) jp base ;sr make directory of files matching fcb1 makdir:: ld hl,fcb1+fex ld b,3 mdr2:: ld (hl),0 djnz mdr2 ;zero ex and ss bytes ld de,fcb1 ld c,11h call base+5 ;search for first cp 0ffh ret z mdr3:: and 3 rrca rrca rrca ld hl,dmad1 ld c,a ld b,0 add hl,bc ;dir entry ex de,hl ld hl,(dirpt) ;local dir ptr ld a,h sub 4 ccf ret c ;if too many matcxhing files ld bc,dirbuf add hl,bc ex de,hl ;ptrs for block load ld bc,32 ldir ;transcribe to local dir ld hl,(dirpt) ;will update ptr ctr ld de,32 add hl,de ld (dirpt),hl ld de,fcb1 ld c,12h call base+5 ;search for next cp 0ffh jr nz,mdr3 xor a inc a ;nz and nc flags if finished ret ;sr get dir adr of next file to fcb2 ;ret z if no more, ret c if file empty getdir:: ld hl,(dirpt) ld a,h sub 4 ret z ;if no more push hl ld de,32 add hl,de ld (dirpt),hl ;for next time pop hl ld de,dirbuf add hl,de push hl pop ix inc hl ;ptr to filename ld a,(hl) or a ret z ;if no more files ld a,(fcb1) ;drive ld de,fcb2 ld (de),a ;same dr in fcb2 inc de ld bc,11 ldir ;transcribe name, type ld hl,0 ld (fcb2+fex),hl ld (fcb2+fss),hl ;zero ex and ss bytes ld a,(ix+15) or a jr nz,gdr2 scf ;to indicate empty gdr2:: inc c ;set nz flag ret ;sr read buf, code, write, delete orig, ;rename, msg ;msg and reb if no dir space ;msg and reb if ctrl c codit:: call atrchc ;ret nz if sys, or keep r/o byte jp nz,sysdis ;msg and ret from codit call wfmk ;make write fcb3 and make file ;includes delete ;ret z if no dir space jp z,noddis call mushtr ;transcribe mush call open ;open read fcb2 xor a ld (fcb2+fcr),a ld (fcb3+fcr),a ld a,1 ld (pj1fl),a ;page 1 to be written cdtlp:: call rdbuf ;read to buf, ret nz if passed eof ;ctrl c checks ex af,af' ld a,(secct) or a jr z,cdt2 call codbuf ;code buffer call wrbuf ;write buffer, reb if disk full ;ctrl c checks ex af,af' jr z,cdtlp cdt2:: call eschc ;ret z if ctrl c jr z,escout call close ;close write file fcb3 ld de,fcb2 call delete ;delete original call ren ;rename fcb3 file as fcb2 ;also turns prl to lrl call dondis ;'File (name) locked', omit ;name if unique ret ;sr ret z if ctrl c inp eschc:: ld e,0ffh ld c,6 call base+5 cp 3 ret escout:: ld de,fcb3 call delete jp abdis ;'Aborted' ;sr ret z if no keyword paschc:: ld a,(fcb1+fdd+1) ;keyword cp 20h ret ;sr code keyword, ret c if invalid pascod:: ld ix,fcb1+fdd+1 ;keyword ld de,4 ;arb start pt ld b,8 ;ct plp:: ld hl,pag1+50h ;res to be put here add hl,de ld a,(ix) call chcvld ;ret nc if valid char ret c add a,(hl) ld c,a and 55h rlca xor c ld (hl),a inc ix ld a,e add a,3 and 7 ;col incr for ptr ld e,a djnz plp or a ;clear carry ret ;sr ret c if invalid keyword char chcvld:: cp ' ' ret z cp '/' ret c cp ':' jr c,chc2 cp '@' ret c cp '[' chc2:: ccf ret ;sr make 128 bytes of mush and ;write part over keyword dmshmk:: ld c,51 ;arb start pt ld b,80h ;length mlp:: ld hl,pag1+80h ld a,c add a,l ld l,a jr nc,mlp2 inc h mlp2:: ld ix,pag1+50h ;mush at keyword addr ld a,b ;use b value for keyword ptr and 7 ld e,a ld d,0 add ix,de ld a,(ix) add a,(hl) ld e,a and 0aah rra xor e ld (hl),a ld a,c add a,23 ;col incr and 7fh ld c,a djnz mlp ld ix,pag1+50h ;will write some over keyword ld de,4 ld b,30h putlp:: ld hl,pag1+80h add hl,de ld a,(hl) ld (ix),a inc ix ld a,e add a,15 and 7fh ld e,a djnz putlp ld l,18h ;='jr' ld h,122h-175h ld (pag1+73h),hl ret ;sr set nunqfl if fcb1 has qmks nunqst:: ld hl,fcb1+1 ld a,'?' ld b,11 tunqlp:: cp (hl) jr z,tunqot inc hl djnz tunqlp xor a tunqot:: ld (nunqfl),a ret ;sr check file attributes, store r/o byte ;ret nz if sys atrchc:: ld hl,fcb2+ftp ld a,(hl) ld (attrb),a atr2:: inc hl bit 7,(hl) ret ;sr make write fcb3 and make file ;ret z if no dir space wfmk:: ld hl,fcb2 ld de,fcb3 ld bc,9 ldir ;dr and filename ld hl,tmpex ld bc,3 ldir ;'TMP' extension ld b,3 ex de,hl wfm2:: ld (hl),0 inc hl djnz wfm2 ;zero ex and ss bytes ld de,fcb3 call delete ;del any equiv file ld de,fcb3 ld c,16h call base+5 ;make file inc a ret ;sr delete (de) file delete:: ld c,13h call base+5 ret ;sr transcribe dmush mushtr:: ld hl,pag1+80h ld de,upmush ld bc,80h ldir ret ;sr open read fcb2 open:: ld de,fcb2 ld c,0fh call base+5 ret ;sr read to buf, ret nz if eof before end, ctrl c checks rdbuf:: ld de,buf0 xor a ld (secct),a rdlp:: ld (rdma),de call rdsec ;read 1 sector, ret nz if passed eof ;ctrl c check ret nz ;if passed eof ld hl,secct inc (hl) ld a,secmax cp (hl) ret z ;if end of buf ld de,(rdma) inc d jr rdlp ;sr read sector to (de), ret nz if eof ;ctrl c check rdsec:: ld c,1ah call base+5 ;set dma call eschc jp z,escout ld de,fcb2 ld c,14h call base+5 ;read sequential or a ret ;nz if eof ;sr code buffer codbuf:: xor a ld (csecct),a ld de,buf0 ;rrec start ld ix,buf0+80h ;wrec start cblp:: call cdr ;code data record ex de,hl ld de,80h add hl,de add ix,de ;next wrec ex de,hl ;next rrec in de ld hl,csecct inc (hl) ld a,(secct) sub (hl) jr nz,cblp ret ;sr code data record, rrec de, wrec ix cdr:: ld hl,upmush ld b,80h cdlp:: ld a,(de) add a,(hl) ld c,a and 55h rlca xor c ld (hl),a ld (ix),a inc hl inc de inc ix djnz cdlp ret ;sr write buffer, ret z if disk full wrbuf:: ld hl,pj1fl ;need to write page 1? ld a,(hl) ld (hl),0 ;zero the flag or a jr z,wrb2 ;skip if it was zero ld de,pag1 call wrsec ;write record, ret nz if disk full ;ctrl c check jp nz,stflds ld de,pag1+80h call wrsec jp nz,stflds wrb2:: ld de,buf0+80h ;initial dma in de wblp:: ld (rdma),de call wrsec jp nz,stflds ld de,(rdma) inc d ld hl,secct dec (hl) jr nz,wblp ret ;sr write record from (de), ret nz if disk full ;ctrl c check wrsec:: ld c,1ah call base+5 ;set dma call eschc jp z,escout ld de,fcb3 ld c,15h call base+5 ;write sequential or a ret ;sr close file close:: ld de,fcb3 ld c,10h call base+5 ret ;sr rename write file as read file ;.prl becomes .lrl ren:: call prllrl ;rename prl file as lrl ld de,fcb2 call delete ld hl,fcb2 ld de,fcb3+16 ld bc,16 ldir ld hl,fcb3+ftp ld a,(attrb) and 80h ld b,a ld a,(hl) and 7fh or b ld (hl),a ;to ensure r/o byte is kept ld de,fcb3 ld c,17h call base+5 ret ;sr rename prl file as lrl prllrl:: ld de,fcb2+ftp ld hl,prltyp ld b,3 prl2:: ld a,(de) and 7fh cp (hl) ret nz inc hl inc de djnz prl2 ex de,hl dec hl dec hl dec hl ld (hl),'L' ret nopsds:: ld de,nopmsg jp streb nopmsg:: db 'A valid keyword must be specified' db 0dh,0ah,'$' invdis:: ld de,invmsg jp streb invmsg:: db 'Invalid keyword',0dh,0ah,'$' nofdis:: ld de,nofmsg jp streb nofmsg:: db 'No file',0dh,0ah,'$' toodis:: ld de,toomsg jp string toomsg:: db 'Limit of 32 matching files' db 0dh,0ah,'$' sysdis:: ld de,sysms1 call string call namif ld de,sysms2 jp string ;ret from codit sr when done sysms1:: db 'File $' sysms2:: db 'has system attribute',0dh,0ah,'$' empdis:: push af ;keep c flag ld de,empms1 call string call namif empds2:: ld de,empms2 call string pop af ;restore c flag ret empms1 equ sysms1 empms2:: db 'empty',0dh,0ah,'$' noddis:: ld de,nodmsg jp streb nodmsg:: db 'No directory space for operation' db 0dh,0ah,'$' dondis:: ld de,donms1 call string call namif ld de,donms2 jp string donms1 equ sysms1 donms2:: db 'locked',0dh,0ah,'$' abdis:: ld de,abmsg jp streb abmsg:: db '------------Aborted',0dh,0ah,'$' stflds:: ld de,fcb3 call delete ld de,stflms jp streb stflms:: db 'Disk full - aborting',0dh,0ah,'$' string:: ld c,9 call base+5 ret streb:: call string jp reb namif:: ld a,(nunqfl) or a ret z ld hl,fcb2 ld a,(hl) or a jr z,namf2 add a,40h call disp ld a,':' call disp namf2:: inc hl ld b,8 nlp:: ld a,(hl) cp 20h jr z,namf3 call disp inc hl djnz nlp namf3:: ld a,'.' call disp ld hl,fcb2+ftp ld b,3 nlp2:: ld a,(hl) cp 20h jr z,namf4 call disp inc hl djnz nlp2 namf4:: ld a,20h jp disp disp:: push bc push de push hl ld e,a ld c,2 call base+5 pop hl pop de pop bc ret pag1:: .phase base+100h db 0dh,0ah,'==== ',0dh,0ah,1ah ;as a seq of instns, this gives a jump either to ;122h or to 173h fill:: ds base+122h-fill ;foll instn shd be 122h ;173h will be set to jr 122h later sendms:: ld hl,base+100h ld a,(hl) cp 1ah jp z,base push bc push de push hl ld e,a ld c,2 call base+5 pop hl pop de pop bc inc hl jr sendms+3 ;next byte 13ah db 0f5h,79h,10h,0afh,23h,09h db 51h,00h,19h,71h,0d9h,6fh,0b8h,0b6h db 70h,26h,0a6h,63h,51h,03h,44h,20h nmush:: db 57h,7eh,0c5h,14h,8fh,47h,0c1h,27h ;adr 150h db 0feh,0eeh,9fh,0edh,09h,0a9h,33h,76h db 0e2h,11h,72h,0d7h,0e3h,5dh,74h,66h db 66h,39h,0fh,2dh,15h,34h,0ch,81h db 25h,61h,33h,09h,12h,3eh,4eh,37h db 96h,0b0h,0ebh,41h,89h,0a0h,24h,78h dmush:: db 48h,0e0h,23h,0afh,2ah,77h,0f6h,86h ;adr 180h db 0c3h,3ah,0d8h,7eh,5bh,7fh,0c1h,0eh db 57h,0f8h,30h,26h,11h,0fh,2eh,0d8h db 08h,6dh,0bah,7fh,8ch,0cch,90h,4ah db 95h,0a5h,0e4h,9fh,76h,5fh,0e0h,01h db 1fh,22h,9ah,77h,3ch,5dh,0a0h,0a7h db 75h,0a7h,0cfh,76h,0ach,40h,6fh,0aah db 3eh,79h,56h,5eh,69h,77h,3ah,64h db 3eh,56h,53h,4dh,01h,29h,47h,0b2h db 61h,85h,6ch,4ah,0a9h,0a2h,0d8h,0f3h db 9fh,4fh,0bah,32h,0c2h,43h,4dh,31h db 8ch,0ach,09h,58h,5ah,0fh,75h,0f7h db 0aah,73h,0a5h,9dh,0f3h,2dh,0beh,58h db 03h,4ah,0d9h,21h,30h,4eh,0d7h,75h db 0a8h,98h,82h,02h,41h,9ch,02h,0eh db 0c4h,61h,63h,61h,10h,0a2h,42h,48h .dephase ;WILL LATER INSERT MESSUP SECN HERE upmush:: ds 80h ;to transcribe mush for updating dirbuf:: ds 1024 ;directory of matched files ds 20h ;for stack stac0:: buf0:: ds 8192 ;file buffer end start