にゃごすwiki

techhan/5.5

%第1版第6刷 P.297-


5章 汎用入出力インターフェイス


 1章でも説明したように、MSXの使用しているPSGは、音声出力の機能とは別にポートAとポートBという2つの8ピット入出力ポートを持っています。MSXはこの2つのポートを汎用入出力インターフェイス(いわゆるジョイスティックポート)に接続して、ジョイスティックやパドルなどの装置とのデータ入出力に利用しています(図5.21)。この汎用入出力インターフェイスに接続される各種の装置は、それぞれ専用のBIOSルーチンがROM内に用意されており、手軽にアクセスすることが可能です。
 本章では、各入出力装置の機能とBIOSルーチンによるアクセス法について説明します。


図5.21 汎用入出力インターフェイス


 5.1 ポートの機能


 PSGの2つの入出力ポートは、図5.22のように利用されています。


図5.22 PSGのポートAとポートBの機能



 5.2 ジョイスティックの使用法


 ジョイスティックの回路を図5.23に示します。この回路からわかるように、?番端子に“0”を出力し、?〜?、?〜?の端子を読み出せば、スティックとトリガボタンの情報は得られますが、プログラムの移植性などを考慮すると、ジョイスティックのアクセスはやはりBIOSを利用して行う方が無難でしょう。
 ジョイスティックをアクセスするためには、以下に示すBIOSルーチンが用意されています。なお、これらのルーチンはBASICのSTICK関数やSTRIG関数とほぼ等しい機能を持っているもので、ジョイスティック以外にカーソルキーやスペースバーの状態をリアルタイムで読み取ることも可能です。


図5.23 ジョイスティック回路図


●GTSTCK(00D5H/MAIN)……………ジョイスティックの読み出し
入力:A←ジョイスティック番号(0=カーソルキー、1〜2=ジョイスティック)
出力:A←ジョイスティックまたはカーソルキーの押された方向
機能:現在のジョイスティックまたはカーソルキーの状態をAレジスタに返す。値はBASICのSTICK関数と同じである。

●GTTRIG(00D8H/MAIN)……………トリガボタンの読み出し
入力:A←トリガボタン番号(0=スペースバー、1〜2=トリガボタン)
出力:A←トリガ・ボタンまたはスペースバーの状態(押す=OFFH、離す=OOH)
機能:現在のトリガボタン、またはスペースバーの状態をAレジスタに返す。この値はトリガが押されていれば0FFH、押されていなければ0となる。


リスト5.7 ジョイスティックの使用法

;============================================================
;
;  List 5.7   Joystick and trigger access
;
;============================================================
;
CHPUT   EQU     00A2H
BREAKX  EQU     00B7H
GTSTCK  EQU     00D5H
GTTRIG  EQU     00D8H

        ORG     0D000H

;-------- program start -------- ジョイスティックの状態を表示する

STICK:  LD      A,1             ;choose joystick 1
        CALL    GTSTCK          ;read joystick status.
        LD      (WK1),A
        LD      A,1             ;choose joystick 1
        CALL    GTTRIG          ;read trigger status
                
        OR      A
        JR      Z,STCK1
        LD      HL,WDON         ;trigger ON
        JR      STCK2
STCK1:  LD      HL,WDOFF        ;trigger OFF
STCK2:  CALL    PUTSTR
        LD      A,(WK1)
        OR      A
        JR      Z,BRKCH0        ;no use joystick
        LD      C,0
STCK3:  DEC     A
        JR      Z,STCK4
        INC     C
        JR      STCK3
                
STCK4:  SLA     C               ;C := C*16
        SLA     C
        SLA     C
        SLA     C
        LD      B,0             ;Accounting Strings data address.
        LD      HL,WDSTK
        ADD     HL,BC
        CALL    PUTSTR

        LD      A,0DH           ;put carriage return
        CALL    CHPUT           ;code := 0DH

        CALL    BREAKX          ;break check
        RET     C
        JR      STICK

;----- put strings to screen -----

PUTSTR: LD      A,(HL)
        CP      '$'
        RET     Z
        INC     HL
        CALL    CHPUT
        JR      PUTSTR

;----- string data -----

WDON:   DB      'Trtgger ON:  $'
WDOFF:  DB      'Trigger OFF: $'
WDSTK:  DB      'UP only      ',0DH,0AH,'$'
        DB      'Up and Right ',0DH,0AH,'$'
        DB      'Right only   ',0DH,0AH,'$'
        DB      'Right & Down ',0DH,0AH,'$'
        DB      'Down only    ',0DH,0AH,'$'
        DB      'Dovn and Left',0DH,0AH,'$'
        DB      'Left only    ',0DH,0AH,'$'
        DB      'Left and Up  ',0DH,0AH,'$'

WK1:    DW      0

        END


 5.3 パドルの使用法


 パドルの回路は図5.24のとおりです。?端子にパルスを送ると単安定マルチバイブレータは、ある時間幅のパルスを発生します。この幅は可変抵抗の値によって10μs〜3msの範囲で変化しますので、パルス長を測定すれば可変抵抗の値、ひいてはその回転角を知ることができます。


図5.24 パドル回路図


パドルをアクセスするためのBIOSルーチンを次に示します。

●GTPDL(00DEH/MAIN)……………パドル情報の読み出し
入力:A←パドル番号(1〜12)
出力:A←パドルの回転角(O〜255)
機能:Aレジスタで指定したパドルの状態を調べ、結果をAレジスタに返す。


 5.4 タッチパネル、ライトペン、マウス、トラックポールの使用法


 タッチパネル、ライトペン、マウス、トラックボール(キャット)はすべて同一のBIOSを用いてアクセスすることが可能です。その使い方を以下に説明します。

●GTPAD(00DBH/MAIN)……………各種入出力装置のアクセス
入力:A←装置ID(0〜19)
出力:A←目的の情報
機能:Aレジスタで指定する値によって、表5.5のような各種の情報を得ることができる。これはBASICのPAD関数とまったく同じである。表中“XXX1”は、汎用入出カインターフェイス#1に接続した“XXX”の装置であることを意味する。同様に“XXX2”は汎用入出力インターフェイス#2に接続したものである。

装置ID指定される装置返ってくる情報
0タッチパネル1パネル面に触っていればOFFH、いなければ00H
1X座標(0〜255)
2Y座標(0〜255)
3ボタンが押されていれば0FFH、いなければ00H
4タッチパネル2同上
5
6
7
8ライトペン0FFHであればデータは有効、00Hであれば無効
9X座標(0〜255)
10Y座標(0〜255)
11スイッチが押されていれば0FFH、いなければ00H
12マウス1、または
トラックボール1
つねに0FFHを返す(入力の要求に使用)
13X座標(0〜255)
14Y座標(0〜255)
15つねに00Hを返す(無意味)
16マウス1、または
トラックボール2
同上
17
18
19

注1:ライトペンの座標(A=9,1O)とスイッチ(A=11)の情報は、A=8としてBIOSをコールしたとき同時に読み込まれますが、その結果がOFFHの時にのみ、他の値が有効となります。A=8としてBIOSをコールした結果が00Hの場含は、その後に得られる座標値やスイッチの状態は意味を持ちません。
注2:マウスとトラックボールは自動的に判別します。
注3:マウスやトラックボールの座標値を求める場合、まず入力要求のコール(A=12またはA=16)を行い、その後に実際に座標値を求めるコールを実行する、という手順をふみます。このとき2つのコールの時間間隔はできる限り小さくとらなければなりません。入力要求から座標値の入力までに必要以上に時間をかけると、得られたデータは保証されません。
注4:マウスまたはトラックボールについているトリガボタンの状態を得るためには、このGTPADルーチンではなく、GTTRIG(00D8H/MAIN)を使ってください。

表5.5 GTPADのBIOSで得られる情報


リスト5.8 タッチパネルの使用法

;============================================================
;
;  List 5.8   touch pad access
;
;============================================================
;
BREAKX  EQU     00B7H
GTPAD   EQU     00DBH
WRTVRM  EQU     004DH

        ORG     0B000H

;-------- program start -------- タッチパッドで指定した位置に"*"を表示する

PAD:    XOR     A              ;check sense
        CALL    GTPAD
        OR      A
        JR      NZ,PAD1
        LD      A,3
        CALL    GTPAD          ;break check
        OR      A
        RET     NZ
        JR      PAD

PAD1:   LD      A,1            ;get X axis
        CALL    GTPAD
        SRL     A              ;A := A/8
        SRL     A
        SRL     A
        LD      (WORK),A       ;reserve X axis
        LD      A,2            ;get Y axis
        CALL    GTPAD
        LD      L,A            ;HL := Y data(0-255)
        LD      H,0
        LD      C,A
        LD      B,0
        ADD     HL,BC          ;HL := HL*3  (HL:= 0-767)
        ADD     HL,BC
        LD      A,L
        AND     11100000B
        LD      L,A
        LD      A,(WORK)
        ADD     A,L
        LD      L,A
        LD      BC.1800H       ;VRAM start address.
        ADD     HL,BC
        LD      A,2AH
        CALL    WRTVRM         ;write VRAM
        LD      A,3
        CALL    GTPAD          ;break check
        OR      A
        RET     NZ
        JR      PAD

;----- work area -----

WORK:   DW      0              ;work

        END

リスト5.9 マウスとトラックボールの使用法

;============================================================
;
;  List 5.9   mouse and track ball access
;
;============================================================
;
GTPAD   EQU     00DBH
WRTVRM  EQU     004DH
RDVRM   EQU     004AH
BREAKX  EQU     00B7H

        ORG     0D000H

;----- program start -----   マウスまたはトラックボールで指定した位置に"*"を表示する

TEST:   CALL    VADR            ;Put old data.
        LD      A,(WKOLD)
        CALL    WRTVRM
        LD      A,12
        CALL    GTPAD           ;Request mouse/track ball data.
        LD      A,13
        CALL    GTPAD           ;Read X val.
        LD      (WKXVAL),A
        LD      A.14
        CALL    GTPAD           ;Read Y val.
        LD      (WKYVAL),A
                
        LD      A,(WKX)
        LD      B,A
        LD      A,(WKXVAL)
        ADD     A,B
        CP      245             ;X<0?
        JR      C,TEST01
        XOR     A               ;X=0
        JR      TEST02
                
TEST01: CP      32              ;X>31?
        JR      C,TEST02
        LD      A,31
                
TEST02: LD      (WKX),A
                
        LD      A,(WKY)
        LD      B,A
        LD      A,(WKYVAL)
        ADD     A,B
        CP      245             ;Y<0?
        JR      C.TEST03
        XOR     A               ;Y=0
        JR      TEST04

TEST03: CP      24              ;Y>23
        JR      C,TEST04
        LD      A,23

TEST04: LD      (WKY),A

        CALL    VADR
        CALL    RDVRM           ;Read old data.
        LD      (WKOLD),A

        CALL    VADR
        LD      A,2AH
        CALL    WRTVRM          ;Put cursor("*").
        CALL    BREAKX          ;Break check.
        RET     C

        CALL    WAIT

        JR      TEST

VADR:   LD      A,(WKY)         ;Make SCREEN Address.
        LD      H,A             ; From X,Y axis on WORK AREA
        LD      L,0             ; To HL reg.
        SRL     H
        RR      L
        SRL     H
        RR      L
        SRL     H
        RR      L
        LD      A,(WKX)
        ADD     A,L             ; Y*32+X
        LD      L,A
        LD      BC,1800H        ; VRAM start address.
        ADD     HL,BC
        RET

WAIT:   LD      A,0             ;WAIT routine
WLP1:   INC     A
        LD      B,(IX+0)
        LD      B,(IX+0)
        LD      B,(IX+0)
        JR      NZ,WLP1
        RET

;----- data -----

WKX:    DB      10              ;X axis
WKY:    DB      10              ;Y axis
WKOLD:  DB      0               ;Character code on (X,Y)
WKXVAL: DB      0               ;X variable.
WKYVAL: DB      0               ;Y variable.

        END