-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvideo.asm
437 lines (395 loc) · 10.3 KB
/
video.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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
// Run this part from command line:
// x64sc -8 video.d64 video.prg
// then start $1c00
.segment VIDEO []
#import "fm_const.asm"
#import "loadersymbols-c64.inc"
.namespace PART4_ns {
.const FRAME_DELAY = 16 // how many raster screen frames to display one frame of video, this has to be multiple of 8 because of breaking news scroller
.const FRAME_DELAY_FOR_FRYBA = 8
.const BORDER_COLOR = $0f
.const BACKGROUND_COLOR = $0b
.const fryba_scroll_pointer_zp = $02 // and $fc
#if RUNNING_COMPLETE
// Started as whole compilation of parts
#else
// This has to happen only when starting separately
*= install "loader_install" // same as install jsr
.var installer_c64 = LoadBinary("tools/krill194/loader/build/install-c64.prg", BF_C64FILE)
installer_ptr: .fill installer_c64.getSize(), installer_c64.get(i)
*= loadraw "loader_resident" // same as loader code block address
.var loader_c64 = LoadBinary("tools/krill194/loader/build/loader-c64.prg", BF_C64FILE)
loader_ptr: .fill loader_c64.getSize(), loader_c64.get(i)
BasicUpstart2(PART4_ns.start)
#endif
*= $9300 "Part4_code"
start:
#if RUNNING_COMPLETE
#else // runing separate
jsr install
bcs load_error
#endif
clc
ldx #<file_font // Vector pointing to a string containing loaded file name
ldy #>file_font
jsr loadcompd
bcs load_error
#if RUNNING_COMPLETE
#else // runing separate
clc
ldx #<file_f5 // Vector pointing to a string containing loaded file name
ldy #>file_f5
jsr loadcompd // TODO loadcompd loadraw
bcs load_error
clc
ldx #<file_music // Vector pointing to a string containing loaded file name
ldy #>file_music
jsr loadraw
bcs load_error
#endif
jmp start2
file_music: .text "MUSIC" //filename on diskette
.byte $00
file_font: .text "VFONT" //filename on diskette
.byte $00
file_f5: .text "F5" //filename on diskette
.byte $00
load_error:
sta $0400 // display error screen code
lda #$04
sta $d020
sta $d021
jmp *
start2:
// turn off basic
lda #$36
sta $01
// set gfx colors
lda #BORDER_COLOR
sta $d020
jsr fill_color // fill $d800 with foreground color
// fill $d800 line 22 with breaking news color
lda #$00
ldx #$27
!:
sta $db6f,x
dex
bne !-
lda #BACKGROUND_COLOR
sta $d021
// set bank, do not use masking, only values can be $00, $01, $02 and $03
lda #$02
sta $dd00
#if RUNNING_COMPLETE
#else // runing separate
// start music
ldx #0
ldy #0
lda #0
jsr $1000
#endif
// THIS HAS TO HAPPEN EVERY TIME
// distribute_font()
// set zero page indirect pointer to scroll_text
lda #<scroll_text
sta fryba_scroll_pointer_zp
lda #>scroll_text
sta fryba_scroll_pointer_zp + 1
// setup irq
init_irq()
load_loop:
// wait for signal to start loading
lda loading_sempahore
bne load_loop
lda #$01
sta loading_sempahore // prevent loading without trigger from irq1
// start loading
clc
ldx #<file_b // Vector pointing to a string containing loaded file name
ldy #>file_b
jsr loadcompd
bcs load_error2
inc file_b + 1 // increment file name BA > BB > BC ...
// Check if filename is set to BN, it does not exist, that means end
lda file_b + 1
cmp #$4f // B'N'+1
bne load_loop
wait_for_last_block_to_playback:
lda screen_index
cmp #13
bne wait_for_last_block_to_playback
// video playback completed, continue
sei
lda #<irq2
sta $0314
lda #>irq2
sta $0315
cli
// fill $d800 with $0c color (GRAY)
lda #$0c
sta $d021
jsr fill_color
// fill $d800 with $0b color (DARK_GRAY)
lda #$0b
sta $d021
jsr fill_color
// now video pixels are same color as background
// clear $0400 and switch screen there
lda #$00
sta $d020
sta $d021
lda $d011
and #%11101111 // disable screen
sta $d011
// load 3d scroller part with planets
clc
ldx #<file_scroller // Vector pointing to a string containing loaded file name
ldy #>file_scroller
jsr loadcompd
bcs load_error2
jmp $9b00 // execute next part
load_error2:
sta $0400 // display error screen code
lda #$04
sta $d020
sta $d021
jmp *
loading_sempahore: // 0: load next part of video, non-zero: wait
.byte 0 //initially load, first part is pre-loaded but load the next one immediately
file_b: .text "BA" //filename on diskette
.byte $00
file_scroller:
.text "SCRLL" //filename on diskette
.byte $00
screen_index: // moview screen, every FRAME_DELAY of frames
.byte 0
frame_index: // every intrq raster screen is a frame, interval <0 - FRAME_DELAY) backwards
.byte FRAME_DELAY
// $d018 (upper 4bits +$08 font location)
screen_locations:
.byte $20, $30, $40, $50, $60, $70, $80 // bank 2
.byte $90, $a0, $b0, $c0, $d0, $e0, $f0 // bank 2
scroll_locations:
.byte $4b, $4f, $53, $57, $5b, $5f, $63 // bank 2 4800, 4c00, 5000, 5400, 5800, 5c00, 6000
.byte $67, $6b, $6f, $73, $77, $7b, $7f // bank 2 6400, 6800, 6c00, 7000, 7400, 7800, 7c00
.macro init_irq() {
sei
lda #<irq1
sta $0314
lda #>irq1
sta $0315
asl $d019
lda #$7f
sta $dc0d
sta $dd0d
lda $dc0d
lda $dd0d
lda #$81
sta $d01a
lda #$e0 // where raster interrupt will be triggered
sta $d012
lda #$1a
sta $d011
cli
}
d016_backup: // backup of $d016
.byte 0
irq1:
asl $d019 // ack irq
wait(8)
nop
nop
nop
//increase fine scroll
lda $d016
and #%11110000
sta $d016
//increase fine scroll - step 2
ldx frame_index
dex
txa
and #%00000111
ora $d016
sta $d016
ldx #$01 // render scroll line
stx $d020
stx $d021
sta d016_backup
// wait 8 line
wait(86)
nop
nop
lda $d016
and #%11111000 // reset fine scroll
ora #%00001000 // widen screen
sta $d016
lda #BORDER_COLOR
sta $d020
lda #BACKGROUND_COLOR
sta $d021
// hardscroll
lda d016_backup
and #%00000111
bne !+
inc fryba_scroll_pointer_zp // increase lo nybble
bne !+
inc fryba_scroll_pointer_zp + 1 // increase hi nybble
!:
jsr $1003
// Count down to next frame
// decrease frame_index by 1, check if it is zero.
// If zero continue to frame update, else skip frame update
dec frame_index
lda frame_index
// call hardscroll every 8th frame
and #%00000111
cmp #0
bne !+
jsr hardscroll
!:
lda frame_index
beq !+
jmp skip_screen_update
!:
// Screen update
lda #FRAME_DELAY
sta frame_index // reset delay counter
// Route between Fryba and video
fryba_route:
clc // clear carry (CLC $18) flag means route to Fryba, set carry (SEC $38)flag means route to video
bcc fryba_start
jmp next_screen
// 5 cycles by 7 frames at 16 raster screen per picture = 35 frames
// 1 hard scroll position per picture
// Fryba
fryba_start:
lda #FRAME_DELAY_FOR_FRYBA
sta frame_index // overwrite delay because Fryba is faster
inc screen_index
lda screen_index
cmp #5 // Fryba has fixed 5 frames
bne display_fryba_frame
dec fryba_full_cycles
lda fryba_full_cycles
beq stop_fryba
lda #$00 // repeat Fryba until video is loaded
sta screen_index
display_fryba_frame:
ldx screen_index
// pre-fill scroll text first
lda scroll_locations+7,x
sta tf + 2
ldy #0
sf: lda (fryba_scroll_pointer_zp),y
clc
adc #228 // shift to the right font location
tf: sta $ff70,y
iny
cpy #40
bne sf
lda screen_locations+7,x
sta $d018
jmp skip_screen_update
stop_fryba:
lda #$38
sta fryba_route // next time route to video instead of Fryba
lda #$00 // end of block, switch to video
sta screen_index
sta loading_sempahore // allow loading next part
jmp display_frame
fryba_full_cycles:
.byte 10 // repeat 7 frames 10 times
scroll_text:
.encoding "screencode_upper"
.text "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
.text "BREAKING@NEWS[[[@@@THE@SUN@DECIDED@NOT@TO@WORK@REGULARLY@AND@HAS@DISAPPEARED[@@THIS@IS@THE@END@OF@THE@WORLD@AS@WE@KNOW@IT[@CHAOS@UNFOLDS@AS@THE@ENTIRE@ELECTRONICS@INFRASTRUCTURE@COLLAPSES[@ONLY@COMMODORE@BREADBIN@MACHINES@REMAIN@FUNCTIONAL[@@@@@@@@@"
// .text "BREAKING@NEWS[[[@@THE@SUN@SIGNED@OFF@@THIS@IS@THE@END@OF@THE@WORLD@AS@WE@KNOW@IT[@"
// .text "THE@SUN@HAS@ESCAPED@THE@SOLAR@SYSTEM[@CHAOS@UNFOLDS@AS@ENTIRE@ELECTRONICS@INFRASTRUCTURE@COLLAPSES[@ONLY@COMMODORE@MACHINES@REMAIN@FUNCTIONAL[@HUMANITY@SCRAMBLES@@@@@@@@@"
next_screen:
inc screen_index
lda screen_index
cmp #7 // max frames in video block
bne framenot7
frame7:
lda #$00
sta loading_sempahore // allow loading next part
jmp display_frame
framenot7:
cmp #14 // max frames in memory
bne display_frame
frame14:
lda #$00
sta screen_index // end of block
sta loading_sempahore // allow loading next part
display_frame:
ldx screen_index
lda screen_locations,x
sta $d018
jsr hardscroll
skip_screen_update:
pla
tay
pla
tax
pla
rti
irq2:
asl $d019 // ack irq
nop // TODO without this NOP it hangs at Fryba while loading BA
jsr $1003
jmp skip_screen_update
hardscroll:
// pre-fill scroll text first
ldx screen_index
lda scroll_locations,x
sta tf1 + 2
ldy #0
sf1:lda (fryba_scroll_pointer_zp),y
clc
adc #228 // shift to the right font location
tf1:sta $ff70,y
iny
cpy #40
bne sf1
rts
// color in A register
fill_color:
ldx #$00
!:
sta $d800,x
sta $d900,x
sta $da00,x
sta $db00,x
dex
bne !-
rts
.macro distribute_font() { // not needed anymore
ldx #0
!:
lda $2000,x
sta $4000,x
lda $2100,x
sta $4100,x
lda $2200,x
sta $4200,x
lda $2300,x
sta $4300,x
lda $2400,x
sta $4400,x
lda $2500,x
sta $4500,x
lda $2600,x
sta $4600,x
lda $2700,x
sta $4700,x
inx
bne !-
}
.macro wait(count) {
ldx #count
!:
dex
bne !-
}
.file [name="video.prg", segments="VIDEO"]
} // end namespace PART4_ns