CPU Simulation
Digital logic | OS | คำสั่งดอส | Batch | Debug | Assembly | GWBasic | Docker |
จำลองการทำงาน (Simulation)
ของหน่วยประมวลผลของคอมพิวเตอร์ยุค 8 Bit
ขั้นตอนการทดสอบโปรแกรม : 
- Download: computer80286.zip หรือ computer1_en50.zip
- เปิดโปรแกรม
- กด F2 เข้าส่วนของ Data
- กด F4 เพื่อ Load แฟ้มตัวอย่าง
- พิมพ์ชื่อแฟ้มที่มีอยู่เช่น add_8bit.cpu
- กด ESC กลับสู่ส่วนการ Data
- กด ESC กลับสู่ Main Menu
- กด F3 เข้าสู่ Editor แสดง Simulation
- กด F5 หรือ F6 ไปบรรทัดที่ต้องการ
- กด F3 เพื่อพิมพ์ภาษา Assembly แทนตำแหน่งเดิม
- กด F2 เพื่อทำ Simulation [add_8bit.cpu]

* Control Bus ชี้ที่ IP
- ย้าย IP ซึ่งชี้อยู่ที่ 01 เข้า Address Bus
- IP เปลี่ยนเป็น 02 ทันที เพราะมีการเลื่อน IP
- ย้าย 47 จาก Code Segment เข้า OP-Code => Mnemonic คือ mov a,[c]
- ย้าย IP ซึ่งชี้อยู่ที่ 02 เข้า Address Bus
- ย้าย 80 จาก Code Segment ซึ่งชี้อยู่ที่ 02 เข้า Address Bus
- ย้ายข้อมูลมีค่า 37 จาก Data Segment ที่ตำแหน่ง 80 เข้าไป ALU
- ย้ายข้อมูลจาก ALU เข้า Register A
* ย้าย IP ซึ่งชี้อยู่ที่ 03 เข้า Address Bus
Sample code for SIM.
IP: OP-Code Mnemonic

01: 47 80 MOV A,[80]
03: 67 88 ADD A,[88]
05: 3B 90 MOV [90],A
07: 47 80 MOV A,[80]
Screen 1
Screen 2
Screen 3
Screen 4
Screen 5
Screen 6
Screen 7
OpCode of Intel Assembly 80x86
Mnemonics

From :http://www.jegerlehner.ch/intel/opcode.html
TRANSFER
Name Comment Syntax
MOV Move (copy) MOV Dest,Source
XCHG Exchange XCHG Op1,Op2
STC Set Carry STC
CLC Clear Carry CLC
CMC Complement Carry CMC
STD Set Direction STD
CLD Clear Direction CLD
STI Set Interrupt STI
CLI Clear Interrupt CLI
PUSH Push onto stack PUSH Source
PUSHF Push flags PUSHF
PUSHA Push all general registers PUSHA
POP Pop from stack POP Dest
POPF Pop flags POPF
POPA Pop all general registers POPA
CBW Convert byte to word CBW
CWD Convert word to double CWD
CWDE Conv word extended double CWDE
IN Input IN Dest, Port
OUT Output OUT Port, Source

ARITHMETIC
Name Comment Syntax
ADD Add ADD Dest,Source
ADC Add with Carry ADC Dest,Source
SUB Subtract SUB Dest,Source
SBB Subtract with borrow SBB Dest,Source
DIV Divide (unsigned) DIV Op
IDIV Signed Integer Divide IDIV Op
MUL Multiply (unsigned) MUL Op
IMUL Signed Integer Multiply IMUL Op
INC Increment INC Op
DEC Decrement DEC Op
CMP Compare CMP Op1,Op2
SAL Shift arithmetic left SAL Op,Quantity
SAR Shift arithmetic right SAR Op,Quantity
RCL Rotate left through Carry RCL Op,Quantity
RCR Rotate right through Carry RCR Op,Quantity
ROL Rotate left ROL Op,Quantity
ROR Rotate right ROR Op,Quantity

LOGIC
Name Comment Syntax
NEG Negate (two-complement) NEG Op
NOT Invert each bit NOT Op
AND Logical and AND Dest,Source
OR Logical or OR Dest,Source
XOR Logical exclusive or XOR Dest,Source
SHL Shift logical left SHL Op,Quantity
SHR Shift logical right SHR Op,Quantity

MISCELLANEOUS
Name Comment Syntax
NOP No operation NOP
LEA Load effective adress LEA Dest,Source
INT Interrupt INT Nr

JUMPS (general)
Name Comment Syntax
CALL Call subroutine CALL Proc
JMP Jump JMP Dest
JE Jump if Equal JE Dest
JZ Jump if Zero JZ Dest
JCXZ Jump if CX Zero JCXZ Dest
JP Jump if Parity (Parity Even) JP Dest
JPE Jump if Parity Even JPE Dest
RET Return from subroutine RET
JNE Jump if not Equal JNE Dest
JNZ Jump if not Zero JNZ Dest
JECXZ Jump if ECX Zero JECXZ Dest
JNP Jump if no Parity (Parity Odd) JNP Dest
JPO Jump if Parity Odd JPO Dest

JUMPS unsigned (Cardinal)
JA Jump if Above JA Dest
JAE Jump if Above or Equal JAE Dest
JB Jump if Below JB Dest
JBE Jump if Below or Equal JBE Dest
JNA Jump if not Above JNA Dest
JNAE Jump if not Above or Equal JNAE Dest
JNB Jump if not Below JNB Dest
JNBE Jump if not Below or Equal JNBE Dest
JC Jump if Carry JC Dest
JNC Jump if no Carry JNC Dest

JUMPS signed (Integer)
JG Jump if Greater JG Dest
JGE Jump if Greater or Equal JGE Dest
JL Jump if Less JL Dest
JLE Jump if Less or Equal JLE Dest
JNG Jump if not Greater JNG Dest
JNGE Jump if not Greater or Equal JNGE Dest
JNL Jump if not Less JNL Dest
JNLE Jump if not Less or Equal JNLE Dest
JO Jump if Overflow JO Dest
JNO Jump if no Overflow JNO Dest
JS Jump if Sign (= negative) JS Dest
JNS Jump if no Sign (= positive) JNS Dest