;; ;; Kitsune's Curse ;; Copyright (C) 2020-2023 Juan J. Martinez ;; ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;; .globl _wait .globl _wait_for .globl _wait_int6 .globl _setup_int .globl _wait_vsync .globl _wframes .globl _pause_player .globl _resume_player .globl _reset_clock .globl _get_clock .globl _paused MAX_CLOCK_BYTE = 0x0e _wait:: ld hl, #_tick ld a, (_wframes) ld c, a wait_loop: ld a, (hl) cp c jr nc, wait_done halt jr wait_loop wait_done: xor a ld (hl), a ret _wait_for:: ld b, l wait_for_loop: call _wait djnz wait_for_loop ret _wait_int6:: ld a, (_int6) or a ret nz halt jr _wait_int6 ret _setup_int:: ld a, l ld (_wframes), a xor a ld (_int6), a ld (_tick), a ld (paused_player), a ld (_paused), a call _reset_clock ; sync call _wait_vsync halt halt call _wait_vsync di ld ix, #0x0038 ld hl, #isr1 ld (ix), #0xc3 ld 1(ix), l ld 2(ix), h im 1 ei ret isr1: ex af,af push hl ld hl, #isr2 ld (#0x39), hl ; int6 ends xor a ld (_int6), a ld a, (paused_player) or a jr nz, player_is_paused push ix push iy push bc push de call _PLW_Play pop de pop bc pop iy pop ix player_is_paused: pop hl ex af,af ei ret isr2: exx ex af,af ld hl, #isr3 ld (#0x39), hl exx ex af,af ei ret isr3: exx ex af,af ld hl, #isr4 ld (#0x39), hl ex af,af exx ei ret isr4: exx ex af,af ld hl, #isr5 ld (#0x39), hl ; update clock ld a, (_paused) or a jr nz, clock_is_paused ld a, (int_cnt) inc a cp #50 jr nz, not_full_sec ld hl, (clock) ld a, h cp #(MAX_CLOCK_BYTE) jr nz, inc_clock cp l jr z, clock_limit inc_clock: inc hl ld (clock), hl clock_limit: xor a not_full_sec: ld (int_cnt), a clock_is_paused: ex af,af exx ei ret isr5: exx ex af,af ld hl, #isr6 ld (#0x39), hl ; count a tick (50Hz) ld a, (_tick) inc a ld (_tick), a ex af,af exx ei ret isr6: exx ex af,af ld hl, #isr1 ld (#0x39), hl ; int6 starts ld a, #1 ld (_int6), a exx ex af,af ei ret _pause_player:: di ld a, #1 ld (paused_player), a ei call _wait_int6 jp _PLW_Stop _resume_player:: di xor a ld (paused_player), a ei ret _reset_clock:: di xor a ld (int_cnt), a ld (clock), a ld (clock + 1), a ei ret _get_clock:: ld hl, (clock) ret _wframes: .ds 1 _int6: .ds 1 _tick: .ds 1 int_cnt: .ds 1 clock: .ds 2 paused_player: .ds 1