impulsetracker/it_msg.s

1032 lines
27 KiB
ArmAsm
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Message Module ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
.386
Jumps
;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Externals ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
extern M_FunctionDivider:Far
extern M_Object1List:Far
extern S_GetDestination:Far
extern O1_LongMessageList:Far
extern 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