From e4fbb3bc183445e96b633f3c9d15a0d72837024b Mon Sep 17 00:00:00 2001 From: Nikita Zimin Date: Sun, 23 Jul 2023 00:53:02 +0300 Subject: [PATCH] Timer and time indicator --- MINER.MAC | 72 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 20 deletions(-) diff --git a/MINER.MAC b/MINER.MAC index c9759bd..04755d9 100644 --- a/MINER.MAC +++ b/MINER.MAC @@ -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 @@ -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 @@ -141,6 +145,10 @@ STGAME: CALL SPR24 ; Рисование игрового поля CALL DRFIELD +; Обнуляем время + CLR TIME + CLR TIMETK + INC TIMECH ; Игровой цикл GMLOOP: @@ -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 ; Возврат в меню @@ -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$ ; нет флагов @@ -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 @@ -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 ; Это мина, игра окончена ; Текущая ячейка пуста и уже открыта, раскрываем свободную область вокруг неё, рекурсия @@ -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/ ; Параметры игры, задаются при выборе уровня @@ -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 ; Временный стек, используется при запуске