Albert Koelmans newest version
This commit is contained in:
		
							parent
							
								
									064258aa8b
								
							
						
					
					
						commit
						0a1b11973a
					
				
					 9 changed files with 308 additions and 48 deletions
				
			
		|  | @ -3,3 +3,7 @@ los.s | ||||||
| sts.s | sts.s | ||||||
| dvi.s | dvi.s | ||||||
| mli.s | mli.s | ||||||
|  | csab.s | ||||||
|  | dvu.s | ||||||
|  | mlu.s | ||||||
|  | rck.s | ||||||
|  |  | ||||||
							
								
								
									
										57
									
								
								mach/arm/libem/csab.s
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								mach/arm/libem/csab.s
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||||
|  | 
 | ||||||
|  | @ -3,13 +3,16 @@ | ||||||
| 	.sect .text | 	.sect .text | ||||||
| 
 | 
 | ||||||
| .dvi:	LDMFD R12<,{R1,R2} | .dvi:	LDMFD R12<,{R1,R2} | ||||||
| 	MOV R3,#0 | 	STMFD R12<,{R4} | ||||||
| 	CMP R1,#0 | 	CMP R1,#0 | ||||||
| 	ADD.MI R3,R3,#1 | 	BEQ dbyzero | ||||||
| 	RSB.MI R1,R1,#0 | 	MOV R4,#0 | ||||||
|  | 	CMP R1,#0 | ||||||
|  | 	ADD.LT R4,R4,#1 | ||||||
|  | 	RSB.LT R1,R1,#0 | ||||||
| 	CMP R2,#0 | 	CMP R2,#0 | ||||||
| 	ADD.MI R3,R3,#2 | 	ADD.LT R4,R4,#2 | ||||||
| 	RSB.MI R2,R2,#0 | 	RSB.LT R2,R2,#0 | ||||||
| 	MOV R0,#1 | 	MOV R0,#1 | ||||||
| div1:	CMP R1,#0x80000000 | div1:	CMP R1,#0x80000000 | ||||||
| 	CMP.CC R1,R2 | 	CMP.CC R1,R2 | ||||||
|  | @ -23,9 +26,14 @@ div2:	CMP R2,R1 | ||||||
| 	MOV.S R0,R0,LSR #1 | 	MOV.S R0,R0,LSR #1 | ||||||
| 	MOV.NE R1,R1,LSR #1 | 	MOV.NE R1,R1,LSR #1 | ||||||
| 	BNE div2 | 	BNE div2 | ||||||
| 	TST R4, #2 | 	CMP R4, #1 | ||||||
| 	RSB.NE R2,R2,#0 | 	RSB.EQ R3,R3,#0 | ||||||
| 	TST R4, #1 | 	CMP R4,#2 | ||||||
| 	TST.NE R4, #1 | 	RSB.EQ R3,R3,#0 | ||||||
| 	RSB.NE R3,R3,#0 | 	LDMFD R12<,{R4} | ||||||
| 	MOV R15,R14 | 	MOV R15,R14 | ||||||
|  | dbyzero: | ||||||
|  | 	MOV R0,#6 | ||||||
|  | 	STMFD R12<,{R0} | ||||||
|  | 	BAL _EmTrp | ||||||
|  | 
 | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								mach/arm/libem/dvu.s
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								mach/arm/libem/dvu.s
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||||
|  | @ -1,49 +1,178 @@ | ||||||
| .define 	begdat, begbss | ! head_em.s | ||||||
| .define	hol0, argv, envp, reghp | .define begdat,begbss,hol0,argv,envp,_RegHp,_incptflag | ||||||
| .define ignmask, trpreg, rcktrap | .define _Lineno,_Filna,_IgnoreMask,_TrpReg | ||||||
| 
 | 
 | ||||||
| .sect	.text | .sect .text | ||||||
| .sect	.rom | .sect .rom | ||||||
| .sect	.data | .sect .data | ||||||
| .sect	.bss | .sect .bss | ||||||
| 
 | 
 | ||||||
| .sect 	.text | .sect .text | ||||||
| 
 | .base 0x8000
 | ||||||
| 	ADR R0,begbss |  ADR R0,begbss | ||||||
| 	ADR R1,_endbss |  ADR R1,_endbss | ||||||
| 	MOV R2,#0 |  MOV R2,#0 | ||||||
|  |  ADR R3,_incptflag | ||||||
|  |  STR R2,[R3] | ||||||
| 1: | 1: | ||||||
| 	STR R2,[R0],#4 |  STR R2,[R0],#4 | ||||||
| 	CMP R0,R1 |  CMP R0,R1 | ||||||
| 	BGT 1b |  BLT 1B | ||||||
| 
 | ! the next 2 lines are OS specific: | ||||||
| 	MOV R12, #0x100000 |  SWI 16			! OS_Getenv | ||||||
| 	ADR R11, envp |  SUB R12, R1, #8	! Get end of ram | ||||||
| 	STMFD R12<, {R11} | ! R0 points to command string | ||||||
| 	ADR R11, argv | ! (argv,argc) code for C | ||||||
| 	STMFD R12<, {R11} | ! or Pascal file names | ||||||
| 	MOV R11, #1 |  MOV R9,R0  ! save pt in R0 | ||||||
| 	STMFD R12<, {R11} |  MOV R8,#0  ! string length | ||||||
| 	BAL.L _m_a_i_n | len: | ||||||
| rcktrap: |  LDR.B R7,[R9],#1 | ||||||
| 	SWI 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 | .sect .bss | ||||||
| begbss: | begbss: | ||||||
| .sect .data | .sect .data | ||||||
| begdat: | begdat: | ||||||
| hol0: | hol0: | ||||||
| 	.data4 0
 |  .data4 0
 | ||||||
| 	.data4 0
 |  .data4 0
 | ||||||
| argv: | argv: | ||||||
| 	.data4 2f
 |  .data4 0
 | ||||||
| envp: | envp: | ||||||
| 	.data4 0
 |  .data4 0
 | ||||||
|  | argc: | ||||||
|  | .data4 0
 | ||||||
| 2: | 2: | ||||||
| 	.asciz 'PROGRAM' |  .asciz 'PROGRAM' | ||||||
| reghp:	 |  .align | ||||||
| 	.data4 _endbss
 | _RegHp: | ||||||
| ignmask: |  .data4 _endbss
 | ||||||
| 	.data4 0
 | _Lineno: | ||||||
| trpreg: |  .data4	0
 | ||||||
| 	.data4 0
 | _Filna: | ||||||
|  |  .data4 0
 | ||||||
|  | _IgnoreMask: | ||||||
|  |  .data4 0
 | ||||||
|  | _TrpReg: | ||||||
|  |  .data4 0
 | ||||||
|  | _incptflag: | ||||||
|  | .data4 0
 | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ | ||||||
| 	.sect .text | 	.sect .text | ||||||
| 
 | 
 | ||||||
| .mli:	LDMFD R12<,{R1,R2} | .mli:	LDMFD R12<,{R1,R2} | ||||||
|  | 	STMFD R12<,{R4} | ||||||
| 	MOV R3,#0 | 	MOV R3,#0 | ||||||
| 	MOV R0,#0 | 	MOV R0,#0 | ||||||
| 	CMP R1,#0 | 	CMP R1,#0 | ||||||
|  | @ -24,4 +25,5 @@ | ||||||
| 	BNE 1B | 	BNE 1B | ||||||
| 	TST R3,#1 | 	TST R3,#1 | ||||||
| 	RSB.NE R0,R0,#0 | 	RSB.NE R0,R0,#0 | ||||||
|  | 	LDMFD R12<,{R4} | ||||||
| 	MOV R15,R14 | 	MOV R15,R14 | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								mach/arm/libem/mlu.s
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								mach/arm/libem/mlu.s
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||||
							
								
								
									
										14
									
								
								mach/arm/libem/rck.s
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								mach/arm/libem/rck.s
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||||
|  |   | ||||||
|  |   | ||||||
|  | @ -23,5 +23,5 @@ | ||||||
| 	ADD R1,R1,#4 | 	ADD R1,R1,#4 | ||||||
| 	CMP R1,R3 | 	CMP R1,R3 | ||||||
| 	MOV.EQ R15,R14 | 	MOV.EQ R15,R14 | ||||||
| 	STMFD R12<,{R2} | 	LDMFD R12<,{R2} | ||||||
| 	BAL 1b | 	BAL 1b | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue