mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:23:13 -06:00
267 lines
4.6 KiB
Plaintext
267 lines
4.6 KiB
Plaintext
;
|
||
; Program: REG
|
||
; Author: Richard Conn
|
||
; Version: 1.0
|
||
; Date: 5 Mar 84
|
||
;
|
||
version equ 10
|
||
|
||
;
|
||
; REG is used to access the ZCPR3 Registers. It can set a value,
|
||
; display a value or all values, increment, and decrement them.
|
||
;
|
||
|
||
;
|
||
; Equates for Key Values
|
||
;
|
||
z3env SET 0f400h ;address of ZCPR3 environment
|
||
fcb equ 5ch
|
||
fcb2 equ 6ch
|
||
cr equ 0dh
|
||
lf equ 0ah
|
||
|
||
;
|
||
; External Z3LIB and SYSLIB Routines
|
||
;
|
||
ext z3init,getreg,putreg,getmsg
|
||
ext eval10,print,cout,crlf,qprint,padc
|
||
|
||
;
|
||
; Environment Definition
|
||
;
|
||
if z3env ne 0
|
||
;
|
||
; External ZCPR3 Environment Descriptor
|
||
;
|
||
jmp start
|
||
db 'Z3ENV' ;This is a ZCPR3 Utility
|
||
db 1 ;External Environment Descriptor
|
||
z3eadr:
|
||
dw z3env
|
||
start:
|
||
lhld z3eadr ;pt to ZCPR3 environment
|
||
;
|
||
else
|
||
;
|
||
; Internal ZCPR3 Environment Descriptor
|
||
;
|
||
MACLIB Z3BASE.LIB
|
||
MACLIB SYSENV.LIB
|
||
z3eadr:
|
||
jmp start
|
||
SYSENV
|
||
start:
|
||
lxi h,z3eadr ;pt to ZCPR3 environment
|
||
endif
|
||
|
||
;
|
||
; Start of Program -- Initialize ZCPR3 Environment
|
||
;
|
||
call z3init ;initialize the ZCPR3 Environment
|
||
;
|
||
; Print Banner
|
||
;
|
||
call qprint
|
||
db 'REG, Version '
|
||
db (version/10)+'0','.',(version mod 10)+'0',cr,lf,0
|
||
;
|
||
; Check for Availability of Registers
|
||
;
|
||
call getmsg
|
||
jz nomsg
|
||
;
|
||
; Check for Command
|
||
;
|
||
lxi h,fcb+1 ;pt to first FCB
|
||
mov a,m ;get first char
|
||
cpi ' ' ;check for help
|
||
jz help
|
||
cpi '/' ;also help
|
||
jz help
|
||
cpi '#' ;display all
|
||
jz dispall
|
||
cpi 'D' ;display
|
||
jz display
|
||
cpi 'M' ;minus (decrement)
|
||
jz minus
|
||
cpi 'P' ;plus (increment)
|
||
jz plus
|
||
cpi 'S' ;set
|
||
jz setrg
|
||
cpi '0' ;convert to binary
|
||
jc help
|
||
cpi '9'+1 ;range?
|
||
jnc help
|
||
jmp disp1
|
||
|
||
;
|
||
; Print Error Message
|
||
;
|
||
nomsg:
|
||
call print
|
||
db cr,lf,'No Registers Available',0
|
||
ret
|
||
|
||
;
|
||
; Print Help Message
|
||
;
|
||
help:
|
||
call print
|
||
db cr,lf,'REG - Set/Display/Increment/Decrement Registers'
|
||
db cr,lf,'REG Syntax:'
|
||
db cr,lf,' REG Dr or REG r <-- Display Reg r'
|
||
db cr,lf,' REG Mr <-- Minus (Decrement) Reg r'
|
||
db cr,lf,' REG Pr <-- Plus (Increment) Reg r'
|
||
db cr,lf,' REG Sr val <-- Set Reg r to val'
|
||
db cr,lf,'where "r" may be 0-9 for the regs or'
|
||
db cr,lf,'# to select all regs'
|
||
db 0
|
||
ret
|
||
;
|
||
; Display Register
|
||
;
|
||
display:
|
||
inx h ;pt to value
|
||
mov a,m ;get it
|
||
disp1:
|
||
cpi '#' ;display all?
|
||
jz dispall
|
||
;
|
||
; Display Particular Register
|
||
;
|
||
call compreg ;compute register number in B
|
||
call getreg ;return register value in A
|
||
;
|
||
; Print Register whose Number is in B and Value in A
|
||
;
|
||
regprint:
|
||
mov c,a ;value in C
|
||
call print
|
||
db ' Reg ',0
|
||
mov a,b
|
||
adi '0' ;convert to ASCII
|
||
call cout
|
||
call print
|
||
db ' = ',0
|
||
mov a,c ;print value
|
||
jmp padc
|
||
;
|
||
; Display All Registers
|
||
;
|
||
dispall:
|
||
mvi b,0 ;loop 0 to 9
|
||
dispa1:
|
||
call getreg ;get register
|
||
call regprint ;print register
|
||
call print
|
||
db ' ',0
|
||
inr b ;increment count
|
||
mov a,b ;check for new line
|
||
ani 3
|
||
cz crlf
|
||
mov a,b ;check for done
|
||
cpi 10
|
||
jnz dispa1
|
||
ret
|
||
;
|
||
; Convert ASCII Char in A to Register Number in B with error check
|
||
;
|
||
compreg:
|
||
cpi '0' ;convert to binary
|
||
jc rerr
|
||
cpi '9'+1
|
||
jnc rerr
|
||
sui '0' ;convert to binary
|
||
mov b,a ;return value in B
|
||
ret
|
||
rerr:
|
||
mov b,a ;save char
|
||
pop psw ;clear stack
|
||
call print
|
||
db ' Invld Reg ID: ',0
|
||
mov a,b ;get char
|
||
jmp cout
|
||
;
|
||
; Set Register Value
|
||
;
|
||
setrg:
|
||
inx h ;pt to register
|
||
mov a,m ;get char
|
||
cpi '#' ;all registers?
|
||
jz setall
|
||
call compreg ;get register number in B
|
||
lxi h,fcb2+1 ;pt to value
|
||
call eval10 ;evaluate
|
||
mov c,a ;save value in C
|
||
call putreg ;set register
|
||
jmp regprint ;print value
|
||
;
|
||
; Set All Registers
|
||
;
|
||
setall:
|
||
lxi h,fcb2+1 ;pt to value
|
||
call eval10
|
||
mov c,a ;value in C
|
||
mvi b,0 ;set 10 registers
|
||
seta1:
|
||
mov a,c ;get value
|
||
call putreg ;set value
|
||
inr b ;increment reg number
|
||
mov a,b
|
||
cpi 10
|
||
jnz seta1
|
||
jmp dispall ;display all registers
|
||
;
|
||
; Reg = Reg - 1
|
||
;
|
||
minus:
|
||
inx h ;pt to number
|
||
mov a,m ;get it
|
||
cpi '#' ;all?
|
||
jz minall
|
||
call compreg ;compute register number
|
||
call getreg ;get register
|
||
dcr a ;-1
|
||
call putreg ;restore register
|
||
jmp regprint ;print result
|
||
;
|
||
; All Registers - 1
|
||
;
|
||
minall:
|
||
mvi b,0 ;set loop
|
||
mina1:
|
||
call getreg ;get register
|
||
dcr a ;-1
|
||
call putreg ;restore register
|
||
inr b ;count
|
||
mov a,b ;done?
|
||
cpi 10
|
||
jnz mina1
|
||
jmp dispall ;display all regs
|
||
;
|
||
; Reg = Reg + 1
|
||
;
|
||
plus:
|
||
inx h ;pt to register
|
||
mov a,m ;get it
|
||
cpi '#' ;all?
|
||
jz plusall
|
||
call compreg ;compute value
|
||
call getreg ;get value
|
||
inr a ;+1
|
||
call putreg ;put value
|
||
jmp regprint ;print value
|
||
plusall:
|
||
mvi b,0 ;set counter
|
||
plusa1:
|
||
call getreg ;increment value
|
||
inr a
|
||
call putreg
|
||
inr b ;count
|
||
mov a,b
|
||
cpi 10
|
||
jnz plusa1
|
||
jmp dispall ;print reg values
|
||
|
||
end
|
||
|