コレコビジョン
コレコビジョンのスペック
CPU | μPD780C−1(Z80A) 3.579MHz |
VDP | TMS9928A |
PSG | SN76489 |
ROM | 8KB |
RAM | 1KB(拡張可) |
VRAM | 16KB |
後に日本で発売されるSG−1000に構造がよく似ている
Z80にTMS9918、SN76489の始祖的なハードともいえる
拡張性もあり、ハンドルコントローラはフットペダルがついていたり
アーケードゲームの移植も結構出来が良かったりする
CPU
CPUはザイログZ80を使用 クロックは約3.579MHz
VDP
VDPはTI製TMS9928Aを使用、16KB
PSG
SN76489、クロック3.759MHz
MSBはD0、LSBはD7
BIOS (00000H−01FFFH)
汎用ルーチン、文字フォントが入っています
カードリッジが刺さってなければメッセージが出ます
RAM
本体RAMは2114*2の1Kバイト内蔵
06000H−063FFHの1KB、以降07FFFHまでミラーになります
実際アクセスしている領域は07000H−073FFH
割り込み
モード1を使用
/NMI VDP VBLANK割り込み (禁止はVDP R#1 Bit5(IE)=0)
/INT 拡張端子に繋がっています
ROMカードリッジ (08000H−0FFFFH)
08000Hから始まるようにして最初のデータをIDデータとしてチェックして
チェックが合えばROMカードリッジのスタートアドレスを読んで実行します
チェックが合わない、ROMカートリッジが無い場合、メッセージ画面を出して止まります。
08000H−8001H:055H、0AAH IDデータ
08002H−8003H:スプライトネーム テーブル ポインタ
08004H−8005H:スプライトオーダ テーブル ポインタ
08006H−8007H:WR_SPR_NMTBLバッファ ポインタ
08008H−8009H:JOYPAD ポインタ
0800AH−800BH:スタートアドレス
0800CH−800EH:RST 008H エントリアドレス
0800FH−8011H:RST 010H エントリアドレス
08012H−8014H:RST 018H エントリアドレス
08015H−8017H:RST 020H エントリアドレス
08018H−801AH:RST 028H エントリアドレス
0801BH−801DH:RST 030H エントリアドレス
0801EH−8020H: /INT エントリアドレス
08021H−8023H: /NMI エントリアドレス
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=オフ、0=オン
Bit 5:JOY端子7ピン 1 未使用
Bit 4:JOY端子9ピン 1 未使用
Bit 3:キーパッドマトリックス KM3
Bit 2:キーパッドマトリックス KM2
Bit 1:キーパッドマトリックス KM1
Bit 0:キーパッドマトリックス KM0
キーパッドマトリックス KM3−0
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=オフ、0=オン
Bit 5:JOY端子7ピン 1 未使用
Bit 4:JOY端子9ピン 1 未使用
Bit 3:左 1=オフ、0=オン
Bit 2:下 1=オフ、0=オン
Bit 1:右 1=オフ、0=オン
Bit 0:上 1=オフ、0=オン
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スティック部分
Bit7:1
Bit6:トリガー1 1=オン、0=オフ
Bit5:0
Bit4:0
Bit3:左 1=オン、0=オフ
Bit2:下 1=オン、0=オフ
Bit1:右 1=オン、0=オフ
Bit0:上 1=オン、0=オフ
073EFH JOY2スティック部分
Bit7:1
Bit6:トリガー1 1=オン、0=オフ
Bit5:0
Bit4:0
Bit3:左 1=オン、0=オフ
Bit2:下 1=オン、0=オフ
Bit1:右 1=オン、0=オフ
Bit0:上 1=オン、0=オフ
073F0H JOY1テンキー部分
Bit7:1
Bit6:トリガー2 1=オン、0=オフ
Bit5:0
Bit4:0
Bit3:TKM3
Bit2:TKM2
Bit1:TKM1
Bit0:TKM0
073F1H JOY2テンキー部分
Bit7:1
Bit6:トリガー2 1=オン、0=オフ
Bit5:0
Bit4:0
Bit3:TKM3
Bit2:TKM2
Bit1:TKM1
Bit0:TKM0
TKM0=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
入力:HL=VRAMアドレス
DE=長さ
A=書き込むデータ
VRAMを1バイトデータで埋めます
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 PSGオフ
出力:A=0FFH
PSGアッテネータ全オフにします
01FD9H:WRITE_REGISTER VDPレジスタの設定
入力:B=VDP#nn(0ー7)
C=VDPデータ
出力:073C3H R#00の内容(R#00を設定した場合に出力)
073C4H R#01の内容(R#01を設定した場合に出力)
01FDCH:READ_REGISTER VDPステータスレジスタ リード
出力:A=VDPステータスレジスタの内容
01FDFH:WRITE_VRAM メモリからVRAMへのブロック転送
入力:HL=転送元データアドレス
DE=転送先VRAMアドレス(00000H−03FFFH)
BC=長さ
01FE2H:READ_VRAM VRAMからメモリへのブロック転送
入力:HL=転送先データアドレス
DE=転送元VRAMアドレス(00000H−03FFFH)
BC=長さ
01FE5H:INIT_WRITER
01FE8H:WRITER
01FEBH:POLLER
01FEEH:SOUND_INIT
01FF1H:PLAY_IT
01FF4H:SOUND_MAN
01FF7H:ACTIVATE
01FFAH:PUTOBJ
01FFDH:RAND_GEN 乱数の発生
出力:A=乱数データ
Home へ戻る