summaryrefslogtreecommitdiff
path: root/system/shard-x86-at/7/src/BOOT.ASM
blob: c26f1dfbf66870c85f4b748d89315c0819fde27c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
;*****************************************************************************
;*======= Copyright (C) 1985,86 Martin Schoenbeck, Spenge ===================*
;*                                                                           *
;*        Laden des EUMEL - Restsystems vom Archiv oder HG                   *
;*                                                                           *
;*****************************************************************************

; Versionsschluessel:
;2.2 enthaelt mehrere Partition, Floppy size = 0 bei start und fehler
;2.3 enhaelt Floppy mit Block 0 lesen immer erlaubt
;2.4 Drucker geht ueber rom, wenn adresse nicht ibmlike
;    mehrere Drucker moeglich
;    busy Abfrage kann verzoegert werden (Problem LQ1000)
;    es werden nur die vorhandenen Schnittstellen angezeigt
;    Lesezugriffe bis Block 6 auf Floppy werden immer erlaubt
;2.5 Hercules Karte wird unterstuetzt
;    Bei AT werden schlechte sectoren statt spuren behandelt
;2.6 Fehler in Plattengröße bei behoben (meldete immer al <> 0)
;2.7 Floppylogik fuer 1.7.3 restauriert, Floppy steht jetzt immer
;    auf 360k, wenn keine Floppy erkannt wird, und der Urlader die
;    HG-Version 1742 hat.
;    die Schnittstellen der Addonics-Karte sind jetzt immer mit drin,
;    wenn COM4 generiert sind.
;    Die Druckerkanäle liegen auf 15,14,16
;    Die Baudrateabfrage verneint auch 0

los_gehts:
     cli
; achtung: es und si muessen bis zum einstellen der Festplatte
; unveraendert bleiben !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     mov ax,cs
     mov ds,ax
; cs in vorlaeufige EUMEL Tabelle eintragen
     mov bx,offset systemstart+2
     mov cx,eumel_cs_init_length
self_cs_init_loop:
     mov word ptr [bx],ax
     add bx,4
     loop self_cs_init_loop
; cs in SHard - Tabelle eintragen
     mov bx,offset first_shard_cs_to_alter
     mov cx,shard_cs_alter_length
shard_cs_init_loop:
     mov word ptr [bx],cs     ;put in my code segment
     add bx,4
     loop shard_cs_init_loop 
; berechnen, wohin der EUMEL spaeter soll
     mov bx,offset lastbootbyte  ;relativen paragraph ausrechnen
     mov cl,4
     shr bx,cl
     inc bx
     add ax,bx                ;hier soll spaeter der EUMEL hin
     mov ss,ax
     mov sp,0
     push si                  ;werte fuer plattensetup merken
     push es
; warte routine fuer Platten und Floppytreiber eintragen
     call device_init           ;int 15 eintragen
; alle Kanaele initialisieren
     mov dh,33
     mov al,0
inilop:
     mov cx,-2
     push ax
     call control32
     pop ax
     cli
     inc al
     dec dh
     jnz inilop
     sti                      ;interrupts sind erlaubt
     mov bx,offset signon     ;sag ihm, wer wir sind
     call print
; alle kanaele fuer festplatte einstellen (falls vorhanden)
     pop es
     pop si                   ;zeiger auf partitiontabelle wiederholen
     call setup_fix_disk
; EUMEL 0 laden
getagain:
   ife gensys
     mov al,31      ;zuerst von kanal 31 versuchen
     mov bx,offset archtext
     call geteumel
   endif
     mov al,0
     mov bx,offset hgtext
     call geteumel
     mov bx,offset noeutext
     call print
     call waitchar
     jmp getagain

geteumel:	;EUMEL 0 laden und bei Erfolg starten
     push ax
     mov cx,5       ;size
     call cs:iocontrol
     pop ax
     push bx        ;text fuer medium merken
     mov cx,ss      ;ausrechnen, wohin der urlader muss (ss:0)
     add cx,31                ;damit wir nicht rueckwaerts gehen
     and cx,0ffe0h  ;auf 512 byte boundary
     mov ds,cx      ;segment nach ds
     mov bx,0       ;bei 0 im segment laden wir zuerst
     mov cx,0       ;auftrag
     mov dx,10      ;erster urlader block ist 10
     mov ah,1       ;nur ein versuch 
     cmp al,0
     ifz <mov ah,3> ;hintergrund muss lesbar sein
     push bx 
     push ds
     call getblock
     pop ds
     pop bx
     or cx,cx       ;fehlerfrei?
     jz firstok
     pop bx         ;text fuer medium vergessen
     ret
firstok:
     push ax
     mov cx,5       ;text EUMEL hat 5 buchstaben
     mov si,offset eutext     ;text EUMEL
     mov di,bx                ;puffer
textloop: 
     lods byte ptr cs:[si]
     cmp al,byte ptr ds:[di]
     jz charok
     pop ax         ;stack saeubern
     pop bx
     ret            ;nicht gleich, kein eumel urlader
charok:
     inc di
     loop textloop
     pop ax         ;kanal fuer urlader wiederholen
     pop bx         ;text fuer medium holen
     call print     ;ausgeben
     mov bx,0       ;bx ist zerstoert, aber wir wissen, wohin
     mov ah,8       ;ab hier mit acht versuchen
euloop:
     mov cx,0
     inc dx
     add bx,512     ;auf naechsten block schalten
     push bx
     push ds
     call getblock
     or cx,cx
     jnz booterr
     pop ds
     pop bx
     cmp dx,10+100  ;schon kompletten urlader gelesen
     jnz euloop
; Sprungleiste vom EUMEL abholen
     push cs
     pop es                   ;ziel ist codesegment
     mov si,0
     mov di,offset eumel0id
     mov cx,eumel_leisten_laenge 
     cli
     cld
     rep movsb
     mov ax,ds                ;eumel codesegment nach ax
     push cs                  ;datensegment wieder auf shard
     pop ds
; und passendes cs eintragen
     mov bx,offset systemstart+2
     mov cx,eumel_cs_init_length
eumel_cs_init_loop:
     mov word ptr [bx],ax
     add bx,4
     loop eumel_cs_init_loop 
     call paragraphs
     sub dx,ax                ;rest fuer eumel ausrechnen
    if ramsys
     urram equ 1000h

     sub dx,urram             ;64k fuer urlader und paging
     mov M3SIZE,dx
     mov M0SIZE,urram
     mov M0START,ax
     add ax,urram
     mov M3START,ax
    else
     mov M0SIZE,dx
     mov M0START,ax           ;eumel codesegment eintragen
    endif
     mov ax,31           ;allen floppies die chance geben
i173lop:                 ;sich auf 173 einzustellen
     mov cx,-173
     push ax
     call control32
     pop ax
     dec al
     jnz i173lop
     mov bx,offset SHard_leiste
     jmp systemstart
 

booterr:
     push ds
     push bx
     mov bx,offset booterrtext
     call print
     pop bx
     pop ds
     call dsprint
     jmp $
 
getblock:
     push ax        ;original ax merken
getloop:
     push bx
     push ds 
     push ax        ;ax mit retry zaehler
     mov cx,0
     call cs:blockin
     pop ax
     or cx,cx
     jnz geterr
     pop ds
     pop bx
     pop ax
     ret
geterr:
     dec ah         ;genuegend retries
     jnz getcontinue
     pop ax         ;kill ds
     pop ax         ;kill bx
     pop ax         ;altes ax holen
     ret
getcontinue:
     pop ds
     pop bx
     jmp getloop

waitchar:
     sti
     mov byte ptr cs:waschar,0
waitcloop:
     cmp byte ptr cs:waschar,0
     jz waitcloop
     ret

iint proc far
     cmp al,1                 ;nur kanal 1 ist interessant
     ifnz <ret>
     mov byte ptr cs:waschar,1
     ret
iint endp

waschar db 0

print:
     push ds
     push cs
     pop ds
     call dsprint
     pop ds
     ret

dsprint:
     push cx
     push ax
     mov cl,byte ptr [bx]     ;laenge holen
     inc bx                   ;auf text schalten
     mov ch,0
     mov al,1                 ;auf terminal 1
     call cs:output
     pop ax
     pop cx
     ret

setup_fix_disk:
  if hdsystem
     mov di,si                ;si retten
     mov dl,4
eumel_partition_search_loop:
     test byte ptr es:[si],80h  ;aktivierte Partition
     jnz eu_found
     add si,10h
     dec dl
     jnz eumel_partition_search_loop
; keine EUMEL Partition, Sauerei
no_eu_part:
     mov bx,offset no_eumel_partition_text
     call print
     sti
     jmp $

eu_found:
     cmp byte ptr es:[si+4],'E' ;EUMEL partition
     jc no_eu_part
     mov dx,es:[si+8]    ;low word partition start holen
     mov bx,es:[si+10]   ;high word partition start holen
     add dx,68           ;50k fuer shard etc. frei lassen
     adc bl,0
     mov cx,-101         ;partition start einstellen
     mov al,0            ;fuer HG
     call control32
     mov cx,-100         ;dasselbe als groesse fuer Setup Kanal
     mov al,setup_channel
     call control32
     mov dx,es:[si+12]   ;low word partition size holen
     mov bx,es:[si+14]   ;high word partition size holen
     
    if at
     sub dx,68           ;platz fuer SHard
     sbb bl,0
     sub dx,[bb_anz]     ;platz fuer schlechte sectoren lassen
     sbb bl,0
    else
     sub dx,68+(2*68)    ;das, was wir fuers SHard lassen, abziehen
                         ;und das, was fuer schlechte spuren bleiben muss
     sbb bl,0
    endif

     mov cx,-100         ;size einstellen
     mov al,0            ;fuer hg
     call control32
; DOS partition suchen
     mov si,di           ;si wieder holen
     mov dl,4
dos_partition_search_loop:
     cmp byte ptr es:[si+4],1 ;DOS partition
     jz dos_found
     add si,10h
     dec dl
     jnz dos_partition_search_loop
     xor dx,dx
     mov bx,dx           ;DOS Partition existiert nicht
     jmp short dos_size
dos_found:
     mov dx,es:[si+8]    ;low word partition start holen
     mov bx,es:[si+10]   ;high word partition start holen
     mov cx,-101         ;partition start einstellen
     mov al,dos_channel  ;fuer DOS
     call control32
     mov dx,es:[si+12]   ;low word partition size holen
     mov bx,es:[si+14]   ;high word partition size holen
dos_size:
     mov cx,-100         ;size einstellen
     mov al,dos_channel  ;fuer DOS
     call control32
  endif
     ret

 if 0
     mov ax,0
     mov cx,5
     call cs:iocontrol           ;get size of harddisk
  if mit_msdos
     mov bx,17068
  else
     mov bx,100               ;50k freilassen
  endif
     sub cx,bx                ;von size abziehen
     cmp cx,0fd00h shr 1      ;bei mehr legt sich eumel auf den bauch
     ifnc <mov cx,0fcfeh shr 1> ;dann nur soviel, wie er kann
     mov dx,cx                ;in dx melden
     mov cx,-100              ;set size
     call control32
     ret
 endif

eutext:
     db 'EUMEL'

signon:
     db booterrtext-$-1
  if pcd
     db 1bh,5bh,'H',1bh,5bh,'2J'
     db 13,10,10 
     db 'Demo - SHard f',129,'r EUMEL auf Siemens PC-D, V 2.1'
     db 13,10
     db 'Copyright (C) 1985,86 Martin Sch',148,'nbeck, Spenge'
     db 13,10
   else
     if gensys
        db 13,10,10
        db 'Setup - SHard f',129,'r EUMEL'
        db ' auf IBM PC,AT,XT und Kompatiblen V 2.7'
        db 13,10
        db 'Copyright (C) 1985,86 Martin Sch',148,'nbeck, Spenge'
        db 13,10
     else
       if at
          db 13,10,10
          db 'SHard f',129,'r EUMEL auf IBM PC/AT, V 2.7'
          db 13,10
          db 'Copyright (C) 1985,86 Martin Sch',148,'nbeck, Spenge'
          db 13,10
       else
          db 13,10,10
          db 'ModSoft - SHard f',129,'r EUMEL'
          db ' auf IBM-PC und Kompatiblen, Version 2.7'
          db 13,10
          db 'Copyright (C) 1985,86 ModSoft, Martin Sch',148,'nbeck'
          db 13,10
       endif
     endif
  endif

booterrtext:
     db archtext-$-1
     db 'Fehler beim Laden des Systems: '
     db 7
archtext:
     db hgtext-$-1
     db 'EUMEL wird vom Archiv geladen'
     db 13,10
hgtext:
     db noeutext-$-1
     db 'EUMEL wird vom Hintergrund geladen'
     db 13,10
noeutext:
     db no_eumel_partition_text-$-1
     db 'Kein EUMEL - System gefunden'
     db 13,10
     db 'Bitte einlegen und Taste dr',129,'cken! '
no_eumel_partition_text:
     db endtext-$-1
     db 'Keine EUMEL Partition auf der Platte'
     db 13,10
     db 'Bitte benutzen Sie Ihre Setup-Floppy zum Anlegen'
endtext:

lastbootbyte: