home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / armlinux / alpha / CONFIGURATION / CONFIG_ZIP / !Linux / s / !RunImage
Encoding:
Text File  |  1995-06-16  |  16.3 KB  |  848 lines

  1.         GET    Asm:h.Standard
  2.  
  3. MB        *    1024*1024
  4. KB        *    1024
  5.  
  6. ; This is the start & size of kernel in memory
  7. KERNEL_START    *    24*MB
  8. KERNEL_SIZE    *    512*KB
  9.  
  10. ; This is the address used to map unused pages to
  11. NULL_MAPPING    *    31*MB
  12.  
  13. ; This is the start & size of screen memory
  14. SCREEN_START    *    32512*KB
  15. SCREEN_SIZE    *    256*KB
  16.  
  17.         SWI    OS_GetEnv
  18.         MOV    r13,r1            ; set up stack
  19.         SUB    r1,r13,#32*1024
  20.         STR    r1,memmapinfo        ; Place to store mem map info
  21.         BL    process_options
  22.         ADRL    r0,oos
  23.         LDRB    r0,[r0,#1]
  24.         TEQ    r0,#0
  25.         BNE    skip_00
  26.         SWI    OS_WriteS
  27.         = 22,31,31,10,10,"Linux (c) Linus Torvalds, ported to the Archimedes by "
  28.         = "R.M.King (2 June 1994)",13,10,13,10,0
  29. skip_00        BL    check_memmap        ; Check the map
  30.         BL    load_kernel        ; Load kernel into memory
  31.         STMFD    sp!,{r0}
  32.         ADR    r0,shutdown
  33.         SWI    OS_CLI
  34.         ADRL    r0,oos
  35.         LDR    r0,[r0]
  36.         TST    r0,#&FF
  37.         TSTNE    r0,#&FF0000
  38.         BLEQ    continue
  39.         BL    move_code        ; Move 'move' code to page
  40. ;        BL    show_movelist        ; Show memory move list
  41.         LDMFD    sp!,{r2}
  42. ; MOV r0,r2
  43. ; BL  show_moveinfo
  44. ; SWI OS_Exit
  45.         SWI    OS_EnterOS        ; *** POINT OF NO RETURN ******
  46.         TEQP    pc,#&0C000003        ; Disable interrupts
  47.         LDR    r0,=&03200000        ; Get MEMC address
  48.         MOV    r1,#0
  49.         STRB    r1,[r0,#&18]
  50.         STRB    r1,[r0,#&28]
  51.         STRB    r1,[r0,#&38]
  52.  
  53.         LDR    r0,movelist
  54.         LDR    r1,endofmovelist
  55.         LDR    r3,pagesize
  56.         LDR    r4,numpages
  57.         LDR    r8,kernel_start
  58.         LDR    r9,kernel_size
  59.         MOV    pc,r2            ; Call move code
  60.  
  61.         SWI    OS_Exit
  62.  
  63.  
  64. continue    STMFD    sp!,{r0-r2,lr}
  65.         SWI    OS_NewLine
  66.         SWI    OS_WriteS
  67.         = "You will lose all data in RISC OS. Continue? (Y/N)",0
  68.         SWI    OS_Confirm
  69.         SWINE    OS_Exit
  70.         = "Loading... Please wait...",0
  71.         LDMFD    sp!,{r0-r2,pc}^
  72.  
  73. shutdown    = "Shutdown",0
  74.  
  75. check_memmap    STMFD    sp!,{lr}
  76.         SWI    OS_ReadMemMapInfo    ; Get page size etc & show info
  77.         STR    r0,pagesize
  78.         STR    r1,numpages
  79.         TEQ    r0,#&8000
  80.         TEQNE    r0,#&4000
  81.         BNE    badpagesize
  82.         ADRL    r4,oos
  83.         LDRB    r4,[r4,#1]
  84.         TEQ    r4,#0
  85.         MOV    r4,r1
  86.         BNE    skip_01
  87.         SUB    r1,sp,#16
  88.         MOV    r2,#14
  89.         SWI    OS_ConvertCardinal3
  90.         SWI    OS_WriteS
  91.         = 13,10,"  RAM page size is ",0
  92.         SWI    OS_Write0
  93.         SWI    OS_WriteS
  94.         = " bytes, with ",0
  95.         MOV    r0,r4
  96.         SUB    r1,sp,#16
  97.         MOV    r2,#14
  98.         SWI    OS_ConvertCardinal3
  99.         SWI    OS_Write0
  100.         SWI    OS_WriteS
  101.         = " pages.",13,10,0
  102. skip_01        LDR    r0,memmapinfo
  103.         MOV    r1,#0
  104.         MOV    r2,#0
  105. getmemlp    STR    r1,[r0,r2]
  106.         ADD    r2,r2,#3*4
  107.         ADD    r1,r1,#1
  108.         TEQ    r1,r4
  109.         BNE    getmemlp
  110.         MVN    r1,#0
  111.         STR    r1,[r0,r2]
  112.         SWI    OS_ReadMemMapEntries    ; Read current mapping
  113. ;        SWI    OS_WriteS
  114. ;        = 13,10,"  Sorting pages...",0
  115.         MOV    r2,#4
  116.         MOV    r1,#0
  117.         MOV    r5,#&10000
  118. killbadpglp    LDR    r3,[r0,r2]        ; Remove those outsize our range
  119.         CMP    r3,r5
  120.         MOVCC    r3,#0
  121.         STRCC    r3,[r0,r2]
  122.         CMP    r3,r0
  123.         MOVCS    r3,#0
  124.         STRCS    r3,[r0,r2]
  125.         ADD    r2,r2,#3*4
  126.         ADD    r1,r1,#1
  127.         TEQ    r1,r4
  128.         BNE    killbadpglp
  129. ;        SWI    OS_WriteS
  130. ;        = 13,10,"    Pages available: ",0
  131. ;        MOV    r2,#4
  132. ;        MOV    r1,#0
  133. ;listpglp    LDR    r3,[r0,r2]
  134. ;        TEQ    r3,#0
  135. ;        BLNE    page_avail
  136. ;        ADD    r2,r2,#3*4
  137. ;        ADD    r1,r1,#1
  138. ;        TEQ    r1,r4
  139. ;        BNE    listpglp
  140.         LDMFD    sp!,{pc}
  141.  
  142. endcode        DCD    end_code-endcode
  143. pagesize    DCD    0
  144. numpages    DCD    0
  145. memmapinfo    DCD    0
  146.  
  147. add_move    STMFD    sp!,{r0-r1,r4-r7,lr}
  148.         MOV    r0,r9
  149.         MUL    r0,r6,r0
  150.         ADD    r0,r0,r4
  151.         ADD    r0,r0,#&02000000
  152.         LDR    r1,endofmovelist
  153.         STR    r2,[r1],#4
  154.         STR    r0,[r1],#4
  155.         STR    r1,endofmovelist
  156.         LDMFD    sp!,{r0-r1,r4-r7,pc}^
  157.  
  158. ;show_movelist    STMFD    sp!,{lr}
  159. ;        LDR    r3,movelist
  160. ;        LDR    r4,endofmovelist
  161. ;show_movelistlp    CMP    r3,r4
  162. ;        LDMCSFD    sp!,{pc}^
  163. ;        LDR    r0,[r3],#4
  164. ;        LDR    r1,[r3],#4
  165. ;        BL    show_moveinfo
  166. ;        B    show_movelistlp
  167.  
  168. movelist    DCD    0
  169. endofmovelist    DCD    0
  170. kernel_handle    DCD    0
  171. kernel_start    DCD    KERNEL_START
  172. kernel_size    DCD    KERNEL_SIZE
  173.  
  174. kernel_fn    =    "<Linux$Dir>.Kernel",0
  175.  
  176. load_kernel    STMFD    sp!,{lr}
  177.         STMFD    sp!,{r0,r2-r5}
  178.         MOV    r0,#17
  179.         ADR    r1,kernel_fn
  180.         SWI    OS_File
  181.         STR    r2,kernel_start
  182.         ADD    r4,r4,#&800
  183.         BIC    r4,r4,#&7F00
  184.         BIC    r4,r4,#&00FF
  185.         ADD    r4,r4,#&8000
  186.         STR    r4,kernel_size
  187.  
  188.         LDMFD    sp!,{r0,r2-r5}
  189.         MOV    r0,#&4F
  190.         SWI    OS_Find
  191.         BVS    load_error
  192.         STR    r0,kernel_handle
  193.         MOV    r1,r0
  194.  
  195.         LDR    r8,memmapinfo
  196.         ADD    r8,r8,#4
  197.         MOV    r7,#0            ; Page number counter
  198.         LDR    r6,pagesize
  199.         MOV    r4,#(32+256)*1024
  200.         MOV    r9,#0
  201. pageslp        SUBS    r4,r4,r6        ; Find start of kernel
  202.         ADDPL    r9,r9,#1
  203.         BPL    pageslp
  204.         LDR    r4,kernel_size
  205.         ADD    r4,r4,r6        ; Page for parameters
  206.         MOV    r5,r9
  207. pages2lp    SUBS    r4,r4,r6        ; Find start of free ram
  208.         ADDPL    r5,r5,#1
  209.         BPL    pages2lp
  210.         MOV    r4,#0
  211.         BL    find_freepage
  212.         STR    r2,movelist
  213.         STR    r2,endofmovelist
  214.         MOV    r0,#1
  215.         STR    r0,[r8,r3,LSL#2]    ; Make page unavailable
  216.  
  217. load_kernellp    ADD    r3,r7,r9        ; Start of kernel
  218.         MOV    r11,r3
  219.         ADD    r3,r3,r3,LSL#1        ; Get offset
  220.         LDR    r2,[r8,r3,LSL#2]
  221.         CMP    r2,#2            ; If page unavailable,
  222.         BLCC    find_freepage        ; Get a free page
  223.         BLCC    add_move
  224.         MOV    r0,#1
  225.         STR    r0,[r8,r3,LSL#2]    ; Make page unavailable
  226.         MOV    r0,#4
  227.         MOV    r3,r6
  228. ;        BL    load_info
  229. ;        SWICC    &100+'r'
  230. ;        SWICS    &100+'c'
  231.         SWI    XOS_GBPB        ; Read page
  232.  
  233.         BVS    load_error
  234.         ADD    r7,r7,#1        ; Next page
  235.         TEQ    r3,#0
  236.         BEQ    load_kernellp        ; If not end, repeat
  237.  
  238.         SUB    r3,r6,#1
  239.         ADD    r4,r4,#&800
  240.         BIC    r4,r4,r3
  241.         ADD    r4,r4,r6        ; Move into next page
  242.  
  243.         SUB    r7,r5,#1        ; Page number for parameters
  244.  
  245.         MOV    r0,#0
  246.         STR    r0,kernel_handle
  247.         SWI    OS_Find            ; Close file
  248.         MOV    r3,r7
  249.         MOV    r11,r3
  250.         ADD    r3,r3,r3,LSL#1        ; Get offset
  251.         LDR    r2,[r8,r3,LSL#2]
  252.         CMP    r2,#2
  253.         BLCC    find_freepage        ; Find a free page
  254.         BLCC    add_move
  255.         MOV    r0,#1
  256.         STR    r0,[r8,r3,LSL#2]    ; Prevent this page being grabbed
  257. ;        BL    load_info
  258. ;        SWICC    &100+'R'
  259. ;        SWICS    &100+'C'
  260.  
  261.         BL    get_kernel_info
  262.         ADD    r7,r7,#1        ; Increment page counter
  263.         BL    find_freepage        ; Get a free page for move routines
  264.         MOV    r0,r11
  265.         MUL    r0,r6,r0
  266.         ADD    r0,r0,#&02000000
  267.         LDMFD    sp!,{pc}
  268.  
  269. find_freepage    STMFD    sp!,{r0-r1,r4-r7,lr}
  270. find_freelp    ADD    r3,r5,r5,LSL#1
  271.         LDR    r2,[r8,r3,LSL#2]
  272.         CMP    r2,#2
  273.         MOVCS    r11,r5
  274.         LDMCSFD    sp!,{r0-r1,r4-r7,pc}^
  275.         ADDCC    r5,r5,#1
  276.         TEQ    r5,#128
  277.         BNE    find_freelp
  278.         ADR    r0,nomemerror
  279.  
  280. load_error    MOV    r7,r0
  281.         LDR    r1,kernel_handle
  282.         TEQ    r1,#0
  283.         MOVNE    r0,#0
  284.         SWINE    OS_Find
  285.         MOV    r0,r7
  286.         SWI    OS_GenerateError
  287.  
  288. nomemerror    =    0,0,0,0,"*** Out of memory ***",0
  289.  
  290. ;load_info    STMFD    sp!,{r0-r8,lr}
  291. ;        MOV    r3,r2
  292. ;        SWI    OS_WriteS
  293. ;        =    13,10,"    Loading kernel code &",0
  294. ;        MOV    r0,r4
  295. ;        SUB    r1,sp,#16
  296. ;        MOV    r2,#14
  297. ;        SWI    OS_ConvertHex8
  298. ;        SWI    OS_Write0
  299. ;        SWI    OS_WriteS
  300. ;        =    " at &",0
  301. ;        MOV    r0,r3
  302. ;        SUB    r1,sp,#16
  303. ;        MOV    r2,#14
  304. ;        SWI    OS_ConvertHex8
  305. ;        SWI    OS_Write0
  306. ;        SWI    &100+'('
  307. ;        MOV    r0,#9
  308. ;;        MOV    r0,r11
  309. ;        MUL    r0,r6,r0
  310. ;        ADD    r0,r0,#&02000000
  311. ;        ADD    r0,r0,r4
  312. ;        SUB    r1,sp,#16
  313. ;        MOV    r2,#14
  314. ;        SWI    OS_ConvertHex8
  315. ;        SWI    OS_Write0
  316. ;        SWI    &100+')'
  317. ;        LDMFD    sp!,{r0-r8,pc}^
  318.  
  319. ;page_avail    STMFD    sp!,{r0-r2,lr}
  320. ;        MOV    r0,r1
  321. ;        SUB    r1,sp,#16
  322. ;        MOV    r2,#14
  323. ;        SWI    OS_ConvertCardinal1
  324. ;        SWI    OS_Write0
  325. ;        SWI    &100+','
  326. ;        SWI    &100+' '
  327. ;        LDMFD    sp!,{r0-r2,pc}^
  328.  
  329. printdec    STMFD    sp!,{r0-r2,lr}
  330.         SUB    r1,sp,#16
  331.         MOV    r2,#14
  332.         SWI    OS_ConvertCardinal4
  333.         SWI    OS_Write0
  334.         LDMFD    sp!,{r0-r2,pc}^
  335.  
  336. badpagesize    SWI    OS_WriteS
  337.         = 13,10,10,"*** Cannot start linux - can only handle 16KB or 32KB page sizes."
  338.         = 13,10,0
  339.         SWI     OS_Exit
  340.  
  341. ;show_moveinfo    STMFD    sp!,{r0-r4,lr}
  342. ;        MOV    r7,r1
  343. ;        SWI    OS_WriteS
  344. ;        = 13,10,"    Relocate ",0
  345. ;        SUB    r1,sp,#16
  346. ;        MOV    r2,#14
  347. ;        SWI    OS_ConvertHex8
  348. ;        SWI    OS_Write0
  349. ;        SWI    &100+'-'
  350. ;        SWI    &100+'>'
  351. ;        MOV    r0,r7
  352. ;        SUB    r1,sp,#16
  353. ;        MOV    r2,#14
  354. ;        SWI    OS_ConvertHex8
  355. ;        SWI    OS_Write0
  356. ;        LDMFD    sp!,{r0-r4,pc}^
  357.  
  358. ;showstack    STMFD    sp!,{r0-r2,lr}
  359. ;        MOV    r0,r2
  360. ;        SUB    r1,sp,#16
  361. ;        MOV    r2,#14
  362. ;        SWI    OS_ConvertHex8
  363. ;        SWI    OS_Write0
  364. ;        LDMFD    sp!,{r0-r2,pc}^
  365.  
  366. ; Set up & display current kernel information
  367.  
  368. configfile    =    "<Linux$Dir>.Config",0
  369.  
  370. set_kernel_info    STMFD    sp!,{r2,r7,lr}
  371.         MOV    r7,r2
  372.         LDR    r0,pagesize
  373.         STR    r0,[r7]        ; Page size (bytes)
  374.         LDR    r0,numpages
  375.         STR    r0,[r7,#4]    ; Number of pages
  376.         MOV    r0,#0        ; Disable Sound DMA
  377.         MOV    r1,#1<<11
  378.         SWI    XOS_UpdateMEMC
  379.         STR    r0,[r7,#9*4]
  380.         MOV    r0,#161        ; Read SoundDefault parameters
  381.         MOV    r1,#148
  382.         SWI    XOS_Byte
  383.         STRB    r2,[r7,#10*4]
  384.         MOV    r0,#161        ; Read ADFS Drives info
  385.         MOV    r1,#135
  386.         SWI    XOS_Byte
  387.         STRB    r2,[r7,#10*4+1]
  388.         MOV    r0,#165        ; Read current o/p cursor position
  389.         SWI    XOS_Byte
  390.         TEQ    r1,#0
  391.         ADDNE    r2,r2,#4
  392.         ADDEQ    r2,r2,#3
  393.         MOVNE    r1,#0
  394.         STR    r1,[r7,#7*4]
  395.         STR    r2,[r7,#8*4]
  396.         MOV    r1,#100
  397.         MOV    r2,#75
  398.         STR    r1,[r7,#5*4]
  399.         STR    r2,[r7,#6*4]
  400.         MOV    r1,#4
  401.         MOV    r2,#8
  402.         STRB    r1,[r7,#10*4+2]
  403.         STRB    r2,[r7,#10*4+3]
  404.         LDMFD    sp!,{r2,r7,pc}^
  405.  
  406. get_kernel_info    STMFD    sp!,{r0-r12,lr}
  407. ;        BL    showstack
  408.         BL    set_kernel_info
  409.         MOV    r0,#0
  410.         STR    r0,[r2,#8]    ; Ram disk size
  411.         STR    r0,[r2,#12]    ; Mount root read-only
  412.         STR    r0,[r2,#&100]    ; Command line
  413.         STR    r0,[r2,#&200]    ; Command line
  414.         STR    r0,[r2,#&300]    ; Command line
  415.         STR    r0,[r2,#&400]    ; Command line
  416.         STR    r0,[r2,#&500]    ; Command line
  417.         MOV    r0,#&200    ; Root dev
  418.         STR    r0,[r2,#16]
  419.         MOV    r7,r2
  420.         ADR    r1,configfile
  421.         MOV    r0,#&4C
  422.         SWI    XOS_Find
  423.         BVS    showkernelinfo
  424.         TEQ    r0,#0
  425.         BEQ    showkernelinfo
  426.         MOV    r1,r0
  427.         MOV    r0,#4
  428.         MOV    r2,r7
  429.         MOV    r3,#&1000
  430.         SWI    XOS_GBPB
  431.         MOV    r0,#0
  432.         SWI    XOS_Find
  433.         MOV    r2,r7
  434.                 BL    set_kernel_info
  435.         ADRL    r2,oos
  436.         LDRB    r2,[r2]
  437.         TEQ    r2,#0
  438.         LDMNEFD    sp!,{r0-r12,pc}^
  439.  
  440. showkernelinfo    ADRL    r2,oos
  441.         MOV    r1,#0
  442.         STRB    r1,[r2,#2]        ; Clear 'sure' flag
  443.         MOV    r2,r7
  444.         SWI    &100+28
  445.         SWI    &100+0
  446.         SWI    OS_WriteS
  447.         =    43,79,15,12,26
  448.         =    31,1,16,11,    "Current configuration:",10
  449.         =    10,13,           " Page size         : ",0
  450.         LDR    r0,[r2]
  451.         BL    printdec
  452.         SWI    OS_WriteS
  453.         =    " bytes",31,40,17," Num pages         : ",0
  454.         LDR    r0,[r2,#4]
  455.         BL    printdec
  456.         SWI    OS_WriteS
  457.         =    10,10,13,        "<R>am Disc Size    : ",0
  458.         LDR    r0,[r2,#8]
  459.         BL    printdec
  460.         SWI    OS_WriteS
  461.         =    "K",31,40,19,    "<M>ount root rdonly: ",0
  462.         LDR    r0,[r2,#12]
  463.         TEQ    r0,#0
  464.         SWIEQ    &100+'N'
  465.         SWINE    &100+'Y'
  466.         SWI    OS_WriteS
  467.         =    13,10,10,        "<C>ommand line     : ",0
  468.         ADD    r0,r2,#&500
  469.         SWI    OS_Write0
  470.         MOV    r3,#1
  471.         MOV    r4,#1
  472.         MOV    r5,#4
  473.         ADD    r6,r2,#&100
  474.         BL    show_hdfile
  475.         ADD    r6,r6,#&80
  476.         BL    show_hdfile
  477.         ADD    r6,r6,#&80
  478.         BL    show_hdfile
  479.         ADD    r6,r6,#&80
  480.         BL    show_hdfile
  481.         MOV    r4,#1
  482.         MOV    r5,#5
  483.         ADD    r6,r6,#&80
  484.         BL    show_hdfile
  485.         ADD    r6,r6,#&80
  486.         BL    show_hdfile
  487.         ADD    r6,r6,#&80
  488.         BL    show_hdfile
  489.         ADD    r6,r6,#&80
  490.         BL    show_hdfile
  491.  
  492.         SWI    OS_WriteS
  493.         =    13,10,10,"<S>ave & Run",31,40,39,"<Q>uit"
  494.         =    13,10,10,"Select first letter to change (RMCS):",0
  495.         MOV    r0,#126
  496.         SWI    OS_Byte
  497.         SWI    OS_ReadC
  498.         MOV    r2,r7
  499.         TEQ    r0,#'M'
  500.         TEQNE    r0,#'m'
  501.         BEQ    change_rootrdonly
  502.         TEQ    r0,#'R'
  503.         TEQNE    r0,#'r'
  504.         BEQ    change_ramdiscsize
  505.         TEQ    r0,#'C'
  506.         TEQNE    r0,#'c'
  507.         BEQ    change_comdline
  508.         TEQ    r0,#'Q'
  509.         TEQNE    r0,#'q'
  510.         SWIEQ    OS_Exit
  511.         SUB    r1,r0,#1
  512.         AND    r4,r1,#3
  513.         ADD    r4,r4,#1
  514.         MOV    r5,r1,LSR#2
  515.         BIC    r5,r5,#&FC
  516.         ORR    r5,r5,#4
  517.         ADD    r6,r7,#&80
  518.         AND    r1,r0,#15
  519.         ADD    r6,r6,r1,LSL#7
  520.         TEQ    r0,#'1'
  521.         TEQNE    r0,#'2'
  522.         TEQNE    r0,#'3'
  523.         TEQNE    r0,#'4'
  524.         TEQNE    r0,#'5'
  525.         TEQNE    r0,#'6'
  526.         TEQNE    r0,#'7'
  527.         TEQNE    r0,#'8'
  528.         BEQ    newfile
  529.         TEQ    r0,#'S'
  530.         TEQNE    r0,#'s'
  531.         BNE    showkernelinfo
  532.         SWI    OS_NewLine
  533.         MOV    r0,#&8C
  534.         ADR    r1,configfile
  535.         SWI    XOS_Find
  536.         BVS    err
  537.         TEQ    r0,#0
  538.         BEQ    err
  539.         MOV    r1,r0
  540.         MOV    r0,#2
  541.         MOV    r2,r7
  542.         MOV    r3,#&1000
  543.         SWI    XOS_GBPB
  544.         MOV    r0,#0
  545.         SWI    XOS_Find
  546. err        MOV    r2,r7
  547.         BL    set_kernel_info
  548.         LDMFD    sp!,{r0-r12,pc}
  549.  
  550. show_hdfile    STMFD    sp!,{lr}
  551.         SWI    &100+13
  552.         SWI    &100+10
  553.         SWI    &100+10
  554.         SWI    &100+'<'
  555.         ADD    r0,r3,#&30
  556.         SWI    XOS_WriteC
  557.         SWI    XOS_WriteS
  558.         =    "> Partition ",0
  559.         ALIGN
  560.         ADD    r0,r4,#&30
  561.         SWI    XOS_WriteC
  562.         SWI    XOS_WriteS
  563.         =    " : ADFS::",0
  564.         ALIGN
  565.         ADD    r0,r5,#&30
  566.         SWI    XOS_WriteC
  567.         SWI    XOS_WriteS
  568.         =    ".$.",0
  569.         ALIGN
  570.         MOV    r0,r6
  571.         SWI    XOS_Write0
  572.         ADD    r3,r3,#1
  573.         ADD    r4,r4,#1
  574.         LDMFD    sp!,{pc}^
  575.  
  576. change_rootrdonly
  577.         LDR    r0,[r2,#12]
  578.         EOR    r0,r0,#1
  579.         STR    r0,[r2,#12]
  580.         B    showkernelinfo
  581.  
  582. change_ramdiscsize
  583.         SWI    OS_WriteS
  584.         =    "R",10,10,13,"New ram disc size (0 = none) : ",0
  585.         ADD    r0,r2,#&200
  586.         MOV    r1,#&100
  587.         MOV    r2,#32
  588.         MOV    r3,#&7E
  589.         SWI    OS_ReadLine
  590.         BCS    showkernelinfo
  591.         MOV    r0,#10
  592.         ADD    r1,r7,#&200
  593.         SWI    XOS_ReadUnsigned
  594.         BVS    showkernelinfo
  595.         LDR    r1,[r7]
  596.         SUB    r1,r1,#1
  597.         ADD    r2,r2,r1,LSR#10
  598.         BIC    r2,r2,r1,LSR#10
  599.         STR    r2,[r7,#8]
  600.         B    showkernelinfo
  601.  
  602. change_comdline    SWI    OS_WriteS
  603.         =    "C",10,10,13,"New command line (ret:none/esc:cancel): ",0
  604.         ADD    r0,r7,#&500
  605.  
  606. comdin        STMFD    sp!,{r0}
  607.         ADD    r0,r2,#&1000
  608.         MOV    r1,#&100
  609.         MOV    r2,#32
  610.         MOV    r3,#&7E
  611.         SWI    OS_ReadLine
  612.         LDMFD    sp!,{r0}
  613.         BCS    showkernelinfo
  614.         ADD    r2,r7,#&1000
  615.         MOV    r3,#0
  616. cpycmdlinelp    STRB    r3,[r0,r1]
  617.         SUBS    r1,r1,#1
  618.         LDRPLB    r3,[r2,r1]
  619.         BPL    cpycmdlinelp
  620.         B    showkernelinfo
  621.  
  622. getfile1    SWI    OS_WriteS
  623.         =    "1",10,10,13,"New partition file 1 (ret:none/esc:cancel): ",0
  624.         ADD    r0,r7,#&100
  625.         B    comdin
  626.  
  627. getfile2    SWI    OS_WriteS
  628.         =    "2",10,10,13,"New partition file 2 (ret:none/esc:cancel): ",0
  629.         ADD    r0,r7,#&200
  630.         B    comdin
  631.  
  632. getfile3    SWI    OS_WriteS
  633.         =    "3",10,10,13,"New partition file 3 (ret:none/esc:cancel): ",0
  634.         ADD    r0,r7,#&300
  635.         B    comdin
  636.  
  637. getfile4    SWI    OS_WriteS
  638.         =    "4",10,10,13,"New partition file 4 (ret:none/esc:cancel): ",0
  639.         ADD    r0,r7,#&400
  640.         B    comdin
  641.  
  642. newfile        SWI    XOS_WriteC
  643.         SWI    XOS_WriteS
  644.         =    10,10,13,"New partition file ",0
  645.         ALIGN
  646.         ADD    r0,r4,#&30
  647.         SWI    XOS_WriteC
  648.         SWI    XOS_WriteS
  649.         =    " (ret:none/esc:cancel): ADFS::",0
  650.         ALIGN
  651.         ADD    r0,r5,#&30
  652.         SWI    XOS_WriteC
  653.         SWI    XOS_WriteS
  654.         =    ".$.",0
  655.         ALIGN
  656.         MOV    r0,r6
  657.         B    comdin
  658.  
  659. process_options    STMFD    sp!,{lr}
  660. 00        LDRB    r2,[r0],#1
  661.         TEQ    r2,#0
  662.         LDMEQFD    sp!,{pc}^
  663.         TEQ    r2,#' '
  664.         TEQNE    r2,#9
  665.         BNE    %b00        ; Search for space char
  666. 01        LDRB    r2,[r0],#1
  667.         TEQ    r2,#' '
  668.         TEQNE    r2,#9
  669.         BEQ    %b01        ; Search for non-space char
  670.         TEQ    r2,#0
  671.         LDMEQFD    sp!,{pc}^
  672.         TEQ    r2,#'-'
  673.         BNE    %b00        ; Check for '-'
  674.         ADR    r3,opts
  675.         MOV    r5,#0
  676.         MOV    r1,r0        ; Save current pointer
  677. 02        LDRB    r4,[r3],#1
  678.         TEQ    r4,#0
  679.         BEQ    %f04
  680.         LDRB    r2,[r0],#1
  681.         EOR    r2,r4,r2
  682.         BICS    r2,r2,#&20
  683.         BEQ    %b02
  684.         MOV    r0,r1
  685. 03        LDRB    r4,[r3],#1
  686.         TEQ    r4,#0
  687.         BNE    %b03
  688.         ADD    r5,r5,#1
  689.         LDRB    r4,[r3]
  690.         TEQ    r4,#0
  691.         BNE    %b02
  692.         B    %b00
  693. 04        LDRB    r2,[r0],#1
  694.         TEQ    r2,#' '
  695.         TEQNE    r2,#9
  696.         TEQNE    r2,#0
  697.         BNE    %b00
  698.         ADR    r2,oos
  699.         MOV    r3,#1
  700.         STRB    r3,[r2,r5]
  701.         SUB    r0,r0,#1
  702.         B    %b00
  703.         LDMFD    sp!,{pc}^
  704.  
  705. oos        =    0,0,0,0
  706.         DCD    0
  707.  
  708. opts        =    "run",0,"quiet",0,"sure",0,0
  709.  
  710. ; Code to move the area from pagemovecode to pageendmovecode to correct pages in physical
  711. ; memory.
  712.  
  713. move_code    ADR    r3,pagemovecode
  714.         ADR    r4,pageendmovecode
  715.         MOV    r1,r2
  716. move_codelp    LDR    r0,[r3],#4
  717.         STR    r0,[r1],#4
  718.         CMP    r3,r4
  719.         BCC    move_codelp
  720.         MOV    pc,lr
  721.  
  722. ; NO EXTRA FUNCTIONS AFTER HERE! This section gets copied to a free page so that we
  723. ; can shift the kernel to the correct location with no fear of overwriting the copying
  724. ; routines.
  725.  
  726. ; Routines to copy pages to correct locations
  727. ; This better be correct!
  728. ; This code is run at a place where it is not going to be overwritten
  729. ; and so has to be *fully* relocateable
  730.  
  731. ; Entry conditions:
  732. ; r0    Start of page move list
  733. ; r1    End of page move list
  734. ; r2    * Unused *
  735. ; r3    Page size
  736. ; r4    Number of pages
  737. ; r5    * Unused *
  738. ; r6    * Unused *
  739. ; r7    * Unused *
  740. ; r8    Start of kernel
  741. ; r9    Length of kernel
  742. ; r10    * Unused *
  743. ; r11    * Unused *
  744. ; r12    * Unused *
  745. ; r13    * Unused *
  746. ; r14    * Unused *
  747.  
  748. pagemovecode
  749. pagemove1lp    CMP    r0,r1
  750.         BCS    endmove
  751.         LDR    r2,[r0],#4        ; Page address to copy from
  752.         LDR    r7,[r0],#4        ; Page address to copy to
  753.         MOV    r5,r3            ; Page size
  754. pagemove2lp    SUBS    r5,r5,#4
  755.         LDRPL    r6,[r2],#4        ; Get word from 'from' page
  756.         STRPL    r6,[r7],#4        ; Put word to 'to' page
  757.         BPL    pagemove2lp
  758.         B    pagemove1lp
  759.  
  760. ; Routines to map pages into correct locations in memory
  761. ; The kernel has to copy this mapping exactly when it has booted
  762.  
  763. endmove        STR    r8,kernel_start1
  764.         STR    r9,kernel_size1
  765.         MOV    r0,#0            ; Phew! Time to remap
  766.         MOV    r1,#SCREEN_START    ; Start of screen mem
  767. remap1lp    BL    remap_page        ; Remap screen memory
  768.         ADD    r0,r0,#1
  769.         ADD    r1,r1,r3
  770.         CMP    r1,#SCREEN_START+SCREEN_SIZE
  771.         BCC    remap1lp
  772.         MOV    r1,#0
  773. remap2lp    BL    remap_page        ; Map in a page in addrs 0-0x8000
  774.         ADD    r0,r0,#1
  775.         ADD    r1,r1,r3
  776.         CMP    r1,#&8000        ; Top of page 0
  777.         BCC    remap2lp
  778.         LDR    r1,kernel_start1    ; Remap kernel code pages
  779.         LDR    r6,kernel_size1
  780.         ADD    r6,r1,r6        ; End of kernel code
  781.         ADD    r5,r6,r3        ; Page for parameters & stack
  782. remap3lp    BL    remap_page
  783.         ADD    r0,r0,#1
  784.         ADD    r1,r1,r3
  785.         CMP    r1,r5
  786.         BCC    remap3lp
  787. remap4lp    MOV    r1,#NULL_MAPPING    ; Remap all other pages to nothing
  788.         BL    remap_pagep
  789.         ADD    r0,r0,#1
  790. ;        ADD    r1,r1,r3
  791.         CMP    r0,r4
  792.         BCC    remap4lp
  793.         LDR    r2,kernel_start1
  794.         ORR    r2,r2,#&0C000003    ; Ensure user mode & irqs disabled
  795.         MOV    sp,r6
  796.         MOV    r0,r6
  797.         LDR    r1,kernel_size1
  798.         MOV    pc,r2            ; Call kernel (And hope...)
  799.  
  800. kernel_start1    DCD    0
  801. kernel_size1    DCD    0
  802.  
  803. ; Must preserve r0,r1,r3,r4,r5,r6
  804. ; r0 = physical page
  805. ; r1 = logical page
  806.  
  807. remap_page    MOV    r2,#0            ; Page user read/write
  808.         B    remap_pagedo
  809.  
  810. remap_pagep    MOV    r2,#&00000300
  811. remap_pagedo    MOV    r8,#&007F0000
  812.         ORR    r8,r8,#&0000F000
  813.         AND    r8,r1,r8
  814.         AND    r9,r1,#&01800000
  815.         ORR    r8,r8,r9,LSR#(23-10)
  816.         ORR    r8,r8,r2
  817.         TEQ    r3,#16*1024
  818.         BEQ    page_16
  819.  
  820.         AND    r9,r0,#&0F
  821.         MOV    r9,r9,LSL#3
  822.         TST    r0,#&10
  823.         ORRNE    r9,r9,#1
  824.         TST    r0,#&20
  825.         ORRNE    r9,r9,#4
  826.         TST    r0,#&40
  827.         ORRNE    r9,r9,#2
  828.  
  829. page_do        AND    r7,r0,#&80
  830.         ORR    r9,r9,r7
  831.         ORR    r8,r8,r9
  832.         ORR    r8,r8,#&03800000
  833.         STR    r8,[r8]
  834.         MOV    pc,lr
  835.  
  836. page_16        AND    r9,r0,#&1F
  837.         MOV    r9,r9,LSL#2
  838.         AND    r7,r0,#&60
  839.         ORR    r9,r9,r7,LSR#5
  840.         B    page_do
  841.  
  842. pageendmovecode DCD    0
  843. end_code    DCD    0
  844.  
  845.         END
  846.  
  847.  
  848.