KSS Music Format Spec


V1.03 - Nov. 26, 2000 Added MSX-AUDIO mode
V1.02 - Oct. 5, 2000  Added RAM mode
V1.01 - Aug. 8, 2000  Added KSS 8k mapper
V1.00 - Jul. 22, 2000 First unofficial KSS specification file


By: Mamiya mamiya@proc.org.tohoku.ac.jp


[FILE FORMAT]

0000    4BYTES    magic 'KSCC'
0004    WORD(LE)  load address of Z80 address space (0000-FFFF)
0006    WORD(LE)  length of initial data in byte (0000-FFFF)
0008    WORD(LE)  init address of Z80 address space (0000-FFFF)
000A    WORD(LE)  play address of Z80 address space (0000-FFFF)
000C    BYTE      start(offset) no of bank
000D    BYTE      8/16kbytes banked extra data blocks support
                   bits 0-6: number of 8/16kbytes banked extra data blocks
                   bit 7: if set, this song uses KSS 8k mapper
000E    BYTE      reserved for expansion (must be 00h)
000F    BYTE      extra sound chip support
                   bit 0: if set, this song uses FMPAC(bit 1=0),FMUNIT(bit 1=1)
                   bit 1: if set, this song uses SN76489
                   bit 2: if set, this song uses RAM(bit 1=0),GG stereo(bit 1=1)
                   bit 3: if set, this song uses MSX-AUDIO(bit 1=0),RAM(bit 1=1)
                   bits 4-7: reserved. they *must* be 0
0010    n BYTES   specified length initial data

0010+n  16kBYTES  1st 16k block of extra data(option)
4010+n  16kBYTES  2nd 16k block of extra data(option)
...

0010+n  8kBYTES   1st 8k block of extra data(option)
2010+n  8kBYTES   2nd 8k block of extra data(option)
...

[KSS 16k mapper memory map]

0000
 |      RAM(R/W)
7FFF
8000
 |      16k banked ROM(R), SCC/SCC+ memory mapped I/O(W:9800-988F,B800-B8AF)
BFFF
C000
 |      RAM(R/W)
FFFF

[KSS 16k mapper RAM mode memory map]

0000
 |      RAM(R/W)
7FFF
8000
 |      RAM(R/W:initial data),ROM(R:extra data),SCC/SCC+(W:extra data)
BFFF
C000
 |      RAM(R/W)
FFFF

[KSS 8k mapper memory map]

0000
 |      RAM(R/W)
7FFF
8000
 |      1st 8k banked ROM(R),select(W:9000),SCC memory mapped I/O(W:9800-988F)
9FFF
A000
 |      2nd 8k banked ROM(R),select(W:B000),SCC+ memory mapped I/O(W:B800-B8AF)
BFFF
C000
 |      RAM(R/W)
FFFF

[KSS I/O map]

06      GG stereo port(W)
A0      AY3-8910 address port(W)
A1      AY3-8910 data port(W)
A2      AY3-8910 read port(R)
7C      FMPAC address port(W)
7D      FMPAC data port(W)
7E      SN76489 port(W)
7F      SN76489 port(W)(mirror of 7E)
C0      MSX-AUDIO address port(W)
C1      MSX-AUDIO data port(W)
F0      FMUNIT address port(W)
F1      FMUNIT data port(W)
FE      KSS 16kbytes-banked ROM select port(W)
         Initial area will be mapped, when ilegal value is writed.
         (start no) <= (legal value) < (start no) + (number of blocks)


[Loading process]

1) Clear all Z80 address space(0000h-ffffh).
2) Fill RAM at 0000h-3fffh with c9h('ret' code).
3) Write WRTPSG codes(d3h,a0h,f5h,7Bh,d3h,a1h,f1h,c9h) from 0001h.
4) Write WRTPSG entry codes(c3h,01h,00h) from 0093h.
5) Write RDPSG codes(d3h,a0h,dbh,a2h,c9h,) from 0009h.
6) Write RDPSG entry codes(c3h,09h,00h) from 0096h.
7) Load the data into the init address of initial Z80 address space.


[Initializing process]

1) Initialize Z80 address space on 'loading process'.
2) Set the accumulator for the desired song.
3) Initialize stack pointer to f380h.
4) Call the init address.


[Playing process]

1) Call the play address at 60Hz.
