Category : Pascal Source Code
Archive   : TTT501-2.ZIP
Filename : FASTTTT5.ASM

 
Output of file : FASTTTT5.ASM contained in archive : TTT501-2.ZIP
;{--------------------------------------------------------------------------}
;{ TechnoJock's Turbo Toolkit }
;{ }
;{ Version 5.00 }
;{ }
;{ }
;{ Copyright 1986, 1989 TechnoJock Software, Inc. }
;{ All Rights Reserved }
;{ Restricted by License }
;{--------------------------------------------------------------------------}
; {--------------------------------}
; { OBJ: FastTTT5 }
; {--------------------------------}
;
;

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+ +
;+ This asm file contains 3 pascal procedures for +
;+ linking with TTT version 5.0. The procedures are: +
;+ +
;+ Fastwrite(X,Y,A,String) +
;+ PlainWrite(X,Y,String) +
;+ Attribute(X,Y,X,HowMany) +
;+ +
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+ +
;+ The main pascal unit includes three global variables. The +
;+ VSeg and Vofs indicate the active screen buffer - this may +
;+ or may not be the visible screen buffer so "snow" checking +
;+ is always performed. +
;+ +
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DATA SEGMENT BYTE PUBLIC

EXTRN VSeg : WORD
EXTRN Vofs : WORD
EXTRN SnowProne : BYTE

DATA ENDS


CODE SEGMENT BYTE PUBLIC

ASSUME CS:CODE,DS:DATA

PUBLIC FastWrite, PlainWrite, Attribute

;++++++++++++++++++++++++++++++++++++
;+ C A L M E M P O I N T E R +
;++++++++++++++++++++++++++++++++++++

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+ +
;+ CALCMEMPOINTER is a local procedure that is called by +
;+ Fastwrite, PlainWrite and Attribute. It places the segment +
;+ and offset of the first attribute, in ES:DI ready for an +
;+ LDS. Vseg and Vofs point to the first attribute of the +
;+ screen, the final location is computed by adding Row*160 +
;+ (80 attribs and 80 chars per row) and then adding 2*Col. +
;+ The passed Row and Column are decremented by one to fit +
;+ with DOS's 0..79, 0..24 coordinate system. +
;+ +
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Calcmempointer PROC NEAR

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,Vofs ;Add base address
MOV ES,Vseg ;ES:DI points to first Row,Col attribute
RET ;Return

Calcmempointer ENDP


;++++++++++++++++++++++++++++
;+ F A S T W R I T E +
;++++++++++++++++++++++++++++

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+ +
;+ Why fastwrite. Normal BIOS services are too slow writing +
;+ to the screen. Even Turbo write procs are not as fast as +
;+ we need - especially on snow-prone systems. +
;+ +
;+ Basic Process: Save stack state +
;+ Repeat +
;+ Set ES:DI with target memory address +
;+ Load source with LODSB +
;+ Check for vertical retrace if necessary +
;+ and store the character in target +
;+ with STOSW +
;+ Until no more chracters +
;+ +
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; Turbo passed parameters

FWSt EQU DWORD PTR [BP+6]
FWAttr EQU BYTE PTR [BP+10]
FWRow EQU BYTE PTR [BP+12]
FWCol EQU BYTE PTR [BP+14]

FastWrite PROC FAR

PUSH BP ;Save BP
MOV BP,SP ;Set up stack frame
PUSH DS ;Save DS
MOV CH,FWRow ;CH = Row
MOV BL,FWCol ;BL = Column
CALL Calcmempointer ;Set up ES:DI for LDS
MOV CL,SnowProne ;Need to wait?
LDS SI,FWSt ;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 ;exit if string empty
MOV AH,FWAttr ;AH = display attribute
RCR AL,1 ;If WaitForRetrace is False...
JNC FWMono ; use "FWMono" routine
MOV DX,03DAh ;Point DX to CGA status port
FWGetNext:
LODSB ;Load next character into AL
MOV BX,AX ;Store video word in BX
CLI ;hold interrupts
FWWaitNoH:
IN AL,DX ;get retrace situation
TEST AL,8 ;retracing?
JNZ FWStore ;If so, go
RCR AL,1 ;Else, wait for end of
JC FWWaitNoH ; horizontal retrace
FWWaitH:
IN AL,DX ;get retrace situation
RCR AL,1 ;Wait for horizontal
JNC FWWaitH ; retrace
FWStore:
MOV AX,BX ;Move word back to AX...
STOSW ; and then to screen
STI ;OK to interrupt now
LOOP FWGetNext ;Get next character
JMP FWExit ;wind up
FWMono:
LODSB ;Load next character into AL
STOSW ;Move video word into place
LOOP FWMono ;Get next character
FWExit:
POP DS ;clean up and go home
MOV SP,BP ;
POP BP ;
RET 10 ;

FastWrite ENDP


;+++++++++++++++++++++++++++++++
;+ P L A I N W R I T E +
;+++++++++++++++++++++++++++++++

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+ +
;+ Uses same concept as Fastwrite but doesn't affect current +
;+ display attribute. +
;+ +
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; Turbo passed parameters

PWSt EQU DWORD PTR [BP+6]
PWRow EQU BYTE PTR [BP+10]
PWCol EQU BYTE PTR [BP+12]

PlainWrite PROC FAR

PUSH BP ;Save BP
MOV BP,SP ;Set up stack frame
PUSH DS ;Save DS
MOV CH,PWRow ;CH = Row
MOV BL,PWCol ;BL = Column
CALL Calcmempointer ;Set up ES:DI for LDS
MOV CL,Snowprone ;Need to wait?
LDS SI,PWSt ;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 = Wait
JCXZ PWExit ;exit if string empty
RCR AL,1 ;If WaitForRetrace is False...
JNC PWNoWait ; use PWNoWait routine
MOV DX,03DAh ;Point DX to CGA status port
PWGetNext:
LODSB ;Load next character into AL
MOV AH,AL ;Store char in AH
CLI ;hold interrupts
PWWaitNoH:
IN AL,DX ; get retrace situation
TEST AL,8 ;Check for vertical retrace
JNZ PWStore ; In progress? go
RCR AL,1 ;Else, wait for end of
JC PWWaitNoH ; horizontal retrace
PWWaitH:
IN AL,DX ;Get 6845 status again
RCR AL,1 ;Wait for horizontal
JNC PWWaitH ; retrace
PWStore:
MOV AL,AH ;Move char back to AL...
STOSB ; and then to screen
STI ;OK to interrupt now
INC DI ;Skip attribute bytes
LOOP PWGetNext ;Get next character
JMP PWExit ;Done
PWNoWait:
MOVSB ;Move character to screen
INC DI ;Skip attribute bytes
LOOP PWNoWait ;Get next character
PWExit:
POP DS ;Clean up and go home
MOV SP,BP ;
POP BP ;
RET 8 ;

PlainWrite ENDP

;+++++++++++++++++++++++++++++++
;+ A T T R I B U T E +
;+++++++++++++++++++++++++++++++

;++++++++++++++++++++++++++++++++++++++
;+ +
;+ Changes the display attribute +
;+ +
;++++++++++++++++++++++++++++++++++++++

; Turbo passed parameters

ANumber EQU WORD PTR [BP+6]
AAttr EQU BYTE PTR [BP+8]
ARow EQU BYTE PTR [BP+10]
ACol EQU BYTE PTR [BP+12]

Attribute PROC FAR

PUSH BP ;Save BP
MOV BP,SP ;Set up stack frame
MOV CH,ARow ;CH = Row
MOV BL,ACol ;BL = Column
CALL Calcmempointer ;Call routine to calculate offset
INC DI ;Skip character
CLD ;Set direction to forward
MOV CX,ANumber ;CX = Number to change
JCXZ AExit ;If zero, exit
MOV AL,AAttr ;AL = Attribute
CMP SnowProne,1 ;Get wait state
JNE ANoWait ;If WaitForRetrace is False
; use ANoWait routine
MOV AH,AL ;Store attribute in AH
MOV DX,03DAh ;Point DX to CGA status port
AGetNext:
CLI ;No interrupts now
AWaitNoH:
IN AL,DX ;get retrace situation
TEST AL,8 ;check for vertical retrace
JNZ AGo ;In progress? Go
RCR AL,1 ;Wait for end of horizontal
JC AWaitNoH ; retrace
AWaitH:
IN AL,DX ; get retrace situation
RCR AL,1 ;Wait for horizontal
JNC AWaitH ; retrace
AGo:
MOV AL,AH ;Move Attr back to AL...
STOSB ; and then to screen
STI ;Allow interrupts
INC DI ;Skip characters
LOOP AGetNext ;Look for next opportunity
JMP AExit ;Done
ANoWait:
STOSB ;Change the attribute
INC DI ;Skip characters
LOOP ANoWait ;Get next character
AExit: ;
MOV SP,BP ;Clean up and go home
POP BP ;
RET 8 ;

Attribute ENDP

CODE ENDS

END


  3 Responses to “Category : Pascal Source Code
Archive   : TTT501-2.ZIP
Filename : FASTTTT5.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/