2023-02-08 20:51:56 +00:00
## ISA
Instructions vary from 1 to 6 bytes.
### Instructions format
| 6bit | 1bit | 1bit | 2bit | 3bit | 3bit |
| ---------------- | --------- | ---- | ---- | ---- | ---- |
2023-02-19 00:20:53 +00:00
| Opcode | D bit | W bit | MOD | REG | R/M |
2023-02-08 20:51:56 +00:00
2023-02-19 00:20:53 +00:00
* **D**-bit : The register specified in REG field is a source register (D = 0) or destination register (D =1).
* **W**-bit : Specifies whether the instruction operates on bytes (W = 0) or words (W = 1).
2023-02-08 20:51:56 +00:00
On some instructions:
2023-05-23 15:18:33 +00:00
* **S**-bit : An 8-bit 2's complement number. It can be extended to a 16-bit 2’ s complement number internally depending on the W-bit
2023-02-08 20:51:56 +00:00
2023-02-19 00:20:53 +00:00
| S | W | Operation |
| --- | --- | ----------------------------------------------------- |
| 0 | 0 | 8bit operation |
| 0 | 1 | 16bit operation with 16bit immediate operand |
| 1 | 0 | invalid? |
| 1 | 1 | 8bit immediate operand extended to 16 signed internally|
2023-02-08 20:51:56 +00:00
* **V**-bit : V-bit decides the number of shifts for rotate and shift instructions. If V = 0, then count = 1; if V = 1, the count is in CL register. For example, if V = 1 and CL = 2 then shift or rotate instruction shifts or rotates 2-bits
2023-02-19 00:20:53 +00:00
2023-02-08 20:51:56 +00:00
* **Z**-bit : Used as a compare bit with the zero flag in conditional repeat and loop instructions. ex branch if zero is set or clear.
2023-02-17 18:08:09 +00:00
No instruction has parts of its opcode past the first 2 bytes I.e. all bytes after the first two are additional data bytes
2023-02-19 00:20:53 +00:00
The second byte of the instruction usually identifies the instruction's operands. The **MOD** (mode) field weather or not the operands is in memory or if both are registers. In some instructions like the immediate-to-memory type the **REG** field is used as an extension of the opcode. The function of **R/M** depends on how MOD. if MOD=11 (register-register mode) then **R/M** specifies the second Register, otherwise it specifies how the effective address in memory is calculated
2023-02-08 20:51:56 +00:00
2023-02-19 00:20:53 +00:00
|R/M | Memory indirect with no displacement [ 0 0 ] | Memory indirect with 8 bit displacement [ 0 1 ] | Memory indirect with 16 bit displacement [ 1 0 ] | Register Mode [ 1 1 ] W = 0| Register Mode [ 1 1 ] W = 1 |
2023-05-23 15:18:33 +00:00
|---- | ---------------------------------------- | ------------------------------------------- | -------------------------------------------- | --------------------------- | --------------------------- |
2023-02-08 20:51:56 +00:00
|000 | [BX] + [SI] | [BX] + [SI] + d8 | [BX] + [SI] + d16 | AL | AX |
|001 | [BX] + [DI] | [BX] + [DI] + d8 | [BX] + [DI] + d16 | CL | CX |
|010 | [BP] + [SI] | [BP] + [SI] + d8 | [BP] + [SI] + d16 | DL | DX |
|011 | [BP] + [DI] | [BP] + [DI] + d8 | [BP] + [DI] + d16 | BL | BX |
|100 | [SI] | [SI] + d8 | [SI] + d16 | AH | SP |
|101 | [DI] | [DI] + d8 | [DI] + d16 | CH | BP |
|110 | d16 (direct) | [BP] + d8 | [BP] + d16 | DH | SI |
|111 | [BX] | [BX] + d8 | [BX] + d16 | BH | DI |
2023-02-08 23:59:06 +00:00
Example instructions:
| Bytecode | AT& T Syntax | meaning |
| ---------- | --------------- | ---------------------------------------------------------- |
2023-02-09 09:43:13 +00:00
|81 c0 aa 55 | add $0x55aa,%ax | add 0x55aa to register ax |
2023-02-19 00:52:52 +00:00
|03 06 aa 55 | add 0x55aa,%ax | add the contents of memory location 0x55aa to register ax |
2023-02-08 23:59:06 +00:00
|fe c0 | inc %al | increment register al |
|ff c0 | inc %ax | increment register ax |
|40 | inc %ax | increment register ax |
2023-02-19 00:20:53 +00:00
### Flags
Flag register:
|.. |.. |.. |.. | O | D | I | T | S | Z |.. | A |.. | P |.. | C |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
* C - Carry flag : carry out or borrow into the high order bit (8bit/16bit)
* P - Parity flag : set if result has even parity
* A - Auxiliary flag : carry out from the low nibble to the high nibble or an equiv borrow. Used by decimal arithmetic instructions
* Z - Zero flag : Set when result of Operation is zero
* S - Sign flag : set if the high order bit of the result is 1. ie the sign of the result
* T - Trap flag : Set the CPU into single step mode where it generates an interrupt after each instruction
* I - Interrupt flag : 0: interrupts are masked
* D - Direction flag : 1: string instructions decrement 0: they increment
* O - Overflow flag : set on arithmetic overflow
2023-03-03 06:29:06 +00:00
### Memory addressing
Memory is split into two 8bit banks and can be addresses separately with the A0 line and BHE pin
| BHE | A0 | OPERATION |
|:-----:|:----:|-------------------------------|
| 0 | 0 |Both bytes addresses |
| 0 | 1 |Only higher 15:8 bits addressed|
| 1 | 0 |Only lower 7:0 bits addressed |
| 1 | 1 |No bits are addressed |
Essentially address bits 19:1 address a 16bit memory while bits A0 and BHE select what byte(s) will be read or written
|A1,A2| HBE=0 A0=1 | HBE=1 A0=0 |
|-----|:----------:|:----------:|
| 0,0 | B1 | B0 |
| 0,1 | B3 | B2 |
| 1,0 | B5 | B4 |