From 59301d7800e3194de91ff972c87071454a6a9122 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 27 Oct 2019 18:17:15 -0400 Subject: [PATCH] Hack to handle '$' in file extensions. PIP works! --- SOFTCARD80.ASM#040000 | 59 ++++++++++++++++++++++++++++++++++-------- SOFTCARD80.BIN#041000 | Bin 43011 -> 43011 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index d2e8c2b..2d98431 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -20,7 +20,8 @@ ; BDOS TODOs ; ---------- ; TODO: Get STAT to work -; TODO: Get PIP to work +; TODO: Get PIP to work - PIP creates a temp file with extension $$$, +; which ProDOS can not handle ; TODO: F_WRITE bug turns out to be bug in ProDOS 2.5.0a7 (SET_MARK) ; TODO: Maybe I should eliminate use of "EX AF,AF'" in BDOS since CP/M apps may ; expect exclusive use of alternate register set. @@ -561,7 +562,11 @@ BDOSINIT DI ; Make sure interrupts are off LD (LOGVEC),HL ; ... LD (ROVEC),HL ; ... JP PROGSTRT ; Run user program -BDOSIMP LD A,C ; Prepare to check C is in range +BDOSIMP + +;;; CALL PRHEX ; Print sys call number + + LD A,C ; Prepare to check C is in range CP 41 ; Max syscall# for CP/M 2.2 is 40 JP NC,UNIMP ; If >41 then call UNIMP LD HL,BDOSVEC ; Start of vector table @@ -1460,6 +1465,7 @@ PRODOS LD BC,OFFSET ; Add offset to convert Z80->6502 address ; Populate the PATH buffer (and PATHLEN) by copying from FCB ; If the FCB contains A:TEST____.TXT then the PATH buffer will be A/TEST.TXT +; Any '$' character in extension is converted to '8' so ProDOS can handle it ; DE contains a pointer to the FCB ; IX contains pointer to the path buffer into which to write FCB2PATH PUSH IX ; Copy IX->IY @@ -1484,7 +1490,7 @@ F2PS1 ADD A,'A'-1 ; Convert to drive letter LD A,(HL) ; First character of filename CP ' ' ; Is it space? ie: no file specified - JP Z,F2PS6 ; Don't handle filename or extension + JP Z,F2PS7 ; Don't handle filename or extension F2PL1 ; Handle the filename - up to 8 characters LD A,(HL) ; Obtain filename character @@ -1519,11 +1525,14 @@ F2PS4 LD A,'.' ; Separator is a period ; Handle the extension - up to 3 characters F2PL3 LD A,(HL) ; Obtain extension character CP ' ' ; See if it is a space (? or NULL maybe?) - JP Z,F2PS6 ; If so we are done with extension - EX AF,AF' ; We need to re-use A here + JP Z,F2PS7 ; If so we are done with extension + CP '$' ; See if it is a dollar ($$$ extension) + JP NZ,F2PS5 ; If not skip the substitution + LD A,'8' ; Replace '$' with '8' +F2PS5 EX AF,AF' ; We need to re-use A here LD A,B ; Get character count CP 3 ; Extension can be up to 3 chars - JP Z,F2PS5 ; If so we are done with filename + JP Z,F2PS6 ; If so we are done with filename EX AF,AF' ; Swap back to original A reg LD (IX+0),A ; Copy to PATH buffer INC C ; Count the chars (overall) @@ -1532,15 +1541,16 @@ F2PL3 LD A,(HL) ; Obtain extension character INC IX ; Next byte of PATH buffer JP F2PL3 ; Loop till done -F2PS5 EX AF,AF' ; Swap back to original A reg +F2PS6 EX AF,AF' ; Swap back to original A reg -F2PS6 LD A,C ; Store length of string +F2PS7 LD A,C ; Store length of string LD (IY+0),A ; We kept size byte in IY at start RET ; ; This operation is almost the inverse of FCB2PATH. It takes a pointer to the ; beginning of the ProDOS dirent and converts it to FCB format (8.3 with ; spaces for any unused characters.) +; Any '8' character in extension is converted back to '$' (see FCB2PATH) ; HL points to the file entry in the ProDOS directory ; B contains the drive number (1 for A:, 2 for B: etc) ; The FCB is written to the buffer pointed to by DMAADDR @@ -1586,7 +1596,15 @@ N2FL3 INC HL ; Advance source pointer LD A,(HL) ; Read character CP '.' ; See if it is a period JP Z,N2FS2 ; Prepare to copy the extension - LD (DE),A ; Write character + + CP '8' ; See if character in name is '8' + JP NZ,N2FS0 ; If not, then no substitution + LD A,B ; See how many chars have been written + CP 8 ; >=8? If so we are in the extension + JP C,N2FS0 ; If not, then no substitution + LD A,'$' ; Otherwise substitude '8'->'$' + +N2FS0 LD (DE),A ; Write character INC B ; Increment count of chars written N2FS1 DEC C ; Decrement count of chars remaining JP N2FL3 ; Loop @@ -1689,11 +1707,9 @@ MATCHFCB INC DE ; Skip over drive byte in FCB INC HL ; Skip over drive byte in FCB LD C,0 ; Initialize character counter MFL1 LD A,(DE) ; Load byte of search pattern - CP '?' ; Is it '?' wildcard? JP Z,MFS1 ; If so, automatic char match LD B,(HL) ; Load byte of match candidate - CP B ; See if the characters match JP NZ,MFS2 ; If not, then no match MFS1 INC DE ; Advance source pointer @@ -1890,6 +1906,27 @@ N2H2 OR 0F0H ; INC DE ; RET +; Print value of C in HEX +; Used for DEBUG only +;PRHEX PUSH AF +; PUSH BC +; PUSH DE +; PUSH HL +; LD E,'[' +; CALL C_WRITE +; LD L,C ; Copy to HL for NUM2HEX +; LD H,0 ; ... +; LD DE,HEXBUF ; Generate hex string to HEXBUF +; CALL NUM2HEX ; ... +; LD DE,HEXBUF+2 ; Write hex value to console +; CALL C_WRITESTR ; +; LD E,']' +; CALL C_WRITE +; POP HL +; POP DE +; POP BC +; POP AF +; RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Very simple CCP diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index a9b1ac0cd0a3be7d4efadf601388e84d70646644..a23dce2ff1c3a2a6b73294579a4bc20ac4b6f570 100644 GIT binary patch delta 2027 zcmZuxYitx%6uz_FZr_ik55l%7JDmo!jYUUAIw^~aX`wA`kcSUIHu6Y_kBTvFdF>Xe z>}+>uIy9v%k{n2Kl8&gcsMq)xpOgi=4nQefEP4?b% zzxmGdo^$(d*!phRzA2iiutW4LbUQnhC$g$?%%ihoq$^81mA@&*ZjP~S zF}8iA`t*Agbx;w4b)5+XPlhMw({UUTjD;k{vo(l9rFpf@GR?|Z4I4yHbViIim5X@R<@Oj^$t_BA#2t7&0?9DN?)YJ**(gvCMgH>N zD(RZrRf&3*IS^BJ1bXFSq{k?L)o(N=zls>^)H49&PM?W*>XzAyG=GH9%Q8Plu68z} z69oFegHpaivXtoHW)@l#`mweW;c*@cSs^%~Yw3xH5JLInK?-3!2*kDJf@dKO6ur!h z9l4AR$wr}NRBaN8AE^vZmD2yU?zr{rewQ`$cqsd``+YH-x0@nuHsKB+uc1ihE=yLrh z)V*}#RzSxy0`!o699M|P@e1(-u8_qwwO@$bNd$%&(XgreM6M4R9NABysTcO*fuP1H zTgAq}sEE5HlZHnnjS)NH5`JNd{KnCn7evE5eL~Ro(lHi>?6x?2Z4!nE>P`m#t_TJ7Y-CGgo-WoI^K4<4#U`$#?K))k zD(GgZfu*{;(Sy1c*{*&J)B-qwl=7hzQ?AeZ(7fW1>H?dk7T2iSAu(k|+H;Zz zk(P4i#%Py>pN0ET_eq$GY8NGft;}FP2_Ig>>M~eZ8tY%g9?xKBq_OZKwkCs(NMrvH z%gH~Q)Fy|dn&#E=HV zL@}@+z^>#Eda1+^NNV|@*OnN{`4Z%-?m=&ULUGFFJDUc*S&1QwoNO8N+Cl8Kj@NfQ hbR63crie}aPDc3kLof+k0^T@vU!D+0j>#WX{11$uq)Gq) delta 2063 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