|
|
1.1 root 1: title "Cirrus Logic ASM routines"
2: ;
3:
4: ;ONE_64K_BANK equ 1
5: TWO_32K_BANKS equ 1
6:
7: ;++
8: ;
9: ; Copyright (c) 1992 Microsoft Corporation
10: ;
11: ; Module Name:
12: ;
13: ; vgahard.asm
14: ;
15: ; Abstract:
16: ;
17: ; This module implements the banding code for the Cirrus Logic 6410,6420
18: ; and 542x VGA's.
19: ;
20: ; Environment:
21: ;
22: ; Kernel mode only.
23: ;
24: ; Revision History:
25: ;
26: ;
27: ;--
28:
29: .386p
30: .xlist
31: include callconv.inc
32: .list
33:
34: ;----------------------------------------------------------------------------
35: ;
36: ; Cirrus Logic banking control ports.
37: ;
38: GRAPHICS_ADDRESS_PORT equ 03ceh ;banking control here
39: CL6420_BANKING_INDEX_PORT_A equ 0eh ;banking index register A is GR0E
40: CL6420_BANKING_INDEX_PORT_B equ 0fh ;banking index register B is GR0F
41: CL542x_BANKING_INDEX_PORT_A equ 09h ;banking index register A is GR09
42: CL542x_BANKING_INDEX_PORT_B equ 0ah ;banking index register B is GR0A
43:
44: SEQ_ADDRESS_PORT equ 03C4h ;Sequencer Address register
45: IND_MEMORY_MODE equ 04h ;Memory Mode reg. index in Sequencer
46: CHAIN4_MASK equ 08h ;Chain4 bit in Memory Mode register
47:
48: ;----------------------------------------------------------------------------
49:
50: _TEXT SEGMENT DWORD USE32 PUBLIC 'CODE'
51: ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
52: ;
53: ; Bank switching code. This is a 1-64K-read/1-64K-write bank adapter
54: ; (VideoBanked1R1W).
55: ;
56: ; Input:
57: ; EAX = desired read bank mapping
58: ; EDX = desired write bank mapping
59: ;
60: ; Note: values must be correct, with no stray bits set; no error
61: ; checking is performed.
62: ;
63: public _CL64xxBankSwitchStart
64: public _CL64xxBankSwitchEnd
65: public _CL64xxPlanarHCBankSwitchStart
66: public _CL64xxPlanarHCBankSwitchEnd
67: public _CL64xxEnablePlanarHCStart
68: public _CL64xxEnablePlanarHCEnd
69: public _CL64xxDisablePlanarHCStart
70: public _CL64xxDisablePlanarHCEnd
71:
72: public _CL542xBankSwitchStart
73: public _CL542xBankSwitchEnd
74: public _CL542xPlanarHCBankSwitchStart
75: public _CL542xPlanarHCBankSwitchEnd
76: public _CL542xEnablePlanarHCStart
77: public _CL542xEnablePlanarHCEnd
78: public _CL542xDisablePlanarHCStart
79: public _CL542xDisablePlanarHCEnd
80:
81: align 4
82:
83: ;---------------------------------------------------------------------------
84: ; two versions of banking code are given here, one for 1RW 64k bank, and
85: ; one for 2 32K RW banks. We will check out both implementations and see
86: ; which is faster performance-wise.
87:
88: IFDEF ONE_64K_BANK
89: _CL64xxBankSwitchStart proc ;start of bank switch code
90: _CL64xxPlanarHCBankSwitchStart: ;start of planar HC bank switch code,
91: ; which is the same code as normal
92: ; bank switching
93: ; shl eax,4 ;shift them to bits 7-4
94: ; mov ah,al
95: ; mov al,CL6420_BANKING_INDEX_PORT_A
96: ; mov dx,GRAPHICS_ADDRESS_PORT ;banking control port
97: ; out dx,ax ;select the banks
98:
99: shl eax,4 ;shift them to bits 7-4
100: mov ah,al
101: mov dx,GRAPHICS_ADDRESS_PORT ;banking control port
102: in al,dx
103: push eax ; save index
104: mov al,CL6420_BANKING_INDEX_PORT_A
105: out dx,ax ;select the banks
106:
107: pop eax ; restore index
108: out dx,al
109: ret
110:
111: _CL64xxBankSwitchEnd:
112: _CL64xxPlanarHCBankSwitchEnd:
113:
114: align 4
115: _CL64xxEnablePlanarHCStart:
116: mov dx,SEQ_ADDRESS_PORT
117: in al,dx
118: push eax ;preserve the state of the Seq Address
119: mov al,IND_MEMORY_MODE
120: out dx,al ;point to the Memory Mode register
121: inc edx
122: in al,dx ;get the state of the Memory Mode reg
123: and al,NOT CHAIN4_MASK ;turn off Chain4 to make memory planar
124: out dx,al
125: dec edx
126: pop eax
127: out dx,al ;restore the original Seq Address
128:
129: ERA1_INDEX equ 0A1h
130:
131: mov dx,GRAPHICS_ADDRESS_PORT
132: in al,dx
133: push eax ;preserve the Graphics Index
134: mov al,ERA1_INDEX
135: out dx,al ;point to ERA1
136: inc edx
137: in al,dx ; get ERA1
138: and al,not 30h ; turn off the shift bits
139: out dx,al
140: dec edx
141: pop eax
142: out dx,al ;restore the original Graphics Index
143:
144: ret
145:
146: _CL64xxEnablePlanarHCEnd:
147:
148: align 4
149: _CL64xxDisablePlanarHCStart:
150: mov dx,SEQ_ADDRESS_PORT
151: in al,dx
152: push eax ;preserve the state of the Seq Address
153: mov al,IND_MEMORY_MODE
154: out dx,al ;point to the Memory Mode register
155: inc edx
156: in al,dx ;get the state of the Memory Mode reg
157: or al,CHAIN4_MASK ;turn on Chain4 to make memory linear
158: out dx,al
159: dec edx
160: pop eax
161: out dx,al ;restore the original Seq Address
162:
163: mov dx,GRAPHICS_ADDRESS_PORT
164: in al,dx
165: push eax ;preserve the Graphics Index
166: mov al,ERA1_INDEX
167: out dx,al ;point to ERA1
168: inc edx
169: in al,dx ; get ERA1
170: and al,not 30h
171: or al,20h
172: out dx,al
173: dec edx
174: pop eax
175: out dx,al ;restore the original Graphics Index
176: ret
177:
178: _CL64xxDisablePlanarHCEnd:
179:
180: ;
181: ;
182: _CL64xxBankSwitchStart endp
183:
184: nop
185: align 4
186: _CL542xBankSwitchStart proc ;start of bank switch code
187: _CL542xPlanarHCBankSwitchStart: ;start of planar HC bank switch code,
188: ; which is the same code as normal
189: ; bank switching
190: shl eax,4 ;shift them to bits 7-4
191: mov ah,al
192: mov dx,GRAPHICS_ADDRESS_PORT ;banking control port
193: in al,dx
194: push eax
195: mov al,CL542x_BANKING_INDEX_PORT_A
196: out dx,ax ;select the banks
197: pop eax ; restore index
198: out dx,al
199:
200: ret
201:
202: _CL542xBankSwitchEnd:
203: _CL542xPlanarHCBankSwitchEnd:
204:
205: align 4
206: _CL542xEnablePlanarHCStart:
207: mov dx,SEQ_ADDRESS_PORT
208: in al,dx
209: push eax ;preserve the state of the Seq Address
210: mov al,IND_MEMORY_MODE
211: out dx,al ;point to the Memory Mode register
212: inc edx
213: in al,dx ;get the state of the Memory Mode reg
214: and al,NOT CHAIN4_MASK ;turn off Chain4 to make memory planar
215: out dx,al
216: dec edx
217: pop eax
218: out dx,al ;restore the original Seq Address
219: ret
220:
221: _CL542xEnablePlanarHCEnd:
222:
223: align 4
224: _CL542xDisablePlanarHCStart:
225: mov dx,SEQ_ADDRESS_PORT
226: in al,dx
227: push eax ;preserve the state of the Seq Address
228: mov al,IND_MEMORY_MODE
229: out dx,al ;point to the Memory Mode register
230: inc edx
231: in al,dx ;get the state of the Memory Mode reg
232: or al,CHAIN4_MASK ;turn on Chain4 to make memory linear
233: out dx,al
234: dec edx
235: pop eax
236: out dx,al ;restore the original Seq Address
237: ret
238:
239: _CL542xDisablePlanarHCEnd:
240:
241: _CL542xBankSwitchStart endp
242:
243: ENDIF ;ONE_64K_BANK
244: ;----------------------------------------------------------------------------
245: IFDEF TWO_32K_BANKS
246: _CL64xxBankSwitchStart proc ;start of bank switch code
247: _CL64xxPlanarHCBankSwitchStart: ;start of planar HC bank switch code,
248: ; which is the same code as normal
249: ; bank switching
250: shl eax,3 ;shift them to bits 7-4
251: shl edx,3 ;shift them to bits 7-4
252: ;!!!! NOTE: The October 1992 release NT VGA driver assumes that the Graphics
253: ; index is not changed by the bank switch code. We save it on the
254: ; stack (and save the write bank value in the high order of edx)
255: ; and restore it at the end of the routine. If the NT VGA driver
256: ; changes so that it is the index need not be preserved, this code
257: ; could be simplified (and speeded up!)
258: rol edx,16 ; save write value
259: mov ah,al
260: mov dx,GRAPHICS_ADDRESS_PORT ;banking control port
261: in al,dx ; save graphics index
262: push eax
263: mov al,CL6420_BANKING_INDEX_PORT_A
264: out dx,ax ;select the READ bank
265: rol edx,16
266: mov ah,dl
267: mov al,CL6420_BANKING_INDEX_PORT_B
268: mov dx,GRAPHICS_ADDRESS_PORT ;banking control port
269: out dx,ax ;select the WRITE bank
270: pop eax
271: out dx,al
272:
273: ret
274:
275: _CL64xxBankSwitchEnd:
276: _CL64xxPlanarHCBankSwitchEnd:
277:
278: align 4
279: _CL64xxEnablePlanarHCStart:
280: mov dx,SEQ_ADDRESS_PORT
281: in al,dx
282: push eax ;preserve the state of the Seq Address
283: mov al,IND_MEMORY_MODE
284: out dx,al ;point to the Memory Mode register
285: inc edx
286: in al,dx ;get the state of the Memory Mode reg
287: and al,NOT CHAIN4_MASK ;turn off Chain4 to make memory planar
288: out dx,al
289: dec edx
290: pop eax
291: out dx,al ;restore the original Seq Address
292:
293: ERA1_INDEX equ 0A1h
294:
295: mov dx,GRAPHICS_ADDRESS_PORT
296: in al,dx
297: push eax ;preserve the Graphics Index
298: mov al,ERA1_INDEX
299: out dx,al ;point to ERA1
300: inc edx
301: in al,dx ; get ERA1
302: and al,not 30h ; turn off the shift bits
303: out dx,al
304: dec edx
305: pop eax
306: out dx,al ;restore the original Graphics Index
307: ret
308:
309: _CL64xxEnablePlanarHCEnd:
310:
311: align 4
312: _CL64xxDisablePlanarHCStart:
313: mov dx,SEQ_ADDRESS_PORT
314: in al,dx
315: push eax ;preserve the state of the Seq Address
316: mov al,IND_MEMORY_MODE
317: out dx,al ;point to the Memory Mode register
318: inc edx
319: in al,dx ;get the state of the Memory Mode reg
320: or al,CHAIN4_MASK ;turn on Chain4 to make memory linear
321: out dx,al
322: dec edx
323: pop eax
324: out dx,al ;restore the original Seq Address
325:
326: mov dx,GRAPHICS_ADDRESS_PORT
327: in al,dx
328: push eax ;preserve the Graphics Index
329: mov al,ERA1_INDEX
330: out dx,al ;point to ERA1
331: inc edx
332: in al,dx ; get ERA1
333: and al,not 30h
334: or al,20h
335: out dx,al
336: dec edx
337: pop eax
338: out dx,al ;restore the original Graphics Index
339: ret
340:
341: _CL64xxDisablePlanarHCEnd:
342:
343: _CL64xxBankSwitchStart endp
344:
345:
346: _CL542xBankSwitchStart proc ;start of bank switch code
347: _CL542xPlanarHCBankSwitchStart: ;start of planar HC bank switch code,
348: ; which is the same code as normal
349: ; bank switching
350: shl eax,3 ;shift them to bits 7-4
351: shl edx,3 ;shift them to bits 7-4
352: ;!!!! NOTE: The October 1992 release NT VGA driver assumes that the Graphics
353: ; index is not changed by the bank switch code. We save it on the
354: ; stack (and save the write bank value in the high order of edx)
355: ; and restore it at the end of the routine. If the NT VGA driver
356: ; changes so that it is the index need not be preserved, this code
357: ; could be simplified (and speeded up!)
358: rol edx,16 ; save write value
359: mov ah,al
360: mov dx,GRAPHICS_ADDRESS_PORT ;banking control port
361: in al,dx
362: push eax
363: mov al,CL542x_BANKING_INDEX_PORT_A
364: out dx,ax ;select the READ bank
365:
366: rol edx,16 ; restore write value
367: mov ah,dl
368: mov al,CL542x_BANKING_INDEX_PORT_B
369: mov dx,GRAPHICS_ADDRESS_PORT ;banking control port
370: out dx,ax ;select the WRITE bank
371: pop eax
372: out dx,al
373:
374: ret
375:
376: _CL542xBankSwitchEnd:
377: _CL542xPlanarHCBankSwitchEnd:
378:
379: align 4
380: _CL542xEnablePlanarHCStart:
381: mov dx,SEQ_ADDRESS_PORT
382: in al,dx
383: push eax ;preserve the state of the Seq Address
384: mov al,IND_MEMORY_MODE
385: out dx,al ;point to the Memory Mode register
386: inc edx
387: in al,dx ;get the state of the Memory Mode reg
388: and al,NOT CHAIN4_MASK ;turn off Chain4 to make memory planar
389: out dx,al
390: dec edx
391: pop eax
392: out dx,al ;restore the original Seq Address
393: ret
394:
395: _CL542xEnablePlanarHCEnd:
396:
397: align 4
398: _CL542xDisablePlanarHCStart:
399: mov dx,SEQ_ADDRESS_PORT
400: in al,dx
401: push eax ;preserve the state of the Seq Address
402: mov al,IND_MEMORY_MODE
403: out dx,al ;point to the Memory Mode register
404: inc edx
405: in al,dx ;get the state of the Memory Mode reg
406: or al,CHAIN4_MASK ;turn on Chain4 to make memory linear
407: out dx,al
408: dec edx
409: pop eax
410: out dx,al ;restore the original Seq Address
411: ret
412:
413: _CL542xDisablePlanarHCEnd:
414:
415:
416: _CL542xBankSwitchStart endp
417:
418: ENDIF ;TWO_32K_BANKS
419:
420: _TEXT ends
421: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.