Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Bandiera Italiana Verticale
- ;
- ; - Apertura Bordi (in Raster Interrupt)
- ; - Disegno Sprite Bordo Superiore
- ; - Utilizzo bug VIC-II per multiplexing automatico sprite hardware nel Bordo Inferiore
- ; - Disegno Bandiera Italiana nella Display Window
- ;
- ; By Felix Nardella & Attilio Capuozzo per RetroProgramming Italia - RP Italia (A division of "RetroCampus" Associazione Culturale)
- ; CBM Prg Studio Version
- * = $c000
- sei ;Settiamo l'Interrupt Disable Flag (Sospensione IRQ Interrupt)
- jsr $e544 ;pulisce schermo tramite KERNAL Routine
- lda #6 ;colora bordo blu
- sta $d020
- lda #$7f
- sta $dc0d ;Disattivazione del Timer A Interrupt CIA 1 (System Interrupt) usato dal Kernal per
- sta $dd0d ;animazione cursore e scan tastiera ogni 1/60 secondo + Disattivazione completa di tutti i CIA Interrupt (IRQ e NMI)
- bit $dc0d ;La lettura di questi registri ne azzera il contenuto "scodando" eventuali CIA Interrupt (IRQ/NMI) in pending
- bit $dd0d
- lda #$01 ;Attiviamo il Raster Interrupt del VIC (Settiamo bit 0 di $d01a Interrupt Enable Register)
- sta $d01a
- lda #$f9 ;Impostiamo l'IRQ Raster Interrupt alla Raster line $f9 (primi 8 bit Raster Register $d012-$d011)
- sta $d012
- lda #$1b ;Azzeriamo bit 8 del Raster Register $d012-$d011 (MSB $d011)
- sta $d011
- lda #<irq00 ;Impostiamo il vettore IRQ Handler ($0314-$0315) a irq00 (1° Interrupt Handler)
- sta $0314
- lda #>irq00
- sta $0315
- ;Definizione sprite
- punt0 = $07f8 ;puntatori
- punt1 = $07f9
- punt2 = $07fa
- punt3 = $07fb
- punt4 = $07fc
- punt5 = $07fd
- blocco = $02c0 ;blocco mem = 704
- abilita = $d015 ;abilita sprite
- colores0 = $d027 ;colori
- colores1 = $d028
- colores2 = $d029
- colores3 = $d02a
- colores4 = $d02b
- colores5 = $d02c
- posx0 = $d000 ;pos x,y
- posy0 = $d001
- posx1 = $d002
- posy1 = $d003
- posx2 = $d004
- posy2 = $d005
- posx3 = $d006
- posy3 = $d007
- posx4 = $d008
- posy4 = $d009
- posx5 = $d00a
- posy5 = $d00b
- ;espansione y sprite
- expy = $d017
- ;espansione x sprite
- expx = $d01d
- ;msb
- msb = $d010
- ;copia dati sprite in mem
- ldx #$00
- loop lda #$ff
- sta blocco,x
- inx
- cpx #$40
- bne loop
- ;definisce i puntatori
- lda #blocco/$40
- sta punt0
- sta punt1
- sta punt2
- sta punt3
- sta punt4
- sta punt5
- ;colora sprite
- lda #$05 ;verde
- sta colores0
- sta colores1
- lda #$01 ;bianco
- sta colores2
- sta colores3
- lda #$02 ;rosso
- sta colores4
- sta colores5
- ;abilita 6 sprite
- lda #%00111111
- sta abilita
- ;espandi 6 sprite in x, y
- lda #%00111111
- sta expx
- sta expy
- ;attiva msb per sprite 5
- lda #%00100000
- sta msb
- ;Posizioniamo i 6 sprite espansi (sia sull'asse x che y) - che compongono la bandiera - interamente nel bordo superiore
- ;I bordi verticali verranno aperti negli Interrupt Handler irq00 e irq01
- ;Per un bug del chip grafico (GPU) VIC-II, i 6 sprite saranno automaticamente multiplexati nel bordo inferiore a costo computazionale 0
- ;Tra gli sprite hardware del bordo superiore e quelli multiplexati in automatico dal VIC nel bordo inferiore sussiste una distanza (gap) fissa
- ;Per decidere la coordinata y ottimale a cui posizionare i 6 sprite nel bordo superiore,
- ;in modo da trovare la giusta distanza tra i 2 blocchi di sprite nei 2 bordi verticali (Superiore e Inferiore), bisogna procedere per tentativi successivi
- ;Si tenga presente che il Vertical Blanking Interval - in cui il Raster di fatto non disegna nulla sullo schermo - è compreso tra le Raster line 300 e 15
- ;Il Bordo Superiore termina alla Raster line 50. Successivamnte inizia la Display Window delle dimensioni standard di 320*200.
- ;Il Bordo Verticale Inferiore incomincia dalla Raster line 250
- ;pos x
- lda #40
- sta posx0
- lda #88
- sta posx1
- lda #136
- sta posx2
- lda #184
- sta posx3
- lda #232
- sta posx4
- lda #24
- sta posx5
- ;pos y coordinata #1
- lda #1
- sta posy0
- sta posy1
- sta posy2
- sta posy3
- sta posy4
- sta posy5
- ;riempie schermo di spazi in Reverse (Screen Code #160)
- ldx #24 ;25 Righe (da #0 a #24)
- lda #$02 ;locazione Memoria Video $0402 (lasciamo 2 colonne vuote a sinistra per allineamento con bandiera)
- sta $fb ;memorizziamo Parte Bassa/Parte Alta (little endian) dell'indirizzo di schermo rispettivamente nelle 2 locazioni di pagina 0 $fb-$fc
- lda #$04
- sta $fc
- looprighe
- lda #160 ;Screen Code 160 = Spazio in Reverse
- ldy #35 ;Bandiera lunga 36 (da #0 a #35) colonne (La bandiera è lunga complessivamente 288 pixel/8 px=36 colonne)
- loopcolonne
- sta ($fb),y ;riempiamo le locazioni di schermo tramite indirizzamento indiretto indicizzato con registro dati Y del 6510
- dey
- bpl loopcolonne ;cicliamo per 36 colonne (y=35) di ogni riga di schermo - da #35 a #0 -
- lda $fb ;se abbiamo ciclato per 36 colonne allora dobbiamo passare a riga schermo successiva
- clc ;quindi sommiamo (adc) 40 (colonne) per passare alla successiva riga di schermo (lasciamo 2 colonne vuote a destra + 2 colonne vuote a sinistra per ogni riga di schermo)
- adc #40 ;sommiamo #40 al byte basso ($fb)
- sta $fb
- lda $fc
- adc #0 ; al byte alto ($fc) sommiamo il carry
- sta $fc
- dex
- bpl looprighe ; cicliamo per 25 righe (da #24 a #0)
- ;riempie la color ram - 3 blocchi, di 3 differenti colori (verde, bianco e rosso), di 12 colonne l'uno per ogni riga di schermo
- ldx #24 ;25 righe (da #0 a #24)
- lda #$02 ;memorizziamo parte bassa/parte alta (little endian) dell'indirizzo della memoria colore $d802 (lasciamo vuote 2 colonne a inizio riga)
- sta $fb
- lda #$d8
- sta $fc
- looprighecram
- ldy #0 ;il Registro Y tiene traccia del numero di colonne per ogni riga di schermo
- lda #5 ;Color code Verde (1° blocco di 12 colonne)
- loopverde
- sta ($fb),y
- iny
- cpy #12 ;cicliamo da #0 a #11 (12 colonne)
- bne loopverde ;quando y diventa 12 (13° colonna della riga corrente) allora usciamo dal loop
- lda #1 ;Color code Bianco (2° blocco di 12 colonne)
- loopbianco
- sta ($fb),y
- iny
- cpy #24 ;cicliamo da #0 a #23 (12 colonne)
- bne loopbianco ;quando y diventa 24 (25° colonna della riga corrente) allora usciamo dal loop
- lda #2 ;Color code Rosso (3° blocco di 12 colonne)
- looprosso
- sta ($fb),y
- iny
- cpy #36 ;cicliamo da #0 a #35 (12 colonne)
- bne looprosso ;quando y diventa 36 (37° colonna della riga corrente) allora usciamo dal loop
- ;abbiamo terminato di colorare i 3 blocchi di 12 colonne (nei 3 differenti colori della bandiera) per la riga corrente
- ;quindi sommiamo #40 per passare alla riga successiva lasciando 2 colonne vuote a destra per la riga corrente
- lda $fb
- clc
- adc #40
- sta $fb
- lda $fc
- adc #0
- sta $fc
- dex
- bpl looprighecram ;ricominciamo il ciclo di colarazione dei 3 blocchi di colonne per la successiva riga di schermo
- cli
- jmp *
- ;Primo Raster Interrupt, avviene alla Raster line $f9 (249)
- irq00
- lda #%00010011 ;Impostazione della modalità 24 righe della Display Window 320*200 (azzeriamo bit 3 RSEL di $d011)
- sta $d011 ;Notare che nel bit pattern di $d011, di default sono settati i bit 0 e 1 (Valore 3) dell'Y SCROLL (bit 0-2)
- ;nonchè il bit 4 DEN (Display ENable)
- lda #<irq01 ;Impostazione del Vettore del prossimo IRQ Interrupt Handler a irq01
- sta $0314
- lda #>irq01
- sta $0315
- lda #$08 ;Impostazione della riga $08 per il prossimo Raster Interrupt
- sta $d012
- lsr $d019 ;Acknowledge (ACK) del Raster Interrupt tramite Istruzione RMW (Read/Modify/Write)
- ;di fatto vado a scrivere un 1 nel bit 0 di $d019 (Interrupt Flag Register) in modo da azzerare
- ;il Flag del Raster Interrupt (IRST)
- jmp $ea81 ;Salto alla fine dell'IRQ Interrupt Handler di sistema (ultimi 6 byte per Pull dallo Stack di A, X e Y)
- ;Secondo Raster Interrupt, avviene alla riga $08
- irq01
- lda #%00011011 ;Impostazione della modalità (di default) a 25 righe della Display Window 320*200 (Settiamo il bit 3 RSEL di $d011)
- sta $d011
- lda #<irq00 ;Impostazione del vettore IRQ Handler a irq00
- sta $0314
- lda #>irq00
- sta $0315
- lda #$f9 ;Impostiamo il Raster Interrupt alla Raster line $0f9 (249), 8 bit meno significativi del Raster Register $d012-$d011
- sta $d012 ;l'MSB del Raster Register è già stato azzerato dalla precedente scrittura nel registro $d011
- lsr $d019 ;Acknowledge (ACK) del Raster Interrupt
- jmp $ea31 ;JuMP all'IRQ Interrupt Handler di sistema (1 volta per quadro video o Frame)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement