Albert Koelmans newest version
This commit is contained in:
parent
064258aa8b
commit
0a1b11973a
9 changed files with 308 additions and 48 deletions
|
@ -3,3 +3,7 @@ los.s
|
|||
sts.s
|
||||
dvi.s
|
||||
mli.s
|
||||
csab.s
|
||||
dvu.s
|
||||
mlu.s
|
||||
rck.s
|
||||
|
|
57
mach/arm/libem/csab.s
Normal file
57
mach/arm/libem/csab.s
Normal file
|
@ -0,0 +1,57 @@
|
|||
.define _Csa, _Csb
|
||||
.sect.text
|
||||
_Csa:
|
||||
LDMFD R12<, {R0}
|
||||
LDMFD R12<, {R1}
|
||||
STMFD R12<, {R4}
|
||||
LDR R2, [R0, #4]
|
||||
MOV R4,R2
|
||||
LDR R3, [R0, #8]
|
||||
CMP R1,R2
|
||||
BLT 1F
|
||||
ADD R2,R2,R3
|
||||
CMP R1,R2
|
||||
BGT 1F
|
||||
ADD R2, R0, #12
|
||||
SUB R1,R1,R4
|
||||
ADD R2, R2, R1, LSL #2
|
||||
LDR R2, [R2]
|
||||
CMP R2, #0
|
||||
BAL 2F
|
||||
1:
|
||||
LDR R2, [R0]
|
||||
CMP R2, #0
|
||||
2:
|
||||
BNE 3F
|
||||
BAL.L _CasErr
|
||||
3:
|
||||
LDMFD R12<,{R4}
|
||||
MOV R15,R14
|
||||
|
||||
_Csb:
|
||||
LDMFD R12<, {R0}
|
||||
LDMFD R12<, {R1}
|
||||
STMFD R12<,{R4}
|
||||
LDR R2, [R0, #4]
|
||||
LDR R3, [R0]
|
||||
ADD R0, R0, #8
|
||||
1:
|
||||
CMP R2, #0
|
||||
BEQ 3F
|
||||
LDR R4, [R0]
|
||||
CMP R4, R1
|
||||
BNE 2F
|
||||
LDR R3, [R0, #4]
|
||||
BAL 3F
|
||||
2:
|
||||
ADD R0, R0, #8
|
||||
SUB R2,R2,#1
|
||||
BAL 1B
|
||||
3:
|
||||
CMP R3, #0
|
||||
BNE 4F
|
||||
BAL.L _CasErr
|
||||
4:
|
||||
LDMFD R12<,{R4}
|
||||
MOV R15, R14
|
||||
|
|
@ -3,13 +3,16 @@
|
|||
.sect .text
|
||||
|
||||
.dvi: LDMFD R12<,{R1,R2}
|
||||
MOV R3,#0
|
||||
STMFD R12<,{R4}
|
||||
CMP R1,#0
|
||||
ADD.MI R3,R3,#1
|
||||
RSB.MI R1,R1,#0
|
||||
BEQ dbyzero
|
||||
MOV R4,#0
|
||||
CMP R1,#0
|
||||
ADD.LT R4,R4,#1
|
||||
RSB.LT R1,R1,#0
|
||||
CMP R2,#0
|
||||
ADD.MI R3,R3,#2
|
||||
RSB.MI R2,R2,#0
|
||||
ADD.LT R4,R4,#2
|
||||
RSB.LT R2,R2,#0
|
||||
MOV R0,#1
|
||||
div1: CMP R1,#0x80000000
|
||||
CMP.CC R1,R2
|
||||
|
@ -23,9 +26,14 @@ div2: CMP R2,R1
|
|||
MOV.S R0,R0,LSR #1
|
||||
MOV.NE R1,R1,LSR #1
|
||||
BNE div2
|
||||
TST R4, #2
|
||||
RSB.NE R2,R2,#0
|
||||
TST R4, #1
|
||||
TST.NE R4, #1
|
||||
RSB.NE R3,R3,#0
|
||||
CMP R4, #1
|
||||
RSB.EQ R3,R3,#0
|
||||
CMP R4,#2
|
||||
RSB.EQ R3,R3,#0
|
||||
LDMFD R12<,{R4}
|
||||
MOV R15,R14
|
||||
dbyzero:
|
||||
MOV R0,#6
|
||||
STMFD R12<,{R0}
|
||||
BAL _EmTrp
|
||||
|
||||
|
|
32
mach/arm/libem/dvu.s
Normal file
32
mach/arm/libem/dvu.s
Normal file
|
@ -0,0 +1,32 @@
|
|||
.define .dvu
|
||||
|
||||
.sect .text
|
||||
|
||||
.dvu:
|
||||
LDMFD R12<,{R0,R1}
|
||||
STMFD R12<,{R4}
|
||||
CMP R0,#0
|
||||
BEQ divbyzero
|
||||
MOV R2,#0
|
||||
MOV R3,#0
|
||||
MOV R4,#32
|
||||
DVU11:
|
||||
SUB.S R4,R4,#1
|
||||
LDMFD.EQ R12<,{R4}
|
||||
MOV.EQ R15,R14
|
||||
MOV.S R1,R1,ASL #1
|
||||
BPL DVU11
|
||||
DVU22:
|
||||
MOV.S R1,R1,ASL #1
|
||||
ADC R2,R2,R2
|
||||
CMP R2,R0
|
||||
SUB.CS R2,R2,R0
|
||||
ADC R3,R3,R3
|
||||
SUB.S R4,R4,#1
|
||||
BNE DVU22
|
||||
LDMFD R12<,{R4}
|
||||
MOV R15,R14
|
||||
divbyzero:
|
||||
MOV R0,#6
|
||||
STMFD R12<,{R0}
|
||||
BAL _EmTrp
|
|
@ -1,49 +1,178 @@
|
|||
.define begdat, begbss
|
||||
.define hol0, argv, envp, reghp
|
||||
.define ignmask, trpreg, rcktrap
|
||||
! head_em.s
|
||||
.define begdat,begbss,hol0,argv,envp,_RegHp,_incptflag
|
||||
.define _Lineno,_Filna,_IgnoreMask,_TrpReg
|
||||
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
.sect .text
|
||||
.sect .rom
|
||||
.sect .data
|
||||
.sect .bss
|
||||
|
||||
.sect .text
|
||||
|
||||
ADR R0,begbss
|
||||
ADR R1,_endbss
|
||||
MOV R2,#0
|
||||
.sect .text
|
||||
.base 0x8000
|
||||
ADR R0,begbss
|
||||
ADR R1,_endbss
|
||||
MOV R2,#0
|
||||
ADR R3,_incptflag
|
||||
STR R2,[R3]
|
||||
1:
|
||||
STR R2,[R0],#4
|
||||
CMP R0,R1
|
||||
BGT 1b
|
||||
|
||||
MOV R12, #0x100000
|
||||
ADR R11, envp
|
||||
STMFD R12<, {R11}
|
||||
ADR R11, argv
|
||||
STMFD R12<, {R11}
|
||||
MOV R11, #1
|
||||
STMFD R12<, {R11}
|
||||
BAL.L _m_a_i_n
|
||||
rcktrap:
|
||||
SWI 1
|
||||
STR R2,[R0],#4
|
||||
CMP R0,R1
|
||||
BLT 1B
|
||||
! the next 2 lines are OS specific:
|
||||
SWI 16 ! OS_Getenv
|
||||
SUB R12, R1, #8 ! Get end of ram
|
||||
! R0 points to command string
|
||||
! (argv,argc) code for C
|
||||
! or Pascal file names
|
||||
MOV R9,R0 ! save pt in R0
|
||||
MOV R8,#0 ! string length
|
||||
len:
|
||||
LDR.B R7,[R9],#1
|
||||
CMP R7,#0
|
||||
ADD.NE R8,R8,#1
|
||||
BNE len
|
||||
MOV R7,R8 ! save len in R7
|
||||
! round up to multiple of 4
|
||||
ADD R8,R8,#4
|
||||
MVN R6, #3 !FFFFFFFC
|
||||
AND R8,R8,R6
|
||||
! make room on stack
|
||||
SUB R12,R12,R8 ! word aligned
|
||||
! now determine argc
|
||||
! OS intercepts blank lines, so
|
||||
! there must be at least one arg
|
||||
MOV R9,R0
|
||||
MOV R6,#0 ! holds argc
|
||||
MOV R5,#0 ! char count
|
||||
loop1:
|
||||
CMP R5,R7
|
||||
BGT next1
|
||||
LDR.B R4,[R9],#1
|
||||
ADD R5,R5,#1
|
||||
CMP R4,#32
|
||||
BEQ loop1 !skip spaces
|
||||
ADD R6,R6,#1 ! new arg
|
||||
nospace1:
|
||||
CMP R5,R7
|
||||
BGT next1
|
||||
LDR.B R4,[R9],#1
|
||||
ADD R5,R5,#1
|
||||
CMP R4,#32
|
||||
BNE nospace1
|
||||
CMP R5,R7
|
||||
BCC loop1
|
||||
! BEQ loop1
|
||||
next1:
|
||||
! store argc
|
||||
ADR R5,argc
|
||||
STR R6,[R5]
|
||||
! copy the string
|
||||
! onto the stack
|
||||
MOV R9,R0 !source
|
||||
MOV R2,R12 !dest
|
||||
MOV R3,R7 !#chars
|
||||
loop2:
|
||||
LDR.B R4,[R9],#1
|
||||
STR.B R4,[R2],#1
|
||||
SUB.S R3,R3,#1
|
||||
BNE loop2
|
||||
MOV R4, #0 ! zero terminator
|
||||
STR.B R4,[R2]
|
||||
! create space on the stack for
|
||||
! the pointers to individual args
|
||||
MOV R11, R12 ! string pt
|
||||
MOV R8,R6,LSL #2
|
||||
SUB R12,R12,R8
|
||||
! save pointer to argv[0]
|
||||
ADR R1,argv
|
||||
STR R12,[R1]
|
||||
! determine argv[0] .. argv[argc-1]
|
||||
! and store on stack
|
||||
! R11 = start of string
|
||||
! R7 = string lenth
|
||||
! R12 = stack pointer
|
||||
! R6 = argc
|
||||
MOV R9, #0 !char count
|
||||
MOV R8, #0 !arg count
|
||||
MOV R5,R11
|
||||
loop3:
|
||||
CMP R9,R7
|
||||
BGT next2
|
||||
LDR.B R4,[R5],#1
|
||||
ADD R9,R9,#1
|
||||
CMP R4,#32
|
||||
BEQ loop3
|
||||
CMP R9,R7
|
||||
BGT next2
|
||||
SUB R4,R5,#1 !compensate for incr
|
||||
STR R4,[R12,R8,LSL #2]
|
||||
ADD R8,R8,#1
|
||||
nospace2:
|
||||
CMP R9,R7
|
||||
BGT next2
|
||||
LDR.B R4,[R5],#1
|
||||
ADD R9,R9,#1
|
||||
CMP R4,#32
|
||||
BNE nospace2
|
||||
CMP R9,R7
|
||||
BCC loop3
|
||||
! BEQ loop3
|
||||
! finally, replace spaces by 0
|
||||
next2:
|
||||
MOV R5,R11 !string ptr
|
||||
MOV R6,R7 !string length
|
||||
MOV R3,#0
|
||||
loop4:
|
||||
CMP R6,#0
|
||||
BEQ next3
|
||||
LDR.B R4,[R5]
|
||||
CMP R4,#32
|
||||
STR.EQ.B R3,[R5]
|
||||
ADD R5,R5,#1
|
||||
SUB R6,R6,#1
|
||||
BAL loop4
|
||||
next3:
|
||||
ADR R11, envp
|
||||
STMFD R12<,{R11}
|
||||
ADR R11,argv
|
||||
LDR R11,[R11]
|
||||
STMFD R12<,{R11}
|
||||
ADR R11, argc
|
||||
LDR R11,[R11]
|
||||
STMFD R12<,{R11}
|
||||
BAL.L _m_a_i_n
|
||||
MOV R11,#0
|
||||
STMFD R12<,{R11}
|
||||
MOV R11,#1
|
||||
STMFD R12<,{R11}
|
||||
BAL.L _EmMon
|
||||
|
||||
.sect .bss
|
||||
begbss:
|
||||
.sect .data
|
||||
begdat:
|
||||
hol0:
|
||||
.data4 0
|
||||
.data4 0
|
||||
.data4 0
|
||||
.data4 0
|
||||
argv:
|
||||
.data4 2f
|
||||
.data4 0
|
||||
envp:
|
||||
.data4 0
|
||||
.data4 0
|
||||
argc:
|
||||
.data4 0
|
||||
2:
|
||||
.asciz 'PROGRAM'
|
||||
reghp:
|
||||
.data4 _endbss
|
||||
ignmask:
|
||||
.data4 0
|
||||
trpreg:
|
||||
.data4 0
|
||||
.asciz 'PROGRAM'
|
||||
.align
|
||||
_RegHp:
|
||||
.data4 _endbss
|
||||
_Lineno:
|
||||
.data4 0
|
||||
_Filna:
|
||||
.data4 0
|
||||
_IgnoreMask:
|
||||
.data4 0
|
||||
_TrpReg:
|
||||
.data4 0
|
||||
_incptflag:
|
||||
.data4 0
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
.sect .text
|
||||
|
||||
.mli: LDMFD R12<,{R1,R2}
|
||||
STMFD R12<,{R4}
|
||||
MOV R3,#0
|
||||
MOV R0,#0
|
||||
CMP R1,#0
|
||||
|
@ -24,4 +25,5 @@
|
|||
BNE 1B
|
||||
TST R3,#1
|
||||
RSB.NE R0,R0,#0
|
||||
LDMFD R12<,{R4}
|
||||
MOV R15,R14
|
||||
|
|
14
mach/arm/libem/mlu.s
Normal file
14
mach/arm/libem/mlu.s
Normal file
|
@ -0,0 +1,14 @@
|
|||
.define .mlu
|
||||
|
||||
.sect .text
|
||||
|
||||
.mlu:
|
||||
LDMFD R12<,{R0,R1}
|
||||
MOV R2, #0
|
||||
_mluloop:
|
||||
MOV.S R0,R0,LSR #1
|
||||
ADD.CS R2,R2,R1
|
||||
ADD R1,R1,R1
|
||||
BNE _mluloop
|
||||
MOV R0,R2
|
||||
MOV R15,R14
|
14
mach/arm/libem/rck.s
Normal file
14
mach/arm/libem/rck.s
Normal file
|
@ -0,0 +1,14 @@
|
|||
.define _RckTrap,_CasErr
|
||||
.sect .text
|
||||
|
||||
_RckTrap:
|
||||
MOV R0,#1
|
||||
STMFD R12<,{R0}
|
||||
BAL.L _EmTrp
|
||||
|
||||
_CasErr:
|
||||
MOV R0,#20
|
||||
STMFD R12<,{R0}
|
||||
BAL.L _EmTrp
|
||||
|
||||
|
|
@ -23,5 +23,5 @@
|
|||
ADD R1,R1,#4
|
||||
CMP R1,R3
|
||||
MOV.EQ R15,R14
|
||||
STMFD R12<,{R2}
|
||||
LDMFD R12<,{R2}
|
||||
BAL 1b
|
||||
|
|
Loading…
Reference in a new issue