head_em.s 2.7 KB

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