;------------------------------------------------------------------------------ ; ; "HITE" Hardware Dependant Code Module for "2651" Family UARTS ; ; Version 1.0 , March 10, 1982 - By Software Tools ; ;------------------------------------------------------------------------------ ; ; By Bill Bolton ; Software Tools, ; P.O. Box 80, ; Newport Beach, ; NSW, 2106 ; AUSTRALIA ; TITLE '2651 UART Interface for HITE, Software Tools' ; ;DESCRIPTION: ; ; This code is generally applicable to any 2561 based port. Conditional ; assembly options are available for bank selected type ports such as ; found on the Godbout Interfacer 3 IEEE-696 card. The code has been ; extensively tested on both Godbout System Support and Interfacer 3 ; Cards. The code as presented here is set up for assembly with the ; MAC or MACRO-80 assemblers. If you wish to assemble it with ASM the ; 'TITLE' line must be removed and the 'hexnum' macro must be eliminated ; and the port numbers in the signon message must be expanded by hand ; (i.e. you'll have to plug the ASCII values for the port addresses ; into the message yourself). ; ; See the additional notes near the INIT, EXIT and HEXNUM routines. ; ;************************************************ ;* * ;* Miscellaneous Equates * ;* * ;************************************************ ; TRUE EQU 0FFFFH FALSE EQU NOT TRUE BDOS EQU 0005 ;CP/M BDOS entry point ALF EQU 0AH ;ASCII line feed ACR EQU 0DH ;ASCII carriage return ; ;************************************************ ;* * ;* 2651 Baud Rate Table * ;* * ;************************************************ ; B50 EQU 0000B ;50 bps B75 EQU 0001B ;75 bps B110 EQU 0010B ;110 bps B134 EQU 0011B ;134.5 bps B150 EQU 0100B ;150 bps B300 EQU 0101B ;300 bps B600 EQU 0110B ;600 bps B1200 EQU 0111B ;1200 bps B1800 EQU 1000B ;1800 bps B2000 EQU 1001B ;2000 bps B2400 EQU 1010B ;2400 bps B3600 EQU 1011B ;3600 bps B4800 EQU 1100B ;4800 bps B7200 EQU 1101B ;7200 bps B9600 EQU 1110B ;9600 bps B19200 EQU 1111B ;19200 bps ; ;************************************************ ;* * ;* 2651 Equates * ;* * ;************************************************ ; BASE EQU 5CH ;UART base register DATA EQU BASE+0 ;Data port STATUS EQU BASE+1 ;Status port MODE EQU BASE+2 ;Mode register CMMD EQU BASE+3 ;Command register USER EQU BASE+7 ;User select port UNUM EQU 6 ;Modem user number MODE1 EQU 01101110B ;Asynch,16x,8 data bits, ; no parity, even, 1 stop bit MODE2 EQU 01110000B + B300 ;Baud rate CMMDB EQU 00100111B ;Tx enabled, RX enabled, no break ; DTR high, RTS high ERESET EQU CMMDB+8 ;Error reset ; SYSSPT EQU TRUE ;True for Godbout system support INTER3 EQU NOT SYSSPT ;True for Godbout Interfacer 3 ; ; ;------------------------------------------------------------------------------ ; ORG 108H SDRIVE: DB 0 ;SET NON-ZERO FOR SINGLE DRIVE SITE. BEEP: DB 0 ;SET NON-ZERO TO BEEP WHEN DONE. TIMEOUT: DB 6 ;COUNT-DOWN VALUE FOR TIMEOUT (ABOUT 30 SECS.) ;WITH A 4MHZ Z80, 1 = 5 SEC. (SORT OF). ; HENCE ZERO = 21.25 MINUTES. ;THE SELECTED VALUE IS A TRADE-OFF, SINCE A LOW ;VALUE MAY TIME-OUT WHILE THE RECEIVER IS ;WRITING TO DISC (WHICH DOES NO HARM BUT CLOGGS ;UP THE SCREEN WITH DISPLAYS) AND A HIGH VALUE ;CAUSES THE KEYBOARD TH BE CHECKED LESS OFTEN. ; ;------------------------------------------------------------------------------ ; ; HINIT: JMP INIT ;UART/USART INITIALATION ENTRY POINT HEXIT: JMP EXIT ;SPECIAL USER EXIT ROUTINE HSTAT: JMP STAT ;STATUS PORT READ ENTRY POINT HRES: JMP RES ;UART/USART ERROR RESET ENTRY POINT HRX: JMP RX ;READ DATA PORT ENTRY POINT HTX: JMP TX ;WRITE DATA PORT ENTRY POINT ; ; ;------------------------------------------------------------------------------ ; THIS IS THE UART/USART INITIALISATION ROUTINE. ; TO ENSURE COMPATIBILITY WITH OTHER USERS, THE ; FOLLOWING STANDARD IS RECCOMENDED : ; 1. USE 1 STOP BIT (OPTIONAL - 2) ; 2. USE 8 DATA BITS (MANDATORY) ; 3. USE 1 START BIT (MANDATORY) ; 4. USE ASYNC MODE ONLY (MANDATORY) ; ; For the 2651, the UART operating parameters ; (which are under software control) are read and stored. ; On exit from HITE these entry paramters will be ; restored to the UART. This allows HITE to ; transparently use different UART parameters from ; other programs that may utilise the port. ; INIT: if inter3 MVI A,UNUM OUT USER ;Select UART endif ;inter3 IN MODE ;Get first mode byte from entry format STA SMODE1 ;Save for exit IN MODE ;Get second mode byte STA SMODE2 ;Save for exit IN CMMD ;Get command byte STA SCMMDB ;Save for exit INIT1: MVI A,MODE1 ;Put first mode word for HITE format OUT MODE MVI A,MODE2 ;Put second mode word OUT MODE MVI A,CMMDB ;Put command byte OUT CMMD SIGNON: LXI D,MESSGE ;Message is at the end of this module MVI C,9 ;BDOS display string command JMP BDOS ;Announce version to user and return ;to HITE via BDOS RET instruction ; SMODE1 DB 0 ;Storage for first entry mode byte SMODE2 DB 0 ;Storage for second entry mode word SCMMDB DB 0 ;Storage for entry command byte ; ;------------------------------------------------------------------------------ ; THIS SECTION IS INCLUDED FOR ANY "SPECIAL" USER ; EXIT CODE. (EG. RESTORING INTERRUPT VECTORS). ; IF UNUSED, A IS THE ONLY CODE NEEDED. ; AS THIS IS THE LAST ROUTINE OBEYED BEFORE THE TEST ; FOR "SINGLE DRIVE SITES" IS MADE, NO REGISTERS NEED ; TO BE PRESERVED. ; ; ; For the 2651, the UART operating parameters ; (entry parameters) will be restored to the UART. ; This allows HITE to transparently use different ; UART parameters from other programs that may utilise ; the port. This is particularly handy if the same ; port has to double for another function such as a ; printer port etc. It is also useful if a dedicated ; communications port must use different parameters ; (i.e number of stop bits) when communicating with ; a variety of other computers in text or binary ; modes. ; EXIT: LDA SMODE1 ;Get first mode byte of entry format OUT MODE LDA SMODE2 ;Get second mode byte of entry format OUT MODE LDA SCMMDB ;Get command byte of entry format JMP RES ;Do an error reset ; ; ;------------------------------------------------------------------------------ ; THIS IS THE STATUS READ PORT ROUTINE. ; IT MUST EMULATE THE STATUS BITS FOR ; AN 8251 USART. I.E. ; ; BIT 00 SET IF TRANSMITTER READY ; BIT 01 SET IF RECEIVER READY ; BIT 02 SET IF TRANSMITTER EMPTY ; BIT 03 SET IF PARITY ERROR ; BIT 04 SET IF OVERRUN ERROR ; BIT 05 SET IF FRAMING ERROR ; BITS 06 AND 07 RESET (I.E. 0) ; ; *** NOTE: ONLY THE "A" REGISTER SHOULD BE ALTERED. *** ; ; STAT: if inter3 MVI A,UNUM OUT USER ;Select UART endif ;inter3 IN STATUS ;Get status ORI 4 ;Force Tx empty high RET ; ; ;------------------------------------------------------------------------------ ; THIS IS THE ERROR RESET FOR UART/USART ROUTINE. ; IF YOUR UART/USART DOES NOT NEED TO BE RESET ON ; ERROR, WE RECCOMEND THAT YOU DO AN "IN DATA" TO ; CLEAR THE AIR AND RETURN. ; RES: if inter3 MVI A,UNUM OUT USER ;Select UART endif ;inter3 MVI A,ERESET ;Reset error flags in 2651 OUT CMMD MVI A,CMMDB ;Restore normal operation OUT CMMD RET ; ; ;------------------------------------------------------------------------------ ; THIS IS THE RECEIVE DATA ROUTINE. ; BEFORE THIS ROUTINE IS ENTERED BIT 02 OF THE ; STATUS READ ROUTINE MUST HAVE BEEN SET. ; DO NOT CLEAR THE TOP (MOST SIGNIFICANT) BIT. ; RETURN WITH REGISTER A LOADED WITH INPUT DATA. ; ; ; RX: if inter3 MVI A,UNUM OUT USER ;Select UART endif ;inter3 IN DATA ;Get data RET ; ; ; ;------------------------------------------------------------------------------ ; THIS IS THE TRANSMIT DATA ROUTINE. ; BEFORE THIS ROUTINE IS ENTERED BIT 00 ; AND BIT 3 OF STATUS READ MUST BE SET. ; DO NOT CLEAR THE TOP BIT BEFORE OUUDATUT. ; REGISTER A CONTAINS THE DATA. ; TX: if inter3 PUSH PSW MVI A,UNUM OUT USER ;Select UART POP PSW endif ;inter3 OUT DATA ;Send data RET ; ; ; ;------------------------------------------------------------------------------ ; ; THE PURPOSE OF THIS MEASSGE IS TO SHOW ; (OR REMIND) YOU OF THE ACTUAL HARDWARE ; THAT THIS VERSION OF HITE IS SET UP FOR. ; ; Note that only one level of the stack ; is used on entry to the initialisation routine. ; The rest of the "reserved" stack space ; may be used for the signon message as this is only ; needed once near the start of HITE. Once the message ; has been displayed it can be safely overwritten by ; the stack. ; ; HEXNUM macro num if (num/16) > 9 db (num/16 and 0fh) + 'A' - 10 else db (num/16 and 0fh) + '0' endif if (num and 0fh) > 9 db (num and 0fh) + 'A' - 10 else db (num and 0fh) + '0' endif endm MESSGE: DB ACR,ALF,ALF DB 'For 2651 UART' if sysspt DB ' on System Support 1 Board' endif ;sysspt if inter3 DB ' on Interfacer 3 Board' endif ;sysspt DB ',',ACR,ALF DB 'at port ' hexnum %BASE DB 'H, 300 bps, 1 stop, no parity.',ACR,ALF if inter3 DB 'UART Offset ' hexnum %UNUM DB ', ' endif ;inter3 DB 'Version 1.0, 10/May/82',ACR,ALF DB '$' ; ; ; ; ;------------------------------------------------------------------------------ ; ; END