home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
kxc
/
t_os
/
townsexp
/
p25xlf10
/
p25xlf10.asm
< prev
next >
Wrap
Assembly Source File
|
1980-01-02
|
9KB
|
423 lines
;*************************************************************************
; P25ファイル32K色 変換Loader ver0.6M
; ・マウス対応版・
; 制作年月日 平成2年 4月 04日
; Programed by KXC U・K UOTA
;
; ○対応機種: FM-TOWNSシリーズ
; ○ソースファイル名: P25XLF10.ASM
; ○実行ファイル名: P25XLF10.EXP
; ○実行方法: T-Menu等,TBIOSを組み込んだ
; DOS上から,
; RUN386 P25XLF10 オプション
; で,P25,256色ファイルを32K色に変換
; しながら,順次画面ロードする。
; マウス右クリックで次画面,左クリックで
; 終了し,T-Menuへ。
; オプション: -0から-99 ファイルナンバー
; -G マウスクリックを無視して
; ロード実行
; -Q 1画面のみ表示して終了
;*************************************************************************
.386p
msdos macro func ;(MS-DOSファンクションコールマクロ定義)
mov ah,func
int 21H
endm
XMAX equ 320
YMAX equ 240
YLWidth equ 64
mo_port equ 04d6h ;パッド/マウス入力ポート1
mi_port1 equ 04d0h ;パッド/マウス入力ポート1
mi_port2 equ 04d2h ;パッド/マウス入力ポート2
fn_ptr equ 80h ;コマンドライン入力パラメータアドレス
PSP_seg equ 004h ;PSP領域のセグメント
assume cs:CODE,ds:CODE,gs:CODE,es:CODE,ss:SSEG
;
CODE segment
PRG_SRT:
mov dx,OFFSET NEW_DTA ;DTA Set
msdos 1ah
;
mov edi,OFFSET File_Name
mov esi,OFFSET P25_PATH
push ds
mov ax,PSP_seg
mov ds,ax
mov eax,OFFSET fn_ptr
movzx ebx,BYTE PTR [eax]
or bl,bl
je SHORT PRGlab01
movzx ecx,bl
add ebx,eax
mov ebx,OFFSET fn_ptr+1
xor eax,eax
xor dh,dh
xor ebp,ebp
;
PRGlab09:
cmp BYTE PTR [ebx],'-'
jne SHORT PRGlab08
PRGlab06:
dec ecx
inc ebx
mov dl,BYTE PTR [ebx]
cmp dl,'9'
jbe PRGlab10
cmp dl,'Z'
jbe PRGlab11
sub dl,'a'-'A'
PRGlab11:
cmp dl,'G'
jne SHORT PRGlab12
or bp,00000001b
jmp SHORT PRGlab06
PRGlab12:
cmp dl,'Q'
jne SHORT PRGlab06
or bp,00000010b
jmp SHORT PRGlab06
PRGlab10:
cmp dl,' '
je SHORT PRGlab07
sub dl,'0'
sal eax,8
mov al,dl
jmp SHORT PRGlab06
PRGlab07:
dec ecx
inc ebx
aad ;al=ah*10+al
mov dh,al
jmp SHORT PRGlab09
PRGlab08:
or dh,dh ;? dh=0
je PRGlab02
dec dh ;dh-=1 (nannbannme wo kaunnto nisuru)
;
PRGlab02:
mov al,[ebx]
cmp al,'\' ;? al='\'
jne SHORT PRGlab03
mov ah,al
PRGlab03:
inc ebx
mov es:[edi],al
inc edi
mov es:[esi],al
inc esi
loop PRGlab02
;
PRGlab01:
pop ds
mov BYTE PTR [File_Number],dh
mov edx,ebp
mov BYTE PTR [Control_Code],dl
or ah,ah
je SHORT PRGlab04
cmp al,'\' ;? al='\'
je SHORT PRGlab04
mov al,'\' ;al='\'
mov [edi],al
inc edi
mov [esi],al
inc esi
PRGlab04:
mov [FNadr],edi
mov edi,OFFSET P25_Fil
PRGlab05:
mov al,[edi]
inc edi
mov [esi],al
inc esi
or al,al
jne SHORT PRGlab05
;
;-=================================================================-
;- 32K色モード画面設定(SCREEN@1) -
;-=================================================================-
mov ax,110h
mov es,ax ;es=110H
; 画面の初期化
xor ah,ah ;ah=0
mov edi,OFFSET work
mov ecx,1000h
call pword ptr es:[20h] ;EGB_init(work,0x1000)
; 仮想画面設定 ページ0をモード10
mov ax,100h ;ah=1 , al=0
mov dx,10
mov edi,OFFSET work
call pword ptr es:[20h] ;EGB_resolution(work,0,10)
; 仮想画面設定 ページ0をモード10
mov ax,101h ;ah=1 , al=1
mov dx,10
mov edi,OFFSET work
call pword ptr es:[20h] ;EGB_resolution(work,1,10)
; 表示ページ指定 ページ0を前面にして表示
mov ax,600h ;ah=6 , al=1
mov edx,1
call pword ptr es:[20h] ;EGB_displayPage(work,1,1)
; 書き込みページ指定 ページ0
mov ax,500h ;ah=5 , al=0
call pword ptr es:[20h] ;EGB_wrihtPage(work,0)
; 画面拡大 2×2倍
mov ax,202h ;ah=2 , al=2
mov dx,2
mov bx,2
call pword ptr es:[20h] ;EGB_displayStart(work,2,2,2)
; 表示画面大きさ X=320 , Y=240
mov ax,203h
mov dx,XMAX
mov bx,YMAX
call pword ptr es:[20h] ;EGB_displayStart(work,3,XMAX,YMAX)
;
;-=================================================================-
;- メインルーチン (P25ファイルチェック) -
;-=================================================================-
FN_chck:
mov dx,OFFSET P25_PATH
mov cx,03h
mov al,[lpcnt]
and al,al
jne SHORT FNlab01
mov al,1
mov [lpcnt],al
msdos 4eh
jb PRG_END
jmp SHORT FNlab02
FNlab01:
msdos 4fh
jb SHORT PRG_END
FNlab02:
mov al,BYTE PTR[File_Number]
or al,al
je FNlab04
dec BYTE PTR[File_Number]
jmp SHORT FN_chck
FNlab04:
mov edx,OFFSET NEW_DTA+01EH
mov ebx,[FNadr]
FNlab03:
mov al,[edx]
inc edx
mov [ebx],al
inc ebx
or al,al
jne SHORT FNlab03
;
mov dx,OFFSET File_Name
mov al,0
msdos 3DH ;ax=fopen(P25_File,"rb")
jnb SHORT FNLB01 ;? Open Error
FN_Err:
mov dx,OFFSET MES01 ;Output Error Message
msdos 09H ;(※TOWNS-Menu上では無意味)
PRG_End:
msdos 4ch ;プログラム終了
;-=================================================================-
; データイニシャライズ
;-=================================================================-
FNLB01:
mov bx,104h
mov es,bx ;es=ds
mov [fp],ax ;ax=fp (ハンドル)
mov ecx,24
mov edx,OFFSET work
mov bx,[fp] ;bx=fp
msdos 3FH ;read(fp,ldt,24)
;
mov bx,[fp]
mov ecx,256*2*3+4+2*2
mov edx,OFFSET work
msdos 3FH
;
mov edi,OFFSET work
xor esi,esi
mov ecx,256
lbloop:
mov ax,[edi]
inc edi
inc edi
mov BYTE PTR [drd+esi],ah
mov ax,[edi]
inc edi
inc edi
mov BYTE PTR [dgr+esi],ah
mov ax,[edi]
inc edi
inc edi
mov BYTE PTR [dbl+esi],ah
inc esi
loop lbloop
;
xor ebp,ebp
mov al,1
mov [r_count],al
mov al,240
mov [y_count],al
;
y_loop:
dec BYTE PTR [r_count]
jne y_lab01
;
mov al,40
mov [r_count],al
mov bx,[fp]
mov ecx,640*40*2
mov edx,OFFSET buf
push ebp
msdos 3FH
pop ebp
;
mov esi,OFFSET buf
y_lab01:
mov eax,320
mov [x_count],eax
xor ebx,ebx
x_loop:
mov cx,WORD PTR [esi] ;緑
mov dx,WORD PTR [640+esi]
add esi,2
xor ebx,ebx
xor eax,eax
mov bl,cl
mov al,BYTE PTR [dgr+ebx]
mov edi,eax
mov bl,ch
mov al,BYTE PTR [dgr+ebx]
add edi,eax
mov bl,dl
mov al,BYTE PTR [dgr+ebx]
add edi,eax
mov bl,dh
mov al,BYTE PTR [dgr+ebx]
add eax,edi
sar eax,5
sal eax,10
mov [green],eax
;
xor eax,eax
mov bl,cl
mov al,BYTE PTR [drd+ebx]
mov edi,eax
mov bl,ch
mov al,BYTE PTR [drd+ebx]
add di,ax
mov bl,dl
mov al,BYTE PTR [drd+ebx]
add edi,eax
mov bl,dh
mov al,BYTE PTR [drd+ebx]
add eax,edi
and eax,01111111111100000b
mov [red],eax
;
xor eax,eax
mov bl,cl
mov al,BYTE PTR [dbl+ebx]
mov edi,eax
mov bl,ch
mov al,BYTE PTR [dbl+ebx]
add edi,eax
mov bl,dl
mov al,BYTE PTR [dbl+ebx]
add edi,eax
mov bl,dh
mov al,BYTE PTR [dbl+ebx]
add eax,edi
sar eax,5
add eax,[green]
add eax,[red]
mov es:[ebp],ax
add ebp,2
dec DWORD PTR [x_count]
jne x_loop
;
add esi,640
add ebp,1024-320*2
dec BYTE PTR [y_count]
jne y_loop
;
labed:
mov bx,[fp] ;fp (ハンドル)
msdos 3EH ;close(fp) (File Close)
mov al,BYTE PTR[Control_Code]
test al,00000001b
jne SHORT mlab02
;
; マウストリガ入力
;
mloop:
mov dx,mo_port ;(両ポート及び全トリガ入力OK)
mov ax,00111111b
out dx,al
mov dx,mi_port1 ;(ポート1入力)
in al,dx
mov bl,al
and al,00100000b ;(トリガ2が押されたか)
je SHORT mlab02
and bl,00010000b ;(トリガ1が押されたか)
je SHORT mlab01
mov dx,mi_port2
in al,dx
mov bl,al
and al,00100000b ;(トリガ2が押されたか)
je SHORT mlab02
and bl,00010000b ;(トリガ1が押されたか)
jne SHORT mloop ;(トリガが押されるまでループ)
mlab01:
msdos 4ch ;(プログラム終了)
mlab02:
mov al,BYTE PTR[Control_Code]
test al,00000010b
jne SHORT mlab01
;
jmp FN_chck
mes01 db 'ファイルオープン出来ませんよ。$'
File_Name db 64 dup(?)
FNadr dd 0
NEW_DTA db 100h dup(?) ;新規のDTA領域
P25_Fil db '*.P25',0
P25_PATH db 64 dup(?) ;入力されたパス
fp dw 0 ;ファイルハンドル
File_Number db 0
Control_Code db 0
lpcnt db 0
steax dd 0
stebx dd 0
stecx dd 0
stedx dd 0
grad dd 0
x_count dd 0
y_count db 0
r_count db 0
green dd 0
red dd 0
buf dw 320*40*2 dup(?)
dgr db 256 dup(?)
drd db 256 dup(?)
dbl db 256 dup(?)
work db 1000h dup(?)
P25BEnd db 0
code ends
sseg segment stack
db 1000H dup(?)
sseg ends
end PRG_SRT