URL
https://opencores.org/ocsvn/s80186/s80186/trunk
Subversion Repositories s80186
[/] [s80186/] [trunk/] [rtl/] [microcode/] [debug.us] - Rev 2
Compare with Previous | Blame | View Log
// Copyright Jamie Iles, 2017
//
// This file is part of s80x86.
//
// s80x86 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.
//
// s80x86 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 s80x86. If not, see <http://www.gnu.org/licenses/>.
.at 0x102;
debug_wait:
jmp debug_wait;
#define DEBUG_READ_GPR(reg, addr) \
.at addr; \
ra_sel reg, jmp debug_read_gpr;
#define DEBUG_READ_SR(reg, addr) \
.at addr; \
segment_force, segment reg, jmp debug_read_sr;
DEBUG_READ_GPR(AX, 0x103)
DEBUG_READ_GPR(CX, 0x104)
DEBUG_READ_GPR(DX, 0x105)
DEBUG_READ_GPR(BX, 0x106)
DEBUG_READ_GPR(SP, 0x107)
DEBUG_READ_GPR(BP, 0x108)
DEBUG_READ_GPR(SI, 0x109)
DEBUG_READ_GPR(DI, 0x10a)
DEBUG_READ_SR(ES, 0x10b)
DEBUG_READ_SR(CS, 0x10c)
DEBUG_READ_SR(SS, 0x10d)
DEBUG_READ_SR(DS, 0x10e)
#define DEBUG_WRITE_GPR(reg, addr) \
.at addr; \
b_sel TEMP, alu_op SELB, rd_sel_source MICROCODE_RD_SEL, rd_sel reg, \
jmp debug_wait;
#define DEBUG_WRITE_SR(reg, addr) \
.at addr; \
b_sel TEMP, alu_op SELB, segment_force, segment_wr_en, \
segment_force, segment reg, next_instruction, \
ext_int_inhibit, jmp debug_wait;
DEBUG_WRITE_GPR(AX, 0x113)
DEBUG_WRITE_GPR(CX, 0x114)
DEBUG_WRITE_GPR(DX, 0x115)
DEBUG_WRITE_GPR(BX, 0x116)
DEBUG_WRITE_GPR(SP, 0x117)
DEBUG_WRITE_GPR(BP, 0x118)
DEBUG_WRITE_GPR(SI, 0x119)
DEBUG_WRITE_GPR(DI, 0x11a)
DEBUG_WRITE_SR(ES, 0x11b)
DEBUG_WRITE_SR(CS, 0x11c)
DEBUG_WRITE_SR(SS, 0x11d)
DEBUG_WRITE_SR(DS, 0x11e)
.auto_address;
debug_read_gpr:
a_sel RA, alu_op SELA, tmp_wr_en, jmp debug_wait;
debug_read_sr:
b_sel SR, alu_op SELB, tmp_wr_en, jmp debug_wait;
// Get IP
.at 0x10f;
a_sel IP, alu_op SELA, tmp_wr_en, jmp debug_wait;
// Get flags
.at 0x110;
alu_op GETFLAGS, tmp_wr_en, jmp debug_wait;
// Set IP
.at 0x111;
b_sel TEMP, alu_op SELB, load_ip, next_instruction, ext_int_inhibit,
jmp debug_wait;
// Set flags
.at 0x112;
b_sel TEMP, alu_op SETFLAGSB, update_flags CF PF AF ZF SF TF IF DF OF,
jmp debug_wait;
// Write MAR
.at 0x11f;
b_sel TEMP, alu_op SELB, mar_wr_sel Q, mar_write, jmp debug_wait;
// Write MDR
.at 0x120;
b_sel TEMP, alu_op SELB, mdr_write, jmp debug_wait;
// Read 8
.at 0x121;
segment_force, segment DS, jmp debug_read8;
.auto_address;
debug_read8:
segment_force, segment DS, width W8, mem_read;
a_sel MDR, alu_op SELA, tmp_wr_en;
a_sel MAR, b_sel IMMEDIATE, immediate 0x1, alu_op ADD, mar_wr_sel Q,
mar_write, jmp debug_wait;
// Read 16
.at 0x122;
segment_force, segment DS, jmp debug_read16;
.auto_address;
debug_read16:
segment_force, segment DS, mem_read;
a_sel MDR, alu_op SELA, tmp_wr_en;
a_sel MAR, b_sel IMMEDIATE, immediate 0x2, alu_op ADD, mar_wr_sel Q,
mar_write, jmp debug_wait;
// Write 8
.at 0x123;
segment_force, segment DS, jmp debug_write8;
.auto_address;
debug_write8:
segment_force, segment DS, width W8, mem_write;
a_sel MAR, b_sel IMMEDIATE, immediate 0x1, alu_op ADD, mar_wr_sel Q,
mar_write, jmp debug_wait;
// Write 16
.at 0x124;
segment_force, segment DS, jmp debug_write16;
.auto_address;
debug_write16:
segment_force, segment DS, mem_write;
a_sel MAR, b_sel IMMEDIATE, immediate 0x2, alu_op ADD, mar_wr_sel Q,
mar_write, jmp debug_wait;
// Read 8 IO
.at 0x125;
segment_force, segment DS, jmp debug_read8io;
.auto_address;
debug_read8io:
segment_force, segment DS, width W8, mem_read, io;
a_sel MDR, alu_op SELA, tmp_wr_en, jmp debug_wait;
// Read 16 IO
.at 0x126;
segment_force, segment DS, jmp debug_read16io;
.auto_address;
debug_read16io:
segment_force, segment DS, mem_read, io;
a_sel MDR, alu_op SELA, tmp_wr_en, jmp debug_wait;
// Write 8 IO
.at 0x127;
segment_force, segment DS, jmp debug_write8io;
.auto_address;
debug_write8io:
segment_force, segment DS, width W8, mem_write, io, jmp debug_wait;
// Write 16 IO
.at 0x128;
segment_force, segment DS, jmp debug_write16io;
.auto_address;
debug_write16io:
segment_force, segment DS, mem_write, io, jmp debug_wait;