MSX Assembly Page

MSX System Variables

This is an overview of the system variables which you can use. They are official, unless mentioned otherwise.

VDP Registers: R#0-R#7, R#8-R#23, R#25-R#27, R#32-R#45 (not mirrored in system ram), S#0.

MSX System Variables located in Main ROM

NameAddressLengthDescription
CGTABL #0004 2 Base address of the MSX character set in ROM
VDP.DR #0006 1 Base port address for VDP data read
VDP.DW #0007 1 Base port address for VDP data write
#002B 1 Basic ROM version
7 6 5 4 3 2 1 0
│ │ │ │ └─┴─┴─┴── Character set
│ │ │ │           0 = Japanese, 1 = International, 2=Korean
│ └─┴─┴────────── Date format
│                 0 = Y-M-D, 1 = M-D-Y, 2 = D-M-Y
└──────────────── Default interrupt frequency
                  0 = 60Hz, 1 = 50Hz
#002C 1 Basic ROM version
7 6 5 4 3 2 1 0
│ │ │ │ └─┴─┴─┴── Keyboard type
│ │ │ │           0 = Japanese, 1 = International
│ │ │ │           2 = French (AZERTY), 3 = UK, 4 = German (DIN)
└─┴─┴─┴────────── Basic version
                  0 = Japanese, 1 = International
#002D 1 MSX version number
0 = MSX 1
1 = MSX 2
2 = MSX 2+
3 = MSX turbo R
#002E 1 Bit 0: if 1 then MSX-MIDI is present internally (MSX turbo R only)
#002F 1 Reserved

MSX System Variables located in Sub ROM

NameAddressLengthDescription
#0000 2 String "CD", identification of MSX Sub ROM

MSX-DOS (DiskROM) System Variables located in RAM

These addresses are only initialized when a DiskROM is present (e.g. when the machine has a diskdrive or a harddisk interface connected).

NameAddressLengthDescription
RAMAD0 #F341 1 Slot address of RAM in page 0 (DOS)
RAMAD1 #F342 1 Slot address of RAM in page 1 (DOS)
RAMAD2 #F343 1 Slot address of RAM in page 2 (DOS/BASIC)
RAMAD3 #F344 1 Slot address of RAM in page 3 (DOS/BASIC)
#F348 1 Main DiskROM slot address

MSX System Variables located in RAM

This is the start of the MSX BIOS system area.

NameAddressLengthDescription
RDPRIM #F380 5 Routine that reads from a primary slot
WRPRIM #F385 7 Routine that writes to a primary slot
CLPRIM #F38C 14 Routine that calls a routine in a primary slot
USRTAB #F39A 2 Address to call with Basic USR0
#F39C 2 Address to call with Basic USR1
#F39E 2 Address to call with Basic USR2
#F3A0 2 Address to call with Basic USR3
#F3A2 2 Address to call with Basic USR4
#F3A4 2 Address to call with Basic USR5
#F3A6 2 Address to call with Basic USR6
#F3A8 2 Address to call with Basic USR7
#F3AA 2 Address to call with Basic USR8
#F3AC 2 Address to call with Basic USR9
LINL40 #F3AE 1 Width for SCREEN 0 (default 37)
LINL32 #F3AF 1 Width for SCREEN 1 (default 29)
LINLEN #F3B0 1 Width for the current text mode
CRTCNT #F3B1 1 Number of lines on screen
CLMLST #F3B2 1 Column space. It’s uncertain what this address actually stores
TXTNAM #F3B3 2 BASE(0) - SCREEN 0 name table
TXTCOL #F3B5 2 BASE(1) - SCREEN 0 color table
TXTCGP #F3B7 2 BASE(2) - SCREEN 0 character pattern table
TXTATR #F3B9 2 BASE(3) - SCREEN 0 Sprite Attribute Table
TXTPAT #F3BB 2 BASE(4) - SCREEN 0 Sprite Pattern Table
T32NAM #F3BD 2 BASE(5) - SCREEN 1 name table
T32COL #F3BF 2 BASE(6) - SCREEN 1 color table
T32CGP #F3C1 2 BASE(7) - SCREEN 1 character pattern table
T32ATR #F3C3 2 BASE(8) - SCREEN 1 sprite attribute table
T32PAT #F3C5 2 BASE(9) - SCREEN 1 sprite pattern table
GRPNAM #F3C7 2 BASE(10) - SCREEN 2 name table
GRPCOL #F3C9 2 BASE(11) - SCREEN 2 color table
GRPCGP #F3CB 2 BASE(12) - SCREEN 2 character pattern table
GRPATR #F3CD 2 BASE(13) - SCREEN 2 sprite attribute table
GRPPAT #F3CF 2 BASE(14) - SCREEN 2 sprite pattern table
MLTNAM #F3D1 2 BASE(15) - SCREEN 3 name table
MLTCOL #F3D3 2 BASE(16) - SCREEN 3 color table
MLTCGP #F3D5 2 BASE(17) - SCREEN 3 character pattern table
MLTATR #F3D7 2 BASE(18) - SCREEN 3 sprite attribute table
MLTPAT #F3D9 2 BASE(19) - SCREEN 3 sprite pattern table
CLIKSW #F3DB 1 =0 when key press click disabled
=1 when key press click enabled
SCREEN ,,n will write to this address
CSRY #F3DC 1 Current row-position of the cursor
CSRX #F3DD 1 Current column-position of the cursor
CNSDFG #F3DE 1 =0 when function keys are not displayed
=1 when function keys are displayed
RG0SAV #F3DF 1 Mirror of VDP register 0 (Basic: VDP(0))
RG1SAV #F3E0 1 Mirror of VDP register 1 (Basic: VDP(1))
RG2SAV #F3E1 1 Mirror of VDP register 2 (Basic: VDP(2))
RG3SAV #F3E2 1 Mirror of VDP register 3 (Basic: VDP(3))
RG4SAV #F3E3 1 Mirror of VDP register 4 (Basic: VDP(4))
RG5SAV #F3E4 1 Mirror of VDP register 5 (Basic: VDP(5))
RG6SAV #F3E5 1 Mirror of VDP register 6 (Basic: VDP(6))
RG7SAV #F3E6 1 Mirror of VDP register 7 (Basic: VDP(7))
STATFL #F3E7 1 Mirror of VDP(8) status register (S#0)
TRGFLG #F3E8 1 Information about trigger buttons and space bar state
7 6 5 4 3 2 1 0
│ │ │ │       └── Space bar, trig(0) (0 = pressed)
│ │ │ └────────── Stick 1, Trigger 1 (0 = pressed)
│ │ └──────────── Stick 1, Trigger 2 (0 = pressed)
│ └────────────── Stick 2, Trigger 1 (0 = pressed)
└──────────────── Stick 2, Trigger 2 (0 = pressed)
FORCLR #F3E9 1 Foreground color
BAKCLR #F3EA 1 Background color
BDRCLR #F3EB 1 Border color
MAXUPD #F3EC 3 Jump instruction used by Basic LINE command. The routines used are: RIGHTC, LEFTC, UPC and DOWNC
MINUPD #F3EF 3 Jump instruction used by Basic LINE command. The routines used are: RIGHTC, LEFTC, UPC and DOWNC
ATRBYT #F3F2 1 Attribute byte (for graphical routines it’s used to read the color)
QUEUES #F3F3 2 Queue table address, see QUETAB (initial value).
FRCNEW #F3F5 1 CLOAD flag
=0 when CLOAD
=255 when CLOAD?
SCNCNT #F3F6 1 Key scan timing
When it’s zero, the key scan routine will scan for pressed keys so characters can be written to the keyboard buffer
REPCNT #F3F7 1 This is the key repeat delay counter
When it reaches zero, the key will repeat
PUTPNT #F3F8 2 Address in the keyboard buffer where a character will be written
GETPNT #F3FA 2 Address in the keyboard buffer where the next character is read
CS120 #F3FC 5 Cassette I/O parameters to use for 1200 baud
CS240 #F401 5 Cassette I/O parameters to use for 2400 baud
LOW #F406 2 Signal delay when writing a 0 to tape
HIGH #F408 2 Signal delay when writing a 1 to tape
ASPCT1 #F40B 2 Horizontal / Vertical aspect for CIRCLE command
ASPCT2 #F40D 2 Horizontal / Vertical aspect for CIRCLE command
ENDPRG #F40F 5 Pointer for the RESUME NEXT command
ERRFLG #F414 1 Basic Error code
LPTPOS #F415 1 Printer head position
Is read by Basic function LPOS and used by LPRINT Basic command
PRTFLG #F416 1 Printer output flag is read by OUTDO
=0 to print to screen
=1 to print to printer
NTMSXP #F417 1 Printer type is read by OUTDO. SCREEN ,,,n writes to this address
=0 for MSX printer
=1 for non-MSX printer
RAWPRT #F418 1 Raw printer output is read by OUTDO
=0 to convert tabs and unknown characters to spaces and remove graphical headers
=1 to send data just like it gets it
VLZADR #F419 2 Address of data that is temporarilly replaced by ‘O’ when Basic function VAL("") is running
VLZDAT #F41B 1 Original value that was in the address pointed to with VLZADR
CURLIN #F41C 2 Line number the Basic interpreter is working on, in direct mode it will be filled with #FFFF
QUETAB #F959 24

Queue-table containing queue information. There are four queues in total, three PLAY queues and one RS232 queue, with 6-byte information blocks per queue:

0Queue head offset (for writing).
1Queue tail offset (for reading).
2Flag indicating whether a byte has been returned.
3Queue size.
4-5Queue start address.
#F91F 1 Character set SlotID
#F920 2 Character set address
EXBRSA #FAF8 1 SUBROM slot address (EXtended Bios-Rom Slot Address)
XSAVE #FAFE 1 Light pen X coordinate read from the device (internal use only).
XOFFS #FAFF 1 Light pen X calibration offset
  • Bit 0-6: X calibration offset
  • Bit 7: A light pen interrupt occurred. Used internally by the MSX-BIOS, user software mustn’t set it.
YSAVE #FB00 1 Light pen Y coordinate read from the device (internal use only).
YOFFS #FB01 1 Light pen Y calibration offset
  • Bit 0-6: Y calibration offset
  • Bit 7: Reserved for future use. Mask from reads and do not set.
DRVINF #FB21 1 Nr. of drives connected to disk interface 1
#FB22 1 Slot address of disk interface 1
#FB23 1 Nr. of drives connected to disk interface 2
#FB24 1 Slot address of disk interface 2
#FB25 1 Nr. of drives connected to disk interface 3
#FB26 1 Slot address of disk interface 3
#FB27 1 Nr. of drives connected to disk interface 4
#FB28 1 Slot address of disk interface 4
EXPTBL #FCC1 1 Slot 0: #80 = expanded, 0 = not expanded. Also main BIOS-ROM slot address.
#FCC2 1 Slot 1: #80 = expanded, 0 = not expanded.
#FCC3 1 Slot 2: #80 = expanded, 0 = not expanded.
#FCC4 1 Slot 3: #80 = expanded, 0 = not expanded.
SLTTBL #FCC5 1 Mirror of slot 0 secondary slot selection register.
#FCC6 1 Mirror of slot 1 secondary slot selection register.
#FCC7 1 Mirror of slot 2 secondary slot selection register.
#FCC8 1 Mirror of slot 3 secondary slot selection register.
RG8SAV #FFE7 1 Mirror of VDP register 8 (Basic: VDP(9), note: +1)
RG9SAV #FFE8 1 Mirror of VDP register 9 (Basic: VDP(10), note: +1)
RG10SA #FFE9 1 Mirror of VDP register 10 (Basic: VDP(11), note: +1)
RG11SA #FFEA 1 Mirror of VDP register 11 (Basic: VDP(12), note: +1)
RG12SA #FFEB 1 Mirror of VDP register 12 (Basic: VDP(13), note: +1)
RG13SA #FFEC 1 Mirror of VDP register 13 (Basic: VDP(14), note: +1)
RG14SA #FFED 1 Mirror of VDP register 14 (Basic: VDP(15), note: +1)
RG15SA #FFEE 1 Mirror of VDP register 15 (Basic: VDP(16), note: +1)
RG16SA #FFEF 1 Mirror of VDP register 16 (Basic: VDP(17), note: +1)
RG17SA #FFF0 1 Mirror of VDP register 17 (Basic: VDP(18), note: +1)
RG18SA #FFF1 1 Mirror of VDP register 18 (Basic: VDP(19), note: +1)
RG19SA #FFF2 1 Mirror of VDP register 19 (Basic: VDP(20), note: +1)
RG20SA #FFF3 1 Mirror of VDP register 20 (Basic: VDP(21), note: +1)
RG21SA #FFF4 1 Mirror of VDP register 21 (Basic: VDP(22), note: +1)
RG22SA #FFF5 1 Mirror of VDP register 22 (Basic: VDP(23), note: +1)
RG23SA #FFF6 1 Mirror of VDP register 23 (Basic: VDP(24), note: +1)
ROMSLT #FFF7 1 Main BIOS slot ID. (MSX2 and up only)
RG25SA #FFFA 1 Mirror of VDP register 25 (Basic: VDP(26), note: +1)
RG26SA #FFFB 1 Mirror of VDP register 26 (Basic: VDP(27), note: +1)
RG27SA #FFFC 1 Mirror of VDP register 27 (Basic: VDP(28), note: +1)
#FFFF 1

Secondary slot select register, if the slot is expanded.

7 6 5 4 3 2 1 0
│ │ │ │ │ │ └─┴── Secondary slot for page 0 (#0000-#3FFF)
│ │ │ │ └─┴────── Secondary slot for page 1 (#4000-#7FFF)
│ │ └─┴────────── Secondary slot for page 2 (#8000-#BFFF)
└─┴────────────── Secondary slot for page 3 (#C000-#FFFF)

Reading returns the inverse of the current subslot selection. Values are mirrored in SLTTBL for convenience.

Note that each expanded primary slot has its own register. To access a specific primary slot’s register, you need to select it in page 3 before reading the value.

BiFi