-
Notifications
You must be signed in to change notification settings - Fork 1
/
m65.dmatest.mfk
152 lines (127 loc) · 2.7 KB
/
m65.dmatest.mfk
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
import stdio
import m65.dma
import m65.keyboard
import m65.vic4
const byte SCREEN_WIDTH=80
const word SCREEN_SIZE=(SCREEN_WIDTH*25)
const int24 SCREEN_BASE = $0800
void main() {
byte ticker
bool crt_enabled
asm {
sei
}
M65_40hz()
M65_defaultmem()
M65_VIC4Enable()
M65_disable_rom()
M65_dma_prepare()
// for 80 col mode
vic4_charstep = SCREEN_WIDTH
vic4_charcount = SCREEN_WIDTH
vic4_screen_ptr = SCREEN_BASE
// set dma skip to 1 byte
// for a fill
DMAJob.scr_skip_lsb = 1 // make no difference for FILL
DMAJob.dst_bank = $ff // for color ram
DMAJob.source.lo=$1
DMAJob.destination = $80000
DMAJob.size = SCREEN_SIZE
DMAJob.type = DMA_FILL
M65_dma_kick()
// clear screen
DMAJob.dst_bank = $0
// using the space char $20
DMAJob.source.lo=$20
// to the screen
DMAJob.destination = SCREEN_BASE
// how big
DMAJob.size = SCREEN_SIZE
// what we're doing
DMAJob.type = DMA_FILL
// kick the DMA off
M65_dma_kick()
// just a straight horizontal copy
DMAJob.scr_skip_lsb = 1
DMAJob.dst_skip_lsb = 1
DMAJob.dst_bank = $00
DMAJob.source=hello_world.addr
DMAJob.destination = SCREEN_BASE
DMAJob.size = hello_world.length
// COPY
DMAJob.type = DMA_COPY
// kick the DMA off
M65_dma_kick()
// skip of 2 on destination
DMAJob.dst_skip_lsb = 2
// so H E L L O instead of HELLO
DMAJob.source=hello_world.addr
DMAJob.destination = SCREEN_BASE + 80
// kick the DMA off
M65_dma_kick()
// draw a strip down
DMAJob.dst_skip_lsb = vic4_charstep.lo
// H
// E
// L .. etc
DMAJob.source=hello_world.addr
DMAJob.destination = SCREEN_BASE + 78
M65_dma_kick()
// set border to index 0
vic_border = 0
while true {
// mix asm wherever you like
asm
{
vbl:
// show raster pos as colors
ldx $d012
clc
txa
adc ticker
sta $d100
sta $d200
sta $d300
cpx #$f0
bne vbl
vbl2:
lda $d012
cmp #$f1
bne vbl2
}
putHex(320,m65_ascii)
if ((m65_ascii==$9))
{
vic4_fine_raster_h&=%10111111
vic4_mode&=%11011111
// tab
if (crt_enabled==true)
{
// enable CRT
vic4_mode|=PALEMU
vic4_fine_raster_h|=%01000000
crt_enabled=false
}
else
{
crt_enabled=true
}
m65_ascii = 0
}
if ((m65_keymod&KEYMOD_ALT)==0)
{
// this just counts up once per frame
ticker+=1
}
}
}
const array hello_world=["hello mega65, hope you have some fun ! " scr]
const array hexcodes=["0123456789abcdef" scr]
void putHex(word offset,byte value)
{
pointer addr
addr = SCREEN_BASE.loword
addr+=offset
addr[0] = hexcodes[value>>4]
addr[1] = hexcodes[value&$f]
}