《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > 匯編源代碼之一個旋轉的3D箱子(動畫)

匯編源代碼之一個旋轉的3D箱子(動畫)

2017-07-23
關鍵詞: 匯編語言

本程序由國外的Vulture大哥編寫,并公布了源碼,這個是他95年的一個作品,可以說是在當時是非常成功的!
  ;這個程序是巧妙的利用了坐標的不斷變化,從而實現了由星星構成的箱子3D轉動!
  ;為了尊重版權,本人未對源碼注釋進行翻譯,這樣做也可以讓國內的匯編愛好者自己琢磨國外的匯編編程的思維!
  ;編譯方法: 1 tasm 3d.asm
  ;      2 tlink 3d.obj
  ;      3 exe2bin 3d.exe 3d.com
  ;本程序是站長精心收集的一個很經典的3D小動畫. 站長的x86匯編小站:http://www.x86asm.com
  ;                          永久域名:http://x86asm.yeah.net
  ;==============================================================================;
;                                       ;
;  Assembler Program By Vulture.                       ;
;  3D-system example. Use the following formulas to rotate a point:      ;
;                                       ;
;    Rotate around x-axis                         ;
;    YT = Y * COS(xang) - Z * SIN(xang) / 256               ;
;    ZT = Y * SIN(xang) + Z * COS(xang) / 256               ;
;    Y = YT                                ;
;    Z = ZT                                ;
;                                       ;
;    Rotate around y-axis                         ;
;    XT = X * COS(yang) - Z * SIN(yang) / 256               ;
;    ZT = X * SIN(yang) + Z * COS(yang) / 256               ;
;    X = XT                                ;
;    Z = ZT                                ;
;                                       ;
;    Rotate around z-axis                         ;
;    XT = X * COS(zang) - Y * SIN(zang) / 256               ;
;    YT = X * SIN(zang) + Y * COS(zang) / 256               ;
;    X = XT                                ;
;    Y = YT                                ;
;                                       ;
;  Divide by 256 coz we have multiplyd our sin values with 256 too.      ;
;  This example isn't too fast right now but it'll work just fine.      ;
;                                       ;
;    Current Date: 6-9-95     Vulture                  ;
;                                       ;
;==============================================================================;
  IDEAL              ; Ideal mode
P386              ; Allow 80386 instructions
JUMPS              ; Tasm handles out of range jumps (rulez!:))
           
SEGMENT CODE          ; Code segment starts
ASSUME cs:code,ds:code     ; Let cs and ds point to code segment
ORG 100h            ; Make a .COM file
START:             ; Main program
  mov   ax,0013h      ; Init vga
  int   10h
     
  mov   ax,cs
  mov   ds,ax        ; ds points to codesegment
  mov   ax,0a000h
  mov   es,ax        ; es points to vga
  lea   si,[Palette]    ; Set palette
  mov   dx,3c8h
  xor   al,al
  out   dx,al
  mov   dx,3c9h
  mov   cx,189*3
  repz  outsb
  ; === Set some variables ===
  mov   [DeltaX],1     ; Initial speed of rotation
  mov   [DeltaY],1     ; Change this and watch what
  mov   [DeltaZ],1     ; happens. It's fun!
  mov   [Xoff],256
  mov   [Yoff],256     ; Used for calculating vga-pos
  mov   [Zoff],300     ; Distance from viewer
  MainLoop:
  call  MainProgram     ; Yep... do it all... ;-)
  in   al,60h       ; Scan keyboard
  cmp   al,1        ; Test on ESCAPE
  jne   MainLoop      ; Continue if not keypressed
  ; === Quit to DOS ===
  mov   ax,0003h      ; Back to textmode
  int   10h
  lea   dx,[Credits]
  mov   ah,9
  int   21h
  mov   ax,4c00h      ; Return control to DOS
  int   21h         ; Call DOS interrupt
  ; === Sub-routines ===
     
PROC WaitVrt          ; Waits for vertical retrace to reduce "snow"
  mov   dx,3dah
Vrt:
  in   al,dx
  test  al,8
  jnz   Vrt         ; Wait until Verticle Retrace starts
NoVrt:
  in   al,dx
  test  al,8
  jz   NoVrt        ; Wait until Verticle Retrace ends
  ret             ; Return to main program
ENDP WaitVrt
  PROC UpdateAngles
; Calculates new x,y,z angles
; to rotate around
  mov   ax,[XAngle]     ; Load current angles
  mov   bx,[YAngle]
  mov   cx,[ZAngle]
     
  add   ax,[DeltaX]     ; Add velocity
  and   ax,11111111b    ; Range from 0..255
  mov   [XAngle],ax     ; Update X
  add   bx,[DeltaY]     ; Add velocity
  and   bx,11111111b    ; Range from 0..255
  mov   [YAngle],bx     ; Update Y
  add   cx,[DeltaZ]     ; Add velocity
  and   cx,11111111b    ; Range from 0..255
  mov   [ZAngle],cx     ; Update Z
  ret
ENDP UpdateAngles
  PROC GetSinCos
; Needed : bx=angle (0..255)
; Returns: ax=Sin  bx=Cos
  push  bx         ; Save angle (use as pointer)
  shl   bx,1        ; Grab a word so bx=bx*2
  mov   ax,[SinCos + bx]  ; Get sine
  pop   bx         ; Restore pointer into bx
  push  ax         ; Save sine on stack
  add   bx,64        ; Add 64 to get cosine
  and   bx,11111111b    ; Range from 0..255
  shl   bx,1        ; *2 coz it's a word
  mov   ax,[SinCos + bx]  ; Get cosine
  mov   bx,ax        ; Save it  bx=Cos
  pop   ax         ; Restore  ax=Sin
  ret
ENDP GetSinCos
  PROC SetRotation
; Set sine & cosine of x,y,z
  mov   bx,[XAngle]     ; Grab angle
  call  GetSinCos      ; Get the sine&cosine
  mov   [Xsin],ax      ; Save sin
  mov   [Xcos],bx      ; Save cos
  mov   bx,[Yangle]
  call  GetSinCos
  mov   [Ysin],ax
  mov   [Ycos],bx
  mov   bx,[Zangle]
  call  GetSinCos
  mov   [Zsin],ax
  mov   [Zcos],bx
  ret
ENDP SetRotation
  PROC RotatePoint      ; Rotates the point around x,y,z
; Gets original x,y,z values
; This can be done elsewhere
  movsx  ax,[Cube+si]  ; si = X    (movsx coz of byte)
  mov   [X],ax
  movsx  ax,[Cube+si+1] ; si+1 = Y
  mov   [Y],ax
  movsx  ax,[Cube+si+2] ; si+2 = Z
  mov   [Z],ax
  ; Rotate around x-axis
; YT = Y * COS(xang) - Z * SIN(xang) / 256
; ZT = Y * SIN(xang) + Z * COS(xang) / 256
; Y = YT
; Z = ZT
  mov   ax,[Y]
  mov   bx,[XCos]
  imul  bx        ; ax = Y * Cos(xang)
  mov   bp,ax
  mov   ax,[Z]
  mov   bx,[XSin]
  imul  bx        ; ax = Z * Sin(xang)
  sub   bp,ax      ; bp = Y * Cos(xang) - Z * Sin(xang)
  sar   bp,8       ; bp = Y * Cos(xang) - Z * Sin(xang) / 256
  mov   [Yt],bp
  mov   ax,[Y]
  mov   bx,[XSin]
  imul  bx        ; ax = Y * Sin(xang)
  mov   bp,ax
  mov   ax,[Z]
  mov   bx,[XCos]
  imul  bx        ; ax = Z * Cos(xang)
  add   bp,ax      ; bp = Y * SIN(xang) + Z * COS(xang)
  sar   bp,8       ; bp = Y * SIN(xang) + Z * COS(xang) / 256
  mov   [Zt],bp
  mov   ax,[Yt]     ; Switch values
  mov   [Y],ax
  mov   ax,[Zt]
  mov   [Z],ax
  ; Rotate around y-axis
; XT = X * COS(yang) - Z * SIN(yang) / 256
; ZT = X * SIN(yang) + Z * COS(yang) / 256
; X = XT
; Z = ZT
  mov   ax,[X]
  mov   bx,[YCos]
  imul  bx        ; ax = X * Cos(yang)
  mov   bp,ax
  mov   ax,[Z]
  mov   bx,[YSin]
  imul  bx        ; ax = Z * Sin(yang)
  sub   bp,ax      ; bp = X * Cos(yang) - Z * Sin(yang)
  sar   bp,8       ; bp = X * Cos(yang) - Z * Sin(yang) / 256
  mov   [Xt],bp
  mov   ax,[X]
  mov   bx,[YSin]
  imul  bx        ; ax = X * Sin(yang)
  mov   bp,ax
  mov   ax,[Z]
  mov   bx,[YCos]
  imul  bx        ; ax = Z * Cos(yang)
  add   bp,ax      ; bp = X * SIN(yang) + Z * COS(yang)
  sar   bp,8       ; bp = X * SIN(yang) + Z * COS(yang) / 256
  mov   [Zt],bp
  mov   ax,[Xt]     ; Switch values
  mov   [X],ax
  mov   ax,[Zt]
  mov   [Z],ax
  ; Rotate around z-axis
; XT = X * COS(zang) - Y * SIN(zang) / 256
; YT = X * SIN(zang) + Y * COS(zang) / 256
; X = XT
; Y = YT
  mov   ax,[X]
  mov   bx,[ZCos]
  imul  bx        ; ax = X * Cos(zang)
  mov   bp,ax
  mov   ax,[Y]
  mov   bx,[ZSin]
  imul  bx        ; ax = Y * Sin(zang)
  sub   bp,ax      ; bp = X * Cos(zang) - Y * Sin(zang)
  sar   bp,8       ; bp = X * Cos(zang) - Y * Sin(zang) / 256
  mov   [Xt],bp
  mov   ax,[X]
  mov   bx,[ZSin]
  imul  bx        ; ax = X * Sin(zang)
  mov   bp,ax
  mov   ax,[Y]
  mov   bx,[ZCos]
  imul  bx        ; ax = Y * Cos(zang)
  add   bp,ax      ; bp = X * SIN(zang) + Y * COS(zang)
  sar   bp,8       ; bp = X * SIN(zang) + Y * COS(zang) / 256
  mov   [Yt],bp
  mov   ax,[Xt]     ; Switch values
  mov   [X],ax
  mov   ax,[Yt]
  mov   [Y],ax
  ret
ENDP RotatePoint
     
PROC ShowPoint
; Calculates screenposition and
; plots the point on the screen
  mov   ax,[Xoff]      ; Xoff*X / Z+Zoff = screen x
  mov   bx,[X]
  imul  bx
  mov   bx,[Z]
  add   bx,[Zoff]      ; Distance
  idiv  bx
  add   ax,[Mx]       ; Center on screen
  mov   bp,ax
  mov   ax,[Yoff]      ; Yoff*Y / Z+Zoff = screen y
  mov   bx,[Y]
  imul  bx
  mov   bx,[Z]
  add   bx,[Zoff]      ; Distance
  idiv  bx
  add   ax,[My]       ; Center on screen
     
  mov   bx,320
  imul  bx
  add   ax,bp        ; ax = (y*320)+x
  mov   di,ax
  mov   ax,[Z]       ; Get color from Z
  add   ax,100d       ; (This piece of code could be improved)
  mov   [byte ptr es:di],al ; Place a dot with color al
  mov   [Erase+si],di    ; Save position for erase
  ret
ENDP ShowPoint
  PROC MainProgram
  call  UpdateAngles    ; Calculate new angles
  call  SetRotation     ; Find sine & cosine of those angles
  xor   si,si        ; First 3d-point
  mov   cx,MaxPoints
ShowLoop: 
  call  RotatePoint     ; Rotates the point using above formulas
  call  ShowPoint      ; Shows the point
  add   si,3        ; Next 3d-point
  loop  ShowLoop
  call  WaitVrt       ; Wait for retrace
  xor   si,si        ; Starting with point 0
  xor   al,al        ; Color = 0 = black
  mov   cx,MaxPoints
Deletion:
  mov   di,[Erase+si]    ; di = vgapos old point
  mov   [byte ptr es:di],al ; Delete it
  add   si,3        ; Next point
  loop  Deletion
  ret
ENDP MainProgram
  ; === DATA ===
     
Credits  DB  13,10,"Code by Vulture / Outlaw Triad",13,10,"$"
  Label SinCos Word    ; 256 values
dw 0,6,13,19,25,31,38,44,50,56
dw 62,68,74,80,86,92,98,104,109,115
dw 121,126,132,137,142,147,152,157,162,167
dw 172,177,181,185,190,194,198,202,206,209
dw 213,216,220,223,226,229,231,234,237,239
dw 241,243,245,247,248,250,251,252,253,254
dw 255,255,256,256,256,256,256,255,255,254
dw 253,252,251,250,248,247,245,243,241,239
dw 237,234,231,229,226,223,220,216,213,209
dw 206,202,198,194,190,185,181,177,172,167
dw 162,157,152,147,142,137,132,126,121,115
dw 109,104,98,92,86,80,74,68,62,56
dw 50,44,38,31,25,19,13,6,0,-6
dw -13,-19,-25,-31,-38,-44,-50,-56,-62,-68
dw -74,-80,-86,-92,-98,-104,-109,-115,-121,-126
dw -132,-137,-142,-147,-152,-157,-162,-167,-172,-177
dw -181,-185,-190,-194,-198,-202,-206,-209,-213,-216
dw -220,-223,-226,-229,-231,-234,-237,-239,-241,-243
dw -245,-247,-248,-250,-251,-252,-253,-254,-255,-255
dw -256,-256,-256,-256,-256,-255,-255,-254,-253,-252
dw -251,-250,-248,-247,-245,-243,-241,-239,-237,-234
dw -231,-229,-226,-223,-220,-216,-213,-209,-206,-202
dw -198,-194,-190,-185,-181,-177,-172,-167,-162,-157
dw -152,-147,-142,-137,-132,-126,-121,-115,-109,-104
dw -98,-92,-86,-80,-74,-68,-62,-56,-50,-44
dw -38,-31,-25,-19,-13,-6
  Label Cube Byte      ; The 3d points
    c = -35      ; 5x*5y*5z (=125) points
    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
  Label Palette Byte       ; The palette to use
    db 0,0,0         ; 63*3 gray-tint
    d = 63
    rept 63
     db d,d,d
     db d,d,d
     db d,d,d
     d = d - 1
    endm
  X   DW ?       ; X variable for formula
Y   DW ?
Z   DW ?
  Xt   DW ?       ; Temporary variable for x
Yt   DW ?
Zt   DW ?
  XAngle DW 0       ; Angle to rotate around x
YAngle DW 0
ZAngle DW 0
  DeltaX DW ?       ; Amound Xangle is increased each time
DeltaY DW ?
DeltaZ DW ?
  Xoff  DW ?
Yoff  DW ?
Zoff  DW ?       ; Distance from viewer
  XSin  DW ?       ; Sine and cosine of angle to rotate around
XCos  DW ?
YSin  DW ?
YCos  DW ?
ZSin  DW ?
ZCos  DW ?
  Mx   DW 160      ; Middle of the screen
My   DW 100
                
MaxPoints EQU 125    ; Number of 3d Points
  Erase DW MaxPoints DUP (?)   ; Array for deletion screenpoints
  ENDS CODE            ; End of codesegment
END START            ; The definite end.... :)
; You may use this code in your own productions but
; give credit where credit is due. Only lamers steal
; code so try to create your own 3d-engine and use
; this code as an example.
; Thanx must go to Arno Brouwer and Ash for releasing
; example sources.
;
;  Ciao dudoz,
;
;     Vulture / Outlaw Triad

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美激情亚洲视频| 国产精品久久毛片a| 亚洲午夜久久久久久久久电影院| 久久国产免费| 欧美中文字幕在线| 午夜精品久久久久久久99樱桃| 亚洲免费观看视频| 亚洲国产精品久久人人爱蜜臀| 精品91免费| 一区二区在线不卡| 激情小说另类小说亚洲欧美 | 国产精品99免视看9| 欧美人在线视频| 欧美日韩免费观看一区三区 | 校园激情久久| 先锋影音久久久| 午夜亚洲激情| 久久9热精品视频| 亚洲第一色中文字幕| 亚洲大胆人体在线| 91久久一区二区| 亚洲精选91| 亚洲手机视频| 亚洲伊人网站| 欧美一区二区三区免费看| 欧美一级理论片| 久久久久国产精品厨房| 美女国内精品自产拍在线播放| 欧美xxx成人| 欧美日韩三区| 国产精品亚洲视频| 国产在线观看91精品一区| 伊人久久成人| 亚洲理伦在线| 亚洲一区欧美二区| 欧美一区二区三区久久精品茉莉花 | 国产精品夜夜夜| 欧美日韩国产美女| 国产精品青草久久久久福利99| 国产欧美日韩精品a在线观看| 国产专区欧美专区| 亚洲黄色成人| 亚洲视频精选| 欧美尤物一区| 99视频精品在线| 亚洲制服欧美中文字幕中文字幕| 午夜影院日韩| 噜噜噜久久亚洲精品国产品小说| 欧美激情第3页| 国产精品一区二区三区成人| 一区二区三区无毛| 一区二区免费在线观看| 欧美一区二区三区播放老司机| 亚洲日本成人| 亚洲欧美视频在线观看视频| 久久婷婷麻豆| 欧美日韩理论| 国内成人自拍视频| 99re6热在线精品视频播放速度| 亚洲欧美一区二区精品久久久| 亚洲国产精品久久91精品| 在线性视频日韩欧美| 久久久精品网| 欧美日韩美女在线| 国内精品久久久久久 | 亚洲免费在线视频一区 二区| 久久精品视频va| 欧美日韩精品一区二区三区| 国产亚洲欧洲一区高清在线观看| 亚洲三级电影全部在线观看高清| 羞羞答答国产精品www一本| 日韩亚洲欧美一区| 久久久久久噜噜噜久久久精品| 欧美日韩亚洲网| 在线播放国产一区中文字幕剧情欧美| 在线亚洲电影| 99国产精品99久久久久久| 久久国产精品久久久久久| 欧美日韩国产综合网| 国产自产2019最新不卡| 亚洲无线观看| 亚洲麻豆av| 久久欧美中文字幕| 国产精品羞羞答答| 日韩视频永久免费| 亚洲高清视频一区| 欧美一区二区三区视频在线| 欧美日本在线播放| 伊人蜜桃色噜噜激情综合| 亚洲自拍都市欧美小说| 一区二区三区久久网| 久久综合色天天久久综合图片| 国产精品自拍小视频| 一本色道久久综合| 9国产精品视频| 麻豆成人综合网| 国模 一区 二区 三区| 午夜精品短视频| 亚洲欧美日韩天堂| 欧美调教视频| 日韩视频永久免费| 99精品欧美一区二区三区| 美女黄网久久| 极品日韩久久| 久久精品国产一区二区三区| 久久se精品一区二区| 国产精品美女主播| 一本久道久久综合中文字幕 | 欧美日韩福利| 亚洲精品永久免费精品| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲免费在线观看| 亚洲麻豆国产自偷在线| 欧美91福利在线观看| 好看的日韩av电影| 欧美中文字幕第一页| 久久久久九九九| 国产一区二区三区在线观看网站 | 欧美日韩精品免费在线观看视频| 91久久久亚洲精品| 日韩视频一区二区三区| 欧美韩日一区二区| 亚洲国产天堂久久国产91| 91久久久久久久久| 欧美国产日韩一区二区在线观看 | 黄色成人在线免费| 久久精品一二三区| 欧美aa在线视频| 亚洲欧洲精品一区| 一区二区三区高清在线| 欧美日韩中文在线| 中文久久精品| 欧美一区二区视频在线| 国产女人18毛片水18精品| 西瓜成人精品人成网站| 久久久久久久91| 亚洲电影第1页| 99视频超级精品| 欧美亚州一区二区三区| 亚洲永久免费观看| 久久国产精品72免费观看| 国内精品久久久久久| 亚洲欧洲午夜| 欧美日韩一级黄| 亚洲欧美美女| 久久天天狠狠| 亚洲精品日韩一| 午夜欧美精品久久久久久久| 国产欧美一区二区在线观看| 欧美综合国产| 欧美日韩高清在线一区| 亚洲网站视频福利| 久久免费视频网| 亚洲第一综合天堂另类专| 亚洲色图在线视频| 国产日本欧美一区二区| 亚洲国产另类 国产精品国产免费| 免费的成人av| 在线一区二区日韩| 久久夜色精品一区| 亚洲免费黄色| 久久久999精品| 亚洲毛片在线| 久久久久一区| 亚洲美女毛片| 久久精品国产精品亚洲综合 | 99视频精品免费观看| 久久精品国产99国产精品澳门| 亚洲国产你懂的| 午夜性色一区二区三区免费视频| 激情综合亚洲| 亚洲欧美日韩精品久久奇米色影视| 国产一区二区三区自拍| 一区二区三欧美| 激情久久影院| 亚洲制服丝袜在线| 亚洲第一偷拍| 欧美在线视频免费| 亚洲欧洲精品一区| 久久久www成人免费毛片麻豆| 亚洲精品欧美精品| 久久精品卡一| 一区二区高清| 免费一级欧美在线大片| 亚洲女人天堂av| 欧美精品v国产精品v日韩精品| 亚洲欧美久久久久一区二区三区| 欧美aaa级| 欧美一级二区| 欧美体内she精视频| 亚洲欧洲精品一区二区精品久久久| 国产精品视频一区二区三区| 久久国产精品久久国产精品| 久久国产毛片| 亚洲精品欧美精品| 久久久久久夜| 亚洲视频久久| 欧美精品成人一区二区在线观看| 欧美亚洲视频一区二区| 欧美日韩在线免费观看|