EmanueleBonin

VSCroll roll up

Jun 29th, 2020
2,253
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. SCNKEY  =   $FF9F   ; Scan keyboard for keypress  
  2. GETIN   =   $FFE4   ; Get input from buffer, store it in A
  3. CLRSCR  =   $E544   ; Clear screen
  4. Scr1    =   $0400   ; screen Ram address
  5.  
  6. ;****************************************************************************
  7. ; Scroll verticale utilizzando il raster interrupt
  8. ;****************************************************************************
  9. DELAYMAX    = 1            ; valore da usare per ritardare lo scroll
  10.  
  11.  
  12.         *=$C000
  13.  
  14.         ;jsr RollUp
  15.         ;rts
  16.  
  17.         sei                 ; disabilito gli interrupt settango il flag di disabilitazione
  18.         jsr InitSubroutine  ; subroutine di inizializzazione (eseguita all'unizio e basta)
  19.  
  20.         ldy #$7f            ; $7f = %01111111
  21.         sty $dc0d           ; disabilito gli interrupt dei CIA
  22.         sty $dd0d           ; settando $DC0D e $DD0D
  23.         lda $dc0d           ; ... quindi cancello la coda degli
  24.         lda $dd0d           ; interrupt non processati
  25.  
  26.         lda #$01            ; Imposto la maschera degli interrupt
  27.         sta $d01a           ; in modo da gestire gli interrupt raster
  28.  
  29.         lda #<MyIrq         ; Modifico il vettore di interrupt dell'orologio
  30.         ldx #>MyIrq         ; in modo che punti alla mia routine di gestione
  31.         sta $314            ; Lo-Byte
  32.         stx $315            ; Hi-Byte
  33.  
  34.  
  35.         lda #250            ; Indico a quale raster line notificare l'interrupt
  36.         sta $d012           ; per la prima volta, impostando il numero riga in $D012
  37.  
  38.         lda $d011           ; Il bit 7 di D011 + gli i bit di $D012 indicano
  39.         and #$7f            ; il numero di raster line, la quale può assumere
  40.         sta $d011           ; valori maggiori di 255, quindi va impostato anch'esso
  41.                             ; a seconda delle esigenze in questo caso viene azzerato
  42.  
  43.         cli                 ; riabilitazione degli interrupt
  44.         rts
  45.  
  46. ;****************************************************************************
  47. ; Routine di inizializzazione eseguita una sola volta prima di aver impostato
  48. ; la routine da eseguire durante l'interrupt
  49. ;****************************************************************************
  50.  
  51. InitSubroutine
  52.         lda $d011           ; Porto lo schermo in modalità 24 righe
  53.         and #%11110111      ; per lo scroll verticale in modo da nascondere le
  54.                             ; parti nere  dello scroll hardware
  55.         ora #%00000111      ; quindi faccio shiftare di 7 pixel in basso
  56.         sta $d011
  57.  
  58.  
  59.                             ; Sprite
  60.         lda #192            ; Indico a vic II l'area di memoria dove
  61.         sta $07f8           ; legegre i dati degli sprite
  62.  
  63.         lda #$30            ; Indico il valore della coordita x
  64.         sta $d000           ; 8bit meno significativi
  65.         lda #%11111110      ; maschera per impostare il
  66.         sta $d010           ; nono bit per superare la coordinata x 255
  67.  
  68.         lda #$64            ; Indico il valore della coordita y
  69.         sta $d001           ; 0 - 255
  70.         lda #%00000001
  71.         sta $d015           ; Enable sprite 0
  72.  
  73.                             ; Carico i valori dei bytes per gli sprites
  74.         ldy #63
  75. @LoopSprite
  76.         lda SpriteRepository,y
  77.         sta $3000,y
  78.         dey
  79.         bpl @LoopSprite
  80.  
  81.  
  82.         rts
  83.  
  84. ;****************************************************************************
  85. ; Routine da eseguire non appena viene notificato il raster interrupt
  86. ;****************************************************************************
  87.  
  88. MyIrq
  89.  
  90.         dec Delay           ; Decrementa il contatore di ritardo
  91.         bne Exit            ; non fare nulla finchè il contatore di ritardo non è 0
  92.         ldx #DELAYMAX       ; setta il contatore al valore
  93.         stx Delay           ; prestabilito in DELAYMAX
  94.         dec Pixel           ; Decrementa il contatore che indica dove siamo con lo scroll
  95.         beq ResetScroll     ; se == 0 allora bisogna "resettare" lo scroll
  96.         dec $d011           ; ... altrimenti esegui lo scroll di un solo pixel
  97.         bne Exit            ; james hates jmp ... so i use this pseudo conditional
  98.                             ; branch that is ever true
  99.  
  100. ResetScroll
  101.  
  102.         ldx #8              ; rispristina il contatore
  103.         stx Pixel           ; di "stato" dello scroll
  104.  
  105.  
  106.         lda $d011           ; "Ripristinta" lo scroll
  107.         ora #%00000111      ; impostando opportunamente
  108.         sta $d011           ; il registro per lo scroll verticale
  109.  
  110.         jsr RollUp          ; Complete the scroll moving up one row
  111.  
  112. Exit
  113.         asl $d019           ; Acknowledge - indico di mantenere lo stesso raster beam
  114.         ;jmp $ea81          ; ritorno alla normale gestione dell'interrupt (senza scansione Keyboard)
  115.         jmp $ea31           ; ritorno alla normale gestione dell'interrupt
  116.                             ; i can't avoid this jump because i wont control of
  117.                             ; my computer at the end!
  118.  
  119.  
  120.  
  121. ; *********************************************************************
  122. ; Segmented 256 unrolled routine
  123. ; Ugly version But Working well (14996 cycles)
  124. ; Absolutely My Faster routine
  125. ; *********************************************************************
  126. RollUp
  127.         ldy #$27
  128. LoopFirstLine
  129.         ldx $0428,y
  130.         lda $0400,y
  131.         sta RowBuffer,y
  132.         txa
  133.         sta $0400,y
  134.         dey  
  135.         bpl LoopFirstLine
  136.  
  137.         ldy #$00
  138. Loop256
  139.         lda $0450,y
  140.         sta $0428,y
  141.         iny  
  142.         bne Loop256
  143.  
  144. Loop512
  145.         lda $0550,y
  146.         sta $0528,y
  147.         iny  
  148.         bne Loop512
  149.  
  150. Loop768
  151.         lda $0650,y
  152.         sta $0628,y
  153.         iny  
  154.         bne Loop768
  155.  
  156. Loop1024
  157.         lda $0750,y
  158.         sta $0728,y
  159.         iny
  160.         cpy #$98
  161.         bne Loop1024
  162.  
  163.         ldy #$27
  164. LoopLastLine
  165.         lda RowBuffer,y
  166.         sta $07C0,y
  167.         dey  
  168.         bpl LoopLastLine
  169.  
  170.         rts
  171.  
  172.  
  173.  
  174. RowBuffer   bytes   0*40
  175. Saved   byte 0
  176. Pixel   byte 8
  177. Delay   byte 15
  178.  
  179. SpriteRepository
  180. ;Repository for sprite
  181.  BYTE 0,40,0,0,66,0,8,36
  182.  BYTE 16,14,82,112,10,36,80,13
  183.  BYTE 82,176,4,137,32,6,102,96
  184.  BYTE 2,153,64,2,195,64,3,255
  185.  BYTE 192,0,129,0,0,90,0,0
  186.  BYTE 36,0,0,36,0,0,36,0
  187.  BYTE 0,36,0,0,60,0,0,60
  188.  BYTE 0,0,24,0,0,0,0,0
  189. ;
  190. ; TEXT "..........@.@..........."
  191. ; TEXT ".........@....@........."
  192. ; TEXT "....@.....@..@.....@...."
  193. ; TEXT "....@@@..@.@..@..@@@...."
  194. ; TEXT "....@.@...@..@...@.@...."
  195. ; TEXT "....@@.@.@.@..@.@.@@...."
  196. ; TEXT ".....@..@...@..@..@....."
  197. ; TEXT ".....@@..@@..@@..@@....."
  198. ; TEXT "......@.@..@@..@.@......"
  199. ; TEXT "......@.@@....@@.@......"
  200. ; TEXT "......@@@@@@@@@@@@......"
  201. ; TEXT "........@......@........"
  202. ; TEXT ".........@.@@.@........."
  203. ; TEXT "..........@..@.........."
  204. ; TEXT "..........@..@.........."
  205. ; TEXT "..........@..@.........."
  206. ; TEXT "..........@..@.........."
  207. ; TEXT "..........@@@@.........."
  208. ; TEXT "..........@@@@.........."
  209. ; TEXT "...........@@..........."
  210. ; TEXT "........................"
RAW Paste Data