/DEVICE DRIVER FOR THE DP278 COMMUNICATIONS PORT OF THE DECMATE /PROGRAM WILL ENABLE THE TRANSMITION AND RECEPTION OF CHARACTERS /BETWEEN TWO DECMATES /LAST EDIT MAY 18, 1988 -- TED RAPHAN & MARK SMITH /CONTROL CODES CTRLC= 03 /CODE TO EXIT PROGRAM /SYSTEM DEFINITIONS TRSBUF= 7177 /INITIALIZE INPUT POINTER FOR TRANSMIT /BUFFER RECBUF= 2177 /INITIALIZE INPUT POINTER FOR RECEIVE /BUFFER TMASK= 7177 /MASK FOR TRANSMIT BUFFER RMASK= 2177 /MASK FOR RECEIVE BUFFER NL0001= CLA CLL IAC /LOADS A BIT INTO THE ACCUMULATOR ACL= 7701 /CLA MQA /DEVICE DEFINITIONS DVCO0R= 30 DVCO0T= 31 DVCO1R= 34 DVCO1T= 35 DVCOPM= 36 SPRF0= DVCO0R^10+6000 /SET PORT 0 RECEIVE FLAG KPRF0= DVCO0R^10+6001 /SKIP ON PORT 0 RECIEVE FLAG AND CLEAR IT PRIE0= DVCO0R^10+6005 /LOAD PORT 0 INTERRUPT ENABLE PRB0= DVCO0R^10+6006 /READ PORT 0 COMM. DEVICE SPTF0= DVCO0T^10+6000 /SET PORT 0 TRANSMIT FLAG KPTF0= DVCO0T^10+6001 /SKIP ON PORT 0 TRANSMIT FLAG AND CLEAR IT PTIE0= DVCO0T^10+6005 /LOAD PORT 0 TRANSMIT INTERRUPT ENABLE PTB0= DVCO0T^10+6006 /WRITE PORT 0 COMM. DEVICE SPRF1= DVCO1R^10+6000 /SET PORT 1 RECEIVE FLAG KPRF1= DVCO1R^10+6001 /SKIP ON PORT 1 RECEIVE FLAG AND CLEAR IT PRIE1= DVCO1R^10+6005 /LOAD PORT 1 RECEIVE INTERRUPT ENABLE PRB1= DVCO1R^10+6006 /READ PORT 1 COMM. DEVICE SPTF1= DVCO1T^10+6000 /SET PORT 1 TRANSMIT FLAG KPTF1= DVCO1T^10+6001 /SKIP ON PORT 1 TRANSMIT FLAG AND CLEAR IT PTIE1= DVCO1T^10+6005 /LOAD PORT 1 TRANSMIT INTERRUPT ENABLE PTB1= DVCO1T^10+6006 /WRITE PORT 1 COMM. DEVICE SMF= DVCOPM^10+6000 /SET MODEM CHANGE FLAG KMF= DVCOPM^10+6001 /SKIP ON MODEM CHANGE FLAG AND CLEAR IT PCR0= DVCOPM^10+6002 /WRITE PORT 0 CONTROL REGISTER PSR= DVCOPM^10+6003 /READ PORT X STATUS REGISTER PMR= DVCOPM^10+6004 /READ PORT X MODEM REGISTER MCIE= DVCOPM^10+6005 /LOAD MODEM CONTROL INTERRUPT ENABLE PCR1= DVCOPM^10+6006 /WRITE PORT 1 CONTROL REGISTER RACD= DVCOPM^10+6007 /RESET ACTIVE COMMUNICATIONS DEVICE INITNO= 3 /NO ITERATIONS FOR LOOP TO INITIALIZE REGISTERS *0 .-. /STORES RETURN ADDRESS JMP I (INTSER) /JUMP TO INTERRUPT SERVICE ROUTINE *200 /INITIALIZATION ROUTINE. /ROUTINE SETS DP278 REGISTERS, SETS UP BUFFERS, AND TURNS ON THE INTERRUPT /FACILITY OF THE MACHINE. START, CLA CLL /CLEAR AC AND LINK TAD (INITNO) /SET NUMBER OF LOOP ITERATIONS CIA /GET TWO'S COMPLEMENT DCA LOOPCT /INITIALIZE LOOP COUNTER TAD (DATA) /SET UP DATA SPACE DCA DATPTR /INITIALIZE POINTER LOOP, TAD I DATPTR /LOAD DATA TO AC PTB0 /WRITE TO REGISTER ISZ DATPTR /INCREMENT POINTER ISZ LOOPCT /CHECK LOOP JMP LOOP /GET NEXT DATA ITEM TAD (0000) /SET AC TO READ RECEIVE HOLDING REGISTER PRB0 /DUMMY READ TO CLEAR REGISTER SPTF0 /SET PORT 0 TRANSMIT FLAG CLA /CLEAR ACCUMULATOR TLS /SET DISPLAY FLAG CLA /CLEAR ACCUMULATOR TAD (TRSBUF) DCA INPTBF /SET INPUT POINTER FOR TRANSMIT BUFFER TAD (TRSBUF) DCA OUPTBF /SET OUTPUT POINTER FOR TRANSMIT BUFFER TAD (RECBUF) DCA INPRBF /SET INPUT POINTER FOR RECEIVE BUFFER TAD (RECBUF) DCA OUPRBF /SET OUTPUT POINTER FOR RECEIVE BUFFER ION /TURN ON INTERRUPT FACILTY /BACKGROUND PROGRAM ROTATE, NL0001 /SET ONE BIT IN AC ISZ COUNT /ROTATE DELAY INSTRUCTIONS JMP .-1 ISZ COUNT JMP .-1 RAL /ROTATE LEFT BIT JMP ROTATE+1 /EXECUTE DELAY INSTRUCTIONS /INTERRUPT SERVICE ROUTINE INTSER, DCA AC /SAVE ACCUMULATOR MQA DCA MQ /SAVE MEMORY QUOTIENT REGISTER GTF DCA FLAGS /SAVE FLAGS TSF /DISPLAY INTERRUPT? SKP /NO: CHECK TRANMIT JMP DISPL /YES: SERVICE DISPLAY KPTF0 /PORT 0 TRANSMIT INTERRUPT? SKP /NO: CHECK RECEIVE JMP TRSMIT /YES: SERVICE TRANSMIT KPRF0 /PORT 0 RECEIVE INTERRUPT? SKP /NO: CHECK KEYBOARD JMP RECEIV /YES: SERVICE RECEIVE KSF /KEYBOARD INTERRUPT? SKP /NO: SKIP DISPLAY ROUTINE JUMP JMP KEYBRD /YES: SERVICE KEYBOARD JMP EXIT /JUMP TO BACKGROUND /DISPLAY SERVICE ROUTINE DISPL, TAD OUPRBF /GET OUTPUT POINTER FOR RECEIVE BUFFER CIA /TAKE TWO'S COMPLEMENT TAD INPRBF /TEST IF OUPRBF = INPRBF SNA CLA /IF EQUAL JMP EXIT /THEN END OF BUFFER, RETURN TO BACKGROUND TAD OUPRBF /ELSE GET OUTPUT POINTER AGAIN IAC /INCREMENT IT AND (RMASK) /MASK OFF HIGH ORDER BITS DCA OUPRBF /STORE IT TAD I OUPRBF /GET CHARACTER FOR DISPLAY TLS /DISPLAY TO SCREEN JMP EXIT /RETURN TO BACKGROUND /TRANSMIT SERVICE ROUTINE TRSMIT, TAD OUPTBF /GET OUTPUT POINTER FOR TRANSMIT BUFFER CIA /TAKE TWO'S COMPLEMENT TAD INPTBF /TEST IF OUPTBF = INPTBF SNA CLA /IF EQUAL JMP EXIT /THEN END OF BUFFER, RETURN TO BACKGROUND TAD OUPTBF /ELSE GET OUTPUT POINTER AGAIN IAC /INCREMENT IT AND (TMASK) /MASK OFF HIGH ORDER BITS DCA OUPTBF /STORE IT TAD I OUPTBF /GET CHARACTER TO SEND TAD (0400) /SET AC TO SEND PTB0 /TRANSMIT CHARACTER JMP EXIT /RETURN TO BACKGROUND /RECEIVE SERVICE ROUTINE RECEIV, TAD INPRBF /GET INPUT POINTER FOR RECEIVE BUFFER IAC /INCREMENT IT AND (RMASK) /MASK OFF HIGH ORDER BITS DCA INPRBF /STORE CURRENT POINTER PRB0 /READ CHARACTER RECEIVED INTO AC DCA I INPRBF /STORE IN BUFFER TLS /SET DISPLAY FLAG JMP EXIT /RETURN TO BACKGROUND /KEYBOARD SERVICE ROUTINE KEYBRD, KRB /READ CHARACTER AND (177) /MASK HIGH ORDER BITS MQL /SAVE AC IN MQ ACL /RESTORE AC CIA /TAKE TWO'S COMPLIMENT TAD (CTRLC) /CHECK IF CHARACTER WAS CONTROL C SNA CLA /IF IT WAS JMP END /THEN END PROGRAM TAD INPTBF /GET INPUT POINTER FOR TRANSMIT BUFFER IAC /INCREMENT IT AND (TMASK) /MASK HIGH ORDER BITS DCA INPTBF /STORE CURRENT POINTER ACL /RESTORE CHARACTER TO AC DCA I INPTBF /STORE CHARACTER IN BUFFER SPTF0 /SET PORT 0 TRANSMIT FLAG JMP EXIT /RETURN TO BACKGROUND /ROUTINE FOR RETURNING TO BACKGROUND PROGRAM EXIT, TAD MQ /RESTORE MEMORY QUOTIENT REGISTER MQL TAD FLAGS /RESTORE FLAGS RTF TAD AC /RESTORE ACCUMULATOR JMP I 0 /0 CONTAINS RETURN ADDRESS END, JMP I (7600) /BOOT STRAP DATA, 2516 /INITIAL VALUE FOR MODE REGISTER 1 2467 /INITIAL VALUE FOR MODE REGISTER 2 3405 /INITIAL VALUE FOR COMMAND REGISTER DATPTR, .-. /INITIALIZE POINTER TO DATA LOOPCT, .-. /INTIALIZE LOOP COUNTER AC, .-. /STORAGE FOR ACCUMULATOR MQ, .-. /STORAGE FOR MEMORY QUOTIENT REGISTER FLAGS, .-. /STORAGE FOR FLAGS COUNT, .-. INPTBF, .-. OUPTBF, .-. INPRBF, .-. OUPRBF, .-.