mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:23:13 -06:00
Fix I/O, buffers and stack
This commit is contained in:
@@ -23,20 +23,6 @@
|
||||
|
||||
#INCLUDE "std.asm"
|
||||
|
||||
zemu .equ 0
|
||||
|
||||
#if zemu
|
||||
tty_data .equ 7ch ; Z80 Emulator
|
||||
tty_status .equ 7dh
|
||||
rx_full .equ 1
|
||||
tx_empty .equ 0
|
||||
#else
|
||||
tty_data .equ 67h ; SBC V2
|
||||
tty_status .equ 68h
|
||||
rx_full .equ 1
|
||||
tx_empty .equ 0
|
||||
#endif
|
||||
|
||||
ctrlc .equ 03h
|
||||
bs .equ 08h
|
||||
lf .equ 0ah
|
||||
@@ -46,7 +32,7 @@ ctrlu .equ 15h
|
||||
|
||||
#define dwa(addr) .db (addr >> 8) + 080h\ .db addr & 0ffh
|
||||
|
||||
.org TBC_LOC
|
||||
.org TBC_LOC
|
||||
start:
|
||||
ld sp,stack ; ** Cold Start **
|
||||
ld a,0ffh
|
||||
@@ -745,12 +731,12 @@ gl3:
|
||||
cp buffer & 0ffh ; if there are any?
|
||||
jr z,gl4 ; no, redo whole line
|
||||
dec de ; yes, back pointer
|
||||
ld a,5ch ; and echo a backslash
|
||||
ld a,bs ; and echo a backslash 5ch **
|
||||
call outc
|
||||
jr gl1 ; and get next character
|
||||
gl4:
|
||||
call crlf ; redo entire line
|
||||
ld a,5eh
|
||||
ld a,'>' ; 5eh **
|
||||
jr getline
|
||||
findline:
|
||||
ld a,h ; ** FindLine **
|
||||
@@ -1216,6 +1202,12 @@ new:
|
||||
endd:
|
||||
call endchk ; ** End **
|
||||
jp rstart
|
||||
|
||||
bye: call endchk ; ** Reboot **
|
||||
LD A,BID_BOOT ; BOOT BANK
|
||||
LD HL,0 ; ADDRESS ZERO
|
||||
CALL HB_BNKCALL ; DOES NOT RETURN
|
||||
HALT
|
||||
run:
|
||||
call endchk ; ** Run **
|
||||
ld de,textbegin
|
||||
@@ -1525,38 +1517,38 @@ patloop:
|
||||
jr nz,patloop
|
||||
ld de,msg1 ; then output welcome message
|
||||
call printstr
|
||||
ld hl,start ; initialise random pointer
|
||||
ld hl,start ; initialise random pointer
|
||||
ld (rndptr),hl
|
||||
ld hl,textbegin ; initialise text area pointers
|
||||
ld (textunfilled),hl
|
||||
jp rstart
|
||||
|
||||
chkio:
|
||||
; in a,(tty_status) ; check if character available
|
||||
; bit rx_full,a
|
||||
; SAVE INCOMING REGISTERS (AF IS OUTPUT)
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
; GET CONSOLE INPUT STATUS VIA HBIOS
|
||||
LD C,CIODEV_CONSOLE; CONSOLE UNIT TO C
|
||||
LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS
|
||||
RST 08 ; HBIOS RETURNS STATUS IN A
|
||||
; RESTORE REGISTERS (AF IS OUTPUT)
|
||||
; GET CONSOLE INPUT STATUS VIA HBIOS
|
||||
LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C
|
||||
LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS
|
||||
RST 08 ; HBIOS RETURNS STATUS IN A
|
||||
|
||||
; RESTORE REGISTERS (AF IS OUTPUT)
|
||||
|
||||
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
ret z ; no, return
|
||||
; in a,(tty_data) ; get the character
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
|
||||
LD C,CIODEV_CONSOLE; CONSOLE UNIT TO C
|
||||
LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR
|
||||
RST 08 ; HBIOS READS CHARACTDR
|
||||
LD A,E ; MOVE CHARACTER TO A FOR RETURN
|
||||
; RESTORE REGISTERS (AF IS OUTPUT)
|
||||
; INPUT CHARACTER FROM CONSOLE VIA HBIOS
|
||||
LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C
|
||||
LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR
|
||||
RST 08 ; HBIOS READS CHARACTDR
|
||||
LD A,E ; MOVE CHARACTER TO A FOR RETURN
|
||||
; RESTORE REGISTERS (AF IS OUTPUT)
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
@@ -1587,51 +1579,49 @@ io3:
|
||||
ret nz ; no
|
||||
jp rstart ; yes, restart tasty basic
|
||||
crlf:
|
||||
ld a,cr
|
||||
outc:
|
||||
#if zemu
|
||||
ld a,cr ; outc will alway output a lf after a cr
|
||||
outc: ; using a recursice call
|
||||
push af
|
||||
ld a,(ocsw) ; check output control switch
|
||||
or a
|
||||
jr nz,uart_tx ; output is enabled
|
||||
jr nz,outen ; output is enabled
|
||||
pop af ; output is disabled
|
||||
ret ; so return
|
||||
uart_tx:
|
||||
call uart_tx_ready ; see if transmit is available
|
||||
pop af ; restore the character
|
||||
out (tty_data),a ; and send it
|
||||
cp cr ; was it a cr?
|
||||
ret nz ; no, return
|
||||
ld a,lf ; send a lf
|
||||
call outc
|
||||
ld a,cr ; restore register
|
||||
ret ; and return
|
||||
uart_tx_ready:
|
||||
push af
|
||||
uart_tx_ready_loop:
|
||||
in a,(tty_status)
|
||||
bit tx_empty,a
|
||||
jp z,uart_tx_ready_loop
|
||||
pop af
|
||||
ret
|
||||
#else ; USE HBIOS
|
||||
; SAVE ALL INCOMING REGISTERS
|
||||
PUSH AF
|
||||
|
||||
outen: ;call canoutc ;
|
||||
pop af ; recover character to output
|
||||
push af
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
; OUTPUT CHARACTER TO CONSOLE VIA HBIOS
|
||||
LD E,A ; OUTPUT CHAR TO E
|
||||
LD C,CIODEV_CONSOLE; CONSOLE UNIT TO C
|
||||
LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR
|
||||
RST 08 ; HBIOS OUTPUTS CHARACTDR
|
||||
; RESTORE ALL REGISTERS
|
||||
; OUTPUT CHARACTER TO CONSOLE VIA HBIOS
|
||||
LD E,A ; OUTPUT CHAR TO E
|
||||
LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C
|
||||
LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR
|
||||
RST 08 ; HBIOS OUTPUTS CHARACTER
|
||||
POP HL
|
||||
POP DE
|
||||
POP BC
|
||||
POP AF
|
||||
cp cr ; was it a cr?
|
||||
ret nz ; no, return
|
||||
ld a,lf ; send a lf
|
||||
call outc
|
||||
ld a,cr ; restore register
|
||||
RET
|
||||
#endif
|
||||
|
||||
;canoutc:
|
||||
; push af
|
||||
;uart_tx_ready_loop:
|
||||
; LD C,CIODEV_CONSOLE; CONSOLE UNIT TO C
|
||||
; LD B,BF_CIOOST ; HBIOS FUNC: CHAR OUTPUT STATUS
|
||||
; RST 08 ; HBIOS CHECK STATUS
|
||||
; OR A
|
||||
; bit tx_empty,a
|
||||
; jp z,uart_tx_ready_loop
|
||||
; pop af
|
||||
; ret
|
||||
|
||||
|
||||
;*************************************************************
|
||||
;
|
||||
@@ -1691,6 +1681,8 @@ tab2: ; direct/statement
|
||||
dwa(poke)
|
||||
.db "END"
|
||||
dwa(endd)
|
||||
.db "BYE"
|
||||
dwa(bye)
|
||||
dwa(deflt)
|
||||
tab4: ; functions
|
||||
.db "PEEK"
|
||||
@@ -1766,19 +1758,10 @@ ex5:
|
||||
jp (hl)
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
lstrom: ; all above can be rom
|
||||
; .org TBC_SIZ+09feh
|
||||
usrfunc jp qhow ; default user defined function
|
||||
usrvector: .db usrfunc & 0ffh ; location of user defined
|
||||
.db (usrfunc >> 8) & 0ffh ; function
|
||||
|
||||
; .org TBC_SIZ+0a00h ; following must be in ram
|
||||
usrfunc jp qhow ; default user defined function
|
||||
|
||||
codend .equ $
|
||||
|
||||
; .org TBC_SIZ+01000h ; start of state
|
||||
ocsw .DS 1 ; output control switch
|
||||
ocsw .db 0ffh ; output control switch
|
||||
current .DS 2 ; points to current line
|
||||
stkgos .DS 2 ; saves sp in 'GOSUB'
|
||||
varnext .ds 2 ; temp storage
|
||||
@@ -1790,21 +1773,20 @@ loopln .ds 2 ; loop line number
|
||||
loopptr .ds 2 ; loop text pointer
|
||||
rndptr .ds 2 ; random number pointer
|
||||
textunfilled .ds 2 ; -> unfilled text area
|
||||
textbegin .ds 2 ; start of text save area
|
||||
;textbegin .ds 2 ; start of text save area
|
||||
; .org 07fffh
|
||||
textend .ds 0 ; end of text area
|
||||
;textend .ds 0 ; end of text area
|
||||
varbegin .ds 55 ; variable @(0)
|
||||
buffer .ds 72 ; input buffer
|
||||
bufend .ds 1
|
||||
stacklimit .ds 1
|
||||
stack .equ 0fe00h
|
||||
|
||||
;TBC_STACK .EQU $
|
||||
|
||||
SLACK .EQU (TBC_END - codend)
|
||||
textbegin .equ $
|
||||
lstrom: .equ $
|
||||
stack .equ 0fd00h
|
||||
textend .equ stack-0100h
|
||||
|
||||
SLACK .EQU (TBC_END - lstrom)
|
||||
.FILL SLACK,'t'
|
||||
;
|
||||
|
||||
;
|
||||
.ECHO "TASTYBASIC space remaining: "
|
||||
.ECHO SLACK
|
||||
|
||||
Reference in New Issue
Block a user