X68k の CRTC の関連ドキュメント系のディレクトリからのサルベージ
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_
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735