Z tego co napisałeś EOR na C64 to nic innego jak XOR z assemblera x86 czy x64 na PC.
Szczegółowo opisując mój program polega na tym, że jest fragment zakodowanego kodu -mam też ten sam fragment kodu nie zakodowany, mam też wiedzę o tym jak następuje dekodowanie.
Pomysł był krótki, napisać program który przepuszcza 32 bajty przez procedurę dekodującą a następnie porównuje te wartości z fragmentem rozkodowanym.
Ale dzięki za podpowiedź z tym PETSCII -teraz wiem (bo skleroza u mnie zapanowała, gdyż kiedyś świetnie poruszałem się na C64), że każde z 5 znaków mogą znajdować się w zakresie 0-127. -innym słowem procedurę można skrócić o połowę na każdym znaku.
Wykorzystując mój stary program do asemblera działający na komputerach x86 uruchamiany pod DOS zwany Turbo Maszynowy -dostępny do pobrania na mojej stronie stworzyłem kod:
Kod: Zaznacz cały
push CS
pop DS
push word ptr $b800
pop ES
:skok_2
mov AL,[:kod_1]
es:
mov [#0],AL
mov AL,[:kod_2]
es:
mov [#2],AL
mov AL,[:kod_3]
es:
mov [#4],AL
mov AL,[:kod_4]
es:
mov [#6],AL
mov AL,[:kod_5]
es:
mov [#8],AL
xor BX,BX
:skoks_1
mov AL,[BX+:zakodowane]
call :mechanizm
mov [BX+:testowo],AL
inc BX
cmp BX,$20
jnz :skoks_1
;teraz porównanie
xor SI,SI
:skoks_3
mov AL,[SI+:testowo]
cmp AL,[SI+:odkodowane]
jnz :skoks_2
inc SI
cmp SI,$20
jnz :skoks_3
call :kody
mov AX,$4cff
int $21
:skoks_2
inc byte ptr [:kod_1]
cmp byte ptr [:kod_1],$80
jnz :skok_1
mov byte ptr [:kod_1],$00
inc byte ptr [:kod_2]
cmp byte ptr [:kod_2],$80
jnz :skok_1
mov byte ptr [:kod_2],$00
inc byte ptr [:kod_3]
cmp byte ptr [:kod_3],$80
jnz :skok_1
mov byte ptr [:kod_3],$00
inc byte ptr [:kod_4]
cmp byte ptr [:kod_4],$80
jnz :skok_1
mov byte ptr [:kod_4],$00
inc byte ptr [:kod_5]
cmp byte ptr [:kod_5],$80
jnz :skok_1
mov AX,$4cff
int $21
:skok_1
jmp /:skok_2
:odkodowane db $a2,$62,$bd,$00,$08,$9d,$00,$03
db $e8,$d0,$f7,$4c,$62,$03,$a9,$01
db $85,$fb,$85,$fd,$a2,$08,$86,$fe
db $e8,$86,$fc,$78,$a9,$38,$85,$01
:zakodowane db $7a,$ba,$91,$dc,$c4,$71,$dc,$db
db $24,$0c,$2f,$88,$ba,$bd,$5d,$d5
db $59,$53,$59,$51,$7a,$c4,$5e,$56
db $24,$5e,$58,$d4,$5d,$14,$59,$d5
:testowo space (#32)
:mechanizm
xor AL,[:kod_1]
clc
adc AL,[:kod_2]
xor AL,[:kod_3]
stc
sbb AL,[:kod_4]
xor AL,[:kod_5]
ret
:kod_1 db $0
:kod_2 db $0
:kod_3 db $0
:kod_4 db $0
:kod_5 db $0
:task db "0123456789abcdef"
:text db "00 00 00 00 00",$d,$a,"$"
:kody
mov BL,[:kod_1]
mov BH,BL
and BL,$f
shr BH,#4
movzx DI,BL
movzx SI,BH
mov AL,[SI+:task]
mov [:text],AL
mov AL,[DI+:task]
mov [:text+#1],AL
mov BL,[:kod_1+#1]
mov BH,BL
and BL,$f
shr BH,#4
movzx DI,BL
movzx SI,BH
mov AL,[SI+:task]
mov [:text+#3],AL
mov AL,[DI+:task]
mov [:text+#4],AL
mov BL,[:kod_1+#2]
mov BH,BL
and BL,$f
shr BH,#4
movzx DI,BL
movzx SI,BH
mov AL,[SI+:task]
mov [:text+#6],AL
mov AL,[DI+:task]
mov [:text+#7],AL
mov BL,[:kod_1+#3]
mov BH,BL
and BL,$f
shr BH,#4
movzx DI,BL
movzx SI,BH
mov AL,[SI+:task]
mov [:text+#9],AL
mov AL,[DI+:task]
mov [:text+#10],AL
mov BL,[:kod_1+#4]
mov BH,BL
and BL,$f
shr BH,#4
movzx DI,BL
movzx SI,BH
mov AL,[SI+:task]
mov [:text+#12],AL
mov AL,[DI+:task]
mov [:text+#13],AL
mov DX,:text
mov AH,#9
int $21
ret