// Page 1 reserved locations - from Alto hardware manual, Appendix B // and passim manifest [ // display DBchainHead = #420 // pointer to DB verticalFieldInterrupt = #421 // 60 times a second // cursor cursorX = #426 cursorY = #427 cursorBitMap = #431 // up to #450 // mouse mouseX = #424 // hardware increments or mouseY = #425 // decrements these words // disk nextDiskCommand = #521 // pointer to DCB diskStatus = #522 // @DS lastDiskAddress = #523 // @DA sectorInterrupts = #524 // interrupts wakeupsWaiting = #452 // bit 1 goes to // interruptvector!1 activeInterrupts = #453 interruptedPC = #500 interruptVector = #500 // #501 to #517 // interval timer timerInterruptTime = #525 // interrupt occurs when AC1 // after RCLK equals this word // in the 10 msb timerInterrupts = #423 timerData = #422 // miscellaneous realTimeClock = #430 // units are 1024/30*875 // seconds or about 38 ms trapPC = #527 trapVec = #530 // up to #567 convertMaskTable = #460 // up to #477; the convert ins- // truction requires that // convertMaskTable!n= // (2**(n+1))-1 ] // Table 4.1: Page 1 reserved locations {next page} // minimal structure for a stream structure ST[ blank word open word close word gets word puts word reset word putback word error word endof word stateof word blank word blank word blank word type word ] manifest lST=size ST/16 // Table 4.2 Basic stream structures; see section 4.1 {next page} // disk address structure DA[ sector bit 4 track bit 9 head bit 1 disk bit 1 restore bit 1 ] // disk header structure DH[ packId word diskAddress @DA ] // serial number structure SN[ [ directory bit 1 random bit 1 part1 bit 14 ] = word1 word part2 word ] // disk label structure DL[ next word // disk address of next file // page, or 0 previous word // disk address of previous // file page, or 0 fileId word 3 = [ serialNumber @SN version word ] page word // leader is page 0, first data // page is page 1 numberOfCharacters word // between 0 and 512 inclusive. // ne 512 only on last page blank word ] manifest lDL=size DL/16 // Table 4.3: Disk format; see section 4.2 {next page} // disk status word. See hardware manual for detailed definitions structure DS[ sector bit 4 done bit 4 seekFailed bit seekInProgress bit notReady bit dataLate bit noTransfer bit checksumError bit finalStatus bit 2 ] // disk command structure DC[ seal bit 8 // must be #110 headerAction bit 2 labelAction bit 2 dataAction bit 2 seekOnly bit 1 exchangeDisks bit 1 // disk controller inverts // DCB.diskAddress if this bit // is set ] // possible disk actions in command word manifest [ diskRead = 0; diskCheck = 1; diskWrite = 2] // disk command block structure DCB[ nextCommand word status @DS // set when command is completed command @DC headerAddress word // these are memory addresses labelAddress word dataAddress word noErrorInterrupts word errorInterrupts word header @DH = [ blank word diskAddress @DA ] ] manifest lDCB=size DCB/16 // Table 4.4: Disk commands; see section 4.3 {next page} // Bcpl string structure STRING[ length byte body ↑ 0,255 byte ] // file identifier structure FID[ serialNumber @SN version word fileNumber word diskAddress @DA // virtual disk address name @STRING ] // Table 4.5: File identifier; see section 4.4 // directory entry structure DE[ type bit 6 nwords bit 10 // number of words in the entry fid @FID ] // directory entry types manifest [ DEfree = 0; DEfile = 1; DElink = 2 ] // Table 4.6: Directory format; see section 4.4 {next page} // display band control block structure DB[ next word resolution bit 1 // 0=high background bit 1 // 0=white indentation bit 6 // in units of 16 dots width bit 8 // likewise; must be even bitMapAddress word // must be even height word // in double scan lines ] manifest lDB=size DB/16 // Table 4.7: Display control; see section 4.5 // font character descriptor. If p points to a FCD, then // p!(-p>>FCD.height) contains the first scan line of the character // stored in the font, p!(-1) the last structure FCD[ [ blank bit 11; width bit 4 ] = [ blank bit 7; extension bit 8 ] noExtension bit 1 // previous field is width if // this is 1; otherwise it is // extension and the width is 16 displacement bit 8 // character is pushed down this // far height bit 8 // number of scan lines (words) // of bit map stored for this // character ] // font structure FONT[ height word // height of tallest character, // in scan lines, including min- // imum inter-line space. Must // be even variableWidth bit 1 blank bit 7 width bit 8 // includes inter-character // spacing; maximum width if // font is variable-width // The font pointer given to CREATES must point to the next word characterFCDpointers ↑ 0,255 word // self-relative pointers to // FCDs for 256 characters extensionFCDpointers word // likewise for extensions; as // many words as needed. // the FCDs follow immediately ] // Table 4.8: Standard Alto fonts; see section 4.5 {next page} // Bcpl frame structure F[ callersFrame word savedPC word // this frame's PC is stored // here during a call temp word // temporary storage; free // during calls extraArguments word // see manual for details formals word // the formal parameters are // stored in successive words // starting here. ] // Table 4.9: Bcpl frame structure; see section 4.6 {next page} // layout vector passed to the program on startup structure BLV[ overlayAddress ↑ 0, 25 word startOfStatics word // address of first static endOfStatics word // address of last static startOfCode word // address of first word of code afterLastCodeWord word // 1 + largest address at which // code is loaded (normally // endCode is the same, and the // system treats that value // as the end of the program) endCode word // first location which may be // used for data; used by the // system to set EndCode blank word ] // Table 4.10: Bcpl layout vector // format of an Alto save file structure SV[ H [ // header startingAddress word // initial value for PC. // Loader sets this to // SV.BLV.startOfCode length word // unused type word // should be 0 for an ordinary // save file blank ↑ 1, 11 word ] BLV @BLV // Bcpl layout vector page0 ↑ 0, #277 word // The first #16 words are // ignored; the rest are used to // set words #16 to #277 of // memory statics ↑ 0, 0 word // actually there are // (BLV.endOfStatics - // BLV.startOfStatics + 1) // words here code ↑ 0, 0 word // actually there are // (BLV.endCode-BLV.startOfCode) // words here end word ] // Table 4.11: Alto save file {next page}