Changeset 52 in xtideuniversalbios for trunk/Assembly_Library/Src/Menu/MenuCharOut.asm
- Timestamp:
- Oct 12, 2010, 6:51:07 PM (15 years ago)
- google:author:
- aitotat
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Assembly_Library/Src/Menu/MenuCharOut.asm
r51 r52 2 2 ; Project name : Assembly Library 3 3 ; Created date : 15.7.2010 4 ; Last update : 1 0.10.20104 ; Last update : 12.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Character out function for printing withing menu window. … … 10 10 11 11 ;-------------------------------------------------------------------- 12 ; MenuCharOut_MenuBorderTeletypeOutputWithAttribute 12 ; MenuCharOut_MenuTeletypeOutputWithAutomaticLineChange 13 ; MenuCharOut_MenuTeletypeOutput 13 14 ; Parameters: 14 15 ; AL: Character to output … … 16 17 ; DS: BDA segment (zero) 17 18 ; ES:DI: Ptr to video memory where to output 19 ; [DISPLAY_CONTEXT.wCharOutParam]: 20 ; Low byte = First column offset (after CR) 21 ; High byte = Last column offset (when using automatic line change) 18 22 ; Returns: 19 23 ; DI: Incremented for next character … … 22 26 ;-------------------------------------------------------------------- 23 27 ALIGN JUMP_ALIGN 24 MenuCharOut_MenuBorderTeletypeOutputWithAttribute: 25 cmp al, CR ; Carriage return? 26 je SHORT .PrintCRandAdjustColumnToMenuBorders 27 jmp DisplayCharOut_TeletypeOutputWithAttribute 28 29 ALIGN JUMP_ALIGN 30 .PrintCRandAdjustColumnToMenuBorders: 31 call DisplayCharOut_BiosTeletypeOutput 32 xor ax, ax ; No offset, cursor to start of border 33 jmp SHORT SetCursorToNextMenuLine 34 35 36 ;-------------------------------------------------------------------- 37 ; MenuCharOut_MenuTextTeletypeOutputWithAttributeAndAutomaticLineChange 38 ; MenuCharOut_MenuTextTeletypeOutputWithAttribute 39 ; Parameters: 40 ; AL: Character to output 41 ; AH: Attribute to output 42 ; DS: BDA segment (zero) 43 ; ES:DI: Ptr to video memory where to output 44 ; Returns: 45 ; DI: Incremented for next character 46 ; Corrupts registers: 47 ; AX, DX 48 ;-------------------------------------------------------------------- 49 ALIGN JUMP_ALIGN 50 MenuCharOut_MenuTextTeletypeOutputWithAttributeAndAutomaticLineChange: 51 push di 52 push ax 53 mov al, DOUBLE_VERTICAL 54 add di, BYTE MENU_TEXT_COLUMN_OFFSET ; Border char comes after space 55 WAIT_RETRACE_IF_NECESSARY_THEN scasb 56 pop ax 57 pop di 58 je SHORT MovePartialWordToNewTextLineAndPrintCharacterFromAX 28 MenuCharOut_MenuTeletypeOutputWithAutomaticLineChange: 29 call CharOutLineSplitter_IsCursorAtTheEndOfTextLine 30 jnc SHORT MenuCharOut_MenuTeletypeOutput 31 cmp al, ' ' 32 jb SHORT ReturnSinceNoNeedToStartLineWithControlCharacter 33 call CharOutLineSplitter_MovePartialWordToNewTextLine 59 34 ; Fall to MenuCharOut_MenuTextTeletypeOutputWithAttribute 60 35 61 36 ALIGN JUMP_ALIGN 62 MenuCharOut_MenuTe xtTeletypeOutputWithAttribute:63 cmp al, CR ; Carriage return?64 je SHORT PrintCR fromALandAdjustColumnToMenuText37 MenuCharOut_MenuTeletypeOutput: 38 cmp al, CR 39 je SHORT PrintCRandAdjustOffsetForStartOfLine 65 40 jmp DisplayCharOut_TeletypeOutputWithAttribute 66 41 67 42 68 43 ;-------------------------------------------------------------------- 69 ; MovePartialWordToNewTextLineAndPrintCharacterFromAX 70 ; Parameters: 71 ; AL: Character to output 72 ; AH: Attribute to output 73 ; DS: BDA segment (zero) 74 ; ES:DI: Ptr to end of text line in video memory 75 ; Returns: 76 ; DI: Incremented for next character 77 ; Corrupts registers: 78 ; AX, DX 79 ;-------------------------------------------------------------------- 80 ALIGN JUMP_ALIGN 81 MovePartialWordToNewTextLineAndPrintCharacterFromAX: 82 cmp al, ' ' ; Space or any control character 83 jb SHORT .MoveCursorInDItoBeginningOfNextLine 84 push si 85 push cx 86 push ax 87 88 call .GetOffsetToPartialWordToSIandSizeToCX 89 call .MoveCursorInDItoBeginningOfNextLine 90 jcxz .NothingToMove 91 call .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX 92 .NothingToMove: 93 pop ax 94 pop cx 95 pop si 96 jmp DisplayCharOut_TeletypeOutputWithAttribute 97 98 ;-------------------------------------------------------------------- 99 ; .GetOffsetToPartialWordToSIandSizeToCX 100 ; Parameters: 101 ; ES:DI: Ptr to space before border character 102 ; Returns: 103 ; CX: Number of bytes that needs to be moved 104 ; ES:SI: Ptr to beginning of partial word that needs to be moved to new line 105 ; Corrupts registers: 106 ; Nothing 107 ;-------------------------------------------------------------------- 108 ALIGN JUMP_ALIGN 109 .GetOffsetToPartialWordToSIandSizeToCX: 110 xor cx, cx 111 mov si, di 112 ALIGN JUMP_ALIGN 113 .ScanNextCharacter: ; Space will always be found since one comes after border 114 dec si 115 dec si 116 cmp BYTE [es:si], ' ' 117 je SHORT .PartialWordFound 118 inc cx 119 jmp SHORT .ScanNextCharacter 120 ALIGN JUMP_ALIGN 121 .PartialWordFound: 122 inc si 123 inc si ; SI now points one past space 124 shl cx, 1 ; Characters to bytes 125 ret 126 127 ;-------------------------------------------------------------------- 128 ; .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX 129 ; Parameters: 130 ; CX: Number of bytes in partial word 131 ; DS: BDA segment (zero) 132 ; ES:SI: Ptr to partial word on previous line 133 ; ES:DI: Ptr to new empty line 134 ; Returns: 135 ; ES:DI: Ptr where to store next character 136 ; Corrupts registers: 137 ; AX, CX, DX, SI 138 ;-------------------------------------------------------------------- 139 ALIGN JUMP_ALIGN 140 .MovePartialWordFromPreviousLineInESSItoNewLineInESDIwithSizeInCX: 141 push si 142 push cx 143 WAIT_RETRACE_IF_NECESSARY_THEN rep movsb 144 pop cx 145 pop si 146 xchg di, si 147 shr cx, 1 ; Bytes to characters 148 mov al, ' ' 149 call DisplayPrint_RepeatCharacterFromALwithCountInCX 150 mov di, si 151 ret 152 153 ;-------------------------------------------------------------------- 154 ; .MoveCursorInDItoBeginningOfNextLine 44 ; MenuCharOut_PrintLFCRandAdjustOffsetForStartOfLine 45 ; PrintCRandAdjustOffsetForStartOfLine 155 46 ; Parameters: 156 47 ; DS: BDA segment (zero) 157 48 ; ES:DI: Ptr to cursor location 49 ; [DISPLAY_CONTEXT.wCharOutParam]: 50 ; Low byte = First column offset (after CR) 51 ; High byte = Last column offset (when using automatic line change) 158 52 ; Returns: 159 53 ; ES:DI: Ptr to beginning of new line … … 162 56 ;-------------------------------------------------------------------- 163 57 ALIGN JUMP_ALIGN 164 .MoveCursorInDItoBeginningOfNextLine:58 MenuCharOut_PrintLFCRandAdjustOffsetForStartOfLine: 165 59 mov al, LF 166 60 call DisplayCharOut_BiosTeletypeOutput 61 ; Fall to PrintCRandAdjustOffsetForStartOfLine 62 63 ALIGN JUMP_ALIGN 64 PrintCRandAdjustOffsetForStartOfLine: 167 65 mov al, CR 168 ; Fall to PrintCRfromALandAdjustColumnToMenuText169 170 171 ;--------------------------------------------------------------------172 ; PrintCRfromALandAdjustColumnToMenuText173 ; Parameters:174 ; AL: Character to output (CR)175 ; DS: BDA segment (zero)176 ; ES:DI: Ptr to video memory where to output177 ; Returns:178 ; DI: Incremented for next text line179 ; Corrupts registers:180 ; AX, DX181 ;--------------------------------------------------------------------182 ALIGN JUMP_ALIGN183 PrintCRfromALandAdjustColumnToMenuText:184 66 call DisplayCharOut_BiosTeletypeOutput 185 mov al, MENU_TEXT_COLUMN_OFFSET ; Offset to start of text 186 ; Fall to SetCursorToNextMenuLine 187 188 ;-------------------------------------------------------------------- 189 ; SetCursorToNextMenuLine 190 ; Parameters: 191 ; AL: Column offset from start of borders 192 ; DS: BDA segment (zero) 193 ; ES:DI: Ptr to video memory where to output 194 ; Returns: 195 ; DI: Adjusted for next line 196 ; Corrupts registers: 197 ; AX, DX 198 ;-------------------------------------------------------------------- 199 ALIGN JUMP_ALIGN 200 SetCursorToNextMenuLine: 201 push bp 202 203 mov bp, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam] 204 call .AddCoordinatesForNewBorderLineToAX 205 call DisplayCursor_SetCoordinatesFromAX ; Updates DI 206 207 pop bp 67 eMOVZX ax, BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.wCharOutParam] 68 add di, ax 69 ReturnSinceNoNeedToStartLineWithControlCharacter: 208 70 ret 209 210 ;--------------------------------------------------------------------211 ; .AddCoordinatesForNewBorderLineToAX212 ; Parameters:213 ; AL: Column offset from start of borders214 ; DS: BDA segment (zero)215 ; SS:BP: Ptr to MENU216 ; Returns:217 ; AX: Coordinates for new line218 ; Corrupts registers:219 ; DX220 ;--------------------------------------------------------------------221 ALIGN JUMP_ALIGN222 .AddCoordinatesForNewBorderLineToAX:223 call MenuLocation_AddTitleBordersTopLeftCoordinatesToAX224 push ax225 call DisplayCursor_GetSoftwareCoordinatesToAX226 pop dx227 mov al, dl ; Adjust column to borders228 ret
Note:
See TracChangeset
for help on using the changeset viewer.