Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Radastan mode in ZX Basic
#3
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!
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 2 Guest(s)