; ======================================================================================== ; 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
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|👍
/👎