    1          PAGE
    2 ; COPYRIGHT 1987 DTACK GROUNDED INC:   PASS1A
    3 ;
    4 ;---------------------------------------
    5 ;-- FIND THE SIZE OF THE SOURCE FIELD --
    6 ;---------------------------------------
    7 ; (WHICH IS FOLLOWED BY A DESTINATION FIELD)
    8 ;
    9 ; THE TERMINATION CHARACTER IS A COMMA UNLESS
   10 ; THE COMMA IS CONTAINED WITHIN PARENTHESES
   11 ; OR WITHIN SINGLE OR DOUBLE QUOTES.
   12 ;
   13 ; RESULT:  A0 POINTS TO THE 1ST <EA> START
   14 ;          A2 POINTS TO THE 2ND <EA> START
   15 ;          D0 CONTAINS THE 1ST <EA> CHAR CNT
   16 ;
   17 SRCSIZE  MOVE.L  A0,A2          ;PTR TO FIELD
   18          MOVEQ   #0,D0          ;FIELD COUNT
   19 ;
   20 SRCZ     MOVE.B  (A2)+,D6       ;FETCH CHAR
   21          BEQ     SRCZX          ;IF LINE LINK
   22 ;
   23          CMPI.B  #",",D6        ;COMMA ?
   24          BEQ     SRCZX          ;IF COMMA
   25 ;
   26          CMPI.B  #"(",D6        ;L PARENS ?
   27          BEQ     SRCZ2          ;IF SO
   28 ;
   29          CMPI.B  #$22,D6        ;QUOTE ?
   30          BEQ     SRCZ3          ;IF SO
   31 ;
   32          CMPI.B  #"'",D6        ;APOSTROPHE ?
   33          BEQ     SRCZ4          ;IF SO
   34 ;
   35          TST.B   (A1,D6)        ;PRINTABLE CHAR ?
   36          BPL     ERR48B         ;IF NOT
   37 ;
   38 SRCZ1    ADDQ.B  #1,D0          ;INCR FIELD SIZE
   39          BRA     SRCZ           ;NEXT CHAR
   40 ;
   41 ; FIND THE CLOSING (RIGHT) PARENTHESIS
   42 ;
   43 SRCZ2    MOVE.B  (A2)+,D6       ;FETCH CHAR
   44          BEQ     ERR30B         ;IF LINE LINK
   45 ;
   46          ADDQ.B  #1,D0          ;INCR FIELD SIZE
   47          CMPI.B  #")",D6        ;R PARENS ?
   48          BEQ     SRCZ1          ;IF SO
   49 ;
   50          TST.B   (A1,D6)        ;PRINTABLE CHAR ?
   51          BMI     SRCZ2          ;NEXT CHAR IF SO
   52          BPL     ERR48B         ;IF NOT
   53 ;
   54 ; FIND THE CLOSING QUOTE CHARACTER
   55 ;
   56 SRCZ3    MOVE.B  (A2)+,D6       ;FETCH CHAR
   57          BEQ     ERR44B         ;IF LINE LINK
   58 ;
   59          PAGE
   60 ; COPYRIGHT 1987 DTACK GROUNDED INC
   61 ;
   62          ADDQ.B  #1,D0          ;INCR FIELD SIZE
   63          CMPI.B  #$22,D6        ;QUOTE ?
   64          BEQ     SRCZ1          ;IF SO
   65 ;
   66          TST.B   (A1,D6)        ;PRINTABLE CHAR ?
   67          BMI     SRCZ3          ;IF SO
   68          BPL     ERR48B         ;IF NOT
   69 ;
   70 ; FIND THE CLOSING SINGLE QUOTE (APOSTROPHE)
   71 ;
   72 SRCZ4    MOVE.B  (A2)+,D6       ;NEXT CHAR
   73          BEQ     ERR45B         ;IF LINE LINK
   74 ;
   75          ADDQ.B  #1,D0          ;INCR FIELD SIZE
   76          CMPI.B  #"'",D6        ;APOSTROPHE ?
   77          BEQ     SRCZ1          ;IF SO
   78 ;
   79          TST.B   (A1,D6)        ;PRINTABLE CHAR ?
   80          BMI     SRCZ4          ;IF SO
   81          BPL     ERR48B         ;IF NOT
   82 ;
   83 ; THE SRC <EA>-TERMINATING COMMA HAS BEEN FOUND
   84 ;
   85 SRCZX    TST.B   D0             ;SIZE = 0 ?
   86          BEQ     ERR8B          ;<EA> NOT FOUND
   87 ;
   88          RTS                    ;'SRCSIZE' DONE
   89 ;
   90 ;
   91 ERR30B   MOVEQ   #30,D7         ;UNMATCHED PARENS
   92          BRA     ERRB
   93 ;
   94 ERR8B    MOVEQ   #8,D7          ;<EA> NOT FOUND
   95          BRA     ERRB
   96 ;
   97 ERR48B   MOVEQ   #48,D7         ;BAD <EA> CHAR
   98          BRA     ERRB
   99 ;
  100 ERR44B   MOVEQ   #44,D7         ;NO CLOSING QUOTE
  101          BRA     ERRB
  102 ;
  103 ERR45B   MOVEQ   #45,D7         ;NO CLOSING APOST
  104 ERRB     BRA     ERROR
  105 ;
  106 ;
  107 ;--------------------------------------------
  108 ;-- FIND THE SIZE OF THE DESTINATION FIELD --
  109 ;--------------------------------------------
  110 ;
  111 ; FIND THE # OF CHRS IN THE SOURCE (ONLY) FIELD
  112 ; (OR IN THE DESTINATION FIELD IF TWO <EA>S)
  113 ;
  114 ; RETURN THE # OF CHARS IN D0
  115 ;
  116 ; TERMINATORS ARE THE NEXT LINE LINK, A SPACE CHAR,
  117 ; OR A SEMICOLON (COMMENT FIELD) PROVIDED THE
  118 ; SPACE CHAR OR SEMICOLON ARE NOT WITHIN SINGLE
  119 ; OR DOUBLE QUOTES.
  120 ;
  121          PAGE
  122 ; COPYRIGHT 1987 DTACK GROUNDED INC
  123 ;
  124 ; A0 = PTR TO <EA> FIELD
  125 ; A1 = PTR TO CHAR ATTRIBUTE TABLE
  126 ;
  127 DESTSIZE MOVE.L  A0,A2          ;PTR TO FIELD
  128          MOVEQ   #0,D0          ;FIELD COUNT
  129 ;
  130 SRCS     MOVE.B  (A2)+,D6       ;FETCH CHAR
  131          BEQ     SRCSX          ;IF LINE LINK
  132 ;
  133          CMPI.B  #" ",D6        ;SPACE ?
  134          BEQ     SRCSX          ;IF SPACE
  135 ;
  136          CMPI.B  #"             ;",D6 ;SEMICOLON ?
  137          BEQ     SRCSX          ;IF SEMICOLON
  138 ;
  139          CMPI.B  #$22,D6        ;QUOTE ?
  140          BEQ     SRCS2          ;IF SO
  141 ;
  142          CMPI.B  #"'",D6        ;APOSTROPHE ?
  143          BEQ     SRCS3          ;IF SO
  144 ;
  145          TST.B   (A1,D6)        ;PRINTABLE CHAR ?
  146          BPL     ERR48B         ;UNPRINTABLE CHAR
  147 ;
  148 SRCS1    ADDQ.B  #1,D0          ;INCR FIELD SIZE
  149          BRA     SRCS           ;NEXT CHAR
  150 ;
  151 ; FIND THE CLOSING QUOTE CHARACTER
  152 ;
  153 SRCS2    MOVE.B  (A2)+,D6       ;NEXT CHAR
  154          BEQ     ERR44B         ;IF LINE LINK
  155 ;
  156          ADDQ.B  #1,D0          ;INCR FIELD SIZE
  157          CMPI.B  #$22,D6        ;QUOTE ?
  158          BEQ     SRCS1          ;IF SO
  159 ;
  160          TST.B   (A1,D6)        ;PRINTABLE CHAR ?
  161          BMI     SRCS2          ;IF SO
  162          BRA     ERR48B         ;IF NOT
  163 ;
  164 ; FIND THE CLOSING SINGLE QUOTE (APOSTROPHE)
  165 ;
  166 SRCS3    MOVE.B  (A2)+,D6       ;NEXT CHAR
  167          BEQ     ERR45B         ;IF LINE LINK
  168 ;
  169          ADDQ.B  #1,D0          ;INCR FIELD SIZE
  170          CMPI.B  #"'",D6        ;APOSTROPHE ?
  171          BEQ     SRCS1          ;IF SO
  172 ;
  173          TST.B   (A1,D6)        ;PRINTABLE CHAR ?
  174          BMI     SRCS3          ;IF SO
  175          BRA     ERR48B         ;IF NOT
  176 ;
  177 ; A DEST <EA>-TERMINATING CHAR HAS BEEN FOUND
  178 ;
  179 SRCSX    TST.B   D0             ;SIZE = 0 ?
  180          BEQ     ERR8B          ;<EA> NOT FOUND
  181 ;
  182          RTS                    ;'DESTSIZE' DONE
  183 ;
  184          PAGE
  185 ; COPYRIGHT 1987 DTACK GROUNDED INC
  186 ;
  187 ;-------------------------------------------
  188 ;-- SEARCH FOR A LABEL IN THE LABEL TABLE --
  189 ;-------------------------------------------
  190 ;
  191 ; CHECK THE LABEL TABLE TO SEE IF A LABEL IS A
  192 ; FORWARD OR BACKWARD REFERENCE
  193 ;
  194 CHKLBL   LEA     STR,A5         ;PTR TO LABEL REF
  195          MOVE.L  (A5)+,D2       ;REF IN D2.L, D3.L
  196          MOVE.L  (A5)+,D3
  197 ;
  198 ; THE LABEL (8 BYTES) IS CONTAINED IN D2.L, D3.L
  199 ; D0/D1/D6 AND A0-A3 ARE PRESERVED
  200 ; IF THE REFERENCE IS BACKWARD, D3.L = REF ADR
  201 ; IF THE REFERENCE IS FORWARD, D7 = 0
  202 ; RETURN WITH ZFLG CLR IF BACK REF, SET IF FWD
  203 ;
  204          MOVEM.L D0/D1/A0-A2,-(A;SAVE REGS
  205          MOVE.L  LBLN,D0        ;NLBLS X 12 BYTES
  206          MOVE.W  LBLI,D1        ;BINARY ITERATIONS
  207          MOVE.L  LBLTBL,A0      ;START OF LBL TBL
  208          MOVE.L  A0,A1          ;COPY PTR
  209          CMP.L   (A1)+,D2       ;4 BYTES MATCH ?
  210          BNE     CHKLBL1        ;IF NOT
  211 ;
  212          CMP.L   (A1)+,D3       ;LABEL MATCH ?
  213          BEQ     LBLFOUND       ;IF SO
  214 ;
  215 CHKLBL1  BCS     CHKLBLX        ;IF DONE
  216 ;
  217          ADD.L   D0,A0          ;START IN MIDDLE
  218 ;
  219 ; BINARY SEARCH TO FIND A MATCHING LABEL
  220 ;
  221 CHKSRCH  LSR.W   #1,D0          ;HALVE THE ADDER
  222          MOVE.L  A0,A1          ;COPY THE PTR
  223          CMP.L   (A1)+,D2       ;COMPARE 1ST 4
  224          BNE     CHKSRCH1       ;IF NOT EQUAL
  225 ;
  226          CMP.L   (A1)+,D3       ;COMPARE LEAST 4
  227          BNE     CHKSRCH1       ;IF NOT EQUAL
  228 ;
  229 ; THE TWO LABELS ARE EQUAL;  STORE THE ADR IN D3
  230 ;
  231 LBLFOUND MOVE.L  (A1)+,D3       ;ADR TO D3
  232          MOVEM.L (A7)+,D0/D1/A0-;RESTORE REGS
  233          MOVEQ   #1,D7          ;BACKWARD REF
  234          RTS                    ;DONE
  235 ;
  236 CHKSRCH1 BHI     CHKSRCH2       ;INCR ADR
  237 ;
  238          SUB.L   D0,A0          ;DECR ADR
  239          BRA     CHKSRCH3
  240 ;
  241 CHKSRCH2 ADD.L   D0,A0          ;INCR ADR
  242 ;
  243          PAGE
  244 ; COPYRIGHT 1987 DTACK GROUNDED INC
  245 ;
  246 CHKSRCH3 SUBQ.B  #1,D1          ;DECR LOOP COUNT
  247          BNE     CHKSRCH        ;LOOP 'TIL ZERO
  248 ;
  249 ; DO THE LABELS MATCH ?
  250 ;
  251          MOVE.L  A0,A1          ;COPY PTR
  252          CMP.L   (A1)+,D2       ;MATCH ?
  253          BNE     CHKLBLX        ;IF NOT
  254 ;
  255          CMP.L   (A1)+,D3       ;MATCH ?
  256          BEQ     LBLFOUND       ;IF SO
  257 ;
  258 ; THE LABEL WAS NOT FOUND IN THE LABEL TABLE
  259 ;
  260 CHKLBLX  MOVEM.L (A7)+,D0/D1/A0-;RESTORE REGS
  261          ORI.B   #255,UDFFWD    ;UNDEFINED FWD REF
  262          MOVEQ   #0,D7          ;FORWARD REF
  263          RTS                    ;DONE
  264 ;
  265 ;-----------------------------------------
  266 ;-- INSERT A LABEL INTO THE LABEL TABLE --
  267 ;-----------------------------------------
  268 ;
  269 ; INSERT A LABEL AND ITS ADR INTO THE LABEL TABLE
  270 ; IN ALPHABETICAL ORDER, USING A BINARY SEARCH
  271 ;
  272 ; THE LABEL (8 BYTES) IS CONTAINED IN D2.L, D3.L
  273 ;
  274 SVCLBL   MOVEM.L D0/D1/A0-A2,-(A;SAVE REGS
  275          MOVE.L  LBLN,D0        ;NLBLS X 12 BYTES
  276          MOVE.W  LBLI,D1        ;BINARY ITERATIONS
  277          MOVE.L  LBLTBL,A0      ;START OF LBL TBL
  278          MOVE.L  A0,A1          ;COPY PTR
  279          CMP.L   (A1)+,D2       ;4 BYTES MATCH ?
  280          BNE     SVCLBL1        ;IF NOT
  281 ;
  282          CMP.L   (A1),D3        ;LABEL MATCH ?
  283          BEQ     DUPLBL         ;IF SO
  284 ;
  285 SVCLBL1  BCS     SVCLBLX        ;IF DONE
  286 ;
  287          ADD.L   D0,A0          ;START IN MIDDLE
  288 ;
  289 ; BINARY SEARCH TO FIND THE INSERTION ADDRESS
  290 ;
  291 BINSRCH  LSR.W   #1,D0          ;HALVE THE ADDER
  292          MOVE.L  A0,A1          ;COPY THE PTR
  293          CMP.L   (A1)+,D2       ;COMPARE 1ST 4
  294          BNE     BINSRCH1       ;IF NOT EQUAL
  295 ;
  296          CMP.L   (A1),D3        ;COMPARE LEAST 4
  297          BNE     BINSRCH1       ;IF NOT EQUAL
  298 ;
  299 ; THE TWO LABELS ARE EQUAL;  DUPLICATE LABEL ERROR
  300 ;
  301 DUPLBL   MOVEQ   #15,D7         ;DUPLICATE LABEL
  302          MOVEM.L (A7)+,D0/D1/A0-;RESTORE REGS
  303          BRA     ERROR
  304 ;
  305          PAGE
  306 ; COPYRIGHT 1987 DTACK GROUNDED INC
  307 ;
  308 BINSRCH1 BHI     BINSRCH2       ;INCR ADR
  309 ;
  310          SUB.L   D0,A0          ;DECR ADR
  311          BRA     BINSRCH3
  312 ;
  313 BINSRCH2 ADD.L   D0,A0          ;INCR ADR
  314 ;
  315 BINSRCH3 SUBQ.B  #1,D1          ;DECR LOOP COUNT
  316          BNE     BINSRCH        ;LOOP 'TIL ZERO
  317 ;
  318 ; IF CURR LBL > LBL(A0) THEN INCR A0 BY D0
  319 ;
  320          MOVE.L  A0,A1          ;COPY THE PTR
  321          CMP.L   (A1)+,D2       ;COMPARE LABELS
  322          BNE     BINSRCH4       ;IF NOT EQUAL
  323 ;
  324          CMP.L   (A1)+,D3
  325          BEQ     DUPLBL         ;ERROR IF SAME
  326 ;
  327 BINSRCH4 BCS     SVCLBLX        ;IF DONE
  328 ;
  329          ADD.L   D0,A0          ;NEW INSERT ADR
  330 ;
  331 ; A0 = THE INSERT ADDRESS
  332 ;
  333 ; CALCULATE THE NUMBER OF BYTES TO BE MOVED UP
  334 ;
  335 SVCLBLX  MOVE.L  LBLPTR,A1      ;LABEL TBL END
  336          MOVE.L  A1,A2          ;COPY THE PTR
  337          MOVEQ   #12,D1
  338          ADD.L   D1,A2          ;ONE MORE LABEL
  339          MOVE.L  A2,LBLPTR      ;STORE NEW POINTER
  340          MOVE.L  A1,D1          ;COPY TBL END
  341          SUB.L   A0,D1          ;# OF BYTES
  342          LSR.L   #2,D1          ;DIVIDE BY 4
  343          BEQ     SVCLBL3        ;IF D1 = 0
  344 ;
  345 ; MOVE THE LABELS UP ONE POSITION
  346 ;
  347 SVCLBL2  MOVE.L  -(A1),-(A2)    ;MOVE 12 BYTES
  348          MOVE.L  -(A1),-(A2)
  349          MOVE.L  -(A1),-(A2)
  350          SUBQ.L  #3,D1          ;3 LONG WORDS
  351          BNE     SVCLBL2        ;LOOP 'TIL ZERO
  352 ;
  353 ; NOW STORE THE LABEL AND ADR IN THE LABEL TABLE
  354 ;
  355 SVCLBL3  MOVE.L  D2,(A0)+       ;STORE THE LABEL
  356          MOVE.L  D3,(A0)+       ;IN THE LABEL TBL
  357          MOVE.L  ADRTEMP,(A0)   ;STORE THE ADR
  358          CLR.B   (A0)           ;CLR UPPER BYTE
  359          MOVE.L  A0,A5          ;LBL ADR PTR IN A5
  360 ;
  361          ADDQ.W  #1,LBLCNT      ;INCR LABEL COUNT
  362          MOVEM.L (A7)+,D0/D1/A0-;RESTORE REGS
  363          RTS                    ;DONE
  364 ;
  365          PAGE
  366 ; COPYRIGHT 1987 DTACK GROUNDED INC
  367 ;
  368 ; DO WE HAVE ONE OR TWO ADR FIELDS ?
  369 ;
  370 ONETWO   MOVE.L  A0,A2          ;COPY TEXT PTR
  371          MOVEQ   #"(",D1        ;D1 = L PAREN
  372          MOVEQ   #$22,D2        ;D2 = QUOTE
  373          MOVEQ   #"'",D3        ;D3 = APOSTROPHE
  374          MOVEQ   #"             ;",D4 ;D4 = SEMICOLON
  375          MOVEQ   #",",D5        ;D5 = COMMA
  376          MOVEQ   #" ",D6        ;D6 = SPACE CHAR
  377 ;
  378 ONETWOA  MOVE.B  (A2)+,D7       ;FETCH CHAR
  379          BEQ     ONETWO1        ;DONE IF LINK
  380 ;
  381          CMP.B   D4,D7          ;SEMICOLON ?
  382          BEQ     ONETWO1        ;IF SO
  383 ;
  384          CMP.B   D5,D7          ;COMMA ?
  385          BEQ     ONETWO2        ;IF SO
  386 ;
  387          CMP.B   D6,D7          ;SPACE CHAR ?
  388          BEQ     ONETWO1        ;IF SO
  389 ;
  390          CMP.B   D1,D7          ;L PARENS ?
  391          BEQ     ONETWOB        ;IF SO
  392 ;
  393          CMP.B   D2,D7          ;QUOTE ?
  394          BEQ     ONETWOC        ;IF SO
  395 ;
  396          CMP.B   D3,D7          ;APOSTROPHE ?
  397          BEQ     ONETWOD        ;IF SO
  398          BNE     ONETWOA        ;NEXT CHAR IF NOT
  399 ;
  400 ONETWO1  MOVEQ   #0,D6          ;ONE FIELD
  401          RTS
  402 ;
  403 ONETWO2  MOVEQ   #1,D6          ;TWO FIELDS
  404          RTS
  405 ;
  406 ONETWOB  MOVE.B  (A2)+,D7       ;NEXT CHAR
  407          CMPI.B  #")",D7        ;R PARENS ?
  408          BNE     ONETWOB        ;IF NOT
  409          BRA     ONETWOA        ;IF SO
  410 ;
  411 ONETWOC  MOVE.B  (A2)+,D7       ;NEXT CHAR
  412          CMP.B   D2,D7          ;QUOTE ?
  413          BNE     ONETWOC        ;IF NOT
  414          BRA     ONETWOA        ;IF SO
  415 ;
  416 ONETWOD  MOVE.B  (A2)+,D7       ;NEXT CHAR
  417          CMP.B   D3,D7          ;APOSTROPHE ?
  418          BNE     ONETWOD        ;IF NOT
  419          BRA     ONETWOA        ;IF SO
  420 ;
  421          PAGE
  422 ; COPYRIGHT 1987 DTACK GROUNDED INC
  423 ;
  424 ;--------------------
  425 ;-- OP CODE TYPE 1 --
  426 ;--------------------
  427 ;
  428 ; THE INSTRUCTION IS A CONDITIONAL BRANCH.
  429 ; THE FIELD CAN BE ONE OR TWO WORDS.
  430 ; D7-D0 = DISPLACEMENT IF SHORT BRANCH ELSE $00
  431 ; THE 2ND WORD IS THE DISPLACEMENT IF LONG BRANCH
  432 ;
  433 ; EXAMPLE:  BCS.L <EXPRESSION>
  434 ;
  435 TYPE1    TST.B   SIZEID         ;TEST THE SIZE ID
  436          BMI     ERR24A         ;IF .B
  437 ;
  438 ; EVALUATE <EXPR> AND CHECK FOR FORWARD REF
  439 ;
  440          BSR.L   W1             ;DEFAULT ONE WORD
  441          BSR.L   SVCEXPR        ;ADDRESS IN D3.L
  442          TST.B   UDFFWD         ;UNDEFINED LABEL ?
  443          BNE     TYPE1F         ;IF FORWARD REF
  444 ;
  445 ; SEE IF THE REFERENCE IS IN RANGE;  IF IN
  446 ; RANGE, DETERMINE .W OR .L DISPLACEMENT.
  447 ;
  448          SUB.L   ADDRESS,D3     ;D3 = DISPLACEMENT+2
  449          NOP
  450          BPL     TYPE1A         ;IF FORWARD DISP
  451 ;
  452 ; THE DISPLACEMENT IS BACKWARD
  453 ;
  454          MOVEQ   #0,D2
  455          SUB.L   D3,D2          ;2'S COMPLEMENT
  456          CMPI.L  #32768,D2      ;OUT OF RANGE ?
  457          BHI     ERR23A         ;IF SO
  458 ;
  459          CMPI.W  #128,D2        ;LONG DISP ?
  460          BHI.L   W1             ;ANOTHER WORD IF SO
  461          BLS     TYPE1F         ;ANOTHER WORD IF .L
  462 ;
  463 ; THE DISPLACEMENT IS FORWARD
  464 ;
  465 TYPE1A   CMPI.L  #32766,D3      ;OUT OF RANGE ?
  466          BHI     ERR23A         ;IF SO
  467 ;
  468          CMPI.W  #126,D3        ;LONG DISP ?
  469          BHI     W1             ;ANOTHER WORD IF SO
  470 ;
  471 TYPE1F   CMPI.B  #2,SIZEID      ;SIZE = .L ?
  472          BEQ     W1             ;IF .L
  473 ;
  474          RTS                    ;DONE
  475 ;
  476 ERR23A   MOVEQ   #23,D7         ;BRANCH OUT OF RANGE
  477          BRA     ERRC
  478 ;
  479 ERR24A   MOVEQ   #24,D7         ;BAD SIZE SPEC
  480          BRA     ERRC
  481 ;
  482          PAGE
  483 ; COPYRIGHT 1987 DTACK GROUNDED INC
  484 ;
  485 ; SYNTAX:  DBCC DN,<LABEL EXPRESSION>
  486 ;
  487 DB       TST.B   SIZEID         ;SIZE SPEC'D ?
  488          BNE     ERR24A         ;IF SO
  489 ;
  490          BSR.L   FIRSTEA        ;D4 = MODE
  491          TST.B   D4             ;MODE = DN ?
  492          BNE     ERR22C         ;IF NOT
  493 ;
  494          BSR.L   LASTEA         ;D4 = MODE
  495          SUBQ.B  #7,D4          ;MODE 0 - 6 ?
  496          BMI     ERR22C         ;IF SO
  497 ;
  498          SUBQ.B  #2,D4          ;MODE 7 OR 8 ?
  499          BPL     ERR22C         ;IF NOT
  500 ;
  501          TST.B   UDFFWD         ;UNDEFINED LABEL ?
  502          BNE     W2             ;IF SO
  503 ;
  504 ; CHECK WHETHER BRANCH IS IN RANGE
  505 ;
  506          SUB.L   ADDRESS,D3     ;D3 = DISPLACEMENT+2
  507          SUBQ.L  #2,D3          ;SKIP OP CODE WORD
  508          BPL     DB1            ;IF FORWARD
  509 ;
  510          MOVEQ   #0,D2
  511          SUB.L   D3,D2          ;2'S COMPLEMENT
  512          CMPI.L  #$8000,D2      ;OUT OF RANGE ?
  513          BLS     W2             ;IF NOT
  514          BHI     ERR23A         ;IF SO
  515 ;
  516 DB1      CMPI.L  #$7FFE,D2      ;OUT OF RANGE ?
  517          BLS     W2             ;IF NOT
  518          BHI     ERR23A         ;IF SO
  519 ;
  520 ERR22C   MOVEQ   #22,D7         ;ILLEGAL <EA>
  521 ERRC     BRA     ERROR          ;REPORT ERROR
  522 ;
  523 ;
  524 ; SYNTAX:  CMPM.SIZE (AY)+,(AX)+
  525 ;
  526 CMPM     BSR.L   FIRSTEA        ;D4 = MODE
  527          SUBQ.B  #3,D4          ;MODE = (AN)+ ?
  528          BNE     ERR22C         ;IF NOT
  529 ;
  530          BSR     LASTEA         ;D4 = MODE
  531          SUBQ.B  #3,D4          ;MODE = (AN)+ ?
  532          BEQ     W1             ;IF SO
  533          BNE     ERR22C         ;IF NOT
  534 ;
  535 ;
  536 ; SYNTAX:  LEA <EA>,AN   (NO SIZE ALLOWED)
  537 ;
  538 LEA      TST.B   SIZEID         ;SIZE SPEC'D ?
  539          BNE     ERR24          ;IF SO
  540 ;
  541          BSR.L   FIRSTEA        ;D4 MODE, D5 SIZE
  542          BRA     TYPE2A         ;CONTINUE
  543 ;
  544          PAGE
  545 ; COPYRIGHT 1987 DTACK GROUNDED INC
  546 ;
  547 ;--------------
  548 ;-- NO WORDS --
  549 ;--------------
  550 ;
  551 ; THE PSEUDO-OP DOES NOT HAVE A FIELD
  552 ;
  553 W0       RTS                    ;DONE
  554 ;
  555 ;--------------
  556 ;-- ONE WORD --
  557 ;--------------
  558 ;
  559 ; THE FIELD IS ONE WORD
  560 ;
  561 ; EXAMPLE:  RTS
  562 ;
  563 W1       ADDQ.L  #2,ADDRESS     ;ADD 2 TO ADR
  564          RTS                    ;DONE
  565 ;
  566 ;---------------
  567 ;-- TWO WORDS --
  568 ;---------------
  569 ;
  570 ; THE FIELD IS TWO WORDS
  571 ;
  572 W2       ADDQ.L  #4,ADDRESS     ;ADD 4 TO ADR
  573          RTS                    ;DONE
  574 ;
  575 ;--------------------
  576 ;-- OP CODE TYPE 2 --
  577 ;--------------------
  578 ;
  579 ; THE OP FIELD HAS ONLY AN EFFECTIVE ADDRESS.
  580 ; THE FIELD CAN BE ONE, TWO OR THREE WORDS.
  581 ; ONLY CONTROL ADDRESSING MODES ARE USED.
  582 ;
  583 ; JMP, JSR, PEA
  584 ;
  585 TYPE2    TST.B   SIZEID         ;SIZE SPEC'D ?
  586          BNE     ERR24          ;IF SO
  587 ;
  588          BSR     LASTEA         ;D4 MODE, D5 SIZE
  589 ;
  590 ; CHECK FOR A LEGAL ADDRESSING MODE
  591 ;
  592 TYPE2A   MOVE.W  #$7E4,D2       ;LEGAL ADR MODES
  593          BTST    D4,D2          ;LEGAL ADR MODE ?
  594          BNE     ADDADR         ;IF SO
  595          BEQ     ERR22          ;IF NOT
  596 ;
  597          PAGE
  598 ; COPYRIGHT 1987 DTACK GROUNDED INC
  599 ;
  600 ;--------------------
  601 ;-- OP CODE TYPE 3 --
  602 ;--------------------
  603 ;
  604 ; THE OP FIELD HAS ONLY AN EFFECTIVE ADDRESS.
  605 ; THE FIELD CAN BE ONE, TWO OR THREE WORDS.
  606 ; ONLY DATA ALTERABLE ADDRESSING MODES ARE USED.
  607 ; D15-D6 = OP CODE MASK, D5-D3 = EFFECTIVE MODE.
  608 ; D2-D0 = ADDRESS REGISTER
  609 ;
  610 ; CLR, NEG, NEGX, NOT, SCC, TAS, TST
  611 ;
  612 SCC      TST.B   SIZEID         ;SIZE SPEC'D ?
  613          BNE     ERR24          ;IF SO
  614 ;
  615 TYPE3    BSR     LASTEA         ;D4 MODE, D5 SIZE
  616          MOVE.W  #$1FD,D2       ;LEGAL ADR MODES
  617          BTST    D4,D2          ;ADR MODE LEGAL ?
  618          BEQ     ERR22          ;IF NOT
  619 ;
  620 ADDADR   ADD.L   D5,ADDRESS     ;INCR ADDRESS
  621          RTS                    ;DONE
  622 ;
  623 ; SERVICE THE SECOND (OR ONLY) ADDRESS FIELD
  624 ;
  625 LASTEA   BSR     DESTSIZE       ;D0 = <EA> FLD CNT
  626          MOVE.L  A0,A2          ;PTR TO <EA> FIELD
  627          MOVEQ   #2,D5          ;DEFAULT ONE WORD
  628          BRA     EA             ;GET MODE, SIZE
  629 ;
  630 ;--------------------
  631 ;-- OP CODE TYPE 4 --
  632 ;--------------------
  633 ;
  634 ; THE OP FIELD HAS AN <EA> AND A DATA REGISTER
  635 ; THE FIELD CAN BE ONE, TWO OR THREE WORDS.
  636 ; ONLY DATA ADDRESSING MODES ARE USED.
  637 ;
  638 ; CHK, DIVS, DIVU, MULS, MULU
  639 ;
  640 TYPE4    TST.B   SIZEID         ;SIZE SPEC'D ?
  641          BNE     ERR24          ;IF SO
  642 ;
  643 TYPE4A   BSR.L   DATAEA         ;SVC DATA SRC <EA>
  644 ;
  645 ; CHECK FOR A DN DEST ADDRESS MODE ELSE ERROR
  646 ;
  647          BSR     LASTEA         ;D4 MODE
  648          TST.B   D4             ;DN ?
  649          BNE     ERR22          ;IF NOT
  650 ;
  651          RTS                    ;DONE
  652 ;
  653          PAGE
  654 ; COPYRIGHT 1987 DTACK GROUNDED INC
  655 ;
  656 ERR16    MOVEQ   #16,D7         ;BAD <EA>
  657          BRA     ERRCA
  658 ;
  659 ERR22    MOVEQ   #22,D7         ;ILLEGAL ADR MODE
  660          BRA     ERRCA
  661 ;
  662 ERR24    MOVEQ   #22,D7         ;BAD SIZE SPEC
  663 ERRCA    BRA     ERROR
  664 ;
  665 ;
  666 ;--------------------
  667 ;-- OP CODE TYPE 5 --
  668 ;--------------------
  669 ;
  670 ; OP FIELD = IMMEDIATE DATA, THEN <EA>.
  671 ; THE FIELD CAN BE TWO TO FIVE WORDS.
  672 ; ONLY DATA ALTERABLE DEST ADR MODES ARE USED.
  673 ;
  674 ; ADDI, CMPI, SUBI
  675 ;
  676 RTYPE5   MOVE.L  RESTART,A0     ;RESTORE PTR A0
  677 TYPE5    BSR     STYP5          ;SVC SOURCE MODE
  678          BRA     TYPE5C         ;CONTINUE
  679 ;
  680 ;
  681 ;---------------------
  682 ;-- OP CODE TYPE 5A --
  683 ;---------------------
  684 ;
  685 ; OP FIELD = IMMEDIATE DATA, THEN <EA>.
  686 ; THE FIELD CAN BE TWO TO FIVE WORDS.
  687 ; ONLY DATA ALTERABLE DEST ADR MODES ARE USED.
  688 ;
  689 ; ANDI, EORI, ORI
  690 ;
  691 ; TYPE 5A IS DIFFERENT FROM TYPE 5 IN THAT THE
  692 ; DESTINATION ADR FIELD CAN BE 'CCR' OR 'SR'
  693 ;
  694 TYPE5A   BSR     STYP5          ;SVC SOURCE MODE
  695          BSR     DESTSIZE       ;A0 = DEST, D0 = SIZE
  696          BSR.L   CHKWRD         ;DEST = WEIRD MODE ?
  697          BEQ     TYPE5C         ;IF NOT
  698 ;
  699 ; SERVICE WEIRD ADR MODE:  MUST BE SR OR CCR
  700 ;
  701          SUBQ.B  #4,D1          ;SR OR CCR ?
  702          BPL     W1             ;IF SO
  703          BMI     ERR22          ;IF NOT
  704 ;
  705 ; NOW SERVICE THE DESTINATION <EA>
  706 ;
  707 TYPE5C   BSR     LASTEA         ;D4 MODE, D5 SIZE
  708          MOVE.W  #$1FD,D2       ;LEGAL ADR MODES
  709          BTST    D4,D2          ;ADR MODE LEGAL ?
  710          BEQ     ERR22          ;IF NOT
  711 ;
  712          PAGE
  713 ; COPYRIGHT 1987 DTACK GROUNDED INC
  714 ;
  715 ; THE <EA> IS A LEGAL 'DATA ALTERABLE' MODE
  716 ;
  717          CMPI.B  #5,D4          ;'D(AN)' ?
  718          BCS     W1             ;ONE MORE WORD IF SO
  719 ;
  720          CMPI.B  #8,D4          ;.L ?
  721          BNE     W2             ;IF NOT
  722 ;
  723          ADDQ.L  #6,ADDRESS     ;THREE MORE WORDS
  724          RTS                    ;DONE
  725 ;
  726 ;
  727 ;
  728 ; COMMON SUBR:  ADDI, ANDI, CMPI, EORI, ORI, SUBI
  729 ;
  730 STYP5    BSR     FIRSTEA        ;D4 MODE, D5 SIZE
  731          CMPI.B  #11,D4         ;#<DATA> ?
  732          BNE     ERR22          ;IF NOT
  733 ;
  734 ; .B OR .W = ONE MORE WORD,  .L = TWO MORE
  735 ;
  736          MOVEQ   #2,D5          ;IF .B OR .W
  737          CMPI.B  #2,SIZEID      ;.L ?
  738          BNE     ADDADR         ;IF NOT
  739 ;
  740          ADDQ.L  #4,ADDRESS     ;.L = TWO WORDS
  741          RTS                    ;DONE
  742 ;
  743 ;
  744 ;
  745 ; SERVICE THE FIRST OF TWO ADDRESS FIELDS
  746 ;
  747 ; LEAVE A0 POINTING TO THE DEST FIELD
  748 ; AND A2 POINTING TO THE SOURCE FIELD.
  749 ;
  750 FIRSTEA  BSR     SRCSIZE        ;SRC FLD SIZE
  751          EXG     A0,A2          ;A0 = DEST FLD PTR
  752          MOVEQ   #2,D5          ;DEFAULT ONE WORD
  753          BRA     EA             ;GET MODE, SIZE
  754 ;
  755          PAGE
  756 ; COPYRIGHT 1987 DTACK GROUNDED INC
  757 ;
  758 ;--------------------
  759 ;-- OP CODE TYPE 6 --
  760 ;--------------------
  761 ;
  762 ; 'MNE   .SIZE <EA>,DN'  OR  'MNE.SIZE DN,<EA>'
  763 ; THE FIELD CAN BE ONE, TWO OR THREE WORDS
  764 ; IF 'MNE.SIZE <EA>,DN' THEN DATA ADR MODES
  765 ; IF 'MNE.SIZE DN,<EA>' THEN MEMORY ALTERABLE
  766 ;
  767 ; AND, OR
  768 ;
  769 TYPE6    CMPI.B  #"#",(A0)      ;SRC = IMM DATA ?
  770          BEQ     TYPE5A         ;IF SO
  771 ;
  772          BSR.L   DN2ND          ;2ND <EA> 'DN' ?
  773          BEQ     TYPE4A         ;IF SO
  774 ;
  775          BNE     TYPE7A         ;IF NOT
  776 ;
  777 ;--------------------
  778 ;-- OP CODE TYPE 7 --
  779 ;--------------------
  780 ;
  781 ; 'MNE   .SIZE <EA>,DN'  OR  'MNE.SIZE DN,<EA>'
  782 ; THE FIELD CAN BE ONE, TWO OR THREE WORDS
  783 ; IF 'MNE.SIZE <EA>,DN' THEN ALL ADR MODES
  784 ; IF 'MNE.SIZE DN,<EA>' THEN MEMORY ALTERABLE
  785 ;
  786 ; ADD, SUB
  787 ;
  788 TYPE7    MOVE.L  A0,RESTART     ;SAVE PTR A0
  789          BSR.L   DN2ND          ;2ND <EA> 'DN' ?
  790          BEQ     TYPE8B         ;IF SO
  791 ;
  792          CMPI.B  #1,D4          ;2ND <EA> 'AN' ?
  793          BEQ     RTYPE8         ;IF SO
  794 ;
  795 ; MNE.SIZE DN,<EA>;  MEMORY ALTERABLE MODES
  796 ;
  797 TYPE7A   BSR     FIRSTEA        ;D4 MODE, D5 SIZE
  798          CMPI.B  #11,D4         ;ADR MODE 11 ?
  799          BEQ     RTYPE5         ;IF SO
  800 ;
  801          TST.B   D4             ;MODE 0 ?
  802          BNE     ERR22          ;IF NOT MODE 0
  803 ;
  804          BSR     LASTEA         ;D4 MODE, D5 SIZE
  805 ;
  806 ; CHECK FOR ILLEGAL DEST ADDRESS MODES
  807 ;
  808          MOVE.W  #$1FC,D2       ;LEGAL ADR MODES
  809          BTST    D4,D2          ;ADR MODE LEGAL ?
  810          BNE     ADDADR         ;IF SO
  811          BEQ     ERR22          ;IF NOT
  812 ;
  813          PAGE
  814 ; COPYRIGHT 1987 DTACK GROUNDED INC
  815 ;
  816 ;--------------------
  817 ;-- OP CODE TYPE 8 --
  818 ;--------------------
  819 ;
  820 ; SYNTAX:  'MNE   .SIZE <EA>,AN';  SIZE =.W OR .L
  821 ; THE FIELD CAN BE ONE, TWO OR THREE WORDS
  822 ;
  823 ; ADDA, CMPA, SUBA:    ALL ADR MODES LEGAL
  824 ;
  825 RTYPE8   MOVE.L  RESTART,A0     ;RESTORE PTR A0
  826 TYPE8    BSR.L   DN2ND          ;2ND <EA> 'DN' ?
  827          CMPI.B  #1,D4          ;DEST = 'AN' ?
  828          BNE.L   ERR22D         ;IF NOT
  829 ;
  830 ; A SIZE OF .B IS ILLEGAL
  831 ;
  832 TYPE8A   TST.B   SIZEID         ;.B ?
  833          BMI.L   ERR24D         ;IF SO
  834 ;
  835 ; ALL ADDRESSING MODES ARE LEGAL
  836 ;
  837 TYPE8B   BSR     FIRSTEA        ;D4 MODE, D5 SIZE
  838          CMPI.B  #1,D4          ;AN ?
  839          BNE     TYPE8C         ;IF NOT
  840 ;
  841 ; MODE = 'AN';  A SIZE OF .B IS ILLEGAL
  842 ;
  843          TST.B   SIZEID         ;.B ?
  844          BMI.L   ERR24D         ;IF SO
  845 ;
  846 TYPE8C   CMPI.B  #11,D4         ;IMMEDIATE ?
  847          BNE     ADDADR         ;DONE IF NOT
  848 ;
  849          CMPI.B  #2,SIZEID      ;SIZE = .L ?
  850          BNE     W2             ;IF NOT
  851 ;
  852          ADDQ.L  #6,ADDRESS     ;THREE WORDS
  853          RTS                    ;DONE
  854 ;
  855 ; SUBROUTINE CALLED BY TYPE 4 AND BY 'MOVE'
  856 ; SERVICE SRC <EA> = DATA   (ALL BUT 'AN')
  857 ;
  858 DATAEA   BSR     FIRSTEA        ;D4 = SRC MODE
  859          CMPI.B  #1,D4          ;SRC <EA> = 'AN' ?
  860          BNE     TYPE8C         ;CONTINUE IF NOT
  861          BEQ.L   ERR22D         ;IF SO
  862 ;
  863          PAGE
  864 ; COPYRIGHT 1987 DTACK GROUNDED INC
  865 ;
  866 ;--------------------
  867 ;-- OP CODE TYPE 9 --
  868 ;--------------------
  869 ;
  870 ; SYNTAX:  'MNE   .SIZE #M,<EA>';  M = 1 TO 8
  871 ; THE FIELD CAN BE ONE, TWO OR THREE WORDS
  872 ;
  873 ; ADDQ, SUBQ:   ALTERABLE ADDRESS MODES
  874 ;
  875 TYPE9    BSR.L   QSRC           ;SRC = #1-8 ?
  876          BSR     LASTEA         ;D4 MODE, D5 SIZE
  877          CMPI.B  #1,D4          ;AN ?
  878          BNE     TYPE9A         ;IF NOT
  879 ;
  880 ; MODE = 'AN';  A SIZE OF .B IS ILLEGAL
  881 ;
  882          TST.B   SIZEID         ;.B ?
  883          BMI     ERR24D         ;IF SO
  884 ;
  885 TYPE9A   CMPI.B  #8,D4          ;ILLEGAL MODE ?
  886          BLS     ADDADR         ;IF NOT
  887          BHI     ERR22D         ;IF SO
  888 ;
  889 ;
  890 ;---------------------
  891 ;-- OP CODE TYPE 10 --
  892 ;---------------------
  893 ;
  894 ; 'MNE    DN,<EA>'  OR  'MNE #<DATA>,<EA>'
  895 ; THE FIELD CAN BE ONE TO FOUR WORDS
  896 ; A '.SIZE' SPECIFICATION IS ILLEGAL
  897 ; ONLY DATA ALTERABLE <EA>S ARE USED
  898 ;
  899 ; BCHG, BCLR, BSET
  900 ;
  901 TYPE10   TST.B   SIZEID         ;TEST SIZE ID
  902          BNE     ERR24D         ;IF SIZE SPEC'D
  903 ;
  904 ; IF TRHE SRC <EA> IS 'DN', SKIP TO 'TYPE3'
  905 ;
  906          BSR     FIRSTEA        ;D4 = MODE
  907          TST.B   D4             ;'DN' ?
  908          BEQ     TYPE3          ;IF SO
  909 ;
  910 ; BIT OP STATIC;  MNE #<DATA>,<EA>
  911 ;
  912          CMPI.B  #11,D4         ;SOURCE <EA> '#<DATA>'
  913          BNE     ERR22D         ;IF NOT
  914 ;
  915          BSR     LASTEA         ;D4 MODE, D5 SIZE
  916          ADDQ.B  #2,D5          ;SRC #<DATA> WORD
  917          MOVE.W  #$1FD,D2       ;LEGAL ADR MODES
  918          BTST    D4,D2          ;LEGAL ADR MODE ?
  919          BNE     ADDADR         ;IF LEGAL ADR MODE
  920          BEQ     ERR22D         ;IF NOT
  921 ;
  922          PAGE
  923 ; COPYRIGHT 1987 DTACK GROUNDED INC
  924 ;
  925 ; 'BTST DN,<EA>'  OR  'BTST #<DATA>,<EA>'
  926 ;
  927 BTST     TST.B   SIZEID         ;TEST SIZE ID
  928          BNE     ERR24D         ;IF SIZE SPECIFIED
  929 ;
  930          BSR     FIRSTEA        ;D4 = MODE
  931          TST.B   D4             ;MODE = 'DN' ?
  932          BNE     BTSTSTAT       ;IF NOT
  933 ;
  934 ; BIT TEST DYNAMIC;  BTST DN,<EA>
  935 ;
  936          BSR     LASTEA         ;D4 MODE, D5 SIZE
  937          SUBQ.B  #1,D4          ;MODE = 'AN' ?
  938          BEQ     ERR22D         ;IF SO
  939 ;
  940          SUB.B   #10,D4         ;IMM DATA ?
  941          BNE     ADDADR         ;IF NOT
  942 ;
  943          ADDQ.B  #2,D5          ;ADJ FIELD SIZE
  944          JMP     ADDADR         ;DONE
  945 ;
  946 ; BIT TEST STATIC;  BTST #<DATA>,<EA>
  947 ;
  948 BTSTSTAT BSR     LASTEA         ;D4 MODE, D5 SIZE
  949          ADDQ.B  #2,D5          ;SRC #<DATA> WORD
  950          MOVE.W  #$7FD,D2       ;LEGAL ADR MODES
  951          BTST    D4,D2          ;LEGAL ADR MODE ?
  952          BNE     ADDADR         ;IF LEGAL
  953 ;
  954 ERR24D   MOVEQ   #24,D7         ;BAD SIZE SPEC
  955          BRA     ERRD
  956 ;
  957 ERR22D   MOVEQ   #22,D7         ;ILLEGAL <EA>
  958 ERRD     BRA     ERROR
  959 ;
  960          PAGE
  961 ; COPYRIGHT 1987 DTACK GROUNDED INC
  962 ;
  963 ;---------------------
  964 ;-- OP CODE TYPE 11 --
  965 ;---------------------
  966 ;
  967 ; THERE ARE THREE FORMS OF THESE MNEMONICS:
  968 ; 'MNE.SIZE DX,DY',  'MNE.SIZE #M,DY',  'MNE <EA>'
  969 ; THE 1ST TWO FORMS HAVE A SIZE OF B, W, L
  970 ;-- THE 3RD FORM HAS AN IMPLICIT SIZE OF .W AND
  971 ;   THE ADDRESS MODES ARE MEMORY ALTERABLE --
  972 ;
  973 ; ASL, ASR, LSL, LSR, ROL, ROR
  974 ;
  975 TYPE11   BSR     ONETWO         ;TWO ADR FIELDS ?
  976          BNE     TYPE11C        ;IF SO
  977 ;
  978 ; WE HAVE 'MNE <EA>',  MEMORY ALTERABLE
  979 ;
  980          TST.B   SIZEID         ;SIZE SPEC'D ?
  981          BNE     ERR24D         ;ERROR IF SO
  982 ;
  983          BSR     LASTEA         ;D4 MODE, D5 COUNT
  984          MOVE.W  #$1FC,D2       ;LEGAL ADR MODES
  985          BTST    D4,D2          ;ADR MODE LEGAL ?
  986          BNE     ADDADR         ;IF SO
  987          BEQ     ERR22D         ;IF NOT
  988 ;
  989 ; WE HAVE 'MNE.SIZE FLD1,DY':  FLD1 = #<DATA> ?
  990 ;
  991 TYPE11C  BSR     DN2ND          ;ADR FLD2 = 'DN' ?
  992          BNE     ERR22D         ;IF NOT
  993 ;
  994 ; ADR FLD1 MUST BE 'DN' OR '#<1-8>'
  995 ;
  996          BSR     FIRSTEA        ;D4 = MODE
  997          TST.B   D4             ;'DN' ?
  998          BEQ     W1A            ;ONE WORD IF SO
  999 ;
 1000          MOVE.L  A2,A0          ;A0 = FLD1 PTR
 1001          BSR     QSRC           ;MUST BE '#<1-8>'
 1002 W1A      ADDQ.L  #2,ADDRESS     ;ONE WORD
 1003          RTS                    ;DONE
 1004 ;
 1005 ;
 1006 ; SUBROUTINE;  CONFIRM 1ST <EA> IS 'DN' ELSE ERROR
 1007 ;
 1008 DN1ST    BSR     SRCSIZE        ;SRC FLD SIZE
 1009          MOVE.L  A0,A2
 1010          BSR     EA             ;GET SRC MODE
 1011          TST.B   D4             ;'DN' ?
 1012          BNE     ERR22D         ;IF NOT
 1013 ;
 1014          RTS                    ;DONE
 1015 ;
 1016          PAGE
 1017 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1018 ;
 1019 ; SUBROUTINE;  IS THE  2ND <EA> 'DN' ?
 1020 ;
 1021 DN2ND    MOVE.L  A0,-(A7)       ;SAVE TEXT PTR
 1022          BSR     SRCSIZE        ;SKIP SRC FIELD
 1023          EXG     A0,A2          ;A0 = DEST PTR
 1024          BSR     LASTEA         ;D4 = 2ND MODE
 1025          MOVE.L  (A7)+,A0       ;RESTORE TEXT PTR
 1026          TST.B   D4             ;DEST = 'DN' ?
 1027          RTS                    ;DONE
 1028 ;
 1029 ; 1ST ADR FIELD MUST BE #<DATA>, DATA = 1-8
 1030 ;
 1031 QSRC     CMPI.B  #"#",(A0)+     ;IMMEDIATE DATA ?
 1032          BNE     ERR22D         ;IF NOT
 1033 ;
 1034          MOVE.B  (A0)+,D6       ;NEXT CHAR
 1035          SUB.B   #"1",D6        ;MUST BE 1 TO 8
 1036          CMPI.B  #7,D6          ;1 TO 8 ?
 1037          BHI     ERR11H         ;IF NOT
 1038 ;
 1039          CMPI.B  #",",(A0)+     ;COMMA ?
 1040          BNE     ERR16H         ;IF NOT
 1041 ;
 1042          RTS                    ;DONE
 1043 ;
 1044 ; SYNTAX:  MOVEQ #<DATA>,DN
 1045 ;
 1046 MOVEQ    TST.B   SIZEID         ;NO ID ALLOWED
 1047          BNE     ERR24D         ;IF SIZE SPEC'D
 1048 ;
 1049          BSR     FIRSTEA        ;D4 MODE, D5 SIZE
 1050          CMPI.B  #11,D4         ;"<DATA> ?
 1051          BNE     ERR22D         ;IF NOT
 1052 ;
 1053          BSR     LASTEA         ;D4 MODE, D5 SIZE
 1054          TST.B   D4             ;DN ?
 1055          BEQ     W1A            ;IF SO
 1056          BNE     ERR22H         ;IF NOT
 1057 ;
 1058 ; SYNTAX:  LINK AN,#<DISPLACEMENT>
 1059 ;
 1060 LINK     TST.B   SIZEID         ;NO ID ALLOWED
 1061          BNE     ERR24H         ;IF SIZE SPEC'D
 1062 ;
 1063          BSR     FIRSTEA        ;D4 MODE
 1064          SUBQ.B  #1,D4          ;MODE = AN ?
 1065          BNE     ERR22H         ;IF NOT
 1066 ;
 1067          BSR     LASTEA         ;D4 MODE
 1068          CMPI.B  #11,D4         ;#<DATA> ?
 1069          BEQ     W2             ;IF SO
 1070          BNE     ERR22H         ;IF NOT
 1071 ;
 1072 ERR11H   MOVEQ   #11,D7         ;BAD INTEGER
 1073          BRA     ERRH
 1074 ;
 1075 ERR16H   MOVEQ   #16,D7         ;BAD <EA>
 1076          BRA     ERRH
 1077 ;
 1078          PAGE
 1079 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1080 ;
 1081 ; SYNTAX:  ABCD DY,DX         (NO SIZE)
 1082 ;     OR:  ABCD -(AY),-(AX)   (NO SIZE)
 1083 ;
 1084 ABCD     TST.B   SIZEID         ;SIZE SPEC'D ?
 1085          BNE     ERR24H         ;IF SO
 1086 ;
 1087 ADDX     BSR     FIRSTEA        ;D4 = MODE
 1088          TST.B   D4             ;MODE = DN ?
 1089          BNE     ABCD1          ;IF NOT
 1090 ;
 1091          BSR     LASTEA         ;D4 = MODE
 1092          TST.B   D4             ;MODE = DN ?
 1093          BEQ     W1B            ;IF SO
 1094          BNE     ERR22H         ;IF NOT
 1095 ;
 1096 ABCD1    SUBQ.B  #4,D4          ;MODE = -(AN) ?
 1097          BNE     ERR22H         ;IF NOT
 1098 ;
 1099          BSR     LASTEA         ;D4 = MODE
 1100          SUBQ.B  #4,D4          ;MODE = -(AN) ?
 1101          BEQ     W1B            ;IF SO
 1102          BNE     ERR22H         ;IF NOT
 1103 ;
 1104 ; SYNTAX:  EXG RX,RY    (NO SIZE ALLOWED)
 1105 ;
 1106 EXG      TST.B   SIZEID         ;SIZE SPEC'D ?
 1107          BNE     ERR24H         ;IF SO
 1108 ;
 1109          BSR     FIRSTEA        ;D4 = MODE
 1110          TST.B   D4             ;MODE = DN ?
 1111          BNE     EXG1           ;IF NOT
 1112 ;
 1113 ; THE NEXT <EA> CAN BE 'DN' OR 'AN'
 1114 ;
 1115          BSR     LASTEA         ;D4 = MODE
 1116          SUBQ.B  #2,D4          ;AN OR DN ?
 1117          BMI     W1B            ;IF SO
 1118          BPL     ERR22H         ;IF NOT
 1119 ;
 1120 ; MUST BE 'EXG AN,AN'
 1121 ;
 1122 EXG1     SUBQ.B  #1,D4          ;MODE = AN ?
 1123          BNE     ERR22H         ;IF NOT
 1124 ;
 1125          BSR     LASTEA         ;D4 = MODE
 1126          SUBQ.B  #1,D4          ;MODE = AN ?
 1127          BEQ     W1B            ;IF SO
 1128 ;
 1129 ; (CONTINUE INTO 'ERR22H' IF NOT)
 1130 ;
 1131 ERR22H   MOVEQ   #22,D7         ;ILLEGAL <EA>
 1132          BRA     ERRH
 1133 ;
 1134 ERR24H   MOVEQ   #24,D7         ;BAD SIZE SPEC
 1135 ERRH     BRA     ERROR          ;REPORT ERROR
 1136 ;
 1137 W1B      ADDQ.L  #2,ADDRESS     ;ONE WORD
 1138          RTS                    ;DONE
 1139 ;
