home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
etv
/
etv.s
< prev
Wrap
Text File
|
1980-01-02
|
12KB
|
492 lines
/*
TV☆TOWNS -リアルタイムエフェクタ-
Version 1.0 1990/04/25
by Pumpkin (MHD00746)
*/
.text
.data
/* 初期化 */
call G_INIT
call KEY_INIT
movl %esp,(esp_w) /* パレットテーブル領域を作る */
movl $0x8000,%ecx
ini_lp: pushw $0
loop ini_lp
movl %esp,(table)
movb $0,%al /* 320×240 ロウスキャン */
movw $11,%dx
call SCREEN_MODE
mov $1,%al
mov $11,%dx
call SCREEN_MODE
movb $1,%al /* レイヤ1が前、レイヤ0非表示 */
movw $2,%edx
call DISPLAY_PAGE
movb $0x43,%ah
movb $0,%bl
movw $0x7f7f,%dx
lcall %fs:(0x80) /* ライン入力オン */
/* メインルーチン */
movb $0x31,%dl
Main_loop:
cmpb $13,%dl
je Main_Bye
cmpb $0x31,%dl
je normal
cmpb $0x32,%dl
je mono_sub
cmpb $0x33,%dl
je sep_sub
cmpb $0x34,%dl
je nega_sub
cmpb $0x35,%dl
je c512_sub
cmpb $0x36,%dl
je green_sub
cmpb $0x37,%dl
je red_sub
cmpb $0x38,%dl
je blue_sub
Main_ret:
call effect
jmp Main_loop
/* 後処理 */
Main_Bye:
movb $0x43,%ah
movb $0,%bl
xorw %dx,%dx
lcall %fs:(0x80) /* ライン入力オフ */
call G_INIT
movb $0,%al /* MS-DOSの画面 */
movw $1,%dx
call SCREEN_MODE
movb $1,%al
movw $1,%dx
call SCREEN_MODE
movb $1,%al /* レイヤ1が前、レイヤ全表示 */
movl $3,%edx
call DISPLAY_PAGE
movw $0x440,%dx /* 1024 x 512 */
movb $0x18,%al
outb %al,%dx
addw $2,%dx
movw $0x80,%ax
outw %ax,%dx
movl (esp_w),%esp
movw $0x4c00,%ax /* さよなら */
int $0x21
/* 通常表示 */
normal:
mov $1,%al /* レイヤ1を透明にする */
call WRITE_PAGE
mov $0x8000,%edx
call BACK_COLOR
call CLS
movw $0x1a81,%ax
lcall %fs:(0x20) /* インポーズオン */
no_lp: call INKEY /* while inkey$="":wend */
cmpb $0,%dl
je no_lp
no_jp: cmpb $13,%dl /* キー内容チェック */
je no_bye
cmpb $0x38,%dl
jg no_lp
cmpb $0x31,%dl
jl no_lp
no_bye:
movw $0x1a00,%ax
lcall %fs:(0x20) /* インポーズオフ */
jmp Main_loop
/* エフェクト表示 */
effect:
mov $1,%al /* レイヤ1を黒にする */
call WRITE_PAGE
xorl %edx,%edx
call BACK_COLOR
call CLS
movb $0,%al /* デジタイズはレイヤ0へ */
call WRITE_PAGE
pushl $0x104 /* 2画面モードのセグメント */
pop %es
movw $0x1b01,%ax
movl $G_work,%edi
lcall %fs:(0x20) /* デジタイズオン */
movl (table),%ebp /* レジスタに定数設定 */
xorl %ebx,%ebx
ef_lp0:
xorl %edx,%edx
movl $0x40000,%edi
movl $239,%ecx
ef_lp1: push %ecx
movl $159,%ecx
ef_lp2:
movl %es:(%edx),%eax /* レイヤ0からとる */
movw %ax,%bx
leal (%ebp,%ebx,2),%esi /* パレットアクセス */
movsw
shrl $16,%eax
leal (%ebp,%eax,2),%esi /* パレットアクセス */
movsw
addl $4,%edx
loop ef_lp2
pop %ecx
addl $388,%edx
addl $388,%edi
loop ef_lp1
call INKEY
cmpb $0,%dl
je ef_lp0
cmpb $13,%dl /* キー内容チェック */
je ef_bye
cmpb $0x38,%dl
jg ef_lp0
cmpb $0x31,%dl
jl ef_lp0
ef_bye:
movw $0x1b00,%ax
movl $G_work,%edi
lcall %fs:(0x20) /* デジタイズオフ */
ret
/* モノクロのパレットテーブル作成 */
mono_sub:
movl (table),%ebp /* レジスタに定数設定 */
movl $0,%ecx
mono_lp0: push %ecx
sar $10,%ecx /* RGBの分離 */
andl $0x1f,%ecx
movl %ecx,%eax
movl (%esp),%ecx
sar $5,%ecx
andl $0x1f,%ecx
dec %ecx /* 人の目にはG>R>Bと見えるので輝度補正 */
cmpl $0,%ecx
jge mono_jp1
xor %ecx,%ecx
mono_jp1: addl %ecx,%eax
movl (%esp),%ecx
andl $0x1f,%ecx
dec %ecx /* 人の目にはG>R>Bと見えるので輝度補正 */
dec %ecx
cmpl $0,%ecx
jge mono_jp2
xor %ecx,%ecx
mono_jp2: addl %ecx,%eax
movb $3,%cl
divb %cl
andl $0xff,%eax /* ahは余りが入っているので */
movw $1057,%cx
mull %cx
pop %ecx
movw %ax,(%ebp,%ecx,2) /* addr=ebp+ecx*2 */
inc %ecx
cmpl $0x8000,%ecx
jne mono_lp0
jmp Main_ret
/* セピア色のパレットテーブル作成 */
sep_sub:
movl (table),%ebp /* レジスタに定数設定 */
movl $0,%ecx
sep_lp0: push %ecx
sar $10,%ecx /* RGBの分離 */
andl $0x1f,%ecx
movl %ecx,%eax
movl (%esp),%ecx
sar $5,%ecx
andl $0x1f,%ecx
addl %ecx,%eax
movl (%esp),%ecx
andl $0x1f,%ecx
addl %ecx,%eax
movb $3,%cl
divb %cl
andl $0xff,%eax /* ahは余りが入っているので */
dec %eax /* セピア色の調合 */
dec %eax
cmpl $0,%eax
jge sep_jp0
xor %eax,%eax
sep_jp0: movl %eax,(red)
dec %eax
cmpl $0,%eax
jge sep_jp1
xor %eax,%eax
sep_jp1: movl %eax,(green)
dec %eax
cmpl $0,%eax
jge sep_jp2
xor %eax,%eax
sep_jp2: movl %eax,(blue)
movl (green),%eax
shl $5,%eax
addl (red),%eax
shl $5,%eax
addl (blue),%eax
pop %ecx
movw %ax,(%ebp,%ecx,2) /* addr=ebp+ecx*2 */
inc %ecx
cmpl $0x8000,%ecx
jne sep_lp0
jmp Main_ret
/* 反転のパレットテーブル作成 */
nega_sub:
movl (table),%ebp /* レジスタに定数設定 */
movl $0,%ecx
nega_lp0: movl %ecx,%eax
xorw $0x7fff,%ax
movw %ax,(%ebp,%ecx,2) /* addr=ebp+ecx*2 */
inc %ecx
cmpl $0x8000,%ecx
jne nega_lp0
jmp Main_ret
/* 512色のパレットテーブル作成 */
c512_sub:
movl (table),%ebp /* レジスタに定数設定 */
movl $0,%ecx
c512_lp0: movl %ecx,%eax
andw $0x739c,%ax
movw %ax,(%ebp,%ecx,2) /* addr=ebp+ecx*2 */
inc %ecx
cmpl $0x8000,%ecx
jne c512_lp0
jmp Main_ret
/* 緑のパレットテーブル作成 */
green_sub:
movl (table),%ebp /* レジスタに定数設定 */
movl $0,%ecx
green_lp: movl %ecx,%eax
andl $0x7c00,%eax
movw %ax,(%ebp,%ecx,2) /* addr=ebp+ecx*2 */
inc %ecx
cmpl $0x8000,%ecx
jne green_lp
jmp Main_ret
/* 赤のパレットテーブル作成 */
red_sub:
movl (table),%ebp /* レジスタに定数設定 */
movl $0,%ecx
red_lp: movl %ecx,%eax
andl $0x3e0,%eax
movw %ax,(%ebp,%ecx,2) /* addr=ebp+ecx*2 */
inc %ecx
cmpl $0x8000,%ecx
jne red_lp
jmp Main_ret
/* 青のパレットテーブル作成 */
blue_sub:
movl (table),%ebp /* レジスタに定数設定 */
movl $0,%ecx
blue_lp: movl %ecx,%eax
andl $0x1f,%eax
movw %ax,(%ebp,%ecx,2) /* addr=ebp+ecx*2 */
inc %ecx
cmpl $0x8000,%ecx
jne blue_lp
jmp Main_ret
/* サブルーチン */
/* G-BIOSの初期化 */
G_INIT:
push %ds
pop %gs
push %ds
pop %es
movl $1536,%ecx
movl $G_work,%edi
movb $0,%ah
pushl $0x0110
pop %fs
lcall %fs:(0x20)
ret
/* スクリーンモードの指定 */
SCREEN_MODE:
/* al:レイヤ dx:スクリーンモード */
movb $1,%ah
movl $G_work,%edi
lcall %fs:(0x20)
ret
/* 画面表示位置の指定 */
SCREEN_POS:
/* bx:縦位置 dx:横位置 */
movw $0x201,%ax
movl $G_work,%edi
lcall %fs:(0x20)
ret
/* 画面拡大率の指定 */
ZOOM_SCREEN:
/* bx:縦倍率 dx:横倍率 */
movw $0x202,%ax
movl $G_work,%edi
lcall %fs:(0x20)
ret
/* WIDTHの指定 */
SCREEN_WIDTH:
/* bx:縦ドット数 dx:横ドット数 */
movw $0x203,%ax
movl $G_work,%edi
lcall %fs:(0x20)
ret
/* 書き込みページの設定 */
WRITE_PAGE:
/* al:ページ */
movb $5,%ah
movl $G_work,%edi
lcall %fs:(0x20)
ret
/* 表示ページの設定 */
DISPLAY_PAGE:
/* al:プライオリティ edx:表示データ */
movb $6,%ah
movl $G_work,%edi
lcall %fs:(0x20)
ret
/* 背景色指定 */
BACK_COLOR:
/* edx:色 */
mov $0x701,%ax
movl $G_work,%edi
lcall %fs:(0x20)
ret
/* 画面消去 */
CLS:
movb $0x20,%ah
movl $G_work,%edi
lcall %fs:(0x20)
ret
/* キー入力の初期化 */
KEY_INIT:
movb $0,%ah
int $0x90
ret
/* キー入力を待つ */
.align 4
KEY_INP:
movw $0x900,%ax
int $0x90
ret
/* キー入力を待たない */
.align 4
INKEY:
movw $0x901,%ax
int $0x90
ret
/* ワーク */
green: .long 0
red: .long 0
blue: .long 0
table: .long 0
esp_w: .long 0
G_work: .space 1536