MSX BIOS calls
This is an overview of all official MSX BIOS calls.
- MSX 1 BIOS (up to function call #159)
- MSX 2 BIOS (up to function call #177)
- MSX 2+ BIOS (up to function call #17D)
- MSX turbo R BIOS (up to function call #189)
MSX 1 BIOS Entries
RST-and other routines
CHKRAM (also called STARTUP, RESET or BOOT)
Address : #0000 Function : Tests RAM and sets RAM slot for the system Registers: All Remark : After this, a jump must be made to INIT, for further initialisation.
SYNCHR
Address : #0008 Function : Tests whether the character of (HL) is the specified character if not, it generates SYNTAX ERROR, otherwise it goes to CHRGTR (#0010) Input : Set the character to be tested in (HL) and the character to be compared next to RST instruction which calls this routine (inline parameter) Output : HL is increased by one and A receives (HL), When the tested character is numerical, the carry flag is set the end of the statement (00h or 3Ah) causes the zero flag to be set Registers: AF, HL
RDSLT
Address : #000C Function : Reads the value of an address in another slot Input : A - ExxxSSPP Slot-ID │ ││└┴─ Primary slot number (00-11) │ └┴─── Secondary slot number (00-11) └───────────── Expanded slot (0 = no, 1 = yes) HL - Address to read Output : A - Contains the value of the read address Registers: AF, C, DE Remark : This routine turns off the interupt, but won't turn it on again
CHRGTR
Address : #0010 Function : Gets the next character (or token) of the Basic text Input : HL - Address last character Output : HL - Points to the next character A - Contains the character Carry flag set if it's a number Zero flag set if it's the end of the statement Registers: AF, HL
WRSLT
Address : #0014 Function : Writes a value to an address in another slot. Input : A - Slot ID, see RDSLT HL - Address E - Value Registers: AF, BC, D Remark : See RDSLT
OUTDO
Address : #0018 Function : Output to current output channel (printer, file, etc.) Input : A - PRTFIL, PRTFLG Remark : Used in basic, in ML it's pretty difficult
CALSLT
Address : #001C Function : Executes inter-slot call. Input : IY - High byte with slot ID, see RDSLT IX - The address that will be called Remark : Variables can never be given in alternative registers or IX and IY
DCOMPR
Address : #0020 Function : Compares HL with DE Input : HL, DE Output : Zero flag set if HL and DE are equal. Carry flag set if HL is less than DE. Registers: AF
ENASLT
Address : #0024 Function : Switches indicated slot at indicated page on perpetually Input : A - Slot ID, see RDSLT H - Bit 6 and 7 must contain the page number (00-11)
GETYPR
Address : #0028 Function : Returns Type of DAC Input : DAC Output : S,Z,P/V, CY Registers: AF Remark : Not a very clear routine to me, please mail us if you know more about it.
CALLF
Address : #0030 Function : Executes an interslot call Output : Depends on the calling routine Registers: AF, and the other registers depending on the calling routine Remark : The following is the calling sequence: RST #30 DB destination slot ID, see RDSLT DW destination address
KEYINT
Address : #0038 Function : Executes the timer interrupt process routine
Initialization-routines
INITIO
Address : #003B Function : Initialises the device Registers: All
INIFNK
Address : #003E Function : Initialises the contents of the function keys Registers: All
VDP routines
DISSCR
Address : #0041 Function : Inhibits the screen display Registers: AF, BC
ENASCR
Address : #0044 Function : Displays the screen Registers: AF, BC
WRTVDP
Address : #0047 Function : Write data in the VDP-register Input : B - Data to write C - Number of the register Registers: AF, BC
RDVRM
Address : #004A Function : Reads the content of VRAM Input : HL - Address read Output : A - Value which was read Registers: AF
WRTVRM
Address : #004D Function : Writes data in VRAM Input : HL - Address write A - Value write Registers: AF
SETRD
Address : #0050 Function : Enable VDP to read Input : HL - For VRAM-address Registers: AF
SETWRT
Address : #0053 Function : Enable VDP to write Input : HL - Address Registers: AF
FILVRM
Address : #0056 Function : Fill VRAM with value Input : A - Data byte BC - Length of the area to be written HL - Start address Registers: AF, BC
LDIRMV
Address : #0059 Function : Block transfer to memory from VRAM Input : BC - Block length DE - Start address of memory HL - Start address of VRAM Registers: All
LDIRVM
Address : #005C Function : Block transfer to VRAM from memory Input : BC - Block length DE - Start address of VRAM HL - Start address of memory Registers: All
CHGMOD
Address : #005F Function : Switches to given screen mode Input : A - Screen mode Registers: All
CHGCLR
Address : #0062 Function : Changes the screen colors Input : Foreground color in FORCLR Background color in BAKCLR Border color in BDRCLR Registers: All
NMI
Address : #0066 Function : Executes non-maskable interupt handling routine
CLRSPR
Address : #0069 Function : Initialises all sprites Input : SCRMOD Registers: Alles
INITXT
Address : #006C Function : Switches to SCREEN 0 (text screen with 40×24 characters) Input : TXTNAM, TXTCGP Registers: All
INIT32
Address : #006F Function : Switches to SCREEN 1 (text screen with 32×24 characters) Input : T32NAM, T32CGP, T32COL, T32ATR, T32PAT Registers: All
INIGRP
Address : #0072 Function : Switches to SCREEN 2 (high resolution screen with 256×192 pixels) Input : GRPNAM, GRPCGP, GRPCOL, GRPATR, GRPPAT Registers: All
INIMLT
Address : #0075 Function : Switches to SCREEN 3 (multi-color screen with 64×48 pixels) Input : MLTNAM, MLTCGP, MLTCOL, MLTATR, MLTPAT Registers: All
SETTXT
Address : #0078 Function : Switches VDP to SCREEN 0 mode Input : See INITXT Registers: All
SETT32
Address : #007B Function : Switches VDP to SCREEN 1 mode Input : See INIT32 Registers: All
SETGRP
Address : #007E Function : Switches VDP to SCREEN 2 mode Input : See INIGRP Registers: All
SETMLT
Address : #0081 Function : Switches VDP to SCREEN 3 mode Input : See INIMLT Registers: All
CALPAT
Address : #0084 Function : Returns the address of the sprite pattern table Input : A - Sprite ID Output : HL - For the address Registers: AF, DE, HL
CALATR
Address : #0087 Function : Returns the address of the sprite attribute table Input : A - Sprite number Output : HL - For the address Registers: AF, DE, HL
GSPSIZ
Address : #008A Function : Returns current sprite size Output : A - Sprite size in bytes Carry flag set when size is 16×16 sprites otherwise Carry flag is reset Registers: AF
GRPPRT
Address : #008D Function : Displays a character on the graphic screen Input : A - ASCII value of the character to print
PSG routines
GICINI
Address : #0090 Function : Initialises PSG and sets initial value for the PLAY statement Registers: All
WRTPSG
Address : #0093 Function : Writes data to PSG register Input : A - PSG register number E - Data write
RDPSG
Address : #0096 Function : Reads value from PSG register Input : A - PSG register read Output : A - Value read
STRTMS
Address : #0099 Function : Tests whether the PLAY statement is being executed as a background task. If not, begins to execute the PLAY statement Registers: All
Console routines
CHSNS
Address : #009C Function : Tests the status of the keyboard buffer Output : Zero flag set if buffer is empty, otherwise not set Registers: AF
CHGET
Address : #009F Function : One character input (waiting) Output : A - ASCII code of the input character Registers: AF
CHPUT
Address : #00A2 Function : Displays one character Input : A - ASCII code of character to display
LPTOUT
Address : #00A5 Function : Sends one character to printer Input : A - ASCII code of character to send Output : Carry flag set if failed Registers: F
LPTSTT
Address : #00A8 Function : Tests printer status Output : A - #FF and zero flag reset if printer is ready #00 and zero flag set if not ready Registers: AF
CNVCHR
Address : #00AB Function : Tests for the graphic header and transforms the code Input : A - Character code Output : The carry flag is reset to not the graphic reader The carry flag and zero flag are set to the transformed code is set in A The carry flag is set and zero flag is reset to the untransformed code is set in A Registers: AF
PINLIN
Address : #00AE Function : Stores in the specified buffer the character codes input until the return key or STOP key is pressed Output : HL - For the starting address of the buffer -1 Carry flag set when it ends with the STOP key Registers: All
INLIN
Address : #00B1 Function : Same as PINLIN except that AUGFLG (#F6AA) is set Output : HL - For the starting address of the buffer -1 Carry flag set when it ends with the STOP key Registers: All
QINLIN
Address : #00B4 Function : Prints a question mark and one space Output : HL - For the starting address of the buffer -1 Carry flag set when it ends with the STOP key Registers: All
BREAKX
Address : #00B7 Function : Tests status of CTRL-STOP Output : Carry flag set when pressed Registers: AF Remark : In this routine, interrupts are inhibited
ISCNTC
Address : #00BA Function : Tests status of SHIFT-STOP
CKCNTC
Address : #00BD Function : Same as ISCNTC. used in Basic
BEEP
Address : #00C0 Function : Generates beep Registers: All
CLS
Address : #00C3 Function : Clears the screen Registers: AF, BC, DE Remark : Zero flag must be set to be able to run this routine XOR A will do fine most of the time
POSIT
Address : #00C6 Function : Moves cursor to the specified position Input : H - Y coordinate of cursor L - X coordinate of cursor Registers: AF
FNKSB
Address : #00C9 Function : Tests whether the function key display is active (FNKFLG) If so, displays them, otherwise erase them Input : FNKFLG (#FBCE) Registers: All
ERAFNK
Address : #00CC Function : Erase functionkey display Registers: All
DSPFNK
Address : #00CF Function : Displays the function keys Registers: All
TOTEXT
Address : #00D2 Function : Forces the screen to be in the text mode Registers: All
Controller routines
GTSTCK
Address : #00D5 Function : Returns the joystick status Input : A - Joystick number to test (0 = cursors, 1 = port 1, 2 = port 2) Output : A - Direction Registers: All
GTTRIG
Address : #00D8 Function : Returns current trigger status Input : A - Trigger button to test 0 = space bar 1 = port 1, button A 2 = port 2, button A 3 = port 1, button B 4 = port 2, button B Output : A - #00 trigger button not pressed #FF trigger button pressed Registers: AF
GTPAD
Address : #00DB Function : Returns current touch pad status Input : A - Function call number. Fetch device data first, then read. [ 0] Fetch touch pad data from port 1 (#FF if available) [ 1] Read X-position [ 2] Read Y-position [ 3] Read touchpad status from port 1 (#FF if pressed) [ 4] Fetch touch pad data from port 2 (#FF if available) [ 5] Read X-position [ 6] Read Y-position [ 7] Read touchpad status from port 2 (#FF if pressed) Output : A - Value Registers: All Remark : On MSX2, function call numbers 8-23 are forwarded to NEWPAD in the SubROM.
GTPDL
Address : #00DE Function : Returns current value of paddle Input : A - Paddle number Output : A - Value Registers: All
Tape device routines
TAPION
Address : #00E1 Function : Reads the header block after turning the cassette motor on Output : Carry flag set if failed Registers: All
TAPIN
Address : #00E4 Function : Read data from the tape Output : A - Read value Carry flag set if failed Registers: All
TAPIOF
Address : #00E7 Function : Stops reading from the tape
TAPOON
Address : #00EA Function : Turns on the cassette motor and writes the header Input : A - #00 short header not #00 long header Output : Carry flag set if failed Registers: All
TAPOUT
Address : #00ED Function : Writes data on the tape Input : A - Data to write Output : Carry flag set if failed Registers: All
TAPOOF
Address : #00F0 Function : Stops writing on the tape
STMOTR
Address : #00F3 Function : Sets the cassette motor action Input : A - #00 stop motor #01 start motor #FF reverse the current action Registers: AF
Queue routines
LFTQ
Address : #00F6 Function : Gives number of bytes in queue Output : A - Length of queue in bytes Remark : Internal use
PUTQ
Address : #00F9 Function : Put byte in queue Remark : Internal use
Graphic routines
RIGHTC
Address : #00FC Function : Shifts screen pixel to the right Registers: AF
LEFTC
Address : #00FF Function : Shifts screen pixel to the left Registers: AF
UPC
Address : #0102 Function : Shifts screen pixel up Registers: AF
TUPC
Address : #0105 Function : Tests whether UPC is possible, if possible, execute UPC Output : Carry flag set if operation would end outside the screen Registers: AF
DOWNC
Address : #0108 Function : Shifts screen pixel down Registers: AF
TDOWNC
Address : #010B Function : Tests whether DOWNC is possible, if possible, execute DOWNC Output : Carry flag set if operation would end outside the screen Registers: AF
SCALXY
Address : #010E Function : Scales X and Y coordinates
MAPXY
Address : #0111 Function : Places cursor at current cursor address
FETCHC
Address : #0114 Function : Gets current cursor addresses mask pattern Output : HL - Cursor address A - Mask pattern
STOREC
Address : #0117 Function : Record current cursor addresses mask pattern Input : HL - Cursor address A - Mask pattern
SETATR
Address : #011A Function : Set attribute byte
READC
Address : #011D Function : Reads attribute byte of current screen pixel
SETC
Address : #0120 Function : Returns current screen pixel of specified attribute byte
NSETCX
Address : #0123 Function : Set horizontal screen pixels
GTASPC
Address : #0126 Function : Gets screen relations Output : DE, HL Registers: DE, HL
PNTINI
Address : #0129 Function : Initalises the PAINT instruction
SCANR
Address : #012C Function : Scans screen pixels to the right
SCANL
Address : #012F Function : Scans screen pixels to the left
Misc routines
CHGCAP
Address : #0132 Function : Alternates the CAPS lamp status Input : A - #00 is lamp on not #00 is lamp off Registers: AF
CHGSND
Address : #0135 Function : Alternates the 1-bit sound port status Input : A - #00 to turn off not #00 to turn on Registers: AF
RSLREG
Address : #0138 Function : Reads the primary slot register Output : A - For the value which was read 33221100 ││││││└┴─ Page 0 (#0000-#3FFF) ││││└┴─── Page 1 (#4000-#7FFF) ││└┴───── Page 2 (#8000-#BFFF) └┴─────── Page 3 (#C000-#FFFF) Registers: A
WSLREG
Address : #013B Function : Writes value to the primary slot register Input : A - Value to write, see RSLREG
RDVDP
Address : #013E Function : Reads VDP status register Output : A - Value which was read Registers: A
SNSMAT
Address : #0141 Function : Returns the value of the specified line from the keyboard matrix Input : A - For the specified line Output : A - For data (the bit corresponding to the pressed key will be 0) Registers: AF
PHYDIO
Address : #0144 Function : Executes I/O for mass-storage media like disks Input : F - Set carry to write, reset carry to read 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 Output : F - Carry set on error A - Error code (only if carry set) 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 : Interrupts may be disabled afterwards. On some hard disk interfaces, when bit 7 of register C is set, a 23-bit addressing scheme is used and bits 0-6 of register C contain bits 23-16 of the sector number.
FORMAT
Address : #0147 Function : Initialises mass-storage media like formatting of disks Registers: All Remark : In minimum configuration only a HOOK is available
ISFLIO
Address : #014A Function : Tests if I/O to device is taking place Output : A - #00 if not taking place not #00 if taking place Registers: AF
OUTDLP
Address : #014D 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
GETVCP
Address : #0150 Function : Returns pointer to play queue Input : A - Channel number Output : HL - Pointer Registers: AF Remark : Only used to play music in background
GETVC2
Address : #0153 Function : Returns pointer to variable in queue number VOICEN (byte at #FB38) Input : L - Pointer in play buffer Output : HL - Pointer Registers: AF
KILBUF
Address : #0156 Function : Clear keyboard buffer Registers: HL
CALBAS
Address : #0159 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 an extra value to the routine can be given by first pushing 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: All
CHKNEW
Address : #0165 Function : Tests screen mode Output : Carry 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 (with 16-bit VRAM-address). Input : HL - Address BC - Length A - Data Registers: AF,BC
NSETRD
Address : #016E Function : Same function as SETRD (with 16-bit VRAM-address). Input : HL - VRAM address Registers: AF
NSTWRT
Address : #0171 Function : Same function as SETWRT (with 16-bit VRAM-address). Input : HL - VRAM address Registers: AF
NRDVRM
Address : #0174 Function : Reads VRAM like in RDVRM (with 16-bit VRAM-address). Input : HL - VRAM address Output : A - Read value Registers: F
NWRVRM
Address : #0177 Function : Writes to VRAM like in WRTVRM (with 16-bit VRAM-address). Input : HL - VRAM address A - Value to write Registers: AF
MSX 2+ BIOS Entries
RDRES
Address : #017A Function : Read value of I/O port #F4 Input : None Output : A = value read Registers: AF
WRRES
Address : #017D Function : Write value to I/O port #F4 Input : A = value to write When bit 7 is reset it shows the MSX 2+ startup screen on boot, and counts and initialises the RAM. 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 : Carry 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 : Carry flag set when aborted with CTRL-STOP Registers: All
BiFi