Post on 07-Jul-2015
description
Retroprogramming - Programmare oggi il C64
Giovanni Simotti
gsimotti@tiscalinet.it
Giovanni Simottigsimotti@tiscalinet.it
2
Programmare un computer 8-bit
Poche risorse = nuovo approccio alla programmazionecodice molto ottimizzatoniente oggetti / database / etc...
Sviluppo molto più comodo rispetto a “ieri”Cross-development PC/emulatoreampia documentazione su Internet
Giovanni Simottigsimotti@tiscalinet.it
3
Struttura basilare di un computer
CPUesegue il programma in linguaggio macchina e
comanda l'hardware dedicato (periferiche e chip dedicati)
MEMORIAcontiene 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 Simottigsimotti@tiscalinet.it
4
Il linguaggio assembler (ASM)
Rappresentazione “leggibile” del linguaggio macchinaCorrispondenza 1:1 tra istruzioni assembler e
istruzione in linguaggio macchinaCommenti importantissimi!
La traduzione è eseguita dall'assemblatore.asm -> assemblatore -> .prg -> emulatore
Giovanni Simottigsimotti@tiscalinet.it
5
Esempio “Hello World”
Giovanni Simottigsimotti@tiscalinet.it
6
Esempio “Hello World”(continua)
Giovanni Simottigsimotti@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
RegistriAccumulatore (usato nelle operazioni matematico - logiche) 6502: anche X, Y
Flag di stato
Giovanni Simottigsimotti@tiscalinet.it
8
Istruzioni ASM - Tipi
Spostamento dati da/per i registriCalcolo (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 Simottigsimotti@tiscalinet.it
9
Istruzioni ASM - Indirizzamento
Indica dov'è l'operando, ovvero su cosa deve operare l'istruzione
Immediato: LDA #$44Assoluto: 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 Simottigsimotti@tiscalinet.it
10
Istruzioni ASM– Indirizzamento (continua)
Indicizzato indiretto: LDA ($02,X)Indiretto indicizzato: LDA ($02),YAssoluto indiretto: JMP ($F000)Relativo: BCS $44
Offset max: -126 +129Possiamo scrivere anche BCS Label
Implicito: NOP
Giovanni Simottigsimotti@tiscalinet.it
11
Istruzioni ASM
Per ogni istruzione, un byte per l'op-code + altri bytes a seconda dell'indirizzamentoMax 256 op-code possibiliLDA occupa 8 op-code con i vari indirizzamenti
Ogni byte letto = 1 ciclo di clock impiegatoLDA può impiegare da 2 a 6 cicli di clock a seconda
dell'indirizzamento!
Giovanni Simottigsimotti@tiscalinet.it
12
Software
Text editor a piacere
DASMVice
(Alt+M per eseguire il monitor)
Giovanni Simottigsimotti@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 Simottigsimotti@tiscalinet.it
14
C64 – Chip Dedicati
“Potente” hardware dedicatoVIC-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 memoriaad esempio: per posizionare a video lo sprite 0 basta scrivere le
coordinate in D000 e D001"perdo" indirizzi di memoria preziosi
Giovanni Simottigsimotti@tiscalinet.it
15
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 Simottigsimotti@tiscalinet.it
16
Modalità carattere
Caratteri monocolor: 8x8 pixel – 2 coloriCaratteri multicolor: 4x8 pixel – 4 coloriI due tipi di caratteri possono coesistere40 colonne × 25 righe = 1000 caratteri a video256 caratteri possibili
usati nei giochi per fare gli sfondi
Giovanni Simottigsimotti@tiscalinet.it
17
Modalità carattere (continua)
Max 4 colori per carattereColore di sfondo $D021Colore 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 Simottigsimotti@tiscalinet.it
18
Modalità carattere (continua)
Giovanni Simottigsimotti@tiscalinet.it
19
Sprite
Sono immagini grafiche sovraimposte alla schermata video
8 sprite24x21 pixel (12x21 in multicolor)Per ogni sprite: 3 byte per linea --> 63 byteCollisioni hardwareZoom hardware! (solo 2x)
Giovanni Simottigsimotti@tiscalinet.it
20
Sprite (continua)
Per spostarli basta scrivere all'indirizzo giusto ($D000-$D010)
4 colori per spriteColore 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 Simottigsimotti@tiscalinet.it
21
Sprite (continua)
Giovanni Simottigsimotti@tiscalinet.it
22
Effetti Raster
TV CRT: non tutti i pixel sono ridisegnati nello stesso momento (cannone ottico)
Giovanni Simottigsimotti@tiscalinet.it
23
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 Simottigsimotti@tiscalinet.it
24
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 Simottigsimotti@tiscalinet.it
25
Effetti Raster (continua)
Turrican II (1991)Turrican II (1991)Turrican II (1991)Turrican II (1991) Armalyte (1988)
Turbo Out Run (1989)
Mayhem in Monsterland (1993)
Pitstop II (1984) Trailblazer (1986)
Giovanni Simottigsimotti@tiscalinet.it
26
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 ottave4 forme d'onda per ogni oscillatoreADSR regolabili per ogni oscillatore3 tre filtri (passa basso, passa alto e passa banda)
Giovanni Simottigsimotti@tiscalinet.it
27
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 $1000A ogni refresh video: jsr $1003
Giovanni Simottigsimotti@tiscalinet.it
28
Altre piattaforme
Basate su 6502C64: 6510 @ 1.023/0.985 MHz, spriteNES: Ricoh2A03 @ 1.79/1.66 MHz, spriteAtari2600: 6507 @ 1.19 Mhz, "raster nightmare"
Basate su Z80Gameboy: SharpLR35902 @ 4.19 MHz, spriteZX Spectrum: Z80 @ 3.5 Mhz, niente sprite
Giovanni Simottigsimotti@tiscalinet.it
29
Differenze tra Z80 e 6502
Z80: simile all'Intel 8080Velocità di clock generalmente superioriRegistri: non solo A,X,Y ma
A,B,C,D,E,F,H,L,R,IX,IYAccesso alla memoria lento
2 cicli di clock anziché 1 come nel 6502
Giovanni Simottigsimotti@tiscalinet.it
30
Link utili
http://www.6502.orghttp://c64-wiki.comhttp://codebase64.orghttp://www.commodore.ca/manuals/http://www.skinfaxi.com/cli/collision.htm
Giovanni Simottigsimotti@tiscalinet.it
31
Q&A