Subversion Repositories Kolibri OS

Rev

Rev 1952 | Rev 2047 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1952 Rev 2014
Line 9... Line 9...
9
;;  KolibriOS 16-bit loader,                                    ;;
9
;;  KolibriOS 16-bit loader,                                    ;;
10
;;                        based on bootcode for MenuetOS        ;;
10
;;                        based on bootcode for MenuetOS        ;;
11
;;                                                              ;;
11
;;                                                              ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 13... Line 13...
13
 
13
 
Line 14... Line 14...
14
$Revision: 1952 $
14
$Revision: 2014 $
15
 
15
 
16
 
16
 
17
;==========================================================================
17
;==========================================================================
18
;
18
;
Line 19... Line -...
19
;                           16 BIT FUNCTIONS
-
 
20
;
-
 
21
;==========================================================================
-
 
22
 
-
 
23
if 0
-
 
24
putchar:
-
 
25
; in: al=character
-
 
26
	mov	ah, 0Eh
-
 
27
	mov	bh, 0
-
 
28
	int	10h
-
 
29
	ret
-
 
30
 
-
 
31
print:
-
 
32
; in: si->string
-
 
33
	mov	al, 186
-
 
34
	call	putchar
-
 
35
	mov	al, ' '
-
 
36
	call	putchar
-
 
37
 
-
 
38
printplain:
-
 
39
; in: si->string
-
 
40
	pusha
-
 
41
	lodsb
-
 
42
@@:
-
 
43
	call	putchar
-
 
44
	lodsb
-
 
45
	test	al,al
-
 
46
	jnz	@b
-
 
47
	popa
-
 
48
	ret
-
 
49
 
-
 
50
 
-
 
51
setcursor:
-
 
52
; in: dl=column, dh=row
-
 
53
	mov	ah, 2
-
 
54
	mov	bh, 0
-
 
55
	int	10h
-
 
56
	ret
-
 
57
 
-
 
58
macro _setcursor row,column
-
 
59
{
-
 
60
	mov	dx, row*256 + column
-
 
Line 61... Line 19...
61
	call	setcursor
19
;                           16 BIT FUNCTIONS
62
}
20
;
63
 
21
;==========================================================================
64
end if
22
 
Line 78... Line 36...
78
@@:
36
@@:
79
	pop	si
37
	pop	si
80
	ret
38
	ret
Line 81... Line 39...
81
 
39
 
82
sayerr_plain:
-
 
83
	jmp	$
-
 
84
 
40
sayerr_plain:
85
sayerr:
41
sayerr:
Line 86... Line 42...
86
	jmp	$
42
	jmp	$
Line 161... Line 117...
161
	push	cs
117
	push	cs
162
	pop	ds
118
	pop	ds
163
	push	cs
119
	push	cs
164
	pop	es
120
	pop	es
Line -... Line 121...
-
 
121
 
165
 
122
if 0
166
; set videomode
123
; set videomode
167
	mov	ax, 3
124
	mov	ax, 3
Line 168... Line 125...
168
	int	0x10
125
	int	0x10
169
 
126
 
170
; draw frames
127
; draw frames
171
	push	0xb800
128
	push	0xb800
172
	pop	es
129
	pop	es
-
 
130
	xor	di, di
Line 173... Line 131...
173
	xor	di, di
131
	mov	ah, 1*16+15
Line 174... Line 132...
174
	mov	ah, 1*16+15
132
end if
175
 
133
 
Line 300... Line 258...
300
	cmp	byte [di+preboot_biosdisk-preboot_device], 1
258
	cmp	byte [di+preboot_biosdisk-preboot_device], 1
301
	adc	byte [di+preboot_biosdisk-preboot_device], 0
259
	adc	byte [di+preboot_biosdisk-preboot_device], 0
Line 302... Line 260...
302
 
260
 
303
;        pop     ax              ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ??
261
;        pop     ax              ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ??
-
 
262
	jmp	.continue
304
	jmp	.continue
263
 
305
.loader_block dd -1
264
.loader_block dd -1
306
.continue:
265
.continue:
307
	sti
266
	sti
Line 342... Line 301...
342
; GET MEMORY MAP
301
; GET MEMORY MAP
343
include 'detect/biosmem.inc'
302
include 'detect/biosmem.inc'
Line 344... Line 303...
344
 
303
 
Line 345... Line -...
345
; READ DISKETTE TO MEMORY
-
 
346
 
-
 
347
if 0
-
 
348
----
-
 
349
	cmp	[boot_dev],0
-
 
350
	jne	no_sys_on_floppy
-
 
351
	xor	ax, ax		  ; reset drive
-
 
352
	xor	dx, dx
-
 
353
	int	0x13
-
 
354
; do we boot from CD-ROM?
-
 
355
	mov	ah, 41h
-
 
356
	mov	bx, 55AAh
-
 
357
	xor	dx, dx
-
 
358
	int	0x13
-
 
359
	jc	.nocd
-
 
360
	cmp	bx, 0AA55h
-
 
361
	jnz	.nocd
-
 
362
	mov	ah, 48h
-
 
363
	push	ds
-
 
364
	push	es
-
 
365
	pop	ds
-
 
366
	mov	si, 0xa000
-
 
367
	mov	word [si], 30
-
 
368
	int	0x13
-
 
369
	pop	ds
-
 
370
	jc	.nocd
-
 
371
	push	ds
-
 
372
	lds	si, [es:si+26]
-
 
373
	test	byte [ds:si+10], 40h
-
 
374
	pop	ds
-
 
375
	jz	.nocd
-
 
376
; yes - read all floppy by 18 sectors
-
 
377
 
-
 
378
; TODO: !!!! read only first sector and set variables !!!!!
-
 
379
; ...
-
 
380
; TODO: !!! then read flippy image track by track
-
 
381
 
-
 
382
	mov	cx, 0x0001	; startcyl,startsector
-
 
383
.a1:
-
 
384
	push	cx dx
-
 
385
	mov	al, 18
-
 
386
	mov	bx, 0xa000
-
 
387
	call	boot_read_floppy
-
 
388
	mov	si, movedesc
-
 
389
	push	es
-
 
390
	push	ds
-
 
391
	pop	es
-
 
392
	mov	cx, 256*18
-
 
393
	mov	ah, 0x87
-
 
394
	int	0x15
-
 
395
	pop	es
-
 
396
	pop	dx cx
-
 
397
	test	ah, ah
-
 
398
	jnz	sayerr_floppy
-
 
399
	add	dword [si+8*3+2], 512*18
-
 
400
	inc	dh
-
 
401
	cmp	dh, 2
-
 
402
	jnz	.a1
-
 
403
	mov	dh, 0
-
 
404
	inc	ch
-
 
405
	cmp	ch, 80
-
 
406
	jae	ok_sys_on_floppy
-
 
407
	mov	al, ch
-
 
408
	shr	ch, 2
-
 
409
	jmp	.a1
-
 
410
.nocd:
-
 
411
; no - read only used sectors from floppy
-
 
412
; now load floppy image to memory
-
 
413
; at first load boot sector and first FAT table
-
 
414
 
-
 
415
; read only first sector and fill variables
-
 
416
	mov	cx, 0x0001	; first logical sector
-
 
417
	xor	dx, dx		; head = 0, drive = 0 (a:)
-
 
418
	mov	al, 1		; read one sector
-
 
419
	mov	bx, 0xB000	; es:bx -> data area
-
 
420
	call	boot_read_floppy
-
 
421
; fill the necessary parameters to work with a floppy
-
 
422
	mov	ax, word [es:bx+24]
-
 
423
	mov	word [BPB_SecPerTrk], ax
-
 
424
	mov	ax, word [es:bx+26]
-
 
425
	mov	word [BPB_NumHeads], ax
-
 
426
	mov	ax, word [es:bx+17]
-
 
427
	mov	word [BPB_RootEntCnt], ax
-
 
428
	mov	ax, word [es:bx+14]
-
 
429
	mov	word [BPB_RsvdSecCnt], ax
-
 
430
	mov	ax, word [es:bx+19]
-
 
431
	mov	word [BPB_TotSec16], ax
-
 
432
	mov	al, byte [es:bx+13]
-
 
433
	mov	byte [BPB_SecPerClus], al
-
 
434
	mov	al, byte [es:bx+16]
-
 
435
	mov	byte [BPB_NumFATs], al
-
 
436
; 18.11.2008
-
 
437
	mov	ax, word [es:bx+22]
-
 
438
	mov	word [BPB_FATSz16], ax
-
 
439
	mov	cx, word [es:bx+11]
-
 
440
	mov	word [BPB_BytsPerSec], cx
-
 
441
 
-
 
442
; count of clusters in FAT12 ((size_of_FAT*2)/3)
-
 
443
;        mov     ax, word [BPB_FATSz16]
-
 
444
;        mov     cx, word [BPB_BytsPerSec]
-
 
445
;end  18.11.2008
-
 
446
	xor	dx, dx
-
 
447
	mul	cx
-
 
448
	shl	ax, 1
-
 
449
	mov	cx, 3
-
 
450
	div	cx		; now ax - number of clusters in FAT12
-
 
451
	mov	word [end_of_FAT], ax
-
 
452
 
-
 
453
; load first FAT table
-
 
454
	mov	cx, 0x0002	; startcyl,startsector          ; TODO!!!!!
-
 
455
	xor	dx, dx		; starthead,drive
-
 
456
	mov	al, byte [BPB_FATSz16]	   ; no of sectors to read
-
 
457
	add	bx, word [BPB_BytsPerSec]  ; es:bx -> data area
-
 
458
	call	boot_read_floppy
-
 
459
	mov	bx, 0xB000
-
 
460
 
-
 
461
; and copy them to extended memory
-
 
462
	mov	si, movedesc
-
 
463
	mov	[si+8*2+3], bh		; from
-
 
464
 
-
 
465
	mov	ax, word [BPB_BytsPerSec]
-
 
466
	shr	ax, 1			; words per sector
-
 
467
	mov	cx, word [BPB_RsvdSecCnt]
-
 
468
	add	cx, word [BPB_FATSz16]
-
 
469
	mul	cx
-
 
470
	push	ax			; save to stack count of words in boot+FAT
-
 
471
	xchg	ax, cx
-
 
472
 
-
 
473
	push	es
-
 
474
	push	ds
-
 
475
	pop	es
-
 
476
	mov	ah, 0x87
-
 
477
	int	0x15
-
 
478
	pop	es
-
 
479
	test	ah, ah
-
 
480
	jz	@f
-
 
481
sayerr_floppy:
-
 
482
	mov	dx, 0x3f2
-
 
483
	mov	al, 0
-
 
484
	out	dx, al
-
 
485
;        mov     si, memmovefailed
-
 
486
	jmp	$
-
 
487
@@:
-
 
488
	pop	ax			; restore from stack count of words in boot+FAT
-
 
489
	shl	ax, 1			; make bytes count from count of words
-
 
490
	and	eax, 0ffffh
-
 
491
	add	dword [si+8*3+2], eax
-
 
492
 
-
 
493
; copy first FAT to second copy
-
 
494
; TODO: BPB_NumFATs !!!!!
-
 
495
	add	bx, word [BPB_BytsPerSec]	; !!! TODO: may be need multiply by BPB_RsvdSecCnt !!!
-
 
496
	mov	byte [si+8*2+3], bh	; bx - begin of FAT
-
 
497
 
-
 
498
	mov	ax, word [BPB_BytsPerSec]
-
 
499
	shr	ax, 1			; words per sector
-
 
500
	mov	cx, word [BPB_FATSz16]
-
 
501
	mul	cx
-
 
502
	mov	cx, ax			; cx - count of words in FAT
-
 
503
 
-
 
504
	push	es
-
 
505
	push	ds
-
 
506
	pop	es
-
 
507
	mov	ah, 0x87
-
 
508
	int	0x15
-
 
509
	pop	es
-
 
510
	test	ah, ah
-
 
511
	jnz	sayerr_floppy
-
 
512
 
-
 
513
	mov	ax, cx
-
 
514
	shl	ax, 1
-
 
515
	and	eax, 0ffffh		; ax - count of bytes in FAT
-
 
516
	add	dword [si+8*3+2], eax
-
 
517
 
-
 
518
; reading RootDir
-
 
519
; TODO: BPB_NumFATs
-
 
520
	add	bx, ax
-
 
521
	add	bx, 100h
-
 
522
	and	bx, 0ff00h			; bx - place in buffer to write RootDir
-
 
523
	push	bx
-
 
524
 
-
 
525
	mov	bx, word [BPB_BytsPerSec]
-
 
526
	shr	bx, 5				; divide bx by 32
-
 
527
	mov	ax, word [BPB_RootEntCnt]
-
 
528
	xor	dx, dx
-
 
529
	div	bx
-
 
530
	push	ax				; ax - count of RootDir sectors
-
 
531
 
-
 
532
	mov	ax, word [BPB_FATSz16]
-
 
533
	xor	cx, cx
-
 
534
	mov	cl, byte [BPB_NumFATs]
-
 
535
	mul	cx
-
 
536
	add	ax, word [BPB_RsvdSecCnt]	; ax - first sector of RootDir
-
 
537
 
-
 
538
	mov	word [FirstDataSector], ax
-
 
539
	pop	bx
-
 
540
	push	bx
-
 
541
	add	word [FirstDataSector], bx	; Begin of data region of floppy
-
 
542
 
-
 
543
; read RootDir
-
 
544
	call	conv_abs_to_THS
-
 
545
	pop	ax
-
 
546
	pop	bx				; place in buffer to write
-
 
547
	push	ax
-
 
548
	call	boot_read_floppy		; read RootDir into buffer
-
 
549
; copy RootDir
-
 
550
	mov	byte [si+8*2+3], bh		; from buffer
-
 
551
	pop	ax				; ax = count of RootDir sectors
-
 
552
	mov	cx, word [BPB_BytsPerSec]
-
 
553
	mul	cx
-
 
554
	shr	ax, 1
-
 
555
	mov	cx, ax				; count of words to copy
-
 
556
	push	es
-
 
557
	push	ds
-
 
558
	pop	es
-
 
559
	mov	ah, 0x87
-
 
560
	int	0x15
-
 
561
	pop	es
-
 
562
 
-
 
563
	mov	ax, cx
-
 
564
	shl	ax, 1
-
 
565
	and	eax, 0ffffh		; ax - count of bytes in RootDir
-
 
566
	add	dword [si+8*3+2], eax	; add count of bytes copied
-
 
567
 
-
 
568
; Reading data clusters from floppy
-
 
569
	mov	byte [si+8*2+3], bh
-
 
570
	push	bx
-
 
571
 
-
 
572
	mov	di, 2			; First data cluster
-
 
573
.read_loop:
-
 
574
	mov	bx, di
-
 
575
	shr	bx, 1			; bx+di = di*1.5
-
 
576
	jnc	.even
-
 
577
	test	word [es:bx+di+0xB200], 0xFFF0	; TODO: may not be 0xB200 !!!
-
 
578
	jmp	@f
-
 
579
.even:
-
 
580
	test	word [es:bx+di+0xB200], 0xFFF	; TODO: may not be 0xB200 !!!
-
 
581
 
-
 
582
@@:
-
 
583
	jz	.skip
-
 
584
; read cluster di
-
 
585
;.read:
-
 
586
	;conv cluster di to abs. sector ax
-
 
587
	; ax = (N-2) * BPB_SecPerClus + FirstDataSector
-
 
588
	mov	ax, di
-
 
589
	sub	ax, 2
-
 
590
	xor	bx, bx
-
 
591
	mov	bl, byte [BPB_SecPerClus]
-
 
592
	mul	bx
-
 
593
	add	ax, word [FirstDataSector]
-
 
594
	call	conv_abs_to_THS
-
 
595
	pop	bx
-
 
596
	push	bx
-
 
597
	mov	al, byte [BPB_SecPerClus]	; number of sectors in cluster
-
 
598
	call	boot_read_floppy
-
 
599
	push	es
-
 
600
	push	ds
-
 
601
	pop	es
-
 
602
	pusha
-
 
603
;
-
 
604
	mov	ax, word [BPB_BytsPerSec]
-
 
605
	xor	cx, cx
-
 
606
	mov	cl, byte [BPB_SecPerClus]
-
 
607
	mul	cx
-
 
608
	shr	ax, 1				; ax = (BPB_BytsPerSec * BPB_SecPerClus)/2
-
 
609
	mov	cx, ax				; number of words to copy (count words in cluster)
-
 
610
;
-
 
611
	mov	ah, 0x87
-
 
612
	int	0x15				; copy data
-
 
613
	test	ah, ah
-
 
614
	popa
-
 
615
	pop	es
-
 
616
	jnz	sayerr_floppy
-
 
617
; skip cluster di
-
 
618
.skip:
-
 
619
	mov	ax, word [BPB_BytsPerSec]
-
 
620
	xor	cx, cx
-
 
621
	mov	cl, byte [BPB_SecPerClus]
-
 
622
	mul	cx
-
 
623
	and	eax, 0ffffh		; ax - count of bytes in cluster
-
 
624
	add	dword [si+8*3+2], eax
-
 
625
 
-
 
626
	mov	ax, word [end_of_FAT]	; max cluster number
-
 
627
	pusha
-
 
628
; draw percentage
-
 
629
; total clusters: ax
-
 
630
; read clusters: di
-
 
631
	xchg	ax, di
-
 
632
	mov	cx, 100
-
 
633
	mul	cx
-
 
634
	div	di
-
 
635
	aam
-
 
636
	xchg	al, ah
-
 
637
	add	ax, '00'
-
 
638
@@:
-
 
639
	popa
-
 
640
	inc	di
-
 
641
	cmp	di, word [end_of_FAT]	; max number of cluster
-
 
642
	jnz	.read_loop
-
 
643
	pop	bx			; clear stack
-
 
644
 
-
 
645
ok_sys_on_floppy:
-
 
646
no_sys_on_floppy:
-
 
647
	xor	ax, ax		; reset drive
-
 
648
	xor	dx, dx
-
 
649
	int	0x13
-
 
650
	mov	dx, 0x3f2	; floppy motor off
-
 
651
	mov	al, 0
-
 
652
	out	dx, al
-
 
Line 653... Line 304...
653
---
304
; READ DISKETTE TO MEMORY
Line 654... Line 305...
654
end if
305