Add initial source files for Tic-Tac-Toe game implementation
Signed-off-by: Elmar Kresse <elmar.kresse@stud.htwk-leipzig.de>
This commit is contained in:
9
MAIN.MAP
Normal file
9
MAIN.MAP
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
Start Stop Length Name Class
|
||||||
|
|
||||||
|
00000H 0090EH 0090FH _TEXT CODE
|
||||||
|
00910H 009ECH 000DDH _DATA DATA
|
||||||
|
009F0H 00AEFH 00100H STACK STACK
|
||||||
|
|
||||||
|
Program entry point at 0000:08A6
|
||||||
|
|
49
data.asm
Normal file
49
data.asm
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
;****************************************
|
||||||
|
; Elmar Kresse 19-INB-1 (2021)
|
||||||
|
; data.asm
|
||||||
|
; file contains variables and constant
|
||||||
|
; for music, drawing, text and game
|
||||||
|
;
|
||||||
|
;****************************************
|
||||||
|
|
||||||
|
|
||||||
|
;Sounds
|
||||||
|
placeSound DD 4070, 100000 ; Note with pause
|
||||||
|
placeSoundLength = $ - placeSound
|
||||||
|
|
||||||
|
gameOverSound DD 4560, 100000, 4304, 50000, 7239, 100000, 9121, 200000
|
||||||
|
gameOverSoundLength = $ - gameOverSound
|
||||||
|
|
||||||
|
|
||||||
|
;coordinates and size
|
||||||
|
x_wert DW ? ;16 Bit variable
|
||||||
|
y_wert DW ? ;16 Bit variable
|
||||||
|
d_wert DW ? ;16 Bit variable
|
||||||
|
|
||||||
|
|
||||||
|
spieler DW ? ;current player (0,1)
|
||||||
|
field DW ? ;selected field (0-8)
|
||||||
|
balance dw 0 ;balance for check won (3 = 3 in a row)
|
||||||
|
|
||||||
|
|
||||||
|
;Player Arrays
|
||||||
|
player1 DW 0,0,0,0,0,0,0,0,0
|
||||||
|
player2 DW 0,0,0,0,0,0,0,0,0
|
||||||
|
|
||||||
|
;main menue strings
|
||||||
|
title_str DB "TIC-TAC-TOE$"
|
||||||
|
signature_str DB "[Elmar Kresse 19INB]$"
|
||||||
|
choose1_str DB "1 - Mensch gegen Mensch$"
|
||||||
|
choose2_str DB "2 - Verlassen$"
|
||||||
|
cross_win DB "Kreuz hat gewonnen$"
|
||||||
|
circle_win DB "Kreis hat gewonnen$"
|
||||||
|
draw DB "Unentschieden$"
|
||||||
|
|
||||||
|
;reset ISR var
|
||||||
|
oldIOFF DW ?
|
||||||
|
oldISeg DW ?
|
||||||
|
|
||||||
|
;timer vector vars
|
||||||
|
old_timer DW 0 ;original int 1c vector
|
||||||
|
old_segment DW 0 ;original int 1c segment
|
||||||
|
timer_ticks DW 0 ;timer_ticks
|
344
draw.asm
Normal file
344
draw.asm
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
;****************************************
|
||||||
|
; Elmar Kresse 19-INB-1 (2021)
|
||||||
|
; draw.asm
|
||||||
|
; file contains source code for
|
||||||
|
; drawing and maths for circle
|
||||||
|
;
|
||||||
|
; - draw_pixel MACRO x, y, c
|
||||||
|
; - circle_draw macro x, y, radius
|
||||||
|
; Reference Digital differential analyzer (graphics algorithm)
|
||||||
|
; https://en.wikipedia.org/wiki/Digital_differential_analyzer_(graphics_algorithm)
|
||||||
|
;
|
||||||
|
; - cross_draw MACRO x, y, d
|
||||||
|
; - rectangle_draw MACRO x, y, d
|
||||||
|
; - line_print_down PROC
|
||||||
|
; - line_print_straight PROC
|
||||||
|
; - paint_menu PROC FAR
|
||||||
|
; - prepare_display PROC
|
||||||
|
;****************************************
|
||||||
|
|
||||||
|
draw_pixel MACRO x, y, c
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
push cx
|
||||||
|
push dx
|
||||||
|
MOV AH, 0Ch ;setzen der Konfig fürs schreiben
|
||||||
|
MOV AL, c ; Farbe
|
||||||
|
MOV BH, 00h ;Set Seitennummber
|
||||||
|
MOV CX, x
|
||||||
|
MOV DX, y
|
||||||
|
INT 10h
|
||||||
|
pop dx
|
||||||
|
pop cx
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
circle_draw macro x, y, radius
|
||||||
|
push dx
|
||||||
|
push cx
|
||||||
|
push bx
|
||||||
|
push ax
|
||||||
|
|
||||||
|
;Werte zurücksetzen
|
||||||
|
mov balance, 0
|
||||||
|
mov ax, 0
|
||||||
|
mov bx, 0
|
||||||
|
|
||||||
|
;Verschiebung Mitte
|
||||||
|
add x, 60
|
||||||
|
add y, 60
|
||||||
|
|
||||||
|
mov bx, radius
|
||||||
|
mov balance, radius
|
||||||
|
neg balance
|
||||||
|
|
||||||
|
|
||||||
|
zeichne_kreis_schleife:
|
||||||
|
|
||||||
|
;0 to 45
|
||||||
|
mov cx, x
|
||||||
|
add cx, bx
|
||||||
|
mov dx, y
|
||||||
|
sub dx, ax
|
||||||
|
draw_pixel cx, dx, 0Fh
|
||||||
|
;90 to 45
|
||||||
|
mov cx, x
|
||||||
|
add cx, ax
|
||||||
|
mov dx, y
|
||||||
|
sub dx, bx
|
||||||
|
draw_pixel cx, dx, 0Ch
|
||||||
|
;90 to 135
|
||||||
|
mov cx, x
|
||||||
|
sub cx, ax
|
||||||
|
mov dx, y
|
||||||
|
sub dx, bx
|
||||||
|
draw_pixel cx, dx, 04h
|
||||||
|
;180 to 135
|
||||||
|
mov cx, x
|
||||||
|
sub cx, bx
|
||||||
|
mov dx, y
|
||||||
|
sub dx, ax
|
||||||
|
draw_pixel cx, dx, 06h
|
||||||
|
;180 to 225
|
||||||
|
mov cx, x
|
||||||
|
sub cx, bx
|
||||||
|
mov dx, y
|
||||||
|
add dx, ax
|
||||||
|
draw_pixel cx, dx, 12h
|
||||||
|
;270 to 225
|
||||||
|
mov cx, x
|
||||||
|
sub cx, ax
|
||||||
|
mov dx, y
|
||||||
|
add dx, bx
|
||||||
|
draw_pixel cx, dx, 0Bh
|
||||||
|
;270 to 315
|
||||||
|
mov cx, x
|
||||||
|
add cx, ax
|
||||||
|
mov dx, y
|
||||||
|
add dx, bx
|
||||||
|
draw_pixel cx, dx, 01h
|
||||||
|
;360 to 315
|
||||||
|
mov cx, x
|
||||||
|
add cx, bx
|
||||||
|
mov dx, y
|
||||||
|
add dx, ax
|
||||||
|
draw_pixel cx, dx, 0Dh
|
||||||
|
|
||||||
|
|
||||||
|
push dx
|
||||||
|
mov dx, balance
|
||||||
|
add dx, ax
|
||||||
|
add dx, ax
|
||||||
|
mov balance, dx
|
||||||
|
pop dx
|
||||||
|
|
||||||
|
|
||||||
|
cmp balance, 0
|
||||||
|
jl balance_negative
|
||||||
|
;balance_positive:
|
||||||
|
dec bx
|
||||||
|
|
||||||
|
push dx
|
||||||
|
mov dx, balance
|
||||||
|
sub dx, bx
|
||||||
|
sub dx, bx
|
||||||
|
mov balance, dx
|
||||||
|
pop dx
|
||||||
|
|
||||||
|
|
||||||
|
balance_negative:
|
||||||
|
inc ax
|
||||||
|
|
||||||
|
cmp ax, bx
|
||||||
|
jg end_drawing
|
||||||
|
jmp zeichne_kreis_schleife
|
||||||
|
|
||||||
|
|
||||||
|
end_drawing:
|
||||||
|
; pause the screen for dos compatibility:
|
||||||
|
|
||||||
|
pop ax
|
||||||
|
pop bx
|
||||||
|
pop cx
|
||||||
|
pop dx
|
||||||
|
|
||||||
|
endm
|
||||||
|
|
||||||
|
cross_draw MACRO x, y, d
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
push cx
|
||||||
|
push dx
|
||||||
|
|
||||||
|
|
||||||
|
;Erste FOR Schleife nach rechts unten
|
||||||
|
mov cx, x
|
||||||
|
mov dx, y
|
||||||
|
|
||||||
|
xor cx,cx ; cx-register is the counter, setn to 0
|
||||||
|
loop1:
|
||||||
|
push cx
|
||||||
|
mov cx, cx
|
||||||
|
mov dx, y
|
||||||
|
add dx, cx
|
||||||
|
add cx, x
|
||||||
|
draw_pixel cx, dx, 0Fh
|
||||||
|
pop cx
|
||||||
|
inc cx
|
||||||
|
cmp cx, d ; cx vergleich mit der Größe (Dimension d)
|
||||||
|
jle loop1 ; Loop while less or equal
|
||||||
|
|
||||||
|
|
||||||
|
xor cx,cx ; cx-register is the counter, setn to 0
|
||||||
|
loop2:
|
||||||
|
push cx
|
||||||
|
mov cx, cx
|
||||||
|
mov dx, y
|
||||||
|
sub dx, cx
|
||||||
|
add cx, x
|
||||||
|
add dx, d
|
||||||
|
draw_pixel cx, dx, 0Dh
|
||||||
|
pop cx
|
||||||
|
inc cx
|
||||||
|
cmp cx, d ; cx vergleich mit der Größe (Dimension d)
|
||||||
|
jle loop2 ; Loop while less or equal
|
||||||
|
|
||||||
|
pop ax
|
||||||
|
pop bx
|
||||||
|
pop cx
|
||||||
|
pop dx
|
||||||
|
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
rectangle_draw MACRO x, y, d
|
||||||
|
;Verwaltet move und call
|
||||||
|
mov cx, x
|
||||||
|
mov dx, y
|
||||||
|
mov x_wert, cx
|
||||||
|
mov y_wert, dx
|
||||||
|
mov d_wert, d
|
||||||
|
call line_print_down
|
||||||
|
call line_print_straight
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
line_print_down PROC
|
||||||
|
xor cx,cx ; cx-register is the counter, setn to 0
|
||||||
|
loop3:
|
||||||
|
push cx
|
||||||
|
mov cx, cx
|
||||||
|
mov dx, y_wert
|
||||||
|
add cx, x_wert
|
||||||
|
draw_pixel cx, dx, 0Fh
|
||||||
|
add dx, d_wert
|
||||||
|
draw_pixel cx, dx, 0Fh
|
||||||
|
pop cx
|
||||||
|
inc cx
|
||||||
|
cmp cx, d_wert ; cx vergleich mit der Größe (Dimension d)
|
||||||
|
jle loop3 ; Loop while less or equal
|
||||||
|
ret
|
||||||
|
line_print_down endp
|
||||||
|
|
||||||
|
line_print_straight PROC
|
||||||
|
xor dx,dx ; cx-register is the counter, setn to 0
|
||||||
|
loop4:
|
||||||
|
push dx
|
||||||
|
mov dx, dx
|
||||||
|
mov cx, x_wert
|
||||||
|
add dx, y_wert
|
||||||
|
draw_pixel cx, dx, 0Fh
|
||||||
|
add cx, d_wert
|
||||||
|
draw_pixel cx, dx, 0Fh
|
||||||
|
pop dx
|
||||||
|
inc dx
|
||||||
|
cmp dx, d_wert ; cx vergleich mit der Größe (Dimension d)
|
||||||
|
jle loop4 ; Loop while less or equal
|
||||||
|
ret
|
||||||
|
line_print_straight endp
|
||||||
|
|
||||||
|
paint_menu PROC FAR
|
||||||
|
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
push dx
|
||||||
|
;set pointer
|
||||||
|
mov ah,2
|
||||||
|
mov dh,5
|
||||||
|
mov dl,14
|
||||||
|
mov bh,0
|
||||||
|
int 10h
|
||||||
|
mov dx,offset title_str
|
||||||
|
mov ah,9
|
||||||
|
int 21h
|
||||||
|
;set pointer
|
||||||
|
mov ah,2
|
||||||
|
mov dh,6
|
||||||
|
mov dl,10
|
||||||
|
mov bh,0
|
||||||
|
int 10h
|
||||||
|
mov dx,offset signature_str
|
||||||
|
mov ah,9
|
||||||
|
int 21h
|
||||||
|
|
||||||
|
|
||||||
|
;set pointer
|
||||||
|
mov ah,2
|
||||||
|
mov dh,7
|
||||||
|
mov dl,11
|
||||||
|
mov bh,0
|
||||||
|
int 10h
|
||||||
|
|
||||||
|
cmp cx, 2
|
||||||
|
mov dx,offset cross_win
|
||||||
|
je zeige_gewinner
|
||||||
|
|
||||||
|
|
||||||
|
cmp cx, 3
|
||||||
|
mov dx,offset circle_win
|
||||||
|
je zeige_gewinner
|
||||||
|
|
||||||
|
|
||||||
|
cmp cx, 4
|
||||||
|
jne kein_gewinner
|
||||||
|
|
||||||
|
mov ah,2
|
||||||
|
mov dh,7
|
||||||
|
mov dl,13
|
||||||
|
mov bh,0
|
||||||
|
int 10h
|
||||||
|
mov dx,offset draw
|
||||||
|
je zeige_gewinner
|
||||||
|
|
||||||
|
zeige_gewinner:
|
||||||
|
mov ah,9
|
||||||
|
int 21h
|
||||||
|
|
||||||
|
kein_gewinner:
|
||||||
|
|
||||||
|
|
||||||
|
;set pointer
|
||||||
|
mov ah,2
|
||||||
|
mov dh,9
|
||||||
|
mov dl,10
|
||||||
|
mov bh,0
|
||||||
|
int 10h
|
||||||
|
mov dx,offset choose1_str
|
||||||
|
mov ah,9
|
||||||
|
int 21h
|
||||||
|
|
||||||
|
;set pointer
|
||||||
|
mov ah,2
|
||||||
|
mov dh,10
|
||||||
|
mov dl,10
|
||||||
|
mov bh,0
|
||||||
|
int 10h
|
||||||
|
mov dx,offset choose2_str
|
||||||
|
mov ah,9
|
||||||
|
int 21h
|
||||||
|
|
||||||
|
pop ax
|
||||||
|
pop bx
|
||||||
|
pop dx
|
||||||
|
|
||||||
|
ret
|
||||||
|
paint_menu endp
|
||||||
|
|
||||||
|
prepare_display PROC
|
||||||
|
;Videomode clear alles entfernen
|
||||||
|
;Spielfeld initialisieren
|
||||||
|
rectangle_draw 80, 10, 405 ; Kreuz MACRO
|
||||||
|
rectangle_draw 84, 14, 130 ; 1
|
||||||
|
rectangle_draw 218, 14, 130 ; 2
|
||||||
|
rectangle_draw 352, 14, 130 ; 3
|
||||||
|
|
||||||
|
rectangle_draw 84, 148, 130 ; 4
|
||||||
|
rectangle_draw 218, 148, 130 ; 5
|
||||||
|
rectangle_draw 352, 148, 130 ; 6
|
||||||
|
|
||||||
|
rectangle_draw 84, 282, 130 ; 7
|
||||||
|
rectangle_draw 218, 282, 130 ; 8
|
||||||
|
rectangle_draw 352, 282, 130 ; 9
|
||||||
|
ret
|
||||||
|
prepare_display ENDP
|
||||||
|
|
||||||
|
;---------------------------------------- DRAW ENDE ---------------------------------------
|
401
game.asm
Normal file
401
game.asm
Normal file
@ -0,0 +1,401 @@
|
|||||||
|
;****************************************
|
||||||
|
; Elmar Kresse 19-INB-1 (2021)
|
||||||
|
; game.asm
|
||||||
|
; file contains source code for the
|
||||||
|
; basic functions of the game logic
|
||||||
|
;
|
||||||
|
; - conkf MACRO x_kord, y_kord
|
||||||
|
; - conkf_prog PROC FAR
|
||||||
|
; - game_logic PROC
|
||||||
|
; - check_won_value MACRO a, b, c
|
||||||
|
; - check_draw PROC
|
||||||
|
; - reset_player_data PROC
|
||||||
|
; - check_won PROC
|
||||||
|
; - reset_timerisr PROC
|
||||||
|
; - start_game PROC
|
||||||
|
;****************************************
|
||||||
|
|
||||||
|
conkf MACRO x_kord, y_kord ;MACRO for coordinates to field
|
||||||
|
push dx
|
||||||
|
push cx
|
||||||
|
|
||||||
|
|
||||||
|
mov cx, x_kord
|
||||||
|
mov dx, y_kord
|
||||||
|
mov field, 0h
|
||||||
|
call conkf_prog
|
||||||
|
|
||||||
|
pop cx
|
||||||
|
pop dx
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
conkf_prog PROC FAR ;PROC for coordinates to field
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
push cx
|
||||||
|
push dx
|
||||||
|
;horizontal x
|
||||||
|
cmp cx, 482
|
||||||
|
jg out_of_range
|
||||||
|
cmp cx, 352
|
||||||
|
mov x_wert, 357
|
||||||
|
jnl x_3
|
||||||
|
cmp cx, 218
|
||||||
|
mov x_wert, 223
|
||||||
|
jnl x_2
|
||||||
|
cmp cx, 84
|
||||||
|
mov x_wert, 89
|
||||||
|
jnl x_1
|
||||||
|
jmp out_of_range
|
||||||
|
|
||||||
|
x_3:
|
||||||
|
mov ax, 2
|
||||||
|
jmp y_kordi
|
||||||
|
x_2:
|
||||||
|
mov ax, 1
|
||||||
|
jmp y_kordi
|
||||||
|
x_1:
|
||||||
|
mov ax, 0
|
||||||
|
|
||||||
|
y_kordi:
|
||||||
|
;vertical y
|
||||||
|
cmp dx, 412
|
||||||
|
jg out_of_range
|
||||||
|
cmp dx, 282
|
||||||
|
mov y_wert, 287
|
||||||
|
jnl y_3
|
||||||
|
cmp dx, 148
|
||||||
|
mov y_wert, 153
|
||||||
|
jnl y_2
|
||||||
|
cmp dx, 14
|
||||||
|
mov y_wert, 19
|
||||||
|
jnl y_1
|
||||||
|
jmp out_of_range
|
||||||
|
|
||||||
|
y_3:
|
||||||
|
mov bx, 6
|
||||||
|
jmp calc_field
|
||||||
|
y_2:
|
||||||
|
mov bx, 3
|
||||||
|
jmp calc_field
|
||||||
|
y_1:
|
||||||
|
mov bx, 0
|
||||||
|
|
||||||
|
calc_field:
|
||||||
|
add ax, bx ;(A = ax) * (B = bx) = (goal = AX)
|
||||||
|
mov field, ax
|
||||||
|
jmp kord_final
|
||||||
|
|
||||||
|
out_of_range:
|
||||||
|
mov field, 10 ;not in range(0-8) 10 is set for later checks
|
||||||
|
|
||||||
|
kord_final:
|
||||||
|
|
||||||
|
|
||||||
|
pop dx
|
||||||
|
pop cx
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ret
|
||||||
|
conkf_prog ENDP
|
||||||
|
|
||||||
|
game_logic PROC
|
||||||
|
|
||||||
|
conkf x_wert, y_wert
|
||||||
|
|
||||||
|
;check valid field 0-8
|
||||||
|
cmp field, 0ah
|
||||||
|
je end_game_logic
|
||||||
|
|
||||||
|
;Feld frei
|
||||||
|
push ax
|
||||||
|
push si
|
||||||
|
mov si, field
|
||||||
|
shl si, 1
|
||||||
|
cmp player1[si], 1
|
||||||
|
pop si
|
||||||
|
pop ax
|
||||||
|
je end_game_logic
|
||||||
|
|
||||||
|
push ax
|
||||||
|
push si
|
||||||
|
mov si, field
|
||||||
|
shl si, 1
|
||||||
|
cmp player2[si], 1
|
||||||
|
pop si
|
||||||
|
pop ax
|
||||||
|
je end_game_logic
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mov ax, spieler
|
||||||
|
cmp ax, 0
|
||||||
|
je kreuz_spieler
|
||||||
|
jne kreis_spieler
|
||||||
|
|
||||||
|
kreuz_spieler:
|
||||||
|
cross_draw x_wert, y_wert, 120
|
||||||
|
|
||||||
|
;Sound
|
||||||
|
PUSH AX BX CX DX
|
||||||
|
MOV BX, OFFSET placeSound
|
||||||
|
MOV CX, OFFSET placeSoundLength
|
||||||
|
CALL playbeep
|
||||||
|
POP DX CX BX AX
|
||||||
|
|
||||||
|
mov spieler, 1 ;Spieler umschalten
|
||||||
|
|
||||||
|
;Geklicketes Feld belegen
|
||||||
|
push ax
|
||||||
|
push si
|
||||||
|
mov si, field
|
||||||
|
shl si, 1
|
||||||
|
mov player1[si], 1
|
||||||
|
pop si
|
||||||
|
pop ax
|
||||||
|
|
||||||
|
push cx
|
||||||
|
mov cx, offset player1
|
||||||
|
call check_won
|
||||||
|
pop cx
|
||||||
|
cmp ax, 1
|
||||||
|
jne end_game_logic
|
||||||
|
mov cx, 2
|
||||||
|
call reset_timerisr
|
||||||
|
call start_programm
|
||||||
|
|
||||||
|
kreis_spieler:
|
||||||
|
;Kreis zeichnen
|
||||||
|
circle_draw x_wert, y_wert, 60
|
||||||
|
|
||||||
|
|
||||||
|
;Sound
|
||||||
|
PUSH AX BX CX DX
|
||||||
|
MOV BX, OFFSET placeSound
|
||||||
|
MOV CX, OFFSET placeSoundLength
|
||||||
|
CALL playbeep
|
||||||
|
POP DX CX BX AX
|
||||||
|
|
||||||
|
mov spieler, 0 ;Spieler umschalten
|
||||||
|
|
||||||
|
;Geklicketes Feld belegen
|
||||||
|
push ax
|
||||||
|
push si
|
||||||
|
mov si, field
|
||||||
|
shl si, 1
|
||||||
|
mov player2[si], 1
|
||||||
|
pop si
|
||||||
|
pop ax
|
||||||
|
|
||||||
|
push cx
|
||||||
|
mov cx, offset player2
|
||||||
|
call check_won
|
||||||
|
pop cx
|
||||||
|
|
||||||
|
cmp ax, 1
|
||||||
|
jne end_game_logic
|
||||||
|
mov cx, 3
|
||||||
|
call reset_timerisr
|
||||||
|
call start_programm
|
||||||
|
|
||||||
|
end_game_logic:
|
||||||
|
|
||||||
|
call check_draw
|
||||||
|
ret
|
||||||
|
game_logic ENDP
|
||||||
|
|
||||||
|
check_won_value MACRO a, b, c
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
mov bx, 0
|
||||||
|
mov ax, a;
|
||||||
|
shl ax, 1
|
||||||
|
add bp, ax
|
||||||
|
add bx, ds:[bp]
|
||||||
|
mov bp, cx
|
||||||
|
mov ax, b;
|
||||||
|
shl ax, 1
|
||||||
|
add bp, ax
|
||||||
|
add bx, ds:[bp]
|
||||||
|
mov bp, cx
|
||||||
|
mov ax, c;
|
||||||
|
shl ax, 1
|
||||||
|
add bp, ax
|
||||||
|
add bx, ds:[bp]
|
||||||
|
mov bp, cx
|
||||||
|
cmp bx, 3
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
je got_winner
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
check_draw PROC
|
||||||
|
|
||||||
|
;Überprüfen ob Unentschieden
|
||||||
|
push bx ;Counter ob alle Felder belegt sind
|
||||||
|
push ax ;Zahlvariable für Shiften
|
||||||
|
push cx ;Pointer für das Array des jeweiligen Spielers
|
||||||
|
push dx ;Zählvariable für Schleifen
|
||||||
|
push bp
|
||||||
|
mov bx, 0
|
||||||
|
mov ax, 0
|
||||||
|
mov dx, 0
|
||||||
|
|
||||||
|
mov cx, offset player1 ;pointer for player1
|
||||||
|
|
||||||
|
player1_field_loop:
|
||||||
|
mov ax, dx
|
||||||
|
shl ax, 1
|
||||||
|
mov bp, cx
|
||||||
|
add bp, ax
|
||||||
|
add bx, ds:[bp]
|
||||||
|
inc dx
|
||||||
|
cmp dx, 9
|
||||||
|
jne player1_field_loop
|
||||||
|
|
||||||
|
mov cx, offset player2 ;pointer for player2
|
||||||
|
mov dx, 0
|
||||||
|
player2_field_loop:
|
||||||
|
mov ax, dx
|
||||||
|
shl ax, 1
|
||||||
|
mov bp, cx
|
||||||
|
add bp, ax
|
||||||
|
add bx, ds:[bp]
|
||||||
|
inc dx
|
||||||
|
cmp dx, 9
|
||||||
|
jne player2_field_loop
|
||||||
|
|
||||||
|
|
||||||
|
cmp bx, 9
|
||||||
|
|
||||||
|
pop bp
|
||||||
|
pop dx
|
||||||
|
pop cx
|
||||||
|
pop ax
|
||||||
|
pop bx
|
||||||
|
|
||||||
|
je draw_end
|
||||||
|
jmp check_draw_end
|
||||||
|
|
||||||
|
draw_end:
|
||||||
|
mov cx, 4 ; 4 = Unentschieden
|
||||||
|
call reset_timerisr
|
||||||
|
call start_programm
|
||||||
|
|
||||||
|
check_draw_end:
|
||||||
|
ret
|
||||||
|
check_draw ENDP
|
||||||
|
|
||||||
|
reset_player_data PROC
|
||||||
|
|
||||||
|
push ax
|
||||||
|
push si
|
||||||
|
push bx ;Schleifen Zähler
|
||||||
|
mov bx, 0
|
||||||
|
|
||||||
|
resetloop_player1:
|
||||||
|
mov si, bx
|
||||||
|
shl si, 1
|
||||||
|
mov player1[si], 0
|
||||||
|
inc bx
|
||||||
|
cmp bx, 9
|
||||||
|
jne resetloop_player1
|
||||||
|
|
||||||
|
mov bx, 0
|
||||||
|
resetloop_player2:
|
||||||
|
mov si, bx
|
||||||
|
shl si, 1
|
||||||
|
mov player2[si], 0
|
||||||
|
inc bx
|
||||||
|
cmp bx, 9
|
||||||
|
jne resetloop_player2
|
||||||
|
|
||||||
|
pop bx
|
||||||
|
pop si
|
||||||
|
pop ax
|
||||||
|
ret
|
||||||
|
reset_player_data ENDP
|
||||||
|
|
||||||
|
check_won PROC
|
||||||
|
push bp
|
||||||
|
mov bp, cx
|
||||||
|
|
||||||
|
;vertical
|
||||||
|
check_won_value 0, 3, 6
|
||||||
|
check_won_value 1, 4, 7
|
||||||
|
check_won_value 2, 5, 8
|
||||||
|
|
||||||
|
;horizontal
|
||||||
|
|
||||||
|
check_won_value 2, 1, 0
|
||||||
|
check_won_value 3, 4, 5
|
||||||
|
check_won_value 6, 7, 8
|
||||||
|
|
||||||
|
;cross
|
||||||
|
check_won_value 0, 4, 8
|
||||||
|
check_won_value 6, 4, 2
|
||||||
|
jmp ende_check_won
|
||||||
|
|
||||||
|
got_winner:
|
||||||
|
pop bp
|
||||||
|
|
||||||
|
;play gameover sound
|
||||||
|
MOV BX, OFFSET gameOverSound
|
||||||
|
MOV CX, gameOverSoundLength
|
||||||
|
CALL playbeep
|
||||||
|
|
||||||
|
mov ax, 1 ;var for save winner exists
|
||||||
|
ret
|
||||||
|
|
||||||
|
ende_check_won:
|
||||||
|
pop bp
|
||||||
|
mov ax, 0
|
||||||
|
ret
|
||||||
|
check_won ENDP
|
||||||
|
|
||||||
|
reset_timerisr PROC
|
||||||
|
PUSH CX
|
||||||
|
PUSH DS
|
||||||
|
PUSH AX
|
||||||
|
PUSH DX
|
||||||
|
MOV AX, 251Ch ; Restore old user timer interrupt vector
|
||||||
|
MOV DX, [CS:old_timer]
|
||||||
|
MOV CX, [CS:old_segment]
|
||||||
|
MOV DS, CX
|
||||||
|
INT 21h
|
||||||
|
POP DX
|
||||||
|
POP AX
|
||||||
|
POP DS
|
||||||
|
POP CX
|
||||||
|
ret
|
||||||
|
reset_timerisr ENDP
|
||||||
|
|
||||||
|
start_game PROC
|
||||||
|
CLI
|
||||||
|
|
||||||
|
mov ax,00h
|
||||||
|
int 33h
|
||||||
|
or ax,ax
|
||||||
|
|
||||||
|
call reset_player_data ;Spieler Array reset
|
||||||
|
mov ax,12h ;Videomodus
|
||||||
|
int 10h
|
||||||
|
|
||||||
|
call prepare_display
|
||||||
|
|
||||||
|
mov ax, 1 ;Curser an
|
||||||
|
int 33h
|
||||||
|
|
||||||
|
;Ersten Spieler setzten
|
||||||
|
|
||||||
|
call prepare_mouse
|
||||||
|
mov spieler, 0
|
||||||
|
call prepare_display
|
||||||
|
|
||||||
|
STI
|
||||||
|
ret
|
||||||
|
start_game endp
|
140
logic.asm
Normal file
140
logic.asm
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
;****************************************
|
||||||
|
; Elmar Kresse 19-INB-1 (2021)
|
||||||
|
; logic.asm
|
||||||
|
; file contains source code for the
|
||||||
|
; logic (mouse, timer, programm)
|
||||||
|
;
|
||||||
|
; - handle_timer_tick PROC
|
||||||
|
; - prepare_timer_tick PROC
|
||||||
|
; - prepare_mouse PROC
|
||||||
|
; - mouseProc PROC FAR
|
||||||
|
; - start_programm PROC
|
||||||
|
;****************************************
|
||||||
|
|
||||||
|
handle_timer_tick PROC
|
||||||
|
; Call the original interrupt vector
|
||||||
|
; by pushing flags register and doing a FAR CALL to old vector
|
||||||
|
PUSHF
|
||||||
|
CALL DWORD ptr [CS:old_timer]
|
||||||
|
INC WORD ptr [CS:timer_ticks] ; Increase timer counter
|
||||||
|
|
||||||
|
IRET
|
||||||
|
handle_timer_tick ENDP
|
||||||
|
|
||||||
|
prepare_timer_tick PROC
|
||||||
|
|
||||||
|
PUSH DS
|
||||||
|
MOV AX, 351Ch ; Get user timer interrupt vector
|
||||||
|
INT 21h
|
||||||
|
; ES:BX now has the address of the interrupt vector
|
||||||
|
MOV [CS:old_timer], BX
|
||||||
|
MOV AX, ES
|
||||||
|
MOV [CS:old_segment], AX
|
||||||
|
|
||||||
|
MOV AX, 251ch ; Set user timer interrupt vector
|
||||||
|
PUSH CS
|
||||||
|
POP DS
|
||||||
|
MOV DX, OFFSET handle_timer_tick
|
||||||
|
INT 21h
|
||||||
|
|
||||||
|
POP ds
|
||||||
|
|
||||||
|
ret
|
||||||
|
prepare_timer_tick ENDP
|
||||||
|
|
||||||
|
prepare_mouse PROC
|
||||||
|
|
||||||
|
mov dx, OFFSET mouseProc ;jump to click_event_handler
|
||||||
|
mov ax, 0Ch
|
||||||
|
mov cx, 00000010b ; on left click
|
||||||
|
push cs ;es:dx
|
||||||
|
pop es
|
||||||
|
int 33h
|
||||||
|
|
||||||
|
mov ax, 1 ;show cursor
|
||||||
|
int 33h
|
||||||
|
|
||||||
|
ret
|
||||||
|
prepare_mouse ENDP
|
||||||
|
|
||||||
|
mouseProc PROC FAR ;other doc segment therefore FAR
|
||||||
|
enter 0, 0
|
||||||
|
push ax
|
||||||
|
push bx
|
||||||
|
push cx
|
||||||
|
push dx
|
||||||
|
push es
|
||||||
|
push ds
|
||||||
|
|
||||||
|
mov ax, 2 ;hide cursor
|
||||||
|
int 33h
|
||||||
|
|
||||||
|
;dx contains coordinates of "rows"
|
||||||
|
mov y_wert, dx ;save y coordinate in variable
|
||||||
|
;cx contains coordinates of "columns"
|
||||||
|
mov x_wert, cx ;save y coordinate in variable
|
||||||
|
|
||||||
|
call game_logic
|
||||||
|
|
||||||
|
xor bx, bx ;button pressed clear result
|
||||||
|
|
||||||
|
mov ax, 1 ;show cursor
|
||||||
|
int 33h
|
||||||
|
|
||||||
|
pop ds
|
||||||
|
pop es
|
||||||
|
pop dx
|
||||||
|
pop cx
|
||||||
|
pop bx
|
||||||
|
pop ax
|
||||||
|
leave
|
||||||
|
ret
|
||||||
|
mouseProc ENDP
|
||||||
|
|
||||||
|
start_programm PROC
|
||||||
|
|
||||||
|
mov AX, video_seg
|
||||||
|
mov es, AX
|
||||||
|
|
||||||
|
|
||||||
|
mov ax, @DATA
|
||||||
|
mov ds, ax
|
||||||
|
|
||||||
|
|
||||||
|
mov ax, 12h
|
||||||
|
int 10h
|
||||||
|
|
||||||
|
mov dx, 03C4h ;address of the index port (share)
|
||||||
|
mov al, 2 ;index of control register
|
||||||
|
out dx, al ;Set index: output out :: dx to port al(2)
|
||||||
|
inc dx ;index of dataport
|
||||||
|
mov al, 0Fh ;value (1 = bit plane enabled, here all) fi
|
||||||
|
out dx, al
|
||||||
|
|
||||||
|
|
||||||
|
call prepare_timer_tick
|
||||||
|
|
||||||
|
mov ax,0Dh
|
||||||
|
int 10h
|
||||||
|
|
||||||
|
call paint_menu
|
||||||
|
|
||||||
|
check_mode_loop:
|
||||||
|
xor ax, ax ;delete ah
|
||||||
|
int 16h ;keyboard query
|
||||||
|
|
||||||
|
cmp al,'1'
|
||||||
|
je short playgame
|
||||||
|
|
||||||
|
cmp al,'2'
|
||||||
|
je ende
|
||||||
|
|
||||||
|
jmp check_mode_loop
|
||||||
|
|
||||||
|
playgame:
|
||||||
|
call start_game
|
||||||
|
|
||||||
|
|
||||||
|
ret
|
||||||
|
start_programm ENDP
|
||||||
|
|
133
main.asm
Normal file
133
main.asm
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
;****************************************
|
||||||
|
; Elmar Kresse 19-INB-1 (2021)
|
||||||
|
; main.asm
|
||||||
|
; file contains source code for the
|
||||||
|
; main operations
|
||||||
|
;
|
||||||
|
;****************************************
|
||||||
|
|
||||||
|
.model small
|
||||||
|
.STACK 100h
|
||||||
|
.486
|
||||||
|
esc_code = 1Bh ;esc key
|
||||||
|
video_seg = 0B800h
|
||||||
|
|
||||||
|
.data
|
||||||
|
INCLUDE data.asm
|
||||||
|
|
||||||
|
|
||||||
|
.code
|
||||||
|
INCLUDE draw.asm
|
||||||
|
INCLUDE game.asmn
|
||||||
|
INCLUDE sound.asm
|
||||||
|
INCLUDE logic.asm
|
||||||
|
|
||||||
|
ISR1Ch: push ds
|
||||||
|
push ax
|
||||||
|
mov ax, @DATA
|
||||||
|
mov ds, ax
|
||||||
|
pop ax
|
||||||
|
pop ds
|
||||||
|
iret
|
||||||
|
|
||||||
|
;start of the main program
|
||||||
|
;----------------------------------------------------------------------------------------------------------
|
||||||
|
Beginn:
|
||||||
|
|
||||||
|
mov ax, @DATA
|
||||||
|
mov ds, ax
|
||||||
|
mov ax, 3
|
||||||
|
int 10h
|
||||||
|
;read old VT entry
|
||||||
|
mov al, 1Ch
|
||||||
|
mov ah, 35h
|
||||||
|
int 21h
|
||||||
|
;es:bx address old ISR
|
||||||
|
;save
|
||||||
|
mov oldIOFF, bx
|
||||||
|
mov oldISeg, es
|
||||||
|
;store new ISR
|
||||||
|
push ds ; store ds
|
||||||
|
push cs
|
||||||
|
pop ds ; ds <- cs
|
||||||
|
mov dx, OFFSET ISR1Ch ; address in ds:dx
|
||||||
|
mov al, 1Ch ; <vn>
|
||||||
|
mov ah, 25h
|
||||||
|
int 21h
|
||||||
|
pop ds ; restore ds
|
||||||
|
|
||||||
|
|
||||||
|
call start_programm
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;Endlosschleife
|
||||||
|
;--------------------------------------------------------------------------------------------------------
|
||||||
|
endlloop:
|
||||||
|
xor ax, ax ;delete ah
|
||||||
|
int 16h ;Keyboard query, waits for any key is pressed
|
||||||
|
cmp al, esc_code ;If esc is not pressed, the program remains in the endless loop
|
||||||
|
jne short endlloop ;jmp not equal
|
||||||
|
call reset_timerisr
|
||||||
|
mov cx, 0
|
||||||
|
call start_programm
|
||||||
|
|
||||||
|
;-------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
;End of the program and return to DOS
|
||||||
|
;-----------------------------------------------------------------------------------------------------
|
||||||
|
ende:
|
||||||
|
|
||||||
|
PUSH DS
|
||||||
|
MOV AX, 251Ch ;Restore old user timer interrupt vector
|
||||||
|
MOV DX, [CS:old_timer]
|
||||||
|
MOV CX, [CS:old_segment]
|
||||||
|
MOV DS, CX
|
||||||
|
INT 21h
|
||||||
|
POP DS
|
||||||
|
|
||||||
|
mov ax, 0 ;reset mouse programm
|
||||||
|
int 33h ;mouse interrupt
|
||||||
|
|
||||||
|
MOV ax, 3 ;Reset screen mode
|
||||||
|
INT 10h
|
||||||
|
|
||||||
|
mov dx, oldIOFF ;order is important
|
||||||
|
mov ax, oldISeg
|
||||||
|
mov ds, ax
|
||||||
|
mov al, 1Ch
|
||||||
|
mov ah, 25h
|
||||||
|
int 21h
|
||||||
|
|
||||||
|
mov ah, 4Ch ;Backflow to DOS
|
||||||
|
int 21h
|
||||||
|
.stack 100h
|
||||||
|
end Beginn
|
||||||
|
;---------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; Convert X: Y coordinates to fields
|
||||||
|
; Check whether the field is free
|
||||||
|
; if free field
|
||||||
|
; test whether the player has won
|
||||||
|
|
||||||
|
; 1 2 3 0 1 2
|
||||||
|
; 1|2 3 4 0|0 1 2
|
||||||
|
; 4|5 6 7 3|3 4 5
|
||||||
|
; 7|8 9 10 6|6 7 8
|
||||||
|
|
||||||
|
;8 test cases
|
||||||
|
; 0,3,6
|
||||||
|
; 1,4,7
|
||||||
|
; 2,5,8
|
||||||
|
|
||||||
|
; 0,1,2
|
||||||
|
; 3,4,5
|
||||||
|
; 6,7,8
|
||||||
|
|
||||||
|
; 0,4,8
|
||||||
|
; 6,4,2
|
45
sound.asm
Normal file
45
sound.asm
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
;****************************************
|
||||||
|
; Elmar Kresse 19-INB-1 (2021)
|
||||||
|
; sound.asm
|
||||||
|
; file contains source code for
|
||||||
|
; only playing sounds
|
||||||
|
;
|
||||||
|
; - playbeep PROC
|
||||||
|
;source: http://muruganad.com/8086/8086-assembly-language-program-to-play-sound-using-pc-speaker.html
|
||||||
|
;****************************************
|
||||||
|
|
||||||
|
|
||||||
|
playbeep PROC
|
||||||
|
MOV AL, 182
|
||||||
|
OUT 43h, AL
|
||||||
|
beep:
|
||||||
|
|
||||||
|
;set frequency
|
||||||
|
MOV AX, [BX]
|
||||||
|
OUT 42h, AL
|
||||||
|
MOV AL, AH
|
||||||
|
OUT 42h, AL
|
||||||
|
;sound on
|
||||||
|
IN AL, 61h
|
||||||
|
OR AL, 00000011b
|
||||||
|
OUT 61h, AL
|
||||||
|
|
||||||
|
ADD BX, 4
|
||||||
|
MOV WORD ptr [CS:timer_ticks], 0
|
||||||
|
|
||||||
|
;break
|
||||||
|
timer_loop:
|
||||||
|
CMP WORD ptr [CS:timer_ticks], 3
|
||||||
|
jne timer_loop
|
||||||
|
MOV WORD ptr [CS:timer_ticks], 0
|
||||||
|
|
||||||
|
;sound off
|
||||||
|
IN AL, 61h
|
||||||
|
AND AL, 11111100b
|
||||||
|
OUT 61h, AL
|
||||||
|
|
||||||
|
ADD BX, 4
|
||||||
|
SUB CX, 8
|
||||||
|
JNE beep
|
||||||
|
ret
|
||||||
|
playbeep ENDP
|
Reference in New Issue
Block a user