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 4190284..113ab6d 100644 Binary files a/SOFTCARD80.BIN#041000 and b/SOFTCARD80.BIN#041000 differ diff --git a/zapple2.po b/zapple2.po index 51714b6..62e61e6 100644 Binary files a/zapple2.po and b/zapple2.po differ