The VIC II chip (video IC) that gives the C64 a lot of its characters (pun intended), includes registers to set up interrupts at certain raster lines. This allows for video tricks. Above the background color is changed in the middle of the screen, and changed back when in the borders before drawing the screen again.
Link: source code at github
This code was leveraged from my character editor source for c64. That project needed to display multiple different character sets (from ROM and RAM) on the screen simultaneously. And that is described at the bottom of an earlier blog post.
My approach was to launch Vice x64sc (Commodore 64 emulator) and utilize its built in monitor (ALT-H) to craft prototype code. The listings following are what I came up with. Then I used the clipboard to move to a source editor, added labels, and further refined to change from background colors to font changes.
Written by Dave VW 2024-04-27
*** NOTE THIS IS THE ROUGH DRAFT
*** SOURCE CODE AT GITHUB IS MUCH CLEANER
*** ASSEMBLY SOURCE INSTEAD OF MONITOR LISTING
This part was created in the monitor...
>C:c000 2c 19 d0 10 44 ea ad 19 d0 29 01 f0 3b 2c 00 c1
>C:c010 30 16 10 60 ea a9 00 8d 12 d0 ad 11 d0 29 7f 8d
>C:c020 11 d0 0e 00 c1 4c 3b c0 ce 21 d0 a9 a4 8d 12 d0
>C:c030 ad 11 d0 29 7f 8d 11 d0 4e 00 c1 a9 01 8d 19 d0
>C:c040 ea 68 a8 68 aa 68 40 00 ea 4c 31 ea a9 40 8d 00
>C:c050 c1 78 a9 80 8d 12 d0 ad 11 d0 29 7f 8d 11 d0 a9
>C:c060 00 8d 14 03 a9 c0 8d 15 03 ad 1a d0 09 01 8d 1a
>C:c070 d0 58 60 00 ad 12 d0 c9 c2 90 f9 a2 0a ca d0 fd
>C:c080 ee 21 d0 4c 15 c0
.C:c000 2C 19 D0 BIT $D019
.C:c003 10 44 BPL $C049
.C:c005 EA NOP
.C:c006 AD 19 D0 LDA $D019
.C:c009 29 01 AND #$01
.C:c00b F0 3B BEQ $C048
.C:c00d 2C 00 C1 BIT $C100
.C:c010 30 16 BMI $C028
.C:c012 10 60 BPL $C074
.C:c014 EA NOP
.C:c015 A9 00 LDA #$00
.C:c017 8D 12 D0 STA $D012
.C:c01a AD 11 D0 LDA $D011
.C:c01d 29 7F AND #$7F
.C:c01f 8D 11 D0 STA $D011
.C:c022 0E 00 C1 ASL $C100
.C:c025 4C 3B C0 JMP $C03B
.C:c028 CE 21 D0 DEC $D021
.C:c02b A9 A4 LDA #$A4
.C:c02d 8D 12 D0 STA $D012
.C:c030 AD 11 D0 LDA $D011
.C:c033 29 7F AND #$7F
.C:c035 8D 11 D0 STA $D011
.C:c038 4E 00 C1 LSR $C100
.C:c03b A9 01 LDA #$01
.C:c03d 8D 19 D0 STA $D019
.C:c040 EA NOP
.C:c041 68 PLA
.C:c042 A8 TAY
.C:c043 68 PLA
.C:c044 AA TAX
.C:c045 68 PLA
.C:c046 40 RTI
.C:c047 00 BRK
.C:c048 EA NOP
.C:c049 4C 31 EA JMP $EA31
.C:c04c A9 40 LDA #$40
.C:c04e 8D 00 C1 STA $C100
.C:c051 78 SEI
.C:c052 A9 80 LDA #$80
.C:c054 8D 12 D0 STA $D012
.C:c057 AD 11 D0 LDA $D011
.C:c05a 29 7F AND #$7F
.C:c05c 8D 11 D0 STA $D011
.C:c05f A9 00 LDA #$00
.C:c061 8D 14 03 STA $0314
.C:c064 A9 C0 LDA #$C0
.C:c066 8D 15 03 STA $0315
.C:c069 AD 1A D0 LDA $D01A
.C:c06c 09 01 ORA #$01
.C:c06e 8D 1A D0 STA $D01A
.C:c071 58 CLI
.C:c072 60 RTS
.C:c073 00 BRK
.C:c074 AD 12 D0 LDA $D012
.C:c077 C9 C2 CMP #$C2
.C:c079 90 F9 BCC $C074
.C:c07b A2 0A LDX #$0A
.C:c07d CA DEX
.C:c07e D0 FD BNE $C07D
.C:c080 EE 21 D0 INC $D021
.C:c083 4C 15 C0 JMP $C015
The initialization routine is at $c04c to install the new IRQ handler $c000. The code jumps around a bit and has NOP (no instruction) as a by-product of patching the source in the monitor to get the desired functionality. This is cleaned up a lot more in the sources to both repos.
No comments:
Post a Comment