aboutsummaryrefslogtreecommitdiff
path: root/board/MAI/bios_emulator/scitech/src/pm/os2/_pmos2.asm
blob: 761f0f42e1ead0d4b27435c04441d5139c96752f (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
;****************************************************************************
;*
;*                  SciTech OS Portability Manager Library
;*
;*  ========================================================================
;*
;*    The contents of this file are subject to the SciTech MGL Public
;*    License Version 1.0 (the "License"); you may not use this file
;*    except in compliance with the License. You may obtain a copy of
;*    the License at http://www.scitechsoft.com/mgl-license.txt
;*
;*    Software distributed under the License is distributed on an
;*    "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
;*    implied. See the License for the specific language governing
;*    rights and limitations under the License.
;*
;*    The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
;*
;*    The Initial Developer of the Original Code is SciTech Software, Inc.
;*    All Rights Reserved.
;*
;*  ========================================================================
;*
;* Language:    80386 Assembler, TASM 4.0 or NASM
;* Environment: OS/2 32 bit protected mode
;*
;* Description: Low level assembly support for the PM library specific
;*              to OS/2
;*
;****************************************************************************

        IDEAL

include "scitech.mac"               ; Memory model macros

header      _pmos2                  ; Set up memory model

begdataseg  _pmos2

        cglobal _PM_ioentry
        cglobal _PM_gdt
_PM_ioentry     dd  0               ; Offset to call gate
_PM_gdt         dw  0               ; Selector to call gate

enddataseg  _pmos2

begcodeseg  _pmos2                  ; Start of code segment

;----------------------------------------------------------------------------
; int PM_setIOPL(int iopl)
;----------------------------------------------------------------------------
; Change the IOPL level for the 32-bit task. Returns the previous level
; so it can be restored for the task correctly.
;----------------------------------------------------------------------------
cprocstart  PM_setIOPL

        ARG     iopl:UINT

        enter_c
        pushfd                      ; Save the old EFLAGS for later
        mov     ecx,[iopl]          ; ECX := IOPL level
        xor     ebx,ebx             ; Change IOPL level function code (0)
ifdef   USE_NASM
        call far dword [_PM_ioentry]
else
        call    [FWORD _PM_ioentry]
endif
        pop     eax
        and     eax,0011000000000000b
        shr     eax,12
        leave_c
        ret

cprocend

;----------------------------------------------------------------------------
; void _PM_setGDTSelLimit(ushort selector, ulong limit);
;----------------------------------------------------------------------------
; Change the GDT selector limit to given value. Used to change selector
; limits to address the entire system address space.
;----------------------------------------------------------------------------
cprocstart  _PM_setGDTSelLimit

        ARG     selector:USHORT, limit:UINT
        
        enter_c
        sub     esp,20              ; Make room for selector data on stack
        mov     ecx,esp             ; ECX := selector data structure
        mov     bx,[selector]       ; Fill out the data structure
        and     bx,0FFF8h           ; Kick out the LDT/GDT and DPL bits     
        mov     [WORD ecx],bx
        mov     ebx,[limit]
        mov     [DWORD ecx+4],ebx
        mov     ebx,5               ; Set GDT selector limit function code      
ifdef   USE_NASM
        call far dword [_PM_ioentry]
else
        call    [FWORD _PM_ioentry]
endif
        add     esp,20
        leave_c
        ret

cprocend    

;----------------------------------------------------------------------------
; uchar _MTRR_getCx86(uchar reg);
;----------------------------------------------------------------------------
; Read a Cyrix CPU indexed register
;----------------------------------------------------------------------------
cprocstart  _MTRR_getCx86

        ARG     reg:UCHAR

        enter_c
        mov     al,[reg]
        out     22h,al
        in      al,23h
        leave_c
        ret

cprocend

;----------------------------------------------------------------------------
; uchar _MTRR_setCx86(uchar reg,uchar val);
;----------------------------------------------------------------------------
; Write a Cyrix CPU indexed register
;----------------------------------------------------------------------------
cprocstart  _MTRR_setCx86

        ARG     reg:UCHAR, val:UCHAR

        enter_c
        mov     al,[reg]
        out     22h,al
        mov     al,[val]
        out     23h,al
        leave_c
        ret

cprocend

;----------------------------------------------------------------------------
; ulong _MTRR_disableInt(void);
;----------------------------------------------------------------------------
; Return processor interrupt status and disable interrupts.
;----------------------------------------------------------------------------
cprocstart  _MTRR_disableInt

; Do nothing!
        ret

cprocend

;----------------------------------------------------------------------------
; void _MTRR_restoreInt(ulong ps);
;----------------------------------------------------------------------------
; Restore processor interrupt status.
;----------------------------------------------------------------------------
cprocstart  _MTRR_restoreInt

; Do nothing!
        ret

cprocend

;----------------------------------------------------------------------------
; void DebugInt(void)
;----------------------------------------------------------------------------
cprocstart  DebugInt

        int     3
        ret

cprocend

endcodeseg  _pmos2

        END                         ; End of module