-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathivb2.asx
685 lines (664 loc) · 10.5 KB
/
ivb2.asx
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
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
displayer equ $3800
pixels equ $8000
packed_pixels equ $9000
palette equ $3d00
caption equ $3cd8
org displayer
;
; Interlaced pic displayer
;
; Uses Method 1 - do nothing on non-interlace fields
;
dosvec equ $0a
brkflag equ $11
attract equ $4d
ramtop equ $6a
ztemp1 equ $e0
ztemp2 equ $e2
ztemp3 equ $e4
screen1 equ $9c40 ; ***** Temporarily use normal screen RAM *****
vscount equ $04 ; must be zero-page (timing)
sdmctl equ $22f
sdslst equ $230
gprior equ $26f
chbas equ $2f4
ch equ $2fc
ichid equ $340
iccom equ $342
icba equ $344
icbl equ $348
icax1 equ $34a
icax2 equ $34b
;
pal equ $d014
colpf1 equ $d017
colpf2 equ $d018
colbak equ $d01a
prior equ $d01b
consol equ $d01f
porta equ $d300
pactl equ $d302
dmactl equ $d400
dlistl equ $d402
dlisth equ $d403
hscrol equ $d404
vscrol equ $d405
chbase equ $d409
wsync equ $d40a
vcount equ $d40b
nmien equ $d40e
ciov equ $e456
;
; VBXE stuff
vbxe equ $cb ; Pointer to VBXE page (=$d600 or $d700)
vbxe_bank equ $cd ; Current bank in VBXE
;
vb_video_control equ $40
vb_xdl_adr equ $41
vb_csel equ $44 ; Color select
vb_psel equ $45 ; Palette select
vb_cr equ $46
vb_cg equ $47
vb_cb equ $48 ; RGB registers
vb_memac_b_control equ $5d ; Control for old banking scheme
vb_memac_control equ $5e ; MEMAC A Control
vb_memac_bank_sel equ $5f ; Bank select for MEMAC A
;
; FlashPack variables
;
fp21_ff equ $fc
fp21_bt equ $fd
fp21_ad equ $fe
;
; Jump tables
;
jmp init1
jmp init_palette
jmp unpack_inc_bank
jmp inc_bank
jmp setup_interlace
jmp display_pic
;
dl_vbfound
dta $70,$70,$70,$70,$70
dta $46
dta a(txt_vbfound)
dta $41
dta a(dl_vbfound)
txt_vbfound
dta d" VBXE FOUND AT $D640"
foundat_txt equ *-3
;
; DList for when picture is displayed
;
dl_main
dta 112,112,$f0,112,112 ; DLI1 here
dta 112,112,112,112,112
dta 112,112,112,112,112
dta 112,112,112,112,112
dta 112,112,112,112,112
dta 112,112,112 ; 28 blank chr rows
dta $c2 ; LMS 2
dta a(caption)
dta $cf ; LMS F
dta a(blank40)
dta 0,$41
dta a(dl_main)
blank40
dta d" "
;
; XDLs here
;
xdl1
dta $62 ; overlay, repeat, set overlay adr
ift HIRES
dta $98 ; set attrib, hr, end XDL
els
dta $88 ; set attrib, end XDL
eif
dta 239 ; Repeat 239 for 240 pixel screen height
dta $00,$20,$00 ; First overlay Field 0 starts @ $02000 in VBXE RAM
dta a(640) ; Step size 640 bytes for interlace
dta $11 ; Attrib: Normal width, use palette 1
dta $DF ; Overlay has priority over all except PF1
dta 0,0 ; filler
xdl_length equ *-xdl1
;
xdl2
dta $62 ; overlay, repeat, set overlay adr
ift HIRES
dta $98 ; set attrib, hr, end XDL
els
dta $88 ; set attrib, end XDL
eif
dta 239 ; Repeat 239 for 240 pixel screen height
dta $40,$21,$00 ; First overlay Field 1 starts @ $02140 in VBXE RAM
dta a(640) ; Step size 640 bytes for interlace
dta $11 ; Attrib: Normal width, use palette 1
dta $DF ; Overlay has priority over all except PF1
dta 0,0 ; filler
;
ert *>displayer+$400
fp21_dep1
tax
beq fp21_exit
lda #$7f
fp21_dep2
bcc *+3
inx
inx
sta fp21_ad
fp21_dep3
lda (fp21_ad),y
fp21_put
sta $8080,y
iny
bne fp21_dep4
inc fp21_ad+1
inc fp21_put+2
fp21_dep4
dex
bne fp21_dep3
asl fp21_bt
bne fp21_dep7
asl fp21_ff
bne fp21_dep5
fp21_start
sec
jsr fp21_get
rol @
sta fp21_ff
fp21_dep5
lda #1
bcc fp21_dep6
jsr fp21_get
rol @
fp21_dep6
sta fp21_bt
fp21_dep7
jsr fp21_get
ldx #1
bcc fp21_put
lsr @
bne fp21_dep2
jsr fp21_get
bcs fp21_dep1
tay
jsr fp21_get
sta fp21_ad+1
sta fp21_put+2
bcc fp21_dep7 !
fp21_get
lda packed_pixels
inc fp21_get+1
bne fp21_ret
inc fp21_get+2
fp21_ret
fp21_exit
rts
;
setup_interlace
cld
lda #0
sta fieldswap
lda #8
jsr waitvc
jsr waitvc ; Wait at least 1 frame
lda #0
sta nmien
ldx #<vblank
ldy #>vblank
stx $222
sty $223
lda #$40
sta nmien
jmp display_pic
;
waitvc
cmp vcount
bne waitvc
rts
vblank
lda #0
sta attract
lda #$c0
sta nmien
jsr doscreen
; Do colours and DList pointer in case Stage 2 is skipped
ldx #4
vb_setcolours
lda $2c4,x
sta $d016,x
dex
bpl vb_setcolours
lda sdslst+1
sta dlisth
lda sdslst
sta dlistl
ldx #<dli1
ldy #>dli1
stx $200
sty $201
lda 20
tax
and #1
eor fieldswap
asl @
asl @
sta choffset ; Chbase offset
txa
lsr @
bcc vblank2
jmp vblankend
vblank2
ldy #$88
lda pal
cmp #$f ; Are we NTSC ?
bne not_ntsc
ldy #$7e
not_ntsc
tya
jsr waitvc
lda #0
sta $d017
sta $d018
sta $d01a
sta wsync
; sta porta
switchval equ *
ldy #3
sta wsync
sta porta
sta wsync
; first line of vsync... half line at blanking level, second half at sync level
nop ; 105
sty dmactl ; 109
ldx #7 ; 111
; Refresh cycles 26 30 34 38 42 46 50 54 58
vbwait1
dex
bne vbwait1 ; 5*X-1=34=31 (+2 Ref)= 33
ldx #3 ; 36 (1)
nop ; 39 (1)
nop ; 41
nop ; 44 (1)
nop ; 47 (1)
sta dmactl ; 52 (1)
nop ; 55 (1)
nop ; 57
stx vscount ; 61 (1)
ldx #7 ; 63
; Refresh cycles 26 30 34 38 42 46 50 54 58
vbloop1
vbwait3
dex
bne vbwait3 ; 5*X-1 = 34 = 97,
sty dmactl ; 101 get HSync pulses back in normal order
nop ; 103
nop ; 105
nop ; 107
sta dmactl ; 111
dec vscount ; 116 = 2
beq vsyncend ; 4
ldx #5 ; 6
vbwait2
dex
bne vbwait2 ; 5*X-1 = 24 (+ 2 Ref) = 32
ldx #6 ; 35 (1)
nop ; 37
nop ; 40 (1)
sty dmactl ; 45 (1)
sta dmactl ; 51 (2)
nop ; 53
nop ; 56 (1)
nop ; 59 (1)
nop ; 61
nop ; 63
nop ; 65
jmp vbloop1 ; 68
; Refresh cycles 26 30 34 38 42 46 50 54 58
vsyncend
lda #1
jsr waitvc
vblankend
lda sdmctl
sta savesdmctl
lda #$20
sta sdmctl
sta dmactl
lda #$80
sta wsync
; sta porta
dta 234,234,234,234
dta 234,234,234,234
dta 234,234,234,234
jmp $e45f
;
; Switch screen base
;
doscreen
lda 20
and #1
asl @
asl @
tax
ldy #vb_xdl_adr
lda xdl_table,x
sta (vbxe),y
lda xdl_table+1,x
iny
sta (vbxe),y
lda xdl_table+2,x
iny
sta (vbxe),y
rts
fieldswap dta 0
choffset dta 0
savesdmctl dta 0
load_count dta 2 ; load counter for 4K segments
; mpindex dta 0
; message_end_ptr dta a(0)
; scrollspeed dta 0
; message1_fine dta 0
dta a(0,0,0,0,0,0,0,0)
;
; First DLI - enable normal screen DMA
;
dli1
pha
lda #$22
sta sdmctl
sta wsync
sta dmactl
lda #<dli_last
sta $200
lda #>dli_last
sta $201
pla
rti
;
; DLI for bottom of screen - enact Scanline 240 bug
;
dli_last
pha
lda #0
sta wsync
nop
nop
nop
nop
nop
nop
nop
sta dmactl
pla
rti
;
xdl_table
dta 0,0,0,0 ; first xdl at $000000
dta 0,2,0,0 ; second xdl at $000200
old_vblank dta a(0)
;
; INIT segment for multipart load of BMPs for VBXE
;
init1
lda #$40
sta nmien
lda #0
sta 712
sta colbak
sta vbxe
sta vbxe+1 ; Assume no VBXE installed for now
lda $222
sta old_vblank
lda $223
sta old_vblank+1
ldy #$d6
ldx $d740
cpx #$10
beq found_d7
ldx $d640
cpx #$10
beq found_d6
; Not found - display message
ldx #0
lda #9
sta $342,x
sta $349,x
lda #<txt_vbnotfound
sta $344,x
lda #>txt_vbnotfound
sta $345,x
jsr ciov
jmp (dosvec)
txt_vbnotfound
dta c"VBXE not found.",$9b
found_d7
inc foundat_txt
iny
found_d6
sty vbxe+1 ; Setup pointer in ZP to VBXE page base
ldx #<dl_vbfound
ldy #>dl_vbfound
stx sdslst
sty sdslst+1
lda #0
ldy #vb_video_control
sta (vbxe),y ; Clear any current VBXE modes
ldy #vb_memac_b_control
sta (vbxe),y ; Clear any MEMAC_B access modes
ldy #vb_memac_control
lda #$88
sta (vbxe),y ; Set MEMAC_CONTROL to window at $8000-8FFF, CPU access only
ldy #vb_memac_bank_sel
lda #$80
sta (vbxe),y ; Set window at $000000 in VBXE RAM
ldx #xdl_length
copyxdl
lda xdl1,x
sta $8000,x
lda xdl2,x
sta $8200,x
dex
bpl copyxdl ; Copy XDLs to VBXE @ $0000 and $0200
ldy #1
clear_vbxe_ram
jsr set_vbxe_bank ; Set to bank 2
lda #0
tax
clear_vbxe2
sta pixels+$000,x
sta pixels+$100,x
sta pixels+$200,x
sta pixels+$300,x
sta pixels+$400,x
sta pixels+$500,x
sta pixels+$600,x
sta pixels+$700,x
sta pixels+$800,x
sta pixels+$900,x
sta pixels+$a00,x
sta pixels+$b00,x
sta pixels+$c00,x
sta pixels+$d00,x
sta pixels+$e00,x
sta pixels+$f00,x
inx
bne clear_vbxe2
iny
cpy #40
bcc clear_vbxe_ram ; Clear ~ 160K of Video RAM
lda #$ff
sta ch
rts ; Continue picture load
;
; INIT segment for Palette setup
;
init_palette
ldy #vb_psel
lda #1
sta (vbxe),y ; Set palette 1
ldy #vb_csel
lda #0
sta (vbxe),y ; Select colour 1
ldx #0
vbxe_setcolours1
lda palette+$000,x
ldy #vb_cr
sta (vbxe),y ; set Red
lda palette+$001,x
iny
sta (vbxe),y ; Set Green
lda palette+$002,x
iny
sta (vbxe),y ; Set Blue
inx
inx
inx
cpx #2
bne vbxe_setcolours1
ldx #0
vbxe_setcolours2
lda palette+$102,x
ldy #vb_cr
sta (vbxe),y ; Set Red
lda palette+$103,x
iny
sta (vbxe),y ; G
lda palette+$104,x
iny
sta (vbxe),y ; B
inx
inx
inx
cpx #2
bne vbxe_setcolours2
ldx #0
vbxe_setcolours3
lda palette+$204,x
ldy #vb_cr
sta (vbxe),y ; R
lda palette+$205,x
iny
sta (vbxe),y ; G
lda palette+$206,x
iny
sta (vbxe),y ; Set Blue
inx
inx
inx
cpx #$fc
bne vbxe_setcolours3
ldy #2
sty vbxe_bank
jsr set_vbxe_bank ; Set to bank 2 for start of bitmap data
lda #0
ldy #vb_xdl_adr
sta (vbxe),y
iny
sta (vbxe),y
iny
sta (vbxe),y ; Set XDL address to $0000
lda #7
ldy #vb_video_control
sta (vbxe),y ; Set Video Control
rts
;
; Unpack segment of pixel data into RAMAC window
; and increment VBXE MEMAC Bank, used during pic load.
; 4K segments load at $8000-8FFF into RAMAC window
;
unpack_inc_bank
lda #<packed_pixels
sta fp21_get+1
lda #>packed_pixels
sta fp21_get+2
jsr fp21_start
inc_bank
lda ch
cmp #$ff ; Any key?
bne display_pic_stop
ldy vbxe_bank
iny
sty vbxe_bank
jsr set_vbxe_bank
dec load_count
bne inc_bank_end
ldx #<dl_main
ldy #>dl_main
stx sdslst
sty sdslst+1
lda #$d8
sta colpf1
lda #8
jsr waitvc
lda #7
jsr waitvc
inc_bank_end
rts
;
; Set VBXE MEMAC Bank. Y=bank number
;
set_vbxe_bank
tya
pha
ora #$80
ldy #vb_memac_bank_sel
sta (vbxe),y
pla
tay
rts
;
; Display picture
;
display_pic
ldx #<dl_main
ldy #>dl_main
stx sdslst
sty sdslst+1
lda #$d8
sta colpf1
display_pic_wait
lda ch
cmp #$ff ;Any key?
beq display_pic_continue
display_pic_stop
lda #0
tax
ldy #vb_video_control
sta (vbxe),y ; Clear any current VBXE modes
ldy #vb_memac_b_control
sta (vbxe),y ; Clear memory access window B
ldy #vb_memac_control
sta (vbxe),y ; Clear memory access window A
sta nmien
lda old_vblank
sta $222
lda old_vblank+1
sta $223
lda #$40
sta nmien
lda #12
sta $0342,x
jsr ciov
lda #3
sta $0342,x
sta $0349,x
lda #<ename
sta $0344,x
lda #>ename
sta $0345,x
jsr ciov
lda #$ff
sta ch
jmp (dosvec)
ename dta c'E:',$9b
display_pic_continue
ldx #3
cmp #$08 ;'O'
sne:ldx #0
stx switchval+1
jmp display_pic_wait ; Just loop for now
;
ert *>caption
ini displayer