source: xtideuniversalbios/trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm @ 193

Last change on this file since 193 was 193, checked in by gregli@…, 12 years ago

Space optimizations in AccessDPT.asm, transfer one routine to a macro (retaining some encapsulation), and transfer the unique part of another routine to the one place it was being called (which also makes what it was doing more transparent).

File size: 3.7 KB
Line 
1; Project name  :   XTIDE Universal BIOS
2; Description   :   Functions for accessing DPT data.
3
4; Section containing code
5SECTION .text
6
7;--------------------------------------------------------------------
8; AccessDPT_GetDriveSelectByteToAL
9;   Parameters:
10;       DS:DI:  Ptr to Disk Parameter Table
11;   Returns:
12;       AL:     Drive Select Byte
13;   Corrupts registers:
14;       Nothing
15;--------------------------------------------------------------------
16ALIGN JUMP_ALIGN
17AccessDPT_GetDriveSelectByteToAL:
18    mov     al, [di+DPT.wFlags]
19    and     al, FLG_DRVNHEAD_LBA | FLG_DRVNHEAD_DRV
20    or      al, MASK_DRVNHEAD_SET   ; Bits set to 1 for old drives
21    ret
22
23
24;--------------------------------------------------------------------
25; AccessDPT_GetDeviceControlByteToAL
26;   Parameters:
27;       DS:DI:  Ptr to Disk Parameter Table
28;   Returns:
29;       AL:     Device Control Byte
30;   Corrupts registers:
31;       Nothing
32;--------------------------------------------------------------------
33ALIGN JUMP_ALIGN
34AccessDPT_GetDeviceControlByteToAL:
35    xor     al, al
36    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_ENABLE_IRQ
37    jnz     SHORT .EnableDeviceIrq
38    or      al, FLG_DEVCONTROL_nIEN ; Disable IRQ
39.EnableDeviceIrq:
40    ret
41
42       
43;--------------------------------------------------------------------
44; AccessDPT_GetLCHS
45;   Parameters:
46;       DS:DI:  Ptr to Disk Parameter Table
47;   Returns:
48;       AX:     Number of L-CHS sectors per track
49;       BX:     Number of L-CHS cylinders
50;       DX:     Number of L-CHS heads
51;   Corrupts registers:
52;       CX
53;--------------------------------------------------------------------
54AccessDPT_GetLCHS:
55    ; Load CHS from DPT
56    eMOVZX  ax, BYTE [di+DPT.bSectors]
57    mov     bx, [di+DPT.dwCylinders]
58    cwd
59    mov     dl, [di+DPT.bHeads]
60
61    ; Only need to limit sectors for LBA assist
62    test    BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA
63    jz      SHORT AccessDPT_ShiftPCHinBXDXtoLCH
64
65    cmp     WORD [di+DPT.dwCylinders+2], BYTE 0
66    jnz     SHORT .Return_MAX_LCHS_CYLINDERS
67
68    ; Limit cylinders to 1024
69    cmp     bx, MAX_LCHS_CYLINDERS
70    jb      SHORT .Return
71ALIGN JUMP_ALIGN
72.Return_MAX_LCHS_CYLINDERS:
73    mov     bx, MAX_LCHS_CYLINDERS
74ALIGN JUMP_ALIGN, ret
75.Return:
76    ret
77
78
79;--------------------------------------------------------------------
80; AccessDPT_ShiftPCHinBXDXtoLCH
81;   Parameters:
82;       BX:     P-CHS cylinders (1...16383)
83;       DX:     P-CHS heads (1...16)
84;   Returns:
85;       BX:     Number of L-CHS cylinders (1...1024)
86;       DX:     Number of L-CHS heads (1...255)
87;       CX:     Number of bits shifted
88;   Corrupts registers:
89;       Nothing
90;--------------------------------------------------------------------
91AccessDPT_ShiftPCHinBXDXtoLCH:
92    xor     cx, cx
93.ShiftLoop:
94    cmp     bx, MAX_LCHS_CYLINDERS      ; Need to shift?
95    jbe     SHORT .LimitHeadsTo255      ;  If not, return
96    inc     cx                          ; Increment shift count
97    shr     bx, 1                       ; Halve cylinders
98    shl     dx, 1                       ; Double heads
99    jmp     SHORT .ShiftLoop
100.LimitHeadsTo255:                       ; DOS does not support drives with 256 heads
101    sub     dl, dh                      ; DH set only when 256 logical heads
102    xor     dh, dh
103    ret
104
105       
106;--------------------------------------------------------------------
107; Returns pointer to DRVPARAMS for master or slave drive.
108;
109; AccessDPT_GetPointerToDRVPARAMStoCSBX
110;   Parameters:
111;       DS:DI:  Ptr to Disk Parameter Table
112;   Returns:
113;       CS:BX:  Ptr to DRVPARAMS
114;   Corrupts registers:
115;       Nothing
116;--------------------------------------------------------------------
117ALIGN JUMP_ALIGN
118AccessDPT_GetPointerToDRVPARAMStoCSBX:
119    eMOVZX  bx, [di+DPT.bIdevarsOffset]         ; CS:BX points to IDEVARS
120    add     bx, BYTE IDEVARS.drvParamsMaster    ; CS:BX points to Master Drive DRVPARAMS
121    test    BYTE [di+DPT.bFlagsLow], FLGL_DPT_SLAVE
122    jz      SHORT .ReturnPointerToDRVPARAMS
123    add     bx, BYTE DRVPARAMS_size             ; CS:BX points to Slave Drive DRVPARAMS
124.ReturnPointerToDRVPARAMS:
125    ret
Note: See TracBrowser for help on using the repository browser.