memo :

* 祝一平氏 ? : 初期の電脳倶楽部 解像度拡大ソフト
( IOCS パラメータ ( 桁 , 行 ) にも細工か ( 氏の ? FROMR2L.X も同様 ? ) )

* ドラスピ : スクロール速度を AC 版と並べて等速に調整 ( ベーマガ記事 )

* 立花えり子氏  パックランド方式 ( 後述  Seafy 氏ドキュメント 相互補完 ) ?
http://kg68k.github.io/InsideX68000-eratta/undisclosed.html

* 主に CRTC 関連 :
http://ikura.2ch.sc/test/read.cgi/i4004/1584840409/145# スプライト画像によるBG切り抜
http://ikura.2ch.sc/test/read.cgi/i4004/1584840409/344# るつぼ Seafy 氏ドキュメント
( 垂直二倍角表示 ? な BG ( + スプライト ? ) 等 + http://archive.is/y2nMl# パックランド方式 )
http://ikura.2ch.sc/test/read.cgi/i4004/1584840409/681-682# 要望 シンシア 3000fps
http://ikura.2ch.sc/test/read.cgi/i4004/1584840409/712# 通常版 CYNTHIA 系 →  64 並列 → 3000fps ?
http://ikura.2ch.sc/test/read.cgi/i4004/1584840409/713# 要望 PEZY-1 ( AArch32 付 ) グラボ ( 直結モード搭載 ? )
http://ikura.2ch.sc/test/read.cgi/i4004/1574225209/272# 寧ろ CRT の周辺機器

* ストライダー飛竜関連 diff 後日 ? ( Ve 氏らの新生 Xeld にて ? )
# ls -l --full-time *
-rw-r--r--   1 baron    users        5233 Sat Feb 05 22:07:14 1994 HIRYU.has
-rw-r--r--   1 baron    users         692 Sat Feb 05 22:07:22 1994 HIRYU.x
-rw-r--r--   1 baron    users        1150 Wed Dec 30 00:05:46 1992 STR38415.LZH
-rw-r--r--   1 baron    users        9153 Mon Jun 07 00:12:30 1993 hiryu102.lzh
-rw-r--r--   1 baron    users        9360 Wed Jul 07 20:09:00 1993 hiryu103.lzh
-rw-r--r--   1 baron    users        9085 Fri Jul 09 00:55:50 1993 hiryu103_103a.lzh
-rw-r--r--   1 baron    users        9084 Sun Sep 19 21:24:10 1993 hiryu104.lzh




\~\ crtc.dta \~~\
datas(11/43) 93/06/12 11:13 X68K)CRTC設定資料
  10263B 2:Seafy 

X68000 CRTCの設定資料

 本ドキュメントは実際の動作を確かめつつかかれたものですが、このドキュメントの内容は、
御自分で十分な検証を行ったのちに利用するようにして下さい。


・CRTCレジスタ設定例
*(512*512) 31KHz
        dc.w    $005b,$0009,$0011,$0051,$0237,$0005,$0028,$0228
        dc.w    $001b,$0015,$00ff,$0015,$0028,$0015,    0
*(512*512) 15KHz
        dc.w    $004b,$0003,$0005,$0045,$0103,$0002,$0010,$0100
        dc.w    $002c,$0005,$00ff,$0009,$0010,$0005,    0
*(256*256) 31KHz
        dc.w    $002d,$0004,$0006,$0026,$0237,$0005,$0028,$0228
        dc.w    $001b,$0010,$00ff,$000a,$0028,$0010,    0
*(256*256) 15KHz
        dc.w    $0025,$0001,$0000,$0020,$0103,$0002,$0010,$0100
        dc.w    $0024,$0000,$0025,$0004,$0010,$0000,    0
*(512*512) 1:1 31KHz スプライト使用不可
        dc.w    $0089,$000e,$002c,$006c,$0237,$0005,$0028,$0228
        dc.w    $001b,$0016,$ffff,$ffff,$ffff,$ffff,    0
*(512*512) 1:1 15KHz スプライト使用不可
        dc.w    $0088,$000b,$002a,$006a,$0103,$0002,$0010,$0100
        dc.w    $001b,$0019,$ffff,$ffff,$ffff,$ffff,    1
*(768*512) 31KHz スプライト使用不可
        dc.w    $0089,$000e,$001c,$007c,$0237,$0005,$0028,$0228
        dc.w    $001b,$0016,$ffff,$ffff,$ffff,$ffff,    0
*(768*512) 15KHz スプライト使用不可
        dc.w    $0084,$0012,$001d,$007d,$0113,$0001,$0010,$0110
        dc.w    $002c,$001d,$ffff,$ffff,$ffff,$ffff,    1
*(256*256) 1:1 31KHz
        dc.w    $0045,$0006,$0012,$0032,$0237,$0005,$0028,$0228
        dc.w    $001b,$0011,$00ff,$0016,$0028,$0010,    1
*(256*256) 1:1 15KHz
        dc.w    $0043,$0005,$0012,$0032,$0103,$0002,$0010,$0100
        dc.w    $001b,$0014,$00ff,$0016,$0010,$0000,    1
*(512*512) 1:1 24KHz
        dc.w    $0070,$0010,$0022,$0062,$01ff,$0000,$0018,$0240
        dc.w    $001b,$0015,$00ff,$0026,$0018,$0015,    0
*(256*256) 1:1 24KHz
        dc.w    $0038,$000c,$0012,$0032,$01ff,$0000,$0018,$0240
        dc.w    $001b,$0010,$00ff,$0016,$0018,$0010,    0
*(384*240) 15KHz
        dc.w    $0042,$0005,$000a,$003a,$0103,$0002,$0010,$0100
        dc.w    $002c,$0014,$0000,$0000,$0000,$0000,    1
*(640*416) 24KHz
        dc.w    $0073,$0010,$0019,$0069,$01d0,$0007,$0020,$01c0
        dc.w    $001b,$0015,$0000,$0000,$0000,$0000,    0
*(496*416) 24KHz
        dc.w    $0056,$0008,$000e,$004c,$01d0,$0007,$0020,$01c0
        dc.w    $001b,$0015,$0000,$0000,$0000,$0000,    1
*(496*208) 24KHz
        dc.w    $0056,$0008,$000e,$004c,$01d0,$0007,$0020,$01c0
        dc.w    $001b,$0011,$0000,$0000,$0000,$0000,    1
*(640*208) 24KHz
        dc.w    $0073,$0010,$0019,$0069,$01d0,$0007,$0020,$01c0
        dc.w    $001b,$0011,$0000,$0000,$0000,$0000,    0
*(320*208) 24KHz
        dc.w    $0038,$0007,$000a,$0032,$01d0,$0007,$0020,$01c0
        dc.w    $001b,$0010,$0000,$0000,$0000,$0000,    0
*(240*208) 24KHz
        dc.w    $002b,$0002,$0004,$0022,$01d0,$0007,$0020,$01c0
        dc.w    $001b,$0010,$0000,$0000,$0000,$0000,    1
*(384*256) 31KHz
        dc.w    $0044,$0006,$000b,$003b,$0237,$0005,$0028,$0228
        dc.w    $001b,$0011,$0000,$0000,$0000,$0000,    1
*(184*256) 31KHz
        dc.w    $0020,$0008,$0008,$001f,$0237,$0005,$0028,$0228
        dc.w    $001b,$0010,$0000,$0000,$0000,$0000,    1


・基本CRTC設定プログラム

        clr.l   -(sp)
        DOS     _SUPER
        addq.l  #4,sp

        lea     crt_table(pc),a0
        lea     $e80000,a1
        move.w  9*2(a0),d0
        cmp.b   $29(a1),d0
        blt     ltoh
htol:   moveq   #8,d0
@@:     move.w  (a0)+,(a1)+
        dbra    d0,@b
        move.w  (a0)+,d2
        move.b  d2,$e80029
        bra     crt_spr
ltoh:   move.w  9*2(a0),d2
        move.b  d2,$29(a1)
        moveq   #7,d0
        move.w  (a0)+,d1
        addq.l  #2,a1
@@:     move.w  (a0)+,(a1)+
        dbra    d0,@b
        addq.l  #2,a0
        move.w  d1,$e80000
crt_spr:
        move.w  2(a0),$eb080c

        move    sr,-(sp)
        or      #$700,sr
        moveq   #6,d0
@@:     btst    #7,$e88001      *MFP H-sync
        beq     @b
h5sync_wait:
        btst    #7,$e88001      *MFP H-sync
        bne     h5sync_wait
        dbra    d0,@b
        move    (sp)+,sr        *スプライトレジスタへのアクセスディレイ

        move.w  0(a0),$eb080a
        move.w  4(a0),$eb080e
        move.w  6(a0),$eb0810
        tst.w   8(a0)
        beq     @f
        or.b    #%0000_0010,$e8e007
        bra     return
@@:     and.b   #%1111_1101,$e8e007
return:
        DOS     _EXIT

crt_table:
        dc.w    $0025,$0001,$0000,$0020
        dc.w    $0103,$0002,$0010,$00f0
        dc.w    $0024,$0000,$0025,$0004
        dc.w    $0010,$0000,$0000,0

 画面関係のレジスタ設定は、スプライト水平トータルに$FF以外の値を書き込む場合にかぎり、
水平表示開始位置のレジスタの設定後130マイクロ秒おくらせて水平トータルのレジスタをアク
セスするように設定しなければなりません。このことに対応する物はコメントにあるとうり5回の
水平同期待ちで実現されています。水色の本に書いてあるようなソフトウェアループによるウェイ
トでは、現在の多様な周波数で動くCPUに対して十分なウェイトとなりませんので注意して下さ
い。
 31KHz 768×512のドットクロックではスプライトの表示は行えません。具体的には
CRTC R20の下位バイトが$15の場合、表示出来ないということです。

・画面表示範囲の拡大

 画面表示範囲は少しならば広げることが可能です。画面表示範囲を広げるにはCRTCの表示開
始位置、表示終了位置を変える事によって実現します。この範囲は開始位置は開始であれば0から、
終了であればトータルのレジスタの値まで出来ますが、表示されない場合もありますのでデバッガ
等で確かめながら書き換える必要があります。実際には0や、トータルの値と同じ値を設定すると
おかしくなる場合もあるので、±1した値位迄を限界とする方がいいと思われます。
 これでたらない場合はトータルを書き換えます。ただ、水平トータルを書き換えると水平同期周
波数が、垂直トータルを書き換えると垂直同期周波数が変わっていき、最後にはディスプレイの同
期がとれなくなります。この同期がとれないという限界値はディスプレイに依ってまちまちである
ばかりでなく、垂直同期ボリュームが簡単には調整出来ないディスプレイが存在するということも
あり、自分のみで使用する以外の場合は限界までの使用はしない方がいいと思われます。
 私の所にあるCZ-600Dについてチェックしてみたところ、24KHzモードで垂直508
ライン、31KHzモードで垂直750〜800ラインまで表示出来ました。このようにして画面
情報量を増やしていろいろするということも出来ます。とくに24KHzの方の508ラインは有
用で、512×508のドット比が1:1、スプライト使用可能ということができるほか、102
4×1016のインターレースモードではほとんど隠れている部分無しに全て見渡せるということ
ができます。
(前者はZs STAFFの正方形画面モード、後者はEDなどで使用することが出来ます。)
 ただ、このような変更はいい面だけではなくて、悪い面もあります。例えば垂直同期周波数の減
少によるちらつきがあげられます。これは垂直同期周波数が落ちたために、ディスプレイのフレー
ム書き換え枚数が落ち、明るい画面ほどぱらぱらぱらとちらつくのです。これは垂直トータルを書
き換えたため仕方ありません。
 また、ゲームのような垂直同期周波数で処理が進むようなものの場合、周波数の変化はゲームの
スピード自体を変化させます。現在でも通常設定の場合は15KHzと31KHzで61.5Hz
と55.5Hzというようにかなり違うので、見た目のスピードにいたるまでかなり影響をうけて
います。また、タイム落ちなどをするゲーム等では31KHzの方がタイム落ちをする確率が低い、
などという状況も発生します。ですからこのCRTCのレジスタを変化させれば、ある程度この差
を吸収したりということが出来ることになります。

・ スプライトコントローラの設定

 スプライトレジスタにも表示開始位置が存在します。これは上記のCRTCの値がもとまってか
ら、計算して書き込めばいいわけです。この計算方法は下記のようになっています。

スプライトコントローラ CRTCレジスタ
H-TOTAL    =水平トータル(ただし15KHzの256ドット以下の場合)
H-DISP     =水平表示開始位置+4
V-DISP     =垂直表示開始位置

 このように計算で出すことが出来ますが、表示位置を変更した場合や表示範囲を広げた場合には
問題が発生する場合があります。
 スプライトの表示には帰線期間からのリカバリータイムが存在しなければスプライトの横制限枚
数が減ったりするようです。このようになった場合は表示開始位置を増やすことで横制限枚数が回
復する場合があります。このときに左側に黒い部分(表示開始位置がずれたことに起因する)を左
にずらしたい場合にはCRTCの同期位置を変更すればいいようです。ただ、この同期位置の変更
によって表示位置がずれないディスプレイが純正ディスプレイにおいて存在するため、あくまで補
助画面モードとするか、自分だけの使用にとどめる必要があります。
 これらの総合的な設定の簡単なやり方はとりあえずCRTCを同期が合うように設定してしまっ
て、その後スプライトを横制限ぎりぎりまで出して、きちんと表示されているか確かめます。もし
表示されていなければCRTCはそのままで、スプライトコントローラの水平表示開始位置を変更
していきます。これで表示が出来るようならば、その数値から逆算してCRTCの表示開始位置も
設定しなおし、同期位置をずらして位置の微調整をする、ということになります。24KHzの2
56×256モード等はこうして調整してスプライトもきちんと表示されているので、対処出来る
と思います。
 スプライトコントローラには、もう1つのレジスタとしてBGコントロールがあります。これを
いじるとCRTCに関係無く垂直2倍表示や、512×512モードにおけるBG8×8ドットモ
ードなどが実現出来ます。ただ、これをするとスプライトが256×256の範囲外で変なことに
なったり、BGも画面モードによっては横256ドットから先が1ラスタずれたりと、あまり使え
ない場合も存在します。
 一応512×512のBG8×8ドットモードはスプライトが使用不可であるということはあり
ますが、かなり有用な画面モードと思います。64×64の粗いグラフィック画面として使うこと
も出来ますし、キャラクタでびっしり埋めることも出来ます。

・ その他

 X68000ではあるプレーンの内容によって他のプレーンが透けるという現象が発生します。
こういった現象は、スプライトにカラーコード1でフィルしたようなパターンを設定し、次に、ス
プライトパレットの1を透明色(0)に設定することによって容易に再現出来ます。
 このスプライトを、このパレットとセットでBGの上に表示すると、BGになにが表示されてい
ようとも下のグラフィックが透けて見えるということになります。(下にグラフィック等、何にも
ない場合は黒)
 これはスプライトどうしやBGに対してもいえて、BGがスプライトをつつぬけにしたり、プラ
イオリティが上のスプライトが下のスプライトを筒抜けにしたりと色々なことになります。
 こういったことは、BGにプレーン単位で物を書いておいて、パレットを変更することで任意の
プレーンを表示するような処理をした場合にBGが筒抜けになってつかいものにならない、という
状況におちいることがありますから注意する必要があります。
 このような現象はグラフィックにもあり、グラフィックの0以外のパレットを透明にするとグラ
フィックのプライオリティーの高い全てつつぬけになります。
 また、スプライトの透明パターンでテキストが透けるような現象も発生します。特にテキストと
スプライトでは通常別の物として考えやすいので注意する必要があります。

                                Final tear Z 3月号記事に可筆修正 Seafy

\~\ crtc.dta \~~\



\~\ SCSET.S \~~\
*===============================================================================
*
*               ポピュラスのスクリーンを640*400にする
*
*  IOCSコール _CRTMODのベクタを頂戴してCRTモードを768*512にしようとするところを
*  640*400にしてしまう
*
*===============================================================================
        .include  a:\include\doscall.mac
*===============================================================================
*
*  常駐部
*
*  768*512を640*400にする
*
*===============================================================================
savereg reg     A0
        .text
*---------------------------------------
newcrtmod:
        move.l  savereg,-(SP)
        cmp.w   #16,D1                  ;CRTモードを768*512にしようとしているか
        beq     set640x400              ;そうなら640*400にしてしまう

        move.l  oldcrtmod(PC),A0        ;そうでないなら以前のベクタをコールし
        jsr     (A0)
        bra     exit                    ;帰る

set640x400:
        move.l  #$E80000,A0             ;CRTC top address
waitvdisp:
        btst.b  #4,$E88001              ;帰線区間だったら終わるまで待つ
        beq     waitvdisp
waitvdisp2:
        btst.b  #4,$E88001              ;表示期間が終わるまで待つ
        bne     waitvdisp2

        move.w  #$74,(A0)+              ;帰線期間が始まったらCRTCに値をセット
        move.w  #$9,(A0)+
        move.w  #$14,(A0)+
        move.w  #$64,(A0)+
        move.w  #$1D0,(A0)+
        move.w  #$7,(A0)+
        move.w  #$20,(A0)+
        move.w  #$1B0,(A0)+
        move.w  #$1B,(A0)+
        move.w  #$0415,$E80028

        move.w  #64,D0                  ;x方向スクロールレジスタセット
        move.l  #$E80014,A0             ;(768-640)/2 = 64(いいかげん)
        move.w  D0,(A0)
        addq.l  #4,A0
        move.w  D0,(A0)
exit:
        move.l  (SP)+,savereg
        rts
*---------------------------------------
oldcrtmod:
        dc.l    0
keepend:
*===============================================================================
*
*  初期化部
*
*  ROM内の IOCS  _CRTMOD 処理ルーチンに代わり呼び出され768*512を640*400にする
*
*===============================================================================
        .text
*---------------------------------------
start:
        lea.l   fin(PC),SP

        pea     newcrtmod(PC)           ;_CRTMODのベクタを書きかえる
        move.w  #$110,-(SP)
        DOS     _INTVCS
        addq.l  #6,SP
        move.l  D0,oldcrtmod            ;以前のベクタを保存

        clr.w   -(SP)
        lea.l   keepend(PC),A0
        suba.l  #newcrtmod,A0
        move.l  A0,-(SP)
        DOS     _KEEPPR
*---------------------------------------
        .bss

        .ds.b   1024
fin:
        .end    start

\~\ SCSET.S \~~\



\~\ EXCRT.S \~~\
        INCLUDE DOSCALL.MAC

        XREF    KEEPCHECK

        TEXT

PLEN            EQU     PEND-PTOP       * 常駐部の長さ
PTR1            EQU     PREVEC1-PTOP+$0100
PTR2            EQU     PREVEC2-PTOP+$0100

PTOP:                                   * プログラム先頭
        BRA.W   INIT

                                        * ベクタの待避先
PREVEC1:                                * _CRTMOD
        DC.L    0
PREVEC2:                                * _G_CLR_ON
        DC.L    0

*       条虫部分
        INCLUDE CRT.S

PEND:                                   * 常駐部の最後

INIT:
        PEA     MES_TIT(PC)
        DOS     _PRINT
        ADDQ.L  #4,SP

        BSR     KEEPCHECK
        MOVEA.L D0,A6                   * PRE MEMPTR

        TST.B   (A2)+
        BNE     INITJ1
                                        * NO SWITCH
        MOVE.L  A6,D0                   * TST.L A6
        BNE     ERROR1                  * 既に常駐していた

        PEA     _CRTMOD(PC)             * VECTOR
        MOVE.W  #$0110,-(SP)            * VECTOR NUMBER OF _CRTMOD
        DOS     _INTVCS                 * SET NEW VECTOR
        ADDQ.L  #6,SP
        LEA     PREVEC1(PC),A1
        MOVE.L  D0,(A1)

        PEA     _G_CLR_ON(PC)           * VECTOR
        MOVE.W  #$0190,-(SP)            * VECTOR NUMBER OF _G_CLR_ON
        DOS     _INTVCS                 * SET NEW VECTOR
        ADDQ.L  #6,SP
        LEA     PREVEC2(PC),A1
        MOVE.L  D0,(A1)

        CLR.W   -(SP)                   * EXIT CODE = 0
        MOVE.L  #PLEN,-(SP)             * PROGRAM LENGTH
        DOS     _KEEPPR

INITJ1:                                 * SWITCH EXIST
        CMPI.B  #'-',(A2)
        BEQ     INITJ2
        CMPI.B  #'/',(A2)
        BNE     ERROR2                  * スイッチ以外の物がきた

INITJ2:
        MOVE.B  1(A2),D0
        OR.B    #$20,D0                 * _TOLOWER
        CMP.B   #'r',D0
        BNE     ERROR2                  * スイッチ以外の物がきた

        MOVE.L  A6,D0                   * TST.L A6
        BEQ     ERROR3                  * 常駐していないのに
                                        * 解除しようとした
                                        * 常駐していたので解除する
        MOVE.L  PTR1(A6),-(SP)
        MOVE.W  #$0110,-(SP)            * VECTOR NUMBER OF _CRTMOD
        DOS     _INTVCS
        ADDQ.L  #6,SP

        MOVE.L  PTR2(A6),-(SP)
        MOVE.W  #$0190,-(SP)            * VECTOR NUMBER OF _G_CLR_ON
        DOS     _INTVCS
        ADDQ.L  #6,SP

        PEA     $0010(A6)
        DOS     _MFREE
        ADDQ.L  #4,SP

        PEA     MES_KAIJO(PC)           * 常駐を解除しました
        BRA     PRINTEXIT

ERROR1:
        PEA     MES_ERR(PC)             * 既に常駐しています
        BRA     PRINTEXIT

ERROR2:
        PEA     MES_USAGE(PC)           * 使用法
        BRA     PRINTEXIT

ERROR3:
        PEA     MES_ERR2(PC)            * 常駐していません
PRINTEXIT:
        DOS     _PRINT
*       ADDQ.L  #4,SP

        DOS     _EXIT

MES_TIT:
        DC.B    "EXTEND CRTMOD/G_CLR_ON version 1.01 by Y.Shimizu",13,10,0
MES_KAIJO:
        DC.B    "常駐を解除しました",13,10,0
MES_ERR:
        DC.B    "既に常駐しています",13,10,0
MES_ERR2:
        DC.B    "常駐していません",13,10,0
MES_USAGE:
        DC.B    "IOCSを拡張して、設定できるCRTモードを増やします",13,10
        DC.B    "使用法:excrt [-r]",13,10
        DC.B    "  -r              常駐解除",13,10,0
\~\ EXCRT.S \~~\



\~\ newcrt.dat \~~\
* DATA FORMAT OF EXTEND CRTMOD
*       DC.W    R20,R00,R01,R02         R20 の上位は $03 にしておくこと。
*       DC.W    R03,R04,R05,R06         IOCS内で設定されるから問題無し。
*       DC.W    R07,R08
*       DC.B    H total,H disp,V disp,L/H freq V Res. H Res.
*       DC.W    実画面の大きさ,表示画面.X,表示画面.Y,アクティブページの数

* 13
        DC.W    $0312,$00AF,$000F,$001F,$009F,$01D0,$0007,$0020         * 11
        DC.W    $01C8,$001B,$FFFF,$FFFF,$0400,$0400,$00D4,$0001
* 14
        DC.W    $0318,$002D,$0004,$0006,$0026,$0237,$0005,$0028         * 02
        DC.W    $0228,$001B,$FF0A,$2804,$0400,$0100,$0400,$0001         * 256*1024 high
* 15
        DC.W    $0319,$005B,$0009,$0011,$0051,$0237,$0005,$0028         * 00
        DC.W    $0228,$001B,$FF15,$2805,$0400,$0200,$0400,$0001         * 512*1024 high
* 16
        DC.W    $031A,$0089,$000E,$001C,$007C,$0237,$0005,$0028         * 10
        DC.W    $0228,$001B,$FFFF,$FFFF,$0400,$0300,$0400,$0001         * 768*1024
* 17
        DC.W    $0312,$0089,$000E,$001C,$007C,$0237,$0005,$0028         * 10
        DC.W    $0228,$001B,$FFFF,$FFFF,$0400,$0300,$0100,$0001         * 768*256
NEWCRT:
* 僕が勝手に付け加えた18
        DC.W    $0314,$003A,$0007,$000A         * mid  336*424 16/65536  512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2F(?)
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01A8,$0001

* 1D
        DC.W    $0316,$0089,$000E,$001C         * high 512*512 16/16    1024*1024
        DC.W    $005C,$0237,$0005,$0028         *     (768*512)
        DC.W    $0228,$001B,$FFFF,$FFFF
        DC.W    $0200,$0200,$0200,$0004
* 1E
        DC.W    $0316,$0089,$000E,$001C         * high 512*512 16/256   1024*1024
        DC.W    $005C,$0237,$0005,$0028         *     (768*512)
        DC.W    $0228,$001B,$FFFF,$FFFF
        DC.W    $0200,$0200,$0200,$0002
* 1F
        DC.W    $0316,$0089,$000E,$001C         * high 512*512 16/65536 1024*1024
        DC.W    $005C,$0237,$0005,$0028         *     (768*512)
        DC.W    $0228,$001B,$FFFF,$FFFF
        DC.W    $0200,$0200,$0200,$0001
* 20
        DC.W    $0311,$005B,$0009,$0011         * high 512*256 16/16    1024*1024
        DC.W    $0051,$0237,$0005,$0028         * $20
        DC.W    $0228,$001B,$FF15,$2811
        DC.W    $0400,$0200,$0100,$0001
* 21
        DC.W    $0301,$004B,$0003,$0005         * low  512*256 16/16    1024*1024
        DC.W    $0045,$0103,$0002,$0010         * $21
        DC.W    $0100,$002C,$FF09,$1001
        DC.W    $0400,$0200,$0100,$0001
* 22
        DC.W    $0314,$002D,$0004,$0006,$0026,$0237,$0005,$0028         * 02
        DC.W    $0228,$001B,$FF0A,$2814,$0400,$0100,$0200,$0001         * HIGH 256*512
                                                                        * 1024*1024
* 23
        DC.W    $0304,$0025,$0001,$0000,$0020,$0103,$0002,$0010         * 03
        DC.W    $0100,$0024,$2504,$1004,$0400,$0100,$0200,$0001         * LOW 256*512
                                                                        * 1024*1024
* 24
        DC.W    $0311,$005B,$0009,$0011         * high 512*256 16/16     512*512
        DC.W    $0051,$0237,$0005,$0028         * $24
        DC.W    $0228,$001B,$FF15,$2811
        DC.W    $0200,$0200,$0100,$0004
* 25
        DC.W    $0301,$004B,$0003,$0005         * low  512*256 16/16     512*512
        DC.W    $0045,$0103,$0002,$0010         * $25
        DC.W    $0100,$002C,$FF09,$1001
        DC.W    $0200,$0200,$0100,$0004
* 26
        DC.W    $0314,$002D,$0004,$0006,$0026,$0237,$0005,$0028         * 06
        DC.W    $0228,$001B,$FF0A,$2814,$0200,$0100,$0200,$0004         * HIGH 256*512
                                                                        * 16/16
* 27
        DC.W    $0304,$0025,$0001,$0000,$0020,$0103,$0002,$0010         * 07
        DC.W    $0100,$0024,$2504,$1004,$0200,$0100,$0200,$0004         * LOW 256*512
                                                                        * 16/16
* 28
        DC.W    $0311,$005B,$0009,$0011         * high 512*256 16/256    512*512
        DC.W    $0051,$0237,$0005,$0028         * $28
        DC.W    $0228,$001B,$FF15,$2811
        DC.W    $0200,$0200,$0100,$0002
* 29
        DC.W    $0301,$004B,$0003,$0005         * low  512*256 16/256    512*512
        DC.W    $0045,$0103,$0002,$0010         * $29
        DC.W    $0100,$002C,$FF09,$1001
        DC.W    $0200,$0200,$0100,$0002
* 2A
        DC.W    $0314,$002D,$0004,$0006,$0026,$0237,$0005,$0028         * 0A
        DC.W    $0228,$001B,$FF0A,$2814,$0200,$0100,$0200,$0002         * HIGH 256*512
                                                                        * 16/256
* 2B
        DC.W    $0304,$0025,$0001,$0000,$0020,$0103,$0002,$0010         * 0B
        DC.W    $0100,$0024,$2504,$1004,$0200,$0100,$0200,$0002         * LOW 256*512
                                                                        * 16/256
* 2C
        DC.W    $0311,$005B,$0009,$0011         * high 512*256 16/65536  512*512
        DC.W    $0051,$0237,$0005,$0028         * $2C
        DC.W    $0228,$001B,$FF15,$2811
        DC.W    $0200,$0200,$0100,$0001
* 2D
        DC.W    $0301,$004B,$0003,$0005         * low  512*256 16/65536  512*512
        DC.W    $0045,$0103,$0002,$0010         * $2D
        DC.W    $0100,$002C,$FF09,$1001
        DC.W    $0200,$0200,$0100,$0001
* 2E
        DC.W    $0314,$002D,$0004,$0006,$0026,$0237,$0005,$0028         * 0E
        DC.W    $0228,$001B,$FF0A,$2814,$0200,$0100,$0200,$0001         * HIGH 256*512
                                                                        * 16/65536
* 2F
        DC.W    $0304,$0025,$0001,$0000,$0020,$0103,$0002,$0010         * 0F
        DC.W    $0100,$0024,$2504,$1004,$0200,$0100,$0200,$0001         * LOW 256*512
                                                                        * 16/65536
* 30
        DC.W    $0311,$0044,$0005,$000A         * high 384*256 16/16    1024*1024
        DC.W    $003A,$0237,$0005,$0028         * $22
        DC.W    $0228,$001B,$FF0E,$2911
        DC.W    $0400,$0180,$0100,$0001
* 31
        DC.W    $0310,$003A,$0007,$000A         * mid  336*224 16/16    1024*1024
        DC.W    $0034,$01E0,$0000,$0020         * $23
        DC.W    $01E0,$001B,$FF0E,$2111
        DC.W    $0400,$0150,$00E0,$0001
* 32
        DC.W    $0315,$0044,$0005,$000A         * high 384*512 16/16    1024*1024
        DC.W    $003A,$0237,$0005,$0028         * $22
        DC.W    $0228,$001B,$FF0E,$2915
        DC.W    $0400,$0180,$0200,$0001
* 33
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/16    1024*1024
        DC.W    $0034,$01E0,$0000,$0020         * $23
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0400,$0150,$01C0,$0001
* 34
        DC.W    $0311,$0044,$0005,$000A         * high 384*256 16/16     512*512
        DC.W    $003A,$0237,$0005,$0028         * $26
        DC.W    $0228,$001B,$FF0E,$2911
        DC.W    $0200,$0180,$0100,$0004
* 35
        DC.W    $0310,$003A,$0007,$000A         * mid  336*224 16/16     512*512
        DC.W    $0034,$01E0,$0000,$0020         * $27
        DC.W    $01E0,$001B,$FF0E,$2111
        DC.W    $0200,$0150,$00E0,$0004
* 36
        DC.W    $0315,$0044,$0005,$000A         * high 384*512 16/16     512*512
        DC.W    $003A,$0237,$0005,$0028         * $26
        DC.W    $0228,$001B,$FF0E,$2915
        DC.W    $0200,$0180,$0200,$0004
* 37
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/16     512*512
        DC.W    $0034,$01E0,$0000,$0020         * $27
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01C0,$0004
* 38
        DC.W    $0311,$0044,$0005,$000A         * high 384*256 16/256    512*512
        DC.W    $003A,$0237,$0005,$0028         * $2A
        DC.W    $0228,$001B,$FF0E,$2911
        DC.W    $0200,$0180,$0100,$0002
* 39
        DC.W    $0310,$003A,$0007,$000A         * mid  336*224 16/256    512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2B
        DC.W    $01E0,$001B,$FF0E,$2111
        DC.W    $0200,$0150,$00E0,$0002
* 3A
        DC.W    $0315,$0044,$0005,$000A         * high 384*512 16/256    512*512
        DC.W    $003A,$0237,$0005,$0028         * $2A
        DC.W    $0228,$001B,$FF0E,$2915
        DC.W    $0200,$0180,$0200,$0002
* 3B
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/256    512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2B
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01C0,$0002
* 3C
        DC.W    $0311,$0044,$0005,$000A         * high 384*256 16/65536  512*512
        DC.W    $003A,$0237,$0005,$0028         * $2E
        DC.W    $0228,$001B,$FF0E,$2911
        DC.W    $0200,$0180,$0100,$0001
* 3D
        DC.W    $0310,$003A,$0007,$000A         * mid  336*224 16/65536  512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2F
        DC.W    $01E0,$001B,$FF0E,$2111
        DC.W    $0200,$0150,$00E0,$0001
* 3E
        DC.W    $0315,$0044,$0005,$000A         * high 384*512 16/65536  512*512
        DC.W    $003A,$0237,$0005,$0028         * $2E
        DC.W    $0228,$001B,$FF0E,$2915
        DC.W    $0200,$0180,$0200,$0001
* 3F
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/65536  512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2F
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01C0,$0001
\~\ newcrt.dat \~~\



\~\ PALET.DAT \~~\
PALDAT0:
        DC.W    $0000,$5294,$0020,$003E,$0400,$07C0,$0420,$07FE
        DC.W    $8000,$F800,$8020,$F83E,$8400,$FFC0,$AD6A,$FFFE

PALDAT1:
        DC.W    $0000,$0008,$0012,$001A,$0024,$002C,$0036,$003E
        DC.W    $0100,$0108,$0112,$011A,$0124,$012C,$0136,$013E
        DC.W    $0240,$0248,$0252,$025A,$0264,$026C,$0276,$027E
        DC.W    $0340,$0348,$0352,$035A,$0364,$036C,$0376,$037E
        DC.W    $0480,$0488,$0492,$049A,$04A4,$04AC,$04B6,$04BE
        DC.W    $0580,$0588,$0592,$059A,$05A4,$05AC,$05B6,$05BE
        DC.W    $06C0,$06C8,$06D2,$06DA,$06E4,$06EC,$06F6,$06FE
        DC.W    $07C0,$07C8,$07D2,$07DA,$07E4,$07EC,$07F6,$07FE
        DC.W    $5000,$5008,$5012,$501A,$5024,$502C,$5036,$503E
        DC.W    $5100,$5108,$5112,$511A,$5124,$512C,$5136,$513E
        DC.W    $5240,$5248,$5252,$525A,$5264,$526C,$5276,$527E
        DC.W    $5340,$5348,$5352,$535A,$5364,$536C,$5376,$537E
        DC.W    $5480,$5488,$5492,$549A,$54A4,$54AC,$54B6,$54BE
        DC.W    $5580,$5588,$5592,$559A,$55A4,$55AC,$55B6,$55BE
        DC.W    $56C0,$56C8,$56D2,$56DA,$56E4,$56EC,$56F6,$56FE
        DC.W    $57C0,$57C8,$57D2,$57DA,$57E4,$57EC,$57F6,$57FE
        DC.W    $A800,$A808,$A812,$A81A,$A824,$A82C,$A836,$A83E
        DC.W    $A900,$A908,$A912,$A91A,$A924,$A92C,$A936,$A93E
        DC.W    $AA40,$AA48,$AA52,$AA5A,$AA64,$AA6C,$AA76,$AA7E
        DC.W    $AB40,$AB48,$AB52,$AB5A,$AB64,$AB6C,$AB76,$AB7E
        DC.W    $AC80,$AC88,$AC92,$AC9A,$ACA4,$ACAC,$ACB6,$ACBE
        DC.W    $AD80,$AD88,$AD92,$AD9A,$ADA4,$ADAC,$ADB6,$ADBE
        DC.W    $AEC0,$AEC8,$AED2,$AEDA,$AEE4,$AEEC,$AEF6,$AEFE
        DC.W    $AFC0,$AFC8,$AFD2,$AFDA,$AFE4,$AFEC,$AFF6,$AFFE
        DC.W    $F800,$F808,$F812,$F81A,$F824,$F82C,$F836,$F83E
        DC.W    $F900,$F908,$F912,$F91A,$F924,$F92C,$F936,$F93E
        DC.W    $FA40,$FA48,$FA52,$FA5A,$FA64,$FA6C,$FA76,$FA7E
        DC.W    $FB40,$FB48,$FB52,$FB5A,$FB64,$FB6C,$FB76,$FB7E
        DC.W    $FC80,$FC88,$FC92,$FC9A,$FCA4,$FCAC,$FCB6,$FCBE
        DC.W    $FD80,$FD88,$FD92,$FD9A,$FDA4,$FDAC,$FDB6,$FDBE
        DC.W    $FEC0,$FEC8,$FED2,$FEDA,$FEE4,$FEEC,$FEF6,$FEFE
        DC.W    $FFC0,$FFC8,$FFD2,$FFDA,$FFE4,$FFEC,$FFF6,$FFFE
\~\ PALET.DAT \~~\



\~\ KEEPCHECK.S \~~\
        XDEF    KEEPCHECK

        INCLUDE DOSCALL.MAC

        TEXT

KEEPCHECK:                              * 同じ名前のプロセスがメモリ上にあるか?
                                        * プロセス名は全て1バイト文字でなければならない。
                                        * IN  : A0 ; MEMPTR
                                        * OUT : D0 ; PRE MEMPTR
                                        *            0 ならなかった
        MOVEM.L A0-A2,-(SP)

        CLR.L   -(SP)
        DOS     _SUPER                  * TO SUPERVISOR MODE
        MOVE.L  D0,(SP)                 * PUSH USP FOR _SUPER

        LEA     $00C4(A0),A1            * TOP OF THIS PROGRAM'S NAME
L1:
        movea.l (A0),A0                 * PRE PROGRAM'S MEMPTR
        MOVE.L  A0,D0                   * TST.L A0
        beq     J2
        LEA     $00C4(A0),A2
        BSR     _STRCMP
        BNE     L1
*       MOVE.L  A0,D0
J2:
        DOS     _SUPER                  * TO USER MODE
        ADDQ.L  #4,SP
        MOVE.L  A0,D0

        MOVEM.L (SP)+,A0-A2
        rts

_STRCMP:
                                        * IN  : A1     ;
                                        *       A2     ;
                                        * OUT : Z flag ;
        MOVEM.L D1-D2/A1-A2,-(SP)
_STRCMPL1:
        move.b  (A1)+,D1
        bsr     _TOUPPER
        move.b  D1,D2
        move.b  (A2)+,D1
        bsr     _TOUPPER
        cmp.b   D1,D2
        bne     _STRCMPJ1
        tst.b   D1
        bne     _STRCMPL1
_STRCMPJ1:
        MOVEM.L (SP)+,D1-D2/A1-A2
        RTS

_TOUPPER:
                                        * IN  : D1.B ;
                                        * OUT : D1.B ;
        CMP.B   #'a',D1
        BCS     _TOUPPERJ1
        CMP.B   #'z',D1
        BHI     _TOUPPERJ1
        SUB.B   #$20,D1
_TOUPPERJ1:
        RTS
\~\ KEEPCHECK.S \~~\



\~\ mk_excrt.bat \~~\
hAS EXCRT
IF NOT EXIST KEEPCHECK.O hAS KEEPCHECK
hLK EXCRT KEEPCHECK
CV EXCRT
REN EXCRT.r EXCRT.R
\~\ mk_excrt.bat \~~\



\~\ KEEPCHK.S \~~\


        .include        doscall.mac
        .include        pspdef.h

        .xdef   keepchk

        .text
        .even

keepchk:
*入力
*       4(sp).l 自身のメモリ管理ポインタ
*       8(sp).l プログラムの先頭から識別文字列までのバイト数
*出力
*       d0.b    常駐しているかどうか
*               =  0 ... 常駐している
*               = -1 ... 常駐していない
*       d1.b    Human68kから直接起動されたかどうか
*               =  0 ... command.xなどから起動
*               = -1 ... Human68kから起動
*       a0      メモリ管理ポインタ
*               d0.b    =  0 ... 自身のメモリ管理ポインタ
*               d0.b    = -1 ... 見付けた常駐プロセスのメモリ管理ポインタ
*
MYMP    =       8
IDOFST  =       MYMP+4

        link    a6,#0
        movem.l d2-d3/a1-a4,-(sp)

        movem.l MYMP(a6),a0/a4
        lea.l   PSPSIZ(a4),a4
        lea.l   0(a0,a4.l),a1

        movea.l a1,a2
        moveq.l #-1,d3
lenlp:
        addq.w  #1,d3
        tst.b   (a2)+
        bne     lenlp

        clr.l   -(sp)
        DOS     _SUPER
        move.l  d0,(sp)

        movea.l MOTHER(a0),a0
        move.l  MOTHER(a0),d0
        seq.b   d1
        beq     chk0
chklp0:
        movea.l d0,a0
        move.l  MOTHER(a0),d0
        bne     chklp0

chk0:
        moveq.l #-1,d2

chklp1:
        cmp.b   KEEPFLAG(a0),d2
        bne     chknx1

        lea.l   0(a0,a4.l),a2
        adda.w  d3,a2

        cmpa.l  MEMEND(a0),a2
        bcc     chknx1

        suba.w  d3,a2
        movea.l a1,a3
        move.w  d3,d0
cmplp:
        cmpm.b  (a3)+,(a2)+
        dbne    d0,cmplp
        beq     found

chknx1:
        move.l  NEXTMEM(a0),d0
        beq     nfound

        movea.l d0,a0
        bra     chklp1

found:
        moveq.l #0,d2

done:
        tst.b   (sp)
        bmi     skip
        DOS     _SUPER
skip:
        addq.l  #4,sp

        tst.b   d2
        seq.b   d0

        movem.l (sp)+,d2-d3/a1-a4
        unlk    a6

        rts

*
nfound:
        movea.l MYMP(a6),a0
        bra     done

        .end
\~\ KEEPCHK.S \~~\



\~\ keeped_.has \~~\
newcrtmod:
        M       <cmp.b #$12,d1>,  <bEQ @F>
                M       <move.l      __orig_CRTMOD,-(sp)>,        RTS
        @@:

        move.l  __orig_CRTMOD,a0
        JSR     (a0)

        sSUPER
                clr.l   $0968.w                 * ウィンドウの左上設定
                move.w  #512,$0960.w            * 1ラインのバイト数をワークにセット
                move.w  #1023,$096c.w           * ウィンドウの右下のX座標設定
                move.w  #127,$0970.w            * 横方向の表示桁数-1
                move.w  #719,$096e.w            * ウィンドウの右下のY座標設定
                move.w  #44,$0972.w             * 縦方向の表示桁数-1
                clr.l   $0948.w                 * テキスト表示用のバイアス
                clr.l   $0974.w                 * カーソルの座標設定
                move.b  #1,$093d.w              * アクティブページの数
                move.l  #_TEXTVRAM,$0944.w      * TEXT TOP ADDRESS
                moveq.l #0,d1                   * 左上の座標
                move.w  #719,d2         * MS_LIMIT ではY座標が 1007 まで
                movea.l $000005dc,a0            * IOCS _MS_LIMIT のベクタ格納アドレス
                jsr     (a0)                    * IOCS _MS_LIMIT をコール

        WAIT_VDISP

        lea     _24_1024_720,a0
        lea     _CRTC,a1
        move    (a0)+,d0
        @@:
                move (a0)+,(a1)+
                move #$200,d1
                1:      dbF     d1,1b
        dbF     d0,@B

        m       <lea _CRTC+20*2,a1>,      <move (a0),d0>,   <move d0,(a1)>

        lsr     #8,d0
        move    d0,$e82400

        lea     _SYSPORT4,a1
        ifEQ    <tst (a0)>
                bclr    #1,(a1)
        else
                bset    #1,(a1)
        endif

        sUSER
RTS ()

_24_1024_720
@@:     dc      (@f-@b)/2-1
        dc      $00AF,$000F,$001F,$009F,$0190,$0000,$0018,$0180,$001B
@@:     dc      $031A,$0000

*       DC.W    $031A,$00AF,$000F,$001F,$009F,$0190,$0000,$0018         * 12
*       DC.W    $0180,$001B,$FFFF,$FFFF,$0400,$0400,$0350,$0001
*                R20   R00   R01   R02   R03   R04   R05   R06
*                R07   R08   SPRREG     dot   dot.X dot.Y
*                                       実    表示  表示

* DATA FORMAT OF EXTEND CRTMOD
*       DC.W    R20,R00,R01,R02         R20 の上位は $03 にしておくこと。
*       DC.W    R03,R04,R05,R06         IOCS内で設定されるから問題無し。
*       DC.W    R07,R08
*       DC.B    H total,H disp,V disp,L/H freq V Res. H Res.
*       DC.W    実画面の大きさ,表示画面.X,表示画面.Y,アクティブページの数

* 3B
*       DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/256    512*512
*       DC.W    $0034,$01E0,$0000,$0020         * $2B
*       DC.W    $01E0,$001B,$FF0E,$2115
*       DC.W    $0200,$0150,$01C0,$0002

* 13
*       DC.W    $0312,$00AF,$000F,$001F,$009F,$01D0,$0007,$0020         * 11
*       DC.W    $01C8,$001B,$FFFF,$FFFF,$0400,$0400,$00D4,$0001

\~\ keeped_.has \~~\



\~\ CRTm.S \~~\
CRTMODWORK      EQU     $0000093C       * CRTモード

        TEXT

_CRTMOD:
*_00FF637A:
        movem.l D1-D3/A1-A2,-(A7)
        cmp.w   #-1,D1
        beq     QUIT
        cmp.w   #$0100,D1
        bcc     CHGONLY                 * モード切り換えのみ行う
        BSR     MODCHK
        bcc     QUIT                    * モードが不正
                                        * CRTモードを指定。その他
        move.b  D1,CRTMODWORK           * モードをワークにセット
        CLR.W   $00E82600               * 表示OFF etc
        MOVEA.L $0000047C,A0
        JSR     (A0)                    * IOCS _B_CUROFF($0000047C)
        move.w  #$0133,$00E8002A        * テキスト T0/T1 同時アクセスON(R21)
        lea     $00E00000,A0
        lea     $00E20000,A1
        bsr     MEMCLR                  * テキストクリアー
        move.w  #$0033,$00E8002A        * R21 を元に戻す
        bsr     MAIN
        CLR.W   $00E80480               * CRTC動作設定(通常表示)
        bsr     PALSET                  * パレット設定
        MOVEA.L $00000478,A0
        JSR     (A0)                    * IOCS _B_CURON($00000478)
        lea     $00E82200,A1            * テキストパレット
        lea     $00ED002E,A0            * テキストパレットデータ
        MOVE.L  (A0)+,(A1)+             * テキストパレット設定
        MOVE.L  (A0)+,(A1)+
        move.w  (A0),(A1)+
        move.w  (A0),(A1)+
        move.w  (A0),(A1)+
        move.w  (A0)+,(A1)+
        MOVE.W  (A0),D1
        SWAP    D1
        MOVE.W  (A0)+,D1
        MOVE.L  D1,(A1)+
        MOVE.L  D1,(A1)+
        MOVE.L  D1,(A1)+
        MOVE.L  D1,(A1)+
        move.b  $00ED0028,$00E8E001     * コントラスト設定
        move.w  #$0010,$00EB0808        * DISP/CPU = 0 / BG OFF / BG1 TEXT SEL = 1
        move.w  #$0020,$00E82600        * テキストのみ表示
        move.w  #$06E4,$00E82500        * プライオリティ設定
QUIT:
        BSR     RETMOD
        movem.l (A7)+,D1-D3/A1-A2
        rts

*_00FF6430:
CHGONLY:                                * モード切り換え
        and.w   #$00FF,D1               * D1.W = MOD
        BSR     MODCHK
        bcc     QUIT                    * モードが不正
        move.b  D1,CRTMODWORK           * モードをワークにセット
        move.w  $00E82600,-(A7)         * ビデオコントローラ REG3
        CLR.W   $00E82600               * 表示OFF etc
        bsr     MAIN
        move.w  (A7),D0
        and.w   #$001F,D0               * グラフィック表示 ON/OFF?
        beq     CHGONLYJ1               * OFF
                                        * ON
        bsr     COLORSET
CHGONLYJ1:
        move.w  (A7)+,$00E82600
        bra     QUIT

*_00FF6464:
RETMOD:                                 * 現在のモードを返します
        MOVEQ.L #0,D0
        move.b  CRTMODWORK,D0
        rts

*_00FF646E:
DELAY:
        move.w  #$00FF,D0
DELAYL1:
        dbf     D0,DELAYL1
        rts

*_00FF6478:
MAIN:
                                        * IN  : D1.W ; CRT MOD
        BSR     GETPTR                  * GET POINTER TO CRTC DATA
        BSR     CLOCK                   * ドットクロック設定
        lea     $0014(A0),A2            * スプライト用のデータのトップアドレス
        clr.w   $00000964               * グラフィック使用不可
        move.w  (A0)+,D0                * DATA FOR R20
        move.w  (A0)+,D3                * DATA FOR R00
        move.w  D0,D2                   * DATA FOR R20
        and.w   #$001F,D0               * 表示モード(これから設定するモード)
        lea     $00E80000,A1            * CRTC TOP ADDRESS
        move.w  $0028(A1),D1            * R20
        and.w   #$001F,D1               * 表示モード(今設定されているモード)
        rol.b   #4,D1                   * 表示モードの大小
        rol.b   #4,D0
        cmp.w   D1,D0                   * 表示モードの大小比較
        bcc     J1                      * 低いモードから高いモードへ
                                        * 高いモードから低いモードへ
        move.w  D2,$0028(A1)            * R20
        bsr     REGSET                  * R01 ~ R23
        move.w  D3,(A1)                 * R00
        bra     J2
J1:                                     * 低いモードから高いモードへ
        move.w  D3,(A1)                 * R00
        bsr     REGSET                  * R01 ~ R23
        move.w  D2,$0028(A1)            * R20
J2:
        move.w  D2,D3                   * R20
        ror.w   #8,D3
        andi.w  #$0007,D3               * R20 の D10~D08 と同じ値を
        move.w  D3,$00E82400            * ビデオコントロール REG1 に設定
        lea     $00EB080A,A1            * スプライト画面モードレジスタ
        clr.w   D0
        move.b  $0001(A2),D0            * H disp
        move.w  D0,$0002(A1)
        bsr     DELAY
        clr.w   D0
        move.b  (A2),D0                 * H total
        move.w  D0,(A1)
        addq.l  #2,A2
        addq.l  #4,A1
        move.b  (A2)+,D0                * V disp
        move.w  D0,(A1)+
        move.b  (A2)+,D0                * L/H freq etc
        move.w  D0,(A1)

        SUBA.L  A0,A0
        MOVEQ.L #0,D0
        CLR.L   $0968(A0)               * ウィンドウの左上設定
        move.w  (A2)+,D0                * 1ラインのドット数
        move.l  D0,D1
        asl.l   #1,D0                   * 1ラインのバイト数
        move.l  D0,$0960(A0)            *  をワークにセット
        move.w  (A2)+,D0                * 表示画面の横のドット数
        SUBQ.W  #1,D0
        move.w  D0,$096C(A0)            * ウィンドウの右下のX座標設定
        ADDQ.W  #1,D0
        lsr.w   #3,D0
        subq.w  #1,D0
        move.w  D0,$0970(A0)            * 横方向の表示桁数-1
        move.w  (A2)+,D0                * 表示画面の縦のドット数
        SUBQ.W  #1,D0
        move.w  D0,$096E(A0)            * ウィンドウの右下のY座標設定
        ADDQ.W  #1,D0
        lsr.w   #4,D0
        subq.w  #1,D0
        move.w  D0,$0972(A0)            * 縦方向の表示桁数-1
        clr.l   $0948(A0)               * テキスト表示用のバイアス
        CLR.L   $0974(A0)               * カーソルの座標設定
        move.w  (A2)+,D0
        move.b  D0,$093D(A0)            * アクティブページの数
        move.l  #$00E00000,$0944(A0)    * TEXT TOP ADDRESS
        MOVE.L  $096C(A0),D2            * ウィンドウ
        CMP.W   #$03F0,D2
        BCS     J3
        MOVE.W  #$03F0-1,D2             * MS_LIMIT ではY座標が $03EF まで
J3:
        MOVEQ.L #0,D1
        MOVEA.L $000005DC,A0
        JMP     (A0)                    * IOCS _MS_LIMIT($000005DC)

GETPTR:                                 * モードに応じたデータのトップを返す
                                        * IN  : D1 ; CRT MOD
                                        * OUT : A0 ; POINTER
                                        *       D1 ; BREAK
        lea     CRT(PC),A0              * CRTC REGSTER DATA TOP
        CMP.W   #$0018,D1
        BCS     GETPTRJ1
        LEA     NEWCRT(PC),A0
        SUB.W   #$001D,D1               * 拡張部分は $1D から
GETPTRJ1:
        asl.w   #5,D1                   * 1 MOD / $20 bytes
        lea     $00(A0,D1),A0           * モードに応じたデータのトップアドレス
        RTS

MODCHK:                                 * モードが正しいか
                                        * IN  : D1.W
                                        * OUT : C flag ;
                                        * $00~$12 ; IOCSに元からあるモード
                                        * $13~$17 ; 拡張部分 1
                                        * $1D~$3F ; 拡張部分 2
        CMP.W   #$18,D1                 * $18 より小さければ
        BCS     MODCHKJ1                *  問題無し
        CMP.W   #$40,D1                 * $40 より大きいと
        BCC     MODCHKJ1                *  だめ
        CMP.W   #$1D,D1
        EORI.B  #%00000001,CCR          * キャリー反転
MODCHKJ1:
        RTS

CLOCK:                                  * ドットクロックの設定
                                        * IN  : A0 ; DATA TOP
        MOVE.W  #%00001100,$00E8E006    * HRL = OFF
        CMP.W   #$0180,$001A(A0)        * 表示画面 384*256
        BNE     CLOCKJ1
        MOVE.W  #%00001110,$00E8E006    * HRL = ON
CLOCKJ1:
        RTS

*_00FF6578
PALSET:
        MOVE.B  $00E80028,D0            * R20
* ここは IOCS では
*       move.w  $00E80028,D0
* になっているが、バグ(色数と無関係なパレットを定義している)なので直した
PALSETD0:
        and.w   #$0003,D0               * グラフィック色数
        ADD.W   D0,D0
        LEA     JTBL1(PC),A0            * パレット設定ルーチンへのジャンプテーブル
        MOVE.W  (A0,D0.W),D0
        lea     $00E82000,A1            * グラフィックパレット
        JSR     (A0,D0.W)               * パレット設定
        bset.b  #$0003,$00E80028        * ?
        rts

*_00FF65A4:
REGSET:                                 * CRTCレジスタセット
                                        * IN  : A1 = $00E80000
                                        * OUT : D1 ; BREAK
        move.l  A1,-(A7)
        MOVEQ.L #3,D1
        addq.l  #2,A1                   * A1 = $00E80002(R01)
REGSETL1:
        MOVE.L  (A0)+,(A1)+             * R01 ~ R08 設定
        dbf     D1,REGSETL1
        MOVEQ.L #10,D1
REGSETL2:
        clr.w   (A1)+                   * R09 ~ R19 CLEAR
        dbf     D1,REGSETL2
        addq.l  #2,A1                   * A1 = $00E8002A(R21)
        move.w  #$0033,(A1)+            * R21 設定
        CLR.L   (A1)+                   * R22/R23 CLEAR
        clr.w   (A1)+                   * ? ($00E80030).W CLEAR
        movea.l (A7)+,A1
        rts

*_00FF65CC:                             * CRTC REGSTER DATA TABLE

*_00FFAA7A:
_G_CLR_ON:
        movem.l D1-D2/A1,-(A7)
        move.w  #$0020,$00E82600        * テキスト表示のみON
        bset.b  #$0003,$00E80028        * ?
        lea     $00C00000,A0
        move.l  A0,$0000095C            * APAGE = 0
        lea     $00C80000,A1
        bsr     MEMCLR
        bclr.b  #$0003,$00E80028        * ?
        bsr     COLORSET
        BSR     PALSETD0
        bclr.b  #$0003,$00E80028        * ?
        move.w  #$003F,$00E82600        * 全ての表示をON
        movem.l (A7)+,D1-D2/A1
        rts

*_00FFAAE0:
COLORSET:                               * R20 D10~D08 設定
                                        * グラフィック色数($00000964)設定
                                        * ビデオコントロール REG1 設定
                                        * 1ラインのバイト数($00000960)設定
                                        * OUT : D0 ; ビデオコントロール REG1
        CLR.W   D1
        MOVE.B  CRTMODWORK,D1
        BSR     GETPTR
        MOVE.W  $0018(A0),D0            * 1ラインのドット数
        ADD.W   D0,D0                   * 1ラインのバイト数
        EXT.L   D0
        MOVE.L  D0,$00000960

        MOVE.B  $00E80028,D0
        AND.B   #%11111000,D0
        CMP.W   #$0800,D0               * 1ラインのバイト数
        BNE     COLORSETJ1
                                        * 1024*1024 モード
        OR.B    #%00000100,D0

        MOVE.W  #$000F,$00000964
        BRA     COLORSETJ2
COLORSETJ1:                             * 512*512 モード
        LEA     CTBL-1(PC),A1           * 表示モードへのテーブル
        ADDA.W  $001E(A0),A1            * アクティブページの数
        OR.B    (A1),D0

        LEA     NTBL-2(PC),A1           * 色数へのテーブル
        MOVE.W  $001E(A0),D1
        ADD.W   D1,D1
        MOVE.W  (A1,D1.W),$00000964
COLORSETJ2:
        MOVE.B  D0,$00E80028            * R20 上位
        AND.W   #%111,D0
        MOVE.W  D0,$00E82400            * ビデオコントロール REG1
        RTS

*_00FFAB50:
PALSET0:                                * グラフィックパレットの設定
        lea     PALDAT0(PC),A0          * データトップ
        moveq   #$07,D0
PALSET0L1:
        move.L  (A0)+,(A1)+
        dbf     D0,PALSET0L1
        rts

*_00FFAB66:
PALSET1:
        lea     PALDAT1(PC),A0
        MOVEQ.L #$007F,D0
PALSET1L1:
        move.L  (A0)+,(A1)+
        dbf     D0,PALSET1L1
        rts

*_00FFAB7E:
PALSET2:
        MOVEQ.L #$007F,D0
        move.w  #$0001,D1
PALSET2L1:
        move.w  D1,(A1)+
        move.w  D1,(A1)+
        addi.w  #$0202,D1
        dbf     D0,PALSET2L1
        rts

*_00FFAB9A:
MEMCLR:                                 * MEMORY CLEAR
                                        * IN  : A0 ; TOP ADDRESS
                                        *       A1 ; END ADDRESS
                                        * OUT : A0 ; NEXT OF END ADDRESS
                                        * A0 & A1 EVEN
                                        * A1 - A0 = $100 * NATURAL NUMBER
                                        * A1 - A0 < $100000
        MOVEM.L D0-D7/A1,-(SP)
        MOVE.L  A1,D0                   * END ADDRESS
        SUB.L   A0,D0                   * LENGTH(bytes)
        LSR.L   #8,D0                   * LENGTH($100 bytes)
        SUBQ.W  #1,D0
        MOVEQ.L #0,D1
        MOVEQ.L #0,D2
        MOVEQ.L #0,D3
        MOVEQ.L #0,D4
        MOVEQ.L #0,D5
        MOVEQ.L #0,D6
        MOVEQ.L #0,D7
        MOVEA.L D1,A1
MEMCLRL2:
        MOVEM.L D1-D7/A1,(A0)
        MOVEM.L D1-D7/A1,$0020(A0)
        MOVEM.L D1-D7/A1,$0040(A0)
        MOVEM.L D1-D7/A1,$0060(A0)
        MOVEM.L D1-D7/A1,$0080(A0)
        MOVEM.L D1-D7/A1,$00A0(A0)
        MOVEM.L D1-D7/A1,$00C0(A0)
        MOVEM.L D1-D7/A1,$00E0(A0)
        LEA     $0100(A0),A0
        DBF     D0,MEMCLRL2
        MOVEM.L (SP)+,D0-D7/A1
        RTS

JTBL1:                                  * パレットを設定するルーチンへのテーブル
        DC.W    PALSET0-*,PALSET1-*,PALSET2-*,PALSET2-*

* 以下のテーブルは実画面 512*512 用。アクティブページの数 1,2,3,4 に対応
* ページ3は存在しないがこの方が楽
CTBL:                                   * 表示モードのテーブル
        DC.B    %11,%01,0,%00
        EVEN
NTBL:                                   * 色数のテーブル
        DC.W    $FFFF,$00FF,$0000,$000F

        INCLUDE CRT.DAT                 * 元からのCRTCデータ
        INCLUDE NEWCRT.DAT              * 拡張部分のCRTCデータ
        INCLUDE PALET.DAT               * パレットデータ
\~\ CRTm.S \~~\



\~\ crtc.002 \~~\
   1    6 1024   80  144   96  512    1   17    0 
 167    9   23  151  273    0   17  273   26    0
\~\ crtc.002 \~~\



\~\ ex.bat \~~\
excrt
screen
scsize
\~\ ex.bat \~~\



\~\ makefile \~~\
BCC     = CC
AS      = has
LK      = hlk

HEAP    = 65536
STACK   = 65536

CCFLAGS =  /h$(HEAP) /s$(STACK)
ASFLAGS = -m68000
LKFLAGS = 
LIBS    = 
OBJS    = main.o keepchk.o
PROGRAM = 24kpatch.x

$(PROGRAM)      : $(OBJS)
        $(LK) $(LKFLAGS) -o $(PROGRAM) $^ $(LIBS)

main.o:         main.has        keeped.has      crt.dat
        $(AS) $(ASFLAGS) $<

keepchk.o:              keepchk.s
        $(AS) $(ASFLAGS) $<

\~\ makefile \~~\



\~\ scsize.haS \~~\
                .include        DOSCALL.MAC
                .include        IOCSCALL.MAC
                .include        nAw.MAC

*****************************************************************
*               各種I/Oアドレスの設定                    *
*****************************************************************
TEXTVRAM        equ     $00e00000               * テキスト先頭アドレス
CRTC            equ     $00e80000               * CRTCのアドレス

*****************************************************************
*                       各種コードの設定                        *
*****************************************************************
READY           equ     $00                     * 正常終了コード
ERROR           equ     $01                     * エラー終了コード
TAB             equ     $09                     * タブ
CR              equ     $0d                     * CR コード
LF              equ     $0a                     * LF コード
ESC             equ     $1b                     * エスケープ
EOS             equ     $00                     * 終了コード
STDERR          equ     $0002                   * 標準エラー出力

*****************************************************************
*                       プログラム開始                         *
*****************************************************************
START:
*****************************************************************
*  超高解像度1024×960ドットモード                  *
*                816×554ドットモードにする(常駐部)  *
* ----------------------------- *
*****************************************************************
CHANGE960:
;               move.l  d2,-(sp)                * レジスタ待機
                sSUPER

;               lea.l   IOCS10(pc),a0           * もとの IOCS コールの格納アドレス
;               movea.l (a0),a0                 * もとの IOCS コールのアドレスを取り出す
;               jsr     (a0)                    * ひとまず 1024 x 848 ドットモードにしておく
;               lea.l   CRTC,a0                 * CRTC のアドレス
;               move.w  #$0200,$08(a0)          * 1024 x 960 モードに設定
;               move.w  #$0200,$0e(a0)          *            〃

                clr.l   $0968.w                 * ウィンドウの左上設定
                move.w  #512,$0960.w            * 1ラインのバイト数をワークにセット
                move.w  #1023,$096c.w           * ウィンドウの右下のX座標設定
                move.w  #127,$0970.w            * 横方向の表示桁数-1
                move.w  #719,$096e.w            * ウィンドウの右下のY座標設定
                move.w  #44,$0972.w             * 縦方向の表示桁数-1
                clr.l   $0948.w                 * テキスト表示用のバイアス
                clr.l   $0974.w                 * カーソルの座標設定
                move.b  #1,$093d.w              * アクティブページの数
                move.l  #TEXTVRAM,$0944.w       * TEXT TOP ADDRESS
                moveq.l #0,d1                   * 左上の座標
                move.w  #719,d2         * MS_LIMIT ではY座標が 1007 まで
                movea.l $000005dc,a0            * IOCS _MS_LIMIT のベクタ格納アドレス
                jsr     (a0)                    * IOCS _MS_LIMIT をコール

                sUSER

;               move.l  (sp)+,d2                * レジスタ復帰

;               rts                             * リターン
                DOS     _EXIT

                .end
* 3B
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/256    512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2B
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01C0,$0002

\~\ scsize.haS \~~\



\~\ keeped.haS \~~\
CRTMODWORK      EQU     $0000093C       * CRTモード

        TEXT

newcrtmod:
*_00FF637A:
        movem.l D1-D3/A1-A2,-(A7)
        cmp.w   #-1,D1
        beq     QUIT
        cmp.w   #$0100,D1
        bcc     CHGONLY                 * モード切り換えのみ行う
        BSR     MODCHK
        bcc     QUIT                    * モードが不正
                                        * CRTモードを指定。その他
        move.b  D1,CRTMODWORK           * モードをワークにセット
        CLR.W   $00E82600               * 表示OFF etc
        MOVEA.L $0000047C,A0
        JSR     (A0)                    * IOCS _B_CUROFF($0000047C)
        move.w  #$0133,$00E8002A        * テキスト T0/T1 同時アクセスON(R21)
        lea     $00E00000,A0
        lea     $00E20000,A1
        bsr     MEMCLR                  * テキストクリアー
        move.w  #$0033,$00E8002A        * R21 を元に戻す
        bsr     MAIN
        CLR.W   $00E80480               * CRTC動作設定(通常表示)
        bsr     PALSET                  * パレット設定
        MOVEA.L $00000478,A0
        JSR     (A0)                    * IOCS _B_CURON($00000478)
        lea     $00E82200,A1            * テキストパレット
        lea     $00ED002E,A0            * テキストパレットデータ
        MOVE.L  (A0)+,(A1)+             * テキストパレット設定
        MOVE.L  (A0)+,(A1)+
        move.w  (A0),(A1)+
        move.w  (A0),(A1)+
        move.w  (A0),(A1)+
        move.w  (A0)+,(A1)+
        MOVE.W  (A0),D1
        SWAP    D1
        MOVE.W  (A0)+,D1
        MOVE.L  D1,(A1)+
        MOVE.L  D1,(A1)+
        MOVE.L  D1,(A1)+
        MOVE.L  D1,(A1)+
        move.b  $00ED0028,$00E8E001     * コントラスト設定
        move.w  #$0010,$00EB0808        * DISP/CPU = 0 / BG OFF / BG1 TEXT SEL = 1
        move.w  #$0020,$00E82600        * テキストのみ表示
        move.w  #$06E4,$00E82500        * プライオリティ設定
QUIT:
        BSR     RETMOD
        movem.l (A7)+,D1-D3/A1-A2
        rts

*_00FF6430:
CHGONLY:                                * モード切り換え
        and.w   #$00FF,D1               * D1.W = MOD
        BSR     MODCHK
        bcc     QUIT                    * モードが不正
        move.b  D1,CRTMODWORK           * モードをワークにセット
        move.w  $00E82600,-(A7)         * ビデオコントローラ REG3
        CLR.W   $00E82600               * 表示OFF etc
        bsr     MAIN
        move.w  (A7),D0
        and.w   #$001F,D0               * グラフィック表示 ON/OFF?
        beq     CHGONLYJ1               * OFF
                                        * ON
        bsr     COLORSET
CHGONLYJ1:
        move.w  (A7)+,$00E82600
        bra     QUIT

*_00FF6464:
RETMOD:                                 * 現在のモードを返します
        MOVEQ.L #0,D0
        move.b  CRTMODWORK,D0
        rts

*_00FF646E:
DELAY:
        move.w  #$00FF,D0
DELAYL1:
        dbf     D0,DELAYL1
        rts

*_00FF6478:
MAIN:
                                        * IN  : D1.W ; CRT MOD
        BSR     GETPTR                  * GET POINTER TO CRTC DATA
        BSR     CLOCK                   * ドットクロック設定
        lea     $0014(A0),A2            * スプライト用のデータのトップアドレス
        clr.w   $00000964               * グラフィック使用不可
        move.w  (A0)+,D0                * DATA FOR R20
        move.w  (A0)+,D3                * DATA FOR R00
        move.w  D0,D2                   * DATA FOR R20
        and.w   #$001F,D0               * 表示モード(これから設定するモード)
        lea     $00E80000,A1            * CRTC TOP ADDRESS
        move.w  $0028(A1),D1            * R20
        and.w   #$001F,D1               * 表示モード(今設定されているモード)
        rol.b   #4,D1                   * 表示モードの大小
        rol.b   #4,D0
        cmp.w   D1,D0                   * 表示モードの大小比較
        bcc     J1                      * 低いモードから高いモードへ
                                        * 高いモードから低いモードへ
        move.w  D2,$0028(A1)            * R20
        bsr     REGSET                  * R01 ~ R23
        move.w  D3,(A1)                 * R00
        bra     J2
J1:                                     * 低いモードから高いモードへ
        move.w  D3,(A1)                 * R00
        bsr     REGSET                  * R01 ~ R23
        move.w  D2,$0028(A1)            * R20
J2:
        move.w  D2,D3                   * R20
        ror.w   #8,D3
        andi.w  #$0007,D3               * R20 の D10~D08 と同じ値を
        move.w  D3,$00E82400            * ビデオコントロール REG1 に設定
        lea     $00EB080A,A1            * スプライト画面モードレジスタ
        clr.w   D0
        move.b  $0001(A2),D0            * H disp
        move.w  D0,$0002(A1)
        bsr     DELAY
        clr.w   D0
        move.b  (A2),D0                 * H total
        move.w  D0,(A1)
        addq.l  #2,A2
        addq.l  #4,A1
        move.b  (A2)+,D0                * V disp
        move.w  D0,(A1)+
        move.b  (A2)+,D0                * L/H freq etc
        move.w  D0,(A1)

        SUBA.L  A0,A0
        MOVEQ.L #0,D0
        CLR.L   $0968(A0)               * ウィンドウの左上設定
        move.w  (A2)+,D0                * 1ラインのドット数
        move.l  D0,D1
        asl.l   #1,D0                   * 1ラインのバイト数
        move.l  D0,$0960(A0)            *  をワークにセット
        move.w  (A2)+,D0                * 表示画面の横のドット数
        SUBQ.W  #1,D0
        move.w  D0,$096C(A0)            * ウィンドウの右下のX座標設定
        ADDQ.W  #1,D0
        lsr.w   #3,D0
        subq.w  #1,D0
        move.w  D0,$0970(A0)            * 横方向の表示桁数-1
        move.w  (A2)+,D0                * 表示画面の縦のドット数
        SUBQ.W  #1,D0
        move.w  D0,$096E(A0)            * ウィンドウの右下のY座標設定
        ADDQ.W  #1,D0
        lsr.w   #4,D0
        subq.w  #1,D0
        move.w  D0,$0972(A0)            * 縦方向の表示桁数-1
        clr.l   $0948(A0)               * テキスト表示用のバイアス
        CLR.L   $0974(A0)               * カーソルの座標設定
        move.w  (A2)+,D0
        move.b  D0,$093D(A0)            * アクティブページの数
        move.l  #$00E00000,$0944(A0)    * TEXT TOP ADDRESS
        MOVE.L  $096C(A0),D2            * ウィンドウ
        CMP.W   #$03F0,D2
        BCS     J3
        MOVE.W  #$03F0-1,D2             * MS_LIMIT ではY座標が $03EF まで
J3:
        MOVEQ.L #0,D1
        MOVEA.L $000005DC,A0
        JMP     (A0)                    * IOCS _MS_LIMIT($000005DC)

GETPTR:                                 * モードに応じたデータのトップを返す
                                        * IN  : D1 ; CRT MOD
                                        * OUT : A0 ; POINTER
                                        *       D1 ; BREAK
        lea     CRT(PC),A0              * CRTC REGSTER DATA TOP
        CMP.W   #$0018,D1
        BCS     GETPTRJ1
        LEA     NEWCRT(PC),A0
        SUB.W   #$001D,D1               * 拡張部分は $1D から
GETPTRJ1:
        asl.w   #5,D1                   * 1 MOD / $20 bytes
        lea     $00(A0,D1),A0           * モードに応じたデータのトップアドレス
        RTS

MODCHK:                                 * モードが正しいか
                                        * IN  : D1.W
                                        * OUT : C flag ;
                                        * $00~$12 ; IOCSに元からあるモード
                                        * $13~$17 ; 拡張部分 1
                                        * $1D~$3F ; 拡張部分 2
        CMP.W   #$18,D1                 * $18 より小さければ
        BCS     MODCHKJ1                *  問題無し
        CMP.W   #$40,D1                 * $40 より大きいと
        BCC     MODCHKJ1                *  だめ
        CMP.W   #$1D,D1
        EORI.B  #%00000001,CCR          * キャリー反転
MODCHKJ1:
        RTS

CLOCK:                                  * ドットクロックの設定
                                        * IN  : A0 ; DATA TOP
        MOVE.W  #%00001100,$00E8E006    * HRL = OFF
        CMP.W   #$0180,$001A(A0)        * 表示画面 384*256
        BNE     CLOCKJ1
        MOVE.W  #%00001110,$00E8E006    * HRL = ON
CLOCKJ1:
        RTS

*_00FF6578
PALSET:
        MOVE.B  $00E80028,D0            * R20
* ここは IOCS では
*       move.w  $00E80028,D0
* になっているが、バグ(色数と無関係なパレットを定義している)なので直した
PALSETD0:
        and.w   #$0003,D0               * グラフィック色数
        ADD.W   D0,D0
        LEA     JTBL1(PC),A0            * パレット設定ルーチンへのジャンプテーブル
        MOVE.W  (A0,D0.W),D0
        lea     $00E82000,A1            * グラフィックパレット
        JSR     (A0,D0.W)               * パレット設定
        bset.b  #$0003,$00E80028        * ?
        rts

*_00FF65A4:
REGSET:                                 * CRTCレジスタセット
                                        * IN  : A1 = $00E80000
                                        * OUT : D1 ; BREAK
        move.l  A1,-(A7)
        MOVEQ.L #3,D1
        addq.l  #2,A1                   * A1 = $00E80002(R01)
REGSETL1:
        MOVE.L  (A0)+,(A1)+             * R01 ~ R08 設定
        dbf     D1,REGSETL1
        MOVEQ.L #10,D1
REGSETL2:
        clr.w   (A1)+                   * R09 ~ R19 CLEAR
        dbf     D1,REGSETL2
        addq.l  #2,A1                   * A1 = $00E8002A(R21)
        move.w  #$0033,(A1)+            * R21 設定
        CLR.L   (A1)+                   * R22/R23 CLEAR
        clr.w   (A1)+                   * ? ($00E80030).W CLEAR
        movea.l (A7)+,A1
        rts

*_00FF65CC:                             * CRTC REGSTER DATA TABLE

*_00FFAA7A:
G_CLR_ON:
        movem.l D1-D2/A1,-(A7)
        move.w  #$0020,$00E82600        * テキスト表示のみON
        bset.b  #$0003,$00E80028        * ?
        lea     $00C00000,A0
        move.l  A0,$0000095C            * APAGE = 0
        lea     $00C80000,A1
        bsr     MEMCLR
        bclr.b  #$0003,$00E80028        * ?
        bsr     COLORSET
        BSR     PALSETD0
        bclr.b  #$0003,$00E80028        * ?
        move.w  #$003F,$00E82600        * 全ての表示をON
        movem.l (A7)+,D1-D2/A1
        rts

*_00FFAAE0:
COLORSET:                               * R20 D10~D08 設定
                                        * グラフィック色数($00000964)設定
                                        * ビデオコントロール REG1 設定
                                        * 1ラインのバイト数($00000960)設定
                                        * OUT : D0 ; ビデオコントロール REG1
        CLR.W   D1
        MOVE.B  CRTMODWORK,D1
        BSR     GETPTR
        MOVE.W  $0018(A0),D0            * 1ラインのドット数
        ADD.W   D0,D0                   * 1ラインのバイト数
        EXT.L   D0
        MOVE.L  D0,$00000960

        MOVE.B  $00E80028,D0
        AND.B   #%11111000,D0
        CMP.W   #$0800,D0               * 1ラインのバイト数
        BNE     COLORSETJ1
                                        * 1024*1024 モード
        OR.B    #%00000100,D0

        MOVE.W  #$000F,$00000964
        BRA     COLORSETJ2
COLORSETJ1:                             * 512*512 モード
        LEA     CTBL-1(PC),A1           * 表示モードへのテーブル
        ADDA.W  $001E(A0),A1            * アクティブページの数
        OR.B    (A1),D0

        LEA     NTBL-2(PC),A1           * 色数へのテーブル
        MOVE.W  $001E(A0),D1
        ADD.W   D1,D1
        MOVE.W  (A1,D1.W),$00000964
COLORSETJ2:
        MOVE.B  D0,$00E80028            * R20 上位
        AND.W   #%111,D0
        MOVE.W  D0,$00E82400            * ビデオコントロール REG1
        RTS

*_00FFAB50:
PALSET0:                                * グラフィックパレットの設定
        lea     PALDAT0(PC),A0          * データトップ
        moveq   #$07,D0
PALSET0L1:
        move.L  (A0)+,(A1)+
        dbf     D0,PALSET0L1
        rts

*_00FFAB66:
PALSET1:
        lea     PALDAT1(PC),A0
        MOVEQ.L #$007F,D0
PALSET1L1:
        move.L  (A0)+,(A1)+
        dbf     D0,PALSET1L1
        rts

*_00FFAB7E:
PALSET2:
        MOVEQ.L #$007F,D0
        move.w  #$0001,D1
PALSET2L1:
        move.w  D1,(A1)+
        move.w  D1,(A1)+
        addi.w  #$0202,D1
        dbf     D0,PALSET2L1
        rts

*_00FFAB9A:
MEMCLR:                                 * MEMORY CLEAR
                                        * IN  : A0 ; TOP ADDRESS
                                        *       A1 ; END ADDRESS
                                        * OUT : A0 ; NEXT OF END ADDRESS
                                        * A0 & A1 EVEN
                                        * A1 - A0 = $100 * NATURAL NUMBER
                                        * A1 - A0 < $100000
        MOVEM.L D0-D7/A1,-(SP)
        MOVE.L  A1,D0                   * END ADDRESS
        SUB.L   A0,D0                   * LENGTH(bytes)
        LSR.L   #8,D0                   * LENGTH($100 bytes)
        SUBQ.W  #1,D0
        MOVEQ.L #0,D1
        MOVEQ.L #0,D2
        MOVEQ.L #0,D3
        MOVEQ.L #0,D4
        MOVEQ.L #0,D5
        MOVEQ.L #0,D6
        MOVEQ.L #0,D7
        MOVEA.L D1,A1
MEMCLRL2:
        MOVEM.L D1-D7/A1,(A0)
        MOVEM.L D1-D7/A1,$0020(A0)
        MOVEM.L D1-D7/A1,$0040(A0)
        MOVEM.L D1-D7/A1,$0060(A0)
        MOVEM.L D1-D7/A1,$0080(A0)
        MOVEM.L D1-D7/A1,$00A0(A0)
        MOVEM.L D1-D7/A1,$00C0(A0)
        MOVEM.L D1-D7/A1,$00E0(A0)
        LEA     $0100(A0),A0
        DBF     D0,MEMCLRL2
        MOVEM.L (SP)+,D0-D7/A1
        RTS

JTBL1:                                  * パレットを設定するルーチンへのテーブル
        DC.W    PALSET0-*,PALSET1-*,PALSET2-*,PALSET2-*

* 以下のテーブルは実画面 512*512 用。アクティブページの数 1,2,3,4 に対応
* ページ3は存在しないがこの方が楽
CTBL:                                   * 表示モードのテーブル
        DC.B    %11,%01,0,%00
        EVEN
NTBL:                                   * 色数のテーブル
        DC.W    $FFFF,$00FF,$0000,$000F

        INCLUDE CRT.DAT                 * 元からのCRTCデータ
        INCLUDE NEWCRT.DAT              * 拡張部分のCRTCデータ
        INCLUDE PALET.DAT               * パレットデータ
\~\ keeped.haS \~~\



\~\ main.has \~~\
*
*       24kpatch                Written by Seisei Yamaguchi
*

        include common.h

_TEXTVRAM       equ     $00e00000               * テキスト先頭アドレス
_CRTC           equ     $e80000
_SYSPORT4       equ     $e8e007

_crtmod_        equ     _CRTMOD+$100

        xref    keepchk

        text
        even

keepst:
id:     dc.b    '24kpatch v0.01'
        dc.b    'S.Yamaguchi 1995.11',0
        even

        include keeped.has

__orig_CRTMOD   dc.l    0

keepend:
        even

MYSIZE: equ     keepend-keepst


CRTMOD          equ     newcrtmod-keepst+PSPSIZ
PATCH1          equ     __orig_CRTMOD-keepst+PSPSIZ

ent:
        m       <clr.l -(sp)>,    <pea.l (a0)>,     <BSR keepchk>     *既に常駐しているか
        m       <addq.l      #8,sp>,      <move.b      d0,d7>

        pea.l   __mes__title(pc)
        tst.b   d1
        beq     osskip
        subq.l  #2,(sp)
osskip:
        DOS     _PRINT
        addq.l  #4,sp

        BSR     chkarg

        tst.b   rflag
        bne     remove
*
*       常駐、または、文字列データ更新
*
keep:
        tst.b   d7
        beq     keepmain

        DOS     _EXIT

keepmain:
        lea.l   regsav(pc),a1
        movem.l a0/sp,(a1)

        move.w  #_crtmod_,-(sp)
        DOS     _INTVCG                 *Get BEFORE vector
        move.l  d0,PATCH1(a0)
        addq.l  #2,sp

        pea.l   kbreak(pc)              *ON BREAK GOTO kbreak
        move.w  #_CTRLVC,-(sp)
        DOS     _INTVCS
        move.w  #_ERRJVC,(sp)
        DOS     _INTVCS
        addq.l  #6,sp

        kretry:
        pea.l   CRTMOD(a0)
        move.w  #_crtmod_,-(sp)
        DOS     _INTVCS
        addq.l  #6,sp

        lea.l   donflg(pc),a1
        st.b    (a1)
        bra     kdone

kbreak:
        movem.l regsav(pc),a0/sp
        lea.l   donflg(pc),a1
        tst.b   (a1)
        beq     kretry

kdone:
        m       <pea keepms(pc)>, <DOS _PRINT>
        pea.l   crlfms(pc)      *kpms1(pc)
print:
        DOS     _PRINT
        addq.l  #8,sp

        clr.w   -(sp)
        pea.l   MYSIZE.w
        DOS     _KEEPPR

*
*       非常駐部
*
remove:
        tst.b   d7
        beq     error1

        lea.l   CRTMOD(a0),a1
        move.w  #_crtmod_,-(sp)
        DOS     _INTVCG
        cmp.l   a1,d0
        bne     error2

        lea.l   regsav(pc),a1
        movem.l a0/sp,(a1)

        pea.l   rretry(pc)
        move.w  #_CTRLVC,-(sp)
        DOS     _INTVCS
        move.w  #_ERRJVC,(sp)
        DOS     _INTVCS
        addq.l  #6,sp

rretry:
        move.l  PATCH1(a0),-(sp)
        move.w  #_crtmod_,-(sp)
        DOS     _INTVCS
        addq.l  #6,sp

        pea.l   MPSIZ(a0)
        DOS     _MFREE
        addq.l  #4,sp

        st.b    donflg
        bra     rdone

rbreak:
        movem.l regsav(pc),a0/sp
        tst.b   donflg
        beq     rretry

rdone:
        pea.l   remmes(pc)
        DOS     _PRINT
        addq.l  #4,sp

        DOS     _EXIT
*
*       引数解析
*
chkarg:
        tst.b   (a2)+
        beq     noarg

arglp:
        BSR     skipsp
        tst.b   d0
        beq     noarg

        cmpi.b  #'-',d0
        beq     chkopt
        cmpi.b  #'/',d0
        beq     chkopt

noarg:
        tst.b   d7
        bne     error3

argret:
        rts

chkopt:
        addq.l  #1,a2
        move.b  (a2)+,d0
        beq     usage
        ori.b   #$20,d0
        cmpi.b  #'r',d0
        seq     rflag
        beq     argret
        bra     usage

skipsp:
        move.b  (a2)+,d0
        cmpi.b  #SPACE,d0
        beq     skipsp
        cmpi.b  #TAB,d0
        beq     skipsp
        subq.l  #1,a2
        rts
*--------------------
*
*       エラー処理
*
error1:
        lea.l   errms1(pc),a0
        bra     error
error2:
        lea.l   errms2(pc),a0
        bra     error
error3:
        lea.l   errms3(pc),a0
        bra     error
usage:
        lea.l   usgmes(pc),a0
        bra     error
ERR__ROM_NOT_MUCH       M       <lea __mes__rom_not_much(pc),a0>, <BRA error>
ERR__VCT_NOT_IN_ROM     lea     __mes__vct_not_in_rom(pc),a0

error:
        move.w  #STDERR,-(sp)
        pea.l   (a0)
        DOS     _FPUTS
        addq.l  #6,sp

        move.w  #1,-(sp)
        DOS     _EXIT2
*------------------------------

        even

title0: .dc.b   CR,LF
__mes__title
        dc.b    '24kpatch version 0.01  Written by S.Yamaguchi'
        dc.b    '       美術講師のメンソレさんお元気ですか',CR,LF,EOS
errms1  dc.b    'まだ24kpatch組み込まれてへんで。',CR,LF,EOS        *EOS=0
errms2  dc.b    '24kpatch以降に常駐したプログラムがある様です。',CR,LF
        dc.b    '先にそのプログラムを常駐解除して下さい。',CR,LF,EOS
errms3: dc.b    '既に常駐しています。',CR,LF,EOS
remmes  dc.b    '24kpatchを切り離しました。',CR,LF,EOS
keepms  dc.b    '(      SHIFT,  CTRL,   SPACE   )キーを入れ替えて',CR,LF
        dc.b    '(      CTRL,   SPACE,  SHIFT   )キーにします。',CR,LF
        dc.b    TAB,TAB,'尚、SHIFT + CTRL + SPACEで、通常のキー配置と切り替えられます。'
        dc.b    CR,LF,EOS
usgmes: dc.b    '機 能:24kHz monitorだけの環境でx68を使い易くする',CR,LF
        dc.b    '使用法:24kpatch [スイッチ]',CR,LF
        dc.b    '       -R      常駐解除する'
__mes__rom_not_much
        dc.b    'ROMのバージョンがマッチしていません。',CR,LF,EOS
__mes__vct_not_in_rom
        dc.b    'ベクタがRAM領域に変更されているので念の為常駐をキャンセルします。'
crlfms: .dc.b   CR,LF,EOS
rflag:  .dc.b   0
        even
regsav: .dc.l   0,0
donflg: .dc.b   0

        .end    ent

\~\ main.has \~~\



\~\ common.h \~~\
        include doscall.mac
        include doscall2.mac
        include iocscall.mac
        include const.h
        include pspdef.h
        include hasmacro.mac
        include naw.mac
        include FEFUNC.H

*       globl LONGPRINT
\~\ common.h \~~\



\~\ CRT.DAT \~~\
*                R20   R00   R01   R02   R03   R04   R05   R06
*                R07   R08   SPRREG     dot   dot.X dot.Y
*                                       実    表示  表示

CRT:
        DC.W    $0315,$005B,$0009,$0011,$0051,$0237,$0005,$0028         * 00
        DC.W    $0228,$001B,$FF15,$2815,$0400,$0200,$0200,$0001
        DC.W    $0305,$004B,$0003,$0005,$0045,$0103,$0002,$0010         * 01
        DC.W    $0100,$002C,$FF09,$1005,$0400,$0200,$0200,$0001
*02
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/16    1024*1024
        DC.W    $0034,$01E0,$0000,$0020         * $23
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0400,$0150,$01C0,$0001
*03
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/16    1024*1024
        DC.W    $0034,$01E0,$0000,$0020         * $23
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0400,$0150,$01C0,$0001

        DC.W    $0315,$005B,$0009,$0011,$0051,$0237,$0005,$0028         * 04
        DC.W    $0228,$001B,$FF15,$2815,$0200,$0200,$0200,$0004
        DC.W    $0305,$004B,$0003,$0005,$0045,$0103,$0002,$0010         * 05
        DC.W    $0100,$002C,$FF09,$1005,$0200,$0200,$0200,$0004
*06
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/16    1024*1024
        DC.W    $0034,$01E0,$0000,$0020         * $23
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0400,$0150,$01C0,$0001
*07
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/16    1024*1024
        DC.W    $0034,$01E0,$0000,$0020         * $23
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0400,$0150,$01C0,$0001

        DC.W    $0315,$005B,$0009,$0011,$0051,$0237,$0005,$0028         * 08
        DC.W    $0228,$001B,$FF15,$2815,$0200,$0200,$0200,$0002
        DC.W    $0305,$004B,$0003,$0005,$0045,$0103,$0002,$0010         * 09
        DC.W    $0100,$002C,$FF09,$1005,$0200,$0200,$0200,$0002
*0a
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/256    512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2B
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01C0,$0002
*0b
        DC.W    $0314,$003A,$0007,$000A         * mid  336*448 16/256    512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2B
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01C0,$0002

        DC.W    $0315,$005B,$0009,$0011,$0051,$0237,$0005,$0028         * 0C
        DC.W    $0228,$001B,$FF15,$2815,$0200,$0200,$0200,$0001
        DC.W    $0305,$004B,$0003,$0005,$0045,$0103,$0002,$0010         * 0D
        DC.W    $0100,$002C,$FF09,$1005,$0200,$0200,$0200,$0001
*0e
        DC.W    $0314,$003A,$0007,$000A         * mid  336*424 16/65536  512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2F(?)
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01A8,$0001
*0f
        DC.W    $0314,$003A,$0007,$000A         * mid  336*424 16/65536  512*512
        DC.W    $0034,$01E0,$0000,$0020         * $2F(?)
        DC.W    $01E0,$001B,$FF0E,$2115
        DC.W    $0200,$0150,$01A8,$0001

        DC.W    $031A,$00AF,$000F,$001F,$009F,$0190,$0000,$0018         * 12
        DC.W    $0180,$001B,$FFFF,$FFFF,$0400,$0400,$02D0,$0001
        DC.W    $0316,$00AF,$000F,$001F,$009F,$01D0,$0007,$0020         * 11
        DC.W    $01C8,$001B,$FFFF,$FFFF,$0400,$0400,$01A8,$0001
        DC.W    $031A,$00AF,$000F,$001F,$009F,$0190,$0000,$0018         * 12
        DC.W    $0180,$001B,$FFFF,$FFFF,$0400,$0400,$02D0,$0001

\~\ CRT.DAT \~~\



\~\ crtc.doc \~~\
crtc.x                                                          CRTC operator
                CRTC operater Ver.1.00 使用説明書

・概要
        Oh!X 6月号メガディスプレイへの道を支援するために、
        対話的にCRTCを操作します

・使用法
        crtc [オプション] <データファイル>

        オプション:
        -q              ファイルから読んだ設定をCRTCに設定後終了します
        -n              CompactXVI, X68030等の新型に対応します
                        (50MHzが追加, 周波数がちょっと違う)
        -o <num>  69MHzのはずのオシレータの周波数を変更します

・操作方法
        '↑' '↓' 変更する値の選択
        '←' '→' 値を増減させる(Ctrlを押しながらだと10ずつ)
        '[SPACE]'       値をCRTCに設定する
        '[UNDO]'        画面モードを31kHz/768x512にもどす
        '[CLR]'         画面をクリアする
        '[HOME]'        画面を描き直す
        '[RETURN]       現在の値をファイルに出力する(crtc.000, crtc.001, ...)
        '[ESC]'         終了する

・バージョンアップ履歴
        Ver.1.00 (94/ 5/23)     Oh!X 94年7月号 GENIE 付録版
        Ver.1.01 (94/ 6/18)     CRTCファイルを読み込めないバグを修正
        Ver.1.02 (94/ 8/30)     B_LOCATE と fputs の混在をやめた
        Ver.1.03 (94/10/15)     ソースの一部を見やすくする努力をした

・その他
          このツールはOh!X6月号を読んで、CRTC を対話的に操作するツールが
        欲しいなっと思って制作しました。
         このプログラムを制作するに当たって、Inside/out X68030が非常に参
        考になりました。これがなければ crtc.x は作れなかったでしょう。

                                1994/10/23 プロジェクトチーム DoGA Taka2

                                        taka2@ise.eng.osaka-u.ac.jp
                                        TBD00456@niftyserve.or.jp
                                        VAM28517@pcvan.or.jp
                                        pcs33268@asciinet.or.jp

\~\ crtc.doc \~~\



\~\ crtc.c \~~\
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#include <doslib.h>
#include <iocslib.h>

#define locate(xxx,yyy) fprintf(stderr, "\x1b[%d;%dH", (yyy)+1, (xxx)+1)

#define O38     38.86363
#define O69     69.55199
#define N38     38.863
#define N69     69.551
#define N50 50.350
#define SEL '>'
#define NSEL ' '
#define SELECTS 10

#define OSCS 8

int oscselects = 7;

double OSC_old[OSCS] = {O38/8.0,O69/8.0,O38/4.0,O69/6.0,O69/4.0,O69/3.0,O69/2.0};
int    HRL_old[OSCS] = {      0,      1,      0,      0,      1,      0,      0};
int     HF_old[OSCS] = {      0,      1,      0,      1,      1,      1,      1};
int     HD_old[OSCS] = {      0,      0,      1,      0,      1,      1,      2};
char   *mess_old[OSCS]={" 38/8  "," 69/2/4"," 38/4  "," 69/6  ", " 69/2/2"," 69/3  "," 69/2  "};

double OSC_new[OSCS] = {N38/8.0,N69/8.0,N38/4.0,N69/6.0,N69/4.0,N69/3.0,N50/2.0,N69/2.0};
int    HRL_new[OSCS] = {      0,      1,      0,      0,      1,      0,      1,      0};
int     HF_new[OSCS] = {      0,      1,      0,      1,      1,      1,      1,      1};
int     HD_new[OSCS] = {      0,      0,      1,      0,      1,      1,      3,      2};
char   *mess_new[OSCS]={" 38/8  "," 69/2/4"," 38/4  "," 69/6  ", " 69/2/2"," 69/3  "," 50/3  "," 69/2  "};

double OSC[OSCS];
int HRL[OSCS], HF[OSCS], HD[OSCS];
char *messdotclock[OSCS];

int  VD[2][3] = {      0,      1,      0,
/*         HF inter*/      1,      2,      0};
int ypos[SELECTS] = { 2, 3, 4, 5, 6, 7, 9,10,11,12};
int xpos[SELECTS] = {23,23,23,23,23,23,23,23,23,23};
char *messinter[3] = {"ノンインター", "インタレース", "  二度読み  "};

int inter = 0;  /*0:ノンインター, 1:インターレース, 2:二度読み*/
int dotclock = 5; /*0〜6*/
int hdisp = 512;
int hpulse = 80;
int hback = 96;
int hfront = 48;
int vdisp = 512;
int vpulse = 6;
int vback = 35;
int vfront = 15;

int hsync, vsync;

double dhdisp, dhpulse, dhback, dhfront, dvdisp, dvpulse, dvback, dvfront;
double dotclock8, dhsync, dvsync;

unsigned int reg[8], reg20, hrl;

int o_inter, o_dotclock;
int o_hdisp, o_hpulse, o_hback, o_hfront;
int o_vdisp, o_vpulse, o_vback, o_vfront;
int o_hsync, o_vsync;
unsigned int o_reg[8], o_reg20, o_hrl;

void recalc(void)
{
        double dh, dv;
        int realline;
        int hf;

        switch(inter) {
                case 0:         realline = vdisp;               break;
                case 1:         realline = vdisp/2;             break;
                case 2:         realline = vdisp*2;             break;
        }

        dh        = 1.0/OSC[dotclock];
        dotclock8 = dh * 8.0;
        dhdisp    = (double)hdisp * dh;
        dhpulse   = (double)hpulse * dh;
        dhback    = (double)hback * dh;
        dhfront   = (double)hfront * dh;
        hsync     = hdisp+hpulse+hback+hfront;
        dhsync    = (double)(hsync)*dh;

        dv        = dhsync/1000.0;
        dvdisp    = (double)realline * dv;
        dvpulse   = (double)vpulse * dv;
        dvback    = (double)vback * dv;
        dvfront   = (double)vfront * dv;

        vsync     = realline+vpulse+vback+vfront;
        dvsync    = (double)vsync * dv;
        if (inter == 1) {
                dvsync += dv / 2.0;
        }

        reg[0]    = hsync/8-1;
        reg[1]    = hpulse/8-1;
        reg[2]    = (hpulse+hback)/8-5;
        reg[3]    = (hsync-hfront)/8-5;
        reg[4]    = vsync-1;
        reg[5]    = vpulse-1;
        reg[6]    = vpulse+vback-1;
        reg[7]    = vsync-vfront-1;
        hrl       = HRL[dotclock];
        hf        = HF[dotclock];
        reg20     = hf*16+VD[hf][inter]*4+HD[dotclock];
}

void showdemand(void)
{
        if (o_inter != inter) {
                locate(24, 2);
                fputs(messinter[inter], stderr);
        }
        if (o_dotclock != dotclock) {
                locate(24, 3);
                fprintf(stderr, "%7.3lfMHz(%s) 8ドットクロック:%7.3lfμs",
                                OSC[dotclock], messdotclock[dotclock], dotclock8);
        }
        if (o_hdisp != hdisp || o_dotclock != dotclock) {
                locate(24, 4);
                fprintf(stderr, "%3ddot(%7.3lfμs)",hdisp,  dhdisp);
        }
        if (o_hpulse != hpulse || o_dotclock != dotclock) {
                locate(24, 5);
                fprintf(stderr, "%3ddot(%7.3lfμs)",hpulse,  dhpulse);
        }
        if (o_hback != hback || o_dotclock != dotclock) {
                locate(24, 6);
                fprintf(stderr, "%3ddot(%7.3lfμs)",hback,  dhback);
        }
        if (o_hfront != hfront || o_dotclock != dotclock) {
                locate(24, 7);
                fprintf(stderr, "%3ddot(%7.3lfμs)",hfront,  dhfront);
        }
        if (o_hsync != hsync || o_dotclock != dotclock) {
                locate(24, 8);
                fprintf(stderr, "%7.3lfμs %7.3lfKHz", dhsync, 1000.0/dhsync);
        }
        if (o_vdisp != vdisp || o_hsync != hsync || o_dotclock != dotclock) {
                locate(24, 9);
                fprintf(stderr, "%3dline(%7.3lfns)\n",vdisp,  dvdisp);
        }
        if (o_vpulse != vpulse || o_hsync != hsync || o_dotclock != dotclock) {
                locate(24, 10);
                fprintf(stderr, "%3dline(%7.3lfns)\n",vpulse,  dvpulse);
        }
        if (o_vback != vback || o_hsync != hsync || o_dotclock != dotclock) {
                locate(24, 11);
                fprintf(stderr, "%3dline(%7.3lfns)\n",vback,  dvback);
        }
        if (o_vfront != vfront || o_hsync != hsync || o_dotclock != dotclock) {
                locate(24, 12);
                fprintf(stderr, "%3dline(%7.3lfns)\n",vfront,  dvfront);
        }
        if (o_vsync != vsync || o_inter != inter || o_hsync != hsync || o_dotclock != dotclock) {
                locate(24, 13);
                fprintf(stderr, "%7.3lfms %7.3lfHz", dvsync, 1000.0/dvsync);
        }
        if (o_reg[0] != reg[0]) {
                locate(12, 15);
                fprintf(stderr, "%5d(%4x)", reg[0], reg[0]);
        }
        if (o_reg[1] != reg[1]) {
                locate(12, 16);
                fprintf(stderr, "%5d(%4x)", reg[1], reg[1]);
        }
        if (o_reg[2] != reg[2]) {
                locate(12, 17);
                fprintf(stderr, "%5d(%4x)", reg[2], reg[2]);
        }
        if (o_reg[3] != reg[3]) {
                locate(12, 18);
                fprintf(stderr, "%5d(%4x)", reg[3], reg[3]);
        }
        if (o_reg[4] != reg[4]) {
                locate(12, 19);
                fprintf(stderr, "%5d(%4x)", reg[4], reg[4]);
        }
        if (o_reg[5] != reg[5]) {
                locate(12, 20);
                fprintf(stderr, "%5d(%4x)", reg[5], reg[5]);
        }
        if (o_reg[6] != reg[6]) {
                locate(12, 21);
                fprintf(stderr, "%5d(%4x)", reg[6], reg[6]);
        }
        if (o_reg[7] != reg[7]) {
                locate(12, 22);
                fprintf(stderr, "%5d(%4x)", reg[7], reg[7]);
        }
        if (o_reg20 != reg20) {
                locate(12, 23);
                fprintf(stderr, "%5d(%4x)", reg20, reg20);
        }
        if (o_hrl != hrl) {
                locate(12, 24);
                fprintf(stderr, "%5d", hrl);
        }
        o_inter = inter;
        o_dotclock = dotclock;
        o_hdisp = hdisp;
        o_hpulse = hpulse;
        o_hback = hback;
        o_hfront = hfront;
        o_hsync = hsync;
        o_vdisp = vdisp;
        o_vpulse = vpulse;
        o_vback = vback;
        o_vfront = vfront;
        o_vsync = vsync;
        o_reg[0] = reg[0];
        o_reg[1] = reg[1];
        o_reg[2] = reg[2];
        o_reg[3] = reg[3];
        o_reg[4] = reg[4];
        o_reg[5] = reg[5];
        o_reg[6] = reg[6];
        o_reg[7] = reg[7];
        o_reg20 = reg20;
        o_hrl = hrl;

}

void showall(int select, FILE *fp)
{
        if (fp == stderr || fp == stdout) {
                fprintf(fp, "\x1b*\n\n");
        }
        fprintf(fp, "    インタレースモード %c%s\n", (select==0?SEL:NSEL), messinter[inter]);
        fprintf(fp, "    ドットクロック     %c%7.3lfMHz(%s) 8ドットクロック:%7.3lfμs\n", (select==1?SEL:NSEL), OSC[dotclock], messdotclock[dotclock], dotclock8);
        fprintf(fp, "    水平表示           %c%3ddot(%7.3lfμs)\n",(select==2?SEL:NSEL),hdisp,  dhdisp);
        fprintf(fp, "    水平パルス         %c%3ddot(%7.3lfμs)\n",(select==3?SEL:NSEL),hpulse, dhpulse);
        fprintf(fp, "    水平バックポーチ   %c%3ddot(%7.3lfμs)\n",(select==4?SEL:NSEL),hback,  dhback);
        fprintf(fp, "    水平フロントポーチ %c%3ddot(%7.3lfμs)\n",(select==5?SEL:NSEL),hfront, dhfront);
        fprintf(fp, "    水平同期            %7.3lfμs %7.3lfKHz\n", dhsync, 1000.0/dhsync);
        fprintf(fp, "    垂直表示           %c%3dline(%7.3lfns)\n",(select==6?SEL:NSEL),vdisp,  dvdisp);
        fprintf(fp, "    垂直パルス         %c%3dline(%7.3lfns)\n",(select==7?SEL:NSEL),vpulse, dvpulse);
        fprintf(fp, "    垂直バックポーチ   %c%3dline(%7.3lfns)\n",(select==8?SEL:NSEL),vback,  dvback);
        fprintf(fp, "    垂直フロントポーチ %c%3dline(%7.3lfns)\n",(select==9?SEL:NSEL),vfront, dvfront);
        fprintf(fp, "    垂直同期            %7.3lfms %7.3lfHz\n\n",  dvsync, 1000.0/dvsync);
        fprintf(fp, "    Reg0  = %5d(%4x)\n", reg[0], reg[0]);
        fprintf(fp, "    Reg1  = %5d(%4x)\n", reg[1], reg[1]);
        fprintf(fp, "    Reg2  = %5d(%4x)\n", reg[2], reg[2]);
        fprintf(fp, "    Reg3  = %5d(%4x)\n", reg[3], reg[3]);
        fprintf(fp, "    Reg4  = %5d(%4x)\n", reg[4], reg[4]);
        fprintf(fp, "    Reg5  = %5d(%4x)\n", reg[5], reg[5]);
        fprintf(fp, "    Reg6  = %5d(%4x)\n", reg[6], reg[6]);
        fprintf(fp, "    Reg7  = %5d(%4x)\n", reg[7], reg[7]);
        fprintf(fp, "    Reg20 = %5d(%4x)\n", reg20, reg20);
        fprintf(fp, "    HRL   = %5d\n\n\n", hrl);

        o_inter = inter;
        o_dotclock = dotclock;
        o_hdisp = hdisp;
        o_hpulse = hpulse;
        o_hback = hback;
        o_hfront = hfront;
        o_hsync = hsync;
        o_vdisp = vdisp;
        o_vpulse = vpulse;
        o_vback = vback;
        o_vfront = vfront;
        o_vsync = vsync;
        o_reg[0] = reg[0];
        o_reg[1] = reg[1];
        o_reg[2] = reg[2];
        o_reg[3] = reg[3];
        o_reg[4] = reg[4];
        o_reg[5] = reg[5];
        o_reg[6] = reg[6];
        o_reg[7] = reg[7];
        o_reg20 = reg20;
        o_hrl = hrl;
        if (fp == stderr ||  fp == stdout) {
                int i;
                B_PUTMES(3,0,0,127,(unsigned char *)
                                        "0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#"
                                        "0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#");
                for (i = 0; i < 28; ++i) {
                        char str[8];
                        sprintf(str, "%02d", i+1);
                        B_PUTMES(3,0,i,1,(unsigned char *)str);
                }
                for (; i < 62; ++i) {
                        char str[8];
                        sprintf(str, "%02d", i+1);
                        B_PUTMES(3,0,i,127,(unsigned char *)
                                        "0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#"
                                        "0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#");
                        B_PUTMES(3,0,i,1,(unsigned char*)str);
                }
        }
}

void updown(int select, int dir)
{
        switch(select) {
        case 0:
                if (inter+dir >= 0 && inter+dir <= 2) {
                        inter += dir;
                }
                break;
        case 1:
                if (dotclock+dir >= 0 && dotclock+dir < oscselects) {
                        dotclock += dir;
                }
                break;
        case 2:
                if (hdisp+dir*8 >= 0 && hdisp+dir*8 <= 1536) {
                        hdisp += dir*8;
                }
                break;
        case 3:
                if (hpulse+dir*8 >= 0 && hpulse+dir*8 <= 1536) {
                        hpulse += dir*8;
                }
                break;
        case 4:
                if (hback+dir*8 >= 0 && hback+dir*8 <= 1536) {
                        hback += dir*8;
                }
                break;
        case 5:
                if (hfront+dir*8 >= 0 && hfront+dir*8 <= 1536) {
                        hfront += dir*8;
                }
                break;
        case 6:
                if (vdisp+dir >= 0 && vdisp+dir <= 1536) {
                        vdisp += dir;
                }
                break;
        case 7:
                if (vpulse+dir >= 0 && vpulse+dir <= 1536) {
                        vpulse += dir;
                }
                break;
        case 8:
                if (vback+dir >= 0 && vback+dir <= 1536) {
                        vback += dir;
                }
                break;
        case 9:
                if (vfront+dir >= 0 && vfront+dir <= 1536) {
                        vfront += dir;
                }
                break;
        }
}

void setregister()
{
        volatile static unsigned short *crtc = (unsigned short *)0xe80000;
        volatile static unsigned short *scon = (unsigned short *)0xeb080a;
        volatile static unsigned char  *sysp = (unsigned char  *)0xe8e007;

        unsigned int stack;
        unsigned int i;
        unsigned short r20;
        stack = SUPER(0);
        r20 = crtc[20] & 0x13;
        if (reg20 >= r20) {
                for (i = 0; i < 8; i++) {
                        crtc[i] = reg[i];
                }
                crtc[20] = (crtc[20] & 0xff00) | reg20;
        } else {
                crtc[20] = (crtc[20] & 0xff00) | reg20;
                for (i = 1; i < 8; i++) {
                        crtc[i] = reg[i];
                }
                crtc[0] = reg[0];
        }
        if (hrl) {
                *sysp |= 0x02;
        } else {
                *sysp &= ~0x02;
        }
        scon[1] = reg[2] + 4;
        for (i = 0; i < 0x200; i++)
                ;
        if ((reg20 & 0x1f) == 0)
                *scon = reg[0];
        else
                *scon = 0xff;
        scon[2] = reg[6];
        scon[3] = reg20 & 0xff;
        SUPER(stack);
}

void getregister()
{
        volatile static unsigned short *crtc = (unsigned short *)0xe80000;
        volatile static unsigned char  *sysp = (unsigned char  *)0xe8e007;

        unsigned int stack;
        unsigned int i;
        int r20, hf, hd, vd;

        stack = SUPER(0);

        hpulse = 8 * crtc[1] +  8;
        hback  = 8 * crtc[2] + 40 - hpulse;
        hdisp  = 8 * crtc[3] + 40 - hpulse - hback;
        hfront = 8 * crtc[0] +  8 - hpulse - hback - hfront;

        vpulse = crtc[5] +  1;
        vback  = crtc[6] +  1 - vpulse;
        vdisp  = crtc[7] +  1 - vpulse - vback;
        vfront = crtc[4] +  1 - vpulse - vback - vfront;

        getch();
        r20 = reg[20];
        hrl = (*sysp >> 1) & 1;
        hf = (r20 >> 4) & 1;
        hd = r20 & 3;
        vd = (r20 >> 2) & 3;

        if (hf == 1) {
                switch(vd) {
                case 0:
                        inter=2;
                        break;
                case 1:
                        inter=0;
                        break;
                case 2:
                        inter=1;
                        break;
                }
        } else {
                if (vd == 1) {
                        inter = 1;
                } else {
                        inter = 0;
                }
        }
        for (i = 0; i < oscselects; ++i) {
                if (
                        (hrl == HRL[i] && hf == HF[i] && hd == HD[i])
                 || (HF[i] == 0 && hf == 0 && HD[i] == 0 && hd == 2)
                 || (HF[i] == 1 && hf == 1 && HD[i] == 2 && hd == 2)
                        ) {
                        dotclock = i;
                        break;
                }
        }
        SUPER(stack);
}

void datawrite(void)
{
        int i;
        char str[128];
        FILE *fp;
        for (i = 0; i < 1000; ++i) {
                sprintf(str, "crtc.%03d", i);
                if ((fp = fopen(str, "r")) != NULL) {
                        fclose(fp);
                } else {
                        break;
                }
        }
        if (i < 1000) {
                fp = fopen(str, "w");
                if (fp != NULL) {
                        fprintf(fp, "%d %d %d %d %d %d %d %d %d %d\n",
                                inter, dotclock, hdisp, hpulse, hback, hfront, vdisp, vpulse, vback, vfront);
                        fprintf(fp, "%d %d %d %d %d %d %d %d %d %d\n",
                                reg[0], reg[1], reg[2], reg[3], reg[4], reg[5], reg[6], reg[7], reg20, hrl);
                        showall(-1, fp);
                        fclose(fp);
                }
        }
}

void dataread(char *filename)
{
        FILE *fp;
        char str[128];
        fp = fopen(filename, "r");
        if (fp != NULL && fgets(str, 128, fp) != NULL) {
                sscanf(str, "%d %d %d %d %d %d %d %d %d %d",
                                &inter, &dotclock,
                                &hdisp, &hpulse, &hback, &hfront,
                                &vdisp, &vpulse, &vback, &vfront);
                fclose(fp);
        }
}



void mainloop(void)
{
        int select = 0, c, recalcflag=0, loopflag = 1;
        int crtflag = 0;
        char backup[712];
        FNCKEYGT(0,(UBYTE*)backup);
        FNCKEYST(25,(UBYTE*)"\x05");          /*Up*/
        FNCKEYST(26,(UBYTE*)"\x13");          /*Left*/
        FNCKEYST(27,(UBYTE*)"\x04");          /*Right*/
        FNCKEYST(28,(UBYTE*)"\x18");          /*Down*/
        FNCKEYST(29,(UBYTE*)"\x0c");          /*CLR*/
        FNCKEYST(31,(UBYTE*)"\x08");          /*HOME*/
        FNCKEYST(32,(UBYTE*)"\x09");          /*UNDO*/
        C_CUROFF();
        B_CONSOL(0,0,1024/8-1, 1024/16-1);
        recalc();
        showall(select,stderr);
        while (loopflag) {
                if (recalcflag && !kbhit()) {
                        recalc();
                        showdemand();
                }
                recalcflag = 0;
                switch(c = getch()) {
                case '8' :
                case 'E'-'@' :
                        if (select > 0) {
                                locate(xpos[select], ypos[select]);fputc(NSEL, stderr);
                                select--;
                                locate(xpos[select], ypos[select]);fputc(SEL, stderr);
                        }
                        break;
                case '2' :
                case 'X'-'@' :
                        if (select < SELECTS-1) {
                                locate(xpos[select], ypos[select]);fputc(NSEL, stderr);
                                select++;
                                locate(xpos[select], ypos[select]);fputc(SEL, stderr);
                        }
                        break;
                case '6' :
                case 'D'-'@' :
                        if (B_SFTSNS() & 0x03) {
                                updown(select, 10);
                        } else {
                                updown(select, 1);
                        }
                        recalcflag = 1;
                        break;
                case '4' :
                case 'S'-'@' :
                        if (B_SFTSNS() & 0x03) {
                                updown(select, -10);
                        } else {
                                updown(select, -1);
                        }
                        recalcflag = 1;
                        break;
                case '\x0d' :
                        datawrite();
                        break;
                case 'r' :
                case '\x0c' :
                        B_CLR_AL();
                        break;
                case '\x08' :
                        showall(select, stderr);
                        break;
                case ' ' :
                        crtflag = 1;
                        setregister();
                        break;
                case '\x09' :
                        crtflag = 0;
                        CRTMOD(16+256);
                        break;
                case '\x1b' :
                        fprintf(stderr, "\x1b*");
                        loopflag = 0;
                        break;
                }
        }
        FNCKEYST(0,(UBYTE*)backup);
        C_FNKMOD(3);
        C_CURON();
        if (crtflag) {
                B_CONSOL(0,0,hdisp/8-1, vdisp/16-1);
                C_CLS_AL();
        } else {
                CRTMOD(16);
        }
}

void usage(void)
{
        fputs(
                "CRTCoperator Ver. 1.03 Copyright (C) Taka2 1994\n"
                "使用方法: crtc [オプション] <データファイル>\n"

                "オプション:     -q        ファイルから読んだ設定をCRTCに設定後終了します\n"
                "                -n        CZ-500等の新型に対応します(50MHzが追加, 周波数がちょっと違う)\n"
                "                -o <num>  69MHzのはずのオシレータの周波数を変更します\n"
                "\n"
                "操作方法:      '↑' '↓'  変更する値の選択\n"
                "               '←' '→'  値を増減させる(Ctrlを押しながらだと10ずつ)\n"
                "               '[SPACE]'  値をCRTCに設定する\n"
                "               '[UNDO]'   画面モードを31kHz/768x512にもどす\n"
                "               '[CLR]'    画面をクリアする\n"
                "               '[HOME]'   画面を描き直す\n"
                "               '[RETURN]  現在の値をファイルに出力する(crtc.000, crtc.001, ...)\n"
                "               '[ESC]'    終了する\n"
         , stderr);
        exit(1);
}

void optioncheck(int argc, char *argv[])
{
        int i;
        int quitflag = 0;
        int readflag = 0;
        int machinetype = 0;
        double d;
        char str[128];
        for (i = 1; i < argc; i++) {
                if (argv[i][0] == '-' || argv[i][0] == '/') {
                        switch(tolower(argv[i][1])) {
                        case 'q' :
                                quitflag = 1;
                                break;
                        case 'n' :
                                oscselects = 8;
                                machinetype=1;
                                break;
                        case 'o' :
                                if (argv[i][2]) {
                                        sscanf(argv[i]+2, "%lf", &d);
                                } else if (i < argc-1) {
                                        sscanf(argv[++i], "%lf", &d);
                                } else {
                                        usage();
                                }
                                if (d < 0.0 || d > 999.0) {
                                        usage();
                                }
                                OSC_old[1] = d / 8.0;
                                OSC_old[3] = d / 6.0;
                                OSC_old[4] = d / 4.0;
                                OSC_old[5] = d / 3.0;
                                OSC_old[6] = d / 2.0;
                                sprintf(str, "%03d", d);
                                memcpy(mess_old[1], str, 3);
                                memcpy(mess_old[3], str, 3);
                                memcpy(mess_old[4], str, 3);
                                memcpy(mess_old[5], str, 3);
                                memcpy(mess_old[6], str, 3);
                                OSC_new[1] = d / 8.0;
                                OSC_new[3] = d / 6.0;
                                OSC_new[4] = d / 4.0;
                                OSC_new[5] = d / 3.0;
                                OSC_new[7] = d / 2.0;
                                memcpy(mess_new[1], str, 3);
                                memcpy(mess_new[3], str, 3);
                                memcpy(mess_new[4], str, 3);
                                memcpy(mess_new[5], str, 3);
                                memcpy(mess_new[7], str, 3);
                                break;
                        case '?' :
                        case 'h' :
                        default :
                                usage();
                                break;
                        }
                } else {
                        dataread(argv[i]);
                        readflag = 1;
                }
        }

        if (machinetype == 0) {
                for (i = 0; i < oscselects; ++i) {
                        OSC[i] = OSC_old[i];
                        HRL[i] = HRL_old[i];
                        HF[i] = HF_old[i];
                        HD[i] = HD_old[i];
                        messdotclock[i] = mess_old[i];
                }
        } else {
                for (i = 0; i < oscselects; ++i) {
                        OSC[i] = OSC_new[i];
                        HRL[i] = HRL_new[i];
                        HF[i] = HF_new[i];
                        HD[i] = HD_new[i];
                        messdotclock[i] = mess_new[i];
                }
        }
        if (quitflag) {
                if (readflag) {
                        recalc();
                        setregister();
                        exit(0);
                } else {
                        usage();
                }
        }
}

int main(int argc, char *argv[])
{
        optioncheck(argc, argv);
        mainloop();
        return 0;
}
\~\ crtc.c \~~\



\~\ dspm03.doc \~~\
「ディスプレイモード変更ユーティリティ DSPM.X Ver.0.3’」
                                                  By しゅうちゃん

毎度ダウンロード有り難うございます。

  このプログラムはX68030対応(全機種対応)のディスプレイモード変更ユーティ
リティです。68が持っている基本機能を知らない人が多いので、こんなモードも出せ
るんだよ? てな感じで作ったツールです。使ってみて下さい。

使用法:dspm リターン で簡単な使い方が表示されます。

      5,    65k色画像の普通表示
      4,    65k色画像を768*512ドットで表示
      3,    65k色画像を1024*828ドットで表示
      2,    65k色画像を512*256ドットで表示
      1,    65k色画像を256*256ドットで表示
      0,    768*512ドットで画像非表示(G_RAMは破壊しない)
      d,    画像の明るさを半減する
      u,    画像の明るさを元に戻す
      on,   現在のモードで画像表示ON
      off,  現在のモードで画像表示OFF
      cls,  グラフィックデータの消去
      s,    スムーススクロール
      j,    ジャンプスクロール
      b,    文字色をブルーに変更
      w,    文字色を通常に戻す
      y,    文字色を黄色に変更
      w2,   文字色を白強調に変更
      5s,   512*512 スーパーインポーズ 
      2s,   512*256 スーパーインポーズ 
      1s,   256*256 スーパーインポーズ 
      xn,yn 画面の左上カーソル位置のX座標,Y座標
            Xは全角文字数nで,Yは行数nで両方同時に指定
      cn,ln 1行の文字数と、1画面の行数指定(両方同時に指定)
      ?,    使用法の表示

  1画面に収まらないので、画面表示の使用法は間引きしてあります。

《使用例》---------|注意 G_RAM ディスクは破壊します|---------------------

・例えば、GRAM上にある65k色画像を表示したい場合は

        dspm 5 リターン

・表示されている画像をそのままの画面モードで一時的に消去したい場合は

        dspm off リターン

  これはMAGなどの16色系や、256色系でも使えます。でも、他のモードへ
  変更した場合はパレットを壊します。これはOSにモードを登録するためです。

・表示画像の明るさを落としたい場合は、dを入力します。

        dspm d リターン

・他のモードから3のモードに変更して、画像を消去した状態にする場合は、

        dspm 3 off リターン

・65k色画像を768*512ドットで表示して、壁紙として使いたい

        dspm 4 d リターン

● 要するにスイッチの組み合わせは自由なわけです。色々試して下さい。画面モード
 に関係するスイッチが複数あった場合は一番最後に指定したモードになります。

  あとは、試してもらえば分かるでしょう。面白いモードを捜して下さい。
---------------------------------------------------------------------


 ●お勧めモード1
 このツールを使えば、テレビを見ながらコマンド処理が快適にできます。

        dspm cls 5s b off リターン (512*512でスーパーインポーズして、文字色を変更)

  これでコンパイルもテレビを見ながらOKです。

 ●お勧めモード2
  綺麗な画像を表示しておいて、次のようなバッチを実行する。
    demo.bat の内容 "demo demo.doc リターン"のように文書を指定して実行

        echo off
        if "%1" == "" goto end
        if not exist %1 goto end
        dspm 3 d s b x15 y1             -->別に他のモードでもいいですけどね
        :start
        type %1
        goto start
        :end

  広い画面で文書のスムーススクロールを繰り返します。Q8ユーザーやDOS/V
 ユーザーにでも見せびらかしてあげましょう。

 ●お勧めモード3
 1s, 2sモードは、ビデオテロッパとして使う時に有効だと思います。お勧めモード2
 と同じような感じでバッチを作って、タイトルや編集を自動でやってしまうとか?
  ソニーから安いコンピュータコントロールができる8ミリビデオデッキCVD-500
 (定価11万)が出ましたので、どなたかドライバかコントロ-ルソフトを作って下
 さいませ。きっとおもしろいと思いますよ。あとできれば,24ドット対応のタイプ
 コマンドがあるといいな。

 ●お勧めモード4
 画像を表示した状態から、dspm 0 on d b を実行して見て下さい。画像の同期がは
ずれて、生き物みたいに動きます。でもテキストはまったく平気! 画像を工夫する
と床屋の看板ができます。(初代だけは何故かできないでふ)

 ●お勧めモード5
 こんなバッチを作っておくと、コマンドラインの壁紙として使える。特にpal.xと組み
合わせて、グラフィックのパレットだけを変えると瞬時でバックグラウンドの色が変え
られるので快適ですよ。

echo off
if "%1" == "" goto n1
if "%1" == "h" goto n2
goto end

:n2
dspm 5
hapic d:\PIC\ABUNAI.PIC
dspm 4 on b d
goto end

:n1
dspm 5 cls
pal p r g12 b10         モノトーンのバックがすぐできる
dspm 4 on b
:end

いろいろ使い道があると思います。工夫してみて下さい。

***********
*  その他    *
***********

  このプログラムは正しく動作することを望んで製作していますが、その
 動作については一切保証しません。また、このプログラムによって生じた
 いかなる損害についても、作者および配布者は一切責任を負いません。個
 人の責任において使用して下さい。

 著作権はしゅうちゃんこと「青木 収」に帰属します。このソフトはフリーソフト
 ウェアとしますので、いかなる媒体による複製もその制限を加えません。

 転載して下さる方は自由に行なって下さい。できれば事後で結構ですのが、何処
 何処へ転載しましたよなんてメールいただけるとすごく嬉しいんですが・・・

 最後に、このプログラムは

  gcc version 1.00 Tool#1 Based on 1.42 with XC Ver.2.0
  gnu make Ver3.62  
  HAS V.2.53 Nakamura氏作
  hlk V.2.25 SALT氏作  
  SuperED v.1.18 Nishikawa氏作
  DCACHE (v2.1) Arimac氏作
  Straight filer v.3.89 Y.Gotanda氏作

 を使用して作成しました。これらのソフトの開発、移植等に携わった方々
に感謝し、この場を借りてお礼申し上げます。

連絡問い合わせ先

                nifty-------ID=PFD01143         しゅうちゃん
                sunday------ID=sun1552          しゅうちゃん
                NITネットID=NIT-0300               しゅうちゃん
                (↑ 0480-32-7966 近くの方はきてみてチョ)

●転載等してくださる方は、自由に行なって下さい。
\~\ dspm03.doc \~~\




$ fa -ls -l
-a--rw-      10337 1995/04/11 21:07:14 crtc.dta
-a--rw-      21964 1991/01/22 23:28:30 sp_ed.bas
-a--rw-       2254 1990/10/12 12:00:00 SCSET.S
-a--rw-       2245 1990/05/10 12:00:00 EXCRT.S
-a--rw-       4574 1995/11/17 00:31:56 main.o
-a--rw-       3896 1995/08/12 17:51:40 EXCRT.o
-a--rw-       7079 1991/03/01 00:01:54 newcrt.dat
-a--rw-       1893 1990/05/10 12:00:00 PALET.DAT
-a--rw-       1121 1990/05/10 12:00:00 KEEPCHECK.S
-a--rw-       3934 1995/08/12 17:51:40 EXCRT.x
-a--rw-        174 1995/08/12 15:20:08 KEEPCHECK.o
-a--rwx        103 1995/08/12 15:20:00 mk_excrt.bat
-a--rw-       3854 1995/08/12 17:51:40 EXCRT.R
-a--rw-       4632 1995/11/17 00:31:58 24kpatch.x
-a--rw-        220 1994/03/08 23:04:12 KEEPCHK.O
-a--rw-       1483 1992/11/11 12:00:00 KEEPCHK.S
-a--rw-       2097 1995/11/16 17:54:28 keeped_.has
-a--rw-        148 1995/08/12 17:55:38 scsize.o
-a--rw-       9327 1995/11/17 00:31:22 CRTm.S
-a--rw-        148 1995/08/12 17:55:38 scsize.x
-a--rw-        103 1995/11/26 21:32:56 crtc.002
-a--rwx         24 1995/08/12 17:53:48 ex.bat
-a--rw-     708117 1995/11/16 18:16:36 mintk.has
-a--rw-        362 1995/11/16 18:07:30 makefile
-a--rw-     179670 1995/08/12 18:38:32 mint_.x
-a--rw-       2518 1995/10/17 23:11:32 scsize.haS
-a--rw-       9327 1995/11/16 17:55:22 keeped.haS
-a--rw-       4092 1995/11/16 17:54:28 main.has
-a--rw-        186 1995/11/16 03:33:08 common.h
-a--rw-     179654 1995/11/16 18:06:04 mintK.x
-a--rw-       2785 1995/11/17 00:31:44 CRT.DAT
-a--rw-       1410 1994/10/23 18:32:24 crtc.doc
-a--rw-      18359 1994/10/15 23:17:16 crtc.c
-a--rw-       5580 1993/10/25 00:03:00 dspm03.doc
# 34 files, 1193670(1186K) bytes.



$ fa -ls
crtc.dta
sp_ed.bas
SCSET.S
EXCRT.S
main.o
EXCRT.o
newcrt.dat
PALET.DAT
KEEPCHECK.S
EXCRT.x
KEEPCHECK.o
mk_excrt.bat
EXCRT.R
24kpatch.x
KEEPCHK.O
KEEPCHK.S
keeped_.has
scsize.o
CRTm.S
scsize.x
crtc.002
ex.bat
mintk.has
makefile
mint_.x
scsize.haS
keeped.haS
main.has
common.h
mintK.x
CRT.DAT
crtc.doc
crtc.c
dspm03.doc
# 34 files, 1193670(1186K) bytes.



$ ls -1 | egrep -vi '\.[xo]'
crtc.dta
SCSET.S
EXCRT.S
newcrt.dat
PALET.DAT
KEEPCHECK.S
mk_excrt.bat
KEEPCHK.S
keeped_.has
CRTm.S
crtc.002
ex.bat
makefile
scsize.haS
keeped.haS
main.has
common.h
CRT.DAT
crtc.doc
crtc.c
dspm03.doc



-- 
YAMAGUTIseisei ( str_h__namae = { :sei => "山口" , :mei => "青星" } )
http://hello.to/seisei/ mailto:seisei@.68..net
祝 PhantomX & run68mac ( バイナリ公開願う )



catt.sh
#!/bin/sh

str__sepa=/
str__filename_="\\~\\      $2      \\~~\\"

echo    ''
echo    ''
echo    ''
echo    $str__filename_
#       cat     $1$str__sepa$2
ruby18  -e      'STDIN.each_line{ |s| puts s.chomp if "^Z" != s}'   \
        <    $1$str__sepa$2
echo    $str__filename_