Ho dovuto metterlo un po' in ordine perché era vergognosamente incasinato... comunque ecco il source code:
; **************************
; * Variabili in Zero page *
; **************************
;
pvsinus = $E0 ; 2 byte - Puntatore sinus height (Modifica altezza)
pysinus = $E2; 2 byte - Puntatore sinus vertical position (Modifica posizione Y)
pchar = $E4; 2 byte - Puntatore carattere corrente
pstring = $E6; 2 byte - Puntatore stringa corrente
fxheight = $E8; Altezza effetto 1-256 (0)
fxypos = $E9; Posizione effetto
pxsinus = $Ea; Puntatore sinus horizontal position (Movimento posizione X)
bitheight = $Eb ; Contatore verticale 5 bit - (dimensione verticale singolo bit)
charheight = $Ec; Contatore font 3 bit (carattere)
compare = $Ed ; valore di confronto (ampiezza effetto)
nextjmp = $Ee ; Necessario per la costruzione dinamica degli split
temp = $Ef; Uso generico
pline = $F0; Puntatore alla prima linea da splittare
; ****************************
; * Valori da non modificare *
; ****************************
opcode_sty = $8c ; Opcode per sta abs (valore 0)
opcode_sta = $8d ; Opcode per sta abs (valore 0)
opcode_stx = $8e ; Opcode per stx abs (valore 1)
bgcolor = $d020; Indirizzo di gestione del colore di sfondo
opcode_jmp = $4c ; Opcode per jmp abs
NPixel = 9 ; Numero di pixel (7+1 split, l'ultimo ripristina il colore di sfondo)
ypos = (($130-2-height)/2)-3; posizione verticale di partenza
; ***********************
; * Valori modificabili *
; ***********************
chrheight = 16; Altezza dei caratteri
precalc = $2500; Indirizzo di partenza tabelle precalcolate
bsr_baseHi = $40 ; Byte splitter routines base address (High order) 20 bytes ciascuna x 128 routine
charbase = $8000; character map
colsfondo = 15; Colore di sfondo (Si fissa in fase di compilazione)
coltesto = 2 ; Colore del test (Si può pensare di variarlo per frame)
outsfondo = 5 ; Colore bordo esterno (Si può pensare di variarlo per frame)
*=$0801
word eoprg
word 2009
byte $9E,[intro]d
petc " by freshness79"
byte 0
eoprg
word 0
*=$0820
intro
jsr set_routine_table; Creazione delle routine raster
jsr initvar ; Inizializzazione di alcune variabili
jsr initchar ; Inizializzazione charmap
jsr initIRQ ; Inizializzazione raster IRQ
jsr init ; Inizializzazione sid player
cli ; Interrupt attivati
jmp * ; Stiamo in attesa...
; ***************************************************
; * Routine di sincronizzazione a doppio raster IRQ *
; ***************************************************
; La prima chiamata IRQ é su JMP, quindi l'incertezza é di 1-3 cicli
; Il primo handler permette di ridurla a 1-2 cicli: IRQ arriva sulla NOP
; Il secondo handler infine grazie ad un confronto a fine raster elimina
; l'ultima possibile incertezza
fstirq lsr $d019 ; 6 + (36 Kernal IRQ) + (da 2 a 4 JMP)
inc $d012 ; 6 interrupt al prossimo raster
lda #<secirq ; 2 reimposto il vettore IRQ perché punti
sta $0314 ; 4 al secondo handler
cli ; 2 attivo gli interrupt
tsx ; 2
stx temp ; 3
nop ; 2 (63-65) <= IRQ
nop ; 2 (65-67) <= IRQ
brk ; Qua non ci si arriva mai, lascio BRK per test
secirq asl $d019 ; 6 + (36 Kernal IRQ) + (da 2 a 3 NOP)
ldx temp ; 3
txs ; 2
ldy #$00 ; 2
lda $d012 ; 4
ldx #<fstirq ; 2 ripristino il vecchio IRQ pointer
nop ; 2w
cmp $d012 ; 4 se il ritardo dovuto alla NOP era 1
beq synced ; 2/3 effettuo un branch per allinearmi
synced stx $0314 ; 4 salvo il vettore IRQ
sty $d020 ; 4 -> RASTER STABILE! (inizio linea divisoria)
inc $ffff ; 6w Delay di centramento
inc $ffff ; 6w Variando il numero di cicli persi si può
inc $ffff ; 6w riposizionare lo scroll
inc $ffff ; 6w
inc $ffff ; 6w
inc $ffff ; 6w
nop ; 5w - 41 wasted cycles
clc ; 2 Determina il valore di uscita dal ciclo di split
lda pline ; 3
tay ; 3 => inizializzazione contatore raster line
adc fxheight ; 3
sta compare ; 3 Valore uscita = pline + fxheight
; *******************************
; * Gestione movimento laterale *
; *******************************
; La routine che segue permette di spostare orizzontalmente lo
; scroller. L'effetto é realizzato prendendo valori dalla tabella sinusoidale
; precalcolata ed usandoli per creare un ritardo.
; La parte unitaria del ritardo viene gestita con un branch, quella
; multipla di 2 con dei NOP ($EA) ed un branch obbligato calcolato al
; momento con la modifica del codice in fase di esecuzione
; Contestualmente a questa routine viene creata anche la barra di divisione
; superiore e viene aggiornata la posizione di scroll.
sfond1 lda #colsfondo ; 2
sta $d020 ; 2 Fine Linea divisoria
ldx pxsinus ; 3 Aggiorno la posizione nella
inx ; 2 tabella precalcolata
stx pxsinus ; 3
lda sinus,x ; 4 carico il valore corrente
lsr ; 2 estraggo il bit meno significativo e lo uso
bcc stp1 ; 2/3 uso per creare un eventuale ritardo unitario
stp1 sta sinmod+1 ; 4 con il rimanente creo un displacement all'interno
sinmod bpl * ; 2 di un elenco di NOP
ds $10,$ea ; (2-30)+1 NOP (la nop impiega 2 cicli)
; ***********************
; * Main raster routine *
; ***********************
; questa routine crea l'effetto di split raster.
; La routine si compone esattamente di 63 cicli, la lunghezza
; in termini di timing di una raster line.
; Si estraggono due valori dagli elenchi codes e si usano direttamente come
; indirizzo per un JMP indiretto.
; A questa routine viene accodato lo spezzone precalcolato di STA/STX $D020 ed
; il tutto viene replicato in memoria per avere tutte le combinazioni possibili
; Ciascuna linea dell'effetto si realizza con un continuo salto da routine a routine.
sfondo ldx #coltesto ; 2 inizializzazione colore del testo
jmp stmain ; 3 Parti con l'effetto!
stmain iny ; 2 Prossima linea (prima di questa istruzione siamo già a 36 cicli)
cpy compare ; 2
beq exmain ; 2 L'effetto é finito?
lda codesH,y ; 4 No, aggiorna i puntatori alla
sta nextjmp+1 ; 3 prossima routine da richiamare
lda codesL,y ; 4 sfruttando le due tabelle code
.byte $8d,nextjmp,$00; 4 (Crea una STA non zero page... ma zero page - costa 1 ciclo in più)
jmp (nextjmp) ; 5 (Tot. 63) Salta alla prossima routine
exmain jmp endmain ; 3 Fine dell'effetto
; ***************************************
; * Routine di aggiornamento e chiusura *
; ***************************************
;
; La routine che segue aggiorna la tabella codes tramite 3 chiamate
; alla relativa subroutine e sposta l'indice poi usato nella raster routine.
; Seguono due chiamate alla routine sid player ed infine l'uscita dall'interruzione.
; il 6510 appena esce da questa routine torna alla "JMP *" della intro.
endmain ldx pxsinus ; 3 Questa routine serve a ripristinare la
sec ; 2 sincronia con i raster eliminando l'effetto
lda #$1f ; 2 sinusoidale orizzontale precedentemente
sbc sinus,x ; 4 creato
lsr ; 2
bcc stp2 ; 2/3
stp2 sta brw+1 ; 4
brw bpl * ; 2
ds $0f,$ea ; (2-30) NOP (la nop impiega 2 cicli)
ldy #$00 ; 2 Annulla y (viene usato più avanti)
clc ; 2 Aggiornamento effetto
lda pvsinus ; 3 sinusoide sulla dimensione
adc #$01 ; 2 della finestra di visualizzazione
sta pvsinus ; 3
lda pvsinus+1 ; 3
adc #$00 ; 2
and #$01 ; 2
ora #>heightsinus; 2
ldx #outsfondo ; 2 Colore sfondo esterno
sty $d020 ; Linea orizzontale inferiore (y=0)
sta pvsinus+1 ; 3
lda (pvsinus),y ; 5
sta fxheight ; 3 => Nuova altezza caricata
lda pysinus ; 3 Aggiornamento effetto
adc #$01 ; 2 sinusoide sulla posizione
sta pysinus ; 3 della finestra di visualizzazione
lda pysinus+1 ; 3
adc #$00 ; 2
and #$01 ; 2
ora #>possinus ; 2
sta pysinus+1 ; 3
lda (pysinus),y ; 5
sta fxypos ; 3 => Nuova posizione verticale caricata
sta $d012 ; 4 Impostazione primo raster del prossimo frame
inc $ffff ; 6w
inc $ffff ; 6w
inc $ffff ; 6w
; sta $ffff ; 4w
stx $d020 ; Fine linea - sfondo esterno
;**************************************************************************
;* Da qua in poi non più bisogno di controllare la sincronia con i raster *
;**************************************************************************
jsr play ; aggiornamento sid player
ldx #$00 ; Spostamento scroller
jsr scroll_update ;
jsr scroll_update ;
jsr scroll_update ;
jsr play ; aggiornamento sid player
cli ; Interrupt nuovamente attivi
pla ; ripristino dei tre
tay ; registri
pla ;
tax ;
pla ; ritorno alla routine iniziale
rti ; (il JMP * della intro)
; ********************************
; * Aggiornamento dello scroller *
; ********************************
; Legge progressivamente ciascun carattere della stringa e crea
; i due elenchi codes necessari per visualizzare l'effetto
scroll_update
inc bitheight ; 5 Aggiorna delay timer
bne nomod ; 2 (1) Controlla se si cambia byte
lda #(256-chrheight); 2 Si, ripristina timer
sta bitheight ; 3
clc ; 2
lda charheight ; 3 Aggiorna puntatore alla riga della
adc #$01 ; 2 font (8 righe)
ora #$F8 ; 2
sta charheight ; 3
lda pstring ; 3 Aggiorna puntatore stringa
adc #$00 ; 2
sta pstring ; 3
lda pstring+1 ; 3
adc #$00 ; 2
sta pstring+1 ; 3
ldy #$00 ; 2
lda (pstring),y ; 5 Carica carattere corrente
bne skipch ; 2 (1) Siamo a fine stringa?
lda #<testo ; 2 Se si riparti da capo
sta pstring ; 3
lda #>testo ; 2
sta pstring+1 ; 3
lda (pstring),y ; 5
skipch sty pchar+1 ; 3 Aggiorna puntatore al font
asl ; 2 con il carattere appena caricato
rol pchar+1 ; 5
asl ; 2
rol pchar+1 ; 5
asl ; 2
rol pchar+1 ; 5
adc #<charbase ; 2
sta pchar ; 3
lda pchar+1 ; 3
adc #>charbase ; 2
sta pchar+1 ; 3
nomod lda charheight ; 3 Carica il byte da visualizzare
and #$07 ; 2
tay ; 2
lda (pchar),y ; 5
ldy pline ; 3
sty getmp+1 ; 4 Imposta la posizione di codesL da aggiornare
sty getmp2+1 ; 4 Imposta la posizione di codesH da aggiornare
lsr ; 2 Ruota il byte caricato di due posizione a destra
bcc noadj1 ; 2/3
ora #$80 ; 2
noadj1 lsr ; 2
bcc noadj2 ; 2/3
ora #$80 ; 2
noadj2 pha ; 3 A partire da xxxxxxyy si ottiene yyxxxxxx
and #$C0 ; 2 Usa il nibble maggiore come puntatore low (codesL)
ora #colsfondo ; 2 aggiungo il colore di sfondo (la routine é "spostata" di colsfondo bytes)
getmp sta codesL,x ; 4
pla ; 3 Usa il nibble inferiore come puntatore high (codesH)
and #$3F ; 2
ora #bsr_baseHi ; 2 Aggiungi la base della tabella
getmp2 sta codesH,x ; 4
inc pline ; 5 Passa alla prossima linea
rts ; 6
; **********************************************
; **********************************************
; * A seguire due funzioni di inizializzazione *
; * delle tabelle e dello schermo *
; **********************************************
; **********************************************
; ****************************************
; * Costruzione della tabella di routine *
; ****************************************
;
; Ogni esecuzione costa 4*NPixel+3 cicli (3 per il JMP e 4*NPixel per gli STA)
; per un totale quindi di 39 cicli con 8 pixel.
; Esempio di routine (questa disegna 01010000):
; sta $d020
; stx $d020
; sta $d020
; stx $d020
; sta $d020
; sta $d020
; sta $d020
; sta $d020
; sta $d020
; Ogni routine occupa 27 byte a cui vanno aggiunti i 22 della routine stmain
; per un totale di 49 byte. Essendo 49 si può agevolmente spostare il low nibble
; dell'indirizzo iniziale con valori da 0 a 15 (=> 49-64). Ciò permette di agire
; sul colore di sfondo (comunque fisso).
set_routine_table
lda #bsr_baseHi
sta $fc
lda #colsfondo; Sposto la routine col colore di sfondo!;)
sta $fb
ldx #$00
rs_byt stx $fd
ldy #$00
rs_lop asl $fd
bcs rs_set
lda #opcode_sta
bne rs_put
rs_set lda #opcode_stx
rs_put sta ($fb),y
iny
lda #<bgcolor
sta ($fb),y
iny
lda #>bgcolor
sta ($fb),y
iny
cpy #(NPixel*3)
bne rs_lop
txa
pha
ldx #$00
cpmrt lda stmain,x
sta ($fb),y
iny
inx
cpx #(endmain-stmain)
bne cpmrt
pla
tax
clc
lda $fb
adc #$40
sta $fb
lda $fc
adc #$00
sta $fc
inx
cpx #((1<<(NPixel-1))&$FF)
bne rs_byt
; ******************************
; * Inizializzazione variabili *
; ******************************
;
initvar
lda heightsinus
sta fxheight
lda #<heightsinus
sta pvsinus
lda #>heightsinus
sta pvsinus+1
lda possinus
sta fxypos
lda #<possinus
sta pysinus
lda #>possinus
sta pysinus+1
lda #<charbase
sta pchar
lda #>charbase
sta pchar+1
lda #$FF
sta bitheight
lda #$00
sta charheight
lda #<testo
sta pstring
lda #>testo
sta pstring+1
rts
; ***************
; * Inizializza *
; ***************
;
; La routine copia in RAM la charmap standard del 64
initchar
sei
lda #$23
sta $01
ldx #$00
chsrc lda $d000,x
chdes sta charbase,x
inx
bne chsrc
inc chsrc+2
inc chdes+2
lda chsrc+2
cmp #$D8
bne chsrc
lda #$27
sta $01
cli
rts
; ************
; * Init IRQ *
; ************
;
; Disattivazione dell'interrupt standard,
; Impostazione della prima rasterline e dell'indirizzo
; del primo handler della routine di interrupt
; attivazione dei raster interrupt
initIRQ
sei
lda #$7f
sta $dc0d
sta $dd0d
lda $dd0c
lda $dc0c
lda #$00
sta $d011
lda fxypos
sta $d012
lda #<fstirq
sta $0314
lda #>fstirq
sta $0315
lda #$01
sta $d01a
lsr $d019
rts
; *********************************
; *********************************
; * Tabelle e valori precalcolati *
; *********************************
; *********************************
; *********
; * Testo *
; *********
;
; testo é il testo che viene sottoposto allo scroll (non
; occorre che sia allineato)
testo
scrl " hi 64 lovers, this is an improved version of my raster scroller."
scrl " now this is able to manage full 8 bit fonts, look at this..."
.byte $20,$20,$E6,$20,$A0,$20,160,160,136,133,140,140,143,161,160,160
scrl " "
scrl " wrap! "
byte 0; E' fondamentale inserire il terminatore!!!!
; ***************
; * sinus table *
; ***************
;
; la tabella che segue rappresenta una sorta di sinus table utilizzata
; per creare l'effetto di oscillazione a destra e a sinistra.
; I 3 valori presenti (A9,A5,B5) rappresentano rispettivamente 3 tipi di LDA
; con 3 numeri di cicli diversi: A9 impiega 2 cicli, A5 ne impiega 3 e B5 ne
; impiega 4. Applicati al momento giusto nella routine permettono di mantenere
; la sincronia (3 cicli) o di mancarla di 1 posizione in più o in meno (2,4 cicli)
; ottenendo lo spostamento voluto nel successivo frame
align $100
sinus
.byte $0F,$0E,$0D,$0D,$0C,$0B,$0A,$0A,$09,$08,$08,$07,$06,$06,$05,$05
.byte $04,$03,$03,$03,$02,$02,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$02,$02,$03,$03,$04
.byte $04,$05,$05,$06,$07,$07,$08,$09,$09,$0A,$0B,$0B,$0C,$0D,$0E,$0E
.byte $0F,$10,$11,$11,$12,$13,$14,$14,$15,$16,$17,$17,$18,$18,$19,$1A
.byte $1A,$1B,$1B,$1C,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1E,$1E,$1E,$1E,$1E
.byte $1E,$1E,$1E,$1E,$1E,$1E,$1E,$1D,$1D,$1D,$1D,$1C,$1C,$1B,$1B,$1A
.byte $1A,$19,$19,$18,$17,$17,$16,$15,$15,$14,$13,$12,$12,$11,$10,$0F
.byte $0F,$0E,$0D,$0C,$0C,$0B,$0A,$09,$09,$08,$07,$07,$06,$05,$05,$04
.byte $04,$03,$03,$02,$02,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00
.byte $00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$02,$02,$02,$03,$03,$04
.byte $04,$05,$06,$06,$07,$07,$08,$09,$0A,$0A,$0B,$0C,$0D,$0D,$0E,$0F
.byte $10,$10,$11,$12,$13,$13,$14,$15,$15,$16,$17,$17,$18,$19,$19,$1A
.byte $1A,$1B,$1B,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1E,$1E,$1E,$1E,$1E,$1E
.byte $1E,$1E,$1E,$1E,$1E,$1E,$1E,$1D,$1D,$1D,$1C,$1C,$1B,$1B,$1B,$1A
.byte $19,$19,$18,$18,$17,$16,$16,$15,$14,$14,$13,$12,$11,$11,$10,$0F
; ***********************************
; * sinus table - Effetto posizione *
; ***********************************
;
align $200
possinus
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$15,$15,$15,$15,$16,$16,$16
dc.b $17,$17,$18,$18,$19,$19,$1A,$1A,$1B,$1B,$1C,$1D,$1D,$1E,$1F,$1F
dc.b $20,$21,$22,$23,$23,$24,$25,$26,$27,$28,$29,$2A,$2B,$2C,$2D,$2E
dc.b $2F,$30,$31,$32,$33,$35,$36,$37,$38,$39,$3A,$3C,$3D,$3E,$3F,$41
dc.b $42,$43,$44,$46,$47,$48,$4A,$4B,$4C,$4E,$4F,$50,$52,$53,$55,$56
dc.b $57,$59,$5A,$5B,$5D,$5E,$60,$61,$62,$64,$65,$66,$68,$69,$6B,$6C
dc.b $6D,$6F,$70,$71,$73,$74,$75,$77,$78,$79,$7A,$7C,$7D,$7E,$80,$81
dc.b $82,$83,$84,$86,$87,$88,$89,$8A,$8B,$8C,$8D,$8F,$90,$91,$92,$93
dc.b $94,$95,$96,$96,$97,$98,$99,$9A,$9B,$9C,$9C,$9D,$9E,$9F,$9F,$A0
dc.b $A1,$A1,$A2,$A3,$A3,$A4,$A4,$A5,$A5,$A6,$A6,$A6,$A7,$A7,$A8,$A8
dc.b $A8,$A8,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9,$A9
dc.b $A9,$A9,$A9,$A9,$A8,$A8,$A8,$A8,$A7,$A7,$A6,$A6,$A6,$A5,$A5,$A4
dc.b $A4,$A3,$A3,$A2,$A1,$A1,$A0,$9F,$9F,$9E,$9D,$9C,$9C,$9B,$9A,$99
dc.b $98,$97,$96,$96,$95,$94,$93,$92,$91,$90,$8F,$8D,$8C,$8B,$8A,$89
dc.b $88,$87,$86,$84,$83,$82,$81,$80,$7E,$7D,$7C,$7A,$79,$78,$77,$75
dc.b $74,$73,$71,$70,$6F,$6D,$6C,$6B,$69,$68,$66,$65,$64,$62,$61,$60
dc.b $5E,$5D,$5B,$5A,$59,$57,$56,$55,$53,$52,$50,$4F,$4E,$4C,$4B,$4A
dc.b $48,$47,$46,$44,$43,$42,$41,$3F,$3E,$3D,$3C,$3A,$39,$38,$37,$36
dc.b $35,$33,$32,$31,$30,$2F,$2E,$2D,$2C,$2B,$2A,$29,$28,$27,$26,$25
dc.b $24,$23,$23,$22,$21,$20,$1F,$1F,$1E,$1D,$1D,$1C,$1B,$1B,$1A,$1A
dc.b $19,$19,$18,$18,$17,$17,$16,$16,$16,$15,$15,$15,$15,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$14,$15,$15,$15
dc.b $15,$15,$16,$16,$16,$16,$17,$17,$17,$18,$18,$18,$18,$19,$19,$19
dc.b $1A,$1A,$1A,$1B,$1B,$1C,$1C,$1C,$1D,$1D,$1D,$1E,$1E,$1F,$1F,$1F
dc.b $20,$20,$20,$21,$21,$21,$22,$22,$22,$23,$23,$23,$24,$24,$24,$24
dc.b $25,$25,$25,$25,$26,$26,$26,$26,$26,$27,$27,$27,$27,$27,$27,$27
dc.b $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27
dc.b $27,$26,$26,$26,$26,$26,$25,$25,$25,$25,$24,$24,$24,$24,$23,$23
dc.b $23,$22,$22,$22,$21,$21,$21,$20,$20,$20,$1F,$1F,$1F,$1E,$1E,$1D
dc.b $1D,$1D,$1C,$1C,$1C,$1B,$1B,$1A,$1A,$1A,$19,$19,$19,$18,$18,$18
dc.b $18,$17,$17,$17,$16,$16,$16,$16,$15,$15,$15,$15,$15,$14,$14,$14
dc.b $14,$14,$14,$14,$14,$14,$14,$14,$14,$14
; ******************
; * Buffer grafico *
; ******************
;
; codes é il buffer nel quale c'é l'elenco costantemente aggiornato
; dei byte stampati a video: rappresenta di fatto gli indirizzi delle
; routine che rendono graficamente tutti i valori possibili di un byte.
*=precalc
align $100
codesL
ds $100,colsfondo
codesH
ds $100,$40
; ************************************
; * sinus table - Effetto dimensione *
; ************************************
;
align $200
heightsinus
dc.b $FA,$F9,$F9,$F9,$F9,$F9,$F9,$F9,$F9,$F8,$F8,$F8,$F8,$F7,$F7,$F7
dc.b $F6,$F6,$F5,$F5,$F4,$F4,$F3,$F3,$F2,$F2,$F1,$F0,$F0,$EF,$EE,$EE
dc.b $ED,$EC,$EB,$EA,$EA,$E9,$E8,$E7,$E6,$E5,$E4,$E3,$E2,$E1,$E0,$DF
dc.b $DE,$DD,$DC,$DB,$DA,$D8,$D7,$D6,$D5,$D4,$D3,$D1,$D0,$CF,$CE,$CC
dc.b $CB,$CA,$C9,$C7,$C6,$C5,$C3,$C2,$C1,$BF,$BE,$BD,$BB,$BA,$B8,$B7
dc.b $B6,$B4,$B3,$B2,$B0,$AF,$AD,$AC,$AB,$A9,$A8,$A7,$A5,$A4,$A2,$A1
dc.b $A0,$9E,$9D,$9C,$9A,$99,$98,$96,$95,$94,$93,$91,$90,$8F,$8D,$8C
dc.b $8B,$8A,$89,$87,$86,$85,$84,$83,$82,$81,$80,$7E,$7D,$7C,$7B,$7A
dc.b $79,$78,$77,$77,$76,$75,$74,$73,$72,$71,$71,$70,$6F,$6E,$6E,$6D
dc.b $6C,$6C,$6B,$6A,$6A,$69,$69,$68,$68,$67,$67,$67,$66,$66,$65,$65
dc.b $65,$65,$64,$64,$64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$64,$64,$64,$64,$64,$65,$65,$65,$65,$66,$66,$67
dc.b $67,$67,$68,$68,$69,$69,$6A,$6A,$6B,$6C,$6C,$6D,$6D,$6E,$6F,$6F
dc.b $70,$71,$71,$72,$73,$74,$74,$75,$76,$77,$77,$78,$79,$7A,$7A,$7B
dc.b $7C,$7C,$7D,$7E,$7F,$7F,$80,$81,$81,$82,$83,$83,$84,$84,$85,$85
dc.b $86,$86,$87,$87,$88,$88,$89,$89,$89,$8A,$8A,$8A,$8B,$8B,$8B,$8B
dc.b $8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8B,$8A,$8A
dc.b $8A,$89,$89,$89,$88,$88,$87,$87,$86,$86,$85,$85,$84,$84,$83,$83
dc.b $82,$81,$81,$80,$7F,$7F,$7E,$7D,$7C,$7C,$7B,$7A,$7A,$79,$78,$77
dc.b $77,$76,$75,$74,$74,$73,$72,$71,$71,$70,$6F,$6F,$6E,$6D,$6D,$6C
dc.b $6C,$6B,$6A,$6A,$69,$69,$68,$68,$67,$67,$67,$66,$66,$65,$65,$65
dc.b $65,$64,$64,$64,$64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$64,$64
dc.b $64,$64,$64,$64,$65,$65,$65,$65,$66,$66,$67,$67,$67,$68,$68,$69
dc.b $69,$6A,$6A,$6B,$6C,$6C,$6D,$6E,$6E,$6F,$70,$71,$71,$72,$73,$74
dc.b $75,$76,$77,$77,$78,$79,$7A,$7B,$7C,$7D,$7E,$80,$81,$82,$83,$84
dc.b $85,$86,$87,$89,$8A,$8B,$8C,$8D,$8F,$90,$91,$93,$94,$95,$96,$98
dc.b $99,$9A,$9C,$9D,$9E,$A0,$A1,$A2,$A4,$A5,$A7,$A8,$A9,$AB,$AC,$AD
dc.b $AF,$B0,$B2,$B3,$B4,$B6,$B7,$B8,$BA,$BB,$BD,$BE,$BF,$C1,$C2,$C3
dc.b $C5,$C6,$C7,$C9,$CA,$CB,$CC,$CE,$CF,$D0,$D1,$D3,$D4,$D5,$D6,$D7
dc.b $D8,$DA,$DB,$DC,$DD,$DE,$DF,$E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7,$E8
dc.b $E9,$EA,$EA,$EB,$EC,$ED,$EE,$EE,$EF,$F0,$F0,$F1,$F2,$F2,$F3,$F3
dc.b $F4,$F4,$F5,$F5,$F6,$F6,$F7,$F7,$F7,$F8,$F8,$F8,$F8,$F9,$F9,$F9
dc.b $F9,$F9,$F9,$F9,$F9,$FA
; **************
; * sid player *
; **************
;
; questo é semplicemente un file sid linkato al programma per mettere un po' di musica in
; background. Si può cambiare file, l'importante é fare attenzione a non metterlo in una
; zona occupata dalle tabelle generate dal programma.
; il file da linkare deve essere un prg senza i due byte iniziali.
init=$1060
play=$1063
*=$1060; Selfmade executable (AMJ)
sid INCBIN "selfmade.dat"