1032 lines
28 KiB
NASM
1032 lines
28 KiB
NASM
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||
;³ Message Module ³
|
||
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
||
|
||
.386
|
||
Jumps
|
||
|
||
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||
;³ Externals ³
|
||
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
||
|
||
Extrn M_FunctionDivider:Far
|
||
Extrn M_Object1List:Far
|
||
Extrn S_GetDestination:Far
|
||
Extrn O1_LongMessageList:Far
|
||
Extrn O1_ConfirmClearMessage:Far
|
||
|
||
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||
;³ Globals ³
|
||
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
||
|
||
Global Msg_ResetMessage:Far
|
||
Global Msg_DrawMessage:Far
|
||
Global Msg_PreMessage:Far
|
||
Global Msg_PostMessage:Far
|
||
Global Msg_GetMessageLength:Far
|
||
Global Msg_GetMessageOffset:Far
|
||
|
||
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||
|
||
Segment Message BYTE Public 'Code' USE16
|
||
Assume CS:Message, DS:Nothing
|
||
|
||
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||
;³ Variables ³
|
||
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
||
|
||
MESSAGELENGTH Equ 8000
|
||
|
||
TopLine DW 0
|
||
CurrentPosition DW 0
|
||
MessageData DB MESSAGELENGTH Dup (0)
|
||
DW 0 ; Security
|
||
MessageDataTerminator DB 0
|
||
Edit DB 0 ; if Edit=1, show '' for enter.
|
||
HorizontalPosition DW 0
|
||
CurrentLine DW 0
|
||
CharacterColour DB 12
|
||
|
||
NoEditKeys Label
|
||
DB 0
|
||
DW 1C8h ; Up arrow
|
||
DW Msg_ViewMsgUp
|
||
|
||
DB 0
|
||
DW 1D0h ; Down arrow
|
||
DW Msg_ViewMsgDown
|
||
|
||
DB 0
|
||
DW 1C9h
|
||
DW Msg_ViewMsgPgUp
|
||
|
||
DB 0
|
||
DW 1D1h
|
||
DW Msg_ViewMsgPgDn
|
||
|
||
DB 0
|
||
DW 11Ch
|
||
DW Msg_ViewMsgEdit
|
||
|
||
DB 1
|
||
DW 'T'-'@' ; Ctrl 'T'
|
||
DW Msg_ToggleCharacterSet
|
||
|
||
DB 0FFh ; End of List
|
||
|
||
EditMsgKeys Label
|
||
DB 0
|
||
DW 1C7h
|
||
DW Msg_EditMsgHome
|
||
|
||
DB 0
|
||
DW 1CFh
|
||
DW Msg_EditMsgEnd
|
||
|
||
DB 0
|
||
DW 1CBh
|
||
DW Msg_EditMsgLeft
|
||
|
||
DB 0
|
||
DW 1CDh
|
||
DW Msg_EditMsgRight
|
||
|
||
DB 0
|
||
DW 1C8h ; Up arrow
|
||
DW Msg_EditMsgUp
|
||
|
||
DB 0
|
||
DW 1D0h ; Down arrow
|
||
DW Msg_EditMsgDown
|
||
|
||
DB 0
|
||
DW 1C9h ; PgUp
|
||
DW Msg_EditMsgPgUp
|
||
|
||
DB 0
|
||
DW 1D1h ; PgDn
|
||
DW Msg_EditMsgPgDn
|
||
|
||
; DB 2
|
||
; DW 1C8h ; Up arrow
|
||
; DW Msg_ViewMsgUp
|
||
;
|
||
; DB 2
|
||
; DW 1D0h ; Down arrow
|
||
; DW Msg_ViewMsgDown
|
||
|
||
DB 0
|
||
DW 1D2h ; Insert
|
||
DW Msg_EditMsgInsert
|
||
|
||
DB 0
|
||
DW 10Fh
|
||
DW Msg_Tab
|
||
|
||
DB 0
|
||
DW 1D3h ; Delete
|
||
DW Msg_EditMsgDelete
|
||
|
||
DB 0
|
||
DW 101h ; Escape
|
||
DW Msg_EditMsgView
|
||
|
||
DB 0
|
||
DW 10Eh ; Backspace
|
||
DW Msg_EditMsgBackSpace
|
||
|
||
DB 1
|
||
DW 19h
|
||
DW Msg_EditMsgDeleteLine
|
||
|
||
DB 1
|
||
DW 2E00h ; Alt 'C'
|
||
DW Msg_ClearMessage
|
||
|
||
DB 1
|
||
DW 'T'-'@' ; Ctrl 'T'
|
||
DW Msg_ToggleCharacterSet
|
||
|
||
DB 0FFh
|
||
|
||
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
|
||
;³ Functions ³
|
||
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_ResetMessage Far
|
||
|
||
Push CS
|
||
Pop ES
|
||
Mov DI, Offset MessageData
|
||
Xor AX, AX
|
||
Mov CX, 4000
|
||
Rep StosW
|
||
|
||
Mov CS:Edit, 0
|
||
Mov CS:TopLine, 0
|
||
|
||
Ret
|
||
|
||
EndP Msg_ResetMessage
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_DrawMessage Far
|
||
|
||
Call S_GetDestination
|
||
|
||
Push CS
|
||
Pop DS
|
||
Assume DS:Message
|
||
|
||
Cmp Edit, 0
|
||
JE Msg_DrawMessage7
|
||
|
||
Mov SI, Offset MessageData
|
||
Mov CX, CurrentPosition
|
||
Xor DX, DX ; DX = line count.
|
||
Xor BX, BX ; BX = cursor position.
|
||
JCXZ Msg_DrawMessage4
|
||
|
||
Msg_DrawMessage1:
|
||
LodsB
|
||
Test AL, AL
|
||
JZ Msg_DrawMessage4
|
||
|
||
Inc BX
|
||
|
||
Cmp AL, 13 ; Enter?
|
||
JNE Msg_DrawMessage2
|
||
|
||
Inc DX ; Increase current line.
|
||
Xor BX, BX
|
||
|
||
Msg_DrawMessage2:
|
||
Loop Msg_DrawMessage1
|
||
|
||
Msg_DrawMessage4:
|
||
Mov CurrentLine, DX
|
||
Mov HorizontalPosition, BX
|
||
|
||
Mov AX, TopLine ; Boundary checking...
|
||
Cmp AX, DX
|
||
JBE Msg_DrawMessage5
|
||
|
||
Mov AX, DX ; Need new top line.
|
||
|
||
Msg_DrawMessage5:
|
||
LEA CX, [EAX+34]
|
||
Cmp CX, DX
|
||
JAE Msg_DrawMessage6
|
||
|
||
Mov AX, DX
|
||
Sub AX, 34
|
||
JNC Msg_DrawMessage6
|
||
|
||
Xor AX, AX
|
||
|
||
Msg_DrawMessage6:
|
||
Mov TopLine, AX
|
||
; Now to get the stuff onto
|
||
; the screen...
|
||
Msg_DrawMessage7:
|
||
Mov CX, TopLine
|
||
Mov SI, Offset MessageData
|
||
JCXZ Msg_DrawMessage9
|
||
|
||
Msg_DrawMessage8:
|
||
LodsB
|
||
And AL, AL
|
||
JZ Msg_DrawMessageEnd
|
||
|
||
Cmp AL, 13
|
||
JNE Msg_DrawMessage8
|
||
Loop Msg_DrawMessage8
|
||
|
||
Msg_DrawMessage9:
|
||
Mov DI, (2+13*80)*2
|
||
Mov BL, CharacterColour
|
||
Mov CX, 35
|
||
Mov DX, 20+100h
|
||
Mov AH, BL
|
||
|
||
Push DI
|
||
|
||
Cmp Edit, 1
|
||
JE Msg_DrawMessage10
|
||
|
||
Mov DX, 300h
|
||
|
||
Msg_DrawMessage10:
|
||
LodsB
|
||
And AL, AL
|
||
JZ Msg_DrawMessage12
|
||
|
||
Cmp AL, 13
|
||
JE Msg_DrawMessage11
|
||
|
||
Cmp AL, ' '
|
||
JE Msg_DrawMessage14
|
||
|
||
StosW
|
||
Jmp Msg_DrawMessage10
|
||
|
||
Msg_DrawMessage14:
|
||
Mov AH, 3
|
||
StosW
|
||
Mov AH, BL
|
||
Jmp Msg_DrawMessage10
|
||
|
||
Msg_DrawMessage11:
|
||
Mov AX, DX
|
||
StosW
|
||
|
||
Mov AH, BL
|
||
|
||
Pop DI
|
||
Add DI, 160
|
||
Push DI
|
||
|
||
Loop Msg_DrawMessage10
|
||
Jmp Msg_DrawMessage13
|
||
|
||
Msg_DrawMessage12:
|
||
Mov AX, DX
|
||
Inc AH
|
||
StosW
|
||
|
||
Msg_DrawMessage13:
|
||
Pop DI
|
||
|
||
Msg_DrawMessageEnd:
|
||
Ret
|
||
|
||
EndP Msg_DrawMessage
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_PreMessage Far
|
||
|
||
Push CS
|
||
Pop DS
|
||
Assume DS:Message
|
||
|
||
Cmp Edit, 0
|
||
JE Msg_PreMessage1
|
||
|
||
Call S_GetDestination
|
||
|
||
Mov AX, CurrentLine
|
||
Sub AX, TopLine
|
||
Mov BX, 80
|
||
Mul BX
|
||
Add AX, HorizontalPosition
|
||
LEA DI, [EAX*2+(2+13*80)*2+1]
|
||
|
||
And Byte Ptr [ES:DI], 8
|
||
Or Byte Ptr [ES:DI], 30h
|
||
|
||
Msg_PreMessage1:
|
||
Ret
|
||
|
||
EndP Msg_PreMessage
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_PostMessage Far
|
||
|
||
Push CS
|
||
Pop DS
|
||
|
||
Cmp Edit, 0
|
||
JNE Msg_PostMessage2
|
||
|
||
Mov SI, Offset NoEditKeys
|
||
Call M_FunctionDivider
|
||
JC Msg_PostMessage1
|
||
|
||
Jmp [SI]
|
||
|
||
Msg_PostMessage1:
|
||
Xor AX, AX
|
||
Ret
|
||
|
||
Msg_PostMessage2:
|
||
Mov SI, Offset EditMsgKeys
|
||
Call M_FunctionDivider
|
||
JC Msg_PostMessage3
|
||
|
||
Jmp [SI]
|
||
|
||
Msg_PostMessage3:
|
||
Cmp CX, 11Ch ; Enter
|
||
JE Msg_PostMessage6
|
||
Test CL, CL
|
||
JZ Msg_PostMessage1
|
||
|
||
Cmp DL, 32
|
||
JB Msg_PostMessage1
|
||
Jmp Msg_PostMessage4
|
||
|
||
Msg_PostMessage6:
|
||
Mov DL, 13
|
||
|
||
Msg_PostMessage4:
|
||
Push DX
|
||
|
||
Mov DX, 1
|
||
Mov SI, CurrentPosition
|
||
Call InsertData
|
||
|
||
Pop DX
|
||
|
||
JC Msg_PostMessage5
|
||
|
||
Mov [SI+MessageData], DL
|
||
Call CheckWordWrap
|
||
Jmp Msg_EditMsgRight
|
||
|
||
Msg_PostMessage5:
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_PostMessage
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_Tab Far
|
||
|
||
Mov CX, 8
|
||
|
||
Msg_Tab1:
|
||
Push CX
|
||
Mov DX, 32
|
||
Call Far Ptr Msg_PostMessage4
|
||
Pop CX
|
||
Loop Msg_Tab1
|
||
|
||
Ret
|
||
|
||
|
||
EndP Msg_Tab
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_ViewMsgUp Far
|
||
Assume DS:Message
|
||
|
||
Mov AX, TopLine
|
||
Sub AX, 1
|
||
AdC AX, 0
|
||
Mov TopLine, AX
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_ViewMsgUp
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_ViewMsgDown Far
|
||
Assume DS:Message
|
||
|
||
Mov AX, TopLine
|
||
Inc AX
|
||
Cmp AX, 7970
|
||
JB Msg_ViewMsgDown1
|
||
|
||
Mov AX, 7970
|
||
|
||
Msg_ViewMsgDown1:
|
||
Mov TopLine, AX
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_ViewMsgDown
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_ViewMsgPgUp Far
|
||
Assume DS:Message
|
||
|
||
Mov AX, TopLine
|
||
Sub AX, 35
|
||
JNC Msg_ViewMsgPgUp1
|
||
|
||
Xor AX, AX
|
||
|
||
Msg_ViewMsgPgUp1:
|
||
Mov TopLine, AX
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_ViewMsgPgUp
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_ViewMsgPgDn Far
|
||
Assume DS:Message
|
||
|
||
Mov AX, TopLine
|
||
Add AX, 35
|
||
Cmp AX, 7970
|
||
JB Msg_ViewMsgPgDn1
|
||
|
||
Mov AX, 7970
|
||
|
||
Msg_ViewMsgPgDn1:
|
||
Mov TopLine, AX
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_ViewMsgPgDn
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_ViewMsgEdit Far
|
||
Assume DS:Message
|
||
|
||
Mov TopLine, 0
|
||
Mov CurrentLine, 0
|
||
Mov CurrentPosition, 0
|
||
Mov Edit, 1
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_ViewMsgEdit
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgView Far
|
||
Assume DS:Message
|
||
|
||
Mov Edit, 0
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgView
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgLeft Far
|
||
Assume DS:Message
|
||
|
||
Sub CurrentPosition, 1
|
||
AdC CurrentPosition, 0
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgLeft
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgRight Far
|
||
Assume DS:Message
|
||
|
||
Mov SI, CurrentPosition
|
||
Cmp SI, MESSAGELENGTH-2
|
||
JAE Msg_EditMsgRight1
|
||
|
||
Cmp Word Ptr [SI+MessageData], 0
|
||
JE Msg_EditMsgRight1
|
||
|
||
Inc CurrentPosition
|
||
|
||
Msg_EditMsgRight1:
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgRight
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgUp Far
|
||
Assume DS:Message
|
||
|
||
Mov SI, CurrentPosition ; Need to search back
|
||
; twice...
|
||
Call FindStart
|
||
And SI, SI
|
||
JZ Msg_EditMsgUpEnd
|
||
Dec SI
|
||
Call FindStart
|
||
|
||
Add SI, Offset MessageData
|
||
|
||
Mov CX, HorizontalPosition
|
||
JCXZ Msg_EditMsgUp3
|
||
|
||
Msg_EditMsgUp2:
|
||
LodsB
|
||
Cmp AL, 13
|
||
LoopNE Msg_EditMsgUp2
|
||
JNE Msg_EditMsgUp3
|
||
|
||
Dec SI
|
||
|
||
Msg_EditMsgUp3:
|
||
Sub SI, Offset MessageData
|
||
Mov CurrentPosition, SI
|
||
|
||
Msg_EditMsgUpEnd:
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgUp
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgPgUp Far
|
||
|
||
Mov CX, 35
|
||
|
||
Msg_EditMsgPgUp1:
|
||
Push CX
|
||
Call Msg_EditMsgUp
|
||
Pop CX
|
||
Loop Msg_EditMsgPgUp1
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgPgUp
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgDown Far
|
||
Assume DS:Message
|
||
; Search for enter
|
||
Mov SI, CurrentPosition
|
||
|
||
Msg_EditMsgDown1:
|
||
Mov AL, [SI+MessageData]
|
||
Inc SI
|
||
And AL, AL
|
||
JZ Msg_EditMsgDownEnd
|
||
|
||
Cmp AL, 13
|
||
JNE Msg_EditMsgDown1
|
||
|
||
Mov CX, HorizontalPosition
|
||
JCXZ Msg_EditMsgDown3
|
||
|
||
Msg_EditMsgDown2:
|
||
Mov AL, [SI+MessageData]
|
||
And AL, AL
|
||
JZ Msg_EditMsgDown3
|
||
|
||
Cmp AL, 13
|
||
JE Msg_EditMsgDown3
|
||
|
||
Inc SI
|
||
Loop Msg_EditMsgDown2
|
||
|
||
Msg_EditMsgDown3:
|
||
Cmp SI, MESSAGELENGTH-2
|
||
JAE Msg_EditMsgDownEnd
|
||
|
||
Mov CurrentPosition, SI
|
||
|
||
Msg_EditMsgDownEnd:
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgDown
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgPgDn Far
|
||
|
||
Mov CX, 35
|
||
|
||
Msg_EditMsgPgDn1:
|
||
Push CX
|
||
Call Msg_EditMsgDown
|
||
Pop CX
|
||
Loop Msg_EditMsgPgDn1
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgPgDn
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgDelete Far
|
||
Assume DS:Message
|
||
|
||
Mov SI, CurrentPosition
|
||
Mov DX, 1
|
||
Call DeleteData
|
||
Call CheckWordWrap
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgDelete
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgInsert Far
|
||
|
||
Mov SI, CurrentPosition
|
||
Mov DX, 1
|
||
Call InsertData
|
||
JC Msg_EditMsgInsert1
|
||
|
||
Mov Byte Ptr [SI+MessageData], 32
|
||
Call CheckWordWrap
|
||
|
||
Msg_EditMsgInsert1:
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgInsert
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgBackspace Far
|
||
Assume DS:Message
|
||
|
||
Mov SI, CurrentPosition
|
||
And SI, SI
|
||
JZ Msg_EditMsgBackspace1
|
||
|
||
Call Msg_EditMsgLeft
|
||
Call Msg_EditMsgDelete
|
||
|
||
Msg_EditMsgBackspace1:
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgBackspace
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgDeleteLine Far
|
||
Assume DS:Message
|
||
|
||
Mov SI, CurrentPosition ; Search back for
|
||
; start of line..
|
||
Call FindStart
|
||
|
||
; Find length to delete.
|
||
Xor BX, BX ; DI = length
|
||
|
||
Msg_EditMsgDeleteLine3:
|
||
Mov AL, [SI+BX+MessageData]
|
||
Inc BX
|
||
|
||
And AL, AL
|
||
JZ Msg_EditMsgDeleteLine4
|
||
Cmp AL, 13
|
||
JNE Msg_EditMsgDeleteLine3
|
||
|
||
Msg_EditMsgDeleteLine4:
|
||
Mov DX, BX
|
||
Call DeleteData
|
||
|
||
Mov CurrentPosition, SI
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgDeleteLine
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_ClearMessage Far
|
||
|
||
Mov DI, Offset O1_ConfirmClearMessage
|
||
Mov CX, 4
|
||
Call M_Object1List
|
||
|
||
And DX, DX
|
||
JZ Msg_ClearMessage1
|
||
|
||
Call Msg_ResetMessage
|
||
|
||
Msg_ClearMessage1:
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_ClearMessage
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgHome Far
|
||
Assume DS:Message
|
||
|
||
Mov SI, CurrentPosition
|
||
Call FindStart
|
||
Mov CurrentPosition, SI
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgHome
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_EditMsgEnd Far
|
||
Assume DS:Message
|
||
|
||
Mov SI, CurrentPosition
|
||
|
||
Msg_EditMsgEndLoop:
|
||
Mov AL, [SI+MessageData]
|
||
|
||
Inc SI
|
||
|
||
And AL, AL
|
||
JZ Msg_EditMsgEnd1
|
||
|
||
Cmp AL, 13
|
||
JNE Msg_EditMsgEndLoop
|
||
|
||
Msg_EditMsgEnd1:
|
||
Dec SI
|
||
Mov CurrentPosition, SI
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_EditMsgEnd
|
||
Assume DS:Nothing
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc FindStart
|
||
|
||
FindStart1:
|
||
Sub SI, 1
|
||
JC FindStart2
|
||
|
||
Cmp Byte Ptr [SI+MessageData], 13
|
||
JNE FindStart1
|
||
|
||
FindStart2:
|
||
Inc SI
|
||
Ret
|
||
|
||
EndP FindStart
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc InsertData ; SI = pos, DX = length.
|
||
|
||
Push CX
|
||
Push DX
|
||
Push SI
|
||
|
||
Mov CX, MESSAGELENGTH-1
|
||
Sub CX, SI
|
||
Sub CX, DX
|
||
|
||
Mov SI, Offset MessageData+MESSAGELENGTH-2
|
||
Mov DI, SI
|
||
Sub SI, DX
|
||
|
||
Cmp Byte Ptr [SI], 0
|
||
JNE InsertDataError
|
||
|
||
Push DS
|
||
Pop ES
|
||
|
||
StD
|
||
Rep MovsB
|
||
ClD
|
||
|
||
ClC
|
||
Jmp InsertDataEnd
|
||
|
||
InsertDataError:
|
||
Push DS
|
||
|
||
Mov DI, Offset O1_LongMessageList
|
||
Mov CX, 2
|
||
Call M_Object1List
|
||
|
||
Pop DS
|
||
|
||
StC
|
||
|
||
InsertDataEnd:
|
||
Pop SI
|
||
Pop DX
|
||
Pop CX
|
||
Ret
|
||
|
||
EndP InsertData
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc DeleteData ; SI = pos, DX = length
|
||
; Assume DS:Message
|
||
|
||
Push CX
|
||
Push DX
|
||
Push SI
|
||
|
||
Push CS
|
||
Pop ES
|
||
|
||
Mov CX, MESSAGELENGTH
|
||
Sub CX, SI
|
||
Sub CX, DX
|
||
JS DeleteData1
|
||
|
||
Add SI, Offset MessageData
|
||
Mov DI, SI
|
||
Add SI, DX
|
||
|
||
Rep MovsB
|
||
|
||
Xor AX, AX
|
||
Mov CX, DX
|
||
Rep StosB
|
||
|
||
DeleteData1:
|
||
Pop SI
|
||
Pop DX
|
||
Pop CX
|
||
Ret
|
||
|
||
EndP DeleteData
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc CheckWordWrap ; Check current line only.
|
||
|
||
Mov SI, CurrentPosition
|
||
Call FindStart
|
||
|
||
; OK, so SI = pos of last line.
|
||
; Now count length of new line.
|
||
Xor BX, BX ; BX = count.
|
||
|
||
CheckWordWrap3:
|
||
Mov AL, [SI+BX+MessageData]
|
||
|
||
Inc BX
|
||
|
||
And AL, AL
|
||
JZ CheckWordWrap4
|
||
Cmp AL, 13
|
||
JNE CheckWordWrap3
|
||
|
||
CheckWordWrap4: ; OK.. now if BX > 66...
|
||
Cmp BX, 75
|
||
JA CheckWordWrap5
|
||
|
||
Ret
|
||
|
||
CheckWordWrap5: ; Search back for a space and REPLACE
|
||
; it with an enter...
|
||
Mov BX, 75
|
||
|
||
CheckWordWrap6:
|
||
Dec BX
|
||
JZ CheckWordWrap7
|
||
|
||
Cmp Byte Ptr [SI+BX+MessageData], 32
|
||
JNE CheckWordWrap6
|
||
|
||
Mov Byte Ptr [SI+BX+MessageData], 13
|
||
|
||
Ret
|
||
|
||
CheckWordWrap7: ; Insert an enter
|
||
Mov DX, 1
|
||
Add SI, 75
|
||
Call InsertData
|
||
Mov Byte Ptr [SI+MessageData], 13
|
||
|
||
CheckWordWrap8:
|
||
Ret
|
||
|
||
EndP CheckWordWrap
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_GetMessageLength Far ; Returns AX
|
||
|
||
Push DS
|
||
Push SI
|
||
|
||
Push CS
|
||
Pop DS
|
||
|
||
Mov SI, Offset MessageData
|
||
|
||
Msg_GetMessageLength1:
|
||
LodsB
|
||
And AL, AL
|
||
JNZ Msg_GetMessageLength1
|
||
|
||
Sub SI, Offset MessageData
|
||
Mov AX, SI
|
||
|
||
Pop SI
|
||
Pop DS
|
||
Ret
|
||
|
||
EndP Msg_GetMessageLength
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_GetMessageOffset Far
|
||
|
||
Push CS
|
||
Pop DS
|
||
|
||
Mov DX, Offset MessageData
|
||
Ret
|
||
|
||
EndP Msg_GetMessageOffset
|
||
|
||
;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
|
||
|
||
Proc Msg_ToggleCharacterSet Far
|
||
Assume DS:Message
|
||
|
||
Xor CharacterColour, 6 xor 12
|
||
|
||
Mov AX, 1
|
||
Ret
|
||
|
||
EndP Msg_ToggleCharacterSet
|
||
Assume DS:Nothing
|
||
|
||
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||
|
||
EndS
|
||
|
||
;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
|
||
|
||
End
|