Upload files to "programs/games/solitare"

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