123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- ! 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
|