.EMPTYFILL $00 .SMSTAG .COMPUTESMSCHECKSUM .MEMORYMAP DEFAULTSLOT 0 SLOTSIZE $8000 SLOT 0 $0000 .ENDME .ROMBANKMAP BANKSTOTAL 1 BANKSIZE $8000 BANKS 1 .ENDRO .SDSCTAG 1.10,"LimitedChaos","VJ Tool Alpha","Furrtek" .DEFINE WRAM_Start $C000 .DEFINE WRAM_Lenght $1FFF .DEFINE Last_Random $C000 ; Dernier mot généré (seed du prochain) .DEFINE Last_Joypad $C002 ; Dernière valeur sur le port $DC .DEFINE Anim_Counter $C003 ; Compteur d'animation .DEFINE Speed $C004 ; VBLs à attendre pour chaque mise à jour de la VRAM .DEFINE HSpeed $C005 ; Vitesse de scroll horizontal en pixels/VBL .DEFINE HScroll $C006 ; Valeur du scroll horizontal .DEFINE VSpeed $C007 ; Vitesse de scroll vertical en pixels/VBL .DEFINE VScroll $C008 ; Valeur du scroll vertical .DEFINE RLIvalue $C009 ; Valeur du registre 10 .DEFINE Last_Interval $C00A ; Dernier interval entre deux taps .DEFINE BPM $C00B ; BPM en VBL/Kick .DEFINE VBLHandler $C00C ; Adresse du handler VBL .DEFINE Superscroll $C00E ; 1 si ça va vite .DEFINE Flags $C00F ; Flags :] .DEFINE VBLHandlerAux $C010 ; Adresse du handler VBL .DEFINE Palcopy $C012 ; Copie complète des 32 couleurs .DEFINE FadeOutSpeed $C032 ; :3 .DEFINE NumFades $C033 .DEFINE Last_JoypadD $C034 .DEFINE didvbl $C035 ; Test mode: 1+2 P1 et 1+2 P2 appuyés au démarrage = sprite de debug en bas au milieu .BANK 0 SLOT 0 .org $0000 di im 1 jp init .org $0010 ret .org $0038 vbli: push af push bc push de push hl in a,($BF) ld a,1 ld (didvbl),a ; Flag VBL ld hl,(VBLHandler) call callhandler ; Call premier handler ld hl,(VBLHandlerAux) ld a,l or h call nz,callhandler ; Call deuxième handler si présent pop hl pop de pop bc pop af ei reti .org $0066 rst $00 ; Reset retn init: ld sp,$DFF0 ld hl,WRAM_Start ; Clear RAM ld bc,WRAM_Lenght-32 ; Sinon ça efface les pushes de ClearRAM et le call... xor a call ClearRAM ld c,$BF ld hl,vdpdefs ld b,22 otir ; Réglage des 11 registres du VDP ld hl,$0020 ; Tile blanc, emplacement 1 call Addr_WVRAM ld b,8*4 ld a,$FF ldt: out ($BE),a dec b jr nz,ldt ld a,$0F ; Couleur A15 = blanc call Addr_CRAM ld a,$FF out ($BE),a ld a,%11100000 ; Screen ON + VBLI ld b,%10000001 call MajReg ld a,$03 ; Vitesse en VBL/maj ld (Speed),a ld de,1337 ; Seed ld (Last_Random),de ld hl,VBLhandler_anim ; Handler de l'anim du logo ld (VBLHandler),hl xor a ld (Flags),a ei waitintrodone: ld a,(Flags) or a jr z,waitintrodone ; Attend que l'affichage du logo soit terminée di ld hl,VBLhandler_user ; Handler interaction ld (VBLHandler),hl w: in a,($DC) xor $FF jr z,w ; Attend l'appui sur un bouton ld a,%00100100 ; Left column blank (pour avoir un scroll pas trop pourri) ld b,$00 call MajReg ei ;11111111 xor 11011111 = 00100000 ;11011111 xor 11011111 = 00000000 ;11011111 xor 11111111 = 00100000 le AND est là pour garder que les fronts montants ;$DC: 1up 1down 1left 1right 11 12 2up 2down ;$DD: 2left 2right 21 22 reset lp: ld hl,Last_Joypad in a,($DC) ld b,a ; B = actuel xor $FF ld c,a ; C = inverse de l'actuel ld a,(hl) ld (hl),b ; A = ancien xor b ; ancien xor actuel and c ; garder que les fronts montants bit 0,a ; 1Haut: plus rapide call nz,faster bit 1,a ; 1Bas: plus lent call nz,slower bit 2,a ; 1Gauche: scroll plus rapide call nz,superscrollon bit 3,a ; 1Droite: scroll plus lent call nz,superscrolloff bit 4,a ; 11: Inverser les palettes call nz,flippals bit 5,a ; 12: Nettoyer écran call nz,clearit ld hl,Last_JoypadD in a,($DD) ld b,a ; B = actuel xor $FF ld c,a ; C = inverse de l'actuel ld a,(hl) ld (hl),b ; A = ancien xor b ; ancien xor actuel and c ; garder que les fronts montants bit 2,a call nz,fadeout bit 3,a call nz,fadeoutnorand call waitvbl call waitvbl jp lp fadeout: call waitvbl call flippals call ReloadPals fadeoutnorand: ld hl,decpals ; Ajoute le handler pour le fadeout ld (VBLHandlerAux),hl ret callhandler: jp (hl) waitvbl: push af wvbl: ld a,(didvbl) or a jr z,wvbl xor a ld (didvbl),a ; Clear flag pop af ret decpals: ld a,(FadeOutSpeed) inc a ld (FadeOutSpeed),a cp $03 ; Vitesse du fadeout en VBLs ret nz xor a ld (FadeOutSpeed),a ld b,$20 ld hl,Palcopy ; Décrémente chaque composante pour chaque couleur fade: ld a,(hl) ld c,a and %00110000 jr z,dontdecblue ld a,c sub %00010000 ld c,a dontdecblue: ld a,c and %00001100 jr z,dontdecgreen ld a,c sub %00000100 ld c,a dontdecgreen: ld a,c and %00000011 jr z,dontdecred ld a,c sub %00000001 ld c,a dontdecred: ld (hl),c inc hl dec b jr nz,fade call ReloadPals ld a,(NumFades) ; Doit faire au moins 3 passages dans la fonction pour tout mettre dans le noir inc a ld (NumFades),a cp $04 ret nz xor a ld (NumFades),a ld hl,$0000 ld (VBLHandlerAux),hl ; Désactivation du hanlder fadeout ret superscrollon: push af ld a,$01 ld (Superscroll),a pop af ret superscrolloff: push af xor a ld (Superscroll),a pop af ret ClearRAM: push de ld (hl),a push hl pop de inc de ldir pop de ret ReloadPals: ld a,$00 call Addr_CRAM ; Remplit les deux palettes depuis (Palcopy) ld hl,Palcopy ld c,$BE ld b,$20 otir ret flippals: push af ld b,$20 ld de,Palcopy newpals: call getrand ld a,h ld (de),a inc de dec b jr nz,newpals call ReloadPals pop af ret faster: push af ld a,(Speed) dec a or a jr z,nolimitf ld (Speed),a nolimitf: pop af xor a ld (Anim_Counter),a ret slower: push af ld a,(Speed) inc a or a jr z,nolimits ld (Speed),a nolimits: pop af xor a ld (Anim_Counter),a ret clearit: push af unzeroh: call getrand ; Vitesses au hasard ld de,$C005 ld a,l and %00000111 ; Max:7-4=+3 Min:0-4=-4 sub $04 jr z,unzeroh ; Pas de vitesses nulles, merci ld (de),a unzerov: ld a,h and %00000111 sub $04 inc de inc de ; $C007 cp $F0 jr c,nocorrection sub 255-(28*8) nocorrection: jr z,unzerov ; Pas de vitesses nulles, merci ld (de),a ; plus compliqué pour la vitesse Y parce qu'on peut pas wraper pour faire une vitesse negative call getrand ; Une adresse au pif en VRAM ld a,h and %00111111 ld h,a ld a,l call Addr_WVRAM ld bc,$04FF ; Remplit $0FFF octets en VRAM avec un autre truc au pif call getrand nullvram: ld a,l xor h out ($BE),a dec bc ld a,b or c jr nz,nullvram pop af ret VBLhandler_anim: ld a,($C006) inc a cp $80 jr nz,continue ld a,$01 ; Set finished flag ld (Flags),a ret continue: ld ($C006),a sra a ; Diviser par 2 inc a ld c,a ld de,logomap ld b,$00 map: ld a,(de) inc de cp c jr nz,notile ; Pas le moment d'afficher ce tile push bc call makeaddr call Addr_WVRAM ld a,$01 out ($BE),a ; Tile blanc nop ; Timing vraie console pop bc notile: inc b jr nz,map ; Prochain test ret makeaddr: ld hl,$3800+(8*32)*2 sla b ld a,h adc a,$00 ld h,a ld l,b ret VBLhandler_user: ;$C005:vitesse, $C006:maj ;$C007:vitesse, $C008:maj call MajHScroll ld a,(Superscroll) or a call nz,MajHScroll call nz,MajHScroll call MajVScroll ld a,(Superscroll) or a call nz,MajVScroll call nz,MajVScroll ld hl,Anim_Counter ; Fout pas la merde en VRAM tant que le compteur à pas dépassé la vitesse inc (hl) ld a,(hl) inc hl ld b,(hl) cp b ret nz xor a ld (Anim_Counter),a call getrand ld a,l out ($BF),a ld a,h and %00111111 or %01000000 out ($BF),a ld bc,$0080 lpfuck: push hl call getrand ; Fout la même merde si le tirage est au dessus de $20 ld a,h ; 1 chance sur 8 que ça change pop hl cp $10 call c,getrand ld a,h out ($BE),a dec bc ld a,c or b jr nz,lpfuck ;Fuck cram ;call getrand ;ld a,h ;and %00011111 ;out ($BF),a ;ld a,%11000000 ;out ($BF),a ;ld a,h ;ld b,l ;xor b ;out ($BE),a ret MajHScroll: ld hl,$C005 ; Maj scroll H ld a,(hl) inc hl ld b,(hl) add a,b ld (hl),a ld b,$08 call MajReg ret MajVScroll: ld hl,$C007 ; Maj scroll V ld a,(hl) inc hl ld b,(hl) add a,b jr nc,nowrap ; Wrap à la con sur le scrolling vertical sub 28*8 nowrap: ld (hl),a ld b,$09 call MajReg Addr_WVRAM: push de push hl ld de,$4000 add hl,de ld a,l out ($BF),a ld a,h out ($BF),a pop hl pop de ret Addr_RVRAM: push hl ld a,l out ($BF),a ld a,h out ($BF),a pop hl ret MajReg: out ($BF),a ld a,b or %10000000 out ($BF),a ret Addr_CRAM: out ($BF),a ld a,%11000000 out ($BF),a ret getrand: push de push af ld de,(Last_Random) ld a,d ld h,e ld l,253 ; H=E L=253 or a sbc hl,de ; HL=HL-DE sbc a,0 sbc hl,de ld d,0 sbc a,d ld e,a sbc hl,de ; HL=HL-DE jr nc,Rand inc hl Rand: ld (Last_Random),hl pop af pop de ret silence: .db %10011111 .db %10111111 .db %11011111 .db %11111111 vdpdefs: .db %00000100,%10000000 .db %10000000,%10000001 .db %11111111,%10000010 .db %11111111,%10000011 .db %11111111,%10000100 .db %11111111,%10000101 .db %11111011,%10000110 .db %11110000,%10000111 .db %00000000,%10001000 .db %00000000,%10001001 .db %11111111,%10001010 logomap: ;32x8 .db $2E,$2D,$00,$2C,$00,$2B,$00,$2A,$00,$29,$28,$27,$26,$25,$24,$23,$22,$21,$20,$1F,$1E,$00,$1F,$20,$21,$22,$23,$24,$25,$26,$27,$28 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$1D,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 .db $01,$00,$0B,$0A,$0B,$00,$0D,$0E,$0F,$10,$11,$00,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$00,$00,$00,$21,$22,$00,$26,$27,$00,$29,$2A .db $02,$00,$00,$09,$00,$0C,$00,$0F,$00,$11,$00,$12,$13,$00,$17,$00,$00,$1A,$00,$00,$1D,$1E,$1F,$20,$00,$00,$25,$00,$00,$28,$00,$00 .db $03,$00,$00,$08,$00,$00,$00,$10,$00,$12,$00,$13,$00,$00,$00,$18,$00,$1B,$00,$00,$1E,$00,$00,$21,$22,$23,$24,$00,$00,$00,$00,$2D .db $04,$05,$06,$07,$08,$09,$00,$11,$00,$13,$00,$14,$15,$16,$00,$19,$1A,$00,$1C,$00,$1F,$00,$00,$22,$00,$00,$25,$26,$00,$2B,$2C,$00 .db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$23,$00,$00,$00,$00,$00,$00,$00,$00 .db $30,$2F,$2F,$2E,$2E,$2D,$2D,$2C,$2C,$2B,$2B,$2A,$2A,$29,$29,$28,$28,$27,$27,$26,$26,$25,$25,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C .org $7FF0 ;Formalitees .db "TMR SEGA"