{ From: ALEX CHALFIN Subj: fast write } Procedure FastWrite(WX, WY : Integer; Var s); Assembler; Asm PUSH DS MOV AX,$B800 MOV ES,AX XOR DI,DI LDS SI,s { CALL WhereY } MOV AX,WY DEC AX MOV DX,160 IMUL DX PUSH AX XOR CX,CX {CALL WhereY } MOV AX,WY MOV BX,AX POP AX DEC BX SHL BX,1 ADD AX,BX MOV DI,AX XOR AX,AX LODSB MOV CX,AX MOV AH,TextAttr @Top: LODSB STOSW LOOP @Top POP DS End; { From: BOB SWART Subj: fast write } procedure FastWrite(Col,Row,Attr: Byte; Str: String); Assembler; ASM push DS { Save DS } mov CH,Row { CH = Row } mov BL,Col { BL = Column } { Set up ES:DI for LDS } xor AX,AX { AX = 0 } mov CL,AL { CL = 0 } mov BH,AL { BH = 0 } dec CH { convert to DOS 0..24 coords } 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 { convert to DOS 0..79 coords } shl BX,1 { Account for attribute bytes } add DI,BX { DI = (Row * 160) + (Col * 2) } add DI,0 { Add base address } mov ES,BaseOfScreen { ES:DI points to first Row,Col Attr } mov CL,CheckSnow { Need to wait? } lds SI,Str { DS:SI points to Str[0] } cld { Set direction to forward } lodsb { AX = Length(St); DS:SI -> Str[1] } xchg AX,CX { CX = Length; AL = CheckSnow } jcxz @Exit { exit if string empty } mov AH,Attr { AH = display attribute } rcr AL,1 { If CheckSnow is False... } jnc @NoWait { use "NoWait" routine } mov DX,CGAInfo { Point DX to CGA status port } @GetNext: lodsb { Load next character into AL } mov BX,AX { Store video word in BX } cli { hold interrupts } @WaitNoH: in AL,DX { get retrace situation } test AL,8 { retracing? } jnz @Go { If so, go } rcr AL,1 { Else, wait for end of } jc @WaitNoH { horizontal retrace } @WaitH: in AL,DX { get retrace situation } rcr AL,1 { Wait for horizontal } jnc @WaitH { retrace } @Go: mov AX,BX { Move word back to AX... } stosw { and then to screen } sti { OK to interrupt now } loop @GetNext { Get next character } jmp @Exit { wind up } @NoWait: lodsb { Load next character into AL } stosw { Move video word into place } loop @NoWait { Get next character } @Exit: pop DS { clean up and go home } end {FastWrite}; { From: JENS LARSSON Subj: fast write } Procedure WriteXY(x, y : Word; MsgText : String; ColorAttr : Byte); Assembler; Asm dec x dec y mov ax,y mov cl,5 shl ax,cl mov di,ax mov cl,2 shl ax,cl add di,ax shl x,1 add di,x mov ax,0b800h { 0b000h for mono } mov es,ax xor ch,ch push ds lds si,MsgText lodsb mov cl,al mov ah,ColorAttr jcxz @@End @@L1: lodsb stosw loop @@L1 @@End: pop ds End;