TITLE : TURBODOS T-41 COMM DRIVER : SUBTTL REVISION 01.01 01/24/85 NAME ('T41COM') ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; PROGRAM: T41COM (MASTER PROCESSOR COMM) ; ; AUTHOR: ROGER D. LANGE ; ; DATE WRITTEN: 11/21/84 ; ; ; ; REV 00.01: 11/25/84 RDL ; ; REV 00.02: 11/25/84 RDL ; ; REV 00.03: 11/28/84 RDL ; ; REV 00.04: 12/12/84 RDL ADDED LOOP ON INPUT POLL; ; REV 01.00: 01/24/85 RDL RELEASE 01.00 ; ; ; ; REV 01.01: 01/24/85 RDL ADDED BAUD RATE RETURN ; ; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ENTRY USRFCN, COMNIT EXTRN LNKLCP, WAIT, SIGNAL ; MODDAT EQU 0F6H ;MODEM DATA PORT MODCTL EQU 0F7H ;MODEM CONTROL PORT MBAUD EQU 0F9H ;MODEM BAUD RATE PORT ; MASKR EQU 001H ;MASK FOR RECEIVE STATUS RBIT EQU 001H ;VALUE FOR RECEIVE READY ; MASKS EQU 004H ;MASK FOR SEND STATUS SBIT EQU 004H ;VALUE FOR SEND READY ; $EJECT ; ; ; PERFORM COLD START INITIALIZATIONS ; COMMON /?INIT?/ ; COMNIT: LXI H,NPSTRG ;INIT THE DART LXI B, 11 SHL 8 + MODCTL ;OUT 11 BUTES TO MODEM CTL PORT .Z80 OTIR .8080 ; MVI A,1 ;SET 300 BAUD CALL NEWBD ; LXI D,COMPOL ;LINK THE PORT POLLER JMP LNKLCP ; THEN RETURN ; NPSTRG: DB 18H, 2, 0, 14H, 4CH, 3, 0C1H, 5, 0EAH, 11H, 0 ; $EJECT ; ; ; PROCESS THE T-41 CALL ; CSEG ; USRFCN: PUSH H ;MUTEX PUSH D PUSH B LXI H,COMMTX CALL WAIT POP B POP D POP H ; MOV A,H ;CHECK FUNCTION CODE ORA A JM RETBAD CPI FNMAX JNC RETBAD ; ADD A ;LOOKUP FUNCTION ADDRESS MOV L,A MVI H,0 PUSH D LXI D,FNTABL DAD D MOV E,M INX H MOV D,M XCHG POP D PCHL ; FNTABL: DW SIGNON ;FN 0 SIGN-ON & SET MODEM LOCKOUT DW SGNOFF ;FN 1 SIGN-OFF & RELEASE LOCKOUT DW XIBUF ;FN 2 XFER INPUT BUF TO CALLER DW XOCHAR ;FN 3 XFER ONE OUTPUT CHAR DW RETBAD ;FN 4 CURRENTLY UNIMPLEMENTED DW RETBAD ;FN 5 CURRENTLY UNIMPLEMENTED DW RETBAD ;FN 6 CURRENTLY UNIMPLEMENTED DW RETBAD ;FN 7 CURRENTLY UNIMPLEMENTED DW RETBAD ;FN 8 CURRENTLY UNIMPLEMENTED DW RETBAD ;FN 9 CURRENTLY UNIMPLEMENTED DW SETBD ;FN 10 SET BAUD RATE DW BDRTRN ;FN 11 RETURN CURRENT BAUD RATE ; FNMAX EQU ($-FNTABL)/2 ; $EJECT ; ; ; SIGNON, SIGNOFF, & LOCKOUT ; SIGNON: LDA SOUSER ;CHECK CURRENT USER ORA A .Z80 JR Z,SETLOK ;NO CURRENT USER CP E ;CHECK IF RE-LOCKING CURRENT USER JR NZ,RETBAD ;JUMP IF DIFFERENT USER JR T41RET ;JUMP TO RETURN RE-LOG .8080 ; SETLOK: MOV A,E ;LOG-IN THE REQUESTED USER STA SOUSER .Z80 JR RETOK .8080 ; SGNOFF: XRA A ;RELEASE THE LOCK STA SOUSER .Z80 JR RETOK .8080 ; $EJECT ; ; ; XFER THE INPUT BUFFER TO THE CALLER ; XIBUF: MOV D,B ;SET UP REGISTERS FOR XFER MOV E,C LXI H,INPBUF LXI B,80H DI ;PREVENT BUFFER UPDATE DURING XFER .Z80 LDIR .8080 XRA A ;EMPTY THE BUFFER STA INPBUF EI .Z80 JR RETOK .8080 ; $EJECT ; ; ; XFER ONE CHAR TO THE OUTPUT, WAITING IF NECESSARY ; XOCHAR: DI ;PREVENT OUTPUT DURING CHECK LDA OUTCHR ;CHECK IF PREV CHAR WAITING ORA A .Z80 JR Z,XOCHA1 .8080 ; MVI A,0FFH ;SET WAIT FLAG FOR POLLER STA XOFLAG EI PUSH D ;WAIT FOR PREV CHAR OUTPUT LXI H,XOSM4 CALL WAIT POP D ; XOCHA1: EI IN MODCTL ;CHECK IF OUTPUT READY ANI MASKS CPI SBIT MOV A,E .Z80 JR NZ,XOCHA2 ;JUMP IF OUTPUT NOT READY OUT (MODDAT),A ;OUTPUT THE CHAR JR RETOK ; XOCHA2: LD (OUTCHR),A ;LEAVE THE CHAR FOR THE POLLER JR RETOK .8080 ; $EJECT ; ; ; SET BAUD RATE ; SETBD: MOV A,E ;CHECK IF BAUD OK ORA A .Z80 JR Z,RETBAD JP M,RETBAD CP 8 JR NC,RETBAD CALL NEWBD JR RETOK .8080 ; NEWBD: STA BAUD ;SAVE THE NEW VALUE ADD A ;DEVELOP POINTER TO TABLE MOV E,A MVI D,0 LXI H,BTABL-2 DAD D ; LXI B, 2 SHL 8 + MBAUD ;OUT 2 BYTES TO MODEM BAUD PORT .Z80 OTIR .8080 RET ; BTABL: DB 07H,4EH ; 300 BAUD DB 07H,34H ; 450 BAUD DB 07H,27H ; 600 BAUD DB 07H,21H ; 710 BAUD DB 47H,9CH ;1200 BAUD DB 47H,4EH ;2400 BAUD DB 47H,27H ;4800 BAUD ; BDRTRN: LDA BAUD ;RETURN CURRENT BAUD RATE .Z80 JR T41RET .8080 ; $EJECT ; ; ; T-41 RETURNS ; RETBAD: XRA A ;RETURN ERROR RESULT .Z80 JR T41RET .8080 ; RETOK: MVI A,0FFH ;RETURN SUCCESSFUL RESULT ; T41RET: PUSH H ;RELEASE MUTEX PUSH D ; THEN RETURN PUSH B PUSH PSW LXI H,COMMTX CALL SIGNAL POP PSW POP B POP D POP H RET ; $EJECT ; ; ; POLL THE PORT ; COMPOL: DW 0 ;LINKAGE LIST HEAD DW 0 ; INPOL: IN MODCTL ;CHECK IF CHARACTER WAITING ANI MASKR CPI RBIT .Z80 JR NZ,CHKOUT ;IF NO INPUT CHAR, GO CHK OUTP .8080 ; IN MODDAT ;GET THE INPUT CHARACTER MOV C,A ;HOLD ONTO THE CHAR IN REG. C ; LDA INPBUF ;GET BUFFER COUNT INR A ;TEST BUFFER FULL CPI 80H .Z80 JR C,BUFOK ;JUMP IF BUF NOT FULL .8080 MVI A,1 ;EMPTY BUF IF FULL ; BUFOK: STA INPBUF ;SAVE THE INCREMENTED BUF COUNT MOV E,A MVI D,0 LXI H,INPBUF DAD D MOV M,C ;STORE THE CHAR IN THE BUF ; .Z80 JR INPOL ;CHECK IF ANOTHER CHAR READY .8080 ; CHKOUT: LDA OUTCHR ;CHECK FOR OUTP CHAR WAITING ORA A RZ ;WE'S DONE IF NO CHAR ; IN MODCTL ;CHECK IF OUTPUT READY ANI MASKS CPI SBIT RNZ ; LDA OUTCHR ;OUTPUT THE CHAR OUT MODDAT XRA A ;CLEAR THE BYTE STA OUTCHR LDA XOFLAG ;CHECK IF DRIVER WAITING ORA A RZ XRA A ;CLEAR WAIT FLAG STA XOFLAG LXI H,XOSM4 JMP SIGNAL ; $EJECT ; ; ; STORAGE ; DSEG ; COMMTX: DW 1 ;DRIVER MUTEX SEMAPHORE DW COMMTX+2 DW COMMTX+2 ; OUTCHR: DB 0 ;STG FOR OUTPUT CHAR XOFLAG: DB 0 ;FLAG FOR DRIVER WAITING FOR OUTPUT ; XOSM4: DW 0 ;XO DRIVER WAITING SEMAPHORE DW XOSM4+2 DW XOSM4+2 ; ; ; BAUD RATE STORAGE ; 1=300, 2=450, 3=600, 4=710, 5=1200, 6=2400, 7=4800 ; BAUD: DB 1 ;SET AT 300 INITIALLY ; ; ; INPUT STORAGE BUFFER ; INPBUF: DB 0 ;BUFFER CHAR COUNT DS 7FH ; SOUSER: DB 0 ;USER # OF CURRENTLY SIGNED-ON USER ; ; ; THAT'S ALL, FOLKS! ; END