Non ho potuto fare a meno di applicare un paio di modifiche :D
Come gia' detto a freshness in chat, non riuscivo a capacitarmi del perche' non mi partisse in autorun, l'errore era nella init.
; v2.1 revisione di iAN CooG
;
;- sysline che non causa ?SYNTAX ERROR
;- ciclo all'uscita della fstirq anziche' inc $ffff ripetuti
;- corretta initIRQ, ora parte in ogni emulatore, sempre.
;- ridotta occupazione in memoria. ok, non era necessario :)
NOPopcode = $EA
temp = $FE
setDEN = $FA
rastline = $FB
sinuspos = $FD
*=$0801
word eoprg
word 2009
byte $9E,[intro]d,":",$8f,$0d,"FRESHNESS79(CODE) + IAN COOG(FIX)"
byte 0
eoprg
word 0
intro
lda #$18 ; Attivazione schermo (D011 - bit DEN)
sta setDEN
lda #$2e ; Linea $30 (-2 per la stabilizzazione)
sta rastline
lda #$00 ; Resetta la posizione della sinus table
sta sinuspos
jsr initIRQ ; Inizializzazione raster IRQ
cli ; Interrupt attivati
rts
; ***************************************************
; * Routine di sincronizzazione a doppio raster IRQ *
; ***************************************************
; La prima chiamata IRQ e' su JMP, quindi l'incertezza e' 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 perche' punti
sta $0314 ; 4 al secondo handler
cli ; 2 attivo gli interrupt
nop ; 2 (63-65) <= IRQ
nop ; 2 (65-67) <= IRQ
nop
nop
nop
nop
brk ; Qua non ci si arriva mai, lascio BRK per test
secirq
ldx sinuspos ; 3 + (36 Kernal IRQ) + (da 2 a 3 NOP)
lda sinushigh,x ; 4 Carico la parte piu' significativa dello spostamento
lsr ; 2 orizzontale, nel carry metto il bit meno significativo
sta brnch+1 ; 4 uso il resto per creare un displacement
lda $d012 ; 4 Stabilizzazione raster
nop ; 2w
nop ; 2w
bit $d012 ; 4 se il ritardo dovuto alla NOP era 1
beq synced ; 2/3 effettuo un branch per allinearmi
; Routine di delay della prima badline
synced
bcc brnch ; questo branch serve per saltare un ciclo
brnch
bpl * ; con questo si saltano 2*N cicli
ds $13,NOPopcode; (0-38 cicli) 19xNOP (la nop impiega 2 cicli)
lda setDEN
sta $d011 ; Attivazione badline
inc sinuspos ; incrementa il pointer e setta 06 il colore del garbage (INC = $E6)
lda sinuslow,x ; Parte meno significativa dello spostamento
sta $d016 ; orizzontale - scrolling fine
lda rastline
sta $d012 ; ripristino del corretto raster compare
ldx #<fstirq
stx $0314 ; ripristino il vecchio IRQ pointer
tsx
txa
clc
adc #$06
tax
txs ; ripristino dello stack pointer
lsr $d019 ; Acknowledge del raster IRQ
;cli ; Interrupt nuovamente attivi << ha senso durante l'IRQ?
;qua possiamo ciclare, CREDO siano sufficienti, aggiustare alla bisogna;D
ldx #$0d
dexdel
inc $ffff
dex
bne dexdel
lda #$00 ; reset
sta $d011 ; del bit DEN nel registro $D011
jmp $ea31 ; Salto alla normale routine di interruzione
; ************
; * 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 $dc0d;non dc0c !
lda $dd0d;non dd0c !
lda #$00
sta $d011
lda $fb
sta $d012
lda #<fstirq
sta $0314
lda #>fstirq
sta $0315
lda #$01
sta $d01a
; Meglio settare SEMPRE d019 per pulire ogni irq pendente, come le lda $dc0d.
; A me ad esempio in Vice 2.1.9 non parte MAI in autostart senza questa :)
sta $d019
rts
align $100
sinuslow
byte $07,$04,$00,$04,$00,$04,$00,$04,$00,$05,$01,$05,$01,$06,$02,$06
byte $03,$07,$04,$00,$05,$01,$06,$02,$07,$04,$01,$06,$03,$00,$05,$02
byte $07,$04,$02,$07,$05,$02,$00,$06,$03,$01,$07,$05,$03,$01,$00,$06
byte $05,$03,$02,$01,$07,$06,$05,$04,$04,$03,$02,$02,$01,$01,$01,$01
byte $00,$01,$01,$01,$01,$02,$02,$03,$04,$04,$05,$06,$07,$01,$02,$03
byte $05,$06,$00,$01,$03,$05,$07,$01,$03,$06,$00,$02,$05,$07,$02,$04
byte $07,$02,$05,$00,$03,$06,$01,$04,$07,$02,$06,$01,$05,$00,$04,$07
byte $03,$06,$02,$06,$01,$05,$01,$05,$00,$04,$00,$04,$00,$04,$00,$04
byte $07,$03,$07,$03,$07,$03,$07,$03,$07,$02,$06,$02,$06,$01,$05,$01
byte $04,$00,$03,$07,$02,$06,$01,$05,$00,$03,$06,$01,$04,$07,$02,$05
byte $00,$03,$05,$00,$02,$05,$07,$01,$04,$06,$00,$02,$04,$06,$07,$01
byte $02,$04,$05,$06,$00,$01,$02,$03,$03,$04,$05,$05,$06,$06,$06,$06
byte $06,$06,$06,$06,$06,$05,$05,$04,$03,$03,$02,$01,$00,$06,$05,$04
byte $02,$01,$07,$06,$04,$02,$00,$06,$04,$01,$07,$05,$02,$00,$05,$03
byte $00,$05,$02,$07,$04,$01,$06,$03,$00,$05,$01,$06,$02,$07,$03,$00
byte $04,$01,$05,$01,$06,$02,$06,$02,$07,$03,$07,$03,$07,$03,$07,$03
sinushigh
byte $14,$14,$14,$15,$15,$16,$16,$17,$17,$18,$18,$19,$19,$1A,$1A,$1B
byte $1B,$1C,$1C,$1C,$1D,$1D,$1E,$1E,$1F,$1F,$1F,$20,$20,$20,$21,$21
byte $22,$22,$22,$23,$23,$23,$23,$24,$24,$24,$25,$25,$25,$25,$25,$26
byte $26,$26,$26,$26,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27
byte $27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$27,$26,$26,$26
byte $26,$26,$25,$25,$25,$25,$25,$24,$24,$24,$23,$23,$23,$23,$22,$22
byte $22,$21,$21,$20,$20,$20,$1F,$1F,$1F,$1E,$1E,$1D,$1D,$1C,$1C,$1C
byte $1B,$1B,$1A,$1A,$19,$19,$18,$18,$17,$17,$16,$16,$15,$15,$14,$14
byte $14,$13,$13,$12,$12,$11,$11,$10,$10,$0F,$0F,$0E,$0E,$0D,$0D,$0C
byte $0C,$0B,$0B,$0B,$0A,$0A,$09,$09,$08,$08,$08,$07,$07,$07,$06,$06
byte $05,$05,$05,$04,$04,$04,$04,$03,$03,$03,$02,$02,$02,$02,$02,$01
byte $01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01
byte $01,$01,$02,$02,$02,$02,$02,$03,$03,$03,$04,$04,$04,$04,$05,$05
byte $05,$06,$06,$07,$07,$07,$08,$08,$08,$09,$09,$0A,$0A,$0B,$0B,$0B
byte $0C,$0C,$0D,$0D,$0E,$0E,$0F,$0F,$10,$10,$11,$11,$12,$12,$13,$13
Interessante il fatto che il colore del pattern in alto a sinistra (visibile se si cambia il colore di sfondo $d021 ad esempio in nero) sia dovuto all'opcode fetchato dopo la sta $d011, non sapevo di questa cosa =)