Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

31
Retroprogramming - Programmare oggi il C64 Giovanni Simotti [email protected]

description

Come sviluppare oggi software per i vecchi computer e console a 8 bit. Panoramica del linguaggio assembler e del funzionamento della CPU. Differenze tra Z80 e 6502. L'importanza del timing video. Gli sprite. Dettaglio dell'hardware del C64 e tecniche di programmazione a esso relative.

Transcript of Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Page 1: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Retroprogramming - Programmare oggi il C64

Giovanni Simotti

[email protected]

Page 2: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 3: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 4: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 5: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

5

Esempio “Hello World”

Page 6: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

6

Esempio “Hello World”(continua)

Page 7: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 8: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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)

Page 9: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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)

Page 10: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 11: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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!

Page 12: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

12

Software

Text editor a piacere

DASMVice

(Alt+M per eseguire il monitor)

Page 13: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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!

Page 14: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 15: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 16: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 17: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 18: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

18

Modalità carattere (continua)

Page 19: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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)

Page 20: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 21: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

21

Sprite (continua)

Page 22: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

22

Effetti Raster

TV CRT: non tutti i pixel sono ridisegnati nello stesso momento (cannone ottico)

Page 23: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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"

Page 24: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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)

Page 25: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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)

Page 26: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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)

Page 27: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 28: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 29: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

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

Page 30: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

30

Link utili

http://www.6502.orghttp://c64-wiki.comhttp://codebase64.orghttp://www.commodore.ca/manuals/http://www.skinfaxi.com/cli/collision.htm

Page 31: Retroprogramming - Programmare oggi il C64, by Giovanni Simotti

Giovanni [email protected]

31

Q&A