コレコビジョン


コレコビジョンのスペック
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 へ戻る