// A L T O E X E C U T I V E // Internal Exec Commands - Partition.bcpl // Copyright Xerox Corporation 1979 // last edited by R. Johnsson, May 11, 1980 1:42 PM get "AltoDefs.d" get "AltoFileSys.d" get "ComStruct.bcpl" external [ Partition ] let Partition(ISTREAM, DSTREAM) be [ let PN = vec 100 let SWVEC = vec 20 let AltoVersion = (table [ 61014b; 1401b ])() if AltoVersion rshift 12 ls 4 then [ Wss(DSTREAM, "No partitions on this machine.*n") return ] SetupReadParam(PN, SWVEC, ISTREAM, SWVEC) let partition = ReadParam($D, -1) let ChangePartition = table [ 61037b; 1401b ] let oldPartition = ChangePartition(0) if partition eq -1 % Partition eq 0 then [ Wss(DSTREAM, FORMATN("Current Partition is .*n", oldPartition)) return ] let result = ChangePartition(partition) if result eq 0 then [ Wss(DSTREAM, FORMATN("Could not set Partition to .*n", partition)) return ] BootDP0() ChangePartition(oldPartition) Wss(DSTREAM, FORMATN("Could not boot Partition .*n", partition)) ] and BootDP0() be [ // returns only if the boot fails structure KCB: [ link word status word command word headerAddress word labelAddress word dataAddress word normalWakeups word errorWakeups word header word diskAddress word ] manifest lenKCB = size KCB/16 let saveDisplay = @displayListHead @displayListHead = 0 //turn off display (table [ 61000b; 1401b ])() //disable interrupts let kcb, data, label = vec lenKCB, vec 256, vec 8 for tries = 1 to 10 do [ Zero(kcb, lenKCB) kcb>>KCB.command = 44100b //check header, read label, read data kcb>>KCB.headerAddress = lv kcb>>KCB.header kcb>>KCB.labelAddress = label kcb>>KCB.dataAddress = data kcb>>KCB.diskAddress = kbdAd!0 xor -1 @diskCommand = kcb //spin the disk while (kcb>>KCB.status & 7400b) eq 0 loop //wait for it to stop if (kcb>>KCB.status & 7667b) eq 7400b break //good status if tries eq 10 then [ (table [ 61001b; 1401b ])(); @displayListHead = saveDisplay; return ] ] MoveBlock(402b, label, 8) //402-411 _ label MoveBlock(1, data, 256) // 1-400 _ data @2 = kcb>>KCB.status //2 _ status goto 1 //jump to bootloader start address ]