From WikiChip
Difference between revisions of "intel/mcs-8/isa"
< intel‎ | mcs-8

m (Some of the old opcode mnemonics for Jump, return and call groups were incorrect.)
Line 68: Line 68:
 
* [[#machine|Machine Instructions]]
 
* [[#machine|Machine Instructions]]
  
In 1972, Intel introduce their first set of mnemonics for their instructions. This original set consists of three characters which meant it could easily be encoded into a lookup table. A few years later, when they released their {{intel|8080}} and its instruction set, they also revamped the 8008 mnemonics to match the 8080's ones more closely. The newer mnemonics resemble a primitive version of modern x86 mnemonics. Since 8008 programs can be found using bother mnemonics, both the "old" and the "new" mnemonics are listed below. Both mnemonics results in identical binary values.
+
In 1972, Intel introduced their first set of mnemonics for their instructions. This original set consists of three characters which meant it could easily be encoded into a lookup table. A few years later, when they released their {{intel|8080}} and its instruction set, they also revamped the 8008 mnemonics to match the 8080's ones more closely. The newer mnemonics resemble a primitive version of modern x86 mnemonics. Since 8008 programs can be found using bother mnemonics, both the "old" and the "new" mnemonics are listed below. Both mnemonics results in identical binary values.
  
 
{{isa
 
{{isa
Line 122: Line 122:
 
{{inst|mn=JFS |col 1=JP  |col 2=3 |op={{bin|01 010 000}} |act=If sign = 0 (positive), jump to immed address}}
 
{{inst|mn=JFS |col 1=JP  |col 2=3 |op={{bin|01 010 000}} |act=If sign = 0 (positive), jump to immed address}}
 
{{inst|mn=JFP |col 1=JPO  |col 2=3 |op={{bin|01 011 000}} |act=If parity = 0 (odd), jump to immed address}}
 
{{inst|mn=JFP |col 1=JPO  |col 2=3 |op={{bin|01 011 000}} |act=If parity = 0 (odd), jump to immed address}}
{{inst|mn=JC |col 1=JC  |col 2=3 |op={{bin|01 100 000}} |act=If carry = 1, jump to immed address}}
+
{{inst|mn=JTC |col 1=JC  |col 2=3 |op={{bin|01 100 000}} |act=If carry = 1, jump to immed address}}
{{inst|mn=JZ |col 1=JZ  |col 2=3 |op={{bin|01 101 000}} |act=If result = 0, jump to immed address}}
+
{{inst|mn=JTZ |col 1=JZ  |col 2=3 |op={{bin|01 101 000}} |act=If result = 0, jump to immed address}}
{{inst|mn=JS |col 1=JM  |col 2=3 |op={{bin|01 110 000}} |act=If sign = 1 (negative), jump to immed address}}
+
{{inst|mn=JTS |col 1=JM  |col 2=3 |op={{bin|01 110 000}} |act=If sign = 1 (negative), jump to immed address}}
{{inst|mn=JP |col 1=JPE  |col 2=3 |op={{bin|01 111 000}} |act=If parity = 1 (even), jump to immed address}}
+
{{inst|mn=JTP |col 1=JPE  |col 2=3 |op={{bin|01 111 000}} |act=If parity = 1 (even), jump to immed address}}
 
{{inst|mn=CAL |col 1=CALL |col 2=3 |op={{bin|01 XXX 110}} |act=Save current address onto the stack and jump to immed address}}
 
{{inst|mn=CAL |col 1=CALL |col 2=3 |op={{bin|01 XXX 110}} |act=Save current address onto the stack and jump to immed address}}
 
{{inst|mn=CFC |col 1=CNC  |col 2=3 |op={{bin|01 000 010}} |act=If carry = 0, save current address and jump to immed address}}
 
{{inst|mn=CFC |col 1=CNC  |col 2=3 |op={{bin|01 000 010}} |act=If carry = 0, save current address and jump to immed address}}
Line 131: Line 131:
 
{{inst|mn=CFS |col 1=CP  |col 2=3 |op={{bin|01 010 010}} |act=If sign = 0 (positive), save current address and jump to immed address}}
 
{{inst|mn=CFS |col 1=CP  |col 2=3 |op={{bin|01 010 010}} |act=If sign = 0 (positive), save current address and jump to immed address}}
 
{{inst|mn=CFP |col 1=CPO  |col 2=3 |op={{bin|01 011 010}} |act=If parity = 0 (odd), save current address and jump to immed address}}
 
{{inst|mn=CFP |col 1=CPO  |col 2=3 |op={{bin|01 011 010}} |act=If parity = 0 (odd), save current address and jump to immed address}}
{{inst|mn=CC |col 1=CC  |col 2=3 |op={{bin|01 100 010}} |act=If carry = 1, save current address and jump to immed address}}
+
{{inst|mn=CTC |col 1=CC  |col 2=3 |op={{bin|01 100 010}} |act=If carry = 1, save current address and jump to immed address}}
{{inst|mn=CZ |col 1=CZ  |col 2=3 |op={{bin|01 101 010}} |act=If result = 0, save current address and jump to immed address}}
+
{{inst|mn=CTZ |col 1=CZ  |col 2=3 |op={{bin|01 101 010}} |act=If result = 0, save current address and jump to immed address}}
{{inst|mn=CS |col 1=CM  |col 2=3 |op={{bin|01 110 010}} |act=If sign = 1 (negative), save current address and jump to immed address}}
+
{{inst|mn=CTS |col 1=CM  |col 2=3 |op={{bin|01 110 010}} |act=If sign = 1 (negative), save current address and jump to immed address}}
{{inst|mn=CP |col 1=CPE  |col 2=3 |op={{bin|01 111 010}} |act=If parity = 1 (even), save current address and jump to immed address}}
+
{{inst|mn=CTP |col 1=CPE  |col 2=3 |op={{bin|01 111 010}} |act=If parity = 1 (even), save current address and jump to immed address}}
 
{{inst|mn=RET |col 1=RET  |col 2=1 |op={{bin|00 XXX 111}} |act=Unconditionally return, down one stack level}}
 
{{inst|mn=RET |col 1=RET  |col 2=1 |op={{bin|00 XXX 111}} |act=Unconditionally return, down one stack level}}
 
{{inst|mn=RFC |col 1=RNC  |col 2=1 |op={{bin|00 000 011}} |act=If carry = 0, return, down one stack level}}
 
{{inst|mn=RFC |col 1=RNC  |col 2=1 |op={{bin|00 000 011}} |act=If carry = 0, return, down one stack level}}
Line 140: Line 140:
 
{{inst|mn=RFS |col 1=RP  |col 2=1 |op={{bin|00 010 011}} |act=If sign = 0 (positive), return, down one stack level}}
 
{{inst|mn=RFS |col 1=RP  |col 2=1 |op={{bin|00 010 011}} |act=If sign = 0 (positive), return, down one stack level}}
 
{{inst|mn=RFP |col 1=RPO  |col 2=1 |op={{bin|00 011 011}} |act=If parity = 0 (odd), return, down one stack level}}
 
{{inst|mn=RFP |col 1=RPO  |col 2=1 |op={{bin|00 011 011}} |act=If parity = 0 (odd), return, down one stack level}}
{{inst|mn=RC |col 1=RC  |col 2=1 |op={{bin|00 100 011}} |act=If carry = 1, return, down one stack level}}
+
{{inst|mn=RTC |col 1=RC  |col 2=1 |op={{bin|00 100 011}} |act=If carry = 1, return, down one stack level}}
{{inst|mn=RZ |col 1=RZ  |col 2=1 |op={{bin|00 101 011}}  |act=If result = 0, return, down one stack level}}
+
{{inst|mn=RTZ |col 1=RZ  |col 2=1 |op={{bin|00 101 011}}  |act=If result = 0, return, down one stack level}}
{{inst|mn=RS |col 1=RM  |col 2=1 |op={{bin|00 110 011}} |act=If sign = 1 (negative), return, down one stack level}}
+
{{inst|mn=RTS |col 1=RM  |col 2=1 |op={{bin|00 110 011}} |act=If sign = 1 (negative), return, down one stack level}}
{{inst|mn=RP |col 1=RPE  |col 2=1 |op={{bin|00 111 011}} |act=If parity = 1 (even), return, down one stack level}}
+
{{inst|mn=RTP |col 1=RPE  |col 2=1 |op={{bin|00 111 011}} |act=If parity = 1 (even), return, down one stack level}}
 
{{inst|mn=RST |col 1=RST  |col 2=1 |op={{bin|00 AAA 101}} |act=Call the subroutine at memory AAA000 (up one stack level)}}
 
{{inst|mn=RST |col 1=RST  |col 2=1 |op={{bin|00 AAA 101}} |act=Call the subroutine at memory AAA000 (up one stack level)}}
  

Revision as of 13:12, 18 March 2017

8008 ISA
Developer Intel
Datapoint Corporation
Implementation 8008
Dev model Proprietary
Design Von Neumann
Data word size 8 bit
1 octets
2 nibbles
Instruction word size 8 bit
1 octets
Instructions 48
Introduction 1972
Version 1
Format Register-Memory
Endianness Bi-endian
Registers 7
GPRs 7 (scratchpad)
ISAsBy CompanyBy InstBy Data

The 8008 ISA (or MCS-8 ISA) was an instruction set architecture introduced by Intel in 1972 and was used in the 8008 and 8008-1 microprocessors.

This ISA has an 8-bit data and address bus. This architecture included seven 8-bit registers, 48 instructions, and interrupt capability.

Registers

The 8008 had seven scratchpad registers. A few of them had additional capabilities - A is used an an accumulator register. Registers H & L are high-order and low-order words of a 14-bit address.

Register Size Purpose
A 8 bit Accumulator
B 8 bit GP
C 8 bit GP
D 8 bit GP
E 8 bit GP
H 8 bit High-order word
L 8 bit Low-order word

ISA

Data on the 8008 is always stored in an 8-bit binary integer.

Data Word
D7 D6 D5 D4 D3 D2 D1 D0

Instructions can be made of 1-3 bytes depending on operation. Multi-byte instructions must be stored in successive order in memory. Typical operations involving register-register operations such as arithmetic and logic operations only require one byte and take the following form:

1-Byte Inst
D7 D6 D5 D4 D3 D2 D1 D0
OPCode

Instructions that involve an immediate value have 2 bytes. The first bite stores the opcode and the second byte stores the 8-bit value.

2-Byte Inst
D7 D6 D5 D4 D3 D2 D1 D0
D7 D6 D5 D4 D3 D2 D1 D0
OPCode
Imm Value

Instructions involving an address (such as CALL and JUMP) require a 14-bit address. This is done via a 3-byte instruction where the first byte is the opcode, the second byte is the low-order word, and the third byte is the high-order word. Note that the 2 MSBs on the high-order word are don't cares.

3-Byte Inst
D7 D6 D5 D4 D3 D2 D1 D0
X7 X6 D5 D4 D3 D2 D1 D0
D7 D6 D5 D4 D3 D2 D1 D0
OPCode
High-Order Addrs
Low-Order Addrs

Listing

The 8008 ISA has 48 instructions broken a number of groups:

In 1972, Intel introduced their first set of mnemonics for their instructions. This original set consists of three characters which meant it could easily be encoded into a lookup table. A few years later, when they released their 8080 and its instruction set, they also revamped the 8008 mnemonics to match the 8080's ones more closely. The newer mnemonics resemble a primitive version of modern x86 mnemonics. Since 8008 programs can be found using bother mnemonics, both the "old" and the "new" mnemonics are listed below. Both mnemonics results in identical binary values.

8008 ISA
Mnemonic (old)
Index Register Instructions
Load instructions do not affect any flag. The Inc and Dec instructions affect all flags except carry.
LRdRsMOV Rd, Rs111 DDD SSS2Rd = Rs
LRdMMOV Rd, M111 DDD 1112Rd = Mem
LMRsMOV Rs, M111 111 SSS2Mem = Rs
LRdIMVI Rd, Imm200 DDD 1102Rd = Immed Value
LMIMVI M, Imm200 111 1102Mem = Immed Value
INRdINR Rd100 DDD 0002Rd = Rd + 1 (Rd ≠ A)
DCRdDCR Rd100 DDD 0012Rd = Rd - 1 (Rd ≠ A)
Accumulator Group Instructions
The result of an ALU instruction affect all flags. The rotation instructions only affect the carry flag.
ADRsADD Rs101 000 SSS2A = A + Rs
ADMADD M101 000 1112A = A + Mem
ADIADI201 000 1002A = A + Immed Value
ACRsADC Rs101 001 SSS2A = Carry + Rs
ACMADC M101 001 1112A = Carry + Mem
ACIACI200 001 1002A = Carry + Immed Value
SURsSUB Rs110 010 SSS2A = A - Rs
SUMSUB M110 010 1112A = A - Mem
SUISUI200 010 1002A = A - Immed Value
SBsSBB Rs110 011 SSS2A = A - (Carry + Rs)
SBMSBB M110 011 1112A = A - (Carry + Mem)
SBIACI200 011 1002A = A - (Carry + Immed Value)
NDRsANA Rs110 100 SSS2A = A ∧ Rs
NDMANA M110 100 1112A = A ∧ Mem
NDIANI200 100 1002A = A ∧ Immed Value
XRRsXRA Rs110 101 SSS2A = A ⊕ Rs
XRMXRA M110 101 1112A = A ⊕ Mem
XRIXRI200 101 1002A = A ⊕ Immed Value
ORRsORA Rs110 110 SSS2A = A ∨ Rs
ORMORA M110 110 1112A = A ∨ Mem
ORIORI200 110 1002A = A ∨ Immed Value
CRRsCMP Rs110 111 SSS2Compare A with Rs, set flags
CRMCMP M110 111 1112Compare A with Mem, set flags
CRICPI200 111 1002Compare A with Immed Value, set flags
RLCRLC100 000 0102Rotate A Left Once
RRCRRC100 001 0102Rotate A Right Once
RALRAL100 010 0102Rotate A Left Through Carry Once
RARRAR100 011 0102Rotate A Right Through Carry Once
Program Counter and Stack Control Instructions
JMPJMP301 XXX 1002Unconditional Jump to immed address
JFCJNC301 000 0002If carry = 0, jump to immed address
JFZJNZ301 001 0002If result ≠ 0, jump to immed address
JFSJP301 010 0002If sign = 0 (positive), jump to immed address
JFPJPO301 011 0002If parity = 0 (odd), jump to immed address
JTCJC301 100 0002If carry = 1, jump to immed address
JTZJZ301 101 0002If result = 0, jump to immed address
JTSJM301 110 0002If sign = 1 (negative), jump to immed address
JTPJPE301 111 0002If parity = 1 (even), jump to immed address
CALCALL301 XXX 1102Save current address onto the stack and jump to immed address
CFCCNC301 000 0102If carry = 0, save current address and jump to immed address
CFZCNZ301 001 0102If result ≠ 0, save current address and jump to immed address
CFSCP301 010 0102If sign = 0 (positive), save current address and jump to immed address
CFPCPO301 011 0102If parity = 0 (odd), save current address and jump to immed address
CTCCC301 100 0102If carry = 1, save current address and jump to immed address
CTZCZ301 101 0102If result = 0, save current address and jump to immed address
CTSCM301 110 0102If sign = 1 (negative), save current address and jump to immed address
CTPCPE301 111 0102If parity = 1 (even), save current address and jump to immed address
RETRET100 XXX 1112Unconditionally return, down one stack level
RFCRNC100 000 0112If carry = 0, return, down one stack level
RFZRNZ100 001 0112If result ≠ 0, return, down one stack level
RFSRP100 010 0112If sign = 0 (positive), return, down one stack level
RFPRPO100 011 0112If parity = 0 (odd), return, down one stack level
RTCRC100 100 0112If carry = 1, return, down one stack level
RTZRZ100 101 0112If result = 0, return, down one stack level
RTSRM100 110 0112If sign = 1 (negative), return, down one stack level
RTPRPE100 111 0112If parity = 1 (even), return, down one stack level
RSTRST100 AAA 1012Call the subroutine at memory AAA000 (up one stack level)
Input/Output Instructions
INPIN101 00M MM12A = PORT[MMM]
OUTOUT101 RRM MM12PORT[RRMMM] = A (RR ≠ 00)
Machine Instructions
HLTHLT100 000 00X2Enter STOPPED state; remain there until interrupted
HLTHLT111 111 1112Enter STOPPED state; remain there until interrupted

See also

Facts about "8008 ISA - Intel"
designerIntel + and Datapoint Corporation +
first launched1972 +
full page nameintel/mcs-8/isa +
implementation8008 - Intel +
instance ofinstruction set architecture +
instruction count48 +
instruction word size8 bit (1 octets) +
name8008 +
word size8 bit (1 octets, 2 nibbles) +