Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: CobraComm - 17 Maggio 2008, 01:54:48
-
Salve,
sto provando come esercizio alcune piccole routine in Assembly, alcune hanno funzionato altre no. E la maggior parte mi da un errore comune al caso che sto
per specificare.
in pratica ho usato il Dasm per assemblare questa routine con presa sul fantastico sito http://www.redizajn.sk/tnd64/assemble_it.html (http://www.redizajn.sk/tnd64/assemble_it.html) al Capitolo 9 - Colour-Washing Charsets e non mi ha dato nessun errore durante la "compilazione"...
Siccome vedo che la routine parte da $1000 che corrisponde al decimale 4096
carico il programma dal VICE con Autostart Disk/Image (perchè con Attach Disk Image non me lo fa caricare) esegue il Load "*",8,1 , esce READY do SYS 4096 e per una frazione di secondi vedo scrivere qualcosa sullo schermo poi appare Ready in alto, mi chiedevo perchè non mi funzionava come sullo screenshot che vedo dal sito al Chapter 9. Forse perchè devo fare il LOAD da $1000? e come si fa?
Aiuto per favore!
Il listato è il seguente:
;Simple colour washing routine, inside
;an IRQ Raster Interrupt Player
* = $1000
LDX #$00
SHOWMS LDA MESSAGE,X
STA $0400,x
INX
CPX #$28
BNE SHOWMS
IRQ JSR COLWASH
JMP $EA31
;======================
;COLOUR WASHING ROUTINE
;======================
COLWASH LDA COLOUR+$00
STA COLOUR+$28
LDX #$00
CYCLE LDA COLOUR+$01,X
STA COLOUR+$00,X
LDA COLOUR,X
STA $D800,X
INX
CPX #$28
BNE CYCLE
RTS
;DATA TABLES FOR COLOURS
COLOUR .BYTE $09,$09,$02,$02,$08
.BYTE $08,$0A,$0A,$0F,$0F
.BYTE $07,$07,$01,$01,$01
.BYTE $01,$01,$01,$01,$01
.BYTE $01,$01,$01,$01,$01
.BYTE $01,$01,$01,$07,$07
.BYTE $0F,$0F,$0A,$0A,$08
.BYTE $08,$02,$02,$09,$09
.BYTE $00,$00,$00,$00,$00
;DATA FOR TEXT MESSAGE
MESSAGE .TEXT "RICHARD BAYLISS'"
.TEXT " COLOUR SCROLLER"
.TEXT " ACTIVE......"
.TEXT " "
dove è che sbaglio?
Grazie!
-
Perche' richard bayliss e' l'ultima persona al mondo che puo' INSEGNARE a programmare visto che ne sa giusto qualcosa ma si spiega davvero male.
Premesso questo, da parte tua occorre leggere e cercare di capire anche il resto.
Quella che hai postato qua sopra e' una routine di IRQ e non un programma standalone. Devi settare i vettori 0314/0315 per farli puntare a questa routine.
*=$1000
sei
lda #<IRQ
sta $0314;parte bassa dell'indirizzo
lda #>IRQ
sta $0315;parte alta
lda #$33 ; riga dello schermo in cui deve scattare l'interrupt
sta $d012
lda #$1b; bit7 di d011 = 0
sta $d011
lda #$01
sta $d019
sta $d01a
cli
LDX #$00
SHOWMS LDA MESSAGE,X
STA $0400,x
INX
CPX #$28
BNE SHOWMS
rts
;an IRQ Raster Interrupt
IRQ
lda #$1
sta $d019
JSR COLWASH
JMP $EA31
;======================
;COLOUR WASHING ROUTINE
;======================
COLWASH LDA COLOUR+$00
STA COLOUR+$28
LDX #$00
CYCLE LDA COLOUR+$01,X
STA COLOUR+$00,X
LDA COLOUR,X
STA $D800,X
INX
CPX #$28
BNE CYCLE
RTS
;DATA TABLES FOR COLOURS
COLOUR .BYTE $09,$09,$02,$02,$08
.BYTE $08,$0A,$0A,$0F,$0F
.BYTE $07,$07,$01,$01,$01
.BYTE $01,$01,$01,$01,$01
.BYTE $01,$01,$01,$01,$01
.BYTE $01,$01,$01,$07,$07
.BYTE $0F,$0F,$0A,$0A,$08
.BYTE $08,$02,$02,$09,$09
.BYTE $00,$00,$00,$00,$00
;DATA FOR TEXT MESSAGE
MESSAGE .scru "dickhard gayliss'"
.scru " colour scroller"
.scru " active"
Una volta settato l'indirizzo di 0314 verso la routine in irq, e indicato in d011/d012 la linea di raster in cui deve "scattare" l'irq generata dal VIC (mettendo 1 in d01a verranno generate irq solo quando il VIC raggiungera' quella linea, altre irq dal CIA non ne capiteranno), possiamo pokare a video la scritta definita con SCRU e non TEXT (che genera Petscii e non codici schermo) e tornare al basic.
Nella routine di irq va SEMPRE settato il byte a $d019 per dire al vic di non generare altre irq finche' non ripassa da quella riga che gli abbiamo detto.