Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Function read86(ByVal addr32 as UInteger) as UInteger
- If addr32 > 1048575 Or addr32 < 0 Then Exit Function
- read86 = RAM(addr32)
- End Function
- Sub write86(ByVal addr32 as UInteger, ByVal value As Integer)
- If addr32 > 1048575 Or addr32 < 0 Then Exit Sub
- If ReadOnly(addr32) = 1 Then Exit Sub
- If addr32 >= videobase And addr32 < videobase + cols * 2 * rows Then UpdatedScreen = 1
- RAM(addr32) = value
- End Sub
- Function signed16(ByVal value as UInteger) as LongInt
- If (value And &H8000&) = &H8000& Then value = -1 - ((Not value) And 65535)
- signed16 = value
- End Function
- Function signed8(ByVal value as UInteger) as LongInt
- If (value And 128) = 128 Then value = -1 - ((Not value) And 255)
- signed8 = value
- End Function
- Function getmem16(ByVal segment as UInteger, ByVal offset as UInteger) as UInteger
- Dim tempval as ULong
- tempval = read86((segment * 16) + offset + 1) * 256
- getmem16 = tempval + read86((segment * 16) + offset)
- End Function
- Function getmem8(ByVal segment as UInteger, ByVal offset as UInteger) as UInteger
- Dim temp8 As UInteger
- temp8 = read86((segment * 16) + offset)
- 'If (temp8 And &h80&) Then temp8 = temp8 Or &hFF00
- getmem8 = temp8
- End Function
- Sub putmem16(ByVal segment as UInteger, ByVal offset as UInteger, ByVal value as UInteger)
- Dim tempval as ULong
- tempval = (segment * 16) + offset
- write86 tempval, value And 255
- write86 tempval + 1, (value \ 256) And 255 'And 65280) / 256
- End Sub
- Function getreg16(ByVal regnum As Byte) as UShort
- Select Case regnum
- Case ax
- getreg16 = (ah * 256) + al
- Case cx
- getreg16 = (ch * 256) + cl
- Case dx
- getreg16 = (dh * 256) + dl
- Case bx
- getreg16 = (bh * 256) + bl
- Case 4: getreg16 = sp
- Case 5: getreg16 = bp
- Case 6: getreg16 = si
- Case 7: getreg16 = di
- End Select
- End Function
- Sub putreg16(ByVal regnum As Byte, ByVal value as UShort)
- Select Case regnum
- Case ax
- al = value And 255: ah = (value \ 256) And 255
- Case cx
- cl = value And 255: ch = (value \ 256) And 255
- Case dx
- dl = value And 255: dh = (value \ 256) And 255
- Case bx
- bl = value And 255: bh = (value \ 256) And 255
- Case 4: sp = value And 65535
- Case 5: bp = value And 65535
- Case 6: si = value And 65535
- Case 7: di = value And 65535
- End Select
- End Sub
- Sub putreg8(ByVal regnum As Byte, ByVal value as UInteger)
- Select Case regnum
- Case 0: al = value And 255
- Case 1: cl = value And 255
- Case 2: dl = value And 255
- Case 3: bl = value And 255
- Case 4: ah = value And 255
- Case 5: ch = value And 255
- Case 6: dh = value And 255
- Case 7: bh = value And 255
- End Select
- End Sub
- Function getreg8(ByVal regnum As Byte) as UInteger
- Select Case regnum
- Case 0: getreg8 = al And 255
- Case 1: getreg8 = cl And 255
- Case 2: getreg8 = dl And 255
- Case 3: getreg8 = bl And 255
- Case 4: getreg8 = ah And 255
- Case 5: getreg8 = ch And 255
- Case 6: getreg8 = dh And 255
- Case 7: getreg8 = bh And 255
- End Select
- End Function
- Sub putsegreg(ByVal regnum As Byte, ByVal value as UInteger)
- Select Case regnum
- Case 0
- es = value
- Case 1
- cs = value
- Case 2
- ss = value
- Case 3
- ds = value
- End Select
- End Sub
- Function getsegreg(ByVal regnum As Byte) as UInteger
- Select Case regnum
- Case 0
- getsegreg = es
- Case 1
- getsegreg = cs
- Case 2
- getsegreg = ss
- Case 3
- getsegreg = ds
- End Select
- End Function
- Sub StepIP(stepcount As Byte)
- ip = (ip + stepcount) And 65535
- End Sub
- Sub push(ByVal pushval as UInteger)
- pushval = pushval And 65535
- If TraceLog = 1 Then Print #2, "Pushed " + Hex$(pushval)
- If hitbasic = 1 Then Print "Pushed " + Hex$(pushval)
- sp = (sp - 2) And 65535
- If sp < 0 Then sp = 65536 + sp
- putmem16 ss, sp, pushval And 65535
- End Sub
- Function pop() as UInteger
- pop = getmem16(ss, sp) And 65535
- If TraceLog = 1 Then Print #2, "Popped " + Hex$(pop)
- If hitbasic = 1 Then Print "Popped " + Hex$(getmem16(ss, sp))
- sp = (sp + 2) And 65535
- End Function
- Sub modregrm()
- temp1 = getmem8(cs, ip): StepIP 1
- mode = temp1 \ 64
- reg = (temp1 \ 8) And 7
- rm = temp1 And 7
- Disp = 0
- Select Case mode
- Case 0
- 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
- If ((rm = 2) Or (rm = 3)) And (segoverride = 0) Then useseg = ss
- Case 1
- Disp = signed8(getmem8(cs, ip)): StepIP 1
- 'If (Disp And 128) = 128 Then Disp = Disp + 65280
- If ((rm = 2) Or (rm = 3) Or (rm = 6)) And (segoverride = 0) Then useseg = ss
- Case 2
- Disp = signed16(getmem16(cs, ip)): StepIP 2
- If ((rm = 2) Or (rm = 3) Or (rm = 6)) And (segoverride = 0) Then useseg = ss
- End Select
- If hitbasic = 1 Then
- Print " Mode:" + Str$(mode)
- Print " Reg:" + Str$(reg)
- Print " RM:" + Str$(rm)
- If mode < 3 Then
- Print " EA: " + Hex$(getea(rm))
- EndIf
- End If
- End Sub
- Function getea(ByVal rmval as UInteger) as UInteger
- temp1 = 0
- Select Case mode
- Case 0
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
- Case 2: temp1 = (useseg * 16) + bp + si
- Case 3: temp1 = (useseg * 16) + bp + di
- Case 4: temp1 = (useseg * 16) + si
- Case 5: temp1 = (useseg * 16) + di
- Case 6: temp1 = (useseg * 16) + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx)
- End Select
- Case 1, 2
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
- Case 2: temp1 = (useseg * 16) + bp + si + Disp
- Case 3: temp1 = (useseg * 16) + bp + di + Disp
- Case 4: temp1 = (useseg * 16) + si + Disp
- Case 5: temp1 = (useseg * 16) + di + Disp
- Case 6: temp1 = (useseg * 16) + bp + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
- End Select
- Case 3
- 'readrm16 = getreg16(rmval)
- Exit Function
- End Select
- getea = temp1
- End Function
- Function readrm16(ByVal rmval as UInteger) as UInteger
- temp1 = 0
- Select Case mode
- Case 0
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
- Case 2: temp1 = (useseg * 16) + bp + si
- Case 3: temp1 = (useseg * 16) + bp + di
- Case 4: temp1 = (useseg * 16) + si
- Case 5: temp1 = (useseg * 16) + di
- Case 6: temp1 = (useseg * 16) + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx)
- End Select
- Case 1, 2
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
- Case 2: temp1 = (useseg * 16) + bp + si + Disp
- Case 3: temp1 = (useseg * 16) + bp + di + Disp
- Case 4: temp1 = (useseg * 16) + si + Disp
- Case 5: temp1 = (useseg * 16) + di + Disp
- Case 6: temp1 = (useseg * 16) + bp + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
- End Select
- Case 3
- readrm16 = getreg16(rmval)
- Exit Function
- End Select
- readrm16 = (read86(temp1 + 1) * 256) + read86(temp1)
- End Function
- Sub writerm16(ByVal rmval as UInteger, ByVal value as UInteger)
- temp1 = 0
- Select Case mode
- Case 0
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
- Case 2: temp1 = (useseg * 16) + bp + si
- Case 3: temp1 = (useseg * 16) + bp + di
- Case 4: temp1 = (useseg * 16) + si
- Case 5: temp1 = (useseg * 16) + di
- Case 6: temp1 = (useseg * 16) + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx)
- End Select
- Case 1, 2
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
- Case 2: temp1 = (useseg * 16) + bp + si + Disp
- Case 3: temp1 = (useseg * 16) + bp + di + Disp
- Case 4: temp1 = (useseg * 16) + si + Disp
- Case 5: temp1 = (useseg * 16) + di + Disp
- Case 6: temp1 = (useseg * 16) + bp + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
- End Select
- Case 3
- putreg16 rmval, value
- Exit Sub
- End Select
- write86 temp1, value And 255
- write86 temp1 + 1, value \ 256
- End Sub
- Function readrm8(ByVal rmval as UInteger) as UInteger
- temp1 = 0
- Select Case mode
- Case 0
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
- Case 2: temp1 = (useseg * 16) + bp + si
- Case 3: temp1 = (useseg * 16) + bp + di
- Case 4: temp1 = (useseg * 16) + si
- Case 5: temp1 = (useseg * 16) + di
- Case 6: temp1 = (useseg * 16) + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx)
- End Select
- Case 1, 2
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
- Case 2: temp1 = (useseg * 16) + bp + si + Disp
- Case 3: temp1 = (useseg * 16) + bp + di + Disp
- Case 4: temp1 = (useseg * 16) + si + Disp
- Case 5: temp1 = (useseg * 16) + di + Disp
- Case 6: temp1 = (useseg * 16) + bp + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
- End Select
- Case 3
- Select Case rmval
- Case 0: readrm8 = al
- Case 1: readrm8 = cl
- Case 2: readrm8 = dl
- Case 3: readrm8 = bl
- Case 4: readrm8 = ah
- Case 5: readrm8 = ch
- Case 6: readrm8 = dh
- Case 7: readrm8 = bh
- End Select
- Exit Function
- End Select
- 'If opcode = &H80 Then MsgBox "EA: " + Hex$(useseg) + ":" + Hex$(Disp)
- readrm8 = read86(temp1)
- 'MsgBox read86(temp1)
- End Function
- Sub writerm8(ByVal rmval as UInteger, ByVal value as UInteger)
- value = value And 255
- temp1 = 0
- Select Case mode
- Case 0
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di
- Case 2: temp1 = (useseg * 16) + bp + si
- Case 3: temp1 = (useseg * 16) + bp + di
- Case 4: temp1 = (useseg * 16) + si
- Case 5: temp1 = (useseg * 16) + di
- Case 6: temp1 = (useseg * 16) + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx)
- End Select
- Case 1, 2
- Select Case rmval
- Case 0: temp1 = (useseg * 16) + getreg16(bx) + si + Disp
- Case 1: temp1 = (useseg * 16) + getreg16(bx) + di + Disp
- Case 2: temp1 = (useseg * 16) + bp + si + Disp
- Case 3: temp1 = (useseg * 16) + bp + di + Disp
- Case 4: temp1 = (useseg * 16) + si + Disp
- Case 5: temp1 = (useseg * 16) + di + Disp
- Case 6: temp1 = (useseg * 16) + bp + Disp
- Case 7: temp1 = (useseg * 16) + getreg16(bx) + Disp
- End Select
- Case 3
- Select Case rmval
- Case 0: al = value
- Case 1: cl = value
- Case 2: dl = value
- Case 3: bl = value
- Case 4: ah = value
- Case 5: ch = value
- Case 6: dh = value
- Case 7: bh = value
- End Select
- Exit Sub
- End Select
- write86 temp1, value
- End Sub
- Sub reljump(ByVal value as UInteger)
- ip = ip + signed8(value)
- End Sub
- Function makeflagsword() as UInteger
- makeflagsword = cf + 2 + (pf * 4) + (af * 16) + (zf * 64) + (sf * 128) + (tf * 256) + (ifl * 512) + (df * 1024) + (of * 2048)
- End Function
- Sub decodeflagsword(ByVal value as UInteger)
- cf = value And 1
- If (value And 4) Then pf = 1 Else pf = 0
- If (value And 16) Then af = 1 Else af = 0
- If (value And 64) Then zf = 1 Else zf = 0
- If (value And 128) Then sf = 1 Else sf = 0
- If (value And 256) Then tf = 1 Else tf = 0
- If (value And 512) Then ifl = 1 Else ifl = 0
- If (value And 1024) Then df = 1 Else df = 0
- If (value And 2048) Then of = 1 Else of = 0
- End Sub
- Sub reset86()
- Dim i as UInteger
- For i = 0 To 255
- onescount = 0
- If (i And 128) <> 0 Then onescount = onescount + 1
- If (i And 64) <> 0 Then onescount = onescount + 1
- If (i And 32) <> 0 Then onescount = onescount + 1
- If (i And 16) <> 0 Then onescount = onescount + 1
- If (i And 8) <> 0 Then onescount = onescount + 1
- If (i And 4) <> 0 Then onescount = onescount + 1
- If (i And 2) <> 0 Then onescount = onescount + 1
- If (i And 1) <> 0 Then onescount = onescount + 1
- If (onescount And 1) = 1 Then Parity(i) = 0 Else Parity(i) = 1
- Next i
- 'If Len(Command$) = 0 Then
- Open "xtbios.bin" For Binary As #1
- 'Else
- ' Open Command$ For Binary As #1
- 'End If
- tempbios$ = Space$(LOF(1)): Get #1, , tempbios$
- Close #1
- For i = 1 To Len(tempbios$)
- RAM(1048575 - Len(tempbios$) + i) = Asc(Mid$(tempbios$, i, 1))
- ReadOnly(1048575 - Len(tempbios$) + i) = 1
- Next i
- If Len(tempbios$) <= 8192 Then 'if the BIOS is 8 KB or less, we have enough room to drop in ROM BASIC
- Open "rombasic.bin" For Binary As #1
- tempbasic$ = Space$(32768): Get #1, , tempbasic$
- Close #1
- For i = 1 To 32768
- RAM(&HF5FFF + i) = Asc(Mid$(tempbasic$, i, 1))
- ReadOnly(&HF5FFF + i) = 1
- Next i
- End If
- For i = 0 To 3999 Step 2
- RAM(videobase + i) = 0
- RAM(videobase + i + 1) = 7
- Next i
- cs = &HFFFF&: ip = 0
- sp = &HFFFE&
- 'cs = &hF000&: ip = &hE000&
- 'UpdateUI
- End Sub
- Sub exec86()
- Dim mcp as UInteger
- Dim DoContinue As Byte
- Dim curtimer As Single
- curtimer = Timer
- If curtimer - lasttimer >= 18.2 Then 'this is crude, but at least it will run the interrupt periodically
- If read86(8*4+2)>0 Then intcall86 8
- End If
- lasttimer = curtimer
- For multiexec = 1 To execloops
- reptype = 0: DoContinue = 0
- useseg = ds: segoverride = 0
- While (DoContinue = 0)
- 'If cs = &hf600& Then hitbasic = 1
- DoContinue = 1
- If execloops > 1 And CheckBreakpoint = 1 Then Running = 0: Exit Sub
- savecs = cs: saveip = ip: opcode = getmem8(cs, ip): StepIP 1
- totalexec = totalexec + 1
- 'If dodisasm Then Print Oplist(opcode)+" ";
- 'segment prefix check
- Select Case opcode
- Case &H2E 'segment CS
- useseg = cs: segoverride = 1: DoContinue = 0
- Case &H3E 'segment DS
- useseg = ds: segoverride = 1: DoContinue = 0
- Case &H26 'segment ES
- useseg = es: segoverride = 1: DoContinue = 0
- Case &H36 'segment SS
- useseg = ss: segoverride = 1: DoContinue = 0
- End Select
- 'repetition prefix check
- Select Case opcode
- Case &HF3 'REP/REPE/REPZ
- reptype = 1: DoContinue = 0
- Case &HF2 'REPNE/REPNZ
- reptype = 2: DoContinue = 0
- End Select
- If TraceLog = 1 Then WriteLogExec
- If hitbasic = 1 Then WriteLogExec
- Wend
- Select Case opcode
- Case &H0 '00 ADD Eb Gb
- modregrm
- oper1 = readrm8(rm): oper2 = getreg8(reg)
- op_add 0: writerm8 rm, result
- Case &H1 '01 ADD Ev Gv
- modregrm
- oper1 = readrm16(rm): oper2 = getreg16(reg)
- op_add 1: writerm16 rm, result
- Case &H2 '02 ADD Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(rm)
- op_add 0: putreg8 reg, result
- Case &H3 '03 ADD Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(rm)
- op_add 1: putreg16 reg, result
- Case &H4 '04 ADD AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
- op_add 0: al = result
- Case &H5 '05 ADD eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
- op_add 1: putreg16 ax, result
- Case &H6 '06 PUSH ES
- push es
- Case &H7 '07 POP ES
- es = pop
- Case &H8 '08 OR Eb Gb
- modregrm
- oper1 = readrm8(rm): oper2 = getreg8(reg)
- op_or 0: writerm8 rm, result
- Case &H9 '09 OR Ev Gv
- modregrm
- oper1 = readrm16(rm): oper2 = getreg16(reg)
- op_or 1: writerm16 rm, result
- Case &HA '0A OR Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(rm)
- op_or 0: putreg8 reg, result
- Case &HB '0B OR Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(rm)
- op_or 1: putreg16 reg, result
- Case &HC '0C OR AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
- op_or 0: al = result
- Case &HD '0D OR eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
- op_or 1: putreg16 ax, result
- Case &HE '0E PUSH CS
- push cs
- Case &HF '0F POP CS
- cs = pop
- Case &H10 '10 ADC Eb Gb
- modregrm
- oper1 = readrm8(rm): oper2 = getreg8(reg)
- op_adc 0: writerm8 rm, result
- Case &H11 '11 ADC Ev Gv
- modregrm
- oper1 = readrm16(rm): oper2 = getreg16(reg)
- op_adc 1: writerm16 rm, result
- Case &H12 '12 ADC Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(rm)
- op_adc 0: putreg8 reg, result
- Case &H13 '13 ADC Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(rm)
- op_adc 1: putreg16 reg, result
- Case &H14 '14 ADC AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
- op_adc 0: al = result
- Case &H15 '15 ADC eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
- op_adc 1: putreg16 ax, result
- Case &H16 '16 PUSH SS
- push ss
- Case &H17 '17 POP SS
- ss = pop
- Case &H18 '18 SBB Eb Gb
- modregrm
- oper1 = readrm8(rm): oper2 = getreg8(reg)
- op_sbb 0: writerm8 rm, result
- Case &H19 '19 SBB Ev Gv
- modregrm
- oper1 = readrm16(rm): oper2 = getreg16(reg)
- op_sbb 1: writerm16 rm, result
- Case &H1A '1A SBB Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(rm)
- op_sbb 0: putreg8 reg, result
- Case &H1B '1B SBB Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(rm)
- op_sbb 1: putreg16 reg, result
- Case &H1C '1C SBB AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
- op_sbb 0: al = result
- Case &H1D '1D SBB eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
- op_sbb 1: putreg16 ax, result
- Case &H1E '1E PUSH DS
- push ds
- Case &H1F '1F POP DS
- ds = pop
- Case &H20 '20 AND Eb Gb
- modregrm
- oper1 = readrm8(rm): oper2 = getreg8(reg)
- op_and 0: writerm8 rm, result
- Case &H21 '21 AND Ev Gv
- modregrm
- oper1 = readrm16(rm): oper2 = getreg16(reg)
- op_and 1: writerm16 rm, result
- Case &H22 '22 AND Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(reg)
- op_and 0: putreg8 rm, result
- Case &H23 '23 AND Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(reg)
- op_and 1: putreg16 rm, result
- Case &H24 '24 AND AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
- op_and 0: al = result
- Case &H25 '25 AND eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
- op_and 1: putreg16 ax, result
- Case &H27 '27 DAA
- If (al And &HF&) > 9 Or af = 1 Then
- al = al + 6
- If (al And &hFF00&) Then cf = cf Or 1 Else cf = cf Or 0
- af = 1
- Else
- af = 0
- End If
- If (al And &HF0&) > &H90& Or cf = 1 Then
- al = al + &H60&
- cf = 1
- Else
- cf = 0
- End If
- flag_szp8 al
- Case &H28 '28 SUB Eb Gb
- modregrm
- oper1 = readrm8(rm): oper2 = getreg8(reg)
- op_sub 0: writerm8 rm, result
- Case &H29 '29 SUB Ev Gv
- modregrm
- oper1 = readrm16(rm): oper2 = getreg16(reg)
- op_sub 1: writerm16 rm, result
- Case &H2A '2A SUB Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(rm)
- op_sub 0: putreg8 reg, result
- Case &H2B '2B SUB Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(rm)
- op_sub 1: putreg16 reg, result
- Case &H2C '2C SUB AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
- op_sub 0: al = result
- Case &H2D '2D SUB eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
- op_sub 1: putreg16 ax, result
- Case &H2F '2F DAS
- If (al And 15) > 9 Or af = 1 Then
- al = al - 6
- If (al And &hFF00&) Then cf = cr Or 1 Else cf = cf Or 0
- af = 1
- Else
- af = 0
- End If
- If al > &H90& Or cf = 1 Then
- al = al - &H60&
- cf = 1
- Else
- cf = 0
- End If
- flag_szp8 al
- Case &H30 '30 XOR Eb Gb
- modregrm
- oper1 = readrm8(rm): oper2 = getreg8(reg)
- op_xor 0: writerm8 rm, result
- Case &H31 '31 XOR Ev Gv
- modregrm
- oper1 = readrm16(rm): oper2 = getreg16(reg)
- op_xor 1: writerm16 rm, result
- Case &H32 '32 XOR Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(rm): op_xor 0
- putreg8 reg, result
- Case &H33 '33 XOR Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(rm): op_xor 1
- putreg16 reg, result
- Case &H34 '34 XOR AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1: op_xor 0
- al = result
- Case &H35 '35 XOR eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
- op_xor 1: putreg16 ax, result
- Case &H37 '37 AAA ASCII
- If (al And &HF&) > 9 Or af = 1 Then
- al = al + 6
- ah = ah + 1
- af = 1
- cf = 1
- Else
- af = 0
- cf = 0
- End If
- al = al And &HF&
- 'flag_szp8 al
- Case &H38 '38 CMP Eb Gb
- modregrm
- oper1 = readrm8(rm): oper2 = getreg8(reg)
- op_cmp 0
- Case &H39 '39 CMP Ev Gv
- modregrm
- oper1 = readrm16(rm): oper2 = getreg16(reg)
- op_cmp 1
- Case &H3A '3A CMP Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(rm)
- op_cmp 0
- Case &H3B '3B CMP Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(rm)
- op_cmp 1
- Case &H3C '3C CMP AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1
- If hitbasic = 1 Then Print "imm8 = "+Str$(oper2) +" al = "+Str$(al)
- op_cmp 0
- Case &H3D '3D CMP eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2
- op_cmp 1
- Case &H3F '3F AAS ASCII
- If (al And &HF&) > 9 Or af = 1 Then
- al = al - 6
- ah = ah - 1
- af = 1
- cf = 1
- Else
- af = 0
- cf = 0
- End If
- al = al And &HF&
- 'flag_szp8 al
- Case &H40 '40 INC eAX
- oper1 = getreg16(ax): oper2 = 1
- temp = cf: op_add 1: cf = temp: putreg16 ax, result
- Case &H41 '41 INC eCX
- oper1 = getreg16(cx): oper2 = 1
- temp = cf: op_add 1: cf = temp: putreg16 cx, result
- Case &H42 '42 INC eDX
- oper1 = getreg16(dx): oper2 = 1
- temp = cf: op_add 1: cf = temp: putreg16 dx, result
- Case &H43 '43 INC eBX
- oper1 = getreg16(bx): oper2 = 1
- temp = cf: op_add 1: cf = temp: putreg16 bx, result
- Case &H44 '44 INC eSP
- oper1 = sp: oper2 = 1
- temp = cf: op_add 1: cf = temp: sp = result
- Case &H45 '45 INC eBP
- oper1 = bp: oper2 = 1
- temp = cf: op_add 1: cf = temp: bp = result
- Case &H46 '46 INC eSI
- oper1 = si: oper2 = 1
- temp = cf: op_add 1: cf = temp: si = result
- Case &H47 '47 INC eDI
- oper1 = di: oper2 = 1
- temp = cf: op_add 1: cf = temp: di = result
- Case &H48 '48 DEC eAX
- oper1 = getreg16(ax): oper2 = 1
- temp = cf: op_sub 1: cf = temp: putreg16 ax, result
- Case &H49 '49 DEC eCX
- oper1 = getreg16(cx): oper2 = 1
- temp = cf: op_sub 1: cf = temp: putreg16 cx, result
- Case &H4A '4A DEC eDX
- oper1 = getreg16(dx): oper2 = 1
- temp = cf: op_sub 1: cf = temp: putreg16 dx, result
- Case &H4B '4B DEC eBX
- oper1 = getreg16(bx): oper2 = 1
- temp = cf: op_sub 1: cf = temp: putreg16 bx, result
- Case &H4C '4C DEC eSP
- oper1 = sp: oper2 = 1
- temp = cf: op_sub 1: cf = temp: sp = result
- Case &H4D '4D DEC eBP
- oper1 = bp: oper2 = 1
- temp = cf: op_sub 1: cf = temp: bp = result
- Case &H4E '4E DEC eSI
- oper1 = si: oper2 = 1
- temp = cf: op_sub 1: cf = temp: si = result
- Case &H4F '4F DEC eDI
- oper1 = di: oper2 = 1
- temp = cf: op_sub 1: cf = temp: di = result
- Case &H50 '50 PUSH eAX
- push getreg16(ax)
- Case &H51 '51 PUSH eCX
- push getreg16(cx)
- Case &H52 '52 PUSH eDX
- push getreg16(dx)
- Case &H53 '53 PUSH eBX
- push getreg16(bx)
- Case &H54 '54 PUSH eSP
- push sp
- Case &H55 '55 PUSH eBP
- push bp
- Case &H56 '56 PUSH eSI
- push si
- Case &H57 '57 PUSH eDI
- push di
- Case &H58 '58 POP eAX
- putreg16 ax, pop
- Case &H59 '59 POP eCX
- putreg16 cx, pop
- Case &H5A '5A POP eDX
- putreg16 dx, pop
- Case &H5B '5B POP eBX
- putreg16 bx, pop
- Case &H5C '5C POP eSP
- sp = pop
- Case &H5D '5D POP eBP
- bp = pop
- Case &H5E '5E POP eSI
- si = pop
- Case &H5F '5F POP eDI
- di = pop
- Case &h60 '60 PUSHA
- push getreg16(ax)
- push getreg16(cx)
- push getreg16(dx)
- push getreg16(bx)
- push sp: push bp: push si: push di
- Case &h61 '61 POPA
- di = pop: si = pop: bp = pop: sp = pop
- putreg16 bx, pop: putreg16 dx, pop: putreg16 cx, pop: putreg16 ax, pop
- Case &H70 '70 JO Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If of <> 0 Then reljump oper1
- Case &H71 '71 JNO Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If of = 0 Then reljump oper1
- Case &H72 '72 JB Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If cf <> 0 Then reljump oper1
- Case &H73 '73 JNB Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If cf = 0 Then reljump oper1
- Case &H74 '74 JZ Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If zf <> 0 Then reljump oper1
- Case &H75 '75 JNZ Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If zf = 0 Then reljump oper1
- Case &H76 '76 JBE Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If cf <> 0 Or zf <> 0 Then reljump oper1
- Case &H77 '77 JA Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If cf = 0 And zf = 0 Then reljump oper1
- Case &H78 '78 JS Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If sf <> 0 Then reljump oper1
- Case &H79 '79 JNS Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If sf = 0 Then reljump oper1
- Case &H7A '7A JPE Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If pf <> 0 Then reljump oper1
- Case &H7B '7B JPO Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If pf = 0 Then reljump oper1
- Case &H7C '7C JL Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If sf <> of Then reljump oper1
- Case &H7D '7D JGE Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If sf = of Then reljump oper1
- Case &H7E '7E JLE Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If sf <> of Or zf <> 0 Then reljump oper1
- Case &H7F '7F JG Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If zf = 0 And sf = of Then reljump oper1
- Case &H80, &H82 '80/82 GRP1 Eb Ib
- modregrm
- oper1 = readrm8(rm): oper2 = getmem8(cs, ip): StepIP 1
- 'MsgBox "GRP1" + CrLf + "Ib = " + Hex$(oper2) + CrLf + "Eb = " + Hex$(oper1)
- op_grp1 0: If reg < 7 Then writerm8 rm, result
- Case &H81 '81 GRP1 Ev Iv
- modregrm
- oper1 = readrm16(rm): oper2 = getmem16(cs, ip): StepIP 2
- op_grp1 1: If reg < 7 Then writerm16 rm, result
- Case &H83 '83 GRP1 Ev Ib
- modregrm
- oper1 = readrm16(rm): oper2 = getmem8(cs, ip): StepIP 1
- If (oper2 And &h80&) Then oper2 = &hFF00 Or oper2
- op_grp1 1: If reg < 7 Then writerm8 rm, result
- Case &H84 '84 TEST Gb Eb
- modregrm
- oper1 = getreg8(reg): oper2 = readrm8(rm)
- op_test 0
- Case &H85 '85 TEST Gv Ev
- modregrm
- oper1 = getreg16(reg): oper2 = readrm16(rm)
- op_test 1
- Case &H86 '86 XCHG Gb Eb
- modregrm
- oper1 = getreg8(reg)
- putreg8 reg, readrm8(rm)
- writerm8 rm, oper1
- Case &H87 '87 XCHG Gv Ev
- modregrm
- oper1 = getreg16(reg)
- putreg16 reg, readrm16(rm)
- writerm16 rm, oper1
- Case &H88 '88 MOV Eb Gb
- modregrm
- writerm8 rm, getreg8(reg)
- Case &H89 '89 MOV Ev Gv
- modregrm
- writerm16 rm, getreg16(reg)
- Case &H8A '8A MOV Gb Eb
- modregrm
- putreg8 reg, readrm8(rm)
- Case &H8B '8B MOV Gv Ev
- modregrm
- putreg16 reg, readrm16(rm)
- Case &H8C '8C MOV Ew Sw
- modregrm
- writerm16 rm, getsegreg(reg)
- Case &H8D '8D LEA Gv M
- modregrm
- putreg16 reg, getea(rm) - useseg * 16
- 'MsgBox "LEA = " + Hex$(getea(rm) - useseg * 16)
- Case &H8E '8E MOV Sw Ew
- modregrm
- putsegreg reg, readrm16(rm)
- Case &H8F '8F POP Ev
- modregrm
- writerm16 rm, pop
- Case &H90 '90 NOP
- 'DoEvents 'give idle time back to host CPU
- Case &H91 '91 XCHG eCX eAX
- oper1 = getreg16(cx)
- putreg16 cx, getreg16(ax)
- putreg16 ax, oper1
- Case &H92 '92 XCHG eDX eAX
- oper1 = getreg16(dx)
- putreg16 dx, getreg16(ax)
- putreg16 ax, oper1
- Case &H93 '93 XCHG eBX eAX
- oper1 = getreg16(bx)
- putreg16 bx, getreg16(ax)
- putreg16 ax, oper1
- Case &H94 '94 XCHG eSP eAX
- oper1 = sp
- sp = getreg16(ax)
- putreg16 ax, oper1
- Case &H95 '95 XCHG eBP eAX
- oper1 = bp
- bp = getreg16(ax)
- putreg16 ax, oper1
- Case &H96 '96 XCHG eSI eAX
- oper1 = si
- si = getreg16(ax)
- putreg16 ax, oper1
- Case &H97 '97 XCHG eDI eAX
- oper1 = di
- di = getreg16(ax)
- putreg16 ax, oper1
- Case &H98 '98 CBW
- If (al And 128) = 128 Then ah = 255 Else ah = 0
- Case &H99 '99 CWD
- If (getreg16(ax) And 32768) = 32768 Then putreg16 dx, 65535 Else putreg16 dx, 0
- Case &H9A '9A CALL Ap
- oper1 = getmem16(cs, ip): StepIP 2
- oper2 = getmem16(cs, ip): StepIP 2
- push cs: push ip: ip = oper1: cs = oper2
- Case &H9B '9B WAIT
- Case &H9C '9C PUSHF
- push makeflagsword
- Case &H9D '9D POPF
- decodeflagsword pop
- Case &H9E '9E SAHF
- decodeflagsword (makeflagsword And &HFF00&) + ah
- Case &H9F '9F LAHF
- ah = makeflagsword And 255
- Case &HA0 'A0 MOV AL Ob
- al = getmem8(useseg, getmem16(cs, ip)): StepIP 2
- Case &HA1 'A1 MOV eAX Ov
- putreg16 ax, getmem16(useseg, getmem16(cs, ip)): StepIP 2
- Case &HA2 'A2 MOV Ob AL
- write86 (useseg * 16) + getmem16(cs, ip), al: StepIP 2
- Case &HA3 'A3 MOV Ov eAX
- putmem16 useseg, getmem16(cs, ip), getreg16(ax): StepIP 2
- Case &HA4 'A4 MOVSB
- Do
- If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
- write86 (es * 16) + di, getmem8(useseg, si)
- If df Then di = di - 1: si = si - 1 Else di = di + 1: si = si + 1
- di = di And 65535: si = si And 65535
- If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
- totalexec = totalexec + 1
- Loop Until reptype <> 1
- Case &HA5 'A5 MOVSW
- Do
- If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
- putmem16 es, di, getmem16(useseg, si)
- If df Then di = di - 2: si = si - 2 Else di = di + 2: si = si + 2
- di = di And 65535: si = si And 65535
- If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
- totalexec = totalexec + 1
- Loop Until reptype <> 1
- Case &HA6 'A6 CMPSB
- Do
- If (reptype <> 0) And (getreg16(cx) = 0) Then Exit Do
- oper1 = getmem8(es, di): oper2 = getmem8(useseg, si): op_cmp 0
- If df Then di = di - 1: si = si - 1 Else di = di + 1: si = si + 1
- 'If di < 0 Then di = 65536 + di
- 'If si < 0 Then si = 65536 + si
- di = di And 65535: si = si And 65535
- 'MsgBox "reptype" + Str$(reptype) + CrLf + "CX: " + Hex$(getreg16(cx)) + CrLf + "ZF:" + Str$(zf)
- If reptype <> 0 Then putreg16 cx, getreg16(cx) - 1
- If reptype = 1 Then If zf = 0 Then Exit Do
- If reptype = 2 Then If zf = 1 Then Exit Do
- totalexec = totalexec + 1
- Loop Until reptype = 0
- Case &HA7 'A7 CMPSW
- Do
- If (reptype <> 0) And (getreg16(cx) = 0) Then Exit Do
- oper1 = getmem16(es, di): oper2 = getmem16(useseg, si): op_cmp 1
- If df Then di = di - 2: si = si - 2 Else di = di + 2: si = si + 2
- 'If di < 0 Then di = 65536 + di
- 'If si < 0 Then si = 65536 + si
- di = di And 65535: si = si And 65535
- If reptype <> 0 Then putreg16 cx, getreg16(cx) - 1
- If reptype = 1 Then If zf = 0 Then Exit Do
- If reptype = 2 Then If zf = 1 Then Exit Do
- totalexec = totalexec + 1
- Loop Until reptype = 0
- Case &HA8 'A8 TEST AL Ib
- oper1 = al: oper2 = getmem8(cs, ip): StepIP 1: op_test 0
- Case &HA9 'A9 TEST eAX Iv
- oper1 = getreg16(ax): oper2 = getmem16(cs, ip): StepIP 2: op_test 1
- Case &HAA 'AA STOSB
- Do
- If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
- write86 (es * 16) + di, al
- If df Then di = di - 1 Else di = di + 1
- di = di And 65535
- If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
- totalexec = totalexec + 1
- Loop Until reptype <> 1
- Case &HAB 'AB STOSW
- Do
- If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
- putmem16 es, di, getreg16(ax)
- If df Then di = di - 2 Else di = di + 2
- di = di And 65535
- If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
- totalexec = totalexec + 1
- Loop Until reptype <> 1
- Case &HAC 'AC LODSB
- If hitbasic = 1 Then Print "LODSB segment: " + Hex$(useseg)
- Do
- If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
- al = getmem8(useseg, si)
- If df Then si = si - 1 Else si = si + 1
- si = si And 65535
- If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
- totalexec = totalexec + 1
- Loop Until reptype <> 1
- Case &HAD 'AD LODSW
- Do
- If (reptype = 1) And (getreg16(cx) = 0) Then Exit Do
- putreg16 ax, getmem16(useseg, si)
- If df Then si = si - 2 Else si = si + 2
- si = si And 65535
- If reptype = 1 Then putreg16 cx, getreg16(cx) - 1
- totalexec = totalexec + 1
- Loop Until reptype <> 1
- Case &HAE 'AE SCASB
- Do
- If (reptype <> 0) And (getreg16(cx) = 0) Then Exit Do
- oper1 = al: oper2 = getmem8(es, di): op_sub 0
- If df Then di = di - 1 Else di = di + 1
- di = di And 65535
- If reptype <> 0 Then putreg16 cx, getreg16(cx) - 1
- totalexec = totalexec + 1
- If reptype = 1 Then If zf = 0 Then Exit Do
- If reptype = 2 Then If zf = 1 Then Exit Do
- Loop Until reptype = 0
- Case &HAF 'AF SCASW
- Do
- If (reptype <> 0) And (getreg16(cx) = 0) Then Exit Do
- oper1 = getreg16(ax): oper2 = getmem16(es, di): op_sub 1
- If df Then di = di - 2 Else di = di + 2
- di = di And 65535
- If reptype <> 0 Then putreg16 cx, getreg16(cx) - 1
- If reptype = 1 Then If zf = 0 Then Exit Do
- If reptype = 2 Then If zf = 1 Then Exit Do
- totalexec = totalexec + 1
- Loop Until reptype = 0
- Case &HB0 'B0 MOV AL Ib
- al = getmem8(cs, ip): StepIP 1
- Case &HB1 'B1 MOV CL Ib
- cl = getmem8(cs, ip): StepIP 1
- Case &HB2 'B2 MOV DL Ib
- dl = getmem8(cs, ip): StepIP 1
- Case &HB3 'B3 MOV BL Ib
- bl = getmem8(cs, ip): StepIP 1
- Case &HB4 'B4 MOV AH Ib
- ah = getmem8(cs, ip): StepIP 1
- Case &HB5 'B5 MOV CH Ib
- ch = getmem8(cs, ip): StepIP 1
- Case &HB6 'B6 MOV DH Ib
- dh = getmem8(cs, ip): StepIP 1
- Case &HB7 'B7 MOV BH Ib
- bh = getmem8(cs, ip): StepIP 1
- Case &HB8 'B8 MOV eAX Iv
- putreg16 ax, getmem16(cs, ip): StepIP 2
- Case &HB9 'B9 MOV eCX Iv
- putreg16 cx, getmem16(cs, ip): StepIP 2
- Case &HBA 'BA MOV eDX Iv
- putreg16 dx, getmem16(cs, ip): StepIP 2
- Case &HBB 'BB MOV eBX Iv
- putreg16 bx, getmem16(cs, ip): StepIP 2
- Case &HBC 'BC MOV eSP Iv
- sp = getmem16(cs, ip): StepIP 2
- Case &HBD 'BD MOV eBP Iv
- bp = getmem16(cs, ip): StepIP 2
- Case &HBE 'BE MOV eSI Iv
- si = getmem16(cs, ip): StepIP 2
- Case &HBF 'BF MOV eDI Iv
- di = getmem16(cs, ip): StepIP 2
- Case &HC0 'C0 GRP2 byte imm8 (80186+)
- modregrm
- oper1 = readrm8(rm): oper2 = getmem8(cs, ip): StepIP 1
- op_grp2 0: writerm8 rm, result
- Case &HC1 'C1 GRP2 word imm8 (80186+)
- modregrm
- oper1 = readrm16(rm): oper2 = getmem8(cs, ip): StepIP 1
- op_grp2 1: writerm16 rm, result
- Case &HC2 'C2 RET Iw
- oper1 = getmem16(cs, ip): ip = pop
- sp = (sp + oper1) And 65535
- Case &HC3 'C3 RET
- ip = pop
- Case &HC4 'C4 LES Gv Mp
- modregrm
- temp2 = getea(rm)
- putreg16 reg, getmem16(temp2 \ 16, temp2 Mod 16) 'read86(temp2) + read86(temp2 + 1) * 256
- temp2 = temp2 + 2
- es = getmem16(temp2 \ 16, temp2 Mod 16) 'read86(temp2 + 2) + read86(temp2 + 3) * 256
- Case &HC5 'C5 LDS Gv Mp
- modregrm
- temp2 = getea(rm)
- putreg16 reg, getmem16(temp2 \ 16, temp2 Mod 16) 'read86(temp2) + read86(temp2 + 1) * 256
- temp2 = temp2 + 2
- ds = getmem16(temp2 \ 16, temp2 Mod 16) 'read86(temp2 + 2) + read86(temp2 + 3) * 256
- Case &HC6 'C6 MOV Eb Ib
- modregrm
- writerm8 rm, getmem8(cs, ip): StepIP 1
- Case &HC7 'C7 MOV Ev Iv
- modregrm
- writerm16 rm, getmem16(cs, ip): StepIP 2
- 'Case &HC9 'C9 LEAVE (80186+)
- ' sp = bp
- ' bp = pop
- Case &HCA 'CA RETF Iw
- oper1 = getmem16(cs, ip): ip = pop: cs = pop
- sp = (sp + oper1) And 65535
- Case &HCB 'CB RETF
- ip = pop: cs = pop
- Case &HCC 'CC INT 3
- intcall86 3
- Case &HCD 'CD INT Ib
- oper1 = getmem8(cs, ip): StepIP 1
- intcall86 oper1
- Case &HCE 'CE INTO
- If of Then intcall86 4
- Case &HCF 'CF IRET
- ip = pop: cs = pop: decodeflagsword (pop)
- Case &HD0 'D0 GRP2 Eb 1
- modregrm
- oper1 = readrm8(rm): oper2 = 1
- op_grp2 0: writerm8 rm, result
- Case &HD1 'D1 GRP2 Ev 1
- modregrm
- oper1 = readrm16(rm): oper2 = 1
- op_grp2 1: writerm16 rm, result
- Case &HD2 'D2 GRP2 Eb CL
- modregrm
- oper1 = readrm8(rm): oper2 = cl
- op_grp2 0: writerm8 rm, result
- Case &HD3 'D3 GRP2 Ev CL
- modregrm
- oper1 = readrm16(rm): oper2 = cl
- op_grp2 1: writerm16 rm, result
- Case &HD4 'D4 AAM I0
- oper1 = getmem8(cs, ip): StepIP 1
- If oper1 = 0 Then intcall86 0: Exit Sub 'division by zero
- ah = al \ oper1
- al = al Mod oper1
- flag_szp16 getreg16(ax)
- Case &HD5 'D5 AAD I0
- oper1 = getmem8(cs, ip): StepIP 1
- al = ah * oper1 + al
- ah = 0
- flag_szp16 getreg16(ax And &HFF)
- Case &HD7 'D7 XLAT
- al = getmem8(useseg, bx + al) '((bx + al) And 65535))
- Case &HD8 To &HDF 'floating point op escape code
- StepIP 1 'we don't have FPU emulation, so we skip the rest of this code
- intcall86 7 'and trip the device not found exception
- Case &HE0 'E0 LOOPNZ Jb
- oper1 = getmem8(cs, ip): StepIP 1
- putreg16 cx, getreg16(cx) - 1
- If (getreg16(cx) <> 0) And (zf = 0) Then reljump oper1
- Case &HE1 'E1 LOOPZ Jb
- oper1 = getmem8(cs, ip): StepIP 1
- putreg16 cx, getreg16(cx) - 1
- If (getreg16(cx) <> 0) And (zf = 1) Then reljump oper1
- Case &HE2 'E2 LOOP Jb
- oper1 = getmem8(cs, ip): StepIP 1
- putreg16 cx, getreg16(cx) - 1
- If getreg16(cx) <> 0 Then reljump oper1
- Case &HE3 'E3 JCXZ Jb
- oper1 = getmem8(cs, ip): StepIP 1
- If getreg16(cx) = 0 Then reljump oper1
- Case &HE4 'E4 IN AL Ib
- oper1 = getmem8(cs, ip)
- al = 255
- StepIP 1
- Case &HE5 'E5 IN eAX Ib
- oper1 = getmem8(cs, ip)
- putreg16 ax, 255
- StepIP 1
- Case &HE6 'E6 OUT Ib AL
- oper1 = getmem8(cs, ip)
- StepIP 1
- Case &HE7 'E7 OUT Ib eAX
- oper1 = getmem8(cs, ip)
- StepIP 1
- Case &HE8 'E8 CALL Jv
- oper1 = getmem16(cs, ip): StepIP 2: push ip
- ip = (ip + signed16(oper1)) And 65535
- Case &HE9 'E9 JMP Jv
- oper1 = getmem16(cs, signed16(ip)): StepIP 2
- ip = (ip + signed16(oper1)) And 65535
- Case &HEA 'EA JMP Ap
- temp1 = getmem16(cs, ip): StepIP 2
- temp2 = getmem16(cs, ip): ip = temp1: cs = temp2
- Case &HEB 'EB JMP Jb
- oper1 = getmem8(cs, ip): StepIP 1
- ip = (ip + signed8(oper1)) And 65535
- Case &HEC 'EC IN AL DX
- oper1 = getmem8(cs, ip)
- al = 255
- Case &HED 'ED IN eAX DX
- oper1 = getmem8(cs, ip)
- putreg16 ax, 255
- Case &HEE 'EE OUT DX AL
- oper1 = getmem8(cs, ip)
- Case &HEF 'EF OUT DX eAX
- oper1 = getmem8(cs, ip)
- Print #4, "PORT OUT "+Hex$(getreg16(0))+"h"
- Case &HF0 'F0 LOCK
- 'ignore this, it's useful only in multiprocessor configurations to lock the bus.
- Case &HF4 'F4 HLT
- ip = ip - 1
- Running = 0
- Case &HF5 'F5 CMC
- If cf = 0 Then cf = 1 Else cf = 0
- Case &HF6 'F6 GRP3a Eb
- modregrm
- oper1 = readrm8(rm): op_grp3 0: If reg > 1 And reg < 4 Then writerm8 rm, result
- Case &HF7 'F7 GRP3b Ev
- modregrm
- oper1 = readrm16(rm): op_grp3 1: If reg > 1 And reg < 4 Then writerm16 rm, result
- Case &HF8 'F8 CLC
- cf = 0
- Case &HF9 'F9 STC
- cf = 1
- Case &HFA 'FA CLI
- ifl = 0
- Case &HFB 'FB STI
- ifl = 1
- Case &HFC 'FC CLD
- df = 0
- Case &HFD 'FD STD
- df = 1
- Case &HFE 'FE GRP4 Eb
- modregrm
- oper1 = readrm8(rm): oper2 = 1
- If hitbasic = 1 Then Print " Reg: " + Hex$(reg)
- If reg = 0 Then
- temp = cf: op_add 0: cf = temp: writerm8 rm, result
- Else
- temp = cf: op_sub 0: cf = temp: writerm8 rm, result
- End If
- Case &HFF 'FF GRP5 Ev
- modregrm
- oper1 = readrm16(rm)
- op_grp5
- Case Else
- ' Screen 0
- ' Print "HIT OPCODE "+Hex$(opcode) +" @ "+Hex$(cs)+":"+Hex$(ip)
- ' Print " AX: " + Hex$(getreg16(ax)) +" BX: " + Hex$(getreg16(bx)) + " CX: " + Hex$(getreg16(cx)) + " DX: " + Hex$(getreg16(dx))
- 'end
- 'If hitbasic = 0 Then ScreenRes 640,400,24
- 'If Len(Oplist(opcode)) > 0 Then
- '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)
- 'Running = 0
- 'end
- 'End If
- 'intcall86 6
- ' Else
- ' If ifl = 1 Then intcall86 6
- ' End If
- End Select
- 'AddTrace CurTracePos
- 'If CurTracePos < 100 Then CurTracePos = CurTracePos + 1
- If TraceLog = 1 Then WriteLog
- If hitbasic = 1 Then WriteLog
- If Running = 0 Then Exit For
- Next multiexec
- 'UpdateMemView
- UpdateUI
- End Sub
- Sub UpdateUI()
- 'frmDebug.lblCSIP = Right$("000" + Hex$(cs), 4) + ":" + Right$("000" + Hex$(ip), 4)
- 'frmDebug.lblAX = Hex$(getreg16(ax)): frmDebug.lblBX = Hex$(getreg16(bx))
- 'frmDebug.lblCX = Hex$(getreg16(cx)): frmDebug.lblDX = Hex$(getreg16(dx))
- 'frmDebug.lblSP = Hex$(sp): frmDebug.lblBP = Hex$(bp): frmDebug.lblSI = Hex$(si)
- 'frmDebug.lblDI = Hex$(di): frmDebug.lblDS = Hex$(ds): frmDebug.lblSS = Hex$(ss)
- 'frmDebug.lblES = Hex$(es): frmDebug.lblCF = Hex$(cf): frmDebug.lblPF = Hex$(pf)
- 'frmDebug.lblZF = Hex$(zf): frmDebug.lblSF = Hex$(sf): frmDebug.lblTF = Hex$(tf)
- 'frmDebug.lblIF = Hex$(ifl): frmDebug.lblDF = Hex$(df): frmDebug.lblOF = Hex$(of)
- 'frmDebug.lblAF = Hex$(af)
- 'frmDebug.lblInstruction = Oplist(getmem8(cs, ip))
- 'frmDebug.lblTotal = totalexec
- End Sub
- Function CheckBreakpoint() As Byte
- 'For n = 0 To frmExtended.lstBrk.ListCount - 1
- ' If Val("&H" + frmExtended.lstBrk.List(n)) = cs * 16 + ip Then
- ' execloops = 1
- ' MsgBox "Breakpoint reached at 0" + frmExtended.lstBrk.List(n) + "h", vbInformation, "Breakpoint encountered"
- ' CheckBreakpoint = 1
- ' Exit Function
- ' End If
- 'Next n
- CheckBreakpoint = 0
- End Function
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement