ORG 100H ; ***************INITIALIZE PIC******************************* ; MVI A,08H ;MULT/IO ENABLE INTERRUPT AND OUT BASE+7 ;SELECT PIC MVI A,5FH ;BITS 7-5=A7-5 CALL ADDR OUT BASE+4 ;ICW1 MVI A,01 ;A15-8 OF CALL ADDR OUT BASE+5 ;ICW2 MVI A,0CH ;BUFFERED MODE FOR MULT/IO OUT BASE+5 MVI A,7FH ;MASK ALL INTERRUPTS EXCEPT OUT BASE+5 ;TIMED PULSE (OCW1) ; **************INITIALIZE 1990 TIMED PULSE********************* ; MVI A,08H ;TIME SET COMMAND OUT BASE+2 CALL KILTIME ; MVI A,28H ;SOFTWARE STROBE OUT BASE+2 CALL KILTIME ; MVI A,08H ;TIME SET COMMAND OUT BASE+2 CALL KILTIME ; MVI A,RT1990 ;SELECT TP RATE OUT BASE+2 CALL KILTIME ; MVI A,STB1990 ;SOFTWARE STROBE IN THE RATE OUT BASE+2 CALL KILTIME ; MVI A,RT1990 OUT BASE+2 ; *********ALL INITIALIZATION DONE********************* ; IN BASE+2 ;CLEAR THE TIMED INTERRUPT EI LOOP1 JMP LOOP1 ;WAIT FOR INTERRUPT ; ; ; ; ****************************************** ; * FOLLOWING THE FIRST INTERRUPT AFTER * ; * THE ENABLE INTERRUPT IN THE INITIALI- * ; * ZATION ROUTINE ABOVE, INRATE ENTERS * * THIS ISR AND NEVER EXITS EXCEPT TO * * WARM BOOT. * ***************************************** ; ; ORG 15CH MVI A,20H ;END OF INTERRUPT TO 8259 PIC OUT BASE+4 LXI SP,SPBASE ;RETURN TO BASE OF STACK LDA ISW ;WHICH HALF OF ISR? ORA A JNZ GETRATE MVI A,0 STA COUNT ;INITIALIZE COUNT TO ZERO MVI A,1 STA RATEHI ;INITIALIZE RATEHI TO ZERO MVI A,01 STA ISW ;NEXT INTERRUPT GO TO GETCNT IN BASE+2 ;CLEAR THE TIMED INTERRUPT EI MVI A,0 CNTLOOP INR A JNZ CNTLOOP LDA COUNT INR A STA COUNT JNZ NEXT STA RATEHI NEXT MVI A,0 JMP CNTLOOP ; ; ************************************************ * * GET THE COUNT FROM THE PRECEEDING LOOP. * * PRINT APPROPRIATE MESSAGE DEPENDING ON * * IF COUNT IS IN OR OUT OF RANGE. * * THEN CHECK FOR A CHARACTER INPUT FROM * * THE KEYBOARD AND WARM BOOT IF THERE IS * * ONE. OTHERWISE WAIT FOR NEXT INTERRUPT * * AND THEN RETURN TO COUNTING LOOP (ABOVE) * * * ************************************************* ; GETRATE LDA BADFLAG ;PRINT AN F CONTINUOUSLY FOR EVERY ORA A JZ CKRATE ;LINE AFTER THE FIRST MVI C,02H ;BAD COUNT IS FOUND MVI E,46H CALL 5 CKRATE LDA RATEHI ORA A JZ BAD LDA COUNT ;GET COUNT SUI 1EH ;COUNT WITHIN RANGE? JZ OK BAD MVI A,01H ;SET FLAG TO PRINT FS STA BADFLAG MVI C,09H ;BAD- COUNT IS OUT OF RANGE LXI D,BADMSG ;BAD MESSAGE TO CRT CALL 5 ;BDOS ENTRY JMP KEYBDCK OK MVI C,09H ;OK- COUNT IS WITHIN RANGE LXI D,OKMSG ;OK MESSAGE TO CRT CALL 5 ;BDOS ENTRY KEYBDCK MVI C,0BH ;CHECK FOR CHARACTER FROM KEYBD CALL 5 ;BDOS ENTRY ORA A JNZ 00 ;WARM BOOT IF INPUT FROM KEYBOAR MVI C,02H ;CARRIAGE RETURN LDA CRRET MOV E,A CALL 5 MVI C,02H LDA LNFEED ;LINE FEED MOV E,A CALL 5 MVI A,0 ;SET INTERRUPT SWITCH STA ISW MVI A,08H ;MULT/IO ENABLE INTERRUPT BIT OUT BASE+7 ;ALSO RESELECT GROUP ZERO IN BASE+2 ;CLEAR THE TIMED INTERRUPT EI WAIT JMP WAIT ; ; ; KILTIME MVI C,7FH LOOP2 DCR C JNZ LOOP2 RET ; ; ; BADFLAG: DB 0 RATEHI DB 0 ISW: DB 0 ;INITIALIZE INTERRUPT SWITCH STB1990 EQU 3CH ;1990 STROBE RT1990 EQU 1CH ;1990 TIMED PULSE RATE BADMSG: DB 'XXXXXXXXXXXX1 CLOCK RATE IS OUT OF RANGE XXX$' OKMSG: DB ' **1 CLOCK RATE OK. $' LNFEED: DB 0AH ;LINE FEED CRRET: DB 0DH ;CARRIAGE RETURN COUNT: DS 1 BASE EQU 48H SLNTH EQU 100H ;STACK LENGTH SPTOP: DS SLNTH ;STACK MEMORY SPBASE EQU SLNTH+SPTOP-1 ;BASE OF STACK END