|
|
1.1.1.3 ! root 1: ; 68000 code that is used for starting programs from the emulated GEMDOS harddisk ! 2: ! 3: 1.1 root 4: org $fa1000 5: 6: GEMDOS_OPCODE equ 8 ; Free op-code! 7: VDI_OPCODE equ 12 ; Free op-code! 8: 1.1.1.3 ! root 9: ! 10: harddrive_boot: dc.l 0 ; unused ! 11: old_gemdos: ds.l 1 ! 12: vdi_opcode: dc.w VDI_OPCODE ; Address to call after Trap #2(VDI), causes illegal instruction 1.1 root 13: 14: ;New GemDOS vector (0x84) 1.1.1.3 ! root 15: new_gemdos: 1.1 root 16: dc.w GEMDOS_OPCODE ; Returns NEG as run old vector, ZERO to return or OVERFLOW to run pexec 1.1.1.3 ! root 17: bvs.s pexec ! 18: bne.s go_oldgemdos 1.1 root 19: rte 20: 21: ;Branch to old GemDOS 1.1.1.3 ! root 22: go_oldgemdos: ! 23: move.l old_gemdos(pc),-(sp) ;Set PC to 'old_gemdos' and continue execution, WITHOUT corrupting registers! ! 24: rts 1.1 root 25: 26: ;Progam Execute 1.1.1.3 ! root 27: pexec: 1.1 root 28: lea 8(sp),a0 29: btst #5,(sp) 30: bne.s s_ok 31: move.l usp,a0 32: addq #2,a0 33: s_ok: 1.1.1.3 ! root 34: tst (a0) ; Test pexec mode 1.1 root 35: bne.s no_0 1.1.1.3 ! root 36: ! 37: ; Simulate pexec mode 0 1.1 root 38: move.l a6,-(sp) 39: move.l a0,a6 40: move.l a6,-(sp) ;new 1.1.1.3 ! root 41: bsr.s find_prog 1.1 root 42: move.l (sp)+,a6 ;new 43: bsr pexec5 44: bsr reloc 45: clr.l 2(a6) 46: clr.l 10(a6) 47: move.l d0,6(a6) 1.1.1.3 ! root 48: ! 49: move.w #48,-(sp) ; Sversion: get GEMDOS version ! 50: trap #1 ; call GEMDOS ! 51: addq #2,sp ! 52: ror.w #8,d0 ; Major version to high, minor version to low byte ! 53: cmp.w #$0015,d0 ! 54: bge.s use_gemdos_015 ! 55: move.w #4,(a6) ; pexec mode 4 for exec. prepared program ! 56: bra.s mode0_ok ! 57: use_gemdos_015: ! 58: move.w #6,(a6) ; On GEMDOS 0.15 and higher, we can use mode 6 ! 59: mode0_ok: ! 60: 1.1 root 61: move.l (sp)+,a6 1.1.1.3 ! root 62: bra.s go_oldgemdos ! 63: 1.1 root 64: no_0: 65: cmp #3,(a0) 66: bne.s go_oldgemdos 1.1.1.3 ! root 67: ! 68: ; Simulate pexec mode 3 1.1 root 69: move.l a6,-(sp) 70: move.l a0,a6 1.1.1.3 ! root 71: bsr.s find_prog ! 72: bsr.s pexec5 ! 73: bsr.s reloc 1.1 root 74: gohome: 75: move.l (sp)+,a6 76: rte 1.1.1.3 ! root 77: 1.1 root 78: find_prog: 1.1.1.3 ! root 79: move #$2f,-(sp) ; Fgetdta 1.1.1.2 root 80: trap #1 ; Gemdos 1.1 root 81: addq #2,sp 82: move.l d0,a0 83: move.l (a0)+,-(sp) 84: move.l (a0)+,-(sp) 85: move.l (a0)+,-(sp) 86: move.l (a0)+,-(sp) 87: move.l (a0)+,-(sp) 88: move.l (a0)+,-(sp) 89: move.l (a0)+,-(sp) 90: move.l (a0)+,-(sp) 91: move.l (a0)+,-(sp) 92: move.l (a0)+,-(sp) 93: move.l (a0)+,-(sp) 94: move.l a0,-(sp) 95: move #$17,-(sp) 96: move.l 2(a6),-(sp) 1.1.1.3 ! root 97: move #$4e,-(sp) ; Fsfirst 1.1.1.2 root 98: trap #1 ; Gemdos 1.1 root 99: addq #8,sp 100: move.l (sp)+,a0 101: move.l (sp)+,-(a0) 102: move.l (sp)+,-(a0) 103: move.l (sp)+,-(a0) 104: move.l (sp)+,-(a0) 105: move.l (sp)+,-(a0) 106: move.l (sp)+,-(a0) 107: move.l (sp)+,-(a0) 108: move.l (sp)+,-(a0) 109: move.l (sp)+,-(a0) 110: move.l (sp)+,-(a0) 111: move.l (sp)+,-(a0) 112: tst.l d0 113: beq.s findprog_ok 114: addq #4,sp 115: bra.s gohome 116: findprog_ok: 117: rts 1.1.1.3 ! root 118: 1.1 root 119: pexec5: 120: move.l 10(a6),-(sp) 121: move.l 6(a6),-(sp) 122: clr.l -(sp) 123: move #5,-(sp) 1.1.1.3 ! root 124: move #$4b,-(sp) ; Pexec 1.1.1.2 root 125: trap #1 ; Gemdos 1.1 root 126: lea 16(sp),sp 127: tst.l d0 128: bmi.s pexecerr 129: rts 130: pexecerr: 131: addq #4,sp 132: bra.s gohome 1.1.1.3 ! root 133: 1.1 root 134: reloc: 135: movem.l a3-a5/d6-d7,-(sp) 136: move.l d0,a5 137: clr -(sp) 138: move.l 2(a6),-(sp) 1.1.1.3 ! root 139: move #$3d,-(sp) ; Fopen 1.1.1.2 root 140: trap #1 ; Gemdos 1.1 root 141: addq #8,sp 142: move.l d0,d6 143: move.l a5,-(sp) 144: add.l #228,(sp) 145: pea $1c.w 146: move d6,-(sp) 1.1.1.3 ! root 147: move #$3f,-(sp) ; Fread 1.1.1.2 root 148: trap #1 ; Gemdos 1.1 root 149: lea 12(sp),sp 150: ; check size!! 151: move.l a5,-(sp) 152: add.l #256,(sp) 153: pea $7fffffff 154: move d6,-(sp) 1.1.1.3 ! root 155: move #$3f,-(sp) ; Fread 1.1.1.2 root 156: trap #1 ; Gemdos 1.1 root 157: lea 12(sp),sp 158: move d6,-(sp) 1.1.1.3 ! root 159: move #$3e,-(sp) ; Fclose 1.1.1.2 root 160: trap #1 ; Gemdos 1.1 root 161: addq #4,sp 162: lea 8(a5),a4 163: move.l a5,d0 164: add.l #$100,d0 165: move.l d0,(a4)+ ; text start 166: move.l 230(a5),d0 167: move.l d0,(a4)+ ; text length 168: add.l 8(a5),d0 ; data start 169: move.l d0,(a4)+ 170: move.l 234(a5),(a4)+ ; data length 171: add.l 234(a5),d0 172: move.l d0,(a4)+ ; bss start 173: move.l 238(a5),(a4)+ ; bss length 174: move.l a5,d0 175: add.l #$80,d0 176: move.l d0,32(a5) 177: move.l 24(a5),a4 178: add.l 242(a5),a4 ; symbol table length 179: move.l 8(a5),a3 180: move.l a3,d0 181: tst.w 254(a5) 182: bne.s relocdone 1.1.1.2 root 183: 1.1.1.3 ! root 184: ; Get first offset of the relocation table. Since A4 seems sometimes not ! 185: ; to be word aligned (if symbol table length is uneven), we have to read ! 186: ; byte by byte... ! 187: move.b (a4),d7 ! 188: clr.b (a4)+ ! 189: lsl.w #8,d7 ! 190: move.b (a4),d7 ! 191: clr.b (a4)+ ! 192: swap d7 ! 193: move.b (a4),d7 ! 194: clr.b (a4)+ ! 195: lsl.w #8,d7 ! 196: move.b (a4),d7 ! 197: clr.b (a4)+ ! 198: ! 199: tst.l d7 1.1 root 200: beq.s relocdone 1.1.1.2 root 201: adda.l d7,a3 1.1.1.3 ! root 202: moveq #0,d7 ! 203: relloop0: ! 204: add.l d0,(a3) ! 205: relloop: ! 206: move.b (a4),d7 ! 207: move.b #$00,(a4)+ ; Some programs like GFA-Basic expect a clear memory ! 208: tst.b d7 ! 209: beq.s relocdone ! 210: cmp.b #1,d7 ! 211: bne.s no254 ! 212: lea 254(a3),a3 ! 213: bra.s relloop ! 214: no254: ! 215: adda.w d7,a3 ! 216: bra.s relloop0 1.1.1.2 root 217: 1.1 root 218: relocdone: 219: move.l 28(a5),d0 220: beq.s cleardone 221: move.l 24(a5),a0 222: clear: 223: clr.b (a0)+ 224: subq.l #1,d0 225: bne.s clear 226: cleardone: 227: move.l a5,d0 228: movem.l (sp)+,a3-a5/d6-d7 229: rts
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.