; > 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,FACC
 MOV R5,TYPE
 LDR FACC,[ARGP,#ASSPC]
 MOV TYPE,#4
 BL STOREA
 BL AESPAC
CASM1 TEQ R10,#"]"
 MVNEQ R10,#0
 STREQB R10,[ARGP,#BYTESM]
 MOVEQ LINE,AELINE
 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
 CMP R10,#TFN
 BEQ CASMFN
 CMP R10,#TAND
 LDREQ R2,CASMTBAND
 BEQ CASMGT1
 CMP R10,#TEOR
 LDREQ R2,CASMTBEOR
 BEQ CASMGT1
 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
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",&C0
 = "EQU",&C1
 = "DCB",&C2
 = "DCW",&C3
 = "DCD",&C4
 = "ADR",&C5
 = "ALI",&C6
 & 0
CASMGT ADD AELINE,AELINE,#2
CASMGT1 CMP R2,#&C0000000
 BCS CASMOPS
 BL ALIGN ;definitely an opcode, so align
 AND R1,R2,#&0F000000
 CMP R2,#&40000000
 MOVCC R1,R1,LSR #3
 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
CASMLDM ORR R1,R1,#&100000
CASMSTM 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
 CMP R10,#"b"
 CMPNE R10,#"B"
 ORREQ R1,R1,#&400000
 LDREQB R10,[AELINE],#1
 CMP R10,#"t"
 CMPNE R10,#"T"
 ORREQ R1,R1,#&200000
 ADDEQ AELINE,AELINE,#1
 SUB AELINE,AELINE,#1
 BL CHKREGSPC
 BL CHKCOM
 ORR R1,R1,R0,LSL #12
 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
 CMP R10,#"-"
 BICEQ R1,R1,#&800000
 BLEQ AESPAC
 BL CHKREG
 ORR R1,R1,R0
 ADD R1,R1,#&2000000
 BL AESPAC
 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
 CMP R10,#"-"
 BICEQ R1,R1,#&800000
 BLEQ AESPAC
 BL CHKREG
 ORR R1,R1,R0
 ADD R1,R1,#&2000000
 BL AESPAC
 CMP R10,#","
 BLEQ CASMDATASHIFT
 B CASMICHK
CASMPOSTIM BL ASMEXPR
 BL PACKPOST
 B CASMICHK
CASMLDRLABEL SUB AELINE,AELINE,#1
 BL ASMEXPR
 LDR R2,[ARGP,#ASSPC]
 ADD R2,R2,#8
 SUB FACC,FACC,R2
 ORR R1,R1,#&F0000 ;base reg PC
 ADD R1,R1,#&1000000 ;pre index mode
 BL PACKPOST
 B CASMICHK
PACKPOST TEQ FACC,#0
 BICMI R1,R1,#&800000
 RSBMI FACC,FACC,#0
 CMP FACC,#&1000
 BCS ERASS2A
 ORR R1,R1,FACC
 MOV PC,R14
CASMMOVEQ CMP R1,#"Q"
 BNE ERASS1
 BL ALIGN
 MOV R1,#&1A00000
 ADD AELINE,AELINE,#1
 LDRB R10,[AELINE],#1
CASMTWOMOV 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
 CMP R10,#"S"
 CMPNE R10,#"s"
 ADDEQ AELINE,AELINE,#1
 CMP R10,#"P"
 CMPNE R10,#"p"
 ADDEQ AELINE,AELINE,#1
 ORREQ R1,R1,#&F000
 SUB AELINE,AELINE,#1
 BL AESPAC
 B CASMTWORN
CASMTHREEDATA 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
 ORR R1,R1,#&10
 BL CHKREG
 ORR R1,R1,R0,LSL #8
 BL AESPAC
 LDMFD SP!,{PC}
CASMDATASHIFTCONST BL ASMEXPR
 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
 B ERASS2
CASMDATAIM2 ORR R1,R1,R0
 ORR R1,R1,R2,LSL #8
 B CASMICHK
CASMMUL ORR R1,R1,#&90
 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
CASMSWI BL ASMEXPR
 BIC R0,R0,#&FF000000
 ORR R1,R1,R0
 B CASMICHK
CASMB TEQ R1,#"I"
 BEQ CASM2A
 BL ALIGN
 MOV R1,#&B000000
 LDRB R10,[AELINE],#1
 BIC R10,R10,#" "
 TEQ R10,#"L"
 BNE CASMB1
 BL DOCOND ;if BL try a cond
 BEQ CASMB2 ;if BL and a cond then ok
 SUB AELINE,AELINE,#1
CASMB1 SUB AELINE,AELINE,#1
 MOV R1,#&A000000 ;not(BL and a cond): try branch
 BL DOCOND
 BNE ERSYNT
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 BL ASMCHK
CASMI MOV R2,#4
CASMX LDR R3,[ARGP,#ASSPC]
 LDRB R0,[ARGP,#BYTESM]
 TST R0,#4
 MOVEQ R4,R3
 LDRNE R4,[ARGP,#ASSPC-4] ;O%
 CMP R2,#5
 BCC CASMXNOTSTRING
 ADD R5,ARGP,#STRACC
 SUB R2,R2,R5
 CMP R2,#5
 LDRCC R1,[R5]
 BCC CASMXNOTSTRING
 MOV R6,R2
 MOV R7,R4
CASMXSTRING LDRB R1,[R5],#1
 STRB R1,[R7],#1
 SUBS R6,R6,#1
 BNE CASMXSTRING
 B CASMXPLACED
CASMXNOTSTRING CMP R2,#0
 STRNEB R1,[R4]
 MOV R5,R1,LSR #8
 STRNEB R5,[R4,#1]
 MOV R5,R1,LSR #16
 STRNEB R5,[R4,#2]
 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,#&C1
 BEQ CASMEQU
 BCS CASMDCB
;&C0 = OPT
 BL ASMEXPR
 BL ASMCHK
 AND R0,R0,#7
 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,#"W"
 BNE ERASS1EQU
CASMDCW BL ASMEXPR
 MOV R2,#2
 B CASMEQUB2
CASMEQUB BL ASMEXPR
CASMEQUB1 MOV R2,#1
CASMEQUB2 MOV R1,FACC
 BL ASMCHK
 B CASMX
CASMDCD CMP R0,#&C5
 BEQ CASMADR
 BCS CASMALI
CASMEQUD BL ASMEXPR
 MOV R1,FACC
 B CASMICHK
CASMEQUS BL EXPR
 BNE ERTYPEINT
CASMEQUS1 BL ASMCHK
 B CASMX
CASMDCB CMP R0,#&C3
 BEQ CASMDCW
 BCS CASMDCD
 BL EXPR
 BEQ CASMEQUS1
 BL INTEGZ
 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 CHKREGSPCCONT
 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 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 ASMCHK
 BL ALIGN
 MOV R2,#0
 B CASMX
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,#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
 BL INTEGZ
 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],#1
 BICS R2,R10,#" "
 ORREQ R1,R1,#&E0000000
 MOVEQ PC,R14
 LDRB R0,[AELINE]
 BIC R0,R0,#" "
 ORR R0,R2,R0,LSL #8
 MOV R0,R0,LSL #8
 ADR R2,CONDTAB
DOCOND1 LDR R3,[R2],#4
 TEQ R3,#0
 BEQ DOCONDFL
 CMP R0,R3,LSL #8
 BNE DOCOND1
 AND R3,R3,#&F0000000
 ORR R1,R1,R3
 LDRB R10,[AELINE],#1
 LDRB R10,[AELINE],#1
 MOV PC,R14
DOCONDFL ORRS R1,R1,#&E0000000
 MOV PC,R14
CONDTAB = "AL",0,&E0
 = "CC",0,&30
 = "CS",0,&20
 = "EQ",0,&00
 = "GE",0,&A0
 = "GT",0,&C0
 = "HI",0,&80
 = "HS",0,&20
 = "LE",0,&D0
 = "LS",0,&90
 = "LT",0,&B0
 = "LO",0,&30
 = "MI",0,&40
 = "NE",0,&10
 = "NV",0,&F0
 = "PL",0,&50
 = "VC",0,&70
 = "VS",0,&60
 = 0,0,0,0
CHKREGSPC LDRB R10,[AELINE],#1
CHKREGSPCCONT TEQ R10,#" "
 BEQ CHKREGSPC
;check for R0-R15 or PC otherwise call ASMEXPR
CHKREG BIC R0,R10,#" "
 CMP R0,#"R"
 BNE RDPC
 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 CHKREG1
 LDRB R10,[AELINE]
 BIC R0,R10,#" "
 TEQ R0,#"C"
 MOVEQ R0,#15
 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

 LNK Expr
