Petit quizz..
Que fait le code de 256 octets (exactement) qu'il faut charger à partir de $A000 sur un TO7,8,9, ou 9+ ?
Code:
xxxx | $00 $01 $02 $03 $04 $05 $06 $07 $08 $09 $0A $0B $0C $0D $0E $0F
___ | ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
$00 | $1A $50 $8E $A0 $F0 $A6 $80 $46 $A7 $0F $31 $89 $56 $00 $26 $F5
$10 | $31 $02 $4F $5F $1F $03 $34 $44 $33 $41 $44 $56 $ED $81 $ED $A3
$20 | $1F $30 $33 $42 $E3 $61 $ED $61 $EC $E4 $89 $00 $A7 $E4 $8C $B2
$30 | $00 $26 $E7 $CE $41 $E0 $8E $A0 $EE $EC $84 $ED $02 $31 $C4 $8D
$40 | $65 $1F $03 $EC $84 $8D $5F $8D $44 $8B $02 $C4 $FC $33 $A4 $34
$50 | $16 $86 $28 $AE $C8 $B0 $AF $C1 $4A $26 $F8 $EC $E4 $58 $49 $58
$60 | $49 $58 $49 $33 $A6 $8E $A1 $00 $54 $3A $8D $56 $33 $C8 $28 $8D
$70 | $51 $35 $16 $C6 $68 $8D $68 $C6 $12 $8D $64 $30 $1C $33 $A8 $50
$80 | $11 $83 $5E $F0 $25 $B7 $BD $E8 $1B $24 $A8 $35 $C4 $34 $46 $CE
$90 | $AA $00 $A3 $62 $EC $CB $ED $E3 $EC $62 $E3 $64 $EC $CB $A3 $E1
$A0 | $C4 $FE $32 $62 $35 $C0 $34 $46 $6D $E4 $2C $04 $40 $50 $82 $00
$B0 | $CE $FF $5E $8D $D8 $8B $02 $CE $02 $52 $8D $D1 $EE $E1 $8D $CD
$C0 | $35 $C0 $A6 $80 $A4 $C4 $AA $80 $A7 $C4 $EC $81 $ED $41 $ED $45
$D0 | $E6 $80 $ED $43 $A6 $80 $E6 $01 $E4 $48 $EA $81 $ED $47 $39 $4F
$E0 | $E3 $84 $10 $83 $06 $48 $2F $03 $83 $0C $90 $ED $81 $39 $05 $70
$F0 | $01 $FF $FF $FF $FF $FE $01 $FE $00 $FF $FF $FE $FF $FC $01 $FF
(rahh autant de hexgits ca me rappelle l'époque hebdogiiiciel et ses cours d'asm 6809e. J'espère ne pas m'être trompé dans la recopie).
Bon évidemment vu la taille du truc, j'ai du faire un peu de concession à l'optimisation CPU pure car les octets partent très vite. Un simple cmpd #label c'est déjà 4 octets de partis, idem pour les données (il est dur de remplacer des FCB par des LDD/STD: ca prend toujours plus de place via les opcodes). Il a fallu faire plusieurs versions et utiliser diverses astuces au plusieurs chausse-pieds pour faire tenir cela dans 1/4 de Ko.
En fait, ce n'est pas tellement les premières optimisations de taille qui sont dures (on gagne les octets par trentaine), mais c'est surtout la fin quand on a déjà gagné beaucoup et qu'il reste 3 ou 4 octets de trop (voir 1 ou 2) et qu'on se demande comment gagner encore de la place sans perdre une fonction (par exemple: la sortie propre du programme). Mais bon c'est réussi, ça tient dans 16x16 octets. Ouf! Je suis content d'avoir fini ca

A noter que malgré les astuces, le code est propre et retourne au basic sur simple appui du bouton souris ou crayon-optique.
Alors oui bon c'est bien joli le tableau de données hexadécimales, mais que fait il au juste ce code? Je laisse cela à la sagacité du lecteur. voyons: Pour décoder les opcodes on peut utiliser cette
table (je le trouve pratique). Pour ma part je les ai produit avec le
C6809 de Préhisto (promis un de ces 4 je testerais tes patchs qui attendent depuis un petit moment)... :
Comme indice je peux ajouter que c'est un truc que je voulais faire depuis un petit moment et qui contient pas mal de trucs & astuces sympa dont je discuterais volontiers ici plus tard.
sam
\(^_^)/edit: une version plus "recopiable":
Code:
ORG $A000
init SET *
FCB $1A,$50,$8E,$A0,$F0,$A6,$80,$46
FCB $A7,$0F,$31,$89,$56,$00,$26,$F5
FCB $31,$02,$4F,$5F,$1F,$03,$34,$44
FCB $33,$41,$44,$56,$ED,$81,$ED,$A3
FCB $1F,$30,$33,$42,$E3,$61,$ED,$61
FCB $EC,$E4,$89,$00,$A7,$E4,$8C,$B2
FCB $00,$26,$E7,$CE,$41,$E0,$8E,$A0
FCB $EE,$EC,$84,$ED,$02,$31,$C4,$8D
FCB $65,$1F,$03,$EC,$84,$8D,$5F,$8D
FCB $44,$8B,$02,$C4,$FC,$33,$A4,$34
FCB $16,$86,$28,$AE,$C8,$B0,$AF,$C1
FCB $4A,$26,$F8,$EC,$E4,$58,$49,$58
FCB $49,$58,$49,$33,$A6,$8E,$A1,$00
FCB $54,$3A,$8D,$56,$33,$C8,$28,$8D
FCB $51,$35,$16,$C6,$68,$8D,$68,$C6
FCB $12,$8D,$64,$30,$1C,$33,$A8,$50
FCB $11,$83,$5E,$F0,$25,$B7,$BD,$E8
FCB $1B,$24,$A8,$35,$C4,$34,$46,$CE
FCB $AA,$00,$A3,$62,$EC,$CB,$ED,$E3
FCB $EC,$62,$E3,$64,$EC,$CB,$A3,$E1
FCB $C4,$FE,$32,$62,$35,$C0,$34,$46
FCB $6D,$E4,$2C,$04,$40,$50,$82,$00
FCB $CE,$FF,$5E,$8D,$D8,$8B,$02,$CE
FCB $02,$52,$8D,$D1,$EE,$E1,$8D,$CD
FCB $35,$C0,$A6,$80,$A4,$C4,$AA,$80
FCB $A7,$C4,$EC,$81,$ED,$41,$ED,$45
FCB $E6,$80,$ED,$43,$A6,$80,$E6,$01
FCB $E4,$48,$EA,$81,$ED,$47,$39,$4F
FCB $E3,$84,$10,$83,$06,$48,$2F,$03
FCB $83,$0C,$90,$ED,$81,$39,$05,$70
FCB $01,$FF,$FF,$FF,$FF,$FE,$01,$FE
FCB $00,$FF,$FF,$FE,$FF,$FC,$01,$FF
END init