.TITLE GMT DEMO PROGRAM .PSECT GMT .SBTTL THE DEMO PROGRAM ; THE GLOBAL LABEL ALLOWS PRELOADING OF THE RELOCATION REGISTER GMT:: ; FOR DEBUG PURPOSES WE CAN PRELOAD "RREG.0" MOV #GMT,RREG.0 ; Reloc reg "0" ; AND THE BREAKPOINT REGISTERS ALSO MOV #BREAK1,BKPT.0 ; The break address MOV BREAK1,INST.0 ; The instruction MOV #3,BREAK1 ; The trap MOV #BREAK2,BKPT.1 ; The break address MOV BREAK2,INST.1 ; The instruction MOV #3,BREAK2 ; The trap MOV #STOP,BKPT.7 ; Inline code!! MOV STOP,INST.7 ; Insure it is accessed MOV #3,STOP ; each iteration ; Load the LTC vector with the service routine address MOV #GMTCNT,@#100 ; LTC will do the counting for us MOV #341,@#102 ; HIGHEST PRIORITY WE CAN GET ; Stop and view the menu ; THE LTC VECTOR IS USED BY THE PROGRAM ; ODTV09 can now steal it for it's own purposes ; and execute the original routine when it's done BREAK1: MOV #-1,EXCLGT ; could be any valid instruction ; stop the timer where it is! ; THE SECOND BREAK WILL WRITE THE DISPLAY TO THE SCREEN BREAK2: NOP ; ";P" & "D" ON THE KEYBOARD WILL DISPLAY THE GMT TIMER SYMBOLS START: TST FFLG.0 ; FFLG.0=1 WILL START THE TIMER BEQ STOP CLR EXCLGT ; ALLOW THE COUNT CLR FFLG.0 ; Reset the flag for nxt time STOP: ASR FFLG.1 ; SET TO STOP THE COUNTER BCC CONTIN ; CONTINUE MOV #-1,EXCLGT ; -1 halts the count(but retains it) CONTIN: ASR FFLG.2 ; FFLG.2 also halts, but resets it BCC START MOV #1,EXCLGT ; Reset the count and stop BR START .SBTTL THE TIME COUNTER ROUTINE ; GMT = GREENWICH MEAN TIME ; IT MAY BE RESET BY THE APPLICATION PROGRAM AT ANY TIME ; IT MAY BE INHIBITED BY...SET EXCLGT! GMTCNT: CALL SAVE ; SAVE ALL REG'S MOV #EXCLGT,R5 ; USE A REG FOR EVERY THING TST (R5)+ ; IS THE FLAG ON? BEQ 1$ ; NO SWITCH IS ON! BMI 5$ ; SKIP IT (AS IS) COM -2(R5) ; DO IT ONLY ONCE TST (R5)+ ; SKIP THE TICKER CLR (R5)+ ; CLR THE SECS & MINS CLR (R5)+ ; AND THE HOURS BR 3$ ; TO FINISH IT 1$: DECB 1(R5) ; 60 TICKS PER SEC BPL 5$ ; ONE SECOND MUST PASS MOVB (R5)+,(R5)+ ; RELOAD TICKER MOV #3,R3 ; 3 LOOPS MOV #MAXLST,R4 ; THE MAX COUNTS 2$: INCB (R5) ; BIN CNT OF SEC'S CMPB (R5),(R4)+ ; ONE MINUTE? BCS 3$ CLRB (R5)+ ; START OVER..NEW MINUTE SOB R3,2$ ; CHK THE REST 3$: MOV #3,R3 ; 3 SHIFT CYCLES MOV #BINHRS,R5 ; THE BINARY IS MOV #ASCHRS,R2 ; CONVERTED TO ASCII 4$: MOVB (R5),R1 ; BIN VALUE BIC #177600,R1 ; CLEAN IT UP CLR R0 ; QUOTIENT DIV #10.,R0 ; THE TENS DIGIT MOVB R0,1(R2) ; GOES HERE MOVB R1,(R2) ; REMAINDER IS HERE ADD #30060,(R2) ; MAKE THEM ASCII TST -(R2) ; DECR BY TWO DEC R5 ; BACKUP SOB R3,4$ ; 3 BYTES WORTH 5$: CALL RSTORE RTI ; RETURN MAXLST: .BYTE 60.,60.,24.,0 ; MAX COUNTS IN BINARY EXCLGT::.WORD 0 ; THE EXCLUDE FLG TICKS: 59. ; TICK COUNTER BINSEC::.BYTE 0 ; SECONDS CTR BINMIN::.BYTE 0 ; MINUTES CTR BINHRS::.WORD 0 ; HOURS CTR ASCSEC::.WORD 0 ; ASCII SECONDS ASCMIN::.WORD 0 ; ASCII MINUTES ASCHRS::.WORD 0 ; ASCII HOURS ; SUBRS TO SAVE AND RESTORE THE 6 GENERAL PURPOSE REGISTERS .ENABL LSB SAVE: MOV (SP)+,(PC)+ 1$: .WORD 0 MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) MOV 1$,-(SP) RETURN RSTORE: MOV (SP)+,1$ MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 MOV 1$,-(SP) RETURN .DSABL LSB .END GMT