diff --git a/README.md b/README.md index c4a4bda..94db172 100644 --- a/README.md +++ b/README.md @@ -26,9 +26,14 @@ Error messages can be viewed at - [x] softswitch reading tests - [x] Incorporate Cxxx testing into data-driven test - [x] Add testcases for Cxxx testing +- [x] duplicate HOME and COUT routines from AppleII, so IIe tests + don't depend on Cxxx ROM working ### TODO +- [ ] IIe: check that we really have 128K (aux switching actually does + anything) +- [ ] IIe: don't test auxmem softswitches if we only have 64k - [ ] weirder softswitch behavior corner cases - [ ] floating-bus tests diff --git a/audit/audit.asm b/audit/audit.asm index a5a6008..aaed050 100644 --- a/audit/audit.asm +++ b/audit/audit.asm @@ -91,13 +91,13 @@ READ_VBL = $C019 ;; Monitor locations. - HOME = $FC58 - COUT = $FDED - COUT1 = $FDF0 - KEYIN = $FD1B - CROUT = $FD8E - PRBYTE = $FDDA - PRNTYX = $F940 + ;HOME = $FC58 + ;COUT = $FDED + ;COUT1 = $FDF0 + ;KEYIN = $FD1B + ;CROUT = $FD8E + ;PRBYTE = $FDDA + ;PRNTYX = $F940 STRINGS = $7000 !set LASTSTRING = $7000 @@ -111,6 +111,7 @@ main: txs jsr standard_fixup + jsr RESET jsr HOME +print @@ -136,12 +137,14 @@ end: +print !text "END" +printed + jsr RESETALL jmp * !src "langcard.asm" !src "auxmem.asm" !src "softswitch.asm" !src "resetall.asm" + !src "monitor-routines.asm" ;!src "shasumtests.asm" print @@ -221,8 +224,6 @@ standard_fixup: ;; of CSW or KSW will be 0. ;; Fixup CSW - lda CSW - bne + ;; Point COUT at COUT1 lda #KEYIN sta KSW+1 -+ rts + rts COPYTOAUX ;; Use AUXMOVE routine to copy the whole program to AUX memory. diff --git a/audit/audit.dsk b/audit/audit.dsk index 670f753..373ad3e 100644 Binary files a/audit/audit.dsk and b/audit/audit.dsk differ diff --git a/audit/monitor-routines.asm b/audit/monitor-routines.asm new file mode 100644 index 0000000..50a0b63 --- /dev/null +++ b/audit/monitor-routines.asm @@ -0,0 +1,303 @@ +!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 #.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