mirror of
https://github.com/zellyn/a2audit.git
synced 2024-11-24 11:31:01 +00:00
2a0b0da1b2
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.
304 lines
9.3 KiB
NASM
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
|