satpro icon

Print 8x8 Text

satpro | PRO | 02/16/26 02:54:36 PM UTC | 0 ⭐ | 14060 👁️ | Never ⏰ | []
ASM (NASM) |

0 B

|

Source Code

|

0 👍

/

0 👎

 
 
 
 
; ========================================================================================
 
; Print8 params                Print (x,y,a)
; p1: a             ascii     r8        ascii character, 0-255
 
 
align 16
export Print8:             ; print an 8x8 pet 8032 text character @(x,y)
 
  sub rsp, 28h
  mov [rsp+00h], rsi
  mov [rsp+08h], rdi
  mov [rsp+10h], rbx
  mov [rsp+18h], rbp
 
; ----  Enter  -----
 
 
; 1. src
 
; get a ptr to the font data
  mov esi, FONT8$             ; ptr to font sets in emulator ram @ $E000
 
; get offset to font bitmap data (char# * 8 bytes/char)
  mov ebx, r8d                ; get char#
  shl ebx, 3                  ; mult char# x 8 bytes per char
  add esi, ebx                ; rsi: points to param character's bitmap data
 
; 2. dst
 
  mov edi, VIDEO$             ; base
  
; add (x,y) offsets
  mov eax, [CursorX8]         ; get (x)
  mov ebx, [CursorY8]         ; get (y)
 
  shl eax, 2                  ; x-offset = x * 4
  shl ebx, 13                 ; y-offset = y * 2000h
 
  add edi, eax                ; add x-offset to base surface
  add edi, ebx                ; add y-offset to base address
 
  mov ebp, edi                ; copy print address to rowptr
 
  mov r10d, [BGcolor8]        ; get bg color
  mov r11d, [FGcolor8]        ; get fg color
 
; 3.  -----  the print loop  -----
 
  mov dl, 8                   ; init rowctr (8 rows, 8 pixels each)
do8rows:            ; 8-bit processing of one screen row of char data
  mov al, [esi]               ; ax = get bitmap data for 1 screen row (8 pixels, 1 byte)
  mov cl, 8                   ; init pixelctr = 8 pixels per screen row
 
do8pixels:          ; 8 shifts = 1 row (1 byte) of pixel data, poke on 1-bits only
  shl al, 1                   ; shift bit 7 into carry flag
  cmovnc ebx, r10d            ; when bit = 0, use bg color
  cmovc ebx, r11d             ; when bit = 1, use fg color
 
  mov [edi], ebx              ; poke the color to surface memory
 
  add edi, 4                  ; advance to next x-pixel (right 1)
  dec cl                      ; pixelctr = pixelctr-1
  jnz < do8pixels             ; loop until pixelctr = 0
 
; re-sync the pointers for the next row (down 1) 
  add esi, 1                  ; advance fontptr to next source row (+pitch = 1 byte)
  add ebp, 2000h              ; rowptr + pitch = next row
  mov edi, ebp                ; copy rowptr to colptr
  dec dl                      ; rowctr = rowctr-1
  jnz < do8rows               ; loop until rowctr = 0
 
  add D[CursorX8], 8          ; get CursorX8 ready for next Print: +8 pixels
 
 
; -----  Exit  -----
 
  mov rsi, [rsp+00h]
  mov rdi, [rsp+08h]
  mov rbx, [rsp+10h]
  mov rbp, [rsp+18h]
  add rsp, 28h
  ret
 
; ========================================================================================
 
; Plot8(x,y)
 
; p1: x
; p2: y
 
align 16
export Plot8:
 
  mov [CursorX8], r8d
  mov [CursorY8], r9d
 
  ret
 
; ========================================================================================
 
; SetTextColor8(bg_color,fg_color)
 
; p1: bg color
; p2: fg color
 
align 16
export SetTextColor8:
 
  mov [BGcolor8], r8d
  mov [FGcolor8], r9d
 
  ret
 
; ========================================================================================
 
; SetFont8(font_num)
 
; p1: font# (0 = serif, 1 = sans)
 
align 16
export SetFont8:
 
  mov [FontNum8], r8d
 
  ret
 
; ========================================================================================
 
; String8           String8 (x,y,pStringz)
; p1: pStringz      r8        ptr to text string
 
align 16
export String8:            ; String prints a 0-term ascii string
 
  sub rsp, 18h
  mov [rsp+00h], rsi          ; preserve
  mov [rsp+08h], rbx          ; preserve
 
; -----  Enter  -----
 
; loop to print a 0-term string
  mov esi, r8d                ; copy of the string ptr
  xor ebx, ebx                ; init string length index = 0
 
strloop8:
  movzx r8d, B[esi + ebx]     ; get a character from the string (r8 = param for Print)
  or r8d, r8d                 ; check to see if character = 0
  jz > strExit8               ; if yes, exit
 
  call Print8                 ; print the character in r8
 
  inc ebx                     ; increment string length index
  jnz < strloop8              ; always loop back for more
 
 
; -----  Exit  -----
 
strExit8:
  mov rsi, [rsp+00h]          ; restore
  mov rbx, [rsp+08h]          ; restore
  add rsp, 18h
 
  ret
 
; ========================================================================================
 
; Print8DecD (n)
; p1: n             x         r8        
 
align 16
export Print8DecD:
 
  sub rsp, 18h
 
  mov [rsp+00h], rsi          ; save (x) for String16
  mov [rsp+08h], rdi          ; save (y) for String16
  mov [rsp+10h], rbx
 
; ----- ENTER -----
 
 
  lea edi, textBuffer + 15    ; Point RDI to the last byte of the buffer
  mov B[edi], 0               ; Null-terminate the string
  dec edi                     ; Move to the previous byte
  mov ebx, 10                 ; Divisor for base-10 conversion
  mov eax, r8d                ; number to convert (can be any unsigned 32-bit value)
 
; Handle the special case of 0
  test eax, eax
  jnz > convert_loop8
  mov B[rdi], '0'
  jmp > donep8
 
convert_loop8:
  xor edx, edx                ; Clear EDX for division (EDX:EAX / EBX)
  div ebx                     ; EAX = EAX / 10, EDX = remainder (0-9)
  add dl, '0'                 ; Convert remainder to ASCII
  mov [edi], dl               ; Store ASCII digit
  dec edi                     ; Move backward in buffer
  test eax, eax
  jnz < convert_loop8         ; Repeat if quotient is not zero
 
donep8:
  inc edi                     ; RDI now points to the first digit
; At this point, RDI points to the start of the null-terminated string in textBuffer
 
; Print the string
  mov r8d, edi                ; ptr to number string
  call String8                ; print the string
 
 
; ----- EXIT -----
 
  mov rsi, [rsp+00h]
  mov rdi, [rsp+08h]
  mov rbx, [rsp+10h]
 
  add rsp, 18h                ; fix the stack
  ret
 
; ========================================================================================
 
; Print8HexB (n)
; p1: n             r8
 
align 16
export Print8HexB:
 
  call dw2hex                 ; convert to an ascii string
 
  lea r8d, textBuffer+6       ; address of the number as a text string
  call String8                ; print the number
 
  ret
 
; ========================================================================================
 
; Print8HexW (n)
; p1: n             r8
 
export align 16
Print8HexW:
 
  call dw2hex                 ; convert to an ascii string
 
  lea r8d, textBuffer+4       ; address of the number as a text string
  call String8                ; print the number
 
  ret
 
;=========================================================================
 
; Print8HexD (n)
; p1: n             r8
 
align 16
export Print8HexD:
 
  call dw2hex                 ; convert to an ascii string
 
  lea r8d, textBuffer         ; address of the number as a text string
  call String8                ; print the number
 
  ret
 
;=========================================================================
 
; Print8BinB (n)
; p1: n             r8
 
align 16
export Print8BinB:
 
  call dw2bin                 ; convert to an ascii string
 
  lea r8d, textBuffer+24      ; address of the number as a text string
  call String8                ; print the number
 
  ret
 
;=========================================================================
 
; Print8BinW (n)
; p1: n             r8
 
align 16
export Print8BinW:
 
  call dw2bin                 ; convert to an ascii string
 
  lea r8, textBuffer+16       ; address of the number as a text string
  call String8                ; print the number
 
  ret
 
;=========================================================================
 
; Print8BinD (n)
; p1: n             r8
 
align 16
export Print8BinD:
 
  call dw2bin                 ; convert to an ascii string
 
  lea r8, textBuffer          ; address of the number as a text string
  call String8                ; print the number
 
  ret
 
;=========================================================================
 
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎