/DEVICE DRIVER FOR THE COMMUNICATIONS PORT OF THE DECMATE II /PROGRAM WILL ENABLE THE TRANSMITION AND RECEPTION OF CHARACTERS /LAST EDIT APRIL 12, 1988 --TED RAPHAN & MARK SMITH /CONTROL CODES CTRLC= 03 /CODE TO HALT EXECUTION /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 RAR= 7010 /ROTATE ACCUMULATOR RIGHT THROUGH LINK SNL= 7420 /SKIP ON NON-ZERO LINK /DEVICE DEFINITIONS DVCOR= 30 DVCOT= 31 DVCOPM= 36 SPRF= DVCOR^10+6000 /SET PORT RECEIVE FLAG KPRF= DVCOR^10+6001 /SKIP ON PORT RECIEVE FLAG AND CLEAR IT KPEI= DVCOR^10+6005 /INTERRUPT ENABLE FOR I/O PORT PRB= DVCOR^10+6006 /TRANSFER THE CONTENTS OF RECEIVE BUFFER /TO AC<4:11> SPTF= DVCOT^10+6000 /SET PORT TRANSMIT FLAG KPTF= DVCOT^10+6001 /SKIP ON PORT TRANSMIT FLAG AND CLEAR IT PTB= DVCOT^10+6006 /TRANSFER AC<4:11> TO TRANMIT BUFFER MCIE= DVCOPM^10+6005 /LOAD MODEM CONTROL INTERRUPT ENABLE ACIR= DVCOPM^10+6006 /ACCESS INTERNAL REGISTERS *0 .-. /STORES RETURN ADDRESS JMP I (INTSER) /JUMP TO INTERRUPT SERVICE ROUTINE AC, .-. /STORAGE FOR ACCUMULATOR MQ, .-. /STORAGE FOR MEMORY QUOTIENT REGISTER FLAGS, .-. /STORAGE FOR FLAGS INPTBF, .-. /INPUT POINTER TO TRANSMIT BUFFER OUPTBF, .-. /OUTPUT POINTER TO TRANSMIT BUFFER INPRBF, .-. /INPUT POINTER TO RECEIVER BUFFER OUPRBF, .-. /OUTPUT POINTER TO RECEIVER BUFFER COUNT, .-. /LOOP COUNTER *200 /INITIALIZATION ROUTINE. /ROUTINE SETS DP278 REGISTERS, SETS UP BUFFERS, AND TURNS ON THE INTERRUPT /FACILITY OF THE MACHINE. START, CAF /CLEAR ALL FLAGS TLS /SET DISPLAY FLAG TAD (0001) /SET AC FOR CONTROL REGISTER 0 /SETTING ALLOWS ACCESS OF CTRL REG 1 ACIR /WRITE TO REGISTER CLA /CLEAR AC TAD (0030) /SET AC FOR CTRL REG 1 /SETTING ENABLES RECEIVER INTERRUPT ACIR /WRITE TO REGISTER CLA /CLEAR AC TAD (0003) /SET AC FOR CONTROL REGISTER 0 /SETTING ALLOWS THE ACCESS OF CONTROL /REGISTER 3 AFTER THE EXECUTION OF ACIR ACIR /WRITE TO REGISTER CLA /CLEAR AC TAD (0301) /SET AC FOR CONTROL REGISTER 3 /SETTING IS FOR 8 DATA BITS FOR /CHARACTERS RECEIVED AND ENABLES THE RECEIVER ACIR /WRITE VALUES TO REGISTER CLA /CLEAR AC TAD (0004) /SET AC FOR CONTROL REGISTER 0 /SETTING ALLOWS THE ACCESS OF CONTROL /REGISTER 4 AFTER THE EXECUTION OF ACIR ACIR /WRITE VALUE TO REGISTER CLA /CLEAR AC TAD (0104) /SET AC FOR CONTROL REGISTER 4 /SETTING IS FOR ASYNCHRONOUS MODE WITH 1 /STOP BIT AND NO PARITY ACIR /WRITE VALUES TO REGISTER CLA /CLEAR AC TAD (0005) /SET AC FOR CONTROL REGISTER 0 /SETTING ALLOWS ACCESS TO CONTROL /REGISTER 5 AFTER THE ACIR INSTRUCTION ACIR /WRITE TO REGISTER CLA /CLEAR AC TAD (0150) /SET AC FOR CONTROL REGISTER 5 /SETTING IS FOR 8 DATA BITS FOR /CHARACTERS TRANSMITED ACIR /WRITE TO REGISTER 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 NL0001 /NUM LOAD 1 KPEI /ENABLE INTERRUPT ION /TURN ON INTERRUPT FACILTY /BACKGROUND PROGRAM ROTATE, NL0001 /SET ONE BIT IN AC<11> ISZ COUNT /ROTATE DELAY INSTRUCTIONS JMP .-1 RAL /ROTATE BIT LEFT 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 KPRF /RECEIVE INTERRUPT SKP /NO: CHECK TRANSMIT JMP RECEIV /YES: SERVICE RECEIVE KPTF /TRANSMIT INTERRUPT? SKP /NO: CHECK KEYBOARD JMP TRSMIT /YES: SERVICE TRANSMIT KSF /KEYBOARD INTERRUPT? SKP /NO: SKIP DISPLAY ROUTINE JUMP JMP I (KEYBRD) /YES SERVICE KEYBOARD JMP I (EXIT) /JUMP 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 I (EXIT) /THEN END OF BUFFER, RETURN TO BACKGROUNDTD 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 PTB /TRANSMIT CHARACTER JMP I (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 PRB /READ CHARACTER RECEIVED INTO AC DCA I INPRBF /STORE CHARACTER IN BUFFER TAD I INPRBF TSF JMP .-1 TLS /SET DISPLAY FLAG JMP I (EXIT) /RETURN TO BACKGROUND PAGE /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 COMPLEMENT TAD (CTRLC) /CHECK IF CHARACTER WAS CONTROL C SNA CLA /IF IT WAS JMP END /END EXECUTION TAD INPTBF /GET INPUT POINTER FOR TRANSMIT BUFFER IAC /INCREMENT IT AND (TMASK) /MASK HIGH ORDER BITS DCA INPTBF /STORE CURRENT POINTER ACL /ELSE RESTORE AC AND CONTINUE DCA I INPTBF /STORE CHARACTER IN BUFFER SPTF /SET 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) /JUMP TO REBOOT