-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patheditEnvelopeTable.asm
245 lines (210 loc) · 4.09 KB
/
editEnvelopeTable.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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
editEnvelopeTable:
.IF SRAM_MAP=32
lda #SRAM_ENVELOPE_BANK
jsr setMMC1r1
.ENDIF
lda envelopeFirstRow
clc
adc envelopeCursorY
tax
lda envelopeRowsIndex,x
clc
adc envelopeCursorX
sta envelopeIndex
lda writeScreen ;need to write screen?
beq @a
jsr writeEnvelopeScreen ;yes
dec writeScreen ;if writeScreen was 1, only write main window, else
beq @a ; write header and title too
jsr writeEnvelopeHeaderFooter
dec writeScreen ;reset screen writing flag
lda #$01
sta dmaUpdateHeader
sta dmaUpdateTitle
@a: jsr globalKeys ;global keys
lda writeScreen ;if mode has changed, this flag will be !=0
beq @b
jmp editEnvelopeExit ;if changed, don't do any more keys
@b: jsr processKeys
.IF SRAM_MAP=32
lda #SRAM_ENVELOPE_BANK
jsr setMMC1r1
.ENDIF
ldy envelopeIndex
ldx envelopeCursorX
jsr envelopeKeysTapA
jsr envelopeKeysTapB
jsr envelopeKeysHoldA_UDLR
jsr moveAroundEditor
editEnvelopeExit:
updateCursor envelopeCursorX,envelopeCursorY,envelopeCursorColumns,envelopeCursorRows,envelopeColumnCursorType
jmp editorLoop
envelopeKeysHoldA_UDLR:
lda PAD1_fireb;keysHoldB
beq @noB
rts
@noB: lda PAD1_firea;keysHoldA ;hold A + U/D/L/R = modify value
bne @holdA
lda editBufferFlag
beq @x
lda editBuffer
sta SRAM_ENVELOPES,y
@notEditing: lda #$00
sta editBufferFlag
beq @x
@holdA: lda editBufferFlag
bne @editing
inc editBufferFlag
lda SRAM_ENVELOPES,y
sta editBuffer
@editing: lda keysRepeatLR
ora PAD1_dlr
bne @addValue
lda keysRepeatUD
ora PAD1_dud
beq @x
bpl @addNeg
ldy envelopeCursorX
lda envelopePositiveAdd,y
ldy envelopeIndex
jmp @addValue
@addNeg: ldy envelopeCursorX
lda envelopeNegativeAdd,y
ldy envelopeIndex
@addValue: clc
adc editBuffer
cpx #ENVELOPE_COLUMN_SUSTAIN
bne @notTop
and #$FF
bpl @notNeg
lda #$00
beq @notTop
@notNeg: cmp #$10
bcc @notTop
lda #$0F
@notTop: sta editBuffer
sta editEnvelopeLastValue,x
jsr editEnvelopeUpdateScreenValue
@x: rts
envelopeKeysTapB:
lda PAD1_sel
beq @x
lda keysTapB
beq @x
lda envelopeClearValues,x
sta SRAM_ENVELOPES,y
sta editBuffer
jmp editEnvelopeUpdateScreenValue
@x: rts
envelopeKeysTapA:
lda keysTapA
beq @x
.IF 0=1
lda PAD1_fireb
beq @notDel
lda envelopeClearValues,x
sta SRAM_ENVELOPES,y
sta editBuffer
jmp editEnvelopeUpdateScreenValue
.ENDIF
@notDel:
ldx envelopeCursorX
lda editEnvelopeLastValue,x
ldy envelopeIndex
sta SRAM_ENVELOPES,y
sta editBuffer
jsr editEnvelopeUpdateScreenValue
@x: rts
envelopeNegativeAdd:
.BYTE -16,-16,-1,-16
envelopePositiveAdd:
.BYTE 16,16,1,16
envelopeClearValues:
.BYTE $00,$00,$0F,$00
editEnvelopeUpdateScreenValue:
pha
ldx envelopeCursorY
lda rowOffsetEnvelope,x
ldx envelopeCursorX
clc
adc columnOffsetEnvelope,x
tax
pla
jsr phexWindow
rts
writeEnvelopeScreen:
ldx #$00
ldy envelopeFirstRow ;first write row numbers to buffer
@a: tya
jsr phexRow
iny
cpx #$20
bcc @a
ldy envelopeFirstRow
lda envelopeRowsIndex,y
tay
ldx #$00
@b: lda SRAM_ENVELOPES,y
jsr phexWindow
lda #CHR_SPACE
sta windowBuffer,x
inx
iny
lda SRAM_ENVELOPES,y
jsr phexWindow
lda #CHR_SPACE
sta windowBuffer,x
inx
iny
lda SRAM_ENVELOPES,y
jsr phexWindow
lda #CHR_SPACE
sta windowBuffer,x
inx
iny
lda SRAM_ENVELOPES,y
jsr phexWindow
lda #CHR_SPACE
sta windowBuffer,x
inx
sta windowBuffer,x
inx
sta windowBuffer,x
inx
iny
cpx #224
bcc @b
@x: rts
writeEnvelopeHeaderFooter:
ldx #$00 ;write header and title bars to buffer
@c: lda titleEnvelope,x
sta titleBuffer,x
lda headerEnvelope,x
sta headerBuffer,x
inx
cpx #$11
bne @c
rts
envelopeCursorColumns:
.REPEAT 4,i
.BYTE $53+(i*24)
.ENDREPEAT
envelopeCursorRows:
.REPEAT 16,i
.BYTE $28+(i*8)
.ENDREPEAT
rowOffsetEnvelope:
.REPEAT 16,i
.BYTE i*14
.ENDREPEAT
columnOffsetEnvelope:
.BYTE 0,3,6,9
envelopeRowsIndex:
.REPEAT NUMBER_OF_ENVELOPES,i
.BYTE i*BYTES_PER_ENVELOPE
.ENDREPEAT
;
;0 = no cursor, 1=8x8, 2=8x16, 3=8x24
;
envelopeColumnCursorType:
.BYTE 2,2,2,2