|
|
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:
1.1.1.2 ! root 57: move #$002F,-(a7) ; Fgetdta
! 58: trap #1 ; Gemdos
1.1 root 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)
1.1.1.2 ! root 75: move #$004E,-(a7) ; Fsfirst
! 76: trap #1 ; Gemdos
1.1 root 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)
1.1.1.2 ! root 101: move #$004B,-(a7) ; Pexec
! 102: trap #1 ; Gemdos
1.1 root 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)
1.1.1.2 ! root 115: move #$003D,-(a7) ; Fopen
! 116: trap #1 ; Gemdos
1.1 root 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)
1.1.1.2 ! root 123: move #$003F,-(a7) ; Fread
! 124: trap #1 ; Gemdos
1.1 root 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)
1.1.1.2 ! root 131: move #$003F,-(a7) ; Fread
! 132: trap #1 ; Gemdos
1.1 root 133: lea 12(sp),sp
134: move d6,-(sp)
1.1.1.2 ! root 135: move #$003E,-(a7) ; Fclose
! 136: trap #1 ; Gemdos
1.1 root 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
1.1.1.2 ! root 159:
! 160: ;; the following part until relocdone is from a patch
! 161: ;; by the author of winston
! 162: ;;; Created by TT-Digger v6.3
! 163: ;;; Sun Apr 06 14:37:50 2003
! 164:
! 165: move.l (a4),d7
! 166: move.l #$00000000,(a4)+
! 167: cmp.l #$00000000,d7
1.1 root 168: beq.s relocdone
1.1.1.2 ! root 169: adda.l d7,a3
! 170: moveq #$00,d7
! 171: LFA1192:add.l d0,(a3)
! 172: LFA1194:move.b (a4),d7
! 173: move.b #$00,(a4)+
! 174: cmp.b #$00,d7
! 175: beq.s LFA11B0
! 176: cmp.b #$01,d7
! 177: bne.s LFA11AC
! 178: lea $00FE(a3),a3
! 179: bra.s LFA1194
! 180: LFA11AC:adda d7,a3
! 181: bra.s LFA1192
! 182:
1.1 root 183: relocdone:
184: move.l 28(a5),d0
185: beq.s cleardone
186: move.l 24(a5),a0
187: clear:
188: clr.b (a0)+
189: subq.l #1,d0
190: bne.s clear
191: cleardone:
192: move.l a5,d0
193: movem.l (sp)+,a3-a5/d6-d7
194: rts
195:
1.1.1.2 ! root 196: ;Boot from floppy (this code is not used anymore by hatari)
1.1 root 197: hdv_boot
198: ;Read first sector of floppy
199: ;Store at bodge TOS 1.00 address $167a
200: ;And set D0.W to zero if executable
1.1.1.2 ! root 201:
1.1 root 202: movem.l d1-d7/a0-a6,-(sp)
1.1.1.2 ! root 203:
1.1 root 204: ;Read disc sector
205: move.w #0,-(sp) ;Drive A
206: move.w #0,-(sp) ;First logical sector
207: move.w #1,-(sp) ;Read 1 sector
208: move.l #$167a,-(sp) ;Bodge address, $16da for TOS 1.02, $181C for 1.04, $185C for 1.62
209: move.w #0,-(sp) ;Read only
1.1.1.2 ! root 210: move #$0004,-(a7) ; Rwabs
! 211: trap #13 ; Bios
1.1 root 212: add.l #14,sp
213: tst.l d0
214: bmi non_executable
1.1.1.2 ! root 215:
1.1 root 216: ;Is sector executable?
217: ;It is if checksum is OK
218: move.w #$100,-(sp) ;256 words (512 bytes)
219: move.l #$167a,-(sp) ;Address
220: bsr calc_bootsector_checksum
221: addq.l #6,sp
222: cmp.w #$1234,d0
223: bne non_executable
1.1.1.2 ! root 224:
1.1 root 225: clr.w d0 ;Is executable
226: movem.l (sp)+,d1-d7/a0-a6
227: rts
1.1.1.2 ! root 228:
1.1 root 229: non_executable
230: moveq.l #4,d0 ;Not valid boot sector
231: movem.l (sp)+,d1-d7/a0-a6
232: rts
1.1.1.2 ! root 233:
1.1 root 234: ;Copied from ST Internals(Abacus), page 323
235: calc_bootsector_checksum
236: link a6,#0
237: movem.l d6-d7,-(sp)
238: clr.w d7 ;Clear checksum
239: bra .loop_end ;To loop end
240: .loop
241: move.l 8(a6),a0 ;Address of buffer
242: move.w (a0),d0 ;Get word
243: add.w d0,d7 ;sum
244: addq.l #2,8(a6) ;Increment buffer address
245: .loop_end
246: move.w 12(a6),d0 ;Number of words
247: subq.w #1,12(a6) ;minus 1
248: tst.w d0 ;All words added?
249: bne .loop ;No
250: move.w d7,d0 ;Result in D0
251:
252: tst.l (a7)+
253: movem.l (a7)+,d7
254: unlk a6
255: rts
1.1.1.2 ! root 256:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.