Advertisement
felixnardella

Bandiera Italiana Open Border

May 7th, 2022
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.08 KB | None | 0 0
  1. ; Bandiera Italiana Verticale
  2. ;
  3. ; - Apertura Bordi (in Raster Interrupt)
  4. ; - Disegno Sprite Bordo Superiore
  5. ; - Utilizzo bug VIC-II per multiplexing automatico sprite hardware nel Bordo Inferiore
  6. ; - Disegno Bandiera Italiana nella Display Window
  7. ;
  8. ; By Felix Nardella & Attilio Capuozzo per RetroProgramming Italia - RP Italia (A division of "RetroCampus" Associazione Culturale)
  9. ; CBM Prg Studio Version
  10.  
  11. * = $c000
  12.  
  13. sei ;Settiamo l'Interrupt Disable Flag (Sospensione IRQ Interrupt)
  14.  
  15. jsr $e544 ;pulisce schermo tramite KERNAL Routine
  16. lda #6 ;colora bordo blu
  17. sta $d020
  18.  
  19. lda #$7f
  20. sta $dc0d ;Disattivazione del Timer A Interrupt CIA 1 (System Interrupt) usato dal Kernal per
  21. sta $dd0d ;animazione cursore e scan tastiera ogni 1/60 secondo + Disattivazione completa di tutti i CIA Interrupt (IRQ e NMI)
  22. bit $dc0d ;La lettura di questi registri ne azzera il contenuto "scodando" eventuali CIA Interrupt (IRQ/NMI) in pending
  23. bit $dd0d
  24.  
  25. lda #$01 ;Attiviamo il Raster Interrupt del VIC (Settiamo bit 0 di $d01a Interrupt Enable Register)
  26. sta $d01a
  27.  
  28. lda #$f9 ;Impostiamo l'IRQ Raster Interrupt alla Raster line $f9 (primi 8 bit Raster Register $d012-$d011)
  29. sta $d012
  30.  
  31. lda #$1b ;Azzeriamo bit 8 del Raster Register $d012-$d011 (MSB $d011)
  32. sta $d011
  33.  
  34. lda #<irq00 ;Impostiamo il vettore IRQ Handler ($0314-$0315) a irq00 (1° Interrupt Handler)
  35. sta $0314
  36. lda #>irq00
  37. sta $0315
  38.  
  39. ;Definizione sprite
  40. punt0 = $07f8 ;puntatori
  41. punt1 = $07f9
  42. punt2 = $07fa
  43. punt3 = $07fb
  44. punt4 = $07fc
  45. punt5 = $07fd
  46.  
  47. blocco = $02c0 ;blocco mem = 704
  48.  
  49. abilita = $d015 ;abilita sprite
  50.  
  51. colores0 = $d027 ;colori
  52. colores1 = $d028
  53. colores2 = $d029
  54. colores3 = $d02a
  55. colores4 = $d02b
  56. colores5 = $d02c
  57.  
  58. posx0 = $d000 ;pos x,y
  59. posy0 = $d001
  60. posx1 = $d002
  61. posy1 = $d003
  62. posx2 = $d004
  63. posy2 = $d005
  64. posx3 = $d006
  65. posy3 = $d007
  66. posx4 = $d008
  67. posy4 = $d009
  68. posx5 = $d00a
  69. posy5 = $d00b
  70.  
  71. ;espansione y sprite
  72. expy = $d017
  73.  
  74. ;espansione x sprite
  75. expx = $d01d
  76.  
  77. ;msb
  78. msb = $d010
  79.  
  80. ;copia dati sprite in mem
  81. ldx #$00
  82. loop lda #$ff
  83. sta blocco,x
  84. inx
  85. cpx #$40
  86. bne loop
  87.  
  88. ;definisce i puntatori
  89. lda #blocco/$40
  90. sta punt0
  91. sta punt1
  92. sta punt2
  93. sta punt3
  94. sta punt4
  95. sta punt5
  96.  
  97. ;colora sprite
  98. lda #$05 ;verde
  99. sta colores0
  100. sta colores1
  101. lda #$01 ;bianco
  102. sta colores2
  103. sta colores3
  104. lda #$02 ;rosso
  105. sta colores4
  106. sta colores5
  107.  
  108. ;abilita 6 sprite
  109. lda #%00111111
  110. sta abilita
  111.  
  112. ;espandi 6 sprite in x, y
  113. lda #%00111111
  114. sta expx
  115. sta expy
  116.  
  117. ;attiva msb per sprite 5
  118. lda #%00100000
  119. sta msb
  120.  
  121. ;Posizioniamo i 6 sprite espansi (sia sull'asse x che y) - che compongono la bandiera - interamente nel bordo superiore
  122. ;I bordi verticali verranno aperti negli Interrupt Handler irq00 e irq01
  123. ;Per un bug del chip grafico (GPU) VIC-II, i 6 sprite saranno automaticamente multiplexati nel bordo inferiore a costo computazionale 0
  124. ;Tra gli sprite hardware del bordo superiore e quelli multiplexati in automatico dal VIC nel bordo inferiore sussiste una distanza (gap) fissa
  125. ;Per decidere la coordinata y ottimale a cui posizionare i 6 sprite nel bordo superiore,
  126. ;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
  127. ;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
  128. ;Il Bordo Superiore termina alla Raster line 50. Successivamnte inizia la Display Window delle dimensioni standard di 320*200.
  129. ;Il Bordo Verticale Inferiore incomincia dalla Raster line 250
  130.  
  131. ;pos x
  132. lda #40
  133. sta posx0
  134. lda #88
  135. sta posx1
  136. lda #136
  137. sta posx2
  138. lda #184
  139. sta posx3
  140. lda #232
  141. sta posx4
  142. lda #24
  143. sta posx5
  144. ;pos y coordinata #1
  145. lda #1
  146. sta posy0
  147. sta posy1
  148. sta posy2
  149. sta posy3
  150. sta posy4
  151. sta posy5
  152.  
  153. ;riempie schermo di spazi in Reverse (Screen Code #160)
  154. ldx #24 ;25 Righe (da #0 a #24)
  155. lda #$02 ;locazione Memoria Video $0402 (lasciamo 2 colonne vuote a sinistra per allineamento con bandiera)
  156. sta $fb ;memorizziamo Parte Bassa/Parte Alta (little endian) dell'indirizzo di schermo rispettivamente nelle 2 locazioni di pagina 0 $fb-$fc
  157. lda #$04
  158. sta $fc
  159. looprighe
  160. lda #160 ;Screen Code 160 = Spazio in Reverse
  161. ldy #35 ;Bandiera lunga 36 (da #0 a #35) colonne (La bandiera è lunga complessivamente 288 pixel/8 px=36 colonne)
  162. loopcolonne
  163. sta ($fb),y ;riempiamo le locazioni di schermo tramite indirizzamento indiretto indicizzato con registro dati Y del 6510
  164. dey
  165. bpl loopcolonne ;cicliamo per 36 colonne (y=35) di ogni riga di schermo - da #35 a #0 -
  166.  
  167. lda $fb ;se abbiamo ciclato per 36 colonne allora dobbiamo passare a riga schermo successiva
  168. 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)
  169. adc #40 ;sommiamo #40 al byte basso ($fb)
  170. sta $fb
  171. lda $fc
  172. adc #0 ; al byte alto ($fc) sommiamo il carry
  173. sta $fc
  174. dex
  175. bpl looprighe ; cicliamo per 25 righe (da #24 a #0)
  176.  
  177. ;riempie la color ram - 3 blocchi, di 3 differenti colori (verde, bianco e rosso), di 12 colonne l'uno per ogni riga di schermo
  178. ldx #24 ;25 righe (da #0 a #24)
  179. lda #$02 ;memorizziamo parte bassa/parte alta (little endian) dell'indirizzo della memoria colore $d802 (lasciamo vuote 2 colonne a inizio riga)
  180. sta $fb
  181. lda #$d8
  182. sta $fc
  183. looprighecram
  184. ldy #0 ;il Registro Y tiene traccia del numero di colonne per ogni riga di schermo
  185.  
  186. lda #5 ;Color code Verde (1° blocco di 12 colonne)
  187. loopverde
  188. sta ($fb),y
  189. iny
  190. cpy #12 ;cicliamo da #0 a #11 (12 colonne)
  191. bne loopverde ;quando y diventa 12 (13° colonna della riga corrente) allora usciamo dal loop
  192.  
  193. lda #1 ;Color code Bianco (2° blocco di 12 colonne)
  194. loopbianco
  195. sta ($fb),y
  196. iny
  197. cpy #24 ;cicliamo da #0 a #23 (12 colonne)
  198. bne loopbianco ;quando y diventa 24 (25° colonna della riga corrente) allora usciamo dal loop
  199.  
  200. lda #2 ;Color code Rosso (3° blocco di 12 colonne)
  201. looprosso
  202. sta ($fb),y
  203. iny
  204. cpy #36 ;cicliamo da #0 a #35 (12 colonne)
  205. bne looprosso ;quando y diventa 36 (37° colonna della riga corrente) allora usciamo dal loop
  206.  
  207. ;abbiamo terminato di colorare i 3 blocchi di 12 colonne (nei 3 differenti colori della bandiera) per la riga corrente
  208. ;quindi sommiamo #40 per passare alla riga successiva lasciando 2 colonne vuote a destra per la riga corrente
  209. lda $fb
  210. clc
  211. adc #40
  212. sta $fb
  213. lda $fc
  214. adc #0
  215. sta $fc
  216. dex
  217. bpl looprighecram ;ricominciamo il ciclo di colarazione dei 3 blocchi di colonne per la successiva riga di schermo
  218.  
  219. cli
  220. jmp *
  221.  
  222.  
  223. ;Primo Raster Interrupt, avviene alla Raster line $f9 (249)
  224.  
  225. irq00
  226.  
  227.  
  228. lda #%00010011 ;Impostazione della modalità 24 righe della Display Window 320*200 (azzeriamo bit 3 RSEL di $d011)
  229. 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)
  230. ;nonchè il bit 4 DEN (Display ENable)
  231. lda #<irq01 ;Impostazione del Vettore del prossimo IRQ Interrupt Handler a irq01
  232. sta $0314
  233. lda #>irq01
  234. sta $0315
  235.  
  236. lda #$08 ;Impostazione della riga $08 per il prossimo Raster Interrupt
  237. sta $d012
  238.  
  239. lsr $d019 ;Acknowledge (ACK) del Raster Interrupt tramite Istruzione RMW (Read/Modify/Write)
  240. ;di fatto vado a scrivere un 1 nel bit 0 di $d019 (Interrupt Flag Register) in modo da azzerare
  241. ;il Flag del Raster Interrupt (IRST)
  242. jmp $ea81 ;Salto alla fine dell'IRQ Interrupt Handler di sistema (ultimi 6 byte per Pull dallo Stack di A, X e Y)
  243.  
  244. ;Secondo Raster Interrupt, avviene alla riga $08
  245.  
  246. irq01
  247.  
  248.  
  249. lda #%00011011 ;Impostazione della modalità (di default) a 25 righe della Display Window 320*200 (Settiamo il bit 3 RSEL di $d011)
  250. sta $d011
  251.  
  252. lda #<irq00 ;Impostazione del vettore IRQ Handler a irq00
  253. sta $0314
  254. lda #>irq00
  255. sta $0315
  256.  
  257. lda #$f9 ;Impostiamo il Raster Interrupt alla Raster line $0f9 (249), 8 bit meno significativi del Raster Register $d012-$d011
  258. sta $d012 ;l'MSB del Raster Register è già stato azzerato dalla precedente scrittura nel registro $d011
  259.  
  260. lsr $d019 ;Acknowledge (ACK) del Raster Interrupt
  261.  
  262. 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