Hola a todos.Estoy intentando conseguir que funcione un codigo que me han pasado recientemente (demo de stunt racer fx),inicialmente fue creado para la gameboy,pero la parte que necesito es z80 puro,y quiero hacerlo funcionar en un emulador de amstrad cpc.
Un problema es que faltan los archivos donde estan los defines,y me da problemas con las variables store1,store2,...
Quiero cargar cada archivo de datos ,extraer y descomprimir los datos.
;DECRUNCHER FOR DIET 1.44 (Teddy Matsumoto)
;Input D=Archive Number (=Bank Number)
; E=File Number
; HL=Destination address
; D.Bit 7=1. BC=Archive address, otherwise BC=$4000
; CALL EXTRACT
;Input DE=Source address
; HL=Destination address
; CALL DECRUNCH
;Output HL- = decompacted program, all registers destroyed.
;EXTRACT FROM ARCHIVE
;====================
extract di:ld a,d:and 127:ld (mbcr1),a:rl d:jr c,ex2:ld bc,&4000
ex2 ld a,b:out (store2),a:ld a,c:out (store1),a
ld a,e:dec a:add a,a:add a,c:ld c,a:adc a,b:sub c:ld b,a
ld a,(bc):ld e,a:inc bc:ld a,(bc):ld d,a:rla:jr c,ex3
inc bc:ld a,(bc):inc bc:sub e:push af:ld a,(bc):res 7,a:sbc a,d:ld b,a
pop af:ld c,a:in a,(store1):add a,e:ld e,a:in a,(store2):adc a,d:ld d,a
ex22 ld a,(de):ld (hli),a:inc de:dec bc:ld a,b:or c:jr nz,ex22:ret
ex3 res 7,d:in a,(store1):add a,e:ld e,a:in a,(store2):adc a,d:ld d,a
;DECRUNCHER
;==========
decrunch ld a,(de):out (store5),a:inc de:ld a,(de):out (store6),a:inc de
ld a,16:out (store1),a:xor a:out (store3),a:out (store4),a:out (store2),a
diet2 call nextbit:jr nc,diet1:ld a,(de):ld (hli),a:inc de:jr diet2
diet1 call nextbit:ld a,(de):inc de:ld c,a:ld b,&ff
jr c,diet4:call nextbit:jr c,diet13:ld a,b:cp c:jr nz,diet15
in a,(rombank):ld (mbcr1),a:ret
diet15 ld a,2:out (store3),a:xor a:out (store4),a
diet3 push de:ld a,l:add a,c:ld e,a:ld a,h:adc a,b:ld d,a
in a,(store3):ld c,a:in a,(store4):ld b,a
diet32 ld a,(de):ld (hli),a:inc de:dec bc:ld a,b:or c:jr nz,diet32
pop de:jr diet2
diet13 call nextbit:rl b:call nextbit:rl b:call nextbit:rl b:dec b:jr diet15
diet4 call nextbit:rl b:call nextbit:jr c,diet7:ld a,2:out (store2),a:ld a,3
diet5 push af:call nextbit:jr c,diet6:call nextbit:rl b
in a,(store2):add a,a:out (store2),a:pop af:dec a:jr nz,diet5:push af
diet6 pop af:in a,(store2):sub b:cpl:inc a:ld b,a
diet7 ld a,2:out (store2),a:ld a,4
diet8 push af:in a,(store2):inc a:out (store2),a:call nextbit:jr c,diet10
pop af:dec a:jr nz,diet8:call nextbit:jr nc,diet9
call nextbit:in a,(store2):adc a,1:out (store2),a:push af
diet10 pop af:in a,(store2):out (store3),a:xor a:out (store4),a:jp diet3
diet9 call nextbit:jr c,diet11:xor a:out (store2),a:ld a,3
diet12 push af:call nextbit:in a,(store2):rla:out (store2),a:pop af
dec a:jr nz,diet12:in a,(store2):add a,9:out (store3),a:xor a:out (store4),a
jp diet3
diet11 ld a,(de):inc de:add a,17:out (store3),a:ld a,0:rla:out (store4),a
jp diet3
nextbit in a,(store6):rra:out (store6),a:in a,(store5):rra:out (store5),a
in a,(store1):dec a:out (store1),a:ret nz
ld a,(de):out (store5),a:inc de:ld a,(de):out (store6),a:inc de
ld a,16:out (store1),a:ret
¿Alguna ayuda?
Muchas gracias.
Nota ,al ser de gameboy,las paginas son de 16Kbytes (16384 bytes) .La primera es la cabezera y el codigo y el resto suele ser los datos (los q estoy intentando extraer)
Use el programa split de linux para separarlos,
Un problema es que faltan los archivos donde estan los defines,y me da problemas con las variables store1,store2,...
Quiero cargar cada archivo de datos ,extraer y descomprimir los datos.
;DECRUNCHER FOR DIET 1.44 (Teddy Matsumoto)
;Input D=Archive Number (=Bank Number)
; E=File Number
; HL=Destination address
; D.Bit 7=1. BC=Archive address, otherwise BC=$4000
; CALL EXTRACT
;Input DE=Source address
; HL=Destination address
; CALL DECRUNCH
;Output HL- = decompacted program, all registers destroyed.
;EXTRACT FROM ARCHIVE
;====================
extract di:ld a,d:and 127:ld (mbcr1),a:rl d:jr c,ex2:ld bc,&4000
ex2 ld a,b:out (store2),a:ld a,c:out (store1),a
ld a,e:dec a:add a,a:add a,c:ld c,a:adc a,b:sub c:ld b,a
ld a,(bc):ld e,a:inc bc:ld a,(bc):ld d,a:rla:jr c,ex3
inc bc:ld a,(bc):inc bc:sub e:push af:ld a,(bc):res 7,a:sbc a,d:ld b,a
pop af:ld c,a:in a,(store1):add a,e:ld e,a:in a,(store2):adc a,d:ld d,a
ex22 ld a,(de):ld (hli),a:inc de:dec bc:ld a,b:or c:jr nz,ex22:ret
ex3 res 7,d:in a,(store1):add a,e:ld e,a:in a,(store2):adc a,d:ld d,a
;DECRUNCHER
;==========
decrunch ld a,(de):out (store5),a:inc de:ld a,(de):out (store6),a:inc de
ld a,16:out (store1),a:xor a:out (store3),a:out (store4),a:out (store2),a
diet2 call nextbit:jr nc,diet1:ld a,(de):ld (hli),a:inc de:jr diet2
diet1 call nextbit:ld a,(de):inc de:ld c,a:ld b,&ff
jr c,diet4:call nextbit:jr c,diet13:ld a,b:cp c:jr nz,diet15
in a,(rombank):ld (mbcr1),a:ret
diet15 ld a,2:out (store3),a:xor a:out (store4),a
diet3 push de:ld a,l:add a,c:ld e,a:ld a,h:adc a,b:ld d,a
in a,(store3):ld c,a:in a,(store4):ld b,a
diet32 ld a,(de):ld (hli),a:inc de:dec bc:ld a,b:or c:jr nz,diet32
pop de:jr diet2
diet13 call nextbit:rl b:call nextbit:rl b:call nextbit:rl b:dec b:jr diet15
diet4 call nextbit:rl b:call nextbit:jr c,diet7:ld a,2:out (store2),a:ld a,3
diet5 push af:call nextbit:jr c,diet6:call nextbit:rl b
in a,(store2):add a,a:out (store2),a:pop af:dec a:jr nz,diet5:push af
diet6 pop af:in a,(store2):sub b:cpl:inc a:ld b,a
diet7 ld a,2:out (store2),a:ld a,4
diet8 push af:in a,(store2):inc a:out (store2),a:call nextbit:jr c,diet10
pop af:dec a:jr nz,diet8:call nextbit:jr nc,diet9
call nextbit:in a,(store2):adc a,1:out (store2),a:push af
diet10 pop af:in a,(store2):out (store3),a:xor a:out (store4),a:jp diet3
diet9 call nextbit:jr c,diet11:xor a:out (store2),a:ld a,3
diet12 push af:call nextbit:in a,(store2):rla:out (store2),a:pop af
dec a:jr nz,diet12:in a,(store2):add a,9:out (store3),a:xor a:out (store4),a
jp diet3
diet11 ld a,(de):inc de:add a,17:out (store3),a:ld a,0:rla:out (store4),a
jp diet3
nextbit in a,(store6):rra:out (store6),a:in a,(store5):rra:out (store5),a
in a,(store1):dec a:out (store1),a:ret nz
ld a,(de):out (store5),a:inc de:ld a,(de):out (store6),a:inc de
ld a,16:out (store1),a:ret
¿Alguna ayuda?
Muchas gracias.
Nota ,al ser de gameboy,las paginas son de 16Kbytes (16384 bytes) .La primera es la cabezera y el codigo y el resto suele ser los datos (los q estoy intentando extraer)
Use el programa split de linux para separarlos,
- Adjuntos
-
compresor.rar- (155.76 KiB) 75 veces











