Fecha actual Lun May 20, 2013 8:37 am


Ayuda con ASm

Programando el Amstrad en Ensamblador.
Reglas del Foro Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.

De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
  • Autor
  • Mensaje
Desconectado

cualquiercosa327

Lechoncillo

Lechoncillo

  • Mensajes: 16
  • Registrado: Mié Mar 25, 2009 8:48 pm

Ayuda con ASm

NotaMar Mar 31, 2009 6:26 pm

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,
Adjuntos
compresor.rar
(155.76 KiB) 75 veces
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

  • Mensajes: 5264
  • Registrado: Vie Oct 07, 2005 5:18 pm
  • Ubicación: En un país tropical.

Re: Ayuda con ASm

NotaMar Mar 31, 2009 7:12 pm

Así sin mirarlo se me ocurre que hagas una definición de cada variable que te falta de la siguiente forma:
store1 defw 0
store2 defw 0
...
a ver si te funciona. Si no le echaré un ojo mañana.
Salu2,
Arta
Desconectado

cualquiercosa327

Lechoncillo

Lechoncillo

  • Mensajes: 16
  • Registrado: Mié Mar 25, 2009 8:48 pm

Re: Ayuda con ASm

NotaMié Abr 15, 2009 12:58 pm

Hola de nuevo,gracias Artaburu,acabo de probarlo ahora (no habia tenido ocasion antes) y asi compila sin ningun error al definir las variables ,pero claro,logicamente no hace nada .(lo intente cargar con call 4000).
Ahora que veo que compila sin error,estoy intentando usar la primera parte,para extraerl los ficheros del bank1 .
Aqui expongo mis ideas,por si alguien se le ocurre algo y puede ayudarme:



1)Este archivo (como el resto ,ocupa 16384 bytes).Por lo tanto en d deberia usar bank1 y en E el 1 (no se cuantos hay),estoy pensando en cargar con load el bank y compilar la rutina,pero no tengo muy claro en que direccion cargarlo.


2)Este algoritmo fue muy utilizado en algunos juegos de Titus,(programados por elmar k) para comprimir/descomprimir los datos.
Trasteando con uno de sus juegos (zapt and ball,la version demo) he logrado encontrar el "cargador bueno",haciendo que el programa casque y guardandolo en un fichero de texto que luego saque con el winape .El creo una rsx con este extractor ya compilado (haber si es el mismo :p ),pero no se como guardar la rsx en un fichero y poder usarla luego (sobre todo xq de la manera q logre ver el cargador sale un basic un poco raro (supongo que por el overscan,y no se como cambiarlo al modo de pantalla normal sin reiniciar el basic (y perdiendo los datos)

Aqui pego el cargador por si alguien le interesa:


1 '*** ZAP'T'BALLS LOADER ***
2 ' ¤1.2.1992 by ELMSOFT
3 '
4 ' HEY,YOU NUCKY DUCKY!
5 ' DON'T THINK YOU CAN EVER
6 ' CHEAT ME!I'LL START THIS
7 'MESSAGE AGAIN, SO THAT YOU
8 ' DON'T FORGET WHAT I'VE
9 ' JUST SAID!!
10 POKE &254,25:POKE &255,0:ON ERROR GOTO 13:MEMORY &3FFF:OUT &7F00,&C0:POKE &4000,123:OUT &7F00,&C4:IF PEEK(&4000)=123 THEN MODE 2:A$="SORRY,THIS GAME NEEDS 128K OF MEMORY.BUY A RAM EXTENSION OR RUN IT ON A CPC 6128 ":GOSUB 22:CALL &BB18:CALL 0
11 OUT &7F00,&C0:LOAD "!ZAPTBALL.BI1",&4000:FOR A=2 TO 5:OUT &7F00,A+194:A$="!ZAPTBALL.BI"+RIGHT$(STR$(A),1):LOAD A$,&4000:NEXT:MODE 1:A$="NOW DECRUNCHING ZAP'T'BALLS-PLEASE WAIT! ":GOSUB 22:FOR A%=&A500 TO &A5C8:READ A$:POKE A%,VAL("&"+A$):NEXT
12 CALL &A500:OUT &7F00,&C0:|EXPAND,&4000:FOR A=&C4 TO &C7:OUT &7F00,A:|EXPAND,&4000:NEXT
13 KEY DEF 0,0,0,0,0:KEY DEF 1,0,0,0,0:KEY DEF 2,0,0,0,0:KEY DEF 8,0,0,0,0:MODE 2:A$="PLEASE INPUT NAME OF LEVEL FILE (PRESS ENTER FOR STANDARD LEVELS):":GOSUB 22:LOCATE 67,16:INPUT "",L$
14 MODE 0:IF L$="" THEN L$="ZAPTBALL"
15 IF INSTR(L$,".")=0 THEN L$=L$+".LEV"
16 IF LEN(L$)>12 THEN 13
17 OUT &7F00,&C7:L$="!"+L$:LOAD L$,&8000:IF PEEK(&8000)=227 THEN CALL &A587:OUT &7F00,&C0:CALL &A578
18 L$=LEFT$(L$,LEN(L$)-3)+"ADD":MODE 2:INK 1,0:LOAD L$,&C000:CALL &C000
19 DATA 1,d,a5,21,9,a5,c3,d1,bc,0,0,0,0,12,a5,c3,19,a5,45,58,50,41,4e,c4,0,f3,dd,66,1,dd,6e,0,e5,5e,23,56,2b,19,d1,13,2b,ed,a8,ed,a8,e5,21,0,40,19,eb,fd,e1,fd,7e,0,fe,cb,20,31,fd,7e,ff,fe,ed,20,2a,fd,7e,fe,fe,37,20,23,fd,e5,e1,2b,2b,2b
20 DATA fd,46,fc,fd,4e,fb,ed,a8,23,78,b1,20,f9,2b,2b,2b,e5,dd,46,1,dd,4e,0,ed,42,30,c8,18,7,fd,e5,e1,ed,a8,18,ec,e1,fb,c9,0,f3,21,0,40,11,0,0,1,0,40,ed,b0,c3,d0,1,21,0,80,e5,1,0,20,7e,ee,7b,77,23,b,78,b1,20,f6,e1,11,0,59,7e,fe,ff,c8,fe,fe,28,6,6,0,4f,23
21 DATA 18,5,23,4e,23,46,23,7e,23,fe,ff,20,4,ed,b0,18,e3,eb,f5,77,b,23,78,b1,28,3,f1,18,f5,f1,eb,18,d3
22 OUT &BC00,1:OUT &BD00,50:LOCATE 1,16:FOR A=1 TO LEN(A$):CALL &BD19:PRINT MID$(A$,A,1);CHR$(143);CHR$(8);:SOUND 129,100,5,15:FOR B=1 TO 30:NEXT:NEXT:RETURN
$$$ÿ ÿ);ÿ();Ì ,d,,ž
Âï ì °°É 




Por cierto,mu bueno el codigo del minicolumsn,lo que pasa q no puedo guardarlo en disco,y cada vez q quiero cargarlo tengo q compilarlo :(
(se q hay una version full tambien )
Desconectado
Avatar de Usuario

Sabrewulf

Forero habitual

Forero habitual

  • Mensajes: 109
  • Registrado: Vie Jun 13, 2008 11:38 am
  • Ubicación: Madrid, Spain

Re: Ayuda con ASm

NotaMié Abr 15, 2009 5:01 pm

Hola,

Puede ser que esté equivocado, pero me da la impresión de que no es posible hacer lo que quieres. Lo intento explicar:

1. El archivo que incluyes tiene treinta y tantos ficheros de 16k, y supongo que provienen de dividir la rom del juego en partes de 16K. Los ficheros en sí no están comprimidos, aunque los datos internamente sí lo estén.
2. Tanto el listado ensamblador como el Basic del juego de Amstrad lo que hacen es cargar varios ficheros comprimidos y luego los descomprime. En el caso del Amstrad, carga 5 ficheros en los 5 bancos de 16k memoria disponibles (situados en la dirección &4000) y luego los descomprime mediante el comando |EXPAND que genera con los datas de las líneas 19, 20 y 21. Fíjate que todos los ficheros ZAPTBALL.BI? son menores de 16k (si no, no estarían comprimidos).
3. La rutina en ensamblador supongo que está programada para GB y no es válida para Amstrad salvo que se adapte. Aunque ambos sistemas estén basados en el Z80, cada máquina utiliza unos puertos de Entrada y Salida diferentes.

Si lo que quieres es modificar el juego, quizás tengas más posibilidades utilizando un emulador de GameBoy.
Desprotegido por Abraxas- Madrid

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD El portal del CPC Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) El sitio del Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic
CPC-Topsites rss