VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 13701|回复: 40

VBProFan原创作品开源展示之六:用VB实现机器语言

[复制链接]
 楼主| 发表于 2007-4-5 20:23:56 | 显示全部楼层 |阅读模式
8098单片机模拟器,大三学习单片机时为了在宿舍也能体验单片机的乐趣而编写的,以下是我当年写的帮助文件的一部分,这三年来都没更新过,所以还可以继续使用

(一)功能与用途:

1.本系统模拟我学院实验室的8098单片机仿真器,支持24条指令(ADD指令支持6种寻址方式,其余指令支持1~2种寻址方式。本来共有329种指令/寻址方式,但由于时间仓促,因此没编完)

2.使用本系统可以在PC机上完成周惠君老师编写的《8098单片机实验指导书》的前2个实验。
3. 使用本系统可以使同学们有更多的实践机会,不用跋山涉水去实验室,坐在宿舍就可享受学习98单片机指令系统的乐趣。


(二)使用方法:
按键布局与功能与我学院实验室的8098单片机仿真器相同,快捷键如下:(数字键不区分大小键盘,字母键不区分大小写)
0~9,A~F:  0~9,A~F
MEM:      M
REG:      R
F1/LAST:  F1或L
NEXT:     N
EXEC:     X
STEP:     S
MON:      O

[ 本帖最后由 VBProFan 于 2007-4-5 20:47 编辑 ]

8098.rar

31.43 KB, 下载次数: 672

8098源码.rar

11.93 KB, 阅读权限: 80, 下载次数: 58

评分

参与人数 1威望 +8 收起 理由
DreamonII + 8 精品文章

查看全部评分

发表于 2007-4-5 20:32:45 | 显示全部楼层
沙发。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-5 22:47:45 | 显示全部楼层

板凳

实现机器指令部分的源码:

  1. Public Sub PUSH(ByVal AddrMode As udtAddressMode, _
  2.        Optional ByVal ImmLReg As Byte, _
  3.        Optional ByVal ImmH As Byte)

  4.   Dim test1 As Integer
  5.   Dim test2 As Integer
  6.   Dim SP As Integer
  7.   
  8.   SP = Byte2Word(Reg(&H19), Reg(&H18))
  9.   Select Case AddrMode
  10.     Case amDirect
  11.       SP = IIf(SP = -32768, 32767, SP - 1)
  12.       Call ChgMem(SP, Reg(ImmLReg + 1))
  13.       SP = IIf(SP = -32768, 32767, SP - 1)
  14.       Call ChgMem(SP, Reg(ImmLReg))
  15.       PC = PC + 2
  16.     Case amImmediate
  17.       SP = IIf(SP = -32768, 32767, SP - 1)
  18.       Call ChgMem(SP, ImmH)
  19.       SP = IIf(SP = -32768, 32767, SP - 1)
  20.       Call ChgMem(SP, ImmLReg)
  21.       PC = PC + 3
  22.   End Select
  23.   
  24.   '-------- SP = SP - 2 --------------
  25.   test1 = Reg(&H18) - 2
  26.   If test1 >= 0 Then
  27.     Call ChgReg(&H18, test1)
  28.   Else
  29.     test2 = Reg(&H19) - 1
  30.     If test2 < 0 Then test2 = 255
  31.     Call ChgReg(&H19, test2)
  32.     Call ChgReg(&H18, test1 + 255)
  33.   End If
  34. End Sub
  35. Public Sub POP(ByVal AddrMode As udtAddressMode, _
  36.                ByVal RegD As Byte)
  37.   Dim test1 As Integer
  38.   Dim test2 As Integer
  39.   Dim SP As Integer
  40.   Dim Re
  41.   Select Case AddrMode
  42.     Case amDirect
  43.       PC = PC + 2
  44.       SP = Byte2Word(Reg(&H19), Reg(&H18))
  45.       Call ChgReg(RegD, Mem(SP))
  46.       SP = IIf(SP = 32767, -32768, SP + 1)
  47.       Call ChgReg(RegD + 1, Mem(SP))
  48.      
  49.       '-------- SP = SP + 2 --------------
  50.       test1 = Reg(&H18) + 2
  51.       If test1 <= 255 Then
  52.         Call ChgReg(&H18, test1)
  53.       Else
  54.         test2 = Reg(&H19) + 1
  55.         If test2 > 255 Then test2 = 0
  56.         Call ChgReg(&H19, test2)
  57.         Call ChgReg(&H18, test1 - 255)
  58.       End If
  59.   End Select
  60. End Sub
  61. Public Sub LD(ByVal AddrMode As udtAddressMode, _
  62.               ByVal RegD As Byte, _
  63.      Optional ByVal RegS As Byte, _
  64.      Optional ByVal ImmVarL As Integer, _
  65.      Optional ByVal VarH As Byte)
  66.      
  67.   Dim s As String
  68.   
  69.   Select Case AddrMode
  70.     Case amDirect
  71.       Call ChgReg(RegD, Reg(RegS))
  72.       Call ChgReg(RegD + 1, Reg(RegS + 1))
  73.       PC = PC + 3
  74.     Case amImmediate
  75.       s = Dec2Hex(ImmVarL)
  76.       Call ChgReg(RegD, Hex2Dec(Right(s, 2), True))
  77.       Call ChgReg(RegD + 1, Hex2Dec(Left(s, 2), True))
  78.       PC = PC + 4
  79.   End Select
  80. End Sub
  81. Public Sub LDB(ByVal AddrMode As udtAddressMode, _
  82.                ByVal RegD As Byte, _
  83.       Optional ByVal RegS As Byte, _
  84.       Optional ByVal Imm As Byte)
  85.       
  86.   Select Case AddrMode
  87.     Case amDirect
  88.     Case amImmediate
  89.       Call ChgReg(RegD, Imm)
  90.     Case amIndirect
  91.     Case amLongVarAddr
  92.     Case amShortVarAddr
  93.   End Select
  94.   PC = PC + 3
  95. End Sub
  96. Public Sub ST(ByVal AddrMode As udtAddressMode, _
  97.               ByVal RegS As Byte, _
  98.               ByVal RegD As Byte)
  99.                  
  100.   Dim addr As Integer
  101.   
  102.   Select Case AddrMode
  103.     Case amIndirect
  104.       addr = Byte2Word(Reg(RegD + 1), Reg(RegD))
  105.       Call ChgMem(addr, Reg(RegS))
  106.       Call ChgMem(addr + 1, Reg(RegS + 1))
  107.       PC = PC + 3
  108.   End Select
  109. End Sub
  110. Public Sub STB(ByVal AddrMode As udtAddressMode, _
  111.                ByVal RegD As Byte, _
  112.                ByVal RegS1 As Byte, _
  113.                ByVal RegS2 As Byte)
  114.                
  115. End Sub


  116. Public Sub ADD(ByVal AddrMode As udtAddressMode, _
  117.                ByVal RegD As Byte, _
  118.       Optional ByVal RegS1 As Byte, _
  119.       Optional ByVal RegS2 As Byte, _
  120.       Optional ByVal ImmVarH As Byte, _
  121.       Optional ByVal ImmVarL As Byte)
  122.   Dim ans As Long
  123.   Dim ansL As Integer
  124.   Dim ansH As Integer
  125.   Dim opn1L As Integer
  126.   Dim opn1H As Integer
  127.   Dim opn2L As Integer
  128.   Dim opn2H As Integer
  129.   Dim addr As Integer
  130.   Dim VAddr As Integer
  131.   
  132.   Select Case AddrMode
  133.     Case amDirect
  134.       opn1L = Reg(RegS1)
  135.       opn1H = Reg(RegS1 + 1)
  136.       opn2L = Reg(RegS2)
  137.       opn2H = Reg(RegS2 + 1)
  138.       PC = PC + 4
  139.     Case amImmediate
  140.       opn1L = Reg(RegS1)
  141.       opn1H = Reg(RegS1 + 1)
  142.       opn2L = ImmVarL
  143.       opn2H = ImmVarH
  144.       PC = PC + 5
  145.     Case amIndirect
  146.       opn1L = Reg(RegS1)
  147.       opn1H = Reg(RegS1 + 1)
  148.       addr = Byte2Word(Reg(RegS2 + 1), Reg(RegS2))
  149.       opn2L = Mem(addr)
  150.       opn2H = Mem(IIf(addr = 32767, -32768, addr + 1))
  151.       PC = PC + 4
  152.     Case amShortVarAddr
  153.       opn1L = Reg(RegS1)
  154.       opn1H = Reg(RegS1 + 1)
  155.       addr = Byte2Word(Reg(RegS2 + 1), Reg(RegS2))
  156.       VAddr = ImmVarL
  157.       addr = addr + IIf(CLng(addr) + VAddr <= 32767, VAddr, VAddr - 32768)
  158.       opn2L = Mem(addr)
  159.       opn2H = Mem(IIf(addr = 32767, -32768, addr + 1))
  160.       PC = PC + 5
  161.     Case amLongVarAddr
  162.       opn1L = Reg(RegS1)
  163.       opn1H = Reg(RegS1 + 1)
  164.       addr = Byte2Word(Reg(RegS2 + 1), Reg(RegS2))
  165.       VAddr = Byte2Word(ImmVarH, ImmVarL) + 32768
  166.       addr = addr + IIf(CLng(addr) + VAddr <= 32767, VAddr, CLng(VAddr) - 32768)
  167.       opn2L = Mem(addr)
  168.       opn2H = Mem(IIf(addr = 32767, -32768, addr + 1))
  169.       PC = PC + 6
  170.   End Select
  171.   
  172.   ansL = opn1L + opn2L
  173.   ansH = opn1H + opn2H
  174.   If ansL > 255 Then
  175.     ansL = ansL - 256
  176.     ansH = ansH + 1
  177.   End If
  178.   ans = ansH * CLng(256) + ansL
  179.   Call SetPSW(ans, , True, opn1H, opn2H)
  180.   Call ChgReg(RegD + 1, ans \ &H100)
  181.   Call ChgReg(RegD, ans Mod &H100)
  182. End Sub
  183. Public Sub ADDB(ByVal AddrMode As udtAddressMode, _
  184.                 ByVal RegD As Byte, _
  185.        Optional ByVal RegS1 As Byte, _
  186.        Optional ByVal RegS2 As Byte, _
  187.        Optional ByVal ImmVarL As Byte, _
  188.        Optional ByVal VarH As Byte)
  189.   Dim ans As Long
  190.   
  191.   Select Case AddrMode
  192.     Case amDirect
  193.       ans = CInt(Reg(RegS1)) + Reg(RegS2)
  194.     Case amImmediate
  195.       ans = Reg(RegS1) + ImmVarL
  196.     Case amIndirect
  197.     Case amLongVarAddr
  198.     Case amShortVarAddr
  199.   End Select

  200.   Call SetPSW(ans, True)
  201.   Call ChgReg(RegD, ans)
  202.   PC = PC + 4
  203. End Sub

  204. Public Sub CMPB(ByVal AddrMode As udtAddressMode, _
  205.                 ByVal RegD As Byte, _
  206.        Optional ByVal ImmVarL As Byte, _
  207.        Optional ByVal VarH As Byte)
  208.   
  209.   Select Case AddrMode
  210.     Case amDirect
  211.     Case amImmediate
  212.       PSW(15) = (Reg(RegD) = ImmVarL)
  213.       PC = PC + 3
  214.     Case amIndirect
  215.     Case amLongVarAddr
  216.     Case amShortVarAddr
  217.   End Select
  218. End Sub

  219. Public Sub DI()
  220.   PSW(9) = False
  221.   PC = PC + 1
  222. End Sub

  223. Public Sub EI()
  224.   PSW(9) = True
  225.   PC = PC + 1
  226. End Sub

  227. Public Sub CLRB(ByVal RegD As Byte)
  228.   Call ChgReg(RegD, 0)
  229.   PC = PC + 2
  230. End Sub

  231. Public Sub JNE(ByVal RelAddr As Byte)
  232.   PC = PC + 2
  233.   If PSW(15) = False Then
  234.     PC = PC + RelAddr - IIf(RelAddr <= &H7F, 0, 256)
  235.   End If
  236. End Sub

  237. Public Sub JE(ByVal RelAddr As Byte)
  238.   PC = PC + 2
  239.   If PSW(15) Then
  240.     PC = PC + RelAddr - IIf(RelAddr <= &H7F, 0, 256)
  241.   End If
  242. End Sub

  243. Public Sub NOP()
  244.   PC = PC + 1
  245. End Sub

  246. Public Sub SKIP()
  247.   PC = PC + 2
  248. End Sub

  249. Public Sub INCB(ByVal RegD As Byte)
  250.   Call ADDB(amImmediate, RegD, RegD, , 1)
  251.   PC = PC - 2
  252. End Sub

  253. Public Sub RET()
  254.   Dim PC_L As Byte
  255.   Dim PC_H As Byte
  256.   Dim SP As Integer
  257.   
  258.   SP = Byte2Word(Reg(&H19), Reg(&H18))
  259.   
  260.   PC_L = Mem(SP)
  261.   SP = IIf(SP = 32767, -32768, SP + 1)
  262.   PC_H = Mem(SP)
  263.   PC = Byte2Word(PC_H, PC_L)
  264. End Sub
  265. Public Sub ItpInstru(Optional ByRef bRet As Boolean = False) 'Interpret Instruction
  266.   Dim i As Byte
  267.   Dim m(0 To 7) As Byte
  268.   Dim VPC As Integer
  269.   
  270.   VPC = PC
  271.   
  272.   For i = 0 To 7
  273.     m(i) = Mem(VPC)
  274.     VPC = IIf(VPC = 32767, -32768, VPC + 1)
  275.   Next i
  276.   
  277.   Select Case m(0)
  278.     Case &HA0
  279.       Call LD(amDirect, m(2), m(1))
  280.     Case &HA1 'LD 20H,#1234H
  281.       Call LD(amImmediate, m(3), , Byte2Word(m(2), m(1)))
  282.     Case &H44 'ADD 24H,20H,22H
  283.       Call ADD(amDirect, m(3), m(2), m(1))
  284.     Case &H45 'ADD AX,BX,#1234H
  285.       Call ADD(amImmediate, m(4), m(3), , m(2), m(1))
  286.     Case &H46 'ADD AX,BX,[CX]
  287.       If m(1) Mod 2 = 0 Then
  288.         Call ADD(amIndirect, m(3), m(2), m(1))
  289.       Else
  290.          m(1) = m(1) - 1
  291.         Call ADD(amIndirect, m(3), m(2), m(1))
  292.         If Reg(m(1)) <= 253 Then
  293.           Call ChgReg(m(1), Reg(m(1)) + 2)
  294.         Else
  295.           Call ChgReg(m(1), Reg(m(1)) - 254)
  296.           Call ChgReg(m(1) + 1, IIf(Reg(m(1) + 1) <= 254, Reg(m(1) + 1) + 1, Reg(m(1) + 1) - 255))
  297.         End If
  298.       End If
  299.     Case &H47
  300.       If m(1) Mod 2 = 0 Then
  301.         Call ADD(amShortVarAddr, m(4), m(3), m(1), , m(2))
  302.       Else
  303.         m(1) = m(1) - 1
  304.         Call ADD(amLongVarAddr, m(5), m(4), m(1), m(3), m(2))
  305.       End If
  306.     Case &HB1 'LDB 30H,#62H
  307.       Call LDB(amImmediate, m(2), , m(1))
  308.     Case &H54 'ADDB 32H,30H,31H
  309.       Call ADDB(amDirect, m(3), m(2), m(1))
  310.     Case &H55
  311.       Call ADDB(amImmediate, m(3), m(2), , m(1))
  312.     Case &H11
  313.       Call CLRB(m(1))
  314.     Case &HFA
  315.       Call DI
  316.     Case &HFB
  317.       Call EI
  318.     Case &H99
  319.       Call CMPB(amImmediate, m(2), m(1))
  320.     Case &HFD
  321.       Call NOP
  322.     Case &H0
  323.       Call SKIP
  324.     Case &HD7
  325.       Call JNE(m(1))
  326.     Case &HDF
  327.       Call JE(m(1))
  328.     Case &H17
  329.       Call INCB(m(1))
  330.     Case &HC8
  331.       Call PUSH(amDirect, m(1))
  332.     Case &HC9
  333.       Call PUSH(amImmediate, m(2), m(1))
  334.     Case &HCC
  335.       Call POP(amDirect, m(1))
  336.     Case &HC2
  337.       If m(1) Mod 2 = 0 Then
  338.         Call ST(amIndirect, m(2), m(1))
  339.       Else
  340.         m(1) = m(1) - 1
  341.         Call ST(amIndirect, m(2), m(1))
  342.         If Reg(m(1)) <= 253 Then
  343.           Call ChgReg(m(1), Reg(m(1)) + 2)
  344.         Else
  345.           Call ChgReg(m(1), Reg(m(1)) - 254)
  346.           Call ChgReg(m(1) + 1, IIf(Reg(m(1) + 1) <= 254, Reg(m(1) + 1) + 1, Reg(m(1) + 1) - 255))
  347.         End If
  348.       End If
  349.     Case &HF0
  350.       Call RET
  351.       bRet = True
  352.   End Select
  353. End Sub
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-25 11:14:14 | 显示全部楼层
顶一下

不过这样子顶貌似灌水,不行,得找个冠冕堂皇的理由。。。

可是找什么理由好呢?哎,算了,就以“让后面来的人学习学习,同时刺激大家的灌水热情,为繁荣论坛做贡献”为理由吧~!
回复 支持 反对

使用道具 举报

发表于 2007-9-25 13:20:42 | 显示全部楼层
这么好的贴子顶起来怎么能算灌水呢~!!!
加分支持!
完成的代码也发上来啊!!

不过楼主发附件总限制权限很不爽~~
正在研究如何破解中!!!

http://www.vbgood.com/attachments/month_0704/......rar ...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-27 12:04:38 | 显示全部楼层

回复 #5 DreamonII 的帖子

你的升级剩余时间是三小时,与其去研究破解,还不如挂VBGood三小时

当然,如果你认为世界上最大的快乐莫过于破解,当我没说
回复 支持 反对

使用道具 举报

发表于 2007-9-27 12:13:51 | 显示全部楼层
挂 VBGood 30小时 也没用。这个“升级剩余时间”有点怪怪的,要升级好多次才能加分,而且他也一下子加不到2000。阅读权限仍然40。
回复 支持 反对

使用道具 举报

发表于 2007-9-27 16:08:11 | 显示全部楼层
原帖由 YaDa 于 2007-9-27 12:13 发表
挂 VBGood 30小时 也没用。这个“升级剩余时间”有点怪怪的,要升级好多次才能加分,而且他也一下子加不到2000。阅读权限仍然40。

那我不是很郁闷~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-27 16:18:59 | 显示全部楼层

回复 #7 YaDa 的帖子

那是因为vbgood会缓存数据,不信你现在去看一下,他的升级剩余时间已经是2小时啦~~
回复 支持 反对

使用道具 举报

发表于 2007-9-27 16:26:47 | 显示全部楼层
升级剩余时间是从20开始的,就算20用光了,按照10分/小时计算,才200分。他现在1415,也才1615,还得升2次才能超过2000。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2019-8-18 10:31

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表