a2audit/audit/monitor-routines.asm
Zellyn Hunter 2a0b0da1b2 Duplicated the redbook monitor routines we use
IIe machines jump to Cxxx ROM for initialization and HOME (and
probably other things too). This change makes the audit tests more
self-contained, for when you're trying to test an emulator that's not
really working yet.
2017-02-02 22:33:53 -05:00

304 lines
9.3 KiB
NASM

!zone monitor {
.LOC0 = $00
.LOC1 = $01
.WNDLFT = $20
.WNDWDTH = $21
.WNDTOP = $22
.WNDBTM = $23
.CH = $24
.CV = $25
.GBASL = $26
.GBASH = $27
.BASL = $28
.BASH = $29
.BAS2L = $2A
.BAS2H = $2B
.V2 = $2D
.MASK = $2E
.COLOR = $30
.INVFLG = $32
.YSAV1 = $35
.CSWL = $36
.CSWH = $37
.KSWL = $38
.KSWH = $39
.A2L = $3E
.STATUS = $48
.RNDL = $4E
.RNDH = $4F
.IOADR = $C000
.KBD = $C000
.KBDSTRB = $C010
.SPKR = $C030
.LORES = $C056
.LOWSCR = $C054
.TXTSET = $C051
.TXTCLR = $C050
.MIXSET = $C053
.PLOT LSR ;Y-COORD/2
PHP ;SAVE LSB IN CARRY
JSR .GBASCALC ;CALC BASE ADR IN GBASL,H
PLP ;RESTORE LSB FROM CARRY
LDA #$0F ;MASK $0F IF EVEN
BCC .RTMASK
ADC #$E0 ;MASK $F0 IF ODD
.RTMASK STA .MASK
.PLOT1 LDA (.GBASL),Y ;DATA
EOR .COLOR ; EOR COLOR
AND .MASK ; AND MASK
EOR (.GBASL),Y ; EOR DATA
STA (.GBASL),Y ; TO DATA
RTS
.VLINEZ ADC #$01 ;NEXT Y-COORD
.VLINE PHA ; SAVE ON STACK
JSR .PLOT ; PLOT SQUARE
PLA
CMP .V2 ;DONE?
BCC .VLINEZ ; NO, LOOP
.RTS1 RTS
.CLRSCR LDY #$2F ;MAX Y, FULL SCRN CLR
BNE .CLRSC2 ;ALWAYS TAKEN
.CLRTOP LDY #$27 ;MAX Y, TOP SCREEN CLR
.CLRSC2 STY .V2 ;STORE AS BOTTOM COORD
; FOR VLINE CALLS
LDY #$27 ;RIGHTMOST X-COORD (COLUMN)
.CLRSC3 LDA #$00 ;TOP COORD FOR VLINE CALLS
STA .COLOR ;CLEAR COLOR (BLACK)
JSR .VLINE ;DRAW VLINE
DEY ;NEXT LEFTMOST X-COORD
BPL .CLRSC3 ;LOOP UNTIL DONE
RTS
.GBASCALC PHA ;FOR INPUT 000DEFGH
LSR
AND #$03
ORA #$04 ; GENERATE GBASH=000001FG
STA .GBASH
PLA ; AND GBASL=HDEDE000
AND #$18
BCC .GBCALC
ADC #$7F
.GBCALC STA .GBASL
ASL
ASL
ORA .GBASL
STA .GBASL
RTS
PRNTYX TYA
.PRNTAX JSR PRBYTE ;OUTPUT TARGET ADR
.PRNTX TXA ; OF BRANCH AND RETURN
JMP PRBYTE
.INIT LDA #$00 ;CLR STATUS FOR DEBUG
STA .STATUS ; SOFTWARE
LDA .LORES
LDA .LOWSCR ;INIT VIDEO MODE
.SETTXT LDA .TXTSET ;SET FOR TEXT MODE
LDA #$00 ; FULL SCREEN WINDOW
BEQ .SETWND
.SETGR LDA .TXTCLR ;SET FOR GRAPHICS MODE
LDA .MIXSET ; LOWER 4 LINES AS
JSR .CLRTOP ; TEXT WINDOW
LDA #$14
.SETWND STA .WNDTOP ;SET FOR 40 COL WINDOW
LDA #$00 ; TOP IN A-REG,
STA .WNDLFT ; BTTM AT LINE 24
LDA #$28
STA .WNDWDTH
LDA #$18
STA .WNDBTM ; VTAB TO ROW 23
LDA #$17
.TABV STA .CV ;VTABS TO ROW IN A-REG
JMP .VTAB
.BASCALC PHA ;CALC BASE ADR IN BASL,H
LSR ; FOR GIVEN LINE NO
AND #$03 ; 0<=LINE NO.<=$17
ORA #$04 ;ARG=000ABCDE, GENERATE
STA .BASH ; BASH=000001CD
PLA ; AND
AND #$18 ; BASL=EABAB000
BCC .BSCLC2
ADC #$7F
.BSCLC2 STA .BASL
ASL
ASL
ORA .BASL
STA .BASL
RTS
.BELL1 CMP #$87 ;BELL CHAR? (CNTRL-G)
BNE .RTS2B ; NO, RETURN
LDA #$40 ;DELAY .01 SECONDS
JSR .WAIT
LDY #$C0
.BELL2 LDA #$0C ;TOGGLE SPEAKER AT
JSR .WAIT ; 1 KHZ FOR .1 SEC.
LDA .SPKR
DEY
BNE .BELL2
.RTS2B RTS
.STOADV LDY .CH ;CURSOR H INDEX TO Y-REG
STA (.BASL),Y ;STORE CHAR IN LINE
.ADVANCE INC .CH ;INCREMENT CURSOR H INDEX
LDA .CH ; (MOVE RIGHT)
CMP .WNDWDTH ;BEYOND WINDOW WIDTH?
BCS .CR ; YES CR TO NEXT LINE
.RTS3 RTS ; NO,RETURN
.VIDOUT CMP #$A0 ;CONTROL CHAR?
BCS .STOADV ; NO,OUTPUT IT.
TAY ;INVERSE VIDEO?
BPL .STOADV ; YES, OUTPUT IT.
CMP #$8D ;CR?
BEQ .CR ; YES.
CMP #$8A ;LINE FEED?
BEQ .LF ; IF SO, DO IT.
CMP #$88 ;BACK SPACE? (CNTRL-H)
BNE .BELL1 ; NO, CHECK FOR BELL.
.BS DEC .CH ;DECREMENT CURSOR H INDEX
BPL .RTS3 ;IF POS, OK. ELSE MOVE UP
LDA .WNDWDTH ;SET CH TO WNDWDTH-1
STA .CH
DEC .CH ;(RIGHTMOST SCREEN POS)
.UP LDA .WNDTOP ;CURSOR V INDEX
CMP .CV
BCS .RTS4 ;IF TOP LINE THEN RETURN
DEC .CV ;DEC CURSOR V-INDEX
.VTAB LDA .CV ;GET CURSOR V-INDEX
.VTABZ JSR .BASCALC ;GENERATE BASE ADR
ADC .WNDLFT ;ADD WINDOW LEFT INDEX
STA .BASL ;TO BASL
.RTS4 RTS
.CLEOP1 PHA ;SAVE CURRENT LINE ON STK
JSR .VTABZ ;CALC BASE ADDRESS
JSR .CLEOLZ ;CLEAR TO EOL, SET CARRY
LDY #$00 ;CLEAR FROM H INDEX=0 FOR REST
PLA ;INCREMENT CURRENT LINE
ADC #$00 ;(CARRY IS SET)
CMP .WNDBTM ;DONE TO BOTTOM OF WINDOW?
BCC .CLEOP1 ; NO, KEEP CLEARING LINES
BCS .VTAB ; YES, TAB TO CURRENT LINE
HOME LDA .WNDTOP ;INIT CURSOR V
STA .CV ; AND H-INDICES
LDY #$00
STY .CH ;THEN CLEAR TO END OF PAGE
BEQ .CLEOP1
.CR LDA #$00 ;CURSOR TO LEFT OF INDEX
STA .CH ;(RET CURSOR H=0)
.LF INC .CV ;INCR CURSOR V(DOWN 1 LINE)
LDA .CV
CMP .WNDBTM ;OFF SCREEN?
BCC .VTABZ ; NO, SET BASE ADDR
DEC .CV ;DECR CURSOR V (BACK TO BOTTOM)
.SCROLL LDA .WNDTOP ;START AT TOP OF SCRL WNDW
PHA
JSR .VTABZ ;GENERATE BASE ADR
.SCRL1 LDA .BASL ;COPY BASL,H
STA .BAS2L ; TO BAS2L,H
LDA .BASH
STA .BAS2H
LDY .WNDWDTH ;INIT Y TO RIGHTMOST INDEX
DEY ; OF SCROLLING WINDOW
PLA
ADC #$01 ;INCR LINE NUMBER
CMP .WNDBTM ;DONE?
BCS .SCRL3 ; YES, FINISH
PHA
JSR .VTABZ ;FORM BASL,H (BASE ADDR)
.SCRL2 LDA (.BASL),Y ;MOVE A CHR UP ON LINE
STA (.BAS2L),Y
DEY ;NEXT CHAR OF LINE
BPL .SCRL2
BMI .SCRL1 ;NEXT LINE (ALWAYS TAKEN)
.SCRL3 LDY #$00 ;CLEAR BOTTOM LINE
JSR .CLEOLZ ;GET BASE ADDR FOR BOTTOM LINE
BCS .VTAB ;CARRY IS SET
.CLREOL LDY .CH ;CURSOR H INDEX
.CLEOLZ LDA #$A0
.CLEOL2 STA (.BASL),Y ;STORE BLANKS FROM 'HERE'
INY ; TO END OF LINES (WNDWDTH)
CPY .WNDWDTH
BCC .CLEOL2
RTS
.WAIT SEC
.WAIT2 PHA
.WAIT3 SBC #$01
BNE .WAIT3 ;1.0204 USEC
PLA ;(13+27/2*A+5/2*A*A)
SBC #$01
BNE .WAIT2
RTS
KEYIN INC .RNDL
BNE .KEYIN2 ;INCR RND NUMBER
INC .RNDH
.KEYIN2 BIT .KBD ;KEY DOWN?
BPL KEYIN ; LOOP
STA (.BASL),Y ;REPLACE FLASHING SCREEN
LDA .KBD ;GET KEYCODE
BIT .KBDSTRB ;CLR KEY STROBE
RTS
CROUT LDA #$8D
BNE COUT
PRBYTE PHA ;PRINT BYTE AS 2 HEX
LSR ; DIGITS, DESTROYS A-REG
LSR
LSR
LSR
JSR .PRHEXZ
PLA
.PRHEX AND #$0F ;PRINT HEX DIG IN A-REG
.PRHEXZ ORA #$B0 ; LSB'S
CMP #$BA
BCC COUT
ADC #$06
COUT JMP (.CSWL) ;VECTOR TO USER OUTPUT ROUTINE
COUT1 CMP #$A0
BCC .COUTZ ;DON'T OUTPUT CTRL'S INVERSE
AND .INVFLG ;MASK WITH INVERSE FLAG
.COUTZ STY .YSAV1 ;SAV Y-REG
PHA ;SAV A-REG
JSR .VIDOUT ;OUTPUT A-REG AS ASCII
PLA ;RESTORE A-REG
LDY .YSAV1 ; AND Y-REG
RTS ; THEN RETURN
.SETNORM LDY #$FF ;SET FOR NORMAL VID
.SETIFLG STY .INVFLG
RTS
.SETKBD LDA #$00 ;SIMULATE PORT #0 INPUT
.INPORT STA .A2L ; SPECIFIED (KEYIN ROUTINE)
.INPRT LDX #.KSWL
LDY #<KEYIN
BNE .IOPRT
.SETVID LDA #$00 ;SIMULATE PORT #0 OUTPUT
.OUTPORT STA .A2L ; SPECIFIED (COUT1 ROUTINE)
.OUTPRT LDX #.CSWL
LDY #<COUT1
.IOPRT LDA .A2L ;SET RAM IN/OUT VECTORS
AND #$0F
BEQ .IOPRT1
ORA #>.IOADR
LDY #$00
BEQ .IOPRT2
.IOPRT1 LDA #>COUT1
.IOPRT2 STY .LOC0,X
STA .LOC1,X
RTS
RESET JSR .SETNORM ;SET SCREEN MODE
JSR .INIT ; AND INIT KBD/SCREEN
JSR .SETVID ; AS I/O DEV'S
JSR .SETKBD
CLD ;MUST SET HEX MODE!
RTS
} ; monitor