Para animar un poquito esto, y como veo que el PCW no es muy frecuente en esta sección, pego aquí el código ensamblador de una RSX muy sencillita, con dos funciones básicas:
- Escribir bytes en una dirección del banco de memoria donde están los datos de pantalla y demás.
- Leer bytes de ... idem ...
El tamaño del buffer es de 720 bytes (el mismo tamaño que una fila de carácteres en pantalla), pero se puede modificar fácilmente.
La RSX ha de estar dentro del banco común de memoria (por encima de 0xC0000), lo que suele ser tan sencillo como adosarla a un archivo COM y ya está. Esto lo haríamos con GENCOM.
Por lo demás, el código se puede ensamblar con M80 de Micro$oft, y linkar con LINK de Digital Research.
Dentro de su sencillez, éstas dos rutinas nos permiten hacer muchísimas cosas:
- Redefinir el juego de carácteres.
- Dibujar en la pantalla (sprites, etc.).
- Leer imágenes de la pantalla.
- ...
Tan sólo hay que utilizarlas con imaginación.
Son un buen complemento a cualquier programa en MESCC, pero se puede utilizar desde prácticamente cualquier lenguaje de programación, incluido ensamblador, por supuesto.
Parámetros:
- env_adr: Dirección en el banco de memoria de pantalla.
- tpa_adr: Dirección en el banco de memoria "normal" de nuestro programa.
- length: Número de bytes que queremos mover.
Bueno, ahí os dejo el código.
Saludos.
PD: Veréis que hay algunas definiciones que no se utilizan. Son cositas heredadas de otro código, que no he eliminado por si las utilizo más tarde. Tampoco molestan tanto...
Código: Seleccionar todo
;PutScrEnv(env_adr, tpa_adr, length)
;GetScrEnv(env_adr, tpa_adr, length)
.Z80
RAMScroll EQU 0B600H
RAMChars EQU 0B800H
RAMScreen EQU 05C00H
USERF EQU 0FC5AH
SCRRUN EQU 0E9H
BDOS_PCW EQU 255 ;New BDOS function for this RSX
PCW_PUTENV EQU 0
PCW_GETENV EQU 1
MAXFUNC EQU 12 ;Max. defined subfunctions
MAXPARS EQU 10 ;Max. size of parameters in bytes
cseg
defb 0,0,0,0,0,0 ;SERIAL NUMBER
jp SysTrap ;JUMP TO RSX
Cont: jp 0 ;JUMP TO NEXT RSX
defw 0 ;ADDRESS OF PREVIOUS RSX
defb 255 ;REMOVE FLAG (0 == PERMANENT)
defb 0 ;NON BANK ONLY FLAG
defb 'PcwEnv00' ;RSX name (8 bytes)
defb 0 ;LOADER FLAG
defw 0 ;RESERVED
SysTrap:
ld a,c
cp BDOS_PCW
jr nz,Cont
ld a,(de)
ex de, hl
ld de, fun
ld bc, 8
ldir
cp PCW_PUTENV
jp z, PutScrEnv
cp PCW_GETENV
jp z, GetScrEnv
ret
fun: defw 0
env_adr: defw 0
tpa_adr: defw 0
length: defw 0
buffer: defs 720
PutScrEnv:
ld hl, (tpa_adr)
ld de, buffer
ld bc, (length)
ldir
ld bc, BufToEnv
call USERF
defw SCRRUN
ret
BufToEnv:
ld hl, buffer
ld de, (env_adr)
ld bc, (length)
ldir
ret
GetScrEnv:
ld bc, EnvToBuf
call USERF
defw SCRRUN
ld hl, buffer
ld de, (tpa_adr)
ld bc, (length)
ldir
ret
EnvToBuf:
ld hl, (env_adr)
ld de, buffer
ld bc, (length)
ldir
ret
end