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: 398
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: 138 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
REPT 2
        ld      a, (hl)         ; pintar los bytes 1 a 6
        ld      (de), a

        inc     hl              ; siguiente byte
        inc     d               ; siguiente línea (lo podemos hacer dos veces seguidas
                                ; porque sabemos que empezamos en línea par)
ENDM
                                ; ajuste de la dirección destino
                                ; se hace cada dos líneas. Se puede haber incrementado el tercio

        ld      a, d            ; ver si hemos pasado frontera de línea (scan)
        and     7
        jr      nz, $+11        ; no. Ir al siguiente "lda a,(hl)"

        ld      a, e            ; byte con la fila+columna
        sub     -32             ; le sumamos una fila más. C = 0 si la fila fue la última del tercio
        ld      e, a

        sbc     a, a            ; A = A - A - C. A = $00 en caso de cambio de tercio. $FF en otro caso

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

        add     a, d            ; nuevo valor de tercio ajustado a uno menos si no hubo cambio de tercio
                                ; D queda igual en caso de cambio de tercio (ya fue incrementado en el último "inc d")

        ld      d, a
ENDM

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

        inc     hl              ; siguiente byte
        inc     d               ; siguiente línea

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


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

Avatar de Usuario
Bubu
Atari 1040 STf
Atari 1040 STf
Mensajes: 886
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: 20 veces
Gracias recibidas: 60 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: 398
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: 138 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: 886
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: 20 veces
Gracias recibidas: 60 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: 398
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: 138 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 5 invitados