; EMXGT-SC.MAC - Time routine for the SciTronics S-100 clock board ; by Harry Kaemmerer 05/19/84 ; ; updated for EMX v3.00 by Simon Ewins 07/30/84 ; ; Routine must exit with labels TIME and DATE filled with ASCII time and ; date strings. ; ; The labels, TIME, DATE, GETTIM, BDATE and BTIME must be public so that ; L80 and the EMXSUBS.REL file can find them. ; ;------------------ WARNING -- do not change --------------------------- ; .Z80 ; TIME:: DB 'HH:MM:SS',0 ; <<-- do not change DATE:: DB 'MM/DD/YY',0 ; <<-- do not change BDATE:: DB 0,0,0 ; <<-- do not change BTIME:: DB 0,0,0 ; <<-- do not change DAY:: DB '0',0 ; <<-- do not change ; GETTIM:: ; <<-- do not change ; ;---------------- Start your clock routine here ------------------------ ; ; .8080 ; ; ; Clock equates: ; BSPEED EQU 0F815H ; Were BYE keeps baud rate indicator MODCTLP EQU 25H ; MODEM STATUS PORT HERE SP1200 EQU 20H ; SIO SPEED INDICATOR BIT, TRUE=1200 BAUD PORT EQU 0D0H ; BASE PORT ADDRESS FOR CLOCK PORT1 EQU PORT+1 PORT2 EQU PORT+2 PORT3 EQU PORT+3 ; SECU EQU 0 ; SECONDS UNITS SECT EQU SECU+1 ; SECONDS TENS MINU EQU SECT+1 ; MINUTES UNITS MINT EQU MINU+1 ; MINUTES TENS HRSU EQU MINT+1 ; HR'S UNITS HRST EQU HRSU+1 ; HR'S TENS DAYW EQU HRST+1 ; DAY OF THE WEEK DAYU EQU DAYW+1 ; DAY UNITS DAYT EQU DAYU+1 ; DAY TENS MONU EQU DAYT+1 ; MONTH UNITS MONT EQU MONU+1 ; MONTH TENS YEAU EQU MONT+1 ; YEAR UNITS YEAT EQU YEAU+1 ; YEAR TENS ; ; ASCII EQU 30H ; OFFSET TO MAKE CHAR. ASCII ; ; .Z80 ; ; LD IX,TIME ; Point at time storage LD IY,DATE ; Point at date storage ; ; .8080 ; ; MVI A,0F0H ; SEQUENCE TO ENABLE THE CLOCK OUT PORT1 ; FOR READING MVI A,0FH OUT PORT MVI A,7FH ; LOAD DELAY CONST. CALL DELAY MVI A,0FCH OUT PORT3 MVI A,0F4H OUT PORT1 ; HRS1:: MVI A,HRST ; SELECT HR'S TENS DIGIT CALL GETDIG1 ; GET DIGIT ANI 3 ; ELIMINATE EXTRA BIT ; ; .Z80 ; ; ADD A,ASCII ; Make character LD (IX),A ; Place in string ; LD A,HRSU ; Get hours units CALL GETDIG1 ADD A,ASCII ; Make character LD (IX+1),A ; Save units ; ; Comments above apply to the rest of this stuff..... ; ; Note: IX stays pointed at string head and is indexed to the right byte ; each time. After the tme string is full, we use the IY register ; in the same way to fill the date string. ; LD A,MINT CALL GETDIG1 ADD A,ASCII LD (IX+3),A ; LD A,MINU CALL GETDIG1 ADD A,ASCII LD (IX+4),A ; LD A,SECT CALL GETDIG1 ADD A,ASCII LD (IX+6),A ; LD A,SECU CALL GETDIG1 ADD A,ASCII LD (IX+7),A ; LD A,MONT CALL GETDIG1 AND 1 ; ELIMINATE EXTRA BIT ADD A,ASCII LD (IY),A ; LD A,MONU CALL GETDIG1 ADD A,ASCII LD (IY+1),A ; ; Read day of the week ; LD A,DAYW PUSH IX LD IX,DAY CALL GETDIG1 ADD A,ASCII LD (IX),A POP IX ; LD A,DAYT CALL GETDIG1 ADD A,ASCII LD (IY+3),A ; LD A,DAYU CALL GETDIG1 ADD A,ASCII LD (IY+4),A ; LD A,YEAT CALL GETDIG1 ADD A,ASCII LD (IY+6),A ; LD A,YEAU CALL GETDIG1 ADD A,ASCII LD (IY+7),A ; ; .8080 ; ; TIMEND::MVI A,0F8H ; BEGIN SEQUENCE TO RETURN OUT PORT1 ; CLOCK TO RUN MODE MVI A,0FH OUT PORT MVI A,0F8H OUT PORT3 MVI A,0FCH OUT PORT1 MVI A,0FH OUT PORT ; ; .Z80 ; ; LD A,(REENTR) ; See if this is first time? CP 0 ; If zero then first pass JP NZ,OK1 ; Else was mail then skip all the rest. ; ; .8080 ; ; MVI A,1 ; Set to 300 first STA BSPEED ; Set it and then check MVI A,10H ; Routine to get baud rate, reset sio OUT MODCTLP ; Do it IN MODCTLP ; GET CURRENT MODEM SPEED ANI SP1200 ; NEED SPEED INDICATOR ONLY CPI SP1200 ; IS IT 1200 BAUD? JZ ST1200 ; YES SET INDICATOR BYTE JMP BAUDOK ; NO MUST BE 300 BAUD ; ; ST1200::MVI A,5 ; 1200 INDICATOR STA BSPEED ; SAVE IT ; BAUDOK::LXI H,TIME ; Load time string location LXI D,0FFF0H ; Load destination in bye ; LLOOP1::MOV A,M ; Get a byte CPI 0 ; See if end of string JZ OK1 ; Jump if done INX H ; Move from: pointer XCHG ; Hl = destination MOV M,A ; Put byt in memory INX H ; Move to: pointer XCHG ; Hl = origin of string JMP LLOOP1 ; Do some more ; OK1: RET ; <<-- ret must be here - end of clock routine ; GETDIG1:: OUT PORT ; CODE DIGIT TO SELECT CLOCK ELEMENT MVI A,0FAH ; DELAY FACTOR CALL DELAY ; DELAY SOME TIME HERE IN PORT ; READ CLOCK ELEMENT ANI 0F0H ; DROP CODE PART OF DIGIT RRC ; MOVE DATA TO LOW NIBBLE RRC RRC RRC ; NUMBER RETURNED IN ACC. RET ; DELAY:: INR A JNZ DELAY ; NOT DONE DELAY SOME MORE RET ; ;---------------------- End of your routine ----------------------------