Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Function read86(ByVal addr32 as UInteger) as UInteger
  2. If addr32 > 1048575 Or addr32 < 0 Then Exit Function
  3. read86 = RAM(addr32)
  4. End Function
  5.  
  6. Sub write86(ByVal addr32 as UInteger, ByVal value As Integer)
  7. If addr32 > 1048575 Or addr32 < 0 Then Exit Sub
  8. If ReadOnly(addr32) = 1 Then Exit Sub
  9. If addr32 >= videobase And addr32 < videobase + cols * 2 * rows Then UpdatedScreen = 1
  10. RAM(addr32) = value
  11. End Sub
  12.  
  13. Function signed16(ByVal value as UInteger) as LongInt
  14. If (value And &H8000&) = &H8000& Then value = -1 - ((Not value) And 65535)
  15. signed16 = value
  16. End Function
  17.  
  18. Function signed8(ByVal value as UInteger) as LongInt
  19. If (value And 128) = 128 Then value = -1 - ((Not value) And 255)
  20. signed8 = value
  21. End Function
  22.  
  23. Function getmem16(ByVal segment as UInteger, ByVal offset as UInteger) as UInteger
  24. Dim tempval as ULong
  25. tempval = read86((segment * 16) + offset + 1) * 256
  26. getmem16 = tempval + read86((segment * 16) + offset)
  27. End Function
  28.  
  29. Function getmem8(ByVal segment as UInteger, ByVal offset as UInteger) as UInteger
  30. Dim temp8 As UInteger
  31. temp8 = read86((segment * 16) + offset)
  32. 'If (temp8 And &h80&) Then temp8 = temp8 Or &hFF00
  33. getmem8 = temp8
  34. End Function
  35.  
  36. Sub putmem16(ByVal segment as UInteger, ByVal offset as UInteger, ByVal value as UInteger)
  37. Dim tempval as ULong
  38. tempval = (segment * 16) + offset
  39. write86 tempval, value And 255
  40. write86 tempval + 1, (value \ 256) And 255 'And 65280) / 256
  41. End Sub
  42.  
  43. Function getreg16(ByVal regnum As Byte) as UShort
  44. Select Case regnum
  45.     Case ax
  46.         getreg16 = (ah * 256) + al
  47.     Case cx
  48.         getreg16 = (ch * 256) + cl
  49.     Case dx
  50.         getreg16 = (dh * 256) + dl
  51.     Case bx
  52.         getreg16 = (bh * 256) + bl
  53.     Case 4: getreg16 = sp
  54.     Case 5: getreg16 = bp
  55.     Case 6: getreg16 = si
  56.     Case 7: getreg16 = di
  57. End Select
  58. End Function
  59.  
  60. Sub putreg16(ByVal regnum As Byte, ByVal value as UShort)
  61. Select Case regnum
  62.     Case ax
  63.         al = value And 255: ah = (value \ 256) And 255
  64.     Case cx
  65.         cl = value And 255: ch = (value \ 256) And 255
  66.     Case dx
  67.         dl = value And 255: dh = (value \ 256) And 255
  68.     Case bx
  69.         bl = value And 255: bh = (value \ 256) And 255
  70.     Case 4: sp = value And 65535
  71.     Case 5: bp = value And 65535
  72.     Case 6: si = value And 65535
  73.     Case 7: di = value And 65535
  74. End Select
  75. End Sub
  76.  
  77. Sub putreg8(ByVal regnum As Byte, ByVal value as UInteger)
  78. Select Case regnum
  79.     Case 0: al = value And 255
  80.     Case 1: cl = value And 255
  81.     Case 2: dl = value And 255
  82.     Case 3: bl = value And 255
  83.     Case 4: ah = value And 255
  84.     Case 5: ch = value And 255
  85.     Case 6: dh = value And 255
  86.     Case 7: bh = value And 255
  87. End Select
  88. End Sub
  89.  
  90. Function getreg8(ByVal regnum As Byte) as UInteger
  91. Select Case regnum
  92.     Case 0: getreg8 = al And 255
  93.     Case 1: getreg8 = cl And 255
  94.     Case 2: getreg8 = dl And 255
  95.     Case 3: getreg8 = bl And 255
  96.     Case 4: getreg8 = ah And 255
  97.     Case 5: getreg8 = ch And 255
  98.     Case 6: getreg8 = dh And 255
  99.     Case 7: getreg8 = bh And 255
  100. End Select
  101. End Function
  102.  
  103. Sub putsegreg(ByVal regnum As Byte, ByVal value as UInteger)
  104. Select Case regnum
  105.     Case 0
  106.         es = value
  107.     Case 1
  108.         cs = value
  109.     Case 2
  110.         ss = value
  111.     Case 3
  112.         ds = value
  113. End Select
  114. End Sub
  115.  
  116. Function getsegreg(ByVal regnum As Byte) as UInteger
  117. Select Case regnum
  118.     Case 0
  119.         getsegreg = es
  120.     Case 1
  121.         getsegreg = cs
  122.     Case 2
  123.         getsegreg = ss
  124.     Case 3
  125.         getsegreg = ds
  126. End Select
  127. End Function
  128.  
  129. Sub StepIP(stepcount As Byte)
  130. ip = (ip + stepcount) And 65535
  131. End Sub
  132.  
  133. Sub push(ByVal pushval as UInteger)
  134. pushval = pushval And 65535
  135. If TraceLog = 1 Then Print #2, "Pushed " + Hex$(pushval)
  136. If hitbasic = 1 Then Print "Pushed " + Hex$(pushval)
  137. sp = (sp - 2) And 65535
  138. If sp < 0 Then sp = 65536 + sp
  139. putmem16 ss, sp, pushval And 65535
  140. End Sub
  141.  
  142. Function pop() as UInteger
  143. pop = getmem16(ss, sp) And 65535
  144. If TraceLog = 1 Then Print #2, "Popped " + Hex$(pop)
  145. If hitbasic = 1 Then Print "Popped " + Hex$(getmem16(ss, sp))
  146. sp = (sp + 2) And 65535
  147. End Function
  148.  
  149. Sub modregrm()
  150.     temp1 = getmem8(cs, ip): StepIP 1
  151.     mode = temp1 \ 64
  152.     reg = (temp1 \ 8) And 7
  153.     rm = temp1 And 7
  154.     Disp = 0
  155.     Select Case mode
  156.         Case 0
  157.             If rm = 6 Then Disp = getmem16(cs, ip): StepIP 2 'If opcode <> &H88 Then Disp = getmem16(cs, ip): StepIP 2 Else Disp = getmem8(cs, ip): StepIP 1
  158.            If ((rm = 2) Or (rm = 3)) And (segoverride = 0) Then useseg = ss
  159.         Case 1
  160.             Disp = signed8(getmem8(cs, ip)): StepIP 1
  161.             'If (Disp And 128) = 128 Then Disp = Disp + 65280
  162.            If ((rm = 2) Or (rm = 3) Or (rm = 6)) And (segoverride = 0) Then useseg = ss
  163.         Case 2
  164.             Disp = signed16(getmem16(cs, ip)): StepIP 2
  165.             If ((rm = 2) Or (rm = 3) Or (rm = 6)) And (segoverride = 0) Then useseg = ss
  166.     End Select
  167.     If hitbasic = 1 Then
  168.        Print " Mode:" + Str$(mode)
  169.        Print "  Reg:" + Str$(reg)
  170.        Print "   RM:" + Str$(rm)
  171.        If mode < 3 Then
  172.             Print "   EA: " + Hex$(getea(rm))
  173.        EndIf
  174.     End If
  175. End Sub
  176.  
  177. Function getea(ByVal rmval as UInteger) as UInteger
  178. temp1 = 0
  179. Select Case mode
  180.     Case 0
  181.         Select Case rmval
  182.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
  183.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
  184.             Case 2: temp1 = (useseg * 16) + bp + si
  185.             Case 3: temp1 = (useseg * 16) + bp + di
  186.             Case 4: temp1 = (useseg * 16) + si
  187.             Case 5: temp1 = (useseg * 16) + di
  188.             Case 6: temp1 = (useseg * 16) + Disp
  189.             Case 7: temp1 = (useseg * 16) + getreg16(bx)
  190.         End Select
  191.     Case 1, 2
  192.         Select Case rmval
  193.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
  194.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
  195.             Case 2: temp1 = (useseg * 16) + bp + si + Disp
  196.             Case 3: temp1 = (useseg * 16) + bp + di + Disp
  197.             Case 4: temp1 = (useseg * 16) + si + Disp
  198.             Case 5: temp1 = (useseg * 16) + di + Disp
  199.             Case 6: temp1 = (useseg * 16) + bp + Disp
  200.             Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
  201.         End Select
  202.     Case 3
  203.         'readrm16 = getreg16(rmval)
  204.        Exit Function
  205. End Select
  206. getea = temp1
  207. End Function
  208.  
  209. Function readrm16(ByVal rmval as UInteger) as UInteger
  210. temp1 = 0
  211. Select Case mode
  212.     Case 0
  213.         Select Case rmval
  214.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
  215.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
  216.             Case 2: temp1 = (useseg * 16) + bp + si
  217.             Case 3: temp1 = (useseg * 16) + bp + di
  218.             Case 4: temp1 = (useseg * 16) + si
  219.             Case 5: temp1 = (useseg * 16) + di
  220.             Case 6: temp1 = (useseg * 16) + Disp
  221.             Case 7: temp1 = (useseg * 16) + getreg16(bx)
  222.         End Select
  223.     Case 1, 2
  224.         Select Case rmval
  225.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
  226.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
  227.             Case 2: temp1 = (useseg * 16) + bp + si + Disp
  228.             Case 3: temp1 = (useseg * 16) + bp + di + Disp
  229.             Case 4: temp1 = (useseg * 16) + si + Disp
  230.             Case 5: temp1 = (useseg * 16) + di + Disp
  231.             Case 6: temp1 = (useseg * 16) + bp + Disp
  232.             Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
  233.         End Select
  234.     Case 3
  235.         readrm16 = getreg16(rmval)
  236.         Exit Function
  237. End Select
  238. readrm16 = (read86(temp1 + 1) * 256) + read86(temp1)
  239. End Function
  240.  
  241. Sub writerm16(ByVal rmval as UInteger, ByVal value as UInteger)
  242. temp1 = 0
  243. Select Case mode
  244.     Case 0
  245.         Select Case rmval
  246.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
  247.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
  248.             Case 2: temp1 = (useseg * 16) + bp + si
  249.             Case 3: temp1 = (useseg * 16) + bp + di
  250.             Case 4: temp1 = (useseg * 16) + si
  251.             Case 5: temp1 = (useseg * 16) + di
  252.             Case 6: temp1 = (useseg * 16) + Disp
  253.             Case 7: temp1 = (useseg * 16) + getreg16(bx)
  254.         End Select
  255.     Case 1, 2
  256.         Select Case rmval
  257.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
  258.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
  259.             Case 2: temp1 = (useseg * 16) + bp + si + Disp
  260.             Case 3: temp1 = (useseg * 16) + bp + di + Disp
  261.             Case 4: temp1 = (useseg * 16) + si + Disp
  262.             Case 5: temp1 = (useseg * 16) + di + Disp
  263.             Case 6: temp1 = (useseg * 16) + bp + Disp
  264.             Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
  265.         End Select
  266.     Case 3
  267.         putreg16 rmval, value
  268.         Exit Sub
  269. End Select
  270. write86 temp1, value And 255
  271. write86 temp1 + 1, value \ 256
  272. End Sub
  273.  
  274. Function readrm8(ByVal rmval as UInteger) as UInteger
  275. temp1 = 0
  276. Select Case mode
  277.     Case 0
  278.         Select Case rmval
  279.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
  280.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
  281.             Case 2: temp1 = (useseg * 16) + bp + si
  282.             Case 3: temp1 = (useseg * 16) + bp + di
  283.             Case 4: temp1 = (useseg * 16) + si
  284.             Case 5: temp1 = (useseg * 16) + di
  285.             Case 6: temp1 = (useseg * 16) + Disp
  286.             Case 7: temp1 = (useseg * 16) + getreg16(bx)
  287.         End Select
  288.     Case 1, 2
  289.         Select Case rmval
  290.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
  291.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
  292.             Case 2: temp1 = (useseg * 16) + bp + si + Disp
  293.             Case 3: temp1 = (useseg * 16) + bp + di + Disp
  294.             Case 4: temp1 = (useseg * 16) + si + Disp
  295.             Case 5: temp1 = (useseg * 16) + di + Disp
  296.             Case 6: temp1 = (useseg * 16) + bp + Disp
  297.             Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
  298.         End Select
  299.     Case 3
  300.         Select Case rmval
  301.             Case 0: readrm8 = al
  302.             Case 1: readrm8 = cl
  303.             Case 2: readrm8 = dl
  304.             Case 3: readrm8 = bl
  305.             Case 4: readrm8 = ah
  306.             Case 5: readrm8 = ch
  307.             Case 6: readrm8 = dh
  308.             Case 7: readrm8 = bh
  309.         End Select
  310.         Exit Function
  311. End Select
  312. 'If opcode = &H80 Then MsgBox "EA: " + Hex$(useseg) + ":" + Hex$(Disp)
  313. readrm8 = read86(temp1)
  314. 'MsgBox read86(temp1)
  315. End Function
  316.  
  317. Sub writerm8(ByVal rmval as UInteger, ByVal value as UInteger)
  318. value = value And 255
  319. temp1 = 0
  320. Select Case mode
  321.     Case 0
  322.         Select Case rmval
  323.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
  324.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
  325.             Case 2: temp1 = (useseg * 16) + bp + si
  326.             Case 3: temp1 = (useseg * 16) + bp + di
  327.             Case 4: temp1 = (useseg * 16) + si
  328.             Case 5: temp1 = (useseg * 16) + di
  329.             Case 6: temp1 = (useseg * 16) + Disp
  330.             Case 7: temp1 = (useseg * 16) + getreg16(bx)
  331.         End Select
  332.     Case 1, 2
  333.         Select Case rmval
  334.             Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
  335.             Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
  336.             Case 2: temp1 = (useseg * 16) + bp + si + Disp
  337.             Case 3: temp1 = (useseg * 16) + bp + di + Disp
  338.             Case 4: temp1 = (useseg * 16) + si + Disp
  339.             Case 5: temp1 = (useseg * 16) + di + Disp
  340.             Case 6: temp1 = (useseg * 16) + bp + Disp
  341.             Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
  342.         End Select
  343.     Case 3
  344.         Select Case rmval
  345.             Case 0: al = value
  346.             Case 1: cl = value
  347.             Case 2: dl = value
  348.             Case 3: bl = value
  349.             Case 4: ah = value
  350.             Case 5: ch = value
  351.             Case 6: dh = value
  352.             Case 7: bh = value
  353.         End Select
  354.         Exit Sub
  355. End Select
  356. write86 temp1, value
  357. End Sub
  358.  
  359. Sub reljump(ByVal value as UInteger)
  360. ip = ip + signed8(value)
  361. End Sub
  362.  
  363. Function makeflagsword() as UInteger
  364. makeflagsword = cf + 2 + (pf * 4) + (af * 16) + (zf * 64) + (sf * 128) + (tf * 256) + (ifl * 512) + (df * 1024) + (of * 2048)
  365. End Function
  366.  
  367. Sub decodeflagsword(ByVal value as UInteger)
  368. cf = value And 1
  369. If (value And 4) Then pf = 1 Else pf = 0
  370. If (value And 16) Then af = 1 Else af = 0
  371. If (value And 64) Then zf = 1 Else zf = 0
  372. If (value And 128) Then sf = 1 Else sf = 0
  373. If (value And 256) Then tf = 1 Else tf = 0
  374. If (value And 512) Then ifl = 1 Else ifl = 0
  375. If (value And 1024) Then df = 1 Else df = 0
  376. If (value And 2048) Then of = 1 Else of = 0
  377. End Sub
  378.  
  379. Sub reset86()
  380. Dim i as UInteger
  381. For i = 0 To 255
  382.     onescount = 0
  383.     If (i And 128) <> 0 Then onescount = onescount + 1
  384.     If (i And 64) <> 0 Then onescount = onescount + 1
  385.     If (i And 32) <> 0 Then onescount = onescount + 1
  386.     If (i And 16) <> 0 Then onescount = onescount + 1
  387.     If (i And 8) <> 0 Then onescount = onescount + 1
  388.     If (i And 4) <> 0 Then onescount = onescount + 1
  389.     If (i And 2) <> 0 Then onescount = onescount + 1
  390.     If (i And 1) <> 0 Then onescount = onescount + 1
  391.     If (onescount And 1) = 1 Then Parity(i) = 0 Else Parity(i) = 1
  392. Next i
  393.  
  394. 'If Len(Command$) = 0 Then
  395.    Open "xtbios.bin" For Binary As #1
  396. 'Else
  397. '    Open Command$ For Binary As #1
  398. 'End If
  399.  
  400. tempbios$ = Space$(LOF(1)): Get #1, , tempbios$
  401. Close #1
  402.  
  403. For i = 1 To Len(tempbios$)
  404.     RAM(1048575 - Len(tempbios$) + i) = Asc(Mid$(tempbios$, i, 1))
  405.     ReadOnly(1048575 - Len(tempbios$) + i) = 1
  406. Next i
  407.  
  408. If Len(tempbios$) <= 8192 Then 'if the BIOS is 8 KB or less, we have enough room to drop in ROM BASIC
  409.    Open "rombasic.bin" For Binary As #1
  410.     tempbasic$ = Space$(32768): Get #1, , tempbasic$
  411.     Close #1
  412.  
  413.     For i = 1 To 32768
  414.         RAM(&HF5FFF + i) = Asc(Mid$(tempbasic$, i, 1))
  415.         ReadOnly(&HF5FFF + i) = 1
  416.     Next i
  417. End If
  418.  
  419. For i = 0 To 3999 Step 2
  420.     RAM(videobase + i) = 0
  421.     RAM(videobase + i + 1) = 7
  422. Next i
  423.  
  424. cs = &HFFFF&: ip = 0
  425. sp = &HFFFE&
  426. 'cs = &hF000&: ip = &hE000&
  427. 'UpdateUI
  428. End Sub
  429.  
  430. Sub exec86()
  431. Dim mcp as UInteger
  432. Dim DoContinue As Byte
  433. Dim curtimer As Single
  434. curtimer = Timer
  435. If curtimer - lasttimer >= 18.2 Then 'this is crude, but at least it will run the interrupt periodically
  436.     If read86(8*4+2)>0 Then intcall86 8
  437. End If
  438. lasttimer = curtimer
  439.  
  440. For multiexec = 1 To execloops
  441. reptype = 0: DoContinue = 0
  442. useseg = ds: segoverride = 0
  443.  
  444. While (DoContinue = 0)
  445.     'If cs = &hf600& Then hitbasic = 1
  446.    DoContinue = 1
  447.     If execloops > 1 And CheckBreakpoint = 1 Then Running = 0: Exit Sub
  448.     savecs = cs: saveip = ip: opcode = getmem8(cs, ip): StepIP 1
  449.     totalexec = totalexec + 1
  450.     'If dodisasm Then Print Oplist(opcode)+" ";
  451.  
  452.     'segment prefix check
  453.    Select Case opcode
  454.         Case &H2E 'segment CS
  455.            useseg = cs: segoverride = 1: DoContinue = 0
  456.         Case &H3E 'segment DS
  457.            useseg = ds: segoverride = 1: DoContinue = 0
  458.         Case &H26 'segment ES
  459.            useseg = es: segoverride = 1: DoContinue = 0
  460.         Case &H36 'segment SS
  461.            useseg = ss: segoverride = 1: DoContinue = 0
  462.     End Select
  463.  
  464.     'repetition prefix check
  465.    Select Case opcode
  466.         Case &HF3 'REP/REPE/REPZ
  467.            reptype = 1: DoContinue = 0
  468.         Case &HF2 'REPNE/REPNZ
  469.            reptype = 2: DoContinue = 0
  470.     End Select
  471.    
  472.     If TraceLog = 1 Then WriteLogExec
  473.     If hitbasic = 1 Then WriteLogExec
  474. Wend
  475.  
  476.  
  477. Select Case opcode
  478.     Case &H0  '00 ADD Eb Gb
  479.        modregrm
  480.         oper1 = readrm8(rm): oper2 = getreg8(reg)
  481.         op_add 0: writerm8 rm, result
  482.  
  483.     Case &H1  '01 ADD Ev Gv
  484.        modregrm
  485.         oper1 = readrm16(rm): oper2 = getreg16(reg)
  486.         op_add 1: writerm16 rm, result
  487.    
  488.     Case &H2  '02 ADD Gb Eb
  489.        modregrm
  490.         oper1 = getreg8(reg): oper2 = readrm8(rm)
  491.         op_add 0: putreg8 reg, result
  492.    
  493.     Case &H3  '03 ADD Gv Ev
  494.        modregrm
  495.         oper1 = getreg16(reg): oper2 = readrm16(rm)
  496.         op_add 1: putreg16 reg, result
  497.        
  498.     Case &H4  '04 ADD AL Ib
  499.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
  500.         op_add 0: al = result
  501.    
  502.     Case &H5  '05 ADD eAX Iv
  503.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
  504.         op_add 1: putreg16 ax, result
  505.  
  506.     Case &H6  '06 PUSH ES
  507.        push es
  508.    
  509.     Case &H7  '07 POP ES
  510.        es = pop
  511.        
  512.     Case &H8  '08 OR Eb Gb
  513.        modregrm
  514.         oper1 = readrm8(rm): oper2 = getreg8(reg)
  515.         op_or 0: writerm8 rm, result
  516.  
  517.     Case &H9  '09 OR Ev Gv
  518.        modregrm
  519.         oper1 = readrm16(rm): oper2 = getreg16(reg)
  520.         op_or 1: writerm16 rm, result
  521.  
  522.     Case &HA  '0A OR Gb Eb
  523.        modregrm
  524.         oper1 = getreg8(reg): oper2 = readrm8(rm)
  525.         op_or 0: putreg8 reg, result
  526.  
  527.     Case &HB  '0B OR Gv Ev
  528.        modregrm
  529.         oper1 = getreg16(reg): oper2 = readrm16(rm)
  530.         op_or 1: putreg16 reg, result
  531.  
  532.     Case &HC  '0C OR AL Ib
  533.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
  534.         op_or 0: al = result
  535.        
  536.     Case &HD  '0D OR eAX Iv
  537.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
  538.         op_or 1: putreg16 ax, result
  539.        
  540.     Case &HE  '0E PUSH CS
  541.        push cs
  542.    
  543.     Case &HF '0F POP CS
  544.           cs = pop
  545.  
  546.     Case &H10 '10 ADC Eb Gb
  547.        modregrm
  548.         oper1 = readrm8(rm): oper2 = getreg8(reg)
  549.         op_adc 0: writerm8 rm, result
  550.  
  551.     Case &H11 '11 ADC Ev Gv
  552.        modregrm
  553.         oper1 = readrm16(rm): oper2 = getreg16(reg)
  554.         op_adc 1: writerm16 rm, result
  555.  
  556.     Case &H12 '12 ADC Gb Eb
  557.        modregrm
  558.         oper1 = getreg8(reg): oper2 = readrm8(rm)
  559.         op_adc 0: putreg8 reg, result
  560.  
  561.     Case &H13 '13 ADC Gv Ev
  562.        modregrm
  563.         oper1 = getreg16(reg): oper2 = readrm16(rm)
  564.         op_adc 1: putreg16 reg, result
  565.  
  566.     Case &H14 '14 ADC AL Ib
  567.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
  568.         op_adc 0: al = result
  569.  
  570.     Case &H15 '15 ADC eAX Iv
  571.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
  572.         op_adc 1: putreg16 ax, result
  573.  
  574.     Case &H16 '16 PUSH SS
  575.        push ss
  576.        
  577.     Case &H17 '17 POP SS
  578.        ss = pop
  579.        
  580.     Case &H18 '18 SBB Eb Gb
  581.        modregrm
  582.         oper1 = readrm8(rm): oper2 = getreg8(reg)
  583.         op_sbb 0: writerm8 rm, result
  584.        
  585.     Case &H19 '19 SBB Ev Gv
  586.        modregrm
  587.         oper1 = readrm16(rm): oper2 = getreg16(reg)
  588.         op_sbb 1: writerm16 rm, result
  589.        
  590.     Case &H1A '1A SBB Gb Eb
  591.        modregrm
  592.         oper1 = getreg8(reg): oper2 = readrm8(rm)
  593.         op_sbb 0: putreg8 reg, result
  594.        
  595.     Case &H1B '1B SBB Gv Ev
  596.        modregrm
  597.         oper1 = getreg16(reg): oper2 = readrm16(rm)
  598.         op_sbb 1: putreg16 reg, result
  599.        
  600.     Case &H1C '1C SBB AL Ib
  601.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
  602.         op_sbb 0: al = result
  603.  
  604.     Case &H1D '1D SBB eAX Iv
  605.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
  606.         op_sbb 1: putreg16 ax, result
  607.    
  608.     Case &H1E '1E PUSH DS
  609.        push ds
  610.        
  611.     Case &H1F '1F POP DS
  612.        ds = pop
  613.        
  614.     Case &H20 '20 AND Eb Gb
  615.        modregrm
  616.         oper1 = readrm8(rm): oper2 = getreg8(reg)
  617.         op_and 0: writerm8 rm, result
  618.        
  619.     Case &H21 '21 AND Ev Gv
  620.        modregrm
  621.         oper1 = readrm16(rm): oper2 = getreg16(reg)
  622.         op_and 1: writerm16 rm, result
  623.        
  624.     Case &H22 '22 AND Gb Eb
  625.        modregrm
  626.         oper1 = getreg8(reg): oper2 = readrm8(reg)
  627.         op_and 0: putreg8 rm, result
  628.        
  629.     Case &H23 '23 AND Gv Ev
  630.        modregrm
  631.         oper1 = getreg16(reg): oper2 = readrm16(reg)
  632.         op_and 1: putreg16 rm, result
  633.    
  634.     Case &H24 '24 AND AL Ib
  635.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
  636.         op_and 0: al = result
  637.        
  638.     Case &H25 '25 AND eAX Iv
  639.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
  640.         op_and 1: putreg16 ax, result
  641.        
  642.     Case &H27 '27 DAA
  643.        If (al And &HF&) > 9 Or af = 1 Then
  644.             al = al + 6
  645.             If (al And &hFF00&) Then cf = cf Or 1 Else cf = cf Or 0
  646.             af = 1
  647.         Else
  648.                 af = 0
  649.         End If
  650.         If (al And &HF0&) > &H90& Or cf = 1 Then
  651.             al = al + &H60&
  652.             cf = 1
  653.         Else
  654.                 cf = 0
  655.         End If
  656.         flag_szp8 al
  657.        
  658.     Case &H28 '28 SUB Eb Gb
  659.        modregrm
  660.         oper1 = readrm8(rm): oper2 = getreg8(reg)
  661.         op_sub 0: writerm8 rm, result
  662.    
  663.     Case &H29 '29 SUB Ev Gv
  664.        modregrm
  665.         oper1 = readrm16(rm): oper2 = getreg16(reg)
  666.         op_sub 1: writerm16 rm, result
  667.    
  668.     Case &H2A '2A SUB Gb Eb
  669.        modregrm
  670.         oper1 = getreg8(reg): oper2 = readrm8(rm)
  671.         op_sub 0: putreg8 reg, result
  672.    
  673.     Case &H2B '2B SUB Gv Ev
  674.        modregrm
  675.         oper1 = getreg16(reg): oper2 = readrm16(rm)
  676.         op_sub 1: putreg16 reg, result
  677.    
  678.     Case &H2C '2C SUB AL Ib
  679.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
  680.         op_sub 0: al = result
  681.    
  682.     Case &H2D '2D SUB eAX Iv
  683.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
  684.         op_sub 1: putreg16 ax, result
  685.        
  686.     Case &H2F '2F DAS
  687.        If (al And 15) > 9 Or af = 1 Then
  688.             al = al - 6
  689.             If (al And &hFF00&) Then cf = cr Or 1 Else cf = cf Or 0
  690.             af = 1
  691.         Else
  692.                 af = 0
  693.         End If
  694.         If al > &H90& Or cf = 1 Then
  695.             al = al - &H60&
  696.             cf = 1
  697.         Else
  698.                 cf = 0
  699.         End If
  700.         flag_szp8 al
  701.        
  702.     Case &H30 '30 XOR Eb Gb
  703.        modregrm
  704.         oper1 = readrm8(rm): oper2 = getreg8(reg)
  705.         op_xor 0: writerm8 rm, result
  706.  
  707.     Case &H31 '31 XOR Ev Gv
  708.        modregrm
  709.         oper1 = readrm16(rm): oper2 = getreg16(reg)
  710.         op_xor 1: writerm16 rm, result
  711.    
  712.     Case &H32 '32 XOR Gb Eb
  713.        modregrm
  714.         oper1 = getreg8(reg): oper2 = readrm8(rm): op_xor 0
  715.         putreg8 reg, result
  716.  
  717.     Case &H33 '33 XOR Gv Ev
  718.        modregrm
  719.         oper1 = getreg16(reg): oper2 = readrm16(rm): op_xor 1
  720.         putreg16 reg, result
  721.  
  722.     Case &H34 '34 XOR AL Ib
  723.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1: op_xor 0
  724.         al = result
  725.        
  726.     Case &H35 '35 XOR eAX Iv
  727.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
  728.         op_xor 1: putreg16 ax, result
  729.  
  730.     Case &H37 '37 AAA ASCII
  731.        If (al And &HF&) > 9 Or af = 1 Then
  732.             al = al + 6
  733.             ah = ah + 1
  734.             af = 1
  735.             cf = 1
  736.         Else
  737.             af = 0
  738.             cf = 0
  739.         End If
  740.         al = al And &HF&
  741.         'flag_szp8 al
  742.        
  743.     Case &H38 '38 CMP Eb Gb
  744.        modregrm
  745.         oper1 = readrm8(rm): oper2 = getreg8(reg)
  746.         op_cmp 0
  747.    
  748.     Case &H39 '39 CMP Ev Gv
  749.        modregrm
  750.         oper1 = readrm16(rm): oper2 = getreg16(reg)
  751.         op_cmp 1
  752.    
  753.     Case &H3A '3A CMP Gb Eb
  754.        modregrm
  755.         oper1 = getreg8(reg): oper2 = readrm8(rm)
  756.         op_cmp 0
  757.    
  758.     Case &H3B '3B CMP Gv Ev
  759.        modregrm
  760.         oper1 = getreg16(reg): oper2 = readrm16(rm)
  761.         op_cmp 1
  762.    
  763.     Case &H3C '3C CMP AL Ib
  764.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
  765.         If hitbasic = 1 Then Print "imm8 = "+Str$(oper2) +"     al = "+Str$(al)
  766.         op_cmp 0
  767.    
  768.     Case &H3D '3D CMP eAX Iv
  769.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
  770.         op_cmp 1
  771.        
  772.     Case &H3F '3F AAS ASCII
  773.        If (al And &HF&) > 9 Or af = 1 Then
  774.             al = al - 6
  775.             ah = ah - 1
  776.             af = 1
  777.             cf = 1
  778.         Else
  779.             af = 0
  780.             cf = 0
  781.         End If
  782.         al = al And &HF&
  783.         'flag_szp8 al
  784.        
  785.     Case &H40 '40 INC eAX
  786.        oper1 = getreg16(ax): oper2 = 1
  787.         temp = cf: op_add 1: cf = temp: putreg16 ax, result
  788.        
  789.     Case &H41 '41 INC eCX
  790.        oper1 = getreg16(cx): oper2 = 1
  791.         temp = cf: op_add 1: cf = temp: putreg16 cx, result
  792.    
  793.     Case &H42 '42 INC eDX
  794.        oper1 = getreg16(dx): oper2 = 1
  795.         temp = cf: op_add 1: cf = temp: putreg16 dx, result
  796.    
  797.     Case &H43 '43 INC eBX
  798.        oper1 = getreg16(bx): oper2 = 1
  799.         temp = cf: op_add 1: cf = temp: putreg16 bx, result
  800.    
  801.     Case &H44 '44 INC eSP
  802.        oper1 = sp: oper2 = 1
  803.         temp = cf: op_add 1: cf = temp: sp = result
  804.    
  805.     Case &H45 '45 INC eBP
  806.        oper1 = bp: oper2 = 1
  807.         temp = cf: op_add 1: cf = temp: bp = result
  808.    
  809.     Case &H46 '46 INC eSI
  810.        oper1 = si: oper2 = 1
  811.         temp = cf: op_add 1: cf = temp: si = result
  812.    
  813.     Case &H47 '47 INC eDI
  814.        oper1 = di: oper2 = 1
  815.         temp = cf: op_add 1: cf = temp: di = result
  816.    
  817.     Case &H48 '48 DEC eAX
  818.        oper1 = getreg16(ax): oper2 = 1
  819.         temp = cf: op_sub 1: cf = temp: putreg16 ax, result
  820.    
  821.     Case &H49 '49 DEC eCX
  822.        oper1 = getreg16(cx): oper2 = 1
  823.         temp = cf: op_sub 1: cf = temp: putreg16 cx, result
  824.    
  825.     Case &H4A '4A DEC eDX
  826.        oper1 = getreg16(dx): oper2 = 1
  827.         temp = cf: op_sub 1: cf = temp: putreg16 dx, result
  828.    
  829.     Case &H4B '4B DEC eBX
  830.        oper1 = getreg16(bx): oper2 = 1
  831.         temp = cf: op_sub 1: cf = temp: putreg16 bx, result
  832.    
  833.     Case &H4C '4C DEC eSP
  834.        oper1 = sp: oper2 = 1
  835.         temp = cf: op_sub 1: cf = temp: sp = result
  836.    
  837.     Case &H4D '4D DEC eBP
  838.        oper1 = bp: oper2 = 1
  839.         temp = cf: op_sub 1: cf = temp: bp = result
  840.    
  841.     Case &H4E '4E DEC eSI
  842.        oper1 = si: oper2 = 1
  843.         temp = cf: op_sub 1: cf = temp: si = result
  844.    
  845.     Case &H4F '4F DEC eDI
  846.        oper1 = di: oper2 = 1
  847.         temp = cf: op_sub 1: cf = temp: di = result
  848.    
  849.     Case &H50 '50 PUSH eAX
  850.        push getreg16(ax)
  851.     Case &H51 '51 PUSH eCX
  852.        push getreg16(cx)
  853.     Case &H52 '52 PUSH eDX
  854.        push getreg16(dx)
  855.     Case &H53 '53 PUSH eBX
  856.        push getreg16(bx)
  857.     Case &H54 '54 PUSH eSP
  858.        push sp
  859.     Case &H55 '55 PUSH eBP
  860.        push bp
  861.     Case &H56 '56 PUSH eSI
  862.        push si
  863.     Case &H57 '57 PUSH eDI
  864.        push di
  865.     Case &H58 '58 POP eAX
  866.        putreg16 ax, pop
  867.     Case &H59 '59 POP eCX
  868.        putreg16 cx, pop
  869.     Case &H5A '5A POP eDX
  870.        putreg16 dx, pop
  871.     Case &H5B '5B POP eBX
  872.        putreg16 bx, pop
  873.     Case &H5C '5C POP eSP
  874.        sp = pop
  875.     Case &H5D '5D POP eBP
  876.        bp = pop
  877.     Case &H5E '5E POP eSI
  878.        si = pop
  879.     Case &H5F '5F POP eDI
  880.        di = pop
  881.     Case &h60 '60 PUSHA
  882.             push getreg16(ax)
  883.             push getreg16(cx)
  884.             push getreg16(dx)
  885.             push getreg16(bx)
  886.             push sp: push bp: push si: push di
  887.            
  888.     Case &h61 '61 POPA
  889.             di = pop: si = pop: bp = pop: sp = pop
  890.             putreg16 bx, pop: putreg16 dx, pop: putreg16 cx, pop: putreg16 ax, pop
  891.              
  892.     Case &H70 '70 JO Jb
  893.        oper1 = getmem8(cs, ip): StepIP 1
  894.         If of <> 0 Then reljump oper1
  895.  
  896.     Case &H71 '71 JNO Jb
  897.        oper1 = getmem8(cs, ip): StepIP 1
  898.         If of = 0 Then reljump oper1
  899.  
  900.     Case &H72 '72 JB Jb
  901.        oper1 = getmem8(cs, ip): StepIP 1
  902.         If cf <> 0 Then reljump oper1
  903.  
  904.     Case &H73 '73 JNB Jb
  905.        oper1 = getmem8(cs, ip): StepIP 1
  906.         If cf = 0 Then reljump oper1
  907.  
  908.     Case &H74 '74 JZ Jb
  909.        oper1 = getmem8(cs, ip): StepIP 1
  910.         If zf <> 0 Then reljump oper1
  911.  
  912.     Case &H75 '75 JNZ Jb
  913.        oper1 = getmem8(cs, ip): StepIP 1
  914.         If zf = 0 Then reljump oper1
  915.    
  916.     Case &H76 '76 JBE Jb
  917.        oper1 = getmem8(cs, ip): StepIP 1
  918.         If cf <> 0 Or zf <> 0 Then reljump oper1
  919.  
  920.     Case &H77 '77 JA Jb
  921.        oper1 = getmem8(cs, ip): StepIP 1
  922.         If cf = 0 And zf = 0 Then reljump oper1
  923.  
  924.     Case &H78 '78 JS Jb
  925.        oper1 = getmem8(cs, ip): StepIP 1
  926.         If sf <> 0 Then reljump oper1
  927.    
  928.     Case &H79 '79 JNS Jb
  929.        oper1 = getmem8(cs, ip): StepIP 1
  930.         If sf = 0 Then reljump oper1
  931.    
  932.     Case &H7A '7A JPE Jb
  933.        oper1 = getmem8(cs, ip): StepIP 1
  934.         If pf <> 0 Then reljump oper1
  935.    
  936.     Case &H7B '7B JPO Jb
  937.        oper1 = getmem8(cs, ip): StepIP 1
  938.         If pf = 0 Then reljump oper1
  939.    
  940.     Case &H7C '7C JL Jb
  941.        oper1 = getmem8(cs, ip): StepIP 1
  942.         If sf <> of Then reljump oper1
  943.    
  944.     Case &H7D '7D JGE Jb
  945.        oper1 = getmem8(cs, ip): StepIP 1
  946.         If sf = of Then reljump oper1
  947.    
  948.     Case &H7E '7E JLE Jb
  949.        oper1 = getmem8(cs, ip): StepIP 1
  950.         If sf <> of Or zf <> 0 Then reljump oper1
  951.    
  952.     Case &H7F '7F JG Jb
  953.        oper1 = getmem8(cs, ip): StepIP 1
  954.         If zf = 0 And sf = of Then reljump oper1
  955.    
  956.     Case &H80, &H82 '80/82 GRP1 Eb Ib
  957.        modregrm
  958.         oper1 = readrm8(rm): oper2 = getmem8(cs, ip): StepIP 1
  959.         'MsgBox "GRP1" + CrLf + "Ib = " + Hex$(oper2) + CrLf + "Eb = " + Hex$(oper1)
  960.        op_grp1 0: If reg < 7 Then writerm8 rm, result
  961.  
  962.     Case &H81 '81 GRP1 Ev Iv
  963.        modregrm
  964.         oper1 = readrm16(rm): oper2 = getmem16(cs, ip): StepIP 2
  965.         op_grp1 1: If reg < 7 Then writerm16 rm, result
  966.        
  967.     Case &H83 '83 GRP1 Ev Ib
  968.        modregrm
  969.         oper1 = readrm16(rm): oper2 = getmem8(cs, ip): StepIP 1
  970.         If (oper2 And &h80&) Then oper2 = &hFF00 Or oper2
  971.         op_grp1 1: If reg < 7 Then writerm8 rm, result
  972.    
  973.     Case &H84 '84 TEST Gb Eb
  974.        modregrm
  975.         oper1 = getreg8(reg): oper2 = readrm8(rm)
  976.         op_test 0
  977.  
  978.     Case &H85 '85 TEST Gv Ev
  979.        modregrm
  980.         oper1 = getreg16(reg): oper2 = readrm16(rm)
  981.         op_test 1
  982.  
  983.     Case &H86 '86 XCHG Gb Eb
  984.        modregrm
  985.         oper1 = getreg8(reg)
  986.         putreg8 reg, readrm8(rm)
  987.         writerm8 rm, oper1
  988.  
  989.     Case &H87 '87 XCHG Gv Ev
  990.        modregrm
  991.         oper1 = getreg16(reg)
  992.         putreg16 reg, readrm16(rm)
  993.         writerm16 rm, oper1
  994.  
  995.     Case &H88 '88 MOV Eb Gb
  996.        modregrm
  997.         writerm8 rm, getreg8(reg)
  998.    
  999.     Case &H89 '89 MOV Ev Gv
  1000.        modregrm
  1001.         writerm16 rm, getreg16(reg)
  1002.    
  1003.     Case &H8A '8A MOV Gb Eb
  1004.        modregrm
  1005.         putreg8 reg, readrm8(rm)
  1006.    
  1007.     Case &H8B '8B MOV Gv Ev
  1008.        modregrm
  1009.         putreg16 reg, readrm16(rm)
  1010.    
  1011.     Case &H8C '8C MOV Ew Sw
  1012.        modregrm
  1013.         writerm16 rm, getsegreg(reg)
  1014.    
  1015.     Case &H8D '8D LEA Gv M
  1016.        modregrm
  1017.         putreg16 reg, getea(rm) - useseg * 16
  1018.         'MsgBox "LEA = " + Hex$(getea(rm) - useseg * 16)
  1019.  
  1020.     Case &H8E '8E MOV Sw Ew
  1021.        modregrm
  1022.         putsegreg reg, readrm16(rm)
  1023.  
  1024.     Case &H8F '8F POP Ev
  1025.        modregrm
  1026.         writerm16 rm, pop
  1027.        
  1028.     Case &H90 '90 NOP
  1029.        'DoEvents 'give idle time back to host CPU
  1030.        
  1031.     Case &H91 '91 XCHG eCX eAX
  1032.        oper1 = getreg16(cx)
  1033.         putreg16 cx, getreg16(ax)
  1034.         putreg16 ax, oper1
  1035.  
  1036.     Case &H92 '92 XCHG eDX eAX
  1037.        oper1 = getreg16(dx)
  1038.         putreg16 dx, getreg16(ax)
  1039.         putreg16 ax, oper1
  1040.  
  1041.     Case &H93 '93 XCHG eBX eAX
  1042.        oper1 = getreg16(bx)
  1043.         putreg16 bx, getreg16(ax)
  1044.         putreg16 ax, oper1
  1045.  
  1046.     Case &H94 '94 XCHG eSP eAX
  1047.        oper1 = sp
  1048.         sp = getreg16(ax)
  1049.         putreg16 ax, oper1
  1050.  
  1051.     Case &H95 '95 XCHG eBP eAX
  1052.        oper1 = bp
  1053.         bp = getreg16(ax)
  1054.         putreg16 ax, oper1
  1055.  
  1056.     Case &H96 '96 XCHG eSI eAX
  1057.        oper1 = si
  1058.         si = getreg16(ax)
  1059.         putreg16 ax, oper1
  1060.  
  1061.     Case &H97 '97 XCHG eDI eAX
  1062.        oper1 = di
  1063.         di = getreg16(ax)
  1064.         putreg16 ax, oper1
  1065.  
  1066.     Case &H98 '98 CBW
  1067.        If (al And 128) = 128 Then ah = 255 Else ah = 0
  1068.        
  1069.     Case &H99 '99 CWD
  1070.        If (getreg16(ax) And 32768) = 32768 Then putreg16 dx, 65535 Else putreg16 dx, 0
  1071.        
  1072.     Case &H9A '9A CALL Ap
  1073.        oper1 = getmem16(cs, ip): StepIP 2
  1074.         oper2 = getmem16(cs, ip): StepIP 2
  1075.         push cs: push ip: ip = oper1: cs = oper2
  1076.  
  1077.     Case &H9B '9B WAIT
  1078.    
  1079.     Case &H9C '9C PUSHF
  1080.        push makeflagsword
  1081.        
  1082.     Case &H9D '9D POPF
  1083.        decodeflagsword pop
  1084.        
  1085.     Case &H9E '9E SAHF
  1086.        decodeflagsword (makeflagsword And &HFF00&) + ah
  1087.        
  1088.     Case &H9F '9F LAHF
  1089.        ah = makeflagsword And 255
  1090.        
  1091.     Case &HA0 'A0 MOV AL Ob
  1092.        al = getmem8(useseg, getmem16(cs, ip)): StepIP 2
  1093.        
  1094.     Case &HA1 'A1 MOV eAX Ov
  1095.        putreg16 ax, getmem16(useseg, getmem16(cs, ip)): StepIP 2
  1096.        
  1097.     Case &HA2 'A2 MOV Ob AL
  1098.        write86 (useseg * 16) + getmem16(cs, ip), al: StepIP 2
  1099.        
  1100.     Case &HA3 'A3 MOV Ov eAX
  1101.        putmem16 useseg, getmem16(cs, ip), getreg16(ax): StepIP 2
  1102.  
  1103.     Case &HA4 'A4 MOVSB
  1104.        Do
  1105.             If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
  1106.             write86 (es * 16) + di, getmem8(useseg, si)
  1107.             If df Then di = di - 1: si = si - 1 Else di = di + 1: si = si + 1
  1108.             di = di And 65535: si = si And 65535
  1109.             If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
  1110.             totalexec = totalexec + 1
  1111.         Loop Until reptype <> 1
  1112.    
  1113.     Case &HA5 'A5 MOVSW
  1114.        Do
  1115.             If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
  1116.             putmem16 es, di, getmem16(useseg, si)
  1117.             If df Then di = di - 2: si = si - 2 Else di = di + 2: si = si + 2
  1118.             di = di And 65535: si = si And 65535
  1119.             If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
  1120.             totalexec = totalexec + 1
  1121.         Loop Until reptype <> 1
  1122.    
  1123.     Case &HA6 'A6 CMPSB
  1124.        Do
  1125.             If (reptype <> 0) And (getreg16(cx) = 0) Then Exit Do
  1126.             oper1 = getmem8(es, di): oper2 = getmem8(useseg, si): op_cmp 0
  1127.             If df Then di = di - 1: si = si - 1 Else di = di + 1: si = si + 1
  1128.             'If di < 0 Then di = 65536 + di
  1129.            'If si < 0 Then si = 65536 + si
  1130.            di = di And 65535: si = si And 65535
  1131.             'MsgBox "reptype" + Str$(reptype) + CrLf + "CX: " + Hex$(getreg16(cx)) + CrLf + "ZF:" + Str$(zf)
  1132.            If reptype <> 0 Then putreg16 cx, getreg16(cx) - 1
  1133.             If reptype = 1 Then If zf = 0 Then Exit Do
  1134.             If reptype = 2 Then If zf = 1 Then Exit Do
  1135.             totalexec = totalexec + 1
  1136.         Loop Until reptype = 0
  1137.        
  1138.     Case &HA7 'A7 CMPSW
  1139.        Do
  1140.             If (reptype <> 0) And (getreg16(cx) = 0) Then Exit Do
  1141.             oper1 = getmem16(es, di): oper2 = getmem16(useseg, si): op_cmp 1
  1142.             If df Then di = di - 2: si = si - 2 Else di = di + 2: si = si + 2
  1143.             'If di < 0 Then di = 65536 + di
  1144.            'If si < 0 Then si = 65536 + si
  1145.            di = di And 65535: si = si And 65535
  1146.             If reptype <> 0 Then putreg16 cx, getreg16(cx) - 1
  1147.             If reptype = 1 Then If zf = 0 Then Exit Do
  1148.             If reptype = 2 Then If zf = 1 Then Exit Do
  1149.             totalexec = totalexec + 1
  1150.         Loop Until reptype = 0
  1151.    
  1152.     Case &HA8 'A8 TEST AL Ib
  1153.        oper1 = al: oper2 = getmem8(cs, ip): StepIP 1: op_test 0
  1154.    
  1155.     Case &HA9 'A9 TEST eAX Iv
  1156.        oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2: op_test 1
  1157.    
  1158.     Case &HAA 'AA STOSB
  1159.        Do
  1160.             If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
  1161.             write86 (es * 16) + di, al
  1162.             If df Then di = di - 1 Else di = di + 1
  1163.             di = di And 65535
  1164.             If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
  1165.             totalexec = totalexec + 1
  1166.         Loop Until reptype <> 1
  1167.        
  1168.     Case &HAB 'AB STOSW
  1169.        Do
  1170.             If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
  1171.             putmem16 es, di, getreg16(ax)
  1172.             If df Then di = di - 2 Else di = di + 2
  1173.             di = di And 65535
  1174.             If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
  1175.             totalexec = totalexec + 1
  1176.         Loop Until reptype <> 1
  1177.    
  1178.     Case &HAC 'AC LODSB
  1179.         If hitbasic = 1 Then Print "LODSB segment: " + Hex$(useseg)
  1180.         Do
  1181.             If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
  1182.             al = getmem8(useseg, si)
  1183.             If df Then si = si - 1 Else si = si + 1
  1184.             si = si And 65535
  1185.             If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
  1186.             totalexec = totalexec + 1
  1187.         Loop Until reptype <> 1
  1188.    
  1189.     Case &HAD 'AD LODSW
  1190.        Do
  1191.             If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
  1192.             putreg16 ax, getmem16(useseg, si)
  1193.             If df Then si = si - 2 Else si = si + 2
  1194.             si = si And 65535
  1195.             If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
  1196.             totalexec = totalexec + 1
  1197.         Loop Until reptype <> 1
  1198.    
  1199.     Case &HAE 'AE SCASB
  1200.        Do
  1201.             If (reptype <> 0) And (getreg16(cx) = 0) Then Exit Do
  1202.             oper1 = al: oper2 = getmem8(es, di): op_sub 0
  1203.             If df Then di = di - 1 Else di = di + 1
  1204.             di = di And 65535
  1205.             If reptype <> 0 Then putreg16 cx, getreg16(cx) - 1
  1206.             totalexec = totalexec + 1
  1207.             If reptype = 1 Then If zf = 0 Then Exit Do
  1208.             If reptype = 2 Then If zf = 1 Then Exit Do
  1209.         Loop Until reptype = 0
  1210.    
  1211.     Case &HAF 'AF SCASW
  1212.        Do
  1213.             If (reptype <> 0) And (getreg16(cx) = 0) Then Exit Do
  1214.             oper1 = getreg16(ax): oper2 = getmem16(es, di): op_sub 1
  1215.             If df Then di = di - 2 Else di = di + 2
  1216.             di = di And 65535
  1217.             If reptype <> 0 Then putreg16 cx, getreg16(cx) - 1
  1218.             If reptype = 1 Then If zf = 0 Then Exit Do
  1219.             If reptype = 2 Then If zf = 1 Then Exit Do
  1220.             totalexec = totalexec + 1
  1221.         Loop Until reptype = 0
  1222.    
  1223.     Case &HB0 'B0 MOV AL Ib
  1224.        al = getmem8(cs, ip): StepIP 1
  1225.    
  1226.     Case &HB1 'B1 MOV CL Ib
  1227.        cl = getmem8(cs, ip): StepIP 1
  1228.    
  1229.     Case &HB2 'B2 MOV DL Ib
  1230.        dl = getmem8(cs, ip): StepIP 1
  1231.    
  1232.     Case &HB3 'B3 MOV BL Ib
  1233.        bl = getmem8(cs, ip): StepIP 1
  1234.    
  1235.     Case &HB4 'B4 MOV AH Ib
  1236.        ah = getmem8(cs, ip): StepIP 1
  1237.    
  1238.     Case &HB5 'B5 MOV CH Ib
  1239.        ch = getmem8(cs, ip): StepIP 1
  1240.    
  1241.     Case &HB6 'B6 MOV DH Ib
  1242.        dh = getmem8(cs, ip): StepIP 1
  1243.    
  1244.     Case &HB7 'B7 MOV BH Ib
  1245.        bh = getmem8(cs, ip): StepIP 1
  1246.    
  1247.     Case &HB8 'B8 MOV eAX Iv
  1248.        putreg16 ax, getmem16(cs, ip): StepIP 2
  1249.        
  1250.     Case &HB9 'B9 MOV eCX Iv
  1251.        putreg16 cx, getmem16(cs, ip): StepIP 2
  1252.    
  1253.     Case &HBA 'BA MOV eDX Iv
  1254.        putreg16 dx, getmem16(cs, ip): StepIP 2
  1255.    
  1256.     Case &HBB 'BB MOV eBX Iv
  1257.        putreg16 bx, getmem16(cs, ip): StepIP 2
  1258.  
  1259.     Case &HBC 'BC MOV eSP Iv
  1260.        sp = getmem16(cs, ip): StepIP 2
  1261.    
  1262.     Case &HBD 'BD MOV eBP Iv
  1263.        bp = getmem16(cs, ip): StepIP 2
  1264.    
  1265.     Case &HBE 'BE MOV eSI Iv
  1266.        si = getmem16(cs, ip): StepIP 2
  1267.    
  1268.     Case &HBF 'BF MOV eDI Iv
  1269.        di = getmem16(cs, ip): StepIP 2
  1270.  
  1271.     Case &HC0 'C0 GRP2 byte imm8 (80186+)
  1272.        modregrm
  1273.         oper1 = readrm8(rm): oper2 = getmem8(cs, ip): StepIP 1
  1274.         op_grp2 0: writerm8 rm, result
  1275.  
  1276.     Case &HC1 'C1 GRP2 word imm8 (80186+)
  1277.        modregrm
  1278.         oper1 = readrm16(rm): oper2 = getmem8(cs, ip): StepIP 1
  1279.         op_grp2 1: writerm16 rm, result
  1280.    
  1281.     Case &HC2 'C2 RET Iw
  1282.        oper1 = getmem16(cs, ip): ip = pop
  1283.         sp = (sp + oper1) And 65535
  1284.        
  1285.     Case &HC3 'C3 RET
  1286.        ip = pop
  1287.  
  1288.     Case &HC4 'C4 LES Gv Mp
  1289.        modregrm
  1290.         temp2 = getea(rm)
  1291.         putreg16 reg, getmem16(temp2 \ 16, temp2 Mod 16) 'read86(temp2) + read86(temp2 + 1) * 256
  1292.        temp2 = temp2 + 2
  1293.         es = getmem16(temp2 \ 16, temp2 Mod 16) 'read86(temp2 + 2) + read86(temp2 + 3) * 256
  1294.    
  1295.     Case &HC5 'C5 LDS Gv Mp
  1296.        modregrm
  1297.         temp2 = getea(rm)
  1298.         putreg16 reg, getmem16(temp2 \ 16, temp2 Mod 16) 'read86(temp2) + read86(temp2 + 1) * 256
  1299.        temp2 = temp2 + 2
  1300.         ds = getmem16(temp2 \ 16, temp2 Mod 16) 'read86(temp2 + 2) + read86(temp2 + 3) * 256
  1301.        
  1302.     Case &HC6 'C6 MOV Eb Ib
  1303.        modregrm
  1304.         writerm8 rm, getmem8(cs, ip): StepIP 1
  1305.        
  1306.     Case &HC7 'C7 MOV Ev Iv
  1307.        modregrm
  1308.         writerm16 rm, getmem16(cs, ip): StepIP 2
  1309.        
  1310.     'Case &HC9 'C9 LEAVE (80186+)
  1311.      '    sp = bp
  1312.       '   bp = pop
  1313.            
  1314.     Case &HCA 'CA RETF Iw
  1315.        oper1 = getmem16(cs, ip): ip = pop: cs = pop
  1316.         sp = (sp + oper1) And 65535
  1317.  
  1318.     Case &HCB 'CB RETF
  1319.        ip = pop: cs = pop
  1320.  
  1321.     Case &HCC 'CC INT 3
  1322.        intcall86 3
  1323.  
  1324.     Case &HCD 'CD INT Ib
  1325.        oper1 = getmem8(cs, ip): StepIP 1
  1326.         intcall86 oper1
  1327.        
  1328.     Case &HCE 'CE INTO
  1329.        If of Then intcall86 4
  1330.        
  1331.     Case &HCF 'CF IRET
  1332.        ip = pop: cs = pop: decodeflagsword (pop)
  1333.        
  1334.     Case &HD0 'D0 GRP2 Eb 1
  1335.        modregrm
  1336.         oper1 = readrm8(rm): oper2 = 1
  1337.         op_grp2 0: writerm8 rm, result
  1338.  
  1339.     Case &HD1 'D1 GRP2 Ev 1
  1340.        modregrm
  1341.         oper1 = readrm16(rm): oper2 = 1
  1342.         op_grp2 1: writerm16 rm, result
  1343.    
  1344.     Case &HD2 'D2 GRP2 Eb CL
  1345.        modregrm
  1346.         oper1 = readrm8(rm): oper2 = cl
  1347.         op_grp2 0: writerm8 rm, result
  1348.    
  1349.     Case &HD3 'D3 GRP2 Ev CL
  1350.        modregrm
  1351.         oper1 = readrm16(rm): oper2 = cl
  1352.         op_grp2 1: writerm16 rm, result
  1353.    
  1354.     Case &HD4 'D4 AAM I0
  1355.        oper1 = getmem8(cs, ip): StepIP 1
  1356.         If oper1 = 0 Then intcall86 0: Exit Sub 'division by zero
  1357.        ah = al \ oper1
  1358.         al = al Mod oper1
  1359.         flag_szp16 getreg16(ax)
  1360.    
  1361.     Case &HD5 'D5 AAD I0
  1362.        oper1 = getmem8(cs, ip): StepIP 1
  1363.         al = ah * oper1 + al
  1364.         ah = 0
  1365.         flag_szp16 getreg16(ax And &HFF)
  1366.    
  1367.     Case &HD7 'D7 XLAT
  1368.        al = getmem8(useseg, bx + al) '((bx + al) And 65535))
  1369.    
  1370.     Case &HD8 To &HDF 'floating point op escape code
  1371.        StepIP 1 'we don't have FPU emulation, so we skip the rest of this code
  1372.        intcall86 7 'and trip the device not found exception
  1373.  
  1374.     Case &HE0 'E0 LOOPNZ Jb
  1375.        oper1 = getmem8(cs, ip): StepIP 1
  1376.         putreg16 cx, getreg16(cx) - 1
  1377.         If (getreg16(cx) <> 0) And (zf = 0) Then reljump oper1
  1378.    
  1379.     Case &HE1 'E1 LOOPZ Jb
  1380.        oper1 = getmem8(cs, ip): StepIP 1
  1381.         putreg16 cx, getreg16(cx) - 1
  1382.         If (getreg16(cx) <> 0) And (zf = 1) Then reljump oper1
  1383.        
  1384.     Case &HE2 'E2 LOOP Jb
  1385.        oper1 = getmem8(cs, ip): StepIP 1
  1386.         putreg16 cx, getreg16(cx) - 1
  1387.         If getreg16(cx) <> 0 Then reljump oper1
  1388.        
  1389.     Case &HE3 'E3 JCXZ Jb
  1390.        oper1 = getmem8(cs, ip): StepIP 1
  1391.         If getreg16(cx) = 0 Then reljump oper1
  1392.    
  1393.     Case &HE4 'E4 IN AL Ib
  1394.         oper1 = getmem8(cs, ip)
  1395.         al = 255
  1396.         StepIP 1
  1397.        
  1398.     Case &HE5 'E5 IN eAX Ib
  1399.         oper1 = getmem8(cs, ip)
  1400.         putreg16 ax, 255
  1401.         StepIP 1
  1402.        
  1403.     Case &HE6 'E6 OUT Ib AL
  1404.         oper1 = getmem8(cs, ip)
  1405.         StepIP 1
  1406.        
  1407.     Case &HE7 'E7 OUT Ib eAX
  1408.         oper1 = getmem8(cs, ip)
  1409.         StepIP 1
  1410.        
  1411.     Case &HE8 'E8 CALL Jv
  1412.        oper1 = getmem16(cs, ip): StepIP 2: push ip
  1413.         ip = (ip + signed16(oper1)) And 65535
  1414.  
  1415.     Case &HE9 'E9 JMP Jv
  1416.        oper1 = getmem16(cs, signed16(ip)): StepIP 2
  1417.         ip = (ip + signed16(oper1)) And 65535
  1418.        
  1419.     Case &HEA 'EA JMP Ap
  1420.        temp1 = getmem16(cs, ip): StepIP 2
  1421.         temp2 = getmem16(cs, ip): ip = temp1: cs = temp2
  1422.    
  1423.     Case &HEB 'EB JMP Jb
  1424.        oper1 = getmem8(cs, ip): StepIP 1
  1425.         ip = (ip + signed8(oper1)) And 65535
  1426.  
  1427.     Case &HEC 'EC IN AL DX
  1428.         oper1 = getmem8(cs, ip)
  1429.         al = 255
  1430.        
  1431.     Case &HED 'ED IN eAX DX
  1432.         oper1 = getmem8(cs, ip)
  1433.         putreg16 ax, 255
  1434.        
  1435.     Case &HEE 'EE OUT DX AL
  1436.         oper1 = getmem8(cs, ip)
  1437.  
  1438.     Case &HEF 'EF OUT DX eAX
  1439.         oper1 = getmem8(cs, ip)
  1440.             Print #4, "PORT OUT "+Hex$(getreg16(0))+"h"
  1441.     Case &HF0 'F0 LOCK
  1442.        'ignore this, it's useful only in multiprocessor configurations to lock the bus.
  1443.  
  1444.     Case &HF4 'F4 HLT
  1445.        ip = ip - 1
  1446.         Running = 0
  1447.    
  1448.     Case &HF5 'F5 CMC
  1449.        If cf = 0 Then cf = 1 Else cf = 0
  1450.        
  1451.     Case &HF6 'F6 GRP3a Eb
  1452.        modregrm
  1453.         oper1 = readrm8(rm): op_grp3 0: If reg > 1 And reg < 4 Then writerm8 rm, result
  1454.    
  1455.     Case &HF7 'F7 GRP3b Ev
  1456.        modregrm
  1457.         oper1 = readrm16(rm): op_grp3 1: If reg > 1 And reg < 4 Then writerm16 rm, result
  1458.  
  1459.     Case &HF8 'F8 CLC
  1460.        cf = 0
  1461.        
  1462.     Case &HF9 'F9 STC
  1463.        cf = 1
  1464.        
  1465.     Case &HFA 'FA CLI
  1466.        ifl = 0
  1467.        
  1468.     Case &HFB 'FB STI
  1469.        ifl = 1
  1470.        
  1471.     Case &HFC 'FC CLD
  1472.        df = 0
  1473.        
  1474.     Case &HFD 'FD STD
  1475.        df = 1
  1476.        
  1477.     Case &HFE 'FE GRP4 Eb
  1478.        modregrm
  1479.         oper1 = readrm8(rm): oper2 = 1
  1480.           If hitbasic = 1 Then Print "  Reg: " + Hex$(reg)
  1481.         If reg = 0 Then
  1482.             temp = cf: op_add 0: cf = temp: writerm8 rm, result
  1483.         Else
  1484.             temp = cf: op_sub 0: cf = temp: writerm8 rm, result
  1485.         End If
  1486.    
  1487.     Case &HFF 'FF GRP5 Ev
  1488.        modregrm
  1489.         oper1 = readrm16(rm)
  1490.         op_grp5
  1491.        
  1492.     Case Else
  1493. '           Screen 0
  1494. '           Print "HIT OPCODE "+Hex$(opcode) +" @ "+Hex$(cs)+":"+Hex$(ip)
  1495. '           Print "  AX: " + Hex$(getreg16(ax)) +"    BX: " + Hex$(getreg16(bx)) + "    CX: " + Hex$(getreg16(cx)) + "    DX: " + Hex$(getreg16(dx))
  1496.             'end
  1497.             'If hitbasic = 0 Then ScreenRes 640,400,24
  1498.        'If Len(Oplist(opcode)) > 0 Then
  1499.            'Print "Unrecognized opcode reached at " + Hex$(cs) + ":" + Hex$(ip)+" = "+Hex$(opcode) + Chr$(13)+Chr$(10) + Oplist(opcode) + Chr$(13)+Chr$(10) + CrLf + "Total executed:" + Str$(totalexec)
  1500.            'Running = 0
  1501.            'end
  1502.        'End If
  1503.        'intcall86 6
  1504.   '     Else
  1505. '           If ifl = 1 Then intcall86 6
  1506.     '   End If
  1507. End Select
  1508. 'AddTrace CurTracePos
  1509. 'If CurTracePos < 100 Then CurTracePos = CurTracePos + 1
  1510. If TraceLog = 1 Then WriteLog
  1511. If hitbasic = 1 Then WriteLog
  1512. If Running = 0 Then Exit For
  1513. Next multiexec
  1514. 'UpdateMemView
  1515. UpdateUI
  1516. End Sub
  1517.  
  1518. Sub UpdateUI()
  1519. 'frmDebug.lblCSIP = Right$("000" + Hex$(cs), 4) + ":" + Right$("000" + Hex$(ip), 4)
  1520. 'frmDebug.lblAX = Hex$(getreg16(ax)): frmDebug.lblBX = Hex$(getreg16(bx))
  1521. 'frmDebug.lblCX = Hex$(getreg16(cx)): frmDebug.lblDX = Hex$(getreg16(dx))
  1522. 'frmDebug.lblSP = Hex$(sp): frmDebug.lblBP = Hex$(bp): frmDebug.lblSI = Hex$(si)
  1523. 'frmDebug.lblDI = Hex$(di): frmDebug.lblDS = Hex$(ds): frmDebug.lblSS = Hex$(ss)
  1524. 'frmDebug.lblES = Hex$(es): frmDebug.lblCF = Hex$(cf): frmDebug.lblPF = Hex$(pf)
  1525. 'frmDebug.lblZF = Hex$(zf): frmDebug.lblSF = Hex$(sf): frmDebug.lblTF = Hex$(tf)
  1526. 'frmDebug.lblIF = Hex$(ifl): frmDebug.lblDF = Hex$(df): frmDebug.lblOF = Hex$(of)
  1527. 'frmDebug.lblAF = Hex$(af)
  1528. 'frmDebug.lblInstruction = Oplist(getmem8(cs, ip))
  1529. 'frmDebug.lblTotal = totalexec
  1530. End Sub
  1531.  
  1532. Function CheckBreakpoint() As Byte
  1533. 'For n = 0 To frmExtended.lstBrk.ListCount - 1
  1534. '    If Val("&H" + frmExtended.lstBrk.List(n)) = cs * 16 + ip Then
  1535. '        execloops = 1
  1536. '        MsgBox "Breakpoint reached at 0" + frmExtended.lstBrk.List(n) + "h", vbInformation, "Breakpoint encountered"
  1537. '        CheckBreakpoint = 1
  1538. '        Exit Function
  1539. '    End If
  1540. 'Next n
  1541. CheckBreakpoint = 0
  1542. End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement