; charpal.asm	1994.11.18
	;	CHARacter PALlet
	; Towns のアナログパレット
	; を操作して、DOS モード
	; (R50互換表示画面モード)
	; での文字色,背景色を変更
		.186
; 1994/11/18 ver 1.0 初版
; 1994/11/18 ver 1.1 ﾚｲｱ0/1優先順位入替え
; 1994/11/23 ver 1.3 Nifty:FOAU2 DL公開版 背景拡大機能追加
; 1995/01/06 ver 1.4 31KHzモード追加
; 1995/02/06 ver 1.5 ﾌﾘｺﾚ10 応募版(C L ｵﾌﾟｼｮﾝ追加)

cgroup		group	_TEXT,_DATA,_BSS

_TEXT		segment	byte public 'CODE'
	; コードセグメント
		assume	cs:cgroup,ds:cgroup
		org	0100h
_TEXT		ends

_DATA		segment	word public 'CODE'
	; メッセージ、変数セグメント
		assume	cs:cgroup,ds:cgroup
_DATA		ends

_BSS		segment	word public 'CODE'
	; 未初期化領域セグメント
		assume	cs:cgroup,ds:cgroup
work_buff	db	?
_BSS		ends

	; キャリッジリタン定義
cr		equ	13
	; ラインフィード定義
lf		equ	10
	; エンドオブストリング定義
eos		equ	'$'
	; エスケープ
esca		equ	1bh

	; I/O アドレス

	; アナログ
	; ＣＲＴＣアドレス
CRTC_ADR_REG	equ	00440h
	; ＣＲＴＣデータ
CRTC_DAT_REG	equ	00442h
HDS1		equ	11
HDE1		equ	12
VDS1		equ	15
VDE1		equ	16
FA1		equ	21
	; パレットコードレジスタ
PLT_COD_REG	equ	0fd90h
	; 青色パレットレジスタ
;PLT_BLU_REG	equ	0fd92h
	; 赤色パレットレジスタ
;PLT_RED_REG	equ	0fd94h
	; 緑色パレットレジスタ
;PLT_GRN_REG	equ	0fd96h
	; ビデオ出力I/O制御
	; アドレスレジスタ
V_IO_AD_REG	equ	00448h
	; ビデオ出力I/O制御
	; データレジスタ
V_IO_DA_REG	equ	0044Ah
	; コントロール
	; レジスタ番号
;CTRL_REG	equ	00b	; 未使用
	; プライオリティ
	; レジスタ番号
PRIO_REG	equ	01b
	; レイア0用(背景)
	; 16色パレット選択
	; YS無効
	; レイア0 前面
PLT0_SEL	equ	00001000b
	; レイア1用(文字)
	; 16色パレット選択
	; YS無効
	; レイア0 前面
PLT1_SEL	equ	00101000b

_DATA		segment	word public 'CODE'
	; ｵﾌﾟｼｮﾝ存在ﾌﾗｸﾞ
option		dw	0
Doption		dw	0
	; 起動メッセージ
c_mes		db	'Character Palette ver.1.5 (c)1994. Boko.' 
		db	cr,lf
		db	esca,'[0m'
		db	' 0'
		db	esca,'[30m'
		db	'  '
		db	esca,'[0m'
		db	'  1'
		db	esca,'[34m'
		db	'■'
		db	esca,'[0m'
		db	'  2'
		db	esca,'[31m'
		db	'■'
		db	esca,'[0m'
		db	'  3'
		db	esca,'[35m'
		db	'■'
		db	esca,'[0m'
		db	'  4'
		db	esca,'[32m'
		db	'■'
		db	esca,'[0m'
		db	'  5'
		db	esca,'[36m'
		db	'■'
		db	esca,'[0m'
		db	'  6'
		db	esca,'[33m'
		db	'■'
		db	esca,'[0m'
		db	'  7'
		db	esca,'[37m'
		db	'■'
		db	esca,'[0m'
		db	'  8'
		db	esca,'[30;1m'
		db	'■'
		db	esca,'[0m'
		db	'  9'
		db	esca,'[34;1m'
		db	'■'
		db	esca,'[0m'
		db	'  A'
		db	esca,'[31;1m'
		db	'■'
		db	esca,'[0m'
		db	'  B'
		db	esca,'[35;1m'
		db	'■'
		db	esca,'[0m'
		db	'  C'
		db	esca,'[32;1m'
		db	'■'
		db	esca,'[0m'
		db	'  D'
		db	esca,'[36;1m'
		db	'■'
		db	esca,'[0m'
		db	'  E'
		db	esca,'[33;1m'
		db	'■'
		db	esca,'[0m'
		db	'  F'
		db	esca,'[37;1m'
		db	'■'
		db	esca,'[0m'
		db	'$'
		db	1Ah
		db	eos

help_mes	db	cr,lf
		db	cr,lf
		db	'CHARPAL.COM は画面の文字色/背景色を変える'
		db	'プログラムです。FM Townsｼﾘｰｽﾞ専用です。',cr,lf
		db	'使用法:charpal [<カラーセット名>] [Dn][Ln][Cxxxx[Cxxxx･･･]]',cr,lf
		db	cr,lf
		db	'charpal INIT',09h,':文字色/背景色を初期状態に戻します',cr,lf
		db	09H,'MONO',09h,':白地に黒文字。モノクロ８階調',cr,lf
		db	09H,'NEGA',09h,':白地に黒文字。標準状態のネガ',cr,lf
		db	09H,'PASTEL',09h,':緑地に白文字。黒板とﾁｮｰｸの文字風',cr,lf
		db	09H,'GREEN',09h,':緑単色。ｸﾞﾘｰﾝﾃﾞｨｽﾌﾟﾚｲ風',cr,lf
		db	09H,'PLASMA',09h,':オレンジ色単色。ﾌﾟﾗｽﾞﾏﾃﾞｨｽﾌﾟﾚｲ風',cr,lf
		db	09H,'TROPICAL:青地に白文字。FM-OASYS風',cr,lf
		db	cr,lf
		db	09h,'D0',09h,':背景の広さを元にもどす',cr,lf
		db	09h,'D1',09h,':背景を広くする(24KHz) ｸﾞﾚｰTownsのﾃﾞﾌｫﾙﾄ',cr,lf
		db	09h,'D2',09h,':背景を広くする(31KHz) 白いTownsのﾃﾞﾌｫﾙﾄ',cr,lf
		db	09h,'L0',09h,':画面の上下の線を消す',cr,lf
		db	09h,'L1',09h,':画面の上下に線を描く',cr,lf
		db	09h,'CpBRG',09h,':色の設定を詳細にできます。',cr,lf
		db	09h,09h,'ﾊﾟﾚｯﾄ番号,青の輝度,赤の輝度,緑の輝度'
		db	' を16進数で指定します。',cr,lf
		db	09h,09h,'ex. C00FFC70F0(背景:黄色､文字:赤)'
		db	eos

	; CRTC コントロールデータ
	; その０ 24KHz 画面
	; R50互換モードのデフォルト値
CRT_DATA_0	dw	00040H	; 00 HSW1 水平同期幅1
		dw	00320H	; 01 HSW2 水平同期幅2
		dw	00000H	; 02 dummy
		dw	00000H	; 03 dummy
		dw	0035FH	; 04 HST  水平同期周期
		dw	00000H	; 05 VST1 垂直同期時間1
		dw	00010H	; 06 VST2 垂直同期時間2
		dw	00000H	; 07 EET  等化パルス有効時間
		dw	0036FH	; 08 VST  垂直同期周期
		dw	0009CH	; 09 HDS0 水平表示開始0
		dw	0031CH	; 0A HDE0 水平表示終了0
		dw	0009CH	; 0B HDS1 水平表示開始1
		dw	0031CH	; 0C HDE1 水平表示終了1
		dw	00040H	; 0D VDS0 垂直表示開始0
		dw	00360H	; 0E VDE0 垂直表示終了0
		dw	00040H	; 0F VDS1 垂直表示開始1
		dw	00360H	; 10 VDE1 垂直表示終了1
		dw	00000H	; 11 FA0  フレーム先頭0
		dw	0009CH	; 12 HAJ0 水平アジャスト0
		dw	00000H	; 13 FO0  ﾌｨｰﾙﾄﾞ間ｵﾌｾｯﾄ0
		dw	00050H	; 14 LO0  ﾗｲﾝ間ｵﾌｾｯﾄ0
		dw	00000H	; 15 FA1  フレーム先頭1
		dw	0009CH	; 16 HAJ1 水平アジャスト1
		dw	00000H	; 17 FO1  ﾌｨｰﾙﾄﾞ間ｵﾌｾｯﾄ1
		dw	00080H	; 18 LO1  ﾗｲﾝ間ｵﾌｾｯﾄ1
		dw	0004AH	; 19 EHAJ 外部同期水平ADJ
		dw	00001H	; 1A EVAJ 外部同期垂直ADJ
		dw	00000H	; 1B ZOOM 水平垂直拡大
		dw	0801FH	; 1C CR0  ｺﾝﾄﾛｰﾙ0
		dw	00003H	; 1D CR1  ｺﾝﾄﾛｰﾙ1
		dw	00000H	; 1E FR   ﾀﾞﾐｰﾚｼﾞｽﾀ
		dw	00150H	; 1F CR2  ｺﾝﾄﾛｰﾙ2

	; CRTC コントロールデータ
	; その１ 24KHz 画面
	; 上下左右に約１文字分ずつ
	; 画面表示領域を広げる
CRT_DATA_1	dw	00040H	; 00 HSW1 水平同期幅1
		dw	00320H	; 01 HSW2 水平同期幅2
		dw	00000H	; 02 dummy
		dw	00000H	; 03 dummy
		dw	0035FH	; 04 HST  水平同期周期
		dw	00000H	; 05 VST1 垂直同期時間1
		dw	00010H	; 06 VST2 垂直同期時間2
		dw	00000H	; 07 EET  等化パルス有効時間
		dw	0036FH	; 08 VST  垂直同期周期
		dw	0009CH	; 09 HDS0 水平表示開始0
		dw	0031CH	; 0A HDE0 水平表示終了0
		dw	00088H	; 0B HDS1 水平表示開始1  default 0009CH
		dw	00330H	; 0C HDE1 水平表示終了1  default 0031CH
		dw	00036H	; 0D VDS0 垂直表示開始0
		dw	00368H	; 0E VDE0 垂直表示終了0
		dw	00028H	; 0F VDS1 垂直表示開始1  default 00040H
		dw	00370H	; 10 VDE1 垂直表示終了1  default 00360H
		dw	00000H	; 11 FA0  フレーム先頭0
		dw	0009CH	; 12 HAJ0 水平アジャスト0
		dw	00000H	; 13 FO0  ﾌｨｰﾙﾄﾞ間ｵﾌｾｯﾄ0
		dw	00050H	; 14 LO0  ﾗｲﾝ間ｵﾌｾｯﾄ0
		dw	0FA00H	; 15 FA1  フレーム先頭1  default 00000H
		dw	0009CH	; 16 HAJ1 水平アジャスト1
		dw	00000H	; 17 FO1  ﾌｨｰﾙﾄﾞ間ｵﾌｾｯﾄ1
		dw	00080H	; 18 LO1  ﾗｲﾝ間ｵﾌｾｯﾄ1
		dw	0004AH	; 19 EHAJ 外部同期水平ADJ
		dw	00001H	; 1A EVAJ 外部同期垂直ADJ
		dw	00000H	; 1B ZOOM 水平垂直拡大
		dw	0801FH	; 1C CR0  ｺﾝﾄﾛｰﾙ0
		dw	00003H	; 1D CR1  ｺﾝﾄﾛｰﾙ1
		dw	00000H	; 1E FR   ﾀﾞﾐｰﾚｼﾞｽﾀ
		dw	00150H	; 1F CR2  ｺﾝﾄﾛｰﾙ2

	; CRTC コントロールデータ
	; その２ 31KHz 画面
	; 背景をほぼ全画面まで広げる
CRT_DATA_2	dw	00060H	; 00 HSW1 水平同期幅1
		dw	002C0H	; 01 HSW2 水平同期幅2
		dw	00000H	; 02 dummy
		dw	00000H	; 03 dummy
		dw	0031FH	; 04 HST  水平同期周期
		dw	00000H	; 05 VST1 垂直同期時間1
		dw	00004H	; 06 VST2 垂直同期時間2
		dw	00000H	; 07 EET  等化パルス有効時間
		dw	00419H	; 08 VST  垂直同期周期
		dw	0008AH	; 09 HDS0 水平表示開始0
		dw	0030AH	; 0A HDE0 水平表示終了0
		dw	00070H	; 0B HDS1 水平表示開始1 default 0008Ah
		dw	00320H	; 0C HDE1 水平表示終了1 default 0030Ah
		dw	00046H	; 0D VDS0 垂直表示開始0
		dw	00406H	; 0E VDE0 垂直表示終了0
		dw	00026H	; 0F VDS1 垂直表示開始1 default 00046h
		dw	00416H	; 10 VDE1 垂直表示終了1 default 00406h
		dw	0F4C0H	; 11 FA0  フレーム先頭0 default 00000h
		dw	0008AH	; 12 HAJ0 水平アジャスト0
		dw	00000H	; 13 FO0  ﾌｨｰﾙﾄﾞ間ｵﾌｾｯﾄ0
		dw	00050H	; 14 LO0  ﾗｲﾝ間ｵﾌｾｯﾄ0
		dw	0E400H	; 15 FA1  フレーム先頭1 default 00000h
		dw	0008AH	; 16 HAJ1 水平アジャスト1
		dw	00000H	; 17 FO1  ﾌｨｰﾙﾄﾞ間ｵﾌｾｯﾄ1
		dw	00080H	; 18 LO1  ﾗｲﾝ間ｵﾌｾｯﾄ1
		dw	00058H	; 19 EHAJ 外部同期水平ADJ
		dw	00001H	; 1A EVAJ 外部同期垂直ADJ
		dw	00000H	; 1B ZOOM 水平垂直拡大
		dw	0801FH	; 1C CR0  ｺﾝﾄﾛｰﾙ0
		dw	00002H	; 1D CR1  ｺﾝﾄﾛｰﾙ1
		dw	00000H	; 1E FR   ﾀﾞﾐｰﾚｼﾞｽﾀ
		dw	00192H	; 1F CR2  ｺﾝﾄﾛｰﾙ2

	; パレットデータ
	; パレット緑(4bit)    B15-B12
	; パレット赤(4bit)    B11-B08
	; パレット青(4bit)    B07-B04
	; パレットコード(4bit)B03-B00
	; バレットデータ16ビット × 16色分 × 2プレーン
PAL_DATA:
db	'MONO',0
		dw	0FFF0h	; 黒 → 白(明るい)
		dw	0DDD1h	; 青        ↓
		dw	0BBB2h	; 赤        ↓
		dw	09993h	; マゼンダ  ↓
		dw	07774h	; 緑 → グレー
		dw	05555h	; 黄        ↓
		dw	03336h	; 水        ↓
		dw	01117h	; 白 → 黒(暗い)
		dw	0FFF8h	; グレー
		dw	0EEE9h	; 高赤
		dw	0DDDAh	; 高青
		dw	0888Bh	; 高マゼンダ
		dw	0666Ch	; 高緑
		dw	0222Dh	; 高黄
		dw	0111Eh	; 高水
		dw	0000Fh	; 高白
db	'NEGA',0
		dw	0EEE0h	; 黒 → 白
		dw	0DD01h	; 青 → 黄
		dw	0D0D2h	; 赤 → 水
		dw	0D003h	; マゼンダ → 緑
		dw	00DD4h	; 緑 → マゼンダ
		dw	00D05h	; 水 → 赤
		dw	000D6h	; 黄 → 青
		dw	01117h	; 白 → 黒
		dw	0EEE8h	; グレー
		dw	0DD09h	; 高赤
		dw	0D0DAh	; 高青
		dw	0D00Bh	; 高マゼンダ
		dw	00DDCh	; 高緑
		dw	00D0Dh	; 高黄
		dw	000DEh	; 高水
		dw	0000Fh	; 高白
db	'PASTEL',0
		dw	06220h	; 黒 → 緑
		dw	099F1h	; 赤 → パステル赤
		dw	09F92h	; 青 → パステル青
		dw	09FF3h	; マゼンダ →パステルマゼンダ
		dw	0F994h	; 緑 → パステル緑
		dw	0F9F5h	; 黄 → パステル黄
		dw	0FF96h	; 水 → パステル水
		dw	0FFF7h	; 白 → 白
		dw	08228h	; グレー
		dw	099F9h	; 青
		dw	09F9Ah	; 赤
		dw	09FFBh	; マゼンダ
		dw	0F99Ch	; 緑
		dw	0F9FDh	; 黄
		dw	0FF9Eh	; 水
		dw	0FFFFh	; 白
db	'GREEN',0
		dw	01000h	; 黒    暗い緑
		dw	03001h	; 青      ↓
		dw	05002h	; 赤      ↓
		dw	07003h	; マゼンダ↓
		dw	09004h	; 緑      ↓
		dw	0B005h	; 水      ↓
		dw	0D006h	; 黄      ↓
		dw	0F007h	; 白    明るい緑
		dw	01008h	; グレー
		dw	03009h	; 高赤
		dw	0500Ah	; 高青
		dw	0700Bh	; 高マゼンダ
		dw	0900Ch	; 高緑
		dw	0B00Dh	; 高黄
		dw	0D00Eh	; 高水
		dw	0F00Fh	; 高白
db	'PLASMA',0
		dw	00100h	; 黒	暗いオレンジ
		dw	01301h	; 青        ↓
		dw	02502h	; 赤        ↓
		dw	03703h	; マゼンダ  ↓
		dw	04904h	; 緑        ↓
		dw	05B05h	; 水        ↓
		dw	06D06h	; 黄        ↓
		dw	07F07h	; 白	明るいオレンジ
		dw	00108h	; 黒
		dw	01309h	; 青
		dw	0250Ah	; 赤
		dw	0370Bh	; マゼンダ
		dw	0490Ch	; 緑
		dw	05B0Dh	; 水
		dw	06D0Eh	; 黄
		dw	07F0Fh	; 白
db	'TROPICAL',0
		dw	02280h	; 黒 → 青
		dw	040F1h	; 青 
		dw	02F22h	; 赤 
		dw	08F63h	; マゼンダ 
		dw	0F044h	; 緑 
		dw	0C0F5h	; 水 
		dw	0CF06h	; 黄 
		dw	0EEE7h	; 白 
		dw	02268h	; 黒 
		dw	040F9h	; 青 
		dw	02F2Ah	; 赤 
		dw	08F6Bh	; マゼンダ 
		dw	0F04Ch	; 緑 
		dw	0C0FDh	; 水 
		dw	0CF0Eh	; 黄 
		dw	0EEEFh	; 白 
db	'INIT',0
		dw	00000h	; 黒
		dw	000B1h	; 青 
		dw	00B02h	; 赤 
		dw	00BB3h	; マゼンダ 
		dw	0B004h	; 緑 
		dw	0B0B5h	; 水 
		dw	0BB06h	; 黄 
		dw	0BBB7h	; 白 
		dw	04448h	; 黒
		dw	000F9h	; 高青
		dw	00F0Ah	; 高赤
		dw	00FFBh	; 高マゼンダ
		dw	0F00Ch	; 高緑
		dw	0F0FDh	; 高水
		dw	0FF0Eh	; 高黄
		dw	0FFFFh	; 高白
dw	0			; エンドオブデータマーク


_DATA		ends

_TEXT		segment	byte public 'CODE'

main		proc	near
	; 
		cld
		jmp	start

tune_1		proc
	; Cxxxx (パレットの数値設定)
	; の処理(ﾚｲｱ1=文字)
		mov	al,PLT1_SEL
		call	palette_Select
tune:
		inc	[option]
		lodsb
		cmp	al,' '
		jbe	para_loop
	; パレットコードセット
		call	hex1_to_bin
		mov	dx,plt_cod_reg
		and	al,00001111b
		out	dx,al
	; 青
		lodsb
		cmp	al,'0'
		jb	para_loop
		call	hex1_to_bin
		call	write_palette2
	; 赤
		lodsb
		cmp	al,'0'
		jb	para_loop
		call	hex1_to_bin
		call	write_palette2
	; 緑
		lodsb
		cmp	al,'0'
		jb	para_loop
		call	hex1_to_bin
		call	write_palette2
		jmp short skip_blank
tune_1		endp

tune_0		proc
	; cxxxx (パレットの数値設定)
	; の処理(ﾚｲｱ0=ｸﾞﾗﾌｨｯｸ)
		call	palette_select0
		jmp	tune
tune_0		endp

limit_line	proc
	; 画面の上と下に線を
	; 引く(L1)/消す(L0)
		inc	[option]
		lodsb
		cmp	al,'1'
		je	line1
		cmp	al,'0'
		jne	para_loop
		call	reset_line
		jmp short skip_blank
line1:
		call	set_line
		jmp short skip_blank
limit_line	endp

display_mode	proc

		inc	[option]
		lodsb
		mov	bx,1
		cmp	al,'L'
		je	set_d
		dec	bx
		dec	bx
		cmp	al,'-'
		je	set_d
		mov	bx,offset CGROUP:crt_data_0
		sub	al,'0'
		je	set_d
		mov	bx,offset CGROUP:crt_data_1
		dec	ax
		je	set_d
		mov	bx,offset CGROUP:crt_data_2
		dec	ax
		jne	para_loop
set_d:
		mov	[doption],bx
		jmp short skip_blank

display_mode	endp
START:
	; 初期メッセージ
	; テストパタン表示
		mov	dx,offset cgroup:c_mes
		mov	ah,009h
		int	021h
	; パラメータ解析
		mov	si,00081h
skip_blank:
		lodsb
para_loop:
		xor	ah,ah
		cmp	al,cr
		je	normal_end
		cmp	al,' '
		jbe	skip_blank
	; ﾊﾟﾚｯﾄ数値設定
		cmp	al,'c'
		je	tune_0
		cmp	al,'C'
		jne	para_d
		jmp	tune_1
para_d:
	; 画面モード設定
		cmp	al,'D'
		je	display_mode
	; 画面境界線の描画
		cmp	al,'L'
		je	limit_line
	; 色セット名による設定
		mov	dx,offset cgroup:work_buff
		mov	di,dx
mov_str:
		stosb
		lodsb
		cmp	al,' '
		ja	mov_str
		xor	ax,ax
		stosb
	; si 保存
		dec	si
		mov	bp,si
		mov	bx,offset cgroup:PAL_DATA
		mov	si,bx
next_set:
	; パレットセット表の終端?
		mov	di,dx
		cmp	byte ptr[si],0	
		je	print_help
match_key:
		lodsb
		scasb
		jne	unmatch_1
	; 0 ならマッチング
		cmp	al,0
		jne	match_key

		inc	[option]
	; パレットのセット実行
	; ﾚｲｱ 1(文字)ｾﾚｸﾄ
		mov	al,PLT1_SEL
		call	palette_select
		mov	cx,16
		push	si
		push	cx
loop_label:
		lodsw
		call	palette_Set
		loop	loop_label

	;  ﾚｲｱ 0(ｸﾞﾗﾌｨｯｸ)ｾﾚｸﾄ
		mov	al,PLT0_SEL
		call	palette_select
		pop	cx
		pop	si
loop_label2:
		lodsw
		call	palette_Set
		loop	loop_label2
	; ﾚｲｱ0,ﾚｲｱ1ともに表示
		mov	al,00fh
		MOV	dx,0fda0h
		out	dx,al
	; si 復帰
		mov	si,bp
		jmp	skip_blank
normal_end:
		cmp	[option],0
		je	print_help
		cmp	[Doption],0
		jne	crtc_set
	; 白Towns = D2
		mov	si,offset cgroup:crt_data_2
	; 白いTownsかｸﾞﾚｰTownsか
	; A24桁上がりの有無で判定する
		in	al,0024h
		and	al,000000100b
		je	crtc_set_default
	; グレーTowns = D1
		mov	si,offset cgroup:crt_data_1
		jmp short crtc_set_default
crtc_set:
		cmp	[Doption],-1
		je	no_crt_set
		cmp	[Doption],1
		je	lcon_only
	; CRTC に値を設定
		mov	si,[Doption]
crtc_set_default:
		call	crtc_data_set
no_crt_set:
		call	palette_select0
	; 終了 system_call
	; ﾘﾀﾝｺｰﾄﾞ 0
		mov	ax,04c00h
		int	021h
	; 
skip_keyword:
		lodsb
unmatch_1:
		cmp	al,0
		jne	skip_keyword
		add	si,16*2
		jmp	next_set

main		endp

print_help	proc
	; ヘルプメッセージ表示
		mov	dx,offset cgroup:help_mes
		mov	ah,009h
		int	021h
	; 終了 system_call
	; ﾘﾀﾝｺｰﾄﾞ 1
		mov	ax,04c01h
		int	021h
print_help	endp

lcon_only	proc
	; LCON.COM (マシーンＭさん作)
	; の対応
	; 画面左のみ背景を広げる
		mov	al,00bh
		mov	bx,0007Ah	; 8a
		call	crtc_data_set1
		jmp	no_crt_set
lcon_only	endp

palette_select0 proc
	; ﾚｲｱ0 のセレクト
		mov	al,PLT0_SEL
palette_select	proc
	; ﾚｲｱ0/1のセレクト
		push	ax
		mov	dx,V_IO_AD_REG
		mov	al,PRIO_REG
		out	dx,al
		inc	dx
		inc	dx
		pop	ax
		out	dx,al
		ret
palette_select	endp
palette_select0	endp

palette_Set	proc
	; アナログパレットを
	; 設定する。
	; in AX
	;    AL b0-b3 パレットコード
	;    AL b7-b4 青パレット
	;    AH b0-b3 赤パレット
	;    AH b7-b4 緑パレット
	;out なし
	;    AX こわれます
	;    DX こわれます
	;    AX,DX以外のレジスタは保存。
		push	ax
	; パレットコード設定
		mov	dx,plt_cod_reg
		and	al,00001111b
		out	dx,al
	; 青パレット設定
		pop	ax
		call	write_palette
	; 赤パレット設定
		push	ax
		ror	ax,4
		call	write_palette
	; 緑パレット設定
		pop	ax
		mov	al,ah
write_palette:
		inc	dx
		inc	dx
		and	al,11110000b
		out	dx,al
		ret
write_palette2:
		rol	ax,4
		jmp	write_palette
palette_Set	endp

crtc_data_set	proc
	;	CRTC操作
	; in SI CRTSレジスタセットテーブル
		xor	ax,ax
crtc_data_set_loop:
		push	ax
		lodsw
		mov	bx,ax
		pop	ax
		call crtc_data_set1
		inc	ax
		cmp	al,020H
		jb	crtc_data_set_loop
		ret

	; in AL CRTC レジスタ番号
	;    BX そのレビジスタにセットする値
crtc_data_set1:
		push	ax
		mov	dx,CRTC_ADR_REG
		out	dx,al
		mov	dx,CRTC_DAT_REG
		mov	ax,bx
		out	dx,ax
		pop	ax
		ret
crtc_data_set	endp

set_line	proc
	; DOS画面の
	; 上と下に線を引く
		push	es
		call	set_line_reg
		mov	ax,1010101010101010b
		call	set_line_sub
		mov	ax,0101010101010101b
set_line_ent:
		mov	di,80 * 408
		call	set_line_sub
		pop	es
		ret
set_line_sub:
  		mov	cx,40
	rep	stosw
		ret
set_line	endp

set_line_reg	proc
		mov	al,07h
		mov	dx,0FF81h
		out	dx,al

		mov	ax,0c000h
		mov	es,ax
		mov	di,80 * 0
		ret
set_line_reg	endp

reset_line	proc
	; DOS画面の
	; 上と下の線を消す
		push	es
		call	set_line_reg
		mov	ax,0000000000000000b
		call	set_line_sub
		jmp	set_line_ent
reset_line	endp

hex1_to_bin	proc
	; 16進文字1文字を
	; 2進にする
	; Input
	; 	al : 文字
	; Output
	; 	al : 数字
	;       規定外の文字が入力される
	;	と 0になる。
	;	エラー処理は行わない｡

		cmp	al,'0'
		jb	error_hook
		cmp	al,'9'
		jbe	number
		cmp	al,'A'
		jb	error_hook
		cmp	al,'F'
		jbe	capital
		cmp	al,'a'
		jb	error_hook
		cmp	AL,'f'
		ja	error_hook
;SMALL:
		sub	al,'a'-'A'
capital:
		sub	al,'A'-'0'-10
number:
		sub	al,'0'
		ret
error_hook:
		xor	al,al
		ret
hex1_to_bin	endp

_TEXT		ends

		end	main
