;
;VERSION UH89   (revised JANUARY 30, 1981)
;
;User routines for BSTAM version 4.3, for use with
;Heath H8 with H8-4 or H89 with H-3 serial port.
;TBE=20H, RDA=01H.  By Keith Petersen, W8SDZ
;
;BASE ADDRESS OF CP/M
;USE:   4200H FOR CP/M VERSION 1.43 AND BELOW.
;       0000H FOR CP/M VERSION 2.0 AND ABOVE.
;
BASE    EQU     0000H   ;OFFSET OF CP/M FROM 0H
;
;DEFINE PORT
;
PORT    EQU     330Q    ;8250 PORT BASE ADDRESS
;
;DEFINE BAUD RATE DIVISORS
;
B75     EQU     0600H   ;75 BAUD
B110    EQU     041FH   ;110 BAUD
B150    EQU     0300H   ;150 BAUD
B300    EQU     0180H   ;300 BAUD
B600    EQU     00A0H   ;600 BAUD
B1200   EQU     0060H   ;1200 BAUD
B2400   EQU     0030H   ;2400 BAUD
B4800   EQU     0018H   ;4800 BAUD
B9600   EQU     000AH   ;9600 BAUD
B19200  EQU     0006H   ;19200 BAUD
;
;DEFINE ASCII CHARACTERS USED
;
CR      EQU     0DH
LF      EQU     0AH
;
;       IF YOU WISH TO USE OTHER REGISTERS SUCH AS HL,BC,DE
;       (NOT INCLUDING  SP  REGISTER)
;       BE SURE TO PUSH BSTAM'S REGISTERS ON TO STACK AND POP
;       THEM BACK OFF BEFORE RETURNING TO BSTAM.
;       THERE IS AMPLE ROOM TO PUSH ALL REGISTERS ONTO BSTAM'S
;       STACK, PLUS ROOM FOR 10 LEVELS OF CALL'S.
;
;       THERE ARE 300 BYTES OF USER SPACE AVAILABLE TO YOU.
;
;       THE JUMP'S CODED AT THE BEGINNING OF THIS PROGRAM
;       CANNOT BE MOVED IN ANY WAY.
;
BEGIN   ORG     103H
;
INITIL  JMP     INITIU  ;UART/USART INITIALATION ENTRY POINT
INSPORT JMP     INSPRU  ;STATUS PORT READ ENTRY POINT
ERRSET  JMP     ERRSTU  ;UART/USART ERROR RESET ENTRY POINT
INPORT  JMP     INPRTU  ;READ DATA PORT ENTRY POINT
OUTPORT JMP     OUTPRU  ;WRITE DATA PORT ENTRY POINT
;
INITIU  EQU     $
;       THIS IS THE UART/USART INITIALATION ROUTINE.
;       TO BE COMPATIBLE WITH MOST BSTAM USERS USE FOLLOWING
;       INITIALATION GUIDE LINES:
;       1. USE 1 STOP BIT       (OPTIONAL - 2)
;       2. USE 8 DATA BITS      (MUST)
;       3. USE 1 START BIT      (MUST)
;       4. USE 16X FOR CLOCK RATE       (MUST)
;       5. USE ASYNCHRONOUS MODE ONLY   (MUST)
;
       MVI     A,0     ;CLEAR
       OUT     PORT+1  ;TO INTERRUPT ENABLE REGISTER
       MVI     A,80H   ;OPEN DIVISOR LATCHES (DLAB BIT = 80H)
       OUT     PORT+3  ;TO LINE CONTROL REGISTER
       LXI     H,B300  ;BAUD RATE DIVISOR (300 BAUD)
       MOV     A,L     ;LEAST SIGNIFIGENT BYTE
       OUT     PORT    ;TO DIVISOR LATCH (LS)
       MOV     A,H     ;MOST SIGNIFIGENT BYTE
       OUT     PORT+1  ;TO DIVISOR LATCH (MS)
       MVI     A,3     ;8 BITS, NO PARITY, 1 STOP BIT
       OUT     PORT+3  ;TO LINE CONTROL REGISTER
       MVI     A,0     ;CLEAR
       OUT     PORT+4  ;TO MODEM CONTROL REGISTER
       CALL    SIGNON  ;TELL USER WHAT'S IMPLEMENTED
       RET             ;RETURN TO BSTAM
;
INSPRU  EQU     $
;       THIS IS THE STATUS READ PORT ROUTINE.
;       WHEN EXITING THIS ROUTINE BSTAM EXPECTS IN REGISTER A
;       THE FOLLOWING BITS TO BE SET IF NEEDED:
;       1. 20 BIT SET IF FRAMING ERROR
;       2. 10 BIT SET IF OVERRUN ERROR
;       3. 08 BIT SET IF PARITY  ERROR
;       4. 04 BIT SET IF TRANSMITTER EMPTY
;               IF YOUR UART/USART DOES NOT HAVE TRANSMITTER
;               EMPTY FEATURE, THEN ALLWAYS SET THIS BIT ON.
;       5. 02 BIT SET IF RECEIVER READY
;       6. 01 BIT SET IF TRANSMITTER READY
;       7. DO NOT SET THE 80 BIT OR 40 BIT
;
       PUSH    B
       IN      PORT+5  ;TBE = 20H, RDA = 01H
       ANI     01H     ;ISOLATE RDA BIT
       RAL             ;MOVE TO 02 BIT
       MOV     B,A     ;SAVE RDA IN B REGISTER
       IN      PORT+5  ;GET STATUS AGAIN
       ANI     20H     ;ISOLATE TBE BIT
       RAR             ;MOVE TO 04 BIT
       RAR
       RAR
       ORA     B       ;COMBINE TBE AND RDA BITS
       POP     B
       ORI     1       ;PRESET TRANSMIT READY BIT
       RET
;
ERRSTU  EQU     $
;       THIS IS THE ERROR RESET FOR UART/USART ROUTINE.
;       YOUR UART/USART MAY NOT NEED TO BE RESET IF FRAMING,
;       OVERRUN, OR PARITY ERROR IS FOUND. IF THIS IS YOUR
;       CASE, JUST DO A RETURN.
;
       RET             ;RETURN TO BSTAM
;
INPRTU  EQU     $
;       THIS IS THE READ DATA PORT ROUTINE.
;       BEFORE THIS ROUTINE IS ENTERED THE 02 BIT OF
;       STATUS READ ROUTINE MUST HAVE BEEN SET.
;       DO NOT CLEAR THE 80 BIT FROM THE DATA INPUT PORT.
;       RETURN WITH REGISTER A LOADED WITH INPUT DATA.
;
       IN      PORT+0  ;GET DATA FROM PORT
       RET             ;RETURN TO BSTAM
;
OUTPRU  EQU     $
;       THIS IS THE WRITE DATA PORT ROUTINE.
;       BEFORE THIS ROUTINE IS ENTERED THE 04 BIT AND 01 BIT
;       OF STATUS READ MUST BE SET.
;       DO NOT CLEAR THE 80 BIT FROM THE DATA OUTPUT PORT.
;       REGISTER A CONTAINS THE OUTPUT DATA.
;
       OUT     PORT+0  ;SEND DATA TO REMOTE CPU
       RET             ;RETURN TO BSTAM
;
MESSGE: DB      CR,LF,CR,LF
       DB      'Version 1.0 for H8/H89 as of 1/30/81',CR,LF
       DB      '$'
;
SIGNON: PUSH    B
       PUSH    D
       PUSH    H
       LXI     D,MESSGE
       MVI     C,9
       CALL    BASE+5          ;ANNOUNCE VERSION TO USER
       POP     H
       POP     D
       POP     B
       RET
;
       END