home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
oh_fm
/
graph2
/
view1.asm
< prev
next >
Wrap
Assembly Source File
|
1980-01-02
|
11KB
|
687 lines
; 'VIEW1.EXP' command for native-mode
; run386 VIEW
.386p
SIZE_X equ 256
SIZE_Y equ 240
MOVE_X equ 4
MOVE_Y equ 4
CODE segment
assume cs:CODE
org 0
MAIN proc
pusha
sub esp,256*1024 ;vram buffer をstackに作る
mov ebp,esp
mov ax,120h ;vramをセーブ
mov fs,ax
mov ax,ss
mov es,ax
mov ecx,256*1024/4
mov edi,ebp
mov esi,0
cld
rep movs DWORD PTR [edi],DWORD PTR fs:[esi]
sub esp,1536 ;EGB buffer をstackに作る
push ss ;graphicのinitialize
pop gs
mov edi,esp
mov ecx,1536
mov ah,0
push 0110h
pop fs
call PWORD PTR fs:[20h]
mov ah,01h ;page = 0 を画面mode 5
mov al,0
mov dx,5
call PWORD PTR fs:[20h]
mov ah,02h ;表示位置を真ん中に
mov al,0
mov dx,64
mov bx,0
call PWORD PTR fs:[20h]
mov ah,02h ;拡大率を設定
mov al,2
mov dx,2
mov bx,2
call PWORD PTR fs:[20h]
mov ah,02h ;表示の大きさを設定
mov al,3
mov dx,256
mov bx,240
call PWORD PTR fs:[20h]
mov ah,06h ;表示の設定
mov al,1
mov edx,1
call PWORD PTR fs:[20h]
push 0120h ;初期値の設定
pop es
mov edi,0
call dsp
call chg_scr
#looptop: ;メインループ
mov ah,41h ;ジョイスティックを読む
mov dh,0
call pword ptr fs:[80h]
mov ds:[JOYDAT],dl
cmp dl,0ffh ;何も押していない
je #looptop
mov eax,ds:[SIN1] ;横の移動量を計算
mov ebx,SIZE_X/32*256
mul ebx
shrd eax,edx,8
mov ds:[GX],eax
mov eax,ds:[COS1] ;縦の移動量を計算
mov ebx,SIZE_X/32*256
mul ebx
shrd eax,edx,7
mov ds:[GY],eax
test ds:[JOYDAT],02h
jne #not_down
cmp ds:[TH],64 ;下移動。4つに場合分け
jae #down_2
mov eax,ds:[GX]
sub ds:[CNX],eax
mov eax,ds:[GY]
add ds:[CNY],eax
jmp #not_down
#down_2:
cmp ds:[TH],128
jae #down_3
mov eax,ds:[GX]
sub ds:[CNX],eax
mov eax,ds:[GY]
sub ds:[CNY],eax
jmp #not_down
#down_3:
cmp ds:[TH],192
jae #down_4
mov eax,ds:[GX]
add ds:[CNX],eax
mov eax,ds:[GY]
sub ds:[CNY],eax
jmp #not_down
#down_4:
mov eax,ds:[GX]
add ds:[CNX],eax
mov eax,ds:[GY]
add ds:[CNY],eax
#not_down:
test ds:[JOYDAT],01h
jne #not_up
cmp ds:[TH],64 ;上移動。4つに場合分け
jae #up_2
mov eax,ds:[GX]
add ds:[CNX],eax
mov eax,ds:[GY]
sub ds:[CNY],eax
jmp #not_up
#up_2:
cmp ds:[TH],128
jae #up_3
mov eax,ds:[GX]
add ds:[CNX],eax
mov eax,ds:[GY]
add ds:[CNY],eax
jmp #not_up
#up_3:
cmp ds:[TH],192
jae #up_4
mov eax,ds:[GX]
sub ds:[CNX],eax
mov eax,ds:[GY]
add ds:[CNY],eax
jmp #not_up
#up_4:
mov eax,ds:[GX]
sub ds:[CNX],eax
mov eax,ds:[GY]
sub ds:[CNY],eax
#not_up:
test ds:[JOYDAT],04h
jne #not_left
sub ds:[TH],2 ;左回転
#not_left:
test ds:[JOYDAT],08h
jne #not_right
add ds:[TH],2 ;右回転
#not_right:
test ds:[JOYDAT],10h
jne #not_a
;画面を縮小
mov ax,word ptr ds:[ZM]
mov bx,0110h
mul bx
shrd ax,dx,8
mov word ptr ds:[ZM],ax
cmp word ptr ds:[ZM],0F00h
jle #not_a
mov ds:[ZM],0F00h
#not_a:
test ds:[JOYDAT],20h
jne #not_b
;画面を拡大
mov ax,word ptr ds:[ZM]
mov bx,00f0h
mul bx
shrd ax,dx,8
mov word ptr ds:[ZM],ax
cmp word ptr ds:[ZM],0011h
jg #not_b
mov ds:[ZM],0011h
#not_b:
test ds:[JOYDAT],80h
jne #not_select
jmp #exit ;終了
#not_select:
test ds:[JOYDAT],40h
jne #not_run
mov ds:[ZM],0100h ;初期値に設定
mov ds:[TH],0
mov ds:[CNX],(SIZE_X/2)*00800000h
mov ds:[CNY],(SIZE_Y/2)*01000000h
#not_run:
call dsp ;1画面を描画
call chg_scr ;画面を切替え
jmp #looptop
#exit:
mov edi,esp ;TBIOS用にbufferのpointer
push 0110h ;とsegmentをセット
pop fs
mov ah,01h ;page = 0 を画面mode 10
mov al,0
mov dx,10
call PWORD PTR fs:[20h]
mov ah,02h ;表示位置を戻す
mov al,0
mov dx,0
mov bx,0
call PWORD PTR fs:[20h]
mov ah,02h ;拡大率を戻す
mov al,2
mov dx,2
mov bx,2
call PWORD PTR fs:[20h]
mov ah,02h ;表示の大きさを戻す
mov al,3
mov dx,320
mov bx,240
call PWORD PTR fs:[20h]
mov ah,06h ;表示の設定
mov al,1
mov edx,3
call PWORD PTR fs:[20h]
mov ax,120h ;vramのデータを戻す
mov es,ax
mov ax,ss
mov fs,ax
mov ecx,256*1024/4
mov edi,0
mov esi,ebp
cld
rep movs DWORD PTR [edi],DWORD PTR fs:[esi]
add esp,1536 ;EGB buffer を開放
add esp,256*1024 ;vram buffer を開放
popa
mov ah,4Ch
int 21h
MAIN endp
dsp proc
call tri ;SIN、COS を設定
mov ax,ds:[COS] ;拡大率を考慮してX座標の
mov bx,ds:[ZM] ;1ドット分の変化量を求める
mul bx
mov word ptr ds:[COS1+2],dx
mov word ptr ds:[COS1+0],ax
shl eax,16
shld edx,eax,16
mov ds:[DDX],edx
mov ax,ds:[SIN] ;拡大率を考慮してY座標の
mov bx,ds:[ZM] ;1ドット分の変化量を求める
mul bx
mov word ptr ds:[SIN1+2],dx
mov word ptr ds:[SIN1+0],ax
shl eax,16
shld edx,eax,17
mov ds:[DDY],edx
;左上の座標を求める
mov eax,ds:[COS1]
mov ebx,SIZE_X/2*256
mul ebx
shrd eax,edx,8
mov ds:[XCOS],eax
mov eax,ds:[SIN1]
mov ebx,SIZE_X/2*256
mul ebx
shrd eax,edx,8
mov ds:[XSIN],eax
mov eax,ds:[COS1]
mov ebx,SIZE_Y/2*256
mul ebx
shrd eax,edx,8
mov ds:[YCOS],eax
mov eax,ds:[SIN1]
mov ebx,SIZE_Y/2*256
mul ebx
shrd eax,edx,8
mov ds:[YSIN],eax
mov eax,ds:[CNX]
mov ds:[GX],eax
mov eax,ds:[CNY]
mov ds:[GY],eax
;符号で4つに場合分けする
cmp ds:[TH],63
jbe case1
cmp ds:[TH],127
jbe case2
cmp ds:[TH],191
jbe case3
jmp case4
dsp endp
case1 proc
mov eax,ds:[XCOS]
sub ds:[GX],eax
mov eax,ds:[YSIN]
add ds:[GX],eax
mov eax,ds:[XSIN]
shl eax,1
sub ds:[GY],eax
mov eax,ds:[YCOS]
shl eax,1
sub ds:[GY],eax
mov ebx,ds:[GY]
mov esi,ds:[GX]
mov ecx,ds:[DDX]
mov edx,ds:[DDY]
shl ecx,1
mov ds:[DDY1],ecx
shr edx,1
mov ds:[DDX1],edx
mov ecx,ds:[DDX]
mov edx,ds:[DDY]
mov ds:[LOPCNT1],240
align 4
#l1:
mov ds:[LOPCNT2],256
align 4
#l2: ;ここが最小ループ
xor eax,eax ;
shld eax,ebx,8 ;
shld eax,esi,9 ;
mov ax,[ebp+eax*2] ;
stosw ;
add esi,ecx ;
add ebx,edx ;
;
dec DWORD PTR ds:[LOPCNT2] ;
jne short #l2 ;
mov ebx,ds:[GY]
mov esi,ds:[GX]
sub esi,ds:[DDX1]
add ebx,ds:[DDY1]
mov ds:[GY],ebx
mov ds:[GX],esi
dec DWORD PTR ds:[LOPCNT1]
jne #l1
ret
case1 endp
case2 proc
mov eax,ds:[XCOS]
add ds:[GX],eax
mov eax,ds:[YSIN]
add ds:[GX],eax
mov eax,ds:[XSIN]
shl eax,1
sub ds:[GY],eax
mov eax,ds:[YCOS]
shl eax,1
add ds:[GY],eax
mov ebx,ds:[GY]
mov esi,ds:[GX]
mov ecx,ds:[DDX]
mov edx,ds:[DDY]
shl ecx,1
mov ds:[DDY1],ecx
shr edx,1
mov ds:[DDX1],edx
mov ecx,ds:[DDX]
mov edx,ds:[DDY]
mov ds:[LOPCNT1],240
align 4
#l1:
mov ds:[LOPCNT2],256
align 4
#l2:
xor eax,eax
shld eax,ebx,8
shld eax,esi,9
mov ax,[ebp+eax*2]
stosw
sub esi,ecx
add ebx,edx
dec DWORD PTR ds:[LOPCNT2]
jne short #l2
mov ebx,ds:[GY]
mov esi,ds:[GX]
sub esi,ds:[DDX1]
sub ebx,ds:[DDY1]
mov ds:[GY],ebx
mov ds:[GX],esi
dec DWORD PTR ds:[LOPCNT1]
jne #l1
ret
case2 endp
case3 proc
mov eax,ds:[XCOS]
add ds:[GX],eax
mov eax,ds:[YSIN]
sub ds:[GX],eax
mov eax,ds:[XSIN]
shl eax,1
add ds:[GY],eax
mov eax,ds:[YCOS]
shl eax,1
add ds:[GY],eax
mov ebx,ds:[GY]
mov esi,ds:[GX]
mov ecx,ds:[DDX]
mov edx,ds:[DDY]
shl ecx,1
mov ds:[DDY1],ecx
shr edx,1
mov ds:[DDX1],edx
mov ecx,ds:[DDX]
mov edx,ds:[DDY]
mov ds:[LOPCNT1],240
align 4
#l1:
mov ds:[LOPCNT2],256
align 4
#l2:
xor eax,eax
shld eax,ebx,8
shld eax,esi,9
mov ax,[ebp+eax*2]
stosw
sub esi,ecx
sub ebx,edx
dec DWORD PTR ds:[LOPCNT2]
jne short #l2
mov ebx,ds:[GY]
mov esi,ds:[GX]
add esi,ds:[DDX1]
sub ebx,ds:[DDY1]
mov ds:[GY],ebx
mov ds:[GX],esi
dec DWORD PTR ds:[LOPCNT1]
jne #l1
ret
case3 endp
case4 proc
mov eax,ds:[XCOS]
sub ds:[GX],eax
mov eax,ds:[YSIN]
sub ds:[GX],eax
mov eax,ds:[XSIN]
shl eax,1
add ds:[GY],eax
mov eax,ds:[YCOS]
shl eax,1
sub ds:[GY],eax
mov ebx,ds:[GY]
mov esi,ds:[GX]
mov ecx,ds:[DDX]
mov edx,ds:[DDY]
shl ecx,1
mov ds:[DDY1],ecx
shr edx,1
mov ds:[DDX1],edx
mov ecx,ds:[DDX]
mov edx,ds:[DDY]
mov ds:[LOPCNT1],240
align 4
#l1:
mov ds:[LOPCNT2],256
align 4
#l2:
xor eax,eax
shld eax,ebx,8
shld eax,esi,9
mov ax,[ebp+eax*2]
stosw
add esi,ecx
sub ebx,edx
dec DWORD PTR ds:[LOPCNT2]
jne short #l2
mov ebx,ds:[GY]
mov esi,ds:[GX]
add esi,ds:[DDX1]
add ebx,ds:[DDY1]
mov ds:[GY],ebx
mov ds:[GX],esi
dec DWORD PTR ds:[LOPCNT1]
jne #l1
ret
case4 endp
tri proc ;三角関数をセットする
mov al,ds:[TH]
cmp al,128
jb #l1
sub al,128
#l1:
cmp al,64
jbe #l2
sub al,128
neg al
#l2:
movzx ax,al
movzx eax,ax
mov bx,ds:[TRI_TBL+eax*2]
mov ds:[SIN],bx
mov al,ds:[TH]
add al,64
cmp al,128
jb #l3
sub al,128
#l3:
cmp al,64
jbe #l4
sub al,128
neg al
#l4:
movzx ax,al
movzx eax,ax
mov bx,ds:[TRI_TBL+eax*2]
mov ds:[COS],bx
ret
tri endp
chg_scr proc
cmp ds:[scr_pg],0
je #l1
mov edi,00000h
mov dx,0440h
mov al,17
out dx,al
mov dx,0442h
mov ax,8000h
out dx,ax
mov ds:[scr_pg],0
ret
#l1:
mov edi,20000h
mov dx,0440h
mov al,17
out dx,al
mov dx,0442h
mov ax,0
out dx,ax
mov ds:[scr_pg],1
ret
chg_scr endp
CODE ends
DATA segment
assume ds:DATA
align 4
CNX dd (SIZE_X/2)*00800000h
CNY dd (SIZE_Y/2)*01000000h
XSIN dd 0
XCOS dd 0
YSIN dd 0
YCOS dd 0
SIN dw 0
COS dw 0
SIN1 dd 0
COS1 dd 0
GX dd 0
GY dd 0
DDX dd 0
DDY dd 0
LOPCNT1 dd 0
LOPCNT2 dd 0
DDX1 dd 0
DDY1 dd 0
scr_pg dd 0
TRI_TBL dw 0000h,0324h,0648h,096Bh,0C8Ch,0FABh,12C8h,15E2h
dw 18F9h,1C0Ch,1F1Ah,2224h,2528h,2827h,2B1Fh,2E11h
dw 30FCh,33DFh,36BAh,398Dh,3C57h,3F17h,41CEh,447Bh
dw 471Dh,49B4h,4C40h,4EC0h,5134h,539Bh,55F6h,5843h
dw 5A82h,5CB4h,5ED7h,60ECh,62F2h,64E9h,66CFh,68A7h
dw 6A6Eh,6C24h,6DCAh,6F5Fh,70E3h,7255h,73B6h,7505h
dw 7642h,776Ch,7885h,798Ah,7A7Dh,7B5Dh,7C2Ah,7CE4h
dw 7D8Ah,7E1Eh,7E9Dh,7F0Ah,7F62h,7FA7h,7FD9h,7FF6h
dw 8000h
JOYDAT db 0
TH db 0
ZM dw 0100h
credit db 'Copy right T.Higashi 1990'
DATA ends
STACK segment stack
assume ss:STACK
db 300000 dup(?)
STACK ends
end MAIN