    1 ; COPYRIGHT 1987 DTACK GROUNDED INC
    2 ;
    3 ; *********
    4 ; *       *
    5 ; * PASS1 *
    6 ; *       *
    7 ; *********
    8 ;
    9 ;------------------------------
   10 ;-- 68000 RESIDENT ASSEMBLER --
   11 ;------------------------------
   12 ;
   13 ;
   14 ; STATUS AS OF 8 JUNE 1987:
   15 ;
   16 ; THE 'MOVEP' INSTRUCTION IS NOT IMPLEMENTED
   17 ;
   18 ; IT IS NOT CLEAR WHETHER THE d(PC) AND d(PC,Ix)
   19 ; ADR MODES DO OR DO NOT GENERATE A CORRECT
   20 ; DISPLACEMENT:  IT IS A QUESTION OF
   21 ; DEFINITIONS.
   22 ;
   23 ;
   24 ;
   25 SOI      EQU     $1170          ;LONG WORD
   26 ;
   27 ; USE BOTTOM HALF OF F.P. FOR-NEXT STACK FOR REGS
   28 ;
   29 LBLTEMP  EQU     $1400          ;8 BYTES
   30 ADRTEMP  EQU     LBLTEMP+8      ;LONG WORD
   31 LBLPTR   EQU     ADRTEMP+4      ;LONG WORD
   32 LINEPTR  EQU     LBLPTR+4       ;LONG WORD
   33 STKPTR   EQU     LINEPTR+4      ;LONG WORD
   34 ADDRESS  EQU     STKPTR+4       ;LONG WORD
   35 SHRT     EQU     ADDRESS+4      ;LONG WORD
   36 EXPRVALU EQU     SHRT+4         ;LONG WORD
   37 RESTART  EQU     EXPRVALU+4     ;LONG WORD
   38 ;
   39 ERRCNT   EQU     RESTART+4      ;WORD VALUE
   40 FILECNT  EQU     ERRCNT+2       ;WORD VALUE
   41 LINECNT  EQU     FILECNT+2      ;WORD VALUE
   42 LBLCNT   EQU     LINECNT+2      ;WORD VALUE
   43 GAPSIZE  EQU     LBLCNT+2       ;WORD VALUE
   44 INTVAL   EQU     GAPSIZE+2      ;WORD VALUE
   45 INDEX    EQU     INTVAL+2       ;WORD VALUE
   46 OPCODE   EQU     INDEX+2        ;WORD VALUE
   47 ;
   48 SIZEID   EQU     INTVAL+2       ;BYTE VALUE
   49 FORWARD  EQU     SIZEID+1       ;BYTE VALUE
   50 LBLFLG   EQU     FORWARD+1      ;BYTE VALUE
   51 WEIRD    EQU     LBLFLG+1       ;BYTE VALUE
   52 ORGFLG   EQU     WEIRD+1        ;BYTE VALUE
   53 OPERATOR EQU     ORGFLG+1       ;BYTE VALUE
   54 NEGATE   EQU     OPERATOR+1     ;BYTE VALUE
   55 LISTFLG  EQU     NEGATE+1       ;LIST FLG
   56 LISTFLG1 EQU     LISTFLG+1      ;1 = ALWAYS LIST
   57 LISTFLG2 EQU     LISTFLG1+1     ;1 = NEVER LIST
   58 ADRLEN   EQU     LISTFLG2+1     ;BYTE VALUE
   59 UDFFWD   EQU     ADRLEN+1       ;BYTE VALUE
   60 ;
   61          PAGE
   62 ; COPYRIGHT 1987 DTACK GROUNDED INC
   63 ;
   64 STR      EQU     $1300          ;TEMP STR STORAGE
   65 MASKTBL  EQU     $2000          ;USE DBASIC'S TBL
   66 SRC      EQU     $FFE0          ;SRC UTIL PTR
   67 DEST     EQU     $FFE4          ;DEST UTIL PTR
   68 ;
   69 ;
   70          ORG     $20000
   71 ;
   72 ; JUMP TO ASM TO INTIALIZE THE TABLES AND
   73 ; ASSEMBLE THE FIRST FILE (PASS1)
   74 ;
   75          BRA.L   ASM            ;START PASS 1
   76 ;
   77 ; JUMP TO ASMFILE TO ASSEMBLE SUBSEQUENT FILES
   78 ; UNTIL THE ASSEMBLY (PASS1) IS COMPLETED
   79 ;
   80          BRA.L   ASMFILE        ;CONTINUE PASS 1
   81 ;
   82 ; RECOVER THE FILENAMES FROM THE FILE OF FILES
   83 ;
   84          BRA.L   FNMS           ;END OF PASS1C
   85 ;
   86 ;
   87 ;
   88 ; THE FOLLOWING TABLE OF ADR VALUES IS FOR THE 1040ST;
   89 ; THE TABLE MUST BE MODIFIED BY THE ASSEMBLY PROGRAM 'ASM'
   90 ; IF A 520ST IS IN USE DUE TO LIMITED MEMORY.
   91 ;
   92 ; THE COMMENTS SHOW THE VALUES USED BY THE 520ST.
   93 ;
   94 NLBLS    DC.W    4095           ;520 #2047
   95 LBLN     DC.L    24576          ;520 12288
   96 LBLI     DC.W    11             ;520 #10
   97 CODSIZE  DC.W    $1FFF          ;520 $0FFF
   98 RAMDISK  DC.L    $49800         ;520 $3B000
   99 CODE     DC.L    $39800         ;520 $33000
  100 ;
  101 ; THESE ADDRESSES ARE COMMON TO THE 520 & 1040:
  102 ;
  103 LBLTBL   DC.L    $2C800         ;520 $2C800
  104 TEXT     DC.L    $24800         ;520 $24800
  105 ERRTBL   DC.L    $24530         ;520 $24530
  106 MSGSHDW  DC.L    $244F0         ;520 $244F0
  107 ERMSGARY DC.L    $23CF0         ;520 $23CF0
  108 SHDW     DC.L    $23CB0         ;520 $23CB0
  109 FILETBL  DC.L    $238B0         ;520 $238B0
  110 ;
  111          PAGE
  112 ; COPYRIGHT 1987 DTACK GROUNDED INC
  113 ;
  114 ;-------------------------------------------
  115 ;-- LINKED ASCII TABLE OF 68000 MNEMONICS --
  116 ;-------------------------------------------
  117 ;
  118          ORG     $2004C
  119 ;
  120 A        DC.B    4
  121          ASC     "ABCD"
  122          DC.B    3
  123          ASC     "ADD"
  124          DC.B    4
  125          ASC     "ADDA"
  126          DC.B    4
  127          ASC     "ADDI"
  128          DC.B    4
  129          ASC     "ADDQ"
  130          DC.B    4
  131          ASC     "ADDX"
  132          DC.B    3
  133          ASC     "AND"
  134          DC.B    4
  135          ASC     "ANDI"
  136          DC.B    3
  137          ASC     "ASC"          ;PSEUDO-OP
  138          DC.B    3
  139          ASC     "ASL"
  140          DC.B    3
  141          ASC     "ASR"
  142 B        DC.B    3
  143          ASC     "BCC"
  144          DC.B    3
  145          ASC     "BCS"
  146          DC.B    3
  147          ASC     "BEQ"
  148          DC.B    3
  149          ASC     "BGE"
  150          DC.B    3
  151          ASC     "BGT"
  152          DC.B    3
  153          ASC     "BHI"
  154          DC.B    3
  155          ASC     "BLE"
  156          DC.B    3
  157          ASC     "BLS"
  158          DC.B    3
  159          ASC     "BLT"
  160          DC.B    3
  161          ASC     "BMI"
  162          DC.B    3
  163          ASC     "BNE"
  164          DC.B    3
  165          ASC     "BPL"
  166          DC.B    3
  167          ASC     "BVC"
  168 ;
  169          PAGE
  170 ; COPYRIGHT 1987 DTACK GROUNDED INC
  171 ;
  172          DC.B    3
  173          ASC     "BVS"
  174          DC.B    4
  175          ASC     "BCHG"
  176          DC.B    4
  177          ASC     "BCLR"
  178          DC.B    3
  179          ASC     "BRA"
  180          DC.B    4
  181          ASC     "BSET"
  182          DC.B    3
  183          ASC     "BSR"
  184          DC.B    4
  185          ASC     "BTST"
  186 C        DC.B    3
  187          ASC     "CHK"
  188          DC.B    3
  189          ASC     "CLR"
  190          DC.B    3
  191          ASC     "CMP"
  192          DC.B    4
  193          ASC     "CMPA"
  194          DC.B    4
  195          ASC     "CMPI"
  196          DC.B    4
  197          ASC     "CMPM"
  198 D        DC.B    4
  199          ASC     "DBCC"
  200          DC.B    4
  201          ASC     "DBCS"
  202          DC.B    4
  203          ASC     "DBEQ"
  204          DC.B    3
  205          ASC     "DBF"
  206          DC.B    4
  207          ASC     "DBGE"
  208          DC.B    4
  209          ASC     "DBGT"
  210          DC.B    4
  211          ASC     "DBHI"
  212          DC.B    4
  213          ASC     "DBLE"
  214          DC.B    4
  215          ASC     "DBLS"
  216          DC.B    4
  217          ASC     "DBLT"
  218          DC.B    4
  219          ASC     "DBMI"
  220          DC.B    4
  221          ASC     "DBNE"
  222          DC.B    4
  223          ASC     "DBPL"
  224 ;
  225          PAGE
  226 ; COPYRIGHT 1987 DTACK GROUNDED INC
  227 ;
  228          DC.B    4
  229          ASC     "DBRA"
  230          DC.B    3
  231          ASC     "DBT"
  232          DC.B    4
  233          ASC     "DBVC"
  234          DC.B    4
  235          ASC     "DBVS"
  236          DC.B    2
  237          ASC     "DC"           ;PSEUDO-OP
  238          DC.B    4
  239          ASC     "DIVS"
  240          DC.B    4
  241          ASC     "DIVU"
  242          DC.B    2
  243          ASC     "DS"           ;PSEUDO-OP
  244 E        DC.B    3
  245          ASC     "EOR"
  246          DC.B    4
  247          ASC     "EORI"
  248          DC.B    3
  249          ASC     "EQU"          ;PSEUDO-OP
  250          DC.B    3
  251          ASC     "EXG"
  252          DC.B    3
  253          ASC     "EXT"
  254          DC.B    4
  255          ASC     "FWRD"         ;PSEUDO-OP
  256          DC.B    7
  257          ASC     "ILLEGAL"
  258          DC.B    3
  259          ASC     "GAP"          ;PSEUDO-OP
  260 J        DC.B    3
  261          ASC     "JMP"
  262          DC.B    3
  263          ASC     "JSR"
  264          DC.B    3
  265          ASC     "LEA"
  266          DC.B    4
  267          ASC     "LINK"
  268          DC.B    4
  269          ASC     "LIST"         ;PSEUDO-OP
  270          DC.B    3
  271          ASC     "LSL"
  272          DC.B    3
  273          ASC     "LSR"
  274 M        DC.B    4
  275          ASC     "MOVE"
  276          DC.B    5
  277          ASC     "MOVEA"
  278          DC.B    5
  279          ASC     "MOVEM"
  280          DC.B    5
  281          ASC     "MOVEP"
  282          DC.B    5
  283          ASC     "MOVEQ"
  284 ;
  285          PAGE
  286 ; COPYRIGHT 1987 DTACK GROUNDED INC
  287 ;
  288          DC.B    4
  289          ASC     "MULS"
  290          DC.B    4
  291          ASC     "MULU"
  292 N        DC.B    4
  293          ASC     "NBCD"
  294          DC.B    3
  295          ASC     "NEG"
  296          DC.B    4
  297          ASC     "NEGX"
  298          DC.B    6
  299          ASC     "NOLIST"       ;PSEUDO-OP
  300          DC.B    3
  301          ASC     "NOP"
  302          DC.B    3
  303          ASC     "NOT"
  304          DC.B    2
  305          ASC     "OR"
  306          DC.B    3
  307          ASC     "ORI"
  308          DC.B    3
  309          ASC     "ORG"          ;PSEUDO-OP
  310          DC.B    4
  311          ASC     "PAGE"         ;PSEUDO-OP
  312          DC.B    3
  313          ASC     "PEA"
  314 R        DC.B    5
  315          ASC     "RESET"
  316          DC.B    3
  317          ASC     "ROL"
  318          DC.B    3
  319          ASC     "ROR"
  320          DC.B    4
  321          ASC     "ROXL"
  322          DC.B    4
  323          ASC     "ROXR"
  324          DC.B    3
  325          ASC     "RTE"
  326          DC.B    3
  327          ASC     "RTR"
  328          DC.B    3
  329          ASC     "RTS"
  330 S        DC.B    4
  331          ASC     "SBCD"
  332          DC.B    3
  333          ASC     "SCC"
  334          DC.B    3
  335          ASC     "SCS"
  336          DC.B    3
  337          ASC     "SEQ"
  338          DC.B    2
  339          ASC     "SF"
  340          DC.B    3
  341          ASC     "SGE"
  342          DC.B    3
  343          ASC     "SGT"
  344 ;
  345          PAGE
  346 ; COPYRIGHT 1987 DTACK GROUNDED INC
  347 ;
  348          DC.B    3
  349          ASC     "SHI"
  350          DC.B    3
  351          ASC     "SLE"
  352          DC.B    3
  353          ASC     "SLS"
  354          DC.B    3
  355          ASC     "SLT"
  356          DC.B    3
  357          ASC     "SMI"
  358          DC.B    3
  359          ASC     "SNE"
  360          DC.B    3
  361          ASC     "SPI"
  362          DC.B    2
  363          ASC     "ST"
  364          DC.B    3
  365          ASC     "SVC"
  366          DC.B    3
  367          ASC     "SVS"
  368          DC.B    5
  369          ASC     "SHORT"        ;PSEUDO-OP
  370          DC.B    4
  371          ASC     "STOP"
  372          DC.B    3
  373          ASC     "SUB"
  374          DC.B    4
  375          ASC     "SUBA"
  376          DC.B    4
  377          ASC     "SUBI"
  378          DC.B    4
  379          ASC     "SUBQ"
  380          DC.B    4
  381          ASC     "SUBX"
  382          DC.B    4
  383          ASC     "SWAP"
  384          DC.B    4
  385          ASC     "SYNC"         ;PSEUDO-OP
  386 T        DC.B    3
  387          ASC     "TAS"
  388          DC.B    5
  389          ASC     "TITLE"        ;PSEUDO-OP
  390          DC.B    4
  391          ASC     "TRAP"
  392          DC.B    5
  393          ASC     "TRAPV"
  394          DC.B    3
  395          ASC     "TST"
  396          DC.B    4
  397          ASC     "UNLK"
  398          DC.B    0              ;END LINK
  399          SYNC
  400 ;
  401          PAGE
  402 ; COPYRIGHT 1987 DTACK GROUNDED INC
  403 ;
  404 ;------------------------
  405 ;-- OP CODE JUMP TABLE --
  406 ;------------------------
  407 ;
  408 JTBL68K  DC.L    ABCD           ;ABCD
  409          DC.L    TYPE7          ;ADD
  410          DC.L    TYPE8          ;ADDA
  411          DC.L    TYPE5          ;ADDI
  412          DC.L    TYPE9          ;ADDQ
  413          DC.L    ADDX           ;ADDX
  414          DC.L    TYPE6          ;AND
  415          DC.L    TYPE5A         ;ANDI
  416          DC.L    ASC+$80000000  ;ASC, PSEUDO-OP
  417          DC.L    TYPE11         ;ASL
  418          DC.L    TYPE11         ;ASR
  419          DC.L    TYPE1          ;BCC
  420          DC.L    TYPE1          ;BCS
  421          DC.L    TYPE1          ;BEQ
  422          DC.L    TYPE1          ;BGE
  423          DC.L    TYPE1          ;BGT
  424          DC.L    TYPE1          ;BHI
  425          DC.L    TYPE1          ;BLE
  426          DC.L    TYPE1          ;BLS
  427          DC.L    TYPE1          ;BLT
  428          DC.L    TYPE1          ;BMI
  429          DC.L    TYPE1          ;BNE
  430          DC.L    TYPE1          ;BPL
  431          DC.L    TYPE1          ;BVC
  432          DC.L    TYPE1          ;BVS
  433          DC.L    TYPE10         ;BCHG
  434          DC.L    TYPE10         ;BCLR
  435          DC.L    TYPE1          ;BRA
  436          DC.L    TYPE10         ;BSET
  437          DC.L    TYPE1          ;BSR
  438          DC.L    BTST           ;BTST
  439          DC.L    TYPE4          ;CHK
  440          DC.L    TYPE3          ;CLR
  441          DC.L    CMP            ;CMP
  442          DC.L    TYPE8          ;CMPA
  443          DC.L    TYPE5          ;CMPI
  444          DC.L    CMPM           ;CMPM
  445          DC.L    DB             ;DBCC
  446          DC.L    DB             ;DBCS
  447          DC.L    DB             ;DBEQ
  448          DC.L    DB             ;DBF
  449          DC.L    DB             ;DBGE
  450          DC.L    DB             ;DBGT
  451          DC.L    DB             ;DBHI
  452          DC.L    DB             ;DBLE
  453          DC.L    DB             ;DBLS
  454          DC.L    DB             ;DBLT
  455          DC.L    DB             ;DBMI
  456          DC.L    DB             ;DBNE
  457          DC.L    DB             ;DBPL
  458 ;
  459          PAGE
  460 ; COPYRIGHT 1987 DTACK GROUNDED INC
  461 ;
  462          DC.L    DB             ;DBT
  463          DC.L    DB             ;DBVC
  464          DC.L    DB             ;DBVS
  465          DC.L    DB             ;DBRA
  466          DC.L    DC+$80000000   ;DC, PSEUDO-OP
  467          DC.L    TYPE4          ;DIVS
  468          DC.L    TYPE4          ;DIVU
  469          DC.L    DS+$80000000   ;DS, PSEUDO-OP
  470          DC.L    EOR            ;EOR
  471          DC.L    TYPE5A         ;EORI
  472          DC.L    EQU+$80000000  ;EQU, PSEUDO-OP
  473          DC.L    EXG            ;EXG
  474          DC.L    EXT            ;EXT
  475          DC.L    FWRD+$80000000 ;FWRD, PSEUDO-OP
  476          DC.L    GAP+$80000000  ;GAP, PSEUDO-OP
  477          DC.L    W1             ;ILLEGAL
  478          DC.L    TYPE2          ;JMP
  479          DC.L    TYPE2          ;JSR
  480          DC.L    LEA            ;LEA
  481          DC.L    LINK           ;LINK
  482          DC.L    W0+$80000000   ;LIST, PSEUDO-OP
  483          DC.L    TYPE11         ;LSL
  484          DC.L    TYPE11         ;LSR
  485          DC.L    MOVE           ;MOVE
  486          DC.L    MOVEA          ;MOVEA
  487          DC.L    MOVEM          ;MOVEM
  488          DC.L    MOVEP          ;MOVEP
  489          DC.L    MOVEQ          ;MOVEQ
  490          DC.L    TYPE4          ;MULS
  491          DC.L    TYPE4          ;MULU
  492          DC.L    TYPE3          ;NBCD
  493          DC.L    TYPE3          ;NEG
  494          DC.L    TYPE3          ;NEGX
  495          DC.L    W0+$80000000   ;NOLIST, PSEUDO-OP
  496          DC.L    W1             ;NOP
  497          DC.L    TYPE3          ;NOT
  498          DC.L    TYPE6          ;OR
  499          DC.L    TYPE5A         ;ORI
  500          DC.L    ORG+$80000000  ;ORG, PSEUDO-OP
  501          DC.L    W0+$80000000   ;PAGE, PSEUDO-OP
  502          DC.L    TYPE2          ;PEA
  503          DC.L    W1             ;RESET
  504          DC.L    TYPE11         ;ROL
  505          DC.L    TYPE11         ;ROR
  506          DC.L    TYPE11         ;ROXL
  507          DC.L    TYPE11         ;ROXR
  508          DC.L    W1             ;RTE
  509          DC.L    W1             ;RTR
  510          DC.L    W1             ;RTS
  511          DC.L    ABCD           ;SBCD
  512          DC.L    SCC            ;SCC
  513          DC.L    SCC            ;SCS
  514 ;
  515          PAGE
  516 ; COPYRIGHT 1987 DTACK GROUNDED INC
  517 ;
  518          DC.L    SCC            ;SEQ
  519          DC.L    SCC            ;SF
  520          DC.L    SCC            ;SGE
  521          DC.L    SCC            ;SGT
  522          DC.L    SCC            ;SHI
  523          DC.L    SCC            ;SLE
  524          DC.L    SCC            ;SLS
  525          DC.L    SCC            ;SLT
  526          DC.L    SCC            ;SMI
  527          DC.L    SCC            ;SNE
  528          DC.L    SCC            ;SPL
  529          DC.L    SCC            ;ST
  530          DC.L    SCC            ;SVC
  531          DC.L    SCC            ;SVS
  532          DC.L    SHORT+$80000000;SHORT, PSEUDO-OP
  533          DC.L    STOP           ;STOP
  534          DC.L    TYPE7          ;SUB
  535          DC.L    TYPE8          ;SUBA
  536          DC.L    TYPE5          ;SUBI
  537          DC.L    TYPE9          ;SUBQ
  538          DC.L    ADDX           ;SUBX
  539          DC.L    SWAP           ;SWAP
  540          DC.L    SYNC           ;SYNC, PSEUDO-OP
  541          DC.L    SCC            ;TAS
  542          DC.L    W0+$80000000   ;TITLE, PSEUDO-OP
  543          DC.L    TRAP           ;TRAP
  544          DC.L    W1             ;TRAPV
  545          DC.L    TYPE3          ;TST
  546          DC.L    UNLK           ;UNLK
  547 ;
  548 ;
  549 ;
  550 ; THIS ASSEMBLER ASSUMES A 512K (OR MORE) DTACK
  551 ; GRANDE OR BEAUCOUP GRANDE.  THE BIT-BANGING
  552 ; IS DONE IN ASSEMBLY LANGUAGE AND THE FILE
  553 ; HANDLING AND ERROR REPORTING IS DONE IN AN
  554 ; HLL - IN THIS CASE, HALGOL.
  555 ;
  556 ; COMMUNICATION BETWEEN THE ASSEMBLER AND HALGOL
  557 ; IS BASED ON CERTAIN ARRAYS WHOSE LOCATION IS
  558 ; FIXED (BY HALGOL) AND KNOWN BY THE ASSEMBLER.
  559 ;
  560          PAGE
  561 ; COPYRIGHT 1987 DTACK GROUNDED INC
  562 ;
  563 ;---------------------
  564 ;-- ERROR REPORTING --
  565 ;---------------------
  566 ;
  567 ; EACH ERROR ENTRY CONSISTS OF AN ERROR # (ONE
  568 ; BYTE), A LINE NUMBER (TWO BYTES), AND A FILE
  569 ; NUMBER (ONE BYTE).  THE ERROR COUNT IS STORED
  570 ; AT $1428 AND CAN BE ACCESSED VIA A 'PEEKW'.
  571 ;
  572 ERROR    MOVEM.L D0/A0,-(A7)    ;SAVE REGS
  573          MOVE.W  ERRCNT,D0      ;0, 6, 12, ...
  574          MOVE.L  ERRTBL,A0      ;PTR TO ERR ARRAY
  575          MOVE.B  D7,1(A0,D0)    ;STORE ERROR #
  576          MOVE.W  LINECNT,2(A0,D0;STORE LINE #
  577          MOVE.B  FILECNT+1,5(A0,;STORE FILE #
  578          ADDQ.W  #6,ERRCNT      ;INCR ERR COUNT
  579          MOVEM.L (A7)+,D0/A0    ;RESTORE REGS
  580          MOVE.L  STKPTR,A7      ;RESTORE STK PTR
  581          BRA.L   ASMLIN         ;NEXT LINE #
  582 ;
  583 ;--------------------
  584 ;-- ERROR MESSAGES --
  585 ;--------------------
  586 ;
  587 ; THESE ERROR MESSAGES ARE TRANSFERRED TO
  588 ; THE HALGOL STRING ARRAY 'ERRMSG$()' AT
  589 ; THE BEGINNING OF ASSEMBLY PASS 1.
  590 ;
  591 ERRMSG   DC.B    15             ;E0
  592          ASC     "NOT IMPLEMENTE
  593          DC.B    14
  594          ASC     "BAD LABEL CHAR
  595          DC.B    14             ;E2
  596          ASC     "LABEL TOO LONG
  597          DC.B    16
  598          ASC     "MNEMONIC MISSI
  599          DC.B    19             ;E4
  600          ASC     "BAD SIZE IDENT
  601          DC.B    16
  602          ASC     "ILLEGAL MNEMON
  603          DC.B    12             ;E6
  604          ASC     "SYNTAX ERROR"
  605          DC.B    12
  606          ASC     "BAD HEX CHAR"
  607          DC.B    14             ;E8
  608          ASC     "<EA> NOT FOUND
  609          DC.B    13
  610          ASC     "WRONG # CHARS"
  611          DC.B    9              ;E10
  612          ASC     "$ MISSING"
  613          DC.B    11
  614          ASC     "BAD INTEGER"
  615          DC.B    16             ;E12
  616          ASC     "BAD DECIMAL CH
  617          DC.B    17
  618          ASC     "SRC FIELD MISS
  619 ;
  620          PAGE
  621 ; COPYRIGHT 1987 DTACK GROUNDED INC
  622 ;
  623          DC.B    18             ;E14
  624          ASC     "DEST FIELD MIS
  625          DC.B    15
  626          ASC     "DUPLICATE LABE
  627          DC.B    8              ;E16
  628          ASC     "BAD <EA>"
  629          DC.B    12
  630          ASC     "NO HEX CHARS"
  631          DC.B    18             ;E18
  632          ASC     "TOO MANY HEX C
  633          DC.B    16
  634          ASC     "<EA> TOO COMPL
  635          DC.B    17             ;E20
  636          ASC     "NEW ADR < OLD
  637          DC.B    18
  638          ASC     "CODE GAP TOO L
  639          DC.B    20             ;E22
  640          ASC     "ILLEGAL ADDRES
  641          DC.B    19
  642          ASC     "BRANCH OUT OF
  643          DC.B    12             ;E24
  644          ASC     "ILLEGAL SIZE"
  645          DC.B    13
  646          ASC     "BAD PSEUDO-OP"
  647          DC.B    12             ;E26
  648          ASC     "<EA> MISSING"
  649          DC.B    16
  650          ASC     "EXPR NOT NUMER
  651          DC.B    16             ;E28
  652          ASC     "UNPRINTABLE CH
  653          DC.B    13
  654          ASC     "REF NOT FOUND"
  655          DC.B    21             ;E30
  656          ASC     "UNMATCHED PARE
  657          DC.B    17
  658          ASC     "BAD MNEMONIC C
  659          DC.B    17             ;E32
  660          ASC     ".B & 'AN' ILLE
  661          DC.B    18
  662          ASC     "LABEL REF TOO
  663          DC.B    15             ;E34
  664          ASC     "NO BINARY CHAR
  665          DC.B    21
  666          ASC     "TOO MANY BINAR
  667          DC.B    18             ;E36
  668          ASC     "TOO MANY DEC C
  669          DC.B    20
  670          ASC     "<EXPRESSION> M
  671          DC.B    17             ;E38
  672          ASC     "OPERATOR EXPEC
  673          DC.B    18
  674          ASC     "BAD CHAR IN <E
  675          DC.B    15             ;E40
  676          ASC     "ELEMENT MISSIN
  677          DC.B    19
  678          ASC     "ILLEGAL FORWAR
  679 ;
  680          PAGE
  681 ; COPYRIGHT 1987 DTACK GROUNDED INC
  682 ;
  683          DC.B    18             ;E42
  684          ASC     "TOO MANY ASC C
  685          DC.B    12
  686          ASC     "NO ASC CHARS"
  687          DC.B    16             ;E44
  688          ASC     "NO CLOSING QUO
  689          DC.B    21
  690          ASC     "NO CLOSING APO
  691          DC.B    14             ;E46
  692          ASC     "SAME REGISTERS
  693          DC.B    13
  694          ASC     "BAD DELIMITER"
  695          DC.B    13             ;E48
  696          ASC     "BAD <EA> CHAR"
  697          DC.B    0              ;ERR TBL END
  698          SYNC
  699 ;
  700 SYNERR   MOVEQ   #6,D7          ;SYNTAX ERROR
  701          JMP     ERROR
  702 ;
  703          PAGE
  704 ; COPYRIGHT 1987 DTACK GROUNDED INC
  705 ;
  706 ;-------------------------------------------
  707 ;-- PERFORM PASS 1 OF THE 68000 ASSEMBLER --
  708 ;-------------------------------------------
  709 ;
  710 ; THIS IS THE ENTRANCE POINT FOR THE FIRST FILE.
  711 ;
  712 ; INITIALIZE THE LABEL TABLE (nK X 12 BYTES)
  713 ;
  714 ASM      MOVEQ   #255,D0        ;D0 = $FFFFFFFF
  715          MOVE.W  NLBLS,D1       ;# OF LABELS -1
  716          MOVE.L  LBLTBL,A0      ;PTR TO TABLE
  717          MOVE.L  A0,LBLPTR      ;LABEL TABLE PTR
  718 ASM1     MOVE.L  D0,(A0)+       ;-- INIT ONE LABEL
  719          MOVE.L  D0,(A0)+       ;   OF THE LABEL
  720          MOVE.L  D0,(A0)+       ;   TBL (12 BYTES)
  721          DBF     D1,ASM1        ;LOOP 'TIL -1
  722 ;
  723 ;
  724 ; MOVE THE ERROR MSGS INTO THE HALGOL ARRAY
  725 ;
  726          MOVE.L  A3,-(A7)       ;SAVE A3
  727          LEA     ERRMSG,A0      ;SOURCE TABLE PTR
  728          MOVE.L  ERMSGARY,D6    ;DEST ARRAY
  729          MOVE.L  MSGSHDW,A3     ;PTR TO SHDW ARY
  730 ;
  731 ASM2     MOVE.B  (A0)+,D0       ;MESSAGE LENGTH
  732          BEQ     ASM4           ;DONE IF ZERO
  733 ;
  734          MOVE.B  D0,(A3)+       ;MSG LEN = CURR LEN
  735          MOVE.L  D6,A5          ;MSG ARY ELEMENT PTR
  736 ASM3     MOVE.B  (A0)+,(A5)+    ;MOVE A BYTE
  737          SUBQ.B  #1,D0          ;DECR COUNT
  738          BNE     ASM3           ;LOOP 'TIL ZERO
  739 ;
  740          ADD.L   #32,D6         ;NEXT DEST ELEMENT
  741          BRA     ASM2           ;NEXT MESSAGE
  742 ;
  743 ;
  744 ; INITIALIZE 'SHORT' TO $7FFF  (NORMAL DEFAULT)
  745 ; INITIALIZE 'FORWARD' TO .L (.L = $FF)
  746 ; (IGNORE 'LIST' AND 'NOLIST' ON PASS1)
  747 ;
  748 ASM4     MOVE.L  (A7)+,A3       ;RESTORE A3
  749          MOVE.L  #$00007FFF,SHRT;NORMAL DEFAULT
  750          MOVE.B  #$FF,FORWARD   ;DEFAULT .L
  751          CLR.B   ORGFLG         ;CLR 1ST ORG FLAG
  752          MOVE.W  #1024,GAPSIZE  ;DEFAULT GAP
  753          CLR.W   ERRCNT         ;CLEAR ERROR COUNT
  754          CLR.W   LBLCNT         ;INIT LABEL COUNT
  755          CLR.W   FILECNT        ;INIT FILE COUNT
  756          CLR.L   ADDRESS        ;INIT ADR = ZERO
  757          MOVE.L  TEXT,SRC       ;INIT SOURCE PTR
  758          MOVE.L  RAMDISK,DEST   ;INIT DEST PTR
  759 ;
  760          PAGE
  761 ; COPYRIGHT 1987 DTACK GROUNDED INC
  762 ;
  763 ;------------------------------------------
  764 ;-- ASSEMBLE ONE FILE OF THE SOURCE CODE --
  765 ;------------------------------------------
  766 ;
  767 ; THIS IS THE ENTRANCE POINT FOR SUBSEQUENT FILES.
  768 ;
  769 ASMFILE  MOVEM.L A1-A4/A6,-(A7) ;SAVE REGS
  770          MOVE.L  A7,STKPTR      ;SAVE STACK PTR
  771          MOVE.L  TEXT,LINEPTR   ;PTR TO TEXT START
  772          LEA     MASKTBL,A1     ;CHAR MASK TBL PTR
  773          CLR.W   LINECNT        ;CLEAR LINE COUNT
  774 ;
  775 ;------------------------------------------
  776 ;-- ASSEMBLE ONE LINE OF THE SOURCE CODE --
  777 ;------------------------------------------
  778 ;
  779 ; A0 = LINE TEXT SCAN POINTER
  780 ; A1 = POINTER TO CHAR MASK
  781 ; D5 = SPACE CHAR (STRING CONSTANT)
  782 ;
  783 ASMLIN   ADDQ.W  #1,LINECNT     ;INCR LINE CNT
  784          MOVEQ   #0,D0          ;CLR UPPER BITS
  785          MOVEQ   #0,D6          ;CLR UPPER BITS
  786          CLR.W   LBLFLG         ;CLR LBLFLG, WEIRD
  787          MOVEQ   #" ",D5        ;D5 = SPACE CHAR
  788          MOVE.L  LINEPTR,A0     ;START OF LINE
  789          MOVE.B  (A0)+,D0       ;FETCH LINK BYTE
  790          BEQ     FILEEND        ;END IF $00
  791 ;
  792 ; SET 'LINEPTR' TO POINT TO THE START OF THE NEXT LINE
  793 ;
  794          MOVE.L  A0,A2          ;COPY LINE PTR
  795          ADD.L   D0,A0          ;PTR TO NEXT LINE
  796          MOVE.L  A0,LINEPTR     ;PTR TO NEXT LINE
  797 ;
  798 ; COPY THE LINE TO A TEMPORARY BUFFER WHICH HAS
  799 ; A NULL 'END LINK'  (NULL = $00)
  800 ;
  801          LEA     LINE,A5        ;TEMP LINE BUFFER
  802 ASML1    MOVE.B  (A2)+,(A5)+    ;COPY A BYTE
  803          SUBQ.B  #1,D0          ;DECR COUNT
  804          BNE     ASML1          ;LOOP 'TIL ZERO
  805 ;
  806          MOVE.B  D0,(A5)+       ;END LINK = $00
  807          LEA     LINE,A0        ;PTR TO LINE BUFFER
  808 ;
  809          MOVE.B  (A0)+,D6       ;NEXT CHAR
  810 ;
  811          PAGE
  812 ; COPYRIGHT 1987 DTACK GROUNDED INC
  813 ;
  814 ; SVC MNEMONIC IF 1ST CHAR IS A SPACE
  815 ;
  816          CMP.B   D5,D6          ;SPACE CHAR ?
  817          BEQ     MNE            ;IF SO
  818 ;
  819 ; IGNORE COMMENT LINE IF 1ST CHAR = SEMICOLON
  820 ;
  821          CMPI.B  #"             ;",D6 ;SEMICOLON ?
  822          BEQ     ASMLIN         ;NEXT LINE IF SO
  823 ;
  824 ; CONTINUE, SERVICING THE LABEL
  825 ;
  826          BRA     LABEL          ;CONTINUE
  827 ;
  828 ;
  829 ;--------------------------------------------
  830 ; ASSEMBLY OF THIS FILE IS COMPLETED (PASS 1)
  831 ;--------------------------------------------
  832 ;
  833 ; RETURN TO HALGOL FOR THE NEXT FILE (IF ANY)
  834 ;
  835 FILEEND  ADDQ.W  #1,FILECNT     ;INCR FILE #
  836          BSR.L   XFR            ;STORE THE FILE
  837          MOVE.L  A5,DEST        ;PTR TO NEXT FILE
  838          MOVE.L  STKPTR,A7      ;RESTORE STK PTR
  839          MOVEM.L (A7)+,A1-A4/A6 ;RESTORE REGS
  840          JMP     (A4)           ;RETURN TO HALGOL
  841 ;
  842 ;
  843 ;-----------------------
  844 ;-- SERVICE THE LABEL --
  845 ;-----------------------
  846 ;
  847 ; WE HAVE A LABEL; STORE IT IN 'LBLTEMP'
  848 ;
  849 LABEL    MOVE.B  (A1,D6),D3     ;FETCH MASK
  850          ANDI.B  #$20,D3        ;ALPHABETIC ?
  851          BEQ     ERR1M          ;IF NOT
  852 ;
  853 ; A2 = PTR TO STRING BUFFER
  854 ;
  855          LEA     LBLTEMP,A2     ;SET STR BUFFR PTR
  856          MOVE.B  D6,(A2)+       ;STORE 1ST CHAR
  857          MOVEQ   #7,D0          ;ADD'TL BYTE COUNT
  858 ;
  859 LBL      MOVE.B  (A0)+,D6       ;NEXT CHAR
  860          CMP.B   D5,D6          ;SPACE CHAR ?
  861          BEQ     LBLEND         ;IF SO
  862 ;
  863          MOVE.B  (A1,D6),D3     ;FETCH MASK
  864          ANDI.B  #$30,D3        ;ALPHANUMERIC ?
  865          BEQ     ERR1M          ;ILLEGAL LABEL CHAR
  866 ;
  867          MOVE.B  D6,(A2)+       ;STORE CHAR
  868          SUBQ.B  #1,D0          ;DECR LABEL COUNT
  869          BPL     LBL            ;NEXT CHAR
  870 ;
  871          PAGE
  872 ; COPYRIGHT 1987 DTACK GROUNDED INC
  873 ;
  874          MOVEQ   #2,D7          ;LABEL TOO LONG
  875 ERR      BRA     ERRM
  876 ;
  877 LBLEND   TST.B   D0             ;TEST LABEL COUNT
  878          BEQ     FLAGLBL        ;IF 8 CHARS
  879 ;
  880 ; PAD THE LABEL WITH SPACES FOR 8 TOTAL CHARS
  881 ;
  882 LBLEND1  MOVE.B  D5,(A2)+       ;STORE A SPACE
  883          SUBQ.B  #1,D0          ;DECR COUNT
  884          BNE     LBLEND1        ;LOOP 'TIL ZERO
  885 ;
  886 ; SET THE LABEL FLAG TO INDICATE A LABEL PRESENT
  887 ;
  888 FLAGLBL  MOVE.B  #1,LBLFLG      ;SIGNAL A LABEL
  889 ;
  890 ;
  891 ;--------------------------
  892 ;-- SERVICE THE MNEMONIC --
  893 ;--------------------------
  894 ;
  895 ; THE LABEL (IF ANY ) IS SERVICED;  CONTINUE WITH
  896 ; THE INSTRUCTION MNEMONIC (OR PSEUDO-OP).
  897 ;
  898 MNE      LEA     STR,A2         ;SCRATCH STRING PTR
  899          MOVEQ   #0,D0          ;INIT CHAR COUNT
  900          MOVEQ   #0,D1          ;NO SIZE DELIMTER
  901 ;
  902 MNE1     MOVE.B  (A0)+,D6       ;FETCH CHAR
  903          BEQ     MNEEND         ;IF LINE LINK
  904 ;
  905          CMP.B   D5,D6          ;SPACE CHAR ?
  906          BEQ     MNEEND         ;IF SPACE
  907 ;
  908          CMPI.B  #".",D6        ;PERIOD DELIM'TR ?
  909          BEQ     PDLIM          ;IF SO
  910 ;
  911          MOVE.B  (A1,D6),D3     ;FETCH CHAR MASK
  912          ANDI.B  #$20,D3        ;AN ALPHA CHAR ?
  913          BEQ     ERR5M          ;ILLEGAL MNE CHAR
  914 ;
  915          MOVE.B  D6,(A2)+       ;STORE OP CODE CHAR
  916          ADDQ.W  #1,D0          ;INCR CHAR COUNT
  917          BRA     MNE1           ;NEXT CHAR
  918 ;
  919 ERR1M    MOVEQ   #1,D7          ;BAD LABEL CHAR
  920          BRA     ERRM
  921 ;
  922 ERR5M    MOVEQ   #5,D7          ;ILLEGAL MNEMONIC
  923          BRA     ERRM
  924 ;
  925 ERR4M    MOVEQ   #4,D7          ;BAD SIZE IDENT'FR
  926 ERRM     BRA     ERROR
  927 ;
  928          PAGE
  929 ; COPYRIGHT 1987 DTACK GROUNDED INC
  930 ;
  931 ;----------------------------
  932 ;-- SERVICE THE SIZE FIELD --
  933 ;----------------------------
  934 ;
  935 ; WE HAVE A PERIOD (".") SIZE DELIMITER;  CHECK
  936 ; FOR "B", "W", OR "L" SIZE IDENTIFIER.
  937 ;
  938 ; 0 = NO DELIMTR,  -1 = .B,  1 = .W,  2 = .L
  939 ;
  940 PDLIM    MOVE.B  (A0)+,D6       ;NEXT CHAR
  941          MOVEQ   #1,D1          ;ASSUME .W
  942          CMPI.B  #"W",D6        ;WORD ?
  943          BEQ     SIZEND         ;IF SO
  944 ;
  945          MOVEQ   #255,D1        ;ASSUME .B
  946          CMPI.B  #"B",D6        ;BYTE ?
  947          BEQ     SIZEND         ;IF SO
  948 ;
  949          MOVEQ   #2,D1          ;MUST BE .L
  950          CMPI.B  #"L",D6        ;LONG WORD ?
  951          BNE     ERR4M          ;BAD SIZE IDENT'FR
  952 ;
  953 SIZEND   MOVE.B  (A0)+,D6       ;NEXT CHAR
  954          CMP.B   D5,D6          ;A SPACE ?
  955          BNE     ERR4M          ;BAD SIZE IDENT'FR
  956 ;
  957 MNEEND   MOVE.B  D1,SIZEID      ;STORE THE SIZE
  958 ;
  959 ;------------------------------------
  960 ;-- FIND THE INDEX OF THE MNEMONIC --
  961 ;------------------------------------
  962 ;
  963 ; WE HAVE COLLECTED THE INSTRUCTION MNEMONIC
  964 ; (OR PSEUDO-OP) AND ITS SIZE FIELD, IF ANY.
  965 ;
  966 ; NOW CHECK FOR ITS POSITION IN THE MNE TABLE
  967 ;
  968          MOVEQ   #3,D7          ;POSSIBLE ERROR
  969          TST.W   D0             ;TEST CHAR COUNT
  970          BEQ     ERR            ;MNEMONIC MISSING
  971 ;
  972          MOVE.B  STR,D1         ;1ST MNE CHAR
  973          CMPI.B  #"M",D1        ;M ?
  974          BCS     TB             ;IF LESS
  975          BEQ     MM             ;IF M
  976 ;
  977          CMPI.B  #"R",D1        ;R ?
  978          BHI     TS             ;IF MORE
  979          BEQ     RR             ;IF R
  980 ;
  981          LEA     N,A3           ;PTR TO N
  982          MOVEQ   #80,D1
  983          BRA     MNE2
  984 ;
  985          PAGE
  986 ; COPYRIGHT 1987 DTACK GROUNDED INC
  987 ;
  988 RR       LEA     R,A3
  989          MOVEQ   #91,D1
  990          BRA     MNE2
  991 ;
  992 MM       LEA     M,A3
  993          MOVEQ   #73,D1
  994          BRA     MNE2
  995 ;
  996 TS       CMPI.B  #"S",D1        ;S ?
  997          BHI     TT             ;IF MORE
  998 ;
  999          LEA     S,A3
 1000          MOVEQ   #99,D1
 1001          BRA     MNE2
 1002 ;
 1003 TT       LEA     T,A3
 1004          MOVEQ   #125,D1
 1005          BRA     MNE2
 1006 ;
 1007 TB       CMPI.B  #"B",D1        ;B ?
 1008          BEQ     BB             ;IF B
 1009          BHI     TD             ;IF MORE
 1010 ;
 1011          LEA     A,A3
 1012          MOVEQ   #0,D1
 1013          BRA     MNE2
 1014 ;
 1015 BB       LEA     B,A3
 1016          MOVEQ   #11,D1
 1017          BRA     MNE2
 1018 ;
 1019 TD       CMPI.B  #"D",D1        ;D ?
 1020          BEQ     DD             ;IF D
 1021          BHI     TJ             ;IF MORE
 1022 ;
 1023          LEA     C,A3
 1024          MOVEQ   #31,D1
 1025          BRA     MNE2
 1026 ;
 1027 DD       LEA     D,A3
 1028          MOVEQ   #37,D1
 1029          BRA     MNE2
 1030 ;
 1031 TJ       CMPI.B  #"J",D1        ;J ?
 1032          BCC     JJ             ;IF J OR MORE
 1033 ;
 1034          LEA     E,A3
 1035          MOVEQ   #58,D1
 1036          BRA     MNE2
 1037 ;
 1038 JJ       LEA     J,A3
 1039          MOVEQ   #66,D1
 1040 ;
 1041 MNE2     LEA     STR,A2         ;PTR TO MNE START
 1042          LSL.W   #2,D1          ;MNE # --> INDEX
 1043          SUBQ.W  #4,D1          ;MNE OFFSET = -4
 1044          MOVEQ   #5,D7          ;POSSIBLE ERROR
 1045 ;
 1046          PAGE
 1047 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1048 ;
 1049 ; FIND A TABLE ENTRY WHOSE LENGTH IS THE SAME
 1050 ; (A ZERO LINK MARKS THE END OF THE TABLE)
 1051 ;
 1052 ; A2 = PTR TO MNEMONIC
 1053 ; A3 = PTR TO MNEMONIC TABLE
 1054 ; D0 = MNEMONIC LENGTH (IN BYTES)
 1055 ; D1 = MNEMONIC OFFSET (0, 4, 8, ...)
 1056 ;
 1057 MNE3     MOVE.B  (A3)+,D6       ;FETCH LINK
 1058          BEQ     ERR            ;ILLEGAL MNEMONIC
 1059 ;
 1060          ADDQ.W  #4,D1          ;INCR MNE OFFSET
 1061          MOVE.L  A3,A5          ;COPY PTR
 1062          ADD.L   D6,A3          ;PTR TO NEXT MNE
 1063          CMP.B   D0,D6          ;LENGTH MATCH ?
 1064          BNE     MNE3           ;IF NOT
 1065 ;
 1066 ; THE LENGTH OF THE MNEMONIC MATCHES THE STR
 1067 ;
 1068          MOVE.L  A2,A4          ;PTR TO TEMP STR
 1069          MOVE.B  D0,D3          ;COPY COUNT
 1070 MNE4     MOVE.B  (A4)+,D6       ;A CHAR OF 'STR'
 1071          CMP.B   (A5)+,D6       ;CHARS MATCH ?
 1072          BNE     MNE3           ;NO;  NEXT MNE
 1073 ;
 1074          SUBQ.B  #1,D3          ;DECR CHAR COUNT
 1075          BNE     MNE4           ;LOOP 'TIL ZERO
 1076 ;
 1077 ; THE MNEMONIC AND THE STRING MATCH !
 1078 ;
 1079          CMPI.W  #240,D1        ;MNE = 'EQU' ?
 1080          BEQ.L   EQU            ;IF SO
 1081 ;
 1082          LEA     JTBL68K,A2     ;JUMP ADR TABLE
 1083          MOVE.L  (A2,D1),D7     ;D7 = JUMP ADR
 1084          BMI     MNE5           ;IF MSB IS SET
 1085 ;
 1086 ; SET THE ADDRESS EVEN
 1087 ;
 1088          ADDQ.L  #1,ADDRESS     ;ROUND ADR UP
 1089          BCLR    #0,ADDRESS+3
 1090 ;
 1091 MNE5     TST.B   LBLFLG         ;A LABEL PRESENT ?
 1092          BEQ     MNE6           ;IF NOT
 1093 ;
 1094          MOVE.L  LBLTEMP,D2     ;LABEL IN D2.L, D3.L
 1095          MOVE.L  LBLTEMP+4,D3
 1096          MOVE.L  ADDRESS,ADRTEMP;SET LINE ADDRESS
 1097          BSR.L   SVCLBL         ;INSERT LABEL, ADR
 1098 ;
 1099 MNE6     MOVE.L  D7,A2          ;A2 = JUMP ADDRESS
 1100 ;
 1101 ; A0 = TEXT SCAN PTR
 1102 ; A1 = PTR TO CHAR MASK
 1103 ;
 1104          JSR     (A2)           ;SVC THE MNEMONIC
 1105          BRA     ASMLIN         ;NEXT LINE
 1106 ;
 1107          PAGE
 1108 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1109 ;
 1110 ;-------------------------------------------
 1111 ;-- SERVICE THE <EA>  (EFFECTIVE ADDRESS) --
 1112 ;-------------------------------------------
 1113 ;
 1114 ; DETERMINE THE NUMBER OF WORDS IN AN <EA> FIELD
 1115 ; AND MODIFY THE OP CODE FIELD SIZE ACCORDINGLY
 1116 ;
 1117 ; A1 = PTR TO CHAR MASK TABLE
 1118 ; A2 = PTR TO <EA> FIELD
 1119 ; D0 = # OF CHARS IN <EA> FIELD
 1120 ; D5 = OP CODE FIELD SIZE IN BYTES
 1121 ;
 1122 ; RETURN THE ADDRESS MODE (0-11) IN D4
 1123 ;
 1124 EA       MOVEQ   #0,D4          ;CLR ADDRESS MODE
 1125          MOVEQ   #0,D6          ;CLR UPPER BITS
 1126          MOVE.L  A2,A3          ;A3 = SCRATCH PTR
 1127          MOVE.B  (A3)+,D6       ;D6 = 1ST CHAR
 1128          CMPI.B  #"#",D6        ;"#" ?
 1129          BEQ.L   MODE11         ;IF SO
 1130 ;
 1131          CMPI.B  #2,D0          ;FIELD = 2 CHARS ?
 1132          BNE     MODE2          ;IF NOT
 1133 ;
 1134 ;
 1135 ;
 1136 ; CHECK FOR MODE 0, 'DN'
 1137 ;
 1138          CMPI.B  #"D",D6        ;"D" ?
 1139          BNE     MODE1          ;IF NOT
 1140 ;
 1141 ; MODE 0 IF NEXT CHAR IS NUMERIC
 1142 ;
 1143          MOVE.B  (A3)+,D6       ;NEXT CHAR
 1144          MOVE.B  (A1,D6),D3     ;CHAR MASK
 1145          ANDI.B  #$10,D3        ;NUMERIC ?
 1146          BNE     MODEX          ;DONE IF SO
 1147 ;
 1148          BRA.L   MODE7          ;PROBABLY A LABEL
 1149 ;
 1150 ;
 1151 ;
 1152 ; CHECK FOR MODE 1, 'AN'
 1153 ;
 1154 MODE1    CMPI.B  #"A",D6        ;1ST CHAR 'A' ?
 1155          BNE.L   MODE7          ;IF NOT
 1156 ;
 1157 ; MODE 1 IF NEXT CHAR IS NUMERIC
 1158 ;
 1159          MOVEQ   #1,D4          ;IN CASE ADR MODE 1
 1160          MOVE.B  (A3)+,D6       ;NEXT CHAR
 1161          MOVE.B  (A1,D6),D3     ;CHAR MASK
 1162          ANDI.B  #$10,D3        ;NUMERIC ?
 1163          BNE     MODEX          ;DONE IF SO
 1164 ;
 1165          BRA.L   MODE7          ;PROBABLY A LABEL
 1166 ;
 1167          PAGE
 1168 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1169 ;
 1170 ; CHECK FOR MODE 2, '(AN)'
 1171 ;
 1172 MODE2    CMPI.B  #"(",D6        ;LEFT PARENS ?
 1173          BNE     MODE4          ;IF NOT
 1174 ;
 1175          CMPI.B  #4,D0          ;(AN) ?
 1176          BCS     SYNER1         ;IF < 4 CHRS
 1177 ;
 1178          BNE     MODE3          ;IF NOT 4 CHARS
 1179 ;
 1180          CMPI.B  #"A",(A3)      ;"A" ?
 1181          BNE.L   MODE9          ;IF NOT
 1182 ;
 1183          ADDQ.L  #1,A3          ;PTR PAST "A"
 1184          BSR.L   CHKN           ;CHK NUM, )
 1185 ;
 1186          MOVEQ   #2,D4          ;ADDRESS MODE 2
 1187 MODEX    RTS                    ;DONE
 1188 ;
 1189 ;
 1190 ;
 1191 ; CHECK FOR MODE 3, '(AN)+'
 1192 ;
 1193 MODE3    CMPI.B  #5,D0          ;<EA> FLD 5 CHARS ?
 1194          BNE     MODE6          ;IF NOT
 1195 ;
 1196          BSR.L   CHKA           ;CHK A, NUM, )
 1197 ;
 1198          CMPI.B  #"+",(A3)+     ;MUST BE "+"
 1199          BNE     SYNER1         ;IF NOT
 1200 ;
 1201          MOVEQ   #3,D4          ;ADDRESS MODE 3
 1202          RTS                    ;DONE
 1203 ;
 1204 ;
 1205 ;
 1206 ; CHECK FOR MODE 4, '-(AN)'
 1207 ;
 1208 MODE4    CMPI.B  #"-",D6        ;MINUS ?
 1209          BNE     MODE5          ;IF NOT
 1210 ;
 1211          CMPI.B  #"(",(A3)+     ;LEFT PARENS ?
 1212          BNE     MODE5          ;IF NOT
 1213 ;
 1214 ; THE <EA> IS EITHER MODE 4 OR A SYNTAX ERROR
 1215 ;
 1216          SUBQ.B  #5,D0          ;5 CHARS ?
 1217          BNE     SYNER1         ;IF NOT
 1218 ;
 1219          MOVEQ   #4,D4          ;ADDRESS MODE 4
 1220          BRA.L   CHKA           ;CHK A, NUM, )
 1221 ;
 1222 ;
 1223 SYNER1   BRA     SYNERR         ;SYNTAX ERROR
 1224 ;
 1225          PAGE
 1226 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1227 ;
 1228 ; IS THE ADR MODE 7, 8 OR 5, 6, 9, 10 ?
 1229 ;
 1230 MODE5    CMPI.B  #5,D0          ;5 CHARS OR MORE ?
 1231          BCS     MODE7          ;IF NOT
 1232 ;
 1233          MOVE.L  A2,A3          ;SCRATCH PTR
 1234          ADD.L   D0,A3          ;PTR PAST FIELD
 1235          CMPI.B  #")",-(A3)     ;RIGHT PAREN ?
 1236          BNE     MODE7          ;IF NOT
 1237 ;
 1238 ; ADR MODE IS 5, 6, 9 OR 10 WITH DISPLACEMENT
 1239 ;
 1240          MOVE.L  A2,A3          ;<EXPR> PTR
 1241          MOVE.B  D0,D2          ;<EA> FIELD CNT
 1242          MOVEQ   #0,D1          ;INIT COUNT
 1243 ;
 1244 ; DETERMINE THE SIZE OF THE DISPLACEMENT FIELD
 1245 ;
 1246 MODE5A   CMPI.B  #"(",(A3)+     ;L PARENS ?
 1247          BEQ     MODE5B         ;IF SO
 1248 ;
 1249          SUBQ.B  #1,D2          ;DECR <EA> CNT
 1250          BEQ     SYNER1         ;"(" NOT FOUND
 1251 ;
 1252          ADDQ.B  #1,D1          ;INCR <EXPR> CNT
 1253          BRA     MODE5A         ;NEXT CHAR
 1254 ;
 1255 ; THE END OF THE DISPLACEMENT FIELD HAS BEEN FOUND
 1256 ; CHECK THE SYNTAX OF THE DISPLACEMENT FIELD
 1257 ;
 1258 MODE5B   SUB.B   D1,D0          ;DECR <EA> CNT
 1259          MOVE.L  A3,-(A7)       ;SAVE PTR A3
 1260          MOVE.L  A2,A3          ;START OF <EXPR>
 1261          BSR.L   CHKEXPR        ;CHK <EXPR> SYNTAX
 1262          MOVE.L  (A7)+,A3       ;RESTORE PTR A3
 1263          SUBQ.B  #1,D0          ;ADJ FOR "("
 1264 ;
 1265 ; WHICH ADR MODE?  MUST BE 5, 6, 9 OR 10.
 1266 ;
 1267 ; A3 = PTR PAST LEFT PARENS ("(")
 1268 ; D0 = REMAINING <EA> COUNT
 1269 ;
 1270          CMPI.B  #3,D0          ;3 CHARS LEFT ?
 1271          BNE     MODE6          ;IF NOT
 1272 ;
 1273          CMPI.B  #"P",(A3)      ;"P" ?
 1274          BEQ     MODE9          ;IF SO
 1275 ;
 1276 ; MUST BE MODE 5 ELSE ERROR;  CHK FOR A, NUM, )
 1277 ;
 1278          MOVEQ   #5,D4          ;SET MODE 5
 1279          ADDQ.B  #2,D5          ;DISPLACEMENT WORD
 1280          BRA     CHKA           ;CONTINUE
 1281 ;
 1282          PAGE
 1283 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1284 ;
 1285 ; CHECK FOR D8(AN,XI.S);   S = .W OR .L IF USED
 1286 ; 'D8' IS AN OPTIONAL DISPLACEMENT <EXPRESSION>
 1287 ; WHICH, IF PRESENT, HAS ALREADY BEEN CHECKED.
 1288 ;
 1289 ; "AN,XI)" OR "AN,XI.S)" REMAIN TO BE CHECKED
 1290 ;
 1291 MODE6    CMPI.B  #"A",(A3)      ;"A" ?
 1292          BNE.L   MODE10         ;IF NOT
 1293 ;
 1294          ADDQ.L  #1,A3          ;PTR PAST "A"
 1295          MOVE.B  (A3)+,D6       ;NEXT CHAR
 1296          MOVE.B  (A1,D6),D3     ;FETCH ATTR BYTE
 1297          CMPI.B  #$10,D3        ;NUMERIC ?
 1298          BEQ     SYNER1         ;IF NOT
 1299 ;
 1300          BSR.L   CHK610         ;SYNTAX CHECK
 1301          MOVEQ   #6,D4          ;SET MODE 6
 1302          ADDQ.B  #2,D5          ;DISPLACEMENT WORD
 1303          RTS                    ;MODE 6 DONE
 1304 ;
 1305 ;
 1306 ;
 1307 ; CHECK FOR MODE 7, 'ABS.W'
 1308 ;
 1309 ; FIRST CHECK THE SYNTAX OF THE <EXPRESSION>
 1310 ;
 1311 MODE7    MOVE.B  D0,D1          ;<EA> FIELD CNT
 1312          MOVE.L  A2,A3          ;<EA> FIELD PTR
 1313          BSR.L   CHKEXPR        ;CHK <EXPR> SYNTAX
 1314 ;
 1315 ; THE <EXPRESSION> SYNTAX HAS BEEN BLESSED;
 1316 ; CHECK FOR A 'WEIRD' LABEL (E.G. CCR).
 1317 ;
 1318          BSR.L   CHKWEIRD       ;Z CLR IF WEIRD
 1319          BNE     MODE7B         ;.W IF WEIRD
 1320 ;
 1321 ; NOT A 'WEIRD' LABEL, EVALUATE <EXPRESSION>
 1322 ;
 1323          MOVE.B  D0,D1          ;<EA> FIELD CNT
 1324          MOVE.L  A2,A3          ;<EA> FIELD PTR
 1325          BSR.L   EVALEXPR       ;EVALUATE <EXPR>
 1326          BNE     MODE7A         ;IF NOT FORWARD
 1327 ;
 1328 ; WE HAVE A FORWARD REFERENCE.  THE FLAG 'FORWARD'
 1329 ; DETERMINES WHETHER IT IS SHORT (.W) OR LONG (.L)
 1330 ;
 1331          TST.B   FORWARD        ;.W ?
 1332          BEQ     MODE7B         ;IF SO
 1333          BNE     MODE7C         ;IF NOT
 1334 ;
 1335 ; THE ADDRESS IN D3.L IS THE COMPLETE <EA> ADR;
 1336 ; IS THE ADDRESS LENGTH .W OR .L ?
 1337 ;
 1338 MODE7A   CMP.L   SHRT,D3        ;.W OR .L ?
 1339          BHI     MODE7C         ;IF D3 > SHORT
 1340 ;
 1341          PAGE
 1342 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1343 ;
 1344 ; THE ADDRESS IS A WORD FIELD (XXX.W)
 1345 ;
 1346 MODE7B   ADDQ.W  #2,D5          ;ONE MORE WORD
 1347          MOVEQ   #7,D4          ;ADDRESS MODE 7
 1348          RTS                    ;DONE
 1349 ;
 1350 ; THE ADDRESS IS A LONG-WORD FIELD (XXX.L)
 1351 ;
 1352 MODE7C   ADDQ.W  #4,D5          ;TWO MORE WORDS
 1353          MOVEQ   #8,D4          ;ADDRESS MODE 8
 1354          RTS                    ;DONE
 1355 ;
 1356 ;
 1357 ;
 1358 ; CHECK FOR D16(PC);  D16 = <EXPRESSION>
 1359 ; SYNTAX:  <EXPRESSION>(PC)
 1360 ;          (THE <EXPRESSION> IS OPTIONAL)
 1361 ;
 1362 MODE9    CMPI.B  #"P",(A3)+     ;"P" ?
 1363          BNE     SYNER2         ;IF NOT
 1364 ;
 1365          CMPI.B  #"C",(A3)+     ;"C" ?
 1366          BNE     SYNER2         ;IF NOT
 1367 ;
 1368          CMPI.B  #")",(A3)+     ;R PARENS ?
 1369          BNE     SYNER2         ;IF NOT
 1370 ;
 1371          MOVEQ   #9,D4          ;SET MODE 9
 1372          ADDQ.B  #2,D5          ;DISPLACEMENT WORD
 1373          RTS                    ;MODE 9 DONE
 1374 ;
 1375 ;
 1376 ;
 1377 ; SUBROUTINE;  CHK "A", NUM, ")"
 1378 ;
 1379 CHKA     CMPI.B  #"A",(A3)+     ;"A" ?
 1380          BNE     SYNER2         ;IF NOT
 1381 ;
 1382 CHKN     MOVE.B  (A3)+,D6       ;NEXT CHAR
 1383          MOVE.B  (A1,D6),D3     ;FETCH CHAR MASK
 1384          ANDI.B  #$10,D3        ;MUST BE NUMERIC
 1385          BEQ     SYNER2         ;IF NOT
 1386 ;
 1387          CMPI.B  #")",(A3)+     ;MUST BE ")"
 1388          BNE     SYNER2         ;IF NOT
 1389 ;
 1390          RTS                    ;DONE
 1391 ;
 1392 ;
 1393 SYNER2   BRA     SYNERR         ;SYNTAX ERROR
 1394 ;
 1395 ; CHECK FOR D8(PC,IX.S);   S = .W OR .L IF USED
 1396 ; 'D8' IS AN OPTIONAL DISPLACEMENT <EXPRESSION>
 1397 ; WHICH, IF PRESENT, HAS ALREADY BEEN CHECKED.
 1398 ;
 1399          PAGE
 1400 ; COPYRIGHT 1987 DTACK GROUNDED INC
 1401 ;
 1402 ; "PC,XI)" OR "PC,XI.S)" REMAINS TO BE CHECKED
 1403 ;
 1404 MODE10   CMPI.B  #"P",(A3)+     ;"P" ?
 1405          BNE     SYNER2         ;IF NOT
 1406 ;
 1407          CMPI.B  #"C",(A3)+     ;"C" ?
 1408          BNE     SYNER2         ;IF NOT
 1409 ;
 1410          BSR     CHK610         ;SYNTAX CHECK
 1411          MOVEQ   #10,D4         ;SET MODE 10
 1412          ADDQ.B  #2,D5          ;DISPLACEMENT WORD
 1413          RTS                    ;MODE 10 DONE
 1414 ;
 1415 ; SUBROUTINE;  CHK SYNTAX OF ",XI)" OR ",XI.S"
 1416 ; (THIS SUBROUTINE CALLED BY MODES 6 AND 10)
 1417 ;
 1418 CHK610   CMPI.B  #",",(A3)+     ;COMMA ?
 1419          BNE     SYNER2         ;IF NOT
 1420 ;
 1421          MOVE.B  (A3)+,D6       ;NEXT CHAR
 1422          CMPI.B  #"A",D6        ;"A" ?
 1423          BEQ     CHK610A        ;IF SO
 1424 ;
 1425          CMPI.B  #"D",D6        ;"D" ?
 1426          BNE     SYNER2         ;IF NOT
 1427 ;
 1428 CHK610A  MOVE.B  (A3)+,D6       ;NEXT CHAR
 1429          MOVE.B  (A1,D6),D3     ;FETCH ATTR BYTE
 1430          ANDI.B  #$10,D3        ;NUMERIC ?
 1431          BEQ     SYNER2         ;IF NOT
 1432 ;
 1433          MOVE.B  (A3)+,D6       ;NEXT CHAR
 1434          CMPI.B  #")",D6        ;R PARENS ?
 1435          BEQ     CHK610X        ;IF SO
 1436 ;
 1437          CMPI.B  #".",D6        ;"." ?
 1438          BNE     SYNER2         ;IF NOT
 1439 ;
 1440          MOVE.B  (A3)+,D6       ;NEXT CHAR
 1441          CMPI.B  #"L",D6        ;"L" ?
 1442          BEQ     CHK610B        ;IF SO
 1443 ;
 1444          CMPI.B  #"W",D6        ;"W" ?
 1445          BNE     SYNER2         ;IF NOT
 1446 ;
 1447 CHK610B  CMPI.B  #")",(A3)+     ;R PARENS ?
 1448          BNE     SYNER2         ;IF NOT
 1449 ;
 1450 CHK610X  RTS                    ;SYNTAX CHECKED
 1451 ;
 1452 ; SERVICE MODE 11, IMMEDIATE DATA
 1453 ;
 1454 MODE11   MOVE.B  D0,D1          ;<EA> FIELD CNT
 1455          SUBQ.B  #1,D1          ;ADJ FOR "#"
 1456          BSR.L   CHKEXPR        ;CHK <EXPR> SYNTAX
 1457          MOVEQ   #11,D4         ;ADDRESS MODE 11
 1458          RTS                    ;DONE
 1459 ;
