home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpmug
/
cpmug042.ark
/
TIME.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
3KB
|
178 lines
; THIS PROGRAM WILL READ AND DISPLAY THE
; TIME AND DATE FROM A COMPU/TIME BOARD
; UNDER THE CP/M OPERATING SYSTEM
;
;
ORG 100H
;
; SET UP THE NEW STACK
;
LXI H,0
DAD SP
SHLD OLDSP
LXI SP,STACK
;
; ASSIGNMENTS
;
ENTRY: EQU 5 ; CP/M ENTRY
CR: EQU 0DH ; CARRIAGE RETURN
LF: EQU 0AH ; LINE FEED
ACONT: EQU 25H ; PORT A CONTROL
ADATA: EQU 24H ; PORT A DATA
BCONT: EQU 27H ; PORT B CONTROL
BDATA: EQU 26H ; PORT B DATA
;
; DISPLAY TIME AND DATE
;
LXI D,MON
CALL DATE
LXI D,HOUR
CALL TIME
LXI D,PDATE
MVI C,9
CALL ENTRY
;
; RETURN TO CP/M THROUGH CCP
;
RETCPM: LHLD OLDSP ; GET CCP'S STACK
SPHL
RET
;
; READ A DIGIT ROUTINE
;
RDIGIT: MOV A,D ; SELECT DIGIT
OUT ADATA
IN ADATA ; RESET INTERRUPT
DWAIT: IN ACONT ; TEST FOR DIGIT PRESENT
ANI 80H ; IS IT THERE?
JZ DWAIT ; NO, THEN LOOP
IN ADATA ; READ A DIGIT
ANI 0FH ; MASK ZONE
ORI 30H ; SET ASCII
RET
;
; READ FOUR DIGITS ROUTINE
;
READ4: MVI D,0 ; SELECT FIRST DIGIT
NEXT: CALL RDIGIT ; DELAY ONE DIGIT SCAN
CALL RSDIG ; READ AND STORE DIGIT
MOV A,D
CPI 20H ; TEST IF TWO DIGITS DONE
JNZ SKIP
MOV A,C
CPI 0 ; DATE
JNZ COLON ; IT'S FOR TIME
MVI A,'/' ; IT'S FOR DATE
JMP DOIT
COLON: MVI A,':'
DOIT: CALL SDIGIT
SKIP: MOV A,D ; TEST FOR ALL DONE
CPI 40H
RZ
JMP NEXT ; GET ANOTHER DIGIT
;
; STORE A DIGIT ROUTINE
;
SDIGIT: MOV M,A
INX H
RET
;
; READ DATE ROUTINE
;
DATE: CALL BOARD ; IS THERE A BOARD
JZ NOBOARD ; NOPE
CALL CLKINT
XCHG
MVI A,0 ; SET DATE DISPLAY MODE
OUT BDATA
MVI C,0 ; TELL READ4 THIS IS DATE
CALL READ4
MVI A,'/'
CALL SDIGIT
MVI A,'7' ; SET TENS OF YEARS
CALL SDIGIT
MVI A,'9' ; SET UNITS OF YEARS
CALL SDIGIT
RET
;
; READ THE TIME
;
TIME: CALL BOARD ; CHECK IF BOARD THERE
JZ NOBOARD
CALL CLKINT
XCHG
MVI A,40H ; SET TIME DISPLAY MODE
OUT BDATA
MVI C,1 ; TELL READ4 THIS IS TIME
CALL READ4
MVI A,':'
CALL SDIGIT
CALL RSDIG
;
; READ AND STORE A DIGIT
;
RSDIG: CALL RDIGIT
CALL SDIGIT
MOV A,D
ADI 10H
MOV D,A
RET
;
; NO BOARD IN THE SYSTEM
;
NOBOARD: XCHG
MVI A,0
CALL SDIGIT
CALL SDIGIT
CALL SDIGIT
CALL SDIGIT
CALL SDIGIT
CALL SDIGIT
CALL SDIGIT
CALL SDIGIT
RET
;
; SEE IF BOARD PRESENT
;
BOARD: IN ADATA
CPI 0FFH
RET
;
; INITIALIZE CLOCK/CALENDAR PORT
;
CLKINT: MVI A,70H
OUT ADATA
MVI A,77H
OUT BDATA
MVI A,14H
OUT ACONT
MVI A,04
OUT BCONT
RET
;
; STORAGE AREA
;
PDATE: DB CR,LF,'DATE '
MON: DB 'XX'
DS 1
DAT: DB 'XX'
DS 3
DPTIME: DB ' TIME '
HOUR: DB 'XX'
DS 1
MIN: DB 'XX'
DS 1
SEC: DB 'XX'
DB CR,LF,'$'
TBUFF: DB 13,0
MONI: DS 2
DS 1
DS 2
DS 1
HOURI: DS 2
DS 1
DS 2
OLDSP: DS 2
DS 100H
STACK: DB 0