這是一個 1995 年由國外組合語言高手 Vulture 編寫的 3D 動畫小程式,僅用星號(像素點)構成立方體並在三軸持續旋轉。程式採用 TASM 理想模式,直接操作 VGA 記憶體(0xA000:0000),利用查表法計算正弦/餘弦,定點數學實現 3D 旋轉變換,配合垂直回描同步消除閃爍。這不僅是技術展示,更是早期 Demoscene 文化的縮影。
程式實現標準 3D 旋轉矩陣,但為了速度採用定點運算:將正弦/餘弦值乘以 256 存為整數,運算後再右移 8 位(除以 256)。三軸旋轉公式如下:
每幀更新三軸角度(DeltaX/Y/Z 控制速度),重新計算所有 125 個頂點(5×5×5 立方晶格)位置,投影至螢幕(透視除法:Xoff·X/(Z+Zoff)),繪製像素點,隨後等待垂直回描清除舊幀——經典的「雙緩衝」無閃爍動畫技巧。
Label SinCos Word ; 256 個正弦值(已乘 256) dw 0,6,13,19,25,31,38,44,50,56 dw 62,68,74,80,86,92,98,104,109,115 ... GetSinCos PROC push bx shl bx,1 mov ax,[SinCos + bx] ; 取正弦 pop bx push ax add bx,64 ; 相位差 90 度取餘弦 and bx,11111111b shl bx,1 mov ax,[SinCos + bx] mov bx,ax pop ax ret ENDP
使用 INT 10h AX=13h 進入 320×200×256 色模式(Mode 13h),ES 指向 0xA0000。ShowPoint 計算螢幕座標 (y*320)+x,直接寫入顯存;WaitVrt 等待垂直回描(端口 0x3DA)同步幀率。
Label Cube Byte ; 125 個 3D 點 (X,Y,Z 各佔 1 byte) c = -35 rept 5 b = -35 rept 5 a = -35 rept 5 db a,b,c a = a + 20 endm b = b + 20 endm c = c + 20 endm
IDEAL P386 JUMPS SEGMENT CODE ASSUME cs:code,ds:code ORG 100h START: mov ax,0013h int 10h mov ax,cs mov ds,ax mov ax,0a000h mov es,ax lea si,[Palette] mov dx,3c8h xor al,al out dx,al mov dx,3c9h mov cx,189*3 repz outsb mov [DeltaX],1 mov [DeltaY],1 mov [DeltaZ],1 mov [Xoff],256 mov [Yoff],256 mov [Zoff],300 MainLoop: call MainProgram in al,60h cmp al,1 jne MainLoop mov ax,0003h int 10h lea dx,[Credits] mov ah,9 int 21h mov ax,4c00h int 21h ... PROC RotatePoint movsx ax,[Cube+si] mov [X],ax movsx ax,[Cube+si+1] mov [Y],ax movsx ax,[Cube+si+2] mov [Z],ax ; 繞 X 軸旋轉 mov ax,[Y] mov bx,[XCos] imul bx mov bp,ax mov ax,[Z] mov bx,[XSin] imul bx sub bp,ax sar bp,8 mov [Yt],bp ... ret ENDP ... ENDS CODE END START
tasm 3d.asmtlink 3d.objexe2bin 3d.exe 3d.com3d.com這個不足 1KB 的 .COM 程式,用最樸素的指令構建出迷人的 3D 視覺效果,展示了組合語言程式設計師對硬體極限的掌控與對數學之美的追求。它是學習 3D 圖形基礎、定點運算、VGA 程式設計、Demoscene 歷史的絕佳教材。