Author is Tony Cheal, who kindly gave me permission to using and distributing the modified program. Thus, and if you accept that there will be no warranty whatsoever, and do not use it for commercial purposes, the C1Mon is freely available and supported at this site.
The code was modified to safely running in the JM system, and with the more recent ones, such as MINERVA, SMSQ and SMSQ/E, and with the 68010+ processors. Which was verified in a standard JM QL, with JS, MGG, MINERVA and SMSQ/E and the GoldCard, with JS and the Super-GoldCard (68020), and in the QXL (68EC040) with SMSQ 2.76 and SMSQ/E 2.85 (and many earlier version since the incredible 2.16). The C1Mon is currently in use in any of these systems.
There is (as far as I know) one single peculiarity where the monitor will
report an error:
When encountering a 32-bit relative branch the concurrently running
disassembler will interpret the code sequence as a branch to the next odd
address and report an "illegal" error. This until now can only be circumvented
by, for instance, setting a breakpoint to immediately after the critical code,
and then executing the "go" command, to safely jumping over that sequence
without disassembling it.
Other 68020+ specific codes will be displayed as "DC.W"-s but executed
correctly and with no unexpected halt.
job-header bug fixed, where the job heading data could become corrupted. job-reference cloned commands can refer to always the currently valid registers or, to the registers of the job which was monitored while the clone was initiated. The empty {clone} command toggles that mode. pointer-i.f. protected. pick the C1Mon window will be activated when an eception occurs of trace, illeg, level 7, chk, priv., trap5..15 poke any writes to memory done in the supervisor mode to enabling modifications to certain systems' "protected" memory areae. rom-check ROM integrity check permanently running as a concurrent job. Changes to soft-ROM areae will be notified by some sound signal, delayed up to 8 seconds after they occurred - a scheduled task would respond faster, but slow down the system too much. When fast tracing pairs of changes reports may occur, which is a result of the breakpoints setting procedures which are called for subroutines and traps also, internally. This is otherwise meaningless. trace (and the other exceptions) will automatically adopt themselves to the processor type actually in use (any 680xx). trap-redirection if the monitored job has an own trap redirection table that one will be used in preference to the C1Mon's own one.
EX C1M;"{Parameter-String}"The optional {parameterstring} evaluated as keybord input to the monitor.
no br:j 0:quit <enter>
The "no br" is a safety precaution to clearing any breakpoint left from a preceding trace sequence from RAM; "j 0" leads to restoring the last monitored jobs own trap redirection, if applicable.
Flag | Useage | Default | ||
rel | display adress rel(bp) | on | ||
pc | rel(pc) | on | ||
job | rel(job) | off | ||
hex | current radix sedecimal | on | ||
asc | include ASCII in dump display | on | ||
an | show current address register values | on | ||
dn | data " " | on | ||
rn | auxilary " " | off | ||
dis | show disassembly when tracing | on | ||
regs | always show updated register values | on | ||
trap | trace through traps | off | ||
jsr | trace through subroutines | on | ||
break | aktivate breakpoints processing | on | ||
watch | activate watchpoints procesing | on | ||
no {flag} | disable specified flags action | |||
Those flags can be appended to any command separated with a semicolon and no(!) space, or passed separately after the "flags;" command. They remain valid until re-defined explicitely.
<cursor down> repeat previous command. <cursor up> same, don't execute while tracing. . store .L-value .d0 set D0, etc. border [#chan] [<colour>] border width internally set to 1. break [<adr>] display breakpoint(s), or set a new bpt to <adr>. channels display current jobs channels clone [<command>]{:<commands>} display all "clone"-jobs, rsp install the following input line as a concurrently running job (default priority set to 3). clone on its own toggles the clone-registers reference between current and job at time of installation. close [#chan] close last used or specified channel cls [#chan] compare [#chan[,]] <adr area> <adr> [[;]flags] dis [#chan[,]] [<adr>][,<lines>] [[;]flags] dump [#chan[,]] [<adr>][,<lines>] [[;]flags] eval [<value>[[\]radix]] default radix is 16 (hex) find_[<size>] [#chan[,]] <adr area> <value> [[;]flags] flags {[no]<flag>}* store <flag(s)> as new default go [<adr>] heap <adr> <value> allocate <value> bytes of memory and store its base address at <adr> help display list of commands and flags ink [#chan] [<colour>] job <job-id> monitor the specified job - that job becomes "current". jobs [#chan] display all jobs kill <job-id> load <device&filename> [<adr>] nobreak [<adr>] clear all or specified breakpoint(s) noheap <adr> link back the heap area the base address of which is stored at <adr> nowatch_[<size>] <adr area> <value> clear all or specified watchpoint(s) nowatches clear all watchpoints open #chan <device> mode [<mode>] move <adr area> <adr> paper [#chan] [<colour>] poke_[<size>] <adr area> [<value>] defaults to byte size priority [<value> [<job-id>]] queue [#chan[,]] [<adr>[,<lines>]] quit regs [#chan[,]] [[;]flags] release [<job-id>] save device&filename <adr area> [<dataspace>] save the complete current jobs area,
dataspace set to 256 bytes: save flp1_jobfile_exe = 100 <enter> strip [#chan] [<colour>] swap hide the monitor screen, <enter> toggles back. suspend [<job-id>] trace [#chan[,]] [<adr>][,<lines>] [[;]flags] watch_[<size>] <adr area> <value> set watchpoint watches display watchpoints window [#chan] cursor-move last or by command specified window. ALT/cursor to adjust sizes, CTRL/.. for greater increment. windows re-position/-adjust all windows, one after the other
Notation ..}* may be any number of repetitive entries | alternative [...] optional . a single full stop can be used to resolve ambiguities: poke_w 5 -3 would clear the two bytes at address 2(BP), while poke_w 5 .-3 would store the value of -3 to address 5(BP). Grammar <value> = [$]<sedcimal number> | &<decimal number> | ^<octal number> | %<binary number> | "<string>" | '<string' | <value> | ~<value> dyadic operators + - * / add, subtract, multiply, divide ^ module (remainder of a division), MOD ~ bitwise one's complement, NOT ! & bitwise OR, bitwise AND < > shift left/right special <radix>%<value> <value> passed to <radix> ?<address> <value> at memory address <address> @<address> type conversion address -> value examples: eval @30 eval @25(a6,d0.w) [ ] operational precedence <address> = <value> {<value>(bp) if <value> < $10000} | <value>£ forced absolute address | <register> | [<value>](<address>{,<address>[.w|.l]}*) (<address>) value as stored in memory <value>(<address>) etc., as commonly used with assemblers, but may be extended to suit: $c0(a0,d1.w,a6,10(a6)), etc. <register> = d0...d7 | a0...a7 | r0...r7 | bp | tp | pc | sr (supervisor-sp A7' not accessible!) <area> = <address1>[,<address2>] | <address>\<value> | = current jobs RAM/memory area <adr area> = <address> address | <address1>,<address2> start and ende-1 | = current jobs area | <address>\<value> command with <address> in number <value> repetitions <size> = b | w | l <channel> | <lines> = <decimal number> <mode> | <colour> | <job-id> | <channel-id> | <base> = <value>
Error Messages, Exceptions display:
Illegal Instruction JB=<job-id> PC=<address> SR=<status> or Address Trap Error FC=nnn XY @<address> IR=<instruction code> with FC = 001 acces to user data 010 " program " 101 " supervisor " 110 " programm " 111 interrupt X = I while executing an operation E while executing an exception Y = R while reading W while writing