|
12 | 12 | /* ------------------------------------ |
13 | 13 | * VIC-II registers. |
14 | 14 | * ------------------------------------ */ |
15 | | -.label BASE = $D000 |
16 | | -.label SPRITE_0_X = $D000 |
17 | | -.label SPRITE_0_Y = $D001 |
18 | | -.label SPRITE_1_X = $D002 |
19 | | -.label SPRITE_1_Y = $D003 |
20 | | -.label SPRITE_2_X = $D004 |
21 | | -.label SPRITE_2_Y = $D005 |
22 | | -.label SPRITE_3_X = $D006 |
23 | | -.label SPRITE_3_Y = $D007 |
24 | | -.label SPRITE_4_X = $D008 |
25 | | -.label SPRITE_4_Y = $D009 |
26 | | -.label SPRITE_5_X = $D00A |
27 | | -.label SPRITE_5_Y = $D00B |
28 | | -.label SPRITE_6_X = $D00C |
29 | | -.label SPRITE_6_Y = $D00D |
30 | | -.label SPRITE_7_X = $D00E |
31 | | -.label SPRITE_7_Y = $D00F |
32 | | -.label SPRITE_MSB_X = $D010 |
33 | | -.label CONTROL_1 = $D011 |
34 | | -.label RASTER = $D012 |
35 | | -.label LIGHTPEN_X = $D013 |
36 | | -.label LIGHTPEN_Y = $D014 |
37 | | -.label SPRITE_ENABLE = $D015 |
38 | | -.label CONTROL_2 = $D016 |
39 | | -.label SPRITE_EXPAND_Y = $D017 |
40 | | -.label MEMORY_CONTROL = $D018 |
41 | | -.label IRR = $D019 |
42 | | -.label IMR = $D01A |
43 | | -.label SPRITE_PRIORITY = $D01B |
44 | | -.label SPRITE_COL_MODE = $D01C |
45 | | -.label SPRITE_EXPAND_X = $D01D |
46 | | -.label SPRITE_2S_COLLISION = $D01E |
47 | | -.label SPRITE_2B_COLLISION = $D01F |
48 | | -.label BORDER_COL = $D020 |
49 | | -.label BG_COL_0 = $D021 |
50 | | -.label BG_COL_1 = $D022 |
51 | | -.label BG_COL_2 = $D023 |
52 | | -.label BG_COL_3 = $D024 |
53 | | -.label SPRITE_COL_0 = $D025 |
54 | | -.label SPRITE_COL_1 = $D026 |
55 | | -.label SPRITE_0_COLOR = $D027 |
56 | | -.label SPRITE_1_COLOR = $D028 |
57 | | -.label SPRITE_2_COLOR = $D029 |
58 | | -.label SPRITE_3_COLOR = $D02A |
59 | | -.label SPRITE_4_COLOR = $D02B |
60 | | -.label SPRITE_5_COLOR = $D02C |
61 | | -.label SPRITE_6_COLOR = $D02D |
62 | | -.label SPRITE_7_COLOR = $D02E |
63 | | - |
64 | | -.label COLOR_RAM = $D800 |
| 15 | +.label VIC2 = $D000 |
| 16 | +.label SPRITE_0_X = VIC2 + $00 |
| 17 | +.label SPRITE_0_Y = VIC2 + $01 |
| 18 | +.label SPRITE_1_X = VIC2 + $02 |
| 19 | +.label SPRITE_1_Y = VIC2 + $03 |
| 20 | +.label SPRITE_2_X = VIC2 + $04 |
| 21 | +.label SPRITE_2_Y = VIC2 + $05 |
| 22 | +.label SPRITE_3_X = VIC2 + $06 |
| 23 | +.label SPRITE_3_Y = VIC2 + $07 |
| 24 | +.label SPRITE_4_X = VIC2 + $08 |
| 25 | +.label SPRITE_4_Y = VIC2 + $09 |
| 26 | +.label SPRITE_5_X = VIC2 + $0A |
| 27 | +.label SPRITE_5_Y = VIC2 + $0B |
| 28 | +.label SPRITE_6_X = VIC2 + $0C |
| 29 | +.label SPRITE_6_Y = VIC2 + $0D |
| 30 | +.label SPRITE_7_X = VIC2 + $0E |
| 31 | +.label SPRITE_7_Y = VIC2 + $0F |
| 32 | +.label SPRITE_MSB_X = VIC2 + $10 |
| 33 | +.label CONTROL_1 = VIC2 + $11 |
| 34 | +.label RASTER = VIC2 + $12 |
| 35 | +.label LIGHTPEN_X = VIC2 + $13 |
| 36 | +.label LIGHTPEN_Y = VIC2 + $14 |
| 37 | +.label SPRITE_ENABLE = VIC2 + $15 |
| 38 | +.label CONTROL_2 = VIC2 + $16 |
| 39 | +.label SPRITE_EXPAND_Y = VIC2 + $17 |
| 40 | +.label MEMORY_CONTROL = VIC2 + $18 |
| 41 | +.label IRR = VIC2 + $19 |
| 42 | +.label IMR = VIC2 + $1A |
| 43 | +.label SPRITE_PRIORITY = VIC2 + $1B |
| 44 | +.label SPRITE_COL_MODE = VIC2 + $1C |
| 45 | +.label SPRITE_EXPAND_X = VIC2 + $1D |
| 46 | +.label SPRITE_2S_COLLISION = VIC2 + $1E |
| 47 | +.label SPRITE_2B_COLLISION = VIC2 + $1F |
| 48 | +.label BORDER_COL = VIC2 + $20 |
| 49 | +.label BG_COL_0 = VIC2 + $21 |
| 50 | +.label BG_COL_1 = VIC2 + $22 |
| 51 | +.label BG_COL_2 = VIC2 + $23 |
| 52 | +.label BG_COL_3 = VIC2 + $24 |
| 53 | +.label SPRITE_COL_0 = VIC2 + $25 |
| 54 | +.label SPRITE_COL_1 = VIC2 + $26 |
| 55 | +.label SPRITE_0_COLOR = VIC2 + $27 |
| 56 | +.label SPRITE_1_COLOR = VIC2 + $28 |
| 57 | +.label SPRITE_2_COLOR = VIC2 + $29 |
| 58 | +.label SPRITE_3_COLOR = VIC2 + $2A |
| 59 | +.label SPRITE_4_COLOR = VIC2 + $2B |
| 60 | +.label SPRITE_5_COLOR = VIC2 + $2C |
| 61 | +.label SPRITE_6_COLOR = VIC2 + $2D |
| 62 | +.label SPRITE_7_COLOR = VIC2 + $2E |
65 | 63 |
|
| 64 | +.label COLOR_RAM = $D800 |
66 | 65 | .label TOP_SCREEN_RASTER_POS = 50 |
67 | 66 |
|
68 | 67 | /* ------------------------------------ |
69 | 68 | * CONTROL_1 bits |
70 | 69 | * ------------------------------------ */ |
71 | 70 | .label CONTROL_1_RASTER8 = %10000000 |
72 | | -.label CONTROL_1_ECM = %01000000 |
73 | | -.label CONTROL_1_BMM = %00100000 |
74 | | -.label CONTROL_1_DEN = %00010000 |
75 | | -.label CONTROL_1_RSEL = %00001000 |
| 71 | +.label CONTROL_1_ECM = %01000000 |
| 72 | +.label CONTROL_1_BMM = %00100000 |
| 73 | +.label CONTROL_1_DEN = %00010000 |
| 74 | +.label CONTROL_1_RSEL = %00001000 |
76 | 75 |
|
77 | 76 | /* ------------------------------------ |
78 | 77 | * CONTROL_2 bits |
79 | 78 | * ------------------------------------ */ |
80 | | -.label CONTROL_2_RES = %00100000 |
81 | | -.label CONTROL_2_MCM = %00010000 |
82 | | -.label CONTROL_2_CSEL = %00001000 |
| 79 | +.label CONTROL_2_RES = %00100000 |
| 80 | +.label CONTROL_2_MCM = %00010000 |
| 81 | +.label CONTROL_2_CSEL = %00001000 |
83 | 82 |
|
84 | 83 | /* ------------------------------------ |
85 | 84 | * IRR bits |
|
101 | 100 | /* ------------------------------------ |
102 | 101 | * Graphic modes |
103 | 102 | * ------------------------------------ */ |
104 | | -.label STANDARD_TEXT_MODE = %000 |
| 103 | +.label STANDARD_TEXT_MODE = %000 |
105 | 104 | .label MULTICOLOR_TEXT_MODE = %001 |
106 | 105 | .label STANDARD_BITMAP_MODE = %010 |
107 | | -.label MULTICOLOR_BITMAP_MODE = %011 |
108 | | -.label EXTENDED_TEXT_MODE = %100 |
| 106 | +.label MULTICOLOR_BITMAP_MODE = %011 |
| 107 | +.label EXTENDED_TEXT_MODE = %100 |
109 | 108 | |
110 | | -.label MODE_ECM = %100 |
111 | | -.label MODE_BMM = %010 |
112 | | -.label MODE_MCM = %001 |
| 109 | +.label MODE_ECM = %100 |
| 110 | +.label MODE_BMM = %010 |
| 111 | +.label MODE_MCM = %001 |
113 | 112 |
|
114 | 113 | /* ------------------------------------ |
115 | 114 | * Misc. constants |
|
132 | 131 | .assert "getTextOffset(19,12) gives 499", getTextOffset(19, 12), 499 |
133 | 132 | .assert "getTextOffset(39,24) gives 999", getTextOffset(39, 24), 999 |
134 | 133 |
|
| 134 | +/* |
| 135 | + * Combines screen and charset slots for memory control register. |
| 136 | + * |
| 137 | + * Params: |
| 138 | + * screenMem: location of screen memory: 0..15 |
| 139 | + * charSet: location of charset definition: 0..7 |
| 140 | + */ |
| 141 | +.function @getTextMemory(screenMem, charSet) { |
| 142 | + .return charSet<<1 | screenMem<<4 |
| 143 | +} |
| 144 | +.assert "getTextMemory(0, 0) returns $00", getTextMemory(0, 0), %00000000 |
| 145 | +.assert "getTextMemory(15,7) returns $FE", getTextMemory(15, 7), %11111110 |
| 146 | +.assert "getTextMemory(4,2) returns %01000100", getTextMemory(4, 2), %01000100 |
| 147 | + |
135 | 148 | /* |
136 | 149 | * Configures memory for text mode |
137 | 150 | * |
|
142 | 155 | * MOD: A |
143 | 156 | */ |
144 | 157 | .macro @configureTextMemory(video, charSet) { |
145 | | - lda #[charSet<<1 | video<<4] |
| 158 | + lda #getTextMemory(video, charSet) |
146 | 159 | sta MEMORY_CONTROL |
147 | 160 | } |
148 | 161 | .assert "configureTextMemory(0, 0) sets $00 to MEMORY_CONTROL reg", { :configureTextMemory(0, 0) }, { |
|
158 | 171 | sta MEMORY_CONTROL |
159 | 172 | } |
160 | 173 |
|
| 174 | +/* |
| 175 | + * Combines video and bitmap slots into value of memory control register. |
| 176 | + * |
| 177 | + * Params: |
| 178 | + * video: location of video ram: 0..15 |
| 179 | + * bitmap: location of bitmap definition: 0..1 |
| 180 | + */ |
| 181 | +.function @getBitmapMemory(video, bitmap) { |
| 182 | + .return bitmap<<3 | video<<4 |
| 183 | +} |
| 184 | +.assert "getBitmapMemory(0, 0) returns $00", getBitmapMemory(0, 0), %00000000 |
| 185 | +.assert "getBitmapMemory(15, 1) returns %11111000", getBitmapMemory(15, 1), %11111000 |
| 186 | +.assert "getBitmapMemory(4, 1) returns %01001000", getBitmapMemory(4, 1), %01001000 |
| 187 | + |
161 | 188 | /* |
162 | 189 | * Configure memory for bitmap mode |
163 | 190 | * |
|
168 | 195 | * MOD: A |
169 | 196 | */ |
170 | 197 | .macro @configureBitmapMemory(video, bitmap) { |
171 | | - lda #[bitmap<<3 | video<<4] |
| 198 | + lda #getBitmapMemory(video, bitmap) |
172 | 199 | sta MEMORY_CONTROL |
173 | 200 | } |
174 | 201 | .assert "configureBitmapMemory(0, 0) sets $00 to MEMORY_CONTROL reg", { :configureBitmapMemory(0, 0) }, { |
|
298 | 325 | * |
299 | 326 | * MOD: A |
300 | 327 | */ |
301 | | -.macro irqEnter() { |
| 328 | +.macro @irqEnter() { |
302 | 329 | pha |
303 | 330 | tya |
304 | 331 | pha |
|
313 | 340 | * rasterLine - at which raster line should we fire next interrupt |
314 | 341 | * memory - if true, rasterLine is taken from memory address, if false - absolute addressing is used |
315 | 342 | */ |
316 | | -.macro irqExit(intVector, rasterLine, memory) { |
| 343 | +.macro @irqExit(intVector, rasterLine, memory) { |
317 | 344 | ldx #>intVector |
318 | 345 | ldy #<intVector |
319 | 346 | stx $FFFF |
|
342 | 369 | pla |
343 | 370 | rti |
344 | 371 | } |
| 372 | + |
| 373 | +.macro @debugBorder(color) { |
| 374 | + #if VISUAL_DEBUG |
| 375 | + lda #color |
| 376 | + sta BORDER_COL |
| 377 | + #endif |
| 378 | +} |
| 379 | + |
| 380 | +.macro @debugBorderStart() { |
| 381 | + #if VISUAL_DEBUG |
| 382 | + inc BORDER_COL |
| 383 | + #endif |
| 384 | +} |
| 385 | +.macro @debugBorderEnd() { |
| 386 | + #if VISUAL_DEBUG |
| 387 | + dec BORDER_COL |
| 388 | + #endif |
| 389 | +} |
| 390 | + |
0 commit comments