/programs/games/life/trunk/build_ru.bat |
---|
File deleted |
\ No newline at end of file |
/programs/games/life/trunk/ascl.inc |
---|
File deleted |
/programs/games/life/trunk/macros.inc |
---|
File deleted |
\ No newline at end of file |
Property changes: |
Deleted: svn:eol-style |
-native |
\ No newline at end of property |
/programs/games/life/trunk/life.asm |
---|
File deleted |
Property changes: |
Deleted: svn:eol-style |
-native |
\ No newline at end of property |
/programs/games/life/trunk/build_en.bat |
---|
File deleted |
\ No newline at end of file |
/programs/games/freecell/Buben.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/Club.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/ClubSml.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/ClubUD.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/Cross.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/Diam.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/DiamSml.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/DiamUD.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/Heart.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/HeartSml.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/HeartUD.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/MACROS.INC |
---|
0,0 → 1,269 |
; new application structure |
macro meos_app_start |
{ |
use32 |
org 0x0 |
db 'MENUET01' |
dd 0x01 |
dd __start |
dd __end |
dd __memory |
dd __stack |
if used __params & ~defined __params |
dd __params |
else |
dd 0x0 |
end if |
dd 0x0 |
} |
MEOS_APP_START fix meos_app_start |
macro code |
{ |
__start: |
} |
CODE fix code |
macro data |
{ |
__data: |
} |
DATA fix data |
macro udata |
{ |
if used __params & ~defined __params |
__params: |
db 0 |
__end: |
rb 255 |
else |
__end: |
end if |
__udata: |
} |
UDATA fix udata |
macro meos_app_end |
{ |
align 32 |
rb 2048 |
__stack: |
__memory: |
} |
MEOS_APP_END fix meos_app_end |
; macro for defining multiline text data |
struc mstr [sstring] |
{ |
forward |
local ssize |
virtual at 0 |
db sstring |
ssize = $ |
end virtual |
dd ssize |
db sstring |
common |
dd -1 |
} |
; strings |
macro sz name,[data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if used name |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
macro lsz name,[lng,data] { ; from MFAR [mike.dld] |
common |
if used name |
label name |
end if |
forward |
if (used name)&(lang eq lng) |
db data |
end if |
common |
if used name |
.size = $-name |
end if |
} |
; easy system call macro |
macro mpack dest, hsrc, lsrc |
{ |
if (hsrc eqtype 0) & (lsrc eqtype 0) |
mov dest, (hsrc) shl 16 + lsrc |
else |
if (hsrc eqtype 0) & (~lsrc eqtype 0) |
mov dest, (hsrc) shl 16 |
add dest, lsrc |
else |
mov dest, hsrc |
shl dest, 16 |
add dest, lsrc |
end if |
end if |
} |
macro __mov reg,a,b { ; mike.dld |
if (~a eq)&(~b eq) |
mpack reg,a,b |
else if (~a eq)&(b eq) |
mov reg,a |
end if |
} |
macro mcall a,b,c,d,e,f { ; mike.dld |
__mov eax,a |
__mov ebx,b |
__mov ecx,c |
__mov edx,d |
__mov esi,e |
__mov edi,f |
int 0x40 |
} |
; optimize the code for size |
__regs fix <eax,ebx,ecx,edx,esi,edi,ebp,esp> |
macro add arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
inc arg1 |
else |
add arg1,arg2 |
end if |
else |
add arg1,arg2 |
end if |
} |
macro sub arg1,arg2 |
{ |
if (arg2 eqtype 0) |
if (arg2) = 1 |
dec arg1 |
else |
sub arg1,arg2 |
end if |
else |
sub arg1,arg2 |
end if |
} |
macro mov arg1,arg2 |
{ |
if (arg1 in __regs) & ((arg2 eqtype 0) | (arg2 eqtype '0')) |
if (arg2) = 0 |
xor arg1,arg1 |
else if (arg2) = 1 |
xor arg1,arg1 |
inc arg1 |
else if (arg2) = -1 |
or arg1,-1 |
else if (arg2) > -128 & (arg2) < 128 |
push arg2 |
pop arg1 |
else |
mov arg1,arg2 |
end if |
else |
mov arg1,arg2 |
end if |
} |
macro struct name |
{ |
virtual at 0 |
name name |
sizeof.#name = $ - name |
end virtual |
} |
; structures used in MeOS |
struc process_information |
{ |
.cpu_usage dd ? ; +0 |
.window_stack_position dw ? ; +4 |
.window_stack_value dw ? ; +6 |
.not_used1 dw ? ; +8 |
.process_name rb 12 ; +10 |
.memory_start dd ? ; +22 |
.used_memory dd ? ; +26 |
.PID dd ? ; +30 |
.x_start dd ? ; +34 |
.y_start dd ? ; +38 |
.x_size dd ? ; +42 |
.y_size dd ? ; +46 |
.slot_state dw ? ; +50 |
dw ? ; +52 - reserved |
.client_left dd ? ; +54 |
.client_top dd ? ; +58 |
.client_width dd ? ; +62 |
.client_height dd ? ; +66 |
.wnd_state db ? ; +70 |
rb (1024-71) |
} |
struct process_information |
struc system_colors |
{ |
.frame dd ? |
.grab dd ? |
.grab_button dd ? |
.grab_button_text dd ? |
.grab_text dd ? |
.work dd ? |
.work_button dd ? |
.work_button_text dd ? |
.work_text dd ? |
.work_graph dd ? |
} |
struct system_colors |
; constants |
; events |
EV_IDLE = 0 |
EV_TIMER = 0 |
EV_REDRAW = 1 |
EV_KEY = 2 |
EV_BUTTON = 3 |
EV_EXIT = 4 |
EV_BACKGROUND = 5 |
EV_MOUSE = 6 |
EV_IPC = 7 |
EV_STACK = 8 |
; event mask bits for function 40 |
EVM_REDRAW = 1b |
EVM_KEY = 10b |
EVM_BUTTON = 100b |
EVM_EXIT = 1000b |
EVM_BACKGROUND = 10000b |
EVM_MOUSE = 100000b |
EVM_IPC = 1000000b |
EVM_STACK = 10000000b |
/programs/games/freecell/Pick.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/Spade.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/SpadeSml.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/SpadeUD.bmp |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/freecell/build.bat |
---|
0,0 → 1,2 |
@fasm freecell.asm freecell |
@pause |
/programs/games/freecell/freecell.ASM |
---|
0,0 → 1,2096 |
; <--- description ---> |
; compiler: FASM 1.50 |
; name: FreeCell for MeOS |
; version: 1.00 |
; last update: 21/07/2004 |
; written by: Alexandr Gorbovets |
; e-mail: gorsash@mail.ru |
include "macros.inc" |
meos_app_start |
code |
call randomize |
call draw_window |
wait_event: |
mov eax, 10 |
int 0x40 |
cmp eax, 1 ; if event == 1 |
je redraw ; jump to redraw handler |
cmp eax, 2 ; else if event == 2 |
je key ; jump to key handler |
cmp eax, 3 ; else if event == 3 |
je button ; jump to button handler |
jmp wait_event ;else return to the start of main cycle |
redraw: ; redraw event handler |
call draw_window |
jmp wait_event |
key: ; key event handler |
mov eax, 2 ; get key code |
int 0x40 |
jmp wait_event |
button: ; button event handler |
mov eax, 17 ; get button identifier |
int 0x40 |
cmp ah, 1 |
je exit_app ; return if button id != 1 |
cmp ah, 1 + 8 |
jbe common_card ; if 1 < ah <= 9 |
cmp ah, 1 + 8 + 4 ; if 9 < ah <= 13 |
jbe temp_cell |
cmp ah, 1 + 8 + 8 |
jbe home_cell |
cmp ah, 1 + 8 + 4 + 4 + 1 |
je new_game_button |
cmp ah, 1 + 8 + 4 + 4 + 2 |
je exit_app |
jmp wait_event |
exit_app: |
mov eax, -1 ; exit application |
int 0x40 |
common_card: |
sub ah, 2 ;going from number of card to number of column |
mov [columnclicked], 0 |
mov byte [columnclicked], ah |
call common_card_click |
jmp wait_event |
temp_cell: |
sub ah, 2 + 8 |
mov [columnclicked], 0 |
mov byte [columnclicked], ah |
call temp_cell_click |
jmp wait_event |
home_cell: |
sub ah, 2 + 8 + 4 |
mov [columnclicked], 0 |
mov byte [columnclicked], ah |
call home_cell_click |
jmp wait_event |
new_game_button: |
call new_game_click |
jmp wait_event |
;****************************************************************************** |
; common_card_click(columnclicked) |
common_card_click: |
; counting code of card, that has been clicked |
mov eax, [columnclicked] |
mov [ncolumn], eax |
call get_row_of_top_card_in_column |
mov eax, [topcardrow] ; eax = topcardrow * 8 + columnofselcard |
mov bl, 8 |
mul bl |
add eax, [columnclicked] |
add eax, cards |
mov ebx, 0 |
mov bl, byte [eax] |
mov [cardclicked], ebx |
call get_sel_card_code_and_addr |
cmp [selcardcode], 52 |
jb .something_selected |
cmp [cardclicked], 52 |
je .end |
mov [whereisselcard], scCommonCells |
mov eax, [columnclicked] |
mov [columnofselcard], eax |
call draw_window |
jmp .end |
.something_selected: |
; checking if selected and clicked cards are equivalent |
mov eax, [selcardcode] |
cmp [cardclicked], eax |
jne .not_same_card |
mov [whereisselcard], scNotSelected |
call draw_window |
jmp .end |
.not_same_card: |
cmp [cardclicked], 52 |
jae .put_in_blank_cell |
mov eax, [selcardcode] |
mov bl, 4 |
div bl |
mov ebx, 0 |
mov bl, ah |
mov [cardfamily], ebx |
mov ecx, 0 |
mov cl, al |
mov [cardrange], ecx |
mov eax, [cardclicked] |
mov bl, 4 |
div bl ; reminder in ah, quotient in al |
mov ebx, 0 |
mov bl, ah |
mov [clickedcardfamily], ebx |
mov ecx, 0 |
mov cl, al |
mov [clickedcardrange], ecx |
; clickedcardrange must be = cardrange + 1 |
mov eax, [cardrange] |
inc eax |
cmp [clickedcardrange], eax ; eax is such as needed |
jne .end |
cmp [cardfamily], 1 |
ja .black_card |
; if selected red card |
cmp [clickedcardfamily], 1 |
jbe .end ; if clicked red card (range <= 1) then exit |
jmp .valid_cards |
.black_card: |
; if selected black card |
cmp [clickedcardfamily], 1 |
ja .end ; if clicked black card then exit |
jmp .valid_cards |
.valid_cards: |
; moving card from its place on clicked card |
mov eax, [columnclicked] |
mov [ncolumn], eax |
call get_row_of_top_card_in_column |
mov eax, [topcardrow] |
inc eax |
mov bl, 8 |
mul bl |
and eax, $0000FFFF |
add eax, [columnclicked] |
add eax, cards |
mov bl, byte [selcardcode] |
mov byte [eax], bl |
mov eax, [selcardaddr] |
mov byte [eax], 52 |
mov [whereisselcard], scNotSelected |
call draw_window |
jmp .end |
.put_in_blank_cell: |
mov eax, cards |
add eax, [columnclicked] |
mov bl, byte [selcardcode] |
mov byte [eax], bl |
mov eax, [selcardaddr] |
mov byte [eax], 52 |
mov [whereisselcard], scNotSelected |
call draw_window |
.end: |
ret |
;****************************************************************************** |
; temp_cell_click(columnclicked) |
temp_cell_click: |
call get_sel_card_code_and_addr |
cmp [selcardcode], 52 |
jb .something_selected |
mov [whereisselcard], scTempCells |
mov eax, [columnclicked] |
mov [columnofselcard], eax |
call draw_window |
jmp .end |
.something_selected: |
; checking if selected and clicked cards equivalent |
mov eax, [columnclicked] |
add eax, tempcells |
mov ebx, 0 |
mov bl, byte [eax] |
mov [cardclicked], ebx |
mov eax, [selcardcode] |
cmp [cardclicked], eax |
jne .not_same_card |
mov [whereisselcard], scNotSelected |
call draw_window |
.not_same_card: |
;putting cards in temp cells |
mov eax, [columnclicked] |
add eax, tempcells |
mov ebx, 0 |
mov bl, byte [eax] |
mov [cardclicked], ebx |
cmp [cardclicked], 52 |
jb .end |
; if nothing lay in this cell |
; move selected card to temp cell |
mov eax, [columnclicked] |
add eax, tempcells |
mov bl, byte [selcardcode] |
mov byte [eax], bl |
mov eax, [selcardaddr] |
mov byte [eax], 52 |
mov [whereisselcard], scNotSelected |
call draw_window |
jmp .end |
.end: |
ret |
;****************************************************************************** |
; home_cell_click(column_clicked) |
home_cell_click: |
call get_sel_card_code_and_addr |
mov eax, [columnclicked] |
add eax, homecells |
mov ebx, 0 |
mov bl, byte [eax] |
mov [cardclicked], ebx |
mov eax, [selcardcode] |
mov bl, 4 |
div bl ; reminder in ah, quotient in al |
mov ebx, 0 |
mov bl, ah |
mov [cardfamily], ebx |
mov ecx, 0 |
mov cl, al |
mov [cardrange], ecx |
cmp [cardclicked], 52 |
jb .not_blank |
; if nothing lay in this cell |
cmp [cardrange], 0 |
jne .end |
; move ace to home |
mov eax, [columnclicked] |
add eax, homecells |
mov bl, byte [selcardcode] |
mov byte [eax], bl |
mov eax, [selcardaddr] |
mov byte [eax], 52 |
mov [whereisselcard], scNotSelected |
call draw_window |
jmp .end |
.not_blank: |
mov eax, [cardclicked] |
mov bl, 4 |
div bl ; reminder in ah, quotient in al |
mov ebx, 0 |
mov bl, ah |
mov [clickedcardfamily], ebx |
mov ecx, 0 |
mov cl, al |
mov [clickedcardrange], ecx |
cmp [cardfamily], ebx |
jne .end |
inc ecx |
cmp [cardrange], ecx |
jne .end |
; moving card from its place to home with replacing |
; of old card in home |
mov eax, [columnclicked] |
add eax, homecells |
mov bl, byte [selcardcode] |
mov byte [eax], bl |
mov eax, [selcardaddr] |
mov byte [eax], 52 |
mov [whereisselcard], scNotSelected |
call draw_window |
.end: |
ret |
;****************************************************************************** |
new_game_click: |
mov [i], 0 |
.deleting_cards_from_common_cells: |
mov eax, cards |
add eax, [i] |
mov byte [eax], 52 |
inc [i] |
cmp [i], 19*8 |
jb .deleting_cards_from_common_cells |
mov [i], 0 |
.filling_pack: |
mov eax, pack |
add eax, [i] |
mov bl, byte [i] |
mov byte [eax], bl |
inc [i] |
cmp [i], 52 |
jb .filling_pack |
mov [i], 0 |
.putting_cards: |
mov [range], 52 |
call random |
mov eax, [random_value] |
add eax, pack |
mov ebx, 0 |
mov bl, byte [eax] |
mov [randomcard], ebx |
mov eax, [random_value] |
mov [j], eax |
cmp [randomcard], 52 |
jb .found_card |
mov [range], 52 |
call random |
cmp [random_value], 26 |
jae .decreasing_j |
.increasing_j: |
inc [j] |
; j mod 52 |
mov eax, [j] |
mov edx, 0 |
mov ebx, 52 |
div ebx |
mov [j], edx |
mov eax, [j] |
add eax, pack |
mov ebx, 0 |
mov bl, byte [eax] |
mov [randomcard], ebx |
cmp [randomcard], 52 |
jb .found_card |
jmp .increasing_j |
.decreasing_j: |
dec [j] |
; i mod 32 |
mov eax, [j] |
mov edx, 0 |
mov ebx, 52 |
div ebx |
mov [j], edx |
mov eax, [j] |
add eax, pack |
mov ebx, 0 |
mov bl, byte [eax] |
mov [randomcard], ebx |
cmp [randomcard], 52 |
jb .found_card |
jmp .decreasing_j |
.found_card: |
; putting card from pack |
mov eax, cards |
add eax, [i] |
mov bl, byte [randomcard] |
mov byte [eax], bl |
; deleting card from pack |
mov eax, pack |
add eax, [j] |
mov byte [eax], 52 |
inc [i] |
cmp [i], 52 |
jb .putting_cards |
mov [i], 0 |
.deleting_cards_from_temp_cells: |
mov eax, tempcells |
add eax, [i] |
mov byte [eax], 52 |
inc [i] |
cmp [i], 4 |
jb .deleting_cards_from_temp_cells |
mov [i], 0 |
.deleting_cards_from_home_cells: |
mov eax, homecells |
add eax, [i] |
mov byte [eax], 52 |
inc [i] |
cmp [i], 4 |
jb .deleting_cards_from_home_cells |
mov [whereisselcard], scNotSelected |
call draw_window |
ret |
;****************************************************************************** |
; get_sel_card_code_and_addr(): selcardcode, selcardaddr |
; if nothing selected, then selcardcode is 52 |
get_sel_card_code_and_addr: |
cmp [whereisselcard], scNotSelected |
jne .something_selected |
mov [selcardcode], 52 |
jmp .end |
.something_selected: |
cmp [whereisselcard], scTempCells |
je .temp_cells_selected |
; common cells selected |
mov eax, [columnofselcard] |
mov [ncolumn], eax |
call get_row_of_top_card_in_column |
mov eax, [topcardrow]; eax = topcardrow * 8 + columnofselcard |
mov bl, 8 |
mul bl ; result of multiplication in ax |
add eax, [columnofselcard] |
add eax, cards |
mov [selcardaddr], eax |
xor ebx, ebx |
mov bl, byte [eax] |
mov [selcardcode], ebx |
jmp .end |
.temp_cells_selected: |
mov eax, tempcells |
add eax, [columnofselcard] |
mov [selcardaddr], eax |
mov ebx, 0 |
mov bl, byte [eax] |
mov [selcardcode], ebx |
.end: |
ret |
;****************************************************************************** |
; draw_window() |
draw_window: |
mov eax,48 ; get system colors |
mov ebx,3 |
mov ecx,syscolors |
mov edx,sizeof.system_colors |
int 0x40 |
mov eax, 12 ; start drawing |
mov ebx, 1 |
int 0x40 |
mov eax, 0 ; create and draw the window |
mov ebx, 100 * 65536 + 8 * cardwidth + 10 + 7 * columnspace |
mov ecx, 100 * 65536 + 500 |
mov edx, 0x13008000 |
mov edi, header |
int 0x40 |
mov eax, 9 ; getting window info |
mov ebx, process_info |
mov ecx, -1 ; we want to know info of our window |
int 0x40 |
mov eax, [process_info.y_size] |
mov [WindowHeight], ax |
mov eax, [process_info.x_size] |
mov [WindowWidth], ax |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; draw top panel |
mov eax, 13 |
mov ebx, 5 |
shl ebx, 16 |
add bx, word [process_info.x_size] |
sub bx, 9 |
mov ecx, 22 shl 16 + topbuttonsbarheight - 1 |
mov edx, [syscolors.work_graph] |
int $40 |
; draw button "new game" |
mov eax, 8 |
mov ebx, 5 shl 16 + 80 |
mov ecx, 22 shl 16 + topbuttonsbarheight - 2 |
mov edx, 1 + 8 + 4 + 4 + 1 ;button id |
mov esi, [syscolors.work_button] |
int $40 |
mov eax, 4 |
mov ebx, 20 shl 16 + 22 + topbuttonsbarheight/2 - 4 |
mov ecx, [syscolors.work_button_text] |
mov edx, new_game |
mov esi, new_game_len |
int $40 |
; draw button "exit" |
mov eax, 8 |
mov ebx, (5 + 85) shl 16 + 80 + 5 |
mov ecx, 22 shl 16 + topbuttonsbarheight - 2 |
mov edx, 1 + 8 + 4 + 4 + 2 ;button id |
mov esi, [syscolors.work_button] |
int $40 |
mov eax, 4 |
mov ebx, (40 + 80) shl 16 + 22 + topbuttonsbarheight/2 - 4 |
mov ecx, [syscolors.work_button_text] |
mov edx, exit |
mov esi, exit_len |
int $40 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; draw separators between home, temp and common cells |
mov eax, 13 |
; horizontal line |
mov ebx, 5 |
shl ebx, 16 |
add bx, word [process_info.x_size] |
sub bx, 9 |
mov ecx, (21 + topbuttonsbarheight + cardheight + columnspace) shl 16+1 |
mov edx, [syscolors.work_graph] |
int $40 |
; verical line |
mov eax, [process_info.x_size] |
mov edx, 0 |
mov ecx, 2 |
div ecx |
mov ebx, eax |
; |
shl ebx, 16 |
add bx, 1 |
mov ecx, (21 + topbuttonsbarheight) shl 16 + cardheight + columnspace |
mov edx, [syscolors.work_graph] |
mov eax, 13 |
int $40 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; draw temp buttons |
mov [j], 0 ;counter that loops from 0 to 51 |
draw_a_temp_card: |
; code of card must be in ecx |
mov eax, tempcells |
add eax, [j] |
xor ecx, ecx |
mov cl, byte [eax] ; placing in cl value from memory |
; with address [tempcells + j] or |
; j-th element of array "tempcells" |
mov [cardcode], ecx |
mov eax, [j] |
xor edx, edx |
mov ebx, 8 |
div ebx ; divsion by 8 (8 columns), |
; so in eax quotient - number of row |
; and in edx remainder - |
; number of column where lay card |
mov [row], eax |
mov [column], edx |
mov eax, [process_info.x_size] ; width of window |
sub eax, 10 |
sub eax, cardwidth |
mov ebx, 7 |
mov edx, 0 |
div ebx |
mov ebx, [column] |
mul ebx |
add eax, 5 |
mov [xpos], eax |
mov eax, [row] |
mov bl, rowsize |
mul bl |
add eax, 24 + topbuttonsbarheight |
mov [ypos], eax |
; checking, if this card selected |
mov [negativedraw], 0 |
cmp [whereisselcard], scTempCells |
jne .this_temp_cell_isnt_selected |
mov eax, [column] |
cmp [columnofselcard], eax |
jne .this_temp_cell_isnt_selected |
mov [negativedraw], 1 |
.this_temp_cell_isnt_selected: |
call draw_card |
; define button on place of card |
mov eax, 8 |
mov ebx, [xpos] |
shl ebx, 16 |
add bx, cardwidth - 1 |
mov ecx, [ypos] |
shl ecx, 16 |
add cx, cardheight - 1 |
mov edx, [column] |
add edx, 01000000000000000000000000000000b + 2 + 8; button id = column |
; id = 1 reserved as close button |
int $40 |
inc [j] |
cmp [j], 4 |
jb draw_a_temp_card |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; draw home buttons |
mov [j], 0 ;counter that loops from 0 to 51 |
draw_a_home_card: |
; code of card must be in ecx |
mov eax, homecells |
add eax, [j] |
xor ecx, ecx |
mov cl, byte [eax] ; placing in cl value from memory |
; with address [tempcells + j] or |
; j-th element of array "tempcells" |
mov [cardcode], ecx |
mov eax, [j] |
xor edx, edx |
mov ebx, 8 |
div ebx ; divsion by 8 (8 columns), |
; so in eax quotient - number of row |
; and in edx remainder - |
; number of column where lay card |
mov [row], eax |
mov [column], edx |
mov eax, [process_info.x_size] ; width of window |
sub eax, 10 |
sub eax, cardwidth |
mov ebx, 7 |
mov edx, 0 |
div ebx |
mov ebx, [column] |
add ebx, 4 |
mul ebx |
add eax, 5 |
mov [xpos], eax |
mov eax, [row] |
mov bl, rowsize |
mul bl |
add eax, 24 + topbuttonsbarheight |
mov [ypos], eax |
mov [negativedraw], 0 |
call draw_card |
; define button on place of card |
mov eax, 8 |
mov ebx, [xpos] |
shl ebx, 16 |
add bx, cardwidth - 1 |
mov ecx, [ypos] |
shl ecx, 16 |
add cx, cardheight - 1 |
mov edx, [column] |
add edx, 01000000000000000000000000000000b + 2 + 8 + 4 ; button id |
; id = 1 reserved as close button |
int $40 |
inc [j] |
cmp [j], 4 |
jb draw_a_home_card |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; draw common cards |
mov [j], 0 ;counter that loops from 0 to 8 * 19 |
draw_a_card: |
; code of card must be in ecx |
mov eax, cards |
add eax, [j] |
xor ecx, ecx |
mov cl, byte [eax] ; placing in cl value from memory |
; with address [cards + j] or |
; j-th element of array "cards" |
; cmp ecx, 52 ; if code of card >= 52 then there is no card |
; jae no_draw |
; |
; cmp ecx, 0 ; if code of card < 0 then there is no card |
; jb no_draw |
mov [cardcode], ecx |
mov eax, [j] |
xor edx, edx |
mov ebx, 8 |
div ebx ; divsion by 8 (8 columns), |
; so in eax quotient - number of row |
; and in edx remainder - |
; number of column where lay card |
mov [row], eax |
mov [column], edx |
mov eax, [process_info.x_size] ; width of window |
sub eax, 10 |
sub eax, cardwidth |
mov ebx, 7 |
mov edx, 0 |
div ebx |
mov ebx, [column] |
mul ebx |
add eax, 5 |
mov [xpos], eax |
mov eax, [row] |
mov bl, rowsize |
mul bl |
add eax, cardheight + 24 + topbuttonsbarheight + columnspace |
mov [ypos], eax |
mov [negativedraw], 0 ;checking, if this is selected card |
cmp [whereisselcard], scCommonCells |
jne .this_card_isnt_selected |
mov eax, [column] |
cmp [columnofselcard], eax |
jne .this_card_isnt_selected |
mov eax, [column] |
mov [ncolumn], eax |
call get_row_of_top_card_in_column |
mov eax, [row] |
cmp [topcardrow], eax |
jne .this_card_isnt_selected |
mov [negativedraw], 1 |
.this_card_isnt_selected: |
call draw_card |
; now checking if it is top card in its column |
; if it does, we'll define button on its place |
mov eax, [column] |
mov [ncolumn], eax |
call get_row_of_top_card_in_column |
mov eax, [row] |
cmp [topcardrow], eax |
je .define_button |
cmp [topcardrow], 0 |
jne .no_define_button |
cmp [row], 0 |
jne .no_define_button |
.define_button: |
mov eax, 8 |
mov ebx, [xpos] |
shl ebx, 16 |
add bx, cardwidth - 1 |
mov ecx, [ypos] |
shl ecx, 16 |
add cx, cardheight - 1 |
mov edx, [column] |
add edx, 01000000000000000000000000000000b + 2; button id = column + 2, |
; id = 1 reserved as close button |
int $40 |
.no_define_button: |
inc [j] |
cmp [j], 8 * 19 |
jb draw_a_card |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
mov eax, 12 ; finish drawing |
mov ebx, 2 |
int $40 |
ret |
;****************************************************************************** |
; get_row_of_top_card_in_column(ncolumn): topcardrow |
get_row_of_top_card_in_column: |
; number of column in ncolumn |
; returns in topcardrow |
mov [i], 0 ; i loops from 0 to 1, ... while card i * 8 + ncolumn |
; is valid card (0 <= its code < 52) |
.cycle: |
xor eax, eax |
mov al, 8 |
mov ebx, [i] |
mul bl |
add eax, [ncolumn] |
add eax, cards |
xor ecx, ecx |
mov cl, byte [eax] |
cmp ecx, 52 |
jae .endcycle |
cmp [i], 18 |
ja .endcycle |
inc [i] |
jmp .cycle |
.endcycle: |
cmp [i], 0 |
je .dont_dec |
dec [i] |
.dont_dec: |
mov eax, [i] |
mov [topcardrow], eax |
ret |
;****************************************************************************** |
; invert_image_colors(imagetoinvert, sizeofimagetoinvert) |
invert_image_colors: |
mov [i], 0 |
.inverting: |
mov eax, [imagetoinvert] |
add eax, [i] |
mov bl, byte [eax] |
;xor ebx, ebx |
;add ebx, 10 |
not ebx |
mov byte [eax], bl |
inc [i] |
mov ecx, [sizeofimagetoinvert] |
cmp [i], ecx |
jb .inverting |
jmp .later |
.exit: |
mov eax, -1 |
int $40 |
.later: |
ret |
;****************************************************************************** |
; draw_card(xpos, ypos, cardcode, negativedraw) |
; if negativedraw = 1 then card drawn in inverted colors |
draw_card: ; draws card with left top corner |
; in point ([xpos],[ypos]), |
; type of card in [cardcode] |
cmp [cardcode], 52 ; if code of card >= 52 then there is no card |
jae .no_draw_card |
cmp [negativedraw], 1 |
jne .no_invert1 |
;doing if negativedraw |
mov [bgcolor], $00000000 |
mov [blackcolor], $00FFFFFF |
mov [redcolor], $0000FFFF |
;inverting all images |
call invert_all_images |
jmp .colors_selection_done |
.no_invert1: |
;doing if not negativedraw |
mov [bgcolor], $00FFFFFF |
mov [blackcolor], $00000000 |
mov [redcolor], $00FF0000 |
.colors_selection_done: |
mov eax, 13 |
mov ebx, [xpos] ; filling card with bgcolor |
; (big background rectangle) |
mov edx, [bgcolor] |
add ebx, 2 |
shl ebx, 16 |
mov bx, cardwidth - 4 |
mov ecx, [ypos] |
add ecx, 2 |
shl ecx, 16 |
mov cx, cardheight - 4 |
int $40 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
mov ebx, [xpos] ; left black line |
shl ebx, 16 |
mov bx, 1 |
mov ecx, [ypos] |
add ecx, 5 |
shl ecx, 16 |
xor cx, cx |
mov cx, cardheight - 2 * radius - 2 |
mov edx, [blackcolor] |
int $40 |
mov ebx, [xpos] ; left white line |
inc ebx |
shl ebx, 16 |
mov bx, 1 |
mov edx, [bgcolor] |
int $40 |
mov ebx, [xpos] ; right black line |
add ebx, cardwidth - 1 |
shl ebx, 16 |
mov bx, 1 |
mov edx, [blackcolor] |
int $40 |
mov ebx, [xpos] ; right white line |
add ebx, cardwidth - 2 |
shl ebx, 16 |
mov bx, 1 |
mov edx, [bgcolor] |
int $40 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
mov ecx, [ypos] ; top black line |
shl ecx, 16 |
mov cx, 1 |
mov ebx, [xpos] |
add ebx, 5 |
shl ebx, 16 |
mov bx, cardwidth - 2 * radius - 2 |
mov edx, [blackcolor] |
int $40 |
mov ecx, [ypos] ; top white line |
inc ecx |
shl ecx, 16 |
mov cx, 1 |
mov edx, [bgcolor] |
int $40 |
mov ecx, [ypos] ; bottom black line |
add ecx, cardheight - 1 |
shl ecx, 16 |
mov cx, 1 |
mov edx, [blackcolor] |
int $40 |
mov ecx, [ypos] ; bottom white line |
add ecx, cardheight - 2 |
shl ecx, 16 |
mov cx, 1 |
mov edx, [bgcolor] |
int $40 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
mov eax, 1 ; drawing points |
mov edx, [blackcolor] ; black color for all pixels |
mov ebx, [xpos] ; draw top left corner |
mov ecx, [ypos] |
inc ebx |
add ecx, 4 |
int $40 |
dec ecx |
int $40 |
dec ecx |
inc ebx |
int $40 |
dec ecx |
inc ebx |
int $40 |
inc ebx |
int $40 |
mov ebx, [xpos] ;drawing top right corner |
mov ecx, [ypos] |
add ebx, cardwidth - 2 |
add ecx, 4 |
int $40 |
dec ecx |
int $40 |
dec ebx |
dec ecx |
int $40 |
dec ebx |
dec ecx |
int $40 |
dec ebx |
int $40 |
;drawing bottom left corner |
mov ebx, [xpos] |
mov ecx, [ypos] |
inc ebx |
add ecx, cardheight - 5 |
int $40 |
inc ecx |
int $40 |
inc ebx |
inc ecx |
int $40 |
inc ebx |
inc ecx |
int $40 |
inc ebx |
int $40 |
;drawing bottom right corner |
mov ebx, [xpos] |
mov ecx, [ypos] |
add ebx, cardwidth - 2 |
add ecx, cardheight - 5 |
int $40 |
inc ecx |
int $40 |
dec ebx |
inc ecx |
int $40 |
dec ebx |
inc ecx |
int $40 |
dec ebx |
int $40 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; drawing text and images |
mov eax, [cardcode] |
mov edx, 0 |
mov ebx, 4 |
div ebx |
mov [cardfamily], edx |
mov [cardrange], eax |
; counting position of small card image |
mov eax, 7 |
mov ecx, 8*65536+8 |
mov edx, [xpos] |
add edx, radius |
shl edx, 16 |
mov dx, word [ypos] |
add dx, radius + 8 |
cmp [cardfamily], 0 |
je .heart |
cmp [cardfamily], 1 |
je .diamond |
cmp [cardfamily], 2 |
je .club |
cmp [cardfamily], 3 |
je .spade |
.heart: |
mov esi, [redcolor] |
mov [color], esi |
mov [imageaddr], heart |
mov [imageflipaddr], heart_updown |
mov ebx, heart_small |
int $40 |
jmp .selnumber |
.diamond: |
mov esi, [redcolor] |
mov [color], esi |
mov [imageaddr], diamond |
mov [imageflipaddr], diamond_updown |
mov ebx, diamond_small |
int $40 |
jmp .selnumber |
.club: |
mov esi, [blackcolor] |
mov [color], esi |
mov [imageaddr], club |
mov [imageflipaddr], club_updown |
mov ebx, club_small |
int $40 |
jmp .selnumber |
.spade: |
mov esi, [blackcolor] |
mov [color], esi |
mov [imageaddr], spade |
mov [imageflipaddr], spade_updown |
mov ebx, spade_small |
int $40 |
.selnumber: |
mov ebx, [xpos] ; counting position of text |
; in ebx, same for all cards |
add ebx, radius |
shl ebx, 16 |
mov bx, word [ypos] |
add bx, radius |
mov ecx, [color] |
cmp [cardrange], 0 |
je .ace |
cmp [cardrange], 1 |
je .two |
cmp [cardrange], 2 |
je .three |
cmp [cardrange], 3 |
je .four |
cmp [cardrange], 4 |
je .five |
cmp [cardrange], 5 |
je .six |
cmp [cardrange], 6 |
je .seven |
cmp [cardrange], 7 |
je .eight |
cmp [cardrange], 8 |
je .nine |
cmp [cardrange], 9 |
je .ten |
cmp [cardrange], 10 |
je .jack |
cmp [cardrange], 11 |
je .queen |
cmp [cardrange], 12 |
je .king |
; +-------+-------+-------+ |
; | 3 | 2 | 3 | ace = 1 |
; +-------+-------+-------+ two = 2 |
; | | | | three = 2 + 1 |
; +-------+-------+-------+ four = 3 |
; | | 6 | | five = 3 + 1 |
; +-------+-------+-------+ six = 3 + 4 |
; | 5 | | 5 | seven = 3 + 4 + 6 |
; +-------+-------+-------+ eight = 3 + 5 |
; | 4 | 1 | 4 | nine = 3 + 5 |
; +-------+-------+-------+ ten = 3 + 5 + 6 + 7 |
; | 5 | | 5 | |
; +-------+-------+-------+ |
; | | 7 | | 1 means draw_1 |
; +-------+-------+-------+ |
; | | | | |
; +-------+-------+-------+ |
; | 3 | 2 | 3 | |
; +-------+-------+-------+ |
.ace: |
mov eax, 4 |
mov [s], byte 'A' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_1 |
jmp .end |
.two: |
mov eax, 4 |
mov [s], byte '2' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_2 |
jmp .end |
.three: |
mov eax, 4 |
mov [s], byte '3' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_1 |
call draw_2 |
jmp .end |
.four: |
mov eax, 4 |
mov [s], byte '4' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_3 |
jmp .end |
.five: |
mov eax, 4 |
mov [s], byte '5' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_1 |
call draw_3 |
jmp .end |
.six: |
mov eax, 4 |
mov [s], byte '6' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_3 |
call draw_4 |
jmp .end |
.seven: |
mov eax, 4 |
mov [s], byte '7' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_3 |
call draw_4 |
call draw_6 |
jmp .end |
.eight: |
mov eax, 4 |
mov [s], byte '8' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_3 |
call draw_5 |
jmp .end |
.nine: |
mov eax, 4 |
mov [s], byte '9' |
mov edx, s |
mov esi, 1 |
int $40 |
call draw_3 |
call draw_5 |
call draw_1 |
jmp .end |
.ten: |
mov eax, 4 |
mov [s], word '10' |
mov edx, s |
mov esi, 2 |
int $40 |
call draw_3 |
call draw_5 |
call draw_6 |
call draw_7 |
jmp .end |
.jack: |
mov eax, 4 |
mov [s], byte 'J' |
mov edx, s |
mov esi, 1 |
int $40 |
jmp .end |
.queen: |
mov eax, 4 |
mov [s], byte 'Q' |
mov edx, s |
mov esi, 1 |
int $40 |
jmp .end |
.king: |
mov eax, 4 |
mov [s], byte 'K' |
mov edx,s |
mov esi, 1 |
int $40 |
.end: |
cmp [negativedraw], 1 |
jne .no_invert2 |
call invert_all_images |
.no_invert2: |
.no_draw_card: |
ret |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
; invert_all_images() |
invert_all_images: |
mov [sizeofimagetoinvert], 16 * 16 * 3 |
mov [imagetoinvert], heart |
call invert_image_colors |
mov [sizeofimagetoinvert], 16 * 16 * 3 |
mov [imagetoinvert], diamond |
call invert_image_colors |
mov [sizeofimagetoinvert], 16 * 16 * 3 |
mov [imagetoinvert], spade |
call invert_image_colors |
mov [sizeofimagetoinvert], 16 * 16 * 3 |
mov [imagetoinvert], club |
call invert_image_colors |
mov [sizeofimagetoinvert], 16 * 16 * 3 |
mov [imagetoinvert], heart_updown |
call invert_image_colors |
mov [sizeofimagetoinvert], 16 * 16 * 3 |
mov [imagetoinvert], diamond_updown |
call invert_image_colors |
mov [sizeofimagetoinvert], 16 * 16 * 3 |
mov [imagetoinvert], spade_updown |
call invert_image_colors |
mov [sizeofimagetoinvert], 16 * 16 * 3 |
mov [imagetoinvert], club_updown |
call invert_image_colors |
mov [sizeofimagetoinvert], 8 * 8 * 3 |
mov [imagetoinvert], heart_small |
call invert_image_colors |
mov [sizeofimagetoinvert], 8 * 8 * 3 |
mov [imagetoinvert], diamond_small |
call invert_image_colors |
mov [sizeofimagetoinvert], 8 * 8 * 3 |
mov [imagetoinvert], spade_small |
call invert_image_colors |
mov [sizeofimagetoinvert], 8 * 8 * 3 |
mov [imagetoinvert], club_small |
call invert_image_colors |
ret |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
draw_1: |
;draw center image |
mov ebx, [imageaddr] |
mov ecx, 16 * 65536 + 16 |
mov edx, [xpos] |
add edx, cardwidth/2 - 8 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight/2 - 8 |
mov eax, 7 |
int $40 |
ret |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
draw_2: |
;draw top image |
mov ebx, [imageaddr] |
mov ecx, 16 * 65536 + 16 |
mov edx, [xpos] |
add edx, 40 - 8 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, margin |
mov eax, 7 |
int $40 |
;draw bottom image |
mov ebx, [imageflipaddr] |
mov edx, [xpos] |
add edx, cardwidth/2 - 8 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight - 16 - margin |
mov eax, 7 |
int $40 |
ret |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
draw_3: |
;draw top left image |
mov ebx, [imageaddr] |
mov ecx, 16 * 65536 + 16 |
mov edx, [xpos] |
add edx, margin |
shl edx, 16 |
mov dx, word [ypos] |
add dx, margin |
mov eax, 7 |
int $40 |
;draw bottom left image |
mov ebx, [imageflipaddr] |
mov edx, [xpos] |
add edx, margin |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight - margin - 16 |
mov eax, 7 |
int $40 |
;draw top right image |
mov ebx, [imageaddr] |
mov edx, [xpos] |
add edx, cardwidth - margin - 16 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, margin |
mov eax, 7 |
int $40 |
;draw bottom right image |
mov ebx, [imageflipaddr] |
mov edx, [xpos] |
add edx, cardwidth - margin - 16 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight - margin - 16 |
mov eax, 7 |
int $40 |
ret |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
draw_4: |
;draw center left image |
mov ebx, [imageaddr] |
mov ecx, 16 * 65536 + 16 |
mov edx, [xpos] |
add edx, margin |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight/2 - 8 |
mov eax, 7 |
int $40 |
;draw center right image |
mov edx, [xpos] |
add edx, cardwidth - margin - 16 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight/2 - 8 |
mov eax, 7 |
int $40 |
ret |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
draw_5: |
;draw top left image |
mov ebx, [imageaddr] |
mov ecx, 16 * 65536 + 16 |
mov edx, [xpos] |
add edx, margin |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight * 3 / 9 |
mov eax, 7 |
int $40 |
;draw bottom left image |
mov ebx, [imageflipaddr] |
mov edx, [xpos] |
add edx, 16 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight * 5 / 9 |
mov eax, 7 |
int $40 |
;draw top right image |
mov ebx, [imageaddr] |
mov edx, [xpos] |
add edx, cardwidth - margin - 16 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight * 3 / 9 |
mov eax, 7 |
int $40 |
;draw bottom right image |
mov ebx, [imageflipaddr] |
mov edx, [xpos] |
add edx, cardwidth - margin - 16 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight * 5 / 9 |
mov eax, 7 |
int $40 |
ret |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
draw_6: |
mov ebx, [imageaddr] |
mov ecx, 16 * 65536 + 16 |
mov edx, [xpos] |
add edx, cardwidth/2 - 8 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight * 2 / 9 |
mov eax, 7 |
int $40 |
ret |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
draw_7: |
mov ebx, [imageflipaddr] |
mov ecx, 16 * 65536 + 16 |
mov edx, [xpos] |
add edx, cardwidth/2 - 8 |
shl edx, 16 |
mov dx, word [ypos] |
add dx, cardheight * 6 / 9 |
mov eax, 7 |
int $40 |
ret |
;****************************************************************************** |
randomize: |
push eax |
mov eax, 3 |
int 0x40 |
mov ebx, $A59E3F1C |
mul ebx |
mov dword [randseed], eax |
pop eax |
ret |
;****************************************************************************** |
; function Random(Range): RandomValue |
random: |
push ebx |
mov eax, [randseed] |
mov edx, 0 |
mov ebx, 7 |
div ebx |
cmp edx, 0 |
je _0 |
cmp edx, 1 |
je _1 |
cmp edx, 2 |
je _2 |
cmp edx, 3 |
je _3 |
cmp edx, 4 |
je _4 |
cmp edx, 5 |
je _5 |
cmp edx, 6 |
je _6 |
jmp _end |
_0: |
;base := base + 58 + a[8]; |
mov eax, [randseed] |
add eax, 58 |
add eax, dword [a + 8 * 4] |
mov [randseed], eax |
jmp _end; |
_1: |
;base := base + 1 + a[9]; |
mov eax, [randseed] |
add eax, 1 |
add eax, dword [a + 9 * 4] |
mov [randseed], eax |
jmp _end; |
_2: |
;base := base + 4 + a[88]; |
mov eax, [randseed] |
add eax, 4 |
add eax, dword [a + 88 * 4] |
mov [randseed], eax |
jmp _end; |
_3: |
;randseed := randseed + 79 + a[43]; |
mov eax, [randseed] |
add eax, 79 |
add eax, dword [a + 43 * 4] |
mov [randseed], eax |
jmp _end; |
_4: |
;randseed := randseed + 3 + a[12]; |
mov eax, [randseed] |
add eax, 3 |
add eax, dword [a + 12 * 4] |
mov [randseed], eax |
jmp _end; |
_5: |
;randseed := randseed + 2 + a[63]; |
mov eax, [randseed] |
add eax, 2 |
add eax, dword [a + 63 * 4] |
mov [randseed], eax |
jmp _end; |
_6: |
;randseed := randseed + 151 + a[24]; |
mov eax, [randseed] |
add eax, 151 |
add eax, dword [a + 24 * 4] |
mov [randseed], eax |
_end: |
mov eax, [randseed] |
mov edx, eax |
shl edx, 16 |
mov bx, 100 |
div bx ; dx = randseed mod 100 |
mov ax, dx ; ax = randseed mod 100 |
mov bx, 4 |
mul bx ; dx:ax = (randseed mod 100) * 4 |
and eax, $0000FFFF |
shr edx, 16 |
and edx, $FFFF0000 |
or eax, edx |
mov eax, dword [a + eax] ; eax = dword[a + (randseed mod 100) * 4] |
; ~ a[randseed mod 100] |
mov ebx, dword [a + 47 * 4] |
mul ebx ; eax = low(a[randseed mod 100] * a[47]) |
add eax, [randseed] |
add eax, $4AE783A |
mov [randseed], eax |
mov eax, dword [a + 6 * 4] |
mov edx, 0 |
mov ebx, 100 |
div ebx |
mov eax, edx |
mov ebx, 4 |
mul ebx ; eax = (dword [a + 6 * 4] mod 100) * 4 ~ a[6] mod 100 |
mov eax, dword [a + eax] ; eax = dword [a + (dword [a + 6 * 4] mod 100) * 4 |
; ~ a[a[6] mod 100] |
add eax, [randseed] |
mov [random_value], eax |
mov edx, 0 |
mov ebx, [range] |
div ebx |
mov [random_value], edx |
mov al, [TimesCalled] |
xor ah, ah |
inc al |
mov bl, 100 |
div bl |
mov [TimesCalled], ah ; TimesCalled = (TimesCalled + 1 ) mod 100 |
mov al, ah |
mov bl, 4 |
mul bl |
and eax, $0000FFFF |
mov ebx, [randseed] |
mov dword [a + eax], ebx ; a[TimesCalled] = randseed |
pop ebx |
ret |
;****************************************************************************** |
; <--- initialised data ---> |
data |
header db 'Freecell',0 |
new_game: db "New game" |
new_game_len = $ - new_game |
exit: db "Exit" |
exit_len = $ - exit |
s: db "10" |
negativedraw db 0 ; for procedure draw_card |
spade file 'SPADE.BMP': 54 |
spade_updown file 'SPADEUD.BMP': 54 |
spade_small file 'SPADESML.BMP': 54 |
club file 'CLUB.BMP': 54 |
club_updown file 'CLUBUD.BMP': 54 |
club_small file 'CLUBSML.BMP': 54 |
diamond file 'DIAM.BMP': 54 |
diamond_updown file 'DIAMUD.BMP': 54 |
diamond_small file 'DIAMSML.BMP': 54 |
heart file 'HEART.BMP': 54 |
heart_updown file 'HEARTUD.BMP': 54 |
heart_small file 'HEARTSML.BMP': 54 |
scNotSelected = 0 |
scCommonCells = 1 |
scTempCells = 2 |
whereisselcard dd scNotSelected |
columnofselcard dd 0 ; if WhereIsSelCard = scGeneralCells |
; then this can be 0 .. 7, |
; if scTempCells then - 0 .. 3 |
; if scNotSelected - no matter |
tempcells: times 4 db 52; |
homecells: times 4 db 52 ; maximal card code is 51 |
cards: times 8 * 19 db 52; - % |
pack: times 52 db ? |
udata |
process_info process_information |
syscolors system_colors |
WindowHeight rw 1 |
WindowWidth rw 1 |
xpos rd 1 |
ypos rd 1 |
bgcolor rd 1 |
blackcolor rd 1 |
redcolor rd 1 |
lastparam rd 1 ; |
randomcard rd 1 ; for new_game_click |
columnclicked rd 1 ; used in common_card_click, temp_cell_click, |
cardclicked rd 1 ; home_cell_click |
clickedcardrange rd 1 ; |
clickedcardfamily rd 1 ; |
selcardcode rd 1 ; for procedure get_sel_card_code_and_addr |
selcardaddr rd 1 ; |
column rd 1 ; for procedure draw_window |
row rd 1 ; |
imagetoinvert rd 1 ; for procedure invert_image_colors |
sizeofimagetoinvert rd 1 ; |
ncolumn rd 1 ; for procedure get_row_of_top_card_in_column |
topcardrow rd 1 ; |
color rd 1 ; for procedue draw_card |
imageaddr rd 1 ; |
imageflipaddr rd 1 ; |
cardcode rd 1 ; used in differrent procedures |
cardrange rd 1 ; cardcode = cardrange * 4 + cardfamily |
cardfamily rd 1 ; |
a: times 100 rd 1 ; for function Random |
range rd 1 ; |
random_value rd 1 ; |
randseed rd 1 ; |
TimesCalled rb 1 ; |
j rd 1 ; number of card (in array cards) drawn now |
i rd 1 ; used in many procedures of 1-st level |
k rd 1 |
cardwidth = 80 |
cardheight = 120 |
radius = 4 ; not recommended to change |
rowsize = 30 ; distance between top poins |
;of cards in neighboring rows |
columnspace = 5 ; minimal space between cards |
margin = 14 ; margin of every card |
topbuttonsbarheight = 20 |
meos_app_end |
/programs/games/freecell/play.txt |
---|
0,0 → 1,26 |
FreeCell. |
You can find this games in Windows XP and Linux Mandrake 9.0 distributions. |
Rules to FreeCell can be found in help files for those games but I place here |
game rules from site www.freecell.org: |
4 cells (top left) - storage locations for cards. |
Only 1 card allowed in each cell. |
8 tableau piles (below foundations and cells) - build down by alternate color. |
Move groups of cards if they are in sequence down by alternate color and if |
there are enough free cells that the cards could be moved individually. |
Spaces can be filled by any card or legal group of cards (see KingOnly for |
option). At the start of the game 7 cards are dealt face up to the leftmost 4 |
piles, 6 cards are dealt face up to the remaining piles. |
Some features not implemented yet: moving groups of cards - you |
can move only one card at one time, no automatic moving of |
some cards in home. |
You only need to copy the file freecell to the floppy; The rest of the |
files are for assembling the code. |
Alexandr Gorbovets gorsash@mail.ru |
/programs/games/pipes/build.bat |
---|
0,0 → 1,2 |
@fasm pipes.asm pipes |
@pause |
/programs/games/pipes/pipes.asm |
---|
0,0 → 1,649 |
; |
; pipes for menuet {and now kolibri} |
; v1.2 |
; 2006 by Mario Birkner |
; |
; l.mod. 27.08.06/15:11 |
; |
; Compile with FASM |
; |
bgcolor equ 0x0074744A ;thx |
fgcolor equ 0x00E7C750 ;to |
fg2color equ 0x00E0B0A0 ;colorref |
fg3color equ 0x007F7F55 |
btcolor equ 0x005B6200 |
use32 |
org 0x0 |
db 'MENUET01' ; 8 byte id |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd 0x100000 ; memory for app |
dd 0x7fff0 ; esp |
dd 0x0 , 0x0 ; I_Param , I_Icon |
START: ; start of execution |
call draw_window |
call draw_board |
still: |
mov eax,10 ; wait here for event |
int 0x40 |
cmp eax,1 ; redraw request ? |
je red |
cmp eax,2 ; key in buffer ? |
je key |
cmp eax,3 ; button in buffer ? |
je button |
jmp still |
red: ; redraw |
call draw_window |
call draw_board |
call draw_message |
jmp still |
key: ; key |
mov eax,2 ; just read it and ignore |
int 0x40 |
jmp still |
button: ; button |
call get_input |
jmp still |
get_input: |
pusha |
mov eax,17 ; get id |
int 0x40 |
cmp ah,1 ; button id=1 ? |
jne .noclose |
mov eax,-1 ; close this program |
int 0x40 |
.noclose: |
cmp ah,4 |
jne .moderate |
mov [diffic],1 |
jmp .enddiffic |
.moderate: |
cmp ah,3 |
jne .easy |
mov [diffic],3 |
jmp .enddiffic |
.easy: |
cmp ah,2 |
jne .board |
mov [diffic],5 |
.enddiffic: |
mov [score],0 |
mov [speed],40 |
mov [level],1 |
mov [stat],0 |
mov [time],0 |
call draw_window |
call scramble_board |
call draw_board |
call countdown |
call wassermarsch |
jmp .getno |
.board: |
cmp [stat],2 |
jge .getno |
shr eax,8 ; -> 24bit id |
cmp eax,10 |
jle .getno |
cmp eax,150 |
jg .getno |
sub eax,10 |
mov edi,eax |
add edi,map |
cmp [edi], byte 1 |
jg .nogerade |
xor byte [edi], 1 |
call draw_board |
jmp .getno |
.nogerade: |
cmp [edi], byte 6 |
jge .getno |
cmp [edi], byte 5 |
jne .rota |
sub byte [edi],4 |
.rota: |
inc byte [edi] |
call draw_board |
.getno: |
popa |
ret |
;//// end of event detection |
get_direction: ;Setzt Richtungs-Konstanten |
pusha ;IN: |
mov eax,[esp+28] ;eax - Richtung IN |
mov ebx,[esp+16] ;ebx - Teilchen (Map-Wert) |
cmp ebx,0 ;OUT: |
jne .no0 ;eax - Richtung OUT |
cmp eax,14 |
jne .o0 |
jmp .setout |
.o0: |
cmp eax,-14 |
jne .col |
jmp .setout |
.no0: |
cmp ebx,1 |
jne .no1 |
cmp eax,1 |
jne .o1 |
jmp .setout |
.o1: |
cmp eax,-1 |
jne .col |
jmp .setout |
.no1: |
cmp ebx,2 |
jne .no2 |
cmp eax,14 |
jne .o2 |
sub eax,13 |
jmp .setout |
.o2: |
cmp eax,-1 |
jne .col |
sub eax,13 |
jmp .setout |
.no2: |
cmp ebx,3 |
jne .no3 |
cmp eax,-14 |
jne .o3 |
add eax,15 |
jmp .setout |
.o3: |
cmp eax,-1 |
jne .col |
add eax,15 |
jmp .setout |
.no3: |
cmp ebx,4 |
jne .no4 |
cmp eax,-14 |
jne .o4 |
add eax,13 |
jmp .setout |
.o4: |
cmp eax,1 |
jne .col |
add eax,13 |
jmp .setout |
.no4: |
cmp ebx,5 |
jne .no5 |
cmp eax,14 |
jne .o5 |
sub eax,15 |
jmp .setout |
.o5: |
cmp eax,1 |
jne .col |
sub eax,15 |
jmp .setout |
.no5: |
cmp ebx,6 |
jne .no6 |
jmp .setout |
.no6: |
cmp ebx,7 |
jne .no7 |
mov eax,14 |
jmp .setout |
.no7: |
cmp ebx,8 |
jne .no8 |
cmp eax,14 |
jne .col |
mov [stat],1 |
jmp .setout |
.no8: |
cmp ebx,16 ; cross 2x |
jne .col |
add [score],10 ; + 10 bonus points |
jmp .setout |
.col: |
xor eax,eax |
.setout: |
xor ebx,ebx |
mov [esp+28],eax |
mov [esp+16],ebx |
popa |
ret |
countdown: |
pusha |
xor eax,eax |
mov al,[diffic] |
imul eax,10 |
mov [time],eax |
.udown: |
call show_score |
mov ecx,10 |
.down: |
mov eax,5 |
mov ebx,10 |
int 0x40 |
mov eax,11 |
int 0x40 |
cmp eax,1 |
jne .nored |
call draw_window |
call draw_board |
jmp .nothing |
.nored: |
cmp eax,3 |
jne .nothing |
call get_input |
.nothing: |
cmp [stat],0 ;bugfix 210806 |
jnz .exitsub ;bugfix 210806 |
dec ecx |
jnz .down |
dec [time] |
jnz .udown |
.exitsub: ;bugfix 210806 |
popa |
ret |
wassermarsch: |
pusha |
.restart: |
mov esi,map+16 ;start position |
mov eax, 14 ;start-richtung |
.findway: |
movzx ebx, byte [esi] |
call get_direction |
test eax,eax |
jz .collision |
push eax |
xor eax,eax |
mov al,6 |
sub al,[diffic] |
add [score],eax ;points/item = 6 - difficulty |
mov ecx,dword [speed] |
add byte [esi],10 |
.down: |
mov eax,5 |
mov ebx,2 |
int 0x40 |
mov eax,11 |
int 0x40 |
cmp eax,1 |
jne .nored |
call draw_window |
.nored: |
cmp eax,3 |
jne .noevnt |
call get_input |
.noevnt: |
dec ecx |
jnz .down |
pop eax |
add esi,eax |
call draw_board |
call show_score |
jmp .findway |
.collision: |
cmp [stat],1 |
jne .loose |
call draw_message |
mov eax,5 |
mov ebx,500 |
int 0x40 |
mov [stat],0 |
inc [level] |
cmp [speed],6 ;waterflowdelay < 6 ? |
jle .skipsub |
sub [speed],2 |
.skipsub: |
call draw_window |
call scramble_board |
call draw_board |
call countdown |
jmp .restart |
.loose: |
mov [stat],2 |
call draw_message |
popa |
ret |
show_score: |
pusha |
mov eax,13 ;clear time and score area |
mov ebx,50 shl 16 +15 |
mov ecx,395 shl 16 +15 |
mov edx,bgcolor |
int 0x40 |
add ebx,60 shl 16 + 20 |
int 0x40 |
add ebx,80 shl 16 |
int 0x40 |
mov eax,47 |
mov ebx,0x20000 |
mov ecx,[time] |
mov edx,50*65536+398 |
mov esi,fg2color |
int 0x40 |
mov ebx,0x50000 |
mov ecx,[score] |
add edx,60 shl 16 |
int 0x40 |
mov ebx,0x20000 |
mov ecx,[level] |
add edx,80 shl 16 |
int 0x40 |
popa |
ret |
scramble_board: |
pusha |
mov edi,map+16 ;startpunkt |
mov eax,7 ;wieder- |
stosb ;herstellen |
mov ebx, 0x00000007 ;modul m max-wert |
.loop_through: |
mov esi,edi |
lodsb |
cmp eax, 9 |
je .skip |
inc eax |
xor edx, edx |
div ebx ;modulo -> edx |
mov eax, edx |
cmp eax,6 |
jne .skip |
dec [half] |
movzx eax, byte [half] |
jnz .skip |
mov [half], byte 7 |
.skip: |
stosb |
cmp edi,map+125 ;endpunkt erhalten |
jge .exit |
jmp .loop_through |
.exit: |
mov eax,8 |
stosb |
popa |
ret |
gen_image: |
pusha |
xor ebx,ebx ;default: kein wasser |
movzx eax,byte [map] ;erstes byte der map lesen (position) |
inc byte [map] ;position inkrementieren |
add eax,map ;zur position die map-adresse addieren |
movzx esi,byte [eax] |
cmp esi,10 |
jl .nowater |
sub esi,10 ;map-werte+10 sind mit wasser gefuellt |
mov ebx,1 |
cmp esi,16 |
jne .nowater |
sub esi,10 |
.nowater: |
imul esi,3072 ;mapwert * 32*32*3 = image-adresse |
add esi,images |
mov edi,0x10000 |
mov ecx,32*32*3 |
.gendd: ;RGB-Image im Speicher generieren |
mov eax,dword [esi] ;byte aus imagemap lesen |
shl eax,8 |
shr eax,8 |
cmp ebx,0 |
jz .nowcolor |
mov ebx,eax |
cmp ebx,0x00B0B5B0 |
jne .nog1 |
jmp .wcolor |
.nog1: |
cmp ebx,0x00A0A5A0 |
jne .nog2 |
jmp .wcolor |
.nog2: |
cmp ebx,0x00909590 |
jne .nog3 |
jmp .wcolor |
.nog3: |
cmp ebx,0x00808580 |
jne .nog4 |
jmp .wcolor |
.nog4: |
cmp ebx,0x00707570 |
jne .nowcolor |
jmp .wcolor |
.wcolor: |
add eax,0x40 |
.nowcolor: |
add esi,3 |
stosd |
dec edi |
loop .gendd |
popa |
ret |
; ********************************************* |
; ******* WINDOW DEFINITIONS AND DRAW ******** |
; ********************************************* |
draw_message: |
pusha |
cmp [stat],0 |
je .nomessage |
cmp [stat],3 |
je .nomessage |
mov eax,13 |
mov ebx,146 shl 16 + 200 |
mov ecx,190 shl 16 + 40 |
mov edx,0x0 |
int 0x40 |
add ebx,2 shl 16 - 4 |
add ecx,2 shl 16 - 4 |
mov edx,fgcolor |
int 0x40 |
cmp [stat],1 |
je .winmessage |
mov eax,4 |
mov ebx,186 shl 16 +200 |
mov edx,lbl_gameover+1 |
movzx esi,byte [lbl_gameover] |
mov ecx,btcolor |
add ecx,0x10000000 |
int 0x40 |
add ebx,8 shl 16 +17 |
mov edx,lbl_yscore+1 |
movzx esi,byte [lbl_yscore] |
mov ecx,btcolor |
int 0x40 |
mov esi,ecx ;color |
mov edx,ebx ;pos |
add edx,80 shl 16 |
mov ebx,0x50000 ;type |
mov ecx,[score] ;inp |
mov eax,47 |
int 0x40 |
jmp .nomessage |
.winmessage: |
mov eax,4 |
mov ebx,152 shl 16 +200 |
mov edx,lbl_win+1 |
movzx esi,byte [lbl_win] |
mov ecx,btcolor |
add ecx,0x10000000 |
int 0x40 |
mov ebx,152 shl 16 +217 |
add edx,esi |
mov ecx,btcolor |
int 0x40 |
.nomessage: |
popa |
ret |
draw_board: |
pusha |
mov ebx,15*65536+32 |
mov ecx,50*65536+32 |
mov edx,15*65536+50 ;Spielfeldposition |
mov esi,10 ;Spielfeldgroesse Y |
.vloop: |
mov edi,14 ;Spielfeldgroesse X |
.hloop: |
call gen_image |
push edx |
mov eax,8 |
movsx edx, byte [map] |
add edx,9 ;button-id = map-pos + 10;gen_image inkrements |
add edx,0x50000000 ;no button image - no esi need |
int 0x40 |
pop edx |
push ebx |
push ecx |
mov eax,7 |
mov ebx,0x10000 |
mov ecx,32 shl 16 +32 |
int 0x40 |
pop ecx |
pop ebx |
add edx,33 shl 16 |
add ebx,33 shl 16 |
dec edi |
jnz .hloop |
sub edx,14*(33 shl 16) ;Spielfeldgroesse X |
sub ebx,14*(33 shl 16) |
add edx,33 |
add ecx,33 shl 16 |
dec esi |
jnz .vloop |
mov [map], byte 1 ;Map-Position zuruecksetzen |
popa |
ret |
draw_window: |
pusha |
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,1 ; 1, start of draw |
int 0x40 |
; DRAW WINDOW |
mov eax,0 ; function 0 : define and draw window |
mov ebx,100*65536+492 ; [x start] *65536 + [x size] |
mov ecx,100*65536+420 ; [y start] *65536 + [y size] |
mov edx,bgcolor ; color of work area RRGGBB,8->color gl |
or edx,0x13000000 |
mov edi,header |
int 0x40 |
mov eax,8 |
mov ebx,84*65536+72 |
mov ecx,28*65536+15 |
mov edx,2 |
mov esi,btcolor |
int 0x40 |
add ebx,76 shl 16 |
inc edx |
int 0x40 |
add ebx,76 shl 16 |
inc edx |
int 0x40 |
mov eax,4 |
mov ebx,26 shl 16 +32 |
mov ecx,fgcolor |
mov edx,lbl_toolbar+1 |
movsx esi, byte [lbl_toolbar] |
int 0x40 |
mov ebx,18 shl 16 +398 |
mov edx,lbl_score+1 |
movsx esi, byte [lbl_score] |
int 0x40 |
mov ebx,350 shl 16 +405 |
mov ecx,fg3color |
mov edx,lbl_copy+1 |
movsx esi,byte [lbl_copy] |
int 0x40 |
mov eax,12 ; function 12:tell os about windowdraw |
mov ebx,2 ; 2, end of draw |
int 0x40 |
popa |
ret |
; DATA AREA |
header db 'PIPES',0 |
lbl_gameover: |
db 19 |
db 'G a m e O v e r !' |
lbl_win: |
db 32 |
db ' G r e a t ! ' |
db " Let's goin'on! " |
lbl_yscore: |
db 11 |
db 'Your Score:' |
lbl_toolbar: |
db 43 |
db 'New Game: Easy Moderate Hard' |
lbl_copy: |
db 23 |
db 'v1.2 2006,Mario Birkner' |
lbl_score: |
db 28 |
db 'Time: Score: Level:' |
stat db 3 ;0=gameplay 1=won 2-lost 3=stopped |
speed db 0 |
time dd 0 |
diffic db 0 ;1=hard 3=moderate 5=easy 8=dedicated to Wildwest - try it out! |
score dd 0 |
level dd 1 |
half db 1 ;reduces the random-crosses |
map: ;14*10 blocks + position |
db 1 ;<- act. position |
db 9,9,9,9,9,9,9,9,9,9,9,9,9,9 |
db 9,7,1,3,2,0,1,1,0,3,4,4,3,9 |
db 9,5,0,2,2,1,3,0,3,1,1,6,4,9 |
db 9,4,0,4,6,0,3,3,2,6,0,1,2,9 |
db 9,3,0,1,2,4,6,4,5,1,2,4,1,9 |
db 9,5,3,2,6,3,2,1,2,1,2,6,0,9 |
db 9,4,0,2,3,0,4,1,2,3,2,3,4,9 |
db 9,2,0,4,5,6,3,1,3,0,4,1,0,9 |
db 9,1,0,3,5,4,2,2,4,1,6,0,8,9 |
db 9,9,9,9,9,9,9,9,9,9,9,9,9,9 |
images: |
file 'pipes.raw' |
I_END: |
/programs/games/pipes/pipes.raw |
---|
0,0 → 1,0 |
z£ÇsÀZ§g´r¿f³c°[¨@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@uÂq¾w Äa®mºq¾y¢Æ]ªy¢Æc°o¼{¤Èb¯Y¦mºd±@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@]ªvÃ[¨e²q¾hµf³`[¨i¶r¿g´k¸sÀq¾Y¦@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@sÀhµn»f³k¸y¢Æn»w Äo¼uÂvÃ^«p½x¡Åw ÄY¦@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@n»tÁsÀg´a®e²X¥`x¡Åy¢Æc°\ ©e²uÂf³hµ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@^«l¹y¢Æx¡Åf³w ÄuÂz£Çz£ÇZ§d±c°w ÄY¦n»o¼@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@]ªz£Çf³r¿c°sÀf³tÁmºsÀl¹o¼a®j·k¸Y¦@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@x¡Ån»c°x¡Åi¶g´^«\ ©uÂhµy¢ÆvÃo¼W¤r¿d±@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@_¬r¿sÀ`_¬k¸W¤_¬_¬{¤Èc°c°Z§q¾]ªc°@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@g´k¸W¤_¬\ ©c°o¼k¸e²X¥tÁZ§tÁhµmº^«@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@f³]ªe²g´\ ©j·Z§Y¦b¯Z§mºw Äq¾c°i¶f³@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@x¡Åg´Y¦vÃr¿o¼k¸[¨Y¦f³q¾_¬r¿sÀ`_¬@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@j·]ªW¤w ÄsÀc°n»y¢Æf³Y¦l¹w ÄuÂtÁd±d±@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@p½n»p½Z§]ªz£ÇtÁe²y¢Æ\ ©j·vÃo¼uÂZ§p½@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@q¾^«o¼W¤n»x¡ÅZ§Y¦Z§`a®X¥n»Z§w Ä_¬@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@n»j·mº\ ©q¾{¤Èf³Z§j·]ªj·e²w ÄuÂq¾`@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@_¬w ÄtÁl¹X¥^«tÁc°b¯e²[¨[¨Z§j·k¸r¿@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@`c°q¾a®f³x¡Å`y¢Æj·uÂvÃx¡Å^«[¨d±q¾@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@e²uÂ[¨tÁ^«e²x¡Åhµn»j·\ ©g´n»k¸]ª\ ©@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@Y¦d±W¤]ªi¶l¹tÁ\ ©`^«o¼`o¼q¾e²W¤@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@r¿p½w Äp½`q¾b¯\ ©X¥sÀvÃZ§g´uÂf³hµ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@vÃx¡ÅmºX¥Z§r¿x¡Åmºn»`X¥vÃz£Ç[¨g´\ ©@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@w ÄhµvÃf³^«tÁc°i¶f³x¡ÅZ§]ªp½tÁ_¬{¤È@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@{¤È^«tÁi¶hµk¸mº]ª_¬c°mºmºd±z£Çc°tÁ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@b¯p½d±tÁw Äe²w ÄX¥j·p½Y¦q¾hµa®mºmº@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@f³{¤Èx¡ÅY¦a®hµl¹X¥\ ©l¹w Äj·_¬g´]ª_¬@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@W¤{¤ÈsÀ{¤ÈW¤j·r¿Z§n»`X¥vÃz£Ç[¨g´\ ©@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@w ÄhµvÃf³^«tÁc°i¶w Ämº_¬Z§mºsÀl¹o¼@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@Y¦x¡Å^«b¯x¡Ån»c°x¡ÅvÃg´vÃf³f³w Ämºe²@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@c°c°n»d±i¶d±_¬l¹p½uÂa®]ªp½j·X¥X¥@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@X¥vÃw Äa®a®W¤j·Z§d±mºZ§n»q¾vÃf³hµ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@i¶k¸y¢Æw Än»b¯hµj·Z§W¤i¶z£ÇsÀZ§g´r¿@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@b¯r¿f³uÂq¾w Äa®mºe²Z§`a®X¥n»Z§w Ä_¬vÃe²p½f³n»i¶o¼y¢Æp½o¼{¤Èz£Çi¶e²X¥^«n»j·mº\ ©q¾{¤Èf³n»n»g´X¥uÂg´y¢Æc°hµ{¤Èl¹j·{¤ÈX¥^«z£ÇY¦uÂg´sÀi¶mºd±w Äc°{¤Èq¾{¤Èy¢ÆY¦r¿f³hµY¦`sÀw ÄsÀx¡ÅY¦[¨mºg´[¨x¡Åa®uÂc°e²Y¦_¬sÀ]ªj·_¬p½X¥b¯[¨j·j·n»f³w ÄmºX¥Z§r¿x¡ÅmºtÁg´X¥l¹j·j·W¤q¾^«o¼W¤n»x¡ÅZ§Y¦l¹e²]ªe²a®i¶k¸r¿i¶Z§uÂn»uÂk¸{¤ÈX¥c°uÂn»l¹e²j·n»_¬b¯a®k¸w Äz£Çg´l¹r¿f³vÃ_¬^«a®vÃl¹r¿vÃx¡ÅZ§^«e²hµq¾n»b¯hµy¢Æf³x¡Åj·\ ©z£Ç`x¡Åa®i¶hµb¯^«r¿i¶Z§k¸{¤ÈY¦\ ©i¶o¼g´e²x¡ÅY¦y¢Æd±sÀi¶l¹Z§c°^«uÂW¤w Ämº_¬Z§mºsÀl¹o¼a®j·k¸Y¦y¢Æ]ªmº^«j·mº[¨_¬o¼n»b¯hµj·X¥l¹y¢Æq¾uÂ_¬uÂp½vÃz£Çy¢Æn»Y¦tÁj·c°tÁ\ ©\ ©sÀi¶p½j·mºtÁq¾\ ©hµ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@puppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppup ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ puppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppuppup@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Y¦sÀk¸c°Y¦n»]ªX¥y¢Æ[¨i¶tÁf³W¤z£ÇvÃe²c°n»_¬c°mºmºd±z£Çc°tÁW¤q¾Y¦l¹\ ©j·o¼tÁk¸i¶_¬`]ªx¡ÅvÃq¾b¯[¨z£Çb¯j·]ªp½y¢Æz£Ç]ªc°k¸_¬vÃhµX¥z£Ç]ªj·z£ÇuÂb¯vÃuÂ`a®hµl¹q¾Z§w ÄtÁ`x¡ÅZ§n»tÁx¡Åd±^«w Äe²i¶b¯sÀ^«^«l¹c°]ªvÃz£ÇtÁuÂo¼x¡Åq¾hµg´x¡Åf³[¨]ªtÁk¸hµx¡Åq¾[¨uÂr¿vÃq¾a®n»vÃ_¬vÃX¥g´e²mºhµp½l¹l¹d±tÁuÂZ§_¬w ÄtÁl¹X¥^«tÁc°^«z£Çq¾x¡ÅX¥W¤q¾[¨z£Çp½`p½Z§{¤Èf³[¨e²^«x¡Åi¶l¹tÁj·[¨[¨p½p½j·tÁa®mºf³\ ©tÁz£ÇW¤{¤ÈsÀ{¤ÈW¤j·r¿Z§g´k¸\ ©x¡Åb¯`q¾sÀk¸c°w Äi¶b¯i¶\ ©]ª\ ©i¶mºw Äc°c°a®d±w Äp½l¹j·p½uÂj·y¢Æ]ªp½]ª[¨j·vÃq¾k¸a®Y¦[¨hµn»a®e²q¾uÂj·]ªj·e²w ÄuÂq¾`y¢Æ[¨{¤È\ ©g´mºr¿X¥]ªg´i¶l¹d±tÁuÂhµ\ ©f³]ªz£Çf³r¿c°@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@W¤l¹n»w Äo¼mºsÀY¦k¸mº]ªo¼Y¦d±mº{¤È@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@p½w Äz£Ç^«d±^«hµf³[¨r¿Z§_¬tÁW¤j·vÃ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@hµuÂ{¤Èy¢ÆX¥W¤g´_¬q¾c°q¾d±vÃg´Y¦mº@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@`a®hµl¹q¾Z§w ÄtÁl¹p½q¾Z§`d±_¬vÃ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@{¤Èmºp½r¿hµmºc°a®sÀe²i¶vÃx¡Åj·X¥\ ©@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@^«k¸uÂ]ª{¤Èx¡Åj·X¥q¾y¢Æ[¨_¬uÂp½j·j·@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@tÁr¿x¡Å_¬o¼sÀc°mºX¥_¬a®y¢Æl¹o¼^«sÀ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@@@@w ÄY¦n»o¼vÃq¾e²Z§j·c°sÀg´q¾]ªp½@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ puppup@@@@@@@@@@@@@@@@@@@@@@@@@@@{¤Èc°]ªb¯p½g´p½c°@@@@@@pup ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@@@@@@@@@@@@@@@@d±^«Z§q¾_¬hµi¶Y¦@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppuppuppuppuppuppuppuppupZ§W¤j·Y¦\ ©hµy¢ÆtÁ@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ W¤k¸i¶q¾\ ©k¸w Ä]ªj·@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ hµf³n»mºo¼^«e²b¯i¶Z§@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ _¬k¸W¤_¬^«tÁ[¨mºq¾j·e²@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ n»z£Çc°p½q¾tÁ^«b¯mºi¶Z§l¹@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°a®uÂY¦z£Çq¾vÃ`mºz£Çq¾f³e²Z§@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°a®e²p½i¶e²p½k¸n»hµmºW¤p½l¹j·@@@@@@@@@puppup ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ]ªj·c°o¼{¤Èz£ÇZ§d±_¬z£Çe²y¢Æi¶Z§Z§@@@@@@@@@puppup ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ l¹tÁuÂ`Z§y¢ÆhµtÁ`hµr¿W¤q¾f³e²e²@@@@@@@@@puppup w Ä{¤Èp½d±`tÁk¸f³l¹_¬uÂg´mºW¤p½l¹l¹@@@@@@@@@puppup c°mºp½z£Ço¼c°uÂW¤i¶`\ ©Z§tÁb¯x¡Åj·b¯Z§@@@@@@@@@puppuppuppuppuppuppuppuppuppuppupn»{¤ÈX¥sÀuÂp½z£Ço¼q¾f³e²mºp½hµr¿W¤q¾f³e²@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Z§y¢ÆhµtÁz£Ç[¨l¹f³mºW¤p½l¹sÀ_¬uÂg´mºW¤p½l¹@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@q¾x¡Åo¼tÁb¯g´q¾_¬Z§n»c°w Äl¹]ªa®a®n»_¬hµW¤Z§d±{¤ÈZ§X¥q¾sÀl¹q¾[¨k¸hµw Ä\ ©w Ä`i¶uÂy¢Æl¹y¢Æ{¤Èmº{¤ÈtÁj·e²uÂz£Çk¸f³k¸W¤^«c°j·_¬y¢Æe²p½c°r¿mº\ ©a®Y¦w Äx¡Åy¢Æf³[¨[¨hµX¥p½p½uÂc°p½Y¦c°W¤n»i¶j·Z§]ªc°a®[¨i¶q¾q¾Z§]ªf³mºy¢Æn»Z§o¼hµ_¬e²tÁsÀz£Çd±`o¼i¶z£Çp½_¬mºq¾Y¦q¾b¯sÀy¢Æ_¬vÃZ§d±_¬o¼]ªq¾a®{¤Èn»x¡År¿uÂ^«z£ÇuÂo¼`Z§{¤Èe²q¾q¾^«o¼\ ©\ ©_¬p½g´l¹uÂx¡Å`vÃtÁY¦z£Çy¢Æk¸X¥tÁ[¨[¨p½`[¨p½c°tÁy¢Æz£Çp½vÃtÁtÁ^«k¸hµhµg´q¾o¼p½j·d±g´W¤d±f³]ªy¢ÆsÀx¡Ån»sÀj·\ ©l¹z£ÇuÂk¸hµZ§k¸`^«[¨e²w Äy¢Æi¶p½]ª^«j·X¥_¬Y¦j·mºr¿vÃd±uÂd±_¬z£Çj·Z§f³o¼W¤f³tÁd±n»mºb¯mºb¯]ªtÁY¦c°p½sÀj·\ ©vÃmºvÃ{¤Èc°q¾x¡Åo¼tÁb¯g´q¾_¬Z§n»c°w Äl¹]ªa®a®n»_¬hµW¤Z§d±{¤ÈZ§X¥q¾sÀl¹q¾[¨k¸hµw Ä\ ©w Ä`i¶uÂy¢Æl¹y¢Æ{¤Èmº{¤ÈtÁj·e²uÂz£Çk¸f³k¸W¤^«c°j·_¬y¢Æe²p½c°r¿mº\ ©a®Y¦w Äx¡Åy¢Æf³[¨[¨hµX¥p½p½uÂc°p½Y¦c°W¤n»i¶j·Z§]ªc°a®[¨i¶q¾q¾Z§]ªf³mºy¢Æn»Z§o¼hµ_¬e²tÁsÀz£Çd±`o¼i¶z£Çp½_¬mºq¾Y¦q¾b¯sÀy¢Æ_¬vÃZ§d±_¬o¼]ªq¾a®{¤Èn»x¡År¿uÂ^«z£ÇuÂo¼`Z§{¤Èe²q¾q¾^«o¼\ ©\ ©_¬p½g´l¹uÂx¡Å`vÃtÁY¦z£Çy¢Æk¸X¥tÁ[¨[¨p½`[¨p½c°tÁy¢Æz£Çp½vÃtÁtÁ^«k¸hµhµg´q¾o¼p½j·d±g´W¤d±f³]ªy¢ÆsÀx¡Ån»sÀj·\ ©l¹z£ÇuÂk¸hµZ§k¸`^«[¨e²w Äy¢Æi¶p½]ª^«j·X¥_¬Y¦j·mºr¿vÃd±uÂd±_¬z£Çj·Z§f³o¼W¤f³tÁd±n»mºb¯mºb¯]ªtÁY¦c°p½sÀj·\ ©vÃmºvÃ{¤Èc°g´y¢Æp½^«\ ©o¼l¹i¶mºq¾i¶l¹`_¬hµz£Çmºq¾i¶j·@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@tÁq¾z£Çw Ähµb¯p½Y¦W¤f³`_¬hµz£Çmºq¾i¶j·Z§@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z£ÇvÃo¼e²g´e²q¾tÁp½e²\ ©uÂr¿e²W¤f³Z§e²@@@@@@@@@puppuppuppuppuppuppuppuppuppuppup]ªl¹vÃi¶l¹y¢ÆZ§f³l¹mºZ§g´W¤y¢Æp½e²l¹@@@@@@@@@puppup p½]ªg´b¯W¤\ ©`[¨sÀp½tÁmºq¾i¶l¹Z§@@@@@@@@@puppup p½c°vÃsÀa®j·d±X¥_¬hµb¯W¤f³Z§j·@@@@@@@@@puppup ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ mºa®f³^«k¸vÃ_¬i¶uÂr¿x¡Åp½e²Z§@@@@@@@@@puppup ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ f³o¼f³^«uÂo¼vÃi¶g´W¤j·l¹e²@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°b¯p½w Äl¹w ÄuÂ\ ©a®mºq¾b¯l¹@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°q¾\ ©mºc°j·Z§k¸uÂW¤f³Z§@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ x¡Åg´e²]ªsÀp½e²Y¦p½e²@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ g´q¾sÀvÃa®_¬x¡Åz£Çl¹@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ z£Çx¡Åi¶z£Çg´vÃ^«q¾@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ ]ªq¾j·tÁj·x¡Å^«vÃ@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppuppuppuppuppuppuppuppupz£Çz£Çmºr¿`mºk¸`@@@@@@pup ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@@@@@@@@@@@@@@@@_¬hµz£ÇtÁ[¨X¥\ ©mº@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ puppup@@@@@@@@@@@@@@@@@@@@@@@@@@@uÂr¿e²b¯y¢ÆZ§tÁb¯@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@@@@tÁ^«{¤È`hµp½W¤g´W¤y¢Æx¡Åy¢Ær¿r¿Y¦@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@w Är¿k¸mºa®uÂw Äl¹mºq¾i¶j·X¥x¡Åx¡År¿@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@Y¦x¡ÅuÂp½hµ{¤Èz£Çn»W¤f³Z§b¯Z§mº_¬vÃ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@n»_¬]ªr¿l¹y¢Æ^«w Äp½e²]ªsÀuÂtÁo¼uÂ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@o¼o¼{¤Èhµq¾X¥d±o¼l¹mºmº]ªg´g´sÀ^«@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@vÃsÀx¡ÅmºZ§W¤^«mºsÀp½Y¦tÁuÂX¥c°{¤È@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@q¾c°j·c°w Äg´hµsÀk¸k¸y¢ÆtÁw Äl¹mºf³@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@e²mºX¥a®tÁ_¬f³Y¦k¸sÀl¹p½W¤mºg´uÂ_¬z£Ç]ªz£Çg´x¡Åq¾b¯f³mºp½p½]ªz£ÇtÁg´vÃ]ªy¢Æq¾mºa®w Äq¾k¸p½mºe²f³q¾W¤r¿hµz£Çq¾x¡Åq¾g´\ ©p½o¼a®c°]ªl¹vÃq¾y¢Æd±y¢Æk¸a®y¢ÆY¦\ ©x¡Åy¢ÆY¦mº]ªZ§i¶y¢Æe²z£Çmºj·i¶sÀe²mºw Äf³f³vÃg´vÃo¼z£Çp½uÂsÀX¥{¤Èn»w Äw Äo¼tÁtÁ]ªsÀb¯j·x¡Åb¯tÁr¿tÁz£ÇvÃ]ªc°l¹^«^«sÀb¯i¶e²w Ä^«d±x¡ÅtÁn»Z§x¡Å`tÁw ÄuÂg´uÂZ§X¥y¢Æy¢Æ[¨`j·g´a®sÀj·w ÄuÂk¸a®W¤l¹g´hµ\ ©_¬n»[¨x¡Åo¼y¢Æi¶b¯l¹X¥g´tÁmºx¡År¿Z§X¥mºx¡ÅvÃ_¬p½Z§uÂo¼vÃj·\ ©y¢Æe²b¯o¼z£ÇsÀ[¨r¿hµf³uÂg´mºc°sÀo¼_¬x¡År¿tÁ\ ©k¸^«^«x¡Åe²k¸\ ©vÃ_¬d±`Z§q¾p½l¹j·j·p½uÂ_¬[¨y¢Æq¾f³{¤È^«uÂvÃr¿Y¦b¯mº`vÃq¾z£ÇY¦uÂa®i¶i¶X¥[¨f³tÁY¦i¶Z§\ ©`^«e²[¨l¹_¬@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@l¹p½W¤mºg´uÂ_¬sÀl¹p½W¤mºf³l¹[¨z£ÇtÁhµy¢ÆZ§@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@e²f³q¾W¤r¿hµp½mºe²f³q¾o¼z£Çp½uÂsÀX¥{¤Èn»puppuppuppuppuppuppuppuppuppuppup@@@@@@@@@Z§b¯j·x¡Åb¯tÁZ§\ ©`i¶W¤uÂc°o¼z£Çp½mºc° puppup@@@@@@@@@l¹l¹p½W¤mºg´uÂ_¬l¹f³k¸tÁ`d±p½{¤Èw Ä puppup@@@@@@@@@e²e²f³q¾W¤r¿hµ`tÁhµy¢ÆZ§`uÂtÁl¹ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ puppup@@@@@@@@@Z§Z§i¶y¢Æe²z£Ç_¬d±Z§z£Ç{¤Èo¼c°j·]ª ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ puppup@@@@@@@@@j·l¹p½W¤mºhµn»k¸p½e²i¶p½e²a®°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@Z§e²f³q¾z£Çmº`vÃq¾z£ÇY¦uÂa®°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@l¹Z§i¶mºb¯^«tÁq¾p½c°z£Çn» ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@e²j·q¾mº[¨tÁ^«_¬W¤k¸_¬ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@Z§i¶b¯e²^«o¼mºn»f³hµ ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@j·]ªw Äk¸\ ©q¾i¶k¸W¤ ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@tÁy¢Æhµ\ ©Y¦j·W¤Z§puppuppuppuppuppuppuppuppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@Y¦i¶hµ_¬q¾Z§^«d±@@@@@@@@@@@@@@@@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ pup@@@@@@c°p½g´p½b¯]ªc°{¤È@@@@@@@@@@@@@@@@@@@@@@@@@@@puppup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@p½]ªq¾g´sÀc°j·Z§e²q¾vÃo¼n»Y¦w Ä@@@@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@sÀ^«o¼l¹y¢Æa®_¬X¥mºc°sÀo¼_¬x¡År¿tÁ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@j·j·p½uÂ_¬[¨y¢Æq¾X¥j·x¡Å{¤È]ªuÂk¸^«@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@\ ©X¥j·x¡ÅvÃi¶e²sÀa®c°mºhµr¿p½mº{¤È@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@vÃ_¬d±`Z§q¾p½l¹tÁw ÄZ§q¾l¹hµa®`@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@mºY¦g´vÃd±q¾c°q¾_¬g´W¤X¥y¢Æ{¤ÈuÂhµ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@vÃj·W¤tÁ_¬Z§r¿[¨f³hµ^«d±^«z£Çw Äp½@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@{¤Èmºd±Y¦o¼]ªmºk¸Y¦sÀmºo¼w Än»l¹W¤@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@c°r¿f³z£Ç]ªf³\ ©hµY¦f³_¬tÁa®X¥mºe²@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@f³mºl¹w ÄtÁy¢Æk¸k¸sÀhµg´w Äc°j·c°q¾@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@{¤Èc°X¥uÂtÁY¦p½sÀmº^«W¤Z§mºx¡ÅsÀvÃ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@^«sÀg´g´]ªmºmºl¹o¼d±X¥q¾hµ{¤Èo¼o¼@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@uÂo¼tÁuÂsÀ]ªe²p½w Ä^«y¢Æl¹r¿]ª_¬n»@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@vÃ_¬mºZ§b¯Z§f³W¤n»z£Ç{¤Èhµp½uÂx¡ÅY¦@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@r¿x¡Åx¡ÅX¥j·i¶q¾mºl¹w ÄuÂa®mºk¸r¿w Ä@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@Y¦r¿r¿y¢Æx¡Åy¢ÆW¤g´W¤p½hµ`{¤È^«tÁ@@@@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@b¯tÁZ§y¢Æb¯e²r¿uÂ@@@@@@@@@@@@@@@@@@@@@@@@@@@puppup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@mº\ ©X¥[¨tÁz£Çhµ_¬@@@@@@@@@@@@@@@@@@@@@@@@puppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ pup@@@@@@`k¸mº`r¿mºz£Çz£Çpuppuppuppuppuppuppuppuppup ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@vÃ^«x¡Åj·tÁj·q¾]ª ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@b¯^«vÃg´z£Çi¶x¡Åz£Ç ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@l¹j·x¡Å_¬a®vÃsÀq¾g´ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@e²p½x¡Åe²p½sÀ]ªe²g´x¡Å ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@Z§f³W¤b¯k¸Z§j·c°mº\ ©q¾°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@l¹b¯q¾mºtÁy¢Æk¸k¸l¹w Äp½b¯°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ° ¥ ¥ puppup@@@@@@@@@e²l¹j·W¤g´Z§Y¦p½sÀ^«f³o¼f³ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ puppup@@@@@@@@@Z§e²p½x¡År¿uÂ\ ©mºmºl¹^«f³a®mº ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ puppup@@@@@@@@@j·Z§f³W¤b¯hµ_¬`]ªe²p½sÀvÃc°p½ puppup@@@@@@@@@Z§l¹i¶q¾mºtÁp½sÀb¯Z§f³W¤b¯g´]ªp½ puppup@@@@@@@@@l¹e²p½y¢ÆW¤g´Z§mºl¹j·i¶q¾mºi¶vÃl¹]ªpuppuppuppuppuppuppuppuppuppuppup@@@@@@@@@e²Z§f³W¤e²r¿uÂ\ ©e²p½x¡Åy¢ÆW¤g´e²o¼vÃz£Ç@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Z§j·i¶q¾mºz£Çhµ_¬`f³W¤b¯e²r¿uÂw Äz£Çq¾tÁ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@j·i¶q¾mºz£Çhµ_¬`l¹i¶q¾mºtÁz£Çhµ_¬^«p½y¢Æg´c°{¤ÈvÃmºvÃ\ ©j·sÀp½c°Y¦tÁ]ªb¯o¼tÁuÂsÀ]ªe²p½y¢ÆW¤g´Z§j·z£Ç_¬d±uÂd±vÃr¿mºj·Y¦_¬X¥j·^«]ªp½i¶y¢Æw Äe²_¬mºZ§b¯Z§f³W¤e²r¿uÂ\ ©j·sÀn»x¡ÅsÀy¢Æ]ªf³d±W¤g´d±j·p½o¼q¾g´hµhµk¸^«x¡Åx¡ÅX¥j·i¶q¾mºz£Çhµ_¬`p½[¨[¨tÁX¥k¸y¢Æz£ÇY¦tÁvÃ`x¡ÅuÂl¹g´p½_¬\ ©\ ©o¼r¿r¿y¢Æx¡Åy¢ÆW¤g´o¼uÂz£Ç^«uÂr¿x¡Ån»{¤Èa®q¾]ªo¼_¬d±Z§vÃ_¬y¢ÆsÀb¯q¾Y¦q¾mºtÁZ§y¢Æb¯e²r¿uÂz£ÇsÀtÁe²_¬hµo¼Z§n»y¢Æmºf³]ªZ§q¾q¾i¶[¨a®c°]ªZ§j·i¶n»\ ©X¥[¨tÁz£Çhµ_¬p½X¥hµ[¨[¨f³y¢Æx¡Åw ÄY¦a®\ ©mºr¿c°p½e²y¢Æ_¬j·c°^«W¤k¸f³k¸z£ÇuÂe²j·tÁ{¤Èmº{¤Èy¢Æl¹y¢ÆuÂi¶`w Ä\ ©w Ähµk¸[¨q¾l¹sÀq¾X¥Z§{¤Èd±Z§W¤hµ_¬n»a®a®]ªl¹w Äc°n»Z§_¬q¾g´b¯tÁo¼x¡Åq¾hµ\ ©f³]ªz£Çf³r¿c°@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@W¤l¹n»w Äo¼mºsÀY¦k¸mº]ªo¼Y¦d±mº{¤È@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@p½w Äz£Ç^«d±^«hµf³[¨r¿Z§_¬tÁW¤j·vÃ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@hµuÂ{¤Èy¢ÆX¥W¤g´_¬q¾c°q¾d±vÃg´Y¦mº@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@`a®hµl¹q¾Z§w ÄtÁl¹p½q¾Z§`d±_¬vÃ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@{¤Èmºp½r¿hµmºc°a®sÀe²i¶vÃx¡Åj·X¥\ ©@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@^«k¸uÂ]ª{¤Èx¡Åj·X¥q¾y¢Æ[¨_¬uÂp½j·j·@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@tÁr¿x¡Å_¬o¼sÀc°mºX¥_¬a®y¢Æl¹o¼^«@@@@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@@@@w ÄY¦n»o¼vÃq¾e²@@@@@@@@@@@@@@@@@@@@@@@@@@@puppup ¥ ¥ °µ°°µ° ¥ ¥ puppup@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@puppup ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ puppup@@@@@@@@@@@@@@@@@@@@@@@@puppuppuppuppuppuppuppuppup ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ puppuppuppuppuppuppuppuppup ¥ ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ° ¥ °µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ° ¥ °µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ ¥ puppuppuppuppuppuppuppuppup ¥ ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ ¥ puppuppuppuppuppuppuppuppup@@@@@@@@@@@@@@@@@@@@@@@@puppup ¥ ¥ ¥ °µ°°µ° ¥ ¥ ¥ puppup@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@puppup ¥ ¥ °µ°°µ° ¥ ¥ puppup@@@@@@@@@@@@@@@@@@@@@@@@@@@_¬l¹[¨e²^«`\ ©@@@@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@@@@Y¦r¿vÃuÂ^«{¤Èf³q¾y¢Æ[¨_¬uÂp½j·j·@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@tÁr¿x¡Å_¬o¼sÀc°mºg´uÂf³hµr¿[¨sÀz£Ç@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@Z§r¿x¡ÅmºtÁg´X¥l¹b¯i¶y¢Æo¼x¡Å[¨n»_¬@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@y¢Æy¢ÆX¥Z§uÂg´uÂw ÄtÁ`x¡ÅZ§n»tÁx¡Åd±@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@b¯x¡Åj·b¯sÀ]ªtÁtÁo¼w Äw Än»{¤ÈX¥sÀuÂ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@e²y¢Æi¶Z§]ªmºY¦y¢Æx¡Å\ ©Y¦y¢Æa®k¸y¢Æd±@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@r¿W¤q¾f³e²mºp½k¸q¾w Äa®mºq¾y¢Æ]ªvÃ@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@uÂg´mºW¤p½l¹sÀk¸_¬vÃ\ ©k¸e²x¡Å^«^«k¸\ ©tÁr¿x¡Å_¬o¼sÀc°mº{¤Èmºp½r¿hµmºc°a®c°Z§l¹W¤c°c°i¶d±uÂvÃ^«`k¸y¢Æw Ä[¨p½d±z£ÇZ§z£Ç\ ©mºY¦o¼w Äb¯c°d±vÃw Än»Y¦l¹p½_¬[¨g´sÀb¯tÁ[¨j·r¿[¨r¿y¢Ær¿vÃsÀe²i¶vÃx¡ÅX¥\ ©q¾]ª[¨i¶r¿g´k¸sÀq¾q¾Y¦{¤Èk¸w Äb¯_¬`X¥c°hµhµl¹i¶ vÃBAADCDDEEFFFFFFEEECDDAAA^« c°g´hµW¤W¤q¾l¹r¿g´k¸\ ©c°W¤X¥z£Çg´p½ HGHJKKMMMOOONNOMMMKJJGHH p½l¹x¡Åx¡Å^«[¨d±q¾mº_¬a®n»j·c°c° @@@@@@ STSWWVYYYYYXWVWTSS @@@@@@ i¶X¥X¥vÃe²w Ä\ ©y¢Æ]ª{¤ÈvÃg´q¾ @@@```@@@@@@ ^^^bbbdeeedeabb^^] @@@@@@```@@@ b¯b¯x¡Åe²c°tÁtÁ_¬{¤Èr¿W¤i¶ @@@@@@```@@@ mmnqpqqqqmmn @@@```@@@@@@ o¼o¼Y¦d±mº{¤Èw ÄuÂo¼X¥\ ©{¤È^« @@@@@@@@@@@@ yyz}}}}}}zyz @@@@@@@@@@@@ vÃuÂuÂY¦j·sÀi¶r¿o¼k¸[¨p½a®AABHHH @@@@@@ @@@@@@ HHGAAAsÀsÀhµy¢Æx¡Åz£Çg´vÃf³f³w ÄmºDCCKJKSTT^^^ ^^^STTJKKCDDi¶i¶d±_¬l¹[¨uÂvÃ^«p½x¡Åw ÄEEEMMMVVVbbammmyyz yyynnnbbbWWWMMMEEEa®a®e²X¥`l¹l¹j·r¿r¿k¸r¿FFFOOOYYYdedqpp}}} }}~qqpeddYYYONNFFFtÁtÁhµuÂd±e²f³q¾[¨n»W¤uÂFFFNOOYYYdeeqqp~}} }}}qpqeddXXYNOOFFFk¸j·]ªmº`sÀ`l¹b¯y¢ÆsÀl¹EDEMMMVWVbabmmmzzy yzznnmbbbWWWMMMEEEl¹k¸_¬_¬g´z£Ç]ªk¸`i¶vÃg´CCCJJKTTS^]^ ^^^SSSKKJDDCW¤l¹Y¦tÁi¶q¾W¤\ ©f³e²uÂf³ABAGGG @@@@@@ @@@@@@ GHHAABf³W¤o¼b¯hµ]ªy¢Æc°\ ©e²`y¢Ævà @@@@@@@@@@@@ zyz}}}}}}yyy @@@@@@@@@@@@ ^«mºf³w ÄuÂz£Çx¡Åj·f³g´y¢Æq¾và @@@@@@```@@@ nmmqqqqqqnmn @@@```@@@@@@ b¯mºj·n»p½i¶d±mº{¤Èa®k¸r¿ @@@```@@@@@@ ^]^abbdeedddbbb^^^ @@@@@@```@@@ o¼b¯Y¦p½[¨^«]ªe²a®i¶Z§y¢Æi¶ @@@@@@ TTSVWVYYYYXYVWWTSS @@@@@@ c°n»o¼a®j·k¸Y¦r¿[¨vÃw Ä[¨r¿l¹p½ HHGJJKMMMNNOONNMMMJKKGHG p½g´mºn»q¾vÃf³hµZ§\ ©sÀa®f³e²hµg´@@@ @@@ABBCCCEEEFFFFFFEEECCCBBA@@@ @@@l¹hµo¼mºr¿`{¤ÈsÀvÃX¥W¤\ ©a®[¨sÀi¶@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Y¦{¤Èi¶o¼z£ÇW¤o¼b¯vÃtÁp½^«a®[¨sÀi¶@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Y¦{¤Èi¶r¿k¸Y¦o¼y¢Æk¸\ ©a®^«b¯vÃuÂ`@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@e²i¶b¯sÀ^«^«l¹c°p½k¸w Äq¾e²Z§_¬X¥@@@@@@@@@@@@@@@@@@@@@°µ°°µ°@@@@@@@@@@@@@@@@@@@@@q¾c°z£Çj·W¤q¾f³^«b¯hµ]ª\ ©W¤e²mºd±@@@@@@@@@@@@ ¥ ¥ °µ°°µ° ¥ ¥ @@@@@@@@@@@@l¹j·\ ©mºuÂf³vÃj·l¹f³p½j·n»uÂk¸{¤È@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@r¿f³vÃ_¬^«a®vÃl¹_¬{¤Èr¿W¤i¶n»_¬f³@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@mº]ªo¼Y¦d±mº{¤Èa®p½X¥f³r¿x¡Ån»w Äd±@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@q¾vÃc°`p½o¼]ª[¨^«]ªmº^«q¾uÂ^«k¸@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@l¹]ªc°a®o¼p½\ ©g´_¬vÃ\ ©k¸e²uÂ^«k¸@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@l¹]ªc°a®l¹W¤c°c°^«c°{¤Èc°a®x¡Å^«k¸@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@l¹a®c°Z§z£Çn»w Äe²^«k¸uÂ]ª{¤È]ªj·b¯@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@]ªhµf³mºsÀmºhµuÂ]ªg´{¤Èj·uÂx¡Åj·X¥@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@\ ©W¤g´]ªl¹_¬k¸uÂa®vÃY¦uÂmº\ ©e²f³@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@d±Z§e²^«hµsÀY¦]ª`z£Ç[¨sÀd±j·p½w Ä@@@@@@@@@@@@ ¥ ¥ °µ°°µ° ¥ ¥ @@@@@@@@@@@@{¤ÈY¦b¯d±vÃl¹W¤x¡Ån»g´r¿\ ©e²Z§e²^«@@@@@@@@@@@@@@@@@@@@@°µ°°µ°@@@@@@@@@@@@@@@@@@@@@tÁj·Z§vÃr¿\ ©g´c°r¿p½w Äp½`z£Ç]ªj·@@@@@@@@@@@@@@@@@@@@@@@@@@@===@@@@@@@@@@@@@@@@@@q¾\ ©g´\ ©\ ©p½w Äk¸sÀuÂx¡Åhµhµq¾b¯\ ©@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@o¼k¸q¾j·p½Z§e²tÁa®l¹b¯r¿f³j·a®r¿@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a®hµZ§sÀz£Ç_¬uÂg´]ªj·p½[¨y¢Æe²hµg´AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg´hµz£Ç]ª[¨^«_¬a®{¤Èd±r¿{¤È`r¿l¹p½AAAAAAAAAAAACCCFFFHGGIHHIHHHGGFFFCCCAAAAAAAAAAAAp½l¹d±^«g´x¡ÅY¦mºZ§p½vÃ]ªg´y¢Æi¶^«AAAAAACBCHHHLLMPPPSSRSSTSSTSSRPPPLLMHHHCBCAAAAAA^«i¶vÃuÂ\ ©_¬hµg´k¸l¹uÂhµy¢Ær¿]ª`AAADDDJJJQQQXWW\]]```aaaaaa```\]]XWWQQQJJJDDDAAA`]ªz£Çn»sÀ`_¬k¸Y¦tÁj·c°tÁvÃhµAAABBCJJJRSS\[[ddcjjkooopqppqpooojjkddc\[[RSSJJJBBCAAAhµ_¬r¿l¹W¤a®k¸^«e²x¡ÅhµW¤y¢ÆpµAAAGHHQQQ[\\ffgqppyyy~~~~~~yyyqppffg[\\QQQGHHAAApµhµg´Z§mºj·^«g´q¾c°z£Çj·f³AAACCDLLMXWWdddppp||||||pppdddXWWLLMCCDAAAhµ^«f³Z§a®k¸c°{¤Èq¾{¤Èy¢Æg´AAAFFEPPP]]\jjjxxxxxxjjj]]\PPPFFEAAA]ªe²{¤Èi¶a®W¤c°p½q¾tÁ^«l¹AAAHHGSRR```ono}~~¤£¤¨¨¨¨¨¨¤£¤}~~ono```SRRHHGAAAx¡Åk¸f³\ ©tÁz£Ç[¨^«g´Z§\ ©uÂ@@@IIHTSSbaappp¨§¨°°°°°°¨§¨pppbaaTSSIIH@@@a®mºb¯r¿mºr¿p½Y¦q¾hµa®r¿@@@IIHTSSbaappp¨§¨°°°°°°¨§¨pppbaaTSSIIH@@@W¤Z§hµl¹X¥^«sÀsÀe²c°uÂw ÄAAAHHGSRR```ono}~~¤£¤¨¨¨¨¨¨¤£¤}~~ono```SRRHHGAAAY¦a®{¤Èhµw ÄZ§n»q¾a®{¤Èq¾mºAAAFFEPPP]]\jjjxxxxxxjjj]]\PPPFFEAAAi¶q¾`y¢Æb¯uÂl¹mºX¥p½[¨a®AAACCDLLMXWWdddppp||||||pppdddXWWLLMCCDAAA{¤È^«W¤j·vÃZ§hµ`X¥f³^«{¤ÈpµAAAGHHQQQ[\\ffgqppyyy~~~~~~yyyqppffg[\\QQQGHHAAApµ_¬l¹W¤X¥z£Çg´sÀ{¤È]ª_¬`i¶hµAAABBCJJJRSS\[[ddcjjkooopqppqpooojjkddc\[[RSSJJJBBCAAAhµ^«c°X¥^«n»j·[¨e²^«x¡Ål¹q¾]ª`AAADDDJJJQQQXWW\]]```aaaaaa```\]]XWWQQQJJJDDDAAA`]ªi¶e²o¼e²`{¤Èo¼f³p½d±X¥c°i¶^«l¹AAACBCHHHLLMPPPSSRSSTSSTSSRPPPLLMHHHCBCAAAl¹^«i¶W¤\ ©l¹tÁX¥o¼_¬{¤Èd±^«\ ©z£Çl¹p½]ª^«AAAAAACCCFFFHGGIHHIHHHGGFFFCCCAAAAAA^«]ªp½l¹mºY¦]ªx¡ÅvÃq¾uÂg´^«x¡Åy¢Æhµhµg´c°]ª]ª[AAAAAAAAA@@@@@@AAAAAAAAA[]ª]ªc°g´hµ_¬`l¹y¢Æx¡Åf³^«hµf³b¯Y¦p½[¨^«e²f³sÀZ§d±d±x¡ÅZ§_¬l¹]ªn»k¸a®\ ©]ªX¥]ª]ªi¶j·p½d±g´tÁY¦vÃz£Çx¡ÅtÁmº_¬a®n»j·c°c°vÃ[¨e²o¼j·r¿Z§e²[¨e²b¯g´tÁW¤a®hµb¯Y¦c°{¤ÈX¥y¢Æd±q¾uÂg´l¹f³tÁmºY¦d±]ª`g´Z§k¸r¿{¤Èl¹d±w ÄW¤e²r¿hµg´r¿z£Çmºk¸hµw Äz£ÇuÂi¶sÀ`e²d±a®\ ©a®^«^«q¾[¨y¢ÆY¦vÃmºq¾^«\ ©w Äp½z£Çk¸tÁsÀk¸{¤Èc°k¸p½j·l¹X¥e²w Äg´]ªx¡Åk¸r¿j·e²`{¤Èa®p½w ÄW¤Y¦k¸l¹\ ©l¹`^«y¢Æ\ ©W¤k¸hµb¯d±]ªZ§z£Çd±c°hµw Äp½]ªo¼vÃe²Z§X¥g´z£Ç_¬w Äc°{¤Èhµj·d±Z§y¢Æe²Z§c°`e²^«y¢Æ{¤ÈZ§c°p½^«[¨l¹uÂsÀp½z£Çg´_¬p½y¢Æw Ä_¬e²q¾tÁ{¤È^«e²{¤ÈX¥y¢Æd±q¾uÂg´Y¦g´q¾f³y¢Æz£ÇuÂZ§p½W¤z£Çq¾k¸e²i¶vÃn»k¸r¿W¤Y¦uÂ_¬Z§sÀW¤p½n»{¤Èb¯w Äd±{¤Èx¡Åy¢Æ_¬w Äx¡Åb¯\ ©W¤x¡ÅY¦i¶k¸d±_¬f³f³`sÀo¼tÁi¶^«]ªa®{¤ÈmºY¦q¾mºl¹hµx¡Åk¸r¿j·e²`{¤Èa®p½w ÄW¤Y¦k¸l¹\ ©l¹`^«y¢Æ\ ©W¤k¸hµf³tÁq¾tÁ^«X¥uÂvÃc°z£Çi¶uÂk¸a®vÃz£Çr¿l¹a®q¾uÂp½i¶q¾q¾tÁz£Çf³r¿i¶X¥c°sÀW¤mºz£Ç`y¢Æa®x¡ÅvÃz£Çq¾hµg´uÂi¶b¯^«[¨q¾{¤ÈtÁr¿Y¦uÂc°e²c°e²W¤`Y¦sÀw ÄW¤y¢Æmºg´tÁy¢Æz£Çmº{¤ÈtÁuÂk¸b¯`Y¦Y¦q¾W¤d±e²Z§\ ©X¥_¬f³l¹tÁ]ª_¬a®z£Çp½x¡Å`tÁn»k¸r¿mºw Ämºo¼{¤Èc°y¢ÆvÃz£Ç{¤Èc°e²f³vÃhµ_¬k¸p½a®[¨sÀf³uÂ_¬`n»sÀ`sÀuÂr¿W¤d±e²vÃl¹\ ©z£Çx¡Åz£Çmº{¤È`i¶r¿vÃmºuÂa®mºc°k¸f³tÁ^«[¨r¿sÀhµw ÄW¤y¢ÆY¦r¿j·e²q¾{¤ÈtÁr¿Y¦uÂc°e²c°e²W¤`Y¦sÀw ÄW¤y¢Æmºg´tÁy¢Æz£ÇmºZ§Z§Z§[¨x¡Åy¢Æj·Z§_¬Z§j·i¶[¨Z§y¢Æhµ^«l¹{¤Èj·\ ©Z§tÁZ§f³{¤Èn»\ ©o¼q¾x¡Åj·hµi¶o¼x¡Åi¶f³b¯x¡ÅsÀo¼c°e²sÀW¤^«sÀ\ ©_¬[¨j·q¾p½w Ä^«^«p½o¼z£Çf³]ªj·Z§X¥z£ÇvÃi¶]ªf³uÂd±c°vÃi¶k¸n»f³[¨j·{¤Èf³d±W¤b¯W¤Z§\ ©z£Çe²sÀ`c°vÃj·`_¬z£Çj·]ªe²x¡ÅvÃz£Çe²n»e²n»\ ©^«[¨q¾f³j·b¯\ ©p½mºj·k¸r¿l¹a®\ ©g´hµf³x¡Åp½_¬r¿e²c°k¸sÀc°n»tÁ^«[¨r¿sÀhµw ÄW¤y¢ÆY¦r¿j·e²r¿g´hµx¡Åj·b¯g´b¯z£ÇuÂ]ªa®Y¦^«p½a®i¶`q¾o¼e²q¾\ ©g´b¯Z§g´o¼b¯d±]ªZ§z£Çd±c°hµw Äp½]ªo¼vÃe²Z§X¥g´z£Ç_¬w Äc°{¤Èhµz£Çk¸j·o¼sÀ_¬y¢Æg´w Äz£ÇhµtÁmºp½l¹q¾i¶p½mºa®tÁ{¤ÈW¤uÂb¯k¸sÀsÀsÀb¯f³j·k¸p½]ªtÁ{¤ÈtÁ_¬z£ÇY¦`l¹[¨q¾Z§w Ä]ªd±[¨j·Z§vÃtÁc°l¹sÀg´\ ©r¿f³o¼i¶_¬uÂvÃb¯\ ©g´e²tÁY¦g´a®z£ÇmºtÁd±f³y¢Æo¼``l¹z£Ç{¤Èy¢Æ\ ©r¿Y¦{¤Èa®q¾z£ÇX¥]ªf³\ ©p½p½p½w ÄZ§w Ähµc°r¿mºvÃb¯a®z£Çr¿_¬k¸j·j·mºn»e²c°i¶Z§y¢Æx¡ÅtÁw Äl¹g´o¼l¹a®tÁ\ ©\ ©hµp½]ªz£ÇuÂvÃb¯\ ©g´e²tÁY¦g´a®z£ÇmºtÁd±f³y¢Æo¼``l¹z£Çk¸w Äp½k¸p½uÂy¢Æc°z£Çf³n»q¾p½mºq¾{¤È`_¬p½^«\ ©hµe²e²Z§p½d±f³]ªw ÄsÀo¼c°p½^«[¨l¹uÂsÀp½z£Çg´_¬p½y¢Æw Ä_¬e²q¾tÁ{¤È^«e²{¤ÈX¥y¢Æd±q¾uÂg´l¹f³tÁmºvÃy¢Æhµhµ{¤Èk¸z£Çi¶uÂk¸a®vÃz£Çr¿l¹a®q¾uÂp½i¶q¾q¾tÁz£Çf³r¿i¶X¥c°sÀW¤mºZ§p½X¥i¶_¬n»vÃa®k¸c°Y¦q¾y¢Æd±\ ©_¬[¨z£Çj·tÁo¼w Ämºo¼{¤Èc°y¢ÆvÃz£Ç{¤Èc°e²W¤y¢Æmºg´tÁy¢Æz£ÇmºZ§Z§Z§[¨x¡Åy¢Æj·Z§_¬tÁw Äp½p½e²b¯r¿l¹`b¯^«_¬i¶sÀhµmºg´_¬e²{¤ÈX¥uÂvÃj·a®X¥]ªuÂmºg´r¿e²e²_¬\ ©z£Çn»Y¦f³tÁl¹n»q¾]ªq¾X¥j·hµmºc°c°x¡Å`g´c°Z§w Äg´sÀb¯hµz£ÇW¤tÁb¯d±r¿a®i¶o¼_¬[¨tÁz£Çc°i¶Y¦d±i¶mºz£Çl¹`y¢ÆY¦vÃe²Z§x¡Ål¹k¸f³e²tÁ{¤Èf³_¬e²n»vÃw Äa®]ª^«x¡Åg´hµg´]ªy¢Æe²_¬vÃ\ ©k¸e²x¡Å^«^«k¸\ ©tÁr¿x¡Å_¬o»sÀc°mº{¤Èmºp½r¿hµmºc°a®c°Z§l¹W¤c°c°i¶d±uÂvÃ^«`k¸y¢Æw Ä[¨k³d±\x<O`Pfz(-2b¥Y¦o¼w Äb¯c°d±vÃw Än»Y¦l¹p½_¬[¨g´sÀb¯tÁ[¨j·r¿[¨r¿y¢Æ^«CZm1<E###"%''''4CP\ ©q¾]ª[¨i¶r¿g´k¸sÀq¾q¾Y¦{¤Èk¸w Äb¯_¬`X¥c°hµhµl¹[¨j·(-0 333HHHFFF(((!!!EEECDDAAAn»W¤X¥[¨g´hµW¤W¤q¾l¹r¿g´k¸\ ©c°W¤X¥z£Çg´^«X¥c°DXjBBB]]]AAA999IIIKJJGHHMMMX¥c°j·^«l¹x¡Åx¡Å^«[¨d±q¾mº_¬a®n»j·c°[¨j·W¤X¥III>>>GGGUUU999(((POPTSSSTSSTSMMMhµr¿`i¶X¥X¥vÃe²w Ä\ ©y¢Æ]ª{¤ÈvÃg´q¾X¥c°n»MMMSTS'''&&&===GGG***!!!abb^^]^^^STTSTSMMMnºW¤Ps[¨b¯x¡Åe²c°tÁtÁ_¬{¤Èr¿W¤i¶W¤X¥MMMSTSSTT^^^///DDD:::///kklmmm^^^^^^STTEEEFFF9L\$&(CWh^«Y¦d±mº{¤Èw ÄuÂo¼X¥\ ©{¤Èn»MMMSTSSTT^^^^^^AAA!!!777'''222zyzzzymmmVVV^^^)))*** `Y¦j·sÀi¶r¿o¼k¸[¨p½a®AABHHHSTT^^^^^^mmmzzy555 --- zzy<<<'''(((888GGG777c§hµy¢Æx¡Åz£Çg´vÃf³f³w ÄmºDCCKJKSTT^^^mmmzzyrrr))) ]]]feeEEE"""555888[[[RRROOONdwd±_¬l¹[¨uÂvÃ^«p½x¡Åw ÄEEE@@@VVV\\[mmmyyzkkk ZZZ000333KKK@@@XXX???JJJ%%%%'*e²X¥`l¹l¹j·r¿r¿[{Tn ###(((###9:9'''WWW+++kjk+++ """888%%%333///...).2hµuÂd±e²f³q¾[¨n»*29---***999&&&999&&& +++zyz888UUU-,-333***$$$&&&TqPj]ªmº`sÀ`l¹b¯y¢Æ7BL!!!DDDBBB[[[BBBIII:::%%%ggg''' RRRvwwnnmVVVWWW>>>EEEl¹k¸_¬_¬g´z£Ç]ªk¸`i¶cFFFYYYWWW>>>222&&&NNNVVVvvv !!!```zzymmm^^^SSSKKJDDCW¤l¹Y¦tÁi¶q¾W¤\ ©f³e²uÂ000GGG222---+++444zzy444zzymmm^^^^^^STSGHHAABf³W¤o¼b¯hµ]ªy¢Æc°\ ©e²`%'(((("""$%%ZZZTTTmmmzzyzyzKKK###999$$$777^^^^^^STTSTSMMMn»mºf³w ÄuÂz£Çx¡Åj·f³g´y¢Æq¾Zu%'(@Xl@@@BCBSTT^^^^^^mmmnmm333333CCC888[[[STTSTSMMMX¥n»b¯mºj·n»p½i¶d±mº{¤Èa®k¸r¿g°[¨@@@MMMSTSSTT^^^^]^abb)))$$$HHH???+++###QRQMMM@@@X¥W¤o¼b¯Y¦p½[¨^«]ªe²a®i¶Z§y¢Æ`r¿@@@@@@MMMSTSSTSTTSVWV111666LLLPPPDDD>>>@@@@@@c°X¥n»o¼a®j·k¸Y¦r¿[¨vÃw Ä[¨r¿^«j·@@@@@@@@@MMMHHGJJKMMM 000>>>ccc@@@$$$5?G@@@@@@j·[¨mºn»q¾vÃf³hµZ§\ ©sÀa®f³e²hµ[¨@@@@@@@@@@@@ABBCCCEEE)))###EEEFFF777!!! !!@@@@@@^«hµo¼mºr¿`{¤ÈsÀvÃX¥W¤\ ©a®[¨sÀi¶@@@@@@@@@@@@@@@@@@@@@555###"""!!!***...@@@@@@Y¦{¤Èi¶o¼z£ÇW¤o¼b¯vÃtÁp½^«a®[¨sÀi¶@@@@@@@@@@@@@@@@@@@@@>>>'''...+++888@@@===@@@@@@Y¦{¤Èi¶r¿k¸Y¦o¼y¢Æk¸\ ©a®^«b¯vÃuÂ`@@@@@@@@@@@@@@@@@@@@@@@@@@@===@@@@@@@@@@@@@@@@@@e²i¶b¯sÀ^«^«l¹c°p½k¸w Äq¾e²Z§_¬X¥@@@@@@@@@@@@@@@@@@@@@°µ°°µ°@@@@@@@@@@@@@@@@@@@@@q¾c°z£Çj·W¤q¾f³^«b¯hµ]ª\ ©W¤e²mºd±@@@@@@@@@@@@ ¥ ¥ °µ°°µ° ¥ ¥ @@@@@@@@@@@@l¹j·\ ©mºuÂf³vÃj·l¹f³p½j·n»uÂk¸{¤È@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@r¿f³vÃ_¬^«a®vÃl¹_¬{¤Èr¿W¤i¶n»_¬f³@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@mº]ªo¼Y¦d±mº{¤Èa®p½X¥f³r¿x¡Ån»w Äd±@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@q¾vÃc°`p½o¼]ª[¨^«]ªmº^«q¾uÂ^«k¸@@@@@@pup ¥ ¥ °µ°°µ° ¥ ¥ pup@@@@@@l¹]ªc°a®o¼p½\ ©g´`sÀo¼tÁi¶^«]ªa®{¤ÈmºY¦q¾mºl¹hµk¸Z§\ ©hµn»b¯b¯y¢ÆY¦i¶]ªo¼tÁx¡Åk¸`r¿w ÄuÂW¤n»]ªw Ähµd±i¶o¼n»a®n»y¢Æy¢Æx¡Åf³uÂl¹]ªY¦p½_¬k¸p½j·l¹X¥e²w Äg´]ªp½c°W¤i¶d±f³n»W¤y¢Æb¯Z§n»r¿X¥tÁg´{¤Èb¯\ ©l¹r¿\ ©b¯\ ©w ÄZ§mºo¼tÁo¼^«w Äc°w Ä{¤Èi¶Z§o¼z£Çc°q¾hµd±tÁk¸`d±w Äg´y¢Æ{¤Èw Äo¼l¹z£ÇY¦tÁo¼W¤n»vÃX¥z£ÇvÃuÂq¾y¢Æ_¬j·W¤k¸Y¦mºvÃj·d±n»e²W¤q¾n»x¡Åq¾d±p½c°W¤i¶d±f³n»W¤y¢Æb¯Z§n»Z§tÁ^«W¤hµ^«k¸n»l¹]ª{¤Èl¹z£ÇtÁy¢Æc°{¤È``j·g´j·`k¸vÃ[¨Y¦x¡Åb¯hµX¥q¾_¬c°_¬f³sÀuÂj·^«[¨]ªo¼y¢Æf³i¶r¿_¬q¾Y¦l¹p½tÁvÃhµn»{¤Èx¡Åg´y¢ÆmºX¥W¤c°k¸Y¦e²y¢Æd±c°Y¦q¾]ªg´]ªZ§i¶b¯q¾Y¦c°k¸Z§^«l¹sÀz£Çmºc°j·`\ ©y¢Æ^«o¼X¥y¢Æ^«_¬hµy¢Æi¶o¼e²\ ©l¹^«sÀhµsÀa®sÀe²b¯mºd±n»Y¦n»o¼`i¶c°\ ©w ÄuÂW¤n»z£Çr¿_¬k¸j·j·mºn»e²c°i¶Z§y¢Æx¡ÅtÁw Äl¹d±]ª`W¤]ª`d±e²w Äi¶o¼]ªc°Y¦a®Y¦X¥l¹mº^«uÂk¸sÀg´g´hµ[¨f³i¶l¹w Ä{¤Èa®e²hµz£Çx¡Åc°f³sÀX¥uÂq¾y¢Æ_¬j·W¤a®mºc°k¸f³tÁ^«[¨r¿sÀhµw ÄW¤y¢ÆY¦r¿j·e²r¿g´hµx¡Åj·b¯g´b¯z£ÇuÂ]ªa®Y¦^«]ªb¯l¹{¤ÈX¥\ ©vÃp½p½_¬`X¥k¸tÁz£Ço¼vÃmºg´_¬z£Çhµq¾g´n»k¸Y¦^«o¼^«Y¦sÀl¹sÀk¸\ ©i¶_¬z£Çj·vÃw Ämºw ÄvÃw Ä\ ©[¨W¤e²sÀX¥uÂZ§d±q¾w ÄW¤z£ÇW¤k¸f³`z£ÇW¤j·g´d±hµtÁuÂg´Z§uÂk¸i¶d±hµr¿{¤Èx¡Åhµa®_¬k¸y¢Æ]ªn»tÁc°a®e²n»Y¦q¾{¤È`i¶[¨q¾a®r¿d±Z§o¼q¾n»tÁZ§n»f³f³tÁw ÄY¦uÂz£Ça®x¡Åf³hµhµg´]ªk¸hµtÁhµ_¬W¤b¯hµhµY¦c°d±i¶^«]ªn»o¼p½z£Ç`Y¦z£ÇsÀl¹vÃb¯n»X¥l¹sÀW¤k¸sÀZ§z£Çb¯n»W¤e²r¿tÁ]ªZ§z£Çq¾hµg´uÂi¶b¯^«[¨q¾{¤ÈtÁr¿Y¦uÂc°e²c°e²W¤`Y¦sÀw ÄW¤y¢Æi¶[¨^«vÃ\ ©W¤Y¦i¶Z§]ªuÂq¾a®p½b¯X¥mºuÂZ§{¤ÈtÁn»d±c°j·[¨vÃx¡Åa®r¿r¿W¤o¼w Äk¸uÂe²r¿[¨tÁ]ªZ§r¿z£Çi¶z£Ço¼`[¨d±b¯p½l¹j·]ª]ªx¡Åx¡Åp½vÃo¼`n»uÂb¯k¸sÀsÀsÀb¯f³j·f³a®g´i¶r¿b¯tÁj·b¯z£ÇW¤vÃg´c°sÀ^«c°Y¦mºe²]ªe²z£ÇmºY¦uÂW¤Y¦Y¦b¯b¯n»Z§c°sÀx¡ÅtÁz£Çj·\ ©_¬Y¦n»n»mºvÃy¢Æhµhµ{¤Èk¸z£Çi¶uÂk¸[¨Y¦x¡Åb¯hµX¥q¾mºd±\ ©[¨\ ©x¡ÅtÁZ§vÃk¸sÀf³mº[¨r¿^«e²Z§f³x¡Åb¯[¨z£Çhµo¼i¶w Äi¶vÃn»c°p½X¥W¤c°k¸Y¦e²y¢Æd±c°Y¦q¾]ªg´]ªZ§i¶b¯q¾Y¦c°k¸Z§^«l¹sÀd±x¡Å^«y¢Æ{¤ÈZ§c°p½^«[¨l¹uÂsÀp½z£Çg´_¬p½y¢Æw Ä_¬e²q¾tÁ{¤È^«e²{¤ÈX¥y¢Æd±q¾`\ ©Y¦b¯g´W¤p½g´X¥b¯uÂd±]ªY¦^«mºuÂa®uÂf³o¼W¤Z§j·i¶[¨Z§y¢Æhµ^«l¹{¤È`e²j·_¬^«x¡Å[¨uÂn»w Ä]ªr¿Z§`z£ÇvÃj·`z£Çd±tÁ]ªd±x¡ÅZ§g´j·q¾`_¬i¶r¿x¡Åk¸r¿j·e²`{¤Èa®p½w ÄW¤Y¦k¸l¹\ ©l¹`^«y¢Æ\ ©W¤k¸hµf³tÁq¾tÁ^«X¥uÂvÃc°x¡Åw ÄhµW¤x¡Åo¼p½{¤È\ ©tÁvÃl¹\ ©z£Çx¡Åz£Çmº{¤È`i¶r¿vÃmºuÂa®mºc°k¸f³tÁ^«[¨tÁn»z£ÇY¦q¾g´{¤Èa®[¨uÂX¥Z§g´]ªuÂc°Y¦g´f³k¸i¶f³b¯b¯{¤È{¤Èi¶i¶p½n»`X¥i¶b¯\ ©n»{¤Èb¯w Äa®c°n»mº[¨j·uÂmºW¤x¡Åx¡Åy¢Æd±o¼tÁb¯j·hµy¢ÆuÂ]ªn»x¡ÅtÁy¢Æhµw Äz£ÇuÂi¶sÀ`e²d±a®\ ©a®^«^«q¾[¨y¢ÆY¦vÃmºq¾^«\ ©w Äp½z£Çk¸tÁsÀk¸{¤Èc°k¸p½j·l¹X¥e²w Äg´]ªx¡Åk¸r¿j·e²`{¤Èa®p½w ÄW¤Y¦k¸l¹\ ©l¹`^«y¢Æ\ ©W¤k¸hµb¯d±]ªZ§z£Çd±c°hµw Äp½]ªo¼vÃe²Z§X¥g´z£Ç_¬w Äc°{¤Èhµj·d±Z§y¢Æe²Z§c°`e²^«y¢Æ{¤ÈZ§c°p½^«[¨l¹uÂsÀp½z£Çg´_¬p½y¢Æw Ä_¬e²q¾tÁ{¤È^«e²{¤ÈX¥y¢Æd±q¾uÂg´Y¦g´q¾f³y¢Æz£ÇuÂZ§p½W¤z£Çq¾k¸e²i¶vÃn»k¸r¿W¤Y¦uÂ_¬Z§sÀW¤p½n»{¤Èb¯w Äd±{¤Èx¡Åy¢Æ_¬w Äx¡Åb¯\ ©W¤x¡ÅY¦i¶k¸d±_¬f³f³`sÀo¼tÁi¶^«]ªa®{¤ÈmºY¦q¾mºl¹hµx¡Åk¸r¿j·e²`{¤Èa®p½w ÄW¤Y¦k¸l¹\ ©l¹`^«y¢Æ\ ©W¤k¸hµf³tÁq¾tÁ^«X¥uÂvÃc°z£Çi¶uÂk¸a®vÃz£Çr¿l¹a®q¾uÂp½i¶q¾q¾tÁz£Çf³r¿i¶X¥c°sÀW¤mºz£Ç`y¢Æa®x¡ÅvÃz£Çq¾hµg´uÂi¶b¯^«[¨q¾{¤ÈtÁr¿Y¦uÂc°e²c°e²W¤`Y¦sÀw ÄW¤y¢Æmºg´tÁy¢Æz£Çmº{¤ÈtÁuÂk¸b¯`Y¦Y¦q¾W¤d±e²Z§\ ©X¥_¬f³l¹tÁ]ª_¬a®z£Çp½x¡Å`tÁn»k¸r¿mºw Ämºo¼{¤Èc°y¢ÆvÃz£Ç{¤Èc°e²f³vÃhµ_¬k¸p½a®[¨sÀf³uÂ_¬`n»sÀ`sÀuÂr¿W¤d±e²vÃl¹\ ©z£Çx¡Åz£Çmº{¤È`i¶r¿vÃmºuÂa®mºc°k¸f³tÁ^«[¨r¿sÀhµw ÄW¤y¢ÆY¦r¿j·e²q¾{¤ÈtÁr¿Y¦uÂc°e²c°e²W¤`Y¦sÀw ÄW¤y¢Æmºg´tÁy¢Æz£ÇmºZ§Z§Z§[¨x¡Åy¢Æj·Z§_¬Z§j·i¶[¨Z§y¢Æhµ^«l¹{¤Èj·\ ©Z§tÁZ§f³{¤Èn»\ ©o¼q¾x¡Åj·hµi¶o¼x¡Åi¶f³b¯x¡ÅsÀo¼c°e²sÀW¤^«sÀ\ ©_¬[¨j·q¾p½w Ä^«^«p½o¼z£Çf³]ªj·Z§X¥z£ÇvÃi¶]ªf³uÂd±c°vÃi¶k¸n»f³[¨j·{¤Èf³d±W¤b¯W¤Z§\ ©z£Çe²sÀ`c°vÃj·`_¬z£Çj·]ªe²x¡ÅvÃz£Çe²n»e²n»\ ©^«[¨q¾f³j·b¯\ ©p½mºj·k¸r¿l¹a®\ ©g´hµf³x¡Åp½_¬r¿e²c°k¸sÀc°n»tÁ^«[¨r¿sÀhµw ÄW¤y¢ÆY¦r¿j·e²r¿g´hµx¡Åj·b¯g´b¯z£ÇuÂ]ªa®Y¦^«p½a®i¶`q¾o¼e²q¾\ ©g´b¯Z§g´o¼b¯d±]ªZ§z£Çd±c°hµw Äp½]ªo¼vÃe²Z§X¥g´z£Ç_¬w Äc°{¤Èhµz£Çk¸j·o¼sÀ_¬y¢Æg´w Äz£ÇhµtÁmºp½l¹q¾i¶p½mºa®tÁ{¤ÈW¤uÂb¯k¸sÀsÀsÀb¯f³j·k¸p½]ªtÁ{¤ÈtÁ_¬z£ÇY¦`l¹[¨q¾Z§w Ä]ªd±[¨j·Z§vÃtÁc°l¹sÀg´\ ©r¿f³o¼i¶_¬uÂvÃb¯\ ©g´e²tÁY¦g´a®z£ÇmºtÁd±f³y¢Æo¼``l¹z£Ç{¤Èy¢Æ\ ©r¿Y¦{¤Èa®q¾z£ÇX¥]ªf³\ ©p½p½p½w ÄZ§w Ähµc°r¿mºvÃb¯a®z£Çr¿_¬k¸j·j·mºn»e²c°i¶Z§y¢Æx¡ÅtÁw Äl¹g´o¼l¹a®tÁ\ ©\ ©hµp½]ªz£ÇuÂvÃb¯\ ©g´e²tÁY¦g´a®z£ÇmºtÁd±f³y¢Æo¼``l¹z£Çk¸w Äp½k¸p½uÂy¢Æc°z£Çf³n»q¾p½mºq¾{¤È`_¬p½^«\ ©hµe²e²Z§p½d±f³]ªw ÄsÀo¼c°p½^«[¨l¹uÂsÀp½z£Çg´_¬p½y¢Æw Ä_¬e²q¾tÁ{¤È^«e²{¤ÈX¥y¢Æd±q¾uÂg´l¹f³tÁmºvÃy¢Æhµhµ{¤Èk¸z£Çi¶uÂk¸a®vÃz£Çr¿l¹a®q¾uÂp½i¶q¾q¾tÁz£Çf³r¿i¶X¥c°sÀW¤mºZ§p½X¥i¶_¬n»vÃa®k¸c°Y¦q¾y¢Æd±\ ©_¬[¨z£Çj·tÁo¼w Ämºo¼{¤Èc°y¢ÆvÃz£Ç{¤Èc°e²W¤y¢Æmºg´tÁy¢Æz£ÇmºZ§Z§Z§[¨x¡Åy¢Æj·Z§_¬tÁw Äp½p½e²b¯r¿l¹`b¯^«_¬i¶sÀhµmºg´_¬e²{¤ÈX¥uÂvÃj·a®X¥]ªuÂmºg´r¿e²e²_¬\ ©z£Çn»Y¦f³tÁl¹n»q¾]ªq¾X¥j·hµmºc°c°x¡Å`g´c°Z§w Äg´sÀb¯hµz£ÇW¤tÁb¯d±r¿a®i¶o¼_¬[¨tÁz£Çc°i¶Y¦d±i¶mºz£Çl¹`y¢ÆY¦vÃe²Z§x¡Ål¹k¸f³e²tÁ{¤Èf³_¬e²n»vÃw Äa®]ª^«x¡Åg´hµg´]ªy¢Æe² |
/programs/games/tetris/trunk/tetris.asm |
---|
220,7 → 220,7 |
jmp still |
end_program: |
mov eax,-1 ; close this program |
or eax,-1 ; close this program |
int 0x40 |
go_new_game: |