Space Invaders
Instructions
The hex codes for each 8080 instruction. nn indicates an 8-bit number (i.e. 4 nibbles) and it usually a signed offset. nnnn indicates a 16-bit value, usually an absolute address.
The ALU flags are SZHVPC. A '*' indicates the flag is changed according to the operator.
- 00 : NOP
- 01 nnnn : LXI bc,nnnn
- 02 : STAX BC
- 03 : INX bc
- 04 : INR b **-*-v*-c
- 05 : DCR b **-*-v*-c
- 06 nn : MVI b, #nn
- 07 : RLC sz-h-vp-*
- 09 : DAD bc sz-*-vp-*
- 0a : LDAX (BC)
- 0b : DCX bc
- 0c : INR c **-*-v*-c
- 0d : DCR c **-*-v*-c
- 0e nn : MVI c, #nn
- 0f : RRC sz-0-vp-*
- 11 nnnn : LXI de,nnnn
- 12 : STAX DE
- 13 : INX de
- 14 : INR d **-*-v*-c
- 15 : DCR d **-*-v*-c
- 16 nn : MVI d, #nn
- 17 : RAL sz-h-vp-*
- 19 : DAD de sz-*-vp-*
- 1a : LDAX DE
- 1b : DCX de
- 1c : INR e **-*-v*-c
- 1d : DCR e **-*-v*-c
- 1e nn : MVI e, #nn
- 1f : RAR sz-0-vp-*
- 21 nnnn : LXI hl,nnnn
- 22 nnnn : SHLD nnnn
- 23 : INX hl
- 24 : INR h **-*-v*-c
- 25 : DCR h **-*-v*-c
- 26 nn : MVI h, #nn
- 27 : DAA **-*-v*-*
- 29 : DAD hl sz-*-vp-*
- 2a nnnn : LHLD nnnn
- 2b : DCX hl
- 2c : INR l **-*-v*-c
- 2d : DCR l **-*-v*-c
- 2e nn : MVI l, #nn
- 2f : CMA sz-1-vp-c
- 31 nnnn : LXI sp,nnnn
- 32 nnnn : STA nnnn
- 33 : INX sp
- 34 : INR (HL) **-*-v*-c
- 35 : DCR (HL) **-*-v*-c
- 36 nn : LD (HL),nn
- 37 : STC sz-0-vp-1
- 39 : DAD sp sz-*-vp-*
- 3a nnnn : LDA nnnn
- 3b : DCX sp
- 3c : INR a **-*-v*-c
- 3d : DCR a **-*-v*-c
- 3e nn : MVI a, #nn
- 3f : CMC sz-*-vp-*
- 40 : MOV b,b
- 41 : MOV b,c
- 42 : MOV b,d
- 43 : MOV b,e
- 44 : MOV b,h
- 45 : MOV b,l
- 46 : MOV b,(HL)
- 47 : MOV b,a
- 48 : MOV c,b
- 49 : MOV c,c
- 4a : MOV c,d
- 4b : MOV c,e
- 4c : MOV c,h
- 4d : MOV c,l
- 4e : MOV c,(HL)
- 4f : MOV c,a
- 50 : MOV d,b
- 51 : MOV d,c
- 52 : MOV d,d
- 53 : MOV d,e
- 54 : MOV d,h
- 55 : MOV d,l
- 56 : MOV d,(HL)
- 57 : MOV d,a
- 58 : MOV e,b
- 59 : MOV e,c
- 5a : MOV e,d
- 5b : MOV e,e
- 5c : MOV e,h
- 5d : MOV e,l
- 5e : MOV e,(HL)
- 5f : MOV e,a
- 60 : MOV h,b
- 61 : MOV h,c
- 62 : MOV h,d
- 63 : MOV h,e
- 64 : MOV h,h
- 65 : MOV h,l
- 66 : MOV h,(HL)
- 67 : MOV h,a
- 68 : MOV l,b
- 69 : MOV l,c
- 6a : MOV l,d
- 6b : MOV l,e
- 6c : MOV l,h
- 6d : MOV l,l
- 6e : MOV l,(HL)
- 6f : MOV l,a
- 70 : MOV (HL),b
- 71 : MOV (HL),c
- 72 : MOV (HL),d
- 73 : MOV (HL),e
- 74 : MOV (HL),h
- 75 : MOV (HL),l
- 76 : HALT
- 77 : MOV (HL),a
- 78 : MOV a,b
- 79 : MOV a,c
- 7a : MOV a,d
- 7b : MOV a,e
- 7c : MOV a,h
- 7d : MOV a,l
- 7e : MOV a,(HL)
- 7f : MOV a,a
- 80 : ADD b **-*-v*-*
- 81 : ADD c **-*-v*-*
- 82 : ADD d **-*-v*-*
- 83 : ADD e **-*-v*-*
- 84 : ADD h **-*-v*-*
- 85 : ADD l **-*-v*-*
- 86 : ADD (HL) **-*-v*-*
- 87 : ADD a **-*-v*-*
- 88 : ADC b **-*-v*-*
- 89 : ADC c **-*-v*-*
- 8a : ADC d **-*-v*-*
- 8b : ADC e **-*-v*-*
- 8c : ADC h **-*-v*-*
- 8d : ADC l **-*-v*-*
- 8e : ADC (HL) **-*-v*-*
- 8f : ADC a **-*-v*-*
- 90 : SUB b **-*-v*-*
- 91 : SUB c **-*-v*-*
- 92 : SUB d **-*-v*-*
- 93 : SUB e **-*-v*-*
- 94 : SUB h **-*-v*-*
- 95 : SUB l **-*-v*-*
- 96 : SUB (HL) **-*-v*-*
- 97 : SUB a **-*-v*-*
- 98 : SBB b **-*-v*-*
- 99 : SBB c **-*-v*-*
- 9a : SBB d **-*-v*-*
- 9b : SBB e **-*-v*-*
- 9c : SBB h **-*-v*-*
- 9d : SBB l **-*-v*-*
- 9e : SBB A,(HL) **-*-v*-*
- 9f : SBB a **-*-v*-*
- a0 : ANA b **-1-v*-0
- a1 : ANA c **-1-v*-0
- a2 : ANA d **-1-v*-0
- a3 : ANA e **-1-v*-0
- a4 : ANA h **-1-v*-0
- a5 : ANA l **-1-v*-0
- a6 : ANA (HL) **-1-v*-0
- a7 : ANA a **-1-v*-0
- a8 : XRA b **-0-v*-0
- a9 : XRA c **-0-v*-0
- aa : XRA d **-0-v*-0
- ab : XRA e **-0-v*-0
- ac : XRA h **-0-v*-0
- ad : XRA l **-0-v*-0
- ae : XRA (HL) **-0-v*-0
- af : XRA a **-0-v*-0
- b0 : ORA b **-0-v*-0
- b1 : ORA c **-0-v*-0
- b2 : ORA d **-0-v*-0
- b3 : ORA e **-0-v*-0
- b4 : ORA h **-0-v*-0
- b5 : ORA l **-0-v*-0
- b6 : ORA (HL) **-0-v*-0
- b7 : ORA a **-0-v*-0
- b8 : CMP b **-*-v*-*
- b9 : CMP c **-*-v*-*
- ba : CMP d **-*-v*-*
- bb : CMP e **-*-v*-*
- bc : CMP h **-*-v*-*
- bd : CMP l **-*-v*-*
- be : CMP (HL) **-*-v*-*
- bf : CMP a **-*-v*-*
- c0 : RET nz
- c1 : POP bc
- c2 nnnn : Jnz nnnn
- c3 nnnn : JMP nnnn
- c4 nnnn : Cnz nnnn
- c5 : PUSH bc
- c6 nn : ADI nn **-*-v*-*
- c7 : RST 0x00
- c8 : RET z
- c9 : RET
- ca nnnn : Jz nnnn
- cc nnnn : Cz nnnn
- cd nnnnnnnnnnnn : CALL nnnn
- ce nn : ACI #nn **-*-v*-*
- cf : RST 0x08
- d0 : RET nc
- d1 : POP de
- d2 nnnn : Jnc nnnn
- d3 nn : OUT nn
- d4 nnnn : Cnc nnnn
- d5 : PUSH de
- d6 nn : SUI #nn **-*-v*-*
- d7 : RST 0x10
- d8 : RET c
- da nnnn : Jc nnnn
- db nnnn : IN nn
- dc nnnn : Cc nnnn
- de nn : SBI #nn **-*-v*-*
- df : RST 0x18
- e0 : RET po
- e1 : POP hl
- e2 nnnn : Jpo nnnn
- e3 : XTHL
- e4 nnnn : Cpo nnnn
- e5 : PUSH hl
- e6 nn : ANI #nn **-1-v*-0
- e7 : RST 0x20
- e8 : RET pe
- e9 : PCHL
- ea nnnn : Jpe nnnn
- eb : XCHG
- ec nnnn : Cpe nnnn
- ee nn : XRA #nn **-0-v*-0
- ef : RST 0x28
- f0 : RET p
- f1 : POP af
- f2 nnnn : Jp nnnn
- f3 : DI
- f4 nnnn : Cp nnnn
- f5 : PUSH af
- f6 nn : ORI #nn **-h-v*-0
- f7 : RST 0x30
- f8 : RET m
- f9 : SPHL
- fa nnnn : Jm nnnn
- fb : EI
- fc nnnn : Cm nnnn
- fe nn : CPI #nn **-*-v*-*
- ff : RST 0x38
The unknown instructions are
- 08
- 10
- 18
- 20
- 28
- 30
- 38
- cb
- d9
- dd
- ed
- fd
Machine XML
The XML description which builds the emulator
<machine name="arcade_invaders"> <clock name="cpu" clock="1890000"> </clock> <clock name="timer" clock="120"> <process> <eval>machine.bus.pulseLow('vidint')</eval> </process> </clock> <controller name="i8080" handler="std.cpu" clock="cpu"> <cpu source="/emf/res/devices/i8080/cpu.xml"/> </controller> <bus> <track name="int" pull="high"/> <track name="vidint" pull="high"/> <track name="reset" pull="high"/> </bus> <controller name="display" handler="std.native"> <native language="ecma6" source="display.js"/> </controller> <controller name="iorq" handler="std.native"> <native language="ecma6" source="iorq.js"/> <native language="ecma6" source="keyboard.js"/> </controller> <controller name="vidint" handler="std.native"> <native language="ecma6" source="vidint.js"/> </controller> <controller name="memory" handler="std.memory" address="16" data="8" endian="little"> <block address="0x0000" size="0x800" access="ro" name="rome"> <content source="/emf/res/machines/arcade_invaders/invaders.h"/> </block> <block address="0x0800" size="0x800" access="ro" name="romf"> <content source="/emf/res/machines/arcade_invaders/invaders.g"/> </block> <block address="0x1000" size="0x800" access="ro" name="romg"> <content source="/emf/res/machines/arcade_invaders/invaders.f"/> </block> <block address="0x1800" size="0x800" access="ro" name="romh"> <content source="/emf/res/machines/arcade_invaders/invaders.e"/> </block> <block address="0x2000" size="0x0400" access="rw" name="ram"/> <block address="0x2400" size="0x1c00" access="rw" name="vram" hook="bus.display.hook"/> <block address="0x4000" size="0x2000" access="rw"> <content shadow="ram"/> </block> </controller> </machine>