285 lines
5.2 KiB
NASM
285 lines
5.2 KiB
NASM
|
; Turbo Pascal 6.0 example
|
||
|
; Assembler include file for WIN.PAS unit
|
||
|
; Copyright (c) 1989,90 by Borland International, Inc.
|
||
|
|
||
|
TITLE WIN
|
||
|
|
||
|
LOCALS @@
|
||
|
|
||
|
; Coordinate record
|
||
|
|
||
|
X EQU (BYTE PTR 0)
|
||
|
Y EQU (BYTE PTR 1)
|
||
|
|
||
|
; BIOS workspace equates
|
||
|
|
||
|
CrtMode EQU (BYTE PTR 49H)
|
||
|
CrtWidth EQU (BYTE PTR 4AH)
|
||
|
|
||
|
DATA SEGMENT WORD PUBLIC
|
||
|
|
||
|
; Externals from CRT unit
|
||
|
|
||
|
EXTRN CheckSnow:BYTE,WindMin:WORD,WindMax:WORD
|
||
|
|
||
|
DATA ENDS
|
||
|
|
||
|
CODE SEGMENT BYTE PUBLIC
|
||
|
|
||
|
ASSUME CS:CODE,DS:DATA
|
||
|
|
||
|
; procedure WriteStr(X, Y: Byte; S: String; Attr: Byte);
|
||
|
|
||
|
PUBLIC WriteStr
|
||
|
|
||
|
WriteStr:
|
||
|
|
||
|
PUSH BP
|
||
|
MOV BP,SP
|
||
|
LES BX,[BP+8]
|
||
|
MOV CL,ES:[BX]
|
||
|
MOV SI,OFFSET CS:CrtWriteStr
|
||
|
CALL CrtWrite
|
||
|
POP BP
|
||
|
RETF 10
|
||
|
|
||
|
; procedure WriteChar(X, Y, Count: Byte; Ch: Char; Attr: Byte);
|
||
|
|
||
|
PUBLIC WriteChar
|
||
|
|
||
|
WriteChar:
|
||
|
|
||
|
PUSH BP
|
||
|
MOV BP,SP
|
||
|
MOV CL,[BP+10]
|
||
|
MOV SI,OFFSET CS:CrtWriteChar
|
||
|
CALL CrtWrite
|
||
|
POP BP
|
||
|
RETF 10
|
||
|
|
||
|
; procedure FillWin(Ch: Char; Attr: Byte);
|
||
|
|
||
|
PUBLIC FillWin
|
||
|
|
||
|
FillWin:
|
||
|
|
||
|
MOV SI,OFFSET CS:CrtWriteChar
|
||
|
JMP SHORT CommonWin
|
||
|
|
||
|
; procedure ReadWin(var Buf);
|
||
|
|
||
|
PUBLIC ReadWin
|
||
|
|
||
|
ReadWin:
|
||
|
|
||
|
MOV SI,OFFSET CS:CrtReadWin
|
||
|
JMP SHORT CommonWin
|
||
|
|
||
|
; procedure WriteWin(var Buf);
|
||
|
|
||
|
PUBLIC WriteWin
|
||
|
|
||
|
WriteWin:
|
||
|
|
||
|
MOV SI,OFFSET CS:CrtWriteWin
|
||
|
|
||
|
; Common FillWin/ReadWin/WriteWin routine
|
||
|
|
||
|
CommonWin:
|
||
|
|
||
|
PUSH BP
|
||
|
MOV BP,SP
|
||
|
XOR CX,CX
|
||
|
MOV DX,WindMin
|
||
|
MOV CL,WindMax.X
|
||
|
SUB CL,DL
|
||
|
INC CX
|
||
|
@@1: PUSH CX
|
||
|
PUSH DX
|
||
|
PUSH SI
|
||
|
CALL CrtBlock
|
||
|
POP SI
|
||
|
POP DX
|
||
|
POP CX
|
||
|
INC DH
|
||
|
CMP DH,WindMax.Y
|
||
|
JBE @@1
|
||
|
POP BP
|
||
|
RETF 4
|
||
|
|
||
|
; Write string to screen
|
||
|
|
||
|
CrtWriteStr:
|
||
|
|
||
|
PUSH DS
|
||
|
MOV AH,[BP+6]
|
||
|
LDS SI,[BP+8]
|
||
|
INC SI
|
||
|
JC @@4
|
||
|
@@1: LODSB
|
||
|
MOV BX,AX
|
||
|
@@2: IN AL,DX
|
||
|
TEST AL,1
|
||
|
JNE @@2
|
||
|
CLI
|
||
|
@@3: IN AL,DX
|
||
|
TEST AL,1
|
||
|
JE @@3
|
||
|
MOV AX,BX
|
||
|
STOSW
|
||
|
STI
|
||
|
LOOP @@1
|
||
|
POP DS
|
||
|
RET
|
||
|
@@4: LODSB
|
||
|
STOSW
|
||
|
LOOP @@4
|
||
|
POP DS
|
||
|
RET
|
||
|
|
||
|
; Write characters to screen
|
||
|
|
||
|
CrtWriteChar:
|
||
|
|
||
|
MOV AL,[BP+8]
|
||
|
MOV AH,[BP+6]
|
||
|
JC @@4
|
||
|
MOV BX,AX
|
||
|
@@1: IN AL,DX
|
||
|
TEST AL,1
|
||
|
JNE @@1
|
||
|
CLI
|
||
|
@@2: IN AL,DX
|
||
|
TEST AL,1
|
||
|
JE @@2
|
||
|
MOV AX,BX
|
||
|
STOSW
|
||
|
STI
|
||
|
LOOP @@1
|
||
|
RET
|
||
|
@@4: REP STOSW
|
||
|
RET
|
||
|
|
||
|
; Read window buffer from screen
|
||
|
|
||
|
CrtReadWin:
|
||
|
|
||
|
PUSH DS
|
||
|
PUSH ES
|
||
|
POP DS
|
||
|
MOV SI,DI
|
||
|
LES DI,[BP+6]
|
||
|
CALL CrtCopyWin
|
||
|
MOV [BP+6],DI
|
||
|
POP DS
|
||
|
RET
|
||
|
|
||
|
; Write window buffer to screen
|
||
|
|
||
|
CrtWriteWin:
|
||
|
|
||
|
PUSH DS
|
||
|
LDS SI,[BP+6]
|
||
|
CALL CrtCopyWin
|
||
|
MOV [BP+6],SI
|
||
|
POP DS
|
||
|
RET
|
||
|
|
||
|
; Window buffer copy routine
|
||
|
|
||
|
CrtCopyWin:
|
||
|
|
||
|
JC @@4
|
||
|
@@1: LODSW
|
||
|
MOV BX,AX
|
||
|
@@2: IN AL,DX
|
||
|
TEST AL,1
|
||
|
JNE @@2
|
||
|
CLI
|
||
|
@@3: IN AL,DX
|
||
|
TEST AL,1
|
||
|
JE @@3
|
||
|
MOV AX,BX
|
||
|
STOSW
|
||
|
STI
|
||
|
LOOP @@1
|
||
|
RET
|
||
|
@@4: REP MOVSW
|
||
|
RET
|
||
|
|
||
|
; Do screen operation
|
||
|
; In CL = Buffer length
|
||
|
; SI = Write procedure pointer
|
||
|
; BP = Stack frame pointer
|
||
|
|
||
|
CrtWrite:
|
||
|
|
||
|
MOV DL,[BP+14]
|
||
|
DEC DL
|
||
|
ADD DL,WindMin.X
|
||
|
JC CrtExit
|
||
|
CMP DL,WindMax.X
|
||
|
JA CrtExit
|
||
|
MOV DH,[BP+12]
|
||
|
DEC DH
|
||
|
ADD DH,WindMin.Y
|
||
|
JC CrtExit
|
||
|
CMP DH,WindMax.Y
|
||
|
JA CrtExit
|
||
|
XOR CH,CH
|
||
|
JCXZ CrtExit
|
||
|
MOV AL,WindMax.X
|
||
|
SUB AL,DL
|
||
|
INC AL
|
||
|
CMP CL,AL
|
||
|
JB CrtBlock
|
||
|
MOV CL,AL
|
||
|
|
||
|
; Do screen operation
|
||
|
; In CL = Buffer length
|
||
|
; DX = CRT coordinates
|
||
|
; SI = Procedure pointer
|
||
|
|
||
|
CrtBlock:
|
||
|
|
||
|
MOV AX,40H
|
||
|
MOV ES,AX
|
||
|
MOV AL,DH
|
||
|
MUL ES:CrtWidth
|
||
|
XOR DH,DH
|
||
|
ADD AX,DX
|
||
|
SHL AX,1
|
||
|
MOV DI,AX
|
||
|
MOV AX,0B800H
|
||
|
CMP ES:CrtMode,7
|
||
|
JNE @@1
|
||
|
MOV AH,0B0H
|
||
|
@@1: MOV ES,AX
|
||
|
MOV DX,03DAH
|
||
|
CLD
|
||
|
CMP CheckSnow,1
|
||
|
JMP SI
|
||
|
|
||
|
; Exit from screen operation
|
||
|
|
||
|
CrtExit:
|
||
|
|
||
|
RET
|
||
|
|
||
|
; function WinSize: Word;
|
||
|
|
||
|
PUBLIC WinSize
|
||
|
|
||
|
WinSize:
|
||
|
|
||
|
MOV AX,WindMax
|
||
|
SUB AX,WindMin
|
||
|
ADD AX,101H
|
||
|
MUL AH
|
||
|
SHL AX,1
|
||
|
RETF
|
||
|
|
||
|
CODE ENDS
|
||
|
|
||
|
END
|