Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;***************************************
- ;*****Game developed by Saitei**********
- ;**************************(18.05.2014)*
- stsg segment para stack 'stack'
- dw 32 dup(?) ;64 bytes
- stsg ends
- ;********TURN ENUM******
- X_TURN = 1
- O_TURN = 2
- ;***********************
- ;*******COLORS**********
- YELLOW = 1110b
- RED = 1100b
- GREEN = 0010b
- WHITE = 1111b
- ;***********************
- FIELD_X = 34
- FIELD_Y = 6
- dssg segment para 'data'
- game_end db 0
- game_field db 9 dup(0)
- turn db X_TURN
- win db 0
- border_horizont_char db 196,0
- border_vert_char db 179,0
- border_krest_char db 197,0
- x_wins_str db "X WINS!!!","$"
- o_wins_str db "O WINS!!!","$"
- nobody_wins_str db "NOBODY WINS =(","$"
- cont_str db "Restart? (y\n)","$"
- dssg ends
- cdsg segment para 'code'
- assume cs:cdsg,ds:dssg,ss:stsg
- cls proc
- pusha
- mov ax,0600h
- mov bh,7
- xor cx,cx
- mov dx,184fh
- int 10h
- popa
- ret
- endp
- PrintColored macro char,_color
- pusha
- mov ah,09
- mov al,char
- mov bh,00
- mov bx,_color
- mov cx,01
- int 10h
- popa
- endm
- SetCurPos macro x,y
- pusha
- mov bh,0
- mov dh,y
- mov dl,x
- mov ah,2
- int 10h
- popa
- endm
- HideBlinkingCursor macro
- push cx
- push ax
- mov ch,32
- mov ah,1
- int 10h
- pop ax
- pop cx
- endm
- DrawBoard macro
- SetCurPos FIELD_X,FIELD_Y
- PrintColored '0',RED
- SetCurPos FIELD_X+1,FIELD_Y
- PrintColored border_vert_char,YELLOW
- SetCurPos FIELD_X+2,FIELD_Y
- PrintColored '1',RED
- SetCurPos FIELD_X+3,FIELD_Y
- PrintColored border_vert_char,YELLOW
- SetCurPos FIELD_X+4,FIELD_Y
- PrintColored '2',RED
- ;*********************************************
- SetCurPos FIELD_X,FIELD_Y+1
- PrintColored border_horizont_char,YELLOW
- SetCurPos FIELD_X+1,FIELD_Y+1
- PrintColored border_krest_char,YELLOW
- SetCurPos FIELD_X+2,FIELD_Y+1
- PrintColored border_horizont_char,YELLOW
- SetCurPos FIELD_X+3,FIELD_Y+1
- PrintColored border_krest_char,YELLOW
- SetCurPos FIELD_X+4,FIELD_Y+1
- PrintColored border_horizont_char,YELLOW
- ;*********************************************
- SetCurPos FIELD_X,FIELD_Y+2
- PrintColored '3',RED
- SetCurPos FIELD_X+1,FIELD_Y+2
- PrintColored border_vert_char,YELLOW
- SetCurPos FIELD_X+2,FIELD_Y+2
- PrintColored '4',RED
- SetCurPos FIELD_X+3,FIELD_Y+2
- PrintColored border_vert_char,YELLOW
- SetCurPos FIELD_X+4,FIELD_Y+2
- PrintColored '5',RED
- ;*********************************************
- SetCurPos FIELD_X,FIELD_Y+3
- PrintColored border_horizont_char,YELLOW
- SetCurPos FIELD_X+1,FIELD_Y+3
- PrintColored border_krest_char,YELLOW
- SetCurPos FIELD_X+2,FIELD_Y+3
- PrintColored border_horizont_char,YELLOW
- SetCurPos FIELD_X+3,FIELD_Y+3
- PrintColored border_krest_char,YELLOW
- SetCurPos FIELD_X+4,FIELD_Y+3
- PrintColored border_horizont_char,YELLOW
- ;*********************************************
- SetCurPos FIELD_X,FIELD_Y+4
- PrintColored '6',RED
- SetCurPos FIELD_X+1,FIELD_Y+4
- PrintColored border_vert_char,YELLOW
- SetCurPos FIELD_X+2,FIELD_Y+4
- PrintColored '7',RED
- SetCurPos FIELD_X+3,FIELD_Y+4
- PrintColored border_vert_char,YELLOW
- SetCurPos FIELD_X+4,FIELD_Y+4
- PrintColored '8',RED
- endm
- Print proc
- pusha
- cmp al,0
- je pex
- mov ah,02h
- cmp al,2
- je ytt
- mov dl,'X'
- PrintColored dl,GREEN
- jmp pex
- ytt:
- mov dl,'O'
- PrintColored dl,WHITE
- pex:
- popa
- ret
- endp
- CheckWin proc
- pusha
- ;******hor. 1 line********;
- cmp game_field[0],al
- jne second_line
- cmp game_field[1],al
- jne second_line
- cmp game_field[2],al
- jne second_line
- mov win,al
- jmp retu
- ;******hor. 2 line*******;
- second_line:
- cmp game_field[3],al
- jne th_line
- cmp game_field[4],al
- jne th_line
- cmp game_field[5],al
- jne th_line
- mov win,al
- jmp retu
- ;*****hor. 3 line*******;
- th_line:
- cmp game_field[6],al
- jne f_v_line
- cmp game_field[7],al
- jne f_v_line
- cmp game_field[8],al
- jne f_v_line
- mov win,al
- jmp retu
- ;***vert. 1 line*******;
- f_v_line:
- cmp game_field[0],al
- jne s_v_line
- cmp game_field[3],al
- jne s_v_line
- cmp game_field[6],al
- jne s_v_line
- mov win,al
- jmp retu
- ;***vert. 2 line*******;
- s_v_line:
- cmp game_field[1],al
- jne t_v_line
- cmp game_field[4],al
- jne t_v_line
- cmp game_field[7],al
- jne t_v_line
- mov win,al
- jmp retu
- ;***vert. 3 line*******;
- t_v_line:
- cmp game_field[2],al
- jne f_d_line
- cmp game_field[5],al
- jne f_d_line
- cmp game_field[8],al
- jne f_d_line
- mov win,al
- jmp retu
- ;***diag. 1 line*******;
- f_d_line:
- cmp game_field[0],al
- jne s_d_line
- cmp game_field[4],al
- jne s_d_line
- cmp game_field[8],al
- jne s_d_line
- mov win,al
- jmp retu
- ;***diag. 2 line*******;
- s_d_line:
- cmp game_field[2],al
- jne retu
- cmp game_field[4],al
- jne retu
- cmp game_field[6],al
- jne retu
- mov win,al
- jmp retu
- retu:
- popa
- ret
- endp
- Draw proc
- pusha
- SetCurPos FIELD_X,FIELD_Y
- mov al,game_field[0]
- call Print
- SetCurPos FIELD_X+2,FIELD_Y
- mov al,game_field[1]
- call Print
- SetCurPos FIELD_X+4,FIELD_Y
- mov al,game_field[2]
- call Print
- ;**********************************;
- SetCurPos FIELD_X,FIELD_Y+2
- mov al,game_field[3]
- call Print
- SetCurPos FIELD_X+2,FIELD_Y+2
- mov al,game_field[4]
- call Print
- SetCurPos FIELD_X+4,FIELD_Y+2
- mov al,game_field[5]
- call Print
- ;**********************************;
- SetCurPos FIELD_X,FIELD_Y+4
- mov al,game_field[6]
- call Print
- SetCurPos FIELD_X+2,FIELD_Y+4
- mov al,game_field[7]
- call Print
- SetCurPos FIELD_X+4,FIELD_Y+4
- mov al,game_field[8]
- call Print
- popa
- ret
- endp
- Move macro
- pusha
- _err:
- SetCurPos 1,1
- mov ah,1h
- int 21h
- SetCurPos 1,1
- PrintColored ' ',RED
- mov ah,0
- xor si,si
- sub ax,48
- add si,ax
- cmp si,0
- jl _err
- cmp si,8
- jg _err
- cmp game_field[si],0
- jne _err
- mov al,turn
- mov game_field[si],al
- cmp turn,O_TURN
- je YT
- mov turn,O_TURN
- jmp EEX
- YT:
- mov turn,X_TURN
- EEX:
- popa
- endm
- Update proc
- Move
- ret
- endp
- PrintStr macro str
- push ax
- push dx
- mov dx,offset str
- mov ah,9
- int 21h
- pop dx
- pop ax
- endm
- prg proc far
- push ds
- xor ax,ax
- push ax
- mov ax,dssg
- mov ds,ax
- RESTART:
- mov cx,9
- mov si,8
- cc:
- mov game_field[si],0
- dec si
- loop cc
- mov turn,X_TURN
- mov win,0
- call cls
- HideBlinkingCursor
- DrawBoard
- GAME_LOOP:
- call Update
- call Draw
- cmp game_end,1
- je GAME_EXIT
- ;******CHECK******
- mov al,X_TURN
- call CheckWin
- mov al,O_TURN
- call CheckWin
- cmp win,0
- jne W_I_N
- mov cx,9
- mov si,8
- sss:
- cmp game_field[si],0
- je GAME_LOOP
- dec si
- loop sss
- jmp W_I_N
- ;*****************
- jmp GAME_LOOP
- W_I_N:
- SetCurPos FIELD_X-2,FIELD_Y-3
- cmp win, X_TURN
- je XWINS
- cmp win,O_TURN
- je OWINS
- PrintStr nobody_wins_str
- SetCurPos FIELD_X-4,FIELD_Y-2
- PrintStr cont_str
- jmp sc
- XWINS:
- PrintStr x_wins_str
- SetCurPos FIELD_X-4,FIELD_Y-2
- PrintStr cont_str
- jmp sc
- OWINS:
- PrintStr o_wins_str
- SetCurPos FIELD_X-4,FIELD_Y-2
- PrintStr cont_str
- jmp sc
- sc:
- mov ah,07h
- int 21h
- cmp al,'y'
- je Restart
- cmp al,'Y'
- je Restart
- cmp al,'n'
- je GAME_EXIT
- cmp al,'N'
- je GAME_EXIT
- jmp sc
- GAME_EXIT:
- ret
- prg endp
- cdsg ends
- end prg
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement