hej!
To może i ja swoje 3 grosze dorzucę :) Pierwsze założenie optymalizacyjne, odwracamy znak w przypadku ilości spakowanych danych, czyli w przypadku ustawionego 7 bitu, wartość $ff będzie oznaczała 1 powtórzenie, $fe - dwa powtórzenia $80 - 127 powtórzeń. Przez taki myk możemy wprowadzić co następuje:
jsr get
bpl store
xor #$ff
beq stop
...
tay
nie potrzebujemy już and #$7f ;) mamy już 48 bajtów
pierwszym moim pomysłem było zastosowanie nieco innych trybów adresowania i umieszczenie tego na stronie zerowej:
org $80
src dta a(src_address)
dst dta a(dst_address)
loop ldx #($100-(_bpl-q0+2))&$ff
jsr get
ora #$00
bpl store
xor #$ff
beq stop
ldx #($100-(_bpl-q1+2))&$ff
store tay
stx _bpl+1
q0 jsr get
q1 ldx #dst
sta ($00,x)
jsr inc
dey
_bpl bpl *
bvc loop
get ldx #src
lda ($00,x)
inc inc ($00,x)
bne *+2
inc ($01,x)
stop rts
wychodzi 49 bajtów, co okazało się porażką ponieważ kod wygenerowany wcześniej przez magnusa ma 45 bajtów gdy umieścimy go na "zero page". no cóż pozostaje wiec pozostawienie wersji magnusa wraz z modyfikacją "xor" i mamy 43 bajty na zero page lub 48 bajtów w "normalnej" pamięci.
org $80
loop ldx #($100-(_bpl-q0+2))&$ff
jsr get
bpl store
xor #$ff
beq stop
ldx #($100-(_bpl-q1+2))&$ff
store tay
stx _bpl+1
q0 jsr get
q1 sta $dead
inc q1+1
bne *+2
inc q1+2
dey
_bpl bpl *
bvc loop
get inc adr+1
bne *+2
inc adr+2
adr lda $cafe
stop rts
pozdrowionka
Seban/SLIGHT