FAQ  •  Register  •  Login

Radastan mode in ZX Basic

<<

symbolshift

Posts: 8

Joined: Mon Oct 17, 2016 10:06 am

Post Mon Oct 17, 2016 10:29 am

Radastan mode in ZX Basic

Hi everyone !

I'm new to this forum. Been using Boriel's Basic for about a year and now that I own a ZXUNO would like to use the Radastan Mode for making simple games.

I've read an old topic with a Plot routine. Are there more I could use? I know there is a kit in C by Radastan himself, but I'd be happy if I could continue programming with ZX Basic.

Thanks in advance and THANK YOU Boriel for bringing me back the joy of writing programs for my beloved ZX Spectrum.
<<

LCD

Posts: 596

Joined: Fri Feb 13, 2009 3:11 pm

Location: Vienna, Austria

Post Mon Oct 24, 2016 8:59 am

Re: Radastan mode in ZX Basic

I adapted the PLOT routine from Z88dk to ZXBC and also 8x8 and 10x10 PUT. (No transparency. This was not made in Assembler). Also the new version of BorIDE will support ZesareUX Emulator, which emulates the Radestan Modes and SPECTRA. So this will be suitable to develop also for Spectrum Next.
Will add the routines here later. Too much work ...
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
<<

LCD

Posts: 596

Joined: Fri Feb 13, 2009 3:11 pm

Location: Vienna, Austria

Post Mon Oct 24, 2016 10:55 pm

Re: Radastan mode in ZX Basic

  Code:
sub UnoSetSpeed(mode) '0=3.5 Mhz, 1=7 MHz, 2=14 MHz, [3=28 MHz]
   out 36411,mode
end sub


  Code:
sub RadastanSprite(x as ubyte, y as ubyte,address as uinteger)

' 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 E,(IX+5)         ;' get x value
   ld D,(IX+7)         ;' get y value
   LD L,(IX+8)             ;' data address
   LD H,(IX+9)

        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
RadSptDrw:
                                    ;' dibujamos 8 pixels (4 bytes)
        ld      c, 4    ;' 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    RadSptDrw
   end asm
end sub


  Code:
sub StartRadastanMode()
    out 48955,64  'ULAplus reg. $40, bits 0 and 1 set to 1
    out 65339,3
      if in(65339)<>3
         OUT 64571,64
         OUT 64827,3
      end if
end sub


  Code:
sub RadastanSprite10(x as ubyte, y as ubyte,address as uinteger)
' {
'    // -------------------------------------------
'    // RUTINA DE IMPRESION DE UN SPRITE 10x10 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 E,(IX+5)         ;' get x value
      ld D,(IX+7)         ;' get y value
      LD L,(IX+8)             ;' data address
      LD H,(IX+9)
      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,10      ;' Indicamos que vamos a pintar 10 líneas
      RadastanSprite10draw3:      ;' dibujamos 10 pixels (5 bytes)
      ld c,5      ;' Indicamos que vamos a pintar 5 pares de pixels
      ldi
      ldi
      ldi
      ldi
      ldi
      ld a,e
      add a,59   ;' incrementamos una línea y retornamos los pixels dibujados
      ld e,a
      jr nc, RadastanSprite10sigue3
      inc d      ;' incrementamos D si sale acarrero al incrementar E en 64 bytes
   RadastanSprite10sigue3:
      djnz RadastanSprite10draw3
end asm
end sub


  Code:
sub rplot(x as ubyte,y as ubyte,color as ubyte)
   asm
      ld D,(IX+7)
      ld E,(IX+5)         ;' get x value
      rr e      ;' quitamos el valor de las unidades (los pixels van de dos en dos por byte)
      ld a,0
      jr c, rplotnext   ;' si es impar no hacemos nada (se dibuja por defecto a la derecha)
      ld a,1
   rplotnext:
      LD L,(IX+9)
      ld h,a
      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 a,(de)
      rr h
      jr c, rplotnext2
      and 240
      or l
      jr rplotfin
   rplotnext2:
      and 15
      rl l
      rl l
      rl l
      rl l
      or l
   rplotfin:
      ld (de), a      
   end asm
end sub
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!
<<

symbolshift

Posts: 8

Joined: Mon Oct 17, 2016 10:06 am

Post Tue Oct 25, 2016 5:10 pm

Re: Radastan mode in ZX Basic

Thank you so much, this is quite encouraging !

Looking forward to your new BorIDE.
<<

symbolshift

Posts: 8

Joined: Mon Oct 17, 2016 10:06 am

Post Wed May 10, 2017 10:59 am

Re: Radastan mode in ZX Basic

Hello!

I've tried and tried the Radastan Sprites code, it doesn't seem to work. Coordinates are right, but it puts nonsense pixels on the screen and the sprite data seems random. I'm afraid it's me who doesn't use it properly. Could anyone post an example of code to put a sprite in Radastan Mode using the above routines ?

Thanks in advance for your help.
<<

symbolshift

Posts: 8

Joined: Mon Oct 17, 2016 10:06 am

Post Wed May 10, 2017 11:01 am

Re: Radastan mode in ZX Basic

BTW, plot routine works perfectly.
<<

symbolshift

Posts: 8

Joined: Mon Oct 17, 2016 10:06 am

Post Wed May 10, 2017 4:37 pm

Re: Radastan mode in ZX Basic

My apologies. Sprites routine works. I just used it wrongly.
<<

LCD

Posts: 596

Joined: Fri Feb 13, 2009 3:11 pm

Location: Vienna, Austria

Post Fri Jun 30, 2017 5:26 pm

Re: Radastan mode in ZX Basic

:D
------------------------------------------------------------
http://lcd-one.da.ru redirector is dead
Visit my http://members.inode.at/838331/index.html home page!

Return to How-To & Tutorials

Who is online

Users browsing this forum: No registered users and 1 guest

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by Vjacheslav Trushkin for Free Forums/DivisionCore.

phpBB SEO