While the West had the IBM PC's, Japan decided to go a different route!
Starting with the PC-8800 (PC-88) series and 8086 processors, and leading
on into the PC-9800 series (PC-98) the Japanese market produced x86 based
non IBM compatible computers.
While these machines may run DOS and Windows, they do not use IBM
compatible hardware (The Dos/Windows software are special versions
designed to work with the hardware), so games and software from the west
will not work on these machines
MsDos calls such as keyboard reading and text writing may work, so a
program that only uses MS-Dos functions may work correctly,
however the video hardware is completely different to western machines,
with the text and bitmap graphics appearing as separate layers, the Bios
calls for keyboard access are also different, so western programs that use
the Bios Keyboard access (rather than MS-Dos ones) will not work.
The PC-98 series ranges over more
than a decade, with a wide variety of features, but the ones we'll
focus on are based on the later models shown below.
|
![]() |
Resources
PC-9801 Programmers
Bible - Best tech manual
PC9800
TechnicalDataBook - HARDWARE 1993 - Not as good, but still very
useful
PC-9800
TechnicalDataBook BIOS 1992 - Bios call reference (INTs) Note, these
are different to IBM Pc's!
Japanese MS-Dos Handbook
- Though dos calls should be the same as western systems
Memory map
20 bit address | Purpose |
$0 0000 | Ram |
$1 0000 | Ram |
$2 0000 | Ram |
$3 0000 | Ram |
$4 0000 | Ram |
$5 0000 | Ram |
$6 0000 | Ram |
$7 0000 | Ram |
$8 0000 | |
$9 0000 | |
$A 0000 | Text Characters (2 bytes per char) |
$A 2000 | Text
Attributes %GRBVUrbs (V=vertline U=Underline r=reverse b=blink s=secret (1=show / 0 = hide)) |
$A 4000 | CG Window 4k |
$A 5000 | |
$A 8000 | GVRAM0 Plane 0 B |
$A BE80 | GVRAM0 Plane 1 B |
$A FD00 | |
$B 0000 | GVRAM1 Plane 0 R |
$B 3E80 | GVRAM1 Plane 1 R |
$B 8000 | GVRAM2 Plane 0 G |
$B BE80 | GVRAM2 Plane 1 G |
$B FD00 | |
$C 0000 | EMS Memory Window 32k x 4 |
$D 0000 | Kanji Ram |
$D 4000 | Dictionary Rom |
$D 8000 | KGC Rom |
$D C000 | |
$E 0000 | GVRAM3 Plane 0 I |
$E 3E80 | GVRAM3 Plane 1 I |
$E 8000 | Bios, Basic Rom 128k |
$F 0000 | Bios, Basic Rom 128k |
Ports
Port | Data | Details |
60h | %GGGGGGGG | GDC Parameter |
62h | %GGGGGGGG | GDC Command |
64h | CRTC Interrupt | |
68h | %----001T | Monochrome mode (1=Mono 0=Color) |
68h | %----010T | Text Resolution (1=320x200 0=640x200) |
68h | %----011F | Font (0=6x8 1=7x13) |
68h | %----100L | Screen Lines (0=400 1=200) |
6Ah | %-------M | Color Mode (0=8 color 1=16 color) (see other 9821 options below) |
6Ch | %IGRB0000 | Border color RGB Intensity |
7Ch | %CR--3210 | C=CG mode R=RMW Mode 3210=Plane 3210 enable (1=no 0=yes) |
A0h | %GGGGGGGG | GDC Parameter |
A2h | %GGGGGGGG | GDC Command |
A4h | %-------P | Select Display graphics plane |
A6h | %-------P | Select Write graphics plane |
A8h | %----PPPP | Select Palette |
AAh | %----GGGG | Set palette Green (all 8 bits in 256 col mode) |
ACh | %----RRRR | Set palette Red (all 8 bits in 256 col mode) |
AEh | %----BBBB | Set palette Blue (all 8 bits in 256 col mode) |
&0188 (Varies) | %RRRRRRRR | FM Port 1 Regselect |
&018A (Varies) | %DDDDDDDD | FM Port 2 Data |
Port 68h Extended options | |
00h
|
ATR4 batch call line |
01h | ATR4 simple graph |
02h | Color Graphics mode |
03h | Monocrome graphics mode |
04h | 80 char mode |
05h | 40 char mode |
06h | Chars 6x8 |
07h | Chars 7x13 |
08h | 400 line hires |
09h | 200 lines |
0Ah | Code access mode |
0Bh | Bitmap mode |
0Ch | Disable writing to undefined memory |
0Dh | Enable writing to undefined memory |
0Eh | Disable screen |
0Fh | Enable screen |
Port 6Ah Extended options | |
00h | 8 color |
01h | 16 color |
04h | GRCC mode |
05h | EGC mode |
06h | Extended mode off |
07h | Extended mode on |
20h | Normal Graphics mode |
21h | Extended graphics (256 color) |
26h | Normal Display |
27h | Full screen reverse |
28h | Normal combine |
29h | Mathematic combine |
2Ah | Normal Palette write |
2Bh | Fast Palette write |
2Ch | Overscan color off |
2Dh | Overscan color on |
40h | CRT mode |
41h | Plasma display mode |
62h | plane format vram |
63h | packed pixel vram |
68h | Front back plane separate |
69h | Front back plane continuous |
6Ch | first pixel left |
6Dh | first pixel right |
84h | GDC 2.5mhz |
83h / 85h | GDC 5mhz |
GDC Commands (Port 60h / 62h) | |||
Command | Function | Data | |
%00000000 | Reset | 8 bytes | |
%01101011 | Start | Show Text | |
%00001101 | Start | Show Text (Alternate ver) | |
%00001100 | Stop | Hide Text | |
%0111RRRR | Scroll | R=Parameter type | |
%01001011 | CSR Form | Cursor Settings | %C00LLLLL %BBDCCCCC %CCCCCBBB |
%01000111 | Pitch | Vram width setting | %PPPPPPPP |
%01001001 | CSRW | Write Cursor p0s | %LLLLLLLL %000HHHHH |
%11100000 | CSRR | Read Cursor | %LLLLLLLL %000HHHHH %???????? %???????? %???????? |
INT interrupts
Interrupts | PC-9821 | IBM PC
(Not this system!) |
05h (varies) | Sound | |
10h | Video | |
11h | Determine Config | |
12h | Determine Memory size | |
13h | Disk | |
14h | Serial | |
15h | Cassette (AT) | |
16h | Keyboard | |
17h | Parallel | |
18h | Keyboard / CRT / Graphics | Call ROM Basic |
19h | Rs232 | Boot Process |
1Ah | Printer | Date and Time |
1Bh | Hard Disk | Break Key |
1Ch | Timer | Periodic Interrupt |
1Dh | Graphics | Video Table |
1Eh | Drive Table | |
1Fh | Character Table | |
20h | MS Dos Terminate | MS Dos Terminate |
21h | MS Dos Call | MS Dos Call |
22h | Terminate address | Terminate address |
23h | Ctrl-C | Ctrl-C |
24h | Critical error handler | Critical error handler |
25h | Absolute Disk Read | Absolute Disk Read |
26h | Absolute Disk Write | Absolute Disk Write |
27h | Terminate and stay resident | Terminate and stay resident |
2Fh | XMS Memory | Print Spooler |
33h | Mouse | Mouse |
67h | Memory | EMS |
A0h | Graphics LIO Init | |
A1h | GScreen Graphics mode | |
A2h | GView | |
A3h | GColor | |
A4h | GColor2 | |
A5h | GCLS | |
A6h | GPset | |
A7h | Gline | |
A8h | Gcircle | |
A9h | Gpaint1 | |
AAh | Gpaint2 | |
ABh | GGET | |
ACh | GPUT1 | |
ADh | GPUT2 | |
AEh | Groll | |
AFh | Gpoint | |
CEh | Gcopy |
INT 21 dos calls
INT 21h - Dos calls | |
00h
|
End Program |
01h | Read Keyboard Input and echo |
02h | Print Character |
03h | Aux Input |
04h | Aux Output |
05h | Print to printer |
06h | Direct Console I/O |
07h | Direct Console Input |
08h | Direct Console input - No echo |
09h | Print String |
0Ah | Buffered keyboard input |
0Bh | Keyboard status check |
0Ch | Clear keyboard buffer |
0Dh | Disk reset |
0Eh | Select Drive |
0Fh | File open |
10h | File Close |
11h | Find first directory entry |
12h | Find next directory entry |
13h | Delete file |
14h | Read Sequential |
15h | Write Sequential |
16h | Create file |
17h | Rename file |
19h | Get current drive |
1Ah | Set Disk transfer address |
1Bh | Get Default drive |
1Ch | Get Drive Data |
21h | Read Random |
22h | Write Random |
23h | Calculate file size |
24h | Set record field |
25h | Set Interrupt vector |
26h | Create New PSP (Program Segment Prefix) |
27h | Read Random Block |
28h | Write Random Block |
29h | Examine file name |
2Ah | Read Date |
2Bh | Set Date |
2Ch | Read Time |
2Dh | Set Time |
2Eh | Set Verify Flag |
2Fh | Get Disk transfer address |
30h | Read DOS Version Number |
31h | Terminate and stay resident |
33h | Break Check setting |
35h | Read Interrupt Vector |
36h | Read Free space |
38h | Read/Set Country info |
39h | Create Subdirectory |
3Ah | Delete Subdirectory |
3Bh | Change current directory |
3Ch | Create a file |
3Dh | File Open |
3Eh | File Close |
3Fh | Read File/Device |
40h | Write File/Device |
41h | Delete File |
42h | Move file pointer |
43h | Change File Attributes |
44h | Device I/O Control |
45h | Copy File Handle |
46h | Copy to specified file handle |
47h | Read Current Directory |
48h | Allocate Memory block |
49h | Release Memory block |
4Ah | Change Memory block size |
4Bh | Load and Execute program |
4Ch | End process |
4Dh | Read Child process return code |
4Eh | Find File |
4Fh | Find next File |
54h | Read Verify Flag |
56h | Move Directory Entry |
57h | Read or Set File Date/Time |
Keyboard Keycodes
Top bits | |||||||||
0-h | 1-h |
2-h |
3-h |
4-h |
5-h |
6-h |
7-h |
||
B o t t o m b i t s |
-0h
|
Esc | Q | F | , | - | . | Stop | Shift |
-1h | 1 | W | G | . | / | Nfer | Copy | Caps | |
-2h | 2 | E | H | / | 7 | VF1 | F1 | Kana | |
-3h | 3 | R | J | _ | 8 | VF2 | F2 | Grph | |
-4h | 4 | T | K | Space | 9 | VF3 | F3 | Ctrl | |
-5h | 5 | Y | L | Xfer | * | VF4 | F4 | ||
-6h | 6 | U | ; | RlUp | 4 | VF5 | F5 | ||
-7h | 7 | I | : | RlDn | 5 | F6 | |||
-8h | 8 | O | ] | Ins | 6 | F7 | |||
-9h | 9 | P | Z | Del | + | F8 | |||
-Ah | 0 | @ | X | Up | 1 | F9 | |||
-Bh | - | [ | C | Down | 2 | F10 | |||
-Ch | ^ | Enter | V | Left | 3 | ||||
-Dh | \ | A | B | Right | = | ||||
-Eh | Bkspc | S | N | HmClR | 0 | ||||
-Fh | Tab | D | M | Help | , |
Keycode Groups (INT 18h AH=04h)
Bits | |||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
K e y c o d e G r o u p |
0 |
Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 8 | 9 | 0 | - | ^ | \ | Bkspc | Tab | |
2 | Q | W | E | R | T | Y | U | I | |
3 | O | P | @ | [ | Enter | A | Stop | D | |
4 | F | G | H | J | K | L | + | * | |
5 | ] | Z | X | C | V | B | N | M | |
6 | , | . | / | _ | Space | Xfer | RlUp | RlDn | |
7 | Ins | Del | Up | Down | Left | Right | HmClr | Help | |
8 | - | / | 7 | 8 | 9 | * | 4 | 5 | |
9 | 6 | + | 1 | 2 | 3 | = | 0 | , | |
A | . | Nfer | VF1 | VF2 | VF3 | VF4 | VF5 | ||
B | Home | ||||||||
C | Stop | Copy | F1 | F2 | F3 | F4 | F5 | F6 | |
D | F7 | F8 | F9 | F10 | |||||
E | Shift | Caps | Kana | Grph | Ctrl |
INT 18h calls | |||
AH value | Function | Input | Output |
00h | Read key data | AH=Keycode AL=Keydata | |
01h | Read keybuffer status | AH=Keycode AL=Keydata BH=Bufferstatus (1=data 0=empty) | |
02h | Inspect shift status | AL=% - - - Ctrl Grph Kana Caps Shift | |
03h | Reset Keyboard interface status | ||
04h | Inspect Key input status | AL=Keycode Group | AH=Keygroup key status |
05h | Read a key from the keybuffer | AH=Keycode | AL=Keydata BX=Status (1=success 0=fail) |
06h | Reset buffer | ||
07h | Read Shift Keys + Key data | AH=Keycode AL=Keydata BL=% - - - Ctrl Grph Kana Caps Shift | |
08h | Inspect Shift Keys + Key data | AH=Keycode AL=Keydata BL=% - - - Ctrl Grph Kana Caps Shift | |
09h | Create Key data | AL=Keycode BL=Shifts | AH=Keycode AL=Keydata |
256 colors mode
In 256 color mode, the VRAM is accessed through two 32k 'windows', one is at A8000h (defined by address E0004h) , the other is at B0000h (defined by address E0006h)
$A 8000 | VRAM Window 0 (Defined by E0004h) |
$B 0000 | VRAM Window 1 (Defined by E0006h) |
$B 8000 | Unused |
$C 0000 | EMS Memory Window 32k x 4 |
$D 0000 | Kanji Ram |
$D 4000 | Dictionary Rom |
$D 8000 | KGC Rom |
$D C000 | |
$E 0000 | 256 color VRAM selection registers |
$E 8000 | Bios, Basic Rom 128k |
$F 0000 | Bios, Basic Rom 128k |
Calculating VRAM destination:
VRAM = Yline *640 + Xpixel
BankOffset = A8000h + (VRAM & 7FFFh)
Bank = VRAM >> 15
Write Bank to E0004h
Write Bank+1 to E0006h
24 Bit | 16 Bit | 8 Bit | |||||||||||||||||||||
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | F | E | D | C | B | A | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | - | - | - | - | B | B | B | B | O | O | O | O | O | O | O | O | O | O | O | O | O | O | O |
256 color bank registers (In ram) | ||
E0004h | Word | VRAM bank window 0 (Bank: 0000-000F) |
E0006h | Word | VRAM bank window 1 (Bank: 0000-000F) |
E0100h | Byte | Mode (00=Packed pixel 01=Planar) |
E0102h | Word | Enable VRAM at F00000h (0000=no 0001=yes) |
SSG Registers (AY type)
Register | Meaning | Bit Meaning | Details |
0 | Tone Pitch L - Channel A (Left) | LLLLLLLL | Lower value = Higher pitch |
1 | Tone Pitch H - Channel A (Left) | ----HHHH | Lower value = Higher pitch |
2 | Tone Pitch L - Channel B (Center) | LLLLLLLL | Lower value = Higher pitch |
3 | Tone Pitch H - Channel B (Center) | ----HHHH | Lower value = Higher pitch |
4 | Tone Pitch L - Channel C (Right) | LLLLLLLL | Lower value = Higher pitch |
5 | Tone Pitch H - Channel C (Right) | ----HHHH | Lower value = Higher pitch |
6 | Noise Generator | ---NNNNN | Higher value = Faster noise |
7 | Mixer + IO | BANNNTTT | N=Noise T=Tone (Channel --CBACBA 1=mute 0=normal) BA=Port B/A direction (1=out 0=in) |
8 | Amplitude - Channel A (Left) | ---EVVVV | E=Envelope (1=Enabled) VVVV=Volume |
9 | Amplitude - Channel B (Center) | ---EVVVV | E=Envelope (1=Enabled) VVVV=Volume |
10 | Amplitude - Channel C (Right) | ---EVVVV | E=Envelope (1=Enabled) VVVV=Volume |
11 | Envelope L (Volume over time) | LLLLLLLL | Lower value=Faster Envelope |
12 | Envelope H (Volume over time) | HHHHHHHH | Lower value=Faster Envelope |
13 | Envelope Selection | ----EEEE | Envelope number (See PDF) |
14 |
IO Port A | DDDDDDDD | IO Data port A (joy select) |
15 |
IO Port B | DDDDDDDD | IO Data port B (Joy data) |
FM Sound with the YM2608
Get the YM2608
PDF for all the info!
The FM chip uses 2 pairs of ports, ???????? and ???? select the
address of the register we want to change, ???? and ????? write the new
data, but after each write, we need to check if the FM chip is busy,
To check if the FM chip is busy, read in from port ?????, and check bit 7
- it will return 0 when not busy.
This data is copied from the Genesis
Reg |
Purpose | Chn/Op |
Bits | Details |
$24 | Timer A low | ALL | TTTTTTTT | Timer bits 10-2 |
$25 | Timer A high | ALL | ------TT | Timer bits 1-0 |
$26 | Timer B | ALL | TTTTTTTT | Timer B |
$27 | Ch3 CSM Mode & Ch3 Multi-Mode & Enable Timers | ALL | 33RROOSS | 3= Chn 3 mode / R=timer resets / O= Timer overflows / S = Timer StartStop |
$28 | Individual Operator Key On/Off | ALL | OOOO-CCC | O=operator (%4321----) / C=Channel (%000=chn 1 %110=chn6) |
$29 | SCH, IRQ Enable | ALL | S--IIIII | S=Sixchannel / I=IRQ Enable |
$2A | DAC Write | ALL | DDDDDDDD | D=Data |
$2B | DAC Enable | ALL | E------- | E=enable |
$30 | Multiplier & Detune | Ch1 Op1 | -DDDMMMM | D=Detune / M=Multiplier |
$31 | Multiplier & Detune | Ch2 Op1 | -DDDMMMM | D=Detune / M=Multiplier |
$32 | Multiplier & Detune | Ch3 Op1 | -DDDMMMM | D=Detune / M=Multiplier |
$34 | Multiplier & Detune | Ch1 Op2 | -DDDMMMM | D=Detune / M=Multiplier |
$35 | Multiplier & Detune | Ch2 Op2 | -DDDMMMM | D=Detune / M=Multiplier |
$36 | Multiplier & Detune | Ch3 Op2 | -DDDMMMM | D=Detune / M=Multiplier |
$38 | Multiplier & Detune | Ch1 Op3 | -DDDMMMM | D=Detune / M=Multiplier |
$39 | Multiplier & Detune | Ch2 Op3 | -DDDMMMM | D=Detune / M=Multiplier |
$3A | Multiplier & Detune | Ch3 Op3 | -DDDMMMM | D=Detune / M=Multiplier |
$3C | Multiplier & Detune | Ch1 Op4 | -DDDMMMM | D=Detune / M=Multiplier |
$3D | Multiplier & Detune | Ch2 Op4 | -DDDMMMM | D=Detune / M=Multiplier |
$3E | Multiplier & Detune | Ch3 Op4 | -DDDMMMM | D=Detune / M=Multiplier |
$40 | Total Level | Ch1 Op1 | -TTTTTTT | T=Total Level (0=largest) |
$41 | Total Level | Ch2 Op1 | -TTTTTTT | T=Total Level (0=largest) |
$42 | Total Level | Ch3 Op1 | -TTTTTTT | T=Total Level (0=largest) |
$44 | Total Level | Ch1 Op2 | -TTTTTTT | T=Total Level (0=largest) |
$45 | Total Level | Ch2 Op2 | -TTTTTTT | T=Total Level (0=largest) |
$46 | Total Level | Ch3 Op2 | -TTTTTTT | T=Total Level (0=largest) |
$48 | Total Level | Ch1 Op3 | -TTTTTTT | T=Total Level (0=largest) |
$49 | Total Level | Ch2 Op3 | -TTTTTTT | T=Total Level (0=largest) |
$4A | Total Level | Ch3 Op3 | -TTTTTTT | T=Total Level (0=largest) |
$4C | Total Level | Ch1 Op4 | -TTTTTTT | T=Total Level (0=largest) |
$4D | Total Level | Ch2 Op4 | -TTTTTTT | T=Total Level (0=largest) |
$4E | Total Level | Ch3 Op4 | -TTTTTTT | T=Total Level (0=largest) |
$50 | Attack Rate & Rate Key Scaling | Ch1 Op1 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$51 | Attack Rate & Rate Key Scaling | Ch2 Op1 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$52 | Attack Rate & Rate Key Scaling | Ch3 Op1 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$54 | Attack Rate & Rate Key Scaling | Ch1 Op2 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$55 | Attack Rate & Rate Key Scaling | Ch2 Op2 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$56 | Attack Rate & Rate Key Scaling | Ch3 Op2 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$58 | Attack Rate & Rate Key Scaling | Ch1 Op3 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$59 | Attack Rate & Rate Key Scaling | Ch2 Op3 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$5A | Attack Rate & Rate Key Scaling | Ch3 Op3 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$5C | Attack Rate & Rate Key Scaling | Ch1 Op4 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$5D | Attack Rate & Rate Key Scaling | Ch2 Op4 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$5E | Attack Rate & Rate Key Scaling | Ch3 Op4 | RR-AAAAA | R=Rate Scaling / A = Attack rate |
$60 | Decay Rate & AM Enable | Ch1 Op1 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$61 | Decay Rate & AM Enable | Ch2 Op1 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$62 | Decay Rate & AM Enable | Ch3 Op1 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$64 | Decay Rate & AM Enable | Ch1 Op2 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$65 | Decay Rate & AM Enable | Ch2 Op2 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$66 | Decay Rate & AM Enable | Ch3 Op2 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$68 | Decay Rate & AM Enable | Ch1 Op3 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$69 | Decay Rate & AM Enable | Ch2 Op3 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$6A | Decay Rate & AM Enable | Ch3 Op3 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$6C | Decay Rate & AM Enable | Ch1 Op4 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$6D | Decay Rate & AM Enable | Ch2 Op4 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$6E | Decay Rate & AM Enable | Ch3 Op4 | A--DDDDD | A=Amplitude Mod Enable / D= Decay rate |
$70 | Sustain Rate | Ch1 Op1 | ---SSSSS | S=Sustain Rate |
$71 | Sustain Rate | Ch2 Op1 | ---SSSSS | S=Sustain Rate |
$72 | Sustain Rate | Ch3 Op1 | ---SSSSS | S=Sustain Rate |
$74 | Sustain Rate | Ch1 Op2 | ---SSSSS | S=Sustain Rate |
$75 | Sustain Rate | Ch2 Op2 | ---SSSSS | S=Sustain Rate |
$76 | Sustain Rate | Ch3 Op2 | ---SSSSS | S=Sustain Rate |
$78 | Sustain Rate | Ch1 Op3 | ---SSSSS | S=Sustain Rate |
$79 | Sustain Rate | Ch2 Op3 | ---SSSSS | S=Sustain Rate |
$7A | Sustain Rate | Ch3 Op3 | ---SSSSS | S=Sustain Rate |
$7C | Sustain Rate | Ch1 Op4 | ---SSSSS | S=Sustain Rate |
$7D | Sustain Rate | Ch2 Op4 | ---SSSSS | S=Sustain Rate |
$7E | Sustain Rate | Ch3 Op4 | ---SSSSS | S=Sustain Rate |
$80 | Release Rate & Sustain Level | Ch1 Op1 | SSSSRRRR | S=Sustain Level / Release Rate |
$81 | Release Rate & Sustain Level | Ch2 Op1 | SSSSRRRR | S=Sustain Level / Release Rate |
$82 | Release Rate & Sustain Level | Ch3 Op1 | SSSSRRRR | S=Sustain Level / Release Rate |
$84 | Release Rate & Sustain Level | Ch1 Op2 | SSSSRRRR | S=Sustain Level / Release Rate |
$85 | Release Rate & Sustain Level | Ch2 Op2 | SSSSRRRR | S=Sustain Level / Release Rate |
$86 | Release Rate & Sustain Level | Ch3 Op2 | SSSSRRRR | S=Sustain Level / Release Rate |
$88 | Release Rate & Sustain Level | Ch1 Op3 | SSSSRRRR | S=Sustain Level / Release Rate |
$89 | Release Rate & Sustain Level | Ch2 Op3 | SSSSRRRR | S=Sustain Level / Release Rate |
$8A | Release Rate & Sustain Level | Ch3 Op3 | SSSSRRRR | S=Sustain Level / Release Rate |
$8C | Release Rate & Sustain Level | Ch1 Op4 | SSSSRRRR | S=Sustain Level / Release Rate |
$8D | Release Rate & Sustain Level | Ch2 Op4 | SSSSRRRR | S=Sustain Level / Release Rate |
$8E | Release Rate & Sustain Level | Ch3 Op4 | SSSSRRRR | S=Sustain Level / Release Rate |
$90 | SSG-Envelope Generator | Ch1 Op1 | ----EEEE | E=Envelope Gen |
$91 | SSG-Envelope Generator | Ch2 Op1 | ----EEEE | E=Envelope Gen |
$92 | SSG-Envelope Generator | Ch3 Op1 | ----EEEE | E=Envelope Gen |
$94 | SSG-Envelope Generator | Ch1 Op2 | ----EEEE | E=Envelope Gen |
$95 | SSG-Envelope Generator | Ch2 Op2 | ----EEEE | E=Envelope Gen |
$96 | SSG-Envelope Generator | Ch3 Op2 | ----EEEE | E=Envelope Gen |
$98 | SSG-Envelope Generator | Ch1 Op3 | ----EEEE | E=Envelope Gen |
$99 | SSG-Envelope Generator | Ch2 Op3 | ----EEEE | E=Envelope Gen |
$9A | SSG-Envelope Generator | Ch3 Op3 | ----EEEE | E=Envelope Gen |
$9C | SSG-Envelope Generator | Ch1 Op4 | ----EEEE | E=Envelope Gen |
$9D | SSG-Envelope Generator | Ch2 Op4 | ----EEEE | E=Envelope Gen |
$9E | SSG-Envelope Generator | Ch3 Op4 | ----EEEE | E=Envelope Gen |
$A0 | Frequency low (Write Second) | Ch1 | PPPPPPPP | P=Frequency Position L |
$A1 | Frequency low (Write Second) | Ch2 | PPPPPPPP | P=Frequency Position L |
$A2 | Frequency low (Write Second) | Ch3 | PPPPPPPP | P=Frequency Position L |
$A4 | Frequency high & Octave (Write first) | Ch1 | --OOOPPP | O=Octive / P=Position H |
$A5 | Frequency high & Octave (Write first) | Ch2 | --OOOPPP | O=Octive / P=Position H |
$A6 | Frequency high & Octave (Write first) | Ch3 | --OOOPPP | O=Octive / P=Position H |
$A8 | Frequency low during Multi-Mode | Ch3 Op2 | PPPPPPPP | P=Frequency Position L |
$A9 | Frequency low during Multi-Mode | Ch3 Op3 | PPPPPPPP | P=Frequency Position L |
$AA | Frequency low during Multi-Mode | Ch3 Op4 | PPPPPPPP | P=Frequency Position L |
$AC | Frequency high & Octave during Multi-Mode | Ch3 Op2 | --OOOPPP | O=Octive / P=Position H |
$AD | Frequency high & Octave during Multi-Mode | Ch3 Op3 | --OOOPPP | O=Octive / P=Position H |
$AE | Frequency high & Octave during Multi-Mode | Ch3 Op4 | --OOOPPP | O=Octive / P=Position H |
$B0 | Algorithm & Feedback | Ch1 | --FFFAAA | F=Feedback / A=Algorithm |
$B1 | Algorithm & Feedback | Ch2 | --FFFAAA | F=Feedback / A=Algorithm |
$B2 | Algorithm & Feedback | Ch3 | --FFFAAA | F=Feedback / A=Algorithm |
FM Algorithm (&B1/B2)
The algorithm number is one of 8 - each one defines how the different
operations build up to build a sound:
FM Sound over time
The sound created is affected over time by the various registers, we can
see a simple representation below:
I recently purchased a cheap PC-9821 V13, which worked great, but
came without hard-drive, so I had to figure out how to get it set up
and work out what it could do! Here I'll document my findings for
anyone else who may have the same issues / questions Note, As these machines are Japanese, you'll have to use Japanese Dos/Windows with them, as western versions will not support the custom hardware. Useful Resources nw150doswin98
- A disk image with Dos Windows pre-installed. I flashed this to a
2GB CF2 card, and used it with a PATA converter as my main hard
drive. It worked great, though I re-installed Windows 98 to get
the drivers working easily (Windows installer included in image) |
![]() |
DOS!
Dos works fine, The machine uses MSDOS 6.2, but although it looks like regular dos, normal (western) dos apps almost certainly won't work - even MS-DOS EDIT is missing!
I tried an old XT game 'RearGard' - The graphics appeared corrupted, and as a second layer over the text! It seems the 'CGA' vram is in the same address range as the PC98 VRAM, however it's clearly in a completely different incompatible format, and it seems the text / graphics screens are different layers! Also the game seems to have crashed... which happens to most western dos stuff!
Amusingly ELIZA seems to work fine! I assume this is because it's text input / screen output is all done via DOS calls, not accessing hardware directly.
Western games aside, I tried some of the pre-installed Japanese games on the hard drive image, and I didn't have much luck there either! I saw a lot of graphical issues, and the PC-88 version of Xenon 2 instantly crashed!
Windows!
Results on Windows were very different to DOS! Whereas dos was pretty much useless on this machine for my western games, Windows worked very well! I tried out some of my old games on the machine!
I was able to install 'Virtua Cop' - it worked fine (bit slow on the P133 cpu), I was impressed that my western copy's setup routine seemed to support Japanese, and even came with the PC98 Directx install!!
Die hard Trilogy also seemed to install and work ok, though it's slow and refused to support my 3D accelerator (even though DirectX recognized it)
The Windows Version of 'The 7th guest' worked, though
while speech worked, there was no music. That's no surprise as the
internal sound card does not have FM synthesis, it's PCM only!
The Windows Version of 'The 11th hour' did not work, It
complained I had no 'XMIDI' sound, and refused to load.
Black Dahlia installed fine, and worked well, but it seems to access the keyboard directly via hardware keycodes, as the keys pressed did not appear in game as I expected. I had to practice with save game names to figure out how to use the keyboard when needed in games.
Leisure Suit Larry 7 (Love for Sail) - Installed fine, but Windows95 version crashed, Windows 3.1 version worked fine (didn't have any keyshift problems either)... I didn't try the Dos version, as it would have certainly crashed!... How amazing is this game to have different versions supporting THREE operating systems!
Key shifts
The hardware key codes do not match a western keyboard, but I was able to play Blach dahlia fine once I knew the 'shifts' I had to make to compensate for the difference.
Numbers row, shifted 1 key right (2 presses 1 .... 1 presses esc)
Q row, Shifted 0 keys right (Q presses Q)
A row, Shifted 1 keys right (S presses A)
Z row, Shifted 3 keys right (V presses Z)
Space presses .
Del presses Space
Screenshots
![]() The boot screen! |
![]() RearGard Graphics are corrupt! The VRAM is at a similar address, but the format is totally different. Notice the Text/Graphics are separate layers. |
![]() Western Eliza works fine! This is because it's Text+Keys only, and using MS-DOS calls This game was copied from my old PC1512 back in the 80s! |
![]() Even the Japanese games are struggling! Some interlacing/ screen mode problem! |
![]() Japanese Windows 98 works well, and many western games work fine, though my machine has no FM/MIDI card. Note, first HDD is A:, and floppy is C: !! |
|