-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscroll.asm
145 lines (113 loc) · 2.57 KB
/
scroll.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
include 'scrollutils.asm'
; handles map scrolling and loading when needed
initScrolling MODULE
setVDPRegister 11, %00000000, vdp_ctrl ; scroll
rts
MODEND
; input:
; d6 level index
; trash:
; a3, d5, d6, d7
loadLevel MODULE
mulu.w #levelDesc, d6
lea.l levelDescriptions, a3
lea.l (a3, d6.w), a1
move.l a1, loadedLevelAddress
; load palette
setVDPAutoIncrement 2, vdp_ctrl
setVDPWriteAddressCRAM 0, vdp_ctrl
move.l lvlPalette(a1), a0
bsr copyPalette
; load patterns
move.l lvlPattern(a1), d5
moveq #0, d7
move.w lvlPatternLen(a1), d7
jsr allocVRAM ; d6 vram address, d7 allocated bytes
move.w d6, levelVRAMAddress
lsr.w d7 ; bytes to words
jsr _queueDMATransfer
; TODO better filling.
lea.l mainCamera, a0
move.l #0, camX(a0) ; clears x and y
move.l #0, camXprev(a0) ; clears x and y
;lc = 0
; REPT 32
; ; copyRowToVram a1, a0, 0, lc, 'a'
; ; copyRowToVram a1, a0, 0, lc, 'b'
;lc = lc+8
; ENDR
rts
MODEND
; input:
; trash:
; a3, d6, d7
unloadLevel MODULE
move.l levelVRAMAddress, d6
move.l (loadedLevelAddress), a3
move.w lvlPatternLen(a3), d7
jsr freeVRAM
rts
MODEND
;
updateLevel MODULE
movem.l d0-d7/a0-a3, -(sp)
lea.l mainCamera, a0
move.l (loadedLevelAddress), a1
moveq #0, d0
moveq #0, d1
@checkX
move.w camXprev(a0), d0
and.w #$FFF8, d0
move.w camX(a0), d2
and.w #$FFF8, d2
cmp.w d0, d2
beq @checkY ; no cell boundaries crossed
bmi @leftBorder
@rightBorder
copyColumnToVram a1, a0, 320, 0, 'a'
copyColumnToVram a1, a0, 320, 0, 'b'
bra @checkY
@leftBorder
copyColumnToVram a1, a0, 0, 0, 'a'
copyColumnToVram a1, a0, 0, 0, 'b'
bra @checkY
@checkY
move.w camYprev(a0), d1
and.w #$FFF8, d1
move.w camY(a0), d2
and.w #$FFF8, d2
cmp.w d1, d2
beq @exit ; no cell boundaries crossed
bmi @topBorder
@bottomBorder
moveq #0, d3
copyRowToVram a1, a0, 0, 224, 'a'
copyRowToVram a1, a0, 0, 224, 'b'
bra @exit
@topBorder
moveq #0, d3
copyRowToVram a1, a0, 0, 0, 'a'
copyRowToVram a1, a0, 0, 0, 'b'
bra @exit
@exit
move.l camX(a0), camXprev(a0) ; copies both x and y
movem.l (sp)+, d0-d7/a0-a3
rts
MODEND
updatePlaneScrollToCamera MODULE
lea.l mainCamera, a0
lea.l vdp_ctrl, a3
lea.l vdp_data, a4
; we are using fullscreen scroll, set both planes.
setVDPAutoIncrement 2, (a3)
setVDPWriteAddressVSRAM 0, (a3)
move.w camY(a0), (a4)
move.w camY(a0), (a4)
move.w camX(a0), d7
neg.w d7
and.w #$1FF, d7
setVDPWriteAddressVRAM vdp_map_hst, (a3)
move.w d7, (a4)
move.w d7, (a4)
rts
MODEND