forked from KolibriOS/kolibrios
206 lines
6.8 KiB
PHP
206 lines
6.8 KiB
PHP
|
macro CODE_SECTION
|
||
|
|
||
|
{
|
||
|
;+-----------------------------------+ Uses:eax,ebx,edx
|
||
|
;|-------Random Number Generator-----|---------------------------|
|
||
|
;+-----------------------------------+
|
||
|
rndseed: ;
|
||
|
mov eax,26 ; func 26 subfunc 9
|
||
|
mov ebx,9 ;
|
||
|
int 0x40 ;
|
||
|
mov dword[seed],eax ; system time from boot
|
||
|
random9: ; RND=[0..9]
|
||
|
mov eax,3 ;
|
||
|
int 0x40 ; get current time
|
||
|
shr eax,16 ; seconds in al
|
||
|
add eax,dword[seed] ;
|
||
|
imul eax,0x15a4e35 ; random formula rv=rv*0x15a4e35+1
|
||
|
inc eax ; return (rv&0x7FFFFFFF)%N
|
||
|
mov dword[seed],eax ;
|
||
|
and eax,0x07FFFFFFF ;
|
||
|
mov ebx,10 ; N=10
|
||
|
xor edx,edx ;
|
||
|
div bx ; eax/ebx= int[result]+rest
|
||
|
add dl,'0' ; DL='0'..'9' - rest
|
||
|
ret ;
|
||
|
;=================================================
|
||
|
rnew: ; New Random Secret Number
|
||
|
xor esi,esi ;----------------------------
|
||
|
LoopBegin lb1,0 ;
|
||
|
rn: call random9 ; DL=RND('0'..'9')
|
||
|
xor edi,edi ;
|
||
|
lb2: cmp byte[nA+edi],dl ;
|
||
|
je rn ;
|
||
|
inc edi ;
|
||
|
cmp edi,4 ; 4 digit
|
||
|
jne lb2 ;
|
||
|
mov byte[nA+esi],dl ;nA - secret number without double digits
|
||
|
inc esi ;nA - 4 bytes of non-repeated digits '0'..'9'
|
||
|
LoopEnd lb1,4 ;
|
||
|
ret ;
|
||
|
;-------------------------------------
|
||
|
numStr: inc dword[turn] ; turn++
|
||
|
mov ebx,dword[turn] ;
|
||
|
push ebx ;
|
||
|
pop ecx ; ebx=ecx=turn
|
||
|
add cl,'0' ;
|
||
|
add ch,':' ;
|
||
|
dec ebx ; -1
|
||
|
shl ebx,4 ; *16
|
||
|
mov word[tStr+ebx],cx; begin string by turn number +':'
|
||
|
ret
|
||
|
;-------------------------------------
|
||
|
paint_list:
|
||
|
LoopBegin lbList,0
|
||
|
mov ebx,ecx
|
||
|
shl ebx,4 ; *16
|
||
|
mov edx,tStr
|
||
|
add edx,ebx
|
||
|
add ebx,25*65536 ;x
|
||
|
add ebx,45 ;y
|
||
|
mov eax,4 ;func 4
|
||
|
mov ecx,cTxt ;color
|
||
|
mov esi,16 ;line length
|
||
|
int 0x40
|
||
|
LoopEnd lbList,9 ;
|
||
|
ret
|
||
|
;-INPUT------------------------------------ KEYBOARD INPUT -----------
|
||
|
input: ;ah - key code
|
||
|
mov byte[char],ah ;char<-ah
|
||
|
cmp ah,13 ;13- enter
|
||
|
jne @f
|
||
|
jmp _enter
|
||
|
@@:
|
||
|
cmp ah,8 ;8 - del backSpace <=|
|
||
|
jne @f
|
||
|
jmp _back
|
||
|
@@:
|
||
|
|
||
|
cmp ah,'0' ; '0'..'9'
|
||
|
jae @f
|
||
|
ret
|
||
|
@@: cmp ah,'9'
|
||
|
jbe @f
|
||
|
ret ; if not - return subroutine
|
||
|
@@:
|
||
|
;------------------------pressed:0123456789-----------
|
||
|
cmp byte[posn],4
|
||
|
je @f ;full line - do nothing
|
||
|
call ptrStr ;esi - pointer at tStr
|
||
|
xor eax,eax
|
||
|
add al,byte[posn]
|
||
|
add esi,eax ;+posn
|
||
|
mov al,byte[char]
|
||
|
mov byte[esi+3],al ;esi+3 = place 4 digits
|
||
|
inc byte[posn] ;next digit
|
||
|
@@: ret
|
||
|
;------------------------
|
||
|
_enter:
|
||
|
cmp byte[posn],4 ; Enter Turn
|
||
|
je @f
|
||
|
ret
|
||
|
@@:
|
||
|
call check ; check input for difference
|
||
|
cmp eax,0
|
||
|
je @f
|
||
|
ret
|
||
|
@@:
|
||
|
call bcalculate ; calc b+c
|
||
|
call numStr ; 'N:' next string number
|
||
|
mov byte[posn],0 ; new line
|
||
|
ret
|
||
|
;------------------------
|
||
|
_back: cmp byte[posn],0 ; empty input - do nothing
|
||
|
je @f
|
||
|
dec byte[posn]
|
||
|
call ptrStr ;esi = pointer at tStr
|
||
|
xor eax,eax
|
||
|
add al,byte[posn] ; byte of esi +posn
|
||
|
add esi,eax ;+posn
|
||
|
mov byte[esi+3],' '
|
||
|
@@: ret
|
||
|
;===========================================--end - input -
|
||
|
ptrStr: ; esi=tStr+turn*16
|
||
|
mov esi,dword[turn]
|
||
|
shl esi,4
|
||
|
add esi,tStr
|
||
|
ret
|
||
|
;------------------------
|
||
|
clears: mov ecx,160
|
||
|
clr1: mov byte[tStr+ecx],0;' '
|
||
|
loop clr1
|
||
|
mov byte[tStr],0;' '
|
||
|
mov byte[posn],0
|
||
|
mov dword[turn],0
|
||
|
ret
|
||
|
;-------------------------CHECK---Input--[1234]-------
|
||
|
check: ; check for similar digits (equal)
|
||
|
call ptrStr ; esi ...pointer
|
||
|
;mov esi,dword[turn]
|
||
|
;shl esi,4
|
||
|
;add esi,tStr
|
||
|
xor eax,eax
|
||
|
xor edi,edi ; edi - counter 0..3
|
||
|
xor ecx,ecx
|
||
|
lb4ch: mov dl,byte[esi+ecx+3]
|
||
|
cmp byte[esi+edi+3],dl
|
||
|
jne @f
|
||
|
inc eax ; =equivalent +1
|
||
|
@@:
|
||
|
inc edi ;
|
||
|
cmp edi,4 ; cycle ,4 digits
|
||
|
jne lb4ch ;
|
||
|
xor edi,edi ; edi - counter 0..3
|
||
|
|
||
|
inc ecx
|
||
|
cmp ecx,4
|
||
|
jne lb4ch
|
||
|
|
||
|
sub eax,4 ; must be 4, if more - doubles present
|
||
|
ret
|
||
|
|
||
|
bcalculate: ;------------------; calc b:+c:
|
||
|
call ptrStr ; esi ...
|
||
|
add esi,3
|
||
|
;inc esi
|
||
|
;inc esi ;+3
|
||
|
;inc esi ; ...- pointer to Line
|
||
|
LoopBegin lbBu1,0 ;bull count cycle ecx=0..3
|
||
|
mov bl,byte[nA+ecx]
|
||
|
mov dl,byte[esi+ecx]
|
||
|
cmp bl,dl
|
||
|
jne @f
|
||
|
inc byte[nBul]
|
||
|
@@:
|
||
|
LoopEnd lbBu1,4
|
||
|
|
||
|
mov ax,'B:' ; output Bulls
|
||
|
mov word[esi+6],ax
|
||
|
mov al,byte[nBul]
|
||
|
add al,'0'
|
||
|
mov byte[esi+8],al
|
||
|
|
||
|
LoopBegin lbCo2,0 ;Cows count cycle ecx=0..3
|
||
|
mov dl,byte[esi+ecx]
|
||
|
xor edi,edi ; cycle edi=0..3
|
||
|
lb3: mov bl,byte[nA+edi]
|
||
|
cmp bl,dl
|
||
|
jne @f
|
||
|
inc byte[nCow] ;Cows+Bulls
|
||
|
@@: inc edi ;
|
||
|
cmp edi,4 ;
|
||
|
jne lb3 ;
|
||
|
LoopEnd lbCo2,4 ;endcycle ecx
|
||
|
|
||
|
mov ax,'C:' ; output Cows
|
||
|
mov word[esi+10],ax
|
||
|
mov al,byte[nCow]
|
||
|
sub al,byte[nBul]
|
||
|
add al,'0'
|
||
|
mov byte[esi+12],al
|
||
|
mov dword[nBul],0 ;nCow=posn=char=0
|
||
|
ret
|
||
|
;--------------------------------------
|
||
|
}
|
||
|
|