|
|
1.1 ! root 1: TITLE CURSOR ! 2: ! 3: ; This file exports the function _GetCurLoc which gets the location ! 4: ; of the cursor on the CRT screen. ! 5: ; ! 6: ; This routine illustrates the use of the DosPortAccess() call. This ! 7: ; call is supposed to give the IOPL segment access to ports and CLI/STI ! 8: ; instructions. In fact, on the PC/AT (80286) there is no enforcement. ! 9: ; This call is provided for future compatibility with the 80386. ! 10: ; At present, the use of DosPortAccess() from an IOPL segment is not ! 11: ; supported (the calls are commented out here) but will be in the future. ! 12: ; The form and placement of these calls is indicated here as a guide ! 13: ; to future usage. ! 14: ; ! 15: ; One thing to beware of: if you disable interrupts (CLI) they may be ! 16: ; re-enabled for you by the operating system. This will occur if you ! 17: ; generate a fault of some sort. The easiest example is a segment not ! 18: ; present fault. When the segment is loaded and your code starts to ! 19: ; execute the interrupts will be enabled. The solution is simple: don't ! 20: ; load any selectors within the CLI/STI code. ! 21: ; ! 22: ; Any other fault will cause your process to be booted (i.e. GP fault). ! 23: ; ! 24: .286p ! 25: ! 26: _TEXT2 SEGMENT BYTE PUBLIC 'CODE' ! 27: _TEXT2 ENDS ! 28: _DATA SEGMENT WORD PUBLIC 'DATA' ! 29: _DATA ENDS ! 30: CONST SEGMENT WORD PUBLIC 'CONST' ! 31: CONST ENDS ! 32: _BSS SEGMENT WORD PUBLIC 'BSS' ! 33: _BSS ENDS ! 34: ! 35: DGROUP GROUP CONST, _BSS, _DATA ! 36: ! 37: ; EXTRN DOSPORTACCESS:FAR ! 38: ! 39: ASSUME CS: _TEXT2, DS: DGROUP, SS: DGROUP, ES: DGROUP ! 40: ! 41: _TEXT2 SEGMENT ! 42: ! 43: PORT1 EQU 3D4h ! 44: PORT2 EQU 3D5h ! 45: CURSOR_H EQU 14 ; cursor location HIGH register ! 46: CURSOR_L EQU 15 ; cursor location LOW register ! 47: ACCESSREQ EQU 0 ; request access to port(s) ! 48: ACCESSREL EQU 1 ; release access to port(s) ! 49: ! 50: ;** _GetCurLoc - gets cursor location on the CRT screen ! 51: ; ! 52: ; ENTRY NONE ! 53: ; ! 54: ; EXIT (AX) = cursor location ! 55: ; ! 56: ; USES AX, BX, DX ! 57: ! 58: PUBLIC _GetCurLoc ; gets cursor location on CRT screen ! 59: ! 60: _GetCurLoc PROC FAR ! 61: ! 62: ; push 0 ; RESERVED WORD ! 63: ; push ACCESSREQ ; request access to port(s) ! 64: ; push PORT1 ! 65: ; push PORT2 ! 66: ; call DOSPORTACCESS ; request access to ports PORT1, PORT2 ! 67: ! 68: mov ax,CURSOR_H ; address of register we want to read from ! 69: call ReadLoc ; gets cursor location (H) in AL ! 70: mov bh,al ; (BH) = cursor location (H) ! 71: ! 72: mov ax,CURSOR_L ; address of register we want to read from ! 73: call ReadLoc ; gets cursor location (L) in AL ! 74: mov ah,bh ; (AH) = cursor location (H) ! 75: ! 76: push ax ; save cursor location ! 77: ; push 0 ; RESERVED WORD ! 78: ; push ACCESSREL ; release access to port(s) ! 79: ; push PORT1 ! 80: ; push PORT2 ! 81: ; call DOSPORTACCESS ; release access to ports PORT1, PORT2 ! 82: pop ax ; restore cursor location ! 83: ! 84: ret ! 85: _GetCurLoc ENDP ! 86: ! 87: ;* ReadLoc - reads cursor location on the CRT screen ! 88: ; ! 89: ; ENTRY (AX) = address of register to read from ! 90: ; ! 91: ; EXIT (AL) = cursor location read ! 92: ; ! 93: ; USES AX,DX ! 94: ! 95: ReadLoc PROC NEAR ! 96: cli ! 97: mov dx,PORT1 ; set address we want to output to ! 98: out dx,al ! 99: jmp $+2 ; PC/AT IO delay ! 100: mov dx,PORT2 ; set address we want to read from ! 101: in al,dx ; read cursor location ! 102: sti ! 103: ret ! 104: ReadLoc ENDP ! 105: ! 106: _TEXT2 ENDS ! 107: ! 108: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.