home *** CD-ROM | disk | FTP | other *** search
-
- ; TechnoJocks Turbo Toolkit v4.0
- ; Display Routines : included in UNIT WinTTT
- ; Copyright (c) R. D. Ainsbury 1986, 1987
- ;
- ; Credit: Brian Foley
-
- ;****************************************************** Data
-
- DATA SEGMENT BYTE PUBLIC
-
- EXTRN BaseOfScreen : WORD ;Pascal variables
- EXTRN WaitForRetrace : BYTE
-
- ; CurrentMode DB ? ;local variables
- ; Display DB ?
-
- DATA ENDS
-
- ;****************************************************** Code
-
- CODE SEGMENT BYTE PUBLIC
-
- ASSUME CS:CODE,DS:DATA
-
- PUBLIC Attribute, MoveFromScreen, MoveToScreen
-
- ;****************************************************** CalcOffset
-
- ;Calculates offset in video memory corresponding to Row,Column
- ;On entry, CH has Row, BX has Column (both 1-based)
- ;On exit, ES:DI points to proper address in video memory, AX = 0
-
- CalcOffset PROC NEAR
-
- 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
- RET ;Return
-
- CalcOffset ENDP
-
- ;****************************************************** ChangeAttribute
-
- ;procedure Attribute(Col,Row,Attr:byte;Number : Word);
- ;Change Number video attributes to Attr starting at Row,Col
-
- ;equates for 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 CalcOffset ;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 WaitForRetrace,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 6845 status
- TEST AL,8 ;Check for vert. retrace
- JNZ AGo ;In progress? Go
- RCR AL,1 ;Wait for end of horizontal
- JC AWaitNoH ; retrace
- AWaitH:
- IN AL,DX ;Get 6845 status again
- 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: ;Next instruction
- MOV SP,BP ;Restore SP
- POP BP ;Restore BP
- RET 8 ;Remove parameters and return
-
- Attribute ENDP
-
- ;****************************************************** MoveFromScreen
-
- ;procedure MoveFromScreen(var Source, Dest; Length : Word);
- ;Move Length words from Source (video memory) to Dest without snow
-
- ;equates for parameters:
- MFLength EQU WORD PTR [BP+6]
- MFDest EQU DWORD PTR [BP+8]
- MFSource EQU DWORD PTR [BP+12]
-
- MoveFromScreen PROC FAR
-
- PUSH BP ;Save BP
- MOV BP,SP ;Set up stack frame
- MOV BX,DS ;Save DS in BX
- MOV AL,WaitForRetrace ;Grab before changing DS
- LES DI,MFDest ;ES:DI points to Dest
- LDS SI,MFSource ;DS:SI points to Source
- MOV CX,MFLength ;CX = Length
- CLD ;Set direction to forward
- RCR AL,1 ;Check WaitForRetrace
- JNC MFNoWait ;False? Use MFNoWait routine
- MOV DX,03DAh ;Point DX to CGA status port
- MFNext:
- CLI ;No interrupts now
- MFWaitNoH:
- IN AL,DX ;Get 6845 status
- TEST AL,8 ;Check for vertical retrace
- JNZ MFGo ;In progress? go
- RCR AL,1 ;Wait for end of horizontal
- JC MFWaitNoH ; retrace
- MFWaitH:
- IN AL,DX ;Get 6845 status again
- RCR AL,1 ;Wait for horizontal
- JNC MFWaitH ; retrace
- MFGo:
- LODSW ;Load next video word into AX
- STI ;Allow interrupts
- STOSW ;Store video word in Dest
- LOOP MFNext ;Get next video word
- JMP MFExit ;All Done
- MFNoWait:
- REP MOVSW ;That's it!
- MFExit:
- MOV DS,BX ;Restore DS
- MOV SP,BP ;Restore SP
- POP BP ;Restore BP
- RET 10 ;Remove parameters and return
-
- MoveFromScreen ENDP
-
- ;****************************************************** MoveToScreen
-
- ;procedure MoveToScreen(var Source, Dest; Length : Word);
- ;Move Length words from Source to Dest (video memory) without snow
-
- ;equates for parameters:
- MTLength EQU WORD PTR [BP+6]
- MTDest EQU DWORD PTR [BP+8]
- MTSource EQU DWORD PTR [BP+12]
-
- MoveToScreen PROC FAR
-
- PUSH BP ;Save BP
- MOV BP,SP ;Set up stack frame
- PUSH DS ;Save DS
- MOV AL,WaitForRetrace ;Grab before changing DS
- LES DI,MTDest ;ES:DI points to Dest
- LDS SI,MTSource ;DS:SI points to Source
- MOV CX,MTLength ;CX = Length
- CLD ;Set direction to forward
- RCR AL,1 ;Check WaitForRetrace
- JNC MTNoWait ;False? Use MTNoWait routine
- MOV DX,03DAh ;Point DX to CGA status port
- MTGetNext:
- LODSW ;Load next video word into AX
- MOV BX,AX ;Store video word in BX
- CLI ;No interrupts now
- MTWaitNoH:
- IN AL,DX ;Get 6845 status
- TEST AL,8 ;Check for vertical retrace
- JNZ MTGo ;In progress? Go
- RCR AL,1 ;Wait for end of horizontal
- JC MTWaitNoH ; retrace
- MTWaitH:
- IN AL,DX ;Get 6845 status again
- RCR AL,1 ;Wait for horizontal
- JNC MTWaitH ; retrace
- MTGo:
- MOV AX,BX ;Move word back to AX...
- STOSW ; and then to screen
- STI ;Allow interrupts
- LOOP MTGetNext ;Get next video word
- JMP MTExit ;All done
- MTNoWait:
- REP MOVSW ;That's all!
- MTExit:
- POP DS ;Restore DS
- MOV SP,BP ;Restore SP
- POP BP ;Restore BP
- RET 10 ;Remove parameters and return
-
- MoveToScreen ENDP
-
- CODE ENDS
-
- END