Pristine Ack-5.5
[Ack-5.5.git] / mach / arm / libmon / head_em.s
1 ! head_em.s
2 .define begdat,begbss,hol0,argv,envp,_RegHp,_incptflag
3 .define _Lineno,_Filna,_IgnoreMask,_TrpReg
4
5 .sect .text
6 .sect .rom
7 .sect .data
8 .sect .bss
9
10 .sect .text
11 .base 0x8000
12  ADR R0,begbss
13  ADR R1,endbss
14  MOV R2,#0
15  ADR R3,_incptflag
16  STR R2,[R3]
17 1:
18  STR R2,[R0],#4
19  CMP R0,R1
20  BLT 1B
21 ! the next 2 lines are OS specific:
22  SWI 16                 ! OS_Getenv
23  SUB R12, R1, #8        ! Get end of ram
24 ! R0 points to command string
25 ! (argv,argc) code for C
26 ! or Pascal file names
27  MOV R9,R0  ! save pt in R0
28  MOV R8,#0  ! string length
29 len:
30  LDR.B R7,[R9],#1
31  CMP R7,#0
32  ADD.NE R8,R8,#1
33  BNE len
34  MOV R7,R8  ! save len in R7
35 ! round up to multiple of 4
36  ADD R8,R8,#4
37  MVN R6, #3   !FFFFFFFC
38  AND R8,R8,R6
39 ! make room on stack
40  SUB R12,R12,R8  ! word aligned
41 ! now determine argc
42 ! OS intercepts blank lines, so
43 ! there must be at least one arg
44  MOV R9,R0
45  MOV R6,#0  ! holds argc
46  MOV R5,#0  ! char count
47 loop1:
48  CMP R5,R7
49  BGT next1
50  LDR.B R4,[R9],#1
51  ADD R5,R5,#1
52  CMP R4,#32
53  BEQ loop1  !skip spaces
54  ADD R6,R6,#1   ! new arg
55 nospace1:
56  CMP R5,R7
57  BGT next1
58  LDR.B R4,[R9],#1
59  ADD R5,R5,#1
60  CMP R4,#32
61  BNE nospace1
62  CMP R5,R7
63  BCC loop1
64 ! BEQ loop1
65 next1:
66 ! store argc
67  ADR R5,argc
68  STR R6,[R5]
69 ! copy the string
70 ! onto the stack
71  MOV R9,R0  !source
72  MOV R2,R12 !dest
73  MOV R3,R7  !#chars
74 loop2:
75  LDR.B R4,[R9],#1
76  STR.B R4,[R2],#1
77  SUB.S R3,R3,#1
78  BNE loop2
79  MOV R4, #0  ! zero terminator
80  STR.B R4,[R2]
81 ! create space on the stack for
82 ! the pointers to individual args
83  MOV R11, R12  ! string pt
84  MOV R8,R6,LSL #2
85  SUB R12,R12,R8
86 ! save pointer to argv[0]
87  ADR R1,argv
88  STR R12,[R1]
89 ! determine argv[0] .. argv[argc-1]
90 ! and store on stack
91 ! R11 = start of string
92 ! R7  = string lenth
93 ! R12 = stack pointer
94 ! R6  = argc
95  MOV R9, #0  !char count
96  MOV R8, #0  !arg count
97  MOV R5,R11
98 loop3:
99  CMP R9,R7
100  BGT next2
101  LDR.B R4,[R5],#1
102  ADD R9,R9,#1
103  CMP R4,#32
104  BEQ loop3
105  CMP R9,R7
106  BGT next2
107  SUB R4,R5,#1 !compensate for incr
108  STR R4,[R12,R8,LSL #2]
109  ADD R8,R8,#1
110 nospace2:
111  CMP R9,R7
112  BGT next2
113  LDR.B R4,[R5],#1
114  ADD R9,R9,#1
115  CMP R4,#32
116  BNE nospace2
117  CMP R9,R7
118  BCC loop3
119 ! BEQ loop3
120 ! finally, replace spaces by 0
121 next2:
122  MOV R5,R11  !string ptr
123  MOV R6,R7   !string length
124  MOV R3,#0
125 loop4:
126  CMP R6,#0
127  BEQ next3
128  LDR.B R4,[R5]
129  CMP R4,#32
130  STR.EQ.B R3,[R5]
131  ADD R5,R5,#1
132  SUB R6,R6,#1
133  BAL loop4
134 next3:
135  ADR R11, envp
136  STMFD R12<,{R11}
137  ADR R11,argv
138  LDR R11,[R11]
139  STMFD R12<,{R11}
140  ADR R11, argc
141  LDR R11,[R11]
142  STMFD R12<,{R11}
143  BAL.L __m_a_i_n
144  MOV R11,#0
145  STMFD R12<,{R11}
146  MOV R11,#1
147  STMFD R12<,{R11}
148  BAL.L _EmMon
149
150 .sect .bss
151 begbss:
152 .sect .data
153 begdat:
154 hol0:
155  .data4 0
156  .data4 0
157 argv:
158  .data4 0
159 envp:
160  .data4 0
161 argc:
162 .data4 0
163 2:
164  .asciz 'PROGRAM'
165  .align
166 _RegHp:
167  .data4 endbss
168 _Lineno:
169  .data4 0
170 _Filna:
171  .data4 0
172 _IgnoreMask:
173  .data4 0
174 _TrpReg:
175  .data4 0
176 _incptflag:
177 .data4 0
178