Autore Topic: [ASM] 6502 assembler e simulatore online  (Letto 1930 volte)

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
[ASM] 6502 assembler e simulatore online
« il: 12 Dicembre 2011, 16:26:10 »
Rivangando sul mio sito personale ho ripescato questo simpatico link: http://www.6502asm.com/

Si tratta di un assemblatore e simulatore di codice 6502, il mitico processore a basso costo progettato da Chuck Peddle e usato da  Commodore PET, VIC, C64, Apple / Apple II / Apple III, Atari 2600, Nintendo Enterteinment System, ecc....

Nel sito sono presenti vari esempi di codice, basta selezionarne uno dal menu a tendina, premere Compile e poi Run per vedere l'output grafico nella finestrella con risoluzione 32x32 a blocchetti pixellosi :geek:

Oppure potete copiare-incollare questo codice scritto da me questa estate in un impeto di nerdaggine :ugeek:

Codice: [Seleziona]
lda #<data
sta $10
lda #>data
sta $11
lda #$00
sta $30
lda #$02
sta $31

loop:
ldx #$00
lda ($10,x)
sta ($30,x)
inc $10
lda $10
cmp #$00
bne next
inc $11
next:
inc $30
lda $30
cmp #$00
bne next2
inc $31
next2:
lda $31
cmp #$06
bmi loop
jmp end

data:
dcb 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,0,0,1,1,0,1,1,1,0,1,1,1,
dcb 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,
dcb 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,
dcb 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,
dcb 0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,
dcb 0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,
dcb 1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,0,1,1,0,0,1,1,0,
dcb 0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,0,
dcb 0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,0,0,1,0,0,0,0,0,1,0,
dcb 0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,0,0,0,1,0,0,1,1,0,0,0,
dcb 0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,
dcb 0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,
dcb 1,1,1,1,1,0,0,1,1,1,0,0,1,1,0,0,
dcb 0,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,
dcb 0,0,0,1,1,0,1,1,0,1,1,0,1,0,0,0,
dcb 0,1,1,1,0,0,1,1,1,1,1,1,1,0,1,0,
dcb 0,1,0,0,1,1,0,0,0,1,1,0,0,0,1,0,
dcb 0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,
dcb 0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,
dcb 0,1,1,1,0,1,1,1,0,0,1,0,1,1,0,1,
dcb 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,0,1,1,1,1,0,0,0,0,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,
dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
dcb 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
dcb 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
end:

Per chi volesse cimentarsi in qualche esperimento, basta tenere a mente la semplicissima memory map del simulatore:

0x00 - 0x0FF: pagina zero, con funzioni speciali per i processori 6502 (funziona come un grande register file) e con due locazioni speciali (0xFE è un random generator, menter 0xFF contiene il keycode dell'ultimo tasto premuto dall'utente)
0x100 - 0x1FF : stack da 256 byte
0x200 - 0x5FF : pagina video da 1K (32x32 pixel, 1 byte per pixel, ordine sinistra-destra dall'alto al basso)
0x600 - 0xFFFF : memoria utente

la palette dei colori è simile a quella del C64:
Black ($0)
White ($1)
Red ($2)
Cyan ($3)
Purple ($4)
Green ($5)
Blue ($6)
Yellow ($7)
Orange ($8)
Brown ($9)
Light red ($a)
Dark gray ($b)
Gray ($c)
Light green ($d)
Light blue ($e)
Light gray ($f)

per ogni pixel vengono usati solo i 4 bit meno significativi, per un totale di 16 colori.
Ah, ovviamente qui ci sono gli opcode http://www.6502.org/tutorials/6502opcodes.html
Sono una cinquantina di istruzioni in totale, è una CPU molto facile da programmare in ASM :-)

Buon nerdivertimento  :mrgreen:  :whistle:  :geek:  :techie-eatcursor:  :techie-typing:
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [ASM] 6502 assembler e simulatore online
« Risposta #1 il: 12 Dicembre 2011, 16:39:46 »
Piccola nota: il codice che ho postato non è ottimale. Ricordo che avevo scritto una versione più ottimizzata con il supporto tecnico e morale di cdimauro ( :geek: + :geek: = :ugeek: ) ma non so dove sia finita...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: [ASM] 6502 assembler e simulatore online
« Risposta #2 il: 12 Dicembre 2011, 17:30:11 »
Citazione da: "TheKaneB"

Per chi volesse cimentarsi in qualche esperimento, basta tenere a mente la semplicissima memory map del simulatore:

0x00 - 0x0FF: pagina zero, con funzioni speciali per i processori 6502 (funziona come un grande register file) e con due locazioni speciali (0xFE è un random generator, menter 0xFF contiene il keycode dell'ultimo tasto premuto dall'utente)
Mi sembra di ricordare che questa zona di memoria sia privilegiata da parte del processore; l'accesso dovrebbe avvenire più velocemente rispetto a tutta l'altra memoria. E' così?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: [ASM] 6502 assembler e simulatore online
« Risposta #3 il: 12 Dicembre 2011, 17:40:30 »
Si, generalmente si usano moltissimo le istruzioni che indirizzano direttamente la pagina zero, quindi puoi dereferenziare queste locazioni specificando solo la metà bassa dell'indirizzo, risparmiando preziosi cicli di clock e aumentando la densità del codice :-)

Viene spesso usata come "register file", cioè si caricano le variabili più comuni in pagina zero e si ripongono i risultati nei posti originali a fine calcolo. E' un approccio tipico da macchina RISC (Load - Compute - Store), per cui si pensa che il 6502 abbia in qualche modo ispirato la nascita di architetture RISC come ad esempio l'architettura ARM che ne riprende alcuni aspetti.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: [ASM] 6502 assembler e simulatore online
« Risposta #4 il: 12 Dicembre 2011, 19:45:27 »
Esatto. Gli stessi ingegneri dell'ARM l'hanno detto.
Citazione da: "TheKaneB"
Piccola nota: il codice che ho postato non è ottimale. Ricordo che avevo scritto una versione più ottimizzata con il supporto tecnico e morale di cdimauro ( :geek: + :geek: = :ugeek: ) ma non so dove sia finita...
Purtroppo ho perso anche la mia versione, ma la si potrebbe sempre ricreare eventualmente.

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3498
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: [ASM] 6502 assembler e simulatore online
« Risposta #5 il: 12 Dicembre 2011, 20:25:00 »
Tutto ciò e decisamente affascinante...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Tags: