Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: iAN CooG - 12 Marzo 2009, 01:06:41
-
Stavo provando a far qualcosa per passare il tempo...
; iAN CooG/HF
*=$0326
word newintro
word $F6ED
newintro
sei
stx $d011
l
tya
and #$0f
tax
lda table,x
cpy $d012
beq *-3
sta $d020
iny
bne l
ldy #[eot-table-1]
ldx table+[eot-table-1]
tr
lda table-1,y
sta table,y
dey
bne tr
stx table
lda $d011
bmi *-3
bpl l
table
byte $09,$0b,$04,$0c,$0f,$07,$01,$0d,$03,$0e,$04,$0b,$06
eot=*+3
senza molta fantasia, ma in 64byte (anzi, 63 per essere esatti) non si puo' fare molto.
O mi faccio venire in mente qualcosa di meglio o quest'anno alla limiTED compo di Plus4world non partecipero' =)
-
Son capitato qua per caso, era un pezzo che non venivo, ma mi fa un sacco
di piacere vedere che la scena c64 italiana ha ancora dei militanti!
Di solito non rompo le scatole con le ottimizzazioni... ma non ho potuto resistere.
:P
<span style='font-family:Courier'>
;Prova
*=$0326
.word newintro
.word $F6ED
newintro
sei
stx $d011
L tya
clc
adc $fe
and #$0f
tax
lda table,x
cpy $d012
beq *-3
sta $d020
iny
bne L
dec $fe
lda $d011
bmi *-3
bpl L
table
.byte $09,$0b,$04,$0c,$0f,$07,$01,$0d,$03,$0e,$04,$0b,$06</span>
Stesso risultato ma 11 byte in meno! ;)
In realtà si potrebbe pensare di togliere anche il clc al prezzo di uno scattino
ogni 256 frame (in sostanza ogni volta che dec $fe mette il carry a 1).
Che fare con sti 11 byte? Boh... se mi viene in mente qualcosa lo posto!
-
... ad esempio estendere l'effetto raster a tutto lo schermo:
<span style='font-family:Courier'>;Prova
*=$0326
.word newintro
.word $F6ED
newintro
sei
stx $d011
S ldy #$00
L tya
clc
adc $fe
and #$0f
tax
lda table,x
cpy $d012
beq *-3
sta $d020
iny
lda $d011
bpl L
cpy #$30
bne L
dec $fe
lda $d011
bmi *-3
bpl S
table
.byte $09,$0b,$04,$0c,$0f,$07,$01,$0d,$03,$0e,$04,$0b,$06
</span>
Avanziamo ancora 2 byte...
-
Ultimo aggiornamento altrimenti verrò tacciato di flooding: stesso risultato del precedente ma questa volta avanziamo 6 byte.
Per cambiare la direzione é sufficiente modificare il cpy con i valori 2F e 31.
<span style='font-family:Courier'>;Prova
*=$0326
.word newintro
.word $F6ED
newintro
sei
stx $d011
S ldy #$00
L txa
and #$0f
tax
lda table,x
cpy $d012
beq *-3
sta $d020
inx
iny
lda $d011
bpl L
cpy #$2F
bne L
lda $d011
bmi *-3
bpl S
table
.byte $09,$0b,$04,$0c,$0f,$07,$01,$0d,$03,$0e,$04,$0b,$06</span>
-
\o/ eccezionale!
Altro che flood, continua pure!
Sono io il primo a voler vedere un flood di programmi qua dentro, non sai da quanto tempo non si vedeva una tale preparazione in questo forum :metallica:
-
Grazie mille iAN... allora io proseguo! :D
Stesso programma dell'ultimo post, stessa funzionalità e stessa paletta di colori: altri 2 byte in meno, in tutto 56. ;)
Ho ritenuto utile commentare le linee un po' più ostiche per facilitare la lettura a tutti.
<span style='font-family:Courier'>;Prova
*=$0326
.word newintro
.word $F6ED
newintro
sei
stx $d011
S ldy #$00
L lda #$0f
.byte $cb,$01 ;SBX #$01 opcode non doc.: X = (A&X)-1
lda table+$01,x
cpy $d012
beq *-3
sta $d020
iny
bit $d011
bpl L
cpy #$2F
bne L
bit $d011 ;basta un bit, ciò che conta é il flag N
bpl S
.byte $30 ; bmi *-5: $30 é l'opcode di bmi
table
.byte $F9 ; colore (x9) ma anche parametro di bmi
.byte $0b,$04,$0c,$0f,$07,$01,$0d,$03,$0e,$04,$0b,$06</span>
Non credo di essere in grado di comprimere ulteriormente questo codice...
D'altra parte é comunque difficile aggiungere qualcosa con solo 8 byte a disposizione e tutti i registri quasi costantemente occupati...
Vabbe... Grazie mille iAN per i complimenti e per l'ottimo spunto!
-
Ottima pensata quella di usare un illegal opcode per fare sia la and che la dec :)
Se usi la mia versione di dasm, sbx e tutti gli altri illegals sono supportati, quindi non devi "abbassarti" a scriverli come .byte.
Una cosa che pero' non e' "giusta" e' quella di definire il byte $f9 della bmi finale, o meglio e' inutile, tanto non lo usi mai dato che punti a table+1 =) Quindi la riduzione e' "dannosa" in questo caso perche' togli un colore effettivo dal gradient. Cosi' dovrebbe essere invece effettivamente usato.
*=$0326
word newintro
word $F6ED
newintro
sei
stx $d011
S ldy #$00
L lda #$0f
SBX #$01
lda table,x
cpy $d012
beq *-3
sta $d020
iny
bit $d011
bpl L
cpy #$2F
bne L
bit $d011
bpl S
bmi *-5
table=*-1
byte $0b,$04,$0c,$0f,$07,$01,$0d,$03,$0e,$04,$0b,$06
Ad ogni modo ottimo lavoro, mi fa piacere trovare qualcun altro che si diverte a spippolare i bit.
-
Avete presente l'arabo? ..Ecco come leggo!!!
Giusto per curiosità.. Ma che linguaggio è ? ..
-
Trattasi di linguaggio di programmazione assembly, trovi QUI (http://it.wikipedia.org/wiki/Assembly) maggiori dettagli.
-
iAn, hai perfettamente ragione: in effetti mi perdevo il colore $09.
Era un po' che non prendevo in mano il 6502 e mi pareva che l'indirizzamento indicizzato non supportasse il page boundary crossing: in realtà solo l'indiretto ha questo difetto.
Speranza, il linguaggio assembly é meno ostico di quanto tu possa pensare: leggi qualche tutorial e prova a giocarci. E' un po' come giocare con i Lego, bisogna attaccare piccoli pezzi uno alla volta. ;)
-
Sembra che sta routine si possa ottimizzare ancora...
<span style='font-family:Courier'>
*=$0326
.word newintro
.word $F6ED
newintro
sei
L lda #$0f
SBX #$FF
lda table,x
cpy $d012
beq *-3
sta $d020
iny
cpy #$2f
bne L
K asl $d011
bcc L
ldy #$00
bcs K
table=*-1
.byte $06,$0b,$04,$0e,$03,$0d,$01,$07,$0f,$0c,$04,$0b,$09
</span>
Ho dovuto solamente invertire il gradient perché SBX in questo caso con parametro $FF funge da AND + INX; chiaramente ho anche perso la possibilità di occultare il primo valore di gradient nell'ultimo branch perché é cambiato il displacement.
Con X che cresce si evita di caricare uno dei valori di gradient dallo schermo: lo pescava intorno allo 0440 (per X=$FF), lo faceva anche nella routine corretta da te solo che prendeva uno spazio ($20) e quindi il colore risultante era il nero.
Ho dovuto mettere table=*-1 perché la INX viene sempre dopo l'AND pertanto i valori che può assumere X vanno da $01 a $10.
Nota anche il fatto che ho potuto risparmiare l'inizializzazione di D011 perché si azzera "gratis" nel primo frame "a suon di" asl.
Comunque sia adesso i byte in meno sono 15, si può pensare di aggiungere qualcosa... ;)
-
Ora il movimento é controllato dal joystick in porta 2 (su, fermo, giù).
(62 byte + 2 di start address).
-
Alternativa al precedente: doppio raster in direzioni opposte.
-
Versione rivista del doppio raster. Esteso fino all'ultima riga.
*=$0326 ; Doppio raster
.word newintro
.word $F6ED
newintro
sei
L lda #$0F
sbx #$FF
tya
sbc $fc
and #$0c
bne R2
lda #$05
bne R1
R2 lda table+1,X
R1 ldy $D012
R cpy $D012
beq R
sta $D020
cpy #$36
bne L
txa
sbc #$26
T asl $D011
bcc L
tax
stx $fc
bcs T
table
.byte $06,$0B,$04,$0E,$03,$0D,$01,$07,$0F,$0C,$04,$0B,$09
-
10 print "ciao"
20 goto 10
:lol: scusate, non ho saputo resistere :ciauz:
-
Allora ottimizziamo:
10 ?"Ciao": goto10
Anche io non ho saputo resistere!!!!! :mattsid: :lol:
-
Esattamente quanto scritto nel precedente post, ma questa volta in assembly.
Ho commentato un po' per i neofiti, spero sia un incentivo a provare a giochicchiarci. ;)
iAN, se disapprovi o comunque siamo troppo fuori tema, chiedo umilmente perdono ed elimina pure i post.
*=$0801 ; CIAO!
.Byte $0B,$08,$D4,$07,$9E,"2061",$00,$c9,$00
intro
st
ldx #$00 ; Azzero l'indice
ld
lda ciao,x ; Carico l'x-esimo carattere
beq st ; se é uguale a 0 riparto dall'inizio
jsr $ffd2 ; equivale a "Print chr$(A)": A é l'accumulatore
inx ; Incremento l'indice
bne ld ; Stringhe di massimo 255 caratteri + il terminatore (0)
rts ; Stringa troppo lunga, uscita (Equivale a End)
ciao ; Stringa, $0d é il ritorno a capo, $00 il terminatore (come in C)
.byte "CIAO",$0d,$00
NB1: il codice qua sopra pur fittando 64 byte, non é assolutamente ottimizzato.
NB2: Grazie iAN, molto comodo il DASM col supporto per gli illegal!
-
Freshness, continua assolutamente su questa strada, gli esperimenti di programmazione sono sempre apprezzati, da me per lo meno. I disturbatori sono ben altri. :angry:
QUesto thread era interessante al 100%, a parte il tentativo di voler riportare il livello di mediocrita' abituale di questo forum.
A loro posso solo consigliare di andare su edicolac64 se vogliono sentirsi a casa.
-
Versione breve: voleva essere una battuta innocente, mi scuso di avere interrotto il thread.
-
Riprendo in mano questo vecchio thread per evitare di aprirne altri.
Stasera ho giochicchiato un po' con l'assembler e coi soliti 64 byte (ok, 61 per la precisione) ho tirato fuori questo, a mio avviso, simpatico effetto:
; Raster expander - Freshness79
*=$0326
.word Start
.word $F6ED
S ldy $fc
pha
L tsx
; Bande fisse
and #$38
cmp #$20
bne C
inc $fd
ldx $fd
C lda $d012
cmp $d012
beq *-3
stx $d020
asl $d011
ror
cmp #$9b
beq M
dey
bpl L
bmi S
Start
sei
M inc $fe
lda $fe
bpl K
eor #$ff
K sta $fc
tay
inc $fd
ldx #$00
txs
beq C
La sola parte (con i dovuti limiti) "configurabile" é il numero, la posizione e la dimensione delle bande fisse.
-
Molto interessante!
Provo a studiarmelo un po'
-
Molto interessante!
Provo a studiarmelo un po'
Quoto. Davvero un bellissimo effetto!
-
57 (+2) byte e la possibilità di avere barre da 32 colori liberamente selezionabili. Mi dava troppo fastidio veder sprecati i nibble più significativi dell'elenco dei colori.
Per cambiare i colori tener presente che prima viene visualizzato il low nibble e poi l'high nibble.
*=$032c
.word start
retrst
lsr
lsr
lsr
lsr
start=*+1
lsr $78
bcs waitrst
lda #$0f
inc $78
SBX #$FF
lda table,x
waitrst
cpy $d012
beq waitrst
sta $d020
iny
cpy #$21
bne retrst
endframe
asl $d011
bcc retrst
ldy #$00
bcs endframe
table=*-1
; Prima barra da 16 colori
.byte $b6,$e4,$d3,$71,$cf,$b4,$09,$00
; Seconda barra da 16 colori
.byte $60,$d5,$17,$11,$d7,$65,$00,$00