📄 menu.asm
字号:
;
; Small tt shot game(asm final), menu section
public EXITGAME, FUC_M, INIT, LOGO, SETUP
extrn CALCUL:far, CURSOR:far, CHAR:far, TIMER:far
include data.asm ; public data resources
code segment
assume cs:code, ds:data, ss:stack
DR_BORDER proc
push ax
push bx
push cx
push dx
push bp
mov cx, MAX_ROW
mov dx, cx
sub dx, 4
mov bx, UNITS
add bx, 5
mov bp, 1
DR_loop: ; draw a border '||'
xor bp, 1b
cmp bp, 0
je DR_left
mov LINE_CO, word ptr 1 ; BLUE
inc cx
inc bx
jmp DR_draw
DR_left:
mov LINE_CO, word ptr 4 ; RED
dec bx
DR_draw:
push cx
push bx
call far ptr CURSOR
cmp cx, dx ; whether draw bottom line '+'
jne DR_continue
mov ax, '+'
push ax
push LINE_CO
call far ptr CHAR
loop DR_loop
DR_continue:
mov ax, '|'
push ax
push LINE_CO
call far ptr CHAR
loop DR_loop
pop bp
pop dx
pop cx
pop bx
pop ax
ret
DR_BORDER endp
EXITGAME proc far ; type the score then leave, preserve nothing
push ax
push dx
mov ah, 2 ; bell
mov dl, 07h
int 21h
mov ax, 5 ; print query message
mov dx, UNITS
add dx, 8
PRINT ax, dx, QUERY
add ax, 2
dec dx
PRINT ax, dx, QUERY_EXTRA
mov ah, 7 ; read key, ESC quit, else return
int 21h
cmp al, 1bh
jne EX_return
mov ah, 4ch ; return to DOS
int 21h
EX_return:
mov ax, 5 ; re-paint the notice
mov dx, UNITS
add dx, 8
PRINT ax, dx, NOTICE_TOP
add ax, 2 ; remove the query extra
dec dx
PRINT ax, dx, ERASE
pop dx ; pop pushed
pop ax
ret
EXITGAME endp
FUC_M proc far ; test the keypress, whether change the game mode
push ax
push bx
push cx
mov cx, 16 ; init row and column
mov bx, 62
cmp al, '1' ; whether change BELL mode
jne FU_color
xor BELL, 01h
cmp BELL, 01h
je FU_bo
PRINT cx, bx, MODE_BELL_F
jmp FU_exit
FU_bo:
PRINT cx, bx, MODE_BELL_O
jmp FU_exit
FU_color: ; whether open colorful mode
cmp al, '2'
jne FU_grade
xor COLOR, 01h
add cx, 2
cmp COLOR, 01h
je FU_co
PRINT cx, bx, MODE_COLOR_F
jmp FU_exit
FU_co:
PRINT cx, bx, MODE_COLOR_O
jmp FU_exit
FU_grade: ; whether change grade
cmp al, '3'
jne FU_mode
FU_gadd: ; grade from 1 - 3
mov ax, 1
add GRADE, ax
and GRADE, 0003h
cmp GRADE, 0
je FU_gadd
add cx, 4
cmp GRADE, 1 ; test grade value
je FU_ge1
cmp GRADE, 2
je FU_ge2
PRINT cx, bx, MODE_GRADE_E
jmp FU_exit
FU_ge2:
PRINT cx, bx, MODE_GRADE_M
jmp FU_exit
FU_ge1:
PRINT cx, bx, MODE_GRADE_H
jmp FU_exit
FU_mode: ; change the mode color
cmp al, '4'
jne FU_incsp
FU_modeU: ; if MODE=MARK, re inc MODE
inc MODE
and MODE, 0007h
mov ax, MARK
cmp MODE, ax
jz FU_modeU
add cx, 6
PRINT cx, bx, MODE_CHANGE_C
jmp FU_exit
FU_incsp: ; inc speed
cmp al, '5'
jne FU_decsp
dec MOMENT
cmp MOMENT, word ptr 0
jnz FU_pushsp
inc MOMENT
jmp FU_pushsp
FU_decsp: ; dec speed
cmp al, '6'
jne FU_exit
inc MOMENT
FU_pushsp:
push MOMENT
mov ax, 100
push ax
add cx, 8
push cx ; row
add bx, 14
push bx ; column
call far ptr CALCUL
FU_exit:
pop cx
pop bx
pop ax
ret
FUC_M endp
LOGO proc far
push MOMENT
push ax
push bx
push cx
push dx
mov MOMENT, 30 ; slow, wait background graph
call far ptr TIMER
mov ax, MAX_ROW ; get the middle row
shr ax, 1
mov bx, ax
mov cx, MAX_ROW
shr cx, 1 ; loop MAX_ROW/2 times
mov MOMENT, 4 ; sooner batter
LO_floop: ; print slow extended graph from middle row
PRINT ax, BLACK, FULL_CHAR ; BLACK = 0 column
PRINT bx, BLACK, FULL_CHAR
cmp ax, bx
call far ptr TIMER
inc ax
dec bx
loop LO_floop
mov al, 0 ; init the screen changes back and front color
mov bh, 01110000b ; background: white, front: black
mov ch, 0
mov cl, 0
mov dh, MAX_ROW
mov dl, MAX_COL
mov ah, 6
int 10h
mov MOMENT, 35 ; complete background, wait graph
call far ptr TIMER
mov ax, LEFT_ROW ; print big S
mov dx, LEFT_COL
lea bx, LOGO_S
mov cx, 19
LO_sloop:
PRINT ax, dx, [bx]
add bx, 16
inc ax
loop LO_sloop
mov ax, LEFT_ROW ; print big H
add dx, 17
lea bx, LOGO_H
mov cx, 19
LO_hloop:
PRINT ax, dx, [bx]
add bx, 16
inc ax
loop LO_hloop
mov ax, LEFT_ROW ; print big O
add dx, 17
lea bx, LOGO_O
mov cx, 19
LO_oloop:
PRINT ax, dx, [bx]
add bx, 16
inc ax
loop LO_oloop
mov ax, LEFT_ROW ; print big T
add dx, 17
lea bx, LOGO_T
mov cx, 19
LO_tloop:
PRINT ax, dx, [bx]
add bx, 16
inc ax
loop LO_tloop
mov MOMENT, 30 ; complete graph
call far ptr TIMER
mov ax, 42 ; last print author information
mov bx, 59
PRINT ax, bx, MARK_AUTHOR
mov MOMENT, 100 ; complete, show time
call far ptr TIMER
pop dx
pop cx
pop bx
pop ax
pop MOMENT
ret
LOGO endp
INIT proc far ; cg menu
push ax
push bx
push cx
push dx
mov al, 0 ; init the screen
mov bh, 00000001b ; init common color: blue
mov ch, 0
mov cl, 0
mov dh, MAX_ROW
mov dl, MAX_COL
mov ah, 6
int 10h
pop dx
pop cx
pop bx
pop ax
ret
INIT endp
SETUP proc far ; set up the static strings
push ax
push bx
push cx
push dx
call DR_BORDER ; draw border
mov ax, 5 ; print notice top
mov bx, UNITS
add bx, 8
PRINT ax, bx, NOTICE_TOP
mov ax, 36 ; print hit rate
mov bx, 62
PRINT ax, bx, HIT_RATE
add ax, 2 ; print save rate
mov bx, 62
PRINT ax, bx, SAVE_RATE
mov ax, MAX_ROW ; print notice bottom 1
sub ax, 4
mov bx, UNITS
add bx, 9
PRINT ax, bx, NOTICE_BOTTOM_1
add ax, 2 ; notice bottom 2
PRINT ax, bx, NOTICE_BOTTOM_2
mov ax, 14 ; print key sentence
mov dx, 62
PRINT ax, dx, MODE_SENTENCE
add ax, 2 ; print bell mode status
PRINT ax, dx, MODE_BELL_F
add ax, 2 ; print colorful status
PRINT ax, dx, MODE_COLOR_F
add ax, 2 ; print grade status
PRINT ax, dx, MODE_GRADE_M
add ax, 2 ; print change color mode
PRINT ax, dx, MODE_CHANGE_C
add ax, 2 ; print +|- speed
PRINT ax, dx, MODE_CHANGE_SP
push MOMENT ; print the speed value
mov bx, 100
push bx
push ax
add dx, 14
push dx
call far ptr CALCUL
push CA_HIT ; print the hit rate
push TO_HIT
mov cx, 36
mov dx, 73
push cx
push dx
call far ptr CALCUL
pop dx
pop cx
pop bx
pop ax
ret
SETUP endp
code ends
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -