;-----------------------------------------------|
;|						|
;|        VALET EXECUTIVE MODULE                |
;|		(VALET.ASM)			|
;|						|
;|----------------------------------------------|
;
; S.GRAY	     09/29/83
; R.WINTER
;
	.PABS
	.PHEX
	.XSYM
;
;|----------------------|
;|	CONSTANTS	|
;|----------------------|
;
;	DISPLAY DRIVER CONSTANTS
;
BS	=	08H
SPC	=	20H
HOM	=	1EH
RVLF	=	0BH
CR	=	0DH
LF	=	0AH
ESC	=	1BH
HL	=	22H
HLBOLD	=	26H
;
;	CCP, BDOS, & BIOS ADDRESSES
;
CCP	=	0C400H
BDOS	=	5
WATADR	=	0DAA6H
;
;	CRT CHIP PORTS
;	
DDSPY	=	0FEH	; CRT DATA
SDSPY	=	0EEH	; CRT STATUS
;
;
;|----------------------|
;|	LIST CONTROL	|
;|----------------------|
;
	.PRNTX	"LIST CONTROL (0=OFF, 1=ON)"
;
LSTINT	=	\"  INTERFACE       MODULE   "
LSTEXC	=	\"  EXECUTIVE       MODULE   "
LSTETB	=	\"  EXEC. TABLES    MODULE   "
LSTALM	=	\"  ALARM MASTER    MODULE   "
LSTPRM	=	\"  ALARM FUNCTION  MODULE   "
LSTSND	=	\"  ALARM ROUTINES  MODULE   "
LSTATB	=	\"  ALARM TABLES    MODULE   "
;
	.PAGE
BASE	=	2000H
;
	.LOC	BASE
BEGIN	=	.
;
	.IFE	LSTINT,[
	.XLIST
]
	JMP	START
;------------------------------------------------
;|	JUMP VECTORS FOR MODULE INTERFACE       |
;------------------------------------------------
PUTVAL:	JMP	0
VALDSP:	JMP	0
CONIN:	JMP	0
RETRN:	JMP	MSGOUT
RWVL:	JMP	RWVAL
RWVL1:	JMP	RWVAL1
OPFIL:	JMP	0
MVFCB:	JMP	0
DISK:	JMP	0
SOUND:	JMP	0
LINDSP:	JMP	0
MESSAG:	JMP	VALMSG
CLNVAL:	JMP	0
	JMP	WRTVAL
	JMP	0
CONOUT:	JMP	CONOUT
TIMFLG:	.WORD	0
ERRRRR:	.WORD	FATERR
;
BADKEY:	.BYTE	8,0C9H,23H,5,0C2H,0CAH,0,11H,0F8H,0FFH,19H,0D1H,13H,13,0C2H
FCBEXT:	.WORD	FCB
;
;------------------------------------------------
;|   VARIABLE STORAGE FOR MODULE INTERFACE	|
;------------------------------------------------
VALNAM:	.BYTE	0
	.ASCII	"VALET   VL2"
;
MODCNT:	.BLKB	1	; # OF MODULES LOADED
MODBEG:	.BYTE	0	; BEGINNING RECORD OF OVERLAY
MODADR:	.BLKB	2	; BEGINNING ADDR. OF OVERLAY
COMBUF:	.BLKB	2
COMLEN:	.BLKB	2
CCPLOC:	.BLKB	2
SAVDON:	.BYTE	0
FCBNUM:	.BYTE	0
NUMADR:	.BLKW	1
MEMADR:	.WORD	MEM1
DUMPMS:	.WORD	DUMPMN
HILIT:	JMP	FIELD
LENTBL:	.WORD	TSTLEN
ADRTBL:	.WORD	TSTADR
LINOFS:	.BLKB	1
SAVMOD:	.BYTE	0
SDMPS:	JMP	DMPSEL
OUTBLK:	JMP	0
FOWARD:	JMP	FWD
BAKWAD:	JMP	BKK
CONST:	JMP	0
BNKFLG:	.WORD	0	;FLAG FOR BANKED OR UNBANKED SYSTEM
;				0 = UNBANKED
SAVAUS:	.WORD	0	;ALLOCATION UNIT TABLE ADDRESS
AUS:	.WORD	0
EXM:	.BLKB	1
SECCNT:	.BLKB	1
RWON:	JMP	RWONE
SPLCNT:	.WORD	0	;SPOOL BUFFER COUNTER ADDRESS
;
	.ASCII	"REV. 1.2"
	.LIST
	.IFE	LSTEXC,[
	.XLIST
]
	.PAGE
;	
START:	DI
	STA	EXM	; STORE EXTENT MASK PASSED FROM BIOS
	SHLD	SAVAUS	; ALLOCATION UNIT TABLE
	SSPD	STKSTR	; STORE OLD STACK POINTER
	LXI	SP,BEGIN+1800H-320	; LOAD NEW STACK POINTER
	EI
;
	LHLD	1	; CALCULATE ADDRESSES FOR MODULE INTERFACE
	LXI	D,3	;  AND STORE WHERE NEEDED
	DAD	D
	SHLD	CONST+1
	DAD	D
	SHLD	CONIN+1
	LXI	D,3
	DAD	D
	SHLD	CONOUT+1
	LXI	D,5CH	
	DAD	D
	SHLD	DISK+1
	LXI	D,3
	DAD	D
	SHLD	VALDSP+1
	LXI	D,12
	DAD	D
	SHLD	SOUND+1
	LXI	D,3	
	DAD	D
	SHLD	PUTVAL+1
	DAD	D
	SHLD	LINDSP+1
	LXI	D,9	
	DAD	D
	SHLD	VALCMD+1
	INX	H
	INX	H
	SHLD	OUTBLK+1
	LXI	D,3	
	DAD	D
	SHLD	CLNVAL+1
	LXI	D,9
	DAD	D
	SHLD	WBOOT+1
	INX	H
	INX	H
	INX	H
	SHLD	GOCPM+1
	LXI	D,17	
	DAD	D
	SHLD	BNKFLG
	LXI	D,6
	DAD	D
	SHLD	TIMFLG
	INX	H
	SHLD	NUMADR
	LXI	D,38
	DAD	D
	SHLD	SPLCNT
	CALL	LINDSP
	MOV	A,B
	STA	LINOFS
;
;
VALCD1:	CALL	FNDNXT	;PUT EARLIEST ALARM IN CMOS RAM
	LXI	H,TSTMSG
	CALL	VALMSG
VALCMD:	LXI	H,0	; ADDRESS OF VALCMD (FILLED IN AT INIT)
	MOV	A,M
	MVI	M,0
	CPI	'!'
	JZ	GOTALM
	MVI	L,0
	CPI	'A'	;IF A LETTER THEN TEST IT
	JRNC	CMDW
MSGOUT:	LXI	SP,BASE+16C0H
	LHLD	BNKFLG	;IF BANKED SYSTEM
	MOV	A,M	;RESTORE SPOOL COUNTER
	ORA	A	; AFTER SCREEN DUMP
	JRZ	LZ
	LDED	SAVSPL	; SEE IF SPOOLER
	MOV	A,D	; WAS ON
	ORA	E
	JRZ	LZ	; RESTORE IF NEEDED
	DI
	LHLD	SPLCNT
	MOV	M,D
	INX	H
	MOV	M,E
	LXI	H,0
	SHLD	SAVSPL
	EI
LZ:	LXI	H,TSTLEN
	SHLD	LENTBL
	LXI	H,TSTADR
	SHLD	ADRTBL
	LXI	H,TSTMSG; ELSE PUT UP MENU
	CALL	VALMSG		
	LDA	SAVMOD
	MOV	L,A
GLP:	MVI	E,6H	;REVERSE BOLDFACE
	PUSH	H
	CALL	FIELD
	CALL	CONIN	; AND GET NEW COMMAND
	POP	H
	CPI	ESC
	JZ	RETURN
	CPI	CR
	JZ	GOTT
	MVI	E,0CH	;BOLD HILITE
	PUSH	H
	PUSH	PSW
	CALL	FIELD
	POP	PSW
	POP	H
	CPI	8
	JZ	KBK
	CPI	12
	JZ	WDF
CMDW:	ANI	0DFH
	MVI	B,0
	CPI	'C'
	JZ	GOT1	
	INR	B
	CPI	'S'
	JZ	GOT1
	INR	B
	CPI	'A'
	JZ	GOT1
	INR	B
	CPI	'I'
	JZ	GOT1
	PUSH	H
	CALL	INVALD
	POP	H
	JMPR	GLP
;	
KBK:	MVI	D,4	
	CALL	BKK
	JMP	GLP
;
WDF:	MVI	D,4
	CALL	FWD
	JMP	GLP
;
GOT1:	MOV	L,B
GOTT:	MOV	A,L
	STA	SAVMOD
	ORA	A
	JZ	CALC	
	DCR	A
	JZ	DUMP
	DCR	A
	JZ	ALARM
	DCR	A
	JZ	INSTALL
	JMP	RETURN
;
FIELD:	MVI	B,0
	MOV	C,L
	LHLD	LENTBL
	DAD	B
	MOV	D,M	;LENGTH OF NAME
	INR	D	;ADD 2 FOR BOUNDRY
	INR	D
	LHLD	ADRTBL	;CURSOR ADDRESS
	DAD	B
	DAD	B
	LDA	LINOFS
	ADD	M
	CPI	24
	JRC	.LO
	SUI	24
.LO:	ORI	0C0H
	OUT	SDSPY
	INX	H
	MOV	B,M
	DCR	B	;START 1 COLUMN BEFORE 
	MVI	C,DDSPY
J2:	INP	A
	MOV	H,A	;SAVE DOUBLE SIZE BIT
	ANI	0F0H
	MOV	L,A
	MOV	A,H
	ORA	E
	ANA	E
	ORA	L
	OUTP	A
	DCR	D
	RZ	
	INR	B
	JMPR	J2
;
FWD:	MOV	A,L
	CMP	D
	JRNZ	..LS
	MVI	L,0FFH
..LS:	INR	L
	RET
;	
BKK:	MOV	A,L
	ORA	A
	JRNZ	..LK
	MOV	L,D	
	INR	L
..LK:	DCR	L
	RET
;
DMPSEL:	LHLD	BNKFLG
	MOV	A,M
	ORA	A
	JRZ	NN1
	DI
	LHLD	SPLCNT
	MOV	D,M	;STOP SPOOLING
	MOV	A,M
	INX	H	;FOR A SCREEN DUMP
	MOV	E,M
	ORA	E
	JRZ	NN1	;IF SAVED ALREADY OR 0
	SDED	SAVSPL	; DON'T DO IT
	MVI	M,0
	DCX	H
	MVI	M,0
	EI
NN1:	LXI	H,DMPLEN
	SHLD	LENTBL
	LXI	H,DMPADR
	SHLD	ADRTBL
	MVI	L,0
NN2:	MVI	E,6
	PUSH	H
	CALL	FIELD
	CALL	CONIN
	POP	H
	CPI	ESC
	RZ
	CPI	LF
	RZ
	CPI	CR
	JRZ	OK1
	PUSH	H
	PUSH	PSW
	MVI	E,0CH
	CALL	FIELD
	POP	PSW
	POP	H
	CPI	8
	JZ	KBB
	CPI	12
	JZ	DWF
	ANI	0DFH
	MVI	B,0	
	CPI	"Q"
	JRZ	OK
	INR	B
	CPI	"T"
	JRZ	OK
	INR	B
	CPI	"G"
	JZ	OK
	INR	B
	CPI	"E"
	JRZ	OK
	PUSH	H
	CALL	INVALD
	POP	H
	JMPR	NN2
;	
OK:	MOV	L,B
OK1:	MOV	A,L
	PUSH	PSW
	XRA	A
	CALL	OUTBLK
	POP	PSW
	RET
;
KBB:	MVI	D,4	
	CALL	BKK
	JMP	NN2
;
DWF:	MVI	D,4	
	CALL	FWD
	JMP	NN2
;
	.PAGE
;
;|----------------------------------------------|
;|    SAVE 4K OF TPA AREA AND LOAD SELECTED	|
;|      MODULE INTO IT, THEN GOTO MODULE	|
;|----------------------------------------------|
;
INSTALL:LXI	B,0C02H	
	JMPR	DUMP1
;
CALC:	LXI	B,0A02H
	JMPR	DUMP1
;	
DUMP:	LXI	B,0802H
;	
DUMP1:	LXI	H,MODBEG; B=STARTING A.U. OF MODULE
	MOV	A,M
	CMP	B
	JRZ	GOMOD
	MOV	M,B
	MOV	A,C	; C=NUMBER OF A.U.'S TO R/W
	STA	MODCNT
;
	LXI	H,SAVDON; IF TPA ALREADY SAVED
	MOV	A,M
	MVI	M,0FFH	;    SET TPA SAVED FLAG
	ORA	A
	JRNZ	..J1	; THEN DON'T DO AGAIN
;
	LHLD	BNKFLG	;IF BANKED SYSTEM THEN 
	MOV	A,M	;LOAD MODULE WITHOUT
	ORA	A	;SAVING TPA
	JRNZ	..J1
	LXI	B,602H	; WRITE 2 A.U.'S STARTING AT
	MVI	A,2	;  A.U. 6  A REG.=2=WRITE OP
	CALL	RWVAL
	JRNZ	RETRN2	; UNSUCCESSFUL IF Z BIT CLEAR
;
..J1:	LDA	MODBEG	; SET UP A,B,C REGS. TO READ MODULE
	MOV	B,A
	LDA	MODCNT
	MOV	C,A
	MVI	A,3	
;
	CALL	RWVAL	; READ MODULE
GOMOD:	JZ	BASE+1800H	; JUMP TO MODULE BEGINNING
	LXI	H,OKERR
	CALL	VALMSG
;	
;|--------------------------------------|
;|  RESTORE OVERWRITTEN AREA OF TPA	|
;|	AND EXIT EXEC MODULE		|
;|--------------------------------------|
;
RETURN:	LDA	SAVDON
	ORA	A	; IF NO OVERLAY, THEN
	JRZ	RETRN1	;  THEN RN1
;
	LHLD	BNKFLG	;IF BANKED SYSTEM DON'T
	MOV	A,M	;RESTORE TPA
	ORA	A	
	JRNZ	RETRN1
;
	LXI	B,602H	; ELSE RESTORE TPA
	MVI	A,3
	CALL	RWVAL
	JRZ	RETRN1	; IF OK, THEN RETRN1
;
RETRNB:	LXI	H,FATERR; ELSE FATAL ERROR
	CALL	VALMSG
	CALL	CONIN
	LSPD	STKSTR	;RESTORE STACK
	LXI	H,0	;RETURN ADDRESS FOR
	PUSH	H	;CLNVAL
	JMP	CLNVAL	;CLNVAL RESTORES BANKS
;
RETRN2:	LXI	H,OKERR	; PUT UP ERROR MSSG.
	CALL	VALMSG	
;	
RETRN1:	LSPD	STKSTR	; RESTORE STACK POINTER
	JMP	PUTVAL	; EXIT MODULE
;
;
	.PAGE
;
;-----------------------------------------------|
;|  READ/WRITE C # OF A.U.'S STARTING AT A.U. B |
;-----------------------------------------------|
;
RWVAL:	LHLD	SAVAUS
	SHLD	AUS	;VALET.VL2 ALLOCATION UNITS
	LXI	H,BASE+1800H	; ADDRESS OF NEW MODULE
RWVAL1:	STA	VALOP	; STORE OPERATION (READ OR WRITE)
	MOV	A,C	; NUMBER OF A.U.'S TO R/W
	STA	VALCNT
;
..RELD:	PUSH	B
	PUSH	H
	CALL	GTRKSC	; XLATE A.U. TO PHYSICAL TRACK & SECTOR
	POP	H
	JRNZ	..REL1
	POP	B
	ORA	A
	RET
;
..REL1:	PUSH	H
	MVI	A,4	; READ 4 PHYSICAL SECTORS (=1 A.U.)
	STA	SECCNT
	MVI	A,10	; DO 10 RETRIES
	STA	RECNT
	LXI	B,100H	; R/W FROM DRIVE 0 ONE SECTOR AT A TIME
	LDA	VALOP
	CALL	RWONE	;  DO R/W
	POP	H
	POP	B
	ORA	A	; IF A <> 0
	RNZ		;  THEN RETURN UNSUCCESSFULLY
	INR	B	; ELSE INCR. A.U. #
	XCHG
	LXI	H,VALCNT 
	DCR	M	; DECREMENT A.U. COUNTER
	RZ		; RETURN IF ALL A.U.'S R/W
	XCHG
	LXI	D,800H	; INCREASE R/W ADDRESS BY 1 A.U. (2K)
	DAD	D
	JMPR	..RELD	; R/W NEXT A.U.
;
;|--------------------------------------|
;|     READ/WRITE PHYSICAL SECTORS	|
;|--------------------------------------|
;	
;	A	= OPERATION (2=WRITE, 3=READ)
;	B	= 1 ALWAYS 
;	C	= DRIVE NUMBER
;	D	= TRACK NUMBER (BIT 7 = SIDE)
;	E	= SECTOR NUMBER
;	HL 	= ADDRESS TO READ/WRITE TO/FROM
;	SECCNT 	= NUMBER OF SECTORS TO R/W
;
RWONE:	PUSH 	PSW	; SAVE LOAD DATA
	PUSH	B	;	'
	PUSH	D	;	'
;
	PUSH	PSW
	LDA	EXM
	ORA	A
	MOV	A,D
	JRZ	..J2
	CPI	28H
	JRC	..J1
	SUI	0A8H
	MOV	D,A
	JMPR	..J1
..J2:	CPI	50H
	JRC	..J1
	SUI	0D0H
	MOV	D,A
;
..J1:	POP	PSW
	PUSH	H	;	'
	CALL	DISK 	; LOAD SECTOR
RWL1:	XRA 	A	
	CALL	DISK
  	ORA	A	; IF DSKCYC = 0
	JRZ	RWOK	;  THEN TRACK LOADED OK
	ANI	0E0H	;   ELSE SEE IF DISK OP DONE OR ERROR
	JRZ 	RWL1	;    IF DISK OP NOT DONE, THEN LOOP TO WAIT
	LXI	H,RECNT	;     ELSE TRY AGAIN
	DCR	M	; DECREMENT RETRY COUNTER
	POP	H	; RESTORE DISK COMMAND DATA
	POP	D
	POP	B
	JRZ	RWNFG	; IF 10 RETRYS, THEN ERROR
	POP	PSW
	JMPR	RWONE	; TRY AGAIN
;
RWOK:	LXI	H,SECCNT; DECREMENT SECTOR COUNTER
	DCR	M
	POP	H	; RESTORE DISK COMMAND DATA
	POP	D	
	POP     B
	JRZ	RWDONE	; IF SECTOR = 0 THEN GOTO CCP
	MVI	A,10	; ELSE SET RETRY COUNTER
	STA	RECNT
	INR	H	; INCREMENT LOAD POINTER BY
	INR	H	;  BY 200H (PHYSICAL SECTOR LENGTH)
	MOV	A,E
	CPI	10	; IS LAST READ SECTOR <> 10 ?
	JRNZ	RWUPSC	;  IF NOT, THEN GOT UPSC
	INR	D	;    ELSE INCREMENT TRACK COUNT
	MVI	E,0	;    & SECTOR COUNT = 0 (NEXT INSTR. SETS TO 1)
RWUPSC:	INR	E	; INCREMENT SECTOR COUNT
  	POP	PSW	; RESTORE DISK COMMAND
	JMPR	RWONE	; GET NEXT SECTOR
;
RWNFG:	POP	PSW
	MVI	A,9
	RET
;
RWDONE:	POP	PSW	;  RECTIFY SP,
	XRA	A
	RET
;
GTRKSC:	LHLD	AUS	;ALLOCATION UNITS FOR
	MOV	A,B		;VALET.VL2 FILE
	ORA	A
	LDA	EXM
	JRZ	GTRKS2
	ORA	A
	JRNZ	GTRKS1
	SLAR	B
GTRKS1:	INX	H
	DJNZ	GTRKS1
GTRKS2:	MOV	C,M
	INX	H
	MOV	B,M
	ORA	A
	JRZ	GTRKS3
	MVI	B,0
GTRKS3:	MOV	H,B
	MOV	L,C
	DAD	H	; MLPY BY 4
	DAD	H
	MOV	B,H	; SAVE
	MOV	C,L
	LXI	D,10
	XRA	A
GTRKS4:	INR	A
	ANA	A
	DSBC	D
	JP	GTRKS4
	DAD	D
	ADI	2
	INR	L
	MOV	D,A
	MOV	E,L
	RET
;
VALMSG:	MOV	C,M	; PUT UP STRING TO SCREEN
	BIT	7,C
	RES	7,C
	INX	H
	PUSH	PSW
	CALL	VALDSP
	POP	PSW
	JRZ	VALMSG
	JMP	HILITE
;
;|-----------------------------------------|
;|    HILITE CHARS. OF VALET ACTIVE REG.   |
;|-----------------------------------------|
;		
HILITE:	PUSH	B
	PUSH	H
	PUSH	D
	LXI	D,1602H
;
..L1:	PUSH	H	; CALCULATE LINE OFFSET
	LDA	LINOFS
	ADD	D
	CPI	24
	JRC	..J1	
	ADI	-24
..J1:	POP	H
;
	ORI	0C0H	;THE LAST TWO LINES OF THE
	OUT	SDSPY	;SCREEN
	MVI	B,79
	MVI	C,DDSPY
..L2:	INP	A	;DO NOT CHANGE ANY OTHER ATTRIBUTES
	ORI	4	;HILITE	
	OUTP	A
	DJNZ	..L2
	OUTP	A
	INR	D
	DCR	E
	JRNZ	..L1
	POP	D
	POP	H
	POP	B
	RET
	.XLIST
	.IFN	LSTETB,[
	.LIST
]
	.PAGE
;
TSTLEN:	.BYTE	20,22,12,14,8		
TSTADR:	.BYTE	22,28,22,53,23,30,23,46,23,65
;			
TSTMSG:	.BYTE	HOM,ESC,"J",ESC,"U",HLBOLD,ESC,"S","1"
	.ASCII	"   M A I N  "
	.BYTE	ESC,"S","0",ESC,"T",SPC+1,"\","\",ESC,"T",SPC,CR,LF,ESC,'S','1'
	.ASCII	"   M E N U  "
	.BYTE	ESC,'S','0',ESC,"T",SPC+1,"\","\",ESC,"T",SPC
	.BYTE	ESC,'=',54,28+20H,ESC,'S','1'
	.ASCII	'CALCULATOR'
	.BYTE	ESC,'=',54,53+20H
	.ASCII	'SCREEN DUMP'
	.BYTE	ESC,'=',55,30+20H
	.ASCII	'ALARMS'
        .BYTE   ESC,'=',55,46+20H         
	.ASCII	'INSTALL'
	.BYTE	ESC,'=',55,65+20H
	.ASCII	'EXIT'
	.BYTE	ESC,'S','0',ESC,"c"+80H
;
OKERR:	.BYTE	ESC,"=",37H,SPC,ESC,"J",ESC,"S",31H
	.ASCII	"                VALET DISK ERROR"
	.BYTE	ESC,"S",30H,8DH
FATERR:	.BYTE	ESC,"=",37H,SPC,ESC,"J",ESC,"S",31H
	.ASCII	"    FATAL VALET DISK ERROR (MUST WARM BOOT)"
	.BYTE	ESC,"S",SPC,8DH
;
;|--------------------------|
;| TABLES FOR ALARM MODULE  |
;|--------------------------|
;
DAYTBL:	.BYTE	32,29,32,31,32,31,32,32,31,32,31,32
;
HOURS:	.BYTE	ESC,"=",36H,20H+45,ESC,"U",HLBOLD
	.ASCII	'HRS (00-23): '
	.BYTE	ESC,"U",HL+80H
;
MIN:	.BYTE	ESC,"=",36H,20H+61,ESC,"K",ESC,"U",HLBOLD
	.ASCII	'MIN (00-59): '
	.BYTE	ESC,"d",ESC,"U",HL+80H
;
;
MON:	.BYTE	HOM,ESC,"J",ESC,"U",HLBOLD
	.ASCII	"ENTER ALARM: "
	.ASCII	'MOS (01-12): '
	.BYTE	ESC,"d",ESC,"U",HL+80H
;
DAY:	.BYTE	ESC,"=",36H,20H+29,ESC,"K",ESC,"U",HLBOLD
	.ASCII	'DAY (01-31): '
	.BYTE	ESC,"U",HL+80H
;
CANYN:	.BYTE	ESC,"=",37H,40+20H
CANY1:	.ASCII	"  CANCEL? ("	
	.BYTE	ESC,"U",HLBOLD,"Y",ESC,"U",HL
	.ASCII ")ES OR ("
	.BYTE	ESC,"U",HLBOLD,"N",ESC,"U",HL			
	.ASCII	")O"
	.BYTÅ	ESC,"c",ESC,"U",HL+80H
;
CLRLIN:	.BYTE	HOM,LF,ESC,"J"+80H
;
ALMMSG:	.BYTE	ESC,"@",0FH,0FH	;SET ALARM TO OFF
	.BYTE	HOM,ESC,"J",ESC,"d"+80H
;
USEDMS:	.BYTE	HOM,ESC,"J",ESC,"=",36H,36H,ESC,"c",ESC,"U",HLBOLD
	.ASCII	"THIS ALARM IN USE"
	.BYTE	ESC,"U",HL
	.ASCII	"   ("	
	.BYTE	ESC,"U",HLBOLD,"C",ESC,"U",HL
	.ASCII	")ANCEL OR PRESS "	
	.BYTE	ESC,"U",HLBOLD,"E","S","C",ESC,"U",HL
	.ASCIS " TO EXIT"
;
ENTMSG:	.BYTE	HOM,ESC,"J",ESC,"U",HLBOLD
	.ASCIS	'ENTER MESSAGE:'
;
RESCMS:	.BYTE	HOM,ESC,"U",2EH	;BOLDFACE UNDERLINE
	.ASCII	'RESCHEDULE?   '	
DSPTYP:	.ASCII	'IMM '
	.BYTÅ	BS,BS,BS,BS,BS,BS,ESC,"U",34+80H
;
IMM:	.ASCII	"IMM"
MSSG:	.ASCII	"MSG"
COMM:	.ASCII	"CMD"
;
CHGMES:	.BYTE	HOM,ESC,"U",HLBOLD
	.ASCII	'  NEW MESSAGE?    '
	.BYTE	BS,BS,BS,ESC,"U",34+80H
;
PRSKEY:	.BYTE	HOM,ESC,"U",HLBOLD				
	.ASCII	' PRESS ANY KEY.'
	.BYTE	ESC,"U",34,ESC,"=",37H,79+0A0H
;
COMMSG:	.BYTE	HOM,ESC,"J",ESC,"c"
	.ASCII	"ENTER ALARM TYPE:  ("	
	.BYTE	ESC,"U",HLBOLD,"M",ESC,"U",HL
	.ASCII	")ESSAGE  ("
	.BYTE	ESC,"U",HLBOLD,"C",ESC,"U",HL
	.ASCII	")OMMAND LINE  ("
	.BYTE	ESC,"U",HLBOLD,"I","M","M",ESC,"U",HL
	.ASCIS	")EDIATE COMMAND LINE "
;			
ENTCOM:	.BYTE	HOM,ESC,"J"
	.ASCIS	'ENTER COMMAND'
;
ALMSTM:	.BYTE	HOM,ESC,"J",ESC,"=",36H,68,ESC,"U",2EH
	.ASCII	'ALARMS SET:'
	.BYTE	ESC,"U",HLBOLD,SPC,SPC,ESC,"S",31H		
ALMST:	.ASCII	'            '	;FILLED IN BY ALMAVL
	.BYTE	ESC,"S",30H+80H
;
MAXTBL:	.BYTE	36H,33H,34H,32H	; MAX 1ST DIGIT - MIN,HRS,DAY,MON
LINUP:	.BYTE	ESC,"=",36H,76+0A0H
MESLIN:	.BYTE	ESC,"=",37H,20+0A0H
BIG:	.BYTE	ESC,"S","1"+80H
SML:	.BYTE	ESC,"S","0"+80H
POS:	.BYTE	ESC,"=",36H,26+0A0H
ALMBUF:	.BLKB	8	
ATTCLR:	.BYTE	ESC,"U",34+80H;
NUM:	.BYTE	ESC,"?",22+80H;
;
POSMSG:	.BYTE	HOM,ESC,"J"
POSMS2:	.BYTE	ESC,"S",31H,ESC,"d",ESC,"=",36H,20+0A0H
;
;
SPLIT:	.BYTE	HOM,ESC,"J"
SPLIT2:	.BYTE	ESC,"T",1,ESC,"=",36H,SPC+18,ESC,"U",HLBOLD
	.BYTE	"\","\",ESC,"=",37H,18+20H,"\","\",ESC,"T",0
	.BYTE	ESC,"U",34,ESC,"=",36H,20+0A0H
;
;|-----------------------------|
;|  VARIABLES FOR EXEC MODULE  |
;|-----------------------------|
;
SAVSPL:	.WORD	0	; FOR SAVING SPOOL COUNTER
;			; DURING A SCREEN DUMP
FCB:	.BYTE	1
NAME:	.ASCII	"VALET   VL1"
EXTENT:	.BYTE	0,0,0,0
AU1:	.BLKB	16
CURREC:	.BYTE	0,0,0,0
;
VALOP:	.BLKB	1	; READ/WRITE COMMAND FOR RWONE
VALCNT:	.BLKB	1	; # A.U.'S TO R/W FOR RWVAL
RECNT:	.BLKB	1	; RETRY COUNTER FOR RWONE
STKSTR:	.BLKW	1	; STACK POINTER STORAGE
	.PAGE
	.LIST
	.IFE	LSTALM,[
	.XLIST
]
;
;|--------------------------------------|
;|                                      |
;|                ALARMS                |
;|              VALET.ASM               |
;|                                      |
;|--------------------------------------|
;
;R. WINTER 9/23/82
;S.GRAY
;
	.LOC	BASE+800H
;			
;|----------------------|
;|	ALARM MSSGS.	|
;|----------------------|
;
CURPRN:	.BYTE	1	;CURRENTLY SELECTED PRINTER
;
STR	=	.
MESS1:	.ASCII	'                             '
	.BYTE	ESC,"=",37H,20+20H
	.ASCII	'                             '
	.BYTE	ESC,"S",30H+80H	;NORMAL SIZE CHARACTERS
;			
MESLEN	=	.-STR

MESS2:	.ASCII	'                             '
	.BYTE	ESC,"=",37H,20+20H
	.ASCII	'                             '
	.BYTE	ESC,"S",30H+80H	;NORMAL SIZE CHARACTERS
MESS3:	.ASCII	'                             '
	.BYTE	ESC,"=",37H,20+20H
	.ASCII	'                             '
	.BYTE	ESC,"S",30H+80H	;NORMAL SIZE CHARACTERS
MESS4:	.ASCII	'                             '
	.BYTE	ESC,"=",37H,20+20H
	.ASCII	'                             '
	.BYTE	ESC,"S",30H+80H	;NORMAL SIZE CHARACTERS
MESS5:	.ASCII	'                             '
	.BYTE	ESC,"=",37H,20+20H
	.ASCII	'                             '
	.BYTE	ESC,"S",30H+80H	;NORMAL SIZE CHARACTERS
MESS6:	.ASCII	'                             '
	.BYTE	ESC,"=",37H,20+20H
	.ASCII	'                             '	;29 CHARACTERS
	.BYTE	ESC,"S",30H+80H	;NORMAL SIZE CHARACTERS
;
;|------------------------------|
;|    LENGTHS OF ALARM MESSAGES |
;|------------------------------|
;
LEN1:	.BYTE	0	
LEN2:	.BYTE	0
LEN3:	.BYTE	0
LEN4:	.BYTE	0
LEN5:	.BYTE	0
LEN6:	.BYTE	0
;
;|------------------------------|
;|    DATES & TIMES OF ALARMS   |
;|------------------------------|
;
ALM1:	.BYTE	0FFH,0,0,0,0,0,0,0,0FFH
ALM2:	.BYTE	0FFH,0,0,0,0,0,0,0,0FFH
ALM3:	.BYTE	0FFH,0,0,0,0,0,0,0,0FFH
ALM4:	.BYTE	0FFH,0,0,0,0,0,0,0,0FFH
ALM5:	.BYTE	0FFH,0,0,0,0,0,0,0,0FFH
ALM6:	.BYTE	0FFH,0,0,0,0,0,0,0,0FFH
;		   | | | | | | | | ALARM YEAR
;		   | | | | | | | ALARM TYPE
;		   | | | | | | MINUTES
;		   | | | | | 10'S MINUTES
;		   | | | | HOURS
;		   | | | 10'S OF HOURS
;		   | | DAYS
;      		   | 10'S OF DAYS
;		   MONTHS (0FFH = ALARM NOT TAKEN)
;
;	CALCULATOR MEMORY STORAGE
;	88 PRE-CLEARED BYTES FOR
;	STORAGE OF 8 MEM. REGS.
;
MEM1:	.WORD	0,0,0,0,0,0,0,0,0,0,0
	.WORD	0,0,0,0,0,0,0,0,0,0,0
	.WORD	0,0,0,0,0,0,0,0,0,0,0
	.WORD	0,0,0,0,0,0,0,0,0,0,0
;
	.PAGE
;
;|--------------------------------------|
;|				     	|
;|    MAIN CONTROL MODULE FOR ALARMS 	|
;|					|
;|--------------------------------------|
;	
ALARM:	CALL	GETDAT
	LHLD	TIMFLG
	MVI	M,0	; SET FLAG TO DISPLAY TIME
	CALL	REDNUM	; GET ALARM # FROM CMOS
	CALL	CHKCOM	; GET ALARM TYPE
	LHLD	VALCMD+1
	MOV	A,M
	CPI	"!"	;   IF AN ALARM IS PAST DUE
	MVI	M,0	
	JZ	GOTALM	;    THEN SERVICE IT
;
ALARM1:	LHLD	TIMFLG	; DO UNTIL VALID SELECTION
	MVI	M,0	;   SET FLAG TO DISPLAY TIME
	CALL	REDNUM
	CALL	CHKCOM
	LXI	H,USD1
	CALL	FINDAV	;   ELSE FIND SET ALARMS
;
	LXI	H,SETMSG;   PUT UP MENU
	CALL	VALMSG
	LXI	H,SETLEN
	SHLD	LENTBL
	LXI	H,SETADR
	SHLD	ADRTBL
	MVI	L,0	;SET ALARM
AM1:	MVI	E,6H	;REVERSE BOLDFACE
	PUSH	H
	CALL	FIELD
	CALL	CONIN	; AND GET NEW COMMAND
	POP	H
	CPI	ESC
	JZ	RETRN3
	CPI	CR
	JZ	GTT
	MVI	E,0CH	;BOLD HILITE
	PUSH	H
	PUSH	PSW
	CALL	FIELD
	POP	PSW
	POP	H
	CPI	8
	JZ	BAA
	CPI	12
	JZ	FDD
	ANI	0DFH
	CPI	"S"	;   IF = "S"
	JZ	ALMSET	;    THEN SET NEW ALARM
	CPI	"R"	;   ELSE IF = "R"
	JZ	MESRED	;    THEN REVIEW SET ALARM
	CPI	"C"	;   ELSE IF = "C"
	JZ	CANCEL	;    THEN CANCEL  SET ALARM
	PUSH	H
	CALL	INVALD	;   ELSE RESPONSE IS INVALID
	POP	H
	JMPR	AM1	; END DO
;
BAA:	MVI	D,3	
	CALL	BKK
	JMP	AM1
;
FDD:	MVI	D,3
	CALL	FWD
	JMP	AM1
;
GTT:	MOV	A,L
	ORA	A
	JZ	ALMSET
	DCR	A
	JZ	MESRED
	DCR	A
	JZ	CANCEL
;
RETRN3:	CALL	FNDNXT
	MVI	C,ESC
	CALL	VALDSP
	MVI	C,"c"
	CALL	VALDSP
	CALL	WRTVAL
	JZ	RETRN2
	LHLD	TIMFLG
	MVI	M,0FFH
	JMP	RETRN
;
	.XLIST
	.IFN	LSTPRM,[
	.LIST
]
	.PAGE
;
;|--------------------------------------|
;|  SERVICE ALARM THAT HAS GONE OFF	|
;|--------------------------------------|
;
GOTALM:	CALL	GETDAT
	LHLÄ	±	
	LXI	D,1603H
	ANA	A
	DSBC	D
	SHLD	CCPLOC	;   ADDRESS OF CCP ENTRY
	LXI	D,7	
	DAD	D
	SHLD	COMLEN	;   ADDRESS OF BUFFER LENGTH IN CCP
	INX	H
	SHLD	COMBUF	;   ADDRESS OF BUFFER IN CCP
	LXI	D,169EH
	DAD	D
	SHLD	ALMWAT+1
;
	CALL	REDNUM	; GET ALARM NUMBER FROM CMOS
	CALL	CHKCOM	; CHECK ALARM TYPE
	LXI	H,ALMMSG
	CALL	VALMSG	;KILL ALARM IN CMOS RAM
;
ALMWAT:	LXI	H,WATADR
	MOV	A,M
	MVI	M,0
	ORA	A
	JRNZ	..J1
	LDA	ALMTYP	;CHECK FOR COMMAND LINE
	CPI	2	; IF IMMEDIATE TYPE
	JRZ	WBOOT1	;  THEN DO COMMAND LINE 
;
..J1:	CALL	SHWALM
	LHLD	TIMFLG
	MVI	M,0
NKEY:	CALL	CONIN	; GET RESPONSE 
	ANI	0DFH	; MAKE UPPER CASE
 	CPI	ESC	; IF RESPONSE = "ESC"
	JZ	RETRN3	;  THEN EXIT MODULE
	CPI	"Y"	; ELSE IF = "Y" 
	JZ	DOAGN	;  THEN INPUT NEW MSSG.
	CPI	CR	; ELSE IF = CR 
	JRZ	..J1	;  THEN ..J1
	CPI	"N"	; ELSE IF = "N"
	JRZ	..J1	;  THEN ..J1
	CALL	INVALD	; ELSE RESPONSE WAS INVALID
	JMPR	NKEY	; GET RESPONSE AGAIN
;
..J1:	LDA	ALMTYP
	ORA	A	; IF TYPE = 0
	JZ	CANC3	;  THEN CANCEL ALARM
;			; ELSE DROP THROUGH TO EXECUTE COMMAND
;	
;|----------------------------------------------|
;| DO ALARM W/COMMAND LINE (RELOAD CCP, RESTORE	|
;|    CP/M ENVIRONMENT, FILL COMMAND BUFFER AND |
;|    PASS CONTROL TO CCP)			|
;|----------------------------------------------|
;
WBOOT1:	MVI	C,CR
	CALL	VALDSP
	CALL	FINDAL
	MVI	M,0FFH
	CALL	FNDLEN	; GET ITS LENGTH
	MOV	A,M
	ORA	A
	JZ	ALARM1
	STA	LENCOM	; STORE LENGTH
	CALL	WRTVAL
WBOOT:	CALL	0	; RELOAD CCP+BDOS (ADDR. FILLED IN AT INIT)
	ORA	A	; IF A <> 0
	JNZ	RETRNB	;  THEN LOAD WAS UNSUCCESSFUL
GOCPM:	CALL	0	; ELSE INITIALZE CP/M ENVIRONMENT
	CALL	FINMSG	; GET MSSG.
	LDED	COMBUF	; GET ADDRESS OF CCP COMMAND BUFFER
	LDA	LENCOM	; GET LENGTH OF MSSG.
	ORA	A	; IF MSSG. LENGTH = 0
	JRZ	..GO1	;  THEN DON'T PUT IN COMMAND BUFFER
	CPI	30	; ELSE PUT MSSG. INTO CCP COMMAND BUFFER
	JRC	..L3
	LXI	B,29
	LDIR
	INX	H
	INX	H
	INX	H
	INX	H
	SUI	29
	JRZ	..GO
..L3:	MOV	C,A
	MVI	B,0
	LDIR
..GO:	XCHG
	MVI	M,0	;TERMINATE COMMAND LINE
	LDA	LENCOM
	LHLD	COMLEN
	MOV	M,A	;AND EXECUTE
..GO1:	CALL	FNDNXT
	LXI	H,RETST
	CALL	VALMSG
	LHLD	1
	LXI	D,25FDH	; CALCULATE CP/M STACK ADDRESS
	DAD	D
	SPHL		; LOAD STACK POINTER
	XRA	A
	STA	4	; CLEAR CDISK
	LHLD	BNKFLG
	MOV	A,M
	ORA	A
	JRZ	NBNK
	LHLD	CCPLOC	; GET ADDRESS OF CCP
	PUSH	H	;SAVE ON STACK
	EI
	JMP	CLNVAL	;RESET BANKS & EXECUTE
			;(CLNVAL SETS C=0 FOR DRIVE A:)
;
NBNK:	CALL	CLNVAL	;NON-BANKED EXECUTION
	MVI	C,0	;C=0 FOR DRIVE A:
	LHLD	CCPLOC
	EI
	PCHL		;EXECUTE
;
	.PAGE
;
;|---------------------|
;|   SET A NEW ALARM   |
;|---------------------|
;
ALMSET:	CALL	AVAL
	LXI	H,ALMAVL
	CALL	VALMSG	;FIND OUT WHICH ALARM TO SET
	CALL	GETNUM
	CALL	FINDAL
	MOV	A,M
	CPI	0FFH
	JRZ	DOT	;ALARM OPEN
;
RESET:	PUSH	H	
	LXI	H,USEDMS
	CALL	VALMSG
	POP	H	;IF ALARM IS USED THEN
	CALL	CONIN	;ASK FOR CANCELLATION
	ANI	0DFH
	CPI	"C"
	JNZ	ALARM1	
	PUSH	H
	CALL	CANC1
	POP	H
	JNZ	ALARM1
DOT:	CALL	DAT
;
DAT14:	CALL	MAKMES	;MAKE A MESSAGE
	JMP	ALARM1
;
	.PAGE
;
;|-------------------|
;|  REVIEW AN ALARM  |
;|-------------------|
;
MESRED:	LXI	H,ALMST
	CALL	FINDAV	;FIND WHICH ALARMS ARE IN USE
	LXI	H,ALMSTM
	CALL	VALMSG
MESRD1:	CALL	GETNUM	;GET NUMBER OF ALARM TO READ
	CALL	FINDAL
	MOV	A,M
	CPI	0FFH
	JRNZ	..J0	;EXIT IF NOT IN USE
	CALL	INVALD
	LHLD	TIMFLG
	MVI	M,0FFH
	LXI	H,REPICK
	CALL	VALMSG
	JMPR	MESRD1
;
..J0:	CALL	CHKCOM	; ELSE DISPLAY CURRENT MESSAGE
	LHLD	TIMFLG
	MVI	M,0FFH
	CALL	SHWALM
	CALL	DSPTM1
	MVI	C,RVLF
	CALL	VALDSP
..J1:	CALL	CONIN	;WAIT FOR ANY KEY TO EXIT
	ANI	0DFH
	CPI	ESC
	JZ	ALARM1
	CPI	"Y"
	JZ	DOAGN
	CPI	CR
	JRZ	..J2
	CPI	"N"
	JRZ	..J2
	CALL	INVALD
	JMPR	..J1
;
..J2:	LXI	H,CHGMES
	CALL	VALMSG
..J3:	CALL	CONIN
	ANI	0DFH
	CPI	"Y"
	JRZ	..J4
	CPI	"N"
	JZ	ALARM1
	CPI	ESC
	JZ	ALARM1
	CPI	CR
	JZ	ALARM1
	CALL	INVALD
	JMPR	..J3
;
..J4:	CALL	MAKMES
	JMP	ALARM1
;
	.PAGE
;
;|----------------------|
;|   CANCEL AN ALARM	|
;|----------------------|
;
SPPC:	LXI	B,1920H	
..L2:	CALL	VALDSP
	DJNZ	..L2
	RET
;
CANCEL:	LXI	H,POS
	CALL	VALMSG
	CALL	SPPC
	LXI	H,POS
	CALL	VALMSG
	MVI	C,LF
	CALL	VALDSP
	CALL	SPPC
	CALL	GETNUM	;ASK WHICH ALARM TO CANCEL
	CALL	FINDAL
	MOV	A,M
	CPI	0FFH
	JRNZ	..L1	;IF NOT IN USE THEN 
	LHLD	TIMFLG
	MVI	M,0FFH
	CALL	INVALD	;ASK AGAIN
	LXI	H,REPICK
	CALL	VALMSG
	JMPR	CANCEL
..L1:	LDA	ALMNUM
	ORI	30H
	MOV	C,A
	CALL	VALDSP
	LXI	H,POS	; POSITION CURSOR
	CALL	VALMSG
	LXI	H,CANY1 ; CANCEL? Y/N W/O CUR. POS.
	CALL	CANC5	
	JNZ	ALARM1
CANC3:	CALL	FINDAL
	PUSH	H	;FALL	IN
	POP	X
	MVI	0(X),0FFH
	MVI	8(X),0FFH
	MVI	C,ESC
	CALL	VALDSP
	MVI	C,"?"
	CALL	VALDSP
	MVI	C,16H	;CHECK ALARM NUMBER
	CALL	VALDSP	; IN CMOS RAM	
	CALL	CONIN
	ANI	0FH
	MOV	B,A
	LDA	ALMNUM
	ANI	0FH
	CMP	B
	JRNZ	..J1
	LXI	H,ALMMSG
	CALL	VALMSG
..J1:	JMP	ALARM1
;
CANC1:	LXI	H,CANYN	;CANCEL? Y/N
CANC5:	CALL	VALMSG
	CALL	CONIN
	ANI	0DFH
	CPI	"Y"
	RET
;
	.XLIST
	.IFN	LSTSND,[
	.LIST
]
	.PAGE
;
;|--------------------------|
;|	RESCHEDULE ALARM    |
;|--------------------------|
;
DOAGN:	LHLD	TIMFLG
	MVI 	M,0
	LXI	H,SPLIT
	CALL	VALMSG
	LXI	H,POSMS2
	CALL	VALMSG	;RESCHEDULE ALARM
	CALL	DOSMAL
	CALL	DSPTIM
	CALL	FINDAL
	CALL	CNVALM	;CONVERT MONTH FROM 1 BYTE INTO 2 BYTES
	MVI	B,12
KEY:	CALL	CONIN
	CPI	08
	JRZ	BAK1	;BACKSPACE
	CPI	SPC
	JRZ	SPACE	;AHEAD 1 SPACE
	CPI	0CH
	JRZ	SPACE
	CPI	ESC	;CR = DONE
	JZ	ENDIT
	CPI	30H	;ONLY OTHER LEGAL KEYS
	JRC	NGKEY
	CPI	3AH	;ARE 0-9
	JRC	NUM1
NGKEY:	CALL	INVALD	;NO GOOD KEY
	JMPR	KEY
;
BAK1:	DCR	B
	JRNZ	..L1	;DON'T BACKSPACE BEYOND END
	INR	B
	JMPR	NGKEY
..L1:	MVÉ	C,8
	CALL	VALDSP
	CALL	LOOK	;CHECK IF WE NEED TO SKIP
	DCX	H	;SPACES OR "/" OR ":"
	JRZ	..L2		
	JMPR	KEY
..L2:	MVI	C,8
	CALL	VALDSP
	DCR	B
	MOV	A,B
	CPI	5
	JRNZ	KEY
	MVI	C,8	;SKIP 2ND SPACE BETWEEN 
	CALL	VALDSP	;DATE & TIME
	JMPR	KEY
;
SPACE:	MOV	A,B
	CPI	12	;DON'T GO BEYOND END
	JRZ	NGKEY
	INR	B
	MVI	C,0CH
	CALL	VALDSP
	CALL	LOOK	;CHECK IF WE NEED TO JUMP
	INX	H	;OVER SPACE OR "/" OR ":"
	JRZ	..L1
	JMPR	KEY
..L1:	MVI	C,0CH
	CALL	VALDSP
	INR	B
	MOV	A,B
	CPI	7
	JRNZ	KEY
	MVI	A,0CH
	CALL	VALDSP
	JMPR	KEY
;
NUM1:	MOV	C,A
	MOV	A,B
	CPI	12	;DON'T GO TOO FAR
	JRZ	NGKEY
	MOV	E,M	;SAVE ORGINAL VALUE
	MOV	M,C	;INSERT & DISPLAY NEW VALUE
	CALL	VALDSP
	INR	B
	INX	H
	PUSH	D
	CALL	CHKMAX	;CHECK FOR LEGAL DAY,MONTH,HOUR,
	POP	D	;OR,MINUTES IF NECESSARY
	JRC	..L1
	MVI	C,8	;BAD VALUE
	CALL	VALDSP
	DCX	H	;REPLACE WITH ORIGINAL VALUE
	MOV	M,E
	MOV	C,E	;& DISPLAY
	CALL	VALDSP	
	MVI	C,8
	CALL	VALDSP
	DCR	B
	JMP	NGKEY
..L1:	JZ	KEY
	MOV	A,B
	CPI	12
	JZ	KEY
	MVI	C,0CH	;SKIP OVER SPACE,"/",OR ":"
	CALL	VALDSP
	INR	B
	MOV	A,B
	CPI	7
	JNZ	KEY
	MVI	C,0CH
	CALL	VALDSP
	JMP	KEY
;
NGKEY1:	POP	H
	JMP	NGKEY
;
ENDIT:	PUSH	H
	LXI	H,ALMBUF+2
	CALL	CHKMOS	;MAKE SURE RESCHEDULED ALARM
	JRNC	NGKEY1	;IS LEGAL
	INX	H
	INX	H
	CALL	CHKDAY
	JRNC	NGKEY1
	INX	H
	INX	H
	CALL	CHKHRS
	JRNC	NGKEY1
	INX	H
	INX	H
	CALL	CHKMIN
	JRNC	NGKEY1	;DO NOT EXIT UNLESS OK
	POP	H
	LXI	H,ALMBUF+1
	CALL	CVRT	;CONVERT MONTH BACK TO ONE BYTE
	MOV	M,A
	PUSH	H	;PUT NEW SETTING IN CURRENT ALARM
	CALL	FINDAL	
	POP	D
	XCHG
	MOV	A,M
	XCHG
	MOV	M,A
	INX	H
	INX	D
	LXI	B,6
	XCHG
	LDIR
	CALL	CHKYER
	CALL	REDMSG	; MAKE NEW MESSAGE IF DESIRED
	LXI	H,CHGMES
	CALL	VALMSG
..L2:	CALL	CONIN
	ANI	0DFH
	CPI	"Y"
	JRZ	..L1
	CPI	"N"
	JZ	ALARM1
	CPI	ESC
	JZ	ALARM1
	CALL	INVALD
	JMPR	..L2
..L1:	CALL	MAKMES
	JMP	ALARM1
;
	.PAGE	
;
;|------------------------------------|
;|   CREATE A NEW ALARM MSSG/COMMAND  |
;|------------------------------------|
;
MAKMES:	LHLD	TIMFLG
	MVI	M,0	; SET FLAG TO DISPLAY FLAG
ES1:	CALL	FINMSG	; FIND ADDRESS OF MSSG.
	PUSH	H
	CALL	FINDAL	; FIND ADDRESS OF DATE/TIME
	LXI	D,7
	DAD	D
	MVI	M,0	; RESET COMMAND FLAG
;
	LXI	H,COMMSG; "PRESS 'Y' TO ENTER COMMAND"
	CALL	VALMSG
	CALL	CONIN
	CPI	ESC
	JZ	ALARM1
	ANI	0DFH
;	
	CPI	"M"
	JRZ	..MSG
	CPI	"C"
	MVI	C,1
	JRZ	..COM
	CPI	"I"
	JRNZ	..MSG
	MOV	C,A
	CALL	VALDSP
	MVI	B,2
..L4:	CALL	CONIN
	ANI	0DFH
	MOV	C,A
	CALL	VALDSP
	CPI	"M"
	JRNZ	..MSG
	DJNZ	..L4
	MVI	C,2
;
..COM:	CALL	STRTYP
	LXI	H,ENTCOM
	JMPR	..GO
;
..MSG:	MVI	C,0
	CALL	STRTYP
	LXI	H,ENTMSG; "ENTER MESSAGE"
..GO:	CALL	VALMSG
	LXI	H,SPLIT2; PUT UP SPLIT CHARS.
	CALL	VALMSG
	LXI	H,POSMS2; POSITION CURSOR
	CALL	VALMSG
	CALL	DOSMAL	; SET TO SINGLE WIDTH CHARS.
;
	POP	H	; RETRIEVE ADDR. OF MSSG
	MVI	B,58	; SET CHARACTER COUNTER TO 58
	CALL	CLEARMS	; CLEAR MSSG. SPACE FOR THIS ALARM
;
;  --- BEGIN MESSG./COMMAND INPUT ---
;
..L1:	CALL	CONIN
	CPI	ESC	; IF CHAR. = ESC
	JRZ	..J2	;  THEN EXIT
;
..J1:	CPI	CR	; ELSE IF <> CR
	JRNZ	..L2	;  THEN ..L2
	MOV	A,B
	CPI	30	; ELSE IF ON 1ST LINE
	JRC	..J2	;  THEN GO TO 2ND LINE
	MVI	B,30	; ELSE QUIT
	SUB	B
	MOV	E,A
	MVI	D,0	
	DAD	D
	JMPR	..L3
;
..L2:	CPI	08	; IF CHAR. = BS
	JZ	BAK	;  THEN DO BACKSPACE
	CPI	SPC	; ELSE IF CHAR. < 20H
	JRC	..J5	;  THEN ERROR
;
	CPI	"a"	; MAKE CHARS. UPPER CASE
	JRC	..J3
	CPI	"z"+1
	JP	..J3
	ANI	0DFH
;
..J3:	MOV	M,A	; ELSE PUT CHAR. IN MEMORY
	MOV	C,A	; AND DISPLAY IT
	CALL	DOBIG	;  SET TO DOUBLE SIZE
	CALL	VALDSP	;   DISPLAY CHAR.
	CALL	DOSMAL	;  SET TO NORMAL SIZE 
	MOV	A,B	; CHECK CHAR. COUNTER
	CPI	30	; IF <> = 30
	JRNZ	..J4	;  THEN ..J4
;
..L3:	PUSH	H	; ELSE REPOSITION CURSOR
	PUSH	B	;  FOR LINE TWO OF INPUT
	LXI	H,MESLIN
	CALL	VALMSG
	POP	B
	POP	H
;
	LXI	D,4	; SKIP OVER CURSOR 
	DAD	D	;  POSITIONING CHARARACTERS
..J4:	INX	H	;  IN MESSAGE STORAGE
	DJNZ	..L1
	JMP	DOSMAL	; SET CHAR. TO SINGLE WIDTH
;
..J5:	CALL	INVALD	; -- ERROR --
	JMPR	..L1
;
..J2:	CALL	CLEARMS	; CLEAR ALARM MSSG. SPACE
	MVI	A,58	;  -- THIS MAKES NO FUCKING SENSE --
	SUB	B
	STA	LENCOM
	MOV	B,A	; SAVE MSSG. LENGTH
	CALL	FNDLEN	; FIND ADDRESS OF MSSG. LENGTH
	MOV	M,B	; MOVE MSSG. LENGTH TO MEMORY
	JMP	DOSMAL	; SET FOR SINGLE WWIDTH CHARS.
;
EL1	=	..L1
;
	.PAGE
;
;|----------------------------------------|
;|   GET NEW ALARM DATE & TIME FROM USER  |
;|----------------------------------------|
;
DAT:	PUSH	H
	LHLD	TIMFLG
	MVI	M,0
	LXI	H,MON	;MMDD	
	CALL	VALMSG
	POP	H
	MVI	B,8	
	MOV	A,B
	STA	LIMIT
;
DAT1:	CALL	CONIN	
	CALL	CLTOND
	CPI	ESC	;ESC TO ABORT ENTRY
	JRNZ	ELL1
	PUSH	H
;
ESCCAN:	POP	H	;RETURN ADDRESS
ESCCN1:	JMP	CANC3
;
ELL1:	CPI	08	;BACKSPACE
	JRNZ	DAT5	
	CALL	BAKSPC
	JRZ	ESCCN1
	JMPR	DAT1
;
DAT3:	CALL	INVALD
	JMPR	DAT1

DAT4:	DCX	H
	MOV	A,M
	CPI	30H
	INX	H
	JRZ	DAT3
	MOV	M,A
	DCX	H
	MVI	M,30H
	INX	H
	INX	H
	JMP	DATB
;
DAT5:	CPI	CR
	JRNZ	..Q1	
	BIT	0,B
	JRZ	DAT3
	JMPR	DAT4
..Q1:	CPI	30H
	JM	DAT3
	CPI	3AH
	JRNC	DAT3
	BIT	0,B
	CZ	CHK
	MOV	M,A
	INX	H
	MOV	C,A
	CALL	VALDSP
DATB:	MOV	A,B
	CPI	7
	JRNZ	DAT7	
	CALL	CHKMOS
	JRNC	..L1
	DCX	H
	CALL	CVRT
	JMPR	DAT6	
..L1:	CALL	BACKUP
	CALL	INVALD
	DCR	B
	JMPR	DAT1
;
DAT6:	PUSH	H
	LXI	H,DAY
	CALL	VALMSG
	POP	H
	JMPR	DAT10
;	
DAT7:	CPI	5
	JRNZ	DAT10
	CALL	CHKDAY
	JRC	DAT10	
	CALL	BACKUP
	CALL	INVALD
;
;
DAT10:	DCR	B
	MOV	A,B
	CPI	4
	JNZ	DAT1
;
;
DAT12:	PUSH	H
	LXI	H,HOURS
	CALL	VALMSG
	POP	H
	JMPR	TIM1+6
;
TIMXº	MVI	A,30H
	BIT	0,B
	JRNZ	..L1
	INX	H
	DCR	B
	JMPR	..L2
..L1:	DCØ	H
	MOÖ	A,M
	CPI	30H
	INX	H
	JRZ	TIM3
..L2:	MOV	M,A
	DCX	H
	MVI	M,30H
	INX	H
	INX	H
	JMP	TIMB
;
;
TIM1:	MOV	A,B
	CPI	5
	JNC	DAT1
	CALL	CONIN	
	CALL	CLTOND
	CPI	ESC	;ESC TO ABORT ENTRY
	JZ	ESCCAN
	CPI	8	;BACKSPACE	
	JNZ	TIM4	
TIM2:	CALL	BAKSPC
	JMPR	TIM1
;
TIM3:	CALL	INVALD
	JMPR	TIM1+6
;
TIM4:	CPI	CR
	JRZ	TIMX
..Q2:	CPI	30H	;KEY < 0 ?
	JM	TIM3
 	CPI	3AH	;> 9 ?
	JRNC	TIM3	
	BIT	0,B
	CZ	CHK
	MOV	M,A
	INX	H
	MOV	C,A
	CALL	VALDSP
TIMB:	MOV	A,B
	CPI	3
	JRNZ	TIM6
;
	CALL	CHKHRS
	JRC	TIM5	
	CALL	BACKUP
	CALL	INVALD
	DCR	B
	JMPR	TIM1
;
TIM5:	PUSH	H
	LXI	H,MIN
	CALL	VALMSG
	POP	H
	JMPR	TIM7
;
TIM6:	CPI	1
	JRNZ	TIM7
	CALL 	CHKMIN	;CHECK FOR VALID MINUTES
	JRC	TIM7	
	CALL	BACKUP
	CALL	INVALD
;	
TIM7:	DJNZ    TIM1
;
TIM8:	PUSH	H
	LXI	H,ESCAPE
	CALL	VALMSG
	POP	H
	CALL	CONIN
	ANI	0DFH
	CPI	ESC
	JZ 	CANC3
	CPI	8
	JRZ	..J1
;
	CPI	"S"
	JRZ	CHKYER
	JMPR	TIM8
;
..J1:	MVI	B,3
	DCX	H
	DCX	H
	PUSH	H
	LXI	H,CLRLIN
	CALL	VALMSG
	POP	H
	JMP	TIM5
;
CHKYER:	CALL	FINDAL
	PUSH	H
	POP	X
	LDA	PRSDAT+6
	MOV	C,A
	LXI	H,PRSDAT+3
	MOV	A,0(X)
	ANI	0FH
	MOV	B,M
	CMP	B
	JRZ	..J3
	JRNC	..OK
	JRC	..NOK
..J3:	DCX	H
	MOV	A,1(X)
	ANI	0FH
	MOV	B,M
	CMP	B
	JRZ	..J4
	JRNC	..OK
	JRC	..NOK
..J4:	DCX	H
	MOV	A,2(X)
	ANI	0FH
	MOV	B,M
	CMP	B
	JRZ	..OK
	JRNC	..OK
..NOK:	INR	C
..OK:	MOV	8(X),C
	RET
;
	.PAGE
;
;|----------------------|
;|			|
;|   MISC. ROUTINES	|
;|			|
;|----------------------|
;
;|-------------------------------------------|
;|   FILL AN ALARM MSSG/COMMAND WITH SPACES  |
;|-------------------------------------------|
;
CLEARMS:PUSH	B	;INSERT SPACES IN MEMORY
	PUSH	H	;NUMBER OF BYTES IN B
..L1:	MOV	A,M	;LOCATION IN HL
	CPI	ESC
	JRNZ	..L2
	LXI	D,4
	DAD	D
..L2:	MVI	M,SPC
	INX	H
	DJNZ	..L1
	POP	H
	POP	B
	RET
;
STRTYP:	CALL	FINDAL
	LXI	D,7
	DAD	D
	MOV	M,C	; SET ALARM TYPE
	RET
;
BAK:	MOV	A,B
	CPI	58	
	JZ	ES1
	CPI	29
	MVI	M,SPC	;ERASE CHAR.
	JRZ	BAKLIN	;BACKUP TO LINE ONE
	CALL	DOBIG
	CALL	BACKUP
	CALL	DOSMAL
	JMP	EL1
;
BAKLIN:	PUSH	H
	CALL	CLTOND
	LXI	H,LINUP
	CALL	VALMSG	;BACKUP TO LINE ONE AND ERASE
	MVI	C,SPC	;LAST CHARACTER
	CALL	DOBIG
	CALL	VALDSP
	MVI	C,8
	CALL	VALDSP
	CALL	DOSMAL
	POP	H
	XRA	A	;CLEAR CARRY
	LXI	D,5
	DSBC	D
	INR	B
	JMP	EL1
;
REDMSG:	LHLD	TIMFLG
	MVI	M,0
	LXI	H,POSMSG
	CALL	VALMSG	;POSITION CURSOR FOR MESSAGE
	CALL	FINMSG	;FIND CURRENT ALARM MESSAGE
	CALL	VALMSG
	CALL	DOSMAL	;AND DISPLAY
	LXI	H,SPLIT2
	JMP	VALMSG
;	
SHWALM:	LXI	H,SPLIT	
	CALL	VALMSG	; ELSE POSITION CURSOR FOR MESSAGE
	CALL	DOBIG	; SET TO DOUBLE WIDTH
	CALL	FINMSG	;GET MESSAGE AND DISPLAY
	CALL	VALMSG	
	CALL	GETTYP	; STORE ALARM TYPE IN DSPTYP
	CALL	DOSMAL
	LXI	H,RESCMS; PUT UP RESCHEDULE MSSG.
	JMP	VALMSG				
;
NG:	CALL	INVALD	
;
GETNUM:	LXI	H,WCHAM2
	CALL	VALMSG
	CALL	CONIN
	CPI	ESC	;GET A VALID ALARM NUMBER (1-6)
	JZ	ALARM1
	CPI	31H
	JM	..NG
	CPI	37H
	JRNC	..NG
	ANI	0FH
	STA	ALMNUM
	RET
;
..NG:	LHLD	TIMFLG
	MVI	M,0FFH
	CALL	INVALD
	LXI	H,REPICK
	CALL	VALMSG
	JMPR	GETNUM
;
CHK:	PUSH	B
	RRCR	B
	MOV	C,B	;CHECK FIRST INPUTTED DIGIT
	DCR	C	;OF MONTH,DAY,HOUR,OR MINUTE
	MVI	B,0
	PUSH	H	;FOR GREATER THAN LEGAL VALUE
	LXI	H,MAXTBL
	DAD	B	
	MOV	B,M
	POP	H
	CMP	B
	POP	B
	RC		;RETURN IF VALUE IS LESS THAN MAX
	DCR	B
	MVI	M,30H	;OTHERWISE MAKE THE FIRST DIGIT
	INX	H	;A ZERO AND THE INPUTTED DIGIT	
	RET		;BECOMES THE VALUE
;
;|----------------------------------|
;|  STORE ALARM TYPE (ASCII CHAR.)  |
;|    IN DSPTYP FOR DISPLAY	    |
;|----------------------------------|
GETTYP:	LDA	ALMTYP
	LXI	H,MSSG
	ORA	A
	JRZ	..J1
	CPI	1
	LXI	H,COMM
	JRZ	..J1
	LXI	H,IMM
..J1:	LXI	D,DSPTYP
	LXI	B,3
	LDIR
	RET
;
;|--------------------------------------|
;|  WRITE OUT ALARMS TO EXEC. MODULE	|
;|   BEFORE EXITING ALARM MODULE	|
;|--------------------------------------|
;			;WRITE ALARMS & MSSGS.
WRTVAL:	LHLD	SAVAUS
	SHLD	AUS
	LXI	H,BASE+800H	; HL = R/W ADDRESS
	LXI	B,401H	; WRITE 1 A.U. AT A.U. # 4
	MVI	A,2	; A = 2 = WRITE
	CALL	RWVAL1	;  WRITE DATA
	SUI	9	; IF = 9 THEN ERROR
	RET
;
DOSMAL:	PUSH	H	; SET CHAR. SIZE TO SINGLE WIDTH
	PUSH	B
	LXI	H,SML
	JMPR	DO
;
DOBIG:	PUSH	H	; SET CHAR. SIZE TO DOUBLE WIDTH
	PUSH	B
	LXI	H,BIG
DO:	CALL	VALMSG
	POP	B
	POP	H
	RET
;
CVRT:	MOV	C,M
	DCX	H
	MOV	A,M
	ANI	0FH	;CONVERT MONTH FROM 2 BYTES
	MOV	A,C	;INTO ONE
	JRZ	..L2	
	ADI	10
..L2:	MOV	M,A
	INX	H
	RET
;
;|----------------------------------------|
;|  DETERMINE WHICH ALARMS ARE AVAILABLE  |
;|----------------------------------------|
;
AVAL:	LXI	H,AVL1	
	CALL	FINDAV
	LXI	H,AVL6
	MVI	B,6
..L1:	MOV	A,B
	ORI	30H
	MOV	C,A
	MOV	A,M
	CPI	SPC
	JRZ	..L2
	MVI	C,SPC
..L2:	MOV	M,C
	DCX	H
	DCX	H
	DJNZ	..L1
	RET
;
;|----------------------------------------------|
;|   FIND WHICH ALARMS ARE AVAILABLE (NOT SET)	|
;|----------------------------------------------|
;
FINDAV:	MVI	B,12
	CALL	CLEARMS
	MVI	B,1	;FIND WHICH ALARMS ARE AVALIABLE
	LXI	D,ALM1
..L2:	XCHG
	MOV	A,M	;PUT NUMBER IN MEMORY IF IN USE
	XCHG
	CPI	0FFH
	MVI	A,SPC
	JRZ	..L1
	MOV	A,B
	ORI	30H
..L1:	MOV	M,A
	INX	H
	INX	H
	PUSH	H
	XCHG
	LXI	D,9	
	DAD	D
	XCHG
	POP	H
	INR	B
	MOV	A,B
	CPI	7
	JRC	..L2
	RET
;
;|----------------------------------------|
;|  FIND ADDRESS WHERE LENGTH OF CURRENT  |
;|    COMMAND LINE IS STORED		  |
;|----------------------------------------|
;
FNDLEN:	LXI	H,LEN1
	LDA	ALMNUM
..L2:	DCR	A
	RZ	
	INX	H
	JMPR	..L2
;
;|----------------------------------------|
;|  FIND THE ADDRESS OF THE MSSG/COMMAND  |
;|   THAT CORRESPONDS TO AALMNUM	  |
;|----------------------------------------|
;
FINMSG:	LXI	H,MESS1
	LXI	D,MESLEN
	JMPR	FIND
;
;|-----------------------------------------|
;|  FIND THE ADDRESS OF THE DATE AND TIME  |
;|    THAT CORRESPONDS TO ALMNUM	   |
;|-----------------------------------------|
;
FINDAL:	LXI	H,ALM1
	LXI	D,9	;FIND THE DATE AND TIME
FIND:	LDA	ALMNUM	;FOR THE CURRENT ALARM
	DCR	A
	RZ
	MOV	B,A
..L1:	DAD	D
	DJNZ	..L1
	RET
;
;|-----------------------------------|
;|  FIND THE ALARM WHICH IS NEXT UP  |
;|-----------------------------------|
;
FNDNXT:	LXI	H,ALM1
	LXI	D,ALM2	;FIND THE NEXT EARLIEST ALARM
	CALL	CMPH
	LXI	D,ALM3
	CALL	CMPH
	LXI	D,ALM4
	CALL	CMPH
	LXI	D,ALM5
	CALL	CMPH
	LXI	D,ALM6
	CALL	CMPH
	PUSH	H
	LXI	D,ALM1
	XRA	A
	DSBC	D
	MVI	A,1
	JRZ	FINIS
	INR	A
	LXI	D,9
..L1:	DSBC	D
	JRZ	FINIS
	INR	A
	JMPR	..L1
FINIS:	POP	X
	STA	ALMNUM
	MOV	B,8(X)
	LDA	PRSDAT+6
	CMP	B
	RNZ
	PUSH	X
	POP	H
	JMP	SETALM
;
;|----------------------------------|
;|   CHECK A CHAR. FOR VALID VALUE  |
;|----------------------------------|
;
CHKMOS:	MVI	A,13
	MVI	D,9
	JMPR	CHKGEN
;
CHKHRS:	MVI	A,24
	JMPR	CHKGN1	
;
CHKMIN:	MVI	A,60
;
CHKGN1:	MVI	D,0
CHKGEN:	STA 	CHKCHG+1
	MOV	A,D	
	STA	CHKCG1+2
	PUSH	B
	DCX	H	;CHECK HOURS,MINUTES,OR MONTHS
	MOV	A,M	;FOR VALID INPUT
	DCX	H
	MOV 	B,M
	INX	H
	INX	H
	CALL	ASCBIN
	POP	B
CHKCG1:	ORA	A
	JRZ	NOGOOD	; OFFSET MODIFIABLE
	JM	NOGOOD
CHKCHG:	CPI	00	; VALUE MODIFIABLE
	STA	MONTH
	RC
;
NOGOOD:	XRA	A	
	RAL
	RET
;
	.PAGE
;
;|----------------------------------------|
;|  READ CMOS RAM TO GET CURRENT ALARM #  |
;|----------------------------------------|
;
REDNUM:	LXI	H,NUM	
	CALL	VALMSG
	CALL	CONIN	
	ANI	0FH
	STA	ALMNUM
	RET
;
;|-------------------------------------|
;|  READ CMOS RAM TO GET ALARM TYPE    |
;|  0=NORMAL MSSG.,1=COMMAND LINE,2=   |
;|  COMAND LINE WITH IMMEDIATE EXECUTE |
;|-------------------------------------|
;
CHKCOM:	CALL	FINDAL	; FIND ADDRESS OF TABLE
	LXI	D,7
	DAD	D	; GET ADDRESS OF TYPE BYTE
	MOV	A,M	; GET IT
	STA	ALMTYP	; STORE IT
	RET
;
;|-----------------------------------|
;|  SET SCREEN ATTRIBUTES TO HILITE  |
;|-----------------------------------|
;
CLRATT:	LXI	H,ATTCLR
	JMP	VALMSG
;
;|----------------------------------------|
;|  FIND IF NEED TO SKIP BACK EXTRA SPACE |
;|   IN RESCHEDULE. I.E. " ","/", OR ":". |
;|----------------------------------------|
;
LOOK:	MOV	A,B
	CPI	9
	RZ
	CPI	6
	RZ	
	CPI	3
	RET
;
;|---------------------------|
;|   ----- NOT SURE  ------- |
;|---------------------------|
;
CNVALM:	LXI	D,ALMBUF
	MOV	A,M	;CONVERT MONTH FROM 1 BYTE INTO 2
	CPI	3AH
	XCHG
	MVI	M,30H
	JRC	..L1
	MVI	M,31H
	SUI	10	
..L1:	INX	H	;READ DATE & TIME INTO BUFFER
	MOV	M,A	;FOR RESCHEDULE
	INX	H
	INX	D
	LXI	B,6
	XCHG
	LDIR
	XCHG
	RET
;
	.PAGE
;
DAYCHK:	DCX	H	;CHECK MONTH SO
	DCX	H
	CALL	CHKMOS	;WE KNOW HOW MANY DAYS ARE OK
	INX	H
	INX	H
;
CHKDAY:	PUSH	B
	DCX	H
	MOV	A,M
	DCX	H
	MOV	B,M
	INX	H
	INX	H	;CHECK INPUTTED DAY
	PUSH	H
	CALL	ASCBIN	;FOR MAX
	ORA	A
	JRZ	..J1
	PUSH	PSW
	LXI	H,DAYTBL-1
	LDA	MONTH
	MOV	E,A
	MVI	D,0
	DAD	D
	MOV	B,M
	POP	PSW
	CMP	B
..J1:	POP	H
	POP	B
	RC
	JMP	NOGOOD
;
CHKMAX:	MOV	A,B	;CHECK MONTH,DAY,HOURS,OR
	CPI	12	;MINUTES FOR LEGAL VALUE
	JZ	CHKMIN
	CPI	9
	JZ	CHKHRS
	CPI	6
	JZ	DAYCHK
	CPI	3	
	JZ	CHKMOS
	XRA	A	;NO NEED TO CHECK
	STC
	RET
;
INVALD:	PUSH	H
	PUSH	B
	LXI	H,BADKEY
	CALL	SOUND
	EI
	POP	B
	POP	H
	RET	
;
BACKUP:	DCX	H
	INR	B
	JMPR	S1
;
	
BAKSPC:	LDA	LIMIT
	CMP	B
	RZ
	INR	B
	DCX	H
	BIT	0,B
	JRZ	..S1
	INR	B
	MOV	A,B
	CPI	8
	JRZ	..L2
	DCX	H
..L2:	PUSH	H
	PUSH	B
	MVI	B,15
..L1:	MVI	C,8
	CALL	VALDSP
	DJNZ	..L1
	JMPR	..S2
..S1:	PUSH	H
	PUSH	B
..S2:	MVI	C,8
	CALL	VALDSP
	CALL	CLTOND
	XRA	A
	INR	A		
	POP	B
	POP	H
	RET
;
S1	=	..S1	
;	
;
ASCBIN:	ANI	0FH
	MOV	C,A
	XRA	A
	RAL
	MOV	A,B
	ANI	0FH
	MOV	B,A
	RAL
	RAL
	RAL
	ADD	B
	ADD	B
	MOV	B,A
	MOV	A,C
	ADD	B
	RET
;
CLTOND:	PUSH	PSW
	PUSH	B
	MVI	C,ESC	;CLEAR TO END
	CALL	VALDSP	;OF SCREEN
	MVI	C,"K"
	CALL	VALDSP
	CALL	HILITE
	POP	B
	POP	PSW
	RET
;
WRTMOS:	MVI	C,ESC
	CALL	VALDSP	;SET UP TO WRITE A VALUE TO
	MVI	C,"@"	;CMOS RAM AT ADDRESS IN D
	CALL	VALDSP
	MOV	C,D
	JMP	VALDSP
;
SETALM:	CALL	FINDAL
	MVI	D,0FH	;NEXT ALARM IM CMOS RAM
	MVI	B,7	
..L1:	PUSH	B
	CALL	WRTMOS	;WRITE THE NEXT ALARM UP IN
	MOV	A,M	;CMOS RAM
	ANI	0FH
	MOV	C,A
	CALL	VALDSP
	INX	H
	INR	D
	POP	B
	DJNZ	..L1
	CALL	WRTMOS
	LDA	ALMNUM
	MOV	C,A
    	CALL	VALDSP
	INR	D
	CALL	WRTMOS
	MOV	C,M
	JMP	VALDSP
;
CMPH:	PUSH	H
	PUSH	D
	POP	Y
	POP	X
	MOV	A,8(X)
	MOV	B,8(Y)	
	CMP	B
	JRZ	..J0
	JRNC	..J1
	RET
;
..J0:	PUSH	H
	PUSH	D
	MVI	B,7
..L1:	MOV	A,M	;COMPARE DATE & TIME OF
	XCHG		;ALARMS IN DE & HL
	CMP	M	;RETURN WITH EARLIEST IN HL
	XCHG
	JRNZ	..L2
;
	INX	H
	INX	D
	DJNZ	..L1
;
..L2:	POP	D
	POP	H
	RC
..J1:	XCHG
	RET
;
DSPTM1:	MVI	C,HOM
	CALL	VALDSP	
	MVI	C,LF
	CALL	VALDSP	
DSPTIM:	CALL	FINDAL
	MOV	A,M	;MONTH
	CPI	3AH	;<9 ?
	MVI	C,SPC	;BLANK LEADING ZERO
	JRC	NOONE
	MVI	C,31H
NOONE:	CALL	VALDSP
	MOV	A,M
	CPI	3AH
	JRC	..L1
	SUI	10
..L1:	MOV	C,A
	CALL	VALDSP
	MVI	C,"/"	;INSERT "/" BETWEEN MONTH & DAY
	CALL	VALDSP
	INX	H
	MVI	B,2
..L2:	MOV	C,M
	CALL	VALDSP
	INX	H
	DJNZ	..L2
	MVI	B,2
..U1:	MVI	C,SPC	;TWO SPACES BETWEEN DATE & TIME
	CALL	VALDSP
	DJNZ	..U1
	MVI	B,2
..L4:	MOV	C,M
	BIT	0,B	;BLANK LEADING ZERO
	JRNZ	..Z1
	MOV	A,C
	CPI	30H
	JRNZ	..Z1
	MVI	C,SPC
..Z1:	CALL	VALDSP
	INX	H
	DJNZ	..L4
	MVI	C,":"	;INSERT ":" BETWEEN HOURS & MINUTES
	CALL	VALDSP
	MVI	B,2
..L5:	MOV	C,M
	CALL	VALDSP
	INX	H
	DJNZ	..L5
	RET
;
;|--------------------|
;|  GET PRESENT DATE  |
;|--------------------|
;
GETDAT:	MVI	C,ESC
	CALL	VALDSP
	MVI	C,":"
	CALL	VALDSP
	LXI	H,PRSDAT
	MVI	B,7
..L1:	CALL	CONIN
	CPI	"?"
	JRNZ	..J1
	LXI	H,PRSDAT+3
	JMPR	..J2
..J1:	ANI	0FH
	MOV	M,A
	INX	H
	DJNZ	..L1
;
	LXI	H,PRSDAT+4
	MOV	A,M
	ORA	A
	JRZ	..J3
	MVI	A,10
..J3:	DCX	H
	ADD	M
..J2:	MOV	M,A
	RET
;
	.XLIST
	.IFN	LSTATB,[
	.LIST
]
	.PAGE
;
;|---------------------------------------|
;|	   BUFFERS AND TABLES		 |
;|---------------------------------------|
;
;
REPICK:	.BYTE	HOM,LF,ESC,"U",21H
	.ASCII	"INVALID ALARM NUMBER"
;
WCHAM2:	.BYTE	HOM,ESC,"U",HLBOLD
	.ASCII	'ENTER ALARM NUMBER: '	
	.BYTE	SPC,SPC,BS,BS,ESC,"d",ESC,"U",HL+80H
;
ESCAPE:	.BYTE	ESC,"=",37H,3DH,ESC,"K","("	
	.BYTE	ESC,"U",HLBOLD,"S",ESC,"U",HL
	.ASCII	")ET OR PRESS "	
	.BYTE	ESC,"U",HLBOLD,"E","S","C",ESC,"U",HL
	.ASCII	" TO EXIT"
CURS:	.BYTE	ESC,"c",ESC,"=",37H,79+0A0H	
;
SETADR:	.BYTE	22,28,22,37,23,27,23,43	
SETLEN:	.BYTE	6,12,12,8
;
SETMSG:	.BYTE	HOM,ESC,"J",ESC,"U",HLBOLD,ESC,"S","1",ESC,"c"		
  	.ASCII	" ALARM MENU "	
	.BYTE	ESC,"S","0",ESC,"T",SPC+1,"\","\",ESC,"T",SPC
	.BYTE	ESC,'=',54,28+20H,ESC,'S','1'
	.ASCII	'SET'	
	.BYTE	ESC,'=',54,37+20H
	.ASCII	'REVIEW'	
	.BYTE	ESC,'=',55,27+20H
	.ASCII	'CANCEL'
	.BYTE	ESC,'=',55,43+20H
	.ASCII	'EXIT'
	.BYTE	ESC,'S','0',ESC,'=',55,24+20H
	.BYTE	ESC,"T",SPC+1,"\","\",ESC,"T",SPC
	.BYTE	ESC,"=",36H,84,ESC,"T",1,"\","\",ESC,"=",37H,84,"\","\"
	.BYTE	ESC,"T",0,ESC,"=",36H,91	;NORMAL CHAR SET
	.BYTE  	ESC,"U",2EH
	.ASCII	'ALARMS IN USE'
	.BYTE	ESC,"=",37H,87,ESC,"U",HLBOLD,ESC,"S",31H
USD1:	.BYTE	SPC,SPC	;THE ALARMS USED ARE FILLED IN BY 
USD2:	.BYTE	SPC,SPC	;THE PROGRAM
USD3:	.BYTE	SPC,SPC
USD4:	.BYTE	SPC,SPC
USD5:	.BYTE	SPC,SPC
USD6:	.BYTE	SPC,SPC
	.BYTE	ESC,"S",30H+80H
;
ALMAVL:	.BYTE	HOM,ESC,"J",ESC,"=",36H,68,ESC,"U",HLBOLD
	.ASCII	'ALARMS AVAILABLE:'
	.BYTE	ESC,"U",HLBOLD,SPC,ESC,"S",31H
AVL1:	.BYTE 	SPC,SPC	
AVL2:	.BYTE 	SPC,SPC
AVL3:	.BYTE 	SPC,SPC
AVL4:	.BYTE 	SPC,SPC
AVL5:	.BYTE 	SPC,SPC
AVL6:	.BYTE 	SPC,SPC
	.BYTE	ESC,"S","0",ESC,"=",37H,68,ESC,"U",HL
	.ASCII	"PRESS "	
	.BYTE	ESC,"U",HLBOLD
	.ASCII	"ESC"
	.BYTE	ESC,"U",HL
	.ASCIS	" TO EXIT"	
;
;
;SCREEN DUMP MENU
;
DMPLEN:	.BYTE	10,9,13,13,4
DMPADR:	.BYTE	22,30,22,45,22,62,23,36,23,56
;
DUMPMN:	.BYTE	HOM,ESC,"J",ESC,"=",22+20H,24+20H
	.BYTE	ESC,"U",HLBOLD,ESC,"S","0",ESC,"T",SPC+1,"\","\",ESC,"T",SPC
	.BYTE	ESC,'=',54,30+20H
	.ASCII	'QUICK TEXT'
	.BYTE	ESC,'=',54,45+20H
	.ASCII	'TEXT ONLY'
	.BYTE	ESC,'=',54,62+20H
	.ASCII	'GRAPHICS ONLY'
	.BYTE	CR,LF,ESC,"U",HLBOLD,ESC,"S","1"
	.ASCII	" PRINT MENU "
	.BYTE	ESC,"U",HLBOLD,ESC,"S","0",ESC,"T",SPC+1,"\","\",ESC,"T",SPC
	.BYTE	ESC,'=',55,36+20H
	.ASCII	'ENTIRE SCREEN'	
	.BYTE	ESC,'=',55,56+20H
	.ASCII	'EXIT'
	.BYTE	ESC,"c"+80H
;
RETST:	.BYTE	ESC,'Z',ESC,'J'+80H
;
PRSDAT:	.BLKB	7
ALMNUM:	.BLKB	1
LIMIT:	.BLKB	1
MONTH:	.BLKB	1
VALKEY:	.BLKB	1
ALMTYP:	.BLKB	1
LENCOM:	.BLKB	1
;
	.LOC	BEGIN+1800H-320	
CMNSPC	=	.
;
	.END

