MSX – Las Rutinas de la BIOS
Nota: el símbolo «#» delante de un número indica que ese número es Hexadecimal.
RST-and other routines
Posición: #0000 (CHKRAM) (también llamada STARTUP, RESET or BOOT)
Esta rutina no necesita parámetros de entrada ni tampoco ofrece ninguno a la salida. Puede ser ejecutada utilizando un restart (RST O). Su función es la de inicializar el ordenador. Por consiguiente, se llama cuando se quiere empezar de nuevo, cuando se pulsa el botón de reset o, automáticamente, al encender el aparato.
Posición #0008 (SYNCHR) y #0010 (CHRGTR )
Estas rutinas son utilizadas por el intérprete BASIC para analizar los errores de sintaxis, tomar el siguiente carácter o token del programa, etc. Son de poca utilidad, aunque una posible aplicación seria la de construir un BASIC extendido.
Posición: #000C (RDSLT)
Se usa para leer una dirección de memoria de un cartucho determinado. El número de cartucho ha de colocarse en el acumulador y la dirección en el registro HL. Altera AF, BC y DE.
Posición: #0014 (WRSLT)
Igual que la anterior pero para escribir.
Posición: #0018 (OUTDO)
Es, sin duda, una rutina muy útil. Puede ser llamada con RST 18. Se encargará de sacar el carácter contenido en el acumulador al periférico seleccionado.
– Si la posición de memoria #F416 contiene un cero, la salida será a la pantalla.
– Si #F416 es distinto de cero, la salida será por impresora.
Por último, tienes la posibilidad de escribir en un fichero de disco, cargando #F864 con la dirección de memoria de dicho fichero, que señalará el dato a mandar.
RST 18 no modifica ningún registro. Por otra parte, realiza una llamada al gancho situado en #FEE4 después de guardar el par AF en la pila. Como puedes intuir, poner un parche en esa dirección te dará la oportunidad de controlar los distintos periféricos a tu antojo.
Posición: #001C (CALSLT)
Esta rutina se emplea para ejecutar una subrutina de un cartucho.
Posición: #0020 (DCOMPR)
Puedes comparar los registros DE y HL llamando a esta rutina. Aquí tienes su listado:
LD A, D
CP H
RET NZ
LD A, E
CP L
RET
Posición: #0024 (ENASLT)
Esta rutina selecciona una página de un cartucho.
Posición #0028 (GETYPR)
Es empleada por el intérprete BASIC para conocer el tipo de variable que se está utilizando.
Alternativamente se puede leer la dirección #F663, puesto que siempre se almacena aquí el número de bytes de la variable usada; es decir; dos para las variables numéricas enteras, cuatro para las de precisión sencilla, ocho para las de doble precisión y tres para las cadenas alfanuméricas.
Sin embargo, no es seguro que esta dirección se respete en futuras versiones. Por tanto observa si el flag C está a 0 (tipo 8), el flag M está a 1 (tipo 2), el flag Z está a 1 (tipo 3) o el flag P se encuentra a 0 (tipo 4).
Posición #0030 (CALLF)
Ejecuta una rutina contenida en un cartucho. El byte siguiente al RST 30 debe contener el identificador del cartucho y después debe colocarse la dirección de llamada.
Posición #0038 (KEYINT)
Esta rutina es ejecutada 50 veces por segundo, salvo que las interrupciones estén desactivadas.
Lo primero que hace es guardar los registros en la pila (incluidos los alternativos y los de indice), por lo que podrás emplearlos todos libremente y sin restricciones.
Si pones un parche en la dirección #FD9A forzarás al sistema operativo a ejecutar una de tus rutinas siempre que se produzca una interrupción.
Como puedes ver, esto te da un poder inmenso sobre el ordenador. No modifica ningún registro, pero altera muchas posiciones de memoria, ya que actualiza, entre otras, la variable TIME y las escalas musicales. Asimismo, comprueba las colisiones de los SPRITES, el teclado, etc.
Initialization-routines
Posición: #003B (INITIO)
Inicializa el Dispositivo.
Modifica todos los Registros.
Posición: #003E (INIFNK)
Inicializa el contenido de las Teclas de Función.
Modifica todos los Registros.
VDP routines
Posición: #0041 (DISSCR)
Llamándola haces que la pantalla se desconecte. No obstante, todo lo que escribas se conservará y podrás visualizarlo con la siguiente rutina. Suele ser útil cuando se hace un dibujo muy complicado que se quiere mostrar en pantalla instantáneamente. Modifica los pares AF y BC.
Posición: #0044 (ENASCR)
Esta rutina activa la pantalla, por lo que complementa a la anterior. Al igual que aquélla, modifica los registros AF y BC.
Posición: #0047 (WRTVDP)
Se llama a esta rutina para escribir en uno de los registros de estado del procesador de vídeo (VDP).
En C debe ponerse el número de registro a escribir y en B el dato en cuestión. Su equivalente en BASIC sería: VDP(C)=B. Es importante emplear esta rutina, en lugar de acceder al VDP directamente, puesto que se encarga de guardar una copia del registro de estado en la RAM del sistema, desde la posición #F3DF hasta la #F3E6.
Ten presente que estos registros sólo son de escritura y no podrías comprobar los datos una vez mandados. Modifica los pares AF y BC.
Posición #004A (RDVRM)
Funciona igual que la instrucción VPEEK del BASIC. Debes cargar la dirección de la RAM de vídeo en el par HL y obtendrás a la salida el resultado en el acumulador. Modifica sólo AF.
Posición: #004D (WRTVRM)
Es idéntica a la anterior sólo que ésta actúa como VPOKE. El dato a escribir ha de ponerse en el acumulador.
Posición: #0050 (SETRD)
Dispone el VDP para una operación de lectura. Es mejor pasarla por alto y llamar directamente a la rutina situada en #59.
Posición: #0053 (SETWRT)
Prepara el VDP para una operación de escritura. Al igual que la anterior es mejor olvidarla y acceder a la rutina colocada en #5C.
Posición: #0056 (FILVRM)
Esta rutina llena la RAM de vídeo de un mismo valor contenido en el acumulador. La posición de origen debe encontrarse en HL y la longitud del bloque en BC. Modifica los pares AF y BC.
La utilidad de esta rutina es colorear la pantalla rápidamente. Las instrucciones CLS, COLOR, LINE y PAINT la emplean.
Posición: #0059 (LDIRMV)
Esta rutina traslada un bloque de la RAM del VDP hacia la memoria central. La longitud del referido bloque ha de encontrarse en BC, el destino en DE y el origen en HL. Modifica AF, BC y DE.
Tarde o temprano todos los programadores han de encontrarse con esta rutina, por lo que su uso es prácticamente imprescindible.
Posición: #005C (LDIRVM)
La rutina situada en esta dirección tiene un comportamiento análogo a la anterior, con la diferencia de que traslada un bloque desde la memoria central a la RAM de vídeo.
Posición: #005F (CHGMOD)
Esta llamada pone al VDP en uno de los cuatro modos de pantalla. El acumulador deberá contener el modo seleccionado.
Su equivalente en BASIC sería SCREEN A. No inicializa los SPRITES. Modifica todos los registros así como las posiciones de memoria #F3B0, #F922, #F924, #FCAF y #FCB0.
Posición: #0062 (CHGCLR)
Esta rutina cambia el color de la pantalla, tomando como nuevos valores las posiciones de memoria siguientes: #F3E9 (color de la tinta), #F3EA (color del papel) y #F3EB (color del borde). Modifica los pares AF, BC y HL.
Posición: #0066 (NMI)
Función : Executes (non-maskable interupt) handling routine.
Posición: #0069 (CLRSPR)
Su cometido es inicializar todos los SPRITES. Altera todos los registros.
Posición: #006C (INITXT)
Esta rutina actúa como la instrucción BASIC SCREEN 0. Modifica todos los registros así como lasposiciones de memoria que van desde la #F3DF a la #F3E5.
Posición: #006F (INIT32)
Funciona igual que la anterior pero para el SCREEN 1.
Posición: #0072 (INIGRP)
Igual que las anteriores pero para SCREEN 2.
Posición: #0075 (INIMLT)
Igual para SCREEN 3.
Posición #0078 (SETTXT)
Inicializa al VDP para trabajar en SCREEN 0, pero sin tocar la RAM de vídeo. Modifica los mismos registros y posiciones de memoria que la rutina situada en #6C.
Posición: #007B (SETT32)
Trabaja igual que la anterior pero para SCREEN 1.
Posición #007E (SETGRP)
Igual que las anteriores pero para SCREEN 2.
Posición: #0081 (SETMLT)
Lo mismo para SCREEN 3.
Posición: #0084 (CALPAT)
Función: Devuelve la dirección de la Tabla de Patrones de los Sprites.
Entrada: A – Sprite ID
Salida : HL – Para la Dirección.
Posición: #0087 (CALATR)
Con esta rutina sólo tendrás que cargar un número de SPRITE en el acumulador para que te devuelva la dirección de la VRAM en la que se encuentran los atributos del SPRITE seleccionado, gracias al registro HL.
Modifica los pares HL y DE así como los flags.
Posición: #008A (GSPSIZ)
Esta rutina te informará del tipo de SPRITE que estás empleando, o mejor dicho: el número de bytes que emplea cada uno de éstos, que pueden ser 8 ó 32. Por tanto, a la salida tendrás en el acumulador una de estas dos cantidades. Además el carry se pondrá a 1 si los SPRITES son del tipo ampliado. Unicamente modifica el par AF.
Posición: #008D (GRPPRT)
Esta rutina escribe el carácter contenido en el acumulador en la dirección especificada por el cursor gráfico (la coordenada X está en #FCB3 y la coordenada Y en #FCB4), siempre y cuando estés trabajando en SCREEN 2.
Sólo modifica las posiciones de memoria #F92A, #F923 y #F92C.
PSG routines
Posición: #0090 (GICINI)
Esta rutina inicializa el Generador Programable de Sonido. No modifica ningún registro, pero altera toda el área de la cola del sonido, que empieza en #F975 y termina en #FA74.
Posición: #0093 (WRTPSG)
Con ella puedes escribir en uno de los registros del PSG. El número de registro ha de colocarse en el acumulador y en E el dato a mandar (comprendido entre 0 y 13).
Su equivalente en BASIC sería: SOUND A, E. Esta llamada no modifica ningún registro.
Posición: #0096 (RDPSG)
Esta rutina sirve para leer un registro del PSG. El acumulador debe contener el número de registro (comprendido en 0 y 13). Sólo altera el contenido de A.
Posición: #0099 (STRTMS)
Se llama a esta rutina para ejecutar la escala musical (caso de haberla). Si en el buffer de sonido no hay ninguna escala escrita el acumulador se cargará con un cero. Modifica los pares AF y HL, así como las posiciones de memoria #FB3F y #FB40.
Console routines
Posición: #009C (CHSNS)
Comprueba si las teclas de función están activas en la pantalla. En caso afirmativo, analiza las teclas SHIFT, para mostrar el contenido de las funciones F6 y F10, si están pulsadas.
Esta rutina pondrá el flag Z a 1 si no hay ninguna tecla apretada. Unicamente modifica AF.
Posición: #009F (CHGET)
Esta rutina es de gran importancia. Su cometido es coger un carácter del buffer del teclado. Si este buffer está vacío enseñará el cursor y esperará hasta que se pulse una tecla. A la salida, el acumulador contendrá el código del carácter. Asimismo, realiza una llamada al gancho situado en #FDC2 después de apilar los pares HL, DE y BC. No modifica ningún registro.
Posición: #00A2 (CHPUT)
Imprime el carácter del acumulador en la posición en la que se encuentre el cursor, aunque se trate de un código de control. Actualiza la pantalla, desplazándola o haciendo un cambio de línea si es preciso.
Después de apilar todos los registros salta al gancho situado en #FDA4. No modifica ningún registro pero sí las coordenadas Y y X del cursor (almacenadas en #F3DC y #F3DD respectivamente ) y la dirección #F661.
Posición: #00A5 (LPTOUT)
Envía el carácter contenido en el acumulador a la impresora, esperando hasta que ésta esté preparada. Si se pulsa CTRL-STOP el flag C se pondrá a 1. No modifica ningún registro.
Posición: #00A8 (LPTSTT)
Esta rutina es llamada por la anterior. Su finalidad es comprobar si la impresora está ON-LINE. De no ser así el flag Z se pondrá a 1. Modifica el par AF.
Posición: #00AB (CNVCHR)
Transforma el código contenido en el acumulador en un carácter gráfico (si es menor que 32), en la forma que el VDP está preparado para aceptar. Prueba con VPOKE 0,1 y entenderás perfectamente el funcionamiento de esta rutina. Modifica el par AF.
Posición: #00AE (PINLIN)
Acepta una línea completa del teclado. Puesto que una línea puede contener hasta 255 caracteres, ésta se almacena en buffer de entrada que está situado entre las posiciones #F55E y #F65D. A la salida, el par HL apunta al inicio de este buffer menos uno. Modifica todos los registros.
Posición: #00B1 (INLIN)
Esta rutina es similar a la anterior. Aceptará la entrada de caracteres e irá mostrándolos en la pantalla hasta que se pulse RETURN o CTRL-STOP. Modifica todos los registros.
Posición: #00B4 (QINLIN)
Estarutina actúa de forma idéntica a las anteriores, pero visualizando antes el signo de interrogación característico de los INPUT.
Posición: #00B7 (BREAKX)
Sirve para comprobar si se ha pulsado CTRL-STOP. Si esto es así, el flag C se pondrá a 1. Modifica AF.
Posición: #00BA (ISCNTC)
Estarutina complementa a la anterior, pero además analiza si se ha pulsado únicamente la tecla STOP, para detener la ejecución del programa cuando así sea. Altera el par AF.
Posición #00BD (CKCNTC)
Esta rutina hace exactamente lo mismo que la anterior, pero empleando más tiempo.
Posición: #00C0 (BEEP)
Produce un BEEP e inicializa el PSG, llamando a la rutina situada en #90. Modifica todos los registros. Su equivalente en BASIC sería: BEEP.
Posición: #00C3 (CLS)
Su cometido es borrar la pantalla, con la condición de que pongas el flag Z a 0 antes de llamarla. Modifica los pares AF, BC y DE y las posiciones de la RAM del sistema relacionadas con el cursor.
El modo de pantalla que se esté utilizando es indiferente.
Posición: #00C6 (POSIT)
Sitúa el cursor en la posición especificada por el registro HL, para lo cual es necesario poner la columna en H y la fila en L. Altera el par AF y las direcciones de memoria encargadas de guardar las coordenadas de cursor (#F3DC y &F3DD). Su equivalente en BASIC sería: LOCATE L, H.
Posición: #00C9 (FNKSB)
Esta rutina es llamada por el intérprete BASIC para saber si las teclas de función están activas.
Posición: #00CC (ERAFNK)
Se llama a esta rutina para desconectar la visualización de las teclas de función. Su equivalente en BASIC sería: KEY OFF. Altera AF, BC y DE.
Posición: #00CF (DSPFNK)
Puede utilizarse para mostrar el contenido de las teclas de función en la pantalla. Actúa como la instrucción BASIC KEY ON. Modifica los registros AF, BC y DE, asi como la posición #F3DE, que será cargada con #FF.
Posición: #00D2 (TOTEXT)
Esta rutina se emplea para cambiar de pantalla y ponerla en el otro modo de texto.
Controller routines
Posición: #00D5 (GTSTCK)
Esta llamada realiza una función idéntica a la instrucción BASIC A = STICK(A), por lo que te sugiero que leas el manual de tu ordenador para conocer los detalles. Modifica todos los registros.
Posición: #00D8 (GTTRIG)
Analiza el estado del disparador especificado por un número que debe cargarse en el acumulador. A la salida, tendrás un cero en el registro A, si ha habido algún disparo, o 255, si no se ha pulsado el disparador. Modifica AF.
Posición: #00DB (GTPAD)
Esta rutina funciona de forma análoga a la instrucción BASIC PAD (A). Por consiguiente, te aconsejo que mires allí para obtener una información completa. Altera todos los registros.
Posición: #00DE (GTPDL)
Esta rutina lee la raqueta de juegos especificada por el registro A. Asimismo, devuelve en el acumulador un parámetro comprendido entre 0 y 255, referido a la posición actual. Modifica todos los registros.
Tape device routines
Posición: #00E1 (TAPION)
Con esta llamada pondrás el motor del cassette en marcha y podrás leer la cabecera. Si se pulsa CTRL-STOP el flag C se pondrá a 1. Modifica todos los registros.
Posición: #00E4 (TAPIN)
Se emplea para leer un byte de la cinta, que será devuelto en el acumulador. Al igual que la rutina anterior, el carry se encenderá si la operación es abortada. Modifica todos los registros.
Posición: #00E7 (TAPIOF)
Esta rutina sirve para detener la operación de lectura del cassette. No altera ningún registro.
Posición: #00EA (TAPOON)
Esta rutina pone el motor del cassette en marcha y escribe la cabecera en la cinta. El carry se pondrá a 1 si se interrumpe la escritura. Modifica todos los registros.
Posición: #00ED (TAPOUT)
Carga el acumulador con un dato y esta rutina te lo escribirá en la cinta. Como siempre el carry encendido te indicará si la operación fue abortada por la pulsación de CTRL-STOP. Modifica todos los registros.
Posición: #00F0 (TAPOOF)
Función: Detiene la Escritura en Cinta.
Posición: #00F3 (STMOTR)
Esta rutina conectará el motor del cassette, si el acumulador contiene un 1, o lo parará, si contiene un 0. Por otra parte, si cargas el registro A con #FF, antes de llamarla, invertirás el estado del motor.
Queue routines
Posición: #00F6 (LFTQ)
Function : Gives number of bytes in queue
Output : A – length of queue in bytes
Remark : Internal use
Posición: #00F9 (PUTQ)
Function : Put byte in queue
Remark : Internal use
Graphic routines
Posición: #00FC (RIGHTC)
Esta rutina desplaza al cursor gráfico un punto hacia la derecha. Al llamarla, la posición #F92A y siguiente debe contener la dirección de la VRAM en la que se encuentra el punto.
Asimismo, deberás poner en la posición #F92C un valor cuyo único bit encendido muestre el punto a tratar. Por consiguiente si #F92C contiene un 32 (&B00001000) el cursor gráfico señalará al tercer punto de la posición especificada por #F92A, al volver de la rutina.
Modifica el par AF y las tres posiciones de memoria antes referidas.
Posición: #00FF (LEFTC)
Esta rutina hace exactamente lo mismo que la anterior, sólo que el cursor gráfico se desplaza un punto a la izquierda.
Posición: #0102 (UPC)
Hace lo mismo que las anteriores pero desplazando el cursor hacia arriba.
Posición: #0105 (TUPC)
Trabaja igual que la rutina anterior pero pone el carry a 1 si se alcanza la fila superior de la pantalla.
Posición: #0108 (DOWNC)
Se comporta como #FC pero bajando un punto el cursor gráfico.
Posición: #010B (TDOWNC)
También hace bajar un punto el cursor gráfico, aunque pondrá el carry a 1 si se llega a la fila inferior de la pantalla. El resto como #FC.
Posición: #011D (READC)
Esta rutina devuelve en el acumulador el código de color del punto señalado por las posiciones de memoria #F92A a #F92C (ver la rutina situada en #FC).
Posición: #0120 (SETC)
Function : Returns currenct screenpixel of specificed attribute byte.
Posición: #0123 (NSETCX)
Esta rutina traza una línea hacia la derecha a partir de la posición especificada por las direcciones #F92A a #F92C (ver la rutina situada en #FC) y la longitud contenida en HL.
El color del trazo ha de colocarse en #F3F2. Modifica todos los registros.
Posición: #0126 (GTASPC)
Function : Gets screen relations
Output : DE, HL
Registers: DE, HL
Posición: #0129 (PNTINI)
Function : Initalises the PAINT instruction
Posición: #012C (SCANR)
Function : Scans screenpixels to the right
Posición: #012F (SCANL)
Function : Scans screenpixels to the left
Misc routines
Posición: #0132 (CHGCAP)
Usando esta rutina actuarás directamente sobre el diodo de las mayúsculas. Así, si el acumulador contiene un cero lo encenderás, con otro valor lo apagarás. Modifica el par AF.
Posición: #0135 (CHGSND)
Function : Alternates the 1-bit sound port status
Input : A – #00 to turn off
not #00 to turn on
Registers: AF
Posición: #0138 (RSLREG)
Function : Reads the primary slot register
Output : A – for the value which was read
33221100
||||||- Pagina 0 (#0000-#3FFF)
||||— Pagina 1 (#4000-#7FFF)
||—– Pagina 2 (#8000-#BFFF)
——- Pagina 3 (#C000-#FFFF)
Registers: A
Posición: #013B (WSLREG)
Function : Writes value to the primary slot register
Input : A – value value to (see RSLREG)
Posición: #013E (RDVDP)
Function : Reads VDP status register
Output : A – Value which was read
Registers: A
Posición: #0141 (SNSMAT)
Esta rutina comprueba el estado de la matriz del teclado. Dicha matriz forma un cuadrado de 8 x 8. El acumulador deberá contener el número de la fila a explotar.
A la salida tendrás que A tiene un 255, si no ha sido pulsada ninguna tecla de la fila en cuestión, o un bit puesto a cero indicando la tecla que si se ha pulsado. Unicamente altera el par AF y no espera hasta que se pulsa una tecla.
Posición: #0144 (PHYDIO)
Function : Executes I/O for mass-storage media like diskettes
Input : A – Drive number (0 = A:, 1 = B:, etc.)
B – Number of sectors
C – Media ID of the disk
DE – Begin sector
HL – Begin address in memory
F – Set carry to write, unset carry to read
Output : A – Error code (only when writing)
0 = Write protected
2 = Not ready
4 = Data error
6 = Seek error
8 = Record not found
10 = Write error
12 = Bad parameter
14 = Out of memory
16 = Other error
B – Number of sectors actually written or read
Registers: All
Remark : Before the call is called, the Z-flag must be reset, and the execution
address which was in HL must be at the last stack address
By the way: In minimum configuration only a HOOK is available
Posición: #0147 (FORMAT)
Function : Initialises mass-storage media like formatting of diskettes
Registers: All
Remark : In minimum configuration only a HOOK is available
Posición: #014A (ISFLIO)
Function : Tests if I/O to device is taking place
Output : A – #00 if not taking place
not #00 if taking place
Registers: AF
Posición: #014D (OUTDLP)
Function : Printer output
Input : A – code to print
Registers: F
Remark : Differences with LPTOUT:
1. TAB is expanded to spaces
2. For non-MSX printers, Hiragana is transformed to katakana
and graphic characters are transformed to 1-byte characters
3. If failed, device I/O error occurs
Posición: #0150 (GETVCP)
Function : Returns pointer to play queue
Input : A – Channel number
Output : HL – Pointer
Registers: AF
Remark : Only used to play music in background
Posición: #0153 (GETVC2)
Function : Returns pointer to variable in queue number VOICEN (byte op #FB38)
Input : L – Pointer in play buffer
Output : HL – Pointer
Registers: AF
Posición: #0156 (KILBUF)
Sirve para borrar completamente el buffer del teclado. Modifica el registro HL.
Nota: Las posiciones de la ROM 6 y 7 contienen los números de los puertos asignados para las operaciones de entrada/salida al VDP.
Posición: #0159 (CALBAS)
Function : Executes inter-slot call to the routine in BASIC interpreter
Input : IX – for the calling address
Output : Depends on the called routine
Registers: Depends on the called routine
MSX 2 BIOS Entries
SUBROM
Address : #015C
Function : Calls a routine in SUB-ROM
Input : IX - Address of routine in SUB-ROM
Output : Depends on the routine
Registers: Alternative registers, IY
Remark : Use of EXTROM or CALSLT is more convenient.
In IX a extra value to the routine can be given by first
PUSH'ing it to the stack.
EXTROM
Address : #015F
Function : Calls a routine in SUB-ROM. Most common way
Input : IX - Address of routine in SUB-ROM
Output : Depends on the routine
Registers: Alternative registers, IY
Remark : Use: LD IX,address
CALL EXTROM
CHKSLZ
Address : #0162
Function : Search slots for SUB-ROM
Registers: Alles
CHKNEW
Address : #0165
Function : Tests screen mode
Output : C-flag set if screenmode = 5, 6, 7 or 8
Registers: AF
EOL
Address : #0168
Function : Deletes to the end of the line
Input : H - x-coordinate of cursor
L - y-coordinate of cursor
Registers: All
BIGFIL
Address : #016B
Function : Same function as FILVRM (total VRAM can be reached).
Input : HL - address
BC - length
A - data
Registers: AF,BC
NSETRD
Address : #016E
Function : Same function as SETRD.(with full 16 bits VRAM-address)
Input : HL - VRAM address
Registers: AF
NSTWRT
Address : #0171
Function : Same function as SETWRT.(with full 16 bits VRAM-address)
Input : HL - VRAM address
Registers: AF
NRDVRM
Address : #0174
Function : Reads VRAM like in RDVRM.(with full 16 bits VRAM-address)
Input : HL - VRAM address
Output : A - Read value
Registers: F
NWRVRM
Address : #0177
Function : Writes to VRAM like in WRTVRM.(with full 16 bits VRAM-address)
Input : HL - VRAM address
A - Value to write
Registers: AF
MSX 2+ – BIOS Entries
RDBTST
Address : #017A
Function : Read value of I/O poort #F4
Input : none
Output : A = value read
Registers: AF
WRBTST
Address : #017D
Function : Write value to I/O poort #F4
Input : A = value to write
Bit 7 shows the MSX 2+ startup screen when reset, otherwise it's skipped.
Output : none
Registers: none
MSX – Turbo R – BIOS Entries
CHGCPU
Address : #0180
Function : Changes CPU mode
Input : A = LED 0 0 0 0 0 x x
| 0 0 = Z80 (ROM) mode
| 0 1 = R800 ROM mode
| 1 0 = R800 DRAM mode
LED indicates whether the Turbo LED is switched with the CPU
Output : none
Registers: none
GETCPU
Address : #0183
Function : Returns current CPU mode
Input : none
Output : A = 0 0 0 0 0 0 x x
0 0 = Z80 (ROM) mode
0 1 = R800 ROM mode
1 0 = R800 DRAM mode
Registers: AF
PCMPLY
Address : #0186
Function : Plays specified memory area through the PCM chip
Input : A = v 0 0 0 0 0 x x
| | |
| +-+-- Quality parameter (Speed: 0 = Fast)
+---------------- VRAM usage flag
HL= Start address in RAM or VRAM
BC= Length of area to play
D = Bit 0 = Bit 17 of area length when using VRAM
E = Bit 0 = Bit 17 os start address when using VRAM
Output : C-flag set when aborted with CTRL-STOP
Registers: all
PCMREC
Address : #0189
Function : Records audio using the PCM chip into the specified memory area
Input : A = v t t t t c x x
| | | | | | | |
| | | | | | +-+-- Quality parameter (Speed: 0 = Fast)
| | | | | +------ Zero-data compression
| +-+-+-+-------- Treshold
+---------------- VRAM usage flag
HL= Start address in RAM or VRAM
BC= Length of area to play
D = Bit 0 = Bit 17 of area length when using VRAM
E = Bit 0 = Bit 17 os start address when using VRAM
Output : C-flag set when aborted with CTRL-STOP
Registers: all
BiFi