Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 467
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias dadas: 2 veces
Gracias recibidas: 184 veces
Contactar:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor explorer » 06 Nov 2018, 22:40

Acabo de ver que en el motor NIRVANA+ hay una rutina parecida, pero especializada en pintar un bitmap 8×8 pero solo si está en una línea par.

Utiliza un par de trucos interesantes para hacerlo más corto.

Código: Seleccionar todo

; draw bitmap lines

REPT 3                  ; repetimos 3 veces
    REPT 2              ; repetimos 2 veces
        ld  a, (hl)     ; un byte del sprite
        ld  (de), a     ; a pantalla

        inc hl          ; siguiente byte del sprite
        inc d           ; un scanline más abajo (010TTSSS)
    ENDM

; Ajuste de la dirección en pantalla
; Se hace cada dos bytes pintados

        ld  a, d        ; ver si hemos pasado de fila
        and 7           ; valor del scanline
        jr  nz, $+11    ; aún no es 0. Ir al siguiente "ld a, (hl)"

; Hemos terminado la fila, pasamos a la siguiente

        ld  a, e        ; el byte bajo de la dirección contiene el número
                        ;    de fila y el número de columna:  RRRCCCCCC

        sub -32         ; bajamos una fila
                        ; esta sentencia equivale a "sub 224"
                        ;   Si fC es 0, estamos en fila 1 del tercio
                        ;   Si fC es 1, aún estamos dentro del tercio

        ld  e, a        ; actualizamos valor de fila

; Explicación:
; Si ha ocurrido un cambio de tercio, el registro d YA fue actualizado
; con la última instrucción "inc d", por lo tanto NO hay que ajustar nada.
; Usamos el flag C para ajustar el valor de d.
; Sólo tenemos que reducir el valor de d en caso de que AÚN estemos dentro del tercio.

; Ajuste del número de tercio


        sbc a, a        ; A := A - A - fC
                        ;   A = $00 en caso de cambio de tercio
                        ;   A = $FF en los demás casos

        and -8          ; A := A & $F8
                        ;   A = $00 en caso de cambio de tercio
                        ;   A = $F8 en otro caso (-8)

        add a, d        ; D := A + D
                        ;   D = D, en caso de cambio de tercio
                        ;         (fue cambiado antes, en el "inc d")
                        ;   D = D - 8, si no hubo cambio de tercio
                        ;         (deshacer el estropicio del "inc d")

        ld  d, a        ; actualizamos valor de tercio
ENDM
; Repetimos para un total de 2x3 bytes

; Pintado del byte 7

        ld  a, (hl)     ; pintar el byte 7
        ld  (de), a

        inc hl          ; siguiente byte
        inc d           ; siguiente scanline

; Pintado del byte 8

        ld  a, (hl)     ; pintar el byte 8
        ld  (de), a

; Fin, no hace falta incrementar nada más


Hay otra parte para mostrar teselas. Aquí no hay comprobaciones ya que se sabe que se pinta siempre en múltiplo de caracteres.

Código: Seleccionar todo

; draw bitmap lines
REPT 8
        pop     de
        ld      a, e
        add     a, b
        ld      e, a
        ldi
        ld      a, (hl)
        ld      (de), a
        inc     hl
        dec     e
        inc     d
        ldi
        ldi
ENDM
Última edición por explorer el 25 Mar 2026, 23:31, editado 2 veces en total.

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 895
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 21 veces
Gracias recibidas: 67 veces

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor Bubu » 07 Nov 2018, 02:26

¿Qué son "teselas"? Lo he tenido que guglear, y he visto que son mosaicos, pero nontiendo qué tié que ver ese trozo de código que pones con las teselas... :?
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 467
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias dadas: 2 veces
Gracias recibidas: 184 veces
Contactar:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor explorer » 07 Nov 2018, 05:37

"tiles": baldosas, pizarras, azulejos, teselas. Objeto plano que se coloca en suelos o paredes y cuya disposición regular y repetida forma un decorado o un objeto decorativo.

Es lo que se usa para crear los decorados... Con el código quería mostrar que no es lo mismo pintar un sprite en cualquier parte de la pantalla con el pintar un azulejo o baldosa en posición múltiplo de carácter: el código es mucho más pequeño.


Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 895
Registrado: 04 Abr 2018, 23:10
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Nintendo GameBoy
Gracias dadas: 21 veces
Gracias recibidas: 67 veces

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor Bubu » 07 Nov 2018, 09:49

Aaaaah, "tiles", jAjAJJAjAjJA, vale, que nunca lo había visto como "teselas". Sería como si en vez de "sprites" te encuentras "duendes", AjJAjAjAJ.
Bueno, está claro que pintar tiles es mucho más fácil (en Spectrum), pues los tiles siempre se ajustan al background de 8x8. Si el Spectrum tuviera sprites por hardware, sería igual de fácil.
Si algo funciona... ¡¡NO LO TOQUES!! ¡¡NI DE COÑA!!

Avatar de Usuario
explorer
MSX Turbo R
MSX Turbo R
Mensajes: 467
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias dadas: 2 veces
Gracias recibidas: 184 veces
Contactar:

Re: Zx Spectrum: Cómo calcular el siguiente scanline en VRAM

Mensajepor explorer » 09 Nov 2023, 17:43

Me acabo de encontrar la misma idea en el código del Ghost 'n Goblins, así que fue un código común, en la época.

Código: Seleccionar todo

  ld a,l              ;calculate screen address to start of next 8 lines
  add a,0x20          ;add 32 to screen pointer
  ld l,a
  jr c,addr_ok        ;jump if addition resulted in overflow (this means we are at next 64 line segment)
  ld a,h
  sub 0x08            ;subtract 8*256
  ld h,a
addr_ok:


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados