Autore Topic: Mini Demo  (Letto 3152 volte)

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Mini Demo
« il: 03 Aprile 2011, 21:58:35 »
Ciao ragazzi, vi mostro la mia ultima fatica :) non è di certo un granchè graficamente, tecnicamente, o come idea, ma ho fatto del mio meglio! :)

cè ancora un po' di lavoro da fare, la sincronia del raster va a farsi friggere, penso a causa degli sprites (mi sa che faccio un po' troppe cose..)

comunque, ecco il codice, in allegato il compilato e le risorse incluse!

Codice: [Seleziona]
;*************************************
;*History repeats itself by Elder0010*
;*************************************

  * = $0810;Sys 2064!
 
  ;******************
  ;*Inizializzazione*
  ;******************
 
  sei  ;via interrupts
  jsr $1000;init music
  lda #$00; nero
  sta $d020  ; border background colour   
  sta $d021  ; screen background colour
 
  JSR $E544 ;QUICK SCREEN CLEAR

  lda #$18   ; screen at $0400 chars a $2000
  sta $d016;multicolor!
   
  lda #$1b
  ldx #$08
  ldy #$18
  sta $d011   ; text mode
  sty $d018   ; screen a $0400, charset a $2000

  ;**************
  ;*Clear screen*
  ;**************
  ldx #$ff
  lda #61     ; carattere vuoto
clrloop 
  sta $0400,x   
  sta $04e0,x   
 
  dex           
  bne clrloop   
 
  ;**************
  ;*Disegno logo*
  ;**************
  ldx #0 
atoloop
  lda $3000,x;Itero sul charset
  sta $0400,x;e stampo su schermo

  lda $30ff,x
  sta $04ff,x;finchè necessario
     
  ;Colore
  lda #$0f
  sta $d800,x
  sta $d8ff,x
 
      inx
  cpx #$e1
  bne atoloop
 
  lda #$0

  sta $d022
  sta $d023
 
  ;*****************
  ;*Disegno sprites*
  ;*****************
  lda #$0f   ;Sprite 0-1-2-3
  sta $d015 ;accesi (infatti #$0f = 1111)
 
  lda #$fd ;punto lo sprite 1 a $3f37 (siamo sempre nel banco VIC 1)
  sta $07f8 ;e storo
 
           ;duplico lo sprite
  sta $07f9 ;e storo sprite 1
  sta $07fa ;e storo sprite 2
  sta $07fb ;e storo sprite 3
 
  lda #$30
  sta $d000  ;coord. x sprite 0
  sta $d004;coord. x sprite 2
 
  lda #$2b
  sta $d002  ; coord. x sprite 1
  sta $d006  ; coord. x sprite 3
 
 
  ;*************************
  ;*prendo dalla sintable  *
  ;*i valori di start per y*
  ;*************************
  lda $5000
  sta $d001  ; coord y sprite 0
  sta $d007  ; coord y sprite 3 
 
  ;Inverto per gli altri 2 sprites
  eor $ff
  sta $d003  ; coord y sprite 1
  sta $d005;coord y sprite 4
 
  lda #$0a;poichè la posizione x del secondo e del quarto
  sta $d010;sprite è > $ff devo spostare questo valore
    ;1010 
 
  lda #$7 ;giallo per tutti..
  sta $d027
  sta $d028
  sta $d029
  sta $d02a
 
  lda #$ff
  sta $d01c 
 
  ;Installo interrupt
  lda #$7f
  ldx #$01
  sta $dc0d   ; Turn off CIA 1 interrupts
  sta $dd0d   ; Turn off CIA 2 interrupts
  stx $d01a   ; Turn on raster interrupts
 
  lda #<int   
  ldx #>int   
  sta $0314   ;store in interrupt vector
  stx $0315
  ldy #$0
  sty $d012

  lda $dc0d   ; ACK CIA 1 interrupts
  lda $dd0d   ; ACK CIA 2 interrupts
  asl $d019   ; ACK VIC interrupts
 
  cli  ; start interruzioni
     

  jmp *
 
  ;*****************
  ;*Effetto "slimy"*
  ;*****************
int

  lda #0
  sta $d020

      lda #$1b
  ldx #$08
  ldy #$18
  sta $d011  ; Clear high bit di $d012: text mode
  sty $d018   
 
  lda #$18 ; screen at $0400 chars a $2000
  sta $d016; multicolor!
 
sliloop 
  ldx counter 
  inx         
  cpx #$aa   
  bne skipn;se arrivo ad #$aa resetto il contatore
  ldx #$00
skipn
  stx counter
  lda $212e,x ; byte xesimo dai caratteri
  eor $ff    ; inverti
  sta $212e,x ; store al suo posto
  inx
 
  lda #<int2   
  ldx #>int2   
  sta $0314   
  stx $0315
  ldy #$92
  sty $d012

  asl $d019
  pla
  tay
  pla
  tax
  pla
  rti       

  ;***********************
  ;*Visualizza messaggio *
  ;*e riproduce la musica*
  ;***********************
int2
  lda #$0
  sta $d020
 
  lda #$1b
  ldx #$08
  ldy #$14
  ldy #$1a
  sta $d011   
  sty $d018 
 
  lda #$C8 
            sta $d016

  ldx #$00
dispmsg  lda message,x
  cmp #$40   
  bcc charok   
  sec       
  sbc #$40 
charok  sta $0661,x
  inx
  cpx #$16
  bne dispmsg

  lda #<intsprites   
  ldx #>intsprites   
  sta $0314   
  stx $0315
  ldy #$a9
  sty $d012
 
  asl $d019
  pla
  tay
  pla
  tax
  pla
  rti
 
  ;*******************
  ;*Movimento sprites*
  ;******************* 
intsprites
 
  lda #<int3   
  ldx #>int3     
  sta $0314   
  stx $0315
  ldy #$fe
  sty $d012
 
  ;carico valore offset
  ;precedentemente salvato
  ldx sinoffset
     
  ;ciclo sintable 
  lda $5000+$00,x
  sta $5000+$00
     
  cpx #$80
      bne addx
  ldx #$0
 
  jmp store
addx  inx
  jmp store
store 
  stx sinoffset;salvo per il prossimo giro

  ;stessa procedura dell'init, con valori aggiornati
  ;dalla sintable ciclata
  lda $5000
  sta $d001   
  sta $d007
 
  eor #$ff
  sta $d003   
  sta $d005
 
  asl $d019
  pla
  tay
  pla
  tax
  pla
  rti
 
 
  ;********************
  ;*double interrupt  *
  ;*per raster stabile*
  ;********************
int3
  lda #<int4 
  sta $0314   
  sta $d019
  inc $d012     
  cli 

  ;---FINO A QUI MAX 18 CICLI (cosiderato caso peggiore)

 
  ;Aggiungo una serie di nop per "non fare nulla" intanto che
           ;l'altro interrupt viene eseguito
  nop
  nop
  nop
  nop
  nop
  nop
 
  brk

  align 2
  *=*+1;
  ;la routine verrà eseguita con un ritardo di 2/3+7+29=38/39 cicli.
int4
 
 
  asl $d019;6 = 58
  lda #$ff   ;2 = 60
  cmp $d012  ;4 =  64 - siamo a 0 o 1 cicli
 
  beq start  ;3 con questo branch allineo l'ultimo
start                  ;ciclo di insicurezza

  ;*********************
  ;*un po di rasterbars*
  ;*********************
 
  ;todo: fix raster non realmente stabile :(
 
  ldx #$0d
  dex 
  bne *-1
rasterj 
  iny
 
  lda colors,y
  sta $d020
 
  ldx #$87
  dex 
  bne *-1
 
  nop
 
  cpy #$3
  bne rasterj
 
 
  sta $d020
  sta $d021
 
  nop
  nop
  nop

  bit $24
  lda #$0
  sta $d020
  sta $d021
 
  ;Tolgo i 6 bytes inseriti nello stack
  ;facendo push nell'accumulatore 6 volte
  pla
  pla
  pla
  pla
  pla
  pla

  ;e riparto da capo..
  lda #<int   
  ldx #>int     
  sta $0314   
  stx $0315
  ldy #$0
  sty $d012
 
  ;rimetto apposto anche il registro $d012
  lda #$34
  sta $d012
 
  jsr $1003
  jmp $ea31
 
 
 
;-------------------------------------------------------------------
counter 
  .byte 8
 
sinoffset
  .byte $1
     
message   
  .text "history repeats itself!"

colors
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
  .byte $00,$07,$00,$07,$00,$07
 
  ;music
  *=$1000
  incprg "dawn.dat"
     
     ;atomic logo charset
  *=$2000+2
  incprg "atorle.chr"
 
  ;charset scritta
  *=$2800
  incprg "bombo.64c"
     
  ;graphic data logo
  *=$3000
  incprg "matrix.prg"
 
  ;sprite
  *=$3f37
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $AA,$95,$50
  .byte $55,$6A,$A0
  .byte $55,$6A,$A0
  .byte $55,$6A,$A0
  .byte $55,$6A,$A0
  .byte $55,$6A,$A0
  .byte $55,$6A,$A0
  .byte $55,$6A,$A0
  .byte $55,$6A,$A0
  .byte $55,$6A,$A0
  .byte 0

  ;sinus table
  *=$5000-26
  incprg "sin_a.p00"
« Ultima modifica: 22 Gennaio 2015, 00:25:07 da eregil »
lda #0 sta $d020 sta $d021

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Mini Demo
« Risposta #1 il: 03 Aprile 2011, 22:30:50 »
vi allego anche il prg compresso piu' facile da eseguire :)
« Ultima modifica: 22 Gennaio 2015, 00:25:21 da eregil »
lda #0 sta $d020 sta $d021

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Mini Demo
« Risposta #2 il: 04 Aprile 2011, 00:19:57 »
 nota: per spingere via il flickering della rasterbar inferiore basta togliere un nop
(scusate non me n'ero accorto). Il codice di quella parte diventa quindi

Codice: [Seleziona]
rasterj  
   iny
  
   lda colors,y
   sta $d020
  
   ldx #$87
   dex  
   bne *-1
  
  ;nop TOLTO NOP
  
   cpy #$3
   bne rasterj
lda #0 sta $d020 sta $d021

Freshness79

  • Utente
  • **
  • Post: 128
  • Gioco Preferito: Dizzy collection
Mini Demo
« Risposta #3 il: 04 Aprile 2011, 12:15:36 »
 Ottimo lavoro! Mi fa veramente piacere vedere nuove produzioni, fresche di scrittura, in questo forum!
Spero possa essere uno sprone per altre persone.
Qualche nota tecnica: dal momento che ti limiti a delle raster line con $D020 in realtà non hai alcuna necessità di sincronizzarti al raster beam.
La stabilizzazione serve solamente quando s'intende effettuare modifiche ai registri VIC con precisione perfetta; nel caso tuo non hai questa necessità... (almeno che non aggiungi qualche split $d020).
Ben fatto comunque!
 

Elder0010

  • Utente
  • **
  • Post: 75
    • http://csdb.dk/scener/?id=22731
  • Gioco Preferito: Rampage
Mini Demo
« Risposta #4 il: 04 Aprile 2011, 14:06:21 »
 grande! grazie!
tra qualche giorno posto il codice sull'altro topic della sincronizzazione!

ora mi faccio venire in mente qualcosa di piu' bello graficamente e come idea! stay tuned :)
lda #0 sta $d020 sta $d021