
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   1

    1                       ttl Basic Operating System for Fred-Machine
    2                       bin
    3                      version macro
    4                      \* dc.b 'System version 07/05/87'
    5                        endm
    6                      
    7                      * Features:
    8                      * Single-Process environment,
    9                      * VDU handling,
   10                      * Ethernet handling,
   11                      * Filestore handling (via ethernet),
   12                      * Simple 4+4 stream IO package,
   13                      * Simple software front-panel.
   14                      * This system is loaded by the ROM bootstrap into l
   14+                     ocal RAM
   15                      * starting at $1000.  The system then loads the EXE
   15+                     C (command
   16                      * interpreter) into main store and leaps off into i
   16+                     t.
   17                      
   18                      * Device addresses
   19         0007FFFC     eths    equ $7fffc   * Status/Command register
   20         0007FFFD     ethd    equ $7fffd   * Data char reg
   21         0007FFFF     ethc    equ $7ffff   * Control char reg
   22         004000C1     vdus    equ $4000c1
   23         004000C3     vdud    equ $4000c3
   24         00400100     ptm     equ $400100
   25                      
   26                      * Device constants
   27         00000003     vinit equ 3
   28         00000015     viof  equ $15
   29         00000095     vion  equ $95
   30         00000004     vbrkbit equ 4
   31         00000000     vrrfbit equ 0
   32         00000001     vtbebit equ 1
   33         00000000     eiof  equ 0
   34         00000006     eion  equ $6
   35                      
   36                      * ISO Characters
   37         0000007F     del equ 127
   38         00000004     eot equ 4
   39         00000007     bel equ 7
   40         00000008     bs  equ 8
   41         0000000A     nl  equ 10
   42         0000000A     lf  equ 10
   43         0000000D     cr  equ 13
   44         0000001B     esc equ 27
   45                      
   46                      * Ethernet control characters
   47         00000080     opn equ $80
   48         00000090     cls equ $90
   49         00000010     rdy equ $10
   50         00000020     stx equ $20
   51         00000030     dtx equ $30
   52         00000050     nak equ $50
   53         000000C0     ack equ $c0
   54         0000000B     etx equ $0b
   55                      
   56                      * Filestore commands
   57         00004830     uclose  equ 'H'<<8+'0'
   58         00004B30     close   equ 'K'<<8+'0'
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   2

   59         00005330     openr   equ 'S'<<8+'0'
   60         00005430     openw   equ 'T'<<8+'0'
   61         00005530     reset   equ 'U'<<8+'0'
   62         00005830     readsq  equ 'X'<<8+'0'
   63         00005930     writesq equ 'Y'<<8+'0'
   64         00005F00     logmask equ 95<<8
   65         00004C00     logon   equ 'L'<<8
   66         00004D00     logoff  equ 'M'<<8
   67                      
   68                      * Store addresses
   69         00001000     sysbot  equ $1000   * const
   70                      * System code >= sysbot
   71                      * System stack < sysvars
   72         00003400     sysvars equ $3400   * const
   73                      * System variables >= sysvars
   74                      * Initial User stack < systop
   75         00003F00     systop  equ $3f00   * const
   76         00003FB0     comdict equ $3fb0
   77         00003FC0     fildict equ $3fc0
   78         00003FD0     extdict equ $3fd0
   79         00003FE0     sysdict equ $3fe0
   80         00003FF0     freebot equ $3ff0   * set up by boot rom
   81         00003FF4     freetop equ $3ff4
   82         00003FF8     membot  equ $3ff8   * remembered by system
   83         00003FFC     memtop  equ $3ffc
   84         00003FA9     xfsport equ $3fa9
   85                      
   86                      * VDU emulation stuff
   87         00003FA0     screenrows equ $3fa0
   88         00003FA1     screencols equ $3fa1
   89         00003FA2     screenput  equ $3fa2
   90         00003FA4     screenputa equ $3fa4
   91                      
   92                      ************************
   93                      * Supervisor variables *
   94                      ************************
   95                      
   96         00003400         org sysvars
   97  003400 00000004     event      ds.l 1   **order**
   98  003404 00000004     subevent   ds.l 1   **order**
   99  003408 00000004     eventinfo  ds.l 1   **order**
  100  00340C 00000004     eventpc    ds.l 1   **order**
  101  003410 00000100     eventmess  ds.b 256 **order**
  102                      *
  103                      * Kernel stuff for trace etc
  104                      *
  105  003510 00000040     evc   ds.l 16       * Event context (16 regs)
  106  003550 00000014     ehc   ds.l 5        * Event handler context (PC,A4,
  106+                     A5,A6,A7)
  107  003564 0000003C     rsave ds.l 15       * Trap context (16 regs + PC)
  108  0035A0 00000004     spsave ds.l 1
  109  0035A4 00000004     lastpc ds.l 1
  110  0035A8 00000006     breakpoint ds.w 3   * BP address (2w) and contents 
  110+                     (1w)
  111  0035AE 00000008     watchpoint ds.l 2   * WP address and contents
  112  0035B6 00000002     targetline ds.w 1
  113                      * Former site of ether stuff, moved further down
  114  0035B8 00000004     processor ds.l 1
  115  0035BC 00000008      ds.w 4
  116                      *
  117                      * Stream stuff
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   3

  118                      *
  119                      * 4-longword control blocks PTR:LIM:SERVICE:EXTRA
  120                      *
  121  0035C4 00000002     userno ds.w 1                 * Filestore user numb
  121+                     er (or 0)
  122  0035C6 00000004     curin  ds.l 1
  123  0035CA 00000004     curout ds.l 1
  124  0035CE 00000040     in0    ds.l 16                * 4 streams, 4 longwo
  124+                     rds each
  125  00360E 00000040     out0   ds.l 16
  126                      *
  127                      * Keyboard stuff
  128                      *
  129  00364E 00000004     kbprom  ds.l 1          * Address of prompt string
  130  003652 00000002     kbmode  ds.w 1          * nopage:single:notecho:noe
  130+                     cho
  131  003654 00000001     vdiscard ds.b 1         * Non-zero after ^O
  132  003655 00000001     vblank  ds.b 1          * Non-zero if current line 
  132+                     non-blank
  133  003656 00000002     vquota  ds.w 1          * Number of lines left befo
  133+                     re freezing
  134  003658 00000002     kbin    ds.w 1
  135  00365A 00000002     kbex    ds.w 1
  136  00365C 00000002     lpos    ds.w 1
  137  00365E 00000002     lend    ds.w 1
  138  003660 00000064     kbbeg   ds.b 100        * Raw keyboard buffer
  139         000036C4     kbend   equ *
  140  0036C4 0000005C     lbeg    ds.b 92         * Current line buffer
  141         00003720     llim    equ *
  142  003720 00000004     vep     ds.l 1          * Terminal output routine e
  142+                     ntry point
  143  003724 00000004     kexmask ds.l 1          * KB exemption mask
  144                      *
  145                      * Misc
  146                      *
  147  003728 00000004     millisecs ds.l 1        * 100 is added to this ever
  147+                     y decisec
  148  00372C 00000001     cylock    ds.b 1        * =0 not locked
  149                      *                       * >0 locked (with nest coun
  149+                     t)
  150                      *                       * + byte sign bit if ^Y pen
  150+                     ding
  151  00372D 00000001     fsport    ds.b 1        * Ether port used for files
  151+                     tore
  152                      *
  153                      * Ether stuff
  154                      *
  155  00372E 00000002     station ds.w 1
  156  003730 00000004     etherr  ds.l 1                * error count
  157  003734 00000004     dtxin   ds.l 1  **order**     * set on hearing DTX
  158  003738 00000004     rdyin   ds.l 1  **order**     * set on hearing RDY
  159  00373C 00000004     stxin   ds.l 1  **order**     * set on hearing STX
  160  003740 00000004     ackin   ds.l 1  **order**     * set on hearing ACK/
  160+                     NAK
  161  003744 00000004     nakin   ds.l 1  **order**     * set on hearing NAK
  162                      *
  163                      * Disq stuff?
  164                      *
  165  003748 00000004     dsqint ds.l 1  * int wait coroutine return address
  166  00374C 00000004     dsqwai ds.l 1  * int wait coroutine address
  167                      *
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   4

  168                      * Ether DtxIn AST for G
  169  003750 00000004     dtxast ds.l 1
  170  003754 00000004     dtxa6  ds.l 1
  171  003758 00000004     dtxmask ds.l 1
  172                      *
  173  00375C 00000001     ansi  ds.b 1
  174  00375D 00000001     prev  ds.b 1
  175                      *
  176                      *********************
  177                      * Exception vectors *
  178                      *********************
  179                      *
  180         00001000         org sysbot
  181         00000000     nullstring equ 0
  182         00001000     linenum equ *          **provisional**
  183  001000 00003400      dc.l sysvars
  184  001004 00002B74      dc.l begin
  185  001008 0000183C      dc.l berrexc
  186  00100C 00001844      dc.l aerrexc
  187  001010 0000192E      dc.l illeexc
  188  001014 0000193A      dc.l zerodiv
  189  001018 0000193E      dc.l chkfail
  190  00101C 00001942      dc.l overflow
  191  001020 000018C2      dc.l privexc
  192  001024 00001A0E      dc.l tracexc
  193  001028 0000192E      dc.l illeexc
  194  00102C 0000192E      dc.l illeexc
  195  001030 00001936      dc.l resexc
  196  001034 00001936      dc.l resexc
  197  001038 00001936      dc.l resexc
  198  00103C 00001936      dc.l resexc
  199  001040 00001936      dc.l resexc
  200  001044 00001936      dc.l resexc
  201  001048 00001936      dc.l resexc
  202  00104C 00001936      dc.l resexc
  203  001050 00001936      dc.l resexc
  204  001054 00001936      dc.l resexc
  205  001058 00001936      dc.l resexc
  206  00105C 00001936      dc.l resexc
  207                      *               Autovectors
  208  001060 00001890      dc.l spuint0
  209  001064 00001896      dc.l spuint1
  210  001068 0000189C      dc.l spuint2
  211  00106C 000018A2      dc.l spuint3
  212  001070 00001D66      dc.l ethint
  213  001074 00001E7E      dc.l kbint
  214  001078 00001D40      dc.l timeint
  215  00107C 000018A8      dc.l spuint7
  216                      *               Trap vectors
  217  001080 000019F4      dc.l break    * Trap 0: breakpoint or SETSR
  218  001084 00001936      dc.l restrap  * Trap 1: (formerly unassvar)
  219  001088 00001954      dc.l getcpu   * Trap 2: D0 = 68000 or 68010
  220  00108C 00001936      dc.l restrap
  221  001090 00001936      dc.l restrap
  222  001094 00001936      dc.l restrap
  223  001098 00001936      dc.l restrap
  224  00109C 00001936      dc.l restrap
  225  0010A0 00001936      dc.l restrap
  226  0010A4 00001936      dc.l restrap
  227  0010A8 00001936      dc.l restrap
  228  0010AC 00001936      dc.l restrap
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   5

  229  0010B0 00001936      dc.l restrap
  230  0010B4 00001936      dc.l restrap
  231  0010B8 00001936      dc.l restrap
  232  0010BC 0000199C      dc.l linetrap
  233                      *
  234                      * External entry points
  235                      *
  236         000010C0        rorg *
  237         00000100     disp set $100
  238                      braw macro
  239                       bra.w *+disp
  240                      disp set disp+2
  241                       endm
  242                       braw
  243                       braw
  244                       braw
  245                       braw
  246                       braw
  247                       braw
  248                       braw
  249                       braw
  250                       braw
  251                       braw
  252                       braw
  253                       braw
  254                       braw
  255                       braw
  256                       braw
  257                       braw
  258                       braw
  259                       braw
  260                       braw
  261                       braw
  262                       braw
  263                       braw
  264                       braw
  265                       braw
  266                       braw
  267                       braw
  268                       braw
  269                       braw
  270                       braw
  271                       braw
  272                       braw
  273                       braw
  274                       braw
  275                       braw
  276                       braw
  277                       braw
  278                       braw
  279                       braw
  280                       braw
  281                       braw
  282                       braw
  283                       braw
  284                       braw
  285                       braw
  286                       braw
  287                       braw
  288                       braw
  289                       braw
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   6

  290                       braw
  291                       braw
  292                       braw
  293                       braw
  294                       braw
  295                       braw
  296                       braw
  297                       braw
  298                       braw
  299                       braw
  300                       braw
  301                       braw
  302                       braw
  303                       braw
  304                       braw
  305                       braw
  306                      jump macro
  307                       dc.w $4ef9
  308                       dc.l \1
  309                       endm
  310                       jump printsymbol,        * $10c0
  311                       jump printstring,        * $10c4
  312                       jump readsymbol,         * $10c8
  313                       jump nextsymbol,         * $10cc
  314                       jump prompt,             * $10d0
  315                       jump testsymbol,         * $10d4
  316                       jump selectinput,        * $10d8
  317                       jump selectoutput,       * $10dc
  318                       jump resetinput,         * $10e0
  319                       jump resetoutput,        * $10e4
  320                       jump closeinput,         * $10e8
  321                       jump closeoutput,        * $10ec
  322                       jump openinput,          * $10f0
  323                       jump openoutput,         * $10f4
  324                       jump etheropen,          * $10f8
  325                       jump etherclose,         * $10fc
  326                       jump etherwrite,         * $1100
  327                       jump etherread,          * $1104
  328                       jump fcomm,              * $1108
  329                       jump fcommw,             * $110c
  330                       jump fcommr,             * $1110
  331                       jump signal,             * $1114
  332                       jump read,               * $1118
  333                       jump write,              * $111c
  334                       jump mull,               * $1120
  335                       jump divl,               * $1124
  336                       jump scompu,             * $1128
  337                       jump scomp,              * $112c
  338                       jump cputime,            * $1130
  339                       jump arraydef,           * $1134
  340                       jump arrayget,           * $1138
  341                       jump arrayref,           * $113c
  342                       jump settermmode,        * $1140
  343                       jump absent,  intpower   * $1144
  344                       jump absent,  rplus      * $1148
  345                       jump absent,  rminus     * $114c
  346                       jump absent,  rmult      * $1150
  347                       jump absent,  rdiv       * $1154
  348                       jump absent,  rpower     * $1158
  349                       jump absent,  rnegate    * $115c
  350                       jump absent,  float      * $1160
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   7

  351                       jump absent,  fracpt     * $1164
  352                       jump absent,  intpt      * $1168
  353                       jump absent,  sqrt       * $116c
  354                       jump absent,  line3      * $1170
  355                       jump absent,  trapeze3   * $1174
  356                       jump absent,  triangle3  * $1178
  357                       jump defname,            * $117c
  358                       jump refname,            * $1180
  359                       jump transname,          * $1184
  360                       jump defineeh,           * $1188
  361                       jump nhex,               * $118c
  362                       jump bhex,               * $1190
  363                       jump whex,               * $1194
  364                       jump lhex,               * $1198
  365                       jump rhex,               * $119c
  366                       jump absent,  ?etherbits?* $11a0
  367                       jump absent,  hline3     * $11a4
  368                       jump absent,  fill3      * $11a8
  369                       jump absent,  clear3     * $11ac
  370                       jump absent,  vline3     * $11b0
  371                       jump absent,  plot3      * $11b4
  372                       jump absent,  undefined  * $11b8
  373                       jump absent,  undefined  * $11bc
  374                      *
  375                      * External not loaded
  376                      *
  377  001340 2057         absent move.l (sp),a0
  378  001342 3028FFFE       move.w -2(a0),d0
  379  001346 48C0           ext.l d0
  380  001348 21C03408       move.l d0,eventinfo
  381  00134C 42783410       clr.w eventmess
  382  001350 203C00000090   move.l #$90,d0
  383  001356 60000604       bra signal
  384                      *
  385                      * Hex I/O
  386                      *
  387  00135A 3F00         lhex move.w d0,-(sp)
  388  00135C 4840           swap d0
  389  00135E 6102           bsr.s whex
  390  001360 301F           move.w (sp)+,d0
  391  001362 3F00         whex move.w d0,-(sp)
  392  001364 E048           lsr.w #8,d0
  393  001366 6102           bsr.s bhex
  394  001368 301F           move.w (sp)+,d0
  395  00136A 3F00         bhex move.w d0,-(sp)
  396  00136C E848           lsr.w #4,d0
  397  00136E 6102           bsr.s nhex
  398  001370 301F           move.w (sp)+,d0
  399  001372 C0BC0000000F nhex and.l #15,d0
  400  001378 B07C0009       cmp #9,d0
  401  00137C 6F02           ble.s nh1
  402  00137E 5E40           addq #7,d0
  403  001380 D07C0030     nh1 add #'0',d0
  404  001384 60000C2E       bra printsymbol
  405                      *
  406  001388 4281         rhex clr.l d1
  407  00138A 61000D02       bsr nextsymbol
  408  00138E B07C0020       cmp #' ',d0
  409  001392 6E06           bgt.s rh1
  410  001394 61000D00       bsr readsymbol
  411  001398 60EE           bra rhex
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   8

  412  00139A B07C0030     rh1 cmp #'0',d0
  413  00139E 6D2A           blt.s rh9
  414  0013A0 B07C0039       cmp #'9',d0
  415  0013A4 6F12           ble.s rh2
  416  0013A6 C07C005F       and #95,d0
  417  0013AA B07C0041       cmp #'A',d0
  418  0013AE 6D1A           blt.s rh9
  419  0013B0 B07C0046       cmp #'F',d0
  420  0013B4 6E14           bgt.s rh9
  421  0013B6 5F40           subq #7,d0
  422  0013B8 907C0030     rh2 sub #'0',d0
  423  0013BC E989           lsl.l #4,d1
  424  0013BE D240           add d0,d1
  425  0013C0 61000CD4       bsr readsymbol
  426  0013C4 61000CC8       bsr nextsymbol
  427  0013C8 60D0           bra rh1
  428  0013CA 2001         rh9 move.l d1,d0
  429  0013CC 4E75           rts
  430                      *
  431                      * Included files
  432                      *
  433                         incl fmacs:impperm.asm
    1&                     ****************************
    2&                     *  IMP perm                *
    3&                     *  String Compare          *
    4&                     *  Define Array Dimension  *
    5&                     *  Claim Space for Array   *
    6&                     *  Array Index             *
    7&                     *  Integer Read            *
    8&                     *  Integer Write           *
    9&                     ****************************
   10&                     *
   11&                     * String compare:
   12&                     *   Input:
   13&                     * D7: unassigned pattern
   14&                     * A1: address of string B
   15&                     * A0: address of string A
   16&                     *   Output:
   17&                     * X: undefined
   18&                     * N: undefined
   19&                     * Z: set iff A=B
   20&                     * V: undefined
   21&                     * C: set iff A<B
   22&                     * D0-D7,A0-A7: unchanged
   23&                     
   24& 0013CE BE88         scompu cmp.l a0,d7
   25& 0013D0 670C           beq.s scunass
   26& 0013D2 BE89           cmp.l a1,d7
   27& 0013D4 6708           beq.s scunass
   28& 0013D6 BE50           cmp.w (a0),d7
   29& 0013D8 6704           beq.s scunass
   30& 0013DA BE51           cmp.w (a1),d7
   31& 0013DC 6602           bne.s scomp
   32& 0013DE 4E41         scunass trap #1
   33& 0013E0 48E7C0C0     scomp movem.l d0-d1/a0-a1,-(sp)
   34& 0013E4 4240           clr.w d0
   35& 0013E6 1018           move.b (a0)+,d0          * length(A)
   36& 0013E8 6730           beq.s scAnull
   37& 0013EA 4241           clr.w d1
   38& 0013EC 1219           move.b (a1)+,d1          * length(B)
   39& 0013EE 6722           beq.s scBless            * (B="")<(A#"") ->
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page   9

   40& 0013F0 5340           subq #1,d0
   41& 0013F2 5341           subq #1,d1
   42& 0013F4 B041           cmp.w d1,d0
   43& 0013F6 6E12           bgt.s scBshort           * length(B) < length(A) 
   43+                     ->
   44& 0013F8 9240           sub.w d0,d1              * d1 = length(B)-length(
   44+                     A) >= 0
   45& 0013FA B109         scloop cmpm.b (a1)+,(a0)+
   46& 0013FC 56C8FFFC       dbne d0,scloop
   47& 001400 6602           bne.s scdone
   48& 001402 4441           neg.w d1
   49& 001404 4CDF0303     scdone movem.l (sp)+,d0-d1/a0-a1
   50& 001408 4E75           rts
   51& 00140A B109         scBshort cmpm.b (a1)+,(a0)+
   52& 00140C 56C9FFFC       dbne d1,scBshort
   53& 001410 66F2           bne.s scdone
   54& 001412 7201         scBless  moveq #1,d1       * A>B
   55& 001414 4CDF0303       movem.l (sp)+,d0-d1/a0-a1
   56& 001418 4E75           rts
   57& 00141A 1011         scAnull move.b (a1),d0
   58& 00141C 4440           neg.w d0                 * B#"" means A<B (otherw
   58+                     ise A=B)
   59& 00141E 4CDF0303       movem.l (sp)+,d0-d1/a0-a1
   60& 001422 4E75           rts
   61&                     *
   62&                     * Define array dimension
   63&                     * Input:
   64&                     * D0 = size of element
   65&                     * D1 = LB
   66&                     * D2 = UB
   67&                     * Output:
   68&                     * D0 = size of array
   69&                     * D2 = UB-LB
   70& 001424 9481         arraydef sub.l d1,d2
   71& 001426 6D0A              blt.s insideout
   72& 001428 2202              move.l d2,d1
   73& 00142A 5281              addq.l #1,d1     * no of elements
   74& 00142C 610001D0          bsr mull         * has to be long multiplicati
   74+                     on
   75& 001430 4E75              rts
   76& 001432 303CFFCB     insideout move #-$35,d0
   77& 001436 60000524          bra signal
   78&                     
   79&                     *
   80&                     * Claim space for array
   81&                     * Input:
   82&                     * D0 = size
   83&                     * D6 = heap front +256
   84&                     * Output:
   85&                     * A0 = low address
   86&                     * D6 = new heap front
   87&                     * D0 = A0
   88& 00143A 5680         arrayget addq.l #3,d0  * Longword-align
   89& 00143C C0BCFFFFFFFC   and.l #-4,d0
   90& 001442 DC80           add.l d0,d6
   91& 001444 4480           neg.l d0
   92& 001446 BFC6           cmp.l d6,sp
   93& 001448 6F0C           ble.s nospace
   94& 00144A D086           add.l d6,d0
   95& 00144C 90BC00000100   sub.l #256,d0
   96& 001452 2040           move.l d0,a0
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  10

   97& 001454 4E75           rts
   98& 001456 DC80         nospace add.l d0,d6
   99& 001458 70EE           moveq #-$12,d0
  100& 00145A 60000500       bra signal
  101&                     
  102&                     *
  103&                     * Array index
  104&                     * Input:
  105&                     * D0 = index
  106&                     * A0 -> ###.     upper-lower, lower, size, ###
  107& 00145E 2F01         arrayref move.l d1,-(sp)
  108& 001460 2220           move.l -(a0),d1
  109&                     *arrayref move.l -(a0),d1  * get size
  110& 001462 90A0           sub.l -(a0),d0          * subtract lower from ind
  110+                     ex
  111& 001464 6D0E           blt.s toolow            * simulate CHK.L d0,-(a0)
  112& 001466 B0A0           cmp.l -(a0),d0
  113& 001468 6E08           bgt.s toohigh
  114& 00146A 61000192       bsr mull
  115& 00146E 221F           move.l (sp)+,d1
  116& 001470 4E75           rts
  117&                     *  bra mull                * mult by size and retur
  117+                     n
  118& 001472 5888         toohigh addq.l #4,a0
  119& 001474 D090         toolow add.l (a0),d0
  120& 001476 221F           move.l (sp)+,d1
  121& 001478 21C03408       move.l d0,eventinfo
  122& 00147C 42783410       clr.w eventmess
  123& 001480 7026           moveq #$26,d0
  124& 001482 600004D8       bra signal
  125&                     *
  126&                     * Longword Write decimal
  127&                     *
  128& 001486 5381         writer   sub.l   #1,d1
  129& 001488 B0BC0000000A          cmp.l   #10,d0
  130& 00148E 6424                  bcc.s   more
  131& 001490 4840                  swap    d0
  132& 001492 4A81                  tst.l   d1
  133& 001494 6D0C                  blt.s   nolspace
  134& 001496 303C0020     wsploop  move    #' ',d0
  135& 00149A 4EBA0B18              jsr     printsymbol
  136& 00149E 51C9FFF6              dbra    d1,wsploop
  137& 0014A2 3003         nolspace  move d3,d0
  138& 0014A4 6704                   beq.s nosign
  139& 0014A6 61000B0C                bsr printsymbol
  140& 0014AA 4840         nosign   swap    d0
  141& 0014AC D07C0030              add     #'0',d0
  142& 0014B0 4EFA0B02              jmp     printsymbol
  143& 0014B4 3F02         more     move    d2,-(sp)
  144& 0014B6 4840                  swap    d0
  145& 0014B8 4282                  clr.l   d2
  146& 0014BA 3400                  move    d0,d2
  147& 0014BC 84FC000A              divu    #10,d2
  148& 0014C0 3002                  move    d2,d0
  149& 0014C2 4242                  clr     d2
  150& 0014C4 4840                  swap    d0
  151& 0014C6 3400                  move    d0,d2
  152& 0014C8 84FC000A              divu    #10,d2
  153& 0014CC 3002                  move    d2,d0
  154& 0014CE 4842                  swap    d2
  155& 0014D0 61B4                  bsr.s   writer
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  11

  156& 0014D2 3002                  move    d2,d0
  157& 0014D4 D07C0030              add     #'0',d0
  158& 0014D8 4EBA0ADA              jsr     printsymbol
  159& 0014DC 341F                  move    (sp)+,d2
  160& 0014DE 4E75                  rts
  161& 0014E0 40E7         write    move sr,-(sp)
  162& 0014E2 48E7F000              movem.l d0-d3,-(sp)
  163& 0014E6 4243                  clr     d3
  164& 0014E8 5381                  subq.l  #1,d1
  165& 0014EA 6D02                  blt.s write0
  166& 0014EC 7620                  moveq #' ',d3
  167& 0014EE 4A80         write0   tst.l   d0
  168& 0014F0 6A04                  bpl.s   wrpos
  169& 0014F2 4480                  neg.l   d0
  170& 0014F4 762D                  moveq #'-',d3
  171& 0014F6 618E         wrpos    bsr writer
  172& 0014F8 4CDF000F              movem.l (sp)+,d0-d3
  173& 0014FC 4E77                  rtr
  174&                     *
  175&                     *  Longword Read Decimal
  176&                     *
  177& 0014FE 48E76000     read     movem.l d1-d2,-(sp)
  178& 001502 4280                  clr.l   d0
  179& 001504 4242                  clr     d2
  180& 001506 6004                  bra.s scanloop
  181& 001508 4EBA0B8C     skiploop jsr readsymbol
  182& 00150C 4EBA0B80     scanloop jsr nextsymbol
  183& 001510 B03C0020              cmp.b   #' ',d0
  184& 001514 67F2                  beq     skiploop
  185& 001516 B03C000A              cmp.b   #nl,d0
  186& 00151A 67EC                  beq     skiploop
  187& 00151C B03C002D              cmp.b   #'-',d0
  188& 001520 6618                  bne.s   notsign
  189& 001522 0A420001              eor     #1,d2
  190& 001526 60E0                  bra     skiploop
  191& 001528 D03C0030     inputerr add.b #'0',d0
  192& 00152C 21C03408              move.l  d0,eventinfo
  193& 001530 42783410              clr.w   eventmess
  194& 001534 7014                  moveq #$14,d0
  195& 001536 61000424              bsr signal
  196& 00153A 903C0030     notsign  sub.b   #'0',d0
  197& 00153E 6BE8                  bmi   inputerr
  198& 001540 B03C0009              cmp.b   #9,d0
  199& 001544 62E2                  bhi     inputerr
  200& 001546 08020000              btst    #0,d2
  201& 00154A 6702                  beq.s   readpos1
  202& 00154C 4480                  neg.l   d0
  203& 00154E 2200         readpos1 move.l  d0,d1
  204& 001550 4EBA0B44              jsr readsymbol
  205& 001554 4280         readlp   clr.l   d0
  206& 001556 4EBA0B36              jsr     nextsymbol
  207& 00155A 903C0030              sub.b   #'0',d0
  208& 00155E 6B34                  bmi.s   readdone
  209& 001560 B03C0009              cmp.b   #9,d0
  210& 001564 622E                  bhi.s   readdone
  211& 001566 08020000              btst    #0,d2
  212& 00156A 6702                  beq.s   readpos2
  213& 00156C 4480                  neg.l   d0
  214& 00156E E381         readpos2 asl.l   #1,d1
  215& 001570 6804                  bvc.s   rdnoflo1
  216& 001572 847C0002              or      #2,d2
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  12

  217& 001576 D081         rdnoflo1 add.l   d1,d0
  218& 001578 6804                  bvc.s   rdnoflo2
  219& 00157A 847C0002              or      #2,d2
  220& 00157E E581         rdnoflo2 asl.l   #2,d1
  221& 001580 6804                  bvc.s   rdnoflo3
  222& 001582 847C0002              or      #2,d2
  223& 001586 D280         rdnoflo3 add.l   d0,d1
  224& 001588 6804                  bvc.s   rdnoflo4
  225& 00158A 847C0002              or      #2,d2
  226& 00158E 4EBA0B06     rdnoflo4 jsr     readsymbol
  227& 001592 60C0                  bra     readlp
  228& 001594 C47C0002     readdone and     #2,d2
  229& 001598 40C0                  move    sr,d0
  230& 00159A 8440                  or      d0,d2
  231& 00159C 2001                  move.l  d1,d0
  232& 00159E 44C2                  move    d2,ccr
  233& 0015A0 4CDF0006              movem.l (sp)+,d1-d2
  234& 0015A4 4E75                  rts
  235&                              end
  434                         incl fmacs:extended.asm
    1&                     ******************************************
    2&                     *  Extended Arithmetic Package           *
    3&                     *  Longword integer multiply and divide  *
    4&                     *                                        *
    5&                     *  Copyright M.R.King, 26/3/1984         *
    6&                     *  All rights reserved                   *
    7&                     *                                        *
    8&                     ******************************************
    9&                     
   10& 0015A6 49              dc.b 'Integer Extended Arithmetic Package. '
   11& 0015CB 43              dc.b 'Copyright M.R.King, 26/3/1984. '
   12& 0015EA 41              dc.b 'All rights reserved.'
   13&                     
   14&                     *
   15&                     * 32-bit multiply  d0 = d0*d1
   16&                     *
   17& 0015FE 48E77800     mull movem.l d1-d4,-(sp)
   18& 001602 7800            moveq #0,d4
   19& 001604 2400            move.l d0,d2
   20& 001606 6A06            bpl.s m1
   21& 001608 4480            neg.l d0
   22& 00160A 7801            moveq #1,d4
   23& 00160C 2400            move.l d0,d2
   24& 00160E 4842         m1 swap d2
   25& 001610 2601            move.l d1,d3
   26& 001612 6A08            bpl.s m2
   27& 001614 4481            neg.l d1
   28& 001616 0A440001        eor.w #1,d4
   29& 00161A 2601            move.l d1,d3
   30& 00161C 4843         m2 swap d3
   31& 00161E 4A42            tst.w d2
   32& 001620 6714            beq.s maz     * A>>16=0 ->
   33& 001622 4A43            tst.w d3
   34& 001624 6726            beq.s mbz     * B>>16=0 ->
   35& 001626 C6C0            mulu d0,d3
   36& 001628 C4C1            mulu d1,d2
   37& 00162A C0C1            mulu d1,d0
   38& 00162C D483            add.l d3,d2
   39& 00162E 4840            swap d0
   40& 001630 D042            add.w d2,d0
   41& 001632 4840            swap d0
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  13

   42& 001634 603E            bra.s mv      * mandatory overflow ->
   43& 001636 4A43         maz tst.w d3
   44& 001638 6724            beq.s mabz    * A>>16=B>>16=0 ->
   45& 00163A C6C0            mulu d0,d3
   46& 00163C C0C1            mulu d1,d0
   47& 00163E 4840            swap d0
   48& 001640 D043            add.w d3,d0
   49& 001642 4840            swap d0
   50& 001644 4843            swap d3
   51& 001646 4A43            tst.w d3
   52& 001648 662A            bne.s mv      * certain overflow ->
   53& 00164A 6014            bra.s mvt     * possible overflow ->
   54& 00164C C4C1         mbz mulu d1,d2
   55& 00164E C0C1            mulu d1,d0
   56& 001650 4840            swap d0
   57& 001652 D042            add.w d2,d0
   58& 001654 4840            swap d0
   59& 001656 4842            swap d2
   60& 001658 4A42            tst.w d2
   61& 00165A 6618            bne.s mv
   62& 00165C 6002            bra.s mvt
   63& 00165E C0C1         mabz mulu d1,d0
   64& 001660 4A80         mvt tst.l d0
   65& 001662 6B10            bmi.s mv
   66& 001664 08040000        btst #0,d4
   67& 001668 6702            beq.s m8
   68& 00166A 4480            neg.l d0
   69& 00166C 4A80         m8 tst.l d0
   70& 00166E 4CDF001E        movem.l (sp)+,d1-d4
   71& 001672 4E75            rts
   72& 001674 08040000     mv btst #0,d4
   73& 001678 6702            beq.s m9
   74& 00167A 4480            neg.l d0
   75& 00167C 4A80         m9 tst.l d0
   76& 00167E 4CDF001E        movem.l (sp)+,d1-d4
   77& 001682 003C0002        or.b #2,ccr
   78& 001686 4E75            rts
   79&                     *mull     movem.l d1-d4,-(sp)
   80&                     *         clr     d4
   81&                     *         move.l  d0,d2
   82&                     *         bpl.s   posd0l
   83&                     *         neg.l   d0
   84&                     *         move.l  d0,d2
   85&                     *         or      #1,d4
   86&                     *posd0l   tst.l   d1
   87&                     *         bpl.s   posd1l
   88&                     *         neg.l   d1
   89&                     *         eor     #1,d4
   90&                     *posd1l   mulu    d1,d0
   91&                     *         swap    d0
   92&                     *         swap    d1
   93&                     *         tst     d1
   94&                     *         beq.s   nomult1
   95&                     *         move    d1,d3
   96&                     *         mulu    d2,d3
   97&                     *         add     d3,d0
   98&                     *         swap    d3
   99&                     *         tst     d3
  100&                     *         bne.s   ioflow
  101&                     *         swap    d2
  102&                     *         tst     d2
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  14

  103&                     *         beq.s   nomult2
  104&                     *         bra.s   ioflow
  105&                     *nomult1  swap    d2
  106&                     *         tst     d2
  107&                     *         beq.s   nomult2
  108&                     *         swap    d1
  109&                     *         mulu    d2,d1
  110&                     *         add     d1,d0
  111&                     *         swap    d1
  112&                     *         tst     d1
  113&                     *         bne.s   ioflow
  114&                     *nomult2  swap    d0
  115&                     *         bmi.s   ioflow
  116&                     *         bclr    #0,d4
  117&                     *         beq.s   mulret
  118&                     *         neg.l   d0
  119&                     *mulret   movem.l (sp)+,d1-d4
  120&                     *         tst.l d0
  121&                     *         rts
  122&                     *ioflow   movem.l (sp)+,d1-d4
  123&                     *         moveq #-$11,d0
  124&                     *         bra signal
  125&                     *        or.b    #2,sr
  126&                     *        rts
  127&                     *
  128&                     * 32-bit divide  d0 by d1, d0=quot, d1=rem
  129&                     *
  130& 001688 48E73800     divl     movem.l d2-d4,-(sp)
  131& 00168C 4244                  clr     d4
  132& 00168E 2401                  move.l  d1,d2
  133& 001690 6744                  beq.s   zdivoflow
  134& 001692 6A06                  bpl.s   divpos1
  135& 001694 4482                  neg.l   d2
  136& 001696 887C0002              or      #2,d4
  137& 00169A 2200         divpos1  move.l  d0,d1
  138& 00169C 6A08                  bpl.s   divpos2
  139& 00169E 4481                  neg.l   d1
  140& 0016A0 0A8400000003          eor.l   #3,d4
  141& 0016A6 4280         divpos2  clr.l   d0
  142& 0016A8 7601                  move.l  #1,d3
  143& 0016AA 6004                  bra.s   divsulps
  144& 0016AC E38A         divsulp  lsl.l   #1,d2
  145& 0016AE E38B                  lsl.l   #1,d3
  146& 0016B0 B282         divsulps cmp.l   d2,d1
  147& 0016B2 62F8                  bhi.s   divsulp
  148& 0016B4 B282         divlp    cmp.l   d2,d1
  149& 0016B6 6504                  bcs.s   divnosub
  150& 0016B8 D083                  add.l   d3,d0
  151& 0016BA 9282                  sub.l   d2,d1
  152& 0016BC E28A         divnosub lsr.l   #1,d2
  153& 0016BE E28B                  lsr.l   #1,d3
  154& 0016C0 66F2                  bne     divlp
  155& 0016C2 E24C                  lsr     #1,d4
  156& 0016C4 6402                  bcc.s   nonegrem
  157& 0016C6 4481                  neg.l   d1
  158& 0016C8 4A44         nonegrem tst     d4
  159& 0016CA 6702                  beq.s   nonegquo
  160& 0016CC 4480                  neg.l   d0
  161& 0016CE 4A80         nonegquo tst.l   d0
  162& 0016D0 4CDF001C              movem.l (sp)+,d2-d4
  163& 0016D4 4E75                  rts
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  15

  164& 0016D6 70BF         zdivoflow moveq #-$41,d0
  165& 0016D8 4CDF001C              movem.l (sp)+,d2-d4
  166& 0016DC 6000027E              bra signal
  167&                              end
  435                         incl fmacs:dict.asm
    1&                     ***************************
    2&                     *  Dictionary Operations  *
    3&                     ***************************
    4&                     
    5&        00000000     dictbeg equ 0
    6&        00000004     dictpos equ 4
    7&        00000008     dictlim equ 8
    8&        0000000C     dictalt equ 12
    9&                     
   10&                     **************************************************
   11&                     *  Define name (D0=size,A0=name,A1=dict/D0=tag)  *
   12&                     *  D0<0: Name already defined  D0=0: dict full   *
   13&                     **************************************************
   14&                     
   15& 0016E0 5680         defname addq.l #3,d0 * Round up to an integral
   16& 0016E2 E488           lsr.l #2,d0        * number of longwords
   17& 0016E4 48E7E0F0       movem.l d0-d2/a0-a3,-(sp)
   18& 0016E8 4280           clr.l d0
   19& 0016EA 1018           move.b (a0)+,d0    * Length of string
   20& 0016EC 2451           move.l dictbeg(a1),a2
   21& 0016EE B5E90004       cmp.l dictpos(a1),a2
   22& 0016F2 660A           bne.s dn1          * Dictionary not empty ->
   23& 0016F4 429A           clr.l (a2)+        * Initialise dictionary
   24& 0016F6 429A           clr.l (a2)+
   25& 0016F8 234A0004       move.l a2,dictpos(a1)
   26& 0016FC 518A           subq.l #8,a2
   27& 0016FE 4201         dn1 clr.b d1
   28& 001700 5380           subq.l #1,d0       * Advance along string
   29& 001702 6B02           bmi.s dn2          * End of string: match 0
   30& 001704 1218           move.b (a0)+,d1    * Otherwise match next char
   31& 001706 264A         dn2 move.l a2,a3     * A3 -> predecessor
   32& 001708 588A           addq.l #4,a2       * A2 -> next candidate
   33& 00170A B212         dn3 cmp.b (a2),d1
   34& 00170C 6614           bne.s dn4          * Mismatch ->
   35& 00170E 4A01           tst.b d1
   36& 001710 66EC           bne dn1            * Not yet done ->
   37& 001712 203C80000004   move.l #$80000004,d0 * (Duplicate)
   38& 001718 D08A           add.l a2,d0
   39& 00171A 588F           addq.l #4,sp
   40& 00171C 4CDF0F06       movem.l (sp)+,d1/d2/a0-a3
   41& 001720 4E75           rts
   42& 001722 4282         dn4 clr.l d2
   43& 001724 342A0002       move.w 2(a2),d2  * get alt pointer
   44& 001728 6706           beq.s dn5          * no alt ->
   45& 00172A E58A           lsl.l #2,d2        * scale-up
   46& 00172C D5C2           add.l d2,a2
   47& 00172E 60DA           bra dn3            * Try alt
   48& 001730 240B         dn5 move.l a3,d2     * Remember predecessor
   49& 001732 26690004       move.l dictpos(a1),a3
   50& 001736 2F00           move.l d0,-(sp)    * Preserve (rest of) string le
   50+                     ngth
   51& 001738 5680           addq.l #3,d0       * Test for dict overflow
   52& 00173A D0AF0004       add.l 4(sp),d0
   53& 00173E E588           lsl.l #2,d0
   54& 001740 D08B           add.l a3,d0
   55& 001742 B0A90008       cmp.l dictlim(a1),d0
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  16

   56& 001746 6C38           bge.s dn9          * Dict full ->
   57& 001748 23400004       move.l d0,dictpos(a1) * Allocate space
   58& 00174C 201F           move.l (sp)+,d0
   59& 00174E 948B           sub.l a3,d2
   60& 001750 425B           clr.w (a3)+
   61& 001752 4482           neg.l d2
   62& 001754 E48A           lsr.l #2,d2        * scale-down (back-pointer)
   63& 001756 36C2           move.w d2,(a3)+
   64& 001758 240B           move.l a3,d2
   65& 00175A 948A           sub.l a2,d2
   66& 00175C E48A           lsr.l #2,d2        * scale-down (alt-pointer)
   67& 00175E 35420002       move.w d2,2(a2)
   68& 001762 16C1         dn6 move.b d1,(a3)+
   69& 001764 421B           clr.b (a3)+
   70& 001766 425B           clr.w (a3)+
   71& 001768 4A40           tst.w d0
   72& 00176A 6B0A           bmi.s dn7          * done ->
   73& 00176C 4241           clr.w d1           * Extract next char (or 0)
   74& 00176E 5340           subq.w #1,d0
   75& 001770 6BF0           bmi dn6
   76& 001772 1218           move.b (a0)+,d1
   77& 001774 60EC           bra dn6
   78& 001776 200B         dn7 move.l a3,d0
   79& 001778 588F           addq.l #4,sp
   80& 00177A 4CDF0F06       movem.l (sp)+,d1/d2/a0-a3
   81& 00177E 4E75           rts
   82& 001780 97CB         dn9 sub.l a3,a3      * Dictionary full
   83& 001782 588F           addq.l #4,sp       *30/05/85 bugfix
   84& 001784 60F0           bra dn7
   85&                     
   86&                     *********************************************
   87&                     *  Reference name (A0=name,A1=dict/D0=tag)  *
   88&                     *  D0=0: not found,  D0<0: approx match     *
   89&                     *********************************************
   90&                     
   91& 001786 48E760E0     refname movem.l d1/d2/a0-a2,-(sp)
   92& 00178A 4280         rn0 clr.l d0
   93& 00178C 1018           move.b (a0)+,d0  * Length of string
   94& 00178E 2451           move.l dictbeg(a1),a2
   95& 001790 4201         rn1 clr.b d1       * Advance along string
   96& 001792 5380           subq.l #1,d0
   97& 001794 6B02           bmi.s rn2        * D1=0 for end of string ->
   98& 001796 1218           move.b (a0)+,d1
   99& 001798 588A         rn2 addq.l #4,a2   * Advance along dict
  100& 00179A B5E90004     rn3 cmp.l dictpos(a1),a2
  101& 00179E 6C18           bge.s rn5        * Off end ->
  102& 0017A0 B212           cmp.b (a2),d1
  103& 0017A2 6606           bne.s rn4        * Mismatch here ->
  104& 0017A4 4A01           tst.b d1
  105& 0017A6 6744           beq.s rn9        * Complete match ->
  106& 0017A8 60E6           bra rn1
  107& 0017AA 4282         rn4 clr.l d2
  108& 0017AC 342A0002       move.w 2(a2),d2
  109& 0017B0 6706           beq.s rn5        * No alt ->
  110& 0017B2 E58A           lsl.l #2,d2      * scale-up
  111& 0017B4 D5C2           add.l d2,a2
  112& 0017B6 60E2           bra rn3          * Try elsewhere
  113& 0017B8 4A01         rn5 tst.b d1
  114& 0017BA 67000012       beq rn8          * Approx match ->
  115& 0017BE 206F0008       move.l 8(sp),a0  * Reset string pointer
  116& 0017C2 2029000C       move.l dictalt(a1),d0 * Try alt dict if any
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  17

  117& 0017C6 2240           move.l d0,a1
  118& 0017C8 66C0           bne rn0
  119& 0017CA 4280           clr.l d0         * Name not found =>
  120& 0017CC 6022           bra.s rn10
  121& 0017CE 588A         rn8 addq.l #4,a2   * scan to end of this name
  122& 0017D0 4A12           tst.b (a2)
  123& 0017D2 66FA           bne rn8
  124& 0017D4 D5FC80000000   add.l #$80000000,a2 * (A2 preserved across recurs
  124+                     ive call)
  125& 0017DA 206F0008       move.l 8(sp),a0  * Try alt dict for better match
  126& 0017DE 2029000C       move.l dictalt(a1),d0
  127& 0017E2 2240           move.l d0,a1
  128& 0017E4 6706           beq.s rn9         * No alt dict ->
  129& 0017E6 619E           bsr refname
  130& 0017E8 4A80           tst.l d0
  131& 0017EA 6E04           bgt.s rn10        * Better match found ->
  132& 0017EC 588A         rn9 addq.l #4,a2
  133& 0017EE 200A           move.l a2,d0
  134& 0017F0 4CDF0706     rn10 movem.l (sp)+,d1/d2/a0-a2
  135& 0017F4 4E75           rts
  136&                     
  137&                     *************************************
  138&                     *  Translate name (D0=tag,A0=name)  *
  139&                     *************************************
  140&                     
  141& 0017F6 48E7E0E0     transname movem.l d0-d2/a0-a2,-(sp)
  142& 0017FA 4210           clr.b (a0)        * string = ""
  143& 0017FC 43E80001       lea 1(a0),a1      * Pointer along string
  144& 001800 2440           move.l d0,a2      * Dict tag
  145& 001802 518A           subq.l #8,a2      * Pointer along dict
  146& 001804 1012         tn1 move.b (a2),d0  * Character
  147& 001806 660E           bne.s tn2         * Genuine ->
  148& 001808 4280           clr.l d0
  149& 00180A 302A0002       move.w 2(a2),d0   * Get predecessor
  150& 00180E 670C           beq.s tn3         * None ->
  151& 001810 E588           lsl.l #2,d0       * scale-up
  152& 001812 95C0           sub.l d0,a2
  153& 001814 60EE           bra tn1
  154& 001816 12C0         tn2 move.b d0,(a1)+
  155& 001818 598A           subq.l #4,a2      * Get predecessor
  156& 00181A 60E8           bra tn1
  157& 00181C 2009         tn3 move.l a1,d0
  158& 00181E 9088           sub.l a0,d0
  159& 001820 5300           subq.b #1,d0
  160& 001822 1080           move.b d0,(a0)    * Set string length
  161& 001824 45E80001       lea 1(a0),a2
  162& 001828 5500         tn4 subq.b #2,d0    * Reverse the string
  163& 00182A 6B0A           bmi.s tn5         * Done ->
  164& 00182C 1212           move.b (a2),d1
  165& 00182E 1421           move.b -(a1),d2
  166& 001830 1281           move.b d1,(a1)
  167& 001832 14C2           move.b d2,(a2)+
  168& 001834 60F2           bra tn4
  169& 001836 4CDF0707     tn5 movem.l (sp)+,d0-d2/a0-a2
  170& 00183A 4E75           rts
  171&                     
  172&                       end
  436                      *
  437                      ************************
  438                      * Exception processing *
  439                      ************************
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  18

  440                      *
  441                      * Bus and Address errors
  442                      *
  443  00183C 21C03418     berrexc move.l d0,eventmess+8
  444  001840 7020            moveq #$20,d0
  445  001842 6006            bra.s aberror
  446  001844 21C03418     aerrexc move.l d0,eventmess+8
  447  001848 7030            moveq #$30,d0
  448                      *
  449  00184A 0CB8000109A0 aberror cmp.l #68000,processor
  450  001852 6724            beq.s aberr000
  451  001854 3F6F00180030    move.w $18(sp),$30(sp)   Instruction
  452  00185A 3F570032        move.w (sp),$32(sp)      SR
  453  00185E 2F6F00020034    move.l 2(sp),$34(sp)     PC
  454  001864 2F6F000A002C    move.l $a(sp),$2c(sp)    Address
  455  00186A 3F6F0008002A    move.w 8(sp),$2a(sp)     Function codes
  456  001870 426F0038        clr.w $38(sp)            Format word
  457  001874 4FEF002A        lea $2a(sp),sp
  458  001878 31DF3412     aberr000 move.w (sp)+,eventmess+2
  459  00187C 21DF3408        move.l (sp)+,eventinfo
  460  001880 31DF3414        move.w (sp)+,eventmess+4
  461  001884 31D73416        move.w (sp),eventmess+6
  462  001888 42783410        clr.w eventmess
  463  00188C 600000B6        bra signald0
  464                      *
  465                      * Spurious interrupts
  466                      *
  467  001890 3F3C0030     spuint0 move.w #'0',-(sp)
  468  001894 6016            bra.s spuint
  469  001896 3F3C0031     spuint1 move.w #'1',-(sp)
  470  00189A 6010            bra.s spuint
  471  00189C 3F3C0032     spuint2 move.w #'2',-(sp)
  472  0018A0 600A            bra.s spuint
  473  0018A2 3F3C0033     spuint3 move.w #'3',-(sp)
  474  0018A6 6004            bra.s spuint
  475  0018A8 3F3C0037     spuint7 move.w #'7',-(sp)
  476  0018AC 2F08         spuint move.l a0,-(sp)
  477  0018AE 41FA173D        lea intnum,a0
  478  0018B2 10AF0005        move.b 5(sp),(a0)
  479  0018B6 205F            move.l (sp)+,a0
  480  0018B8 548F            addq.l #2,sp
  481  0018BA 487A1718        pea spint
  482  0018BE 60000158        bra except
  483                      * Intercept violations caused in 68010 by
  484                      *      MOVE SR,-(SP)
  485                      * and  MOVE SR,Dn
  486                      
  487  0018C2 48E780C0     privexc movem.l d0/a0/a1,-(sp)
  488  0018C6 206F000E       move.l 14(sp),a0             * Offending PC
  489  0018CA 3010           move.w (a0),d0               * Offending instruct
  489+                     ion
  490  0018CC 54AF000E       addq.l #2,14(sp)
  491  0018D0 B07C40E7       cmp.w #$40e7,d0              * (MOVE.W SR,-(SP))
  492  0018D4 67000018       beq canpush
  493  0018D8 C07CFFF8       and.w #-8,d0
  494  0018DC B07C40C0       cmp.w #$40c0,d0              * (MOVE.W SR,D?)
  495  0018E0 6700001A       beq canread
  496  0018E4 55AF000E       subq.l #2,14(sp)
  497  0018E8 4CDF0301       movem.l (sp)+,d0/a0/a1       * Something else =>
  498  0018EC 6044           bra.s privviol
  499                      
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  19

  500                      * Come here on detecting MOVE SR,-(SP)
  501  0018EE 4E68         canpush move.l usp,a0
  502  0018F0 312F000C       move.w 12(sp),-(a0)
  503  0018F4 4E60           move.l a0,usp
  504  0018F6 4CDF0301       movem.l (sp)+,d0/a0/a1
  505  0018FA 4E73           rte
  506                      
  507                      * Come here on detecting MOVE SR,Dn
  508                      * Stack layout
  509                      *  0(SP)  D0H      retadH
  510                      *  2(SP)  D0L      retadL
  511                      *  4(SP)  A0H      (A0H)
  512                      *  6(SP)  A0L      MOVE.W ?(SP),Dn
  513                      *  8(SP)  (A1H)    ?=12
  514                      * 10(SP)  (A1L)    RTS
  515                      * 12(SP)  SR       (SR)
  516                      * 14(SP)  PCH      (PCH)
  517                      * 16(SP)  PCL      (PCL)
  518                      * Note A1 was saved to get the sites right for the 
  518+                     rest,
  519                      * not to protect it (we don't corrupt it here)
  520  0018FC 21FC000109AA canread move.l #68010,processor
  521  001904 7007           moveq #7,d0
  522  001906 C050           and.w (a0),d0            * register number
  523  001908 206F0004       move.l 4(sp),a0          * (restore A0)
  524  00190C EB48           lsl.w #5,d0
  525  00190E E948           lsl.w #4,d0
  526  001910 D07C302F       add.w #$302f,d0          * Generate MOVE.W 12(SP)
  526+                     ,Dn
  527  001914 3F400006       move.w d0,6(sp)
  528  001918 201F           move.l (sp)+,d0          * (restore D0)
  529  00191A 3F7C000C0004   move.w #12,4(sp)         * displacement for above
  530  001920 3F7C4E750006   move.w #$4e75,6(sp)      * RETURN instruction
  531  001926 4EAF0002       jsr 2(sp)
  532  00192A 508F           addq.l #8,sp             * skip former A0/A1
  533  00192C 4E73           rte
  534                      
  535                      *
  536                      * Exception or trap generated signals
  537                      *
  538  00192E 70C0         illeexc move.l #-$40,d0  * Illegal instruction: eve
  538+                     nt 0,4
  539  001930 6012            bra.s signald0
  540  001932 7080         privviol move.l #-$80,d0  * Privilege violation: ev
  540+                     ent 0,8
  541  001934 600E            bra.s signald0
  542         00001936     resexc equ *
  543  001936 70B0         restrap move.l #-$50,d0 * Reserved trap: event 0,5
  544  001938 600A            bra.s signald0
  545  00193A 70BF         zerodiv moveq #-$41,d0 * Divide by zero: event 1,4
  546  00193C 6006            bra.s signald0
  547  00193E 70DA         chkfail moveq #-$26,d0 * Array bound fault: event 6
  547+                     ,2
  548  001940 6002            bra.s signald0
  549  001942 70EF         overflow moveq #-$11,d0 * Integer overflow: event 1
  549+                     ,1
  550                      *  bra.s signald0
  551                      *unassvar moveq #-$18,d0 * Unassigned variable: eve
  551+                     nt 8,1
  552  001944 21EF0002340C signald0 move.l 2(sp),eventpc
  553  00194A 2F7C00001960    move.l #signalx,2(sp)
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  20

  554  001952 4E73            rte
  555                      *
  556                      *  Trap 2 - Acquire processor type to D0
  557                      *
  558  001954 203835B8     getcpu move.l processor,d0
  559  001958 4E73            rte
  560                      *
  561                      * Signal event
  562                      * If d0<0 then d0 is -(subevent<<4+event) and extra
  562+                      info is absent
  563                      * Otherwise d0 is subevent<<4+event and extra info 
  563+                     is present
  564                      *
  565  00195A 4280         stop clr.l d0
  566  00195C 21DF340C     signal move.l (sp)+,eventpc
  567  001960 48F8FFFF3510 signalx movem.l d0-d7/a0-a7,evc
  568  001966 4A80            tst.l d0
  569  001968 6A0A            bpl.s signaly             * extra present ->
  570  00196A 42783410        clr.w eventmess
  571  00196E 42B83408        clr.l eventinfo
  572  001972 4480            neg.l d0
  573  001974 21C03400     signaly move.l d0,event
  574  001978 E888            lsr.l #4,d0
  575  00197A 21C03404        move.l d0,subevent
  576  00197E 700F            moveq #15,d0
  577  001980 C1B83400        and.l d0,event
  578                      *
  579                      * Invoke event handler
  580                      *
  581  001984 4CF8F8003550 signalz movem.l ehc,a3-a7
  582  00198A 2E8B            move.l a3,(sp)
  583  00198C 4E75            rts
  584                      *
  585                      * Define event handler
  586                      *
  587  00198E 2657         defineeh move.l (sp),a3
  588  001990 48F8F8003550    movem.l a3-a7,ehc
  589  001996 4E75            rts
  590                      *
  591                      * Trap 0: Set SR=D0 (or breakpoint)
  592                      *
  593  001998 3E80         setsr move.w d0,(sp)          * Trap 0: Set SR = D0
  594  00199A 4E73            rte
  595                      *
  596                      * Trap 15: Line break
  597                      *
  598  00199C 48E78080     linetrap movem.l d0/a0,-(sp)
  599  0019A0 207835AE        move.l watchpoint,a0  * Guard-duty
  600  0019A4 2010            move.l (a0),d0
  601  0019A6 B0B835B2        cmp.l watchpoint+4,d0
  602  0019AA 663A            bne.s changed         * Watched loc has changed 
  602+                     ->
  603  0019AC 206F000A        move.l 10(sp),a0    * PC
  604  0019B0 3018            move.w (a0)+,d0     * new line number
  605  0019B2 0880000E      bclr #14,d0
  606  0019B6 31C01000        move.w d0,linenum   * updated
  607  0019BA 2F48000A        move.l a0,10(sp)    * update PC
  608  0019BE 303835B6        move.w targetline,d0
  609  0019C2 6B0C            bmi.s lt9           * single-line mode ->
  610  0019C4 B0781000        cmp.w linenum,d0
  611  0019C8 6706            beq.s lt9           * target line found ->
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  21

  612  0019CA 4CDF0101     lt8 movem.l (sp)+,d0/a0
  613  0019CE 4E73            rte
  614  0019D0 4CDF0101     lt9 movem.l (sp)+,d0/a0
  615  0019D4 6038            bra.s tracexc
  616  0019D6 48E78080     guardduty movem.l d0/a0,-(sp)
  617  0019DA 207835AE        move.l watchpoint,a0
  618  0019DE 2010            move.l (a0),d0
  619  0019E0 B0B835B2        cmp.l watchpoint+4,d0
  620  0019E4 67E4            beq lt8
  621  0019E6 21C035B2     changed move.l d0,watchpoint+4
  622  0019EA 4CDF0101        movem.l (sp)+,d0/a0
  623  0019EE 487A15A6        pea protmess
  624  0019F2 6024            bra.s except
  625                      *
  626                      *  Trap 0 - Breakpoint or SetSR
  627                      *
  628  0019F4 4AB835A8     break  tst.l breakpoint       * Breakpoint?
  629  0019F8 679E            beq setsr                  * No ->
  630  0019FA 55AF0002        subq.l #2,2(sp)            * replace the instruc
  630+                     tion
  631  0019FE 2F08            move.l a0,-(sp)
  632  001A00 207835A8        move.l breakpoint,a0
  633  001A04 30B835AC        move.w breakpoint+4,(a0)
  634  001A08 42B835A8        clr.l breakpoint
  635  001A0C 205F            move.l (sp)+,a0
  636  001A0E 4AB835AE     tracexc tst.l watchpoint
  637  001A12 66C2            bne.s guardduty
  638  001A14 48780000     ftracexc pea nullstring
  639  001A18 48F87FFF3564 except movem.l d0-d7/a0-a6,rsave * Save registers
  640  001A1E 31FCFFFF3656    move.w #-1,vquota
  641  001A24 7000            moveq #0,d0
  642  001A26 610004A6        bsr cursor
  643  001A2A 205F            move.l (sp)+,a0            * Print message
  644  001A2C 6100061E        bsr vptext
  645  001A30 41EF0006     exc0 lea 6(sp),a0             * Save "stack pointer
  645+                     "
  646  001A34 08170005        btst.b #5,(sp)
  647  001A38 6602            bne.s exc1
  648  001A3A 4E68            move.l usp,a0
  649  001A3C 21C835A0     exc1 move.l a0,spsave
  650  001A40 007C0500        or #$500,sr                * Allow non-interrupt
  650+                     able KB input
  651  001A44 31FCFFFF3656    move.w #-1,vquota          * ^Q (for now)
  652  001A4A 610005C4        bsr newline                * Display saved regis
  652+                     ters
  653  001A4E 61000596        bsr space
  654  001A52 7607            moveq #7,d3                * register numbers
  655  001A54 41FA1599        lea sp10,a0
  656  001A58 610005F2     dis0 bsr vptext
  657  001A5C 7037            moveq #'7',d0
  658  001A5E 9003            sub.b d3,d0
  659  001A60 61000586        bsr vpsym
  660  001A64 41FA158B        lea sp8,a0
  661  001A68 51CBFFEE        dbra d3,dis0
  662  001A6C 41FA158C        lea dmess,a0
  663  001A70 610005DA        bsr vptext
  664  001A74 7607            moveq #7,d3                * Data registers
  665  001A76 47F83564        lea rsave,a3
  666  001A7A 6100056A     dis1 bsr space
  667  001A7E 201B            move.l (a3)+,d0
  668  001A80 610005D4        bsr hexlong
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  22

  669  001A84 51CBFFF4        dbra d3,dis1
  670  001A88 41FA1575        lea amess,a0
  671  001A8C 610005BE        bsr vptext
  672  001A90 7607            moveq #7,d3                * Address registers
  673  001A92 61000552     dis2 bsr space
  674  001A96 201B            move.l (a3)+,d0
  675  001A98 610005BC        bsr hexlong
  676  001A9C 51CBFFF4        dbra d3,dis2
  677  001AA0 6100056E        bsr newline
  678  001AA4 61000414        bsr clearline
  679  001AA8 41FA155A        lea srmess,a0              * Status Register,
  680  001AAC 6100059E        bsr vptext
  681  001AB0 3017            move (sp),d0
  682  001AB2 610005AC        bsr hexword
  683  001AB6 30381000        move.w linenum,d0          * Line number,
  684  001ABA 6724            beq.s dis25
  685  001ABC 2F3835CA        move.l curout,-(sp)
  686  001AC0 41F8360E        lea out0,a0
  687  001AC4 21C835CA        move.l a0,curout
  688  001AC8 41FA153F        lea linemess,a0
  689  001ACC 6100057E        bsr vptext
  690  001AD0 4280            clr.l d0
  691  001AD2 30381000        move.w linenum,d0
  692  001AD6 4281            clr.l d1
  693  001AD8 6100FA06        bsr write
  694  001ADC 21DF35CA        move.l (sp)+,curout
  695  001AE0 41FA152E     dis25 lea pcmess,a0           * and Program Counter
  696  001AE4 61000566        bsr vptext
  697  001AE8 202F0002        move.l 2(sp),d0
  698  001AEC 61000568        bsr hexlong
  699  001AF0 08170007        btst.b #7,(sp)             * If we are single-st
  699+                     epping,
  700  001AF4 670C            beq.s dis3
  701  001AF6 610004EE        bsr space                  * show previous PC al
  701+                     so
  702  001AFA 203835A4        move.l lastpc,d0
  703  001AFE 61000556        bsr hexlong
  704                      *
  705                      *********************************
  706                      * Trace mode command processing *
  707                      *********************************
  708                      *
  709  001B02 610003AE     dis3 bsr line5
  710  001B06 41FA1483        lea whatmess,a0
  711  001B0A 61000540        bsr vptext
  712  001B0E 6100011C     exccom bsr kbrsym
  713  001B12 B03C0019     exc2 cmp.b #'Y'-64,d0         * ^Y - Kill
  714  001B16 670000C2        beq kill
  715  001B1A B03C0020        cmp.b #32,d0
  716  001B1E 65EE            blo exccom
  717  001B20 803C0020        or.b #32,d0
  718  001B24 B03C0078        cmp.b #'x',d0              * X - Spy
  719  001B28 670001A4        beq spy
  720  001B2C B03C0073        cmp.b #'s',d0              * S - Single Step
  721  001B30 67000092        beq step
  722  001B34 B03C0062        cmp.b #'b',d0              * B - run to PC Break
  722+                     point
  723  001B38 6768            beq.s setbreak
  724  001B3A B03C006C        cmp.b #'l',d0              * L - run to line bre
  724+                     akpoint
  725  001B3E 672C            beq.s linebreak
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  23

  726  001B40 B03C006E        cmp.b #'n',d0              * N - execute Next st
  726+                     atement
  727  001B44 6722            beq.s nextline
  728  001B46 B03C0070        cmp.b #'p',d0              * P - protect locatio
  728+                     n
  729  001B4A 673A            beq.s setwatch
  730  001B4C B03C0063        cmp.b #'c',d0              * C - continue
  731  001B50 6726            beq.s continue
  732  001B52 B03C0072        cmp.b #'r',d0              * R - Reset everythin
  732+                     g
  733  001B56 670000AA        beq restart
  734  001B5A 61000356        bsr line5
  735  001B5E 41FA12F8        lea helpmess,a0
  736  001B62 610004E8        bsr vptext
  737  001B66 60A6            bra exccom
  738  001B68 70FF         nextline moveq #-1,d0
  739  001B6A 6006            bra.s lb1
  740  001B6C 61000126     linebreak bsr kbrdec
  741  001B70 6990            bvs dis3
  742  001B72 31C035B6     lb1 move.w d0,targetline
  743  001B76 6004            bra.s co1
  744  001B78 427835B6     continue clr.w targetline
  745  001B7C 08970007     co1 bclr.b #7,(sp)
  746  001B80 61000096        bsr unbreak
  747  001B84 6042            bra.s excret
  748  001B86 610000C0     setwatch bsr kbrhex
  749  001B8A 6900FF76        bvs dis3
  750  001B8E 08800000        bclr.l #0,d0
  751  001B92 2040            move.l d0,a0
  752  001B94 21C835AE        move.l a0,watchpoint
  753  001B98 21D035B2        move.l (a0),watchpoint+4
  754  001B9C 08D70007        bset.b #7,(sp)
  755  001BA0 6026            bra.s excret
  756  001BA2 08970007     setbreak bclr.b #7,(sp)
  757  001BA6 61000070        bsr unbreak
  758  001BAA 6100009C        bsr kbrhex
  759  001BAE 6900FF52        bvs dis3
  760  001BB2 21C035A8        move.l d0,breakpoint
  761  001BB6 6710            beq.s excret
  762  001BB8 2040            move.l d0,a0
  763  001BBA 31D035AC        move.w (a0),breakpoint+4
  764  001BBE 30BC4E40        move.w #$4e40,(a0)
  765  001BC2 6004            bra.s excret
  766  001BC4 08D70007     step bset.b #7,(sp)
  767  001BC8 610002FC     excret bsr screenbot
  768  001BCC 4CF87FFF3564    movem.l rsave,d0-d7/a0-a6
  769  001BD2 21EF000235A4    move.l 2(sp),lastpc
  770  001BD8 4E73            rte
  771  001BDA 4A38372C     kill tst.b cylock
  772  001BDE 670A            beq.s killnow     * not locked out ->
  773  001BE0 08F80007372C    bset.b #7,cylock
  774  001BE6 6000FF26        bra exccom
  775  001BEA 610002DA     killnow bsr screenbot
  776  001BEE 61000028        bsr unbreak
  777  001BF2 4CF87FFF3564    movem.l rsave,d0-d7/a0-a6
  778  001BF8 08970007        bclr.b #7,(sp)
  779  001BFC 7010            moveq #$10,d0    * %signal 0,1,0
  780  001BFE 6000FD44        bra signald0
  781  001C02 303CFFFF     restart move.w #-1,d0
  782  001C06 51C8FFFE        dbra d0,*
  783  001C0A 46FC2700        move.w #$2700,sr
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  24

  784  001C0E 2E780000        move.l 0,sp
  785  001C12 20780004        move.l 4,a0
  786  001C16 4ED0            jmp (a0)
  787  001C18 203835A8     unbreak move.l breakpoint,d0
  788  001C1C 6602            bne.s unb1
  789  001C1E 4E75            rts
  790  001C20 2040         unb1 move.l d0,a0
  791  001C22 30B835AC        move.w breakpoint+4,(a0)
  792  001C26 42B835A8        clr.l breakpoint
  793  001C2A 4E75            rts
  794                      *
  795                      * Trace mode command processing routines
  796                      *
  797         00001C2C     kbrsym equ *
  798  001C2C 083900000040    btst.b #vrrfbit,vdus         * UNbuffered
  799  001C34 67F6            beq kbrsym
  800  001C36 4280            clr.l d0
  801  001C38 1039004000C3    move.b vdud,d0
  802                      *   and.b #127,d0
  803                      *   cmp.b #cr,d0
  804                      *   bne.s kbrs1
  805                      *   moveq #nl,d0
  806  001C3E B03C0020     kbrs1 cmp.b #32,d0            * if not control
  807  001C42 640003A4        bhs vpsym                  * then echo
  808  001C46 4E75            rts
  809                      *
  810                      *
  811  001C48 61E2         kbrhex bsr kbrsym
  812  001C4A 4281            clr.l d1
  813  001C4C B03C007F     kbrhex2 cmp.b #del,d0
  814  001C50 673A            beq.s kbrhex5
  815  001C52 B03C0008        cmp.b #bs,d0
  816  001C56 6734            beq.s kbrhex5
  817  001C58 B03C0018        cmp.b #'X'-64,d0
  818  001C5C 672E            beq.s kbrhex5
  819  001C5E B03C0030        cmp.b #'0',d0
  820  001C62 6D24            blt.s kbrhex4
  821  001C64 B03C0039        cmp.b #'9',d0
  822  001C68 6F12            ble.s kbrhex3
  823  001C6A C03C005F        and.b #95,d0
  824  001C6E B03C0041        cmp.b #'A',d0
  825  001C72 6D14            blt.s kbrhex4
  826  001C74 B03C0046        cmp.b #'F',d0
  827  001C78 6E0E            bgt.s kbrhex4
  828  001C7A 5F40            subq #7,d0
  829  001C7C C07C000F     kbrhex3 and #15,d0
  830  001C80 E989            lsl.l #4,d1
  831  001C82 D280            add.l d0,d1
  832  001C84 61A6            bsr kbrsym
  833  001C86 60C4            bra kbrhex2
  834  001C88 2001         kbrhex4 move.l d1,d0
  835  001C8A 4E75            rts
  836  001C8C 2001         kbrhex5 move.l d1,d0
  837  001C8E 003C0002        or.b #2,ccr
  838  001C92 4E75            rts
  839  001C94 6196         kbrdec bsr kbrsym
  840  001C96 4281            clr.l d1
  841  001C98 B03C007F     kbrdec1 cmp.b #del,d0
  842  001C9C 67EE            beq.s kbrhex5
  843  001C9E B03C0008        cmp.b #bs,d0
  844  001CA2 67E8            beq.s kbrhex5
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  25

  845  001CA4 B03C0018        cmp.b #'X'-64,d0
  846  001CA8 67E2            beq.s kbrhex5
  847  001CAA B03C0030        cmp.b #'0',d0
  848  001CAE 6DD8            blt.s kbrhex4
  849  001CB0 B03C007F        cmp.b #127,d0
  850  001CB4 67DE            beq.s kbrdec
  851  001CB6 B03C0039        cmp.b #'9',d0
  852  001CBA 6ECC            bgt.s kbrhex4
  853  001CBC C0BC0000000F    and.l #15,d0
  854  001CC2 C2FC000A        mulu #10,d1
  855  001CC6 D280            add.l d0,d1
  856  001CC8 6100FF62        bsr kbrsym
  857  001CCC 60CA            bra kbrdec1
  858                      *
  859                      *******
  860                      * Spy *
  861                      *******
  862                      *
  863  001CCE 610001E2     spy bsr line5
  864  001CD2 41FA117F        lea spyprom,a0
  865  001CD6 61000374        bsr vptext
  866  001CDA 6100FF6C        bsr kbrhex                 * Read address
  867  001CDE 69EE            bvs spy
  868  001CE0 2640            move.l d0,a3
  869  001CE2 6100FF64     spy1 bsr kbrhex               * and count
  870  001CE6 69E6            bvs spy
  871  001CE8 5340            subq #1,d0
  872  001CEA C07C00FF        and #$ff,d0                * in range 1-256
  873  001CEE 3800            move d0,d4
  874  001CF0 3600            move d0,d3
  875  001CF2 610001BE     spy2 bsr line5
  876  001CF6 320B         spy3 move a3,d1
  877  001CF8 C27C000F        and #15,d1
  878  001CFC 6610            bne.s spy4
  879  001CFE 61000310        bsr newline
  880  001D02 200B            move.l a3,d0
  881  001D04 61000350        bsr hexlong
  882  001D08 703A            moveq #':',d0
  883  001D0A 610002DC        bsr vpsym
  884  001D0E 610002D6     spy4 bsr space
  885  001D12 101B            move.b (a3)+,d0
  886  001D14 61000354        bsr hexbyte                * show one byte at a 
  886+                     time
  887  001D18 51CBFFDC        dbra d3,spy3
  888  001D1C 6100FF0E        bsr kbrsym
  889  001D20 B03C003D        cmp.b #'=',d0              * '=' overwrites last
  889+                      shown byte
  890  001D24 670C            beq.s spy5
  891  001D26 B03C000A        cmp.b #nl,d0               * NL displays next ba
  891+                     tch
  892  001D2A 6600FDE6        bne exc2                   * anything else gets 
  892+                     you out
  893  001D2E 3604            move d4,d3                 * anything else reads
  893+                      new address
  894  001D30 60C0            bra spy2
  895  001D32 6100FF14     spy5 bsr kbrhex
  896  001D36 1740FFFF        move.b d0,-1(a3)           * overwrite, then sho
  896+                     w next location
  897  001D3A 4243            clr d3
  898  001D3C 4244            clr d4
  899  001D3E 60B2            bra spy2
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  26

  900                      *
  901                      *
  902                      * Timer interrupt
  903                      * Counter 3 is set to interrupt every decisecond.
  904                      * when this happens, add 100 to millisec counter.
  905                      *
  906  001D40 48E7C080     timeint movem.l d0-d1/a0,-(sp)
  907  001D44 41F900400100    lea ptm,a0
  908  001D4A 7204            moveq #4,d1              * Counter-3-interruptin
  908+                     g bit
  909  001D4C C2280002        and.b 2(a0),d1           * Read status register
  910  001D50 6702            beq.s ti1                * not counter 3 ->
  911  001D52 7264            moveq #100,d1
  912  001D54 01480004     ti1 movep.l 4(a0),d0        * Read counters 1, 2,
  913  001D58 0108000C        movep.w 12(a0),d0        * and 3 to placate PTM
  914  001D5C D3B83728        add.l d1,millisecs       * update time if releva
  914+                     nt
  915  001D60 4CDF0103        movem.l (sp)+,d0-d1/a0
  916  001D64 4E73            rte
  917                      *
  918                      * Ether receiver interrupt
  919                      *
  920  001D66 48E7C080     ethint movem.l d0-d1/a0,-(sp)
  921  001D6A 10390007FFFC    move.b eths,d0             * Read status of ethe
  921+                     r interface
  922                      *  moveq #1,d1
  923                      *  and d0,d1                  * Is it responsible?
  924                      *  beq dsqtry                 * No ->
  925  001D70 6A0000FE        bpl dsqtry                 * Not ether interrupt
  925+                     ing ->
  926  001D74 C07C0002        and.w #2,d0                * Data or Control?
  927  001D78 676E            beq.s ethdat               * Data ->
  928  001D7A 12390007FFFF    move.b ethc,d1             * Read the control ch
  928+                     aracter
  929  001D80 103C00F0        move.b #$f0,d0
  930  001D84 C001            and.b d1,d0
  931  001D86 67000076        beq ethnps
  932         00001D8A     ethi0 equ *
  933  001D8A 083900000007    btst.b #0,eths
  934  001D92 67F6            beq.s ethi0
  935  001D94 721F            moveq #31,d1
  936  001D96 C2390007FFFD    and.b ethd,d1
  937  001D9C 4840            swap d0
  938  001D9E 3001            move.w d1,d0
  939  001DA0 E648            lsr.w #3,d0
  940  001DA2 C07C0003        and.w #3,d0
  941  001DA6 0A400003        eor.w #3,d0
  942  001DAA 41F83734        lea dtxin,a0             * Point at flag array e
  942+                     lement
  943  001DAE D0C0            add.w d0,a0
  944  001DB0 4840            swap d0
  945  001DB2 B03C0030        cmp.b #dtx,d0
  946  001DB6 67000094        beq ethdtx               * DTX ->
  947  001DBA 5848            addq #4,a0
  948  001DBC B03C0010        cmp.b #rdy,d0
  949  001DC0 67000082        beq ethset               * RDY ->
  950  001DC4 5848            addq #4,a0
  951  001DC6 B03C0020        cmp.b #stx,d0
  952  001DCA 67000070        beq ethstx               * STX ->
  953  001DCE 5848            addq #4,a0
  954  001DD0 B03C00C0        cmp.b #ack,d0
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  27

  955  001DD4 6700006E        beq ethset               * ACK ->
  956  001DD8 B03C0050        cmp.b #nak,d0
  957  001DDC 6644            bne.s ethunk               * Unknown ->
  958  001DDE 52B83730        addq.l #1,etherr           * NAK: count as error
  958+                     ,
  959  001DE2 03E80004        bset.b d1,4(a0)            * and set both NAK an
  959+                     d ACK bits
  960  001DE6 605C            bra.s ethset
  961         00001DE8     ethdat equ *
  962  001DE8 10390007FFFD    move.b ethd,d0
  963  001DEE 6100027A        bsr hexbyte
  964  001DF2 700A            moveq #nl,d0
  965  001DF4 610001F2        bsr vpsym
  966  001DF8 52B83730        addq.l #1,etherr
  967  001DFC 6048            bra.s ethiret
  968  001DFE B23C000B     ethnps cmp.b #etx,d1          * Non port-specific c
  968+                     har
  969  001E02 6742            beq.s ethiret              * ETX: ignore
  970  001E04 B23C0007        cmp.b #7,d1
  971  001E08 6618            bne.s ethunk
  972  001E0A 083900000007 ethi1 btst.b #0,eths
  973  001E12 67F6            beq ethi1
  974  001E14 7200            moveq #0,d1
  975  001E16 12390007FFFD    move.b ethd,d1
  976  001E1C 31C1372E        move.w d1,station
  977  001E20 6024            bra.s ethiret
  978  001E22 8240         ethunk or d0,d1
  979  001E24 700A            moveq #nl,d0
  980  001E26 610001C0        bsr vpsym
  981  001E2A 705E            moveq #'^',d0
  982  001E2C 610001BA        bsr vpsym
  983  001E30 3001            move d1,d0
  984  001E32 61000236        bsr hexbyte
  985  001E36 52B83730        addq.l #1,etherr
  986  001E3A 600A            bra.s ethiret
  987  001E3C 13FC00000007 ethstx move.b #eiof,eths
  988  001E44 03D0         ethset bset.b d1,(a0)
  989  001E46 4CDF0103     ethiret movem.l (sp)+,d0-d1/a0
  990  001E4A 4E73            rte
  991  001E4C 03D0         ethdtx bset.b d1,(a0)
  992  001E4E 2001            move.l d1,d0              * remember port number
  993  001E50 22383750        move.l dtxast,d1          * AST enabled?
  994  001E54 67F0            beq ethiret               * No ->
  995  001E56 2041            move.l d1,a0
  996  001E58 22383758        move.l dtxmask,d1         * Interested in this p
  996+                     ort?
  997  001E5C 0101            btst d0,d1
  998  001E5E 67E6            beq ethiret               * No ->
  999  001E60 48E73F7E        movem.l d2-d7/a1-a6,-(sp)
 1000  001E64 2C783754        move.l dtxa6,a6
 1001  001E68 4E90            jsr (a0)                  * Call the AST
 1002  001E6A 4CDF7EFC        movem.l (sp)+,d2-d7/a1-a6 * and return from int
 1003  001E6E 60D6            bra ethiret
 1004                      *
 1005                      * Disk interrupt handler
 1006                      *
 1007  001E70 2F383748     dsqtry move.l dsqint,-(sp)
 1008  001E74 4E75            rts
 1009  001E76 21DF3748     dsqwait move.l (sp)+,dsqint
 1010  001E7A 60CA            bra ethiret
 1011  001E7C 60C8         dsqspu bra ethiret
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  28

 1012                      *
 1013                      * Truncated VDU Keyboard Interrupt
 1014                      *
 1015  001E7E 48E7C080     kbint movem.l d0-d1/a0,-(sp)
 1016  001E82 30783658        move.w kbin,a0
 1017  001E86 1239004000C1    move.b vdus,d1
 1018  001E8C 08010000        btst #vrrfbit,d1           * Data there?
 1019  001E90 671A            beq.s kbiret               * No ->
 1020  001E92 10F9004000C3    move.b vdud,(a0)+             * Attempt to inser
 1020+                     t into buffer
 1021  001E98 B0FC36C4        cmp.w #kbend,a0
 1022  001E9C 6604            bne.s kbnowrap
 1023  001E9E 41F83660        lea kbbeg,a0
 1024  001EA2 B0F8365A     kbnowrap cmp.w kbex,a0
 1025  001EA6 6704            beq.s kbiret               * Buffer full ->
 1026  001EA8 31C83658        move.w a0,kbin
 1027  001EAC 4CDF0103     kbiret movem.l (sp)+,d0-d1/a0 * False alarm
 1028  001EB0 4E73            rte
 1029                      
 1030  001EB2 303C0500     line5 move.w #$500,d0         * move to col 0 row 5
 1031  001EB6 61000016        bsr cursor
 1032  001EBA 4EBA0082     clearline jsr escape
 1033  001EBE 103C004B        move.b #'K',d0
 1034  001EC2 4EF83FA2        jmp screenput
 1035  001EC6 10383FA0     screenbot move.b screenrows,d0
 1036  001ECA 5300            subq.b #1,d0
 1037  001ECC E148            lsl.w #8,d0
 1038  001ECE 3F00         cursor move.w d0,-(sp)
 1039  001ED0 4EBA006C        jsr escape
 1040  001ED4 4A38375C        tst.b ansi
 1041  001ED8 661E            bne.s ansicursor
 1042  001EDA 7059            moveq #'Y',d0
 1043  001EDC 4EB83FA2        jsr screenput
 1044  001EE0 3017            move.w (sp),d0
 1045  001EE2 4200            clr.b d0
 1046  001EE4 E158            rol.w #8,d0
 1047  001EE6 D03C0020        add.b #' ',d0
 1048  001EEA 4EB83FA2        jsr screenput
 1049  001EEE 301F            move.w (sp)+,d0
 1050  001EF0 D03C0020        add.b #' ',d0
 1051  001EF4 4EF83FA2        jmp screenput
 1052  001EF8 3017         ansicursor move.w (sp),d0
 1053  001EFA 4200            clr.b d0
 1054  001EFC E158            rol.w #8,d0
 1055  001EFE 5240            addq.w #1,d0
 1056  001F00 4EBA001A        jsr screendec
 1057  001F04 703B            moveq #';',d0
 1058  001F06 4EB83FA2        jsr screenput
 1059  001F0A 301F            move.w (sp)+,d0
 1060  001F0C C07C00FF        and.w #255,d0
 1061  001F10 5240            addq.w #1,d0
 1062  001F12 4EBA0008        jsr screendec
 1063  001F16 7048            moveq #'H',d0
 1064  001F18 4EF83FA2        jmp screenput
 1065  001F1C C0BC0000FFFF screendec and.l #$ffff,d0
 1066  001F22 80FC000A       divu #10,d0
 1067  001F26 670C           beq.s screendec1   * quot zero ->
 1068  001F28 4840           swap d0
 1069  001F2A 3F00           move.w d0,-(sp)    * preserve rem
 1070  001F2C 4840           swap d0
 1071  001F2E 61EC           bsr screendec      * recursive call
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  29

 1072  001F30 301F           move.w (sp)+,d0
 1073  001F32 6002           bra.s screendec2
 1074  001F34 4840         screendec1 swap d0
 1075  001F36 D07C0030     screendec2 add.w #'0',d0
 1076  001F3A 4EF83FA2       jmp screenput
 1077  001F3E 701B         escape moveq #esc,d0
 1078  001F40 4A38375C       tst.b ansi
 1079  001F44 6604           bne.s ansiesc
 1080  001F46 4EF83FA2       jmp screenput
 1081  001F4A 4EB83FA2     ansiesc jsr screenput
 1082  001F4E 705B           moveq #'[',d0
 1083  001F50 4EF83FA2       jmp screenput
 1084  001F54 3F00         screenquota move.w d0,-(sp)
 1085  001F56 303C0000        move.w #0,d0
 1086  001F5A 10383FA0        move.b screenrows,d0
 1087  001F5E 31C03656        move.w d0,vquota
 1088  001F62 301F            move.w (sp)+,d0
 1089  001F64 4E75            rts
 1090                      *
 1091                      * %integerfn cputime {real time in milliseconds sin
 1091+                     ce system startup}
 1092                      *
 1093  001F66 3F01         cputime move.w d1,-(sp)
 1094  001F68 40C1            move.w sr,d1
 1095  001F6A 303C2600        move.w #$2600,d0        * Interrupts off
 1096  001F6E 4E40            trap #0
 1097  001F70 7063            moveq.l #99,d0
 1098  001F72 90390040010C    sub.b ptm+12,d0        * ms since last timer int
 1099  001F78 6610            bne.s cputimex
 1100  001F7A 083900020040    btst.b #2,ptm+2
 1101  001F82 6706            beq.s cputimex
 1102  001F84 D0BC00000064    add.l #100,d0
 1103  001F8A D0B83728     cputimex add.l millisecs,d0
 1104  001F8E 46C1            move.w d1,sr
 1105  001F90 321F            move.w (sp)+,d1
 1106  001F92 4E75            rts
 1107                      *
 1108                      *  Return with result in D0
 1109                      *  From routines which preserved d0-d2/a0-a2
 1110                      *
 1111  001F94 2E80         result move.l d0,(sp)
 1112                      *
 1113                      * + Return without result
 1114                      * (Also null output routine)
 1115                      *
 1116  001F96 4CDF0707     return movem.l (sp)+,d0-d2/a0-a2
 1117  001F9A 4E75            rts
 1118                      *
 1119                      * %Routine printstring(A0=string)
 1120                      *
 1121  001F9C 48E7E0E0     printstring movem.l d0-d2/a0-a2,-(sp)
 1122  001FA0 4241            clr.w d1
 1123  001FA2 1218            move.b (a0)+,d1           * Size of string
 1124  001FA4 67F0            beq return                * Null =>
 1125  001FA6 5341            subq.w #1,d1              * Adjusted for DBRA
 1126  001FA8 1018         pst1 move.b (a0)+,d0
 1127  001FAA 61000008        bsr printsymbol
 1128  001FAE 51C9FFF8        dbra d1,pst1
 1129  001FB2 60E2            bra return
 1130                      *
 1131                      * %Routine printsymbol(D0=sym)
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  30

 1132                      *
 1133  001FB4 48E7E0E0     printsymbol movem.l d0-d2/a0-a2,-(sp)
 1134  001FB8 207835CA         move.l curout,a0          * Point at CB
 1135  001FBC 22680008         move.l 8(a0),a1           * Get output routine 
 1135+                     address
 1136  001FC0 4ED1             jmp (a1)                  * and go there
 1137                      *
 1138                      * File output routine
 1139                      *
 1140  001FC2 207835CA     fo0 move.l curout,a0
 1141  001FC6 2250         fileout move.l (a0),a1
 1142  001FC8 B3E80004        cmp.l 4(a0),a1
 1143  001FCC 6706            beq.s fo1                  * Buffer full ->
 1144  001FCE 12C0            move.b d0,(a1)+
 1145  001FD0 2089            move.l a1,(a0)
 1146  001FD2 60C2            bra return
 1147  001FD4 610009B0     fo1 bsr flush                 * Flush output buffer
 1147+                     ,
 1148  001FD8 2017            move.l (sp),d0             * restore sym and try
 1148+                      again.
 1149  001FDA 60E6            bra fo0
 1150                      *
 1151                      * VDU output routines (VPSYM non-destructive)
 1152                      *
 1153  001FDC 4A383654     vduout tst.b vdiscard         * Test for ^O
 1154  001FE0 66B4            bne return
 1155  001FE2 6104            bsr.s vpsym
 1156  001FE4 60B0            bra return
 1157                      *
 1158  001FE6 7020         space moveq #' ',d0
 1159  001FE8 B03C000A     vpsym cmp.b #nl,d0
 1160  001FEC 6722            beq.s newline              * NL ->
 1161  001FEE 11FC00013655    move.b #1,vblank
 1162  001FF4 4A783656     vps0 tst.w vquota             * Wait while xoffed
 1163  001FF8 67FA            beq.s vps0
 1164  001FFA 4EF83FA2        jmp screenput
 1165  001FFE 083900010040 aciascreenput btst.b #vtbebit,vdus   * Wait for TXB
 1165+        00C1         E
 1166  002006 67F6            beq aciascreenput
 1167  002008 13C0004000C3    move.b d0,vdud
 1168  00200E 4E75            rts
 1169  002010 4A783656     newline tst.w vquota          * Test for page mode
 1170  002014 67FA            beq newline                * (Xoffed)
 1171  002016 6B24            bmi.s nl2                  * Free mode ->
 1172  002018 53783656        sub.w #1,vquota
 1173  00201C 6E1E            bgt.s nl2                  * still OK ->
 1174  00201E 31FC00013656    move.w #1,vquota
 1175  002024 10383655        move.b vblank,d0
 1176  002028 6702            beq.s nl0
 1177  00202A 70E8            moveq #bs-' ',d0
 1178  00202C D07C0020     nl0 add #' ',d0
 1179  002030 61C2            bsr vps0
 1180  002032 42783656        clr.w vquota
 1181  002036 4A783656     nl1 tst.w vquota              * Wait
 1182  00203A 67FA            beq nl1
 1183  00203C 700D         nl2 moveq #cr,d0              * Newline -> CR,LF
 1184  00203E 61B4            bsr vps0
 1185  002040 700A            moveq #lf,d0
 1186  002042 61B0            bsr vps0
 1187  002044 700A            moveq #nl,d0
 1188  002046 42383655        clr.b vblank
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  31

 1189  00204A 4E75            rts
 1190                      *
 1191                      * VDU print text (uses 0-termination)
 1192                      *
 1193  00204C 1018         vptext move.b (a0)+,d0
 1194  00204E 6700095C        beq ret
 1195  002052 6194            bsr vpsym
 1196  002054 60F6            bra vptext
 1197                      *
 1198                      * VDU print hex routines for kernel
 1199                      *
 1200  002056 3F00         hexlong move d0,-(sp)
 1201  002058 4840            swap d0
 1202  00205A 61000004        bsr hexword
 1203  00205E 301F            move (sp)+,d0
 1204  002060 3400         hexword move d0,d2
 1205  002062 E048            lsr #8,d0
 1206  002064 61000004        bsr hexbyte
 1207  002068 3002            move d2,d0
 1208  00206A 3200         hexbyte move d0,d1
 1209  00206C E848            lsr #4,d0
 1210  00206E 61000004        bsr hexnibble
 1211  002072 3001            move d1,d0
 1212  002074 C03C000F     hexnibble and.b #15,d0
 1213  002078 B03C0009        cmp.b #9,d0
 1214  00207C 6F02            ble.s hn1
 1215  00207E 5E00            add.b #7,d0
 1216  002080 D03C0030     hn1 add.b #'0',d0
 1217  002084 6000FF62        bra vpsym
 1218                      *
 1219                      * %Routine prompt(A0=string)
 1220                      *
 1221  002088 21C8364E     prompt move.l a0,kbprom
 1222  00208C 4E75            rts
 1223                      *
 1224                      * %Integerfn readsymbol / nextsymbol
 1225                      *
 1226  00208E 48E7E0E0     nextsymbol movem.l d0-d2/a0-a2,-(sp)
 1227  002092 4281            clr.l d1
 1228  002094 6006            bra.s rs0
 1229  002096 48E7E0E0     readsymbol movem.l d0-d2/a0-a2,-(sp)
 1230  00209A 7201            moveq #1,d1
 1231  00209C 207835C6     rs0 move.l curin,a0           * Descriptor
 1232  0020A0 22680008        move.l 8(a0),a1
 1233  0020A4 4ED1            jmp (a1)
 1234                      *
 1235                      * Null input routine
 1236                      *
 1237  0020A6 DEFC0018     nullin add #24,sp
 1238  0020AA 70E7            moveq #-$19,d0
 1239  0020AC 6000F8AE        bra signal
 1240                      *
 1241                      * File input routine
 1242                      *
 1243  0020B0 2250         filein move.l (a0),a1
 1244  0020B2 B3E80004        cmp.l 4(a0),a1
 1245  0020B6 670C            beq.s fi1                  * Buffer empty ->
 1246  0020B8 4280            clr.l d0
 1247  0020BA 1011            move.b (a1),d0
 1248  0020BC D3C1            add.l d1,a1
 1249  0020BE 2089            move.l a1,(a0)
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  32

 1250  0020C0 6000FED2        bra result
 1251  0020C4 2401         fi1 move.l d1,d2              * Rsym:1 / Nsym:0
 1252  0020C6 2028000C        move.l 12(a0),d0           * Transaction number 
 1252+                     etc
 1253  0020CA D07C5830        add #readsq,d0             * for FcommR
 1254  0020CE 22680004        move.l 4(a0),a1
 1255  0020D2 2209            move.l a1,d1
 1256  0020D4 C2BC000001FF    and.l #511,d1
 1257  0020DA 66CA            bne nullin                 * Previous was last b
 1257+                     lock ->
 1258  0020DC 223C00000200    move.l #512,d1             * Maxsize for FcommR
 1259  0020E2 93C1            sub.l d1,a1                * end-512=startad for
 1259+                      FcommR
 1260  0020E4 41F80000        lea nullstring,a0
 1261  0020E8 61000828        bsr fcommr
 1262  0020EC 4A40            tst d0
 1263  0020EE 6FB6            ble nullin                 * End of file
 1264  0020F0 207835C6        move.l curin,a0
 1265  0020F4 22680004        move.l 4(a0),a1            * End of buffer -512=
 1266  0020F8 93FC00000200    sub.l #512,a1              * Start of buffer
 1267  0020FE D3C2            add.l d2,a1
 1268  002100 2089            move.l a1,(a0)             * +1 or +0
 1269  002102 93C2            sub.l d2,a1
 1270  002104 D089            add.l a1,d0                * Actual end of data 
 1270+                     in buffer
 1271  002106 21400004        move.l d0,4(a0)
 1272  00210A 4280            clr.l d0
 1273  00210C 1011            move.b (a1),d0             * Extract 1st char
 1274  00210E 6000FE84        bra result
 1275  002112 207835C6     fi2 move.l curin,a0           * Zero-size block or 
 1275+                     Fs Err:
 1276  002116 20280004        move.l 4(a0),d0            * note EOF status
 1277  00211A D0BC000001FF    add.l #511,d0
 1278  002120 C0BCFFFFFE00    and.l #$fffffe00,d0
 1279  002126 21400004        move.l d0,4(a0)
 1280  00212A 6000FF7A        bra nullin
 1281                      *
 1282                      * VDU input routine
 1283                      *
 1284  00212E 3078365E     vduin move.w lend,a0
 1285  002132 B0FC36C4        cmp.w #lbeg,a0
 1286  002136 6734            beq.s refresh         * Line buffer empty ->
 1287  002138 3078365C        move.w lpos,a0
 1288  00213C B0F8365E        cmp.w lend,a0
 1289  002140 672A            beq.s refresh         * Line buffer exhausted ->
 1290  002142 4280            clr.l d0
 1291  002144 1010            move.b (a0),d0        * Extract character
 1292  002146 D0C1            add.w d1,a0           * Bump unless nextsymbol
 1293  002148 31C8365C        move.w a0,lpos
 1294  00214C B03C0004        cmp.b #eot,d0         * End of file?
 1295  002150 6600FE42        bne result            * No ->
 1296  002154 31FC36C4365C    move.w #lbeg,lpos     * Reset pointers
 1297  00215A 31FC36C4365E    move.w #lbeg,lend
 1298  002160 DFFC00000018    add.l #24,sp
 1299  002166 70E7            moveq #-$19,d0        * And %signal 9,1
 1300  002168 6000F7F2        bra signal
 1301                      *
 1302                      * Line buffering and echo handler, which maintains
 1303                      * a single linear line buffer, and takes its input
 1304                      * from the circular keyboard buffer.
 1305                      *
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  33

 1306  00216C 41F836C4     refresh lea lbeg,a0      * Reset line buffer pointe
 1306+                     rs
 1307  002170 31C8365C        move.w a0,lpos
 1308  002174 31C8365E        move.w a0,lend
 1309  002178 42383654        clr.b vdiscard        * Re-enable output
 1310  00217C 4A783656        tst.w vquota          * If in page-mode, reset q
 1310+                     uota
 1311  002180 6B04            bmi.s ref0
 1312  002182 6100FDD0        bsr screenquota
 1313  002186 2078364E     ref0 move.l kbprom,a0    * Emit prompt string
 1314  00218A 4280            clr.l d0
 1315  00218C 4282            clr.l d2
 1316  00218E 1418            move.b (a0)+,d2
 1317  002190 5342            subq #1,d2
 1318  002192 6B0A            bmi.s ref2
 1319  002194 1018         ref1 move.b (a0)+,d0
 1320  002196 6100FE50        bsr vpsym
 1321  00219A 51CAFFF8        dbra d2,ref1
 1322  00219E 6100016A     ref2 bsr getsymbol
 1323  0021A2 083800023653    btst.b #2,kbmode+1
 1324  0021A8 6600FDEA        bne result            * No buffering =>
 1325  0021AC B03C007F        cmp.b #del,d0
 1326  0021B0 670000C8        beq kbdel
 1327  0021B4 B07C0020        cmp.w #32,d0
 1328  0021B8 6D18            blt.s kbcontrol
 1329  0021BA 61000020        bsr insert
 1330  0021BE 61000038        bsr echo
 1331  0021C2 60DA            bra ref2
 1332  0021C4 31C8365E     kbfree move.w a0,lend
 1333  0021C8 31FC36C4365C    move.w #lbeg,lpos
 1334  0021CE 6000FF5E        bra vduin
 1335  0021D2 D080         kbcontrol add.l d0,d0
 1336  0021D4 2040            move.l d0,a0
 1337  0021D6 307B8058        move.w kbtable(a0),a0
 1338  0021DA 4ED0            jmp (a0)
 1339  0021DC 3078365C     insert move.w lpos,a0
 1340  0021E0 B0FC3720        cmp.w #llim,a0
 1341  0021E4 6708            beq.s full
 1342  0021E6 10C0            move.b d0,(a0)+
 1343  0021E8 31C8365C        move.w a0,lpos
 1344  0021EC 4E75            rts
 1345  0021EE 7007         full moveq #bel,d0
 1346  0021F0 6100FDF6        bsr vpsym
 1347  0021F4 588F            addq.l #4,sp
 1348  0021F6 60A6            bra ref2
 1349  0021F8 083800003653 echo btst.b #0,kbmode+1
 1350  0021FE 6700FDE8        beq vpsym
 1351  002202 4E75            rts
 1352  002204 3078365C     delete move.w lpos,a0
 1353  002208 B0FC36C4        cmp.w #lbeg,a0
 1354  00220C 6720            beq.s del1
 1355  00220E 5348            subq #1,a0
 1356  002210 31C8365C        move.w a0,lpos
 1357  002214 083800003653    btst #0,kbmode+1
 1358  00221A 6612            bne.s del1
 1359  00221C 7008            moveq #bs,d0
 1360  00221E 6100FDC8        bsr vpsym
 1361  002222 7020            moveq #' ',d0
 1362  002224 6100FDC2        bsr vpsym
 1363  002228 7008            moveq #bs,d0
 1364  00222A 6000FDBC        bra vpsym
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  34

 1365  00222E 4E75         del1 rts
 1366         00002230     kbtable equ *
 1367  002230 2270           dc.w kbignore
 1368  002232 2270           dc.w kbignore
 1369  002234 2270           dc.w kbignore
 1370  002236 22CA           dc.w kbctrlc
 1371  002238 22A4           dc.w kbeof
 1372  00223A 2270           dc.w kbignore
 1373  00223C 2270           dc.w kbignore
 1374  00223E 2270           dc.w kbignore
 1375  002240 2280           dc.w kbcan
 1376  002242 2290           dc.w kbtab
 1377  002244 22B2           dc.w kblf
 1378  002246 2270           dc.w kbignore
 1379  002248 2270           dc.w kbignore
 1380  00224A 22AE           dc.w kbcr
 1381  00224C 2270           dc.w kbignore
 1382  00224E 2270           dc.w kbignore
 1383  002250 2270           dc.w kbignore
 1384  002252 2270           dc.w kbignore
 1385  002254 2270           dc.w kbignore
 1386  002256 2270           dc.w kbignore
 1387  002258 2270           dc.w kbignore
 1388  00225A 2280           dc.w kbcan
 1389  00225C 2270           dc.w kbignore
 1390  00225E 2270           dc.w kbignore
 1391  002260 2280           dc.w kbcan
 1392  002262 2270           dc.w kbignore
 1393  002264 22A4           dc.w kbeof
 1394  002266 22D6           dc.w kbesc
 1395  002268 2270           dc.w kbignore
 1396  00226A 2270           dc.w kbignore
 1397  00226C 2270           dc.w kbignore
 1398  00226E 2270           dc.w kbignore
 1399  002270 7007         kbignore moveq #bel,d0
 1400  002272 6100FD74       bsr vpsym
 1401  002276 6000FF26       bra ref2
 1402  00227A 6188         kbdel bsr delete
 1403  00227C 6000FF20       bra ref2
 1404  002280 6182         kbcan bsr delete
 1405  002282 3078365C       move.w lpos,a0
 1406  002286 B0FC36C4       cmp.w #lbeg,a0
 1407  00228A 66F4           bne kbcan
 1408  00228C 6000FF10       bra ref2
 1409  002290 7020         kbtab moveq #' ',d0
 1410  002292 7402           moveq #2,d2
 1411  002294 6100FF46     kbtabs bsr insert
 1412  002298 6100FF5E       bsr echo
 1413  00229C 51CAFFF6       dbra d2,kbtabs
 1414  0022A0 6000FEFC       bra ref2
 1415  0022A4 7004         kbeof moveq #eot,d0
 1416  0022A6 6100FF34       bsr insert
 1417  0022AA 6000FF18       bra kbfree
 1418  0022AE 700D         kbcr moveq #cr,d0
 1419  0022B0 6002           bra.s kbnl
 1420  0022B2 700A         kblf moveq #lf,d0
 1421  0022B4 6100FF26     kbnl bsr insert
 1422  0022B8 083800013653   btst #1,kbmode+1
 1423  0022BE 6600FF04       bne kbfree
 1424  0022C2 6100FD24       bsr vpsym
 1425  0022C6 6000FEFC       bra kbfree
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  35

 1426  0022CA 4280         kbctrlc clr.l d0
 1427  0022CC DFFC00000018   add.l #24,sp
 1428  0022D2 6000F688       bra signal
 1429  0022D6 701B         kbesc moveq #esc,d0
 1430  0022D8 6100FF02       bsr insert
 1431  0022DC 6100002C       bsr getsymbol
 1432  0022E0 6100FEFA       bsr insert
 1433  0022E4 B03C005B       cmp.b #'[',d0
 1434  0022E8 6710           beq.s kbansi
 1435  0022EA B03C004F       cmp.b #'O',d0
 1436  0022EE 670E           beq.s kbmore
 1437  0022F0 B03C003F       cmp.b #'?',d0
 1438  0022F4 6708           beq.s kbmore
 1439  0022F6 6000FECC       bra kbfree
 1440  0022FA 11C0375C     kbansi move.b d0,ansi
 1441  0022FE 6100000A     kbmore bsr getsymbol
 1442  002302 6100FED8       bsr insert
 1443  002306 6000FEBC       bra kbfree
 1444  00230A 6100002A     getsymbol bsr ts0
 1445  00230E 4A80           tst.l d0
 1446  002310 6BF8           bmi.s getsymbol
 1447  002312 4E75           rts
 1448                      *
 1449                      * %Integerfn testsymbol
 1450                      * Result -1 of no input available,
 1451                      * else return (and read) first character from buffe
 1451+                     r
 1452                      *
 1453  002314 2F08         testsymbol move.l a0,-(sp)
 1454  002316 4280            clr.l d0
 1455  002318 3078365E        move.w lend,a0
 1456  00231C B0FC36C4        cmp.w #lbeg,a0
 1457  002320 6718            beq.s ts1           * Line buff empty ->
 1458  002322 3078365C        move.w lpos,a0
 1459  002326 B0F8365E        cmp.w lend,a0
 1460  00232A 670E            beq.s ts1           * Line buff exhausted ->
 1461  00232C 1018            move.b (a0)+,d0
 1462  00232E 31C8365C        move.w a0,lpos      * Extract from line buff
 1463  002332 205F            move.l (sp)+,a0
 1464  002334 4E75            rts
 1465  002336 2F08         ts0 move.l a0,-(sp)    * Alternative entry point
 1466  002338 4280            clr.l d0            * for line buffer handler
 1467  00233A 3078365A     ts1 move.w kbex,a0
 1468  00233E B0F83658        cmp.w kbin,a0
 1469  002342 6714            beq.s ts3           * kb buff empty ->
 1470  002344 1018            move.b (a0)+,d0     * Extract from kb buff
 1471  002346 B0FC36C4        cmp.w #kbend,a0
 1472  00234A 6604            bne.s ts2
 1473  00234C 41F83660        lea kbbeg,a0        * wrap-round
 1474  002350 31C8365A     ts2 move.w a0,kbex
 1475  002354 205F            move.l (sp)+,a0
 1476  002356 4E75            rts
 1477  002358 205F         ts3 move.l (sp)+,a0
 1478  00235A 70FF            moveq #-1,d0
 1479  00235C 4E75            rts
 1480                      *
 1481                      * %Routine set terminal mode(%integer bits)
 1482                      * Bit 0: suppress echo
 1483                      * Bit 1: suppress terminator echo
 1484                      * Bit 2: suppress line buffering
 1485                      * Bit 3: cancel page-mode
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  36

 1486                      *
 1487  00235E 31C03652     settermmode move.w d0,kbmode
 1488  002362 42383654        clr.b vdiscard
 1489  002366 31FCFFFF3656    move.w #-1,vquota
 1490  00236C 08000003        btst #3,d0
 1491  002370 6700FBE2        beq screenquota
 1492  002374 4E75            rts
 1493                      *
 1494                      * %Routine selectinput(D0=stream)
 1495                      *
 1496  002376 4A80         selectinput tst.l d0
 1497  002378 6B08            bmi.s si1
 1498  00237A B0BC00000003    cmp.l #3,d0
 1499  002380 6F0E            ble.s si2
 1500  002382 21C03408     si1 move.l d0,eventinfo
 1501  002386 42783410        clr.w eventmess
 1502  00238A 7076            moveq #$76,d0
 1503  00238C 6000F5CE        bra signal
 1504  002390 2F00         si2 move.l d0,-(sp)
 1505  002392 E988            lsl.l #4,d0
 1506  002394 D0BC000035CE    add.l #in0,d0
 1507  00239A 21C035C6        move.l d0,curin
 1508  00239E 201F            move.l (sp)+,d0
 1509  0023A0 4E75            rts
 1510                      *
 1511                      * %Routine selectoutput(D0=stream)
 1512                      *
 1513  0023A2 4A80         selectoutput tst.l d0
 1514  0023A4 6B20            bmi.s so1
 1515  0023A6 B0BC00000003    cmp.l #3,d0
 1516  0023AC 6ED4            bgt.s si1
 1517  0023AE 2F00            move.l d0,-(sp)
 1518  0023B0 E988            lsl.l #4,d0
 1519  0023B2 D0BC0000360E    add.l #out0,d0
 1520  0023B8 21C035CA        move.l d0,curout
 1521  0023BC 201F            move.l (sp)+,d0
 1522  0023BE 31FC600010C0    move.w #$6000,$10c0
 1523  0023C4 4E75            rts
 1524  0023C6 31FC4E7510C0 so1 move.w #$4e75,$10c0
 1525  0023CC 4E75            rts
 1526                      *
 1527                      * %Routine resetinput
 1528                      *
 1529  0023CE 48E7E0E0     resetinput movem.l d0-d2/a0-a2,-(sp)
 1530  0023D2 207835C6        move.l curin,a0
 1531  0023D6 20280004        move.l 4(a0),d0            * Tidy buffer pointer
 1531+                     s
 1532  0023DA D0BC000001FF    add.l #511,d0
 1533  0023E0 C0BCFFFFFE00    and.l #$fffffe00,d0
 1534  0023E6 21400004        move.l d0,4(a0)
 1535  0023EA 2080            move.l d0,(a0)
 1536  0023EC 0CA80000212E    cmp.l #vduin,8(a0)         * If keyboard, purge 
 1536+        0008         buffer
 1537  0023F4 6612            bne.s re1
 1538  0023F6 31FC36C4365C    move #lbeg,lpos
 1539  0023FC 31FC36C4365E    move #lbeg,lend
 1540  002402 31F83658365A    move kbin,kbex
 1541  002408 2028000C     re1 move.l 12(a0),d0          * Transaction number
 1542  00240C 6700FB88        beq return                 * 0 for VDU or NULL
 1543  002410 D07C5530        add #reset,d0
 1544  002414 41F80000        lea nullstring,a0
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  37

 1545  002418 6100040A        bsr fcomm
 1546  00241C 6000FB78        bra return
 1547                      *
 1548                      * %Routine resetoutput
 1549                      *
 1550  002420 48E7E0E0     resetoutput movem.l d0-d2/a0-a2,-(sp)
 1551  002424 207835CA        move.l curout,a0
 1552  002428 20280004        move.l 4(a0),d0
 1553  00242C 90BC00000200    sub.l #512,d0
 1554  002432 2080            move.l d0,(a0)
 1555  002434 60D2            bra re1
 1556                      *
 1557                      * %Routine closeinput
 1558                      *
 1559  002436 48E7E0E0     closeinput movem.l d0-d2/a0-a2,-(sp)
 1560  00243A 207835C6        move.l curin,a0
 1561  00243E 20280004        move.l 4(a0),d0          * Tidy pointers
 1562  002442 D0BC000001FF    add.l #511,d0
 1563  002448 C0BCFFFFFE00    and.l #$fffffe00,d0
 1564  00244E 21400004        move.l d0,4(a0)
 1565  002452 2080            move.l d0,(a0)
 1566  002454 217C000020A6    move.l #nullin,8(a0)
 1567  00245C 2028000C        move.l 12(a0),d0
 1568  002460 6714            beq.s cli1
 1569  002462 42A8000C        clr.l 12(a0)
 1570  002466 D07C4B30        add #close,d0
 1571  00246A 41F80000        lea nullstring,a0
 1572  00246E 610003B4        bsr fcomm
 1573  002472 207835C6        move.l curin,a0
 1574         00002476     cli1 equ *
 1575  002476 20A80004     dinull move.l 4(a0),(a0)
 1576  00247A 217C000020A6    move.l #nullin,8(a0)
 1577  002482 42A8000C        clr.l 12(a0)
 1578  002486 4280            clr.l d0
 1579  002488 6000FB0C        bra return
 1580                      *
 1581                      * %Routine closeoutput
 1582                      *
 1583  00248C 48E7E0E0     closeoutput movem.l d0-d2/a0-a2,-(sp)
 1584  002490 207835CA        move.l curout,a0
 1585  002494 610004F0        bsr flush
 1586  002498 207835CA        move.l curout,a0
 1587  00249C 217C00001F96    move.l #return,8(a0)
 1588  0024A4 2028000C        move.l 12(a0),d0
 1589  0024A8 6700FAEC        beq return
 1590  0024AC 42A8000C        clr.l 12(a0)
 1591  0024B0 D07C4B30        add #close,d0
 1592  0024B4 41F80000        lea nullstring,a0
 1593  0024B8 6100036A        bsr fcomm
 1594  0024BC 6000FAD8        bra return
 1595                      *
 1596                      * %Routine openinput(D0=stream,A0=filename)
 1597                      * NB side-effect of selecting specified stream
 1598                      * and of closing it first
 1599                      *
 1600  0024C0 6100FEB4     openinput bsr selectinput
 1601  0024C4 48E7E0E0        movem.l d0-d2/a0-a2,-(sp)
 1602  0024C8 207835C6        move.l curin,a0            * descriptor to A0
 1603  0024CC 20280004        move.l 4(a0),d0            * Tidy up pointers
 1604  0024D0 D0BC000001FF    add.l #511,d0
 1605  0024D6 C0BCFFFFFE00    and.l #$fffffe00,d0
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  38

 1606  0024DC 21400004        move.l d0,4(a0)
 1607  0024E0 2080            move.l d0,(a0)
 1608  0024E2 2028000C        move.l 12(a0),d0           * Transaction number
 1609  0024E6 6710            beq.s di1                  * Zero: file not open
 1609+                      ->
 1610  0024E8 D07C4830        add #uclose,d0
 1611  0024EC 41F80000        lea nullstring,a0
 1612  0024F0 61000332        bsr fcomm
 1613  0024F4 207835C6        move.l curin,a0
 1614  0024F8 42A8000C     di1 clr.l 12(a0)
 1615  0024FC 226F000C        move.l 12(sp),a1           * filename string
 1616  002500 1011            move.b (a1),d0             * Length of filename
 1617  002502 6700FF72        beq dinull                 * "" means ":N"
 1618  002506 0C29003A0001    cmp.b #':',1(a1)           * Device name?
 1619  00250C 662E            bne.s difile               * Does not start with
 1619+                      ':' ->
 1620  00250E B03C0001     di3 cmp.b #1,d0               * Just ":"?
 1621  002512 671C            beq.s divdu                * Yes ->
 1622  002514 B03C0002        cmp.b #2,d0       **
 1623  002518 6622            bne.s difile      **       * Not two chars: file
 1623+                      ->
 1624  00251A 10290002        move.b 2(a1),d0            * second char of name
 1625  00251E 803C0020        or.b #32,d0                * To lower case
 1626  002522 B03C006E        cmp.b #'n',d0
 1627  002526 6700FF4E        beq dinull                 * ":N" is null
 1628  00252A B03C0074        cmp.b #'t',d0
 1629  00252E 660C            bne.s difile               * ":T" is terminal
 1630  002530 217C0000212E divdu move.l #vduin,8(a0)
 1631  002538 6000FA5C        bra return
 1632  00253C 217C000020A6 difile move.l #nullin,8(a0)
 1633  002544 303835C4        move userno,d0
 1634  002548 D07C5330        add #openr,d0
 1635  00254C 2049            move.l a1,a0
 1636  00254E 610002D4        bsr fcomm
 1637  002552 207835C6        move.l curin,a0
 1638  002556 217C000020B0    move.l #filein,8(a0)
 1639  00255E 2140000C        move.l d0,12(a0)
 1640  002562 6000FA32        bra return
 1641                      *
 1642                      * %Routine openoutput(D0=stream,A0=filename)
 1643                      * NB side-effect of selecting specified stream
 1644                      *
 1645  002566 6100FE3A     openoutput bsr selectoutput
 1646  00256A 48E7E0E0        movem.l d0-d2/a0-a2,-(sp)
 1647  00256E 207835CA        move.l curout,a0
 1648  002572 61000412        bsr flush
 1649  002576 207835CA        move.l curout,a0
 1650  00257A 2028000C     do1 move.l 12(a0),d0          * Transaction number
 1651  00257E 6710            beq.s do2                  * Not file ->
 1652  002580 D07C4830        add #uclose,d0
 1653  002584 41F80000        lea nullstring,a0
 1654  002588 6100029A        bsr fcomm
 1655  00258C 207835CA        move.l curout,a0
 1656  002590 42A8000C     do2 clr.l 12(a0)
 1657  002594 217C00001F96    move.l #return,8(a0)
 1658  00259C 226F000C        move.l 12(sp),a1           * filename string
 1659  0025A0 1011            move.b (a1),d0
 1660  0025A2 6700F9F2        beq return
 1661  0025A6 0C29003A0001    cmp.b #':',1(a1)
 1662  0025AC 662E            bne.s dofile
 1663  0025AE B03C0001     do3 cmp.b #1,d0
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  39

 1664  0025B2 6700001E        beq dovdu
 1665  0025B6 B03C0002        cmp.b #2,d0     **
 1666  0025BA 6620            bne.s dofile    **
 1667  0025BC 10290002        move.b 2(a1),d0
 1668  0025C0 803C0020        or.b #32,d0
 1669  0025C4 B03C006E        cmp.b #'n',d0
 1670  0025C8 6700F9CC        beq return
 1671  0025CC B03C0074        cmp.b #'t',d0
 1672  0025D0 660A            bne.s dofile
 1673  0025D2 217837200008 dovdu move.l vep,8(a0)
 1674  0025D8 6000F9BC        bra return
 1675  0025DC 303835C4     dofile move userno,d0
 1676  0025E0 D07C5430        add #openw,d0
 1677  0025E4 48C0            ext.l d0
 1678  0025E6 2049            move.l a1,a0
 1679  0025E8 6100023A        bsr fcomm
 1680  0025EC 207835CA        move.l curout,a0
 1681  0025F0 217C00001FC6    move.l #fileout,8(a0)
 1682  0025F8 2140000C        move.l d0,12(a0)
 1683  0025FC 6000F998        bra return
 1684                      *
 1685                      * Auxiliary routines for Ether
 1686                      *
 1687                      * Prepare for 32-bit BTST
 1688                      * and lock out ^Y
 1689                      *
 1690  002600 2440         portbit move.l d0,a2
 1691  002602 4640            not.w d0
 1692  002604 E648            lsr.w #3,d0
 1693  002606 C07C0003        and.w #3,d0
 1694  00260A C18A            exg d0,a2
 1695  00260C 5238372C        addq.b #1,cylock
 1696  002610 C0BC0000001F    and.l #31,d0
 1697  002616 4E75            rts
 1698                      *
 1699                      * Unlock ^Y and fire any pending one
 1700                      *
 1701  002618 4A38372C     unlock tst.b cylock
 1702  00261C 6714            beq.s unl1         * ?error: not locked
 1703  00261E 5338372C        subq.b #1,cylock
 1704  002622 6A0E            bpl.s unl1         * nothing pending ->
 1705  002624 0A380080372C    eor.b #$80,cylock
 1706  00262A 6708            beq.s unl2         * fire off ->
 1707  00262C 0A380080372C    eor.b #$80,cylock  * keep pending bit
 1708  002632 4E75         unl1 rts
 1709  002634 70F0         unl2 moveq #-$10,d0
 1710  002636 6000F324        bra signal
 1711                      *
 1712                      * Macros to replace hang-mode calls
 1713                      *
 1714                      ethtwait macro
 1715                      \@ btst.b #3,eths
 1716                         beq \@
 1717                         endm
 1718                      scontrol macro
 1719                      \* move.b \1,ethc
 1720                         ethtwait
 1721                         endm
 1722                      sdata macro
 1723                      \* move.b \1,ethd
 1724                         ethtwait
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  40

 1725                         endm
 1726                      *
 1727                      * %Routine etheropen(D0=port,D1=station<<8+port)
 1728                      *
 1729  00263A 48E7E0E0     etheropen movem.l d0-d2/a0-a2,-(sp)
 1730  00263E 61C0            bsr portbit
 1731  002640 6700F954        beq return
 1732  002644 01AA3738        bclr d0,rdyin(a2)
 1733  002648 01AA3734        bclr d0,dtxin(a2)
 1734  00264C 01EA3740        bset d0,ackin(a2)
 1735  002650 01AA3744        bclr d0,nakin(a2)
 1736  002654 01AA373C        bclr d0,stxin(a2)
 1737                         scontrol #opn
 1738                         sdata d0
 1739  00267A 01AA3738     eo2 bclr d0,rdyin(a2)
 1740  00267E 67FA            beq eo2
 1741                         scontrol #stx
 1742                         sdata d0
 1743  0026A2 E059            ror #8,d1
 1744                         sdata d1
 1745  0026B4 E159            rol #8,d1
 1746                         sdata d1
 1747                         scontrol #etx
 1748  0026D8 6100FF3E        bsr unlock
 1749  0026DC 6000F8B8        bra return
 1750                      *
 1751                      * %Routine etherclose(D0=port)
 1752                      *
 1753  0026E0 48E7E0E0     etherclose movem.l d0-d2/a0-a2,-(sp)
 1754  0026E4 6100FF1A        bsr portbit
 1755  0026E8 01AA3738        bclr d0,rdyin(a2)
 1756                         scontrol #cls
 1757                         sdata d0
 1758  00270E 6100FF08        bsr unlock
 1759  002712 6000F882        bra return
 1760                      *
 1761                      * %Routine etherwrite(D0=port,D1=len,A0=buff)
 1762                      *
 1763  002716 48E7E0E0     etherwrite movem.l d0-d2/a0-a2,-(sp)
 1764  00271A 6100FEE4        bsr portbit
 1765  00271E 01AA3738        bclr d0,rdyin(a2)          * Permission already 
 1765+                     obtained?
 1766  002722 662E            bne.s ew15                 * Yes ->
 1767  002724 01AA3740     ew0 bclr d0,ackin(a2)         * Wait for previous A
 1767+                     CK
 1768  002728 67FA            beq ew0
 1769                         scontrol #dtx
 1770                         sdata d0
 1771  00274C 01AA3738     ew1 bclr d0,rdyin(a2)         * Wait for RDY
 1772  002750 67FA            beq ew1
 1773                      ew15 scontrol #stx
 1774                         sdata d0
 1775  002774 5341         ew2 subq #1,d1                * Send data
 1776  002776 6B000014        bmi ew3
 1777  00277A 13D80007FFFD    move.b (a0)+,ethd
 1778  002780 083900030007 ew25 btst.b #3,eths
 1779  002788 66EA            bne ew2
 1780  00278A 60F4            bra ew25
 1781                      ew3 scontrol #etx
 1782  00279E 6100FE78        bsr unlock
 1783  0027A2 6000F7F2        bra return
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  41

 1784                      *
 1785                      * %Integerfn etherread(D0=port,D1=maxlen,A0=buff)
 1786                      *
 1787  0027A6 48E7E0E0     etherread movem.l d0-d2/a0-a2,-(sp)
 1788  0027AA 6100FE54        bsr portbit
 1789  0027AE 01AA3734     er1 bclr d0,dtxin(a2)         * Wait for DTX
 1790  0027B2 67FA            beq er1
 1791                         scontrol #rdy
 1792                         sdata d0
 1793  0027D6 01AA373C     er2 bclr d0,stxin(a2)         * Wait for STX
 1794  0027DA 67FA            beq er2
 1795  0027DC 70FF            moveq #-1,d0               * Count (adjusted for
 1795+                      ETX)
 1796  0027DE 45F90007FFFC    lea eths,a2
 1797  0027E4 5341         er3 subq #1,d1                * Adjust quota
 1798  0027E6 6B18            bmi.s er4                  * Limit exceeded ->
 1799  0027E8 1412         er35 move.b (a2),d2           * Wait for any charac
 1799+                     ter
 1800  0027EA 08020000        btst #0,d2
 1801  0027EE 67F8            beq er35
 1802  0027F0 1412            move.b (a2),d2             * Make sure ?????
 1803  0027F2 5280            addq.l #1,d0               * Count it
 1804  0027F4 08020001        btst #1,d2
 1805  0027F8 661E            bne.s er5                  * Control ->
 1806  0027FA 10EA0001        move.b ethd-eths(a2),(a0)+ * Read data character
 1807  0027FE 60E4            bra er3
 1808  002800 1412         er4 move.b (a2),d2
 1809  002802 08020000        btst #0,d2
 1810  002806 67F8            beq er4
 1811  002808 1412            move.b (a2),d2             * Make sure ?????
 1812  00280A 5280            addq.l #1,d0
 1813  00280C 08020001        btst #1,d2
 1814  002810 6606            bne.s er5
 1815  002812 142A0001        move.b ethd-eths(a2),d2    * Discard excess data
 1816  002816 60E8            bra er4
 1817  002818 14BC0006     er5 move.b #eion,(a2)         * Re-enable interrupt
 1817+                     s
 1818  00281C 6100FDFA        bsr unlock
 1819  002820 6000F772        bra result
 1820                      *
 1821                      * %Integerfn fcomm(D0=CN,A0=string)
 1822                      *
 1823  002824 48E7E0E0     fcomm movem.l d0-d2/a0-a2,-(sp)
 1824  002828 4A00            tst.b d0                   * intercept logoff us
 1824+                     er 0
 1825  00282A 6620            bne.s fc0                  * n#0 ->
 1826  00282C C07C5F00        and #logmask,d0
 1827  002830 B07C4D00        cmp #logoff,d0
 1828  002834 6616            bne.s fc0
 1829  002836 103835C5        move.b userno+1,d0
 1830  00283A D03C0030        add.b #'0',d0
 1831  00283E 427835C4        clr.w userno
 1832  002842 4A00            tst.b d0
 1833  002844 6606            bne.s fc0                  * We were logged on -
 1833+                     >
 1834  002846 4280            clr.l d0
 1835  002848 6000F74A        bra result                 * Ignore spurious log
 1835+                     off request
 1836  00284C 61000170     fc0 bsr prolog                * start packet, send 
 1836+                     CN and string
 1837                         sdata #nl
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  42

 1838  002862 610001FE        bsr response               * Send ETX, Get respo
 1838+                     nse line
 1839  002866 13FC00060007    move.b #eion,eths          * re-enable ER interr
 1839+        FFFC         upts
 1840  00286E 2217            move.l (sp),d1             * Was it LOGON?
 1841  002870 C27C5F00        and #logmask,d1
 1842  002874 B27C4C00        cmp #logon,d1
 1843  002878 670A            beq.s fc4                  * Yes ->
 1844  00287A 6100FD9C        bsr unlock
 1845  00287E 6000F714        bra result
 1846  002882 4240         fc3 clr d0
 1847  002884 4A40         fc4 tst d0
 1848  002886 6BFA            bmi fc3
 1849  002888 31C035C4        move d0,userno
 1850  00288C 6100FD8A        bsr unlock
 1851  002890 6000F702        bra result
 1852                      *
 1853                      * %Integerfn fcommw(D0=CN,A0=params,D1=size,A1=buff
 1853+                     er)
 1854                      *
 1855  002894 48E7E0E0     fcommw movem.l d0-d2/a0-a2,-(sp)
 1856  002898 61000124        bsr prolog                 * Send CN and params
 1857  00289C E859            ror #4,d1                  * High-order Hdnibble
 1858  00289E D27C0030        add #'0',d1                * Send high nibble
 1859                         sdata d1
 1860  0028B2 E959            rol #4,d1                  * restore low-order n
 1860+                     ibble
 1861  0028B4 C23C000F        and.b #15,d1
 1862  0028B8 D27C0030        add #'0',d1                * Send low nibble
 1863                         sdata d1
 1864                         sdata #nl
 1865                      * Send data portion
 1866                      * D2 = TXBE bit number in ETHS
 1867                      * D1 = size of (rest of) data portion
 1868                      * A2 = address of ETHD
 1869                      * A1 = address of (next byte in) data buffer
 1870                      * A0 = address of ETHS
 1871  0028DE 7403            moveq #3,d2
 1872  0028E0 45F90007FFFD    lea ethd,a2
 1873  0028E6 41F90007FFFC    lea eths,a0
 1874  0028EC 72FF            moveq #-1,d1
 1875  0028EE D2AF0004        add.l 4(sp),d1
 1876  0028F2 6B0A            bmi.s fcw2
 1877  0028F4 0510         fcw1 btst.b d2,(a0)    * 4 inst loop
 1878  0028F6 67FC            beq fcw1
 1879  0028F8 1499            move.b (a1)+,(a2)
 1880  0028FA 51C9FFF8        dbra d1,fcw1
 1881  0028FE 61000162     fcw2 bsr response
 1882  002902 13FC00060007    move.b #eion,eths
 1883  00290A 6100FD0C        bsr unlock
 1884  00290E 6000F684        bra result
 1885                      *
 1886                      * %Integerfn fcommr(D0=CN,D1=maxsize,
 1887                      *                   A0=parm,A1=buffer)
 1888                      *
 1889  002912 48E7E0E0     fcommr movem.l d0-d2/a0-a2,-(sp)
 1890  002916 610000A6        bsr prolog
 1891                         sdata #nl
 1892  00292C 61000134        bsr response
 1893  002930 222F0004        move.l 4(sp),d1            * restore limit
 1894  002934 2E80            move.l d0,(sp)             * save size (as resul
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  43

 1894+                     t)
 1895                      * Read data portion
 1896                      * D2 = CRF bit number in ETHS
 1897                      * D1 = DRF bit number in ETHS
 1898                      * D0 = number of bytes (left) to be read
 1899                      * A2 = address of ETHD
 1900                      * A1 = address of (next byte in) data buffer
 1901                      * A0 = address of ETHS
 1902  002936 C340            exg d1,d0
 1903  002938 9280            sub.l d0,d1              * actual-maximum size
 1904  00293A 6B02            bmi.s fcr1               * (won't fit: use max) 
 1904+                     ->
 1905  00293C 2017            move.l (sp),d0           * use actual size
 1906  00293E 7201         fcr1 moveq #1,d1
 1907  002940 7402            moveq #2,d2
 1908  002942 41F90007FFFC    lea eths,a0
 1909  002948 45F90007FFFD    lea ethd,a2
 1910  00294E 5380            subq.l #1,d0
 1911  002950 6A06            bpl.s fcr3
 1912  002952 600E            bra.s fcr4
 1913  002954 0310         fcr2 btst.b d1,(a0)         * Outer 6 inst loop
 1914  002956 6612            bne.s fcr5               * Got control ->
 1915  002958 0510         fcr3 btst.b d2,(a0)         * Inner 4 inst loop
 1916  00295A 67F8            beq fcr2
 1917  00295C 12D2            move.b (a2),(a1)+
 1918  00295E 51C8FFF8        dbra d0,fcr3
 1919                      * Data count exhausted or buffer full
 1920                      * Scan to ETX (or next control character)
 1921  002962 0510         fcr4 btst.b d2,(a0)
 1922  002964 661C            bne.s fcr7               * skip data char ->
 1923  002966 0310            btst.b d1,(a0)
 1924  002968 67F8            beq fcr4
 1925  00296A 1012         fcr5 move.b (a2),d0         * inspect control char
 1926  00296C B03C000B        cmp.b #etx,d0
 1927  002970 6604            bne.s fcr6
 1928  002972 10280003        move.b ethc-eths(a0),d0  * skip ETX to avoid int
 1928+                     errupt
 1929  002976 10BC0006     fcr6 move.b #eion,(a0)
 1930  00297A 6100FC9C        bsr unlock
 1931  00297E 6000F616        bra return
 1932  002982 1012         fcr7 move.b (a2),d0
 1933  002984 60DC            bra fcr4
 1934                      *
 1935                      * Flush output buffer (used by fileout)
 1936                      * placed here because of its stack frame size,
 1937                      * to fit in with the event mechanism
 1938                      * (reason has since disappeared)
 1939  002986 24280004     flush move.l 4(a0),d2         * buffer limit addres
 1939+                     s
 1940  00298A 94BC00000200    sub.l #512,d2              * buffer start addres
 1940+                     s
 1941  002990 2210            move.l (a0),d1             * current end of buff
 1941+                     er
 1942  002992 9282            sub.l d2,d1                * size of contents
 1943  002994 6716            beq.s ret                  * empty block ->
 1944  002996 2082            move.l d2,(a0)             * reset insert pointe
 1944+                     r
 1945  002998 2028000C        move.l 12(a0),d0           * Transaction number
 1946  00299C 670E            beq.s ret                  * None ->
 1947  00299E D07C5930        add #writesq,d0
 1948  0029A2 2242            move.l d2,a1
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  44

 1949  0029A4 41F80000        lea nullstring,a0
 1950  0029A8 6100FEEA        bsr fcommw
 1951  0029AC 4E75         ret rts
 1952                      *
 1953                      * Auxiliary filestore routines
 1954                      *
 1955                      * Routine Magic(/D2=fsport,A2=\fsport>>3&3)
 1956                      *
 1957  0029AE C142         magic exg d0,d2
 1958  0029B0 4280            clr.l d0
 1959  0029B2 1038372D        move.b fsport,d0
 1960  0029B6 6100FC48        bsr portbit
 1961  0029BA C142            exg d0,d2
 1962  0029BC 4E75            rts
 1963                      *
 1964                      * %routine prolog(D0=CN,A0=string)
 1965                      *
 1966  0029BE 61EE         prolog bsr magic
 1967  0029C0 05AA3740     pro0 bclr d2,ackin(a2)        * flush previous pack
 1967+                     et
 1968  0029C4 67FA            beq pro0
 1969  0029C6 05AA3744        bclr d2,nakin(a2)
 1970  0029CA 660000C2        bne hangup                 * Filestore dead =>
 1971                         scontrol #dtx
 1972                         sdata d2
 1973  0029F0 05AA3738     pro1 bclr d2,rdyin(a2)        * wait for RDY
 1974  0029F4 67FA            beq pro1
 1975                         scontrol #stx
 1976                         sdata d2
 1977  002A18 E058            ror #8,d0                  * send command letter
 1978                         sdata d0
 1979  002A2A E158            rol #8,d0
 1980  002A2C 4A00            tst.b d0
 1981  002A2E 6608            bne.s pro15                * userno/xno supplied
 1981+                      ->
 1982  002A30 D07835C4        add userno,d0
 1983  002A34 D03C0030        add.b #'0',d0
 1984                      pro15 sdata d0
 1985  002A48 1418            move.b (a0)+,d2            * string length
 1986  002A4A 5302         pro2 sub.b #1,d2
 1987  002A4C 6B00FF5E        bmi ret
 1988  002A50 13D80007FFFD    move.b (a0)+,ethd
 1989  002A56 083900030007 pro3 btst.b #3,eths
 1990  002A5E 66EA            bne pro2
 1991  002A60 60F4            bra pro3
 1992                      *
 1993                      *
 1994                      * %integerfn response
 1995                      *
 1996  002A62 6100FF4A     response bsr magic            * NB nests an extra l
 1996+                     ock
 1997  002A66 6100FBB0        bsr unlock                 * cancel nested extra
 1997+                      lock
 1998                         scontrol #etx
 1999  002A7C 05AA3734     res0 bclr d2,dtxin(a2)        * Wait for DTX or ACK
 1999+                     /NAK
 2000  002A80 6628            bne.s res2                 * Got DTX ->
 2001  002A82 052A3740        btst d2,ackin(a2)
 2002  002A86 67F4            beq res0                   * No ACK/NAK yet ->
 2003  002A88 05AA3744        bclr d2,nakin(a2)
 2004  002A8C 67EE            beq.s res0                 * Not NAK ->
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  45

 2005  002A8E 41FA051A     hangup lea fsdead,a0          * %signal 9,3,0,"File
 2005+                     store dead"
 2006  002A92 43F83410        lea eventmess,a1
 2007  002A96 4240            clr d0
 2008  002A98 1010            move.b (a0),d0
 2009  002A9A 12D8         hang1 move.b (a0)+,(a1)+
 2010  002A9C 51C8FFFC        dbra d0,hang1
 2011  002AA0 42B83408        clr.l eventinfo
 2012  002AA4 7033            moveq #$33,d0
 2013  002AA6 6000EEB4        bra signal
 2014                      res2 scontrol #rdy
 2015                         sdata d2
 2016  002ACC 05AA373C     res3 bclr d2,stxin(a2)        * wait for STX
 2017  002AD0 67FA            beq res3
 2018  002AD2 4280            clr.l d0                   * hdhex accumulator
 2019  002AD4 083900020007 res4 btst.b #2,eths
 2020  002ADC 67F6            beq res4
 2021  002ADE 12390007FFFD    move.b ethd,d1
 2022  002AE4 B23C000A        cmp.b #nl,d1
 2023  002AE8 67000088        beq res9
 2024  002AEC B23C002D        cmp.b #'-',d1
 2025  002AF0 6700000E        beq res5
 2026  002AF4 923C0030        sub.b #'0',d1
 2027  002AF8 6B62            bmi.s res8                 * Mod for OPENR/W ->x
 2027+                     no,blocks,unused
 2028  002AFA E988            lsl.l #4,d0
 2029  002AFC D001            add.b d1,d0
 2030  002AFE 60D4            bra res4
 2031                      * Filestore error: put error message into event mes
 2031+                     sage
 2032                      * and %signal 9,3,errornumber,errormessage
 2033  002B00 4281         res5 clr.l d1
 2034  002B02 083900020007 res55 btst.b #2,eths
 2035  002B0A 67F6            beq res55
 2036  002B0C 12390007FFFD    move.b ethd,d1         * error digit
 2037  002B12 923C0030        sub.b #'0',d1
 2038  002B16 21C13408        move.l d1,eventinfo
 2039  002B1A B23C0007        cmp.b #7,d1            * error 7 is invalid user
 2039+                     no,
 2040  002B1E 6604            bne.s res57
 2041  002B20 427835C4        clr.w userno           * so invalidate it
 2042  002B24 4281         res57 clr.l d1
 2043  002B26 41F83410        lea eventmess,a0
 2044  002B2A 1081         res6 move.b d1,(a0)
 2045  002B2C 083900020007 res65 btst.b #2,eths
 2046  002B34 67F6            beq res65
 2047  002B36 10390007FFFD    move.b ethd,d0
 2048  002B3C B03C000A        cmp.b #nl,d0
 2049  002B40 6708            beq.s res7
 2050  002B42 5241            addq #1,d1
 2051  002B44 11801000        move.b d0,0(a0,d1)
 2052  002B48 60E0            bra res6
 2053  002B4A 13FC00060007 res7 move.b #eion,eths
 2054  002B52 6100FAC4        bsr unlock
 2055  002B56 7033            moveq #$33,d0
 2056  002B58 6000EE02        bra signal
 2057  002B5C 083900020007 res8 btst.b #2,eths
 2058  002B64 67F6            beq res8
 2059  002B66 12390007FFFD    move.b ethd,d1
 2060  002B6C B23C000A        cmp.b #nl,d1
 2061  002B70 66EA            bne res8
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  46

 2062  002B72 4E75         res9 rts
 2063                      *
 2064                      *
 2065                      *************************
 2066                      * E n t r y   P o i n t *
 2067                      *************************
 2068                      *
 2069                      * Initialise system variables
 2070                      *
 2071  002B74 21FC000109A0 begin move.l #68000,processor
 2072  002B7C 41F83660        lea kbbeg,a0         * Keyboard buffer stuff
 2073  002B80 31C83658        move a0,kbin
 2074  002B84 31C8365A        move a0,kbex
 2075  002B88 4210            clr.b (a0)
 2076  002B8A 4238372C        clr.b cylock
 2077  002B8E 21FC00001FDC    move.l #vduout,vep
 2078  002B96 21FC00000000    move.l #nullstring,kbprom
 2079  002B9E 31FC36C4365C    move #lbeg,lpos
 2080  002BA4 31FC36C4365E    move #lbeg,lend
 2081  002BAA 11FC00183FA0    move.b #24,screenrows
 2082  002BB0 11FC00503FA1    move.b #80,screencols
 2083  002BB6 21FC00001FFE    move.l #aciascreenput,screenputa
 2084  002BBE 4280            clr.l d0
 2085  002BC0 6100F79C        bsr settermmode
 2086  002BC4 42383655        clr.b vblank
 2087  002BC8 42B83724        clr.l kexmask
 2088  002BCC 42B835A8        clr.l breakpoint
 2089  002BD0 427835B6        clr.w targetline
 2090  002BD4 42B835AE        clr.l watchpoint
 2091  002BD8 21F8000035B2    move.l 0,watchpoint+4
 2092  002BDE 31FC4EF93FA2    move.w #$4ef9,screenput
 2093  002BE4 42B83730        clr.l etherr           * ether stuff
 2094  002BE8 42B8373C        clr.l stxin
 2095  002BEC 42B83734        clr.l dtxin
 2096  002BF0 42B83744        clr.l nakin
 2097  002BF4 21FCFFFFFFFF    move.l #$ffffffff,ackin
 2098  002BFC 42B83738        clr.l rdyin
 2099  002C00 11F83FA9372D    move.b xfsport,fsport
 2100  002C06 4238375C        clr.b ansi
 2101  002C0A 427835C4        clr userno              * not logged on
 2102  002C0E 21FC00001E7C    move.l #dsqspu,dsqint
 2103  002C16 21FC00001E76    move.l #dsqwait,dsqwai
 2104  002C1E 42B83758        clr.l dtxmask
 2105  002C22 42B83750        clr.l dtxast
 2106                      *
 2107                      * Remember main store particulars
 2108                      *
 2109  002C26 21F83FF03FF8    move.l freebot,membot
 2110  002C2C 21F83FF43FFC    move.l freetop,memtop
 2111                      *
 2112                      * Initialise stream descriptors
 2113                      * (Define all 4 input and all 4 output
 2114                      *  streams as the null file)
 2115                      *
 2116  002C32 22383FF0        move.l freebot,d1
 2117  002C36 91C8            sub.l a0,a0
 2118  002C38 7003            moveq #3,d0
 2119  002C3A D2BC00000200 buloop add.l #512,d1
 2120  002C40 214135CE        move.l d1,in0(a0)
 2121  002C44 214135D2        move.l d1,in0+4(a0)
 2122  002C48 217C000020A6    move.l #nullin,in0+8(a0)
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  47

 2123  002C50 42A835DA        clr.l in0+12(a0)
 2124  002C54 2141360E        move.l d1,out0(a0)
 2125  002C58 D2BC00000200    add.l #512,d1
 2126  002C5E 21413612        move.l d1,out0+4(a0)
 2127  002C62 217C00001F96    move.l #return,out0+8(a0)
 2128  002C6A 42A8361A        clr.l out0+12(a0)
 2129  002C6E D1FC00000010    add.l #16,a0
 2130  002C74 51C8FFC4        dbra d0,buloop
 2131  002C78 21C13FF0        move.l d1,freebot
 2132                      *
 2133                      * Define streams 0 as .t and select them
 2134                      *
 2135  002C7C 4280            clr.l d0
 2136  002C7E 41FA01D0        lea tty,a0
 2137  002C82 6100F83C        bsr openinput
 2138  002C86 4280            clr.l d0
 2139  002C88 41FA01C6        lea tty,a0
 2140  002C8C 6100F8D8        bsr openoutput
 2141  002C90 4280            clr.l d0
 2142  002C92 6100F6E2        bsr selectinput
 2143  002C96 6100F70A        bsr selectoutput
 2144                      *
 2145                      * Terminal and Ethernet interface have already
 2146                      * been initialised, and the filestore ether port
 2147                      * has been opened, by the ROM firmware.
 2148                      * Now set up timer 3 of the PTM.
 2149                      * 10MHz CPU clock
 2150                      * -> 1MHz E clock -> prescaler
 2151                      * -> 125 kHz -> low-order byte
 2152                      * -> 1 kHz -> high-order byte
 2153                      * -> 10Hz interrupt rate.
 2154                      *
 2155  002C9A 42B83728        clr.l millisecs
 2156  002C9E 41F900400100    lea ptm,a0
 2157  002CA4 303C637C        move.w #99<<8+124,d0        * Dual mode, div by 
 2157+                     125 and 100
 2158  002CA8 0188000C        movep.w d0,12(a0)
 2159  002CAC 7001            moveq #1,d0
 2160  002CAE 11400002        move.b d0,2(a0)             * select cr1
 2161  002CB2 1080            move.b d0,(a0)              * reset counters
 2162  002CB4 42280002        clr.b 2(a0)                 * select cr3
 2163  002CB8 10BC0047        move.b #$47,(a0)            * int,contin,dual,in
 2163+                     ternal,prescale
 2164  002CBC 11400002        move.b d0,2(a0)             * select cr1
 2165  002CC0 4210            clr.b (a0)                  * start counters
 2166                      *
 2167                      * Create the System/External/File/Command dictionar
 2167+                     ies
 2168                      *
 2169                      credict macro
 2170                         move.l freebot,d0
 2171                         lea \1,a0
 2172                         move.l d0,(a0)+
 2173                         move.l d0,(a0)+
 2174                         add.l #\2*4,d0
 2175                         move.l d0,(a0)+
 2176                         clr.l (a0)+
 2177                         move.l d0,freebot
 2178                         move.l d0,a0
 2179                         move.w #\2-1,d0
 2180                      \@a clr.l -(a0)
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  48

 2181                         dbra d0,\@a
 2182                         endm
 2183                         credict sysdict,500
 2184                         credict extdict,8
 2185                         credict fildict,2200,*3000,*2000
 2186                         credict comdict,2000,*1000
 2187                      *
 2188                      * Enable ether and vdu interrupts
 2189                      *
 2190  002D5A 13FC00060007    move.b #eion,eths
 2191  002D62 13FC00950040    move.b #vion,vdus
 2192                      *
 2193                      * Shed privilege and non-interruptability
 2194                      * and identify the system
 2195                      *
 2196  002D6A 027C0000        and.w #0,sr
 2197  002D6E 3E7C3F00        move #systop,sp
 2198  002D72 41FA02A2        lea sysver,a0
 2199  002D76 6100F2D4        bsr vptext
 2200  002D7A 4EBAF598     ansiloop jsr testsymbol
 2201  002D7E 4A80            tst.l d0
 2202  002D80 6CF8            bge ansiloop
 2203                      *
 2204                      * Establish processor type
 2205                      *
 2206  002D82 40C0            move.w sr,d0
 2207                      *  move.l processor,d0
 2208                      *  clr.l d1
 2209                      *  bsr write
 2210                      *  bsr newline
 2211                      *
 2212                      * Load the command interpreter
 2213                      *
 2214  002D84 21FCFFFFFFFF loadcli move.l #-1,event
 2215  002D8C 6100EC00        bsr defineeh            * Set Event Trap
 2216  002D90 4AB83400        tst.l event
 2217  002D94 6C20            bge.s clieof
 2218  002D96 42B83400        clr.l event
 2219  002D9A 7001            moveq #1,d0             * Open FMAC.EXEC:MOB
 2220  002D9C 41FA0293        lea cli,a0
 2221  002DA0 6100F71E        bsr openinput
 2222  002DA4 7001            moveq #1,d0
 2223  002DA6 6100F5CE        bsr selectinput
 2224  002DAA 24783FF0        move.l freebot,a2       * and read it
 2225  002DAE 6100F2E6     lx1 bsr readsymbol
 2226  002DB2 14C0            move.b d0,(a2)+
 2227  002DB4 60F8            bra lx1
 2228  002DB6 7009         clieof moveq #9,d0
 2229  002DB8 B0B83400        cmp.l event,d0
 2230  002DBC 6642            bne.s ohno              * not event 9 ->
 2231  002DBE 7001            moveq #1,d0
 2232  002DC0 B0B83404        cmp.l subevent,d0
 2233  002DC4 663A            bne.s ohno              * not input ended ->
 2234  002DC6 B5F83FF0        cmp.l freebot,a2
 2235  002DCA 6734            beq.s ohno              * file empty ->
 2236  002DCC 21FCFFFFFFFF    move.l #-1,event        * remove clieof trap
 2237  002DD4 6100EBB8        bsr defineeh
 2238  002DD8 4AB83400        tst.l event
 2239  002DDC 6C22            bge.s ohno
 2240  002DDE 42B83400        clr.l event
 2241  002DE2 6100F652        bsr closeinput
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  49

 2242  002DE6 2E783FF4        move.l freetop,sp       * enter loaded exec
 2243  002DEA 9FFC00000010    sub.l #16,sp
 2244  002DF0 21CF3FF4        move.l sp,freetop
 2245  002DF4 21CA3FF0        move.l a2,freebot
 2246  002DF8 99CC            sub.l a4,a4
 2247  002DFA 9BCD            sub.l a5,a5
 2248  002DFC 4EEAFFFC        jmp -4(a2)
 2249                      
 2250  002E00 41FA01BF     ohno lea disast,a0
 2251  002E04 6100F246        bsr vptext
 2252  002E08 20383400        move.l event,d0
 2253  002E0C 6100F248        bsr hexlong
 2254  002E10 6100F1D4        bsr space
 2255  002E14 20383404        move.l subevent,d0
 2256  002E18 6100F23C        bsr hexlong
 2257  002E1C 6100F1C8        bsr space
 2258  002E20 20383408        move.l eventinfo,d0
 2259  002E24 6100F230        bsr hexlong
 2260  002E28 6100F1BC        bsr space
 2261  002E2C 2038340C        move.l eventpc,d0
 2262  002E30 6100F224        bsr hexlong
 2263  002E34 6100F1DA        bsr newline
 2264  002E38 41F83410        lea eventmess,a0
 2265  002E3C 4280            clr.l d0
 2266  002E3E 1018            move.b (a0)+,d0
 2267  002E40 42300000        clr.b 0(a0,d0)
 2268  002E44 6100F206        bsr vptext
 2269  002E48 6100F1C6        bsr newline
 2270  002E4C 6000FFFE        bra.w *
 2271                      
 2272                      *
 2273                      * Miscellaneous strings and texts
 2274                      *
 2275  002E50 02           tty        dc.b 2,':t'
 2276  002E53 53           spyprom    dc.b 'Spy>',0
 2277  002E58 0A           helpmess   dc.b nl,'^Y           Stop              
 2277+ 002E59 5E             '
 2278  002E7A 0A                      dc.b nl,'R            Reload system     
 2278+ 002E7B 52             '
 2279  002E9C 0A                      dc.b nl,'X addr size  eXamine store (SPY
 2279+ 002E9D 58           ) '
 2280  002EBE 0A                      dc.b nl,'C            Continue freely   
 2280+ 002EBF 43             '
 2281  002EE0 0A                      dc.b nl,'B addr       Continue to PC    
 2281+ 002EE1 42             '
 2282  002F02 0A                      dc.b nl,'S            Single instruction
 2282+ 002F03 53             '
 2283  002F24 0A                      dc.b nl,'L num        Continue to Line  
 2283+ 002F25 4C             '
 2284  002F46 0A                      dc.b nl,'N            Next statement    
 2284+ 002F47 4E             '
 2285  002F68 0A                      dc.b nl,'P addr       Protect longword  
 2285+ 002F69 50             '
 2286  002F8A 0A                      dc.b nl
 2287  002F8B 4E           whatmess   dc.b 'Now what? ',0
 2288  002F96 50           protmess   dc.b 'Protege has changed',0
 2289  002FAA 15           fsdead     dc.b 21,'No ACK from filestore',0
 2290  002FC1 0A           disast     dc.b nl,'*Untrapped event ',0
 2291  002FD4 2A           spint      dc.b '*Spurious auto-interrupt '
 2292  002FED 30           intnum     dc.b '0',0
 2293  002FEF 20           sp10       dc.b '  '
 Motorola M68010 Assembler  Basic Operating System for Fred-Machine  Page  50

 2294  002FF1 20           sp8        dc.b '        ',0
 2295  002FFA 0A           dmess      dc.b nl,' D:',0
 2296  002FFF 0A           amess      dc.b nl,' A:',0
 2297  003004 53           srmess     dc.b 'SR: ',0
 2298  003009 20           linemess   dc.b ' Line ',0
 2299  003010 20           pcmess     dc.b ' PC: ',0
 2300                      sysver     version
 2301  00302D 0A                      dc.b nl,esc,'Z',0
 2302  003031 12           cli        dc.b 18,'canon:bootread.mob'
 2303  003044 00000000                ds.w 0
 2304                         end

No faults and no warnings in this assembly.
