ack/mach/arm/libmon/head_em.s

179 lines
2.7 KiB
ArmAsm

! 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
.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
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
argv:
.data4 0
envp:
.data4 0
argc:
.data4 0
2:
.asciz 'PROGRAM'
.align
_RegHp:
.data4 endbss
_Lineno:
.data4 0
_Filna:
.data4 0
_IgnoreMask:
.data4 0
_TrpReg:
.data4 0
_incptflag:
.data4 0