Upload files to "programs/games/solitare"
All checks were successful
Build system / Check kernel codestyle (pull_request) Successful in 27s
Build system / Build (pull_request) Successful in 16m46s

Add KOSfuncs.inc
This commit is contained in:
Max
2026-03-02 22:02:21 +00:00
parent 836735d28c
commit 0efc35f8b2

View File

@@ -1,5 +1,5 @@
; Solitaire V1.5 - Window Edition ; Solitare V1.5.1 - KOSfuncs Edition
; Platform: MenuetOS / KolibriOS ; Platform: KolibriOS / MenuetOS
; Author: Max ; Author: Max
format binary as 'run' format binary as 'run'
@@ -8,19 +8,9 @@ org 0x0
; --- SYSTEM INCLUDES --- ; --- SYSTEM INCLUDES ---
include 'macros.inc' include 'macros.inc'
include 'KOSfuncs.inc'
; --- CONSTANTS --- ; --- GAME CONSTANTS ---
SYS_REDRAW equ 12
SYS_KEY equ 2
SYS_BUTTON equ 17
SYS_MOUSE_POS equ 37
SYS_DRAW_WINDOW equ 0
SYS_EXIT equ -1
SYS_BLIT equ 7
SYS_RANDOM equ 3
SYS_DELAY equ 5
SYS_GET_SKIN_H equ 48
CARD_W equ 50 CARD_W equ 50
CARD_H equ 70 CARD_H equ 70
STACK_OFFSET equ 20 STACK_OFFSET equ 20
@@ -51,7 +41,7 @@ STOCK_X equ 20
WASTE_X equ 80 WASTE_X equ 80
FOUNDATION_X equ 350 FOUNDATION_X equ 350
FOUND_Y equ 20 FOUND_Y equ 20
SCORE_Y equ 535 SCORE_Y equ 535
; --- HEADER --- ; --- HEADER ---
db 'MENUET01' db 'MENUET01'
@@ -64,7 +54,9 @@ dd 0, 0
start: start:
mov esp, stacktop mov esp, stacktop
mcall SYS_GET_SKIN_H, 4
; Get skin height using KOSfuncs constant
mcall SF_STYLE_SETTINGS, SSF_GET_SKIN_HEIGHT
mov [skin_h], eax mov [skin_h], eax
call init_deck call init_deck
@@ -74,90 +66,90 @@ start:
mov byte [game_won], 0 mov byte [game_won], 0
event_loop: event_loop:
mcall 11 mcall SF_CHECK_EVENT
cmp eax, 1 cmp eax, 1 ; Redraw
je on_redraw je on_redraw
cmp eax, 2 cmp eax, 2 ; Key
je on_key je on_key
cmp eax, 3 cmp eax, 3 ; Button
je on_button je on_button
call handle_mouse call handle_mouse
; Redraw only if there's an active card movement or forced update ; Logic for active card movement or forced update
cmp dword [active_card_count], 0 cmp dword [active_card_count], 0
ja update_screen_only ja update_screen_only
cmp byte [force_redraw], 1 cmp byte [force_redraw], 1
je update_screen_only je update_screen_only
mcall SYS_DELAY, 1 mcall SF_SLEEP, 1
jmp event_loop jmp event_loop
on_key: on_key:
mcall SYS_KEY mcall SF_GET_KEY
jmp event_loop jmp event_loop
on_button: on_button:
mcall SYS_BUTTON mcall SF_GET_BUTTON
shr eax, 8 shr eax, 8
cmp eax, 1 ; Close button (ID 1) cmp eax, 1 ; Close button ID
jne event_loop jne event_loop
mcall SYS_EXIT mcall SF_TERMINATE_PROCESS
on_redraw: on_redraw:
mcall SYS_REDRAW, 1 mcall SF_REDRAW, SSF_BEGIN_DRAW
; EBX: [X start : Window Width] ; EBX: Window position and width
mov ebx, 100 shl 16 + (WIN_W + 9) mov ebx, 100 shl 16 + (WIN_W + 9)
; ECX: [Y start : Window Height + skin + border] ; ECX: Window position and height
mov eax, [skin_h] mov eax, [skin_h]
add eax, WIN_H + 5 add eax, WIN_H + 5
mov ecx, 100 shl 16 mov ecx, 100 shl 16
mov cx, ax mov cx, ax
; Draw window with skin flag (0x14) ; Draw window with skin flag
mcall SYS_DRAW_WINDOW, , , 0x14000000 or COL_TABLE, , title mcall SF_CREATE_WINDOW, , , 0x14000000 or COL_TABLE, , title
mcall SYS_REDRAW, 2 mcall SF_REDRAW, SSF_END_DRAW
mov byte [force_redraw], 1 mov byte [force_redraw], 1
jmp update_screen_only jmp update_screen_only
update_screen_only: update_screen_only:
mov byte [force_redraw], 0 mov byte [force_redraw], 0
call prepare_buffer call prepare_buffer
; EDX: [x_dest:16|y_dest:16] - Offset by border and skin height ; EDX: coordinates for blit
mov edx, 4 shl 16 mov edx, 4 shl 16
add dx, word [skin_h] add dx, word [skin_h]
mcall SYS_BLIT, screen_buffer, WIN_W shl 16 + WIN_H, edx mcall SF_PUT_IMAGE, screen_buffer, WIN_W shl 16 + WIN_H, edx
jmp event_loop jmp event_loop
; --- MOUSE HANDLING --- ; --- MOUSE HANDLING ---
handle_mouse: handle_mouse:
pushad pushad
mcall SYS_MOUSE_POS, 1 mcall SF_MOUSE_GET, SSF_WINDOW_POSITION
mov ebp, eax mov ebp, eax
shr ebp, 16 shr ebp, 16
sub ebp, 5 ; Mouse X correction relative to frame sub ebp, 5 ; X correction
and eax, 0xFFFF
sub eax, [skin_h]
mov edi, eax ; EDI = Mouse Y inside workspace
mcall SYS_MOUSE_POS, 2 and eax, 0xFFFF
test eax, 1 ; Check left button sub eax, [skin_h]
mov edi, eax ; EDI = Mouse Y relative to workspace
mcall SF_MOUSE_GET, SSF_BUTTON
test eax, 1 ; Check Left Button
jnz .dragging_state jnz .dragging_state
cmp dword [mouse_lock], 1 cmp dword [mouse_lock], 1
jne .exit jne .exit
mov dword [mouse_lock], 0 mov dword [mouse_lock], 0
cmp dword [active_card_count], 0 cmp dword [active_card_count], 0
je .exit je .exit
call check_stack_move call check_stack_move
mov dword [active_card_count], 0 mov dword [active_card_count], 0
mov byte [force_redraw], 1 mov byte [force_redraw], 1
@@ -167,8 +159,8 @@ handle_mouse:
.dragging_state: .dragging_state:
cmp dword [mouse_lock], 1 cmp dword [mouse_lock], 1
je .no_deal_click je .no_deal_click
; Check if clicking on the stock pile ; Stock pile click detection
cmp ebp, STOCK_X cmp ebp, STOCK_X
jb .find_card jb .find_card
cmp ebp, STOCK_X+CARD_W cmp ebp, STOCK_X+CARD_W
@@ -177,7 +169,7 @@ handle_mouse:
jb .find_card jb .find_card
cmp edi, FOUND_Y+CARD_H cmp edi, FOUND_Y+CARD_H
jae .find_card jae .find_card
mov dword [mouse_lock], 1 mov dword [mouse_lock], 1
call deal_from_stock call deal_from_stock
mov byte [force_redraw], 1 mov byte [force_redraw], 1
@@ -185,14 +177,13 @@ handle_mouse:
ret ret
.find_card: .find_card:
mov ebx, 51 ; Check cards from top to bottom mov ebx, 51
.f_loop: .f_loop:
imul edx, ebx, CARD_STRUCT_SIZE imul edx, ebx, CARD_STRUCT_SIZE
add edx, deck_data add edx, deck_data
movsx esi, word [edx+CARD_X] movsx esi, word [edx+CARD_X]
movsx ecx, word [edx+CARD_Y] movsx ecx, word [edx+CARD_Y]
; Bounds checking for the card
cmp ebp, esi cmp ebp, esi
jb .next_s jb .next_s
add esi, CARD_W add esi, CARD_W
@@ -203,23 +194,21 @@ handle_mouse:
add ecx, CARD_H add ecx, CARD_H
cmp edi, ecx cmp edi, ecx
jae .next_s jae .next_s
; Only pick up face-up cards
cmp byte [edx+CARD_STATE], 1 cmp byte [edx+CARD_STATE], 1
jne .next_s jne .next_s
mov dword [mouse_lock], 1 mov dword [mouse_lock], 1
mov [active_stack], ebx mov [active_stack], ebx
mov dword [active_card_count], 1 mov dword [active_card_count], 1
; Calculate mouse offset within card
mov ax, word [edx+CARD_X] mov ax, word [edx+CARD_X]
sub ax, bp sub ax, bp
mov [mouse_off_x], ax mov [mouse_off_x], ax
mov ax, word [edx+CARD_Y] mov ax, word [edx+CARD_Y]
sub ax, di sub ax, di
mov [mouse_off_y], ax mov [mouse_off_y], ax
mov eax, ebx mov eax, ebx
call build_active_stack call build_active_stack
popad popad
@@ -241,21 +230,20 @@ handle_mouse:
mov eax, [active_stack + ecx*4] mov eax, [active_stack + ecx*4]
imul eax, CARD_STRUCT_SIZE imul eax, CARD_STRUCT_SIZE
add eax, deck_data add eax, deck_data
; Move active card stack with the mouse
mov dx, [mouse_off_x] mov dx, [mouse_off_x]
add dx, bp add dx, bp
mov [eax+CARD_X], dx mov [eax+CARD_X], dx
mov dx, [mouse_off_y] mov dx, [mouse_off_y]
add dx, di add dx, di
push eax push eax
mov eax, ecx mov eax, ecx
imul eax, STACK_OFFSET imul eax, STACK_OFFSET
add dx, ax add dx, ax
pop eax pop eax
mov [eax+CARD_Y], dx mov [eax+CARD_Y], dx
inc ecx inc ecx
jmp .d_lp jmp .d_lp
.exit_drag: .exit_drag:
@@ -268,7 +256,6 @@ handle_mouse:
; --- RENDERING --- ; --- RENDERING ---
prepare_buffer: prepare_buffer:
; Clear buffer with table color
mov edi, screen_buffer mov edi, screen_buffer
mov ecx, WIN_W * WIN_H mov ecx, WIN_W * WIN_H
mov eax, COL_TABLE mov eax, COL_TABLE
@@ -286,7 +273,6 @@ prepare_buffer:
call draw_slots call draw_slots
call render_score_ui call render_score_ui
; Draw static cards
xor ecx, ecx xor ecx, ecx
.draw_loop: .draw_loop:
call is_card_active call is_card_active
@@ -301,7 +287,6 @@ prepare_buffer:
cmp ecx, 52 cmp ecx, 52
jl .draw_loop jl .draw_loop
; Draw active (dragged) cards on top
xor ecx, ecx xor ecx, ecx
.draw_active: .draw_active:
cmp ecx, [active_card_count] cmp ecx, [active_card_count]
@@ -322,25 +307,18 @@ draw_card_to_buffer:
pushad pushad
movsx ebx, word [esi+CARD_X] movsx ebx, word [esi+CARD_X]
movsx ecx, word [esi+CARD_Y] movsx ecx, word [esi+CARD_Y]
; Shadow/Outline
mov edx, COL_BLACK mov edx, COL_BLACK
mov edi, CARD_W mov edi, CARD_W
mov ebp, CARD_H mov ebp, CARD_H
call fill_rect_buf call fill_rect_buf
; Face
inc ebx inc ebx
inc ecx inc ecx
mov edx, COL_WHITE mov edx, COL_WHITE
mov edi, CARD_W-2 mov edi, CARD_W-2
mov ebp, CARD_H-2 mov ebp, CARD_H-2
call fill_rect_buf call fill_rect_buf
cmp byte [esi+CARD_STATE], 1 cmp byte [esi+CARD_STATE], 1
je .face_up je .face_up
; Back of the card
add ebx, 4 add ebx, 4
add ecx, 4 add ecx, 4
mov edx, COL_REVERSE mov edx, COL_REVERSE
@@ -349,15 +327,12 @@ draw_card_to_buffer:
call fill_rect_buf call fill_rect_buf
popad popad
ret ret
.face_up: .face_up:
; Suit color determination
mov edx, COL_RED mov edx, COL_RED
cmp byte [esi+CARD_SUIT], 2 cmp byte [esi+CARD_SUIT], 2
jb .is_red jb .is_red
mov edx, COL_BLACK mov edx, COL_BLACK
.is_red: .is_red:
; Top left symbol
push edx push edx
push esi push esi
movzx eax, byte [esi+CARD_VALUE] movzx eax, byte [esi+CARD_VALUE]
@@ -365,18 +340,16 @@ draw_card_to_buffer:
mov esi, eax mov esi, eax
add ebx, 3 add ebx, 3
add ecx, 3 add ecx, 3
call draw_char_to_buf call draw_char_to_buf
pop esi pop esi
push esi push esi
movzx eax, byte [esi+CARD_SUIT] movzx eax, byte [esi+CARD_SUIT]
add eax, 13 add eax, 13
add ebx, 6 add ebx, 6
mov esi, eax mov esi, eax
call draw_char_to_buf call draw_char_to_buf
pop esi pop esi
pop edx pop edx
; Bottom right symbol (inverted position)
push edx push edx
push esi push esi
movsx ebx, word [esi+CARD_X] movsx ebx, word [esi+CARD_X]
@@ -546,32 +519,30 @@ draw_large_char_to_buf:
render_score_ui: render_score_ui:
mov edx, COL_BLACK mov edx, COL_BLACK
mov ebx, 530 mov ebx, 530
mov ecx, SCORE_Y mov ecx, SCORE_Y
xor esi, esi ; Print "SCORE" xor esi, esi
call draw_large_char_to_buf call draw_large_char_to_buf
add ebx, 10 add ebx, 10
mov esi, 1 mov esi, 1
call draw_large_char_to_buf call draw_large_char_to_buf
add ebx, 10 add ebx, 10
mov esi, 2 mov esi, 2
call draw_large_char_to_buf call draw_large_char_to_buf
add ebx, 10 add ebx, 10
mov esi, 3 mov esi, 3
call draw_large_char_to_buf call draw_large_char_to_buf
add ebx, 10 add ebx, 10
mov esi, 4 mov esi, 4
call draw_large_char_to_buf call draw_large_char_to_buf
add ebx, 20 add ebx, 20
; Handle score value display
mov eax, [score] mov eax, [score]
test eax, eax test eax, eax
jns .pos jns .pos
neg eax neg eax
push eax push eax
mov ecx, SCORE_Y mov ecx, SCORE_Y
mov esi, 5 ; Minus sign mov esi, 5
call draw_large_char_to_buf call draw_large_char_to_buf
add ebx, 10 add ebx, 10
pop eax pop eax
@@ -587,7 +558,7 @@ render_score_ui:
jnz .dec_loop jnz .dec_loop
.print_dec: .print_dec:
pop edx pop edx
add edx, 6 ; Map digit to font index add edx, 6
push ecx push ecx
mov ecx, SCORE_Y mov ecx, SCORE_Y
mov esi, edx mov esi, edx
@@ -600,7 +571,6 @@ render_score_ui:
draw_slots: draw_slots:
pushad pushad
; Draw foundation slots
mov ebx, FOUNDATION_X mov ebx, FOUNDATION_X
mov ecx, FOUND_Y mov ecx, FOUND_Y
mov dword [temp_counter2], 4 mov dword [temp_counter2], 4
@@ -612,8 +582,6 @@ draw_slots:
add ebx, 60 add ebx, 60
dec dword [temp_counter2] dec dword [temp_counter2]
jnz .f_loop jnz .f_loop
; Draw tableau slots
mov ebx, 40 mov ebx, 40
mov ecx, 110 mov ecx, 110
mov dword [temp_counter2], 7 mov dword [temp_counter2], 7
@@ -700,8 +668,6 @@ check_stack_move:
mov esi, [active_stack] mov esi, [active_stack]
imul esi, CARD_STRUCT_SIZE imul esi, CARD_STRUCT_SIZE
add esi, deck_data add esi, deck_data
; Logic for single card foundation drop
cmp dword [active_card_count], 1 cmp dword [active_card_count], 1
jne .tableau_check jne .tableau_check
mov ebx, FOUNDATION_X mov ebx, FOUNDATION_X
@@ -724,7 +690,6 @@ check_stack_move:
inc ecx inc ecx
cmp ecx, 4 cmp ecx, 4
jl .f_lp jl .f_lp
.tableau_check: .tableau_check:
mov ebx, 40 mov ebx, 40
.col_lp: .col_lp:
@@ -749,11 +714,8 @@ check_stack_move:
inc ecx inc ecx
cmp ecx, 52 cmp ecx, 52
jl .find_l jl .find_l
cmp dword [temp_val], -1 cmp dword [temp_val], -1
je .empty_col je .empty_col
; Check drop on another card
mov ecx, [temp_val] mov ecx, [temp_val]
imul edi, ecx, CARD_STRUCT_SIZE imul edi, ecx, CARD_STRUCT_SIZE
add edi, deck_data add edi, deck_data
@@ -769,8 +731,6 @@ check_stack_move:
add eax, 30 add eax, 30
cmp eax, 60 cmp eax, 60
ja .nx_col ja .nx_col
; Rules check: Opposite color and sequence (Value + 1)
mov al, [esi+CARD_SUIT] mov al, [esi+CARD_SUIT]
mov dl, [edi+CARD_SUIT] mov dl, [edi+CARD_SUIT]
shr al, 1 shr al, 1
@@ -785,9 +745,7 @@ check_stack_move:
mov dx, word [edi+CARD_Y] mov dx, word [edi+CARD_Y]
add dx, STACK_OFFSET add dx, STACK_OFFSET
jmp .apply_move jmp .apply_move
.empty_col: .empty_col:
; Check drop on empty column (only Kings)
movsx eax, word [esi+CARD_X] movsx eax, word [esi+CARD_X]
sub eax, ebx sub eax, ebx
add eax, 25 add eax, 25
@@ -802,13 +760,10 @@ check_stack_move:
jne .nx_col jne .nx_col
mov dx, 110 mov dx, 110
jmp .apply_move jmp .apply_move
.nx_col: .nx_col:
add ebx, 100 add ebx, 100
cmp ebx, 740 cmp ebx, 740
jl .col_lp jl .col_lp
; No valid move found, snap back to original position
xor ecx, ecx xor ecx, ecx
.back: .back:
cmp ecx, [active_card_count] cmp ecx, [active_card_count]
@@ -825,12 +780,11 @@ check_stack_move:
.out: .out:
popad popad
ret ret
.found_match: .found_match:
add dword [score], 10 add dword [score], 10
mov word [esi+CARD_X], bx mov word [esi+CARD_X], bx
mov word [esi+CARD_Y], FOUND_Y mov word [esi+CARD_Y], FOUND_Y
mov byte [esi+CARD_LOC], 8 ; Set location to foundation mov byte [esi+CARD_LOC], 8
pushad pushad
mov eax, [active_stack] mov eax, [active_stack]
mov [temp_active], eax mov [temp_active], eax
@@ -840,7 +794,6 @@ check_stack_move:
call check_win call check_win
popad popad
ret ret
.apply_move: .apply_move:
xor ecx, ecx xor ecx, ecx
push eax push eax
@@ -927,14 +880,11 @@ check_foundation_logic:
inc ebp inc ebp
cmp ebp, 52 cmp ebp, 52
jl .find_top jl .find_top
mov al, [esi+CARD_VALUE] mov al, [esi+CARD_VALUE]
mov dl, [esi+CARD_SUIT] mov dl, [esi+CARD_SUIT]
cmp dword [temp_counter], -1 cmp dword [temp_counter], -1
jne .not_empty jne .not_empty
cmp al, 1
; Empty foundation slot only accepts Aces (Value 1)
cmp al, 1
je .valid je .valid
jmp .invalid jmp .invalid
.not_empty: .not_empty:
@@ -1003,7 +953,7 @@ auto_reveal_all:
jl .find_lowest jl .find_lowest
cmp dword [temp_val], -1 cmp dword [temp_val], -1
je .next_col je .next_col
mov byte [esi+CARD_STATE], 1 ; Flip the bottom card of the stack face up mov byte [esi+CARD_STATE], 1
.next_col: .next_col:
add ebx, 100 add ebx, 100
cmp ebx, 740 cmp ebx, 740
@@ -1012,7 +962,6 @@ auto_reveal_all:
ret ret
move_single_to_top: move_single_to_top:
; Moves a card to the end of the deck_data array so it's drawn last (on top)
mov eax, [temp_active] mov eax, [temp_active]
cmp eax, 51 cmp eax, 51
je .done je .done
@@ -1055,7 +1004,7 @@ deal_from_stock:
ret ret
.o: .o:
mov byte [esi+CARD_STATE], 1 mov byte [esi+CARD_STATE], 1
mov byte [esi+CARD_LOC], 9 ; Move to waste mov byte [esi+CARD_LOC], 9
mov word [esi+CARD_X], WASTE_X mov word [esi+CARD_X], WASTE_X
mov word [esi+CARD_Y], FOUND_Y mov word [esi+CARD_Y], FOUND_Y
mov [temp_active], ecx mov [temp_active], ecx
@@ -1100,7 +1049,7 @@ init_deck:
shuffle_deck: shuffle_deck:
mov dword [temp_counter2], 51 mov dword [temp_counter2], 51
.sh: .sh:
mcall SYS_RANDOM mcall SF_GET_SYS_TIME
and eax, 0xFFFF and eax, 0xFFFF
xor edx, edx xor edx, edx
mov ebx, [temp_counter2] mov ebx, [temp_counter2]
@@ -1167,7 +1116,7 @@ layout_tableau:
.fin: ret .fin: ret
; --- DATA & FONTS --- ; --- DATA & FONTS ---
title db 'Solitaire V1.5', 0 title db 'Solitare V1.5.1', 0
score dd 0 score dd 0
game_won db 0 game_won db 0
mouse_lock dd 0 mouse_lock dd 0
@@ -1184,7 +1133,6 @@ active_stack rd 13
skin_h dd 0 skin_h dd 0
font_8x12: font_8x12:
; Definitions for S, C, O, R, E, -, and digits 0-9
db 01111100b,10000010b,10000000b,10000000b,01111100b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; S db 01111100b,10000010b,10000000b,10000000b,01111100b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; S
db 01111100b,10000010b,10000000b,10000000b,10000000b,10000000b,10000000b,10000010b,01111100b,00000000b,00000000b,00000000b ; C db 01111100b,10000010b,10000000b,10000000b,10000000b,10000000b,10000000b,10000010b,01111100b,00000000b,00000000b,00000000b ; C
db 01111100b,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; O db 01111100b,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; O
@@ -1192,10 +1140,10 @@ db 11111100b,10000010b,10000010b,10000010b,11111100b,10010000b,10001000b,1000010
db 11111110b,10000000b,10000000b,10000000b,11111100b,10000000b,10000000b,10000000b,11111110b,00000000b,00000000b,00000000b ; E db 11111110b,10000000b,10000000b,10000000b,11111100b,10000000b,10000000b,10000000b,11111110b,00000000b,00000000b,00000000b ; E
db 00000000b,00000000b,00000000b,00000000b,11111111b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b ; - db 00000000b,00000000b,00000000b,00000000b,11111111b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b,00000000b ; -
db 00111100b,01000010b,10000001b,10000001b,10000001b,10000001b,10000001b,01000010b,00111100b,00000000b,00000000b,00000000b ; 0 db 00111100b,01000010b,10000001b,10000001b,10000001b,10000001b,10000001b,01000010b,00111100b,00000000b,00000000b,00000000b ; 0
db 00011000b,00111000b,00001000b,00001000b,00001000b,00001000b,00001000b,00001000b,00111100b,00000000b,00000000b,00000000b ; 1 db 00011000b,00111000b,00001000b,00001000b,00001000b,00001000b,00001000b,00001000b,00111100b,00000000b,00000000b,00000000b ; 1
db 01111100b,10000010b,00000010b,00000010b,01111100b,10000000b,10000000b,10000000b,11111110b,00000000b,00000000b,00000000b ; 2 db 01111100b,10000010b,00000010b,00000010b,01111100b,10000000b,10000000b,10000000b,11111110b,00000000b,00000000b,00000000b ; 2
db 01111100b,10000010b,00000010b,00000010b,00111100b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 3 db 01111100b,10000010b,00000010b,00000010b,00111100b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 3
db 00001000b,00011000b,00101000b,01001000b,10001000b,11111111b,00001000b,00001000b,00001000b,00000000b,00000000b,00000000b ; 4 db 00001000b,00011000b,00101000b,01001000b,10001000b,11111111b,00001000b,00001000b,00001000b,00000000b,00000000b,00000000b ; 4
db 11111110b,10000000b,10000000b,11111100b,00000010b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 5 db 11111110b,10000000b,10000000b,11111100b,00000010b,00000010b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 5
db 01111100b,10000010b,10000000b,11111100b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 6 db 01111100b,10000010b,10000000b,11111100b,10000010b,10000010b,10000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 6
db 11111110b,00000010b,00000100b,00001000b,00010000b,00100000b,00100000b,00100000b,00100000b,00000000b,00000000b,00000000b ; 7 db 11111110b,00000010b,00000100b,00001000b,00010000b,00100000b,00100000b,00100000b,00100000b,00000000b,00000000b,00000000b ; 7
@@ -1203,7 +1151,6 @@ db 01111100b,10000010b,10000010b,10000010b,01111100b,10000010b,10000010b,1000001
db 01111100b,10000010b,10000010b,10000010b,10000010b,01111110b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 9 db 01111100b,10000010b,10000010b,10000010b,10000010b,01111110b,00000010b,10000010b,01111100b,00000000b,00000000b,00000000b ; 9
font_5x7: font_5x7:
; Definitions for A, 2-10, J, Q, K, and Suits
db 01110000b,10001000b,10001000b,11111000b,10001000b,10001000b,10001000b ; A db 01110000b,10001000b,10001000b,11111000b,10001000b,10001000b,10001000b ; A
db 11110000b,00001000b,00010000b,00100000b,01000000b,10000000b,11111000b ; 2 db 11110000b,00001000b,00010000b,00100000b,01000000b,10000000b,11111000b ; 2
db 11110000b,00001000b,00001000b,01110000b,00001000b,00001000b,11110000b ; 3 db 11110000b,00001000b,00001000b,01110000b,00001000b,00001000b,11110000b ; 3