TITLE 'ROM BASED I/O-IOBYTE-MODEM-PRINTER' ; BASIC INPUT/OUTPUT OPERATING SYSTEM ; IOBYTE PRINTER SYSTEM IN ROM ; MODIFIED BY RICHARD L BERG ; MAY 14,1980 ; ; THIS MODULE CONTAINS ALL THE INPUT/OUTPUT ; ROUTINES FOR THE CP/M SYSTEM. ; TTYS EQU 2 ;TTY STATUS PORT. TTYC EQU 2 ;TTY COMMAND PORT. TTYD EQU 3 ;TTY DATA PORT. TTYDA EQU 01H ;TTY READY BIT. TTYBE EQU 80H ;TTY OUTPUT RDY BIT. CRTS EQU 00H ;CRT STATUS PORT. CRTC EQU 00H ;CRT CONTROL PORT CRTD EQU 01H ;CRT DATA PORT. CRTDA EQU 01H ;CRT READY BIT. CRTBE EQU 80H ;CRT OUTPUT RDY BIT. PTRS EQU 4 ;PAPER TAPE STATUS PORT PTRDA EQU 01H ;PTR READY BIT. PTRD EQU 5 ;PTR DATA PORT. PTPS EQU 4 ;PTP STATUS PORT PTPBE EQU 80H ;PTP OUTPUT RDY BIT. PTPD EQU 1 ;PTP DATA PORT. LPTS EQU 10H ;LINE PRINTER STATUS PORT LPTBE EQU 0C0H ;LINE PRINTER OUTPUT RDY BIT. LPTD EQU 11H ;LINE PRINTER DATA PORT. IOBYT EQU 0003H ;I/O CONTROL BYTE ROM EQU 0F800H ;START OF ROM I/O SYSTEM MONITOR EQU 0E400H ;START OF K6HIJ/SBMS MONITOR ; ; I/O JUMP VECTOR ; THIS IS WHERE CPM CALLS WHENEVER IT NEEDS ; TO DO ANY INPUT/OUTPUT OPERATION. ; USER PROGRAMS MAY USE THESE ENTRY POINTS ; ALSO, BUT NOTE THAT THE LOCATION OF THIS ; VECTOR CHANGES WITH THE MEMORY SIZE. ; NOTE THAT THIS TABLE IS COMPATABLE WITH INTEL'S ; MDS MONITOR AND IS LOCATED AT THE SAME MEMORY ; LOCATION ; ORG ROM @BEGIN JMP MONITOR ;GO TO K6HIJ/SBMS MONITOR @CONIN JMP CONIN ;GET CHARACTER FROM CONSOLE @READER JMP READER ;GET CHARACTER FROM READER @CONOT JMP CONOT ;WRITE CHARACTER TO CONSOLE @PUNCH JMP PUNCH ;PUNCH A CHARACTER @LIST JMP LIST ;WRITE CHARACTER TO LIST DEVICE @CONST JMP CONST ;CHECK FOR TTY CHAR READY. ; ; *** END OF INTEL TABLE COMPATABILITY *** ; @PRSTAT JMP PRSTAT ;SAMPLE PRINTER STATUS @PMSG JMP PMSG ;PRINT MSG HANDLER. @ERROR JMP ERROR ;PRINT ERROR MESSAGE ; ; MESSAGE EQUILIVANT VALUES (COMMENTED OUT-NOT NEEDED) ; ;@NRMSG EQU NRMSG ;@RNMSG EQU RNMSG ;@CRCMSG EQU CRCMSG ;@LDMSG EQU LDMSG ;@BSYMSG EQU BSYMSG ;@WPMSG EQU WPMSG ;@WFMSG EQU WFMSG ;@ERRMSG EQU ERRMSG ;@RDMSG EQU RDMSG ;@WTMSG EQU WTMSG ;@BTMSG EQU BTMSG ;@SKMSG EQU SKMSG ;@HEMSG EQU HEMSG ;@MNTMSG EQU MNTMSG ;@RDRMSG EQU RDMSG ;*********************************************** ; ; PERIPHERAL I/0 DRIVERS ; ;*********************************************** ; ; CONSOLE STATUS ; CONST: CALL CONS ;GET DEVICE STATUS MVI A,0 ;SET FLAGS RNZ ;ZERO IF NO CHAR AVAIL CMA ;FF IF CHAR OK RET CONS: LDA IOBYT ;GET IOBYT CALL IOCAL ;EXIT TO SELECTED ROUTINE DW TTYST ;TELETYPE STATUS ROUTINE DW CRTST ;CRT STATUS ROUTINE DW BATCH ;BATCH ROUTINE READER/LISTER DW CRTST ;USED FOR MODEM DRIVER ROUTINE ; ; CONSOLE INPUT ; CONIN: LDA IOBYT ;GET IOBYT CALL IOCAL ;EXIT TO SELECTED ROUTINE DW TTYIN ;TTY INPUT ROUTINE DW CRTIN ;CRT INPUT ROUTINE DW READER ;BATCH MODE DW UC1IN ;MODEM DRIVER ; ; CONSOLE OUTPUT ; CONOT: LDA IOBYT ;GET IOBYT CALL IOCAL ;EXIT TO SELECTED ROUTINE DW TTYOUT ;TTY OUTPUT ROUTINE DW CRTOUT ;CRT OUTPUT ROUTINE DW LIST ;BATCH MODE DW CRTOUT ;USER-DEFINED OUTPUT ROUTINE ; ; READER INPUT ; READER: LDA IOBYT ;GET IOBYT RRC ;SHIFT BITS RRC CALL IOCAL ;EXIT TO SELECTED ROUTINE DW TTYIN ;TTY INPUT ROUTINE DW PTRIN ;PAPER TAPE READER INPUT ROUTINE DW UR1IN ;MODEM INPUT ROUTINE DW UR2IN ;USER-DEFINED READER #2 ; ; PUNCH OUTPUT ; PUNCH: LDA IOBYT ;GET IOBYT RRC RRC ;SHIFT BITS RRC RRC CALL IOCAL ;EXIT TO SELECTED ROUTINE DW TTYOUT ;TTY OUTPUT ROUTINE DW PTPOUT ;PAPER TAPE PUNCH OUTPUT ROUTINE DW UP1OUT ;USER-DEFINED PUNCH #1 DW UP2OUT ;USER-DEFINED PUNCH #2 ; ; PRINTER STATUS ; PRSTAT: CALL PRS ;GET PRINTER STATUS MVI A,0 ;SET FLAGS RNZ ;ZERO IF NO CHAR AVAIL CMA ;FF IF CHAR OK RET PRS: LDA IOBYT ;GET IOBYT RLC ;SHIFT BITS RLC CALL IOCAL ;EXIT TO OUTPUT ROUTINE DW TTYST ;TELETYPE STATUS ROUTINE DW CRTST ;CRT STATUS ROUTINE DW PSTAT ;PRINTER STATUS ROUTINE DW UL1ST ;USER-DEFINED STATUS ROUTINE ; ; LISTING OUTPUT ; LIST: LDA IOBYT ;GET IOBYT RLC ;SHIFT BITS RLC CALL IOCAL ;EXIT TO SELECTED ROUTINE DW TTYOUT ;TTY OUTPUT ROUTINE DW CRTOUT ;CRT OUTPUT ROUTINE DW LPTOUT ;LINE PRINTER OUTPUT ROUTINE DW UL1OUT ;USER-DEFINED LIST OUTPUT ROUTINE ;******************************************************** ; ; I/O DISPATCHER ; ;******************************************************** IOCAL: RLC ;SHIFT BITS ANI 06H ;MASK BITS XTHL ;SAVE HL, GET TABLE ADDRESS PUSH D ;SAVE DE MOV E,A ;GET SELECTION VALUE IN A MVI D,0 DAD D ;CALCULATE TABLE ENTRY ADDRESS MOV A,M ;GET TABLE ENTRY INX H MOV H,M MOV L,A ;INTO HL POP D ;RESTORE DE XTHL ;PUT EXIT ADDR ON STACK, RESTORE RET ;EXIT TO ROUTINE ;**************************************************** ; ; PHYSICAL I/O ROUTINES ; ;**************************************************** TTYST: IN TTYS ;READ TTY STATUS ANI TTYDA ;TSET FOR TTY DATA AVAIL. RET ;EXIT WITH ZERO IF NOT AVAIL TTYIN: CALL TTYST ;TEST FOR CAR AVAIL JNZ TTYIN ;NOT YET, WAIT IN TTYD ;GET DATA ANI 7FH ;STRIP PARITY RET TTYOUT: IN TTYS ;GET TTY STATUS ANI TTYBE ;TEST FOR XMIT BUFFER EMPTY JNZ TTYOUT ;WAIT TIL READY MOV A,C ;GET OUTPUT CHAR OUT TTYD ;OUTPUT CHAR RET CRTST: IN CRTS ANI CRTDA ;TEST FOR TTY DATA AVAIL. RET CRTIN: CALL CRTST ;TEST FOR CHAR AVAIL JNZ CRTIN ;NOT YET, WAIT IN CRTD ;GET DATA ANI 7FH ;STRIP PARITY RET CRTOUT: IN CRTS ;GET CRT STATUS ANI CRTBE ;TEST FOR XMIT BUFFER EMPTY JNZ CRTOUT ;WAIT TIL READY MOV A,C ;GET OUTPUT CHAR OUT CRTD ;OUTPUT CHAR RET PTRIN: IN PTRS ;GET PTR STATUS ANI PTRDA ;TEST FOR PTR DATA AVAIL. JNZ PTRIN ;NOT YET, WAIT IN PTRD ;GET DATA ANI 7FH ;STRIP PARITY MOV C,A CALL CONOT ;WRITE IT TO CONCOLE RET PTPOUT: IN PTPS ;GET PTP STATUS ANI PTPBE ;TEST FOR XMIT BUFFER EMPTY JNZ PTPOUT ;WAIT TIL READY MOV A,C ;GET OUTPUT CHAR OUT PTPD ;OUTPUT CHAR RET PSTAT: IN LPTS ;GET LPT STATUS ANI LPTBE ;TEST FOR BUFFER EMPTY RET ;EXIT WITH ZERO IF NOT AVAIL LPTOUT: CALL PSTAT ;TEST FOR CAR AVAIL JNZ LPTOUT ;WAIT TIL READY MOV A,C ;GET OUTPUT CHAR OUT LPTD ;OUTPUT CHAR RET ; ; ERROR REPORTING ROUTINE...CALL WITH ERROR IN ; 'C' REGISTER...PRINTS APPROPRIATE MESSAGE ON ; CONSOLE. ; ERROR: RET ;THIS IS NOT IMPLEMENTED YET! ; ; MODEM DRIVER TO USE CP/M ; AS A TIME-SHARE TERMINAL UC1IN: CALL CRTST ;CHARACTER ON CRT? JNZ UC1A ;NO-CHECK MODEM CALL CRTIN ;YES-GET IT RET ;RETURN UC1A CALL TTYST ;CHARACTER ON MODEM? JNZ UC1IN ;NO-LOOP BACK CALL TTYIN ;YES-GET IT MOV C,A ;GET READY TO OUTPUT CALL CRTOUT ;PRINT ON CRT JMP UC1IN ;CHECK FOR MORE UC1ST: LXI H,RDRMSG CALL PMSG MVI A,1AH ;SET A=CTL-Z (EOF) RET UC1OUT: JMP UC1ST ; MODEM DRIVER TO TRANSFER INFORMATION ; FROM MODEM TO CP/M DISK FILE ; ECHOS TO SYSTEM CONSOLE ; ECHOS ANYTHEING TYPED ON SYSTEM CONSOLE ; TO THE MODEM EXEPT A CONTROL Z ; WHICH IS SENT TO CP/M UR1IN: CALL TTYST ;CHARACTER ON MODEM? JNZ UR1A ;NO-CHECK CONSOLE CALL TTYIN ;YES-GET IT CPI 0 ;IS IT A NULL? JZ UR1IN ;YES-FORGET IT CPI 07FH ;IS IT A RUBOUT? JZ UR1IN ;YES-FORGET IT MOV C,A ;GET READY TO OUTPUT CALL CRTOUT ;PRINT ON CRT MOV A,C ;KEEP CP/M STRAIGHT RET ;RETURN UR1A: CALL CRTST ;CHARACTER ON CRT? JNZ UR1IN ;NO-CHECK MODEM CALL CRTIN ;YES-GET IT CPI 01AH ;IS IT A CONTROL Z? RZ ;YES-RETURN MOV C,A ;NO-GET READY TO OUTPUT CALL CRTOUT ;PRINT ON SYSTEM CONSOLE CALL TTYOUT ;TRANSMIT OVER MODEM JMP UR1IN ;DO IT ALL AGAIN UR2IN: JMP UC1ST UP1OUT: JMP UC1ST UP2OUT: JMP UC1ST UL1OUT: JMP UC1ST UL1ST: JMP UC1ST BATCH JMP UC1ST ; ; PRINT THE MESSAGE AT H&L UNTIL A ZERO. ; PMSG: MOV A,M ;GET A CHARACTER. ORA A ;IF IT'S ZERO, RZ ;RETURN. MOV C,A ;OTHERWISE, CALL CONOT ;PRINT IT. INX H ;INCREMENT H&L, JMP PMSG ;AND GET ANOTHER. ; ; CBIOS MESSAGES ; NRMSG: DB 'NOT READY ',0 RNMSG: DB 'RECORD NOT FOUND ',0 CRCMSG: DB 'CRC ',0 LDMSG: DB 'LOST DATA ',0 BSYMSG: DB 'BUSY ',0 WPMSG: DB 'PROTECT ',0 WFMSG: DB 'FAULT ',0 ERRMSG: DB 'ERROR.',0 RDMSG: DB 0DH,0AH,'READ ',0 WTMSG: DB 0DH,0AH,'WRITE ',0 BTMSG: DB 0DH,0AH,'WARM BOOT ERROR',0 SKMSG: DB 0DH,0AH,'SEEK ',0 HEMSG: DB 0DH,0AH,'HOME ',0 MNTMSG: DB 0DH,0AH,'MOUNT ',0 RDRMSG: DB 0DH,0AH,'USER-DEFINED NOT AVAILABLE',0 END