forked from KolibriOS/kolibrios
2724b73716
git-svn-id: svn://kolibrios.org@2023 a494cfbc-eb01-0410-851d-a64ba20cac60
246 lines
6.2 KiB
NASM
246 lines
6.2 KiB
NASM
; SQ_game for MenuetOS
|
|
; Author: Alexei Ershov aka ealex
|
|
; E-mail: e-al[at]yandex[dot]ru
|
|
; Fidonet: 2:469/335.38
|
|
; slightly optimized by diamond
|
|
; english translation by diamond (two strings in end of source)
|
|
|
|
|
|
BtnSize equ 32 ; à §¬¥à ª®¯ª¨
|
|
BtnSpace equ 10 ; ¯à®¬¥¦ã⮪ ¬¥¦¤ã ª®¯ª ¬¨
|
|
NofBtn equ 4 ; à §¬¥à ¯®«ï (3-15)
|
|
Color1 equ 0xcc0000
|
|
Color2 equ 0x00cc00
|
|
|
|
FieldSize = (BtnSize+BtnSpace)*NofBtn + BtnSpace*3
|
|
center = FieldSize / 2
|
|
|
|
|
|
use32 ; ¢ª«îç¨âì 32-¡¨âë© à¥¦¨¬ áᥬ¡«¥à
|
|
org 0x0 ; ¤à¥á æ¨ï á ã«ï
|
|
|
|
db 'MENUET01' ; 8-¡ ©âë© ¨¤¥â¨ä¨ª â®à MenuetOS
|
|
dd 0x01 ; ¢¥àá¨ï § £®«®¢ª (¢á¥£¤ 1)
|
|
dd START ; ¤à¥á ¯¥à¢®© ª®¬ ¤ë
|
|
dd I_END ; à §¬¥à ¯à®£à ¬¬ë
|
|
dd 0x1000 ; ª®«¨ç¥á⢮ ¯ ¬ïâ¨
|
|
dd 0x1000 ; ¤à¥á ¢¥àè¨ë áâíª
|
|
dd 0x0 ; ¤à¥á ¡ãä¥à ¤«ï ¯ à ¬¥â஢ (¥ ¨á¯®«ì§ã¥âáï)
|
|
dd 0x0 ; § १¥à¢¨à®¢ ®
|
|
|
|
include 'lang.inc'
|
|
include 'MACROS.INC' ; ¬ ªà®áë ®¡«¥£ç îâ ¦¨§ì áᥬ¡«¥à騪®¢!
|
|
|
|
|
|
START:
|
|
call Game_Init
|
|
red:
|
|
call Draw_Window
|
|
|
|
still:
|
|
mcall 10 ; äãªæ¨ï 10 - ¦¤ âì ᮡëâ¨ï
|
|
dec eax
|
|
jz red
|
|
dec eax
|
|
jnz button
|
|
|
|
key: ; ¦ â ª« ¢¨è ª« ¢¨ âãà¥
|
|
mov al, 2
|
|
int 0x40
|
|
jmp still
|
|
;---------------------------------------------------------------------
|
|
|
|
button:
|
|
mov al, 17 ; 17 - ¯®«ãç¨âì ¨¤¥â¨ä¨ª â®à ¦ ⮩ ª®¯ª¨
|
|
int 0x40
|
|
cmp ah, 1 ; ¥á«¨ ¦ â ª®¯ª á ®¬¥à®¬ 1, ¢ë室¨¬
|
|
je .exit
|
|
|
|
cmp ah, 2 ; ¥á«¨ ¦ â ª®¯ª 2, ç¨ ¥¬ ®¢ãî ¨£àã
|
|
je START
|
|
|
|
; � ¦ ª®¯ª ¯®«¥
|
|
inc dword [moves] ; 㢥«¨ç¨¢ ¥¬ ç¨á«® 室®¢
|
|
|
|
shr eax, 8 ; ¢ eax ¨¤¥â¨ä¨ª â®à ¦ ⮩ ª®¯ª¨
|
|
|
|
mov dh, NofBtn
|
|
div dh ; al = ax(®¬¥à ª®¯ª¨) / NofBtn
|
|
; ah = ®áâ ⮪ (á¬. à¨á㮪)
|
|
mov ebx, eax ; á®åà ¨¬ ç á⮥ ¨ ®áâ ⮪ ¢ ebx
|
|
|
|
; al\ah 0 1 2 3
|
|
; +-+ +-+ +-+ +-+
|
|
; 1 |4| |5| |6| |7|
|
|
; +-+ +-+ +-+ +-+
|
|
|
|
; +-+ +-+ +-+ +-+
|
|
; 2 |8| |9| |10 |11
|
|
; +-+ +-+ +-+ +-+
|
|
|
|
; +-+ +-+ +-+ +-+
|
|
; 3 |12 |13 |14 |15
|
|
; +-+ +-+ +-+ +-+
|
|
|
|
; +-+ +-+ +-+ +-+
|
|
; 4 |16 |17 |18 |19
|
|
; +-+ +-+ +-+ +-+
|
|
|
|
; Œ¥ï¥¬ 梥â á⮫¡¨ª
|
|
shr eax, 8 ; eax = ah
|
|
mov edi, field
|
|
add edi, eax ; edi 㪠§¢ë¥â ¯¥à¢ãî ª®¯ªã ¨ ¨áª®¬®¬ áâ«¡æ¥
|
|
mov ecx, NofBtn
|
|
@@:
|
|
not byte[edi] ; ¬¥ï¥¬ 梥⠢® ¢á¥¬ á⮫¡¨ª¥
|
|
dec ecx
|
|
add edi, NofBtn
|
|
test ecx, ecx
|
|
jnz @r
|
|
|
|
; Œ¥ï¥¬ 梥â áâப¨
|
|
mov eax, ebx ; ¢®ááâ ¢«¨¢ ¥¬ eax
|
|
dec eax
|
|
mov dl, NofBtn
|
|
mul dl ; ax = al * NofBtn
|
|
mov edi, field
|
|
add edi, eax ; edi 㪠§¢ë¥â ¯¥à¢ãî ª®¯ªã ¢ ¨áª®¬®© áâப¥
|
|
mov ecx, NofBtn
|
|
@@:
|
|
not byte [edi] ; ¬¥ï¥¬ 梥⠢® ¢á¥© áâப¥
|
|
dec ecx
|
|
inc edi
|
|
test ecx, ecx
|
|
jnz @r
|
|
; –¢¥â ¦ ⮩ ª®¯ª¨ ¬¥ï«áï 2 à § (ª®£¤ ®¡à ¡ âë¢ «¨ áâப㠨 á⮫¡¥æ),
|
|
; â.¥. ®áâ «áï ¯¥à¢® ç «ë¬
|
|
; Œ¥ï¥¬ 梥⠦ ⮩ ª®¯ª¨
|
|
shr ebx, 8 ; ebx = ®áâ ⮪ (ah à¨á㪥)
|
|
not byte [field+eax+ebx]
|
|
jmp red
|
|
|
|
|
|
|
|
.exit:
|
|
mcall -1 ; ¨ ç¥ ª®¥æ ¯à®£à ¬¬ë
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Draw_Window
|
|
;----------------------------------------------------------------------------
|
|
Draw_Window:
|
|
|
|
mcall 12, 1
|
|
mcall 0, 200*65536+FieldSize,\
|
|
200*65536+FieldSize+20+20+20,\
|
|
0x14AABBCC, 0x805080D0, header
|
|
|
|
mcall 8, BtnSpace*2*65536 + 83,\
|
|
(FieldSize+BtnSpace+20)*65536+ 15, 2
|
|
mcall 4, (BtnSpace*2+3)*65536+(BtnSize+BtnSpace)*NofBtn+BtnSpace*4+20+4,\
|
|
0x10DDEEFF, strNew, strNew_e - strNew
|
|
mcall 4, (center - 25) * 65536 + 30, 0, strMovs, strMovs_e - strMovs
|
|
mcall 47, 4*65536+1, moves, (center + 2 ) * 65536 + 30, 0
|
|
|
|
|
|
|
|
mov ecx, (20+20+BtnSpace-BtnSize)*65536+BtnSize
|
|
mov edx, NofBtn ; ¨¤¥â¨ä¨ª â®à ¯¥à¢®© ª®¯ª¨ ¯®«¥
|
|
; ᬠà¨á㮪
|
|
|
|
buttons: ; à¨á㥬 ª®¯®çª¨
|
|
mov eax, edx
|
|
mov dh, NofBtn
|
|
div dh ; al = ax / dh, ah - ®áâ ⮪
|
|
mov dh, 0
|
|
test ah, ah ; ¥á«¨ ah = 0, ç¨ ¥¬ ®¢ë© àï¤
|
|
jnz @f
|
|
add ecx, (BtnSize+BtnSpace)*65536
|
|
mov ebx, BtnSpace*2*65536+BtnSize
|
|
@@:
|
|
mov esi, Color1 ; ¡ ©â ¯® ¤à¥áã
|
|
cmp byte [field-NofBtn+edx], 0 ; field-NofBtn+®¬¥à_ª®¯ª¨
|
|
jz @f ; £®¢®à¨â ® ¥¥ 梥â¥
|
|
mov esi, Color2
|
|
@@:
|
|
mcall 8,
|
|
add ebx, (BtnSize+BtnSpace)*65536
|
|
inc edx ; ¯¥à¥å®¤¨¬ ª á«¥¤ãî饩 ª®¯ª¥
|
|
cmp edx, NofBtn*(NofBtn+1)
|
|
jb buttons
|
|
|
|
mcall 12, 2 ; äãªæ¨ï 12: á®®¡é¨âì Ž‘ ®¡ ®âà¨á®¢ª¥ ®ª
|
|
|
|
ret
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Game_Init
|
|
;----------------------------------------------------------------------------
|
|
Game_Init:
|
|
and [moves], 0 ; ®¡ã«¨¬ ª®«¨ç¥á⢮ 室®¢
|
|
|
|
call random ; ¢ eax á«ãç ©®¥ ç¨á«®
|
|
mov ecx, NofBtn * NofBtn ; ¢ ecx ª®«-¢® ª®¯®ª ¯®«¥
|
|
mov bh, 0 ; ¤«ï ª ¦¤®© ª®¯ª¨ ¡ã¤¥¬ ¡à âì
|
|
; 1 ¡¨â ¨§ eax, bh - ᪮«ìª®
|
|
button_init: ; ¡¨â 㦥 ¨á¯®«ì§®¢ «¨
|
|
shr eax, 1 ; ¬« ¤è¨© ¡¨â ¯®¯ ¤ ¥â ¢ ä« £ CF
|
|
; ¢ § ¢¨á¨¬®á⨠®â ¥£® § 票ï
|
|
; ¢ bl § ¯¨áë¢ ¥âáï -1 ¨«¨ 0
|
|
sbb bl, bl
|
|
mov [field + ecx - 1], bl
|
|
|
|
inc bh
|
|
cmp bh, 32 ; ¥á«¨ ¨á¯®«ì§®¢ ë ¢á¥ 32 ¡¨â ¨§ eax
|
|
jb @f ; ® ¯®«ãç¨âì ®¢®¥ á«ãç ©®¥ ç¨á«®
|
|
call random
|
|
mov bh, 0
|
|
@@:
|
|
loop button_init
|
|
|
|
ret
|
|
|
|
;----------------------------------------------------------------------------
|
|
; random - ¢§ïâ ¨§ â¥âà¨á
|
|
;----------------------------------------------------------------------------
|
|
random: mov eax,[generator]
|
|
add eax,-43ab45b5h
|
|
ror eax,1
|
|
xor eax,32c4324fh
|
|
ror eax,1
|
|
mov [generator],eax
|
|
; --- IVAN ---
|
|
mov eax,26
|
|
mov ebx,9
|
|
int 0x40
|
|
xor eax,0xdeadbeef
|
|
add eax,[generator]
|
|
; --- IVAN ---
|
|
ret
|
|
|
|
;============================================================================
|
|
|
|
field db NofBtn * NofBtn dup(0)
|
|
moves dd 0
|
|
generator dd 0
|
|
|
|
if lang eq ru
|
|
header db 'CQ game',0
|
|
header_e:
|
|
strMovs db '•Ž„' ; '•Ž„'
|
|
strMovs_e:
|
|
strNew db '�®¢ ï ¨£à ' ; '�®¢ ï ¨£à '
|
|
strNew_e:
|
|
else
|
|
header db 'CQ game',0
|
|
header_e:
|
|
strMovs db 'MOVE'
|
|
strMovs_e:
|
|
strNew db ' New game'
|
|
strNew_e:
|
|
end if
|
|
|
|
|
|
|
|
I_END: ; ¬¥âª ª®æ ¯à®£à ¬¬ë
|