home *** CD-ROM | disk | FTP | other *** search
- GET Asm:h.Standard
-
- MB * 1024*1024
- KB * 1024
-
- ; This is the start & size of kernel in memory
- KERNEL_START * 24*MB
- KERNEL_SIZE * 512*KB
-
- ; This is the address used to map unused pages to
- NULL_MAPPING * 31*MB
-
- ; This is the start & size of screen memory
- SCREEN_START * 32512*KB
- SCREEN_SIZE * 256*KB
-
- SWI OS_GetEnv
- MOV r13,r1 ; set up stack
- SUB r1,r13,#32*1024
- STR r1,memmapinfo ; Place to store mem map info
- BL process_options
- ADRL r0,oos
- LDRB r0,[r0,#1]
- TEQ r0,#0
- BNE skip_00
- SWI OS_WriteS
- = 22,31,31,10,10,"Linux (c) Linus Torvalds, ported to the Archimedes by "
- = "R.M.King (2 June 1994)",13,10,13,10,0
- skip_00 BL check_memmap ; Check the map
- BL load_kernel ; Load kernel into memory
- STMFD sp!,{r0}
- ADR r0,shutdown
- SWI OS_CLI
- ADRL r0,oos
- LDR r0,[r0]
- TST r0,#&FF
- TSTNE r0,#&FF0000
- BLEQ continue
- BL move_code ; Move 'move' code to page
- ; BL show_movelist ; Show memory move list
- LDMFD sp!,{r2}
- ; MOV r0,r2
- ; BL show_moveinfo
- ; SWI OS_Exit
- SWI OS_EnterOS ; *** POINT OF NO RETURN ******
- TEQP pc,#&0C000003 ; Disable interrupts
- LDR r0,=&03200000 ; Get MEMC address
- MOV r1,#0
- STRB r1,[r0,#&18]
- STRB r1,[r0,#&28]
- STRB r1,[r0,#&38]
-
- LDR r0,movelist
- LDR r1,endofmovelist
- LDR r3,pagesize
- LDR r4,numpages
- LDR r8,kernel_start
- LDR r9,kernel_size
- MOV pc,r2 ; Call move code
-
- SWI OS_Exit
-
-
- continue STMFD sp!,{r0-r2,lr}
- SWI OS_NewLine
- SWI OS_WriteS
- = "You will lose all data in RISC OS. Continue? (Y/N)",0
- SWI OS_Confirm
- SWINE OS_Exit
- = "Loading... Please wait...",0
- LDMFD sp!,{r0-r2,pc}^
-
- shutdown = "Shutdown",0
-
- check_memmap STMFD sp!,{lr}
- SWI OS_ReadMemMapInfo ; Get page size etc & show info
- STR r0,pagesize
- STR r1,numpages
- TEQ r0,#&8000
- TEQNE r0,#&4000
- BNE badpagesize
- ADRL r4,oos
- LDRB r4,[r4,#1]
- TEQ r4,#0
- MOV r4,r1
- BNE skip_01
- SUB r1,sp,#16
- MOV r2,#14
- SWI OS_ConvertCardinal3
- SWI OS_WriteS
- = 13,10," RAM page size is ",0
- SWI OS_Write0
- SWI OS_WriteS
- = " bytes, with ",0
- MOV r0,r4
- SUB r1,sp,#16
- MOV r2,#14
- SWI OS_ConvertCardinal3
- SWI OS_Write0
- SWI OS_WriteS
- = " pages.",13,10,0
- skip_01 LDR r0,memmapinfo
- MOV r1,#0
- MOV r2,#0
- getmemlp STR r1,[r0,r2]
- ADD r2,r2,#3*4
- ADD r1,r1,#1
- TEQ r1,r4
- BNE getmemlp
- MVN r1,#0
- STR r1,[r0,r2]
- SWI OS_ReadMemMapEntries ; Read current mapping
- ; SWI OS_WriteS
- ; = 13,10," Sorting pages...",0
- MOV r2,#4
- MOV r1,#0
- MOV r5,#&10000
- killbadpglp LDR r3,[r0,r2] ; Remove those outsize our range
- CMP r3,r5
- MOVCC r3,#0
- STRCC r3,[r0,r2]
- CMP r3,r0
- MOVCS r3,#0
- STRCS r3,[r0,r2]
- ADD r2,r2,#3*4
- ADD r1,r1,#1
- TEQ r1,r4
- BNE killbadpglp
- ; SWI OS_WriteS
- ; = 13,10," Pages available: ",0
- ; MOV r2,#4
- ; MOV r1,#0
- ;listpglp LDR r3,[r0,r2]
- ; TEQ r3,#0
- ; BLNE page_avail
- ; ADD r2,r2,#3*4
- ; ADD r1,r1,#1
- ; TEQ r1,r4
- ; BNE listpglp
- LDMFD sp!,{pc}
-
- endcode DCD end_code-endcode
- pagesize DCD 0
- numpages DCD 0
- memmapinfo DCD 0
-
- add_move STMFD sp!,{r0-r1,r4-r7,lr}
- MOV r0,r9
- MUL r0,r6,r0
- ADD r0,r0,r4
- ADD r0,r0,#&02000000
- LDR r1,endofmovelist
- STR r2,[r1],#4
- STR r0,[r1],#4
- STR r1,endofmovelist
- LDMFD sp!,{r0-r1,r4-r7,pc}^
-
- ;show_movelist STMFD sp!,{lr}
- ; LDR r3,movelist
- ; LDR r4,endofmovelist
- ;show_movelistlp CMP r3,r4
- ; LDMCSFD sp!,{pc}^
- ; LDR r0,[r3],#4
- ; LDR r1,[r3],#4
- ; BL show_moveinfo
- ; B show_movelistlp
-
- movelist DCD 0
- endofmovelist DCD 0
- kernel_handle DCD 0
- kernel_start DCD KERNEL_START
- kernel_size DCD KERNEL_SIZE
-
- kernel_fn = "<Linux$Dir>.Kernel",0
-
- load_kernel STMFD sp!,{lr}
- STMFD sp!,{r0,r2-r5}
- MOV r0,#17
- ADR r1,kernel_fn
- SWI OS_File
- STR r2,kernel_start
- ADD r4,r4,#&800
- BIC r4,r4,#&7F00
- BIC r4,r4,#&00FF
- ADD r4,r4,#&8000
- STR r4,kernel_size
-
- LDMFD sp!,{r0,r2-r5}
- MOV r0,#&4F
- SWI OS_Find
- BVS load_error
- STR r0,kernel_handle
- MOV r1,r0
-
- LDR r8,memmapinfo
- ADD r8,r8,#4
- MOV r7,#0 ; Page number counter
- LDR r6,pagesize
- MOV r4,#(32+256)*1024
- MOV r9,#0
- pageslp SUBS r4,r4,r6 ; Find start of kernel
- ADDPL r9,r9,#1
- BPL pageslp
- LDR r4,kernel_size
- ADD r4,r4,r6 ; Page for parameters
- MOV r5,r9
- pages2lp SUBS r4,r4,r6 ; Find start of free ram
- ADDPL r5,r5,#1
- BPL pages2lp
- MOV r4,#0
- BL find_freepage
- STR r2,movelist
- STR r2,endofmovelist
- MOV r0,#1
- STR r0,[r8,r3,LSL#2] ; Make page unavailable
-
- load_kernellp ADD r3,r7,r9 ; Start of kernel
- MOV r11,r3
- ADD r3,r3,r3,LSL#1 ; Get offset
- LDR r2,[r8,r3,LSL#2]
- CMP r2,#2 ; If page unavailable,
- BLCC find_freepage ; Get a free page
- BLCC add_move
- MOV r0,#1
- STR r0,[r8,r3,LSL#2] ; Make page unavailable
- MOV r0,#4
- MOV r3,r6
- ; BL load_info
- ; SWICC &100+'r'
- ; SWICS &100+'c'
- SWI XOS_GBPB ; Read page
-
- BVS load_error
- ADD r7,r7,#1 ; Next page
- TEQ r3,#0
- BEQ load_kernellp ; If not end, repeat
-
- SUB r3,r6,#1
- ADD r4,r4,#&800
- BIC r4,r4,r3
- ADD r4,r4,r6 ; Move into next page
-
- SUB r7,r5,#1 ; Page number for parameters
-
- MOV r0,#0
- STR r0,kernel_handle
- SWI OS_Find ; Close file
- MOV r3,r7
- MOV r11,r3
- ADD r3,r3,r3,LSL#1 ; Get offset
- LDR r2,[r8,r3,LSL#2]
- CMP r2,#2
- BLCC find_freepage ; Find a free page
- BLCC add_move
- MOV r0,#1
- STR r0,[r8,r3,LSL#2] ; Prevent this page being grabbed
- ; BL load_info
- ; SWICC &100+'R'
- ; SWICS &100+'C'
-
- BL get_kernel_info
- ADD r7,r7,#1 ; Increment page counter
- BL find_freepage ; Get a free page for move routines
- MOV r0,r11
- MUL r0,r6,r0
- ADD r0,r0,#&02000000
- LDMFD sp!,{pc}
-
- find_freepage STMFD sp!,{r0-r1,r4-r7,lr}
- find_freelp ADD r3,r5,r5,LSL#1
- LDR r2,[r8,r3,LSL#2]
- CMP r2,#2
- MOVCS r11,r5
- LDMCSFD sp!,{r0-r1,r4-r7,pc}^
- ADDCC r5,r5,#1
- TEQ r5,#128
- BNE find_freelp
- ADR r0,nomemerror
-
- load_error MOV r7,r0
- LDR r1,kernel_handle
- TEQ r1,#0
- MOVNE r0,#0
- SWINE OS_Find
- MOV r0,r7
- SWI OS_GenerateError
-
- nomemerror = 0,0,0,0,"*** Out of memory ***",0
-
- ;load_info STMFD sp!,{r0-r8,lr}
- ; MOV r3,r2
- ; SWI OS_WriteS
- ; = 13,10," Loading kernel code &",0
- ; MOV r0,r4
- ; SUB r1,sp,#16
- ; MOV r2,#14
- ; SWI OS_ConvertHex8
- ; SWI OS_Write0
- ; SWI OS_WriteS
- ; = " at &",0
- ; MOV r0,r3
- ; SUB r1,sp,#16
- ; MOV r2,#14
- ; SWI OS_ConvertHex8
- ; SWI OS_Write0
- ; SWI &100+'('
- ; MOV r0,#9
- ;; MOV r0,r11
- ; MUL r0,r6,r0
- ; ADD r0,r0,#&02000000
- ; ADD r0,r0,r4
- ; SUB r1,sp,#16
- ; MOV r2,#14
- ; SWI OS_ConvertHex8
- ; SWI OS_Write0
- ; SWI &100+')'
- ; LDMFD sp!,{r0-r8,pc}^
-
- ;page_avail STMFD sp!,{r0-r2,lr}
- ; MOV r0,r1
- ; SUB r1,sp,#16
- ; MOV r2,#14
- ; SWI OS_ConvertCardinal1
- ; SWI OS_Write0
- ; SWI &100+','
- ; SWI &100+' '
- ; LDMFD sp!,{r0-r2,pc}^
-
- printdec STMFD sp!,{r0-r2,lr}
- SUB r1,sp,#16
- MOV r2,#14
- SWI OS_ConvertCardinal4
- SWI OS_Write0
- LDMFD sp!,{r0-r2,pc}^
-
- badpagesize SWI OS_WriteS
- = 13,10,10,"*** Cannot start linux - can only handle 16KB or 32KB page sizes."
- = 13,10,0
- SWI OS_Exit
-
- ;show_moveinfo STMFD sp!,{r0-r4,lr}
- ; MOV r7,r1
- ; SWI OS_WriteS
- ; = 13,10," Relocate ",0
- ; SUB r1,sp,#16
- ; MOV r2,#14
- ; SWI OS_ConvertHex8
- ; SWI OS_Write0
- ; SWI &100+'-'
- ; SWI &100+'>'
- ; MOV r0,r7
- ; SUB r1,sp,#16
- ; MOV r2,#14
- ; SWI OS_ConvertHex8
- ; SWI OS_Write0
- ; LDMFD sp!,{r0-r4,pc}^
-
- ;showstack STMFD sp!,{r0-r2,lr}
- ; MOV r0,r2
- ; SUB r1,sp,#16
- ; MOV r2,#14
- ; SWI OS_ConvertHex8
- ; SWI OS_Write0
- ; LDMFD sp!,{r0-r2,pc}^
-
- ; Set up & display current kernel information
-
- configfile = "<Linux$Dir>.Config",0
-
- set_kernel_info STMFD sp!,{r2,r7,lr}
- MOV r7,r2
- LDR r0,pagesize
- STR r0,[r7] ; Page size (bytes)
- LDR r0,numpages
- STR r0,[r7,#4] ; Number of pages
- MOV r0,#0 ; Disable Sound DMA
- MOV r1,#1<<11
- SWI XOS_UpdateMEMC
- STR r0,[r7,#9*4]
- MOV r0,#161 ; Read SoundDefault parameters
- MOV r1,#148
- SWI XOS_Byte
- STRB r2,[r7,#10*4]
- MOV r0,#161 ; Read ADFS Drives info
- MOV r1,#135
- SWI XOS_Byte
- STRB r2,[r7,#10*4+1]
- MOV r0,#165 ; Read current o/p cursor position
- SWI XOS_Byte
- TEQ r1,#0
- ADDNE r2,r2,#4
- ADDEQ r2,r2,#3
- MOVNE r1,#0
- STR r1,[r7,#7*4]
- STR r2,[r7,#8*4]
- MOV r1,#100
- MOV r2,#75
- STR r1,[r7,#5*4]
- STR r2,[r7,#6*4]
- MOV r1,#4
- MOV r2,#8
- STRB r1,[r7,#10*4+2]
- STRB r2,[r7,#10*4+3]
- LDMFD sp!,{r2,r7,pc}^
-
- get_kernel_info STMFD sp!,{r0-r12,lr}
- ; BL showstack
- BL set_kernel_info
- MOV r0,#0
- STR r0,[r2,#8] ; Ram disk size
- STR r0,[r2,#12] ; Mount root read-only
- STR r0,[r2,#&100] ; Command line
- STR r0,[r2,#&200] ; Command line
- STR r0,[r2,#&300] ; Command line
- STR r0,[r2,#&400] ; Command line
- STR r0,[r2,#&500] ; Command line
- MOV r0,#&200 ; Root dev
- STR r0,[r2,#16]
- MOV r7,r2
- ADR r1,configfile
- MOV r0,#&4C
- SWI XOS_Find
- BVS showkernelinfo
- TEQ r0,#0
- BEQ showkernelinfo
- MOV r1,r0
- MOV r0,#4
- MOV r2,r7
- MOV r3,#&1000
- SWI XOS_GBPB
- MOV r0,#0
- SWI XOS_Find
- MOV r2,r7
- BL set_kernel_info
- ADRL r2,oos
- LDRB r2,[r2]
- TEQ r2,#0
- LDMNEFD sp!,{r0-r12,pc}^
-
- showkernelinfo ADRL r2,oos
- MOV r1,#0
- STRB r1,[r2,#2] ; Clear 'sure' flag
- MOV r2,r7
- SWI &100+28
- SWI &100+0
- SWI OS_WriteS
- = 43,79,15,12,26
- = 31,1,16,11, "Current configuration:",10
- = 10,13, " Page size : ",0
- LDR r0,[r2]
- BL printdec
- SWI OS_WriteS
- = " bytes",31,40,17," Num pages : ",0
- LDR r0,[r2,#4]
- BL printdec
- SWI OS_WriteS
- = 10,10,13, "<R>am Disc Size : ",0
- LDR r0,[r2,#8]
- BL printdec
- SWI OS_WriteS
- = "K",31,40,19, "<M>ount root rdonly: ",0
- LDR r0,[r2,#12]
- TEQ r0,#0
- SWIEQ &100+'N'
- SWINE &100+'Y'
- SWI OS_WriteS
- = 13,10,10, "<C>ommand line : ",0
- ADD r0,r2,#&500
- SWI OS_Write0
- MOV r3,#1
- MOV r4,#1
- MOV r5,#4
- ADD r6,r2,#&100
- BL show_hdfile
- ADD r6,r6,#&80
- BL show_hdfile
- ADD r6,r6,#&80
- BL show_hdfile
- ADD r6,r6,#&80
- BL show_hdfile
- MOV r4,#1
- MOV r5,#5
- ADD r6,r6,#&80
- BL show_hdfile
- ADD r6,r6,#&80
- BL show_hdfile
- ADD r6,r6,#&80
- BL show_hdfile
- ADD r6,r6,#&80
- BL show_hdfile
-
- SWI OS_WriteS
- = 13,10,10,"<S>ave & Run",31,40,39,"<Q>uit"
- = 13,10,10,"Select first letter to change (RMCS):",0
- MOV r0,#126
- SWI OS_Byte
- SWI OS_ReadC
- MOV r2,r7
- TEQ r0,#'M'
- TEQNE r0,#'m'
- BEQ change_rootrdonly
- TEQ r0,#'R'
- TEQNE r0,#'r'
- BEQ change_ramdiscsize
- TEQ r0,#'C'
- TEQNE r0,#'c'
- BEQ change_comdline
- TEQ r0,#'Q'
- TEQNE r0,#'q'
- SWIEQ OS_Exit
- SUB r1,r0,#1
- AND r4,r1,#3
- ADD r4,r4,#1
- MOV r5,r1,LSR#2
- BIC r5,r5,#&FC
- ORR r5,r5,#4
- ADD r6,r7,#&80
- AND r1,r0,#15
- ADD r6,r6,r1,LSL#7
- TEQ r0,#'1'
- TEQNE r0,#'2'
- TEQNE r0,#'3'
- TEQNE r0,#'4'
- TEQNE r0,#'5'
- TEQNE r0,#'6'
- TEQNE r0,#'7'
- TEQNE r0,#'8'
- BEQ newfile
- TEQ r0,#'S'
- TEQNE r0,#'s'
- BNE showkernelinfo
- SWI OS_NewLine
- MOV r0,#&8C
- ADR r1,configfile
- SWI XOS_Find
- BVS err
- TEQ r0,#0
- BEQ err
- MOV r1,r0
- MOV r0,#2
- MOV r2,r7
- MOV r3,#&1000
- SWI XOS_GBPB
- MOV r0,#0
- SWI XOS_Find
- err MOV r2,r7
- BL set_kernel_info
- LDMFD sp!,{r0-r12,pc}
-
- show_hdfile STMFD sp!,{lr}
- SWI &100+13
- SWI &100+10
- SWI &100+10
- SWI &100+'<'
- ADD r0,r3,#&30
- SWI XOS_WriteC
- SWI XOS_WriteS
- = "> Partition ",0
- ALIGN
- ADD r0,r4,#&30
- SWI XOS_WriteC
- SWI XOS_WriteS
- = " : ADFS::",0
- ALIGN
- ADD r0,r5,#&30
- SWI XOS_WriteC
- SWI XOS_WriteS
- = ".$.",0
- ALIGN
- MOV r0,r6
- SWI XOS_Write0
- ADD r3,r3,#1
- ADD r4,r4,#1
- LDMFD sp!,{pc}^
-
- change_rootrdonly
- LDR r0,[r2,#12]
- EOR r0,r0,#1
- STR r0,[r2,#12]
- B showkernelinfo
-
- change_ramdiscsize
- SWI OS_WriteS
- = "R",10,10,13,"New ram disc size (0 = none) : ",0
- ADD r0,r2,#&200
- MOV r1,#&100
- MOV r2,#32
- MOV r3,#&7E
- SWI OS_ReadLine
- BCS showkernelinfo
- MOV r0,#10
- ADD r1,r7,#&200
- SWI XOS_ReadUnsigned
- BVS showkernelinfo
- LDR r1,[r7]
- SUB r1,r1,#1
- ADD r2,r2,r1,LSR#10
- BIC r2,r2,r1,LSR#10
- STR r2,[r7,#8]
- B showkernelinfo
-
- change_comdline SWI OS_WriteS
- = "C",10,10,13,"New command line (ret:none/esc:cancel): ",0
- ADD r0,r7,#&500
-
- comdin STMFD sp!,{r0}
- ADD r0,r2,#&1000
- MOV r1,#&100
- MOV r2,#32
- MOV r3,#&7E
- SWI OS_ReadLine
- LDMFD sp!,{r0}
- BCS showkernelinfo
- ADD r2,r7,#&1000
- MOV r3,#0
- cpycmdlinelp STRB r3,[r0,r1]
- SUBS r1,r1,#1
- LDRPLB r3,[r2,r1]
- BPL cpycmdlinelp
- B showkernelinfo
-
- getfile1 SWI OS_WriteS
- = "1",10,10,13,"New partition file 1 (ret:none/esc:cancel): ",0
- ADD r0,r7,#&100
- B comdin
-
- getfile2 SWI OS_WriteS
- = "2",10,10,13,"New partition file 2 (ret:none/esc:cancel): ",0
- ADD r0,r7,#&200
- B comdin
-
- getfile3 SWI OS_WriteS
- = "3",10,10,13,"New partition file 3 (ret:none/esc:cancel): ",0
- ADD r0,r7,#&300
- B comdin
-
- getfile4 SWI OS_WriteS
- = "4",10,10,13,"New partition file 4 (ret:none/esc:cancel): ",0
- ADD r0,r7,#&400
- B comdin
-
- newfile SWI XOS_WriteC
- SWI XOS_WriteS
- = 10,10,13,"New partition file ",0
- ALIGN
- ADD r0,r4,#&30
- SWI XOS_WriteC
- SWI XOS_WriteS
- = " (ret:none/esc:cancel): ADFS::",0
- ALIGN
- ADD r0,r5,#&30
- SWI XOS_WriteC
- SWI XOS_WriteS
- = ".$.",0
- ALIGN
- MOV r0,r6
- B comdin
-
- process_options STMFD sp!,{lr}
- 00 LDRB r2,[r0],#1
- TEQ r2,#0
- LDMEQFD sp!,{pc}^
- TEQ r2,#' '
- TEQNE r2,#9
- BNE %b00 ; Search for space char
- 01 LDRB r2,[r0],#1
- TEQ r2,#' '
- TEQNE r2,#9
- BEQ %b01 ; Search for non-space char
- TEQ r2,#0
- LDMEQFD sp!,{pc}^
- TEQ r2,#'-'
- BNE %b00 ; Check for '-'
- ADR r3,opts
- MOV r5,#0
- MOV r1,r0 ; Save current pointer
- 02 LDRB r4,[r3],#1
- TEQ r4,#0
- BEQ %f04
- LDRB r2,[r0],#1
- EOR r2,r4,r2
- BICS r2,r2,#&20
- BEQ %b02
- MOV r0,r1
- 03 LDRB r4,[r3],#1
- TEQ r4,#0
- BNE %b03
- ADD r5,r5,#1
- LDRB r4,[r3]
- TEQ r4,#0
- BNE %b02
- B %b00
- 04 LDRB r2,[r0],#1
- TEQ r2,#' '
- TEQNE r2,#9
- TEQNE r2,#0
- BNE %b00
- ADR r2,oos
- MOV r3,#1
- STRB r3,[r2,r5]
- SUB r0,r0,#1
- B %b00
- LDMFD sp!,{pc}^
-
- oos = 0,0,0,0
- DCD 0
-
- opts = "run",0,"quiet",0,"sure",0,0
-
- ; Code to move the area from pagemovecode to pageendmovecode to correct pages in physical
- ; memory.
-
- move_code ADR r3,pagemovecode
- ADR r4,pageendmovecode
- MOV r1,r2
- move_codelp LDR r0,[r3],#4
- STR r0,[r1],#4
- CMP r3,r4
- BCC move_codelp
- MOV pc,lr
-
- ; NO EXTRA FUNCTIONS AFTER HERE! This section gets copied to a free page so that we
- ; can shift the kernel to the correct location with no fear of overwriting the copying
- ; routines.
-
- ; Routines to copy pages to correct locations
- ; This better be correct!
- ; This code is run at a place where it is not going to be overwritten
- ; and so has to be *fully* relocateable
-
- ; Entry conditions:
- ; r0 Start of page move list
- ; r1 End of page move list
- ; r2 * Unused *
- ; r3 Page size
- ; r4 Number of pages
- ; r5 * Unused *
- ; r6 * Unused *
- ; r7 * Unused *
- ; r8 Start of kernel
- ; r9 Length of kernel
- ; r10 * Unused *
- ; r11 * Unused *
- ; r12 * Unused *
- ; r13 * Unused *
- ; r14 * Unused *
-
- pagemovecode
- pagemove1lp CMP r0,r1
- BCS endmove
- LDR r2,[r0],#4 ; Page address to copy from
- LDR r7,[r0],#4 ; Page address to copy to
- MOV r5,r3 ; Page size
- pagemove2lp SUBS r5,r5,#4
- LDRPL r6,[r2],#4 ; Get word from 'from' page
- STRPL r6,[r7],#4 ; Put word to 'to' page
- BPL pagemove2lp
- B pagemove1lp
-
- ; Routines to map pages into correct locations in memory
- ; The kernel has to copy this mapping exactly when it has booted
-
- endmove STR r8,kernel_start1
- STR r9,kernel_size1
- MOV r0,#0 ; Phew! Time to remap
- MOV r1,#SCREEN_START ; Start of screen mem
- remap1lp BL remap_page ; Remap screen memory
- ADD r0,r0,#1
- ADD r1,r1,r3
- CMP r1,#SCREEN_START+SCREEN_SIZE
- BCC remap1lp
- MOV r1,#0
- remap2lp BL remap_page ; Map in a page in addrs 0-0x8000
- ADD r0,r0,#1
- ADD r1,r1,r3
- CMP r1,#&8000 ; Top of page 0
- BCC remap2lp
- LDR r1,kernel_start1 ; Remap kernel code pages
- LDR r6,kernel_size1
- ADD r6,r1,r6 ; End of kernel code
- ADD r5,r6,r3 ; Page for parameters & stack
- remap3lp BL remap_page
- ADD r0,r0,#1
- ADD r1,r1,r3
- CMP r1,r5
- BCC remap3lp
- remap4lp MOV r1,#NULL_MAPPING ; Remap all other pages to nothing
- BL remap_pagep
- ADD r0,r0,#1
- ; ADD r1,r1,r3
- CMP r0,r4
- BCC remap4lp
- LDR r2,kernel_start1
- ORR r2,r2,#&0C000003 ; Ensure user mode & irqs disabled
- MOV sp,r6
- MOV r0,r6
- LDR r1,kernel_size1
- MOV pc,r2 ; Call kernel (And hope...)
-
- kernel_start1 DCD 0
- kernel_size1 DCD 0
-
- ; Must preserve r0,r1,r3,r4,r5,r6
- ; r0 = physical page
- ; r1 = logical page
-
- remap_page MOV r2,#0 ; Page user read/write
- B remap_pagedo
-
- remap_pagep MOV r2,#&00000300
- remap_pagedo MOV r8,#&007F0000
- ORR r8,r8,#&0000F000
- AND r8,r1,r8
- AND r9,r1,#&01800000
- ORR r8,r8,r9,LSR#(23-10)
- ORR r8,r8,r2
- TEQ r3,#16*1024
- BEQ page_16
-
- AND r9,r0,#&0F
- MOV r9,r9,LSL#3
- TST r0,#&10
- ORRNE r9,r9,#1
- TST r0,#&20
- ORRNE r9,r9,#4
- TST r0,#&40
- ORRNE r9,r9,#2
-
- page_do AND r7,r0,#&80
- ORR r9,r9,r7
- ORR r8,r8,r9
- ORR r8,r8,#&03800000
- STR r8,[r8]
- MOV pc,lr
-
- page_16 AND r9,r0,#&1F
- MOV r9,r9,LSL#2
- AND r7,r0,#&60
- ORR r9,r9,r7,LSR#5
- B page_do
-
- pageendmovecode DCD 0
- end_code DCD 0
-
- END
-
-
-