Página 5 de 5

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

Publicado: 06 Nov 2018, 22:40
por explorer
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

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

Publicado: 07 Nov 2018, 02:26
por Bubu
¿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... :?

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

Publicado: 07 Nov 2018, 05:37
por explorer
"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.


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

Publicado: 07 Nov 2018, 09:49
por Bubu
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.

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

Publicado: 09 Nov 2023, 17:43
por explorer
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: