[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]
UNIT FastWrit;
INTERFACE
procedure FastWrite(Strng : String; Row, Col, Attr : Byte);
IMPLEMENTATION
VAR
BaseOfScreen : WORD;
procedure FastWrite(Strng : String; Row, Col, Attr : Byte); assembler;
asm
PUSH DS { ;Save DS }
MOV CH,Row { ;CH = Row }
MOV BL,Col { ;BL = Column }
XOR AX,AX { ;AX = 0 }
MOV CL,AL { ;CL = 0 }
MOV BH,AL { ;BH = 0 }
DEC CH { ;Row (in CH) to 0..24 range }
SHR CX,1 { ;CX = Row * 128 }
MOV DI,CX { ;Store in DI }
SHR DI,1 { ;DI = Row * 64 }
SHR DI,1 { ;DI = Row * 32 }
ADD DI,CX { ;DI = (Row * 160) }
DEC BX { ;Col (in BX) to 0..79 range }
SHL BX,1 { ;Account for attribute bytes }
ADD DI,BX { ;DI = (Row * 160) + (Col * 2) }
MOV ES,BaseOfScreen { ;ES:DI points to BaseOfScreen:Row,Col }
LDS SI,DWORD PTR [Strng] { ;DS:SI points to St[0] }
CLD { ;Set direction to forward }
LODSB { ;AX = Length(St); DS:SI -> St[1] }
XCHG AX,CX { ;CX = Length; AL = WaitForRetrace }
JCXZ @FWExit { ;If string empty, exit }
MOV AH,Attr { ;AH = Attribute }
@FWDisplay:
LODSB { ;Load next character into AL }
{ ; AH already has Attr }
STOSW { ;Move video word into place }
LOOP @FWDisplay { ;Get next character }
@FWExit:
POP DS { ;Restore DS }
end; {asm block}
BEGIN
ASM
mov BaseOfScreen,$B000
mov ax,$0F00
int $10
cmp al,2
je @XXX
cmp al,7
je @XXX
mov BaseOfScreen,$B800
@XXX :
end;
END.
[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]