コレコビジョン
コレコビジョンのスペック
| CPU | D780C-1(Z80A) 3.579MHz |
| VDP | TMS9918A |
| PSG | SN76489 |
| ROM | 8KB |
| RAM | 1KB(拡張可) |
| V-RAM | 16KB |
後に日本で発売されるSG−1000に構造がよく似ている。
Z80にTMS9918、SN76489の始祖的なハードともいえる。
拡張性もあり、ハンドルコントローラはフットペダルがついていたり
アーケードゲームの移植も結構出来が良かったりする。
CPU
CPUはザイログZ80を使用 クロックは約3.579MHz
VDP
VDPはTI製TMS9928Aを使用。
PSG
SN76489を使用、クロックは3.759MHzで、MSBはD0、LSBはD7に繋がっています
ROM(BIOS)
ROMは本体には4Kバイト内蔵。(00000H-01FFFH)
良く使われるルーチンや文字フォントも持っています。
カードリッジが刺さってなかったらメッセージが出るようになっています。
RAM
本体RAMは2114*2の1Kバイト内蔵されています。
06000H−07FFFHの1KByte分がRAMで残りはミラーになります。
アクセスしている領域は07000H−073FFH
割り込み
モード1で本体だけではVDPからの割り込みが/NMIでかかります
/NMIなので割り込みを止めるにはVDP R#1のBit5(IE)を0にします
/INTは拡張端子に繋がっています。
ROMカードリッジ
領域は08000H−0FFFFHになります。
08000Hから始まるようにして最初のデータをIDデータとしてチェックして
チェックが合えばROMカードリッジのスタートアドレスを読んで実行します
チェックが合わない、ROMカートリッジが無い場合、メッセージ画面を出して止まります。
08000:55 AA ;IDデータ
08002:nn mm ;スプライトネーム テーブル ポインタ
08004:nn mm ;スプライトオーダ テーブル ポインタ
08006:nn mm ;WR_SPR_NMTBLバッファ ポインタ
08008:nn mm ;JOYPAD ポインタ
0800A:nn mm (スタートアドレス)
0800C:RST 008Hのエントリアドレス(3バイト)
0800F:RST 010Hのエントリアドレス(3バイト)
08012:RST 018Hのエントリアドレス(3バイト)
08015:RST 020Hのエントリアドレス(3バイト)
08018:RST 028Hのエントリアドレス(3バイト)
0801B:RST 030Hのエントリアドレス(3バイト)
0801E:/INTのエントリアドレス(3バイト)
08021:/NMIのエントリアドレス(3バイト)
I/Oポート
デーコーダはLS138を使用してG1がA7、Aが/WR、BがA5、CがA6になります。
拡張端子からの禁止もできます。
000H−07FH:未使用
080H−09FH:テンキー イネーブル
0A0H−0BFH:VDP
0C0H−0DFH:ジョイスティック イネーブル
0E0H−0FFH:PSG/JOY端子データ
ポート080H−09FH(W)
テンキー イネーブルです。
ポート0BEH−0BFH
VDPのポートです。
使用ポートは0BEH:VDPデータ(R/W)
0BFH:VDPコントロール(R/W)
ポート0C0H−0DFH
ジョイスティック イネーブルです。(W)
ポート0E0H−0FFH
PSG/JOY端子データです。
使用ポートは0FCH:JOY1データ(R)
0FFH:JOY2データ(R)
0FFH:PSG(W)
キー入力
本体付属のパッドは上にジョィステックにトリガーボタン2つ、下にテンキーパッド(3*4ライン)で
かなりスイッチがありますがダイオードを使った単純な回路で全てのキーをまかなっていて
テンキーとジョィステックの2つに分けて読みます
通常はBIOSコールで済みますが、その場合データが反転されているので注意が必要です。
テンキーパッド
ポート080Hにデータを出力(データは何でもよい)
JOY端子の5ピンが1になり
テンキーパッド、トリガー2のデータを読む準備が出来ています
ポート0FCH(2Pの場合は0FFH)を読む事でテンキーパッドの内容が読めます
テンキーパッドはデータ4Bitの組み合わせで押されたキーを判断しています
これによりテンキーパッドは同時キー入力が出来ないという事になります。
ジョイスティック
ポート0C0Hにデータを出力(データは何でもよい)
JOY端子の8ピンが1になり
ジョイステックの方向、トリガー1のデータを読む準備が出来ています
ポート0FCH(2Pの場合は0FFH)を読む事でジョイステックの内容が読めます
テンキーパッド
Bit 7:0(拡張端子10ピンの内容)
Bit 6:トリガー2(右) 1=Off、0=On
Bit 5:1(JOY端子7ピン 未使用)
Bit 4:1(JOY端子9ピン 未使用)
Bit 3:キーパッドマトリックスKM3
Bit 2:キーパッドマトリックスKM2
Bit 1:キーパッドマトリックスKM1
Bit 0:キーパッドマトリックスKM0
キーパッドマトリックス(KM3−0の4Bitなので0−F)
0=未使用、1=’8’、2=’4’、3=’5’
4=未使用、5=’7’、6=’#’、7=’2’
8=未使用、9=゜*’、A=’0’、B=’9’
C=’3’、D=’1’、E=’6’、F=何も押されていない
ジョイステック
Bit 7:0(拡張端子10ピンの内容)
Bit 6:トリガー1(左) 1=Off、0=On
Bit 5:1(JOY端子7ピン 未使用)
Bit 4:1(JOY端子9ピン 未使用)
Bit 3:LEFT 1=Off、0=On
Bit 2:DOWN 1=Off、0=On
Bit 1:RIGHT 1=Off、0=On
Bit 0:UP 1=Off、0=On
ROMルーチン
00000H:リセット
スタックポインタ 073B9Hに指定して0006EHへジャンプします
00008H:RST 008H
0800CHへジャンプします
00010H:RST 010H
0800FHへジャンプします
00018H:RST 018H
08012Hへジャンプします
00020H:RST 020H
08015Hへジャンプします
00028H:RST 028H
08018Hへジャンプします
00030H:RST 030H
0801BHへジャンプします
00038H:RST 038H (INT)
0801EHへジャンプします
0003BH:RANDOM
出力:073C8H−073C9H 乱数発生データ
A=乱数
使用:AF、HL
073C8H−073C9H(初期値00033H)
乱数を発生します
075C8H−073C9Hを16ビットのデータとして
Bit15=1:Bit8=1 なら Cf=0
0 なら 1
0:Bit8=1 なら Cf=1
0 なら 0
HL<−Cf 左シフトを行い073C8H−073C9Hへセット
LレジスタをAレジスタにコピーします
00066H:NMI VDPの割り込み
08021Hへジャンプします
0006EH:カードリッジのチェック
使用:AF、B、HL
ロムカードリッジがセットされているかチェックを行い
セットされていればそのカードリッジをスタート
されていなければバナー画面を表示
00081H:バナー画面を表示
01F61H:PLAY_SONGS
01F64H:ACTIVATEP
01F67H:PUTOBJP
01F6AH:REFLECT_VERTICAL
01F6DH:REFLECT_HORIZONTAL
01F70H:ROTATE_90
01F73H:ENLARGE
01F76H:CONTROLLER_SCAN コントローラの読み込み
出力:073EEH JOY1 Stick
Bit7:1
Bit6:トリガー1 1=押されている、0=押されていない
Bit5:0
Bit4:0
Bit3:LEFT 1=押されている、0=押されていない
Bit2:DOWN 1=押されている、0=押されていない
Bit1:RIGHT 1=押されている、0=押されていない
Bit0:UP 1=押されている、0=押されていない
073EFH JOY2 Stick
Bit7:1
Bit6:トリガー1 1=押されている、0=押されていない
Bit5:0
Bit4:0
Bit3:LEFT 1=押されている、0=押されていない
Bit2:DOWN 1=押されている、0=押されていない
Bit1:RIGHT 1=押されている、0=押されていない
Bit0:UP 1=押されている、0=押されていない
073F0H JOY1 Ten Key
Bit7:1
Bit6:トリガー2 1=押されている、0=押されていない
Bit5:0
Bit4:0
Bit3:KM3
Bit2:KM2
Bit1:KM1
Bit0:KM0
073F1H JOY2 Ten Key
Bit7:1
Bit6:トリガー2 1=押されている、0=押されていない
Bit5:0
Bit4:0
Bit3:KM3
Bit2:KM2
Bit1:KM1
Bit0:KM0
KM0=Nul、1=’6’、2=’1’、3=’3’
4=’9’、5=’0’、6=’*’、7=Nul
8=’2’、9=’#’、A=’7’、B=Nul
C=’5’、D=’4’、E=’8’、F=Nul
Nul=何も押されていない
01F79H:DECODER テンキーの読み込み
入力:H=000H JOY1を選択
001H JOY2を選択
L=コード000Hか001H
出力:コードによって変わる
使用:A、BC、DE、HL
コード000H
H=000H(JOY1) 073EBHの内容をEレジスタにして073EBHをクリア
H=ポート0FCHの トリガーデータ1(反転)
L=ポート0FCHのジョイスティックデータ (反転)
H=001H(JOY2) 073ECHの内容をEレジスタにして073ECHをクリア
H=ポート0FFHの トリガーデータ1(反転)
L=ポート0FFHのジョイスティックデータ (反転)
尚、前もってジョイスティックイネーブルにする必要がありますがシステムを使っているかぎり
常にジョイスティックイネーブルになっているハズです
コード001H
H=000H(JOY1) H=ポート0FCHのトリガーデータ2(反転)
L=キーデータ1
H=001H(JOY2) H=ポート0FFHのトリガーデータ2(反転)
L=キーデータ2
キーデータはテンキーの押されたボタンを数値データに変換したものです
0ボタン…000H、1ボタン…001H、2ボタン…002H
3ボタン…003H、4ボタン…004H、5ボタン…005H
6ボタン…006H、7ボタン…007H、8ボタン…008H
9ボタン…009H、*ボタン…00AH、#ボタン…00CH
何も押されていない…00FH
01F7CH:GAME_OPT
ゲーム オプション
VRAM全クリア、スクリーンモード1を実行、英数字のキャラクタの定義をして
ゲームの難易度等の画面表示を行います。
01F7FH:LOAD_ASCII
英数字のキャラクタの定義
01F82H:FILL_VRAM
VRAMを1バイトデータで埋める
In:HL=VRAM Address
DE=Length
A=Fill Data
01F85H:MODE_1
スクリーンモード1
01F88H:UPDATE_SPINNER
01F8BH:INIT_TABLEP
01F8EH:GET_VRAMP
01F91H:PUT_VRAMP
01F94H:INIT_SPR_ORDERP
01F97H:WR_SPR_NM_TBLP
01F9AH:INIT_TIMERP
01F9DH:FREE_SIGNALP
01FA0H:REQUEST_SIGNALP
01FA3H:TEST_SIGNALP
01FA6H:WRITE_REGISTERP
01FA9H:WRITE_VRAMP
01FACH:READ_VRAMP
01FAFH:INIT_WRITERP
01FB2H:SOUND_INITP
01FB5H:PLAY_ITP
01FB8H:INIT_TABLE
01FBBH:GET_VRAM
01FBEH:PUT_VRAM
01FC1H:INIT_SPR_ORDER
01FC4H:WR_SPR_NM_TBL
01FC7H:INIT_TIMER
01FCAH:FREE_SIGNAL
01FCDH:REQUEST_SIGNAL
01FD0H:TEST_SIGNAL
01FD3H:TIME_MGR
01FD6H:TURN_OFF_SOUND
Out:A=0FFH
PSGアッテネータ全オフ
01FD9H:WRITE_REGISTER
VDPレジスタの設定
In:B=VDP#nn(0ー7)
C=Data
Out:073C3H R#00の内容(R#00を設定した場合に出力)
073C4H R#01の内容(R#01を設定した場合に出力)
01FDCH:READ_REGISTER
VDPステータスレジスタを読む
Out:A=VDPステータスレジスタの内容
01FDFH:WRITE_VRAM
メモリからVRAMへのブロック転送
In:HL=Data Adress
DE=VRAM Address(00000H−03FFFH)
BC=Length
01FE2H:READ_VRAM
VRAMからメモリへのブロック転送
In:HL=Store Adress
DE=VRAM Address(00000H−03FFFH)
BC=Length
01FE5H:INIT_WRITER
01FE8H:WRITER
01FEBH:POLLER
01FEEH:SOUND_INIT
01FF1H:PLAY_IT
01FF4H:SOUND_MAN
01FF7H:ACTIVATE
01FFAH:PUTOBJ
01FFDH:RAND_GEN
乱数の発生
Out:A=乱数データ
Home へ戻る