Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Alberto - 09 Luglio 2006, 13:38:19
-
Altra routine riadattata da CCC (n.60,pag.63 "A scuola di raster II").
Chi volesse ottimizzarla può ridurre quella gigantesca tabella messa per motivi di leggibilità
;Uso: SYS 49253
* = $c000
wedge
sei
lda #<intro
sta $314
lda #>intro
sta $315 ;interrupt
lda #$32
sta $d012
lda $d011
and #$7f
sta $d011
lda #1
sta $d01a ;raster IRQ
cli
rts
byt .byte 0
color1 .byte 3
color2 .byte 1
count .byte 0 ;quadro video
intro
lda $d019
sta $d019
bmi $c031
lda $dc0d
cli
jmp $ea31 ;IRQ standard,esce
lda color2
sta $d021
ldx #39
loop
dex
bne loop ;colora 3 scanlines
lda color1
sta $d021 ;colora il resto
inc byt
lda byt
cmp #25
bne cont ;ultima riga?
lda #0
sta byt
inc count ;sì,aggiorna linea IRQ
cont
asl
asl
asl
clc
ldx count
adc row,x
sta $d012
jmp $febc
;entry-point del programma
sei
lda #$83
sta $01
lda #0
ldy #$d0
sta $fb
sty $fc
ldy #48
sta $fd
sty $fe ;sposta il charset in RAM
tay
ldx #$10
loop2
lda ($fb),y
eor #255 ;reverse del charset
sta ($fd),y
dey
bne loop2
inc $fc
inc $fe
dex
bne loop2
lda #$87
sta $01
cli
lda #29
sta $d018 ;usa il nuovo charset
jmp wedge
row
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
.byte 50,50,51,51,52,52,53,53,54,54,55,55,56,56,57,57
-
Ho provato a ridurlo.
Notare che la BMI $C031 che c'era prima era sbagliata, non tanto perche' non usava una label, ma perche' puntava all'EA della JMP $EA31; non succede niente di male perche' e' l'opcode di NOP :)
;--------------------------------------
;adattato da iAN CooG/HokutoForce
;Uso: SYS 49152/49155
;--------------------------------------
color1 = 3
color2 = 1
byt = $fb
count = $fc ;quadro video
row = $fd
;--------------------------------------
* = $c000
jsr inverse
; se non si vuole, basta sys49155
wedge
sei
lda #<intro
sta $314
lda #>intro
sta $315 ;interrupt
lda #$32
sta $d012
lda $d011
and #$7f
sta $d011
lda #1
sta $d01a ;raster IRQ
cli
rts
;--------------------------------------
intro
lda $d019
sta $d019
bmi continue
lda $dc0d
cli
jmp $ea31 ;IRQ standard,esce
;--------------------------------------
continue
lda #color2
sta $d021
ldx #$27
loop
dex
bne loop ;colora 3 scanlines
lda #color1
sta $d021 ;colora il resto
inc byt
lda byt
cmp #$19
bne cont ;ultima riga?
lda #0
sta byt
inc count ;sì,aggiorna linea IRQ
cont
asl
asl
asl
;calcoliamo anziche' usare la tabella
;piu' lento ma occupa meno spazio
sta row ; row ora e' solo un temp
lda count
and #$0f
sta count
lsr ;0-f -> 0-7
clc
adc #$32
adc row
sta $d012
jmp $febc
;--------------------------------------
;entry-point del programma
inverse
sei
lda #$33
sta $01
lda #0
ldy #>$d000
sta $fb
sty $fc
ldy #>$3000
sta $fd
sty $fe ;sposta il charset in RAM
tay
ldx #$10
loop2
lda ($fb),y
eor #$ff ;reverse del charset
sta ($fd),y
dey
bne loop2
inc $fc
inc $fe
dex
bne loop2
;stx byt
stx count ; l'unico da riazzerare
;stx row
lda #$37
sta $01
cli
lda #$1c ;Charset $3000 screen $0400
sta $d018 ;usa il nuovo charset
rts
;--------------------------------------
I raster sono molto spettinati perche' non c'e' nessun tentativo di timing, e non mi riesce proprio di farne uno corretto, forse perche' ritorna alla irq normale, e per un timing perfetto occorre sempre preferire EA81/FEBC.
-
Notare che la BMI $C031 che c'era prima era sbagliata, non tanto perche' non usava una label, ma perche' puntava all'EA della JMP $EA31; non succede niente di male perche' e' l'opcode di NOP
Acc...questo non l'avevo notato,sarà sicuramente perchè ho aggiunto qualche byte quando ho riadattato il codice :lol:
I raster sono molto spettinati perche' non c'e' nessun tentativo di timing, e non mi riesce proprio di farne uno corretto, forse perche' ritorna alla irq normale, e per un timing perfetto occorre sempre preferire EA81/FEBC.
Ehp...occhio però:lo scopo della routine è di illustrare una tecnica per flashare i caratteri;per questo è necessario che l'entry-point del programma sia sempre la routine di reverse,in modo che poi sia sufficiente cambiare il colore del bordo per creare l'effetto flash,senza stare a modificare tutta la color-memory.Quindi quel
;se non si vuole, basta sys49155
Va omesso,altrimenti cade tutto il discorso. :D
-
Ehp...occhio però:lo scopo della routine è di illustrare una tecnica per flashare i caratteri;per questo è necessario che l'entry-point del programma sia sempre la routine di reverse
Lo so, ma una routine nata per uno scopo puo' sempre diventare qualcos'altro con delle semplici modifiche. Che poi faccia schifo per le evidenti spettinature e' un altro paio di maniche :P