From 1a525fd94c47fa0e9c1f4a1c0f47ece23b625182 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 27 Oct 2019 00:23:44 -0400 Subject: [PATCH] Added table lookup for CCP built-in commands --- SOFTCARD80.ASM#040000 | 123 +++++++++++++++++++++++++++++++++++------- SOFTCARD80.BIN#041000 | Bin 43011 -> 43011 bytes zapple2.po | Bin 819200 -> 819200 bytes 3 files changed, 104 insertions(+), 19 deletions(-) diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index 5815c32..208adb2 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -19,6 +19,8 @@ ; ; BDOS TODOs ; ---------- +; TODO: Get STAT to work +; TODO: Get PIP to work ; 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. @@ -1595,7 +1597,7 @@ N2FS2 LD DE,(DMAADDR) ; Destination is start of extension JP N2FS1 ; Jump back into the read-write loop ; Handle file size info -; TODO This is commented out because it causes problems when called from parse +; TODO This is commented out because it causes problems when called from PARSE ; We need a mode switch to turn this part of the function on and off N2FS3 ; LD DE,(DMAADDR) ; Pointer to start of FCB ; LD IX,PATHBUF ; Destination buffer @@ -1898,7 +1900,6 @@ N2H2 OR 0F0H ; ; TODO: Implement the built-in commands using a table ; TODO: Built-in commands argument handling ; TODO: Parse * wildcard and generate FCB with ?s -; TODO: Build default FCB1 and 2 from args, if present ; Get a line of text from the console & handle it CCP @@ -1937,24 +1938,26 @@ CCPL1 LD A,(CURDRV) ; Get current drive & user number ; DIR command ; TODO Handle arguments -CCPS1 CP 3 ; Check if three chars - JP NZ,CCPS2 ; If not, skip - LD A,(FILEBUF+2) ; Check for 'D','I','R' - CP 'D' ; - JP NZ,CCPS2 ; - LD A,(FILEBUF+3) ; - CP 'I' ; - JP NZ,CCPS2 ; - LD A,(FILEBUF+4) ; - CP 'R' ; - JP NZ,CCPS2 ; - CALL DIRECT ; - JP CCPL1 ; Go again +CCPS1 +; CP 3 ; Check if three chars +; JP NZ,CCPS2 ; If not, skip +; LD A,(FILEBUF+2) ; Check for 'D','I','R' +; CP 'D' ; +; JP NZ,CCPS2 ; +; LD A,(FILEBUF+3) ; +; CP 'I' ; +; JP NZ,CCPS2 ; +; LD A,(FILEBUF+4) ; +; CP 'R' ; +; JP NZ,CCPS2 ; +; CALL DIRECT ; +; JP CCPL1 ; Go again ; Attempt to load .COM file from disk CCPS2 CALL PARSE ; Parse the command line - ; TODO Put in check for built-in commands here - LD DE,PATHBUF2 ; Point to the FCB in PATHBUF2 + CALL BUILTIN ; Check for built-in commands + CP 0 ; If zero, was a built-in command + JP Z,CCP ; Go again CALL RUNCOM ; Try to run .COM file JP CCP ; Go again @@ -2225,9 +2228,79 @@ EMTPATHBUF LD (IY+0H),A ; Emit char to PATHBUF INC E ; Character count for FILEBUF RET +; Table of commands. Each command has length byte prefix. +DIRCMD DEFB 4 + DEFM 'DIR ' +ERACMD DEFB 4 + DEFM 'ERA ' +RENCMD DEFB 4 + DEFM 'REN ' +TYPCMD DEFB 5 + DEFM 'TYPE ' +SAVCMD DEFB 5 + DEFM 'SAVE ' + +; Compares string at HL with string at DE +; HL points to length byte preceeding string to search for +; Returns 0 in A for match, 0FFH for no match +COMPSTR LD C,(HL) ; Get length byte + INC HL ; Advance to first character of pattern +CSTL1 LD A,C ; See if count is zero + CP 0 ; ... + JP Z,CSTS1 ; If so, we have a match + LD B,(HL) ; Get character of search pattern + LD A,(DE) ; Get byte from input string + CP B ; Compare them + JP NZ,CSTS2 ; If different, no match + INC HL ; Advance pointers + INC DE ; ... + DEC C ; Decrement count + JP CSTL1 ; Loop +CSTS1 LD A,0 ; Return 0 for match + RET ; +CSTS2 LD A,0FFH ; Return 0FFH for no match + RET + +; See if command entered is a built-in command (DIR, ERA, REN, TYPE, SAVE) +; Returns 0 in A if it was a built-in, non zero otherwise +; The FCB describing the command to run is in PATHBUF2 +BUILTIN LD DE,PATHBUF2+1 ; Skip over drive byte in FCB + LD HL,DIRCMD ; See if 'DIR' + CALL COMPSTR ; ... + CP 0 ; ... + JP Z,DIRECT ; If so, call function for DIR + + LD DE,PATHBUF2+1 ; Skip over drive byte in FCB + LD HL,ERACMD ; See if 'ERA' + CALL COMPSTR ; ... + CP 0 ; ... + JP Z,ERASE ; If so, call function for ERA + + LD DE,PATHBUF2+1 ; Skip over drive byte in FCB + LD HL,RENCMD ; See if 'REN' + CALL COMPSTR ; ... + CP 0 ; ... + JP Z,RENAME ; If so, call function for REN + + LD DE,PATHBUF2+1 ; Skip over drive byte in FCB + LD HL,TYPCMD ; See if 'TYPE' + CALL COMPSTR ; ... + CP 0 ; ... + JP Z,TYPEFILE ; If so, call function for TYPE + + LD DE,PATHBUF2+1 ; Skip over drive byte in FCB + LD HL,SAVCMD ; See if 'SAVE' + CALL COMPSTR ; ... + CP 0 ; ... + JP Z,SAVEFILE ; If so, call function for SAVE + + LD A,0FFH ; Not a builtin + RET + ; Load and run a .COM file to 0100H -; DE is the address of the FCB describing the file to run -RUNCOM LD HL,PATHBUF2 ; Set DMAADDR to PATHBUF2 (not FILEBUF!) +; The FCB describing the file to run is in PATHBUF2 +RUNCOM LD DE,PATHBUF2 ; Point to the FCB in PATHBUF2 + LD HL,PATHBUF2 ; Set DMAADDR to PATHBUF2 (not FILEBUF!) LD (DMAADDR),HL ; ... CALL _F_OPEN ; CP 0 ; @@ -2320,6 +2393,18 @@ PRDIRENT LD A,13 ; Terminate string CALL C_WRITESTR ; RET +ERASE + RET + +RENAME + RET + +TYPEFILE + RET + +SAVEFILE + RET + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Additional private scratch space for BDOS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 4ce2d849ceb696f5ff93555afa58efeea67ec353..662b8a51266e89be538c7386b6f36477ed53c5ad 100644 GIT binary patch delta 1383 zcmZuxZ){Ul6u+AiQp7uW;R;Y$R$LQj^9{i~3Cy`|5eGZ;>p#5BHwm zxxaIM_ndq08=iLz&pU4Topni-{U!y=XFL*Yb^6>E^du+xo!QUoVyYmjLR=LR6HU<% zIPN+mV_W*%Dw|0zmkQ(Tq-2zHoG3ICjx^M^TmX6&*v+ItG)@depcGy&%mbY@eXWbY zzLHAe4dbOSA7~~ts#cT!T4a@D-o|S{uiBA2#lSVFWZo&#D71^d=a#^;1guIl$8TdS zGlB}Aid2E4;to!Mt77v@)~4ugJIMp_jE*(w%lSfnaJ?`ILKO0Ye7YcC35b?m;}+dTQc)Qs6q5fGTQ>m#{ez8~4`; zwvleUw8o*Vb!;4i;z-mRQzvs#DInrBA_d|&jY@$83`B;{n;r13dXW+zhFk7PD2 z;~3;|rbFaIy+~`+VyRGQCc580XauzH<+i~`ufC3h!|xC4ZEXP;JeHq{Jd|~V(;TT9 zHkCRr;JI9ui!;l3GFT)Fj?mLjVOML%EuLQUF}D3I+SwE;a@qyUG_~WFg_}mdQyW`FhD*z= z+PG4s-CRYwQLWuUFqP8tVUqW6(o11diujv!*X}(7ysLX)7w;PA?>tzO}ELuR5^n z&2GNWZ#Mg%R8Qli_HWAnY<>3kRFL2U(LH-qnoF^wd3-s=L~}OU3MN{z(KZYHY@>Dy zJ+{$y2zFqmUbWJ0e4tqEs6q)>xnZqd!VQsH1Ss;Zg7tr?m~Z(T@F|U+359Ko>4@>b zk>a@vJ<9P&6L?M&7QyR!k2OKI9)k5kf&{k+N#eOk%n0-2$q)BB(;>GzlO+UyLHMET z{@!$mb7#=f4y8j5cc$00r;nsVb?%JGv52N&(Pz)4Lr!Y}S-H>CAr~QCWT>+E;F5(` g;lm83HZ|CHw(-*~lt8ZOoX`GmFU(Dxf)_Xa2PP+UH~;_u delta 1265 zcmZuxTWlLe6rHu5G>OtS7L{A#5@<#0vVQF2uKNQ*CJBN7B8Uhn{egB(QP*X_sT2f3`>_=ks1P3F58(}WZ3il={@8oY z-E-&6y|d#)(UmB=J`TBCy0Yws6kZ$k?u2{X{tXrC?OGUg=Ow~c^z1XzRUJU^Ub z?_|*7HIeqfu(+4&fw#nt`zo8FrdqYXCXO1|ld)`CW^5Dx6z~+xSipR&mHi+EhhUyR z40J#IA^JT*pm)ONb;%lSkmv=4Rj}rB_C+2+7wjyEZM%bLQHCD!>715(tP+R z&V~M@!tcquT{(cZ6wfIzkm_}oM*lO^d?Cobyv1Kk)%@pDeZooLkAkz+-rC6O3%Xx~ z)hCDG-PK2~`_iie&jEeLnHl!sPuI36r0;M2t2TpVy4$sIF3od&BS3qyK_6k?h&Z@E zGdM>2L4BgN?$Cb8FLucfh{6~qT$waL}c#+ZHf`nYUIR>tLT1JV4b%ob&Oo|H_> zM;eJEDtsh6vOwWInN28pO=dS_e1-!U=@@z0DABjIQn}T#I*1Vp#cV%;x}c( z=JbHl#8#AZJRZ`bT)MK1$Ak@1q;H?{B}|BDtr!2hZ(UA8=i?b5px1N%8p zUweeyT3Z!+^runWpr5T1$LZ_dVaMiQz_7QH3;6)`k z-hUKy?^B&?^#sJ!cJCpT-8*F<$LXTP`z*|<&&MyS-qVD|@yofyE~@$W)$m3>MZ%qY znt0C>ry@W;zqB+R*^ryf6N3K)_`}rYAEzT+ZWfXL+jPX0o3$ML#oyDBmfWnPsR$iV zkzc)ICgQHVKvf|y6Y*evjF5h3t!umf;|~2QJQLv@z#gxGuMf>cT(y;oNB+l4Cl-pZ JXNw{q{}#I_3&M3ZyTZ92ZX{|NQcdGui~64=_UiY#Hj;%V-}k{*;~krU zMjuBzECcN`BFHo(!)S{|`Z^3|sUPAwr@ly_NjMgex zWd5O@3f^uffI8k2GRK?EA0DYgQp$CFrQi=YEa9idR5%M{*BT+M#3#86X#T@q+^K)QLWjH%sC0>_;&=RD%6dyF+|rI z>L|@c@sN91n@SJKUJ15{>>Yt^O!kh_iv)kc?4$e`ZVs9!6tkdOC|!`vo@lZl_kL`l zSx?P?b$0QnV)=hLs@&%T$^D9XNf9ofTqf&AmB=Qg6~(6UX-P4UtH}=)b4G#H$HOj! z&<93NaB8`HHrs>@k7vO0>fb4?1NUEi85W1f6EIp^y)1n&hSvq}DTc-94%KN+tLH?x zqf1IIwG6iejS2wciupps*D3DTe0^fS=6gjvpe@|VvWDf*ovL9~=xu9#51~hWSIMm2 z4rHt!T0;&Bryj$u)Q=T;hVvsB{Ta}cDr98z^F`IpJyO)5Xs}o4w2UlPkC$~g!TR+w zGOSAdCV*+x$OKTvv&qN@P(J8sG}zsH`gyjie;3d8clGl4;OqOkczj^jYh8S=$DZ~> zwYz>w|5x=qQIq^b^&xmMhHH-|q*XI#-(Navqq!2=N^G=LLfeYy=Mriwq6a0ko%q@z zQjfMeZg{iM?O0Sm%<5Ox;zmpeRRMq`??j>h&!hJ9{+c$7<9gS(QFGg{0S35o;J9wl z?s0r9*hpNbkQs!J_O{tbk~PFvBaR~97BP%m7m)2@|9JHM?T(nA=C9`BHm69ml_GuiY|LL#JOEaDFy?0w>O`T{!@J`}T!#1J z5ZcaRep6C@Oh5|Y+Q#|h|N6pQ;v~h-ZlVgs>>xLRK`KEw5GP0#NOgjnSoiR!{{SIb BjVJ&B delta 88 zcmZo@FluNp+OUI#H%i@7jDg`Xg8+!pe3YgAC<`MHGXXI(5VLGQ%EB7Qv|U-6?QX?( n0ZvwCp6$#X9Dfzt*0Hv&V{2Q--nNdTZ5?OZI<95wxGwPQ|Q