; > Assembler
ASS     MOV     R10,#3
        STRB    R10,[ARGP,#BYTESM]
CASM    MOV     AELINE,LINE
        BL      AESPAC
        TEQ     R10,#"."
        BNE     CASM1
        BL      LVBLNK
        BNE     CASM1A
        BCS     ERSYNT
        BL      CREATE
CASM1A  CMP     TYPE,#128
        BCS     ERTYPENUM
        MOV     R4,IACC
        MOV     R5,TYPE
        LDR     IACC,[ARGP,#ASSPC]
        MOV     TYPE,#4
        BL      STOREA
        BL      AESPAC
CASM1   TEQ     R10,#"]"
        MVNEQ   R10,#0
        STREQB  R10,[ARGP,#BYTESM]
        MOVEQ   LINE,AELINE
;Do IMB here, if SA-compatible, all EQ-conditional
 [ STRONGARM = 1
        MOVEQ   R10, R0
        MOVEQ   R0, #0
        SWIEQ   XOSSYNCHRONISECODEAREAS
        MOVEQ   R0, R10
 ]
;---
        BEQ     STMT
        MOV     R2,#0
        TEQ     R10,#":"
        TEQNE   R10,#13
        BEQ     CASMX
        CMP     R10,#"\"
        CMPNE   R10,#";"
        CMPNE   R10,#TREM
        BEQ     CASMXCOM
        CMP     R10,#"="
        BEQ     CASMDCB
        CMP     R10,#"&"
        BEQ     CASMEQUD
        TEQ     R10,#TFN
        BEQ     CASMFN
        CMP     R10,#&7F
        BHS     CASMTOK
CASM1B  LDRB    R1,[AELINE]
        BIC     R1,R1,#" "
        CMP     R10,#TOR
        CMPEQ   R1,#"R"
        LDREQ   R2,CASMTBORR
        ADDEQ   AELINE,AELINE,#1
        BEQ     CASMGT1
        CMP     R10,#TMOVE
        BEQ     CASMMOVEQ
        BIC     R10,R10,#" "
        TEQ     R10,#"B"
        BEQ     CASMB
CASM2A  ORR     R0,R10,R1,LSL #8
        LDRB    R1,[AELINE,#1]
        BIC     R1,R1,#" "
        ORR     R0,R0,R1,LSL #16
        MOV     R0,R0,LSL #8
        ADR     R1,CASMTB
CASM2   LDR     R2,[R1],#4
        TEQ     R0,R2,LSL #8
        BEQ     CASMGT
        TEQ     R2,#0
        BNE     CASM2
        B       ERASS1
CASMTOK ADR     R1,CASMTOKTB
CASMTK2 LDRB    R2,[R1],#2
        TEQ     R10,R2
        TEQNE   R2,#0
        BNE     CASMTK2
        TEQ     R2,#0
        BEQ     CASM1B
        LDRB    R2,[R1,#-1]
        LDR     R2,[PC,R2,LSL #2]
        B       CASMGT1

CASMTB    = "SWI",&8F
          = "ADC",&05
          = "ADD",&04
CASMTBAND = "AND",&00
          = "BIC",&0E
          = "CMN",&1B
          = "CMP",&1A
CASMTBEOR = "EOR",&01
          = "MOV",&2D
          = "MVN",&2F
CASMTBORR = "ORR",&0C
          = "RSB",&03
          = "RSC",&07
          = "SBC",&06
          = "SUB",&02
          = "TEQ",&19
          = "TST",&18
          = "MUL",&30
          = "MLA",&31
          = "LDR",&44
          = "STR",&54
          = "LDM",&68
          = "STM",&78
          = "OPT",&F0
          = "EQU",&F1
          = "DCB",&F2
          = "DCW",&F3
          = "DCD",&F4
          = "ADR",&F5
          = "ALI",&F6
          = "CDP",&90
          = "MCR",&94
          = "MRC",&96
          = "STC",&98
          = "LDC",&9C
          = "SWP",&A0
          = "MSR",&A1
          = "MRS",&A3
          = "ADF",&D0
          = "MVF",&E0
          = "MUF",&D1
          = "MNF",&E1
          = "SUF",&D2
CASMTBABS = "ABS",&E2
          = "RSF",&D3
CASMTBRND = "RND",&E3
          = "DVF",&D4
          = "SQT",&E4
          = "RDF",&D5
CASMTBLOG = "LOG",&E5
          = "POW",&D6
          = "LGN",&E6
          = "RPW",&D7
CASMTBEXP = "EXP",&E7
          = "RMF",&D8
CASMTBSIN = "SIN",&E8
          = "FML",&D9
CASMTBCOS = "COS",&E9
          = "FDV",&DA
CASMTBTAN = "TAN",&EA
          = "FRD",&DB
CASMTBASN = "ASN",&EB
          = "POL",&DC
CASMTBACS = "ACS",&EC
CASMTBATN = "ATN",&ED
          = "URD",&EE
          = "NRM",&EF
          = "FLT",&C0
          = "FIX",&C1
          = "WFS",&C2
          = "RFS",&C3
          = "WFC",&C4
          = "RFC",&C5
          = "CMF",&C9
          = "CNF",&CB
          = "STF",&B0
          = "LDF",&B4
          = "SFM",&B8
          = "LFM",&BC
          = "DCF",&F7
          = "UMU",&34
          = "UML",&35
          = "SMU",&36
          = "SML",&37
          = "NOP",&FF
          & 0
CASMTOKTB
        = TAND, (CASMTBAND - CASMTB):SHR:2
        = TEOR, (CASMTBEOR - CASMTB):SHR:2
        = TABS, (CASMTBABS - CASMTB):SHR:2
        = TRND, (CASMTBRND - CASMTB):SHR:2
        = TLOG, (CASMTBLOG - CASMTB):SHR:2
        = TEXP, (CASMTBEXP - CASMTB):SHR:2
        = TSIN, (CASMTBSIN - CASMTB):SHR:2
        = TCOS, (CASMTBCOS - CASMTB):SHR:2
        = TTAN, (CASMTBTAN - CASMTB):SHR:2
        = TASN, (CASMTBASN - CASMTB):SHR:2
        = TACS, (CASMTBACS - CASMTB):SHR:2
        = TATN, (CASMTBATN - CASMTB):SHR:2
        = 0
        ALIGN

CASMGT  ADD     AELINE,AELINE,#2
CASMGT1 CMP     R2,#&F0000000
        BCS     CASMOPS
        BL      ALIGN ;definitely an opcode, so align
        AND     R1,R2,#&0F000000
        CMP     R2,#&40000000
        MOVLO   R1,R1,LSR #3
        CMP     R2,#&C0000000
        MOVHS   R1,R1,LSR #4
        MOV     R4,R2,LSR #28
        BL      DOCOND
        ADR     R0,CASMTABLE
        LDR     R3,[R0,R4,LSL #2]
        ADD     PC,PC,R3
ASMAJ   *       .+4
CASMTABLE
        &       CASMTHREEDATA-ASMAJ
        &       CASMTWOCMP   -ASMAJ
        &       CASMTWOMOV   -ASMAJ
        &       CASMMUL      -ASMAJ
        &       CASMLDR      -ASMAJ
        &       CASMSTR      -ASMAJ
        &       CASMLDM      -ASMAJ
        &       CASMSTM      -ASMAJ
        &       CASMSWI      -ASMAJ
        &       CASMCP       -ASMAJ
        &       CASMARM6     -ASMAJ
        &       CASMFPDT     -ASMAJ
        &       CASMFPRT     -ASMAJ
        &       CASMFPTHREEOP-ASMAJ
        &       CASMFPTWOOP  -ASMAJ

CASMLDM ORR     R1,R1,#&100000
CASMSTM LDRB    R10,[AELINE],#1
        BIC     R2,R10,#" "
        LDRB    R0,[AELINE],#1
        BIC     R0,R0,#" "
        ORR     R0,R2,R0,LSL #8
        MOV     R0,R0,LSL #16
        ADR     R2,STMTAB
CASMSTM1
        LDR     R3,[R2],#4
        TEQ     R3,#0
        BEQ     ERSYNT
        CMP     R0,R3,LSL #16
        BNE     CASMSTM1
        TST     R1,#&100000 ;if LDM
        MOVNE   R3,R3,LSL #8 ;use other value
        AND     R3,R3,#&FF000000
        ORR     R1,R1,R3,LSR #1
        BL      CHKREGSPC
        ORR     R1,R1,R0,LSL #16
        BL      AESPAC
        CMP     R10,#"!"
        ORREQ   R1,R1,#&200000
        BLEQ    AESPAC
        CMP     R10,#","
        BNE     ERCOMM
        BL      AESPAC
        CMP     R10,#"{"
        BNE     ERASSB2
CASMSTM2
        BL      CHKREGSPC
        MOV     R3,#1
        ORR     R1,R1,R3,LSL R0
        BL      AESPAC
        CMP     R10,#","
        BEQ     CASMSTM2
        CMP     R10,#"-"
        BNE     CASMSTM3
        STMFD   SP!,{R0,R3}
        BL      CHKREGSPC
        LDMFD   SP!,{R2,R3}
        CMP     R0,R2
        BEQ     CASMSTM5
        MOVCS   R14,R0
        MOVCS   R0,R2
        MOVCS   R2,R14 ;swap if r0 > r2
CASMSTM4
        ORR     R1,R1,R3,LSL R0
        ADD     R0,R0,#1
        CMP     R0,R2
        BNE     CASMSTM4
        ORR     R1,R1,R3,LSL R0
CASMSTM5
        BL      AESPAC
        CMP     R10,#","
        BEQ     CASMSTM2
CASMSTM3
        CMP     R10,#"}"
        BNE     ERASSB3
        BL      AESPAC
        CMP     R10,#"^"
        ORREQ   R1,R1,#&400000
        BLEQ    AESPAC
        B       CASMICHK
STMTAB  = "IA",1,1
        = "IB",3,3
        = "DA",0,0
        = "DB",2,2
        = "FA",0,3
        = "FD",1,2
        = "EA",2,1
        = "ED",3,0
        = 0,0,0,0
CASMLDR ORR     R1,R1,#&100000
CASMSTR ORR     R1,R1,#&800000
        LDRB    R10,[AELINE]
        BIC     R10,R10,#" "
        TEQ     R10,#"S"
        TEQNE   R10,#"H"
        BEQ     CASMLDRH
        TEQ     R10,#"B"
        ORREQ   R1,R1,#&400000
        ADDEQ   AELINE,AELINE,#1
        LDREQB  R10,[AELINE]
        TEQ     R10,#"t"
        TEQNE   R10,#"T"
        ORREQ   R1,R1,#&200000
        ADDEQ   AELINE,AELINE,#1
CASMLDSTCOMMON3
        BL      CHKREGSPC
CASMLDSTCOMMON
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
CASMLDSTCOMMON2
        CMP     R10,#"["
        BNE     CASMLDRLABEL
        BL      CHKREGSPC
        ORR     R1,R1,R0,LSL #16
        BL      AESPAC
        CMP     R10,#"]"
        BEQ     CASMPOST
        ADD     R1,R1,#&1000000
        CMP     R10,#","
        BNE     ERCOMM
        BL      AESPAC
        CMP     R10,#"#"
        BEQ     CASMPREIM
        TST     R1,#&8000000
        BNE     ERSYNT
        CMP     R10,#"-"
        BICEQ   R1,R1,#&800000
        BLEQ    AESPAC
        BL      CHKREG
        ORR     R1,R1,R0
        BL      AESPAC
        TST     R1,#&4000000
        ORRNE   R1,R1,#&2000000
        BICEQ   R1,R1,#&400000
        BEQ     CASMPREEND
        CMP     R10,#","
        BLEQ    CASMDATASHIFT
        B       CASMPREEND
CASMPREIM
        BL      ASMEXPR
        SUB     AELINE,AELINE,#1
        BL      PACKPOST
        BL      AESPAC
CASMPREEND
        CMP     R10,#"]"
        BNE     ERASSB1
        BL      AESPAC
        CMP     R10,#"!"
        ORREQ   R1,R1,#&200000
        BLEQ    AESPAC
        B       CASMICHK
CASMPOST
        BL      AESPAC
        CMP     R10,#","
        ADDNE   R1,R1,#&1000000
        BNE     CASMICHK
        BL      AESPAC
        CMP     R10,#"#"
        BEQ     CASMPOSTIM
        TST     R1,#&8000000
        BNE     ERSYNT
        CMP     R10,#"-"
        BICEQ   R1,R1,#&800000
        BLEQ    AESPAC
        BL      CHKREG
        ORR     R1,R1,R0
        BL      AESPAC
        TST     R1,#&4000000
        ORRNE   R1,R1,#&2000000
        BICEQ   R1,R1,#&400000
        BEQ     CASMICHK
        CMP     R10,#","
        BLEQ    CASMDATASHIFT
        B       CASMICHK
CASMPOSTIM
        TST     R1,#&8000000
        ORRNE   R1,R1,#&200000
        BL      ASMEXPR
        BL      PACKPOST
        B       CASMICHK
CASMLDRLABEL
        SUB     AELINE,AELINE,#1
        BL      ASMEXPR
        LDR     R2,[ARGP,#ASSPC]
        ADD     R2,R2,#8
        SUB     IACC,IACC,R2
        ORR     R1,R1,#&F0000 ;base reg PC
        ADD     R1,R1,#&1000000 ;pre index mode
        BL      PACKPOST
        B       CASMICHK
PACKPOST
        TEQ     IACC,#0
        BICMI   R1,R1,#&800000
        RSBMI   IACC,IACC,#0
        TST     R1,#&8000000
        BNE     PACKPOSTCP
        TST     R1,#&4000000
        BEQ     PACKPOSTH
        CMP     IACC,#&1000
        ORRCC   R1,R1,IACC
        MOVCC   PC,R14
PACKPOSTBAD
        LDRB    R0,[ARGP,#BYTESM]
        TST     R0,#2
        MOVEQ   PC,R14
        B       ERASS2A
PACKPOSTCP
        TST     IACC,#3
        BNE     PACKPOSTBAD
        CMP     IACC,#&400
        BHS     PACKPOSTBAD
        ORR     R1,R1,IACC,LSR #2
        MOV     PC,R14
PACKPOSTH
        STMFD   SP!,{R14}
        CMP     IACC,#&100
        BHS     PACKPOSTBAD
        AND     R14,IACC,#&F
        ORR     R1,R1,R14
        AND     R14,IACC,#&F0
        ORR     R1,R1,R14,LSL #4
        LDMFD   SP!,{PC}
CASMLDRH
        ADD     AELINE,AELINE,#1
        BIC     R1,R1,#&4000000
        ORR     R1,R1,#&400000
        TEQ     R10,#"H"
        ORREQ   R1,R1,#&B0
        BEQ     CASMLDSTCOMMON3
        TST     R1,#&100000
        BEQ     ERASS1
        ORR     R1,R1,#&D0
        LDRB    R10,[AELINE],#1
        BIC     R10,R10,#" "
        TEQ     R10,#"B"
        BEQ     CASMLDSTCOMMON3
        TEQ     R10,#"H"
        BNE     ERASS1
        ORR     R1,R1,#&20
        B       CASMLDSTCOMMON3

CASMMOVEQ
        CMP     R1,#"Q"
        BNE     ERASS1
        BL      ALIGN
        MOV     R1,#&1A00000
        ADD     AELINE,AELINE,#1
CASMTWOMOV
        LDRB    R10,[AELINE],#1
        CMP     R10,#"S"
        CMPNE   R10,#"s"
        ORREQ   R1,R1,#&100000
        LDREQB  R10,[AELINE],#1
        BL      CHKREGSPCCONT
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
        B       CASMONES2
CASMTWOCMP
        ORR     R1,R1,#&100000
        LDRB    R10,[AELINE]
        CMP     R10,#"S"
        CMPNE   R10,#"s"
        ADDEQ   AELINE,AELINE,#1
        CMP     R10,#"P"
        CMPNE   R10,#"p"
        ADDEQ   AELINE,AELINE,#1
        ORREQ   R1,R1,#&F000
        BL      AESPAC
        B       CASMTWORN
CASMTHREEDATA
        LDRB    R10,[AELINE],#1
        CMP     R10,#"S"
        CMPNE   R10,#"s"
        ORREQ   R1,R1,#&100000
        LDREQB  R10,[AELINE],#1
        BL      CHKREGSPCCONT
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
CASMTWORN
        BL      CHKREG
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #16
CASMONES2
        CMP     R10,#"#"
        BEQ     CASMDATAIM
        BL      CHKREG
        ORR     R1,R1,R0
        BL      AESPAC
        CMP     R10,#","
        BLEQ    CASMDATASHIFT
        B       CASMICHK
CASMDATASHIFT
        STMFD   SP!,{R14}
        BL      AESPAC
        BIC     R0,R10,#" "
        LDRB    R2,[AELINE],#1
        BIC     R2,R2,#" "
        LDRB    R3,[AELINE],#1
        BIC     R3,R3,#" "
        ORR     R0,R0,R2,LSL #8
        ORR     R0,R0,R3,LSL #16
        MOV     R0,R0,LSL #8
        ADR     R2,CASMDATASHIFTTAB
CASMDATASHIFT1
        LDR     R3,[R2],#4
        TEQ     R3,#0
        BEQ     ERSYNT
        CMP     R0,R3,LSL #8
        BNE     CASMDATASHIFT1
        BL      AESPAC
        MOVS    R3,R3,LSL #4
        MOV     R3,R3,LSR #24
        AND     R3,R3,#&F0
        ORR     R1,R1,R3
        LDMCCFD SP!,{PC} ;RRX
        CMP     R10,#"#"
        BEQ     CASMDATASHIFTCONST
        TST     R1,#&0C000000
        BNE     ERASS2S ;check for LDR/STR (or, indeed, any not dp)
        ORR     R1,R1,#&10
        BL      CHKREG
        ORR     R1,R1,R0,LSL #8
        BL      AESPAC
        LDMFD   SP!,{PC}
CASMDATASHIFTCONST
        BL      ASMEXPR
        ANDS    R2,R1,#&60
        BEQ     CASMDATASHIFTCONSTNOZEROCHK
        TEQ     R0,#0
        BEQ     ERASS2S ;shift by zero not allowed for LSR, ASR, ROR
CASMDATASHIFTCONSTNOZEROCHK
        EOR     R2,R2,R2,LSR #1
        ANDS    R2,R2,#&20
        BNE     CASMDATASHIFTCONSTCHECK33
        CMP     R0,#32
        BCS     ERASS2S
CASMDATASHIFTCONSTCHECK33
        CMP     R0,#33
        BCS     ERASS2S
        AND     R0,R0,#31
        ORR     R1,R1,R0,LSL #7
        LDMFD   SP!,{PC}
CASMDATASHIFTTAB
        = "ASL",&10
        = "LSL",&10
        = "LSR",&12
        = "ASR",&14
        = "ROR",&16
        = "RRX",&06
        = 0,0,0,0
CASMDATAIM
        ORR     R1,R1,#&2000000
        BL      ASMEXPR
        MOV     R2,#0
CASMDATAIM1
        CMP     R0,#&100
        BCC     CASMDATAIM2
        MOV     R0,R0,ROR #30
        ADDS    R2,R2,#1
        CMP     R2,#16
        BNE     CASMDATAIM1
        LDRB    R3,[ARGP,#BYTESM]
        TST     R3,#2
        BNE     ERASS2
CASMDATAIM2
        ORR     R1,R1,R0
        ORR     R1,R1,R2,LSL #8
        B       CASMICHK
CASMMUL ORR     R1,R1,#&90
        TST     R1,#&800000
        BNE     CASMMULL
        LDRB    R10,[AELINE]
        CMP     R10,#"S"
        CMPNE   R10,#"s"
        ORREQ   R1,R1,#&100000
        ADDEQ   AELINE,AELINE,#1
        BL      CHKREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #16 ;"Rd" is the normal Rn field
        BL      CHKREG
        ORR     R1,R1,R0 ;next register is Rm
        AND     R4,R1,#&F0000
        CMP     R4,R0,LSL #16
        BEQ     ERASSMUL ;error if Rm same as Rd(Rn)
        BL      CHKCOM
        BL      CHKREG
        ORR     R1,R1,R0,LSL #8 ;last reg is Rs
        TST     R1,#&200000
        BEQ     CASMMUL2
        BL      CHKCOM
        BL      CHKREG
        ORR     R1,R1,R0,LSL #12 ;last for MLA
CASMMUL2
        BL      AESPAC
        B       CASMICHK
CASMMULL
        TST     R1,#&200000
        BNE     CASMMLAL
        LDRB    R10,[AELINE],#1
        BIC     R10,R10,#" "
        TEQ     R10,#"L"
        LDREQB  R10,[AELINE],#1
        BICEQ   R10,R10,#" "
        TEQEQ   R10,#"L"
        BNE     ERASS1
        B       CASMMULL2
CASMMLAL
        LDRB    R10,[AELINE,#-2]   ; DOCOND will have grabbed the AL
        BIC     R10,R10,#" "
        TEQ     R10,#"A"
        BNE     ERASS1
CASMMULL2
        BIC     R1,R1,#&F0000000
        BL      DOCOND
        LDRB    R10,[AELINE]
        BIC     R10,R10,#" "
        TEQ     R10,#"S"
        ORREQ   R1,R1,#&100000
        ADDEQ   AELINE,AELINE,#1
        BL      CHKREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12 ; RdLo
        BL      CHKREG
        ORR     R1,R1,R0,LSL #16 ; RdHi
        BL      CHKCOM
        BL      CHKREG
        ORR     R1,R1,R0         ; Rm
        AND     R4,R1,#&F000
        AND     R10,R1,#&F0000
        TEQ     R0,R4,LSR #12    ; Is Rm=RdLo?
        TEQNE   R0,R10,LSR #16   ; Is Rm=RdHi?
        TEQNE   R4,R10,LSR #4    ; Is RdLo=RdHi?
        BEQ     ERASSMUL
        BL      CHKCOM
        BL      CHKREG
        ORR     R1,R1,R0,LSL #8  ; Rs
        BL      AESPAC
        B       CASMICHK
CASMSWI STMFD   SP!,{R1}
        BL      EXPR
        TEQ     TYPE,#0
        BNE     CASMSWI1
        MOV     R0,#0
        STRB    R0,[CLEN]
        ADD     R1,ARGP,#STRACC
        SWI     SWINUMBERFROMSTRING
        B       CASMSWI2
CASMSWI1
        BLMI    SFIX
CASMSWI2
        LDMFD   SP!,{R1}
        BIC     R0,R0,#&FF000000
        ORR     R1,R1,R0
        B       CASMICHK
CASMCP  ANDS    R10,R1,#&F000000
        BEQ     CASMCDP
        CMP     R10,#&8000000
        BHS     CASMCPDT
CASMCPRT
        ORR     R1,R1,#&10
        TST     R10,#&2000000
        ORRNE   R1,R1,#&100000
        BL      CHKCOPROSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #8
        SUB     AELINE,AELINE,#1
        BL      ASMEXPR
        CMP     R0,#7
        BHI     ERASS2C
        ORR     R1,R1,R0,LSL #21
        SUB     AELINE,AELINE,#1
        BL      CHKCOM
        BL      CHKREG
CASMCPCOMMON
        ORR     R1,R1,#&E000000
        ORR     R1,R1,R0,LSL #12
        BL      CHKCOM
        BL      CHKCPREG
        ORR     R1,R1,R0,LSL #16
        BL      CHKCOM
        BL      CHKCPREG
        ORR     R1,R1,R0
        BL      AESPAC
        TEQ     R10,#","
        BNE     CASMICHK
        BL      ASMEXPR
        CMP     R0,#7
        BHI     ERASS2C
        ORR     R1,R1,R0,LSL #5
        B       CASMICHK
CASMCDP
        BL      CHKCOPROSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #8
        SUB     AELINE,AELINE,#1
        BL      ASMEXPR
        CMP     R0,#15
        BHI     ERASS2C
        ORR     R1,R1,R0,LSL #20
        SUB     AELINE,AELINE,#1
        BL      CHKCOM
        BL      CHKCPREG
        B       CASMCPCOMMON
CASMCPDT
        ORRNE   R1,R1,#&100000
        ORR     R1,R1,#&C000000
        ORR     R1,R1,#&800000
        LDRB    R10,[AELINE]
        TEQ     R10,#"L"
        TEQNE   R10,#"l"
        ORREQ   R1,R1,#&400000
        ADDEQ   AELINE,AELINE,#1
        BL      CHKCOPROSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #8
        BL      CHKCPREG
        B       CASMLDSTCOMMON
CASMARM6
        ANDS    R10,R1,#&F000000
        BEQ     CASMSWP
        CMP     R10,#&1000000
        BHI     CASMMRS
CASMMSR ORR     R1,R1,#&F000
        ORR     R1,R1,#&200000
        BL      AESPAC
        BL      CHKPSR
        LDRB    R10,[AELINE],#1
        TEQ     R10,#"_"
        BNE     ERSYNT
CASMMSR1
        LDRB    R10,[AELINE],#1
        ORR     R10,R10,#" "
        TEQ     R10,#"c"
        ORREQ   R1,R1,#&10000
        BEQ     CASMMSR1
        TEQ     R10,#"x"
        ORREQ   R1,R1,#&20000
        BEQ     CASMMSR1
        TEQ     R10,#"s"
        ORREQ   R1,R1,#&40000
        BEQ     CASMMSR1
        TEQ     R10,#"f"
        ORREQ   R1,R1,#&80000
        BEQ     CASMMSR1
        SUB     AELINE,AELINE,#1
        BL      CHKCOM
        TEQ     R10,#"#"
        BEQ     CASMDATAIM
        BL      CHKREG
        ORR     R1,R1,R0
        BL      AESPAC
        B       CASMICHK
CASMMRS BIC     R1,R1,#&2000000
        ORR     R1,R1,#&F0000
        BL      CHKREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
        BL      CHKPSR
        BL      AESPAC
        B       CASMICHK
CHKPSR  BIC     R10,R10,#" "
        TEQ     R10,#"S"
        ORREQ   R1,R1,#&400000
        TEQNE   R10,#"C"
        BNE     ERSYNT
        LDRB    R10,[AELINE],#1
        TEQ     R10,#"P"
        TEQNE   R10,#"p"
        BNE     ERSYNT
        LDRB    R10,[AELINE],#1
        TEQ     R10,#"S"
        TEQNE   R10,#"s"
        BNE     ERSYNT
        LDRB    R10,[AELINE],#1
        TEQ     R10,#"R"
        TEQNE   R10,#"r"
        BNE     ERSYNT
        MOV     PC,R14
CASMSWP ORR     R1,R1,#&1000000
        ORR     R1,R1,#&90
        LDRB    R10,[AELINE]
        TEQ     R10,#"B"
        TEQNE   R10,#"b"
        ORREQ   R1,R1,#&400000
        ADDEQ   AELINE,AELINE,#1
        BL      CHKREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
        BL      CHKREG
        ORR     R1,R1,R0
        BL      CHKCOM
        TEQ     R10,#"["
        BNE     ERASSB4
        BL      CHKREGSPC
        ORR     R1,R1,R0,LSL #16
        BL      AESPAC
        TEQ     R10,#"]"
        BNE     ERASSB1
        BL      AESPAC
        B       CASMICHK

CASMFPTWOOP
        ORR     R1,R1,#&8000
CASMFPTHREEOP
        ORR     R1,R1,#&100
        ORR     R1,R1,#&E000000
        BL      DOFPPREC
        BL      DOFPROUND
        BL      CHKFPREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
        TST     R1,#&8000
        BNE     CASMFPDO1
        BL      CHKFPREG
CASMFPCOMMON
        ORR     R1,R1,R0,LSL #16
        BL      CHKCOM
CASMFPDO1
        TEQ     R10,#"#"
        BEQ     CASMFPIMM
        BL      CHKFPREG
        ORR     R1,R1,R0
        BL      AESPAC
        B       CASMICHK
CASMFPIMM
        ORR     R1,R1,#&8
        STMFD   SP!,{R1}
        BL      EXPR
        TEQ     TYPE,#0
        BEQ     ERTYPEINT
        BLPL    IFLT
        ADR     R4,CASMFPIMMTBEND
        MOV     R5,#7
        [ FP=0
        ORR     FGRD,FSIGN,FACCX
        ]
CASMFPIMM1
        [ FP=0
        LDMDB   R4!,{R6,R7}
        TEQ     R6,FACC
        TEQEQ   R7,FGRD
        |
        LDFS    F1,[R4,#-4]!
        CMF     FACC,F1
        ]
        BEQ     CASMFPGOTIMM
        SUBS    R5,R5,#1
        BGE     CASMFPIMM1
        LDRB    R0,[ARGP,#BYTESM]
        TST     R0,#2
        BNE     ERASS2
        MOV     R5,#0
CASMFPGOTIMM
        LDMFD   SP!,{R1}
        ORR     R1,R1,R5
        B       CASMICHK
CASMFPIMMTB
        [ FP=0
        &       &00000000
        =       &00,0,0,0 ; 0
        &       &80000000
        =       &81,0,0,0 ; 1
        &       &80000000
        =       &82,0,0,0 ; 2
        &       &C0000000
        =       &82,0,0,0 ; 3
        &       &80000000
        =       &83,0,0,0 ; 4
        &       &A0000000
        =       &83,0,0,0 ; 5
        &       &80000000
        =       &80,0,0,0 ; 0.5
        &       &A0000000
        =       &84,0,0,0 ; 10
        |
        ; Aasm doesn't seem to like comma-separated FP constants
        DCFS    0
        DCFS    1
        DCFS    2
        DCFS    3
        DCFS    4
        DCFS    5
        DCFS    0.5
        DCFS    10
        ]
CASMFPIMMTBEND

CASMFPDT
        AND     R10,R1,#&F000000
        ORR     R1,R1,#&C000000
        TST     R10,#&4000000
        ORRNE   R1,R1,#&100000
        TST     R10,#&8000000
        ORRNE   R1,R1,#&200
        ORREQ   R1,R1,#&100
        BNE     CASMLFM
CASMLDF ORR     R1,R1,#&800000
        BL      DOFPPRECDT
        BL      CHKFPREGSPC
        B       CASMLDSTCOMMON
CASMLFM LDRB    R10,[AELINE]
        LDRB    R0,[AELINE,#1]
        BIC     R10,R10,#" "
        BIC     R0,R0,#" "
        TEQ     R10,#"E"
        TEQEQ   R0,#"A"
        BEQ     CASMLFMEA
        TEQ     R10,#"F"
        TEQEQ   R0,#"D"
        BEQ     CASMLFMFD
        ORR     R1,R1,#&800000
        BL      CHKFPREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
        BL      DOLFMCOUNT
        BL      CHKCOM
        B       CASMLDSTCOMMON2

;       LFMFD! ->  LFM [],#        SFMFD! -> SFM [,#-]!
;       LFMFD  ->  LFM []          SFMFD  -> SFM [,#-]
;       LFMEA! ->  LFM [,#-]!      SFMEA! -> SFM [],#
;       LFMEA  ->  LFM [,#-]       SFMEA  -> SFM []
CASMLFMFD
        MOV     R4,#1
        B       CASMLFMSTK
CASMLFMEA
        MOV     R4,#0
CASMLFMSTK
        TST     R1,#&100000
        EORNE   R4,R4,#1
        ADD     AELINE,AELINE,#2
        STMFD   SP!,{R4}
        BL      CHKFPREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
        BL      DOLFMCOUNT
        ADD     R0,R0,R0,LSL #1
        ORR     R1,R1,R0
        BL      CHKCOM
        TEQ     R10,#"["
        BNE     ERASSB4
        BL      CHKREGSPC
        ORR     R1,R1,R0,LSL #16
        BL      AESPAC
        TEQ     R10,#"]"
        BNE     ERASSB1
        BL      AESPAC
        TEQ     R10,#"!"
        LDMEQFD SP!,{R4}
        ORREQ   R4,R4,#2
        STMEQFD SP!,{R4}
        BLEQ    AESPAC
        LDMFD   SP!,{R4}
        ADR     R0,CASMLFMTB
        LDR     R0,[R0,R4,LSL #2]
        ORR     R1,R1,R0
        TST     R1,#&80
        BICNE   R1,R1,#&FF
        B       CASMICHK
CASMLFMTB
        &       &01800080
        &       &01000000
        &       &00A00000
        &       &01200000

DOLFMCOUNT
        STMFD   SP!,{R14}
        SUB     AELINE,AELINE,#1
        BL      ASMEXPR
        SUB     AELINE,AELINE,#1
        CMP     R0,#4
        BHI     ERSYNT
        TEQ     R0,#0
        BEQ     ERSYNT
        TST     R0,#2
        ORRNE   R1,R1,#&400000
        TST     R0,#1
        ORRNE   R1,R1,#&8000
        LDMFD   SP!,{PC}
CASMFPRT
        ORR     R1,R1,#&E000000
        ORR     R1,R1,#&110
        ANDS    R10,R1,#&F00000
        BEQ     CASMFLT
        CMP     R10,#&800000
        BHS     CASMCMF
        CMP     R10,#&200000
        BHS     CASMWRFSC
CASMFIX BL      DOFPROUND
        BL      CHKREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #12
        BL      CHKFPREG
        ORR     R1,R1,R0
        BL      AESPAC
        B       CASMICHK
CASMFLT BL      DOFPPREC
        BL      DOFPROUND
        BL      CHKFPREGSPC
        BL      CHKCOM
        ORR     R1,R1,R0,LSL #16
        BL      CHKREG
        ORR     R1,R1,R0,LSL #12
        BL      AESPAC
        B       CASMICHK
CASMWRFSC
        BL      CHKREGSPC
        ORR     R1,R1,R0,LSL #12
        BL      AESPAC
        B       CASMICHK
CASMCMF ORR     R1,R1,#&F000
        LDRB    R10,[AELINE]
        TEQ     R10,#"E"
        TEQNE   R10,#"e"
        BNE     CASMCMF1
        LDRB    R10,[AELINE,#-1]
        TEQ     R10,#"F"
        TEQNE   R10,#"f"
        ADDEQ   AELINE,AELINE,#1
        ORREQ   R1,R1,#&400000
        BICEQ   R1,R1,#&F0000000
        BLEQ    DOCOND
CASMCMF1
        BL      CHKFPREGSPC
        B       CASMFPCOMMON

CASMBX  ADD     AELINE,AELINE,#1
        BIC     R1,R1,#&F000000
        BL      DOCOND
        LDR     R0,CASMBXI
        ORR     R1,R1,R0
        BL      CHKREGSPC
        ORR     R1,R1,R0
        BL      AESPAC
        B       CASMICHK
CASMBXI &       &012FFF10
CASMB   TEQ     R1,#"I"
        BEQ     CASM2A
        BL      ALIGN
        MOV     R1,#&B000000
        LDRB    R10,[AELINE]
        BIC     R10,R10,#" "
        TEQ     R10,#"X"
        BEQ     CASMBX
        TEQ     R10,#"L"
        BNE     CASMB1
        ADD     AELINE,AELINE,#1
        BL      DOCOND ;BL<cc>?
        BEQ     CASMB2 ;if BL and a cond then ok
        SUB     AELINE,AELINE,#1 ;unread L
        BIC     R1,R1,#&F0000000 ;remove any cond added so far
        BL      DOCOND
        BICEQ   R1,R1,#&1000000 ;B(Lx) recognised - must be branch
        BEQ     CASMB2
        ADD     AELINE,AELINE,#1 ;finally BL okay!
        B       CASMB2
CASMB1  MOV     R1,#&A000000 ;not BL: try branch
        BL      DOCOND
CASMB2  BL      ASMEXPR
        BL      GET2PC
        ADD     R3,R2,#8-3 ;-3 deals with unaligned destination
        SUB     R3,R0,R3
        MOV     R3,R3,LSR #2
        BIC     R3,R3,#&FF000000
        ORR     R1,R1,R3
CASMICHK
        MOV     R2,#4 ;assemble instruction sized thing
CASMXCHK
        BL      ASMCHK ;check syntax and assemble R2 size
CASMX   LDR     R3,[ARGP,#ASSPC]
        LDRB    R0,[ARGP,#BYTESM]
        TST     R0,#4
        MOVEQ   R4,R3
        LDRNE   R4,[ARGP,#ASSPC-4] ;O%
        CMP     R2,#5
        ADDCS   R5,ARGP,#STRACC
        SUBCS   R6,R2,R5 ;length of string
        MOVCC   R6,R2
        TST     R0,#8
        BEQ     CASMXNOLIMIT
        ADD     R5,R4,R6
        LDR     R7,[ARGP,#ASSPC-16] ;L%
        CMP     R5,R7
        BHI     ERASS2LIM
CASMXNOLIMIT
        CMP     R2,#5
        BCC     CASMXNOTSTRING
        ADD     R5,ARGP,#STRACC
        MOV     R2,R6
        CMP     R2,#5
        LDRCC   R1,[R5]
        BCC     CASMXNOTSTRING
        MOV     R7,R4
CASMXSTRING
        LDRB    R1,[R5],#1
        STRB    R1,[R7],#1
        SUBS    R6,R6,#1
        BNE     CASMXSTRING
        B       CASMXPLACED
CASMXNOTSTRING
        CMP     R2,#0
        BEQ     CASMXPLACED
        STRB    R1,[R4]
        CMP     R2,#1
        BEQ     CASMXPLACED
        MOV     R5,R1,LSR #8
        STRB    R5,[R4,#1]
        CMP     R2,#2
        BEQ     CASMXPLACED
        MOV     R5,R1,LSR #16
        STRB    R5,[R4,#2]
        CMP     R2,#3
        MOV     R5,R1,LSR #24
        STRNEB  R5,[R4,#3]
CASMXPLACED
        TST     R0,#4
        ADDNE   R4,R4,R2
        STRNE   R4,[ARGP,#ASSPC-4]
        TST     R0,#1
        BEQ     CASMXN
        STMFD   SP!,{R10}
        MOV     R10,R3
        BL      WORDHX
        SWI     WRITEI+" "
        MOV     R10,R1
        CMP     R2,#5
        BCS     CASMBYTPRINT
        STMFD   SP!,{R0,R9}
        MOVS    R9,R2,LSL #3
        SUB     R9,R9,#4
        LDMEQFD SP!,{R0,R9}
        BLNE    WORDLP
        RSB     R0,R2,#4
        MOVS    R0,R0,LSL #1
CASMXPAD1
        BEQ     CASMX1
        SWI     WRITEI+" "
        SUBS    R0,R0,#1
        B       CASMXPAD1
CASMXCOM
        BL      ASMCHK2
        B       CASMX
CASMBYTPRINT
        SWI     WRITES
        = "        ",0
        ALIGN
;print bytes
CASMX1  LDMFD   SP!,{R10}
        MOV     TYPE,#0
        SWI     WRITEI+" "
        LDRB    R0,[LINE],#1
        CMP     R0,#"."
        BNE     CASMXT
        MOV     R4,#0
        MOV     R7,#0
CASMXL  BL      TOKOUT
        ADD     R4,R4,#1
        LDRB    R0,[LINE],#1
        CMP     R0,#":"
        CMPNE   R0,#";"
        CMPNE   R0,#"\"
        CMPNE   R0,#TREM
        CMPNE   R0,#" "
        BHI     CASMXL
        RSBS    R0,R4,#10
        MOVLS   R0,#1
        BL      SPCSWC
        SUB     LINE,LINE,#1
        B       CASMXTS
CASMXT  CMP     R0,#":"
        CMPNE   R0,#13
        BEQ     CASMX3
        SWI     WRITES
        = "          ",0
        ALIGN
        SUB     LINE,LINE,#1
CASMXTS LDRB    R0,[LINE],#1
        CMP     R0,#" "
        BEQ     CASMXTS
        TEQ     R0,#":"
        TEQNE   R0,#13
        BEQ     CASMX3
CASMX2  MOV     R7,#0
        BL      TOKOUT
        LDRB    R0,[LINE],#1
        CMP     LINE,AELINE
        BCC     CASMX2
CASMX3  SWI     NEWLINE
CASMXN  ADD     R3,R3,R2
        STR     R3,[ARGP,#ASSPC]
        MOV     LINE,AELINE
        TEQ     R10,#13
        BNE     CASM
        LDRB    R10,[LINE],#1
        CMP     R10,#&FF
        BEQ     CLRSTK ;check for program end
        ADD     LINE,LINE,#2
        LDR     R4,[ARGP,#ESCWORD]
        CMP     R4,#0
        BLNE    DOEXCEPTION
        B       CASM
CASMOPS MOV     R0,R2,LSR #24
        CMP     R0,#&F1
        BEQ     CASMEQU
        BCS     CASMDCB
;&F0 = OPT
        BL      ASMEXPR
        BL      ASMCHK
        AND     R0,R0,#15
        STRB    R0,[ARGP,#BYTESM]
        MOV     R2,#0
        B       CASMX
CASMEQU LDRB    R10,[AELINE],#1
        BIC     R10,R10,#" "
        CMP     R10,#"S"
        BEQ     CASMEQUS
        CMP     R10,#"D"
        BEQ     CASMEQUD
        CMP     R10,#"B"
        BEQ     CASMEQUB
        CMP     R10,#"F"
        BEQ     CASMDCF
        CMP     R10,#"W"
        BNE     ERASS1EQU
CASMDCW BL      ASMEXPR
        MOV     R2,#2
        B       CASMEQUB2
CASMEQUB
        BL      ASMEXPR
CASMEQUB1
        MOV     R2,#1
CASMEQUB2
        MOV     R1,IACC
        B       CASMXCHK
CASMDCD CMP     R0,#&F5
        BEQ     CASMADR
        BCS     CASMALI
CASMEQUD
        BL      ASMEXPR
        MOV     R1,IACC
        B       CASMICHK
CASMEQUS
        BL      EXPR
        TEQ     TYPE,#0
        BNE     ERTYPESTR
CASMEQUS1
        B       CASMXCHK
CASMDCB CMP     R0,#&F3
        BEQ     CASMDCW
        BCS     CASMDCD
        BL      EXPR
        TEQ     TYPE,#0
        BEQ     CASMEQUS1
        BLMI    SFIX
        B       CASMEQUB1
CASMADR
;       LDRB    R10,[AELINE]
;       BIC     R2,R10,#" "
;       CMP     R2,#"L"
;       ADDEQ   AELINE,AELINE,#1
        MOV     R1,#&000F0000
        ORR     R1,R1,#&02000000
        BL      ALIGN ;definitely an opcode, so align
        BL      DOCOND
        BL      CHKREGSPC
        ORR     R1,R1,R0,LSL #12
        BL      CHKCOM
        SUB     AELINE,AELINE,#1
        BL      ASMEXPR
        BL      ASMCHK
        BL      GET2PC
        ADD     R3,R2,#8
        SUBS    R0,R0,R3
        ORRPL   R1,R1,#&00800000
        ORRMI   R1,R1,#&00400000
        RSBMI   R0,R0,#0
        MOV     R2,#0
        B       CASMDATAIM1
CASMALI CMP     R0,#&F7
        BEQ     CASMDCF
        BHI     CASMNOP
        LDRB    R10,[AELINE],#1
        BIC     R2,R10,#" "
        CMP     R2,#"G"
        LDRB    R10,[AELINE],#1
        BIC     R2,R10,#" "
        CMPEQ   R2,#"N"
        BNE     ERASS1
        BL      AESPAC
        BL      ALIGN
        MOV     R2,#0
        B       CASMXCHK
CASMDCF LDRB    R10,[AELINE],#1
        BIC     R4,R10,#" "
        STMFD   SP!,{R4}
        BL      EXPR
        TEQ     TYPE,#0
        BEQ     ERTYPEINT
        BLPL    IFLT
        LDMFD   SP!,{R4}
        TEQ     R4,#"E"
        BEQ     CASMDCFE
        TEQ     R4,#"D"
        BEQ     CASMDCFD
        TEQ     R4,#"S"
        BNE     ERASSFP1
CASMDCFS
        [ FP=0
        ASSERT  FACCX=R1
        SUBS    FACCX,FACCX,#2
        BLE     CASMDCFSSMALL
        MOV     R1,FACCX,LSL #23
        ORR     R1,R1,FSIGN
        BIC     FACC,FACC,#&80000000
        ORR     R1,R1,FACC,LSR #8       ; XXX No rounding
        B       CASMICHK
CASMDCFSSMALL
        RSB     FACCX,FACCX,#9
        MOV     R1,FACC,LSR FACCX
        ORR     R1,R1,FSIGN
        B       CASMICHK
        |
        STFS    FACC,[SP,#-4]!
        LDR     R1,[SP],#4
        B       CASMICHK
        ]
CASMDCFD
        ADD     R2,ARGP,#STRACC
        [ FP=0
        ASSERT  FACCX=R1
        ASSERT  FGRD=R2
        TEQ     FACC,#0
        MOVEQ   FACCX,#0
        ADDNE   FACCX,FACCX,#&400
        SUBNE   FACCX,FACCX,#&82
        MOV     R7,FACCX,LSL #20
        ORR     R7,R7,FSIGN
        BIC     FACC,FACC,#&80000000
        ORR     R7,R7,FACC,LSR #11
        STR     R7,[R2],#4
        MOV     R7,FACC,LSL #21
        STR     R7,[R2],#4
        |
        STFD    FACC,[R2],#8
        ]
        B       CASMXCHK
CASMDCFE
        ADD     R2,ARGP,#STRACC
        [ FP=0
        TEQ     FACC,#0
        MOVEQ   FACCX,#0
        ADDNE   FACCX,FACCX,#&4000
        SUBNE   FACCX,FACCX,#&82
        ORR     FACCX,FSIGN,FACCX
        STR     FACCX,[R2],#4
        STR     FACC,[R2],#4
        MOV     FACC,#0
        STR     FACC,[R2],#4
        |
        STFE    FACC,[R2],#12
        ]
        B       CASMXCHK

CASMNOP BL      AESPAC
        BL      ALIGN
        MOV     R1,#&E1000000
        ORR     R1,R1,#&A00000
        B       CASMICHK

CASMFN  LDRB    R0,[ARGP,#BYTESM]
        STMFD   SP!,{R0-R3}
        BL      FN
        BL      AESPAC
        BL      ASMCHK
        LDMFD   SP!,{R0-R3}
        STRB    R0,[ARGP,#BYTESM]
        B       CASMX
GET2PC  LDR     R2,[ARGP,#ASSPC]
        ADD     R2,R2,#3
        BIC     R2,R2,#3
        MOV     PC,R14
ALIGN   LDR     R0,[ARGP,#BYTESM]
        TST     R0,#4
        LDRNE   R0,[ARGP,#ASSPC-4]
        ADDNE   R0,R0,#3
        BICNE   R0,R0,#3
        STRNE   R0,[ARGP,#ASSPC-4]
        LDR     R0,[ARGP,#ASSPC]
        ADD     R0,R0,#3
        BIC     R0,R0,#3
        STR     R0,[ARGP,#ASSPC]
        MOV     PC,R14
ASMCHK  TEQ     R10,#":"
        TEQNE   R10,#13
        MOVEQ   PC,R14
        TEQ     R10,#";"
        TEQNE   R10,#"\"
        TEQNE   R10,#TREM
        BNE     ERSYNT
ASMCHK2 LDRB    R10,[AELINE],#1
        TEQ     R10,#":"
        TEQNE   R10,#13
        BNE     ASMCHK2
        MOV     PC,R14
ASMEXPR STMFD   SP!,{R1,R14}
        BL      EXPR
        TEQ     TYPE,#0
        BEQ     ERTYPEINT
        BLMI    INTEGB
        LDMFD   SP!,{R1,PC}^
;check conditional mnemonic
;EQ if present, R1=R1 OR code, NE if not present R1=R1 OR AL
DOCOND  LDRB    R10,[AELINE]
        BIC     R2,R10,#" "
        LDRB    R0,[AELINE,#1]
        BIC     R0,R0,#" "
        ORR     R0,R0,R2,LSL #8
        MOV     R0,R0,LSL #8
        ADR     R2,CONDTAB
DOCOND1 LDR     R3,[R2],#4
        CMP     R0,R3,LSL #8
        BHI     DOCOND1
        BNE     DOCONDFL
        AND     R3,R3,#&F0000000
        ORR     R1,R1,R3
        ADD     AELINE,AELINE,#2 ;matched so advance
        MOV     PC,R14
DOCONDFL
        ORRS    R1,R1,#&E0000000
        MOV     PC,R14
CONDTAB = "LA",0,&E0
        = "CC",0,&30
        = "SC",0,&20
        = "QE",0,&00
        = "EG",0,&A0
        = "TG",0,&C0
        = "IH",0,&80
        = "SH",0,&20
        = "EL",0,&D0
        = "OL",0,&30
        = "SL",0,&90
        = "TL",0,&B0
        = "IM",0,&40
        = "EN",0,&10
        = "VN",0,&F0
        = "LP",0,&50
        = "CV",0,&70
        = "SV",0,&60
        DCD     -1
DOFPPREC
        LDRB    R10,[AELINE],#1
        BIC     R10,R10,#" "
        TEQ     R10,#"S"
        MOVEQ   PC,R14
        TEQ     R10,#"D"
        ORREQ   R1,R1,#&80
        MOVEQ   PC,R14
        TEQ     R10,#"E"
        BNE     ERASSFP1
        ORR     R1,R1,#&80000
        MOV     PC,R14
DOFPPRECDT
        LDRB    R10,[AELINE],#1
        BIC     R10,R10,#" "
        TEQ     R10,#"S"
        MOVEQ   PC,R14
        TEQ     R10,#"D"
        ORREQ   R1,R1,#&8000
        MOVEQ   PC,R14
        TEQ     R10,#"E"
        ORREQ   R1,R1,#&400000
        MOVEQ   PC,R14
        TEQ     R10,#"P"
        BNE     ERASSFP1
        ORR     R1,R1,#&400000
        ORR     R1,R1,#&8000
        MOV     PC,R14
DOFPROUND
        LDRB    R10,[AELINE],#1
        BIC     R10,R10,#" "
        TEQ     R10,#"P"
        ORREQ   R1,R1,#&20
        MOVEQ   PC,R14
        TEQ     R10,#"M"
        ORREQ   R1,R1,#&40
        MOVEQ   PC,R14
        TEQ     R10,#"Z"
        ORREQ   R1,R1,#&60
        SUBNE   AELINE,AELINE,#1
        MOV     PC,R14
CHKREGSPC
        LDRB    R10,[AELINE],#1
CHKREGSPCCONT
        TEQ     R10,#" "
        BEQ     CHKREGSPC
;check for R0-R15,LR or PC otherwise call ASMEXPR
CHKREG  BIC     R0,R10,#" "
        CMP     R0,#"R"
        BNE     RDPC
CHKREGC LDRB    R10,[AELINE]
        CMP     R10,#"9"
        BHI     CHKREG1
        SUBS    R0,R10,#"0"
        BCC     CHKREG1
        TEQ     R0,#1
        BNE     RDREG1
        LDRB    R10,[AELINE,#1]
        CMP     R10,#"0"
        BCC     RDREG1
        CMP     R10,#"9"
        BHI     RDREG1
        CMP     R10,#"5"
        BHI     CHKREG1
        SUB     R0,R10,#"0"-10
        ADD     AELINE,AELINE,#1
RDREG1  ADD     AELINE,AELINE,#1
        MOV     PC,R14
RDPC    CMP     R0,#"P"
        BNE     RDLR
        LDRB    R10,[AELINE]
        BIC     R0,R10,#" "
        TEQ     R0,#"C"
        MOVEQ   R0,#15
        BEQ     RDREG1
        B       CHKREG1
RDLR    CMP     R10,#"L"
        BNE     CHKREG1
        LDRB    R10,[AELINE]
        BIC     R0,R10,#" "
        TEQ     R0,#"R"
        MOVEQ   R0,#14
        BEQ     RDREG1
CHKREG1 SUB     AELINE,AELINE,#1
        STMFD   SP!,{R1,R14}
        BL      FACTOR
        BL      INTEGZ
        CMP     R0,#15
        BHI     ERASS3
        LDMFD   SP!,{R1,PC}
CHKCOM  LDRB    R10,[AELINE],#1
        CMP     R10,#" "
        BEQ     CHKCOM
        CMP     R10,#","
        BEQ     AESPAC
        B       ERCOMM
CHKCOPROSPC
        LDRB    R10,[AELINE],#1
CHKCOPROSPCCONT
        TEQ     R10,#" "
        BEQ     CHKCOPROSPC
;check for CP0-CP15 otherwise call ASMEXPR
CHKCOPRO
        BIC     R0,R10,#" "
        CMP     R0,#"C"
        BNE     CHKREG1
        LDRB    R10,[AELINE]
        BIC     R0,R10,#" "
        CMP     R0,#"P"
        BNE     CHKREG1
        LDRB    R10,[AELINE,#1]
        CMP     R10,#"9"
        BHI     CHKREG1
        SUBS    R0,R10,#"0"
        BCC     CHKREG1
        TEQ     R0,#1
        BNE     RDCOPRO1
        LDRB    R10,[AELINE,#2]
        CMP     R10,#"0"
        BCC     RDCOPRO1
        CMP     R10,#"9"
        BHI     RDCOPRO1
        CMP     R10,#"5"
        BHI     CHKREG1
        SUB     R0,R10,#"0"-10
        ADD     AELINE,AELINE,#1
RDCOPRO1
        ADD     AELINE,AELINE,#2
        MOV     PC,R14
CHKCPREGSPC
        LDRB    R10,[AELINE],#1
CHKCPREGSPCCONT
        TEQ     R10,#" "
        BEQ     CHKCPREGSPC
;check for C0-C15 otherwise call ASMEXPR
CHKCPREG
        BIC     R0,R10,#" "
        CMP     R0,#"C"
        BNE     CHKREG1
        B       CHKREGC
CHKFPREGSPC
        LDRB    R10,[AELINE],#1
CHKFPREGSPCCONT
        TEQ     R10,#" "
        BEQ     CHKFPREGSPC
;check for F0-F7 otherwise call ASMEXPR
CHKFPREG
        STMFD   SP!,{R14}
        BIC     R0,R10,#" "
        ADR     R14,CHKFPREG1
        CMP     R0,#"F"
        BNE     CHKREG1
        B       CHKREGC
CHKFPREG1
        CMP     R0,#7
        BHI     ERASS3
        LDMFD   SP!,{PC}

        LNK     Lexical
