Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SCNKEY = $FF9F ; Scan keyboard for keypress
- GETIN = $FFE4 ; Get input from buffer, store it in A
- CLRSCR = $E544 ; Clear screen
- Scr1 = $0400 ; screen Ram address
- ;****************************************************************************
- ; Scroll verticale utilizzando il raster interrupt
- ;****************************************************************************
- DELAYMAX = 1 ; valore da usare per ritardare lo scroll
- *=$C000
- ;jsr RollUp
- ;rts
- sei ; disabilito gli interrupt settango il flag di disabilitazione
- jsr InitSubroutine ; subroutine di inizializzazione (eseguita all'unizio e basta)
- ldy #$7f ; $7f = %01111111
- sty $dc0d ; disabilito gli interrupt dei CIA
- sty $dd0d ; settando $DC0D e $DD0D
- lda $dc0d ; ... quindi cancello la coda degli
- lda $dd0d ; interrupt non processati
- lda #$01 ; Imposto la maschera degli interrupt
- sta $d01a ; in modo da gestire gli interrupt raster
- lda #<MyIrq ; Modifico il vettore di interrupt dell'orologio
- ldx #>MyIrq ; in modo che punti alla mia routine di gestione
- sta $314 ; Lo-Byte
- stx $315 ; Hi-Byte
- lda #250 ; Indico a quale raster line notificare l'interrupt
- sta $d012 ; per la prima volta, impostando il numero riga in $D012
- lda $d011 ; Il bit 7 di D011 + gli i bit di $D012 indicano
- and #$7f ; il numero di raster line, la quale può assumere
- sta $d011 ; valori maggiori di 255, quindi va impostato anch'esso
- ; a seconda delle esigenze in questo caso viene azzerato
- cli ; riabilitazione degli interrupt
- rts
- ;****************************************************************************
- ; Routine di inizializzazione eseguita una sola volta prima di aver impostato
- ; la routine da eseguire durante l'interrupt
- ;****************************************************************************
- InitSubroutine
- lda $d011 ; Porto lo schermo in modalità 24 righe
- and #%11110111 ; per lo scroll verticale in modo da nascondere le
- ; parti nere dello scroll hardware
- ora #%00000111 ; quindi faccio shiftare di 7 pixel in basso
- sta $d011
- ; Sprite
- lda #192 ; Indico a vic II l'area di memoria dove
- sta $07f8 ; legegre i dati degli sprite
- lda #$30 ; Indico il valore della coordita x
- sta $d000 ; 8bit meno significativi
- lda #%11111110 ; maschera per impostare il
- sta $d010 ; nono bit per superare la coordinata x 255
- lda #$64 ; Indico il valore della coordita y
- sta $d001 ; 0 - 255
- lda #%00000001
- sta $d015 ; Enable sprite 0
- ; Carico i valori dei bytes per gli sprites
- ldy #63
- @LoopSprite
- lda SpriteRepository,y
- sta $3000,y
- dey
- bpl @LoopSprite
- rts
- ;****************************************************************************
- ; Routine da eseguire non appena viene notificato il raster interrupt
- ;****************************************************************************
- MyIrq
- dec Delay ; Decrementa il contatore di ritardo
- bne Exit ; non fare nulla finchè il contatore di ritardo non è 0
- ldx #DELAYMAX ; setta il contatore al valore
- stx Delay ; prestabilito in DELAYMAX
- dec Pixel ; Decrementa il contatore che indica dove siamo con lo scroll
- beq ResetScroll ; se == 0 allora bisogna "resettare" lo scroll
- dec $d011 ; ... altrimenti esegui lo scroll di un solo pixel
- bne Exit ; james hates jmp ... so i use this pseudo conditional
- ; branch that is ever true
- ResetScroll
- ldx #8 ; rispristina il contatore
- stx Pixel ; di "stato" dello scroll
- lda $d011 ; "Ripristinta" lo scroll
- ora #%00000111 ; impostando opportunamente
- sta $d011 ; il registro per lo scroll verticale
- jsr RollUp ; Complete the scroll moving up one row
- Exit
- asl $d019 ; Acknowledge - indico di mantenere lo stesso raster beam
- ;jmp $ea81 ; ritorno alla normale gestione dell'interrupt (senza scansione Keyboard)
- jmp $ea31 ; ritorno alla normale gestione dell'interrupt
- ; i can't avoid this jump because i wont control of
- ; my computer at the end!
- ; *********************************************************************
- ; Segmented 256 unrolled routine
- ; Ugly version But Working well (14996 cycles)
- ; Absolutely My Faster routine
- ; *********************************************************************
- RollUp
- ldy #$27
- LoopFirstLine
- ldx $0428,y
- lda $0400,y
- sta RowBuffer,y
- txa
- sta $0400,y
- dey
- bpl LoopFirstLine
- ldy #$00
- Loop256
- lda $0450,y
- sta $0428,y
- iny
- bne Loop256
- Loop512
- lda $0550,y
- sta $0528,y
- iny
- bne Loop512
- Loop768
- lda $0650,y
- sta $0628,y
- iny
- bne Loop768
- Loop1024
- lda $0750,y
- sta $0728,y
- iny
- cpy #$98
- bne Loop1024
- ldy #$27
- LoopLastLine
- lda RowBuffer,y
- sta $07C0,y
- dey
- bpl LoopLastLine
- rts
- RowBuffer bytes 0*40
- Saved byte 0
- Pixel byte 8
- Delay byte 15
- SpriteRepository
- ;Repository for sprite
- BYTE 0,40,0,0,66,0,8,36
- BYTE 16,14,82,112,10,36,80,13
- BYTE 82,176,4,137,32,6,102,96
- BYTE 2,153,64,2,195,64,3,255
- BYTE 192,0,129,0,0,90,0,0
- BYTE 36,0,0,36,0,0,36,0
- BYTE 0,36,0,0,60,0,0,60
- BYTE 0,0,24,0,0,0,0,0
- ;
- ; TEXT "..........@.@..........."
- ; TEXT ".........@....@........."
- ; TEXT "....@.....@..@.....@...."
- ; TEXT "....@@@..@.@..@..@@@...."
- ; TEXT "....@.@...@..@...@.@...."
- ; TEXT "....@@.@.@.@..@.@.@@...."
- ; TEXT ".....@..@...@..@..@....."
- ; TEXT ".....@@..@@..@@..@@....."
- ; TEXT "......@.@..@@..@.@......"
- ; TEXT "......@.@@....@@.@......"
- ; TEXT "......@@@@@@@@@@@@......"
- ; TEXT "........@......@........"
- ; TEXT ".........@.@@.@........."
- ; TEXT "..........@..@.........."
- ; TEXT "..........@..@.........."
- ; TEXT "..........@..@.........."
- ; TEXT "..........@..@.........."
- ; TEXT "..........@@@@.........."
- ; TEXT "..........@@@@.........."
- ; TEXT "...........@@..........."
- ; TEXT "........................"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement