home *** CD-ROM | disk | FTP | other *** search
- {
- > how do you write a string directly to the screen (the window is not always
- > 80 columns)?
-
- A "well behaved" direct screen write routine queries the number of columns on
- the screen as returned in the AH register after calling INT 10h, AH=0Fh.
- Multiply it by 2 times the number of the Y coordinate (zero-based) and add 2
- times the number of the X coordinate (zero-based too). This yields the
- offset into the video segment. The segment value is 0B000h if AL as returned
- by aforementioned call is 7, 0B800h otherwise. Use the SegB000 and SegB800
- selectors for DPMI apps.
-
- Example follows for DOS real mode. Note: doesn't perform "snow checking".
- }
-
- Var
- ScreenSeg : Word;
- ScreenWidth : Word;
- Columns : Word;
-
- Procedure WriteXY(x, y : Integer; attr : Byte; s : String); Assembler;
-
- ASM
- CLD
- PUSH DS
- MOV ES, [ScreenSeg] { get start address }
- MOV AX, [y]
- DEC AX
- IMUL [ScreenWidth]
- MOV DX, [x]
- DEC DX
- SHL DX, 1
- ADD AX, DX
- XCHG AX, DI
-
- MOV AH, [attr]
-
- LDS SI, [s] { load string to display }
- LODSB
- SUB CH, CH
- MOV CL, AL
- JCXZ @2
-
- @1:
- LODSB { loop - move to screen }
- STOSW
- LOOP @1
- @2:
- POP DS
- end;
-
- { unit's initialisation code... }
-
- Begin { Screen }
- ASM
- MOV AH, 0Fh
- INT 10h
- PUSH AX
- MOV AL, AH
- SUB AH, AH
- MOV [ScreenWidth], AX
- MOV [Columns], AX
- SHL [ScreenWidth], 1
- POP AX
- CMP AL, 7
- JNE @2
-
- MOV Byte Ptr [ScreenSeg+1], 0B0h
- JMP @4
-
- { deleted for brevity ... }
- @2:
- @4:
- end;
- end.