|
|
1.1 ! root 1: org $fa1000 ! 2: ! 3: GEMDOS_OPCODE equ 8 ; Free op-code! ! 4: RUNOLDGEMDOS_OPCODE equ 9 ; Free op-code! ! 5: VDI_OPCODE equ 12 ; Free op-code! ! 6: ! 7: harddrive_boot dc.l hdv_boot ! 8: old_gemdos ds.l 1 ! 9: vdi_opcode dc.w VDI_OPCODE ;Address to call after Trap #2(VDI), causes illegal instruction ! 10: ! 11: ;New GemDOS vector (0x84) ! 12: new_gemdos ! 13: dc.w GEMDOS_OPCODE ; Returns NEG as run old vector, ZERO to return or OVERFLOW to run pexec ! 14: bvs pexec ! 15: bne go_oldgemdos ! 16: rte ! 17: ! 18: ;Branch to old GemDOS ! 19: go_oldgemdos ! 20: dc.w RUNOLDGEMDOS_OPCODE ;Set PC to 'old_gemdos' and continue execution, WITHOUT corrupting register ! 21: ! 22: ;Progam Execute ! 23: pexec ! 24: lea 8(sp),a0 ! 25: btst #5,(sp) ! 26: bne.s s_ok ! 27: move.l usp,a0 ! 28: addq #2,a0 ! 29: s_ok: ! 30: tst (a0) ! 31: bne.s no_0 ! 32: move.l a6,-(sp) ! 33: move.l a0,a6 ! 34: move.l a6,-(sp) ;new ! 35: bsr find_prog ! 36: move.l (sp)+,a6 ;new ! 37: bsr pexec5 ! 38: bsr reloc ! 39: clr.l 2(a6) ! 40: clr.l 10(a6) ! 41: move.l d0,6(a6) ! 42: move #4,(a6) ;6 for TOS 1.02 on ! 43: move.l (sp)+,a6 ! 44: bra go_oldgemdos ! 45: no_0: ! 46: cmp #3,(a0) ! 47: bne.s go_oldgemdos ! 48: move.l a6,-(sp) ! 49: move.l a0,a6 ! 50: bsr find_prog ! 51: bsr pexec5 ! 52: bsr reloc ! 53: gohome: ! 54: move.l (sp)+,a6 ! 55: rte ! 56: find_prog: ! 57: move #$2f,-(sp) ! 58: trap #1 ! 59: addq #2,sp ! 60: move.l d0,a0 ! 61: move.l (a0)+,-(sp) ! 62: move.l (a0)+,-(sp) ! 63: move.l (a0)+,-(sp) ! 64: move.l (a0)+,-(sp) ! 65: move.l (a0)+,-(sp) ! 66: move.l (a0)+,-(sp) ! 67: move.l (a0)+,-(sp) ! 68: move.l (a0)+,-(sp) ! 69: move.l (a0)+,-(sp) ! 70: move.l (a0)+,-(sp) ! 71: move.l (a0)+,-(sp) ! 72: move.l a0,-(sp) ! 73: move #$17,-(sp) ! 74: move.l 2(a6),-(sp) ! 75: move #$4e,-(sp) ! 76: trap #1 ! 77: addq #8,sp ! 78: move.l (sp)+,a0 ! 79: move.l (sp)+,-(a0) ! 80: move.l (sp)+,-(a0) ! 81: move.l (sp)+,-(a0) ! 82: move.l (sp)+,-(a0) ! 83: move.l (sp)+,-(a0) ! 84: move.l (sp)+,-(a0) ! 85: move.l (sp)+,-(a0) ! 86: move.l (sp)+,-(a0) ! 87: move.l (sp)+,-(a0) ! 88: move.l (sp)+,-(a0) ! 89: move.l (sp)+,-(a0) ! 90: tst.l d0 ! 91: beq.s findprog_ok ! 92: addq #4,sp ! 93: bra.s gohome ! 94: findprog_ok: ! 95: rts ! 96: pexec5: ! 97: move.l 10(a6),-(sp) ! 98: move.l 6(a6),-(sp) ! 99: clr.l -(sp) ! 100: move #5,-(sp) ! 101: move #$4b,-(sp) ! 102: trap #1 ! 103: lea 16(sp),sp ! 104: tst.l d0 ! 105: bmi.s pexecerr ! 106: rts ! 107: pexecerr: ! 108: addq #4,sp ! 109: bra.s gohome ! 110: reloc: ! 111: movem.l a3-a5/d6-d7,-(sp) ! 112: move.l d0,a5 ! 113: clr -(sp) ! 114: move.l 2(a6),-(sp) ! 115: move #$3d,-(sp) ! 116: trap #1 ! 117: addq #8,sp ! 118: move.l d0,d6 ! 119: move.l a5,-(sp) ! 120: add.l #228,(sp) ! 121: pea $1c.w ! 122: move d6,-(sp) ! 123: move #$3f,-(sp) ! 124: trap #1 ! 125: lea 12(sp),sp ! 126: ; check size!! ! 127: move.l a5,-(sp) ! 128: add.l #256,(sp) ! 129: pea $7fffffff ! 130: move d6,-(sp) ! 131: move #$3f,-(sp) ! 132: trap #1 ! 133: lea 12(sp),sp ! 134: move d6,-(sp) ! 135: move #$3e,-(sp) ! 136: trap #1 ! 137: addq #4,sp ! 138: lea 8(a5),a4 ! 139: move.l a5,d0 ! 140: add.l #$100,d0 ! 141: move.l d0,(a4)+ ; text start ! 142: move.l 230(a5),d0 ! 143: move.l d0,(a4)+ ; text length ! 144: add.l 8(a5),d0 ; data start ! 145: move.l d0,(a4)+ ! 146: move.l 234(a5),(a4)+ ; data length ! 147: add.l 234(a5),d0 ! 148: move.l d0,(a4)+ ; bss start ! 149: move.l 238(a5),(a4)+ ; bss length ! 150: move.l a5,d0 ! 151: add.l #$80,d0 ! 152: move.l d0,32(a5) ! 153: move.l 24(a5),a4 ! 154: add.l 242(a5),a4 ; symbol table length ! 155: move.l 8(a5),a3 ! 156: move.l a3,d0 ! 157: tst.w 254(a5) ! 158: bne.s relocdone ! 159: move.l (a4)+,d7 ! 160: beq.s relocdone ! 161: add.l d7,a3 ! 162: moveq #0,d7 ! 163: relloop0: ! 164: add.l d0,(a3) ! 165: relloop: ! 166: move.b (a4)+,d7 ! 167: beq.s relocdone ! 168: cmp.b #1,d7 ! 169: bne.s no254 ! 170: lea 254(a3),a3 ! 171: bra.s relloop ! 172: no254: ! 173: add.w d7,a3 ! 174: bra.s relloop0 ! 175: relocdone: ! 176: move.l 28(a5),d0 ! 177: beq.s cleardone ! 178: move.l 24(a5),a0 ! 179: clear: ! 180: clr.b (a0)+ ! 181: subq.l #1,d0 ! 182: bne.s clear ! 183: cleardone: ! 184: move.l a5,d0 ! 185: movem.l (sp)+,a3-a5/d6-d7 ! 186: rts ! 187: ! 188: ;Boot from floppy ! 189: hdv_boot ! 190: ;Read first sector of floppy ! 191: ;Store at bodge TOS 1.00 address $167a ! 192: ;And set D0.W to zero if executable ! 193: ! 194: movem.l d1-d7/a0-a6,-(sp) ! 195: ! 196: ;Read disc sector ! 197: move.w #0,-(sp) ;Drive A ! 198: move.w #0,-(sp) ;First logical sector ! 199: move.w #1,-(sp) ;Read 1 sector ! 200: move.l #$167a,-(sp) ;Bodge address, $16da for TOS 1.02, $181C for 1.04, $185C for 1.62 ! 201: move.w #0,-(sp) ;Read only ! 202: move.w #4,-(sp) ! 203: trap #13 ! 204: add.l #14,sp ! 205: tst.l d0 ! 206: bmi non_executable ! 207: ! 208: ;Is sector executable? ! 209: ;It is if checksum is OK ! 210: move.w #$100,-(sp) ;256 words (512 bytes) ! 211: move.l #$167a,-(sp) ;Address ! 212: bsr calc_bootsector_checksum ! 213: addq.l #6,sp ! 214: cmp.w #$1234,d0 ! 215: bne non_executable ! 216: ! 217: clr.w d0 ;Is executable ! 218: movem.l (sp)+,d1-d7/a0-a6 ! 219: rts ! 220: ! 221: non_executable ! 222: moveq.l #4,d0 ;Not valid boot sector ! 223: movem.l (sp)+,d1-d7/a0-a6 ! 224: rts ! 225: ! 226: ;Copied from ST Internals(Abacus), page 323 ! 227: calc_bootsector_checksum ! 228: link a6,#0 ! 229: movem.l d6-d7,-(sp) ! 230: clr.w d7 ;Clear checksum ! 231: bra .loop_end ;To loop end ! 232: .loop ! 233: move.l 8(a6),a0 ;Address of buffer ! 234: move.w (a0),d0 ;Get word ! 235: add.w d0,d7 ;sum ! 236: addq.l #2,8(a6) ;Increment buffer address ! 237: .loop_end ! 238: move.w 12(a6),d0 ;Number of words ! 239: subq.w #1,12(a6) ;minus 1 ! 240: tst.w d0 ;All words added? ! 241: bne .loop ;No ! 242: move.w d7,d0 ;Result in D0 ! 243: ! 244: tst.l (a7)+ ! 245: movem.l (a7)+,d7 ! 246: unlk a6 ! 247: rts ! 248:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.