- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
下面的源码只是图形模式的。文本模式的源码请看附件。- %define SCRWIDTH 320 ;屏幕横向分辨率
- %define SCRHEIGHT 200 ;屏幕纵向分辨率
- %define DIAMONDSIZE 50 ;菱形的“半径”
- %define TURNSPEED 0.001 ;每帧转动弧度,必须为浮点数
- start:
- mov ax,0x13 ;功能0,模式0x13:图形模式,256色,320x200分辨率
- int 0x10 ;进入图形模式
- xor ax,ax ;改写中断向量表
- mov ds,ax
- cli
- mov word[0x1C*4],TimerINT ;新的时钟中断
- mov [0x1C*4+2],cs
- sti
- mov ax,cs
- mov ds,ax
- mov ax,0xA000 ;显存
- mov es,ax
- finit ;初始化FPU
- Show: ;开始单帧渲染
- ;hlt ;等待一次中断。hlt会引起DOSBOX异常
- fwait
- ;取得时间
- mov al,0x06 ;中断计时器值以便于读取
- out 0x43,al
- in al,0x40 ;读取计时器低位
- mov ah,al
- in al,0x40 ;读取计时器高位
- xchg ah,al ;交换高低位
- not ax ;得到计时器时钟数
- mov [Time.Low],ax
- fild qword[Time] ;读时钟计数
- fcom qword[Time.Old] ;比较旧的时间值
- fstsw ax
- fwait
- sahf
- ja .TimeOK ;当新取得的时钟计数比旧的低时,更正时钟计数
- inc dword[cs:Time.High]
- fst st0
- fild qword[Time] ;重新加载正确的时间
- fwait
- .TimeOK:
- fst qword[Time.Old] ;将已经算出的时间存储起来,用于下一轮比较
- fmul qword[C_SPEED] ;转动速度
- fdiv qword[CrystalFreq] ;晶振频率
- ;得到角度
- fld st0 ;复制“角度”
- fcos ;求“角度”余弦
- fst qword[Matrix.X_X] ;一个存到矩阵的X_X
- fstp qword[Matrix.Y_Y] ;一个存到矩阵的Y_Y
- fsin ;求“角度”正弦
- fst qword[Matrix.X_Y] ;存到矩阵的X_Y
- fchs ;求反
- fstp qword[Matrix.Y_X] ;存到矩阵的Y_X
- fild dword[C_HALFSCRHEIGHT]
- fchs ;Y
- mov cx,SCRHEIGHT
- xor di,di
- .VLoop:
- fwait ;等FPU处理好
- fld1
- fadd ;Y+=1.0;
- fild dword[C_HALFSCRWIDTH]
- fchs ;X
- push cx
- mov cx,SCRWIDTH
- .HLoop:
- fld1
- fadd ;X+=1.0;
- fld st1
- fmul qword[Matrix.X_Y]
- fld st1
- fmul qword[Matrix.X_X]
- fadd
- fabs ;NewX=(X*m11+Y*m12)
- fistp dword[NewX]
-
- fld st1
- fmul qword[Matrix.Y_Y]
- fld st1
- fmul qword[Matrix.Y_X]
- fadd
- fabs ;NewY=(X*m21+Y*m22)
- fistp dword[NewY]
- fwait ;等FPU处理好
- xor al,al
- cmp dword[NewX],DIAMONDSIZE
- ja .OutOfStupidDiamond
- cmp dword[NewY],DIAMONDSIZE
- ja .OutOfStupidDiamond
- mov al,[NewX]
- add al,[NewY] ;AL为颜色值,设置AL为调色板颜色
- .OutOfStupidDiamond:
- stosb ;输出一个像素
- loop .HLoop
- pop cx
- fstp st0 ;保护浮点堆栈
- loop .VLoop
- fstp st0 ;保护浮点堆栈
- jmp Show
- NewX dd 0
- NewY dd 0
- C_HALFSCRWIDTH dd SCRWIDTH/2
- C_HALFSCRHEIGHT dd SCRHEIGHT/2
- C_SPEED dq TURNSPEED
- Matrix: ;旋转变换矩阵
- .X_X dq 1.0 ;矩阵X轴
- .X_Y dq 0.0
- .Y_X dq 0.0 ;矩阵Y轴
- .Y_Y dq 1.0
- Time:
- .Low dw 0 ;时间
- .High dd 0 ;时钟中断计数
- .Top dw 0 ;8字节对齐
- .Old dq 0 ;旧的时间
- CrystalFreq dq 1193.182
- TimerINT:
- inc dword[cs:Time.High]
- iret
复制代码 完整源码和编译器,回复后可见。 |
|