📄 c200mnrt.asm
字号:
TBLR XTND_ADRS ;
TBLW PRM_XTND ;
.elseif (MON_PMAP_PAGE == MON_PMAP_PAGE_DATA)
BLDD #MON_PMAP_ADDR, XTND_ADRS ;
BLDD PRM_XTND, #MON_PMAP_ADDR ;
.elseif (MON_PMAP_PAGE == MON_PMAP_PAGE_IO)
IN XTND_ADRS, MON_PMAP_ADDR ;
OUT PRM_XTND, MON_PMAP_ADDR ;
.endif ; (MON_PMAP_PAGE)
.endif ; (MON_XTND_PROG == MON_XTND_PROG_ON)
;
.if (MON_XTND_BOTH == MON_XTND_ON)
B LOAD_NEW_DONE ;
LOAD_NEW_DATA ;
.endif ; (MON_XTND_BOTH == MON_XTND_ON)
;
.if (MON_XTND_DATA == MON_XTND_DATA_ON)
.if (MON_DMAP_PAGE == MON_DMAP_PAGE_PROG)
LALK #MON_DMAP_ADDR ;
TBLR XTND_ADRS ;
TBLW PRM_XTND ;
.elseif (MON_DMAP_PAGE == MON_DMAP_PAGE_DATA)
BLDD #MON_DMAP_ADDR, XTND_ADRS ;
BLDD PRM_XTND, #MON_DMAP_ADDR ;
.elseif (MON_DMAP_PAGE == MON_DMAP_PAGE_IO)
IN XTND_ADRS, MON_DMAP_ADDR ;
OUT PRM_XTND, MON_DMAP_ADDR ;
.endif ; (MON_DMAP_PAGE)
.endif ; (MON_XTND_DATA == MON_XTND_DATA_ON)
;
LOAD_NEW_DONE
.endif ; (MON_XTND_EITHER == MON_XTND_ON)
.endm ; mon_load_new
;
.page
;---------------------------------------------------------------------------
; Define MON_LOAD_OLD macro.
; Load the old MON_PMAP or MON_DMAP value into the appropriate map register.
; This macro should not be modified.
;---------------------------------------------------------------------------
mon_load_old .macro
.if (MON_XTND_EITHER == MON_XTND_ON)
BIT PRM_CMND, 15-B_MAPSMASK ;
BBZ LOAD_OLD_DONE ;
;
.if (MON_XTND_BOTH == MON_XTND_ON)
BIT PRM_CMND, 15-B_PORDMASK ;
BBNZ LOAD_OLD_DATA ;
LOAD_OLD_PROG ;
.endif ; (MON_XTND_BOTH == MON_XTND_ON)
;
.if (MON_XTND_PROG == MON_XTND_PROG_ON)
.if (MON_PMAP_PAGE == MON_PMAP_PAGE_PROG)
LALK #MON_PMAP_ADDR ;
TBLW XTND_ADRS ;
.elseif (MON_PMAP_PAGE == MON_PMAP_PAGE_DATA)
BLDD XTND_ADRS, #MON_PMAP_ADDR ;
.elseif (MON_PMAP_PAGE == MON_PMAP_PAGE_IO)
OUT XTND_ADRS, MON_PMAP_ADDR ;
.endif ; (MON_PMAP_PAGE)
.endif ; (MON_XTND_PROG == MON_XTND_PROG_ON)
;
.if (MON_XTND_BOTH == MON_XTND_ON)
B LOAD_OLD_DONE ;
LOAD_OLD_DATA ;
.endif ; (MON_XTND_BOTH == MON_XTND_ON)
;
.if (MON_XTND_DATA == MON_XTND_DATA_ON)
.if (MON_DMAP_PAGE == MON_DMAP_PAGE_PROG)
LALK #MON_DMAP_ADDR ;
TBLW XTND_ADRS ;
.elseif (MON_DMAP_PAGE == MON_DMAP_PAGE_DATA)
BLDD XTND_ADRS, #MON_DMAP_ADDR ;
.elseif (MON_DMAP_PAGE == MON_DMAP_PAGE_IO)
OUT XTND_ADRS, MON_DMAP_ADDR ;
.endif ; (MON_DMAP_PAGE}
.endif ; (MON_XTND_DATA == MON_XTND_DATA_ON)
;
LOAD_OLD_DONE
.endif ; (MON_XTND_EITHER == MON_XTND_ON)
.endm ; mon_load_old
;
.page
;---------------------------------------------------------------------------
; Define MON_SAVE_CORE macro.
; This macro should not be modified.
;---------------------------------------------------------------------------
mon_save_core .macro
.if (MON_RGST == MON_RGST_ANY)
BLDD MON_TEMP_PC, #MON_PC ; Save PC.
BLDD MON_TEMP_ST0, #MON_ST0 ; Save ST0.
BLDD MON_TEMP_ST1, #MON_ST1 ; Save ST1.
BLDD MON_TEMP_ACCL, #MON_ACCL ; Save ACCL.
BLDD MON_TEMP_ACCH, #MON_ACCH ; Save ACCH.
.else ; (MON_RGST == MON_RGST_ZRO)
PSHD MON_TEMP_PC ;
POPD MON_PC ; Save PC.
PSHD MON_TEMP_ST0 ;
POPD MON_ST0 ; Save ST0.
PSHD MON_TEMP_ST1 ;
POPD MON_ST1 ; Save ST1.
; ;
; ; Already saved ACCL.
; ;
; ; Already saved ACCH.
.endif ; (MON_RGST)
.endm ; mon_save_core
;
;---------------------------------------------------------------------------
; Define MON_ETRAP_LOAD macro.
; This macro should not be modified.
;---------------------------------------------------------------------------
mon_etrap_load .macro VALU
SPLK #VALU, MON_TRAP_VEC
.endm
;
;---------------------------------------------------------------------------
; Define MON_ETRAP_NULL macro.
; This macro should not be modified.
;---------------------------------------------------------------------------
mon_etrap_null .macro VALU
SPLK #NULL_ETRP?, MON_TRAP_VEC
mon_etrap
NULL_ETRP? SPLK #VALU, MON_TRAP_VEC
.endm
;
;---------------------------------------------------------------------------
; Define MON_ERET_NULL macro.
; This macro should not be modified.
;---------------------------------------------------------------------------
mon_eret_null .macro VALU
LALK #VALU
PUSH
mon_eret
.endm
;
.page
;---------------------------------------------------------------------------
; Define the MON_WAIT macro.
; This macro should not be modified.
;---------------------------------------------------------------------------
mon_wait .macro
;
.if (MON_WAIT_USE == MON_WAIT_USE_YES)
.var WAIT_MASK
.asg 0, WAIT_MASK
;
.if (MON_WAIT_STOP == MON_WAIT_STOP_YES)
.eval STOPMASK | WAIT_MASK, WAIT_MASK
.endif
.if (MON_WAIT_SNGL == MON_WAIT_SNGL_YES)
.eval SNGLMASK | WAIT_MASK, WAIT_MASK
.endif
.if (MON_WAIT_EVER == MON_WAIT_EVER_YES)
.eval EVERMASK | WAIT_MASK, WAIT_MASK
.endif
.if (MON_WAIT_AUTO == MON_WAIT_AUTO_YES)
.eval AUTOMASK | WAIT_MASK, WAIT_MASK
.endif
;
.if (0 != WAIT_MASK)
LACK #WAIT_MASK ; Short immediate is ok.
AND PRM_CMND ;
BZ NOT_WAIT? ;
mon_wait_test ;
NOT_WAIT? .endif ; (0 != WAIT_MASK)
;
.endif ; (MON_WAIT_USE == MON_WAIT_USE_YES)
;
.endm ; mon_wait
;
;---------------------------------------------------------------------------
; Define the MON_WAIT_TEST macro.
; The default code in this macro is very generic, so is likely usable as is.
; It waits for an interrupt driven routine to signal permission to stop,
; step or run by a placing a non-zero value in location MON_WAIT_B2.
; This is a global symbol referring to a location in data memory page zero
; that is reserved for the sole use of this macro.
; If can be modified by the user as required.
;---------------------------------------------------------------------------
mon_wait_test .macro
SPLK #0, MON_WAIT_B2 ;
WAIT_TEST? LACL MON_WAIT_B2 ;
BZ WAIT_TEST? ;
.endm ; mon_wait_test
;
.page
;***************************************************************************
; REALTIME OPCODES
;***************************************************************************
;
;---------------------------------------------------------------------------
; Define the C2xx opcode mnemonics that are used as part of
; the MON_IO_MAP_USE_RAM and MON_IO_MAP_USE_ROM options.
;---------------------------------------------------------------------------
.if (MON_IO_MAP_USE != MON_IO_MAP_USE_NOT)
OPCODE_ERET .set 0be96h ;
; Return Opcode in "ERET"
DP_MASK .set 0007fh ;
; DP field mask for IN/OUT opcodes.
OPCODE_IN .set (0af00h & ~DP_MASK) | (MSG_DATA & DP_MASK)
; IO Read Opcode "IN MSG_DATA, PA0"
OPCODE_OUT .set (00c00h & ~DP_MASK) | (MSG_DATA & DP_MASK)
; IO Write Opcode "OUT MSG_DATA, PA0"
.endif ; (MON_IO_MAP_USE != MON_IO_MAP_USE_NOT)
;
.page
;***************************************************************************
; This page is intentionally left blank.
;***************************************************************************
;
.page
;***************************************************************************
; DEBUG MACROS
;***************************************************************************
;
;---------------------------------------------------------------------------
; Define MON_DBG_SAVE macro.
; This macro is used to sample various status bits on monitor entry.
;
; Configure the monitor to save (or not save) the values of the four
; registers ST0, ST1, MSG_STAT and MSG_BP in data memory locations 0x70
; to 0x73. The current and prior values of ST1(3-2) and MSG_STAT(4) are
; stored in locations 0x74 to 0x77.
;
; The results of using mon_dbg_save are: ST1(3-2) MSG_STAT(4)
;
; monitor initialisation 2 0
; step-n 1 0
; run-n 1 0
; update (during run with updating) 3 1
; halt (after run with updating) 3 1
; halt (after run without updating) 3 1
; hard breakpoint (after run without updating) 3 1
; soft breakpoint (after run without updating) 2 0
; idle (after step/run-n without updating) 0 0
;---------------------------------------------------------------------------
.if (MON_DEBUG)
mon_dbg_save .macro
LDP #MON_PGE0_DP ; Set DP to page zero.
BLDD #MON_ST0, 070h ; Save ST0.
BLDD #MON_ST1, 071h ; Save ST1.
BLDD #MSG_STAT, 072h ; Save MSG_STAT.
BLDD #MSG_CNTL, 073h ; Save MSG_CNTL.
;
LACL 070h
ANDK #000Ch
RPTK #(2-1)
SFRD
BLDD #074h, 076h ; Save prior ST1(3-2).
SACL 074h ; Save current ST1(3-2).
;
LACL 072h
ANDK #0010h
RPTK #(4-1)
SFR
BLDD #075h, 077h ; Save prior MSG_STAT(4).
SACL 075h ; Save current MSG_STAT(4).
.endm
.endif ; (MON_DEBUG)
;
.page
;---------------------------------------------------------------------------
; Define MON_DBG_START macro.
; This macro is used to start a C209 timer so as to benchmark
; the HLL Debugger updating memory or register values during a run command.
;---------------------------------------------------------------------------
.if (MON_DEBUG)
mon_dbg_start .macro
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -