Retroprogramming -
Programmare oggi il C64
Giovanni Simotti

                   gsimotti@tiscalinet.it
Programmare un computer 8-bit
Poche risorse = nuovo approccio alla
 programmazione
  codice molto ottimizzato
  niente oggetti / database / etc...
Sviluppo molto più comodo rispetto a “ieri”
  Cross-development PC/emulatore
  ampia documentazione su Internet
                                      Giovanni Simotti     2
                                  gsimotti@tiscalinet.it
Struttura basilare di un computer
CPU
 esegue il programma in linguaggio macchina e
  comanda l'hardware dedicato (periferiche e chip
  dedicati)
MEMORIA
 contiene il programma e i dati letti/scritti dalla cpu
 è organizzata in celle grandi 1 byte
      ogni cella risiede in un certo indirizzo di memoria
                                           Giovanni Simotti     3
                                       gsimotti@tiscalinet.it
Il linguaggio assembler (ASM)
Rappresentazione “leggibile” del linguaggio
 macchina
  Corrispondenza 1:1 tra istruzioni assembler e
   istruzione in linguaggio macchina
  Commenti importantissimi!
La traduzione è eseguita dall'assemblatore
  .asm -> assemblatore -> .prg -> emulatore

                                    Giovanni Simotti     4
                                gsimotti@tiscalinet.it
Esempio “Hello World”




                  Giovanni Simotti     5
              gsimotti@tiscalinet.it
Esempio “Hello World”(continua)




                       Giovanni Simotti     6
                   gsimotti@tiscalinet.it
CPU
Program Counter (PC)
        Contiene l'indirizzo dell'istruzione in esecuzione

Stack Pointer (SP)
        Contiene l'indirizzo della prox scrittura nello stack

Registri
        Accumulatore (usato nelle operazioni matematico - logiche)
        6502: anche X, Y

Flag di stato
                                                Giovanni Simotti     7
                                            gsimotti@tiscalinet.it
Istruzioni ASM - Tipi
Spostamento dati da/per i registri
Calcolo (somma, sottrazione, shift, op. logici)
  6502: niente divisione/moltiplicazione (solo lo shift)
Comparazione (scrivono il risultato nei flag)
Salto (condizionato o non)
Salto a subroutine (utile per riusare funzioni)

                                      Giovanni Simotti     8
                                  gsimotti@tiscalinet.it
Istruzioni ASM - Indirizzamento
Indica dov'è l'operando, ovvero su cosa deve
  operare l'istruzione
Immediato: LDA #$44
Assoluto: LDA $4400
  Zero Page: LDA $44 (equivale a: LDA $0044)
Indicizzato assoluto: LDA $4400,X (cicli FOR)
  Zero Page: LDA $44,X (equivale a: LDA $0044,x)
                                  Giovanni Simotti     9
                              gsimotti@tiscalinet.it
Istruzioni ASM– Indirizzamento (continua)
Indicizzato indiretto: LDA ($02,X)
Indiretto indicizzato: LDA ($02),Y
Assoluto indiretto: JMP ($F000)
Relativo: BCS $44
  Offset max: -126 +129
  Possiamo scrivere anche BCS Label
Implicito: NOP
                                  Giovanni Simotti     10
                              gsimotti@tiscalinet.it
Istruzioni ASM
Per ogni istruzione, un byte per l'op-code + altri
 bytes a seconda dell'indirizzamento
  Max 256 op-code possibili
  LDA occupa 8 op-code con i vari indirizzamenti
Ogni byte letto = 1 ciclo di clock impiegato
  LDA può impiegare da 2 a 6 cicli di clock a seconda
   dell'indirizzamento!

                                    Giovanni Simotti     11
                                gsimotti@tiscalinet.it
Software
Text editor a
  piacere
DASM
Vice
  (Alt+M per
    eseguire il
    monitor)

                             Giovanni Simotti     12
                         gsimotti@tiscalinet.it
C64
MOS Technology 6510 (molto simile al 6502)
CPU Clock: 1.023mhz NTSC (60hz), 0.985mhz
 PAL (50hz)
  Meno di 20000 cicli di clock per frame!
MEMORIA: 64kB RAM
  “Sorgente + grafica + sonoro” in (molto meno di)
    65536 byte!
                                    Giovanni Simotti     13
                                gsimotti@tiscalinet.it
C64 – Chip Dedicati
“Potente” hardware dedicato
       VIC-II (grafica)
       SID 6581 (sonoro)
       CIA 6526 (I/O e timing)

Accesso "memory mapped"
       si accede ai chip dedicati leggendo e scrivendo determinate celle
          di memoria
       ad esempio: per posizionare a video lo sprite 0 basta scrivere le
          coordinate in D000 e D001
       "perdo" indirizzi di memoria preziosi
                                             Giovanni Simotti              14
                                         gsimotti@tiscalinet.it
VIC-II
320x200 pixel (160x200 in multicolor)
Modalità video bitmap/carattere
  Bitmap: schermate statiche (loading, intro, etc...)
  Carattere: “mappe” fatte con elementi componibili,
    anche con scrolling
Palette 16 colori
8 sprite hardware
                                    Giovanni Simotti     15
                                gsimotti@tiscalinet.it
Modalità carattere
Caratteri monocolor: 8x8 pixel – 2 colori
Caratteri multicolor: 4x8 pixel – 4 colori
I due tipi di caratteri possono coesistere
40 colonne × 25 righe = 1000 caratteri a video
256 caratteri possibili
  usati nei giochi per fare gli sfondi

                                       Giovanni Simotti     16
                                   gsimotti@tiscalinet.it
Modalità carattere (continua)
Max 4 colori per carattere
  Colore di sfondo $D021
  Colore all'indirizzo $D022 (solo multicolor)
  Colore all'indirizzo $D023 (solo multicolor)
  Per ogni carattere: colore agli indirizzi $D800–DBE7
     In multicolor posso usare i colori 8-15, in single color i
       colori 0-7 della palette

                                           Giovanni Simotti       17
                                       gsimotti@tiscalinet.it
Modalità carattere (continua)




                      Giovanni Simotti     18
                  gsimotti@tiscalinet.it
Sprite
Sono immagini grafiche sovraimposte alla
  schermata video
8 sprite
24x21 pixel (12x21 in multicolor)
Per ogni sprite: 3 byte per linea --> 63 byte
Collisioni hardware
Zoom hardware! (solo 2x)
                                   Giovanni Simotti     19
                               gsimotti@tiscalinet.it
Sprite (continua)
Per spostarli basta scrivere all'indirizzo giusto
  ($D000-$D010)
4 colori per sprite
  Colore trasparente $D021 (è il colore di sfondo)
  Colore all'indirizzo $D025 (solo multicolor)
  Colore all'indirizzo $D026 (solo multicolor)
  Per ogni sprite: colore all'indirizzo $D027–D02F
                                    Giovanni Simotti     20
                                gsimotti@tiscalinet.it
Sprite (continua)




                Giovanni Simotti     21
            gsimotti@tiscalinet.it
Effetti Raster
TV CRT: non tutti i
 pixel sono
 ridisegnati nello
 stesso momento
 (cannone ottico)



                                Giovanni Simotti     22
                            gsimotti@tiscalinet.it
Effetti Raster (continua)
Sprite multiplexing: 8 sprite, ma posso
  riposizionarli dopo che è passato il cannone
  ottico
Posso avere metà schermo in modo bitmap e
  metà in modo carattere!
Effetto "loading"
Effetto "gioco di guida 3d"
                                 Giovanni Simotti     23
                             gsimotti@tiscalinet.it
Effetti Raster (continua)
8 pixel per cpu clock cycle (63..65 per linea)
CIA 6526: settiamo un raster IRQ per chiamare
  una subroutine quando il raster è giunto ad una
  certa linea
Attenzione: il refresh cambia tra NTSC e PAL
  (60hz / 50hz)

                                Giovanni Simotti     24
                            gsimotti@tiscalinet.it
Effetti Raster (continua)



Mayhem in Monsterland (1993)   Turrican II (1991)                            Armalyte (1988)




    Turbo Out Run (1989)       Pitstop II (1984)                         Trailblazer (1986)
                                                        Giovanni Simotti                       25
                                                    gsimotti@tiscalinet.it
SID 6581
"This thing is already 10 times better than
  anything out there and 20 times better than it
  needs to be." - Commodore head engineer
Caratteristiche:
     3 oscillatori indipendenti, con estensione di 8 ottave
     4 forme d'onda per ogni oscillatore
     ADSR regolabili per ogni oscillatore
     3 tre filtri (passa basso, passa alto e passa banda)
                                          Giovanni Simotti     26
                                      gsimotti@tiscalinet.it
SID 6581 (continua)
In pratica l'editor musicale (o direttamente il
  compositore) salva sia la canzone che il codice
  per suonarla
Ad esempio:
  Inizializzazione: jsr $1000
  A ogni refresh video: jsr $1003


                                    Giovanni Simotti     27
                                gsimotti@tiscalinet.it
Altre piattaforme
Basate su 6502
  C64: 6510 @ 1.023/0.985 MHz, sprite
  NES: Ricoh2A03 @ 1.79/1.66 MHz, sprite
  Atari2600: 6507 @ 1.19 Mhz, "raster nightmare"
Basate su Z80
  Gameboy: SharpLR35902 @ 4.19 MHz, sprite
  ZX Spectrum: Z80 @ 3.5 Mhz, niente sprite
                                   Giovanni Simotti     28
                               gsimotti@tiscalinet.it
Differenze tra Z80 e 6502
Z80: simile all'Intel 8080
Velocità di clock generalmente superiori
Registri: non solo A,X,Y ma
 A,B,C,D,E,F,H,L,R,IX,IY
Accesso alla memoria lento
  2 cicli di clock anziché 1 come nel 6502

                                    Giovanni Simotti     29
                                gsimotti@tiscalinet.it
Link utili
http://www.6502.org
http://c64-wiki.com
http://codebase64.org
http://www.commodore.ca/manuals/
http://www.skinfaxi.com/cli/collision.htm


                                  Giovanni Simotti     30
                              gsimotti@tiscalinet.it
Q&A




          Giovanni Simotti     31
      gsimotti@tiscalinet.it

Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

  • 1.
    Retroprogramming - Programmare oggiil C64 Giovanni Simotti gsimotti@tiscalinet.it
  • 2.
    Programmare un computer8-bit Poche risorse = nuovo approccio alla programmazione codice molto ottimizzato niente oggetti / database / etc... Sviluppo molto più comodo rispetto a “ieri” Cross-development PC/emulatore ampia documentazione su Internet Giovanni Simotti 2 gsimotti@tiscalinet.it
  • 3.
    Struttura basilare diun computer CPU esegue il programma in linguaggio macchina e comanda l'hardware dedicato (periferiche e chip dedicati) MEMORIA contiene il programma e i dati letti/scritti dalla cpu è organizzata in celle grandi 1 byte ogni cella risiede in un certo indirizzo di memoria Giovanni Simotti 3 gsimotti@tiscalinet.it
  • 4.
    Il linguaggio assembler(ASM) Rappresentazione “leggibile” del linguaggio macchina Corrispondenza 1:1 tra istruzioni assembler e istruzione in linguaggio macchina Commenti importantissimi! La traduzione è eseguita dall'assemblatore .asm -> assemblatore -> .prg -> emulatore Giovanni Simotti 4 gsimotti@tiscalinet.it
  • 5.
    Esempio “Hello World” Giovanni Simotti 5 gsimotti@tiscalinet.it
  • 6.
    Esempio “Hello World”(continua) Giovanni Simotti 6 gsimotti@tiscalinet.it
  • 7.
    CPU Program Counter (PC) Contiene l'indirizzo dell'istruzione in esecuzione Stack Pointer (SP) Contiene l'indirizzo della prox scrittura nello stack Registri Accumulatore (usato nelle operazioni matematico - logiche) 6502: anche X, Y Flag di stato Giovanni Simotti 7 gsimotti@tiscalinet.it
  • 8.
    Istruzioni ASM -Tipi Spostamento dati da/per i registri Calcolo (somma, sottrazione, shift, op. logici) 6502: niente divisione/moltiplicazione (solo lo shift) Comparazione (scrivono il risultato nei flag) Salto (condizionato o non) Salto a subroutine (utile per riusare funzioni) Giovanni Simotti 8 gsimotti@tiscalinet.it
  • 9.
    Istruzioni ASM -Indirizzamento Indica dov'è l'operando, ovvero su cosa deve operare l'istruzione Immediato: LDA #$44 Assoluto: LDA $4400 Zero Page: LDA $44 (equivale a: LDA $0044) Indicizzato assoluto: LDA $4400,X (cicli FOR) Zero Page: LDA $44,X (equivale a: LDA $0044,x) Giovanni Simotti 9 gsimotti@tiscalinet.it
  • 10.
    Istruzioni ASM– Indirizzamento(continua) Indicizzato indiretto: LDA ($02,X) Indiretto indicizzato: LDA ($02),Y Assoluto indiretto: JMP ($F000) Relativo: BCS $44 Offset max: -126 +129 Possiamo scrivere anche BCS Label Implicito: NOP Giovanni Simotti 10 gsimotti@tiscalinet.it
  • 11.
    Istruzioni ASM Per ogniistruzione, un byte per l'op-code + altri bytes a seconda dell'indirizzamento Max 256 op-code possibili LDA occupa 8 op-code con i vari indirizzamenti Ogni byte letto = 1 ciclo di clock impiegato LDA può impiegare da 2 a 6 cicli di clock a seconda dell'indirizzamento! Giovanni Simotti 11 gsimotti@tiscalinet.it
  • 12.
    Software Text editor a piacere DASM Vice (Alt+M per eseguire il monitor) Giovanni Simotti 12 gsimotti@tiscalinet.it
  • 13.
    C64 MOS Technology 6510(molto simile al 6502) CPU Clock: 1.023mhz NTSC (60hz), 0.985mhz PAL (50hz) Meno di 20000 cicli di clock per frame! MEMORIA: 64kB RAM “Sorgente + grafica + sonoro” in (molto meno di) 65536 byte! Giovanni Simotti 13 gsimotti@tiscalinet.it
  • 14.
    C64 – ChipDedicati “Potente” hardware dedicato VIC-II (grafica) SID 6581 (sonoro) CIA 6526 (I/O e timing) Accesso "memory mapped" si accede ai chip dedicati leggendo e scrivendo determinate celle di memoria ad esempio: per posizionare a video lo sprite 0 basta scrivere le coordinate in D000 e D001 "perdo" indirizzi di memoria preziosi Giovanni Simotti 14 gsimotti@tiscalinet.it
  • 15.
    VIC-II 320x200 pixel (160x200in multicolor) Modalità video bitmap/carattere Bitmap: schermate statiche (loading, intro, etc...) Carattere: “mappe” fatte con elementi componibili, anche con scrolling Palette 16 colori 8 sprite hardware Giovanni Simotti 15 gsimotti@tiscalinet.it
  • 16.
    Modalità carattere Caratteri monocolor:8x8 pixel – 2 colori Caratteri multicolor: 4x8 pixel – 4 colori I due tipi di caratteri possono coesistere 40 colonne × 25 righe = 1000 caratteri a video 256 caratteri possibili usati nei giochi per fare gli sfondi Giovanni Simotti 16 gsimotti@tiscalinet.it
  • 17.
    Modalità carattere (continua) Max4 colori per carattere Colore di sfondo $D021 Colore all'indirizzo $D022 (solo multicolor) Colore all'indirizzo $D023 (solo multicolor) Per ogni carattere: colore agli indirizzi $D800–DBE7 In multicolor posso usare i colori 8-15, in single color i colori 0-7 della palette Giovanni Simotti 17 gsimotti@tiscalinet.it
  • 18.
    Modalità carattere (continua) Giovanni Simotti 18 gsimotti@tiscalinet.it
  • 19.
    Sprite Sono immagini grafichesovraimposte alla schermata video 8 sprite 24x21 pixel (12x21 in multicolor) Per ogni sprite: 3 byte per linea --> 63 byte Collisioni hardware Zoom hardware! (solo 2x) Giovanni Simotti 19 gsimotti@tiscalinet.it
  • 20.
    Sprite (continua) Per spostarlibasta scrivere all'indirizzo giusto ($D000-$D010) 4 colori per sprite Colore trasparente $D021 (è il colore di sfondo) Colore all'indirizzo $D025 (solo multicolor) Colore all'indirizzo $D026 (solo multicolor) Per ogni sprite: colore all'indirizzo $D027–D02F Giovanni Simotti 20 gsimotti@tiscalinet.it
  • 21.
    Sprite (continua) Giovanni Simotti 21 gsimotti@tiscalinet.it
  • 22.
    Effetti Raster TV CRT:non tutti i pixel sono ridisegnati nello stesso momento (cannone ottico) Giovanni Simotti 22 gsimotti@tiscalinet.it
  • 23.
    Effetti Raster (continua) Spritemultiplexing: 8 sprite, ma posso riposizionarli dopo che è passato il cannone ottico Posso avere metà schermo in modo bitmap e metà in modo carattere! Effetto "loading" Effetto "gioco di guida 3d" Giovanni Simotti 23 gsimotti@tiscalinet.it
  • 24.
    Effetti Raster (continua) 8pixel per cpu clock cycle (63..65 per linea) CIA 6526: settiamo un raster IRQ per chiamare una subroutine quando il raster è giunto ad una certa linea Attenzione: il refresh cambia tra NTSC e PAL (60hz / 50hz) Giovanni Simotti 24 gsimotti@tiscalinet.it
  • 25.
    Effetti Raster (continua) Mayhemin Monsterland (1993) Turrican II (1991) Armalyte (1988) Turbo Out Run (1989) Pitstop II (1984) Trailblazer (1986) Giovanni Simotti 25 gsimotti@tiscalinet.it
  • 26.
    SID 6581 "This thingis already 10 times better than anything out there and 20 times better than it needs to be." - Commodore head engineer Caratteristiche: 3 oscillatori indipendenti, con estensione di 8 ottave 4 forme d'onda per ogni oscillatore ADSR regolabili per ogni oscillatore 3 tre filtri (passa basso, passa alto e passa banda) Giovanni Simotti 26 gsimotti@tiscalinet.it
  • 27.
    SID 6581 (continua) Inpratica l'editor musicale (o direttamente il compositore) salva sia la canzone che il codice per suonarla Ad esempio: Inizializzazione: jsr $1000 A ogni refresh video: jsr $1003 Giovanni Simotti 27 gsimotti@tiscalinet.it
  • 28.
    Altre piattaforme Basate su6502 C64: 6510 @ 1.023/0.985 MHz, sprite NES: Ricoh2A03 @ 1.79/1.66 MHz, sprite Atari2600: 6507 @ 1.19 Mhz, "raster nightmare" Basate su Z80 Gameboy: SharpLR35902 @ 4.19 MHz, sprite ZX Spectrum: Z80 @ 3.5 Mhz, niente sprite Giovanni Simotti 28 gsimotti@tiscalinet.it
  • 29.
    Differenze tra Z80e 6502 Z80: simile all'Intel 8080 Velocità di clock generalmente superiori Registri: non solo A,X,Y ma A,B,C,D,E,F,H,L,R,IX,IY Accesso alla memoria lento 2 cicli di clock anziché 1 come nel 6502 Giovanni Simotti 29 gsimotti@tiscalinet.it
  • 30.
  • 31.
    Q&A Giovanni Simotti 31 gsimotti@tiscalinet.it