Skip to content

Commit 9dceeb9

Browse files
Merge pull request #2 from c64lib/develop
Develop
2 parents c4baebf + 879e66a commit 9dceeb9

5 files changed

Lines changed: 214 additions & 69 deletions

File tree

.travis.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ sudo: false
33
before_install:
44
- source <(curl -SLs https://raw.githubusercontent.com/c64lib/travis-ci/master/install.sh)
55
script:
6-
- cpm common https://github.com/c64lib/common/archive/0.0.4.tar.gz
6+
- cpm common https://github.com/c64lib/common/archive/develop.tar.gz
7+
- ka -libdir cpm_modules mos6510.asm
78
- ka -libdir cpm_modules cia.asm
89
- ka -libdir cpm_modules vic2.asm
910
- ka -libdir cpm_modules sprites.asm
11+
- ka -libdir cpm_modules examples/e01-raster-irq.asm
1012
notifications:
1113
email:
1214
on_success: change

examples/e01-raster-irq.asm

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Copper demo 1.
3+
*/
4+
5+
#import "common/mem.asm"
6+
#import "../cia.asm"
7+
#import "../vic2.asm"
8+
#import "../mos6510.asm"
9+
10+
.label IRQ_1 = 150
11+
.label IRQ_2 = 200
12+
13+
.pc = $0801 "Basic Upstart"
14+
:BasicUpstart(start) // Basic start routine
15+
16+
// Main program
17+
.pc = $0810 "Program"
18+
19+
start:
20+
sei // disable IRQ, otherwise C64 will crash
21+
lda #$7f // stop CIA from producing IRQ
22+
sta c64lib.CIA1_IRQ_CONTROL
23+
sta c64lib.CIA2_IRQ_CONTROL
24+
lda c64lib.CIA1_IRQ_CONTROL
25+
lda c64lib.CIA2_IRQ_CONTROL
26+
lda #c64lib.IMR_RASTER // VIC-II is about to produce raster interrupt
27+
sta c64lib.IMR
28+
setRaster(IRQ_1)
29+
lda #<irq1
30+
sta c64lib.IRQ_LO
31+
lda #>irq1
32+
sta c64lib.IRQ_HI
33+
lda #<irqFreeze
34+
sta c64lib.NMI_LO
35+
lda #>irqFreeze
36+
sta c64lib.NMI_HI
37+
configureMemory(c64lib.RAM_IO_RAM) // turn off kernal, so that our vector becomes visible
38+
cli
39+
block:
40+
jmp block // go into endless loop
41+
42+
irq1: {
43+
irqEnter()
44+
inc c64lib.BG_COL_0 // change background color
45+
inc c64lib.BORDER_COL // change border color
46+
irqExit(irq2, IRQ_2, false)
47+
}
48+
49+
irq2: {
50+
irqEnter()
51+
dec c64lib.BG_COL_0 // change it back
52+
dec c64lib.BORDER_COL // change it back
53+
irqExit(irq1, IRQ_1, false)
54+
}
55+
56+
irqFreeze: {
57+
rti
58+
}
59+
60+

mos6510.asm

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#importonce
2+
3+
.filenamespace c64lib
4+
5+
/*
6+
* MOS6510 Registers.
7+
*/
8+
.label MOS_6510_DIRECTION = $00
9+
.label MOS_6510_IO = $01
10+
11+
/*
12+
* I/O Register bits.
13+
*/
14+
.label CASETTE_MOTOR_OFF = %00100000
15+
.label CASETTE_SWITCH_CLOSED = %00010000
16+
.label CASETTE_DATA = %00001000
17+
.label PLA_CHAREN = %00000100
18+
.label PLA_HIRAM = %00000010
19+
.label PLA_LORAM = %00000001
20+
21+
/*
22+
* Possible I/O & PLA configurations.
23+
*/
24+
.label RAM_RAM_RAM = %000
25+
.label RAM_CHAR_RAM = PLA_LORAM
26+
.label RAM_CHAR_KERNAL = PLA_HIRAM
27+
.label BASIC_CHAR_KERNAL = PLA_LORAM | PLA_HIRAM
28+
.label RAM_IO_RAM = PLA_CHAREN | PLA_LORAM
29+
.label RAM_IO_KERNAL = PLA_CHAREN | PLA_HIRAM
30+
.label BASIC_IO_KERNAL = PLA_CHAREN | PLA_LORAM | PLA_HIRAM
31+
32+
.macro @configureMemory(config) {
33+
lda MOS_6510_IO
34+
and #%11111000
35+
ora #[config & %00000111]
36+
sta MOS_6510_IO
37+
}

sprites.asm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Calculates sprite X position register address
77
*/
88
.function spriteXReg(spriteNo) {
9-
.return BASE + spriteNo * 2
9+
.return VIC2 + spriteNo * 2
1010
}
1111
.assert "Reg address for sprite0 X pos", spriteXReg(0), SPRITE_0_X
1212
.assert "Reg address for sprite7 X pos", spriteXReg(7), SPRITE_7_X

vic2.asm

Lines changed: 113 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -12,74 +12,73 @@
1212
/* ------------------------------------
1313
* VIC-II registers.
1414
* ------------------------------------ */
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
6563

64+
.label COLOR_RAM = $D800
6665
.label TOP_SCREEN_RASTER_POS = 50
6766

6867
/* ------------------------------------
6968
* CONTROL_1 bits
7069
* ------------------------------------ */
7170
.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
7675

7776
/* ------------------------------------
7877
* CONTROL_2 bits
7978
* ------------------------------------ */
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
8382

8483
/* ------------------------------------
8584
* IRR bits
@@ -101,15 +100,15 @@
101100
/* ------------------------------------
102101
* Graphic modes
103102
* ------------------------------------ */
104-
.label STANDARD_TEXT_MODE = %000
103+
.label STANDARD_TEXT_MODE = %000
105104
.label MULTICOLOR_TEXT_MODE = %001
106105
.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
109108
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
113112

114113
/* ------------------------------------
115114
* Misc. constants
@@ -132,6 +131,20 @@
132131
.assert "getTextOffset(19,12) gives 499", getTextOffset(19, 12), 499
133132
.assert "getTextOffset(39,24) gives 999", getTextOffset(39, 24), 999
134133

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+
135148
/*
136149
* Configures memory for text mode
137150
*
@@ -142,7 +155,7 @@
142155
* MOD: A
143156
*/
144157
.macro @configureTextMemory(video, charSet) {
145-
lda #[charSet<<1 | video<<4]
158+
lda #getTextMemory(video, charSet)
146159
sta MEMORY_CONTROL
147160
}
148161
.assert "configureTextMemory(0, 0) sets $00 to MEMORY_CONTROL reg", { :configureTextMemory(0, 0) }, {
@@ -158,6 +171,20 @@
158171
sta MEMORY_CONTROL
159172
}
160173

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+
161188
/*
162189
* Configure memory for bitmap mode
163190
*
@@ -168,7 +195,7 @@
168195
* MOD: A
169196
*/
170197
.macro @configureBitmapMemory(video, bitmap) {
171-
lda #[bitmap<<3 | video<<4]
198+
lda #getBitmapMemory(video, bitmap)
172199
sta MEMORY_CONTROL
173200
}
174201
.assert "configureBitmapMemory(0, 0) sets $00 to MEMORY_CONTROL reg", { :configureBitmapMemory(0, 0) }, {
@@ -298,7 +325,7 @@
298325
*
299326
* MOD: A
300327
*/
301-
.macro irqEnter() {
328+
.macro @irqEnter() {
302329
pha
303330
tya
304331
pha
@@ -313,7 +340,7 @@
313340
* rasterLine - at which raster line should we fire next interrupt
314341
* memory - if true, rasterLine is taken from memory address, if false - absolute addressing is used
315342
*/
316-
.macro irqExit(intVector, rasterLine, memory) {
343+
.macro @irqExit(intVector, rasterLine, memory) {
317344
ldx #>intVector
318345
ldy #<intVector
319346
stx $FFFF
@@ -342,3 +369,22 @@
342369
pla
343370
rti
344371
}
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

Comments
 (0)