/
FCSL.asm
1501 lines (1183 loc) · 34.5 KB
/
FCSL.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
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
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;------------------------------------------------------------------------------
; Titel: JuTe 6K Full-Color-Sprite-Library (6K-FCSL)
;
; Erstellt: 10.11.2023
;------------------------------------------------------------------------------
cpu z8601
assume RP:0C0h ; keine Register-Optimierung !
ENUM ROM, RAM, EXE
; ROM SP-Lib / ROM Version
; Lib-Code-Start: 3000h
; RAM-Start: 8300h
; RAM SP-Lib / RAM Version
; Lib-Code-Start: 8300h
; RAM-Start: Ende-Lib-Code
; EXE SP-Exe / RAM Version
; Lib-Code-Start: Ende-Programm-Code
; RAM-Start: Ende-Lib-Code
ENUM SHORT, LONG
; SHORT short CLR-Adr-Table (langsamer)
; LONG long CLR-Adr-Table (schneller)
ENUM SMALL, BIG
; SMALL Optimiert für Sprites <= 3x16 (schneller)
; BIG für Sprites > 3x16
ENUM SLOW, FAST
; SLOW VRAM Timing langsam
; FAST VRAM Timing schnell
;------------------------------------------------------------------------------
; Info's zur Registerbelegung aus Daten von V.Pohlers
;------------------------------------------------------------------------------
; 66h-6Bh ; frei ? Nicht benutzt im ASM-File es40-as.asm
save1 equ 6Ah ; Hilfs-Register
save2 equ 6Bh ; Hilfs-Register
;save1 equ var_U_hi ; Hilfs-Register
;save2 equ var_U_lo ; Hilfs-Register
;------------------------------------------------------------------------------
; Einstellung der Parameter
;------------------------------------------------------------------------------
;SP_VERSION equ ROM,RAM,EXE ; Schalter -D im Arnold-Assembler:
; -D SP_VERSION=(0,1,2)
SP_SIZE equ SMALL ; optimiert für Sprites <= 3x16
CLR_TAB equ LONG ; long CLR-Adr-Table (schneller)
VRAM_TIMING equ FAST ; schneller Zugriff auf VRAM
;------------------------------------------------------------------------------
; Sprite-Definition
;------------------------------------------------------------------------------
SP_X_BYTES equ 3 ; 3 Bytes -> X = 16 Pixel + 8 Shift-Bits
SP_Y_LINES equ 16 ; 16 Zeilen -> Y = 16 Zeilen
SP_COLOR_MAPS equ 4 ; 4 Farb-Bänke -> C = 16 Farben pro Pixel
SP_XY_BYTES equ SP_X_BYTES*SP_Y_LINES
;------------------------------------------------------------------------------
if SP_VERSION == ROM ; SP-Lib / ROM Version
org 3000h
include ..\ES4.0\es40_inc.asm
elseif SP_VERSION == RAM ; SP-Lib / RAM Version
org 8300h
include ..\ES4.0\es40_inc.asm
endif
;------------------------------------------------------------------------------
; Datenstrukturen
;------------------------------------------------------------------------------
if SP_VERSION == ROM ; SP-Lib ROM Version
RAM_START equ 8300h
endif
VRAM equ 4000h
VRAM_END equ 5FFFh
VRAM_LEN equ VRAM_END - VRAM
VRAM_TAB_HI equ RAM_START ; muss xx00-Adr. sein
VRAM_TAB_LO equ RAM_START+100h ; muss xx00-Adr. sein
SP_BASE equ RAM_START+200h ; muss xx00-Adr. sein
;------------------------------------------------------------------------------
MAP STRUCT
red ds SP_XY_BYTES
green ds SP_XY_BYTES
blue ds SP_XY_BYTES
bright ds SP_XY_BYTES
mask ds SP_XY_BYTES
if SP_SIZE == SMALL
align 100h
endif
MAP ENDSTRUCT
;------------------------------------------------------------------------------
MAPS STRUCT
MAP0 MAP
MAP1 MAP
MAP2 MAP
MAP3 MAP
MAP4 MAP
MAP5 MAP
MAP6 MAP
MAP7 MAP
MAPS ENDSTRUCT
;------------------------------------------------------------------------------
BG_BUFFER STRUCT
ds SP_XY_BYTES*SP_COLOR_MAPS
BG_BUFFER ENDSTRUCT
;------------------------------------------------------------------------------
SET_TABLE STRUCT
ds SP_XY_BYTES*2 ; 48*2 (VRAM-Adr.)
SET_TABLE ENDSTRUCT
;------------------------------------------------------------------------------
CLR_TABLE STRUCT
if CLR_TAB == LONG ; Sprite-CLR VRAM-Adr.-Table LONG (576 Bytes)
; 48*4*2 = 384 (VRAM-Adr.) + 48*4 = 192 (BG)
ds SP_XY_BYTES*SP_COLOR_MAPS*2 + SP_XY_BYTES*SP_COLOR_MAPS
else ; Sprite-CLR VRAM-Adr.-Table SHORT (192 Bytes)
ds SP_XY_BYTES*2 ; 48*2 (VRAM-Adr.)
endif
CLR_TABLE ENDSTRUCT
;------------------------------------------------------------------------------
; max. 160 Byte (bei 3x16, LONG, SMALL)
STATUS STRUCT ; max. 128 Byte (bei 3x16, SHORT, SMALL)
;stepw dw ? ;T
;steps dw ? ;U
;dir dw ? ;V
;data dw ? ;W
x dw ? ;X
y dw ? ;Y
;slot dw ? ;Z
STATUS ENDSTRUCT
;------------------------------------------------------------------------------
SP STRUCT
MAPS MAPS ; SP_MAP 0-7, SP_MASK 0-7
BG_BUFFER BG_BUFFER ; Hintergrund-Puffer
SET_TABLE SET_TABLE ; Sprite-SET VRAM-Adr.-Table
CLR_TABLE CLR_TABLE ; Sprite-CLR VRAM-Adr.-Table
STATUS STATUS ;
if SP_SIZE == SMALL
align 100h
endif
SP ENDSTRUCT
;------------------------------------------------------------------------------
; Macro für Zugriff auf Pointer im Slot N per Slot-Nummer
;
; in: index = Index für Pointer
; var_Z_lo = Slot N
;
; out: Pointer auf Daten im Slot N (regHI, regLO)
;------------------------------------------------------------------------------
if SP_SIZE == SMALL
getp MACRO index, regHI, regLO
ld r0, #hi(slot_table)
ld r1, #lo(slot_table)
add r1, var_Z_lo ; @rr0 = Slot
lde regHI, @rr0
ld regLO, #0
add regLO, #lo(index)
adc regHI, #hi(index) ; @reg = Pointer in Slot N
ENDM
else
getp MACRO index, regHI, regLO
ld r0, #hi(slot_table)
ld r1, #lo(slot_table)
ld regLO, var_Z_lo
rl regLO
add r1, regLO
adc r0, #0 ; @rr0 = Slot
lde regHI, @rr0
incw rr0
lde regLO, @rr0
add regLO, #lo(index)
adc regHI, #hi(index) ; @reg = Pointer in Slot N
ENDM
endif
if SP_SIZE == SMALL
align 100h
endif
;------------------------------------------------------------------------------
; Interface
;------------------------------------------------------------------------------
INIT_SPRITE: jp init_sprite0 ; xx00
SET_SPRITE: jp set_sprite0 ; xx03
CLR_SPRITE: jp clear_sprite0 ; xx06
MOVE_SPRITE: jp move_sprite0 ; xx09
WALK_SPRITE: jp walk_sprite0 ; xx0C
;------------------------------------------------------------------------------
; Slots 0-7
if SP_SIZE == SMALL
slot_table: db hi(SP_BASE)
db hi(SP_BASE + 1*SP_LEN)
db hi(SP_BASE + 2*SP_LEN)
db hi(SP_BASE + 3*SP_LEN)
db hi(SP_BASE + 4*SP_LEN)
db hi(SP_BASE + 5*SP_LEN)
db hi(SP_BASE + 6*SP_LEN)
db hi(SP_BASE + 7*SP_LEN)
else
slot_table: dw SP_BASE
dw SP_BASE + 1*SP_LEN
dw SP_BASE + 2*SP_LEN
dw SP_BASE + 3*SP_LEN
dw SP_BASE + 4*SP_LEN
dw SP_BASE + 5*SP_LEN
dw SP_BASE + 6*SP_LEN
dw SP_BASE + 7*SP_LEN
endif
;------------------------------------------------------------------------------
; X/Y Postion des Sprites merken
;------------------------------------------------------------------------------
save_xy: getp SP_STATUS_x, r2, r3
ld r4, #var_X_hi
ldei @rr2, @r4 ; SP_STATUS_x = var_X
ldei @rr2, @r4
ldei @rr2, @r4 ; SP_STATUS_y = var_Y
ldei @rr2, @r4
ret
;------------------------------------------------------------------------------
; X/Y Postion des Sprites holen
;------------------------------------------------------------------------------
get_xy: getp SP_STATUS_x, r2, r3
ld r4, #var_X_hi
ldei @r4, @rr2 ; var_X = SP_STATUS_x
ldei @r4, @rr2
ldei @r4, @rr2 ; var_Y = SP_STATUS_y
ldei @r4, @rr2
ret
;------------------------------------------------------------------------------
; Intialisiert einen Sprite und stellt ihn auf dem Bildschirm dar. Es werden
; alle benötigten Sprite-Daten (pre shifted) im JuTe 6K Format aus dem Sprite-
; Export aus AkuSprite (https://www.chibiakumas.com/akusprite) erstellt.
;
; in:
; var_W_hi = Pointer auf Sprite-Definition (hi) aus AkuSprite
; var_W_lo = Pointer auf Sprite-Definition (lo) aus AkuSprite
;
; var_X_hi = X-Pos-hi
; var_X_lo = X-Pos-lo
;
; var_Y_hi = 0
; var_Y_lo = Y-Pos-lo
;
; var_Z_lo = Sprite-Slot
;------------------------------------------------------------------------------
init_sprite0: push rp
srp #70h
call save_xy
call make_vram_tab
call make_sp_maps
call make_sp_set_table
call write_sprite
call make_sp_clr_table
pop rp
ret
;------------------------------------------------------------------------------
; Stellt einen Sprite an einer neuen Position zum Zeitpunkt (t) dar, und löscht
; ihn an der Postion zum Zeitpunkt (t-1). Der Hintergrund zum Zeitpunkt (t) wird
; gerettet, der Hintergrund vom Zeitpunkt (t-1) wird wieder hergestellt.
;
; Für die Zugriffe auf den VRAM stehen nur 8 ms in der Austastlücke zur Verfügung.
;
; ---+ +----------------+
; | | |
; | | |
; +------------------------+ +------------------
;
; <----------------------->|<-------------->|
; 12ms 8ms
;
;
; Das ist notwendig, weil:
;
; 1. Damit ein Sprite ohne Flackern dargestellt wird (für Sprites <= 3x16)
; 2. Die Störungen bei VRAM-Zugriff durch die CPU verhindert werden.
;
;------------------------------------------------------------------------------
; in:
; var_X_hi = X-Pos-hi
; var_X_lo = X-Pos-lo
;
; var_Y_hi = 0
; var_Y_lo = Y-Pos-lo
;
; var_Z_lo = Sprite-Slot
;
; out: Sprite an neuer Position,
;------------------------------------------------------------------------------
move_sprite0: push rp
srp #70h
call save_xy
call move_sprite00
pop rp
ret
;------------------------------------------------------------------------------
move_sprite00: ; bei Sprite 3x16 und
; SP_SIZE = SMALL und
; CLR_TAB = LONG und
; VRAM_TIMING = FAST
; gilt:
; |
call make_sp_set_table ; 1,120 ms |
; +-----+ <-- Sync.
call clear_sprite ; 2,099 ms |
ld r2, #0 ; | 7,5 ms !!!
call write_sprite ; 5,387 ms |
; +-----+
call make_sp_clr_table ; 4,690 ms |
; |
ret ; |
;------------------------------------------------------------------------------
; Stellt einen Sprite auf dem Bildschirm dar. Für das Löschen wird der
; Hintergrund gerettet und die CLR-Table dazu wird erstellt. Zum Löschen
; kann CLR_SPRITE aufgerufen werden.
;
; in: var_X_hi = X-Pos-hi
; var_X_lo = X-Pos-lo
;
; var_Y_hi = 0
; var_Y_lo = Y-Pos-lo
;
; var_Z_lo = Sprite-Slot
;
; out: Sprite an neuer Position
;------------------------------------------------------------------------------
set_sprite0: push rp
srp #70h ; bei Sprite 3x16 und
call save_xy ; SP_SIZE = SMALL und
; CLR_TAB = LONG und
; VRAM_TIMING = FAST
; gilt:
; |
call make_sp_set_table ; 1,120 ms |
; |
ld r2, #0 ; +-----+ <-- Sync.
call write_sprite ; 5,387 ms |
; | 9,9 ms
call make_sp_clr_table ; 4,690 ms |
; +-----+
pop rp ; |
ret
;------------------------------------------------------------------------------
; Löscht einen Sprite an der zuvor mit SET_SPRITE, MOVE_SPRITE oder WALK_SPRITE
; gesetzten Position.
;
; in: var_Z_lo = Sprite-Slot
;
; out: Sprite gelöscht und Hintergrund (t-1) wieder hergestellt.
;------------------------------------------------------------------------------
clear_sprite0:
push rp
srp #70h
call clear_sprite
pop rp
ret
;------------------------------------------------------------------------------
; Bewegt einen Sprite um W Schritte, mit der Schrittweite X in die Richtung Y.
; In V kann eine Verzögerung von V * 1ms eingestellt werden. Es sollte 0
; oder ein Vielfaches von 15-20ms eingestellt werden (z.B. 20, 40, 60, ...) um
; synchron zur Austastlücke zu bleiben.
;
;
; in: var_V_hi = Timer hi
; var_V_lo = Timer lo Richtungen:
;
; var_W_hi = Anzahl Schritte hi
; var_W_lo = Anzahl Schritte lo up(0)
; uple(7) upri(4)
; var_X_lo = Schrittweite
; le(3) ri(1)
; var_Y_lo = Richtung
; dole(6) dori(5)
; var_Z_lo = Sprite-Slot do(2)
;
;------------------------------------------------------------------------------
ENUM up, ri, do, le, upri, dori, dole, uple
stepw equ var_Y_hi
dir equ var_Z_hi
walk_sprite0:
push rp
srp #70h
push var_W_hi
push var_W_lo
push var_X_hi
push var_X_lo
push var_Y_lo
push var_X_lo ; stepw
push var_Y_lo ; dir
call get_xy ; hole X/Y(t-1)
pop dir
pop stepw
;---------------------------------------------
walp: cp dir, #up
jr nz, wasp1
sub var_Y_lo, stepw
jr waset
wasp1: cp dir, #do
jr nz, wasp2
add var_Y_lo, stepw
jr waset
wasp2: cp dir, #ri
jr nz, wasp3
add var_X_lo, stepw
adc var_X_hi, #0
jr waset
wasp3: cp dir, #le
jr nz, wasp4
sub var_X_lo, stepw
sbc var_X_hi, #0
jr waset
;---------------------------------------------
wasp4: cp dir, #upri
jr nz, wasp5
sub var_Y_lo, stepw
add var_X_lo, stepw
adc var_X_hi, #0
jr waset
wasp5: cp dir, #dori
jr nz, wasp6
add var_Y_lo, stepw
add var_X_lo, stepw
adc var_X_hi, #0
jr waset
wasp6: cp dir, #dole
jr nz, wasp7
add var_Y_lo, stepw
sub var_X_lo, stepw
sbc var_X_hi, #0
jr waset
wasp7: cp dir, #uple
jr nz, wasp8
sub var_Y_lo, stepw
sub var_X_lo, stepw
sbc var_X_hi, #0
jr waset
;---------------------------------------------
wasp8: jr waspend
waset: call move_sprite00
call timer0
decw var_W_hi ; Schritte - 1
jp nz, walp
call save_xy ; X/Y(t) merken
waspend: clr var_Z_hi
clr var_Y_hi
pop var_Y_lo
pop var_X_lo
pop var_X_hi
pop var_W_lo
pop var_W_hi
pop rp
ret
;------------------------------------------------------------------------------
; Stellt einen Sprite auf dem Bildschirm dar und rettet den Hintergrund.
;
; in: var_X_lo = X-Pos-lo
; var_Z_lo = Sprite-Slot
; SET_ADR_TABLE
;
; out: Sprite an neuer Position
;
; intern:
; r0 getp
; r1 getp
; r2 Flag: MOVE = 0, SET = 1
; r3* SP_COLOR_MAPS
; r4* Masken-Transfer
; r5* Sprite-Transfer
; r6* VRAM hi / temp
; r7* VRAM lo / temp
; r8* SP_MASK hi
; r9* SP_MASK lo
; r10* SP_MAP hi
; r11* SP_MAP lo
; r12* BG-Buffer hi / temp
; r13* BG-Buffer lo
; r14* Farb-Register hi
; r15* Farb-Register lo
; SPH SET_ADR_TABLE hi
; SPL SET_ADR_TABLE lo
; save1 SPH merken
; save2 SPL merken
;
; Laufzeit: 21550 T x 0,25µs = 5,387 ms
;------------------------------------------------------------------------------
write_sprite:
; Sync. mit Austastlücke
clvtpbusw: tm p3, #4 ; Port 3
jr NZ, clvtpbusw ; warten, bis not BUSY
getp SP_MAPS, r10, r11
if SP_SIZE == SMALL
ld r12, var_X_lo
and r12, #00000111b ; 8 Maps (0-7)
add r10, r12 ; Sprite-MapN ermitteln
ld r8, r10 ; MASK-Pointer hi
ld r9, #MAP_mask ; MASK-Pointer lo
else
; var_X * MAPS_LEN
ld r12, var_X_lo
and r12, #00000111b ; 8 Maps (0-7)
cp r12, #0
jr z, ws2
ws1: add r11, #lo(MAP_LEN) ; Sprite-MapN ermitteln
adc r10, #hi(MAP_LEN)
djnz r12, ws1
ws2: ld r8, r10
ld r9, r11
add r9, #lo(MAP_mask) ; MASK-Pointer
adc r8, #hi(MAP_mask)
endif
getp SP_BG_BUFFER, r12, r13
ld r3, #SP_COLOR_MAPS ; 4 Farb-Bänke
ld r14, #60h ; Farb-Register hi
ld r15, #01111111b ; Farb-Bank 0
lde @rr14, r15
DI
ld save1, SPH
ld save2, SPL
if VRAM_TIMING == SLOW
ld p01m, #0B2h ; Ports 0-1 mode, langsames Timing für ext. Speicher
endif
bkloop:
getp SP_SET_TABLE, r6, r7
ld sph, r6
ld spl, r7
rept SP_XY_BYTES
pop r7 ; 10 VRAM lo Adresse holen
pop r6 ; 10 VRAM hi Adresse holen
lde r5, @rr6 ; 12 VRAM holen
lde @rr12, r5 ; 12 Hintergrund retten
lde r4, @rr8 ; 12 Maske holen
and r5, r4 ; 6 Spritebereich aus HG ausblenden
lde r4, @rr10 ; 12 Sprite holen
or r5, r4 ; 6 Sprite und HG kombinieren
lde @rr6, r5 ; 12 VRAM schreiben
if SP_SIZE == SMALL
inc r11 ; 6 inc Sprite-Pointer
inc r13 ; 6 inc BG-Buffer-Pointer
inc r9 ; 6 inc Mask-Pointer
else
incw rr10 ;(10)inc Sprite-Pointer
incw rr12 ;(10)inc BG-Buffer-Pointer
incw rr8 ;(10)inc Mask-Pointer
endif
endm ;-------
;110 T x 48 x 4 = 21120 T = 5,280 ms
rr r15 ; Farb-Bänke 1-3
lde @rr14, r15
if SP_SIZE == SMALL
ld r9, #MAP_mask ; MASK-Pointer lo
else
sub r9, #lo(SP_XY_BYTES) ; MASK-Pointer
sbc r8, #hi(SP_XY_BYTES)
endif
dec r3
jp nz, bkloop
if VRAM_TIMING == SLOW
ld p01m, #92h ; Ports 0-1 mode, schnelles Timing für ext. Speicher
endif
ld SPH, save1
ld SPL, save2
EI
cp r2, #1 ; r2 = 1 -> SET-Mode
jr nz, setnc1
setnc2: tm p3, #4 ; Port 3
jr Z, setnc2 ; warten, bis BUSY (Ende Austastlücke)
setnc1: ret
;------------------------------------------------------------------------------
;
; in: var_X_hi = X-Pos-hi
; var_X_lo = X-Pos-lo
;
; var_Y_hi = 0
; var_Y_lo = Y-Pos-lo
;
; var_Z_lo = Sprite-Slot
;
; out: SET_ADR_TABLE
;
; intern:
; r0 getp
; r1 getp
; r2* #hi(VRAM_TAB_HI)
; r3* XBY_to_vram
; r4* #hi(VRAM_TAB_LO)
; r5* XBY_to_vram
; r6* VRAM hi / temp
; r7* VRAM lo / temp
; r8* XBY_to_vram
; r9* SP_X_BYTES
; r10* SP_Y_LINES
; r11 -
; r12 -
; r13 -
; r14 -
; r15 -
; SPH SET_ADR_TABLE hi
; SPL SET_ADR_TABLE lo
; save1 SPH merken
; save2 SPL merken
;
; Laufzeit: 4516 T x 0,25µs = 1,12 ms
;------------------------------------------------------------------------------
make_sp_set_table:
ld r2, #hi(VRAM_TAB_HI) ; für xy_to_vram
ld r4, #hi(VRAM_TAB_LO) ; für xy_to_vram
ld r10, #SP_Y_LINES
ld r3, var_Y_lo
add r3, #SP_Y_LINES-1
ld r8, var_X_lo ; r8 = x / 8 (x = 0-319)
and r8, #11111000b
or r8, var_X_hi
rl r8
swap r8
add r8, #SP_X_BYTES-1
DI
ld save1, SPH
ld save2, SPL
getp SP_SET_TABLE + SET_TABLE_LEN, r6, r7
ld sph, r6
ld spl, r7
mvtbaset1:
ld r5, r3 ; VRAM Adresse holen
lde r6, @rr2
lde r7, @rr4
add r7, r8
ld r9, #SP_X_BYTES
btlpmvtset:
push r6
push r7
dec r7
djnz r9, btlpmvtset
dec r3
djnz r10, mvtbaset1
ld SPH, save1
ld SPL, save2
EI
ret
;-------------------------------------------------------------------------------
; Löscht einen Sprite auf dem Bildschirm an Position x,y(t-1) und stellt den
; mit 'set_sprite' überschriebenen Hintergrund vollständig wieder her.
;
; in: CRL_ADR_TABLE
;
; out: Sprite an Position x,y(t-1) gelöscht.
;
; intern:
; r0 getp
; r1 getp
; r2 -
; r3* SP_COLOR_MAPS
; r4 -
; r5* für BG-Transfer
; r6* VRAM hi
; r7* VRAM lo
; r8 -
; r9 -
; r10 -
; r11 -
; r12* BG-Buffer hi
; r13* BG-Buffer lo
; r14* Farb-Register hi
; r15* Farb-Register lo
;
; SPH CLR_ADR_TABLE hi
; SPL CLR_ADR_TABLE lo
; save1 SPH merken
; save2 SPL merken
;
; Laufzeit: 9994 T x 0,25µs = 2,498 ms -> SHORT CLR-Table
; 8398 T x 0,25µs = 2,099 ms -> LONG CLR-Table
;------------------------------------------------------------------------------
clear_sprite: ;push rp
;srp #70h
; Sync. mit Austastlücke
clvtpbus: tm p3, #4 ; Port 3
jr NZ, clvtpbus ; warten, bis not BUSY
getp SP_BG_BUFFER, r12, r13
ld r3, #SP_COLOR_MAPS ; 4 Farb-Bänke
ld r14, #60h ; Farb-Register hi
ld r15, #01111111b ; Farb-Bank 0
lde @rr14, r15
DI
ld save1, SPH
ld save2, SPL
if CLR_TAB == LONG
getp SP_CLR_TABLE, r6, r7
ld sph, r6
ld spl, r7
endif
if VRAM_TIMING == SLOW
ld p01m, #92h ; Ports 0-1 mode, schnelles Timing für ext. Speicher
endif
fblp:
if CLR_TAB == SHORT
getp SP_CLR_TABLE, r6, r7
ld sph, r6
ld spl, r7
endif
rept SP_XY_BYTES
pop r7 ; 10 VRAM lo Adresse holen
pop r6 ; 10 VRAM hi Adresse holen
if CLR_TAB == LONG
pop r5 ; 10 Hintergrund holen
else
lde r5, @rr12 ; 12 Hintergrund holen
incw rr12 ; 10 incw rr12 für BIG
endif
lde @rr6, r5 ; 12 VRAM schreiben
endm ;---
; 50 T x 48 x 4 = 9600 T = 2,400 ms SMALL
;(42)T x 48 x 4 = 8064 T = 2,016 ms LONG
rr r15 ; Farb-Bänke 1-3
lde @rr14, r15
dec r3
jp nz, fblp
if VRAM_TIMING == SLOW
ld p01m, #92h ; Ports 0-1 mode, schnelles Timing für ext. Speicher
endif
ld SPH, save1
ld SPL, save2
EI
;pop rp
ret
;------------------------------------------------------------------------------
;
; in: var_X_hi = X-Pos-hi
; var_X_lo = X-Pos-lo
;
; var_Y_hi = 0
; var_Y_lo = Y-Pos-lo
;
; var_Z_lo = Sprite-Slot
;
; out: CRL_ADR_TABLE
;
; intern:
; r0 getp
; r1 getp
; r2* #hi(VRAM_TAB_HI)
; r3* XBY_to_vram
; r4* #hi(VRAM_TAB_LO)
; r5* XBY_to_vram
; r6* VRAM hi
; r7* VRAM lo
; r8* XBY_to_vram
; r9* SP_X_BYTES
; r10* SP_Y_LINES
; r11* SP_COLOR_MAPS
; r12* BG-Buffer hi
; r13* BG-Buffer lo
; r14 -
; r15 -
; save1 SPH merken
; save2 SPL merken
; SPH CLR_ADR_TABLE hi
; SPL CLR_ADR_TABLE lo
;
; Laufzeit: 3184 T x 0,25µs = 0,796 ms -> SHORT CLR-Table
; 18762 T x 0,25µs = 4,690 ms -> LONG CLR-Table
;------------------------------------------------------------------------------
make_sp_clr_table:
ld r2, #hi(VRAM_TAB_HI) ; für xy_to_vram
ld r4, #hi(VRAM_TAB_LO) ; für xy_to_vram
if CLR_TAB == LONG
getp SP_BG_BUFFER + BG_BUFFER_LEN - 1, r12, r13
ld r11, #SP_COLOR_MAPS ; 4 Farb-Bänke
endif
ld r8, var_X_lo ; r8 = x / 8 (x = 0-319)
and r8, #11111000b
or r8, var_X_hi
rl r8
swap r8
add r8, #SP_X_BYTES-1
DI
ld save1, SPH
ld save2, SPL
getp SP_CLR_TABLE + CLR_TABLE_LEN, r6, r7
ld sph, r6
ld spl, r7
fblpmvt2:
ld r10, #SP_Y_LINES
ld r3, var_Y_lo
add r3, #SP_Y_LINES-1
mvtba12:
ld r5, r3 ; VRAM-Adresse holen
lde r6, @rr2
lde r7, @rr4
add r7, r8
ld r9, #SP_X_BYTES
btlpmvt2:
if CLR_TAB == LONG
lde r5, @rr12
decw rr12
push r5 ; Hintergrund speichern
endif
push r6 ; VRAM-Adresse speichern
push r7
dec r7
djnz r9, btlpmvt2
dec r3
djnz r10, mvtba12
if CLR_TAB == LONG
djnz r11, fblpmvt2
endif
ld SPH, save1
ld SPL, save2
EI
ret
;------------------------------------------------------------------------------
; Erstellt alle 8 Sprite-Maps eines Sprites
;
; in: SP_DATA = Pointer auf Sprite-Definition (aus AcuSprite)
; SP_MAP = Pointer auf Sprite-Map0
;
; out: SP_MAP => Sprite-Map0-7 für jede Bit-Position
;
;------------------------------------------------------------------------------
make_sp_maps:
call make_sprite_map ; Erzeuge Sprite-Map0 aus Sprite-Editor-Daten
call make_sprite_mask
call copy_sprite_maps ; Kopiere Sprite-Map0 zu Sprite-Map1-7
ld r4, #1 ; Zähler für 8 Bit-Positionen in X-Richtung (Anzahl Verschiebungen)
getp SP_MAPS, r14, r15
add r15, #lo(MAP_LEN)
adc r14, #hi(MAP_LEN)