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

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

Changes to all parts of the project:

  • Size optimizations.
  • Added a define (EXCLUDE_FROM_XTIDECFG) to exclude unused library code from XTIDECFG.
  • Tried to minimize time spent with interrupts disabled.
  • Some minor attempts to improve speed (reordering instructions etc).
  • Tried to improve readability, did some cleanup and fixed some errors in comments.
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     [bp+ITEM_LINE_SPLITTER.wMaxTextLineLength], cx
118    jb      SHORT .ChangeToNextLine
119    ret     ; With CF cleared
120
121ALIGN JUMP_ALIGN
122.ChangeToNextLine:
123    cmp     bx, [bp+ITEM_LINE_SPLITTER.wLineToFind]
124    je      SHORT .WantedLineFound
125
126    inc     bx                  ; Increment line
127    xor     cx, cx              ; Zero character counter (and clear CF)
128    mov     si, di              ; Start from complete word
129    mov     [bp+ITEM_LINE_SPLITTER.wStartOfLine], di
130    ret
131
132ALIGN JUMP_ALIGN
133.IgnoreUnsupportedControlCharacter:
134    dec     cx
135    clc
136    ret
137
138ALIGN JUMP_ALIGN
139.WantedLineFound:
140    lea     cx, [di-1]
141    sub     cx, [bp+ITEM_LINE_SPLITTER.wStartOfLine]
142    stc
143    ret
Note: See TracBrowser for help on using the repository browser.