GETSLT: Get slot ID of any page
The BIOS slot routines RDSLT, ENASLT, etc. all take a slot ID. Sometimes you construct this yourself, but often you need to know the slot ID of a page that was already selected before. The initialisation code of ROM cartridges for example typically wants to enable the slot of page 1 in page 2 as well.
You can determine the slot ID of a currently paged address with a GETSLT routine. There is no BIOS routine for this, but the process is described in the MSX2 Technical Handbook and several other references, along with code examples.
This is an assembly implementation which works for all pages (followed by an explanation):
RSLREG: equ 138H EXPTBL: equ 0FCC1H SLTTBL: equ 0FCC5H ; h = memory address high byte (bits 6-7: page) ; a <- slot ID formatted F000SSPP ; Modifies: f, bc, de Memory_GetSlot: call RSLREG bit 7,h jr z,PrimaryShiftContinue rrca rrca rrca rrca PrimaryShiftContinue: bit 6,h jr z,PrimaryShiftDone rrca rrca PrimaryShiftDone: and 00000011B ld c,a ld b,0 ex de,hl ld hl,EXPTBL add hl,bc ex de,hl ld a,(de) and 80H or c ret p ld c,a inc de ; move to SLTTBL inc de inc de inc de ld a,(de) bit 7,h jr z,SecondaryShiftContinue rrca rrca rrca rrca SecondaryShiftContinue: bit 6,h jr nz,SecondaryShiftDone rlca rlca SecondaryShiftDone: and 00001100B or c ret
Explanation
The MSX slot selection system divides the 64K CPU memory address space into
4 pages, from page 0 (0000H-3FFFH) to page 3 (C000H-FFFFH). In each of these
pages you can select a different slot. Some of these slots are internal, others
are for the external cartridge slots. The BIOS routines idenfity a slot with a
slot ID, using the bit-format FxxxSSPP
. The two P bits indicate the
primary slot, the F bit indicates whether the primary slot is expanded, and if
so the S bits indicate the secondary slot.
; h = memory address high byte (bits 6-7: page) ; a <- slot ID formatted F000SSPP ; Modifies: f, bc, de Memory_GetSlot: call RSLREG bit 7,h jr z,PrimaryShiftContinue rrca rrca rrca rrca PrimaryShiftContinue: bit 6,h jr z,PrimaryShiftDone rrca rrca PrimaryShiftDone: and 00000011B
This first part determines the value for the primary slot number (PP
bits)
by reading the primary slot register
through the RSLREG
BIOS routine. The returned byte has two bits to indicate the primary slot for
each of the pages, in the bit-format 33221100
. Because the slot ID
specifies the primary slot number (PP
) in bits 0-1, we shift
until the appropriate bits are in the correct position.
Note that if you need a shorter version hardcoded for a specific page, you can eliminate the conditional code here.
ld c,a ld b,0 ex de,hl ld hl,EXPTBL add hl,bc ex de,hl ld a,(de) and 80H or c ret p
In this second part we determine the value for the expanded flag (F
bit)
by inspecting the EXPTBL
table in system memory. This table consists of 4 bytes, one for each slot, where
bit 7 indicates whether the slot is expanded. Because in rare cases bits 0-6 can
contain a non-zero value, we and
the value with 80H to mask out the
unwanted bits before we insert it into the slot ID. If the slot is not expanded,
we stop here.
ld c,a inc de ; move to SLTTBL inc de inc de inc de ld a,(de) bit 7,h jr z,SecondaryShiftContinue rrca rrca rrca rrca SecondaryShiftContinue: bit 6,h jr nz,SecondaryShiftDone rlca rlca SecondaryShiftDone: and 00001100B or c ret
Lastly we determine the value for the secondary slot number (SS
bits).
Instead of reading from the secondary slot registers directly, which is a
rather complicated affair, we advance the pointer to the
SLTTBL
table, which is a mirror of the four secondary slot registers. These have two
bits to indicate the secondary slot for each memory page, in the same
bit-format 33221100
as the primary slot register. Because the slot
ID specifies the secondary slot number (SS
) in bits 2-3, we shift
until the appropriate bits are in the correct position.
Again note that if you need a shorter version hardcoded for a specific page, you can eliminate the conditional code here.
Now we have fully determined the slot ID for a page.
Grauw