Por cierto, tengo que correr ANTES alguna demo radastaniana para que muestre esto, porque si nó sólo me sale la pantalla en negro

Si uso el mismo cargador que las demás demos, me aparece esto:
Juas, me acabo de dar cuenta que soy un máquina colgando spectrums!
Voy a limpiar un poco el código de basura y lo subo para que le echéis un ojo si estáis aburridos.
-- Actualizado 26 May 2015, 19:49 --
Por cierto, hay una línea que no sé traducirla a zxbasic:
#pragma output STACKPTR=65000
Juraría que tiene que ver con la pila, pero no sé si es necesaria o no, igual vienen por ahí los tiros...
Os adjunto lo que me ha salido traduciendo a pelo el código de Radastán, empiezo por motorzxuno.h (ahora motorzxuno.bas):
Código: Seleccionar todo
' motorzxuno.bas
' Los bits del color de paleta van en forma GGGRRRBB
' Los pixels en cada byte van invertidos, el segundo es el primero (al ser los bits de menos peso)
' Es decir 22221111 es el formato de los bits de pixel en cada byte
' Funciones:
' ___________________________________________
' Borra la pantalla a un color
' ___________________________________________
SUB borra (color AS UBYTE)
ASM
ld hl,2 ;pasamos la variable de entrada al acumulador
add hl,sp
ld a, (hl)
rla ;rotamos 4 bits a la izquierda
rla
rla
rla ;ya tenemos el color del primer pixel
add a, (hl) ;añadimos el color del segundo pixel
ld hl, 16384
ld de, 16385
ld bc, 6143
ld (hl), a
ldir
END ASM
END SUB
' ___________________________________________
' Delay, produce una pausa en el programa
' ___________________________________________
SUB delay (pausa AS UINTEGER)
ASM
ld hl,2
add hl,sp
ld c, 0
ld b, 2
uno: ld e, (hl) ;operando base
ld d, 0
dos: halt
dec de
ld a,d
or e
jp nz,dos
dec bc
ld a,b
or c
jp nz,uno
END ASM
END SUB
' ___________________________________________
' Función para sacar un dato por un puerto
' ___________________________________________
SUB portOut (port AS UINTEGER, value AS UBYTE)
ASM
ld hl,2
add hl,sp
ld a, (hl)
inc hl
inc hl
ld c, (hl)
inc hl
ld b, (hl)
out (c),a
END ASM
END SUB
' ___________________________________________
' Definir paleta de color
' ___________________________________________
SUB escribePaleta (indice AS UBYTE, color AS UBYTE)
' Los bits del color van en forma GGGRRRBB
portOut (48955, indice)
portOut (65339, color)
END SUB
' ___________________________________________
' Función para leer un puerto
' ___________________________________________
SUB portIn (port AS UINTEGER)
ASM
ld b, h
ld c, l
ld h, 0
in l, (c)
END ASM
END SUB
' ___________________________________________
' Espera interrupción y para la CPU
' ___________________________________________
SUB waitInt ()
ASM
halt
END ASM
END SUB
' ___________________________________________
' Posiciona un Sprite de 8x8 a color
' ___________________________________________
SUB putSpritex8 (posicion AS UINTEGER, x AS UBYTE, y AS UBYTE)
' -------------------------------------------
' RUTINA DE IMPRESION DE UN SPRITE 8x8 PIXELS
' EN CUALQUIER POSICION DE BYTES (cada byte dos pixels horizontales)
' ENTRADAS:
' D será la posición del cursor vertical en pixels
' E será la posición del cursor horizontal en parejas de pixels
' HL es la posición de memoria donde tenemos el sprite
' SALIDAS: se escribe en el mapa de pantalla
' ADVERTENCIAS: no comprueba límites de pantalla
' -------------------------------------------
ASM
ld hl,2 ; Pasamos la variable de entrada al acumulador
add hl,sp
ld d, (hl) ; D es el valor Y
inc hl
inc hl
ld e, (hl) ; E es el valor X
inc hl
inc hl
ld a, (hl)
inc hl
ld h, (hl)
ld l, a ; HL es el puntero al sprite
ld a, d ; recuperamos el valor vertical
rrca
rrca ; rotamos para dejar su valor en múltiplos de 64 (linea, de dos en dos pixels)
and 192 ; borramos el resto de bits por si las moscas
or e ; sumamos el valor horizontal
ld e, a ; e preparado
ld a, d ; cargamos el valor vertical
rrca
rrca ; rotamos para quedarnos con los bits altos
and 63 ; borramos el resto de bits
or 64 ; nos posicionamos a partir de 16384 (16384=64+0 en dos bytes)
ld d, a ; d preparado, ya tenemos la posición en pantalla
ld b,8 ; Indicamos que vamos a pintar 8 líneas
draw: ld c,4 ; dibujamos 8 pixels (4 bytes) e indicamos que vamos a pintar 4 pares de pixels
ldi
ldi
ldi
ldi
ld a,e
add a,60 ; incrementamos una línea y retornamos los pixels dibujados
ld e,a
jr nc, sigue
inc d ; incrementamos D si sale acarrero al incrementar E en 64 bytes
sigue: djnz draw
END ASM
END SUB
juego.c (juego.bas):
Código: Seleccionar todo
' juego.bas
' Esqueleto de juegos de Radastan "traducido" a ZX Basic
' version 0.1 beta
#include "sprites.bas"
#include "lib\motorzxuno.bas"
'#pragma output STACKPTR=65000 ' <<<<<< ni idea de cómo usar esto en ZX Basic, sirve para algo?
DIM paleta(15) As UByte => {0,1,7,99,4,116,12,24,13,31,64,132,180,252,221,255}
DIM i As UByte
SUB main ()
borra (3)
' Inicializamos el modo Radastaniano
portOut (48955,64)
portOut (65339,3)
' Definimos la paleta
for i=0 to 15
escribePaleta (i, paleta(i))
next i
' Limite sprites x=60 e y=88
for i=0 to 60 step 4
putSpritex8 (@spriteTile3,i,80)
putSpritex8 (@spriteTile1,i,88)
next i
putSpritex8 (@spriteTile2,24,72)
putSpritex8 (@spriteTile3,28,72)
putSpritex8 (@spriteTile4,32,72)
end sub
BORDER 2
main ()
y para acabar sprites.h (sprites.bas):
Código: Seleccionar todo
' sprites.bas
spriteTile0:
ASM
DEFB 51, 51, 51, 51
DEFB 51, 51, 51, 51
DEFB 51, 51, 51, 51
DEFB 51, 51, 51, 51
DEFB 51, 51, 51, 51
DEFB 51, 51, 51, 51
DEFB 51, 51, 51, 51
DEFB 51, 51, 51, 51
END ASM
spriteTile1:
ASM
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
END ASM
spriteTile2:
ASM
DEFB 58, 187, 187, 170
DEFB 171, 187, 187, 186
DEFB 187, 164, 75, 68
DEFB 164, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
END ASM
spriteTile3:
ASM
DEFB 170, 170, 170, 170
DEFB 171, 186, 171, 186
DEFB 75, 180, 68, 180
DEFB 75, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
END ASM
spriteTile4:
ASM
DEFB 170, 187, 187, 163
DEFB 171, 187, 187, 186
DEFB 68, 187, 74, 187
DEFB 68, 75, 68, 171
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
DEFB 68, 68, 68, 68
END ASM
spriteZulu:
ASM
DEFB 243, 63, 243, 63, 243, 51
END ASM
Y ya para mayor comodidad el zip con los tres archivos