Skip to content

Commit

Permalink
Timer and time indicator
Browse files Browse the repository at this point in the history
  • Loading branch information
nzeemin committed Jul 22, 2023
1 parent 81b5a03 commit e4fbb3b
Showing 1 changed file with 52 additions and 20 deletions.
72 changes: 52 additions & 20 deletions MINER.MAC
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
.ASECT

MAXFLD = 18.*14. ; Максимальный размер поля, с учётом двух пустых колонок слева/справа
SCICON = 100023 ; Адрес на экране для смайлика
SCINDL = 100125 ; Адрес на экране для левого индикатора
SCBACK = 103604 ; Адрес на экране с которого начинается фон
SCICON = 100022 ; Адрес на экране для смайлика
SCINDL = 100124 ; Адрес на экране для левого индикатора
SCINDR = 100156 ; Адрес на экране для правого индикатора
SCBACK = 103603 ; Адрес на экране с которого начинается фон


.MACRO PUSH RR
Expand All @@ -18,10 +19,13 @@ SCBACK = 103604 ; Адрес на экране с которого начина
.=001000
START::
CLR @#177560

; Определяем верхнюю границу памяти, ставим стек
MOV #177776, R0
EMT 354 ; .SETTOP
MOV R0, SP ; Ставим стек по SETTOP
; Ставим прерывание таймера
MOV #200, @#000102
MOV #TMEINT, @#000100

MENU:
CALL STPALG
Expand Down Expand Up @@ -141,6 +145,10 @@ STGAME:
CALL SPR24
; Рисование игрового поля
CALL DRFIELD
; Обнуляем время
CLR TIME
CLR TIMETK
INC TIMECH

; Игровой цикл
GMLOOP:
Expand All @@ -156,8 +164,18 @@ GMLOOP:
MTPS R0
BNE 5$ ; Игра окончена?
JMP GMEWIN
; Ожидание нажатия клавиши
5$: CALL WTKEY
; Ожидание нажатия клавиши, с обновлением времени
5$: TST TIMECH
BEQ 8$
CLR TIMECH
; Обновляем правый индикатор
MOV TIME, R1
MOV #SCINDR, R3
CALL DRIND3
; Проверяем нажата ли клавиша
8$: CALL GETKEY
BEQ 5$ ; нет нажатия => ждём
; Проверяем на клавишу выхода
CMP #130, R0 ; 'X'
BNE 10$
JMP MENU ; Возврат в меню
Expand All @@ -179,7 +197,7 @@ GMLOOP:
; Любая другая клавиша - поставить/снять флаг/вопрос
CALL CUR2FLD ; R1 = адрес в FIELD
MOVB (R1), R0
BPL GMLOOP ; Ячейка уже открыта? => ничего не делаем
BPL GMCUR ; Ячейка уже открыта? => продолжаем игру
MOV R0, R2
BIC #177637, R2 ; Оставляем биты 140 - признаки флажка и вопроса
BEQ 20$ ; нет флагов
Expand All @@ -196,39 +214,39 @@ GMLOOP:
22$: BIC #140, R0
25$: MOVB R0, (R1) ; записываем изменение флагов
CALL DRCURC ; Рисуем ячейку под курсором
; Нарисовать курсор и вернуться в меню
; Нарисовать курсор и продолжить игровой цикл
GMCUR: CALL DRCURS ; Нарисовать курсор
BR GMLOOP
; Обработка клавиш-стрелок
GOLEFT:
MOV CURSRX, R0
BEQ GMLOOP
BEQ GMCUR
DEC CURSRX
BR GMCUR ; Нарисовать курсор и вернуться в меню
BR GMCUR ; Нарисовать курсор и продолжить игру
GORIGHT:
MOV CURSRX, R0
INC R0
CMP GMEWID, R0
BLOS GMLOOP
BLOS GMCUR
INC CURSRX
BR GMCUR ; Нарисовать курсор и вернуться в меню
BR GMCUR ; Нарисовать курсор и продолжить игру
GOUP:
MOV CURSRY, R0
BEQ GMLOOP
BEQ GMCUR
DEC CURSRY
BR GMCUR ; Нарисовать курсор и вернуться в меню
BR GMCUR ; Нарисовать курсор и продолжить игру
GODOWN:
MOV CURSRY, R0
INC R0
CMP GMEHEI, R0
BLOS GMLOOP
BLOS GMCUR
INC CURSRY
BR GMCUR ; Нарисовать курсор и вернуться в меню
BR GMCUR ; Нарисовать курсор и продолжить игру
; Клавиша пробел - открыть ячейку
GOSPC:
CALL CUR2FLD ; R1 = адрес в FIELD
MOVB (R1), R0
BPL GMLOOP ; Ячейка уже открыта? => ничего не делаем
BPL GMCUR ; Ячейка уже открыта? => продолжаем игру
BIC #177740, R0 ; Стираем признак закрытости и флаги
MOVB R0, (R1)
PUSH R0
Expand All @@ -240,9 +258,9 @@ GOSPC:
MOV CURSRX, R0
MOV CURSRY, R1
CALL OPENAREA
BR GMCUR ; Нарисовать курсор и вернуться в меню
BR GMCUR ; Нарисовать курсор и продолжить игру
10$: BIT #20, R0 ; Это мина?
BEQ GMCUR ; нет => Нарисовать курсор и вернуться в меню
BEQ GMCUR ; нет => Нарисовать курсор и продолжить игру
JMP GMEOVR ; Это мина, игра окончена

; Текущая ячейка пуста и уже открыта, раскрываем свободную область вокруг неё, рекурсия
Expand Down Expand Up @@ -902,6 +920,18 @@ LA289: MOV R3, RANDSD ; A289 LD ($5C76),HL ; Write RND SEED variable
RETURN ; A28C RET
RANDSD: .WORD 123456 ; Pseudo-random seed

; Прерывание таймера ЦП, вызывается 50 раз в секунду
TMEINT:
INC TIMETK
CMP TIMETK, #50. ; Накопилось >= 50. тиков?
BLT 20$ ; нет => выходим
SUB #50., TIMETK
CMP TIME, #999. ; максимальное время?
BEQ 20$ ; да => выходим
INC TIME ; Увеличиваем время на секунду
INC TIMECH ; флаг что время изменилось
20$: RTI

.INCLUDE /TILES.MAC/

; Параметры игры, задаются при выборе уровня
Expand All @@ -916,7 +946,9 @@ BOMBPT: .WORD 0 ; Сколько мин сейчас на игровом пол
CURSRX: .WORD 0 ; Позиция X курсора
CURSRY: .WORD 0 ; Позиция Y курсора
BOMBMK: .WORD 0 ; Сколько осталось мин, число для индикатора
;TIME: .WORD 0
TIMETK: .WORD 0 ; Накопитель для тиков таймера
TIME: .WORD 0 ; Время от начала игры, 000..999.
TIMECH: .WORD 0 ; Флаг того, что значение TIME изменилось

STACK:: .BLKW 20 ; Временный стек, используется при запуске

Expand Down

0 comments on commit e4fbb3b

Please sign in to comment.