Autore Topic: Esempio Routine "wash"  (Letto 1585 volte)

CobraComm

  • Neo-iscritto
  • *
  • Post: 43
  • Gioco Preferito: Ghosts'N'Goblins,Commando,Ye Ar Kung Fu,MMC 64
Esempio Routine "wash"
« il: 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 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!

 

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Esempio Routine "wash"
« Risposta #1 il: 17 Maggio 2008, 12:11:16 »
 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.
Codice: [Seleziona]
*=$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.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -