source: xtideuniversalbios/trunk/Assembly_Library/Src/Menu/Dialog/ItemLineSplitter.asm @ 133

Last change on this file since 133 was 133, checked in by krille_n_@…, 13 years ago

Size optimizations in various files in the Assembly Library. Also a very small change to a string in XTIDE_Universal_BIOS_Configurator_v2/Src/Strings.asm

File size: 4.0 KB
Line 
1; Project name  :   Assembly Library
2; Description   :   Functions for splitting strings to item lines.
3
4struc ITEM_LINE_SPLITTER
5    .wMaxTextLineLength resb    2
6    .wLineToFind        resb    2
7    .wStartOfLine       resb    2
8endstruc
9
10; Section containing code
11SECTION .text
12
13;--------------------------------------------------------------------
14; ItemLineSplitter_GetLinesToAXforStringInDSSI
15;   Parameters:
16;       DS:SI:  Ptr to string
17;       SS:BP:  Ptr to MENU
18;   Returns:
19;       AX:     Number of lines on string
20;   Corrupts registers:
21;       BX, CX, DX, SI
22;--------------------------------------------------------------------
23ALIGN JUMP_ALIGN
24ItemLineSplitter_GetLinesToAXforStringInDSSI:
25    push    di
26
27    call    MenuLocation_GetMaxTextLineLengthToAX
28    eENTER_STRUCT   ITEM_LINE_SPLITTER_size
29    mov     [bp+ITEM_LINE_SPLITTER.wMaxTextLineLength], ax
30    mov     WORD [bp+ITEM_LINE_SPLITTER.wLineToFind], -1
31
32    xor     bx, bx      ; Line index
33    mov     di, si      ; Start of first word
34    mov     dx, ProcessCharacterFromStringToSplit
35    call    StringProcess_DSSIwithFunctionInDX
36
37    lea     ax, [bx+1]
38    eLEAVE_STRUCT   ITEM_LINE_SPLITTER_size
39    pop     di
40    ret
41
42
43;--------------------------------------------------------------------
44; ItemLineSplitter_GetLineToDSSIandLengthToCXfromStringInDSSIwithIndexInCX
45;   Parameters:
46;       CX:     Index of line to search for
47;       DS:SI:  Ptr to string
48;       SS:BP:  Ptr to MENU
49;   Returns:
50;       CX:     Line length
51;       DS:SI:  Ptr to beginning of line
52;       CF:     Set if wanted line was found
53;   Corrupts registers:
54;       AX, BX, DX
55;--------------------------------------------------------------------
56ALIGN JUMP_ALIGN
57ItemLineSplitter_GetLineToDSSIandLengthToCXfromStringInDSSIwithIndexInCX:
58    push    di
59
60    call    MenuLocation_GetMaxTextLineLengthToAX
61    eENTER_STRUCT   ITEM_LINE_SPLITTER_size
62    mov     [bp+ITEM_LINE_SPLITTER.wMaxTextLineLength], ax
63    mov     [bp+ITEM_LINE_SPLITTER.wLineToFind], cx
64    mov     [bp+ITEM_LINE_SPLITTER.wStartOfLine], si
65
66    xor     bx, bx      ; Line index
67    mov     di, si      ; Start of first word
68    mov     dx, ProcessCharacterFromStringToSplit
69    call    StringProcess_DSSIwithFunctionInDX
70
71    mov     si, [bp+ITEM_LINE_SPLITTER.wStartOfLine]
72    jc      SHORT .ReturnLineInDSSIandLengthInCX
73    call    String_GetLengthFromDSSItoCX    ; Last or invalid line. Just return last line.
74
75ALIGN JUMP_ALIGN
76.ReturnLineInDSSIandLengthInCX:
77    eLEAVE_STRUCT   ITEM_LINE_SPLITTER_size
78    pop     di
79    stc
80    ret
81
82
83;--------------------------------------------------------------------
84; Character processing callback function prototype for StringProcess_DSSIwithFunctionInBX.
85; ProcessCharacterFromStringToSplit
86;   Parameters:
87;       AL:         Character to process
88;       BX:         Line index
89;       CX:         Number of characters processed (Characters on line so far)
90;       DS:SI:      Ptr to next character
91;       DS:DI:      Start of current word
92;       SS:BP:      Ptr to ITEM_LINE_SPLITTER
93;   Returns:
94;       CF:         Clear to continue with next character
95;                   Set to stop processing
96;       BX:         Line index
97;       CX:         Characters on line so far
98;       DS:DI:      Start of current word
99;   Corrupts registers:
100;       AX
101;--------------------------------------------------------------------
102ALIGN JUMP_ALIGN
103ProcessCharacterFromStringToSplit:
104    cmp     al, ' '
105    ja      SHORT .CheckLineLength
106    mov     di, si              ; DS:DI now points start of new word
107    je      SHORT .CheckLineLength
108
109    cmp     al, LF
110    je      SHORT .ChangeToNextLine
111    cmp     al, CR
112    jne     SHORT .IgnoreUnsupportedControlCharacter
113    xor     cx, cx              ; Carriage return so reset line length so far
114
115ALIGN JUMP_ALIGN
116.CheckLineLength:
117    cmp     cx, [bp+ITEM_LINE_SPLITTER.wMaxTextLineLength]
118    ja      SHORT .ChangeToNextLine
119    clc
120    ret
121
122ALIGN JUMP_ALIGN
123.ChangeToNextLine:
124    cmp     bx, [bp+ITEM_LINE_SPLITTER.wLineToFind]
125    je      SHORT .WantedLineFound
126
127    inc     bx                  ; Increment line
128    xor     cx, cx              ; Zero character counter (and clear CF)
129    mov     si, di              ; Start from complete word
130    mov     [bp+ITEM_LINE_SPLITTER.wStartOfLine], di
131    ret
132
133ALIGN JUMP_ALIGN
134.IgnoreUnsupportedControlCharacter:
135    dec     cx
136    clc
137    ret
138
139ALIGN JUMP_ALIGN
140.WantedLineFound:
141    lea     cx, [di-1]
142    sub     cx, [bp+ITEM_LINE_SPLITTER.wStartOfLine]
143    stc
144    ret
Note: See TracBrowser for help on using the repository browser.