    1          PAGE
    2 ; COPYRIGHT 1987 DTACK GROUNDED INC:   PASS1B
    3 ;
    4 ; SYNTAX:  TRAP #<VECTOR>  (NO SIZE ALLOWED)
    5 ;
    6 TRAP     TST.B   SIZEID         ;SIZE SPEC'D ?
    7          BNE     ERR24H         ;IF SO
    8 ;
    9          BSR     LASTEA         ;D4 = MODE
   10          CMPI.B  #11,D4         ;#<DATA> ?
   11          BEQ     W1B            ;IF SO
   12          BNE     ERR22H         ;IF NOT
   13 ;
   14 ; SYNTAX:  STOP #<DATA>   (NO SIZE ALLOWED)
   15 ;
   16 STOP     TST.B   SIZEID         ;SIZE SPEC'D ?
   17          BNE     ERR24H         ;IF SO
   18 ;
   19          BSR     LASTEA         ;D4 = MODE
   20          CMPI.B  #11,D4         ;#<DATA> ?
   21          BEQ     W2             ;IF SO
   22          BNE     ERR22H         ;IF NOT
   23 ;
   24 ; SYNTAX:  UNLK AN   (NO SIZE ALLOWED)
   25 ;
   26 UNLK     TST.B   SIZEID         ;SIZE SPEC'D ?
   27          BNE     ERR24H         ;IF SO
   28 ;
   29          BSR     LASTEA         ;D4 = MODE
   30          SUBQ.B  #1,D4          ;MODE = AN ?
   31          BEQ     W1B            ;IF SO
   32          BNE     ERR22H         ;IF NOT
   33 ;
   34 ; SYNTAX:  EXT.SIZE DN     SIZE = .W OR .L
   35 ;
   36 EXT      TST.B   SIZEID         ;SIZE = .B ?
   37          BPL     SWAP1          ;IF NOT
   38          BMI     ERR24H         ;IF SO
   39 ;
   40 ; SYNTAX:  SWAP DN     (NO SIZE ALLOWED)
   41 ;
   42 SWAP     TST.B   SIZEID         ;SIZE SPEC'D ?
   43          BNE     ERR24H         ;IF SO
   44 ;
   45 SWAP1    BSR     LASTEA         ;D4 = MODE
   46          TST.B   D4             ;MODE = DN ?
   47          BEQ     W1B            ;IF SO
   48          BNE     ERR22H         ;IF NOT
   49 ;
   50          PAGE
   51 ; COPYRIGHT 1987 DTACK GROUNDED INC
   52 ;
   53 ; CHECK FOR A WEIRD LABEL (SP, SR, CCR, USP, SSP)
   54 ; RETURN WITH Z FLAG SET IF NOT FOUND
   55 ;
   56 ; A0 = FIELD PTR         D0 = FIELD COUNT
   57 ; (A0, A1, A2, D0 ARE PRESERVED)
   58 ;
   59 CHKWRD   LEA     WTBL,A3        ;PTR TO TABLE
   60          MOVEQ   #1,D1          ;INIT WEIRD I.D.
   61          MOVEQ   #0,D6          ;CLR UPPER BITS
   62 ;
   63 CW1      MOVE.B  (A3)+,D6       ;FETCH LINK
   64          BEQ     CWX            ;IF LINK IS ZERO
   65 ;
   66          CMP.B   D0,D6          ;LENGTH SAME ?
   67          BNE     CW3            ;IF NOT
   68 ;
   69          MOVE.L  A0,A5          ;PTR 1
   70          MOVE.L  A3,A6          ;PTR 2
   71          MOVE.B  D6,D2          ;STR COUNT
   72 ;
   73 CW2      MOVE.B  (A5)+,D3       ;FETCH A CHAR
   74          CMP.B   (A6)+,D3       ;CHARS MATCH ?
   75          BNE     CW3            ;IF NOT
   76 ;
   77          SUBQ.B  #1,D2          ;DECR STR COUNT
   78          BNE     CW2            ;LOOP 'TIL ZERO
   79 ;
   80 ; A MATCH TO THE WEIRD STRING WAS FOUND !
   81 ; (STORING THE I.D. CLEARS THE Z FLAG)
   82 ;
   83          MOVE.B  D1,WEIRD       ;STORE WEIRD I.D.
   84 CWX      RTS                    ;DONE
   85 ;
   86 ; THE STRINGS (OR LENGTHS) DID NOT MATCH
   87 ;
   88 CW3      ADD.L   D6,A3          ;PTR TO NEXT STR
   89          ADDQ.B  #1,D1          ;INCR WEIRD I.D.
   90          BRA     CW1            ;CHK NEXT STRING
   91 ;
   92 ; LINKED ASCII TABLE OF WEIRD LABELS
   93 ;
   94 WTBL     DC.B    2
   95          ASC     "SP"           ;I.D. #1
   96          DC.B    3
   97          ASC     "USP"          ;I.D. #2
   98          DC.B    3
   99          ASC     "SSP"          ;I.D. #3
  100          DC.B    3
  101          ASC     "CCR"          ;I.D. #4
  102          DC.B    2
  103          ASC     "SR"           ;I.D. #5
  104          DC.B    0              ;TABLE END MARKER
  105          SYNC                   ;EVEN ADR
  106 ;
  107          PAGE
  108 ;COPYRIGHT 1986 DIGITAL ACOUSTICS INC
  109 ;
  110 ASC      BSR     DESTSIZE       ;A0 PTR, D0 SIZE
  111          MOVEQ   #$22,D5        ;D5 = QUOTE CHAR
  112          MOVEQ   #0,D6          ;CLR UPPER BITS
  113          MOVE.B  (A0)+,D6       ;1ST CHAR
  114          CMP.B   D5,D6          ;QUOTE CHAR ?
  115          BEQ     ASC1           ;IF SO
  116 ;
  117          MOVEQ   #"'",D5        ;D5 = APOSTROPHE
  118          CMP.B   D5,D6          ;APOSTROPHE ?
  119          BNE     ERR6A          ;IF NOT
  120 ;
  121 ASC1     MOVE.B  (A0)+,D6       ;NEXT CHAR
  122          BCLR    #7,D6          ;SET MSB LOW
  123          TST.B   (A1,D6)        ;CHAR ATTR BYTE
  124          BPL     ERR28A         ;IF NOT PRINTABLE
  125 ;
  126          CMP.B   D5,D6          ;TERMINATOR ?
  127          BEQ     CWX            ;DONE IF SO
  128 ;
  129          ADDQ.L  #1,ADDRESS     ;INCR ADDRESS
  130          SUBQ.B  #1,D0          ;DECR FIELD CNT
  131          BNE     ASC1           ;IF NOT ZERO
  132 ;
  133 ; END OF FIELD WITHOUT TERMINATOR
  134 ;
  135 ERR6A    MOVEQ   #6,D7          ;SYNTAX ERROR
  136          BRA     ERRA
  137 ;
  138 ERR28A   MOVEQ   #28,D7         ;UNPRINTABLE CHAR
  139 ERRA     BRA     ERROR
  140 ;
  141 ;
  142 ;
  143 ; 'CMP <EA>,DN':  ALL ADR MODES;  .B, .W, .L
  144 ;
  145 CMP      BSR     DN2ND          ;2ND <EA> 'DN' ?
  146          BEQ     TYPE8B         ;IF SO
  147 ;
  148          CMPI.B  #1,D4          ;2ND <EA> 'AN' ?
  149          BEQ     TYPE8A         ;IF SO
  150 ;
  151          CMPI.B  #"#",(A0)      ;SRC = #<DATA> ?
  152          BEQ     TYPE5          ;IF SO
  153          BNE     ERR22H         ;IF NOT
  154 ;
  155 ;
  156 ;
  157 DC       MOVEQ   #1,D2          ;IN CASE .B
  158          MOVE.B  SIZEID,D1      ;FETCH SIZE I.D.
  159          BMI     DCX            ;IF .B
  160 ;
  161          MOVEQ   #2,D2          ;IN CASE .W
  162          BSR     RNDADLBL       ;ROUND ADR, LABEL ADR
  163          BNE     DCX            ;IF NOT .L
  164 ;
  165          MOVEQ   #4,D2          ;TWO WORDS
  166 ;
  167 DCX      ADD.L   D2,ADDRESS     ;INCR THE ADDRESS
  168          RTS                    ;DONE
  169 ;
  170          PAGE
  171 ; COPYRIGHT 1987 DTACK GROUNDED INC
  172 ;
  173 DS       BSR     SVCEXPR        ;RESULT IN D3.L
  174          BEQ     ERR41          ;ILLEG FWRD REF
  175 ;
  176          MOVEQ   #0,D2          ;IN CASE .B
  177          MOVE.B  SIZEID,D1      ;FETCH SIZE I.D.
  178          BMI     DSX            ;IF .B
  179 ;
  180          MOVEQ   #1,D2          ;IN CASE .W
  181          BSR     RNDADLBL       ;ROUND ADR, LABEL ADR
  182          BNE     DSX            ;IF NOT .L
  183 ;
  184          MOVEQ   #2,D2          ;TWO WORDS
  185 ;
  186 DSX      ASL.L   D2,D3          ;X 1, 2 OR 4
  187          ADD.L   D3,ADDRESS     ;INCR THE ADDRESS
  188          RTS                    ;DONE
  189 ;
  190 ;
  191 ;
  192 ; ROUND THE ADDRESS AND LABEL ADR IF PRESENT
  193 ;
  194 RNDADLBL ADDQ.L  #1,ADDRESS     ;ROUND THE ADDRESS
  195          BCLR    #0,ADDRESS+3
  196          TST.B   LBLFLG         ;LABEL PRESENT ?
  197          BEQ     RNDADLBX       ;IF NOT
  198 ;
  199          MOVE.L  ADDRESS,(A5)   ;ADR TO LBL ADR
  200          CLR.B   (A5)           ;CLR THE UPPER BYTE
  201 ;
  202 RNDADLBX SUBQ.B  #2,D1          ;FOR 'DC' AND 'DS'
  203          RTS                    ;DONE
  204 ;
  205 ;
  206 ;
  207 ; EOR.SIZE DN,<EA>  (MODES 0, 2-8)
  208 ;
  209 EOR      BSR     DN1ST          ;CHK SRC = MODE 0
  210          ADDQ.L  #3,A0          ;CORRECT THE PTR
  211          BRA     TYPE3          ;SVC DEST <EA>
  212 ;
  213 ;
  214 ;
  215 ; 'EQUATE' A LABEL:  LBL ADR = <EXPRESSION>
  216 ;
  217 EQU      CLR.L   ADRTEMP        ;CLR REF ADR
  218          BSR     SVCEXPR        ;D3.L = ADDRESS
  219          BEQ     ERR41          ;ILLEGAL FWRD REF
  220 ;
  221          MOVE.L  D3,ADRTEMP     ;STORE REF ADR
  222 ;
  223 ; STORE THE NEW LABEL AND ITS DEFINED ADDRESS
  224 ; IN THE LABEL TABLE, THEN DONE
  225 ;
  226 EQUX     MOVE.L  LBLTEMP,D2     ;RECALL LABEL TO
  227          MOVE.L  LBLTEMP+4,D3   ;REGS D2 AND D3
  228          BSR     SVCLBL         ;STORE LABEL, ADR
  229          BRA     ASMLIN         ;NEXT LINE
  230 ;
  231          PAGE
  232 ; COPYRIGHT 1987 DTACK GROUNDED INC
  233 ;
  234 ; EVALUATE AN <EXPRESSION>;  VALUE TO D3.L
  235 ; RETURN WITH Z FLAG SET IF A FORWARD LBL REF
  236 ;
  237 SVCEXPR  BSR     DESTSIZE       ;A0 PTR, D0 SIZE
  238          MOVE.B  D0,D1
  239          MOVE.L  A0,A3
  240          BSR.L   CHKEXPR        ;CHK <EXPR> SYNTAX
  241          MOVE.B  D0,D1
  242          MOVE.L  A0,A3
  243          BRA.L   EVALEXPR       ;VALUE IN D3.L
  244 ;
  245 ;
  246 ERR41    MOVEQ   #41,D7         ;ILLEGAL FORWARD REF
  247          BRA     ERRG
  248 ;
  249 ;
  250 ; PSEUDO-OP;  FORWARD.L OR FORWARD.W
  251 ;
  252 FWRD     CMPI.B  #"L",(A0)      ;FWRD L ?
  253          BEQ     FWRDL          ;IF SO
  254 ;
  255          CMPI.B  #"W",(A0)      ;FWRD W ?
  256          BNE     ERR25G         ;IF NOT
  257 ;
  258          CLR.B   FORWARD        ;FWRD W
  259          RTS
  260 ;
  261 FWRDL    MOVE.B  #$FF,FORWARD   ;FWRD L
  262          RTS
  263 ;
  264 ;
  265 GAP      BSR     DESTSIZE       ;D3.W = GAPSIZE
  266          CMPI.L  #$10000,D3     ;GAP A WORD VALUE ?
  267          BCC     ERR21G         ;IF NOT
  268 ;
  269          MOVE.W  D3,GAPSIZE     ;NEW GAP SIZE
  270          RTS                    ;'GAP' DONE
  271 ;
  272 ;
  273 ; 'MOVEP' CANNOT BE USED ON A DTACK BOARD
  274 ;
  275 MOVEP    MOVEQ   #0,D7          ;NOT IMPLEMENTED
  276          BRA     ERRG
  277 ;
  278 ;
  279 ERR25G   MOVEQ   #25,D7         ;BAD PSEUDO-OP
  280          BRA     ERRG
  281 ;
  282 ERR20G   MOVEQ   #20,D7         ;NEW ADR < OLD
  283          BRA     ERRG
  284 ;
  285 ERR21G   MOVEQ   #21,D7         ;CODE GAP TOO LARGE
  286 ERRG     BRA     ERROR
  287 ;
  288          PAGE
  289 ; COPYRIGHT 1987 DTACK GROUNDED INC
  290 ;
  291 ORG      BSR     SVCEXPR        ;VALUE IN D3.L
  292          BEQ     ERR41          ;IF FORWARD REF
  293 ;
  294          TST.B   ORGFLG         ;1ST ORG ?
  295          BEQ     FIRSTORG       ;IF SO
  296 ;
  297          ADDQ.B  #1,ADDRESS+3
  298          BCLR    #0,ADDRESS+3
  299          MOVE.L  D3,D2          ;ORG ADR TO D2
  300          SUB.L   ADDRESS,D2     ;D2 = GAP SIZE
  301          BMI     ERR20G         ;NEW ADR < OLD ADR
  302 ;
  303          CMPI.L  #$10000,D2     ;D2 A WORD VALUE ?
  304          BHI     ERR21G         ;IF NOT
  305 ;
  306          CMP.W   GAP,D2         ;GAP TOO LARGE ?
  307          BHI     ERR21G         ;IF SO
  308 ;
  309          CMP.L   ADDRESS,D3     ;NEW < OLD ?
  310          BCS     ERR20G         ;NEW ADR < OLD
  311 ;
  312 FIRSTORG MOVE.L  D3,ADDRESS     ;STORE NEW ADDRESS
  313          MOVE.B  #1,ORGFLG      ;1ST ORG DONE
  314          RTS                    ;'ORG' DONE
  315 ;
  316 ;
  317 ; PSEUDO-OP;  SHORT $7FFF OR SHORT $FFFF
  318 ;
  319 SHORT    CMPI.B  #"F",(A0)      ;SHORT $FFFF ?
  320          BEQ     SHORTF         ;IF SO
  321 ;
  322          CMPI.B  #"7",(A0)      ;SHORT $7FFF ?
  323          BNE     ERR25G         ;IF NOT
  324 ;
  325          MOVE.L  #$7FFF,SHRT    ;SHORT 7
  326          RTS
  327 ;
  328 SHORTF   MOVE.L  #$FFFF,SHRT    ;SHORT F
  329          RTS
  330 ;
  331 ;
  332 SYNC     RTS                    ;ADR ALREADY RNDED UP
  333 ;
  334          PAGE
  335 ; COPYRIGHT 1987 DTACK GROUNDED INC
  336 ;
  337 MOVE     MOVE.L  A0,RESTART     ;SAVE PTR A0
  338          BSR     ONETWO         ;TWO <EA> FLDS ?
  339          BEQ     ERR26E         ;IF NOT
  340 ;
  341 ; CHECK FOR SOURCE = A RESERVED WORD (E.G. SR)
  342 ;
  343          BSR     SRCSIZE        ;A0 PTR  D0 SIZE
  344          BSR     CHKWRD         ;USP, CCR, SP ?
  345          BNE     MOVEWRD        ;IF SO
  346 ;
  347 ; CHECK FOR DEST = A RESERVED WORD (E.G. SR)
  348 ;
  349          EXG     A0,A2          ;A0 = DEST PTR
  350          BSR     DESTSIZE       ;A0 PTR, D0 SIZE
  351          BSR     CHKWRD         ;RESERVED WORD ?
  352          BNE     MOVEWRD2       ;IF SO
  353 ;
  354 ; NEITHER SRC OR DEST <EA>S ARE RESERVED WORDS;
  355 ; BEGIN BY SERVICING THE SOURCE <EA>.
  356 ;
  357          MOVE.L  RESTART,A0     ;RESTORE PTR A0
  358          BSR     FIRSTEA        ;D4 MODE  D5 SIZE
  359          CMPI.B  #1,D4          ;SRC = 'AN' ?
  360          BNE     MOVE1          ;IF NOT
  361 ;
  362 ; A SIZE OF .B IS ILLEGAL WHEN SRC = 'AN'
  363 ;
  364          TST.B   SIZEID         ;.B ?
  365          BMI     ERR24E         ;IF SO
  366 ;
  367 ; SOURCE <EA>S:  ALL ADDRESSING MODES ALLOWED
  368 ;
  369 MOVE1    CMPI.B  #11,D4         ;IMMEDIATE ?
  370          BNE     MOVE1B         ;DONE IF NOT
  371 ;
  372          CMPI.B  #2,SIZEID      ;SIZE = .L ?
  373          BEQ     MOVE1A         ;IF NOT
  374 ;
  375          MOVEQ   #4,D5          ;TWO WORDS
  376          BRA     MOVE1B         ;CONTINUE
  377 ;
  378 MOVE1A   MOVEQ   #6,D5          ;THREE WORDS
  379 MOVE1B   ADD.L   D5,ADDRESS     ;INCR THE ADR
  380 ;
  381 ; SERVICE THE DEST <EA>.  A0 = DEST FLD PTR.
  382 ;
  383          BSR     LASTEA         ;D4 MODE  D5 SIZE
  384          SUBQ.B  #2,D5          ;CORRECT DEST SIZE
  385          CMPI.B  #8,D4          ;ILLEGAL MODE ?
  386          BHI     ERR22E         ;IF SO
  387 ;
  388          SUBQ.B  #1,D4          ;'AN' ?
  389          BNE     ADDADR         ;IF NOT
  390 ;
  391          TST.B   SIZEID         ;.B ?
  392          BPL     ADDADR         ;DONE IF NOT
  393 ;
  394 ; (CONTINUE, REPORTING ERROR 24)
  395 ;
  396          PAGE
  397 ; COPYRIGHT 1987 DTACK GROUNDED INC
  398 ;
  399 ERR24E   MOVEQ   #24,D7         ;BAD SIZE SPEC
  400          BRA     ERRE
  401 ;
  402 ERR26E   MOVEQ   #26,D7         ;<EA> MISSING
  403          BRA     ERRE
  404 ;
  405 ERR22E   MOVEQ   #22,D7         ;BAD <EA>
  406          BRA     ERRE
  407 ;
  408 ERR6E    MOVEQ   #6,D7          ;SYNTAX ERROR
  409 ERRE     BRA     ERROR          ;REPORT ERROR
  410 ;
  411 ; WE HAVE ONE OF THE WEIRD SOURCE <EA>S:
  412 ;
  413 MOVEWRD  TST.B   SIZEID         ;NO ID ALLOWED
  414          BNE     ERR24E         ;IF ILLEGAL ID
  415 ;
  416          CMPI.B  #3,D1          ;CCR OR SR ?
  417          BLS     MOVEWRD1       ;IF NOT
  418 ;
  419 ; SRC = 'SR';  DEST <EA>S ARE DATA ALTERABLE
  420 ;
  421          EXG     A0,A2          ;A0 = DEST PTR
  422          BRA     TYPE3          ;SVC DEST FLD
  423 ;
  424 MOVEWRD1 CMPI.B  #2,D1          ;USP ?
  425          BNE     ERR22E         ;IF NOT
  426 ;
  427 ; THE SRC <EA> IS 'USP',  DEST <EA> MUST BE 'AN'
  428 ;
  429          EXG     A0,A2          ;A0 = DEST PTR
  430          BSR     LASTEA         ;D4 = 2ND MODE
  431          BRA     MOVEWRD4       ;CONTINUE
  432 ;
  433 ; WE HAVE ONE OF THE WEIRD DESTINATION <EA>S:
  434 ;
  435 MOVEWRD2 TST.B   SIZEID         ;NO ID ALLOWED
  436          BNE     ERR24E         ;IF ILLEGAL ID
  437 ;
  438          CMPI.B  #3,D1          ;CCR OR SR ?
  439          BLS     MOVEWRD3       ;IF NOT
  440 ;
  441 ; DEST = 'CCR' OR 'SR';  SRC <EA>S = DATA
  442 ;
  443          MOVE.L  RESTART,A0     ;RESTORE PTR A0
  444          BRA     DATAEA         ;SVC DATA SRC <EA>
  445 ;
  446 MOVEWRD3 CMPI.B  #2,D1          ;USP ?
  447          BNE     ERR24E         ;IF NOT
  448 ;
  449 ; THE DEST <EA> IS 'USP',  SRC <EA> MUST BE 'AN'
  450 ;
  451          MOVE.L  RESTART,A0     ;RESTORE PTR A0
  452          BSR     FIRSTEA        ;D4 = SRC MODE
  453 ;
  454 MOVEWRD4 CMPI.B  #1,D4          ;SRC <EA> = 'AN' ?
  455          BEQ     W1             ;IF SO
  456          BNE     ERR24E         ;IF NOT
  457 ;
  458          PAGE
  459 ; COPYRIGHT 1987 DTACK GROUNDED INC
  460 ;
  461 MOVEM    BSR     ONETWO         ;TWO <EA> FLDS ?
  462          BEQ     ERR26F         ;IF NOT
  463 ;
  464          TST.B   SIZEID         ;.B ?
  465          BMI     ERR24F         ;IF SO
  466 ;
  467 ; DETERMINE WHETHER REGS,<EA>  OR  <EA>,REGS
  468 ;
  469          MOVE.L  A0,A2          ;A2 = SCRATCH PTR
  470          MOVE.B  (A2)+,D6       ;FIRST CHAR
  471          CMPI.B  #"D",D6        ;"D" ?
  472          BEQ     MOVEM1         ;IF SO
  473 ;
  474          CMPI.B  #"A",D6        ;"A" ?
  475          BNE     MOVEM3         ;IF NOT
  476 ;
  477 MOVEM1   MOVE.B  (A2)+,D6       ;2ND CHAR
  478          MOVE.B  (A1,D6),D3     ;FETCH ATTR BYTE
  479          BTST    #4,D3          ;NUMERIC ?
  480          BEQ     MOVEM3         ;IF NOT
  481 ;
  482 ; NOW TEST FOR A DELIMITER  (/ - ,)
  483 ;
  484          MOVE.B  (A2)+,D6       ;NEXT CHAR
  485          CMPI.B  #"/",D6        ;DELIMITER ?
  486          BEQ     MOVEM2         ;IF SO
  487 ;
  488          CMPI.B  #"-",D6        ;DELIMITER ?
  489          BEQ     MOVEM2         ;IF SO
  490 ;
  491          CMPI.B  #",",D6        ;DELIMITER ?
  492          BNE     MOVEM3         ;IF NOT
  493 ;
  494 ; WE HAVE MOVEM(.SIZE) REGS,<EA>
  495 ;
  496 MOVEM2   MOVEQ   #",",D2        ;COMMA = TERM'TR
  497          BSR     REGLIST        ;D5 = REG MASK
  498          BSR     LASTEA         ;D4 MODE  D5 SIZE
  499          ADDQ.B  #2,D5          ;INCLUDE REG LIST
  500          MOVE.W  #$1F4,D2       ;LEGAL ADR MODES
  501          BTST    D4,D2          ;ADR MODE LEGAL ?
  502          BNE     ADDADR         ;IF SO
  503          BEQ     ERR22F         ;IF NOT
  504 ;
  505 ERR26F   MOVEQ   #26,D7         ;<EA> MISSING
  506          BRA     ERRF
  507 ;
  508 ERR24F   MOVEQ   #24,D7         ;BAD SIZE SPEC
  509          BRA     ERRF
  510 ;
  511 ERR47F   MOVEQ   #47,D7         ;BAD DELIMITER
  512          BRA     ERRF
  513 ;
  514          PAGE
  515 ; COPYRIGHT 1987 DTACK GROUNDED INC
  516 ;
  517 ERR46F   MOVEQ   #46,D7         ;SAME REGISTERS
  518          BRA     ERRF
  519 ;
  520 ERR6F    MOVEQ   #6,D7          ;SYNTAX ERROR
  521          BRA     ERRF
  522 ;
  523 ERR22F   MOVEQ   #22,D7         ;ILLEGAL MODE
  524 ERRF     BRA     ERROR
  525 ;
  526 ; WE HAVE MOVEM(.SIZE) <EA>,REGS
  527 ;
  528 MOVEM3   BSR     FIRSTEA        ;D4 MODE  D5 SIZE
  529          MOVE.W  #$7EC,D2       ;LEGAL ADR MODES
  530          BTST    D4,D2          ;ADR MODE LEGAL ?
  531          BEQ     ERR22F         ;IF NOT
  532 ;
  533          ADDQ.B  #2,D5          ;REG MASK = ONE WORD
  534          BSR     ADDADR         ;IF LEGAL
  535 ; NOW PREPARE TO SERVICE THE REGISTER MASK
  536 ;
  537          BSR     DESTSIZE       ;D6 = TERM CHAR
  538          MOVE.B  D6,D2          ;D2 = TERM CHAR
  539 ;
  540 ; SUBROUTINE;  SERVICE A REGISTER LIST
  541 ; A0 = PTR TO TEXT    D2 = TERMINATION CHAR
  542 ;
  543 REGLIST  MOVEQ   #0,D5          ;CLR REG MASK
  544 ;
  545 REGLST1  BSR     REGNUM         ;REG -> 0-15
  546          BSET    D4,D5          ;SET REG 'D4' BIT
  547          MOVE.B  (A0)+,D6       ;FETCH DELIMITER
  548          CMPI.B  #"-",D6        ;HYPHEN ?
  549          BEQ     REGLST3        ;SVC RANGE IF SO
  550 ;
  551 REGLST2  CMP.B   D2,D6          ;TERMINATION CHAR ?
  552          BEQ     REGLSTX        ;IF SO
  553 ;
  554          CMPI.B  #"/",D6        ;REGISTER DELIMTR ?
  555          BEQ     REGLST1        ;CONTINUE IF SO
  556          BNE     ERR47F         ;ERROR IF NOT
  557 ;
  558 ; SERVICE A RANGE OF REGISTERS
  559 ;
  560 REGLST3  MOVE.B  D4,D3          ;D3 = 1ST REG
  561          BSR     REGNUM         ;REG -> 0-15
  562          CMP.B   D3,D4          ;COMPARE LIMITS
  563          BEQ     ERR46F         ;IF REGS SAME
  564 ;
  565          MOVE.B  (A0)+,D6       ;FETCH NEXT CHAR
  566          BRA     REGLST2        ;CONTINUE
  567 ;
  568 REGLSTX  RTS                    ;DONE
  569 ;
  570          PAGE
  571 ; COPYRIGHT 1987 DTACK GROUNDED INC
  572 ;
  573 ; SUBROUTINE;  CONV A REG TO NUMBER 0 - 15
  574 ; (E.G. D0 = 0,  D7 = 7,  A0 = 8,  A7 = 15)
  575 ; A0 = PTR TO TEXT
  576 ;
  577 REGNUM   MOVEQ   #0,D4          ;ASSUME "D"
  578          MOVE.B  (A0)+,D6       ;FETCH CHAR
  579          CMPI.B  #"D",D6        ;"D" ?
  580          BEQ     REGNUM1        ;IF SO
  581 ;
  582          CMPI.B  #"A",D6        ;"A" ?
  583          BNE     ERR6F          ;IF NOT
  584 ;
  585          MOVEQ   #8,D4          ;"A" = 8
  586 ;
  587 REGNUM1  MOVE.B  (A0)+,D6       ;MUST BE #
  588          SUBI.B  #"0",D6        ;MUST BE 0 - 7
  589          CMPI.B  #8,D6          ;LEGAL REG # ?
  590          BCC     ERR6F          ;IF NOT
  591 ;
  592          ADD.B   D6,D4          ;REG CONVERTED
  593          RTS                    ;DONE
  594 ;
  595 ;
  596 ;
  597 ; 'MOVEA <EA>,AN':  SIZE .W, .L;  ALL ADR MODES
  598 ;
  599 MOVEA    BRA     TYPE8          ;SAME ON PASS1
  600 ;
  601          PAGE
  602 ; COPYRIGHT 1987 DTACK GROUNDED INC
  603 ;
  604 ; EVALUATE AN <EXPRESSION> WHOSE SYNTAX HAS
  605 ; ALREADY BEEN CHECKED AND BLESSED.
  606 ;
  607 ; A3 = <EXRESSION> PTR,  D1 = LENGTH
  608 ;
  609 EVALEXPR CLR.L   EXPRVALU       ;CLR <EXPR> VALUE
  610          CLR.B   OPERATOR       ;CLEAR OPERATOR
  611          CLR.B   NEGATE         ;CLR NEGATE FLG
  612          CLR.B   UDFFWD         ;CLR UNDEFINED FLG
  613          MOVEQ   #0,D6          ;CLR UPPER BITS
  614          CMPI.B  #"-",(A3)      ;MINUS SIGN ?
  615          BNE     EVEX1          ;IF NOT
  616 ;
  617          SUBQ.B  #1,NEGATE      ;SET NEGATE FLG
  618          SUBQ.B  #1,D1          ;DECR LENGTH
  619          ADDQ.L  #1,A3          ;INCR POINTER
  620 ;
  621 ; ELEMENT = ASC STR (D7 HIGH) IF QUOTE
  622 ;
  623 EVEX1    MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  624          CMPI.B  #$22,D6        ;QUOTE ?
  625          BEQ     SVCQUOTE       ;IF SO
  626 ;
  627 ; ELEMENT = ASC STR (D7 LOW) IF APOSTROPHE
  628 ;
  629          CMPI.B  #"'",D6        ;APOSTROPHE ?
  630          BEQ.L   SVCAPOST       ;IF SO
  631 ;
  632 ; ELEMENT = HEXADECIMAL NUMBER IF 1ST CHAR = "$"
  633 ;
  634          CMPI.B  #"$",D6        ;HEXADECIMAL ?
  635          BEQ.L   SVCHEX         ;IF SO
  636 ;
  637 ; ELEMENT = BINARY NUMBER IF 1ST CHAR = "%"
  638 ;
  639          CMPI.B  #"%",D6        ;BINARY ?
  640          BEQ.L   SVCBIN         ;IF SO
  641 ;
  642 ; ELEMENT = DECIMAL NUMBER IF 1ST CHAR = DECIMAL
  643 ;
  644          MOVE.B  (A1,D6),D3     ;CHAR ATTR BYTE
  645          BTST    #4,D3          ;DECIMAL ?
  646          BNE.L   SVCDEC         ;IF SO
  647 ;
  648 ; EVALUATE A LABEL REFERENCE;  FORWARD REF ?
  649 ;
  650          MOVE.L  #"    ",D7     ;SPACES
  651          LEA     STR+8,A5       ;PTR TO STR BUFR
  652          MOVE.L  D7,-(A5)       ;CLR STR BUFR
  653          MOVE.L  D7,-(A5)
  654          MOVE.B  D6,(A5)+       ;STORE 1ST CHAR
  655          SUBQ.B  #1,D1          ;DECR CHAR COUNT
  656          BEQ     EVEX3          ;DONE IF ZERO
  657 ;
  658 EVEX2    MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  659          MOVE.B  (A1,D6),D7     ;CHAR ATTR BYTE
  660          ANDI.B  #$30,D7        ;ALPHANUMERIC ?
  661          BEQ     EVEX4          ;IF NOT
  662 ;
  663          PAGE
  664 ; COPYRIGHT 1987 DTACK GROUNDED INC
  665 ;
  666          MOVE.B  D6,(A5)+       ;STORE REF CHAR
  667          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  668          BNE     EVEX2          ;LOOP 'TIL ZERO
  669 ;
  670 ; THE LABEL REFERENCE IS AT THE END OF THE
  671 ; <EXPRESSION>.
  672 ;
  673 EVEX3    BSR     CHKLBL         ;SVC LBL REF
  674          BEQ.L   EVEXX          ;IF FORWARD REF
  675          BNE.L   EVEX9          ;IF NOT FORWARD
  676 ;
  677 ; AN OPERATOR HAS TERMINATED THE LABEL REF
  678 ;
  679 EVEX4    BSR     CHKLBL         ;SVC LBL REF
  680          BEQ.L   EVEXX          ;IF FORWARD REF
  681          BNE.L   EVEXT          ;IF NOT FORWARD
  682 ;
  683 ; EVALUATE AN ASCII STRING (D7 LOW)
  684 ;
  685 SVCQUOTE SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  686          MOVEQ   #0,D3          ;CLR RESULT
  687 ;
  688 QUOTE1   MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  689          CMPI.B  #$22,D6        ;QUOTE ?
  690          BEQ     QUOTEX         ;IF SO
  691 ;
  692          BCLR    #7,D6          ;SET D7 HIGH
  693          LSL.L   #8,D3          ;SHIFT 8 BITS L
  694          ADD.B   D6,D3          ;ADD D6 TO D3
  695          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  696          BRA     QUOTE1         ;CONTINUE
  697 ;
  698 QUOTEX   SUBQ.B  #1,D1          ;DECR CHAR CNT
  699          BNE.L   EVEXT          ;IF NOT ZERO
  700 ;
  701 ; THE ASC STR IS AT THE END OF THE <EXPRESSION>
  702 ;
  703          BRA.L   EVEX9          ;CONTINUE
  704 ;
  705 ; EVALUATE AN ASCII STRING (D7 HIGH)
  706 ;
  707 SVCAPOST SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  708          MOVEQ   #0,D3          ;CLR RESULT
  709 ;
  710 APOST1   MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  711          CMPI.B  #"'",D6        ;APOSTROPHE ?
  712          BEQ     APOSTX         ;IF SO
  713 ;
  714          BSET    #7,D6          ;SET D7 LOW
  715          LSL.L   #8,D3          ;SHIFT 8 BITS L
  716          ADD.B   D6,D3          ;ADD D6 TO D3
  717          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  718          BRA     APOST1         ;CONTINUE
  719 ;
  720          PAGE
  721 ; COPYRIGHT 1987 DTACK GROUNDED INC
  722 ;
  723 APOSTX   SUBQ.B  #1,D1          ;DECR CHAR CNT
  724          BNE     EVEXT          ;IF NOT ZERO
  725 ;
  726 ; THE ASC STR IS AT THE END OF THE <EXPRESSION>
  727 ;
  728          BRA     EVEX9          ;CONTINUE
  729 ;
  730 ; EVALUATE A HEXADECIMAL NUMBER
  731 ;
  732 SVCHEX   SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  733          MOVEQ   #0,D3          ;CLR RESULT
  734 ;
  735 EVEX5    MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  736          MOVE.B  (A1,D6),D7     ;CHAR ATTR BYTE
  737          BTST    #1,D7          ;HEXADECIMAL ?
  738          BEQ     EVEXT          ;IF NOT
  739 ;
  740          SUBI.B  #"0",D6        ;SUBTRACT "0"
  741          CMPI.B  #10,D6         ;OVER #9 ?
  742          BCS     EVEX6          ;DONE IF NOT
  743 ;
  744          SUBQ.B  #7,D6          ;D6 = A - F
  745 ;
  746 EVEX6    LSL.L   #4,D3          ;SHIFT 4 BITS L
  747          OR.L    D6,D3          ;ADD D6 TO D3
  748          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  749          BNE     EVEX5          ;LOOP 'TIL ZERO
  750 ;
  751 ; THE HEXADECIMAL NUMBER IS AT THE END OF THE
  752 ; <EXPRESSION>.
  753 ;
  754          BRA     EVEX9          ;CONTINUE
  755 ;
  756 ; EVALUATE A BINARY NUMBER
  757 ;
  758 SVCBIN   MOVEQ   #0,D2          ;INIT BIN CHAR CNT
  759          MOVEQ   #0,D3          ;CLEAR RESULT
  760 ;
  761 EVEX7    MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  762          MOVE.B  D6,D3          ;LEAVE CHAR IN D6
  763          SUBI.B  #"0",D7        ;SUBTRACT OFFSET
  764          CMPI.B  #1,D7          ; "0" OR "1" ?
  765          BHI     EVEXT          ;IF NOT
  766 ;
  767          LSR.B   #1,D6          ;LEAST BIT TO CY
  768          ROXL.L  #1,D3          ;BIT INTO D3.L
  769          ADDQ.B  #1,D2          ;INCR BIN CHAR CNT
  770          SUBQ.B  #1,D1          ;DEXR <EXPR> CNT
  771          BNE     EVEX7          ;LOOP 'TIL ZERO
  772 ;
  773 ; THE BINARY # IS AT THE END OF THE <EXPRESSION>
  774 ;
  775          BRA     EVEX9          ;CONTINUE
  776 ;
  777          PAGE
  778 ; COPYRIGHT 1987 DTACK GROUNDED INC
  779 ;
  780 ; EVALUATE A DECIMAL NUMBER
  781 ;
  782 SVCDEC   MOVEQ   #0,D3          ;CLEAR D3
  783          SUBI.B  #"0",D6        ;D6 = 0 TO 9
  784          MOVE.B  D6,D3          ;FIRST DEC #
  785          MOVEQ   #1,D2          ;DEC CHAR COUNT
  786          SUBQ.B  #1,D1          ;DECR CHAR COUNT
  787          BEQ     EVEX9          ;DONE IF ZERO
  788 ;
  789 EVEX8    MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  790          MOVE.B  (A1,D6),D7     ;CHAR ATTR BYTE
  791          ANDI.B  #$10,D7        ;DECIMAL ?
  792          BEQ     EVEXT          ;IF NOT
  793 ;
  794          ADD.L   D3,D3          ;DOUBLE D3
  795          MOVE.L  D3,D7
  796          LSL.L   #2,D3          ;D3 = D3 * 4
  797          ADD.L   D7,D3          ;D3 = D3 * 10
  798          SUBI.B  #"0",D6        ;D6 = 0 TO 9
  799          ADD.L   D6,D3          ;ADD DECIMAL VALUE
  800          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  801          BNE     EVEX8          ;LOOP 'TIL ZERO
  802 ;
  803 ; THE DECIMAL # IS AT THE END OF THE <EXPRESSION>
  804 ;
  805 EVEX9    BSR     SEVEXT         ;DO REQ'D OPS
  806          MOVEQ   #1,D6          ;BACKWARD REF
  807 EVEXX    RTS                    ;DONE
  808 ;
  809 ; AN OPERATOR HAS TERMINATED AN ELEMENT
  810 ;
  811 EVEXT    BSR     SEVEXT         ;DO REQUIRED OPS
  812          MOVE.B  D6,OPERATOR    ;STORE NEW OPRTR
  813          SUBQ.B  #1,D1          ;DECR CHAR COUNT
  814          BRA     EVEX1          ;IF NOT ZERO
  815 ;
  816 ; SUBROUTINE;  SVC PREVIOUS OPERATORS OR NEGATE
  817 ;
  818 SEVEXT   TST.B   OPERATOR       ;FIRST ELEMENT ?
  819          BEQ     SEVEXT1        ;IF SO
  820 ;
  821          BSR     OPERTN         ;DO PREV OPERATION
  822 ;
  823 SEVEXT1  TST.B   NEGATE         ;NEGATE FLG SET ?
  824          BEQ     SEVEXTX        ;IF NOT
  825 ;
  826          MOVEQ   #0,D2
  827          SUB.L   D3,D2          ;NEGATE D3.L
  828          MOVE.L  D2,D3
  829          CLR.B   NEGATE         ;CLR NEGATE FLG
  830 ;
  831 SEVEXTX  MOVE.L  D3,EXPRVALU    ;STORE VALUE
  832          RTS                    ;DONE
  833 ;
  834          PAGE
  835 ; COPYRIGHT 1987 DTACK GROUNDED INC
  836 ;
  837 ; THE VALUE OF THE CURRENT <EXPR> ELEMENT IS IN
  838 ; D3.L, AND THE PREVIOUS VALUE IS IN 'EXPRVALU'.
  839 ; THE SEPARATING OPERATOR IS IN 'OPERATOR'.
  840 ;
  841 OPERTN   MOVEM.L D0-D2/D4-D7,-(A;SAVE REGS
  842          MOVE.L  EXPRVALU,D2    ;FETCH PREV VALUE
  843          MOVE.B  OPERATOR,D1    ;FETCH OPERATOR
  844          CMPI.B  #"+",D1        ;ADD ?
  845          BNE     OPERTN1        ;IF NOT
  846 ;
  847          ADD.L   D2,D3          ;RESULT D3.L
  848          BRA     OPERTNX        ;CONTINUE
  849 ;
  850 OPERTN1  CMPI.B  #"-",D1        ;SUBTRACT ?
  851          BNE     OPERTN2        ;IF NOT
  852 ;
  853          SUB.L   D3,D2          ;SUBTRACT
  854          MOVE.L  D2,D3          ;RESULT D3.L
  855          BRA     OPERTNX        ;CONTINUE
  856 ;
  857 OPERTN2  CMPI.B  #"*",D1        ;MULTIPLY ?
  858          BNE     OPERTN3        ;IF NOT
  859 ;
  860 ; MULTIPLY 32 BITS * 32 BITS, RESULT 32 BITS
  861 ; D3 = A.HI B.LO,  D2 = C.HI D.LO
  862 ;
  863          MOVE.W  D2,D7          ;D7 = D
  864          MOVE.W  D2,D6          ;D6 = D
  865          SWAP    D2             ;D2 = C
  866          MULU    D3,D7          ;B * D
  867          MULU    D3,D2          ;B * C
  868          SWAP    D2
  869          CLR.W   D2             ;REG'S ALIGNED
  870          ADD.L   D6,D7          ;B*C + B*D
  871          SWAP    D3             ;D3 = A
  872          MULU    D3,D6
  873          SWAP    D6
  874          CLR.W   D6             ;REG'S ALIGNED
  875          ADD.L   D6,D7          ;32-BIT PRODUCT
  876          MOVE.L  D7,D3          ;RESULT D3.L
  877          MOVEQ   #0,D6          ;CLR UPPER BITS
  878          BRA     OPERTNX        ;CONTINUE
  879 ;
  880 OPERTN3  CMPI.B  #"/",D1        ;DIVIDE ?
  881          BNE     OPERTN4        ;IF NOT
  882 ;
  883          NOP
  884 ;
  885 OPERTN4  CMPI.B  #"&",D1        ;LOGICAL AND ?
  886          BNE     OPERTN5        ;IF NOT
  887 ;
  888          AND.L   D2,D3          ;PERFORM AND
  889          BRA     OPERTNX        ;CONTINUE
  890 ;
  891 ; MUST BE LOGICAL OR
  892 ;
  893 OPERTN5  OR.L    D2,D3          ;PERFORM OR
  894 ;
  895 OPERTNX  CLR.B   OPERATOR
  896          MOVEM.L (A7)+,D0-D2/D4-;RESTORE REGS
  897          RTS                    ;OPERATION DONE
  898 ;
  899          PAGE
  900 ; COPYRIGHT 1987 DTACK GROUNDED INC
  901 ;
  902 ; CHECK THE SYNTAX OF AN <EXPRESSION>
  903 ;
  904 ; AN EXPRESSION COMPRISES ONE OR MORE ELEMENTS;
  905 ; MULTIPLE ELEMENTS ARE SEPARATED BY OPERATORS.
  906 ;
  907 ; ELEMENTS ARE LABEL REFERENCES, DECIMAL NUMBERS,
  908 ; HEXADECIMAL NUMBERS, BINARY NUMBERS, AND ASCII
  909 ; STRINGS.
  910 ;
  911 ; OPERATORS INCLUDE THE FUNDAMENTAL FOUR MATH TYPES
  912 ; (+,-,*,/) PLUS THE TWO BINARY LOGICAL OPERATORS
  913 ; "&" (AND) AND "!" (OR).
  914 ;
  915 ; A LEADING "-" IS PERMITTED (NEGATION)
  916 ;
  917 ; A3 = <EXPRESSION> PTR,  D1 = LENGTH
  918 ;
  919 CHKEXPR  CMPI.B  #"-",(A3)      ;MINUS SIGN ?
  920          BNE     CHKEX1         ;IF NOT
  921 ;
  922          ADDQ.L  #1,A3          ;INCR POINTER
  923          SUBQ.B  #1,D1          ;DECR COUNT
  924          BEQ     ERR37J         ;<EXPR> MISSING
  925 ;
  926 ; ELEMENT = ASCII STR (D7 HIGH) IF QUOTE
  927 ;
  928 CHKEX1   MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  929          CMPI.B  #$22,D6        ;QUOTE ?
  930          BEQ     QUOTE          ;IF SO
  931 ;
  932 ; ELEMENT = ASCII STR (D7 LOW) IF APOSTROPHE
  933 ;
  934          CMPI.B  #"'",D6        ;APOSTROPHE ?
  935          BEQ.L   APOST          ;IF SO
  936 ;
  937 ; ELEMENT = HEXADECIMAL NUMBER IF 1ST CHAR = "$"
  938 ;
  939          CMPI.B  #"$",D6        ;HEXADECIMAL ?
  940          BEQ.L   SVCHEX1        ;IF SO
  941 ;
  942 ; ELEMENT = BINARY NUMBER IF 1ST CHAR = "%"
  943 ;
  944          CMPI.B  #"%",D6        ;BINARY ?
  945          BEQ.L   SVCBIN1        ;IF SO
  946 ;
  947 ; ELEMENT = DECIMAL NUMBER IF 1ST CHAR = DECIMAL
  948 ;
  949          MOVE.B  (A1,D6),D3     ;CHAR ATTR BYTE
  950          BTST    #4,D3          ;DECIMAL ?
  951          BNE.L   SVCDEC1        ;IF SO
  952 ;
  953 ;
  954 ; CHECK SYNTAX OF LABEL REFERENCE
  955 ;
  956          BTST    #5,D3          ;ALPHABETIC ?
  957          BEQ     ERR39J         ;BAD <EXPR> CHAR
  958 ;
  959          PAGE
  960 ; COPYRIGHT 1987 DTACK GROUNDED INC
  961 ;
  962          MOVEQ   #1,D2          ;REF CHAR COUNT
  963          SUBQ.B  #1,D1          ;DECR CHAR COUNT
  964          BEQ     CHKEXX         ;DONE IF ZERO
  965 ;
  966 CHKEX2   MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  967          MOVE.B  (A1,D6),D3     ;CHAR ATTR BYTE
  968          ANDI.B  #$30,D3        ;ALPHANUMERIC ?
  969          BEQ.L   CHKEXT         ;IF NOT
  970 ;
  971          ADDQ.B  #1,D2          ;INCR REF CHAR CNT
  972          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  973          BNE     CHKEX2         ;LOOP 'TIL ZERO
  974 ;
  975          CMPI.B  #9,D2          ;TOO MANY CHARS ?
  976          BCC     ERR33J         ;IF SO
  977 ;
  978 CHKEXX   RTS                    ;NO <EXPR> ERRS
  979 ;
  980 ;
  981 ; CHECK SYNTAX OF ASC STR (D7 = HIGH)
  982 ;
  983 QUOTE    MOVEQ   #0,D2          ;INIT STR CHAR CNT
  984          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  985          BEQ     ERR43J         ;NO STR CHARS
  986 ;
  987 QUOT1    MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
  988          CMPI.B  #$22,D6        ;QUOTE ?
  989          BEQ     QUOTX          ;IF SO
  990 ;
  991          MOVE.B  (A1,D6),D3     ;CHAR ATTR BYTE
  992          BPL     ERR28I         ;IF NOT PRINT'BL
  993 ;
  994          ADDQ.B  #1,D2          ;INCR STR CHAR CNT
  995          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
  996          BNE     QUOT1          ;IF NOT ZERO
  997 ;
  998 ; END OF <EXPRESSION>;  NO CLOSING QUOTE (")
  999 ;
 1000          MOVEQ   #44,D7         ;NO LAST QUOTE
 1001 ERRJ     BRA     ERROR          ;REPORT ERROR
 1002 ;
 1003 ERR37J   BRA     ERR37I
 1004 ERR43J   BRA     ERR43I
 1005 ERR39J   BRA     ERR39I
 1006 ;
 1007 ; CLOSING QUOTE FOUND;  CHK FOR 1 TO 4 CHARS
 1008 ;
 1009 QUOTX    CMPI.B  #5,D2          ;TOO MANY CHARS ?
 1010          BCC     ERR42I         ;IF TOO MANY
 1011 ;
 1012          TST.B   D2             ;CHARS ?
 1013          BEQ     ERR43I         ;IF NO ASC CHARS
 1014 ;
 1015          SUBQ.B  #1,D1          ;ADJ FOR QUOTE
 1016          BNE.L   CHKEXT         ;IF NOT <EXPR> END
 1017 ;
 1018          RTS                    ;NO <EXPR> ERRS
 1019 ;
 1020          PAGE
 1021 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1022 ;
 1023 ERR37I   MOVEQ   #37,D7         ;<EXPR> MISSING
 1024          BRA     ERRJ
 1025 ;
 1026 ERR33J   MOVEQ   #33,D7         ;LBL REF TOO LONG
 1027          BRA     ERRJ
 1028 ;
 1029 ;
 1030 ;
 1031 ; CHECK SYNTAX OF ASCII STRING (D7 = LOW)
 1032 ;
 1033 APOST    MOVEQ   #0,D2          ;INIT STR CHAR CNT
 1034          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
 1035          BEQ     ERR43I         ;NO STR CHARS
 1036 ;
 1037 APOS1    MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
 1038          CMPI.B  #"'",D6        ;APOSTROPHE ?
 1039          BEQ     QUOTX          ;IF SO
 1040 ;
 1041          TST.B   (A1,D6)        ;CHAR ATTR BYTE
 1042          BPL     ERR28I         ;IF NOT PRINT'BL
 1043 ;
 1044          ADDQ.B  #1,D2          ;INCR STR CHAR CNT
 1045          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
 1046          BNE     APOS1          ;IF NOT ZERO
 1047 ;
 1048 ; END OF <EXPRESSION>;  NO CLOSING APOSTROPHE
 1049 ;
 1050          MOVEQ   #45,D7         ;NO LAST APOST
 1051          BRA     ERRI           ;REPORT ERROR
 1052 ;
 1053 ;
 1054 ;
 1055 ; CHECK SYNTAX OF HEXADECIMAL NUMBER
 1056 ;
 1057 SVCHEX1  MOVEQ   #0,D2          ;INIT HEX CHAR CNT
 1058          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
 1059          BEQ     ERR17I         ;NO HEX CHARS
 1060 ;
 1061 CHKEX3   MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
 1062          MOVE.B  (A1,D6),D3     ;CHAR ATTR BYTE
 1063          BTST    #1,D3          ;HEXADECIMAL ?
 1064          BEQ     SVCHEXX        ;IF NOT
 1065 ;
 1066          ADDQ.B  #1,D2          ;INCR HEX CHAR CNT
 1067          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
 1068          BNE     CHKEX3         ;LOOP 'TIL ZERO
 1069 ;
 1070 ; END OF <EXPRESSION>;  CHK HEX CHAR COUNT
 1071 ;
 1072 SVCHEX2  CMPI.B  #9,D2          ;TOO MANY CHARS ?
 1073          BCC     ERR18I         ;IF TOO MANY
 1074 ;
 1075          RTS                    ;NO <EXPR> ERRS
 1076 ;
 1077 SVCHEXX  BSR     SVCHEX2        ;TOO MANY CHARS ?
 1078          TST.B   D2             ;CHARS ?
 1079          BNE     CHKEXT         ;IF SO
 1080          BEQ     ERR17I         ;IF NO HEX CHARS
 1081 ;
 1082          PAGE
 1083 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1084 ;
 1085 ERR28I   MOVEQ   #28,D7         ;CHAR NOT PRNT'BL
 1086          BRA     ERRI
 1087 ;
 1088 ERR42I   MOVEQ   #42,D7         ;TOO MANY CHARS
 1089          BRA     ERRI
 1090 ;
 1091 ERR43I   MOVEQ   #43,D7         ;NO ASC CHARS
 1092          BRA     ERRI
 1093 ;
 1094 ERR17I   MOVEQ   #17,D7         ;NO HEX CHARS
 1095          BRA     ERRI
 1096 ;
 1097 ERR18I   MOVEQ   #18,D7         ;TOO MANY CHARS
 1098          BRA     ERRI
 1099 ;
 1100 ERR39I   MOVEQ   #39,D7         ;BAD <EXPR> CHAR
 1101          BRA     ERRI
 1102 ;
 1103 ERR34I   MOVEQ   #34,D7         ;NO BINARY CHARS
 1104          BRA     ERRI
 1105 ;
 1106 ERR35I   MOVEQ   #35,D7         ;TOO MANY CHARS
 1107          BRA     ERRI
 1108 ;
 1109 ERR36I   MOVEQ   #36,D7         ;TOO MANY CHARS
 1110          BRA     ERRI
 1111 ;
 1112 ERR38I   MOVEQ   #38,D7         ;OPERATOR EXP'CTD
 1113          BRA     ERRI
 1114 ;
 1115 ERR40I   MOVEQ   #40,D7         ;ELEMENT MISSING
 1116 ERRI     BRA     ERROR
 1117 ;
 1118 ;
 1119 ;
 1120 ; CHECK SYNTAX OF BINARY NUMBER
 1121 ;
 1122 SVCBIN1  MOVEQ   #0,D2          ;INIT BIN CHAR CNT
 1123          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
 1124          BEQ     ERR34I         ;NO BINARY CHARS
 1125 ;
 1126 CHKEX4   MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
 1127          MOVE.B  D6,D3          ;LEAVE CHAR IN D6
 1128          SUBI.B  #"0",D3        ;SUBTRACT OFFSET
 1129          CMPI.B  #1,D3          ; "0" OR "1" ?
 1130          BHI     CHKEXT         ;IF NOT
 1131 ;
 1132          ADDQ.B  #1,D2          ;INCR BIN CHAR CNT
 1133          SUBQ.B  #1,D1          ;DEXR <EXPR> CNT
 1134          BNE     CHKEX4         ;LOOP 'TIL ZERO
 1135 ;
 1136 ; END OF <EXPRESSION>;  CHK BIN CHAR COUNT
 1137 ;
 1138          CMPI.B  #33,D2         ;TOO MANY CHARS ?
 1139          BCC     ERR35I         ;IF SO
 1140 ;
 1141          RTS                    ;NO <EXPR> ERRS
 1142 ;
 1143          PAGE
 1144 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1145 ;
 1146 ; CHECK SYNTAX OF DECIMAL NUMBER
 1147 ;
 1148 SVCDEC1  MOVEQ   #1,D2          ;DEC CHAR COUNT
 1149          SUBQ.B  #1,D1          ;DECR CHAR COUNT
 1150          BEQ     CHKEXX         ;DONE IF ZERO
 1151 ;
 1152 CHKEX5   MOVE.B  (A3)+,D6       ;FETCH NEXT CHAR
 1153          MOVE.B  (A1,D6),D3     ;CHAR ATTR BYTE
 1154          ANDI.B  #$10,D3        ;DECIMAL ?
 1155          BEQ     CHKEXT         ;IF NOT
 1156 ;
 1157          ADDQ.B  #1,D2          ;INCR DEC CHAR CNT
 1158          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
 1159          BNE     CHKEX5         ;LOOP 'TIL ZERO
 1160 ;
 1161 ; END OF <EXPRESSION>;  CHK DEC CHAR COUNT
 1162 ;
 1163          CMPI.B  #11,D2         ;TOO MANY CHARS ?
 1164          BCC     ERR36I         ;IF SO
 1165 ;
 1166          RTS                    ;NO <EXPR> ERRS
 1167 ;
 1168 ;
 1169 ; WE HAVE FOUND THE END OF AN ELEMENT;  IS THIS
 1170 ; CHARACTER A LEGAL TERMINATOR (OPERATOR) ?
 1171 ;
 1172 ; FIRST CHECK WHETHER A FIELD EXISTS  (CNT > 0 ?)
 1173 ;
 1174 CHKEXT   TST.B   D2             ;FIELD CNT ZERO ?
 1175          BEQ     ERR39I         ;BAD <EXPR> CHAR
 1176 ;
 1177 ; CHECK FOR AN OPERATOR  (+,-,*,/,&,!)
 1178 ;
 1179          MOVE.B  (A1,D6),D3     ;CHAR ATTR BYTE
 1180          BTST    #2,D3          ;OPERATOR ?
 1181          BEQ     ERR38I         ;OPERATOR EXP'CTD
 1182 ;
 1183 ; LEGAL OPERATOR FOUND;  CHK NEXT ELEMENT
 1184 ;
 1185          SUBQ.B  #1,D1          ;DECR <EXPR> CNT
 1186          BNE     CHKEX1         ;CONTINUE
 1187          BEQ     ERR40I         ;ELEMENT MISSING
 1188 ;
 1189 ;
 1190 XFR      MOVE.L  SRC,A0         ;SRC PTR
 1191          MOVE.L  DEST,A5        ;DEST PTR
 1192          MOVE.L  LINEPTR,D0     ;PTR TO NULL LINK
 1193          SUB.L   TEXT,D0        ;D0 = BYTE COUNT
 1194          LSR.W   #4,D0          ;DIVIDE BY 16
 1195          MOVE.W  D0,(A5)+       ;STORE 16 COUNT
 1196 ;
 1197 XFR1     MOVE.L  (A0)+,(A5)+    ;MOVE 16 BYTES
 1198          MOVE.L  (A0)+,(A5)+
 1199          MOVE.L  (A0)+,(A5)+
 1200          MOVE.L  (A0)+,(A5)+
 1201          DBF     D0,XFR1        ;XFR 32K BYTES
 1202 ;
 1203          RTS                    ;DONE
 1204 ;
 1205          PAGE
 1206 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1207 ;
 1208 ; CHECK FOR A WEIRD LABEL (SP, SR, CCR, USP, SSP)
 1209 ; RETURN WITH Z FLAG SET IF NOT FOUND
 1210 ;
 1211 ; A2 = FIELD PTR         D0 = FIELD COUNT
 1212 ; (A0, A1, A2, D0 ARE PRESERVED)
 1213 ;
 1214 CHKWEIRD LEA     WTBL,A3        ;PTR TO TABLE
 1215          MOVEQ   #1,D1          ;INIT WEIRD I.D.
 1216          MOVEQ   #0,D6          ;CLR UPPER BITS
 1217 ;
 1218 CWE1     MOVE.B  (A3)+,D6       ;FETCH LINK
 1219          BEQ     CWEX           ;IF LINK IS ZERO
 1220 ;
 1221          CMP.B   D0,D6          ;LENGTH SAME ?
 1222          BNE     CWE3           ;IF NOT
 1223 ;
 1224          MOVE.L  A2,A5          ;PTR 1
 1225          MOVE.L  A3,A6          ;PTR 2
 1226          MOVE.B  D6,D2          ;STR COUNT
 1227 ;
 1228 CWE2     MOVE.B  (A5)+,D3       ;FETCH A CHAR
 1229          CMP.B   (A6)+,D3       ;CHARS MATCH ?
 1230          BNE     CW3            ;IF NOT
 1231 ;
 1232          SUBQ.B  #1,D2          ;DECR STR COUNT
 1233          BNE     CWE2           ;LOOP 'TIL ZERO
 1234 ;
 1235 ; A MATCH TO THE WEIRD STRING WAS FOUND !
 1236 ; (STORING THE I.D. CLEARS THE Z FLAG)
 1237 ;
 1238          MOVE.B  D1,WEIRD       ;STORE WEIRD I.D.
 1239 CWEX     RTS                    ;DONE
 1240 ;
 1241 ; THE STRINGS (OR LENGTHS) DID NOT MATCH
 1242 ;
 1243 CWE3     ADD.L   D6,A3          ;PTR TO NEXT STR
 1244          ADDQ.B  #1,D1          ;INCR WEIRD I.D.
 1245          BRA     CWE1           ;CHK NEXT STRING
 1246 ;
 1247          PAGE
 1248 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1249 ;
 1250 NUMFILE  EQU     $FFFE
 1251 ;
 1252 FNMS     MOVE.L  A3,-(A7)       ;SAVE A3
 1253          MOVE.L  TEXT,A0
 1254          MOVE.L  SHDW,A3        ;SHADOW ARRAY PTR
 1255          MOVE.L  FILETBL,D5     ;FILENAM$[] ADR
 1256          MOVEQ   #$FF,D2
 1257          MOVEQ   #$10,D6
 1258          MOVEQ   #$7F,D7        ;B7 MASK
 1259 ;
 1260 ; THE LABELS IN THE TEXT ARE FILENAMES
 1261 ;
 1262 SVCLABL  MOVE.L  D5,A5          ;LABEL ADR TO A5
 1263          MOVE.B  (A0)+,D1       ;LBL CHAR CNT TO D1
 1264          BEQ     FNMSX          ;IF ZERO
 1265 ;
 1266 ; STORE THE FILENAME COUNT IN THE SHADOW ARRAY
 1267 ;
 1268          MOVE.B  D1,(A3)+       ;FILENAME COUNT
 1269 ;
 1270 ; STORE A FILENAME IN ARRAY FILNAM$[256]16
 1271 ;
 1272 STORLBL  AND.B   D7,(A0)        ;MASK HI BIT
 1273          MOVE.B  (A0)+,(A5)+    ;STORE A CHAR
 1274          SUBQ.B  #1,D1          ;DECR CHAR CNT
 1275          BNE     STORLBL        ;LOOP 'TIL ZERO
 1276 ;
 1277          ADDQ.W  #1,D2          ;INCR NUMFILES%
 1278          ADD.L   D6,D5          ;INCR ADR
 1279          BRA     SVCLABL        ;NEXT LABEL
 1280 ;
 1281 FNMSX    MOVE.W  D2,NUMFILE     ;STORE NUMFILES%
 1282          MOVE.L  (A7)+,A3       ;RESTORE A3
 1283          RTS
 1284 ;
 1285 ; THIS IS USED AS A TEMPORARY LINE BUFFER
 1286 ;
 1287 LINE     NOP                    ;TEMP LINE BUFFER
