forked from MirrorRepos/RomWBW
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
3.5 KiB
162 lines
3.5 KiB
page
|
|
|
|
; Library: RCPECHO for Z34RCP
|
|
; Author: Carson Wilson
|
|
; Version: 1.0
|
|
; Date: June 15, 1988
|
|
;
|
|
; Command: ECHO
|
|
; Function: Echo text to console or printer
|
|
|
|
echo:
|
|
xor a ; Lower case/printer off flag setting
|
|
ld (crtfl),a ; Printer off by default
|
|
|
|
if upcase ; If upper case default
|
|
dec a
|
|
endif ;upcase
|
|
|
|
ld (casefl),a ; Store flag in code below
|
|
ld hl,tbuff+1 ; Point to first character
|
|
call getchar ; Get first character (should be blank)
|
|
; If none, exit from routine
|
|
|
|
; Loop to echo chars
|
|
|
|
echo2: call getchar
|
|
|
|
if echolst
|
|
cp ff ; Form feed?
|
|
jr z,echo3
|
|
endif ;echolst
|
|
|
|
cp '^'
|
|
jr nz,echo2a ; Not control character prefix
|
|
call getchar ; Get next character
|
|
and 1fh ; Convert to control character
|
|
jr echo2e ; Echo it
|
|
echo2a:
|
|
cp cmdchar ; Case shift prefix?
|
|
jr nz,echo2e ; No, normal echo
|
|
call getchar ; Get next character
|
|
|
|
if echolst
|
|
cp prtchar ; Turn printer on?
|
|
jr z,echo2b ; Store non-zero in crt flag
|
|
cp crtchar ; Turn printer off?
|
|
jr nz,echo2c ; No, test for shift characters
|
|
xor a ; Yes, clear crt flag
|
|
echo2b: ld (crtfl),a
|
|
jr echo2 ; On to next character
|
|
echo2c:
|
|
endif ; echolst
|
|
|
|
cp ucasechar ; Up-shift character?
|
|
jr z,echo2d ; Store non-zero value in case flag
|
|
cp lcasechar ; Lower-case character?
|
|
jr nz,echo2e ; No, echo the character as is
|
|
xor a ; Else, clear case flag
|
|
echo2d: ld (casefl),a
|
|
jr echo2 ; On to next character
|
|
echo2e:
|
|
call echout ; Send char
|
|
jr echo2
|
|
|
|
; Form feed - send new line followed by form feed if printer output
|
|
|
|
if echolst
|
|
echo3:
|
|
ld a,(crtfl) ; Check for printer output
|
|
or a ; Non-zero?
|
|
jr z,echoff ; No, send form feed normally
|
|
call echonl ; Send new line
|
|
ld a,ff ; Send form feed
|
|
jr echout
|
|
|
|
; Send form feed char to console
|
|
|
|
echoff:
|
|
ld a,ff ; Get char
|
|
jr echo2e
|
|
endif ;echolst
|
|
|
|
; End of print loop - check for printer termination
|
|
|
|
echo4:
|
|
if not echolst
|
|
ret
|
|
|
|
else
|
|
ld a,(crtfl) ; Get list mode flag
|
|
or a
|
|
ret z ; Done if no printer output
|
|
|
|
; Output a new line
|
|
|
|
echonl:
|
|
ld a,cr ; Output new line on printer
|
|
call echout
|
|
ld a,lf ; Fall thru to echout
|
|
endif ; not echolst
|
|
|
|
; Output char to printer or console
|
|
|
|
echout:
|
|
ld c,a ; Char in c
|
|
cp 'A' ; If less than 'A'
|
|
jr c,echouta ; Leave as is
|
|
cp 'Z'+1 ; If greater than 'Z'
|
|
jr nc,echouta ; Leave as is
|
|
add 20h ; Else convert to lower case
|
|
echouta:
|
|
ld d,a ; Save lower case version in d
|
|
casefl equ $+1 ; Pointer for in-the-code modification
|
|
ld a,0
|
|
or a ; Upper case?
|
|
jr nz,echoutb ; If upper case selected, go on as is
|
|
ld c,d ; Else substitute lower case version
|
|
echoutb:
|
|
|
|
push hl ; Save hl
|
|
push bc ; Save bc
|
|
ld de,0ch-3 ; Offset for BIOS console output
|
|
|
|
if echolst
|
|
|
|
crtfl equ $+1
|
|
ld a,0
|
|
or a ; Printer?
|
|
jr z,echout1 ; No
|
|
inc de ; Offset for BIOS printer output
|
|
inc de
|
|
inc de
|
|
endif ;echolst
|
|
|
|
; Output char in C with BIOS offset in DE
|
|
|
|
echout1:
|
|
call biout ; Bios output
|
|
pop bc ; Restore bc,hl
|
|
pop hl
|
|
ret
|
|
|
|
; Get a character from the command tail buffer
|
|
|
|
getchar:
|
|
ld a,(hl) ; Get character
|
|
inc hl ; Point to next one
|
|
or a ; Check for end of string
|
|
ret nz ; If not end, return
|
|
pop hl ; Else, clean up stack
|
|
jr echo4 ; And exit from routine
|
|
|
|
; Output char in C to BIOS with offset in DE
|
|
|
|
biout:
|
|
ld hl,(wboot+1) ; Get address of warm boot
|
|
add hl,de ; Pt to routine
|
|
jp (hl) ; Jump to it
|
|
|
|
; End RCPECHO.LIB
|
|
|
|
|