Karoshi MSX Community
05 de Julio de 2021, 10:47:43 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Horizontal text scroller  (Leído 10864 veces)
0 Usuarios y 1 Visitante están viendo este tema.
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« : 12 de Marzo de 2006, 09:14:56 pm »

[Original by Robsy]

Hi again!
This is a full program that demonstrates a full frame rate horizontal text scroller. Its core routine is only 83 bytes long and it is quite optimised both in size and speed. Feel free to use it in your own programs to add an oldschool feeling. And please, don't use the same font!

Código:
;----------------------------------------------
; HORIZONTAL SCROLLER
; Eduardo A. Robsy Petrus [25/04/2005]
; (c) Karoshi Corporation, 2005
;----------------------------------------------
; - Core routine size: 86 bytes.
; - Full frame rate (50/60 Hz)
; - Supports any 8x8 type set
;----------------------------------------------
; PROs: Fast and compact.
; CONs: Only 8x8 fonts supported.
;----------------------------------------------

;----------------------------------------------
; asMSX DIRECTIVES
;----------------------------------------------
.bios
.page 2
.rom
.start INIT

;----------------------------------------------
; CONSTANTS
;----------------------------------------------
FORCLR equ 0F3E9h

;----------------------------------------------
; PROGRAM CODE
;----------------------------------------------
INIT:
; Color 15,0,0
ld hl,FORCLR
ld [hl],15
inc hl
xor a
ld [hl],a
inc hl
ld [hl],a
; Screen 2
call INIGRP
call DISSCR
; Set color
ld hl,2000h+23*32*8
ld bc,32*8
ld a,0F0h
call FILVRM
call ENASCR

; Init variables
ld hl,BUFFER
xor a
ld b,a
@@CLEAR:
ld [hl],a
inc hl
djnz @@CLEAR

@@RESTART:
ld hl,TEXT
@@SCROLLER:
ld de,BUFFER+32*8
ld a,[hl]
inc hl
cp 27
jr z,@@RESTART
push hl
ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
ld bc,FONT-32*8
add hl,bc
ld bc,8
ldir

ld b,8
@@SCROLL:
push bc

halt
@@WAIT:
ld hl,32*23*8
call SETWRT

ld hl,BUFFER
push hl
ld c,98h
ld b,0
otir
pop de
ld hl,BUFFER-8
ld bc,256+8
@@SHIFT:
ld a,[de]
sla a
ld [de],a
ld a,0
rla
or [hl]
ld [hl],a
inc hl
inc de
dec bc
ld a,b
or c
jr nz,@@SHIFT

pop bc
djnz @@SCROLL

pop hl
jr @@SCROLLER

;----------------------------------------------
; SCROLLER TEXT
; Use ASCII code 27 (ESC) to define end
;----------------------------------------------
TEXT:
db "Coventry, Inglaterra, a 25 de Abril de 2005. "
db "Karoshi Corp. se complace en presentarles su primer scroller "
db "horizontal con desplazamiento pixel a pixel, funcionando a "
db "pleno rendimiento en cualquier ordenador MSX. Aunque parezca "
db "mentira, la rutina completa ocupa 86 bytes. Eso si, despues "
db "hay que incluir la tipografia y el texto que "
db "aparece en movimiento. No esta mal, verdad?"
db " "
db "Lo cierto es que no es facil conseguir que esto se mueva a una "
db "velocidad aceptable, pero el codigo ha sido optimizado hasta "
db "lograr el resultado deseado. Y se podrian hacer mas cosas al "
db "mismo tiempo... Habra que preparar una demo completa con scroller "
db "y algun grafico, musica, etc. Quizas seria una buena forma para "
db "hacer ",34,"Demozines",34," y presentar asi las novedades de "
db "Karoshi en un formato mas llamativo..."
db " "
db "Aun estas leyendo esto?"
db " "
db "Pues esto se ha terminado... "
db " ",27

;----------------------------------------------
; FONT
; From Taito's Choro-Q
;----------------------------------------------
FONT:
db 000h,000h,000h,000h,000h,000h,000h,000h
db 038h,038h,038h,038h,000h,038h,038h,000h
db 0EEh,0EEh,088h,000h,000h,000h,000h,000h
db 074h,074h,0FEh,074h,0FEh,074h,074h,000h
db 038h,0FCh,0E0h,0FEh,00Eh,0FEh,038h,000h
db 0C6h,0CEh,01Ch,038h,070h,0E6h,0C6h,000h
db 078h,0E4h,0F0h,07Ah,0BCh,09Ch,07Ah,000h
db 038h,038h,020h,000h,000h,000h,000h,000h
db 01Ch,038h,038h,038h,038h,038h,01Ch,000h
db 038h,01Ch,01Ch,01Ch,01Ch,01Ch,038h,000h
db 038h,0BAh,07Ch,038h,07Ch,0BAh,038h,000h
db 000h,038h,038h,0FEh,038h,038h,000h,000h
db 000h,000h,000h,000h,000h,070h,060h,040h
db 000h,000h,000h,0FEh,000h,000h,000h,000h
db 000h,000h,000h,000h,000h,070h,070h,000h
db 006h,00Eh,01Ch,038h,070h,0E0h,0C0h,000h
db 038h,064h,0E2h,0E2h,0E2h,064h,038h,000h
db 038h,078h,038h,038h,038h,038h,07Ch,000h
db 07Ch,08Eh,01Eh,07Ch,0F0h,0E0h,0FEh,000h
db 07Ch,08Eh,00Eh,03Ch,00Eh,08Eh,07Ch,000h
db 01Ch,038h,070h,0E0h,0E4h,0FEh,004h,000h
db 07Ch,040h,07Ch,00Eh,00Eh,08Eh,07Ch,000h
db 07Ch,0E0h,0FCh,0E2h,0E2h,0E2h,07Ch,000h
db 0FEh,00Eh,01Ch,038h,038h,038h,038h,000h
db 07Ch,0E2h,0E2h,07Ch,0E2h,0E2h,07Ch,000h
db 07Ch,0E2h,0E2h,0E2h,07Eh,002h,07Ch,000h
db 000h,000h,038h,038h,000h,038h,038h,000h
db 000h,000h,038h,038h,000h,038h,038h,020h
db 01Ch,038h,070h,0E0h,070h,038h,01Ch,000h
db 000h,000h,000h,0FEh,000h,0FEh,000h,000h
db 070h,038h,01Ch,00Eh,01Ch,038h,070h,000h
db 07Ch,08Eh,00Eh,01Ch,038h,000h,038h,000h
db 038h,044h,09Ah,0A2h,09Ah,044h,038h,000h
db 038h,074h,0E2h,0E2h,0FEh,0E2h,0E2h,000h
db 0FCh,0E2h,0E2h,0FCh,0E2h,0E2h,0FCh,000h
db 038h,064h,0E2h,0E0h,0E2h,064h,038h,000h
db 0F8h,0E4h,0E2h,0E2h,0E2h,0E4h,0F8h,000h
db 0FEh,0E0h,0E0h,0FCh,0E0h,0E0h,0FEh,000h
db 0FEh,0E0h,0E0h,0FCh,0E0h,0E0h,0E0h,000h
db 038h,064h,0E2h,0E0h,0E6h,062h,03Eh,000h
db 0E2h,0E2h,0E2h,0FEh,0E2h,0E2h,0E2h,000h
db 07Ch,038h,038h,038h,038h,038h,07Ch,000h
db 07Eh,00Eh,00Eh,00Eh,08Eh,04Ch,038h,000h
db 0E2h,0E4h,0E8h,0F0h,0E8h,0E4h,0E2h,000h
db 0E0h,0E0h,0E0h,0E0h,0E0h,0E0h,0FEh,000h
db 0E2h,0F6h,0EAh,0EAh,0E2h,0E2h,0E2h,000h
db 0C2h,0E2h,0F2h,0EAh,0E6h,0E2h,0E2h,000h
db 038h,064h,0E2h,0E2h,0E2h,064h,038h,000h
db 0F8h,0E4h,0E2h,0E4h,0F8h,0E0h,0E0h,000h
db 038h,064h,0E2h,0E2h,0EAh,064h,03Ah,000h
db 0F8h,0E4h,0E2h,0E4h,0F8h,0E4h,0E2h,000h
db 078h,0E4h,0F0h,07Ch,01Eh,08Eh,07Ch,000h
db 0FEh,038h,038h,038h,038h,038h,038h,000h
db 0E2h,0E2h,0E2h,0E2h,0E2h,0E2h,07Ch,000h
db 0E2h,0E2h,0E2h,0E2h,074h,038h,010h,000h
db 0E2h,0E2h,0E2h,0EAh,0EAh,0F6h,0E2h,000h
db 0E2h,0E2h,074h,038h,074h,0E2h,0E2h,000h
db 0E2h,0E2h,074h,038h,038h,038h,038h,000h
db 0FEh,01Ch,038h,070h,0E0h,0E0h,0FEh,000h
db 07Ch,070h,070h,070h,070h,070h,07Ch,000h
db 0C0h,0E0h,070h,038h,01Ch,00Eh,006h,000h
db 07Ch,01Ch,01Ch,01Ch,01Ch,01Ch,07Ch,000h
db 038h,074h,0E2h,000h,000h,000h,000h,000h
db 000h,044h,028h,010h,028h,044h,000h,000h
db 000h,000h,000h,000h,000h,000h,000h,000h
db 000h,000h,03Ch,00Eh,07Eh,08Eh,07Eh,000h
db 0E0h,0E0h,0FCh,0E2h,0E2h,0E2h,0FCh,000h
db 000h,000h,07Ch,0E2h,0E0h,0E2h,07Ch,000h
db 00Eh,00Eh,07Eh,08Eh,08Eh,08Eh,07Eh,000h
db 000h,000h,07Ch,0E2h,0FEh,0E0h,07Ch,000h
db 000h,000h,03Ch,072h,070h,0FCh,070h,070h
db 000h,000h,07Eh,08Eh,08Eh,07Eh,00Eh,07Ch
db 0E0h,0E0h,0FCh,0E2h,0E2h,0E2h,0E2h,000h
db 038h,000h,0F8h,038h,038h,038h,0FEh,000h
db 00Eh,000h,01Eh,00Eh,00Eh,00Eh,08Eh,07Ch
db 0E0h,0E0h,0E2h,0E4h,0E8h,0F4h,0E2h,000h
db 0F8h,038h,038h,038h,038h,038h,0FEh,000h
db 000h,000h,0F4h,0EAh,0EAh,0EAh,0EAh,000h
db 000h,000h,0FCh,0E2h,0E2h,0E2h,0E2h,000h
db 000h,000h,07Ch,0E2h,0E2h,0E2h,07Ch,000h
db 000h,000h,0FCh,0E2h,0E2h,0FCh,0E0h,0E0h
db 000h,000h,07Eh,08Eh,08Eh,07Eh,00Eh,00Eh
db 000h,000h,0FCh,0E2h,0E0h,0E0h,0E0h,000h
db 000h,000h,07Ch,0E0h,07Ch,00Eh,0FCh,000h
db 070h,070h,0FCh,070h,070h,072h,03Ch,000h
db 000h,000h,0E2h,0E2h,0E2h,0E2h,07Ch,000h
db 000h,000h,0E2h,0E2h,074h,038h,010h,000h
db 000h,000h,0E2h,0E2h,0EAh,0F6h,0E2h,000h
db 000h,000h,0E2h,074h,038h,074h,0E2h,000h
db 000h,000h,08Eh,08Eh,08Eh,07Eh,00Eh,07Ch
db 000h,000h,0FEh,01Ch,038h,070h,0FEh,000h

;----------------------------------------------
; VARIABLES
;----------------------------------------------
.page 3
BUFFER: ds 33*8
;----------------------------------------------
En línea

Doom dee doom dee doom
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #1 : 06 de Agosto de 2008, 07:38:59 pm »

Necesitaba que algun alma caritativa explicara un poco la rutina esta, llega un momento en que me pierdo y no se que es lo que se esta haciendo.

Please. Grin Grin Grin
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #2 : 07 de Agosto de 2008, 10:52:18 am »

He añadido un montón de comentarios para que te sea más fácil pillar el truco:

Código:
;----------------------------------------------
; HORIZONTAL SCROLLER
; Eduardo A. Robsy Petrus [25/04/2005]
; (c) Karoshi Corporation, 2005
;----------------------------------------------
; - Core routine size: 86 bytes.
; - Full frame rate (50/60 Hz)
; - Supports any 8x8 type set
;----------------------------------------------
; PROs: Fast and compact.
; CONs: Only 8x8 fonts supported.
;----------------------------------------------

;----------------------------------------------
; asMSX DIRECTIVES
;----------------------------------------------
.bios
.page 2
.rom
.start INIT

;----------------------------------------------
; CONSTANTS
;----------------------------------------------
FORCLR equ 0F3E9h

;----------------------------------------------
; PROGRAM CODE
;----------------------------------------------
INIT:
; Color 15,0,0
ld hl,FORCLR
ld [hl],15
inc hl
xor a
ld [hl],a
inc hl
ld [hl],a
; Screen 2
call INIGRP
call DISSCR
; Set color
ld hl,2000h+23*32*8
ld bc,32*8
ld a,0F0h
call FILVRM
call ENASCR

; Vacia el buffer (256 bytes)
ld hl,BUFFER
xor a
ld b,a
@@CLEAR:
ld [hl],a
inc hl
djnz @@CLEAR

@@RESTART:
ld hl,TEXT ; comienzo del texto del scroll
@@SCROLLER:
ld de,BUFFER+32*8 ; guarda la dirección de la columna "32"
ld a,[hl] ; carga el siguiente caracter a imprimir
inc hl
cp 27 ; es el codigo ASCII 27
jr z,@@RESTART ; si es cierto, reinicia el scroll
push hl ; si no lo es...
ld l,a
ld h,0
add hl,hl
add hl,hl
add hl,hl
ld bc,FONT-32*8
add hl,bc ; ...calcula la posicion en la fuente de los datos del caracter...
ld bc,8
ldir ; ...y los vuelca a la columna virtual que queda fuera de pantalla (la 32)

ld b,8 ; repetiremos el scroll 8 veces hasta que un caracter haya sido desplazado fuera de pantalla
@@SCROLL:
push bc

halt ; sincroniza con el vblank
@@WAIT:
ld hl,32*23*8
call SETWRT ; prepara para escritura el VDP al inicio de la ultima fila de caracteres

ld hl,BUFFER
push hl
ld c,98h
ld b,0
otir ; vuelca del buffer a la VRAM 256 bytes
pop de ; DE=BUFFER
ld hl,BUFFER-8
ld bc,256+8 ; repetimos tantas veces como bytes tenemos en el buffer
@@SHIFT:
ld a,[de] ; cargamos un byte de un caracter
sla a ; lo desplazamos a la izquierda a traves del carry
ld [de],a ; y lo volvemos a dejar en su sitio
ld a,0 ; ¡importante!, A debe ser 0 pero no podemos modificar el contenido del carry
rla ; rotamos a la izquierda A a traves del carry, introducimos el bit que desplazamos anteriormente
or [hl] ; lo mezclamos con el byte que esta a su "izquierda"
ld [hl],a ; y lo dejamos tambien en su sitio
inc hl ; nos posicionamos en los siguientes caracteres
inc de
dec bc
ld a,b
or c ; hemos acabado
jr nz,@@SHIFT ; si no repetimos

pop bc
djnz @@SCROLL ; repetimos hasta sacar un caracter fuera de pantalla

pop hl
jr @@SCROLLER

;----------------------------------------------
; SCROLLER TEXT
; Use ASCII code 27 (ESC) to define end
;----------------------------------------------
TEXT:
db "Coventry, Inglaterra, a 25 de Abril de 2005. "
.
.
.


;----------------------------------------------
; VARIABLES
;----------------------------------------------
.page 3
BUFFER: ds 33*8 ; buffer con una fila completa de caracteres (32) mas 1
;----------------------------------------------

Y si hay algo que no pillas, pregunta Smiley
En línea

Doom dee doom dee doom
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #3 : 07 de Agosto de 2008, 06:06:44 pm »

Gracias Jose Luis.

Aunque he decidido que para mi juego voy a optar por un scroll de texto caracter a caracter, voy a preguntarte alguna cosa para tenerlo mas claro.

Citar
ld bc,FONT-32*8

No entiendo que es lo que estamos calculando aqui, por mas vueltas que le doy, nada, no tengo ni idea.

Citar
ld hl,32*23*8
call SETWRT

Preparamos el VDP para escritura, vale.
Pero que es lo que vamos a escribir, en que registro es en el que escribimos?

Y si quisieramos que el Scroll no seria toda la pantalla completa, sino solo en una ventana con 20 caracteres disponibles?

Espero que no os parezcan unas preguntas tontas, pero es que no acabo de verle claro. Embarrassed

Gracias
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #4 : 07 de Agosto de 2008, 06:16:21 pm »

Gracias Jose Luis.

Aunque he decidido que para mi juego voy a optar por un scroll de texto caracter a caracter, voy a preguntarte alguna cosa para tenerlo mas claro.

Citar
ld bc,FONT-32*8

No entiendo que es lo que estamos calculando aqui, por mas vueltas que le doy, nada, no tengo ni idea.

Citar
ld hl,32*23*8
call SETWRT

Preparamos el VDP para escritura, vale.
Pero que es lo que vamos a escribir, en que registro es en el que escribimos?

Y si quisieramos que el Scroll no seria toda la pantalla completa, sino solo en una ventana con 20 caracteres disponibles?

Espero que no os parezcan unas preguntas tontas, pero es que no acabo de verle claro. Embarrassed

Gracias

Bueno. Carácter a carácter queda muy brusco, créeme. En cualquier caso, te explico las cosillas:

LD BC,FONT-32*8

Cargar este valor en BC permite que luego ajustemos directamente cada carácter a su adecuada definición gráfica. Es decir, a partir de FONT definimos los caracteres ASCII 33 y siguientes. Por lo tanto, hay que corregir que no estén los 32 primeros. No sé si me he explicado.

CALL SETWRT

Esto deja preparado el VDP para escritura, pero se refiere a la escritura en VRAM a partir de la dirección indicada. Es decir, no se refiere a escribir en los registros del VDP.
En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #5 : 07 de Agosto de 2008, 09:24:05 pm »

Citar
Cargar este valor en BC permite que luego ajustemos directamente cada carácter a su adecuada definición gráfica. Es decir, a partir de FONT definimos los caracteres ASCII 33 y siguientes. Por lo tanto, hay que corregir que no estén los 32 primeros. No sé si me he explicado.

Bueno ya veo, lo que hacemos es saltarnos los 32 primeros tiles. O sea que estamos redefiniendo a partir del tile 33. Si por ejemplo cogemos una "A" codigo ASCII =65 seria lo siguiente:
65-32=33
Con lo que empezariamos a leer los datos que tenemos a partir de la linea FONT, pero 33 lineas mas abajo.

Otra duda.

Citar
ld c,98h
ld b,0
otir

No me acuerdo lo que hacia la instruccion otir, que es lo que realizamos aqui. Embarrassed

Gracias
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #6 : 07 de Agosto de 2008, 09:52:27 pm »

Citar
No me acuerdo lo que hacia la instruccion otir, que es lo que realizamos aqui

Es un OuT con Incremento y Repetición. Envía al puerto definido en C, B bytes obtenidos a partir de HL en adelante.

Por cierto, recuerdo que la rutina tenía un problemilla relacionado con ld hl,BUFFER-8 que hacía que se sobreescribieran los 8 bytes anteriores a BUFFER, en este caso se corrompe el último carácter definido por lo que pasa desapercibido; pero si ubicamos el BUFFER en nuestro programa tras la zona de variables, los resultados pueden ser impredecibles. La solución más sencilla es colocar antes de BUFFER una zona de 8 bytes extra para poder operar tranquilamente:

Código:
;----------------------------------------------
; VARIABLES
;----------------------------------------------
.page 3
DUMMY: ds 8 ; parche para corregir el problema
BUFFER: ds 33*8 ; buffer con una fila completa de caracteres (32) mas 1

En línea

Doom dee doom dee doom
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #7 : 07 de Agosto de 2008, 09:54:48 pm »

Me respondo, ya se lo que hacia OTIR.

Cual es mas rapido este metodo o hacer una llamada a la BIOS "LDIRVM". Huh

Todavia se me resiste un poco esta rutina, todavia no se como variar la fila en la que aparece el Scroll y la columna por la que aparece y por la que se esconde.

Voy a seguir probando. Cheesy
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
Dioniso
Visitante
« Respuesta #8 : 07 de Agosto de 2008, 10:00:14 pm »


Citar
ld c,98h
ld b,0
otir

Incluso podrías hacer un LD BC,$0098 y te ahorras un byte de programa.
En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #9 : 08 de Agosto de 2008, 04:59:41 pm »

Bueno, gracias a todos, solamente deciros que ya he conseguido hacer un Scroll pixel a pixel para mi juego. Grin

Es un Scroll pequeñito, de 12 caracteres en la parte superior derecha de la pantalla.

Ya os ire contando mas detalles.

En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!