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