-
Notifications
You must be signed in to change notification settings - Fork 2
/
mega65system.asm
186 lines (148 loc) · 4.1 KB
/
mega65system.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
.namespace System
{
//--------------------------------------------------------
//
.segment Zeropage "System ZP"
TopBorder: .word $0000
BotBorder: .word $0000
IRQTopPos: .word $0000
IRQBotPos: .word $0000
.segment Code "System Code"
InitM65:
{
sei
lda #$35
sta $01
enable40Mhz()
enableVIC4Registers()
disableCIAInterrupts()
disableC65ROM()
//Disable IRQ raster interrupts
//because C65 uses raster interrupts in the ROM
lda #$00
sta $d01a
// Set XSCL to 0, setting here to save having to disable hot registers
lda #%00000111
trb $d016
// Disable hot register so VIC2 registers
lda #$80
trb $d05d //Clear bit7=HOTREG
cli
rts
}
InitVideoMode:
{
// Set RASLINE0 to 0 for the first VIC-II rasterline
lda #%00111111
trb $d06f
// Disable VIC3 ATTR register to enable 8bit color
lda #$20 //Clear bit5=ATTR
trb $d031
// Enable RAM palettes
lda #$04 //Set bit2=PAL
tsb $d030
// Enable RRB double buffer
lda #$80 //Clear bit7=NORRDEL
trb $d051
// Enable double line RRB to double the time for RRB operations
lda #$08 //Set bit3=V400
tsb $d031
lda #$40 //Set bit6=DBLRR
tsb $d051
lda #$00 //Set CHRYSCL = 0
sta $d05b
// Init H320 flag
lda #$80
#if H320
trb $d031 //Clear bit7=H640
#else
tsb $d031 //Set bit7=H640
#endif
// Enable Super Extended Attributes and mono chars < $ff
lda #%00000101 //Set bit2=FCM for chars >$ff, bit0=16 bit char indices (SEAM)
tsb $d054
rts
}
CenterFrameHorizontally:
{
.var charXPos = Tmp // 16bit
_set16im(LEFT_BORDER, charXPos)
// SDBDRWDLSB,SDBDRWDMSB - Side Border size
lda charXPos+0
sta $d05c
lda #%00111111
trb $d05d
lda charXPos+1
and #%00111111
tsb $d05d
// TEXTXPOS - Text X Pos
lda charXPos+0
sta $d04c
lda #%00001111
trb $d04d
lda charXPos+1
and #%00001111
sta $d04d
rts
}
CenterFrameVertically:
{
.var verticalCenter = Tmp // 16bit
.var halfCharHeight = Tmp+2 // 16bit
.var charYPos = Tmp1 // 16bit
// The half height of the screen in rasterlines is (charHeight / 2) * 2
_set16im(((NUM_ROWS * 8) * VPIXELSCALE)/2, halfCharHeight)
// Figure out the vertical center of the screen
// PAL values
_set16im(304, verticalCenter)
bit $d06f
bpl isPal
// NTSC values
_set16im(242, verticalCenter)
isPal:
_sub16(verticalCenter, halfCharHeight, TopBorder)
_add16(verticalCenter, halfCharHeight, BotBorder)
_set16(TopBorder, charYPos)
// Work around VHDL issue
//
// If we are running on real hardware then adjust char Y start up to avoid 2 pixel Y=0 bug
lda $d60f
and #%00100000
beq !+
_add16im(TopBorder, 1, TopBorder)
_add16im(BotBorder, 1, BotBorder)
_sub16im(charYPos, 2, charYPos)
!:
// Set these values on the hardware
// TBDRPOS - Top Border
lda TopBorder+0
sta $d048
lda #%00001111
trb $d049
lda TopBorder+1
tsb $d049
// BBDRPOS - Bot Border
lda BotBorder+0
sta $d04a
lda #%00001111
trb $d04b
lda BotBorder+1
tsb $d04b
// TEXTYPOS - CharYStart
lda charYPos+0
sta $d04e
lda #%00001111
trb $d04f
lda charYPos+1
tsb $d04f
_add16im(TopBorder, 1, IRQTopPos)
// convert from V400 units to raster lines
lsr IRQTopPos+1
ror IRQTopPos+0
_add16im(BotBorder, 1, IRQBotPos)
// convert from V400 units to raster lines
lsr IRQBotPos+1
ror IRQBotPos+0
rts
}
}