; ; 3次元ワイヤーフレームサンプルプログラム for PC88VA ; ;     written by h.godai on 3/8/88 ; ;      used 87H/8FH Function ; ; ; −−−−−−−−−−−−− KEY操作 −−−−−−−−−−−−−− ; ; スペース            前進 ; SHIFT           後退 ; 矢印キー            上下,左右の回転(ヘッド,ピッチ) ; ROLLUP,ROLLDOWN Z軸の回転(ロール) ; 2,4,6,8         上下左右の図形シフト ; +,−             Z方向の図形シフト ; INS,DEL         パースの変更 ; Pitch equ 128 ;移動ピッチ Th equ 5 ;回転角度 TextBios equ 83h ScnBios equ 8fh gBios equ 87h SetFrame equ 01h View equ 02h Line equ 11h Lines equ 13h PageInit equ 3100h NextPage equ 3103h Turn_X_C equ 3981h Turn_Y_C equ 3982h Turn_Z_C equ 3983h conv3d_C equ 3880h .186 code segment assume cs:code,ds:data,es:data,ss:stack start: mov ax,data mov ds,ax mov es,ax ;−−−−− スクリーンイニシャライズ −−−−− ; ;マルチプレーンモード,640×400ドット/16色 ; mov ax,1702h ;cls text int TextBios mov bx,0010000000000000b ;MP/640x400 mov cl,4 ;16color xor ah,ah ;ScnMode int ScnBios mov cx,2 ;2buffers mov di,offset fbuffer mov ax,0100h ;defbuffer int ScnBios mov cx,1 ;windows mov di,offset windows1 mov ax,0200h ;DefWin/page0 int ScnBios ;フレームバッファの実アドレスをPageデータテーブルに渡す ; mov cl,0 ;buffer-0 mov ax,700h ;AskBuf int ScnBios mov ax,es:[di+6] mov dx,es:[di+8] add dx,0a000h call parapack mov buf0ofs,ax mov buf0seg,dx mov cl,1 ;buffer-1 mov ax,700h ;AskBuf int ScnBios mov ax,es:[di+6] mov dx,es:[di+8] add dx,0a000h call parapack mov buf1ofs,ax mov buf1seg,dx push ds pop es mov dx,offset SetFrameData mov ah,SetFrame int gBios mov bx,offset view_tabel1 xor al,al mov ah,View int gBios mov bx,offset page_tabel mov cl,0 mov ax,PageInit int gBios mov al,00100000b ;Box mov bx,offset linedata mov ah,Line int gBios mov ax,NextPage int gBios mov al,00100000b ;Box mov ah,line int gBios mov bx,offset view_tabel2 xor al,al mov ah,View int gBios call Main MainLoop label near call Main call Keyin jmp MainLoop ;メインループ ; Main label near ;ラインの3次元変換 ; mov si,offset ldata mov di,offset ldata_2d mov cx,datan mov dx,siten mov bx,parth mov ax,conv3d_C int gBios ;2次元ラインの描画 ; or cx,cx jz Main_01 mov bx,offset lines_tabel mov nlines,cx mov al,10000000b mov ah,Lines int gBios Main_01 label near ;ページ切り替え ; mov ax,NextPage int gBios ret ;キー入力処理ルーチン ; Keyin label near ; ;bx=dX, cx=dY,bp=dZ ; xor bx,bx xor cx,cx xor bp,bp mov dx,0 in al,dx test al,01000000b jnz Keyin_01 mov bx,Pitch Keyin_01 label near test al,00010000b jnz Keyin_02 mov bx,-Pitch Keyin_02 label near test al,00000100b jnz Keyin_03 mov cx,Pitch Keyin_03 label near mov dx,1 in al,dx test al,00000001b jnz Keyin_04 mov cx,-Pitch Keyin_04 label near mov dx,9 in al,dx test al,01000000b jnz Keyin_05 add siten,-Pitch mov ah,99 Keyin_05 label near mov dx,8 in al,dx test al,01000000b jnz Keyin_06 add siten,Pitch mov ah,99 Keyin_06 label near mov dx,1 in al,dx test al,00001000b jnz Keyin_07 mov bp,-Pitch Keyin_07 label near mov dx,10 in al,dx test al,00100000b jnz Keyin_08 mov bp,Pitch Keyin_08 label near mov dx,0ch in al,dx test al,01000000b jnz Keyin_09 add parth,Pitch mov ah,99 Keyin_09 label near test al,10000000b jnz Keyin_10 add parth,-Pitch mov ah,99 Keyin_10 label near mov dx,9 in al,dx test al,00000001b jnz Keyin_11 mov ah,4ch ;return to DOS int 21h Keyin_11 label near mov dx,0bh in al,dx cmp al,-1 jz Keyin_12 push cx push dx test al,00000001b jz Keyin_13 mov si,offset ldata mov di,si mov cx,datan add cx,cx mov dx,Th mov ax,Turn_Z_C int gBios jmp Keyin_13_1 Keyin_13 label near mov si,offset ldata mov di,si mov cx,datan add cx,cx mov dx,360-Th mov ax,Turn_Z_C int gBios Keyin_13_1 label near pop dx pop cx mov ah,99 Keyin_12 label near ;turn x ; mov dx,08h in al,dx test al,00000010b jnz Keyin_14 push cx push dx mov si,offset ldata mov di,si mov cx,datan add cx,cx mov dx,Th mov ax,Turn_X_C int gBios pop dx pop cx mov ah,99 Keyin_14 label near mov dx,0ah in al,dx test al,00000010b jnz Keyin_15 push cx push dx mov si,offset ldata mov di,si mov cx,datan add cx,cx mov dx,360-Th mov ax,Turn_X_C int gBios pop dx pop cx mov ah,99 Keyin_15 label near ;turn y mov dx,08h in al,dx test al,00000100b jnz Keyin_16 push cx push dx mov si,offset ldata mov di,si mov cx,datan add cx,cx mov ax,Turn_Y_C mov dx,Th int gBios pop dx pop cx mov ah,99 Keyin_16 label near mov dx,0ah in al,dx test al,00000100b jnz Keyin_17 push cx push dx mov si,offset ldata mov di,si mov cx,datan add cx,cx mov dx,360-Th mov ax,Turn_Y_C int gBios pop dx pop cx mov ah,99 Keyin_17 label near cmp ah,99 jz Keyin_18 mov ax,bx or ax,cx or ax,bp jnz Keyin_19 jmp Keyin Keyin_19 label near mov dx,cx mov cx,datan mov si,offset ldata mov di,si Keyin_20 label near lodsw ;x add ax,bx stosw lodsw ;y add ax,dx stosw lodsw ;z add ax,bp stosw lodsw ;x add ax,bx stosw lodsw ;y add ax,dx stosw lodsw ;z add ax,bp stosw movsw ;color loop Keyin_20 Keyin_18 label near ret parapack label near push bx mov bx,ax shr bx,4 add dx,bx and ax,000fh pop bx ret code ends data segment ;フレームバッファ初期値 (マルチプレーン/16色/640×400)  ; SetFrameData label word dw 0,0,0a000h,80,400 ;VIEWデータ1 ; view_tabel1 label word dw 0,0,639,399,0,0 ;VIEWデータ2 (320,200)をオフセットにする ; view_tabel2 label word dw 64-320,64-200,639-64-320,399-64-200 dw 320,200 ;枠のラインデータ ; linedata label word dw 64-1,64-1,640-64,400-64,-1,7,0 ;Linesのデータテーブル ; lines_tabel label word dw ldata_2d dw data nlines label word dw datan dw 0 dw 0ffffh dw 4 dw 0,0 ;Pageのデータテーブル ; page_tabel label word dw 2 ;buffers dw fbuffer dw 1 ;windows buffer-0 dw windows1 buf0ofs label word dw 0 buf0seg label word dw 0a000h dw 1 ;windows buffer-1 dw windows2 buf1ofs label word dw 0 buf1seg label word dw 0c000h ;フレームバッファ ; fbuffer label word dw 4,640,408 dw 4,640,408 ;スクリーンウインドウ ; windows1 label word dw 0 dw 0 dw 400 dw 0,0 windows2 label word dw 1 dw 0 dw 400 dw 0,0 siten dw 4000 parth dw 320-64 ;3次元ラインデータ ; ldata label word dw -5120,1280,5120,5120,1280,5120 ,1 dw 5120,1280,5120,5120,1280,-5120 ,1 dw 5120,1280,-5120,-5120,1280,-5120 ,1 dw -5120,1280,-5120,-5120,1280,5120 ,1 dw -4096,1280,5120,-4096,1280,-5120 ,1 dw -3072,1280,-5120,-3072,1280,5120 ,1 dw -2048,1280,5120,-2048,1280,-5120 ,1 dw -1024,1280,-5120,-1024,1280,5120 ,1 dw 0,1280,5120,0,1280,-5120 ,1 dw 1024,1280,-5120,1024,1280,5120 ,1 dw 2048,1280,5120,2048,1280,-5120 ,1 dw 3072,1280,-5120,3072,1280,5120 ,1 dw 4096,1280,5120,4096,1280,-5120 ,1 dw 5120,1280,-4096,-5120,1280,-4096 ,1 dw -5120,1280,-3072,5120,1280,-3072 ,1 dw 5120,1280,-2048,-5120,1280,-2048 ,1 dw -5120,1280,-1024,5120,1280,-1024 ,1 dw 5120,1280,0,-5120,1280,0 ,1 dw -5120,1280,1024,5120,1280,1024 ,1 dw 5120,1280,2048,-5120,1280,2048 ,1 dw 5120,1280,3072,-5120,1280,3072 ,1 dw -5120,1280,4096,5120,1280,4096 ,1 dw 3072,1280,1024,3968,-768,-1792 ,6 dw 3968,-768,-1792,3072,1280,-3072 ,6 dw 3968,-768,-1792,5120,1280,-2048 ,6 dw 5120,1280,1024,3968,-768,-1792 ,6 dw -1792,1280,768,-1792,-1280,768 ,4 dw -1792,-1280,768,-1792,-1280,256 ,4 dw -1792,-1280,256,-1792,1280,256 ,4 dw -1792,-1280,256,-1280,-1280,256 ,4 dw -1280,-1280,256,-1280,-1280,768 ,4 dw -1280,-1280,768,-1792,-1280,768 ,4 dw -1280,-1280,256,-1280,1280,256 ,4 dw -1280,-1280,768,-1280,1280,768 ,4 dw -128,1280,2176,-128,-2432,2176 ,5 dw -128,-2432,2176,-640,-2432,2176 ,5 dw -640,-2432,2176,-640,1280,2176 ,5 dw -640,1280,2688,-640,-2432,2688 ,5 dw -640,-2432,2688,-128,-2432,2688 ,5 dw -128,-2432,2688,-128,1280,2688 ,5 dw -128,-2432,2688,-128,-2432,2176 ,5 dw -640,-2432,2176,-640,-2432,2688 ,5 dw -1024,1280,-1024,-1536,256,-1536 ,2 dw -1536,256,-1536,-1792,-768,-1792 ,2 dw -1792,-768,-1792,-1920,-1792,-1920 ,2 dw -1920,-1792,-1920,-2048,-3840,-2048 ,2 dw -3072,1280,-1024,-2560,256,-1536 ,2 dw -2560,256,-1536,-2304,-768,-1792 ,2 dw -2304,-768,-1792,-2176,-1792,-1920 ,2 dw -2176,-1792,-1920,-2048,-3840,-2048 ,2 dw -3072,1280,-3072,-2560,256,-2560 ,2 dw -2560,256,-2560,-2304,-768,-2304 ,2 dw -2304,-768,-2304,-2176,-1792,-2176 ,2 dw -2176,-1792,-2176,-2048,-3840,-2048 ,2 dw -1024,1280,-3072,-1536,256,-2560 ,2 dw -1536,256,-2560,-1792,-768,-2304 ,2 dw -1792,-768,-2304,-1920,-1792,-2176 ,2 dw -1920,-1792,-2176,-2048,-3840,-2048 ,2 dw -2560,256,-2560,-2560,256,-1536 ,2 dw -2560,256,-1536,-1536,256,-1536 ,2 dw -1536,256,-1536,-1536,256,-2560 ,2 dw -1792,-768,-2304,-2304,-768,-2304 ,2 dw -2304,-768,-2304,-2304,-768,-1792 ,2 dw -2304,-768,-1792,-1792,-768,-1792 ,2 dw -1792,-768,-1792,-1792,-768,-2304 ,2 dw -2560,256,-2560,-1536,256,-2560 ,2 datan equ 66 ;ラインの数 ;2次元ラインデータ用のワーク ; ldata_2d label word dw 1000 dup (?) data ends stack segment stack stack 'stack' dw 4096 dup(?) stack ends end start