From a2992b28d612412717652c4b19fc795b5e123559 Mon Sep 17 00:00:00 2001 From: Zellyn Hunter Date: Sun, 19 Feb 2017 20:55:26 -0500 Subject: [PATCH] Working on video audit routines --- README.md | 8 +- audit/audit.asm | 49 ++++++-- audit/audit.dsk | Bin 143360 -> 143360 bytes audit/keyboard.asm | 39 ++++++ audit/notes.org | 9 ++ audit/video.asm | 291 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 387 insertions(+), 9 deletions(-) create mode 100644 audit/keyboard.asm create mode 100644 audit/video.asm diff --git a/README.md b/README.md index 94db172..218d266 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,9 @@ This repository contains routines to audit Apple II computers (II, II+, IIe, IIc), providing information about hardware, ROM versions, RAM configuration, and behavior. +The file to download and try is +[audit/audit.dsk](https://github.com/zellyn/a2audit/blob/master/audit/audit.dsk). + Eventually, it should comprise a complete emulator test suite, enabling emulator writers to systematically identify and eliminate software-testable differences from real hardware. If a difference @@ -28,6 +31,7 @@ Error messages can be viewed at - [x] Add testcases for Cxxx testing - [x] duplicate HOME and COUT routines from AppleII, so IIe tests don't depend on Cxxx ROM working +- [x] Some simple "same result from two different modes" graphics tests ### TODO @@ -36,6 +40,9 @@ Error messages can be viewed at - [ ] IIe: don't test auxmem softswitches if we only have 64k - [ ] weirder softswitch behavior corner cases - [ ] floating-bus tests +- [ ] dbl lores tests +- [ ] weird lores tests +- [ ] undelayed hires tests ## Raison d'être @@ -43,4 +50,3 @@ This test suite is a step on the way to implementing Apple IIe (enhanced) support in [OpenEmulator](http://openemulatorproject.github.io/): I may alternate adding tests here and features there. - diff --git a/audit/audit.asm b/audit/audit.asm index aaed050..8ded3b0 100644 --- a/audit/audit.asm +++ b/audit/audit.asm @@ -18,8 +18,19 @@ CSW = $36 KSW = $38 + + + PCL=$3A PCH=$3B + A1L=$3C + A1H=$3D + A2L=$3E + A2H=$3F + A3L=$40 + A3H=$41 + A4L=$42 + A4H=$43 ;; SHASUM locations !addr SRC = $06 @@ -34,6 +45,10 @@ !addr tmp5 = $fe !addr tmp6 = $ff + ;; Ports to read + KBD = $C000 + KBDSTRB = $C010 + ;; Softswitch locations. RESET_80STORE = $C000 SET_80STORE = $C001 @@ -74,22 +89,25 @@ RESET_MIXED = $C052 SET_MIXED = $C053 READ_MIXED = $C01B - + RESET_PAGE2 = $C054 SET_PAGE2 = $C055 READ_PAGE2 = $C01C - + RESET_HIRES = $C056 SET_HIRES = $C057 READ_HIRES = $C01D + RESET_AN3 = $C05E + SET_AN3 = $C05F + RESET_INTC8ROM = $CFFF ;; Readable things without corresponding set/reset pairs. READ_HRAM_BANK2 = $C011 READ_HRAMRD = $C012 READ_VBL = $C019 - + ;; Monitor locations. ;HOME = $FC58 ;COUT = $FDED @@ -99,8 +117,11 @@ ;PRBYTE = $FDDA ;PRNTYX = $F940 - STRINGS = $7000 - !set LASTSTRING = $7000 + AUXMOVE = $C311 ; Move from (A1L/H - A2L/H) to (A4L/H) Carry set: main->aux + MOVE = $FE2C ; Move to (A4L/H) from (A1L/H) through (A2L,H) + + STRINGS = $8000 + !set LASTSTRING = STRINGS ;; Printing and error macros. !src "macros.asm" @@ -109,7 +130,7 @@ main: ;; Initialize stack to the top. ldx #$ff txs - + jsr standard_fixup jsr RESET @@ -121,6 +142,8 @@ main: ;; Detection and reporting of model and memory. !src "detect.asm" + ; SKIP = 1 + !ifndef SKIP { ;; Language card tests. jsr LANGCARDTESTS @@ -133,6 +156,14 @@ main: ;; ROM SHA-1 checks. ;; jsr SHASUMTESTS - do this later, because it's SLOW! + ;; Keyboard tests: for now, just check we can press 'Y', 'N', SPACE, or ESC + jsr KEYBOARDTESTS + + } ; if SKIP + + ;; Video tests. + jsr VIDEOTESTS + end: +print !text "END" @@ -145,6 +176,8 @@ end: !src "softswitch.asm" !src "resetall.asm" !src "monitor-routines.asm" + !src "keyboard.asm" + !src "video.asm" ;!src "shasumtests.asm" print @@ -238,7 +271,7 @@ standard_fixup: rts COPYTOAUX - ;; Use AUXMOVE routine to copy the whole program to AUX memory. + ;; Use our own versino of AUXMOVE routine to copy the whole program to AUX memory. jsr RESETALL lda #vlxXwrkfEZY8rpM0srqNlLD!$)!no=$P)v;h;O#dpvWR2HSmqH|ayRoN({w z_x*mp@89p&;P_1E_)OQ+H1CBSFYbJ4*UP{Djos1F+2y2ndk;{*wePJX2hcmM2CcwJ zlDVJ_<=WsYOo}7uwPtj&#ex>wHVmqn$GkmC=5a5EPhj|@44=aAX&KJJFiVEdWB5xM z&c!fWhMO>~2dH8QuZ1DK7S}4;zQVPdUfG{;jdR3-6`_zgetqSK;xR}vx znP2l=GoMSBKrVgg}K`0CfkHWt+~lxXS1XS2_KYzQx^E#okIaveA+fy+9*7 zy|-LBa6I|m_y9sJXbE!E8nF0(3{+r{lX4;l z!R|>?sZ^=>dDHAE4N0=BHW#u!qAgk_hXkq$s0$zg-E>}ga`m(7UO3Y;M(2HxU=HdQ zmCmk2flu$0L-4~ZAz7$+t#1B`DKUE1aOCD|QaPsUC!u}?uT9kt=KFPdx5?%T zNK>ie^|(;nO1Vn#pi=S~=_=(8i@Lm@VWo2 zSE7HsF9|zk_qa1jCt%x-(Cy8VAk$S>{zHlG z$qCobJx*5=-zGdR1}B|4nNyWhaxn9b(oRUqV8r+HJbW(J!jUQLf+JJYP(2J{p`ec`s={8M( zvZNLbccD+atdIzp>d{wV%5%&z75b(Nl9&fcEM`B>EU@pf?$5%h zG%w#`e7%XFi5|su(!8SqlGmbxoz<4tYtdgiVWR*`S~gIr=fk+Y0a44xFo?qgMLYNE z9aCwB#2C8V$&Sn^+qAF&t=xh>v7#fb=}g=$X@DON zA@TFET^Gho6QNt$`FTgGor#VgwG&vgTck?2C_CND-pM!60EOOYg`YZzaG*`??oO{8 z-?`$mPzqcLY{^_izQ*1^x76<7Yi{G$GV3VN@IHo6p*0Su(x66l4rz{1)1yXDIAELp z+yNfM3@C?0n;qu44T7d8S5%{&Sox|0zQeti5=dYK9P;Gc z^SxQQ-bxMfQszku7}=F5CR-_bv{D92I;0b*paTqU??BVPZ}=rliH)~0r8bLuiEXUJ zCMw5DZN0?VB{mC!4*?%iPY_jA1W{i>s0bn)CWwl9jJ9qih|vLz4jm$hfl-Wda=J@$ z))PepQDO&B(v4wN)uF9bVT{&;WPJ`s_4NY-_4OES1>M#|812|`dThs4jJko~2cw?XkTR~=J*0fuh``X9Ww1bQL z+NWLI)sCLr4fl>b0gLWMH}M%$N4W`+*+ALdM4WjT7MB?_l}d#tm>P;%OSv@6Ba}Gu*Y5sOIg!0HaEypq6rlKa-|8 z3n-XexA>iPP-&h=@ipcJ+s*U0v$51uf23%@*BhoLa5 zU6fo}VYm1t{*iou%Cl=E0~`XSxqrK$6m5JZc;X$f_n{-hb(Cm?o(ylGL<2Ns_+d)a zL0g8+lvIsxQJErX;3_k3-<~4QtT26MB^xP$S>}F(qBZV~6s@(uMZvDlMp_7oIwhA2f_Jgt-C2U; zSn&QV!3S6{G!#sk{4LeY=&<}|#|ujEXciTg=FN;Iom-0Wbm3A3WMD5`2E&t!IOmIe zBfep-Zz$*)!mP7>$B)Z1kV}Al5zicFc; zY(B2fKZuiMKPfWdw%jZ--2odWjECqG#c+@lgjDM31t*3_Q@a;VfoxeN?aq@W@6~*XCJl!fm@Z)HhXTRa}`?VJNWK4J2;MZEwaA&mkO#R8yeDh}_fi?-{)a~T`!U5{~(2Jek zfm__-!tw98C4$=>ZV?+)t3J9_d?d2FZk@*1Vj`hY68kdoOVW)xSXAAKje0px9pXxILEg}j{mq@e^5u;Ox$*FowJ`h65?v?c5@9^<9-EFo^tJFfoZG! zP)t4;lMleWX%6{EG5Nt5`iF2gy@?zW9;T5Mv0_YGgOJcif3M`hP7mU0-B=RP;X}Ii z;BaT8maC7{aXSWXIO#n?rnU{11T`A{JcvTUQ+4zkL-X&>y#b2{od`y#x;>g12|>*s zAxmlWyC8}L&lUz2uvrd9NT7w+m~fxz`CF*YT4^1yp5dCJHT#-xYC2GJrpA4QY(--o z-c)1%zun?al@hlfZxpvfAI<3Vj+3PVW3FsG-GRRGh{Tz>ur*pJwTJr_HXHT|-M%VJ2$`!x#f;I#j6^Zx%_}lC+rv~5HWK}hHx1sSdG)v8 z71^LtEpBvw(COyL=crT7X5@47ju>x=q4M^16#UWfCtWWS2~_^mcH0tC0SGvP7rBIO zHZXZ%0$^epHWC`}a?Y(#1S~j)fjq)fOna!{Q%r+qWDf$VTZ7Vl93ypb7Rk!xWx}uA zGq`Rv?~E|z?R^wUlC;TWl1g|o#vj5w`j!f=<;}4bFc74n4QU-uuY^s--byiS1l(Ut zgd4f+F5eKBAKBN9e~oh6JvB>I8nfzrX-8O-AG0m z$*h2FS>8 z;>E83Ar?kXDg0L^d11(AR+%hO(tIsc58vzQsp8f7lcsk^jUG%RrT zs>6@AFNWT6{7%=*W37>^&W?_? zM^(MB@!i%NnaBH>gc;)xCI|`w3XG#^TQ{&Obz%+I?>CsL|1=wOd) zS~%p`_V_m*-WEeQv_XT&@i^FQkim+c0$==Ldh(L8S7TaHq(|E<_boq<^uP{YRRCjk zD@ymEzw~&43543v7Z56m{B{%iss~7{2NIiw8AnCvY42&G{ZG$$Pm}HZ7$lDp=_fB~ zl~AJ<{rWJf=#CP&+1=eZmEMo*rNd)Tb(Q1(qT|v3=U7#Mj8z3a;}b>46T0KimQqFu zWdT0a4Uair@emx*PhBQmU2Q<#f?n!walg`v-s*7W8W!`kPdU? zVlp9Aa-&^rlZlw?4{f|8$R!nzg0!D^8Pevvu8|gWT`8BTDA&4cbPX@OhP;0CGKdBP7ZOL3ksq1^%KxzvpI2edWH zo_;fWAONfOkpM)icIbgbhXXEao5J*8r<&0*Y^;v zLV`y!pwFYcAy#r-teHW-@Vge=5cB|zvU(KNZ_(^%KA;VwiY^Ff>_QAIB3F~oIDu(P zPxu_R{G^}8Xz;9+9e$3H*Z75Fl{FSP#o?ozaJF(^{iJV%Abv%>I_W#9e&r$wt5`oW z>3fwRPO4vf2Wb}^`}TmZ>(WtSBXV1-9 zVBdv>#++d;Gq59BB8)PrY7vVPRR6}CV(xdyvWKlN)j6mzE0omLhr()b{P<{PgcxMB@(GrGL_WLlc{(TyL~dLuVro38 zk24cFF`F{*N!@Gl>5mt|M9|%d}GV=yr)rsGOROsCS~>z~9kiw=Ot zr>3ukXIbGueceW22Y%;tzK{_Q!17{!`N1$Ni;3vqpqzMnbo89g6@Ygz@XiWg2m|k} z0N%&I=xE9a`M^+OBCX$rx%z6XYvqn@o0fGgax***?Wm!EL1@QzP+srhLOk77O+`ns*ZF~=AzeUFW|q}cLm4a#o~fcRy7zfqyEnxpJ@rbW zk`Zods3-}uD=dPmq59rykfoZdvdpr{crGp{CzX#=8NH-98dt`P3qy!DR5`+ITpUOY zVzR=Y8>+A@R~xFD!mK)u=P<6S<0(;54C=)PQ5~N$mR>58)Fbyd>Vh6^bYj&`G@`Au zY$Be)t4d#XVs1hlPl&)15`jmu5$y`IMvGudOk{Gn+L8vqX0bA?nWU2AjkxlrT9^;e zZ({P(bGUN!?e{;@xeX5)_aXgxmYvGPF935$t|U{LoHF{U?xrXyF_oSgkLQ$$jF^Z| z>iidLUCd&3qW&^Wsp`aJt|*nFByctC=frXt@6qe2%vd~=NF^n`sgIj#OxWjHa_0$h LC;9u*on`+8pW%_e diff --git a/audit/keyboard.asm b/audit/keyboard.asm new file mode 100644 index 0000000..899e4bf --- /dev/null +++ b/audit/keyboard.asm @@ -0,0 +1,39 @@ +;;; Apple II keyboard and keyboard audit routines +;;; Copyright © 2017 Zellyn Hunter + + !zone keyboard { +KEYBOARDTESTS + +print + !text "PRESS 'Y', 'N', SPACE, OR ESC",$8D + +printed + jsr YNESCSPACE + rts + +YNESCSPACE + lda KBDSTRB +-- lda KBD + bpl -- + sta KBDSTRB + cmp #$a0 ; SPACE: bmi/bcc + bne + + clc + lda #$a0 + rts ++ cmp #$9B ; ESC: bmi/bcs + bne + + sec + lda #$9B + rts ++ and #$5f ; mask out lowercase + cmp #$59 ; 'Y': bpl/bcc + bne + + clc + lda #$59 + rts ++ cmp #$4e ; 'N': bpl/bcs + bne -- + sec + lda #$4e + rts + +} ;keyboard diff --git a/audit/notes.org b/audit/notes.org index 8342a44..e3487ed 100644 --- a/audit/notes.org +++ b/audit/notes.org @@ -24,6 +24,7 @@ D76E 65 * TODOs and Links to things to test ** TODO [[https://groups.google.com/d/msg/comp.sys.apple2/RMnus8p6xp8/TDfD2HVtDwAJ][csa2: question on HGR behavior with enhanced 128K Apple //e]] ** TODO Check whether c8-cf sticks after reading c3xx but c3 is only active due to the whole c3 ROM switch +** TODO Check whether reading cfff in various states returns floating bus or ROM contents * Language card operation @@ -202,3 +203,11 @@ Lores80 color differences: UtA2e: 8-29 +* Keyboard + +| Y | 217 | D9 | 59 | 11011001 | +| y | 249 | F9 | 79 | 11111001 | +| N | 206 | CE | 4E | 11001110 | +| n | 238 | EE | 6E | 11101110 | +| SPACE | 160 | A0 | 20 | 10100000 | +| ESC | 155 | 9B | 1B | 10011011 | diff --git a/audit/video.asm b/audit/video.asm new file mode 100644 index 0000000..1e01c1a --- /dev/null +++ b/audit/video.asm @@ -0,0 +1,291 @@ +;;; Apple II video audit routines +;;; Copyright © 2017 Zellyn Hunter + + !zone video { +VIDEOTESTS + + jsr RESETALL + + +print + !text "VIDEO TESTS:",$8D + !text "SPACE TO SWAP BETWEEN MODES",$8D + !text "Y/N TO LOG MODE EQUALITY & MOVE TO NEXT",$8D + !text "ESC TO SKIP TO END",$8D + !text "HIT SPACE TO START",$8D + +printed + +- jsr YNESCSPACE + bpl - + bcs - + + jsr .first + +--- + jsr RESETALL + jsr .load400aux + jsr .load400 + + jsr .load2000aux + jsr .load2000 + + ldx #0 +-- + jsr .setswitches + txa + eor #1 + tax + jsr YNESCSPACE + + bpl + + cmp #$a0 + beq -- + jmp .done ; ESC + ++ ;; 'Y' or 'N' + + jsr .next + jsr .next + cmp #$ff + bne --- + +.done jsr RESETALL + jsr HOME + rts + +.setswitches + jsr .thisx + + ;; 0: TEXT + lsr + bcs + + sta RESET_TEXT + bcc ++ ++ sta SET_TEXT + +++ ;; 1: MIXED + lsr + bcs + + sta RESET_MIXED + bcc ++ ++ sta SET_MIXED + +++ ;; 2: HIRES + lsr + bcs + + sta RESET_HIRES + bcc ++ ++ sta SET_HIRES + +++ ;; 3: 80COL + lsr + bcs + + sta RESET_80COL + bcc ++ ++ sta SET_80COL + +++ ;; 4: (NOT) AN3 + lsr + bcs + + sta SET_AN3 + bcc ++ ++ sta RESET_AN3 + +++ ;; 5: ALTCHRSET + lsr + bcs + + sta RESET_ALTCHRSET + bcc ++ ++ sta SET_ALTCHRSET + +++ ;; 6: PAGE2 + lsr + bcs + + sta RESET_PAGE2 + bcc ++ ++ sta SET_PAGE2 + +++ ;; 7: 80STORE + lsr + bcs + + sta RESET_80STORE + rts ++ sta SET_80STORE + rts + +.load + ;; A1L/A1H is start addr + ;; tmp0 is # pages + ;; tmp1 is even + ;; tmp2 is odd + + ;; During loop: + ;; PCL/PCH is looper + ;; y is index + ;; X is # pages + + lda A1L + sta PCL + lda A1H + sta PCH + ldx tmp0 + lda tmp1 + ldy #0 + +- sta (PCL),y + iny + iny + bne - + inc PCH + dex + bne - + + lda A1H + sta PCH + inc PCL + ldx tmp0 + lda tmp2 + ldy #0 + +- sta (PCL),y + iny + iny + bne - + inc PCH + dex + bne - + + rts + +;;; Read next even/odd values and store them for .load in tmp1/tmp2 +.evenodd + jsr .this + sta tmp1 + jsr .next + sta tmp2 + jsr .next + rts + +;;; Setup A1L, A1H, and tmp0 for fill of $400-$7FF +.set400 + lda #<$400 + sta A1L + lda #>$400 + sta A1H + lda #4 + sta tmp0 + rts + +;;; Setup A1L, A1H, and tmp0 for fill of $2000-$3fff +.set2000 + lda #<$2000 + sta A1L + lda #>$2000 + sta A1H + lda #$20 + sta tmp0 + rts + +.load400 + jsr .evenodd + jsr .set400 + jsr .load + rts + +.load400aux + jsr .evenodd + jsr .set400 + sta SET_RAMWRT + jsr .load + sta RESET_RAMWRT + rts + +.load2000 + jsr .evenodd + jsr .set2000 + jsr .load + rts + +.load2000aux + jsr .evenodd + jsr .set2000 + sta SET_RAMWRT + jsr .load + sta RESET_RAMWRT + rts + + +.first + lda #<.testdata + sta .thisx+1 + lda #>.testdata + sta .thisx+2 + rts +.next + lda .testdata + inc .thisx+1 + bne .this + inc .thisx+2 +.this ldx #0 +.thisx lda .testdata,x + rts + + ;; Mode bits: + ;; 0: TEXT + ;; 1: MIXED + ;; 2: HIRES + ;; 3: 80COL + ;; 4: (NOT) AN3 + ;; 5: ALTCHRSET + ;; 6: PAGE2 + ;; 7: 80STORE + .md_text = $01 + .md_mixed = $02 + .md_hires = $04 + .md_80col = $08 + .md_an3off = $10 + .md_altchrset = $20 + .md_page2 = $40 + .md_80store = $80 + +.testdata + ;; Aux lores even/odd, lores even/odd, aux hires even/odd, hires even/odd, mode 1, mode 2 + + ;; 40COL and 80COL Text, inverse space. + !byte $20, $20, $20, $20, 0, 0, 0, 0, .md_text, .md_text | .md_80col + + ;; LORES patterns that correspond to HIRES patterns. + !byte 0, 0, $33, $33, 0, 0, $55, $2a, 0, .md_hires ; purple + !byte 0, 0, $cc, $cc, 0, 0, $2a, $55, 0, .md_hires ; green + !byte 0, 0, $66, $66, 0, 0, $d5, $aa, 0, .md_hires ; light blue + !byte 0, 0, $99, $99, 0, 0, $aa, $d5, 0, .md_hires ; orange - left column should budge + + ;; LORES patterns and corresponding DBL HIRES patterns. + !byte 0, 0, $11, $11, $88, $22, $11, $44, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $22, $22, $11, $44, $22, $88, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $33, $33, $99, $66, $33, $cc, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $44, $44, $22, $88, $44, $11, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $55, $55, $aa, $aa, $55, $55, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $66, $66, $33, $cc, $66, $99, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $77, $77, $bb, $ee, $77, $dd, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $88, $88, $44, $11, $88, $22, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $99, $99, $cc, $33, $99, $66, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $aa, $aa, $55, $55, $aa, $aa, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $bb, $bb, $dd, $77, $bb, $ee, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $cc, $cc, $66, $99, $cc, $33, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $dd, $dd, $ee, $bb, $dd, $77, 0, .md_hires | .md_80col | .md_an3off + !byte 0, 0, $ee, $ee, $77, $dd, $ee, $bb, 0, .md_hires | .md_80col | .md_an3off + + !byte $ff + +} ;video + + !eof + + LORES $1 + DDDDDDD....... DDDDDDD....... + 10001000100010 00100010001000 + + 0010001 + 0100010 + 1000100 + 0001000