
; ------------------------------
;  ** INTERRUPT DRIVEN CLOCK **
; ------------------------------
;      Danny Hartley, 1985.

; variable T$ is the time
; eg LET T$="12:45:30:00"
; then RANDOMIZE USR 64400 to activate clock
; error if T$ not found or incorrect
; chime every hour
; RANDOMIZE USR 64423 to turn clock off

DB "ZX82",3,0
DB THE-IR_ON/256,THE-IR_ON&255
DB IR_ON/256,IR_ON&255
DW -1

VARS:EQU 23627
TVFLAG:EQU 23612
ERR_SP:EQU 23613
PPC:EQU 23621
SUBPPC:EQU 23623
BEEPER:EQU 00949
CLSLOW:EQU 0D6EH
CLRWSP:EQU 1097H
MAIN_9:EQU 1386H
OPCHAN:EQU 1601H
OTNUM1:EQU 1A1BH
PRTSTG:EQU 203CH

ORG 64400

IR_ON:
DI
LD HL,IR_TBL
LD DE,IR_TBL+1
LD BC,256
LD (HL),0FBH
LDIR
LD A,0FCH
LD I,A
IM 2
JP SERVCE

IR_OFF:
DI
LD A,62
LD I,A
IM 1
EI
RET

DS 0FBFBH-$
JP_TBL:
JP SERVCE

DS 0FC00H-$
IR_TBL:
DS 257
SERVCE:
DI
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX

LD HL,CLKFLG
BIT 0,(HL)
JP NZ,ENDCLK
LD HL,(ERR_SP)
LD E,(HL)
INC HL
LD D,(HL)
EX DE,HL
LD BC,1555H
AND A
SBC HL,BC
JR NZ,NOEDIT
LD HL,CLKFLG
SET 7,(HL)
JP ENDCLK
NOEDIT:LD HL,(VARS)
LOOKUP:LD A,(HL)
CP 128
JP Z,ERROR
AND 224
CP 64
JR Z,STRING
CP 96
JR Z,VARBLE
CP 224
JR Z,FORNXT
CP 160
JR Z,LNGVAR
ARRAY:
INC HL
LD C,(HL)
INC HL
LD B,(HL)
INC HL
JR ADDJMP
STRING:
LD A,(HL)
CP 'T'
JR Z,FOUND
INC HL
LD C,(HL)
INC HL
LD B,(HL)
INC HL
JR ADDJMP
VARBLE:
LD BC,6
JR ADDJMP
FORNXT:
LD BC,25
JR ADDJMP
LNGVAR:
INC HL
BIT 7,(HL)
JR Z,LNGVAR
LD BC,6
ADDJMP:
ADD HL,BC
JR LOOKUP
FOUND:
INC HL
LD C,(HL)
INC HL
LD B,(HL)
INC HL
LD DE,11
EX DE,HL
SBC HL,BC
JP NZ,ERROR
EX DE,HL
CALL VALD_1
CALL COLON
CALL VALD_2
CALL COLON
CALL VALD_2
CALL COLON
CALL VALD_3
DEC HL
LD (TADDR),HL
CALL PRINT_
CALL INCCLK
LD HL,CLKFLG
BIT 7,(HL)
RES 7,(HL)
CALL NZ,INCCLK
LD A,(COUNT2)
OR A
CALL NZ,ALARM
ENDCLK:POP IX
POP HL
POP DE
POP BC
POP AF
JP 56

INCCLK:LD HL,(TADDR)
INC (HL)
INC (HL)
LD A,(HL)
CP 58
RET C
LD (HL),48
DEC HL
INC (HL)
LD A,(HL)
CP 58
RET C
LD (HL),48
DEC HL
DEC HL
INC (HL)
LD A,(HL)
CP 58
RET C
LD (HL),48
DEC HL
INC (HL)
LD A,(HL)
CP 54
RET C
LD (HL),48
DEC HL
DEC HL
INC (HL)
LD A,(HL)
CP 58
RET C
LD (HL),48
DEC HL
INC (HL)
LD A,(HL)
CP 54
RET C
LD (HL),48
DEC HL
DEC HL
LD A,(ALMGAP)
LD (COUNT1),A
LD A,(ALMLEN)
LD (COUNT2),A
INC (HL)
LD A,(HL)
CP 52
JR NZ,KNOT24
DEC HL
LD A,(HL)
CP 50
RET NZ
LD (HL),48
INC HL
LD (HL),48
KNOT24:CP 58
RET C
LD (HL),48
DEC HL
INC (HL)
RET

PRINT_:
LD A,20
LD (COD_P+1),A
LD HL,(TADDR)
LD DE,10
AND A
SBC HL,DE
LD B,11
PRF:LD A,(HL)
PUSH HL
PUSH BC
LD H,0
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,15360
ADD HL,DE
PUSH HL
COD_P:LD DE,0100H
LD HL,COD_P+1
INC (HL)
LD A,D
RRCA
RRCA
RRCA
AND 0E0H
OR E
LD L,A
LD A,D
AND 018H
OR 64
LD H,A
POP DE
LD B,4
PO1:LD A,(DE)
LD (HL),A
INC H
LD (HL),A
INC H
INC DE
DJNZ PO1
LD A,L
ADD 32
LD L,A
JR C,OK
LD A,H
SUB 8
LD H,A
OK:LD B,3
PO2:LD A,(DE)
LD (HL),A
INC H
LD (HL),A
INC H
INC DE
DJNZ PO2
LD A,(DE)
LD (HL),A
INC H
LD (HL),A
LD A,H
RRCA
RRCA
RRCA
AND 3
OR 88
LD H,A
LD A,120
LD (HL),A
LD DE,32
SBC HL,DE
LD (HL),A
PRLOOP:POP BC
POP HL
INC HL
DJNZ PRF
RET

VALD_1:
LD A,(HL)
SUB 48
CP 3
JR NC,ERROR
CP 2
INC HL
JR NZ,CHQ24
LD A,(HL)
SUB 48
CP 4
JR NC,ERROR
INC HL
RET
CHQ24:LD A,(HL)
SUB 48
CP 10
JR NC,ERROR
INC HL
RET
VALD_2:
LD A,(HL)
SUB 48
CP 6
JR NC,ERROR
INC HL
JR CHQ3
VALD_3:
CALL CHQ3
CHQ3:LD A,(HL)
SUB 48
CP 10
JR NC,ERROR
INC HL
RET
COLON:
LD A,(HL)
CP ':'
JR NZ,ERROR
INC HL
RET
ALARM:
LD HL,COUNT1
DEC (HL)
RET NZ
LD A,(ALMGAP)
LD (HL),A
INC HL
DEC (HL)
LD B,4

ALARM1:CALL INCCLK
DJNZ ALARM1
LD HL,321
LD DE,124
CALL BEEPER
DI
RET

ERROR:
DI
IM 1
LD A,253
CALL OPCHAN
CALL CLSLOW
LD DE,ERRMSG
LD BC,24
CALL PRTSTG
LD SP,(ERR_SP)
POP HL
CALL CLRWSP
LD HL,TVFLAG
SET 5,(HL)
LD BC,(PPC)
CALL OTNUM1
LD A,58
RST 16
LD BC,(SUBPPC)
LD B,0
CALL OTNUM1
EI
JP MAIN_9

ERRMSG:DB 'T TIME parameter error, '

ALMGAP:DB 4
ALMLEN:DB 2
TADDR:DW 0
CLKFLG:DB 0
COUNT1:DB 0
COUNT2:DB 0

; set 0,(CLKFLG) = freeze

THE:
	END


