Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: marcom_to - 23 Maggio 2008, 00:06:42
-
Ciao a tutti,
mi sono messo alla ricerca di un cross-assembler comodo da usare e mi sono trovato di fronte a questo: http://www.theweb.dk/KickAssembler/Main.php (http://www.theweb.dk/KickAssembler/Main.php) . Trattasi di Kick assembler. E' stato amore a prima vista. Non si tratta di un normale assemblatore da utilizzare su pc, bensi' un compilatore di codice assembly e pseudo codice. Mi spiego: utilizzando alcune macro facilmente intuibili e scrivendo poche righe di codice in pseudo-assembler interpretate in java, e' possibile fare cose come caricare file nativi da c64, come programmi, audio e immagini, creare routine di autostart, lavorare con vettori senza impazzire piu' di tanto. Ho letto il manuale fornito. Ovviamente potete continuare ad usare il codice assembler nativo se non vi piacciono le macro. Alcuni esempi:
definite una macro per cambiare il colore del bordo
.macro SetBorderColor(color) {
lda #color
sta $d020
}
e la richimate cosi all'interno del vostro programma passando il parametro numero colore:
:SetBorderColor(0)
con la direttiva .print e' possibile dare feedback all'utente di di una variabile, del contenuto di una locazione di memoria per un debug piu' semplice.
caricare in accumulatore funzioni matematiche, es seno, coseno o random di un seme
// Load a with a random number
lda #random()*256
usare array e hashtable! Qui l'esempio di un hashMap. Per chi conosce java il codice si legge da se:
// Define the table
.var ht = Hashtable()
// Enter some values (put(key,value))
.eval ht.put(“ram”, 64)
.eval ht.put(“bits”, 8)
.eval ht.put(1, “Hello”)
.eval ht.put(2, “World”)
.eval ht.put(“directions”, List().add(“Up”,”Down”,”Left”,”Right”))
// Retrieve the values
.print ht.get(1) // Prints Hello
caricare file da filesystem ed autoeseguirli. Esempio di load e autostart di una bitmap koala paint
.const KOALA_TEMPLATE = "C64FILE, Bitmap=$0000, ScreenRam=$1f40, ColorRam=$2328,
BackgroundColor = $2710"
.var picture = LoadBinary("picture.prg", KOALA_TEMPLATE)
.pc = $0801 "Basic Program"
:BasicUpstart($0810)
.pc =$0810 "Program"
lda #$38
sta $d018
lda #$d8
sta $d016
lda #$3b
sta $d011
lda #0
sta $d020
lda #picture.getBackgroundColor()
sta $d021
ldx #0
!loop:
.for (var i=0; i<4; i++) {
lda colorRam+i*$100,x
sta $d800+i*$100,x
}
inx
bne !loopjmp
*
.pc = $0c00 .fill picture.getScreenRamSize(), picture.getScreenRam(i)
.pc = $1c00 colorRam: .fill picture.getColorRamSize(), picture.getColorRam(i)
.pc = $2000 .fill picture.getBitmapSize(), picture.getBitmap(i)
E poi cicli for, loop e quant'altro.
Il manualetto in pdf e' di 40 pagine, ma molto esplicativo. Scaricando il programma troverete all'interno il jar, il manuale ed alcuni esempi. Dovete avere java sul vostro pc (1.5) e potete provare a compilare subito in questo modo da linea di cmd:
java -jar KickAss.jar
Ciao a tutti,
Marco
-
Non e' propriamente una "news" dato che e' del 2006, ultima release 2007/09, l'ho nomnato qualche giorno fa in un altro thread iniziato da te.
Si, diciamo che le macro in linguaggio ad alto livello possono fare gridare alla meraviglia, ma non e' certo una novita', la maggior parte delle cose che hai descritto e' fattibilissima con dasm:
MAC setborder
lda #{1}
sta $d020
ENDM
MAC waitframe
lda $d012
bpl *-3
lda $d012
bmi *-3
ENDM
MAC setp
word .eop
word {1}
byte $9e
byte [{2}]d
byte 0
.eop
word 0
ENDM
*=$0801
start
echo "current PC =", *
setp 7102,2061
echo "current PC =", *
M SET 1
REPEAT 20
setborder M
waitframe
M SET M+1
REPEND
rts
eof
echo "end of file at ", eof, "size = ", eof-start
Dipende molto da come uno e' abituato, io aborro simili pastrocchi quando lavoro in asm, perche' devo andarmi a vedere COME genera il codice quella certa macro, se vedo invece direttamente il codice e' di piu' facile manutenzione.
Se vuoi divertirti cerca il demo nascosto nel jar, senza andare a sbirciare su CSDb. B)
-
Sposto il thread in Programmazione.
marcom_to, un consiglio, usa i tag "code" per racchiudere il codice.