Ciao ragazzi, vi mostro la mia ultima fatica
non è di certo un granchè graficamente, tecnicamente, o come idea, ma ho fatto del mio meglio!
cè ancora un po' di lavoro da fare, la sincronia del raster va a farsi friggere, penso a causa degli sprites (mi sa che faccio un po' troppe cose..)
comunque, ecco il codice, in allegato il compilato e le risorse incluse!
;*************************************
;*History repeats itself by Elder0010*
;*************************************
* = $0810;Sys 2064!
;******************
;*Inizializzazione*
;******************
sei ;via interrupts
jsr $1000;init music
lda #$00; nero
sta $d020 ; border background colour
sta $d021 ; screen background colour
JSR $E544 ;QUICK SCREEN CLEAR
lda #$18 ; screen at $0400 chars a $2000
sta $d016;multicolor!
lda #$1b
ldx #$08
ldy #$18
sta $d011 ; text mode
sty $d018 ; screen a $0400, charset a $2000
;**************
;*Clear screen*
;**************
ldx #$ff
lda #61 ; carattere vuoto
clrloop
sta $0400,x
sta $04e0,x
dex
bne clrloop
;**************
;*Disegno logo*
;**************
ldx #0
atoloop
lda $3000,x;Itero sul charset
sta $0400,x;e stampo su schermo
lda $30ff,x
sta $04ff,x;finchè necessario
;Colore
lda #$0f
sta $d800,x
sta $d8ff,x
inx
cpx #$e1
bne atoloop
lda #$0
sta $d022
sta $d023
;*****************
;*Disegno sprites*
;*****************
lda #$0f ;Sprite 0-1-2-3
sta $d015 ;accesi (infatti #$0f = 1111)
lda #$fd ;punto lo sprite 1 a $3f37 (siamo sempre nel banco VIC 1)
sta $07f8 ;e storo
;duplico lo sprite
sta $07f9 ;e storo sprite 1
sta $07fa ;e storo sprite 2
sta $07fb ;e storo sprite 3
lda #$30
sta $d000 ;coord. x sprite 0
sta $d004;coord. x sprite 2
lda #$2b
sta $d002 ; coord. x sprite 1
sta $d006 ; coord. x sprite 3
;*************************
;*prendo dalla sintable *
;*i valori di start per y*
;*************************
lda $5000
sta $d001 ; coord y sprite 0
sta $d007 ; coord y sprite 3
;Inverto per gli altri 2 sprites
eor $ff
sta $d003 ; coord y sprite 1
sta $d005;coord y sprite 4
lda #$0a;poichè la posizione x del secondo e del quarto
sta $d010;sprite è > $ff devo spostare questo valore
;1010
lda #$7 ;giallo per tutti..
sta $d027
sta $d028
sta $d029
sta $d02a
lda #$ff
sta $d01c
;Installo interrupt
lda #$7f
ldx #$01
sta $dc0d ; Turn off CIA 1 interrupts
sta $dd0d ; Turn off CIA 2 interrupts
stx $d01a ; Turn on raster interrupts
lda #<int
ldx #>int
sta $0314 ;store in interrupt vector
stx $0315
ldy #$0
sty $d012
lda $dc0d ; ACK CIA 1 interrupts
lda $dd0d ; ACK CIA 2 interrupts
asl $d019 ; ACK VIC interrupts
cli ; start interruzioni
jmp *
;*****************
;*Effetto "slimy"*
;*****************
int
lda #0
sta $d020
lda #$1b
ldx #$08
ldy #$18
sta $d011 ; Clear high bit di $d012: text mode
sty $d018
lda #$18 ; screen at $0400 chars a $2000
sta $d016; multicolor!
sliloop
ldx counter
inx
cpx #$aa
bne skipn;se arrivo ad #$aa resetto il contatore
ldx #$00
skipn
stx counter
lda $212e,x ; byte xesimo dai caratteri
eor $ff ; inverti
sta $212e,x ; store al suo posto
inx
lda #<int2
ldx #>int2
sta $0314
stx $0315
ldy #$92
sty $d012
asl $d019
pla
tay
pla
tax
pla
rti
;***********************
;*Visualizza messaggio *
;*e riproduce la musica*
;***********************
int2
lda #$0
sta $d020
lda #$1b
ldx #$08
ldy #$14
ldy #$1a
sta $d011
sty $d018
lda #$C8
sta $d016
ldx #$00
dispmsg lda message,x
cmp #$40
bcc charok
sec
sbc #$40
charok sta $0661,x
inx
cpx #$16
bne dispmsg
lda #<intsprites
ldx #>intsprites
sta $0314
stx $0315
ldy #$a9
sty $d012
asl $d019
pla
tay
pla
tax
pla
rti
;*******************
;*Movimento sprites*
;*******************
intsprites
lda #<int3
ldx #>int3
sta $0314
stx $0315
ldy #$fe
sty $d012
;carico valore offset
;precedentemente salvato
ldx sinoffset
;ciclo sintable
lda $5000+$00,x
sta $5000+$00
cpx #$80
bne addx
ldx #$0
jmp store
addx inx
jmp store
store
stx sinoffset;salvo per il prossimo giro
;stessa procedura dell'init, con valori aggiornati
;dalla sintable ciclata
lda $5000
sta $d001
sta $d007
eor #$ff
sta $d003
sta $d005
asl $d019
pla
tay
pla
tax
pla
rti
;********************
;*double interrupt *
;*per raster stabile*
;********************
int3
lda #<int4
sta $0314
sta $d019
inc $d012
cli
;---FINO A QUI MAX 18 CICLI (cosiderato caso peggiore)
;Aggiungo una serie di nop per "non fare nulla" intanto che
;l'altro interrupt viene eseguito
nop
nop
nop
nop
nop
nop
brk
align 2
*=*+1;
;la routine verrà eseguita con un ritardo di 2/3+7+29=38/39 cicli.
int4
asl $d019;6 = 58
lda #$ff ;2 = 60
cmp $d012 ;4 = 64 - siamo a 0 o 1 cicli
beq start ;3 con questo branch allineo l'ultimo
start ;ciclo di insicurezza
;*********************
;*un po di rasterbars*
;*********************
;todo: fix raster non realmente stabile :(
ldx #$0d
dex
bne *-1
rasterj
iny
lda colors,y
sta $d020
ldx #$87
dex
bne *-1
nop
cpy #$3
bne rasterj
sta $d020
sta $d021
nop
nop
nop
bit $24
lda #$0
sta $d020
sta $d021
;Tolgo i 6 bytes inseriti nello stack
;facendo push nell'accumulatore 6 volte
pla
pla
pla
pla
pla
pla
;e riparto da capo..
lda #<int
ldx #>int
sta $0314
stx $0315
ldy #$0
sty $d012
;rimetto apposto anche il registro $d012
lda #$34
sta $d012
jsr $1003
jmp $ea31
;-------------------------------------------------------------------
counter
.byte 8
sinoffset
.byte $1
message
.text "history repeats itself!"
colors
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
.byte $00,$07,$00,$07,$00,$07
;music
*=$1000
incprg "dawn.dat"
;atomic logo charset
*=$2000+2
incprg "atorle.chr"
;charset scritta
*=$2800
incprg "bombo.64c"
;graphic data logo
*=$3000
incprg "matrix.prg"
;sprite
*=$3f37
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $AA,$95,$50
.byte $55,$6A,$A0
.byte $55,$6A,$A0
.byte $55,$6A,$A0
.byte $55,$6A,$A0
.byte $55,$6A,$A0
.byte $55,$6A,$A0
.byte $55,$6A,$A0
.byte $55,$6A,$A0
.byte $55,$6A,$A0
.byte 0
;sinus table
*=$5000-26
incprg "sin_a.p00"