mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
BPBIOS system segment enhancements
This commit is contained in:
296
Source/BPBIOS/Z34RCP11/rcpiom.lib
Normal file
296
Source/BPBIOS/Z34RCP11/rcpiom.lib
Normal file
@@ -0,0 +1,296 @@
|
||||
page
|
||||
|
||||
; Library: RCPIOM for Z34RCP
|
||||
; Author: Carson Wilson
|
||||
; Version: 1.1
|
||||
; Date: August 12, 1989
|
||||
; Changes: POKE and PORT now respond dynamically to QUIET flag,
|
||||
; eliminating "noise."
|
||||
|
||||
; Author: Carson Wilson
|
||||
; Version: 1.0
|
||||
; Date: June 15, 1988
|
||||
;
|
||||
; Commands: PEEK, POKE, and PORT
|
||||
|
||||
; ------------------------------------------------------------------
|
||||
;
|
||||
; Command: PEEK
|
||||
; Function: Display memory contents
|
||||
;
|
||||
; Form:
|
||||
; PEEK startadr 128 bytes displayed
|
||||
; PEEK startadr endadr Range of bytes displayed
|
||||
|
||||
if peekon
|
||||
peek:
|
||||
call retsave
|
||||
ld hl,tbuff+1 ; Find first number
|
||||
nxtpeek equ $+1 ; Pointer for in-the-code modification
|
||||
ld de,100h ; Default peek address if none
|
||||
call sksp ; Skip to first token (if any)
|
||||
call nz,hexnum ; Get start address if any
|
||||
push de ; Save starting address
|
||||
ld bc,peeklen ; Compute default ending address
|
||||
ex de,hl
|
||||
add hl,bc
|
||||
|
||||
if peekchk ; Check for overflow
|
||||
jr nc,peek0 ; If no overflow past FFFF, go on
|
||||
ld hl,0ffffh ; Else use FFFF as ending address
|
||||
peek0:
|
||||
endif ;peekchk
|
||||
|
||||
ex de,hl ; End address in DE
|
||||
call sksp ; Skip to next token (if any)
|
||||
call nz,hexnum ; Get 2nd number in DE (else default)
|
||||
peek1: pop hl ; HL is start address, DE is end address
|
||||
|
||||
if peekhdr
|
||||
push hl ; Save starting address again
|
||||
ld b,8 ; Output leading spaces
|
||||
peek0a: call spac
|
||||
djnz peek0a
|
||||
ld b,16 ; Display 16 column headers
|
||||
peek0b: ld a,l ; Get low byte of address
|
||||
and 0fh ; Display low hex digit
|
||||
call pashc
|
||||
inc hl
|
||||
djnz peek0b
|
||||
;
|
||||
; Display header for ASCII area
|
||||
;
|
||||
call print
|
||||
db ' ',' '+80H ; Space over to ASCII area
|
||||
pop hl ; Get address
|
||||
push hl
|
||||
ld b,16 ; Display 16 chars. ASCII header
|
||||
peek0b1:ld a,l ; Get byte
|
||||
and 0fh ; Mask
|
||||
call pah ; Print ASCII char.
|
||||
inc hl ; Next byte
|
||||
djnz peek0b1
|
||||
|
||||
if peekbdr
|
||||
call crlf
|
||||
ld b,8
|
||||
peek0c: call spac ; Print leading spaces
|
||||
djnz peek0c
|
||||
ld b,16
|
||||
peek0d: call print
|
||||
db ' -','-'+80h
|
||||
djnz peek0d
|
||||
|
||||
; Print border at ASCII area
|
||||
|
||||
call print
|
||||
db ' ',' '+80h ; Space to ASCII border
|
||||
ld b,16 ; 16 dashes
|
||||
peek0e: call print
|
||||
db '-'+80h
|
||||
djnz peek0e
|
||||
endif ;peekbdr
|
||||
|
||||
pop hl ; Restore starting address
|
||||
endif ;peekhdr
|
||||
|
||||
ld c,0ffh ; Use C as continue flag
|
||||
call peek2 ; Do peek
|
||||
ld (nxtpeek),hl ; Set continued peek address
|
||||
jp exit
|
||||
peek2:
|
||||
ld a,c ; Check continuation flag
|
||||
or a
|
||||
ret z
|
||||
|
||||
; Print line header
|
||||
|
||||
peek2a: call crlf ; New line
|
||||
ld a,h ; Print address
|
||||
call pashc
|
||||
ld a,l
|
||||
call pahc
|
||||
call dash ; Print leader
|
||||
ld b,16 ; 16 bytes to display
|
||||
push hl ; Save start address
|
||||
|
||||
; Print hex values for 16 bytes
|
||||
|
||||
peek3: ld a,(hl) ; Get next byte
|
||||
call pashc ; Print with leading space
|
||||
|
||||
; Check for last address. If C is already 0, leave it that way.
|
||||
; Otherwise check for end address and if so set C to zero.
|
||||
|
||||
ld a,c ; See if continue flag already cleared
|
||||
or a
|
||||
jr z,peek3a ; If so, skip test
|
||||
ld a,h
|
||||
sub a,d ; See if h = d
|
||||
ld c,a
|
||||
ld a,l
|
||||
sub a,e ; See if l = e
|
||||
or c ; Combine two tests
|
||||
ld c,a
|
||||
peek3a: inc hl ; Pt to next
|
||||
djnz peek3
|
||||
|
||||
; Print ASCII equivalents for 16 bytes
|
||||
|
||||
pop hl ; Pt to first address again
|
||||
ld b,16 ; 16 bytes
|
||||
call print ; Space and fence
|
||||
db ' '
|
||||
db fence+80h
|
||||
push bc ; Save flag in c
|
||||
peek4: ld a,(hl) ; Get next byte
|
||||
ld c,'.' ; Assume dot
|
||||
and 7fh ; Mask it
|
||||
cp ' ' ; Dot if less than space
|
||||
jr c,peek5
|
||||
cp 7fh ; Don't print del
|
||||
jr z,peek5
|
||||
ld c,a ; Char in c
|
||||
peek5: ld a,c ; Get char
|
||||
call conout ; Send it
|
||||
inc hl ; Pt to next
|
||||
djnz peek4
|
||||
call print ; Closing fence
|
||||
db fence+80h
|
||||
pop bc ; Get flag in c back
|
||||
call break ; Allow abort
|
||||
jr peek2
|
||||
endif ; Peekon
|
||||
|
||||
; PAHC - Print A as 2 hex chars
|
||||
; PASHC - With leading space
|
||||
|
||||
if peekon or pokeon or porton
|
||||
pashc:
|
||||
push af ; Save A
|
||||
call spac
|
||||
pop af
|
||||
pahc: push bc ; Save bc
|
||||
ld c,a ; Byte in c
|
||||
rrca ; Exchange nybbles
|
||||
rrca
|
||||
rrca
|
||||
rrca
|
||||
call pah ; Print hex char
|
||||
ld a,c ; Get low
|
||||
pop bc ; Restore bc and fall thru to pah
|
||||
pah: and 0fh ; Mask
|
||||
add '0' ; Convert to ascii
|
||||
cp '9'+1 ; Letter?
|
||||
jr c,pah1
|
||||
add 7 ; Adjust to letter
|
||||
pah1: jp conout
|
||||
endif ; Peekon or pokeon or porton
|
||||
|
||||
; --------------------------------------------------------------------
|
||||
;
|
||||
; Command: POKE
|
||||
; Function: Place Values into Memory
|
||||
;
|
||||
; Form:
|
||||
; POKE startadr val1 val2 ...
|
||||
;
|
||||
if pokeon
|
||||
poke:
|
||||
call retsave
|
||||
ld hl,tbuff+1 ; Pt to first char
|
||||
call sksp ; Skip to non-blank
|
||||
jp z,numerr ; Numerical error
|
||||
call hexnum ; Convert to number
|
||||
call qplug ; Shut off output if quiet
|
||||
call print
|
||||
db ' Pok','e'+80h
|
||||
call adrat ; Print at message (quiet sensitive)
|
||||
call unplug ; Turn on output
|
||||
|
||||
; Loop for storing hex values sequentially via POKE
|
||||
|
||||
poke1: push de ; Save address
|
||||
call sksp ; Skip to non-blank
|
||||
jp z,exit ; Done
|
||||
cp '"' ; Quoted text?
|
||||
jr z,poke2
|
||||
call hexnum ; Get number
|
||||
ld a,e ; Get low
|
||||
pop de ; Get address
|
||||
ld (de),a ; Store number
|
||||
inc de ; Pt to next
|
||||
jr poke1
|
||||
|
||||
; Store ASCII chars.
|
||||
|
||||
poke2: pop de ; Get next address
|
||||
inc hl ; Pt to next char
|
||||
poke3: ld a,(hl) ; Get next char
|
||||
or a ; Done?
|
||||
jp z,exit
|
||||
ld (de),a ; Put char
|
||||
inc hl ; Pt to next
|
||||
inc de
|
||||
jr poke3
|
||||
|
||||
endif ; Pokeon
|
||||
|
||||
; -------------------------------------------------------------------
|
||||
;
|
||||
; Command: PORT
|
||||
; Function: Display or Set I/O Port Data
|
||||
;
|
||||
; Forms:
|
||||
; PORT addr - Read port and display value
|
||||
; PORT addr value - Output value to port
|
||||
;
|
||||
if porton
|
||||
port:
|
||||
call retsave
|
||||
ld hl,tbuff+1 ; Find first number
|
||||
call sksp ; Skip to first command-line token
|
||||
jp z,numerr ; Numerical error
|
||||
call hexnum ; Get start address into de
|
||||
push hl ; Save pointer to command tail
|
||||
ld hl,portadl ; Modify code
|
||||
ld (hl),e ; Move specified port addr into place
|
||||
dec hl ; Point to opcode position
|
||||
ld (hl),0dbh ; Poke 'in' opcode
|
||||
dec hl
|
||||
ld (hl),d ; Save MSB for port address
|
||||
inc hl
|
||||
ex (sp),hl ; Get tail pointer back while saving this one
|
||||
call qplug ; Shut off output if quiet
|
||||
call print ; Print header
|
||||
db ' Por','t'+80h
|
||||
ld a,e
|
||||
call pashc ; Print port address
|
||||
call sksp ; Skip to possible second value
|
||||
jr z,portin ; Proceed with port input
|
||||
call hexnum ; Get 2nd number in de
|
||||
ex (sp),hl ; Get pointer to opcode back
|
||||
ld (hl),0d3h ; Poke 'out' opcode
|
||||
call print
|
||||
db ': OU','T'+80h
|
||||
ld a,e ; Get value to output
|
||||
jr paddr
|
||||
portin:
|
||||
call print
|
||||
db ': I','N'+80h
|
||||
xor a ; Make sure high port address = 0 (for hd64180)
|
||||
portadh equ $+1
|
||||
paddr: ld b,0 ; ..for both in and out instructions
|
||||
opcode:
|
||||
db 0 ; Opcode for in or out inserted by code above
|
||||
portadl:
|
||||
db 0 ; Port address inserted by code above
|
||||
call pashc
|
||||
call unplug ; Turn on output
|
||||
pop hl ; Clean up stack
|
||||
jp exit
|
||||
|
||||
endif ; Porton
|
||||
|
||||
; End RCPIOM.Z80
|
||||
|
||||
Reference in New Issue
Block a user