2023-02-26 02:46:43 +00:00
|
|
|
/* ucode.txt - The contents of the microcode rom for the 9086 CPU
|
2023-02-22 01:58:08 +00:00
|
|
|
|
|
|
|
This file is part of the 9086 project.
|
|
|
|
|
|
|
|
Copyright (c) 2023 Efthymios Kritikos
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
2023-02-22 01:28:23 +00:00
|
|
|
|
2023-02-24 07:32:27 +00:00
|
|
|
//wbo: Wbit overwrite, {VALUE,ENABLE}. ex 11 would force one, 10 wouldn't do anything
|
|
|
|
//
|
|
|
|
//krs: Keep registers, selects weather the register port 1 and/or 2
|
|
|
|
// addresses is set on that microcoded instruction or kept as it
|
|
|
|
// was before allowing for registers to be parameterised.
|
2023-02-24 11:31:15 +00:00
|
|
|
// {Register_write_port,Register_port2, Register_port1}
|
2023-02-24 07:32:27 +00:00
|
|
|
//
|
2023-02-24 05:01:55 +00:00
|
|
|
//rr2: reg_read_port2_addr
|
|
|
|
//
|
2023-02-23 14:48:48 +00:00
|
|
|
//imd: IN_MOD
|
|
|
|
//
|
|
|
|
//rr1: reg_read_port1_addr
|
|
|
|
//
|
2023-02-22 01:28:23 +00:00
|
|
|
//a1f: ALU 1 operation (function)
|
|
|
|
// 000:ALU_OP_ADD
|
|
|
|
// 001:ALU_OP_SUB
|
|
|
|
// 010:ALU_OP_AND
|
|
|
|
// 011:ALU_OP_OR
|
|
|
|
// 100:ALU_OP_XOR
|
|
|
|
// 101:ALU_OP_ADD_SIGNED_B
|
2023-02-24 02:18:48 +00:00
|
|
|
// 110:ALU_OP_SUB_REVERSE
|
2023-02-22 01:28:23 +00:00
|
|
|
//
|
2023-02-23 14:48:48 +00:00
|
|
|
//a1o: OUT_MOD. Handled in `PROC_EX_STATE_EXIT
|
2023-02-22 01:28:23 +00:00
|
|
|
//
|
|
|
|
//a12: In ALU 1 sel 2
|
|
|
|
//
|
|
|
|
//a11: In ALU 1 sel 1
|
|
|
|
//
|
|
|
|
//rwa: Register Write Address
|
|
|
|
//
|
|
|
|
//nxs: Next State
|
|
|
|
// 00: PROC_EX_STATE_ENTRY
|
|
|
|
// 01: PROC_DE_LOAD_16_PARAM
|
|
|
|
// 10: PROC_DE_LOAD_8_PARAM
|
2023-02-24 02:18:48 +00:00
|
|
|
// 11: PROC_MEMIO_READ
|
2023-02-22 01:28:23 +00:00
|
|
|
//
|
|
|
|
//Nxt M: Next microcode address
|
|
|
|
|
2023-03-04 08:37:43 +00:00
|
|
|
@000 _00_000_0000_000_0000_000_000__00__00_0000__00_000000
|
2023-02-23 14:48:48 +00:00
|
|
|
|
2023-02-24 07:32:27 +00:00
|
|
|
// 36 34 32 28 25 21 18 15 13 11 7 5 0
|
2023-02-24 05:01:55 +00:00
|
|
|
// CALL
|
2023-02-24 07:32:27 +00:00
|
|
|
// wbo|krs|rr2 |imd|rr1 |a1f|a1o|a12|a11|rwa |nxs|Nxt M |
|
2023-02-24 11:31:15 +00:00
|
|
|
@001 _00_000_0000_011_1100_001_011__00__01_1100__01_000010 // ALU_1: SP ALU_2: PARAM2 (2) ALU_OP:SUB ALU_out: SP (also fetch the opcode argument to PARAM1)
|
2023-03-04 08:37:43 +00:00
|
|
|
@002 _00_000_0000_011_xxxx_000_110__10__11_xxxx__00_000011 // ALU_1: 0 ALU_2: PC ALU_OP:ADD ALU_out: [SP]
|
|
|
|
@003 _00_000_0000_011_xxxx_000_101__10__00_xxxx__00_000000 // ALU_1: PARAM1 (arg) ALU_2: PC ALU_OP:ADD ALU_out: PC
|
2023-02-23 14:48:48 +00:00
|
|
|
|
2023-02-24 05:01:55 +00:00
|
|
|
// RET
|
2023-02-24 07:32:27 +00:00
|
|
|
// wbo|krs|rr2 |imd|rr1 |a1f|a1o|a12|a11|rwa |nxs|Nxt M |
|
2023-03-04 08:37:43 +00:00
|
|
|
@004 _00_000_0000_110_xxxx_000_101__00__11_xxxx__11_000101 // ALU_1: 0 ALU_2: PARAM2 ([SP]) ALU_OP:ADD ALU_out: PC (also read [SP] to PARAM2)
|
2023-02-24 11:31:15 +00:00
|
|
|
@005 _00_000_1100_011_0000_000_011__01__00_1100__00_000000 // ALU_1: PARAM1 (2) ALU_2: SP ALU_OP:ADD ALU_out: SP
|
2023-02-24 05:01:55 +00:00
|
|
|
|
|
|
|
// STOS
|
2023-02-24 07:32:27 +00:00
|
|
|
// wbo|krs|rr2 |imd|rr1 |a1f|a1o|a12|a11|rwa |nxs|Nxt M |
|
2023-03-04 08:37:43 +00:00
|
|
|
@006 _00_000_1000_011_xxxx_000_000__01__11_xxxx__00_000111 // ALU_1: 0 ALU_2: AX ALU_OP:ADD ALU_out: [DI]
|
|
|
|
@007 _11_000_xxxx_011_1111_000_011__00__01_1111__00_000000 // ALU_1: DI ALU_2: PARAM2 (2) ALU_OP:ADD ALU_OUT: DI
|
2023-02-24 07:32:27 +00:00
|
|
|
|
|
|
|
// PUSH
|
|
|
|
// wbo|krs|rr2 |imd|rr1 |a1f|a1o|a12|a11|rwa |nxs|Nxt M |
|
2023-02-24 11:31:15 +00:00
|
|
|
@008 _00_010_0000_011_1100_001_011__00__01_1100__00_001001 // ALU_1: SP ALU_2: PARAM2 (2) ALU_OP:SUB ALU_out: SP (also fetch the opcode argument to PARAM1)
|
2023-03-04 08:37:43 +00:00
|
|
|
@009 _00_010_0000_011_xxxx_000_110__01__11_xxxx__00_000000 // ALU_1: 0 ALU_2: REG ALU_OP:ADD ALU_out: [SP]
|
2023-02-24 11:31:15 +00:00
|
|
|
|
|
|
|
// POP
|
|
|
|
// wbo|krs|rr2 |imd|rr1 |a1f|a1o|a12|a11|rwa |nxs|Nxt M |
|
2023-03-04 08:37:43 +00:00
|
|
|
@00a _00_100_0000_110_xxxx_011_011__00__11_xxxx__11_001011 // ALU_1: 0 ALU_2: PARAM2 ([SP]) ALU_OP:ADD ALU_out: REG
|
2023-02-24 11:31:15 +00:00
|
|
|
@00b _00_000_1100_011_0000_000_011__01__00_1100__00_000000 // ALU_1: PARAM1 (2) ALU_2: SP ALU_OP:ADD ALU_out: SP
|