Fecha actual Sab May 25, 2013 9:37 am


CPCBasic: Compilador cruzado de BASIC

Programando el Amstrad en Basic, C, etc.
  • Autor
  • Mensaje
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

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

NotaVie Ago 10, 2007 12:50 pm

Vaya, hay algún problema con el paso de los parámetros, no me los coge bien. He modificado una cosilla en el código que estaba sin adaptar.

Código: Seleccionar todo
CHAIN "CPCBasic.BAS"

DIM sprite00#(15) ' Es suficiente indicar 15 para tener 16 elementos, ya que el array es del índice 0 al

15
DIM i%,a#

DEF SUB imp_sp_normal(%,%,%,%)= _
  "ld hl,2" + "add hl,sp" + "push hl" + "pop ix" + "ld l,(ix+0)" + "ld h,(ix+1)" + _
  "ld a,(ix+2)" + "ld e,(ix+6)" + "ld d,(ix+7)" + "ld (loop_alto_2+1),a" + "sub 1" + "cpl" + _
  "ld (salto_linea+1),a" + "ld a,(ix+4)" + "defb &fd" + "ld h,a"   + "ld b,7" + "loop_alto_2" + _
  "ld c,4" + "loop_ancho_2:" + "ld a,(de)" + "ld (hl),a" + "inc de" + "inc hl" + "dec c" +   "jp

nz,loop_ancho_2" + _
  "defb &fd" + "dec h" + "ret z" + "salto_linea" + "ld c,&ff" + "add hl,bc" + "jp nc,loop_alto_2" + "ld

bc,&c050" + _
  "add hl,bc" +  "ld b,7" + "jp loop_alto_2" + "imp_sp_normal0:" + "ancho0:" + "suma_siguiente_linea0:"
' Da error al ensamblar esta orden porque no están declaradas algunas etiquetas
' Las he declarado al final, aunque no tenga sentido para comprobar que ensambla correctamente

RESTORE datos_sprite00
for i%=0 to 15 ' El primer elemento es índice 0 y el último es 15
   read a#
   sprite00#(i%)=a#
next

imp_sp_normal @sprite00#(0),8,2,&c000:REM Se da en el primer argumento la dirección del primer elemento

del array
END
' Importante llevar el END antes que los DATA porque si no se ejecuta el código máquina correspondente a

los
' bytes declarados en DATA

datos_sprite00: DATA &07#,&0E#,&2D#,&2D#,&0F#,&2D#,&0F#,&2D#,&0F#,&0F#,&0F#,&2D#,&0F#,&0F#,&07#,-51#
' En el último byte, como ejemplo, he puesto el valor correspondiente a &CD#, que al ser 205 en decimal,

para obtener
' el valor correspondiente en tamaño byte sería 205 - 256 = -51
Salu2,
Arta
Desconectado
Avatar de Usuario

dinoneno

Megaforero

Megaforero

  • Mensajes: 247
  • Registrado: Mié Sep 13, 2006 6:32 am
  • Ubicación: Toledo

NotaVie Ago 10, 2007 1:35 pm

Por si sirve de ayuda, una observación sobre la toma de los valores de parámetros. Lo que viene en la pila en a la entrada de una orden o función no es nunca el valor del parámetro, es su dirección. Como ejemplo, una orden que recibe un código de carácter y lo imprime sería:

Código: Seleccionar todo
DEF SUB PRINT_CHAR(#) = _
"LD IX,2" + _
"ADD IX,SP" + _
"LD H,(IX+1) ; H = byte alto de la dirección del parámetro" + _
"LD L,(IX+0) ; L = byte bajo de la dirección del parámetro" + _
"LD A,(HL) ; A = valor del parámetro" + _
"JP &BB5A"
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

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

NotaVie Ago 10, 2007 1:42 pm

dinoneno escribió:Por si sirve de ayuda, una observación sobre la toma de los valores de parámetros. Lo que viene en la pila en a la entrada de una orden o función no es nunca el valor del parámetro, es su dirección. Como ejemplo, una orden que recibe un código de carácter y lo imprime sería:

Código: Seleccionar todo
DEF SUB PRINT_CHAR(#) = _
"LD IX,2" + _
"ADD IX,SP" + _
"LD H,(IX+1) ; H = byte alto de la dirección del parámetro" + _
"LD L,(IX+0) ; L = byte bajo de la dirección del parámetro" + _
"LD A,(HL) ; A = valor del parámetro" + _
"JP &BB5A"

Okis, va a ser eso...
Salu2,
Arta
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

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

NotaDom Ago 12, 2007 9:11 pm

dinoneno escribió: En cuanto a lo que me gustaría saber es exactamente eso, cómo utilizar estas órdenes en un programa propio. ¿Existe algún manualillo por ahí sobre esto?

Hombre, manualillo no existe, pero en el fichero que hay en el tema del z88dk hay una serie de ejemplos en C que te pueden aclarar las cosas. Básicamente hay rutinas para imprimir sprites en la pantalla con y sin máscara. Rutinas para tener un teclado redefinido (no haría mucha falta en caso de usar el Basic) y rutinas para meter y mover sprites por un mapeado. EL mapeado es la pantalla y lo que se hace es reconstruirla donde han estado los sprites para que al moverlos desaparezcan de la posición anterior, avitando parpadeos. Pero te recomiendo que revises los ejemplos de C y si tienes cualquier pregunta no dudes en hacérmela ;)

Por otra parte, todavía no he portado la rutina al BASIC, lo dejé el viernes y lo tengo que retomar. Sólo debería faltar lo que pusiste de las direcciones de los parámetros. Por cierto, ¿no se podría hacer que se metiera en pila el valor del parámetro? Esto haría ganar algo de velocidad a la rutina ASM.
Salu2,
Arta
Desconectado
Avatar de Usuario

dinoneno

Megaforero

Megaforero

  • Mensajes: 247
  • Registrado: Mié Sep 13, 2006 6:32 am
  • Ubicación: Toledo

NotaLun Ago 13, 2007 6:45 am

Artaburu escribió:
dinoneno escribió: En cuanto a lo que me gustaría saber es exactamente eso, cómo utilizar estas órdenes en un programa propio. ¿Existe algún manualillo por ahí sobre esto?

Hombre, manualillo no existe, pero en el fichero que hay en el tema del z88dk hay una serie de ejemplos en C que te pueden aclarar las cosas. Básicamente hay rutinas para imprimir sprites en la pantalla con y sin máscara. Rutinas para tener un teclado redefinido (no haría mucha falta en caso de usar el Basic) y rutinas para meter y mover sprites por un mapeado. EL mapeado es la pantalla y lo que se hace es reconstruirla donde han estado los sprites para que al moverlos desaparezcan de la posición anterior, avitando parpadeos. Pero te recomiendo que revises los ejemplos de C y si tienes cualquier pregunta no dudes en hacérmela ;)

Por otra parte, todavía no he portado la rutina al BASIC, lo dejé el viernes y lo tengo que retomar. Sólo debería faltar lo que pusiste de las direcciones de los parámetros. Por cierto, ¿no se podría hacer que se metiera en pila el valor del parámetro? Esto haría ganar algo de velocidad a la rutina ASM.


De acuerdo, ya miro los ejemplos en C para enterarme del funcionamiento de las rutinas y te tomo la palabra para preguntarte en caso de dudas. Gracias.

Supongo que el que las órdenes y funciones de CPCBasic reciban siempre la dirección del valor de los parámetros te obligarán un poco a cambiar las rutinas. Pensé en pasar valores directamente en la pila, incluso pasarlos en los registros, pero resolví hacerlo como está ahora porque por un lado los tipos de datos byte y entero se podría pasar su valor, pero los tipos entero largo, real y cadena habría que pasar su dirección, ya que el dato ocupa más de 2 bytes, y por eso, para unificar, pues decidí que todos fuesen por dirección, y es cierto que ralentiza. Lo de pasar los parámetros en registros directamente lo descarté también porque no permitiría rutinas reentrantes y con recursividad.

Suerte con la continuación en la adaptación y también quedo a la disposición tuya o de quien lo necesite para resolver dudas. Saludos a todos.
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

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

NotaLun Ago 13, 2007 12:13 pm

Aquí está la primera rutina adaptada. Para imprimir un sprite:
Código: Seleccionar todo
CHAIN "CPCBasic.BAS"

DIM sprite00#(15) ' Es suficiente indicar 15 para tener 16 elementos, ya que el array es del índice 0 al 15
DIM i%,a#

DEF SUB imp_sp_normal(%,#,#,%)= _

   "ld ix,2"+"add ix,sp"+   "ld l,(ix+0)"+   "ld h,(ix+1)"+   "ld e,(hl)"+   "inc hl"+   "ld d,(hl)" + _
   "ld (_tmp1),de" +   "ld l,(ix+2)"+   "ld h,(ix+3)"+   "ld a,(hl)"+"ld l,(ix+4)"+"ld h,(ix+5)"+"ld b,(hl)"+ _
      "ld l,(ix+6)"+   "ld h,(ix+7)"+   "ld e,(hl)"+   "inc hl"+   "ld d,(hl)"+"ld hl,(_tmp1)"+"ld (loop_alto_2+1),a"+ _
      "sub 1" +"cpl"+   "ld (salto_linea+1),a"+   "defb &fd"+"ld h,b" + _

"ld b,7" + "loop_alto_2" + _
  "ld c,4" + "loop_ancho_2:" + "ld a,(de)" + "ld (hl),a" + "inc de" + "inc hl" + "dec c" +   "jp nz,loop_ancho_2" + _
  "defb &fd" + "dec h" + "ret z" + "salto_linea" + "ld c,&ff" + "add hl,bc" + "jp nc,loop_alto_2" + "ld bc,&c050" + _
  "add hl,bc" +  "ld b,7" + "jp loop_alto_2" + "_tmp1 defw 0"
' Da error al ensamblar esta orden porque no están declaradas algunas etiquetas
' Las he declarado al final, aunque no tenga sentido para comprobar que ensambla correctamente

RESTORE datos_sprite00
for i%=0 to 15 ' El primer elemento es índice 0 y el último es 15
   read a#
   sprite00#(i%)=a#
next

imp_sp_normal @sprite00#(0),8,2,&c000:REM Se da en el primer argumento la dirección del primer elemento del array
END
' Importante llevar el END antes que los DATA porque si no se ejecuta el código máquina correspondente a los
' bytes declarados en DATA

datos_sprite00: DATA &07#,&0E#,&2D#,-51#,&0F#,&2D#,&0F#,&2D#,&0F#,&0F#,&0F#,&2D#,&0F#,&0F#,&07#,&0E#
Salu2,
Arta
Desconectado
Avatar de Usuario

Artaburu

Trasteador

Trasteador

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

NotaMar Ago 14, 2007 4:49 pm

Otro ejemplillo, esta vez he metido la captura del trozo de pantalla para restaurar el fondo. Es un sprite que se mueve de la izquierda a la derecha y luego vuelve.
Código: Seleccionar todo
CHAIN "CPCBasic.BAS"

DIM sprite00#(15)
DIM buffer00#(15)
DIM i%,a#,z%, z0%

DEF SUB imp_sp_normal(%,#,#,%)= _
"ld ix,2"+"add ix,sp"+"ld l,(ix+0)"+"ld h,(ix+1)"+"ld e,(hl)"+"inc hl"+   "ld d,(hl)"+ _
"ld (_tmp1),de"+"ld l,(ix+2)"+"ld h,(ix+3)"+"ld a,(hl)"+"ld l,(ix+4)"+"ld h,(ix+5)"+"ld b,(hl)"+ _
"ld l,(ix+6)"+"ld h,(ix+7)"+"ld e,(hl)"+"inc hl"+"ld d,(hl)"+"ld hl,(_tmp1)"+"ld (loop_alto_2+1),a"+ _
"sub 1"+"cpl"+"ld (salto_linea+1),a"+"defb &fd"+"ld h,b"+ _
"ld b,7"+"loop_alto_2"+"ld c,4"+"loop_ancho_2:"+"ld a,(de)"+"ld (hl),a"+"inc de"+"inc hl"+"dec c"+"jp nz,loop_ancho_2"+ _
"defb &fd"+"dec h"+"ret z"+"salto_linea"+"ld c,&ff"+"add hl,bc"+"jp nc,loop_alto_2"+"ld bc,&c050"+ _
"add hl,bc"+"ld b,7"+"jp loop_alto_2"+"_tmp1 defw 0"
DEF SUB captura_sp(%,#,#,%)= _
"ld ix,2"+"add ix,sp"+"ld l,(ix+0)"+"ld h,(ix+1)"+"ld e,(hl)"+"inc hl"+   "ld d,(hl)"+ _
"ld (_tmp1),de"+"ld l,(ix+2)"+"ld h,(ix+3)"+"ld a,(hl)"+"ld l,(ix+4)"+"ld h,(ix+5)"+"ld b,(hl)"+ _
"ld l,(ix+6)"+"ld h,(ix+7)"+"ld e,(hl)"+"inc hl"+"ld d,(hl)"+"ld hl,(_tmp1)"+"ld (loop_alto_2x+1),a"+ _
"sub 1"+"cpl"+"ld (salto_lineax+1),a"+"defb &fd"+"ld h,b"+ _
"ld b,7"+"loop_alto_2x"+"ld c,4"+"loop_ancho_2x"+"ld a,(hl)"+"ld (de),a"+"inc de"+"inc hl"+"dec c"+"jp nz,loop_ancho_2x"+ _
"defb &fd"+"dec h"+"ret z"+"salto_lineax"+"ld c,&ff"+"add hl,bc"+"jp nc,loop_alto_2x"+"ld bc,&c050"+ _
"add hl,bc"+"ld b,7"+"jp loop_alto_2x"

RESTORE datos_sprite00
for i%=0 to 15 ' El primer elemento es índice 0 y el último es 15
   read a#
   sprite00#(i%)=a#
next

z%=&c001
captura_sp @buffer00#(0),8,2,z%-1

for i%=0 to 72   ' Muevo el sprite de la izquierda a la derecha, restaurando el fondo
   imp_sp_normal @buffer00#(0),8,2,z0%
   captura_sp @buffer00#(0),8,2,z%

   imp_sp_normal @sprite00#(0),8,2,z%   
   z0%=z%
   z%=z%+1
   
next


for i%=72 to 0 step -1   ' Muevo el sprite de la izquierda a la derecha, restaurando el fondo
   imp_sp_normal @buffer00#(0),8,2,z0%
   captura_sp @buffer00#(0),8,2,z%

   imp_sp_normal @sprite00#(0),8,2,z%
   z0%=z%   
   z%=z%-1
next

END
' Importante llevar el END antes que los DATA porque si no se ejecuta el código máquina correspondente a los
' bytes declarados en DATA

datos_sprite00: DATA &07#,&0E#,&2D#,-51#,&0F#,&2D#,&0F#,&2D#,&0F#,&0F#,&0F#,&2D#,&0F#,&0F#,&07#,&0E#
Salu2,
Arta
Desconectado
Avatar de Usuario

dinoneno

Megaforero

Megaforero

  • Mensajes: 247
  • Registrado: Mié Sep 13, 2006 6:32 am
  • Ubicación: Toledo

Bugs encontrados en compilador CPCBasic

NotaDom Ago 26, 2007 6:31 pm

Han aparecido algunos errores en el compilador CPCBasic que quiero corregir cuanto antes. He creado en la página web una nueva sección con estos bugs que he ido detectando. Espero que no os causen molestia a todos los que utilizais este compilador. Un saludo.
Desconectado
Avatar de Usuario

dinoneno

Megaforero

Megaforero

  • Mensajes: 247
  • Registrado: Mié Sep 13, 2006 6:32 am
  • Ubicación: Toledo

Nueva versión 1.0.1

NotaLun Ago 27, 2007 7:18 pm

He corregido un par de bugs que se habían detectado, aunque todavía queda alguno por arreglar de los que han aparecido. Ya está disponible la nueva versión de CPCBasic en la web http://perso.orange.es/emilio.guerrerog .
Desconectado
Avatar de Usuario

dinoneno

Megaforero

Megaforero

  • Mensajes: 247
  • Registrado: Mié Sep 13, 2006 6:32 am
  • Ubicación: Toledo

Versión 1.0.2

NotaDom Sep 02, 2007 2:12 pm

La versión 1.0.2 está disponible con alguna mejora y corrección (ver sección de errores conocidos). Un saludo.
Desconectado
Avatar de Usuario

DaDMaN

Keeper of The Forum

Keeper of The Forum

  • Mensajes: 857
  • Registrado: Jue Mar 16, 2006 10:51 pm

NotaVie Sep 14, 2007 5:39 pm

Hola.... vamos a ver... me he puesto a compilar con el CPCBasic...

Ademas de las sorpresas de cambios entre el Locomotive Basic y el CPCBasic, me acabo de encontrar con algo que me PARA.

Tengo un par de rutinas en ensamblador que ya se encuentran en la memoria del CPC en sendas direcciones de memoria... El problema es que están parametrizadas, es decir... Call &4000,&552D,&C000

No se pueden pasar parámetros a dichas rutinas desde CPCBASIC?

Espero que haya algún modo pq sino, me haceis un traje, jajajjajajaja

Otra cosa... Se le puede indicar al compilador que compile en otra direccion de memoria??¿?

Y más cosas... (me estoy desesperando ya...):
Tengo en el disco un archivo de texto grabado con el locomotive BASIC, con el siguiente formato:

Código: Seleccionar todo
-16384       -16379       -16374       -16369       -16364       -16359       -16354       -16349       -16344       -16339       -16334       -16329       -16324       -16319       -16314       -16309       -8032        -8027        -8022        -8017        -8012       -8007       -8002       -7997       -7992       -7987       -7982       -7977       -7972       -7967       -7962       -7957       -15984       -15979       -15974       -15969       -15964       -15959       -15954       -15949       -15944       -15939       -15934       -15929       -15924       -15919       -15914       -15909       -7632       -7627       -7622       -7617       -7612       -7607       -7602       -7597       -7592       -7587       -7582       -7577       -7572       -7567       -7562       -7557       -15584       -15579       -15574       -15569       -15564       -15559       -15554       -15549       -15544       -15539       -15534       -15529       -15524       -15519       -15514       -15509       -7232       -7227       -7222       -7217       -7212       -7207       -7202       -7197       -7192       -7187       -7182       -7177       -7172       -7167       -7162       -7157       -15184       -15179       -15174       -15169       -15164       -15159       -15154       -15149       -15144       -15139       -15134       -15129       -15124       -15119       -15114       -15109       -6832       -6827       -6822       -6817       -6812       -6807       -6802       -6797       -6792       -6787       -6782       -6777       -6772       -6767       -6762       -6757       -14784       -14779       -14774       -14769       -14764       -14759       -14754       -14749       -14744       -14739       -14734       -14729       -14724       -14719       -14714       -14709       -6432       -6427       -6422       -6417       -6412       -6407       -6402       -6397       -6392       -6387       -6382       -6377       -6372       -6367       -6362       -6357         fdireã;")"  ^˜                      



Está grabado empleando un buble for - next y con la orden: PRINT #9,direc%

¿Cómo narices vuelvo a leer estos numeros desde CPCBASIC para meterlos en el array?

Yo he empleado esto:

Código: Seleccionar todo
DIM d%(159),m#(1439),t%(10),p#,a#,cc#,u#,i%,j%,s%,e%,a$

' Cargamos precalculos direcciones de pantalla y de los tiles
OPENIN"16x10.dir"

FOR a#=0 TO 159
    i%=VAL!(INPUT$(9))
    d%(a#)=i%
NEXT
CLOSEIN


Pero va a ser que no va.... Con las ganas que tenia yo de hacer funcionar la rutina de mapeado compilada... en fins...

Son valores INT (de direcciones de memorias que tengo precalculadas)...

Salu2!

Salu2!
Adjuntos
16X10.zip
Aqui el archivo en cuestion, sacado directamente del DSK del emulador.
(481 Bytes) 40 veces
Desconectado
Avatar de Usuario

MiguelSky

Siempre vigilo

Siempre vigilo

  • Mensajes: 4345
  • Registrado: Sab Oct 08, 2005 1:02 am

NotaVie Sep 14, 2007 7:52 pm

DaDMaN escribió:Tengo un par de rutinas en ensamblador que ya se encuentran en la memoria del CPC en sendas direcciones de memoria... El problema es que están parametrizadas, es decir... Call &4000,&552D,&C000

No se pueden pasar parámetros a dichas rutinas desde CPCBASIC?

Espero que haya algún modo pq sino, me haceis un traje, jajajjajajaja


Bueno, siempre puedes pokear los parámetros a una dirección de memoria y que la rutina los busque allí, no?
Imagen
Desconectado
Avatar de Usuario

DaDMaN

Keeper of The Forum

Keeper of The Forum

  • Mensajes: 857
  • Registrado: Jue Mar 16, 2006 10:51 pm

NotaVie Sep 14, 2007 11:03 pm

MiguelSky escribió:
DaDMaN escribió:Tengo un par de rutinas en ensamblador que ya se encuentran en la memoria del CPC en sendas direcciones de memoria... El problema es que están parametrizadas, es decir... Call &4000,&552D,&C000

No se pueden pasar parámetros a dichas rutinas desde CPCBASIC?

Espero que haya algún modo pq sino, me haceis un traje, jajajjajajaja


Bueno, siempre puedes pokear los parámetros a una dirección de memoria y que la rutina los busque allí, no?


Pokear es engorroso de narices... y pokear direcciones de memoria mucho mas (ademas de que se pierde tiempo). 2 pokes por direccion de memoria... No lo veo util.

De todos modos, creo que voy a "adaptar" la rutina con un def sub, a ver... pero aun me queda la duda de leer los archivos.

Salu2
Desconectado
Avatar de Usuario

DaDMaN

Keeper of The Forum

Keeper of The Forum

  • Mensajes: 857
  • Registrado: Jue Mar 16, 2006 10:51 pm

NotaSab Sep 15, 2007 12:14 pm

Bueno, bueno, bueno... Después de pelearme seriamente con los tipos de datos, acceso a disco y mil zarandajas, a punto he estado de enviarlo todo a "tomar por...".

Al final, he terminado metiendo los datos de 16 bits (direcciones) en datas en el mismo código y cargando el mapa directamente en memoria en formato binario con un LOAD"MAP.BIN",&6000...

La rutina de los tiles, he empleado la misma que integró Arta (que no se si es mas rápida o más lenta que la del Tom & Jerry "optimizada" que apareción en el otro hilo).

Cosas que me "joden"... He tenido que emplear tipos de variables INTEGER (la gran mayoria). Aun teniendo una variable que valga 159 no puedo emplear tipo byte, porque claro... el tipo byte va con signo desde -127 hasta 127, asi que, me ha jodido un "muchito", jajajajaja.

Imprimir valores númericos con PRINT... una aventura (con el maldito DEC$ y no se que mas)... Para depurar, al final he desistido.

Al compilar, cuando te CREA el ASM, los comentarios pueden dar errores de compilación en el WINAPE. Como te meta un comentario asi como: ;PRINT "H:" ya la has cagado, pq te mete 2 puntos en el comentario y el WINAPE no lo traga. Seria buena idea que el compilador tuviese la opcion de deshabilitar los comentarios del codigo ASM.

Resumiendo... 5 horas ayer por la noche y toda esta mañana hasta que he conseguido hacer funcionar un codigo de poco mas de 20 lineas haciendo mil adaptaciones. Hubiese merecido mucho la pena si no fuese por que la velocidad resultante ha mejorado, pero ni mucho menos como para pasar de BASIC INTERPRETADO a CPCBASIC. La pequeña (recalco lo de pequeña) mejora de velocidad no es suficiente como para tirarme 1 dia entero adaptando un codigo tan simple y con tantas pegas en cuanto a manejo de cadenas numericas y de acceso al disco a datos guardados previamente con Locomotive Basic.

Es mi parecer...

También soy un novato, asi que, seguramente podria ir mas rapido.

Os dejo el código fuente para que lo probeis y 2 snapshots. 1 funcionando en locomotive basic y el otro con la versión compilada. (Por cierto, cambiad el ORG #4000 del ASM que os genera el CPCBASIC por ORG #2000 antes de ponerlo en el winape y compilarlo. Lo llamais con CALL &2000 desde BASIC.

Salu2.

Código: Seleccionar todo
CHAIN"CPCBasic.BAS"
CHAIN"GRAFICOS.BAS"

' En lugar de meter la rutina de Arta en el codigo directamente, me he creado un "GRAFICOS.BAS" donde iré metiendo las rutinas
' nuevas para dejar el codigo lo más limpio posible. He cambiado el nombre de la rutina por la de PUT.
' El compilador genera el ASM en la dirección de compilación #4000. Cambiadlo por ORG #2000

DIM d%(159),t%(10),p#,i%,cc#,u%,s%,e%,a$

' Cargamos precalculos direcciones de pantalla y de los tiles

RESTORE direcciones
FOR i%=0 TO 159
    READ d%(i%)
NEXT

RESTORE tiles
FOR i%=1 TO 10
    READ t%(i%)
NEXT
CLOSEIN

' Cargamos mapa en memoria
LOAD "MAP.BIN",&6000

'Cargamos colores
RESTORE paleta
FOR i%=0 TO 15
    READ cc#
    INK i%,cc#
NEXT
BORDER 11

' nos movemos por el mapa o que?

MODE 0
GOSUB actmap
p#=0 'Esta variable indica la pantalla en la que nos encontramos

bucle
    a$=UPPER$(INKEY$())
    IF a$="P" AND p#<9 THEN p#=p#+1:GOSUB actmap
    IF a$="O" AND p#>0 THEN p#=p#-1:GOSUB actmap
GOTO bucle


' Dibujamos mapa en pantalla

actmap
    CLS
    s%=&6000+(144*p#)
    e%=s%+143
    u%=16
    FOR i%=s% TO e%
        IF PEEK%(i%)<>0 THEN PUT t%(PEEK%(i%)),20,5,d%(u%)
        u%=u%+1
    NEXT
    RETURN

'paleta de colores
paleta: DATA 11#,0#,1#,2#,3#,6#,9#,10#,13#,14#,15#,16#,18#,20#,25#,26#

'direcciones cuadricula 16x10
direcciones:
    DATA -16384%, -16379%, -16374%, -16369%, -16364%, -16359%, -16354%, -16349%, -16344%, -16339%, -16334%, -16329%
    DATA -16324%, -16319%, -16314%, -16309%, -8032%, -8027%, -8022%, -8017%, -8012%, -8007%, -8002%
    DATA -7997%, -7992%, -7987%, -7982%, -7977%, -7972%, -7967%, -7962%, -7957%, -15984%, -15979%
    DATA -15974%, -15969%, -15964%, -15959%, -15954%, -15949%, -15944%, -15939%, -15934%, -15929%, -15924%
    DATA -15919%, -15914%, -15909%, -7632%, -7627%, -7622%, -7617%, -7612%, -7607%, -7602%, -7597%
    DATA -7592%, -7587%, -7582%, -7577%, -7572%, -7567%, -7562%, -7557%, -15584%, -15579%, -15574%
    DATA -15569%, -15564%, -15559%, -15554%, -15549%, -15544%, -15539%, -15534%, -15529%, -15524%, -15519%
    DATA -15514%, -15509%, -7232%, -7227%, -7222%, -7217%, -7212%, -7207%, -7202%, -7197%, -7192%
    DATA -7187%, -7182%, -7177%, -7172%, -7167%, -7162%, -7157%, -15184%, -15179%, -15174%, -15169%
    DATA -15164%, -15159%, -15154%, -15149%, -15144%, -15139%, -15134%, -15129%, -15124%, -15119%, -15114%
    DATA -15109%, -6832%, -6827%, -6822%, -6817%, -6812%, -6807%, -6802%, -6797%, -6792%, -6787%
    DATA -6782%, -6777%, -6772%, -6767%, -6762%, -6757%, -14784%, -14779%, -14774%, -14769%, -14764%
    DATA -14759%, -14754%, -14749%, -14744%, -14739%, -14734%, -14729%, -14724%, -14719%, -14714%, -14709%
    DATA -6432%, -6427%, -6422%, -6417%, -6412%, -6407%, -6402%, -6397%, -6392%, -6387%, -6382%
    DATA -6377%, -6372%, -6367%, -6362%, -6357%

'direcciones de memoria de los tiles
tiles: DATA  20480%,  20580%,  20680%,  20780%,  20880%,  20980%,  21080%,  21180%,  21280%,  21380%



Aquí el codigo ASM de los TILES, compilados en &5000

Código: Seleccionar todo
;DEFINICION DE TILES
ORG &5000

SUELO1A
db &39,&39,&2C,&25,&1A
db &37,&37,&76,&35,&2F
db &37,&B9,&76,&35,&2F
db &37,&B9,&76,&35,&2F
db &BD,&FC,&2C,&0F,&2F
db &B9,&7C,&38,&3A,&1A
db &39,&7C,&38,&3A,&0F
db &39,&1C,&18,&0F,&3A
db &39,&1C,&18,&0F,&3A
db &5C,&1C,&18,&35,&3A
db &1C,&1C,&30,&1F,&2F
db &1C,&1C,&25,&2F,&0F
db &34,&24,&35,&2F,&30
db &34,&24,&35,&2F,&30
db &24,&24,&1F,&3A,&1A
db &1A,&3A,&25,&0F,&3A
db &25,&3F,&1F,&0F,&3A
db &35,&0F,&3F,&35,&2F
db &35,&0F,&3F,&35,&2F
db &0F,&1A,&0F,&0F,&2F

SUELO1B
db &25,&1A,&1C,&36,&36
db &1F,&3A,&B9,&3B,&3B
db &1F,&3A,&B9,&76,&3B
db &1F,&3A,&B9,&76,&3B
db &1F,&0F,&1C,&FC,&7E
db &25,&35,&34,&BC,&76
db &0F,&35,&34,&BC,&36
db &35,&0F,&24,&2C,&36
db &35,&0F,&24,&2C,&36
db &35,&3A,&24,&2C,&AC
db &1F,&2F,&30,&2C,&2C
db &0F,&1F,&1A,&2C,&2C
db &30,&1F,&3A,&18,&38
db &30,&1F,&3A,&18,&38
db &25,&35,&2F,&18,&18
db &35,&0F,&1A,&35,&25
db &35,&0F,&2F,&3F,&1A
db &1F,&3A,&3F,&0F,&3A
db &1F,&3A,&3F,&0F,&3A
db &1F,&0F,&0F,&25,&0F

SUELO2
db &39,&39,&1C,&36,&36
db &37,&37,&B9,&3B,&3B
db &37,&B9,&B9,&33,&3B
db &37,&B9,&B9,&33,&3B
db &BD,&FC,&1C,&B9,&7E
db &B9,&7C,&3C,&FC,&76
db &39,&7C,&3C,&FC,&36
db &39,&1C,&0C,&7C,&36
db &39,&1C,&0C,&7C,&36
db &5C,&1C,&24,&3C,&AC
db &1C,&1C,&30,&2C,&2C
db &1C,&1C,&25,&2C,&2C
db &34,&24,&35,&0C,&38
db &34,&24,&1F,&0C,&38
db &24,&24,&1F,&18,&18
db &1A,&3A,&25,&25,&25
db &25,&3F,&1F,&0F,&3A
db &35,&0F,&3F,&35,&2F
db &35,&0F,&3F,&35,&2F
db &0F,&1A,&0F,&0F,&2F

SUELO3
db &35,&0F,&3F,&25,&1A
db &1F,&25,&0F,&35,&2F
db &2F,&3F,&25,&35,&3F
db &2F,&3F,&25,&35,&2F
db &3F,&2F,&1F,&0F,&3A
db &30,&1A,&2F,&3A,&0F
db &0F,&25,&3F,&3A,&1F
db &35,&1F,&1F,&25,&2F
db &35,&1F,&35,&0F,&3A
db &1F,&1F,&0F,&35,&3A
db &2F,&1F,&1A,&1F,&2F
db &2F,&25,&0F,&2F,&1F
db &2F,&25,&1F,&2F,&35
db &2F,&1A,&1F,&2F,&30
db &2F,&2F,&35,&3A,&1A
db &1A,&3F,&25,&25,&2F
db &25,&3F,&1F,&0F,&3F
db &35,&25,&3F,&35,&3F
db &35,&0F,&3F,&35,&3F
db &0F,&1A,&0F,&0F,&2F

SUELO4A
db &C0,&39,&3C,&36,&36
db &95,&37,&33,&3B,&3B
db &95,&B9,&B9,&33,&76
db &95,&B9,&B9,&33,&76
db &BD,&FC,&B9,&B9,&FC
db &B9,&7C,&39,&B9,&FC
db &39,&7C,&7C,&39,&BC
db &39,&1C,&5C,&39,&3C
db &39,&1C,&5C,&39,&3C
db &5C,&1C,&1C,&5C,&3C
db &FC,&BC,&2C,&1C,&2C
db &33,&76,&BC,&3C,&0C
db &33,&FC,&3C,&0C,&0C
db &33,&FC,&2C,&0C,&0C
db &B9,&33,&BC,&2C,&18
db &37,&76,&FC,&3C,&18
db &33,&3C,&0C,&18,&0D
db &37,&33,&BC,&0C,&25
db &37,&33,&BC,&0C,&25
db &B9,&76,&3C,&2C,&18

SUELO4B
db &39,&39,&3C,&36,&C0
db &37,&37,&33,&3B,&6A
db &B9,&33,&76,&76,&6A
db &B9,&33,&76,&76,&6A
db &FC,&76,&76,&FC,&7E
db &FC,&76,&36,&BC,&76
db &7C,&36,&BC,&BC,&36
db &3C,&36,&AC,&2C,&36
db &3C,&36,&AC,&2C,&36
db &3C,&AC,&2C,&2C,&AC
db &1C,&2C,&1C,&7C,&FC
db &0C,&3C,&7C,&B9,&33
db &0C,&0C,&3C,&FC,&33
db &0C,&0C,&1C,&FC,&33
db &24,&1C,&7C,&33,&76
db &24,&3C,&FC,&B9,&3B
db &0E,&24,&0C,&3C,&33
db &1A,&0C,&7C,&33,&3B
db &1A,&0C,&7C,&33,&3B
db &24,&1C,&3C,&B9,&76

SUELO5A
db &B9,&BC,&0C,&30,&0F
db &33,&76,&3C,&18,&25
db &37,&33,&BC,&2C,&18
db &37,&33,&BC,&2C,&18
db &B9,&FC,&2C,&18,&0F
db &FC,&3C,&0C,&30,&25
db &33,&FC,&3C,&0C,&18
db &37,&76,&2C,&18,&25
db &37,&76,&2C,&18,&25
db &FC,&3C,&0C,&18,&25
db &B9,&76,&3C,&2C,&18
db &37,&33,&BC,&0C,&25
db &33,&BC,&0C,&18,&25
db &33,&BC,&0C,&18,&25
db &37,&76,&FC,&2C,&18
db &B9,&33,&BC,&2C,&25
db &33,&FC,&2C,&0C,&18
db &33,&76,&BC,&38,&25
db &33,&FC,&BC,&38,&25
db &FC,&BC,&2C,&18,&0F

SUELO5B
db &0F,&30,&0C,&7C,&76
db &1A,&24,&3C,&B9,&33
db &24,&1C,&7C,&33,&3B
db &24,&1C,&7C,&33,&3B
db &0F,&24,&1C,&FC,&76
db &1A,&30,&0C,&3C,&FC
db &24,&0C,&3C,&FC,&33
db &1A,&24,&1C,&B9,&3B
db &1A,&24,&1C,&B9,&3B
db &1A,&24,&0C,&3C,&FC
db &24,&1C,&3C,&B9,&76
db &1A,&0C,&7C,&33,&3B
db &1A,&24,&0C,&7C,&33
db &1A,&24,&0C,&7C,&33
db &24,&1C,&FC,&B9,&3B
db &1A,&1C,&7C,&33,&76
db &24,&0C,&1C,&FC,&33
db &1A,&34,&7C,&B9,&33
db &1A,&34,&7C,&FC,&33
db &0F,&24,&1C,&7C,&FC

PLATAFORMA1
db &30,&30,&30,&30,&30
db &B5,&2F,&D0,&3F,&9A
db &2F,&5A,&35,&CF,&B0
db &2F,&0F,&35,&CF,&9A
db &0F,&5A,&65,&CF,&B0
db &A5,&F0,&D0,&DA,&B0
db &30,&30,&C0,&C0,&30
db &6F,&95,&2F,&95,&1A
db &6F,&35,&0F,&35,&1A
db &DA,&35,&5A,&25,&B0
db &CF,&25,&0F,&25,&1A
db &DA,&25,&5A,&25,&B0
db &F0,&85,&F0,&70,&B0
db &60,&C0,&C0,&30,&90
db &B5,&6F,&D0,&3F,&1A
db &6F,&DA,&35,&0F,&B0
db &6F,&CF,&35,&0F,&1A
db &CF,&DA,&25,&0F,&B0
db &E5,&F0,&D0,&5A,&B0
db &30,&30,&30,&30,&30

PLATAFORMA2
db &0C,&0C,&0C,&0C,&0C
db &F9,&A3,&C4,&C3,&AC
db &A3,&56,&49,&FC,&8C
db &A3,&03,&49,&FC,&AC
db &03,&56,&5C,&FC,&8C
db &A9,&FC,&C4,&EC,&8C
db &0C,&0C,&C0,&C0,&0C
db &D6,&D1,&A3,&D1,&06
db &D6,&59,&03,&59,&06
db &EC,&59,&56,&09,&AC
db &FC,&09,&03,&09,&06
db &EC,&09,&56,&09,&AC
db &CC,&81,&FC,&5C,&AC
db &48,&C0,&C0,&0C,&84
db &C9,&D6,&D4,&F3,&06
db &D6,&EC,&59,&03,&AC
db &D6,&FC,&59,&03,&06
db &FC,&EC,&09,&03,&AC
db &DC,&CC,&D4,&56,&AC
db &0C,&0C,&0C,&0C,&0C
Adjuntos
mapa.png
Lo que deberiais ver
mapa.png (3.09 KiB) Visto 983 veces
snapshots_BASIC_CPCBASIC.zip
Aqui dentro están: MAPA.SNA (version BASIC) y MAPA_COMPI.SNA (version compilada)
(14.14 KiB) 42 veces
Desconectado
Avatar de Usuario

dinoneno

Megaforero

Megaforero

  • Mensajes: 247
  • Registrado: Mié Sep 13, 2006 6:32 am
  • Ubicación: Toledo

NotaSab Sep 15, 2007 6:52 pm

Hola DaDMaN. Primero felicitarte por la buena pinta que tiene el juego que parece que estás haciendo, yo soy un zoquete con los gráficos y me da envidia el aspecto que has dado estas muestras que nos has puesto. Te agradezco que hayas confiado en el CPCBasic para programarlo y siento que te haya desquiciado un poco las peculiaridades de éste respecto al Locomotive Basic, pero voy a intentar responderte a las cuestiones que planteas. E igualmente siento que se te hayan ido tantas horas en desarrollar este pequeño programa, más teniendo en cuenta que yo tampoco cuento con mucho tiempo y sé que desperdiciar simplemente una hora por una problema que luego tiene una solución ridícula sienta muy mal. Espero al menos que lo aprendido en esas horas sirva para próximos casos similares que te vayan apareciendo.

Primero, dirigido a todos, decir que CPCBasic siempre he dicho que está "basado" en Locomotive Basic, pero no es un compilador directo del BASIC nativo del CPC, y ya estais viendo que necesita un cierto periodo de aprendizaje y adaptación. Espero que en los programas que podais estar desarrollando valga la pena la adaptación, pero yo mismo, si viera que me trajera más complicaciones que ventajas usar el CPCBasic pues usaría el intérprete nativo o lo hago directamente en ensamblador, sin dudarlo.

Bueno, y respecto a los puntos que señala DaDMaN decir:

- CALL no acepta parámetros en CPCBasic. Como al final parece que has hecho, lo mejor es crear con DEF SUB un procedimiento.

- Pensé en su momento admitir un parámetro para el compilador para indicar la dirección de memoria que pondría en la instrucción ORG inicial, pero durante las pruebas me di cuenta que a veces, si se compilaba por debajo de &4000 o por encima de &C000 (fuera de los 32K centrales) las cosas no funcionaban bien (y no llegué a entender por qué). Así que decidí dejar fijo el origen en &4000. De cualquier modo, basta cambiar en el fichero ASM generado este valor para ensamblar en cualquier otra dirección. A pesar de lo que digo retomo la idea de permitir añadir un parámetro en la llamada del compilador para indicar directamente una dirección de origen del ensamblado; espero poder hacerlo en breve.

- El archivo 16X10.DIR que estabas intentado cargar debería tener cada valor en una línea diferente, pues cada INPUT$ de CPCBasic lee una línea completa (otra diferencia, lo siento). Quizás para generarlo has añadido una coma al final de cada PRINT#9. Adjunto un archivo con el fichero16X10.DIF como debería estar, un DSK con el fichero ya incluído y un programita en CPCBasic para verificar la lectura de este fichero.

- Como bien dices, una variable que pueda contener un valor hasta 159 debe ser entera, no byte. Las variables byte admiten de -128 a +127, igual que las enteras admiten de -32768 a +32767 y no podrían tener un valor de 40000 aunque éste se pueda almacenar en 16 bits (pero no en complemento a 2).

- La verdad es que usar DEC$ puede llegar a ser engorroso comparado con el PRINT del Locomotive Basic, pero es así: PRINT en CPCBasic recibe una expresión de cadena de texto y así hay que especificarlo. Sería buena idea crear una orden PRINTN (print number, por ejemplo) que recibiese un parámetro numérico. Estoy pensando en crear una nueva librería complementaria de la CPCBasic.BAS para órdenes y funciones no existentes en Locomotive Basic pero que puedan ser útiles en las aplicaciones, como esta PRINTN y otras que fueseis desarrollando, puedan ser de interés general y me diesesis el permiso para incluirlas.

- Es verdad eso que ocurre con el WinAPE, interpreta los dos puntos como separador de sentencias, aunque sea dentro de un comentario. Los comentarios en CPCBasic se generan teniendo en cuenta que un punto y coma define un comentario que llega incondicionalmente hasta el final de la línea, y así lo toman el pasmo, el ensamblador del WinCPC y el DEVPAC, que son los que conozco mayormente. Esto creo que es un problema del WinAPE y se le podría notificiar a su autor para corregir en una nueva versión, igual que corregir las teclas de atajo que figuran en los menús de la versión 2.0.13 como el F5 que pone en Autotype :). Yo utilizaría el WinCPC que ademas ensambla mucho más rápido. Lo de una opción en el CPCBasic para omitir los comentarios correspondientes a la instrucción fuente que se está ensamblando también sería una buena idea que me apunto, porque a veces es demasiado engorroso tanto comentario.

Pues creo que no olvido nada para DaDMaN (gracias de nuevo por tus sugerencias), y si se me olvida algo o no os parece bien alguna de mis ideas, como siempre espero vuestros comentarios.

Saludo para todos.
Adjuntos
16X10.rar
(1.86 KiB) 40 veces
AnteriorSiguiente

¿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