Changeset 48 in xtideuniversalbios for trunk/Assembly_Library/Src/Display
- Timestamp:
- Oct 8, 2010, 3:44:05 PM (14 years ago)
- google:author:
- aitotat
- Location:
- trunk/Assembly_Library/Src/Display
- Files:
-
- 1 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Assembly_Library/Src/Display/DisplayCharOut.asm
r47 r48 2 2 ; Project name : Assembly Library 3 3 ; Created date : 26.6.2010 4 ; Last update : 4.10.20104 ; Last update : 8.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Functions for outputting characters to video memory. … … 11 11 ; Section containing code 12 12 SECTION .text 13 14 ;--------------------------------------------------------------------15 ; WAIT_RETRACE_IF_NECESSARY_THEN16 ; Parameters:17 ; AL: Character to output18 ; AH: Attribute to output (stosw only)19 ; DS: BDA segment (zero)20 ; ES:DI: Ptr to video memory where to output21 ; Returns:22 ; DI: Incremented for next character23 ; Corrupts registers:24 ; AX, DX25 ;--------------------------------------------------------------------26 %macro WAIT_RETRACE_IF_NECESSARY_THEN 127 %ifdef ELIMINATE_CGA_SNOW28 %ifidn %1, stosb29 call StosbWithoutCgaSnow30 %else31 call StoswWithoutCgaSnow32 %endif33 %else34 %1 ; STOSB or STOSW35 %endif36 %endmacro37 38 13 39 14 ;-------------------------------------------------------------------- … … 155 130 .BufferFull: 156 131 ret 157 158 159 ; STOSB and STOSW replacement functions to prevent CGA snow. These will slow160 ; drawing a lot so use them only if it is necessary to eliminate CGA snow.161 %ifdef ELIMINATE_CGA_SNOW162 163 OFFSET_TO_CGA_STATUS_REGISTER EQU 6 ; Base port 3D4h + 6 = 3DAh164 CGA_STATUS_REGISTER EQU 3DAh165 166 ;--------------------------------------------------------------------167 ; WAIT_UNTIL_SAFE_CGA_WRITE168 ; Parameters:169 ; DX: CGA Status Register Address (3DAh)170 ; Returns:171 ; Nothing172 ; Corrupts registers:173 ; AL174 ;--------------------------------------------------------------------175 %macro WAIT_UNTIL_SAFE_CGA_WRITE 0176 %%WaitUntilNotInRetrace:177 in al, dx178 shr al, 1 ; 1 = Bit 0: A 1 indicates that regen-buffer memory access can be179 ; made without interfering with the display. (H or V retrace)180 jc SHORT %%WaitUntilNotInRetrace181 %%WaitUntilNextRetraceStarts:182 in al, dx183 shr al, 1184 jnc SHORT %%WaitUntilNextRetraceStarts185 %endmacro186 187 ;--------------------------------------------------------------------188 ; StosbWithoutCgaSnow189 ; StoswWithoutCgaSnow190 ; Parameters:191 ; AL: Character to output192 ; AH: Attribute to output (StoswWithoutCgaSnow only)193 ; DS: BDA segment (zero)194 ; ES:DI: Ptr to video memory where to output195 ; Returns:196 ; DI: Incremented for next character197 ; Corrupts registers:198 ; AX, DX199 ;--------------------------------------------------------------------200 ALIGN JUMP_ALIGN201 StosbWithoutCgaSnow:202 call DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA203 jne SHORT .StosbWithoutWaitSinceUnknownPort204 205 mov ah, al206 cli ; Interrupt request would mess up timing207 WAIT_UNTIL_SAFE_CGA_WRITE208 mov al, ah209 .StosbWithoutWaitSinceUnknownPort:210 stosb211 sti212 ret213 214 ALIGN JUMP_ALIGN215 StoswWithoutCgaSnow:216 push bx217 call DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA218 jne SHORT .StoswWithoutWaitSinceUnknownPort219 220 xchg bx, ax221 cli ; Interrupt request would mess up timing222 WAIT_UNTIL_SAFE_CGA_WRITE223 xchg ax, bx224 .StoswWithoutWaitSinceUnknownPort:225 stosw226 pop bx227 sti228 ret229 230 231 ;--------------------------------------------------------------------232 ; DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA233 ; Parameters:234 ; DS: BDA segment (zero)235 ; Returns:236 ; DX: CGA Status Register Address237 ; ZF: Set if CGA Base Port found in BDA238 ; Corrupts registers:239 ; Nothing240 ;--------------------------------------------------------------------241 ALIGN JUMP_ALIGN242 DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA:243 mov dx, [BDA.wVidPort]244 add dl, OFFSET_TO_CGA_STATUS_REGISTER245 cmp dx, CGA_STATUS_REGISTER246 ret247 248 %endif ; ELIMINATE_CGA_SNOW -
trunk/Assembly_Library/Src/Display/DisplayContext.asm
r45 r48 2 2 ; Project name : Assembly Library 3 3 ; Created date : 25.6.2010 4 ; Last update : 28.9.20104 ; Last update : 5.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Functions for managing display context. … … 102 102 103 103 ;-------------------------------------------------------------------- 104 ; DisplayContext_PrepareOffScreenBufferInESBXtoESDI 105 ; Parameters: 106 ; BX:AX: Ptr to off screen buffer 107 ; Returns: 108 ; Nothing 109 ; Corrupts registers: 110 ; AX 111 ;-------------------------------------------------------------------- 112 ALIGN JUMP_ALIGN 113 DisplayContext_PrepareOffScreenBufferInESBXtoESDI: 114 push ds 115 116 LOAD_BDA_SEGMENT_TO ds, di 117 xchg ax, bx 118 mov bx, es 119 call DisplayContext_SetCharacterPointerFromBXAX ; ES:DI now has the pointer 120 121 mov bl, ATTRIBUTES_NOT_USED 122 mov ax, BUFFER_OUTPUT_WITH_CHAR_ONLY 123 call DisplayContext_SetCharOutputFunctionFromAXwithAttribFlagInBL 124 125 mov bx, di 126 pop ds 127 ret 128 129 130 ;-------------------------------------------------------------------- 104 131 ; DisplayContext_SynchronizeToHardware 105 132 ; Parameters: … … 123 150 ; DS: BDA segment (zero) 124 151 ; Returns: 125 ; ES:DI: Pointer that was in DX:AX152 ; ES:DI: Pointer that was in BX:AX 126 153 ; Corrupts registers: 127 154 ; AX -
trunk/Assembly_Library/Src/Display/DisplayFormat.asm
r47 r48 2 2 ; Project name : Assembly Library 3 3 ; Created date : 29.6.2010 4 ; Last update : 4.10.20104 ; Last update : 8.10.2010 5 5 ; Author : Tomi Tilli 6 6 ; Description : Functions for displaying formatted strings. … … 220 220 dec di ; DI = Offset where to move last byte formatted 221 221 xchg bx, ax ; BX = BYTEs to prepend 222 call .Reverse MoveCXbytesFromESSItoESDI222 call .ReverseCopyCXbytesFromESSItoESDI 223 223 xchg ax, bx 224 224 call .ReversePrintAXspacesStartingFromESDI … … 231 231 232 232 ;-------------------------------------------------------------------- 233 ; .Reverse MoveCXbytesFromESSItoESDI234 ; Parameters: 235 ; CX: Number of bytes to move236 ; DS: BDA segment (zero) 237 ; ES:SI: Ptr to source in video RAM238 ; ES:DI: Ptr to destination in video RAM239 ; Returns: 240 ; DI: Offset to character preceeding string just moved233 ; .ReverseCopyCXbytesFromESSItoESDI 234 ; Parameters: 235 ; CX: Number of bytes to copy 236 ; DS: BDA segment (zero) 237 ; ES:SI: Ptr to old location 238 ; ES:DI: Ptr to new location 239 ; Returns: 240 ; DI: Updated to before last character copied 241 241 ; Corrupts registers: 242 242 ; AX, CX, DX, SI 243 243 ;-------------------------------------------------------------------- 244 244 ALIGN JUMP_ALIGN 245 .ReverseMoveCXbytesFromESSItoESDI: 246 %ifdef ELIMINATE_CGA_SNOW 247 call DisplayCharOut_LoadAndVerifyStatusRegisterFromBDA 248 je SHORT .WaitUntilReadyToMoveNextByte 249 %endif 250 245 .ReverseCopyCXbytesFromESSItoESDI: 246 test BYTE [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags], FLG_CONTEXT_ATTRIBUTES 247 jz SHORT .CopyWithoutDisplayProcessing 248 249 WAIT_RETRACE_IF_NECESSARY_THEN rep movsb 250 dec di ; Point to preceeding character instead of attribute 251 ret 252 ALIGN JUMP_ALIGN 253 .CopyWithoutDisplayProcessing: 251 254 eSEG_STR rep, es, movsb 252 253 %ifdef ELIMINATE_CGA_SNOW254 jmp SHORT .AlignDIforFirstPreceedingSpace255 .WaitUntilReadyToMoveNextByte:256 cli ; Interrupt request would mess up timing257 WAIT_UNTIL_SAFE_CGA_WRITE258 .MovsbWithoutWaitSinceUnknownPort:259 eSEG es260 movsb261 sti262 loop .WaitUntilReadyToMoveNextByte263 %endif264 ; Fall to .AlignDIforFirstPreceedingSpace265 266 ;--------------------------------------------------------------------267 ; .AlignDIforFirstPreceedingSpace268 ; Parameters:269 ; DS: BDA segment (zero)270 ; ES:DI: Byte offset before last byte moved271 ; Returns:272 ; DI: Offset to space preceeding moved string273 ; Corrupts registers:274 ; AX275 ;--------------------------------------------------------------------276 ALIGN JUMP_ALIGN277 .AlignDIforFirstPreceedingSpace:278 mov al, [VIDEO_BDA.displayContext+DISPLAY_CONTEXT.bFlags]279 and ax, BYTE FLG_CONTEXT_ATTRIBUTES280 not ax281 and di, ax282 255 ret 283 256 -
trunk/Assembly_Library/Src/Display/DisplayPrint.asm
r44 r48 25 25 ; minimum number of characters. For example %8d would append spaces 26 26 ; after integer so that at least 8 characters would be printed. 27 ; 28 ; When placing '-' after number, then spaces will be used for prepending. 29 ; For example %8-d would prepend integer with spaces so that at least 30 ; 8 characters would be printed. 27 31 ; 28 32 ; DisplayPrint_FormattedNullTerminatedStringFromCSSI
Note:
See TracChangeset
for help on using the changeset viewer.