Categories: R10コンピュータ

日立 MB-S1 S1-CP/M80 移植作戦 その29 BIOSの作成15

BIOS09内CONOUTの画面制御を強化してみました。

実装したのは中部本多通商のS1-CP/M80で使用されていたコード+シフトJIS漢字表示です。
漢字表示はS1のシステムシステムコールではJIS漢字コードなのでCONOUT内で
シフトJISからJIS漢字に変換しています。

上記の例は、

$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$FF
$1F,$41,$42,$43,$1B,$28,$44,$45,$46,$1B,$29,$47,$48,$49,$0D,$1F,$FF
$1E,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$05,$0D,$FF
$41,$1C,$1F,$42,$1C,$1F,$43,$1C,$44,$45,$08,$46,$1E,$1C,$47,$1C,$1E,$48,$07,$FF
$1B,$3D,$10,$12,$49,$1B,$28,$4A,$1B,$29,$4B,$FF
$1F,$0D,$FF
$31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$31,$32,$33,$34,$35,$36
$37,$38,$39,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$31,$32
$33,$34,$35,$36,$37,$38,$39,$30,$FF

を表示したもので、DEFで色反転、1行中の任意位置以降削除で15行目の8文字目以降を削除、カーソル操作で上下左右とEをバックスペース、LOCATE操作(Jを反転)とベル出力です。

実装したコードはこんな感じで、
2バイトエスケープシーケンス系 6種類。
ESC ( (1B28) 以後の文字表示で文字色と背景色が入れ替る→反転表示
ESC ) (1B29) 以後の文字表示で文字色と背景色が戻る→反転解除
ESC * (1B2A) スクリーンをクリアしてカーソルを左上に移動
ESC = (1B3D) カーソルを指定位置に移動→1B,3D,Y座標,X座標
ESC T (1B54) カーソル位置以降1行消去
ESC Y (1B59) カーソル位置以降1画面消去
1バイトコントロールコード系 17種類
$05 カーソル以降1行消去
$06 カーソルをスクリーンの右下に移動
$07 ベルを鳴らす
$08 カーソルを左に移動(BS)
$09 カーソルを次のタブストップ位置に移動
$0A カーソルを一つ下に移動(LF)
$0B カーソルをスクリーン左上に移動(ホーム)
$0C スクリーンをクリアしてカーソルをスクリーン左上に移動
$0D カーソルを次の行の先頭に移動(改行復帰)
$13 カーソルの位置にスペースを挿入
残 $14 カーソルの位置にタブストップを設定
$16 カーソルを表示する
$17 カーソルを表示しない
残 $19 カーソル位置のタブストップを解除する
$1B エスケープシーケンスの開始
$1C カーソルを一文字右へ移動
$1D カーソルを一文字左へ移動
$1E カーソルを一文字上へ移動
$1F カーソルを一文字下へ移動
かなりベタな書き方だと思いますが、とりあえず動作しているようなので晒しておきます^^;;;

お気付きの点がありましたら、アドバイスお願い致します (_ _)

# S1-CP/M80用BIOS09 コンソール制御実験 その1
# 目標
# CONOUTの拡張
# 1)制御文字 2)エスケープシーケンス
# →:1C , ←:1D, ↑:1E, ↓:1F, ベル:07, BS:08, タブ:09, LF:0A, ホーム:0B, FF:0C
# OUTSCRで対応されているもの⇒0A,0C,07,08,09,0B
# 2)エスケープシーケンス ESC(1B)+SP+CODE
# 画面クリア:*, 反転文字:( ,反転解除:),行末までクリア:T,カーソル以降クリア:Y
# 3)SJIS漢字表示(2バイト)
# 残件
# ESC >の実装,漢字スクロール
                org             $D000
                jmp             START
#+++ 変数領域
CHRBUF_K1       fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
                fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
                fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
                fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
                fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
                fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
                fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
                fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A
                fcb             $8A,$BF,$8E,$9A,$8A,$BF,$8E,$9A,$FF
CHRBUF_C1:      fcb             $1F,$41,$42,$43,$1B,$28,$44,$45,$46,$1B,$29,$47,$48,$49,$0D,$1F,$FF
CHRBUF_C2:      fcb             $1E,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$05,$0D,$FF
CHRBUF_C3:      fcb             $41,$1C,$1F,$42,$1C,$1F,$43,$1C,$44,$45,$08,$46,$1E,$1C,$47,$1C,$1E,$48,$07,$FF
CHRBUF_C4:      fcb             $1B,$3D,$10,$12,$49,$1B,$28,$4A,$1B,$29,$4B,$FF
CHRBUF_C5:      fcb             $1F,$0D,$FF
CHRBUF1:        fcb             $31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$31,$32,$33,$34,$35,$36
                fcb             $37,$38,$39,$30,$31,$32,$33,$34,$35,$36,$37,$38,$39,$30,$31,$32
                fcb             $33,$34,$35,$36,$37,$38,$39,$30,$FF
#+++ プログラム本体
START:          clr             ESC_ProcFlag
                clr             ArgvCount
                leax            CHRBUF_K1,PCR
                lbsr            CONOUT
                leax            CHRBUF_C1,PCR
                lbsr            CONOUT
                leax            CHRBUF1,PCR
                lbsr            CONOUT
                leax            CHRBUF1,PCR
                lbsr            CONOUT
                leax            CHRBUF1,PCR
                lbsr            CONOUT
                leax            CHRBUF1,PCR
                lbsr            CONOUT
                leax            CHRBUF1,PCR
                lbsr            CONOUT
                leax            CHRBUF_C2,PCR
                lbsr            CONOUT
                leax            CHRBUF_C3,PCR
                lbsr            CONOUT
                leax            CHRBUF_C4,PCR
                lbsr            CONOUT
                leax            CHRBUF_C5,PCR
                lbsr            CONOUT
                jmp             S1MON
#+++ CONOUTサブルーチン
CONOUT:         pshs            A,B,X
CONOUT1:        lda             ,X+
                cmpa            #$FF
                lbeq            CONOUT_END      ;終端検出←CP/M内では削除
                ldb             ESC_ProcFlag
                lbne            CONOUT_ESC      ;ESCシーケンス処理中
                ldb             SJIS_ProcFlag
                lbne            CONOUT_SJIS     ;SJIS処理中
                cmpa            #$81
                lbcc            CONOUT_SJIS     ;SJISコード処理
                cmpa            #$1B
                lbne            CONOUT2         ;ESCシーケンス以外
                ldb             #$FF
                stb             ESC_ProcFlag    ;ESCシーケンス処理中セット
                lbra            CONOUT1
CONOUT2:        cmpa            #$0D            ;
                beq             CONOUT3
                cmpa            #$05
                beq             CONOUT4
                cmpa            #$06
                beq             CONOUT5
                cmpa            #$16
                beq             CONOUT6
                cmpa            #$17
                beq             CONOUT7
                cmpa            #$13
                beq             CONOUT8
                lbsr            OUTSCR          ;文字or制御文字のESCシーケンス以外出力
                bra             CONOUT1
CONOUT3:        pshs            D,X,Y           ;復帰改行
                swi2
                fcb             $41,75          ;CURSRD
                clra                            ;X=0
                swi2
                fcb             $41,8           ;CURSET
                lda             #$0A
                lbsr            OUTSCR
                puls            D,X,Y
                lbra            CONOUT1
CONOUT4:        lbra            CONOUT_ESC4     ;カーソル以降1行消去(CONOUT_ESC4と同じ)
CONOUT5:        pshs            D,X,Y           ;カーソルを画面の右下へ移動
                ldd             #$4F18
                swi2
                fcb             $41,8           ;CURSET
                puls            D,X,Y
                lbra            CONOUT1
CONOUT6:        pshs            D,X,Y           ;カーソルを表示
                lda             #$6E
                swi2
                fcb             $41,4           ;SYCRST
                puls            D,X,Y
                lbra            CONOUT1
CONOUT7:        pshs            D,X,Y           ;カーソルを非表示
                lda             #$2E
                swi2
                fcb             $41,4           ;SYCRST
                puls            D,X,Y
                lbra            CONOUT1
CONOUT8:        lbsr            SPOUT           ;カーソル位置にスペース出力
                lbra            CONOUT1
CONOUT_ESC:     equ             *               ;ESCシーケンスの処理(単一引数の場合)
                ldb             ArgvCount       ;引数の個数
                lbne            CONOUT_ESCM     ;複数引数のESCシーケンス処理中はCONOUT_ESCM
                cmpa            #$3D            ;=
                lbeq            CONOUT_ESC6     ;カーソル移動
                cmpa            #$2A            ;*
                lbeq            CONOUT_ESC1     ;画面クリア
                cmpa            #$28            ;(
                lbeq            CONOUT_ESC2     ;反転文字
                cmpa            #$29            ;)
                lbeq            CONOUT_ESC3     ;反転文字解除
                cmpa            #$54            ;T
                lbeq            CONOUT_ESC4     ;カーソル位置から行末までクリア
                cmpa            #$59            ;Y
                lbeq            CONOUT_ESC5     ;カーソル以降画面クリア
                clr             ESC_ProcFlag
                lbra            CONOUT1
CONOUT_ESC1:    pshs            D,X,Y           ;[ESC *] 画面を消去してカーソルをホームに移動
                ldb             #$00            ;消去範囲
                lbsr            CLSPRM
                clr             ESC_ProcFlag    ;ESCシーケンス処理中クリア
                puls            D,X,Y
                lbra            CONOUT1
CONOUT_ESC2:    pshs            D,X,Y           ;[ESC (] 反転文字に切替
                ldd             #$6C00          ;反転ビットオン
                lbsr            COLORW
                clr             ESC_ProcFlag    ;ESCシーケンス処理中クリア
                puls            D,X,Y
                lbra            CONOUT1
CONOUT_ESC3:    pshs            D,X,Y           ;[ESC )] 反転文字解除に切替
                ldd             #0x6400         ;反転ビットオフ
                lbsr            COLORW
                clr             ESC_ProcFlag    ;ESCシーケンス処理中クリア
                puls            D,X,Y
                lbra            CONOUT1
CONOUT_ESC4:    pshs            D,X,Y           ;[ESC T] カーソル位置から行末までクリア
                swi2
                fcb             $41,75          ;CURSRD
CONOUT_E41:     cmpa            #$28            ;40
                beq             CONOUT_E42
                lbsr            SPOUT
                inca
                bra             CONOUT_E41
CONOUT_E42:     clr             ESC_ProcFlag    ;ESCシーケンス処理中クリア
                puls            D,X,Y
                lbra            CONOUT1
CONOUT_ESC5:    pshs            D,X,Y           ;[ESC Y] カーソル位置から画面クリア
                swi2
                fcb             $41,75          ;CURSRD
CONOUT_E51:     cmpa            #40             ;40桁
                beq             CONOUT_E52
                lbsr            SPOUT
                inca
                bra             CONOUT_E51
CONOUT_E52:     clra                            ;X=0
                incb                            ;次の行
                cmpb            #24             ;24行
                beq             CONOUT_E53
                clra                            ;X=0
                bra             CONOUT_E51
CONOUT_E53:     clr             ESC_ProcFlag    ;ESCシーケンス処理中クリア
                puls            D,X,Y
                lbra            CONOUT1
CONOUT_ESC6:    equ             *               ;カーソル移動
                inc             ArgvCount       ;引数カウントインクリ
                lbra            CONOUT1
CONOUT_ESCM:    equ             *
                leay            LocateXY,PCR
                ldb             ArgvCount
                cmpb            #1
                beq             CONOUT_ESCM1
                sta             1,Y             ;YPos
                ldd             ,Y
                pshs            D,X,Y
                swi2
                fcb             $41,8           ;CURSET
                puls            D,X,Y
                clr             ArgvCount
                clr             ESC_ProcFlag
                lbra            CONOUT1
CONOUT_ESCM1:   sta             ,Y              ;XPos
                inc             ArgvCount
                lbra            CONOUT1
CONOUT_END:     puls            A,B,X,PC
CONOUT_SJIS:    equ             *
                ldb             SJIS_ProcFlag
                bne             CONOUT_SJ21     ;2バイト目の処理へ
                ldb             #$FF
                stb             SJIS_ProcFlag   ;1バイト目ならフラグをセット
                cmpa            #$9F            ;1バイト目の処理
                bls             CONOUT_SJ11     ;$9F以下なら SJ11
                suba            #$B1            ;それ以外なら
                ldb             #$02
                mul
                incb                            ;AccA*2->AccD+1
                stb             SJISCODE_H
                lbra            CONOUT1
CONOUT_SJ11:
                suba            #$71
                ldb             #$02
                mul
                incb                            ;AccA*2->AccD+1
                stb             SJISCODE_H
                lbra            CONOUT1
CONOUT_SJ21:    cmpa            #$7F
                bcc             CONOUT_SJ22     ;$7Fより大きいなら
                bra             CONOUT_SJ23
CONOUT_SJ22:    deca                            ;AccA-1
CONOUT_SJ23:    cmpa            #$9E
                bcc             CONOUT_SJ24     ;$9E以上ならSJ24
                suba            #$1F
                sta             SJISCODE_L
                bra             CONOUT_SJ25
CONOUT_SJ24:
                suba            #$7D
                sta             SJISCODE_L
                lda             SJISCODE_H
                inca
                sta             SJISCODE_H
CONOUT_SJ25:
                ldd             SJISCODE_H
                std             KNCODE
                bsr             KNPUT
                clr             SJIS_ProcFlag
                lbra            CONOUT1
SPOUT:          pshs            A               ;スペース出力
                lda             #$20
                lbsr            OUTSCR
                puls            A,PC
KNPUT:          pshs            D,X,Y           ;JIS漢字出力
                bra             KNPUT2
KNCODE:         fdb             $3441           ;JIS CODE
KNPARM:         fcb             $00             ;ERROR CODE
                fcb             $00             ;COMMAND CODE
                fcb             $00             ;NOT USE
                fcb             $00             ;PLOT OPTION
                fdb             $0000           ;NOT USE
                fdb             0               ;HORIZONTAL POSITION
                fdb             0               ;VIRTICAL POSITION
                rmb             8               ;NOT USE
                fdb             $0001           ;HORIZONTAL OPTION(RATIO)
                fdb             $0001           ;VIRTICAL OPTOPN(RATIO)
                fcb             1
                fcb             2               ;PALETTE CODE(COLOR)
KNPARME:        equ             *               ;PARAM END
KNPUT2:         swi2
                fcb             $41,$69
                ldx             PIFBUF          ;X=GRAPHIC I/F BUFFER
                leay            KNPARM,PCR      ;PARAM POINTER
                ldb             #KNPARME-KNPARM
KNPUT3:
                lda             ,Y+
                sta             ,X+
                decb
                bne             KNPUT3
KNPUT4:
                ldd             KNCODE,PCR
                swi2
                fcb             $42,12
                leay            KNPARM,PCR
                ldd             6,Y
                addd            #16
                std             6,Y             ;HORIZONTAL+16
                cmpd            #639
                bls             KNPUT6
                ldd             #0
                std             6,Y
                ldd             8,Y
                addd            #16             ;VARTICAL+16
                std             8,Y
                ldd             8,Y
                cmpd            #183
                bcc             KNPUT5
                bra             KNPUT6
KNPUT5:         ldd             #184
                std             8,Y             ;最終行固定(残件)
KNPUT6:
                puls            D,X,Y,PC
ESC_ProcFlag:   rmb             1               ;ESC処理中フラグ
SJIS_ProcFlag:  rmb             1               ;SJIS処理中フラグ
SJISCODE_H:     rmb             1               ;SJIS漢字コード(H)
SJISCODE_L:     rmb             1               ;SJIS漢字コード(L)
ArgvCount:      rmb             1               ;引数カウント
LocateXY:       rmb             2               ;カーソルXY
#+++ Lib
                include         ..\..\S1\kk_S1-Lib\S1Lib.asm

S1BASIC上ではすべての機能が動作していますがCP/MのBIOS09に組み込むとSJIS漢字出力は動作しませんでした。
(MBASICの問題かもしれません・・・)

10行目 エスケープシーケンスでLOCATE 10,11した後”AB”を表示。
20行目 “ABC”を表示した後、エスケープシーケンスで”DEF”を反転、”GHI”で反転解除
30行目 SJIS漢字コードで漢字を表示しようとしたが、Illeagal Function Callが発生
このIlleagal Function CallはMBASICが出したものではなくS1BASICが出しています。
ということは、この時点でCP/M80は終了しS1BASICに落ちています・・・

そんなCONOUT機能拡張の記録・・・^^

kabekin