source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/Handlers/Int19h.asm @ 95

Last change on this file since 95 was 95, checked in by aitotat, 13 years ago

Changes to XTIDE Universal BIOS:

  • Smaller boot sector loading string.
  • Cleaned boot code a bit.
File size: 4.5 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Int 19h BIOS functions (Boot Strap Loader).
3
4; Section containing code
5SECTION .text
6
7B_READ_RETRY_TIMES  EQU 3   ; Number of times to retry
8
9
10;--------------------------------------------------------------------
11; Boots if boot sector is successfully read from the drive.
12;
13; Int19h_TryToLoadBootSectorFromDL
14;   Parameters:
15;       DL:     Drive to boot from (translated, 00h or 80h)
16;       DS:     RAMVARS segment
17;   Returns:
18;       ES:BX:  Ptr to boot sector (if successfull)
19;       CF:     Set if boot sector loaded succesfully
20;               Cleared if failed to load boot sector
21;   Corrupts registers:
22;       AX, CX, DH, DI, (DL if failed to read boot sector)
23;--------------------------------------------------------------------
24ALIGN JUMP_ALIGN
25Int19h_TryToLoadBootSectorFromDL:
26    call    BootPrint_TryToBootFromDL
27    call    LoadFirstSectorFromDriveDL
28    jc      SHORT .FailedToLoadFirstSector
29
30    test    dl, 80h
31    jz      SHORT .AlwaysBootFromFloppyDriveForBooterGames
32    cmp     WORD [es:bx+510], 0AA55h        ; Valid boot sector?
33    jne     SHORT .FirstHardDiskSectorNotBootable
34.AlwaysBootFromFloppyDriveForBooterGames:
35    mov     bx, g_szFound
36    call    BootPrint_BootSectorResultStringFromBX
37    stc
38    ret
39.FailedToLoadFirstSector:
40    call    BootPrint_FailedToLoadFirstSector
41    clc
42    ret
43.FirstHardDiskSectorNotBootable:
44    mov     bx, g_szNotFound
45    call    BootPrint_BootSectorResultStringFromBX
46    clc
47    ret
48
49;--------------------------------------------------------------------
50; LoadFirstSectorFromDriveDL
51;   Parameters:
52;       DL:     Drive to boot from (translated, 00h or 80h)
53;   Returns:
54;       AH:     INT 13h error code
55;       ES:BX:  Ptr to boot sector (if successfull)
56;       CF:     Cleared if read successfull
57;               Set if any error
58;   Corrupts registers:
59;       AL, CX, DH, DI
60;--------------------------------------------------------------------
61ALIGN JUMP_ALIGN
62LoadFirstSectorFromDriveDL:
63    LOAD_BDA_SEGMENT_TO es, bx              ; ES:BX now points to...
64    mov     bx, BOOTVARS.rgbBootSect        ; ...boot sector location
65    mov     di, B_READ_RETRY_TIMES          ; Initialize retry counter
66ALIGN JUMP_ALIGN
67.ReadRetryLoop:
68    call    .ResetBootDriveFromDL
69    call    .LoadFirstSectorFromDLtoESBX
70    jnc     SHORT .Return
71    dec     di                              ; Decrement retry counter
72    jnz     SHORT .ReadRetryLoop            ; Loop while retries left
73ALIGN JUMP_ALIGN
74.Return:
75    ret
76
77;--------------------------------------------------------------------
78; .ResetBootDriveFromDL
79;   Parameters:
80;       DL:     Drive to boot from (translated, 00h or 80h)
81;   Returns:
82;       AH:     INT 13h error code
83;       CF:     Cleared if read successfull
84;               Set if any error
85;   Corrupts registers:
86;       AL
87;--------------------------------------------------------------------
88ALIGN JUMP_ALIGN
89.ResetBootDriveFromDL:
90    xor     ax, ax                          ; AH=0h, Disk Controller Reset
91    test    dl, 80h                         ; Floppy drive?
92    eCMOVNZ ah, 0Dh                         ; AH=Dh, Reset Hard Disk (Alternate reset)
93    int     INTV_DISK_FUNC
94    ret
95
96;--------------------------------------------------------------------
97; Reads first sector (boot sector) from drive DL to ES:BX.
98;
99; .LoadFirstSectorFromDLtoESBX
100;   Parameters:
101;       DL:     Drive to boot from (translated, 00h or 80h)
102;       ES:BX:  Destination buffer for boot sector
103;   Returns:
104;       AH:     INT 13h error code
105;       ES:BX:  Ptr to boot sector
106;       CF:     Cleared if read successfull
107;               Set if any error
108;   Corrupts registers:
109;       AL, CX, DH
110;--------------------------------------------------------------------
111ALIGN JUMP_ALIGN
112.LoadFirstSectorFromDLtoESBX:
113    mov     ax, 0201h                       ; Read 1 sector
114    mov     cx, 1                           ; Cylinder 0, Sector 1
115    xor     dh, dh                          ; Head 0
116    int     INTV_DISK_FUNC
117    ret
118
119
120;--------------------------------------------------------------------
121; Jumps to boot sector pointed by ES:BX.
122;
123; Int19h_JumpToBootSector
124;   Parameters:
125;       DL:     Drive to boot from (translated, 00h or 80h)
126;       ES:BX:  Ptr to boot sector
127;   Returns:
128;       Never returns
129;--------------------------------------------------------------------
130ALIGN JUMP_ALIGN
131Int19h_JumpToBootSector:
132    push    es                              ; Push boot sector segment
133    push    bx                              ; Push boot sector offset
134    call    Int19h_ClearSegmentsForBoot
135    xor     dh, dh                          ; Device supported by INT 13h
136    retf
137
138;--------------------------------------------------------------------
139; Clears DS and ES registers to zero.
140;
141; Int19h_ClearSegmentsForBoot
142;   Parameters:
143;       Nothing
144;   Returns:
145;       DS=ES:  Zero
146;   Corrupts registers:
147;       AX
148;--------------------------------------------------------------------
149ALIGN JUMP_ALIGN
150Int19h_ClearSegmentsForBoot:
151    xor     ax, ax
152    mov     ds, ax
153    mov     es, ax
154    ret
Note: See TracBrowser for help on using the repository browser.