From 5596ee3c36ff951a4fec4ab571d30b4933ceb2e1 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Wed, 16 Oct 2019 22:48:59 -0400 Subject: [PATCH] Implemented a few more calls. CP/M DDT runs now. --- README.md | 4 ++ SOFTCARD80.ASM#040000 | 84 +++++++++++++++++++++++++++++++++++++++--- SOFTCARD80.BIN#041000 | Bin 32771 -> 32771 bytes zapple2.po | Bin 819200 -> 819200 bytes 4 files changed, 83 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6c42149..b3c70c2 100644 --- a/README.md +++ b/README.md @@ -79,9 +79,11 @@ calls. Only console I/O has been tested and confirmed to be working so far: - BDOS call 00h: `C_TERMCPM` - System reset - BDOS call 01h: `C_READ` - Console input - BDOS call 02h: `C_WRITE` - Console output +- BDOS call 06h: `C_RAWIO` - Direct console I/O - BDOS call 07h: `GET_IOB` - Get IOBYTE - BDOS call 08h: `SET_IOB` - Get IOBYTE - BDOS call 09h: `C_WRITESTR` - Console write string +- BDOS call 0Ah: `C_READSTR` - Read console string - BDOS call 0Bh: `C_STAT` - Console status - BDOS call 0Ch: `S_BDOSVER` - Return version number - BDOS call 0Dh: `DRV_ALLRESET` - Reset disks @@ -89,6 +91,8 @@ calls. Only console I/O has been tested and confirmed to be working so far: - BDOS call 0FH: `F_OPEN` - Open file (IN PROGRESS) - BDOS call 10H: `F_CLOSE` - Close file (IN PROGRESS) - BDOS call 13H: `F_DELETE` - Delete file +- BDOS call 14h: `F_READ` - Read file sequentially +- BDOS call 15h: `F_WRITE` - Write file sequentially - BDOS call 16H: `F_MAKE` - Create (and open) file (IN PROGRESS) - BDOS call 17H: `DRV_LOGVEC`- Return bitmap of logged-in drives - BDOS call 19H: `DRV_GET` - Return current drive diff --git a/SOFTCARD80.ASM#040000 b/SOFTCARD80.ASM#040000 index a107240..5b752ab 100644 --- a/SOFTCARD80.ASM#040000 +++ b/SOFTCARD80.ASM#040000 @@ -358,9 +358,11 @@ TEXTBUF DEFM 'Mary had a little lamb. Its fleece was white as snow. ' B_C_TERMCPM EQU 00H ; System reset B_C_READ EQU 01H ; Console read B_C_WRITE EQU 02H ; Console write +B_C_RAWIO EQU 06H ; Direct console I/O B_GET_IOB EQU 07H ; Get IOBYTE B_SET_IOB EQU 08H ; Set IOBYTE B_C_WRTSTR EQU 09H ; Console write string +B_C_RDSTR EQU 0AH ; Read console string B_C_STAT EQU 0BH ; Console status B_S_BDOSVER EQU 0CH ; Return version number B_DRV_ALLRST EQU 0DH ; Reset disks @@ -368,8 +370,8 @@ B_DRV_SET EQU 0EH ; Select disk B_F_OPEN EQU 0FH ; Open file B_F_CLOSE EQU 10H ; Close file B_F_DELETE EQU 13H ; Delete file -B_F_READ EQU 14H ; Read file -B_F_WRITE EQU 15H ; Write file +B_F_READ EQU 14H ; Read file sequentially +B_F_WRITE EQU 15H ; Write file sequentially B_F_MAKE EQU 16H ; Create and open file B_DRV_LOGVEC EQU 17H ; Return bitmap of logged-in drives B_DRV_GET EQU 19H ; Return current drive @@ -417,11 +419,11 @@ BDOSVEC DEFW C_TERMCPM ; C=00H DEFW UNIMP ; C=03H (A_READ) AUX DEFW UNIMP ; C=04H (A_WRITE) AUX DEFW UNIMP ; C=05H (L_WRITE) PRN - DEFW UNIMP ; C=06H (C_RAWIO) + DEFW C_RAWIO ; C=06H DEFW GET_IOB ; C=07H DEFW SET_IOB ; C=08H DEFW C_WRITESTR ; C=09H - DEFW UNIMP ; C=0AH (C_READSTR) + DEFW C_READSTR ; C=0AH DEFW C_STAT ; C=0BH DEFW S_BDOSVER ; C=0CH DEFW DRV_ALLRST ; C=0DH @@ -499,6 +501,47 @@ C_WRITE LD A,80H ; Set high bit LD (SOFTCARD),A ; Do it! RET ; Return to calling program +; If E if 0FFH then input a character from console and return it in A and L +; without echoing the input character. Otherwise output char in E to the +; console (no tabs, ^S or ^Q supported) +C_RAWIO LD A,E ; See if E if 0FFH + CP 0FFH ; ... + JP Z,RIS1 ; If so, then read + + ; Write to console + LD A,80H ; Set high bit + OR E ; ... + CP 8AH ; Check for linefeed + RET Z ; If LF, don't print it + LD (AREG),A ; Pass char to COUT in 6502 A + LD HL,COUT ; We are going to call COUT + LD (ADDR),HL ; ... + LD A,1 ; CMD=1 means call 6502 sub + LD (CMD),A ; ... + LD (SOFTCARD),A ; Do it! + RET + + ; If character is waiting, read from console & return in A + ; Otherwise, return 00H in A +RIS1 LD A,3 ; CMD=3 means peek at keyboard + LD (CMD),A ; ... + LD (SOFTCARD),A ; Do it + LD A,(AREG) ; Grab the return value + CP 0 ; If zero, no chars are waiting + JP Z,RIS2 ; ... + LD HL,RDKEY ; We are going to call RDKEY + LD (ADDR),HL ; ... + LD A,1 ; CMD=1 means call 6502 sub + LD (CMD),A ; ... + LD (SOFTCARD),A ; Do it! + LD A,(AREG) ; Grab the return value + AND 7FH ; Mask high bit + LD L,A ; Copy A to L + RET ; +RIS2 LD A,0 ; No chars waiting, A=0 + LD L,A ; Return in L also + RET + ; Get the IOBYTE in A and L GET_IOB LD A,(IOBYTE) ; LD L,A ; Copy to L @@ -522,13 +565,44 @@ C_WRITESTR LD A,(DE) ; Fetch character from string INC DE ; Advance pointer JP C_WRITESTR ; Handle the next char +; Read console string +; DE points to the string buffer. First byte of the buffer is the capacity +; of the buffer. This function writes the number of bytes written in second +; byte. Entry finishes on CR or when the buffer is filled up. +; TODO: Line editing is supposed to be supported here +C_READSTR LD H,D ; HL will be the working pointer + LD L,E ; ... + INC HL ; Advance to first character ... + INC HL ; ... 3rd byte of the buffer + PUSH DE ; Put DE into IX + POP IX ; ... + LD A,0 ; Set number of chars read to zero + LD (IX+1),A ; ... +CRSL1 PUSH HL ; Preserve HL + CALL C_READ ; Read a character into A + POP HL ; Restore HL + CP 13 ; Carriage return? + RET Z ; If so, we are done + CP 10 ; Line feed? + RET Z ; If so, we are done + LD B,A ; Stash character in B + LD A,(IX+0) ; Buffer capacity -> A + SUB (IX+1) ; Subtract characters read + CP 0 ; If no space left ... + RET Z ; ... we are done + LD (HL),B ; Write character to buffer + INC HL ; Advance to next character + INC (IX+1) ; Increment character count + JP CRSL1 ; Loop + RET + ; Returns 0 in A and L if no chars waiting, non zero otherwise C_STAT LD A,3 ; CMD=3 means peek at keyboard LD (CMD),A ; ... LD (SOFTCARD),A ; Do it LD A,(AREG) ; Grab the return value LD L,A ; Copy A to L - RET ; Return to calling program + RET ; Returns system type in B and H, BDOS version in A and L S_BDOSVER LD B,0 ; System is 8080 CP/M diff --git a/SOFTCARD80.BIN#041000 b/SOFTCARD80.BIN#041000 index 4190284aa6e70b959eb74f0a121e6956a83fd9ff..113ab6dffab37c31688c753b45d4033f74d56c24 100644 GIT binary patch delta 748 zcmYjPUr19?82|1Zb5k2uuyoVhb(t|D@zg_H^b!PAzTfZsKF-Oc9htOa z?!2S5ThU)Jc{{qhN6BAwJiXA`sUW|C0t)I;TK%#iNmNb6fj^<#gV>Q$)>GvGTWfvnmV7 zRYmYkm7D5`)Lb<|6N%W?Smx+PDyqs5&3(c94i6A|B@|jQ)@3jf!gu`vUN?6Y&6eVb zkpyE(Frj!YWE>L;r-+*Sjr&ql1UW&5!ac&rRP_j3kwMQe?x;-A77?J`)BBT%YeYZF zOjszBWoeV&A$Y-)khX}}p}63*hhqtDL0z^)g7CVyaUD06;=otEH;MYG*hA|g0V?&= z`X#9VwIyVzDcAz<4#uzm+>SV8la5n9WnKNvNnR|)ca(3?un%fRZ&LB9-F}%`er$p^ z7Q;^NCEeiXagCL-=6gcL8Jl*$k+$^cKh3gIw42^ieVXiO&wq&F=2E=Cr3Jnr+yScO z1hq2i1J#x0>5%F9D6pmW;e}sR^1~eRgX(o>Ex@^#Ndb-oKn-)$`UpXmdq$6(J;N;K z;yn7qBT}dGQk!9tpNEHB bo`+c`b@A{bH^}yTG&Z5XXOp^?KgZ#Jshcb| delta 656 zcmYjPL2DC17@h1!O`002f|gV7Y9+3-cA97-T9*Svjf_E8?8rZauPVym_L!$IT=R7lwiQiB75) zK<2RQmT2k3K90_QJpnWaJ~9wIHw)S{*cIWBN&=ef1&AqMm;|#d2ijXaOzs9{Evw5@ znyyKdeBOSZ=4yO~$kFXxpqrqrc_t-bo6tR^Q0iIeq~qWj?0iUbACYmih9~+8Da+gZ z@=b2WXL`4?xNyllV+mB+lxp#Juje^7ehq+mkpid490GgO^Vm GOX+{&5d{4J diff --git a/zapple2.po b/zapple2.po index 51714b68e5c23fefc396b03d1dcedfbd11562e91..62e61e6b157e392f8b4a33f8989cbc4761388c16 100644 GIT binary patch delta 3839 zcmeHJZ)_W989(Q*UoQ!1VO^87^mRj zc2bFtd~Bq%FVCOf`+I)R^Snv9ESAgS`Qi5MF~R(bFg>(?hakK!@Rz5;?Yr)9e(z{eD@mLoUyZF`g_=^1Z@ocplgQQXMNrL*WG-fc}xK#Gq6 zrhWZ6^ze2tPedI6ZjVk?vOh$}P$`ka6IjjR(B$M4wq~h@RV`nzFv0RHF^FtY1Lq9= zM3WEE6l_qdU_hh=!8nSUDcOA(7gcLkhg>Sp>Z*2}!MSKntRPN-)hMba#Soe=K{#_V zpb2d0EC-Mp#Sd#>A(9!uk7TfJ;71*R!v+ass+UdKqTnREz<383J0n==uI_PJQp<-n&PT+ zV>**(LKF;x1S&KJ5yL=JHjM6uF>$8?@WC23m4vmJn_~&=#G-CI%2tERMh!dkF8WxB z^)2y09I}#5QdBufG?`Cbj!U>XVeatW5)L+e$WZ==&2TmbW;&HIUu)QXXKE-o1XL0?&lb$#NHxj(S znaqZZlyA49YqY^@cq%y(fMX%VxtKO5gH0u8%3^PskLEZ9bga=YZ6VkUb=t{s6Pj$$ z6I8Rmzv#QOkKK}PZ{f_OuIE_}P__5Ii2hc&=K|{KtX#9btv&stH}!}hwhCgKAeIHO zPZ9eSaX=AwDfaFwX!O2!v-`*aa*&LXb!(IH|oN&pZL4By21KENv}l&-TuQBbXVXYksci!d~5w$L|89+{pYha%YJPD29?w#O)a-v z+WQyce~+vjlIy~yHS%WoIvnEZ5l}JwA@T22I)oGgTMw!ksD;~v+KtQ(q1I7`*L&;ew;uWR-my#nkiz}Kd9h!p^>|M+ zL)%B?@Bml_gxUeHvQfaY{nOu};LNnlQeS&jd|Qs36W8RP7HI9d{~dXuj+Yl??|j|2 zd`kAdR$ea(U4!d`OETERRk?P5xKDX$`58If4_`k5eE2#ihj+o(1$*==`Z!vaA7A;6 zd}?LcK6({>`q@>~Qi=Tn{SsYVL$Mb2KjJR?`KxHAvSE9_*=Kim`0lDa{Co5qvU^`f z`!4MB?QVOv$M?NTtjz~GFZg0UzAr6{)vmDTsos{QO6($d7JFO%?z#POTZ7wkaC;5@ LzgGcVGS+_q)%NP< delta 2109 zcmeHH-Afcv6u&dG+s+-gWiv`yjdn9L3u3)Q8TM<}<5JE2@Aw9&}-E}4Zf}R{W=iKx4JLg=^oj?Eu z0;qShHFFQ>_k$A!nQH);2B|~4YR%19(49#~AGRL13459F9p>E{x8E7J3!Fqw5+@5M zE2kBlY{s}c{lSGD8u1axgtB`1&tk}+PrVoOM2%*hiqKvfWKsR`ysq$ zY%>_%n<^;~SGDhpTAbrvW4ZWC17uP!~nr6on{yPT9IiShO#w zf6=G)89k`a=@M3O7B0liILLJa$8iQJAwj*G)RKBG{p2y{LH%ipCr^EZ-JOKx*{TG5 zW)m-Cx)K{lC*078 zJ+(MCND^SM3QwpvFsTt70Q%J??CGQ{Kq=%lzsAc}3_1H9|6(*?lW@ruzO?x zU8GtMs-g~&)Z|Ths%dM&9bHM~>j@=lr}9W($`9;$Q+Y$PM81wHsd-rKqOYQes@+`d zq-ux@jjGSNILJ5I^nlBn!1)zTke k-!pzPxj{(c$bI8>B=kAO*=4qT2g`e~{0#o%uV9z(7iIPH5&!@I