;------------------------------------------------------ ; ; Sprite multiplexing demo ; ;------------------------------------------------------ .bios .page 1 .rom .start MAIN SETCPU equ $0180 MSXVER equ $002D RG1SAV equ $F3E0 RG9SAV equ $FFE8 SPRATR equ $1B00 SPRTBL equ $3800 CLIKSW equ $F3DB STATFL equ $F3E7 LINL32 equ $F3AF FORCLR equ $F3E9 SECS equ 5 N_SPRITES equ 16 MAIN: call INITDATA ; no key click xor a ld [CLIKSW],a ; Initializes TXT ld hl,$040F ld [FORCLR],hl ld a,32 ld [LINL32],a call INIT32 ; sprite patterns ld hl,SPRDATA ld de,SPRTBL ld bc,32 call LDIRVM ; font patterns ld hl,FONT ld de,0+32*8 ld bc,91*8 call LDIRVM ld hl,$2000+123/8 ld a,$11 call WRTVRM ; Bottom color ld hl,$1920 ld bc,$1E0 ld a,'z' call FILVRM ; sprites 16x16 ld a,[RG1SAV] or 2 ld b,a ld c,1 call WRTVDP ld e,50 ld a,[MSXVER] ; read MSX version or a jr z,@@MSX1 dec a jr z,@@NOPLUSTR ld e,60 dec a jr z,@@NOPLUSTR ld a,$80 call SETCPU @@NOPLUSTR: ld a,[RG9SAV] or 2 ld b,a ld c,9 call WRTVDP ; 50Hz @@MSX1: call DUMPMENU ld hl,$1840 ld a,$3E call WRTVRM xor a call PUTARROW ; installs interupt hook call INSTALLISR @@HANG: jp @@HANG INITDATA: ld hl,INITVAR1 ld de,SPRATTRAM ld bc,INITVAR2-INITVAR1 ldir ld hl,INITVAR2 ld de,CY ld bc,FIN-INITVAR2 ldir ld hl,CY DUMPCY: ld de,SPRATTRAM ld bc,16 @@LOOP1: ldi inc de inc de inc de jp pe,@@LOOP1 ret DUMPMENU: ld hl,$1800 ld de,TEXT ld bc,32 @@NEWLINE: ld a,l out ($99),a ld a,h and $3F or $40 out ($99),a @@PUTTEXT: ld a,[de] or a ret z cp 13 jr nz,@@NOCR add hl,bc ld a,l and $E0 ld l,a inc de jr @@NEWLINE @@NOCR: out ($98),a inc de jr @@PUTTEXT GOUP: call GETSPRY ld a,[hl] dec a cp 70 ret z ld [hl],a ld hl,CY jp DUMPCY GODOWN: call GETSPRY ld a,[hl] inc a cp 176 ret z ld [hl],a ld hl,CY jp DUMPCY GORIGHT: call LOOPDELAY ret nz ld hl,MOVING ld a,[hl] inc a cp 16 ret z ld [hl],a call PUTARROW ret GOLEFT: call LOOPDELAY ret nz ld hl,MOVING ld a,[hl] dec a cp 255 ret z ld [hl],a call PUTARROW ret GETSPRY: ld hl,CY ld a,[MOVING] add a,l jr nc,@@NOCARRY inc h @@NOCARRY: ld l,a ret PUTARROW: push af ld a,[OLDMOVING] ld de,NOARROW call PUTCHARS pop af ld [OLDMOVING],a ld de,ARROW PUTCHARS: add a,a ld hl,$18E0 add a,l ld l,a push hl out ($99),a ld a,h and $3F or $40 out ($99),a ld c,$98 ex de,hl outi outi ex de,hl pop hl ld a,32 add a,l jr nc,@@NOCARRY inc h @@NOCARRY: out ($99),a ld a,h and $3F or $40 out ($99),a ex de,hl outi outi ret LOOPDELAY: ld de,DELAY ld a,[de] dec a jr nz,@@NOEND ld a,SECS @@NOEND: ld [de],a ret ; ; Routine 0 ; RUT0: jp DUMPSPR ; ; Routine 1 (ARTRAG) ; RUT1: bit 6,a jp z,@@NOCOLLISION and 31 add a,a add a,a ld b,a ld a,[CURR_PLAN] add a,b ld e,a ; curr_plan + = (vdps0 & 31)*4; 5->20 ; sprt is the 32*4=128 copy of the SPRATR in RAM, ; n_sprt holds the number of valid bytes in sprt, ; curr_plan is the VDP sprite plan in sprt that is currently mapped on plane 0 (max priority) ld a,[N_SPRT] ld c,a ; c=48 ; In A rest of E(5TH SPRITE) / C ld a,e @@J1: sub c jp nc,@@J1 add a,c jp z,@@NOCOLLISION ld [CURR_PLAN],a ; curr_plan -= (curr_plan/(n_sprt)) * (n_sprt); ld e,a ld hl,SPRATR ld a,l out ($99),a ld a,h and $3F or $40 out ($99),a ld hl,SPRATTRAM ld d,0 add hl,de ; hl = sprt + curr_plan ld c,$98 ld a,[N_SPRT] sub e ld b,a ; b = n_sprt -curr_plan otir ld hl,SPRATTRAM ; hl = sprt ld b,e ; b = curr_plan otir ret @@NOCOLLISION: ld hl,SPRATR ld a,l out ($99),a ld a,h and $3F or $40 out ($99),a xor a ld [CURR_PLAN],a ld hl,SPRATTRAM ld c,$98 ld a,[N_SPRT] ld b,a otir @@ENDRUT: ret ; ; Routina 3 ; RUT2: ld hl,SPRATTRAM bit 6,a jp z,@@NO5TH ld a,[OFFSET] or a jp z,@@NOLDIR ld de,SPRATTRAM2 ld b,0 ld c,a ldir @@NOLDIR: add a,4 cp N_SPRITES*4 jr nz,@@NORESET @@NO5TH: xor a @@NORESET: ld [OFFSET],a jp DUMPSPR+3 ; ; Routine 3 ; RUT3: ld hl,SPRATTRAM bit 6,a jp z,@@NO5TH ld a,[OFFSET] or a jp z,@@NOLDIR ld de,SPRATTRAM2 ld b,0 ld c,a ldir @@NOLDIR: add a,16 cp N_SPRITES*4 jr nz,@@NORESET @@NO5TH: xor a @@NORESET: ld [OFFSET],a jp DUMPSPR+3 ; ; Routine 4 ; RUT4: ld hl,SPRATTRAM bit 6,a jp z,@@NO5TH ld e,a ld a,[OFFSET] or a jr z,@@NOLDIR cp 255 jr nz,@@NOINIT ld a,e and $3C add a,a add a,a @@NOINIT: ld c,a ld b,0 ld de,SPRATTRAM2 ldir @@NOLDIR: add a,16 and $3F jp @@NORESET @@NO5TH: ld a,255 @@NORESET: ld [OFFSET],a jp DUMPSPR+3 DUMPSPR: ld hl,SPRATTRAM ld de,SPRATR ld bc,(N_SPRITES*4)*256+$98 ld a,e out ($99),a ld a,d and $3F or $40 out ($99),a otir ret ; ; Interrupt routine ; ISR: di push af push bc push de push hl ex af,af' exx push af push bc push de push hl push ix push iy ld a,[STATFL] ld hl,ISRRET push hl ld hl,[FLICKRUT] jp [hl] ISRRET: ld c,8 in a,($AA) and $F0 add a,c out ($AA),a in a,($A9) bit 0,a jr nz,@@NUMBERS ld hl,CY ld de,CY+1 ld bc,15 ld [hl],116 ldir ld hl,CY call DUMPCY @@NUMBERS: ld hl,[FLICKRUT] ld c,0 in a,($AA) and $F0 add a,c out ($AA),a in a,($A9) bit 0,a jr nz,@@NOSETRUT0 call LOOPDELAY jp nz,@@CONT call DUMPMENU ld hl,$1840 ld a,l out ($99),a ld a,h and $3F or $40 out ($99),a ld a,$3E out ($98),a ld hl,RUT0 jp @@CONT @@NOSETRUT0: bit 1,a jr nz,@@NOSETRUT1 call LOOPDELAY jp nz,@@CONT xor a ld [OFFSET],a call DUMPMENU ld hl,$1860 ld a,l out ($99),a ld a,h and $3F or $40 out ($99),a ld a,$3E out ($98),a ld hl,RUT1 jp @@CONT @@NOSETRUT1: bit 2,a jr nz,@@NOSETRUT2 call LOOPDELAY jp nz,@@CONT xor a ld [OFFSET],a call DUMPMENU ld hl,$1880 ld a,l out ($99),a ld a,h and $3F or $40 out ($99),a ld a,$3E out ($98),a ld hl,RUT2 jp @@CONT @@NOSETRUT2: bit 3,a jr nz,@@NOSETRUT3 call LOOPDELAY jp nz,@@CONT xor a ld [OFFSET],a call DUMPMENU ld hl,$18A0 ld a,l out ($99),a ld a,h and $3F or $40 out ($99),a ld a,$3E out ($98),a ld hl,RUT3 jp @@CONT @@NOSETRUT3: bit 4,a jr nz,@@CONT call LOOPDELAY jp nz,@@CONT ld a,255 ld [OFFSET],a call DUMPMENU ld hl,$18C0 ld a,l out ($99),a ld a,h and $3F or $40 out ($99),a ld a,$3E out ($98),a ld hl,RUT4 @@CONT: ld [FLICKRUT],hl xor a call GTSTCK di or a jr z,@@ENDISR dec a jr nz,@@NOGOUP call GOUP jp @@ENDISR @@NOGOUP: cp 2 jr nz,@@NOGORIGHT call GORIGHT jp @@ENDISR @@NOGORIGHT: cp 4 jr nz,@@NOGODOWN call GODOWN jp @@ENDISR @@NOGODOWN: cp 6 call z,GOLEFT @@ENDISR: pop iy pop ix pop hl pop de pop bc pop af exx ex af,af' pop hl pop de pop bc pop af ei ret ; ; Installs interrupt hook ; INSTALLISR: di ld hl,$FD9F ld de,HOOK ld bc,5 ldir ld a,$C3 ld hl,ISR ld [$FD9F],a ld [$FD9F+1],hl ei ret ; ; Uninstalls interrupt hook (not used in this example! :P) ; REMOVEISR: di ld hl,HOOK ld de,$FD9F ld bc,5 ldir ei ret SPRDATA: DB 255,255,255,255,255,255,255,255 DB 255,255,255,255,255,255,255,255 DB 255,255,255,255,255,255,255,255 DB 255,255,255,255,255,255,255,255 ARROW: DB 't','u','v','w' NOARROW: DB ' ',' ',' ',' ' TEXT: DB " -=[SPRITE MULTIPLEXING DEMO]=-",13,13 DB " 0. NO FLICKER ROUTINE",13 DB " 1. PLANE SWAPPING",13 DB " 2. FIXED RING BUFFER (EVERY 1)",13 DB " 3. FIXED RING BUFFER (EVERY 4)",13 DB " 4. DYNAMIC RING BUFFER",0 FONT: db 000h,000h,000h,000h,000h,000h,000h,000h db 038h,038h,038h,038h,000h,038h,038h,000h db 0EEh,0EEh,088h,000h,000h,000h,000h,000h db 074h,074h,0FEh,074h,0FEh,074h,074h,000h db 038h,0FCh,0E0h,0FEh,00Eh,0FEh,038h,000h db 0C6h,0CEh,01Ch,038h,070h,0E6h,0C6h,000h db 078h,0E4h,0F0h,07Ah,0BCh,09Ch,07Ah,000h db 038h,038h,020h,000h,000h,000h,000h,000h db 01Ch,038h,038h,038h,038h,038h,01Ch,000h db 038h,01Ch,01Ch,01Ch,01Ch,01Ch,038h,000h db 038h,0BAh,07Ch,038h,07Ch,0BAh,038h,000h db 000h,038h,038h,0FEh,038h,038h,000h,000h db 000h,000h,000h,000h,000h,070h,060h,040h db 000h,000h,000h,0FEh,000h,000h,000h,000h db 000h,000h,000h,000h,000h,070h,070h,000h db 006h,00Eh,01Ch,038h,070h,0E0h,0C0h,000h db 038h,064h,0E2h,0E2h,0E2h,064h,038h,000h db 038h,078h,038h,038h,038h,038h,07Ch,000h db 07Ch,08Eh,01Eh,07Ch,0F0h,0E0h,0FEh,000h db 07Ch,08Eh,00Eh,03Ch,00Eh,08Eh,07Ch,000h db 01Ch,038h,070h,0E0h,0E4h,0FEh,004h,000h db 07Ch,040h,07Ch,00Eh,00Eh,08Eh,07Ch,000h db 07Ch,0E0h,0FCh,0E2h,0E2h,0E2h,07Ch,000h db 0FEh,00Eh,01Ch,038h,038h,038h,038h,000h db 07Ch,0E2h,0E2h,07Ch,0E2h,0E2h,07Ch,000h db 07Ch,0E2h,0E2h,0E2h,07Eh,002h,07Ch,000h db 000h,000h,038h,038h,000h,038h,038h,000h db 000h,000h,038h,038h,000h,038h,038h,020h db 01Ch,038h,070h,0E0h,070h,038h,01Ch,000h db 000h,000h,000h,0FEh,000h,0FEh,000h,000h db 070h,038h,01Ch,00Eh,01Ch,038h,070h,000h db 07Ch,08Eh,00Eh,01Ch,038h,000h,038h,000h db 038h,044h,09Ah,0A2h,09Ah,044h,038h,0FFh db 038h,074h,0E2h,0E2h,0FEh,0E2h,0E2h,000h db 0FCh,0E2h,0E2h,0FCh,0E2h,0E2h,0FCh,000h db 038h,064h,0E2h,0E0h,0E2h,064h,038h,000h db 0F8h,0E4h,0E2h,0E2h,0E2h,0E4h,0F8h,000h db 0FEh,0E0h,0E0h,0FCh,0E0h,0E0h,0FEh,000h db 0FEh,0E0h,0E0h,0FCh,0E0h,0E0h,0E0h,000h db 038h,064h,0E2h,0E0h,0E6h,062h,03Eh,000h db 0E2h,0E2h,0E2h,0FEh,0E2h,0E2h,0E2h,000h db 07Ch,038h,038h,038h,038h,038h,07Ch,000h db 07Eh,00Eh,00Eh,00Eh,08Eh,04Ch,038h,000h db 0E2h,0E4h,0E8h,0F0h,0E8h,0E4h,0E2h,000h db 0E0h,0E0h,0E0h,0E0h,0E0h,0E0h,0FEh,000h db 0E2h,0F6h,0EAh,0EAh,0E2h,0E2h,0E2h,000h db 0C2h,0E2h,0F2h,0EAh,0E6h,0E2h,0E2h,000h db 038h,064h,0E2h,0E2h,0E2h,064h,038h,000h db 0F8h,0E4h,0E2h,0E4h,0F8h,0E0h,0E0h,000h db 038h,064h,0E2h,0E2h,0EAh,064h,03Ah,000h db 0F8h,0E4h,0E2h,0E4h,0F8h,0E4h,0E2h,000h db 078h,0E4h,0F0h,07Ch,01Eh,08Eh,07Ch,000h db 0FEh,038h,038h,038h,038h,038h,038h,000h db 0E2h,0E2h,0E2h,0E2h,0E2h,0E2h,07Ch,000h db 0E2h,0E2h,0E2h,0E2h,074h,038h,010h,000h db 0E2h,0E2h,0E2h,0EAh,0EAh,0F6h,0E2h,000h db 0E2h,0E2h,074h,038h,074h,0E2h,0E2h,000h db 0E2h,0E2h,074h,038h,038h,038h,038h,000h db 0FEh,01Ch,038h,070h,0E0h,0E0h,0FEh,000h db 07Ch,070h,070h,070h,070h,070h,07Ch,000h db 0C0h,0E0h,070h,038h,01Ch,00Eh,006h,000h db 07Ch,01Ch,01Ch,01Ch,01Ch,01Ch,07Ch,000h db 038h,074h,0E2h,000h,000h,000h,000h,000h db 000h,044h,028h,010h,028h,044h,000h,000h db 000h,000h,000h,000h,000h,000h,000h,000h db 000h,000h,03Ch,00Eh,07Eh,08Eh,07Eh,000h db 0E0h,0E0h,0FCh,0E2h,0E2h,0E2h,0FCh,000h db 000h,000h,07Ch,0E2h,0E0h,0E2h,07Ch,000h db 00Eh,00Eh,07Eh,08Eh,08Eh,08Eh,07Eh,000h db 000h,000h,07Ch,0E2h,0FEh,0E0h,07Ch,000h db 000h,000h,03Ch,072h,070h,0FCh,070h,070h db 000h,000h,07Eh,08Eh,08Eh,07Eh,00Eh,07Ch db 0E0h,0E0h,0FCh,0E2h,0E2h,0E2h,0E2h,000h db 038h,000h,0F8h,038h,038h,038h,0FEh,000h db 00Eh,000h,01Eh,00Eh,00Eh,00Eh,08Eh,07Ch db 0E0h,0E0h,0E2h,0E4h,0E8h,0F4h,0E2h,000h db 0F8h,038h,038h,038h,038h,038h,0FEh,000h db 000h,000h,0F4h,0EAh,0EAh,0EAh,0EAh,000h db 000h,000h,0FCh,0E2h,0E2h,0E2h,0E2h,000h db 000h,000h,07Ch,0E2h,0E2h,0E2h,07Ch,000h db 000h,000h,0FCh,0E2h,0E2h,0FCh,0E0h,0E0h db 000h,000h,07Eh,08Eh,08Eh,07Eh,00Eh,00Eh db 000h,000h,0FCh,0E2h,0E0h,0E0h,0E0h,000h db 000h,000h,07Ch,0E0h,07Ch,00Eh,0FCh,000h DB $0F,$0F,$0F,$0F,$0F,$0F,$0F,$0F DB $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0 DB $FF,$7F,$3F,$1F,$0F,$07,$03,$01 DB $FF,$FE,$FC,$F8,$F0,$E0,$C0,$80 db 070h,070h,0FCh,070h,070h,072h,03Ch,000h db 000h,000h,0E2h,0E2h,0E2h,0E2h,07Ch,000h db 0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,000h INITVAR1: DB 76,0,0,2 DB 92,16,0,3 DB 108,32,0,4 DB 124,48,0,5 DB 124,64,0,6 DB 140,80,0,7 DB 156,96,0,8 DB 172,112,0,9 DB 76,128,0,10 DB 92,144,0,11 DB 108,160,0,12 DB 124,176,0,13 DB 124,192,0,14 DB 140,208,0,15 DB 156,224,0,2 DB 172,240,0,3 INITVAR2: DB 76,92,108,124,124,140,156,172,76,92,108,124,124,140,156,172 DB 0,0,SECS DW RUT0 DB 0,N_SPRITES*4 DB 0 FIN equ $ .page 3 HOOK: DS 5 SPRATTRAM: DS N_SPRITES*4 SPRATTRAM2: DS N_SPRITES*4 CY: DS 16 MOVING: DS 1 OLDMOVING: DS 1 DELAY: DS 1 FLICKRUT: DS 2 CURR_PLAN: DS 1 N_SPRT: DS 1 OFFSET: DS 1