[front] : [next]

C1Mon 2.00x (.hpr'1/97), Reference


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).
                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>.
                        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>
                        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)
                        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>]]
        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



         ..}*        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).


        <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
                <radix>%<value>           <value> passed to <radix>
                ?<address>                <value> at memory address <address>
                @<address>                type conversion address -> value
                        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
                                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>
                Address Trap Error
                FC=nnn XY @<address> IR=<instruction code>
                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

[front] : [top] : e-mail : (count)

= .hpr.h1 = hpr.h1 =