Albert Koelmans newest version
authorceriel <none@none>
Mon, 12 Nov 1990 17:09:15 +0000 (17:09 +0000)
committerceriel <none@none>
Mon, 12 Nov 1990 17:09:15 +0000 (17:09 +0000)
mach/arm/libem/LIST
mach/arm/libem/csab.s [new file with mode: 0644]
mach/arm/libem/dvi.s
mach/arm/libem/dvu.s [new file with mode: 0644]
mach/arm/libem/head_em.s
mach/arm/libem/mli.s
mach/arm/libem/mlu.s [new file with mode: 0644]
mach/arm/libem/rck.s [new file with mode: 0644]
mach/arm/libem/sts.s

index 09480f1..58cb6e7 100644 (file)
@@ -3,3 +3,7 @@ los.s
 sts.s
 dvi.s
 mli.s
+csab.s
+dvu.s
+mlu.s
+rck.s
diff --git a/mach/arm/libem/csab.s b/mach/arm/libem/csab.s
new file mode 100644 (file)
index 0000000..15f003b
--- /dev/null
@@ -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
+
index be6b89c..2dfbfdf 100644 (file)
@@ -3,13 +3,16 @@
        .sect .text
 
 .dvi:  LDMFD R12<,{R1,R2}
-       MOV R3,#0
+       STMFD R12<,{R4}
+       CMP R1,#0
+       BEQ dbyzero
+       MOV R4,#0
        CMP R1,#0
-       ADD.MI R3,R3,#1
-       RSB.MI R1,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
+
diff --git a/mach/arm/libem/dvu.s b/mach/arm/libem/dvu.s
new file mode 100644 (file)
index 0000000..00ad3d0
--- /dev/null
@@ -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
index 785cc36..f8f8530 100644 (file)
-.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 .text
+.sect .rom
+.sect .data
+.sect .bss
 
-       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
+
index d6f853e..a272d51 100644 (file)
@@ -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
diff --git a/mach/arm/libem/mlu.s b/mach/arm/libem/mlu.s
new file mode 100644 (file)
index 0000000..0f96bd4
--- /dev/null
@@ -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
diff --git a/mach/arm/libem/rck.s b/mach/arm/libem/rck.s
new file mode 100644 (file)
index 0000000..d6d710d
--- /dev/null
@@ -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
index 39e555b..723d93f 100644 (file)
@@ -23,5 +23,5 @@
        ADD R1,R1,#4
        CMP R1,R3
        MOV.EQ R15,R14
-       STMFD R12<,{R2}
+       LDMFD R12<,{R2}
        BAL 1b