Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. macro CODE_SECTION
  2.  
  3. {
  4. ;+-----------------------------------+     Uses:eax,ebx,edx
  5. ;|-------Random Number Generator-----|---------------------------|
  6. ;+-----------------------------------+
  7.  rndseed:                       ;
  8.         mov     eax,26          ; func 26 subfunc 9
  9.         mov     ebx,9           ;
  10.         int     0x40            ;
  11.         mov dword[seed],eax     ; system time from boot
  12.  random9:                       ; RND=[0..9]
  13.         mov  eax,3              ;
  14.         int  0x40               ; get current time
  15.         shr  eax,16             ; seconds in al
  16.         add  eax,dword[seed]    ;
  17.         imul eax,0x15a4e35      ; random formula rv=rv*0x15a4e35+1
  18.         inc  eax                ; return (rv&0x7FFFFFFF)%N
  19.         mov  dword[seed],eax    ;
  20.         and  eax,0x07FFFFFFF    ;
  21.         mov  ebx,10             ; N=10
  22.         xor  edx,edx            ;
  23.         div  bx                 ; eax/ebx= int[result]+rest
  24.         add dl,'0'              ; DL='0'..'9' - rest
  25.         ret                     ;
  26. ;=================================================
  27.    rnew:                        ; New Random Secret Number
  28.           xor   esi,esi         ;----------------------------
  29.       LoopBegin  lb1,0          ;
  30.       rn: call random9          ; DL=RND('0'..'9')
  31.           xor  edi,edi          ;
  32.      lb2: cmp byte[nA+edi],dl   ;
  33.           je  rn                ;
  34.           inc edi               ;
  35.           cmp  edi,4            ; 4 digit
  36.           jne  lb2              ;
  37.           mov byte[nA+esi],dl   ;nA - secret number without double digits
  38.           inc esi               ;nA - 4 bytes of non-repeated digits '0'..'9'
  39.       LoopEnd lb1,4             ;
  40.           ret                   ;
  41. ;-------------------------------------
  42.  numStr:  inc  dword[turn]      ; turn++
  43.           mov  ebx,dword[turn]  ;
  44.           push ebx              ;
  45.           pop  ecx              ; ebx=ecx=turn
  46.           add  cl,'0'           ;
  47.           add  ch,':'           ;
  48.           dec  ebx              ; -1
  49.           shl  ebx,4            ; *16
  50.           mov  word[tStr+ebx],cx; begin string by turn number +':'
  51.           ret
  52. ;-------------------------------------
  53.  paint_list:
  54.       LoopBegin  lbList,0
  55.           mov  ebx,ecx
  56.           shl  ebx,4            ; *16
  57.           mov  edx,tStr
  58.           add  edx,ebx
  59.           add  ebx,25*65536     ;x
  60.           add  ebx,45           ;y
  61.           mov  eax,4       ;func 4
  62.           mov  ecx,cTxt    ;color
  63.           mov  esi,16      ;line length
  64.           int  0x40
  65.       LoopEnd    lbList,9  ;
  66.           ret
  67. ;-INPUT------------------------------------ KEYBOARD INPUT -----------
  68.   input:                     ;ah - key code
  69.           mov byte[char],ah  ;char<-ah
  70.           cmp  ah,13         ;13- enter
  71.           jne   @f
  72.           jmp _enter
  73.      @@:
  74.           cmp  ah,8         ;8 - del backSpace <=|
  75.           jne   @f
  76.           jmp _back
  77.      @@:
  78.  
  79.           cmp  ah,'0'        ; '0'..'9'
  80.           jae  @f
  81.           ret
  82.      @@:  cmp  ah,'9'
  83.           jbe  @f
  84.           ret                ; if not - return subroutine
  85.      @@:
  86. ;------------------------pressed:0123456789-----------
  87.           cmp byte[posn],4
  88.           je @f                 ;full line - do nothing
  89.           call ptrStr           ;esi - pointer at tStr
  90.           xor eax,eax
  91.           add al,byte[posn]
  92.           add esi,eax           ;+posn
  93.           mov al,byte[char]
  94.           mov byte[esi+3],al    ;esi+3 = place 4 digits
  95.           inc byte[posn]        ;next digit
  96.       @@: ret
  97. ;------------------------
  98.   _enter:
  99.           cmp byte[posn],4     ; Enter Turn
  100.           je  @f
  101.           ret
  102.      @@:
  103.           call check           ; check input for difference
  104.           cmp eax,0
  105.           je @f
  106.           ret
  107.      @@:
  108.           call bcalculate       ; calc b+c
  109.           call    numStr        ;  'N:'   next string number
  110.           mov byte[posn],0      ; new line
  111.           ret
  112. ;------------------------
  113.   _back:  cmp byte[posn],0      ; empty input - do nothing
  114.           je  @f
  115.           dec byte[posn]
  116.           call ptrStr           ;esi = pointer at tStr
  117.           xor eax,eax
  118.           add al,byte[posn]     ; byte of esi  +posn
  119.           add esi,eax           ;+posn
  120.           mov byte[esi+3],' '
  121.      @@:  ret
  122. ;===========================================--end - input -
  123.   ptrStr:                      ; esi=tStr+turn*16
  124.           mov esi,dword[turn]
  125.           shl esi,4
  126.           add esi,tStr
  127.           ret
  128. ;------------------------
  129.  clears:  mov ecx,160
  130.    clr1:  mov byte[tStr+ecx],0;' '
  131.           loop clr1
  132.           mov byte[tStr],0;' '
  133.           mov  byte[posn],0
  134.           mov  dword[turn],0
  135.           ret
  136. ;-------------------------CHECK---Input--[1234]-------
  137.   check:                        ; check for similar digits (equal)
  138.           call ptrStr           ; esi ...pointer
  139.           ;mov esi,dword[turn]
  140.           ;shl esi,4
  141.           ;add esi,tStr
  142.           xor  eax,eax
  143.           xor  edi,edi          ; edi - counter 0..3
  144.           xor  ecx,ecx
  145.    lb4ch: mov dl,byte[esi+ecx+3]
  146.           cmp byte[esi+edi+3],dl
  147.           jne @f
  148.           inc eax               ; =equivalent +1
  149.        @@:
  150.           inc  edi              ;
  151.           cmp  edi,4            ; cycle ,4 digits
  152.           jne  lb4ch            ;
  153.           xor  edi,edi          ; edi - counter 0..3
  154.  
  155.         inc   ecx
  156.         cmp   ecx,4
  157.         jne   lb4ch
  158.  
  159.           sub eax,4              ; must be 4, if more - doubles present
  160.           ret
  161.  
  162.  bcalculate: ;------------------; calc b:+c:
  163.           call ptrStr           ; esi ...
  164.           add esi,3
  165.           ;inc esi
  166.           ;inc esi               ;+3
  167.           ;inc esi               ; ...- pointer  to Line
  168.     LoopBegin  lbBu1,0             ;bull count cycle  ecx=0..3
  169.           mov  bl,byte[nA+ecx]
  170.           mov  dl,byte[esi+ecx]
  171.           cmp  bl,dl
  172.           jne  @f
  173.           inc  byte[nBul]
  174.      @@:
  175.     LoopEnd    lbBu1,4
  176.  
  177.           mov ax,'B:'             ; output Bulls
  178.           mov word[esi+6],ax
  179.           mov al,byte[nBul]
  180.           add al,'0'
  181.           mov byte[esi+8],al
  182.  
  183.         LoopBegin  lbCo2,0       ;Cows count cycle ecx=0..3
  184.           mov  dl,byte[esi+ecx]
  185.           xor  edi,edi          ; cycle edi=0..3
  186.     lb3:  mov bl,byte[nA+edi]
  187.           cmp  bl,dl
  188.           jne  @f
  189.           inc  byte[nCow]       ;Cows+Bulls
  190.      @@:  inc edi               ;
  191.           cmp  edi,4            ;
  192.           jne  lb3              ;
  193.         LoopEnd    lbCo2,4      ;endcycle ecx
  194.  
  195.           mov ax,'C:'         ; output Cows
  196.           mov word[esi+10],ax
  197.           mov al,byte[nCow]
  198.           sub al,byte[nBul]
  199.           add al,'0'
  200.           mov byte[esi+12],al
  201.           mov dword[nBul],0   ;nCow=posn=char=0
  202.           ret
  203. ;--------------------------------------
  204. }
  205.  
  206.