mirror of
https://github.com/zellyn/a2audit.git
synced 2024-11-21 22:32:23 +00:00
491 lines
11 KiB
NASM
491 lines
11 KiB
NASM
;;; Apple II video audit routines
|
|
;;; Copyright © 2017 Zellyn Hunter <zellyn@gmail.com>
|
|
|
|
!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
|
|
|
|
;;; Main loop over test data. Quit when high addr of text to be printed is $ff.
|
|
---
|
|
jsr RESETALL
|
|
jsr HOME
|
|
jsr .this
|
|
sta getch+1
|
|
jsr .next
|
|
sta getch+2
|
|
cmp #$ff
|
|
beq .done
|
|
jsr getch
|
|
|
|
jsr YNESCSPACE
|
|
cmp #$9B
|
|
beq .done
|
|
|
|
jsr .next
|
|
jsr .load400aux
|
|
jsr .load400
|
|
|
|
jsr .load2000aux
|
|
jsr .load2000
|
|
|
|
ldx #0
|
|
|
|
-- ;; Loop back and forth between modes as "space" is pressed.
|
|
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
|
|
|
|
foo !text "FOOBAR",$8D,$0
|
|
|
|
.testdata
|
|
;; Aux lores even/odd, lores even/odd, aux hires even/odd, hires even/odd, mode 1, mode 2
|
|
|
|
!ifndef SKIP {
|
|
;; 40COL and 80COL Text, inverse space.
|
|
+string
|
|
!text "40-COL AND 80-COL TEXT INVERSE SPACES:",$8D
|
|
!text "ALL WHITE, WITH 1/80 SHIFT LEFT"
|
|
+stringed
|
|
!byte $20, $20, $20, $20, 0, 0, 0, 0, .md_text, .md_text | .md_80col
|
|
|
|
;; LORES patterns that correspond to HIRES patterns.
|
|
+string
|
|
!text "LORES VIOLET, HIRES VIOLET:SAME"
|
|
+stringed
|
|
!byte 0, 0, $33, $33, 0, 0, $55, $2a, 0, .md_hires ; purple
|
|
+string
|
|
!text "LORES GREEN, HIRES GREEN:SAME"
|
|
+stringed
|
|
!byte 0, 0, $cc, $cc, 0, 0, $2a, $55, 0, .md_hires ; green
|
|
+string
|
|
!text "LORES LIGHT BLUE, HIRES LIGHT BLUE:SAME"
|
|
+stringed
|
|
!byte 0, 0, $66, $66, 0, 0, $d5, $aa, 0, .md_hires ; light blue
|
|
+string
|
|
!text "LORES ORANGE, HIRES ORANGE:LEFT",$8D
|
|
!text "EDGE SHIFTS RIGHT A COUPLE OF PIXELS"
|
|
+stringed
|
|
!byte 0, 0, $99, $99, 0, 0, $aa, $d5, 0, .md_hires ; orange - left column should budge
|
|
|
|
;; LORES patterns and corresponding DBL HIRES patterns.
|
|
+string
|
|
!text "LORES AND DBL HIRES DARK MAGENTA:SHIFT",$8D
|
|
!text "LEFT"
|
|
+stringed
|
|
!byte 0, 0, $11, $11, $88, $22, $11, $44, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES DARK BLUE:SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $22, $22, $11, $44, $22, $88, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES VIOLET:SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $33, $33, $99, $66, $33, $cc, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES DARK BLUEGREEN:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $44, $44, $22, $88, $44, $11, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES GRAY $5:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $55, $55, $aa, $aa, $55, $55, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES BLUE:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $66, $66, $33, $cc, $66, $99, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES LIGHT BLUE:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $77, $77, $bb, $ee, $77, $dd, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES DARK BROWN:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $88, $88, $44, $11, $88, $22, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES ORANGE:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $99, $99, $cc, $33, $99, $66, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES GRAY $A:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $aa, $aa, $55, $55, $aa, $aa, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES LIGHT MAGENTA:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $bb, $bb, $dd, $77, $bb, $ee, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES GREEN:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $cc, $cc, $66, $99, $cc, $33, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES LIGHT BROWN:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $dd, $dd, $ee, $bb, $dd, $77, 0, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "LORES AND DBL HIRES LIGHT BLUEGREEN:",$8D
|
|
!text "SHIFT LEFT"
|
|
+stringed
|
|
!byte 0, 0, $ee, $ee, $77, $dd, $ee, $bb, 0, .md_hires | .md_80col | .md_an3off
|
|
|
|
;; DBL LORES patterns and corresponding DBL HIRES patterns.
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES DARK MAGENTA:",$8D
|
|
!text "SAME"
|
|
+stringed
|
|
!byte $88, $88, $11, $11, $88, $22, $11, $44, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES DARK BLUE:SAME"
|
|
+stringed
|
|
!byte $11, $11, $22, $22, $11, $44, $22, $88, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES VIOLET:SAME"
|
|
+stringed
|
|
!byte $99, $99, $33, $33, $99, $66, $33, $cc, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES DARK BLUEGREEN:",$8D
|
|
!text "SAME"
|
|
+stringed
|
|
!byte $22, $22, $44, $44, $22, $88, $44, $11, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES GRAY $5:SAME"
|
|
+stringed
|
|
!byte $aa, $aa, $55, $55, $aa, $aa, $55, $55, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES BLUE:SAME"
|
|
+stringed
|
|
!byte $33, $33, $66, $66, $33, $cc, $66, $99, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES LIGHT BLUE:SAME"
|
|
+stringed
|
|
!byte $bb, $bb, $77, $77, $bb, $ee, $77, $dd, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES DARK BROWN:SAME"
|
|
+stringed
|
|
!byte $44, $44, $88, $88, $44, $11, $88, $22, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES ORANGE:SAME"
|
|
+stringed
|
|
!byte $cc, $cc, $99, $99, $cc, $33, $99, $66, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES GRAY $A:SAME"
|
|
+stringed
|
|
!byte $55, $55, $aa, $aa, $55, $55, $aa, $aa, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES LIGHT MAGENTA:",$8D
|
|
!text "SAME"
|
|
+stringed
|
|
!byte $dd, $dd, $bb, $bb, $dd, $77, $bb, $ee, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES GREEN:SAME"
|
|
+stringed
|
|
!byte $66, $66, $cc, $cc, $66, $99, $cc, $33, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES LIGHT BROWN:SAME"
|
|
+stringed
|
|
!byte $ee, $ee, $dd, $dd, $ee, $bb, $dd, $77, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
+string
|
|
!text "DBL LORES AND DBL HIRES LIGHT BLUEGREEN:",$8D
|
|
!text "SAME"
|
|
+stringed
|
|
!byte $77, $77, $ee, $ee, $77, $dd, $ee, $bb, .md_80col | .md_an3off, .md_hires | .md_80col | .md_an3off
|
|
|
|
} ; ifndef SKIP
|
|
|
|
;; Tests that LORES stays the same in 80COL mode if AN3 is on.
|
|
;; OpenEmulator bug: https://github.com/OpenEmulatorProject/libemulation/issues/24
|
|
|
|
+string
|
|
!text "LIGHT BROWN:LORES VS 80-COL+AN3 ON.",$8D,$8D
|
|
!text "SHOULD STAY IN 40-COL GRAPHICS MODE AND",$8D
|
|
!text "*NOT* SHOW BLACK VERTICAL STRIPES OF",$8D
|
|
!text "80-COL AUXMEM."
|
|
+stringed
|
|
!byte 0, 0, $dd, $dd, $0, $0, $0, $0, 0, .md_80col
|
|
|
|
+string
|
|
!text "LIGHT MAGENTA:LORES VS 80-COL+AN3 ON,",$8D
|
|
!text "MIXED GRAPHICS AND TEXT",$8D
|
|
!text "GRAPHICS PART SHOULD STAY IN 40-COL",$8D
|
|
!text "GRAPHICS MODE AND *NOT* SHOW VERTICAL",$8D
|
|
!text "STRIPES OF 80-COL AUXMEM.",$8D,$8D
|
|
!text "BOTTOM FOUR ROWS SHOULD START OUT AS",$8D
|
|
!text "SEMI-COLONS (;;;) AND SWITCH TO 80-COL",$8D
|
|
!text "ASTERISKS AND SEMI-COLONS (*;*;*;)"
|
|
+stringed
|
|
!byte $aa, $aa, $bb, $bb, $0, $0, $0, $0, .md_mixed, .md_mixed | .md_80col
|
|
|
|
;; Tests that HIRES stays the same in 80COL mode if AN3 is on.
|
|
|
|
+string
|
|
!text "LIGHT BLUE:HIRES VS 80-COL+AN3 ON.",$8D,$8D
|
|
!text "SHOULD STAY IN 40-COL GRAPHICS MODE AND",$8D
|
|
!text "*NOT* SHOW BLACK VERTICAL STRIPES OF",$8D
|
|
!text "80-COL AUXMEM."
|
|
+stringed
|
|
!byte 0, 0, 0, 0, 0, 0, $d5, $aa, .md_hires, .md_hires | .md_80col
|
|
|
|
+string
|
|
!text "LIGHT BLUE:HIRES VS 80-COL+AN3 ON,",$8D
|
|
!text "MIXED GRAPHICS AND TEXT",$8D
|
|
!text "GRAPHICS PART SHOULD STAY IN 40-COL",$8D
|
|
!text "GRAPHICS MODE AND *NOT* SHOW VERTICAL",$8D
|
|
!text "STRIPES OF 80-COL AUXMEM.",$8D,$8D
|
|
!text "BOTTOM FOUR ROWS SHOULD START OUT AS",$8D
|
|
!text "SEMI-COLONS (;;;) AND SWITCH TO 80-COL",$8D
|
|
!text "ASTERISKS AND SEMI-COLONS (*;*;*;)"
|
|
+stringed
|
|
!byte $aa, $aa, $bb, $bb, 0, 0, $d5, $aa, .md_hires | .md_mixed, .md_hires | .md_mixed | .md_80col
|
|
|
|
!byte $ff, $ff
|
|
|
|
} ;video
|
|
|
|
!eof
|
|
|
|
LORES $1
|
|
DDDDDDD....... DDDDDDD.......
|
|
10001000100010 00100010001000
|
|
|
|
0010001
|
|
0100010
|
|
1000100
|
|
0001000
|