|
|
1.1 ! root 1: / Startup.s -- initilization code for any tertiary boot program. ! 2: / ! 3: / La Monte H. Yarroll <[email protected]>, September 1991 ! 4: / ! 5: ! 6: / RBOOTS is set exactly 128K below the top of 640K. ! 7: / One day, RBOOTS should be dynamicly determined based on the size of ! 8: / available memory. If you modify RBOOTS, be sure to update it in tboot.h ! 9: / as well. ! 10: RBOOTS = 0x8000 / New segement for boot program. ! 11: JMPF = 0xEA / jump far, direct ! 12: SEGSIZ = 0xffff / Size of a whole segment. ! 13: NSTK = 0x2000 / # of bytes of stack. ! 14: BLOCK = 0x200 / # of bytes in a disk block ! 15: DIRSIZE = 14 / Size of a file name. ! 16: SIZEOFSDAT = 23 / sizeof(seconddat) ! 17: SECONDDAT = 0x01E7 / Offset of useful data in secondary boot. ! 18: CR = 0x0d / Carriage return ! 19: LF = 0x0a / Line Feed ! 20: NUL = 0x00 / NUL (for terminating strings) ! 21: ! 22: / Interrupts. ! 23: MON = 0x00 / Invoke BIOS monitor. ! 24: KEYBD = 0x16 / Keyboard software interrupt. ! 25: REBOOT = 0x19 / Reboot through BIOS. ! 26: ! 27: ! 28: NTRK = 40 / Number of tracks on a floppy. ! 29: NSPT = 9 / Number of sectors per track on a floppy. ! 30: NHD = 1 / Number of heads per drive on a floppy. ! 31: ! 32: .bssd ! 33: stack: .blkb NSTK / Local Stack ! 34: ! 35: .shri ! 36: .blkb 0x100 / Symbol "begin" must be at offset 0x100 from ! 37: begin: / the beginning of the code segment--secondary ! 38: / boot jumps here. ! 39: / Upon entry ds points at the secondary boot data segment, ! 40: / si points at the data we want, ! 41: / and es points at our data segment. ! 42: ! 43: mov di, $seconddat ! 44: mov cx, $SIZEOFSDAT ! 45: cld ! 46: rep ! 47: movsb / Copy disk configuration information to our own segment. ! 48: ! 49: / Create a nice, safe stack. ! 50: mov bp, $stack+NSTK ! 51: mov ax, es ! 52: mov ss, ax ! 53: mov sp, bp ! 54: ! 55: push es / Save location of data segment from secondary boot. ! 56: ! 57: / Move the tertiary boot to high memory. ! 58: call moveme ! 59: ! 60: add sp, $2 / Throw away old data segment. ! 61: ! 62: / Set up the new stack. ! 63: ! 64: mov bp, $stack+NSTK ! 65: mov ax, es ! 66: mov ss, ax ! 67: mov sp, bp ! 68: ! 69: ! 70: .byte JMPF / Jump to the relocated code. ! 71: .word entry ! 72: .word RBOOTS ! 73: ! 74: entry: call main_ ! 75: ! 76: / Aargh! main() returned! Wait for a keystroke and then reboot. ! 77: ! 78: push $keymsg ! 79: call puts_ ! 80: 0: movb ah, $1 / while (!iskey()) { ! 81: int KEYBD / /* Scan the keyboard. */ ! 82: je 0b / } ! 83: ! 84: / do { ! 85: 1: movb ah, $0 / getch(); ! 86: int KEYBD / /* Read the key. */ ! 87: movb ah, $1 / } while (iskey()) ! 88: int KEYBD / /* Scan the keyboard for another key. */ ! 89: jne 1b / ! 90: ! 91: int REBOOT / Reboot through the BIOS. ! 92: ! 93: .shrd ! 94: keymsg: ! 95: .byte CR ! 96: .byte LF ! 97: .ascii "Press any key to reboot." ! 98: .byte CR ! 99: .byte LF ! 100: .byte NUL ! 101: ! 102: //////// ! 103: / ! 104: / Move tertiary boot to high memory. ! 105: / Take one parameter--a word on the stack pointing to the current ! 106: / data segment. ! 107: / ! 108: / As a side effect, this sets ds to the new data segment in high memory. ! 109: / ! 110: //////// ! 111: .shri ! 112: moveme: ! 113: mov bp, sp / For parameter lookups. ! 114: ! 115: / Move the code segment. ! 116: push cs ! 117: pop ds ! 118: xor si, si / Point ds:si at loaded code segment. ! 119: mov ax, $RBOOTS ! 120: mov es, ax ! 121: xor di, di / Point es:di at where we want to be. ! 122: mov cx, $SEGSIZ / Move a maximal segment. ! 123: cld ! 124: rep ! 125: movsb ! 126: ! 127: / Calculate location of new data segment. ! 128: mov ax, 2(bp) ! 129: push cs / Fetch the code segment. ! 130: pop bx ! 131: sub ax, bx / Calculate offset to data segment. ! 132: add ax, $RBOOTS / Calculate the new data segment. ! 133: ! 134: / Move the data segment. ! 135: mov ds, 2(bp) ! 136: xor si, si / Point ds:si at loaded data segment ! 137: mov es, ax ! 138: xor di, di / Point es:di at where we want to be. ! 139: mov cx, $SEGSIZ / Move a maximal segment. ! 140: cld ! 141: rep ! 142: movsb ! 143: ! 144: / Set the new data segment appropriately. ! 145: push es ! 146: pop ds ! 147: mov myds_, ds ! 148: ret / routine moveme ! 149: ! 150: / Shared data segment (initialized) ! 151: .shrd ! 152: ! 153: .globl myds_ ! 154: myds_: .word 0 / Place to communicate ds to C programs. ! 155: ! 156: / Variables nbuf, traks, sects, and heads MUST appear in this order. ! 157: .globl seconddat ! 158: seconddat: / Data extracted from secondary boot data segment. ! 159: .globl nbuf_ ! 160: nbuf_: ! 161: nbuf: .blkb DIRSIZE ! 162: ! 163: / Defaults for all the following parameters match a floppy disk. ! 164: .globl traks ! 165: .globl traks_ ! 166: traks_: ! 167: traks: .word NTRK / Number of cylinders on drive we're booting off of. ! 168: .globl sects ! 169: .globl sects_ ! 170: sects_: ! 171: sects: .byte NSPT / Number of sectors per track for our drive. ! 172: .globl heads ! 173: .globl heads_ ! 174: heads_: ! 175: heads: .byte NHD / Number of heads on drive we're booting off of. ! 176: ! 177: .globl drive ! 178: .globl drive_ ! 179: drive_: ! 180: drive: .byte 0 / Drive our partition resides upon. ! 181: .globl first ! 182: .globl first_ ! 183: first_: ! 184: first: .word 0 / First block of our partition (?) ! 185: .word 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.