home *** CD-ROM | disk | FTP | other *** search
- ; > IncAsm
-
- ; IDENTIFICATION: a.IncAsm
- ;
- ; DESCRIPTION:
- ; Assembler Includes, feel free to distribute
- ; Updated to Release 3 of C
- ;
- ; CONTENTS:
- ; Register Definitions
- ; Condition code masks
- ; Interrupt Disable masks
- ; Processor mode masks
- ; Status and address masks
- ; SYNC
- ; ARM3R ARM3W
- ; XSWP XSWPEQ XSWPNE XSWPB
- ; ADR ADRCC ADRCS ADREQ ADRNE
- ; ADRGE ADRLT
- ; XMOV XMOVEQ XMOVNE XMVN
- ; XWriteI XWriteS
- ; CHEAD CENTRY CEXIT
- ; DEFAREA DEFLABEL DEFALIGN
- ; DEFB DEFS DEFL DEFA
- ;
- ; REVISION HISTORY:
-
- ; C constants
-
- .EXTERN x$stack_overflow, x$stack_overflow_1, _WriteS
-
- a1 = 0
- a2 = 1
- a3 = 2
- a4 = 3
-
- v1 = 4
- v2 = 5
- v3 = 6
- v4 = 7
- v5 = 8
- v6 = 9
-
- sl = 10
- fp = 11
- ip = 12
- sp = 13
-
- lr = 14
- pc = 15
-
- ; General Assembler constants and macros
-
- PC = 15
-
- N_bit = 0x80000000
- Z_bit = 0x40000000
- C_bit = 0x20000000
- V_bit = 0x10000000
-
- I_bit = 0x08000000
- F_bit = 0x04000000
-
- U_mode = 0
- F_mode = 1
- I_mode = 2
- S_mode = 3
-
- Adr_bits = 0x03FFFFFC
- Status_bits = 0xFC000003
-
- D_bits = 0x0C000000 ; Disable all interrupts
- P_bits = 0x00000003
-
- Sys_bits = D_bits+P_bits
-
- ; Error Message format
-
- .MACRO ERRMESS Number, String
- .LONG Number
- .ASCIZ String
- .ALIGN
- .ENDM
-
- ; SYNC - noop after mode change or user bank access
- ; not often needed on ARM3 but safer to leave in
-
- .MACRO SYNC
- MOV r0,r0
- .ENDM
-
- ; ARM3 Cache controller read/write (CP# 15)
-
- .MACRO ARM3R Rdest_, A3Cn_
- .LONG 0xEE100F10+(Rdest_<<12)+(A3Cn_<<16)
- .ENDM
-
-
- .MACRO ARM3W Rsource_, A3Cn_
- .LONG 0xEE000F10+(Rsource_<<12)+(A3Cn_<<16)
- .ENDM
-
- ; ARM 3 Instruction SWP
-
- .MACRO XSWP Rsource_, Rdest_, Rbase_
- .LONG 0xE1000090+(Rbase_<<16)+(Rdest_<<12)+Rsource_
- .ENDM
-
- .MACRO XSWPEQ Rsource_, Rdest_, Rbase_
- .LONG 0x01000090+(Rbase_<<16)+(Rdest_<<12)+Rsource_
- .ENDM
-
- .MACRO XSWPNE Rsource_, Rdest_, Rbase_
- .LONG 0x11000090+(Rbase_<<16)+(Rdest_<<12)+Rsource_
- .ENDM
-
- .MACRO XSWPB Rsource_, Rdest_, Rbase_
- .LONG 0xE1400090+(Rbase_<<16)+(Rdest_<<12)+Rsource_
- .ENDM
-
- ; Extended operation set
-
- .MACRO ADR reg_,label_
- ADR_ reg_,label_
- .ENDM
-
- .MACRO ADRCC reg_,label_
- ADR_ reg_,label_,CC
- .ENDM
-
- .MACRO ADRCS reg_,label_
- ADR_ reg_,label_,CS
- .ENDM
-
- .MACRO ADREQ reg_,label_
- ADR_ reg_,label_,EQ
- .ENDM
-
- .MACRO ADRNE reg_,label_
- ADR_ reg_,label_,NE
- .ENDM
-
- .MACRO ADRGE reg_,label_
- ADR_ reg_,label_,GE
- .ENDM
-
- .MACRO ADRLT reg_,label_
- ADR_ reg_,label_,LT
- .ENDM
-
- .MACRO XMOV reg_, value_
- XOP1_ MOV,ORR,reg_,value_
- .ENDM
-
- .MACRO XMOVEQ reg_, value_
- XOP1_ MOVEQ,ORREQ,reg_,value_
- .ENDM
-
- .MACRO XMOVNE reg_, value_
- XOP1_ MOVNE,ORRNE,reg_,value_
- .ENDM
-
- .MACRO XMVN reg_, value_
- XOP1_ MVN,BIC,reg_,value_
- .ENDM
-
- ; SWI calls
-
- .MACRO XWriteI ch_
- SWI XSWI+OS_WriteI+(ch_)
- .ENDM
-
- .MACRO XWriteS string_
- SWI XSWI+OS_WriteS
- .ASCIZ string_
- .ALIGN
- .ENDM
-
- ; C macros
-
- .MACRO CHEAD name_,cname_
- .ALIGN
- $1: .ASCIZ cname_
- .ALIGN
- .LONG 0xFF000000+$-$1
- name_:
- .ENDM
-
- .MACRO CENTRY name_,cname_,aregs_,vregs_,wspace_=0
- CHEAD name_,cname_
- MOV ip,sp
- .IF .MPEXISTS(aregs_)
- .IF .MPEXISTS(vregs_)
- STMFD sp!,{aregs_,vregs_,fp,ip,lr,pc}
- .ELSE
- STMFD sp!,{aregs_,fp,ip,lr,pc}
- .ENDIF
- .ELSE
- .IF .MPEXISTS(vregs_)
- STMFD sp!,{vregs_,fp,ip,lr,pc}
- .ELSE
- STMFD sp!,{fp,ip,lr,pc}
- .ENDIF
- .ENDIF
- SUB fp,ip,#4
- .IF wspace < 64
- CMPS sp,sl
- BLLT x$stack_overflow
- .ELSE
- SUB ip,sp,#wspace_*4+4
- CMPS ip,sl
- BLLT x$stack_overflow_1
- .ENDIF
- .IF wspace_ != 0
- SUB sp,sp,#wspace_*4
- .ENDIF
- .ENDM
-
- .MACRO CEXIT vregs_
- .IF .MPEXISTS(vregs_)
- LDMEA fp,{vregs_,fp,sp,pc}^
- .ELSE
- LDMEA fp,{fp,sp,pc}^
- .ENDIF
- .ENDM
-
- ; Static area or structure definition macros
-
- .MACRO DEFAREA name_,posn_=0
- defarea_ := posn_
- name_ = defarea_
- .ENDM
-
- .MACRO DEFLABEL name_
- name_ = defarea_
- .ENDM
-
- .MACRO DEFALIGN align_=4
- defarea_ := defarea_ & -align_
- .ENDM
-
- .MACRO DEFB name_,count_=1
- name_ = defarea_
- defarea_ := defarea_ + (count_)
- .ENDM
-
- .MACRO DEFS name_,count_=1
- name_ = defarea_
- defarea_ := defarea_ + 2*(count_)
- .ENDM
-
- .MACRO DEFL name_,count_=1
- defarea_ := defarea_ & -4
- name_ = defarea_
- defarea_ := defarea_ + 4*(count_)
- .ENDM
-
- .MACRO DEFA name_,count_=1
- defarea_ := defarea_ & -4
- name_ = defarea_
- defarea_ := defarea_ + 4*(count_)
- .ENDM
-
- ; Support Macros - not for direct use
-
- .MACRO ADR_ reg_,label_,cc_
- .IF (label_)>=$+8
- ADD'cc_ reg_,pc,#(label_)-$-8
- .ELSE
- SUB'cc_ reg_,pc,#$+8-(label_)
- .ENDIF
- .ENDM
-
- .MACRO ANALYSE_ number_
- s_ := number_
- s_ := (s_ << 4) | (s_ >>> 28) | s_
- s_ := (s_ << 2) | (s_ >>> 30) | s_
- s_ := (s_ | (s_ >>> 1)) & 0x55555555
- s_ := (s_ << 1) | s_
- s_ := (s_ + 1) & s_
- s_ := ((s_ - 1) & ~ s_) + 1
- .IF s_ == 0
- m_ := 0xFF
- .ENDIF
- .IF s_ & 0xFFFFFF
- m_ := 0xFF * s_
- .ENDIF
- .IF s_ & 0xFF000000
- s_ := s_ >>> 24
- m_ := 0xFF * s_
- m_ := (m_ << 24) | (m_ >> 8)
- .ENDIF
- n1_ := number_ & m_
- n2_ := number_ - n1_
- .ENDM
-
- .MACRO XOP1_ op1_, op2_, reg_, value_
- .NOLIST
- ANALYSE_ value_
- .LIST
- op1_ reg_,#n1_
- .NOLIST
- .REPEATWHILE (n2_ != 0)
- ANALYSE_ n2_
- .LIST
- op2_ reg_,reg_,#n1_
- .NOLIST
- .ENDREPEAT
- .LIST
- .ENDM
-