CPCBasic: Compilador cruzado de BASIC
La funcion funciona cojonujdaY ya que me he picado con esto. ¿Cómo puedo imprimir el resultado de esa función? Si hago el print normal no me deja y si lo convierto a cadena se bloquea. ¿?
Vale, ahí me has dao, my darling. Pon int y ya tá. La función ira igual de bien (o de mal).Ya cariño, tu no lo miras... pero si yo hago:
For x#=0 to 199
bla bla bla
next
La cosa en CPCBASIC no funciona (no recorre el bucle), pq 199 le da como resultado negativo... es una historia del copon xD
Lo pondré en INT a ver que tal
El tema del print, es algo con lo que yo ando mosqueado.
No se pueden imprimir valores numéricos, tan solo cadenas de texto... duro, pero real.
Yo para la prueba lo he resuelto así:
Código: Seleccionar todo
CHAIN"CPCBASIC.BAS"
CHAIN"GRAFICOS.BAS"
dim x%,y%,char$
mode 2
for y%=0 to 199
for x%=0 to 80
char$=hex$(xydir%(x%,y%),4)
print char$
print
next
next
end
Un poco más abreviado se pude hacer PRINT HEX$(XYDIR%(X%,Y%),4):PRINT, sustituyendo el código del bucle x%. Por cierto, si se utilizan todas o casi todas las variables de tipo entero, se puede hacer un DEFINT A-Z la principio y así es más cómoda la escritura del código.No se pueden imprimir valores numéricos, tan solo cadenas de texto... duro, pero real.
Yo para la prueba lo he resuelto así:
Código: Seleccionar todo
CHAIN"CPCBASIC.BAS"
CHAIN"GRAFICOS.BAS"
dim x%,y%,char$
mode 2
for y%=0 to 199
for x%=0 to 80
char$=hex$(xydir%(x%,y%),4)
print char$
next
next
end
Me alegro que funcione, tronco. Si vas a convertir alguna rutineja más tienes que tener en cuenta lo que hemos hecho a esta última. Para la librería C los valores van en la pila, por lo tanto, se recojen de ella directamente. Para la librería en Basic, én la pila está la posición donde están los valores, por eso he añadido una búsqueda más:
Pongo en HL el valor que hay en la pila (2º parámetro)
cogo el valor que hay en HL y lo pongo en A
Y
De todas formas si tienes algún problemo y te podemos ayudar, aquí estamos.
Código: Seleccionar todo
"LD IX,2"+ _
"ADD IX,SP"+ _
"LD L,(IX+2)" + _
"LD H,(IX+3)" + _
Código: Seleccionar todo
"LD A,(HL)" + _
Y
Código: Seleccionar todo
lo mismo para el primer parámetro:
"LD L,(IX+0)"+ _
"LD H,(IX+1)"+ _
"LD L,(HL)" + _
...
Salu2,
Arta
Arta
Tomo nota. Se ve que no me conozco todavía este BASICUn poco más abreviado se pude hacer PRINT HEX$(XYDIR%(X%,Y%),4):PRINT, sustituyendo el código del bucle x%. Por cierto, si se utilizan todas o casi todas las variables de tipo entero, se puede hacer un DEFINT A-Z la principio y así es más cómoda la escritura del código.
Salu2,
Arta
Arta
Acabo de ver que teniais dudas sobre el CALL _RESERVAR_HEAP. Es una rutina de uso interno que podeis aprovechar en las órdenes y funciones que definais y sirve para reservar en la memoria dinámica que usa el CPCBasic un cierto número de bytes, por ejemplo para almacenar en ellos el valor de retorno de una función. Se puede usar dando en A el número de bytes a reservar y en HL el valor #FFFF para indicar que es un espacio temporal, hasta que se use CALL _COMPACTAR_HEAP que libera todos los espacios temporales reservados.
Okis, entendido lo de heap.
DaD, me imagino que la rutina la vas a usar mucho así que, en vez de usar una posición variable con el heap, usar una posición fija para devolver los datos, algo de tiempo se ganará.
DaD, me imagino que la rutina la vas a usar mucho así que, en vez de usar una posición variable con el heap, usar una posición fija para devolver los datos, algo de tiempo se ganará.
Código: Seleccionar todo
DEF FN XYDIR%(%,%)= _
"LD IX,2"+ _
"ADD IX,SP"+ _
"LD L,(IX+2)" + _
"LD H,(IX+3)" + _
"LD A,(HL)" + _
"LD L,(IX+0)"+ _
"LD H,(IX+1)"+ _
"LD L,(HL)" + _
"_inicio_rutina"+ _
"LD (_inc_ancho+1),A"+ _
"LD A,L"+ _
"SRL A"+ _
"SRL A"+ _
"SRL A"+ _
"LD D,A"+ _
"SLA A"+ _
"SLA A"+ _
"SLA A"+ _
"SUB L"+ _
"NEG"+ _
"LD E,A"+ _
"LD L,D"+ _
"LD H,0"+ _
"ADD HL,HL"+ _
"LD BC,BLOQUES"+ _
"ADD HL,BC"+ _
"LD C,(HL)"+ _
"INC HL"+ _
"LD H,(HL)"+ _
"LD L,C"+ _
"PUSH HL"+ _
"LD D,0"+ _
"LD HL,SUB_BLOQUES"+ _
"ADD HL,DE"+ _
"LD A,(HL)"+ _
"POP HL"+ _
"ADD H"+ _
"LD H,A"+ _
"_inc_ancho"+ _
"LD E,0"+ _
"ADD HL,DE"+ _
"EX DE,HL"+ _
"LD HL,RESULTADO" + _
"LD (HL),E"+ _
"INC HL"+ _
"LD (HL),D"+ _
"DEC HL"+ _
"RET"+ _
"BLOQUES"+ _
"dw &C000,&C050,&C0A0,&C0F0,&C140,&C190,&C1E0,&C230,&C280,&C2D0"+ _
"dw &C320,&C370,&C3C0,&C410,&C460,&C4B0,&C500,&C550,&C5A0,&C5F0"+ _
"dw &C640,&C690,&C6E0,&C730,&C780"+ _
"SUB_BLOQUES"+ _
"db &00,&08,&10,&18,&20,&28,&30,&38"+ _
"RESULTADO"+ _
"dw 0"
Salu2,
Arta
Arta
Buena idea lo de almacenar el valor en una posición fija, es cierto que se gana velocidad. Pero sólo un inconveniente, que no puede ser reentrante en la misma expresión, es decir, que así no se puede utilizar varias veces en la misma expresión. Por ejemplo Res%=XYDir%(0,0)-XYDir%(5,5) daría resultados inesperados. Si no se va a utilizar la función de esta forma, pues perfecto.DaD, me imagino que la rutina la vas a usar mucho así que, en vez de usar una posición variable con el heap, usar una posición fija para devolver los datos, algo de tiempo se ganará.
Buena idea lo de almacenar el valor en una posición fija, es cierto que se gana velocidad. Pero sólo un inconveniente, que no puede ser reentrante en la misma expresión, es decir, que así no se puede utilizar varias veces en la misma expresión. Por ejemplo Res%=XYDir%(0,0)-XYDir%(5,5) daría resultados inesperados. Si no se va a utilizar la función de esta forma, pues perfecto.DaD, me imagino que la rutina la vas a usar mucho así que, en vez de usar una posición variable con el heap, usar una posición fija para devolver los datos, algo de tiempo se ganará.
Sí creo que se podría ganar velocidad al tomar los parámetros quizás con esto (si no me equivoco):
Código: Seleccionar todo
"LD HL,6" + _
"ADD HL,SP ; HL = SP+6" + _
"LD A,(HL) ; A = byte bajo de primer parámetro" + _
"DEC HL" + _
"DEC HL" + _
"LD L,(HL) ; L = byte bajo de segundo parámetro" + _
...
Última edición por dinoneno el Mar 18 Sep , 2007 6:27 pm, editado 1 vez en total.
Caramba, es bueno saberlo. ¿no recoge el valor en cada paso? ¿cómo evalúa el compilador esa expresión?Buena idea lo de almacenar el valor en una posición fija, es cierto que se gana velocidad. Pero sólo un inconveniente, que no puede ser reentrante en la misma expresión, es decir, que así no se puede utilizar varias veces en la misma expresión. Por ejemplo Res%=XYDir%(0,0)-XYDir%(5,5) daría resultados inesperados. Si no se va a utilizar la función de esta forma, pues perfecto.DaD, me imagino que la rutina la vas a usar mucho así que, en vez de usar una posición variable con el heap, usar una posición fija para devolver los datos, algo de tiempo se ganará.
Salu2,
Arta
Arta
Probaré esa rutina a ver
A ver... ya tengo un sprite moviendose suavemente por la pantalla...
Ahora me surgen varias dudas MUY importantes:
Amos a ver... el bicho restaura el fondo y toda la pesca... pero al moverse, parpadea del carajo!
Entonces se me ha ocurrido esperar al Vsync antes de poner el sprite en pantalla...
Así:
ponsprite
PUT_TILE @buffer#(0),20,5,XYDIR%(xb%,yb%)
GET_TILE @buffer#(0),20,5,XYDIR%(x%,y%)
CALL &BD19
PUT_TILE t%(9),20,5,XYDIR%(x%,y%)
xb%=x%
yb%=y%
RETURN
Entonces va suave de cojones... hasta que llega a la parte baja de la pantalla, que curiosamente, desaparece el sprite hasta que no dejo de moverlo...
Si pongo el call &bd19 justo al principio de la rutina, ocurre lo mismo pero en la parte superior...
Voy apañao! Como arreglo esto? O me voy a tener que conformar con sprites parpadeantes de la muerte??
A ver... ya tengo un sprite moviendose suavemente por la pantalla...
Ahora me surgen varias dudas MUY importantes:
Amos a ver... el bicho restaura el fondo y toda la pesca... pero al moverse, parpadea del carajo!
Entonces se me ha ocurrido esperar al Vsync antes de poner el sprite en pantalla...
Así:
ponsprite
PUT_TILE @buffer#(0),20,5,XYDIR%(xb%,yb%)
GET_TILE @buffer#(0),20,5,XYDIR%(x%,y%)
CALL &BD19
PUT_TILE t%(9),20,5,XYDIR%(x%,y%)
xb%=x%
yb%=y%
RETURN
Entonces va suave de cojones... hasta que llega a la parte baja de la pantalla, que curiosamente, desaparece el sprite hasta que no dejo de moverlo...
Si pongo el call &bd19 justo al principio de la rutina, ocurre lo mismo pero en la parte superior...
Voy apañao! Como arreglo esto? O me voy a tener que conformar con sprites parpadeantes de la muerte??
Por supuesto....
Te adjunto un RAR con los fuentes (menos el de los tiles, que se me ha olvidao, pero te lo dejo aquí escrito) y con la biblioteca GRAFICOS.BAS
La definicion de tiles (en &5000)
Y el programa de CPCBASIC que mueve todo el cotarro. Después de compilarlo, modifica el ASM y cambialo a ORG &2000 (sino, sobreescribe los tiles)
Te adjunto un RAR con los fuentes (menos el de los tiles, que se me ha olvidao, pero te lo dejo aquí escrito) y con la biblioteca GRAFICOS.BAS
La definicion de tiles (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
Código: Seleccionar todo
CHAIN"CPCBasic.BAS"
CHAIN"GRAFICOS.BAS"
dim t%(10),i%,cc#,mov#,x%,xb%,y%,yb%,a$
dim buffer#(99)
'Cargamos precalculos direcciones de los tiles
RESTORE tiles
FOR i%=1 TO 10
READ t%(i%)
NEXT
'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
SPEEDKEY 1,1
x%=39
y%=99
xb%=x%
yb%=y%
GET_TILE @buffer#(0),20,5,XYDIR%(x%,y%)
GOSUB ponsprite
bucle
a$=UPPER$(INKEY$())
IF a$="P" THEN x%=x%+1:mov#=1:IF x%>74 THEN x%=74
IF a$="O" THEN x%=x%-1:mov#=1:IF x%<0 THEN x%=0
IF a$="Q" THEN y%=y%-2:mov#=1:IF y%<0 THEN y%=0
IF a$="A" THEN y%=y%+2:mov#=1:IF y%>179 THEN y%=179
IF mov#=1 THEN mov#=0:GOSUB ponsprite
GOTO bucle
' Dibujamos mapa en pantalla
ponsprite
PUT_TILE @buffer#(0),20,5,XYDIR%(xb%,yb%)
GET_TILE @buffer#(0),20,5,XYDIR%(x%,y%)
CALL &BD19
PUT_TILE t%(9),20,5,XYDIR%(x%,y%)
xb%=x%
yb%=y%
RETURN
'paleta de colores
paleta: DATA 11#,0#,1#,2#,3#,6#,9#,10#,13#,14#,15#,16#,18#,20#,25#,26#
'direcciones de memoria de los tiles
tiles: DATA 20480%, 20580%, 20680%, 20780%, 20880%, 20980%, 21080%, 21180%, 21280%, 21380%
- Adjuntos
-
- CPCBASIC.rar
- Aqui dentro están los fuentes y la biblioteca GRAFICOS.BAS
- (14.76 KiB) Descargado 121 veces
Pues lo que es el programa en Basic está perfecto. Y las rutinas seguramente también porque funciona en casi toda la pantalla sin ningún problema. Tampoco debe ser algo de la rutina BB19. Aún si la quitas, cuando la piedra llega a esa zona inferior o superior el programa también hace algo extraño, como que parpadea más el sprite. A ver si alguien más experto sabe decirte algo porque yo no encuentro nada extraño.
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro
La Comunidad Española |