|
|
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.