Advertisement
Guest User

Untitled

a guest
Dec 27th, 2018
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;
  2. ; TicTacTe for 8086 processor using emu8086 sintax
  3. ;
  4.     format MZ                   ; multi segment format
  5.     use16                       ; code starts at offset 100h
  6.     entry           main:start  ; exe entry point
  7.     stack           100h           ; stack size
  8.     include 'inc/proc32.inc'
  9.  
  10. ;
  11. ; constants
  12. ;
  13.     PLAYER_NAME_SIZE    equ 33   ; 32 bytes para o nome +1 para o $
  14.     P1_CHAR             equ 78h  ; x
  15.     P1_COLOR            equ 0Fh  ; white
  16.     P2_CHAR             equ 4Fh  ; o    
  17.     P2_COLOR            equ 09h  ; light blue    
  18.     GAME_TEXT_COLOR     equ 07h  ; light gray  
  19.     GAME_TEXT_SHADOW    equ 08h  ; dark gray        
  20.     GAME_TEXT_SUCCESS   equ 0Ah  ; light green
  21.     GAME_TEXT_ERRO      equ 0Ch  ; light red
  22.  
  23.     SYMBOL_LIGHT_SMILE  equ 01h
  24.     SYMBOL_DARK_SMILE   equ 02h
  25.     SYMBOL_HEART        equ 03h
  26.     SYMBOL_DIAMOND      equ 04h
  27.     SYMBOL_CLUBS        equ 05h
  28.     SYMBOL_SPADES       equ 06h
  29.     SYMBOL_MALE         equ 0Ch
  30.     SYMBOL_FEMALE       equ 0Bh
  31.     SYMBOL_X            equ 78h
  32.     SYMBOL_O            equ 6Fh
  33.  
  34. ; game states
  35.     ST_MENU            equ 0h ; o jogo est? no menu inicial
  36.     ST_JOGANDO         equ 1h ; o jogo est? rolando
  37.     ST_GAME_OVER       equ 2h ; game over  
  38.     ST_VITORIA         equ 3h  
  39.  
  40. segment text
  41. ; vari?veis
  42.     player_1            DB P1_CHAR, P1_COLOR, "Player 1                        $"
  43.     player_2            DB P2_CHAR, P2_COLOR, "Player 2                        $"
  44.    
  45.     game_state          DB 0  ; 0 = menu, 1 = playing, 2 = game over
  46.     current_player      DB 1      
  47.     current_color       DB 0
  48.     current_char        DB 0
  49.     new_line            DB 13,10,"$" ; new line chars    
  50.     game_over_message   DB "GAME OVER", 13, 10, "$"        
  51.     str_game_divider    DB '-------------------------------------------------------------------------------$'
  52.     str_game_header     DB '                             [  ASM TIC TAC TOE  ]                             $'
  53.     grid                DB 9 DUP(0)  
  54.     grid_buffer         DB '                                     |   |   ', 13, 10
  55.                         DB '                                  ---+---+---', 13, 10
  56.                         DB '                                     |   |   ', 13, 10
  57.                         DB '                                  ---+---+---', 13, 10
  58.                         DB '                                     |   |   ', 13, 10, '$'                                                
  59.     str_player1_set_name    DB 'Player 1, inform your name : $'
  60.     str_player2_set_name    DB 'Player 2, inform your name : $'
  61.     str_player_set_color    DB 'Choose your colour         : $'
  62.     str_player_set_char     DB 'Choose your symbol         : $'
  63.     str_ftr_cores           DB 'Colors   : 1.white 2.blue 3.green 4.red$'
  64.     str_ftr_simbolos        DB 'Symbols  : 1.', 01   ; sorriso claro
  65.                                    DB ' 2.', 02    ; sorriso escuro
  66.                                    DB ' 3.', 03    ; copa (cora??o)
  67.                                    DB ' 4.', 04    ; losango (ouro)
  68.                                    DB ' 5.', 05    ; paus
  69.                                    DB ' 6.', 06    ; espadas
  70.                                    DB ' 7.', 11    ; macho  
  71.                                    DB ' 8.', 12    ; f?mea
  72.                                    DB ' 9.x 0.o  $'
  73.    
  74.     str_ok              DB 'Ok!$'
  75.     str_iniciando       DB 'Starting...$'
  76.     str_type_position   DB ', inform a position : $'
  77.     str_vitoria         DB 'VICTORY!!!', 13, 10
  78.                         DB 'The player $'
  79.     str_votoria_suf     DB ' wins!$' ; sufixo;
  80.     str_game_over       DB 'Game over!', 13, 10
  81.                         DB 'TIE!$'  
  82.     str_bye             DB ' $'              
  83.  
  84.  
  85. segment main    
  86.  
  87. ; this macro prints a char in AL and advances
  88. ; the current cursor position:
  89. macro putc char {
  90.     push    ax
  91.     mov     al, byte char
  92.     mov     ah, 0Eh
  93.     int     10h    
  94.     pop     ax
  95. }
  96.  
  97.  
  98. ; dx = endere?o do texto
  99. ; bx = cor
  100. ; cx = o n?mero de caracteres a colorir
  101. macro print texto, tamanho, cor{
  102.     mov     dx, word texto
  103.     mov     cx, tamanho
  104.     mov     bx, cor    
  105.     mov     ax, 0920h           ; AH=Function number AL=Space character  
  106.     int     10h                 ; INT 10h/AH=9 - write character and attribute at cursor position.
  107.     int     21h                 ; INT 21h/AH=9 - output of a string at DS:DX. String must be terminated by '$'.
  108. }
  109.  
  110.  
  111. start:    
  112. ; set segment registers
  113.     mov     ax, text        ; load the data segment address into ax
  114.     mov     ds, ax          ; set the data current segment
  115.    
  116. ; enable mode 3h (16 colors 80 x 25)
  117. ; setup_screen
  118.     mov     ax, 1003h  
  119.     mov     bx, 0
  120.     int     10h    
  121.    
  122.     main_loop:  
  123.         call    clear_screen
  124.         call    draw_scene
  125.         jmp     main_loop  
  126.    
  127.     return_to_os:
  128.         print   str_bye, 10, GAME_TEXT_COLOR      ; reseta a cor do console      
  129.         mov     ax, 4C00h                       ; al = retur code = 0 ; no erros        
  130.         int     21h                             ;INT 21h / AH=4Ch - return control to the operating system (stop program).    
  131.         ret
  132.        
  133.            
  134.        
  135. ; set the video to mode 03
  136. ; (setar o modo de v?deo sempre apaga o buffer da tela)
  137. ;   ah = 0 (set video mode function)
  138. ;   al = 3 (text mode) 80 x 25 16 colors                                          
  139. clear_screen:
  140.     mov     ax, 0003h    
  141.     int     10h        
  142.     ret
  143.  
  144.                                        
  145. ; read keyboard and return content in ah    
  146. get_key:
  147.     mov     ah, 1      
  148.     int     21h    
  149.     mov     ah, 0
  150.     ret    
  151.  
  152.    
  153. macro gotoXY linha, coluna{
  154.     push    ax
  155.     push    bx
  156.     push    dx    
  157. ; configura par?metros e fun??o
  158.     mov     ah, 02h    
  159.     mov     bh, 0      
  160.     mov     dh, coluna
  161.     mov     dl, linha
  162.     int     10h             ;chama a fun??o          
  163. ; restaura??o dos registradores
  164.     pop     dx    
  165.     pop     bx
  166.     pop     ax
  167. }
  168.  
  169.  
  170. macro print_addr texto, position, tamanho, cor{
  171.     mov     dx, texto
  172.     add     dx, position  
  173.     mov     cx, tamanho
  174.     mov     bx, cor    
  175.     mov     ax, 0920h           ; AH=Function number AL=Space character  
  176.     int     10h                 ; BIOS function
  177.     int     21h                 ; DOS function
  178. }
  179.  
  180.  
  181. ;
  182. ; char must be in al register
  183. ;
  184. proc print_char    
  185.     cmp     al, 0
  186.     je      print_char_exit
  187.    
  188.     push    bx
  189.     push    cx                
  190.  
  191.     mov     ah, 9h              ; function 9h write character and attribute at cursor position.        
  192.     mov     bh, 0               ; page number
  193.     mov     bl, [current_color] ; color atrib
  194.     mov     cx, 1               ; number of times to print the char
  195.     int     10h                 ; call the function
  196.                                
  197.     pop     cx
  198.     pop     bx
  199.                
  200.     print_char_exit:
  201.     ret
  202. endp
  203.  
  204. beep:
  205.     push dx
  206.     push ax
  207.    
  208.     mov dl, 07h
  209.     mov ah, 2    
  210.     int 21h
  211.    
  212.     pop ax
  213.     pop dx
  214.    
  215.     ret
  216.    
  217. ;
  218. ; l? uma posi?o do teclado e salva o conte?do no grid
  219. ; (deve ser um input de 1 a 9)
  220. ; o joga
  221. ;le_jogada macro jogador
  222. le_jogada:
  223.     inicio:    
  224.         call    get_key                    ; le a jogada em ah
  225.         cmp     al, 31h      
  226.         jl      invalido                   ; o valor deve estar entre 1 e 9 (31h e 39h em ascii)
  227.         cmp     al, 39h                    ; vamos validar com 2 cmp's
  228.         jg      invalido
  229.        
  230.         sub     al, 31h                   ; converte o ascii no ?ndice o grid
  231.         mov     si, grid                  ; carrega o endere?o do grid em si        
  232.         add     si, ax                    ; desloca di at? a posi??o selecionada    
  233.        
  234.         ; temos um indice v?lio, mas ele est? livre?    
  235.         cmp     byte[ds:si], 0                         
  236.         jne     invalido    
  237.        
  238.         ; configura o jogador
  239.         cmp     [current_player], 1
  240.         jne     set_p2_grid_char
  241.         jmp     set_p1_grid_char
  242.  
  243.     set_p1_grid_char:
  244.         mov     bl, [player_1+0]
  245.         mov     [ds:si], bl                 ; salva a jogada na posicao correta do grid            
  246.         jmp     return
  247.        
  248.     set_p2_grid_char:    
  249.         mov     bl, [player_2+0]
  250.         mov     [ds:si], bl                 ; salva a jogada na posicao correta do grid        
  251.         jmp     return
  252.        
  253.     invalido:
  254.        call beep        
  255.        call clear_last_char  
  256.        jmp  inicio
  257.  
  258.     return:
  259.         ret
  260.  
  261.  
  262. ;
  263. ; seleciona um s?mbolo da lista de op??es
  264. ; os valores podem ser de 0 a 9
  265. ; retorna em al
  266. select_player_symbol:
  267.     read_symbol:        
  268.         call    get_key                 ; le a op??o e joga em al    
  269.         cmp     al, 30h
  270.         jl      invalid_symbol
  271.         cmp     al, 39h
  272.         jg      invalid_symbol    
  273.         sub     al, 30h                  ; converte o ascii em         
  274.        
  275. ; the symbol selection is valid. let's adjust the glyth code
  276. ; fom 1 to 6 is already right
  277.         cmp     al, 0
  278.         je      set_symbol_0
  279.         cmp     al, 7
  280.         je      set_symbol_male
  281.         cmp     al, 8
  282.         je      set_symbol_female
  283.         cmp     al, 9
  284.         je      set_symbol_x
  285.         jmp     invalid_symbol
  286.        
  287.     set_symbol_x:
  288.         mov     al, SYMBOL_X
  289.         jmp     select_player_symbol_return
  290.        
  291.     set_symbol_0:      
  292.         mov     al, SYMBOL_O
  293.         jmp     select_player_symbol_return
  294.        
  295.     set_symbol_male:
  296.         mov     al, SYMBOL_MALE
  297.         jmp     select_player_symbol_return
  298.        
  299.     set_symbol_female:
  300.         mov     al, SYMBOL_FEMALE      
  301.         jmp     select_player_symbol_return
  302.        
  303.     invalid_symbol:
  304.         call    beep
  305.         call    clear_last_char
  306.         jmp     read_symbol
  307.        
  308.     select_player_symbol_return:
  309.         ret
  310.        
  311. ;
  312. ; selecina uma cor da lista de op??es
  313. ; os valores poss?veis s?o 1..4
  314. ;      
  315. select_player_color:
  316.     read_color:
  317.         call    get_key
  318.         cmp     al, 31h     ; 1
  319.         jl      invalid_color
  320.         cmp     al, 34h     ; 4
  321.         jg      invalid_color
  322.        
  323.         sub     al, 30h
  324.         ret
  325.     invalid_color:
  326.         call    beep
  327.         call    clear_last_char
  328.         jmp     read_color    
  329.  
  330.    
  331. clear_last_char:
  332.    putc    8                       ; backspace.
  333.    putc    ' '                     ; clear position.
  334.    putc    8                       ; backspace again.      
  335.    ret
  336.  
  337.  
  338. ;***************************************************************
  339. ; This macro defines a procedure to get a $ terminated
  340. ; string from user, the received string is written to buffer
  341. ; at DS:DI, buffer size should be in DX.
  342. ; Procedure stops the input when 'Enter' is pressed.
  343. ;***************************************************************              
  344. get_string:
  345.     PUSH    AX
  346.     PUSH    CX
  347.     PUSH    DI
  348.     PUSH    DX
  349.    
  350.     MOV     CX, 0                   ; char counter.    
  351.     CMP     DX, 1                   ; buffer too small?
  352.     JBE     empty_buffer            ;    
  353.     DEC     DX                      ; reserve space for last zero.    
  354.    
  355.     ;============================
  356.     ; loop to get and processes key presses:    
  357.     wait_for_key:
  358.    
  359.     MOV     AH, 0                   ; get pressed key.
  360.     INT     16h    
  361.     CMP     AL, 13                  ; 'RETURN' pressed?
  362.     JZ      exit
  363.    
  364.     CMP     AL, 8                   ; 'BACKSPACE' pressed?
  365.     JNE     add_to_buffer
  366.     JCXZ    wait_for_key            ; nothing to remove!
  367.     DEC     CX
  368.     DEC     DI
  369.     putc    8                       ; backspace.
  370.     putc    ' '                     ; clear position.
  371.     putc    8                       ; backspace again.
  372.     JMP     wait_for_key
  373.    
  374.     add_to_buffer:    
  375.             CMP     CX, DX          ; buffer is full?
  376.             JAE     wait_for_key    ; if so wait for 'BACKSPACE' or 'RETURN'...    
  377.             MOV     [DI], AL
  378.             INC     DI
  379.             INC     CX            
  380.             ; print the key:
  381.             MOV     AH, 0Eh
  382.             INT     10h
  383.    
  384.     JMP     wait_for_key
  385.     ;============================
  386.    
  387.     exit:    
  388.     ; terminate by $:
  389.     MOV     word[DI], '$'
  390.        
  391.     empty_buffer:    
  392.     POP     DX
  393.     POP     DI
  394.     POP     CX
  395.     POP     AX
  396.     RET
  397.  
  398.    
  399. ;
  400. ; ajustar cor em fun??o do jogador
  401. ; o jogardor
  402. proc adjust_grid_color    
  403.     mov     ch, [grid+bx]
  404.     cmp     ch, 0               ; compara o caractere grid[bx] a ser impresso
  405.     je      set_null            ;
  406.    
  407.     cmp     ch, [player_1+0]
  408.     je      set_p1
  409.     jmp     set_p2    
  410.    
  411.     set_null:    
  412.     mov     [current_color], GAME_TEXT_COLOR
  413.     jmp     adjust_grid_char_return        
  414.  
  415.     set_p1:    
  416.     mov     cl, [player_1+1]    
  417.     mov     [current_color], cl
  418.     jmp     adjust_grid_char_return    
  419.    
  420.    
  421.     set_p2:    
  422.     mov     cl, [player_2+1]    
  423.     mov     [current_color], cl    
  424.     jmp     adjust_grid_char_return    
  425.    
  426.     adjust_grid_char_return:        
  427.     ret    
  428. endp    
  429.    
  430. ;
  431. ; desenha o grid do jogo
  432. ;
  433. draw_grid:
  434.        
  435.     ; 1. denha o  grid vazado  
  436.         gotoXY  0, 4
  437.         print grid_buffer, 370, GAME_TEXT_SHADOW
  438.  
  439.     ; 2. preenche os nove espa?os com as jogadas realizadas        
  440.         mov     [current_color], 0      ; cor em cl    
  441.         mov     bx, 0
  442.        
  443.         ; primeira linha
  444.         gotoXY  35, 4            
  445.         call    adjust_grid_color
  446.         mov     al, [grid+0]
  447.         call    print_char
  448.         inc     bx
  449.  
  450.         gotoXY  39, 4    
  451.         call    adjust_grid_color
  452.         mov     al, [grid+1]
  453.         call    print_char
  454.         inc     bx
  455.        
  456.         gotoXY  43, 4
  457.         call    adjust_grid_color
  458.         mov     al, [grid+2]
  459.         call    print_char
  460.         inc     bx
  461.        
  462.         ; segunda linha
  463.         gotoXY  35, 6
  464.         call    adjust_grid_color            
  465.         mov     al, [grid+3]
  466.         call    print_char
  467.         inc     bx
  468.  
  469.         gotoXY  39, 6
  470.         call    adjust_grid_color    
  471.         mov     al, [grid+4]
  472.         call    print_char
  473.         inc     bx
  474.        
  475.         gotoXY  43, 6
  476.         call    adjust_grid_color
  477.         mov     al, [grid+5]
  478.         call    print_char
  479.         inc     bx
  480.        
  481.         ; terceira linha
  482.         gotoXY  35, 8
  483.         call    adjust_grid_color            
  484.         mov     al, [grid+6]
  485.         call    print_char
  486.         inc     bx
  487.  
  488.         gotoXY  39, 8
  489.         call    adjust_grid_color    
  490.         mov     al, [grid+7]
  491.         call    print_char
  492.         inc     bx
  493.        
  494.         gotoXY  43, 8
  495.         call    adjust_grid_color
  496.         mov     al, [grid+8]
  497.         call    print_char
  498.            
  499.     done:                
  500.         ret                                            
  501.  
  502. ;
  503. ; transforma a cor selecionada do menu
  504. ; em um atributo de cor e retorna em al
  505. ;1 (branco)  -> F, 2 (azul) -> 9, 3 (verde) ->, A (vermelho) - > C
  506. color_to_attibute:
  507.         cmp al, 1
  508.         je  set_branco      
  509.         cmp al, 2
  510.         je  set_azul      
  511.         cmp al, 3
  512.         je  set_verde    
  513.         cmp al, 4
  514.         je  set_vermelho    
  515.         jmp set_default    
  516.     set_branco:
  517.         mov al, 0fh
  518.         ret    
  519.     set_azul:
  520.         mov al, 09h
  521.         ret    
  522.     set_verde:
  523.         mov al, 0Ah
  524.         ret
  525.     set_vermelho:
  526.         mov al, 0Ch
  527.         ret
  528.     set_default:    
  529.         ;qualquer selec??o fora do range retorna a cor padr?o
  530.         mov al, GAME_TEXT_COLOR    
  531.         ret
  532.  
  533. ;
  534. ; checa se n?o h? mais nenum espa?o vazio no grid
  535. ; retona 1 ou 0 em al
  536. check_grid_is_full:
  537.         cmp [grid+0], 0
  538.         je  check_grid_is_full_retun_false
  539.         cmp [grid+1], 0
  540.         je  check_grid_is_full_retun_false
  541.         cmp [grid+2], 0
  542.         je  check_grid_is_full_retun_false    
  543.         cmp [grid+3], 0
  544.         je  check_grid_is_full_retun_false    
  545.         cmp [grid+4], 0
  546.         je  check_grid_is_full_retun_false
  547.         cmp [grid+5], 0
  548.         je  check_grid_is_full_retun_false
  549.         cmp [grid+6], 0
  550.         je  check_grid_is_full_retun_false    
  551.         cmp [grid+7], 0
  552.         je  check_grid_is_full_retun_false        
  553.         cmp [grid+8], 0
  554.         je  check_grid_is_full_retun_false
  555.                        
  556.     check_grid_is_full_retun_true:
  557.         mov al, 1
  558.         ret    
  559.  
  560.     check_grid_is_full_retun_false:
  561.         mov al, 0
  562.         ret    
  563.  
  564.  
  565. ;    
  566. ; checa se os valores em ch, cl e dh s?o iguais
  567. ; retorna um bool em al
  568. chk_3:
  569.     ;primeiro checamos se s?o todos vazios
  570.         cmp     ch, 0
  571.         jne     chk_3_begin
  572.         cmp     cl, 0
  573.         jne     chk_3_begin
  574.         cmp     dh, 0
  575.         jne     chk_3_begin  
  576.         jmp     chk_3_return_false  ; os 3 valores a?o nulos
  577.        
  578.     chk_3_begin:    
  579.         cmp     ch, cl
  580.         jne     chk_3_return_false
  581.                
  582.         cmp     cl, dh
  583.         je      chk_3_return_true
  584.        
  585.     chk_3_return_false:
  586.         mov     al, 0
  587.         ret
  588.  
  589.     chk_3_return_true:
  590.         mov     al, 1
  591.         ret
  592.    
  593. ;
  594. ; Verifica o grid em todas as horizontais, vericais e diagonais
  595. ; retorna 1 em al se houve vencedor
  596. ;    
  597. check_player_wins:
  598.         cmp     [current_player], 1    
  599.         je      set_curr_char_p1
  600.         jmp     set_curr_char_p2    
  601.        
  602.     set_curr_char_p1:
  603.         mov     al, [player_1+0]     ;
  604.         mov     [current_char], al    ; current_char =  player1 char
  605.         jmp     check_grid
  606.  
  607.     set_curr_char_p2:
  608.         mov     al, [player_2+0]     ;
  609.         mov     [current_char], al    ; current_char =  player2 char
  610.        
  611.     check_grid:
  612.     ;horizontal_1:        
  613.         mov     ch, [grid+0]
  614.         mov     cl, [grid+1]
  615.         mov     dh, [grid+2]    
  616.         call    chk_3
  617.         cmp     al, 1
  618.         je      player_wins      
  619.        
  620.     ;horizontal_2:
  621.         mov     ch, [grid+3]
  622.         mov     cl, [grid+4]
  623.         mov     dh, [grid+5]    
  624.         call    chk_3
  625.         cmp     al, 1
  626.         je      player_wins          
  627.        
  628.     ;horizontal_3:
  629.         mov     ch, [grid+6]
  630.         mov     cl, [grid+7]
  631.         mov     dh, [grid+8]    
  632.         call    chk_3
  633.         cmp     al, 1
  634.         je      player_wins                
  635.  
  636.     ;vertical_1:
  637.         mov     ch, [grid+0]
  638.         mov     cl, [grid+3]
  639.         mov     dh, [grid+6]    
  640.         call    chk_3
  641.         cmp     al, 1
  642.         je      player_wins                
  643.  
  644.     ;vertical_2:
  645.         mov     ch, [grid+1]
  646.         mov     cl, [grid+4]
  647.         mov     dh, [grid+7]    
  648.         call    chk_3
  649.         cmp     al, 1
  650.         je      player_wins                
  651.        
  652.     ;vertical_3:
  653.         mov     ch, [grid+2]
  654.         mov     cl, [grid+5]
  655.         mov     dh, [grid+8]    
  656.         call    chk_3
  657.         cmp     al, 1
  658.         je      player_wins                
  659.  
  660.     ;diagonal_1:
  661.         mov     ch, [grid+0]
  662.         mov     cl, [grid+4]
  663.         mov     dh, [grid+8]    
  664.         call    chk_3
  665.         cmp     al, 1
  666.         je      player_wins                
  667.        
  668.     ;diagonal_2:
  669.         mov     ch, [grid+2]
  670.         mov     cl, [grid+4]
  671.         mov     dh, [grid+6]    
  672.         call    chk_3
  673.         cmp     al, 1
  674.         je      player_wins                
  675.        
  676.  
  677.     nobody_wins:
  678.         mov     al, 0
  679.         ret
  680.  
  681.     player_wins:
  682.         mov     al, 1
  683.         ret        
  684.        
  685.  
  686.                    
  687. ;
  688. ; desenha a cena do jogo de acordo com o estado
  689. ; em que ele se encontra
  690. ;            
  691. proc draw_scene
  692.     ; come?amos imprimindo o cabe?alho do jogo      
  693.     gotoXY   0, 0  
  694.     print    str_game_divider, 80, GAME_TEXT_COLOR
  695.     gotoXY   0, 1
  696.     print    str_game_header, 80, GAME_TEXT_COLOR
  697.     gotoXY   0, 2
  698.     print    str_game_divider, 80, GAME_TEXT_SHADOW
  699.  
  700. ; desenhamos direfentes telas dependendo o estado do game
  701. ; game state: 0 = menu, 1 = jogando, 2 = game over    
  702.     cmp     [game_state], ST_MENU
  703.     je      ds_menu
  704.     cmp     [game_state], ST_JOGANDO
  705.     je      ds_jogando
  706.     cmp     [game_state], ST_VITORIA
  707.     je      ds_game_vitoria
  708.     jmp     ds_game_over      
  709.    
  710. ds_menu:        
  711.     gotoXY   0, 3
  712.     print    str_ftr_simbolos, 80, GAME_TEXT_SHADOW
  713.     gotoXY   0, 4
  714.     print    str_ftr_cores,    80, GAME_TEXT_SHADOW
  715.     gotoXY   0, 5
  716.     print    str_game_divider, 80, GAME_TEXT_COLOR
  717.    
  718. ; get player 1 info
  719.     gotoXY   0, 7
  720.     print    str_player1_set_name, 80, GAME_TEXT_COLOR
  721.    
  722.     lea     di, [player_1+2]        ; joga o ender?o do player 1 name buffer em di
  723.     mov     dx, PLAYER_NAME_SIZE    ; player name buffer size
  724.     call    get_string              ; read string and override the buffer
  725.    
  726.     gotoXY  0, 8
  727.     print   str_player_set_char, 0, GAME_TEXT_COLOR    
  728.     call    select_player_symbol    ; sleciona um s?mbolo e salva em ALs
  729.     mov     [player_1+0], al        ; salva al no primeiro byte do player (simbolo)
  730.    
  731.     gotoXY  0, 9
  732.     print   str_player_set_color, 0, GAME_TEXT_COLOR
  733.     call    select_player_color     ; le a cor do tecaldo e joga em al
  734.     call    color_to_attibute       ; converte a op??o selecionada em um atributo de cor
  735.     mov     [player_1+1], al        ; salva al no segundo byte do player (cor)
  736.                
  737.     gotoXY  0, 10
  738.     print   str_ok, 3, GAME_TEXT_SUCCESS
  739.  
  740. ; get player 2 info
  741.     gotoXY  0, 12                
  742.     print    str_player2_set_name, 80, GAME_TEXT_COLOR
  743.    
  744.     lea     di, [player_2+2]         ; joga o ender?o do player 1 name buffer em di
  745.     mov     dx, PLAYER_NAME_SIZE    ; player name buffer size
  746.     call    get_string              ; read string and override the buffer
  747.    
  748.     gotoXY  0, 13
  749.     print    str_player_set_char, 0, GAME_TEXT_COLOR
  750.     call    select_player_symbol
  751.     mov     [player_2+0], al         ; salva al no primeiro byte do player (simbolo)
  752.    
  753.     gotoXY  0, 14
  754.     print   str_player_set_color, 0, GAME_TEXT_COLOR
  755.     call    select_player_color     ; le a cor do tecaldo e joga em al
  756.     call    color_to_attibute       ; converte a op??o selecionada em um atributo de cor
  757.     mov     [player_2+1], al         ; salva al no segundo byte do player (cor)
  758.    
  759.     gotoXY  0, 15
  760.     print   str_ok, 3, GAME_TEXT_SUCCESS    
  761.    
  762.     gotoXY  0, 17
  763.     print   str_iniciando, 13, GAME_TEXT_SHADOW
  764.  
  765.     ;Finalmente, mudamos o estado do jogo e retornamos para o loop principal        
  766.     mov     [game_state], ST_JOGANDO        
  767.     mov     [current_player], 1h        ; o jogo iniciar? com o jagador 1
  768.     jmp     ds_return    
  769.  
  770.  
  771. ; Algorithm:
  772. ; 1. draw the grid
  773. ; 2. capture player move
  774. ; 3. check for winner
  775. ; 4. swap players
  776. ds_jogando:                              
  777.     call    draw_grid
  778.     gotoXY  10, 10                                               ; posiciona o cursor do prompt
  779.     cmp     [current_player], 1
  780.     jne     dsj_player2
  781.    
  782. dsj_player1:                                                     ; imprime o prompt do jogador 1                          
  783.     print_addr  player_1, 2, PLAYER_NAME_SIZE, GAME_TEXT_COLOR   ;
  784.     print       str_type_position, 0, GAME_TEXT_COLOR            ;
  785.     call        le_jogada   ;player_1                            ; le a jogada do jogar 1                          
  786.     jmp         ds_game_check
  787.    
  788. dsj_player2:                                                     ; imprime o prompt do jogador 2
  789.     print_addr  player_2, 2, PLAYER_NAME_SIZE, GAME_TEXT_COLOR   ;
  790.     print       str_type_position, 0, GAME_TEXT_COLOR            ;
  791.     call        le_jogada   ;player_2                            ; le a jogada do jogar 2          
  792.     jmp         ds_game_check
  793.  
  794. ; passo 3
  795. ds_game_check:    
  796.     call        check_player_wins    
  797.     cmp         al, 1               ; houve uma vencedor?    
  798.     je          _player_win
  799.     call        check_grid_is_full
  800.     cmp         al, 1
  801.     je          _empate
  802.     jmp         ds_swap_players    
  803.    
  804.     _player_win:
  805.         mov     [game_state], ST_VITORIA
  806.         jmp     ds_return
  807.        
  808.     _empate:        
  809.         mov     [game_state], ST_GAME_OVER
  810.         jmp     ds_return
  811.  
  812. ; passo 4
  813. ds_swap_players:    
  814.     cmp         [current_player], 1
  815.     je          set_curr_player_2
  816.    
  817.     set_curr_player_1:    
  818.     mov         [current_player], 1
  819.     jmp         ds_return        
  820.      
  821.     set_curr_player_2:
  822.     mov         [current_player], 2  
  823.     jmp         ds_return        
  824.  
  825.  
  826. ds_game_vitoria:
  827. ;desenha a tela de vit?ria    
  828.     call    draw_grid
  829.     gotoXY  0, 10      
  830.     print    str_game_divider, 80, GAME_TEXT_SUCCESS    
  831.     gotoXY  0, 11
  832.     print   str_vitoria, 200, GAME_TEXT_SUCCESS
  833.     cmp     [current_player], 1
  834.     gotoXY  0, 12
  835.     jne     vit_player2
  836.  
  837. ; imprime o nome do jogador 1    
  838. vit_player1:                                                    
  839.     print_addr  player_1, 2, PLAYER_NAME_SIZE, GAME_TEXT_SUCCESS   ;
  840.     jmp     vit_player_continue
  841.  
  842. ; imprime o nome do jogador 2    
  843. vit_player2:            
  844.     print_addr  player_2, 2, PLAYER_NAME_SIZE, GAME_TEXT_SUCCESS   ;
  845.  
  846. ; imprime o sufixo (ganhou!)
  847. vit_player_continue:    
  848.     print   str_votoria_suf, 15, GAME_TEXT_SUCCESS      
  849.    
  850.     jmp     return_to_os
  851.  
  852.  
  853.    
  854. ds_game_over:
  855.     call    draw_grid
  856.     gotoXY  0, 10      
  857.     print   str_game_divider, 80, GAME_TEXT_ERRO    
  858.     gotoXY  0, 11
  859.     print   str_game_over, 180, GAME_TEXT_ERRO
  860.     jmp     return_to_os
  861.    
  862. ds_return:    
  863.     ret
  864. endp
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement