PC-8201A LOGO

NEC PC-8201A RS232 Init



Quick Links:   [Home] [Menu] [BASIC] [TEXT] [TELCOM] [Diff] [Tech Ref] [Files] [Links] [Y2K]



In my desire to create a VT100 emulator for the NEC, I realized that I would need detailed knowledge of how the machine handles RS232 communications. This is the beginnings of my foray into the RS232 routines.


;-------------------------------------------------------------------------
;NEC PC-8201A Technical Notes                       Revised: 10 Apr 1998
;-------------------------------------------------------------------------

;                     INIT RS232 SERIAL COMMUNICATIONS

;Additions and comments welcome. If you add any information, please
;document the source. Do not remove the name and address information of
;the original post. Add a comment underneath with your name, e-mail
;address, and revision date.

;Originally compiled from various documented sources by:

;David J. Firth             djfirth@freenet.columbus.oh.us
;198 E. Home Street         djfirth@ibm.net
;Westerville, OH 43081
;-------------------------------------------------------------------------

;The following source resulted from examination of disassembled ROM
;code, chip data sheets, and the NEC PC-8201A memory map compiled
;by Gary Weber (avail from Club 100 library).

;Additional information gathered from "Model 100 System Map" c1985 rev
;9/30/85 compiled by Robert D. Covington. Downloaded from CIS. The exact
;application of the M100 data to the NEC is unverified.

;-------------------------------------------------------------------------

; INIT_RS232    : Initialize the serial port for use
; NEC PC-8201A

; According to Gary Weber's memory map, the calling conventions for
; this routine are:
;
; B  = RTS/DTR status
; C  = Mask, FFh
; H  = Baud rate code
; L  = Data size/parity/stop bits
;
; No registers destroyed

6F58    MVI A,03                ;Entry point. Set marker for use later

6F5A    PUSH H                  ;Save initial conditions of regs
6F5B    PUSH D
6F5C    PUSH B
6F5D    PUSH PSW

6F5E    CPI 03                  ;Force execution of INIT_RS232 to
6F60    JZ 6F6C                 ;bypass code at 6F63-6F69

;For a straight-forward RS232 initialization, the code at 6F63-6F69
;is not called. Dead code?

; Interrupts must be disabled while the NEC sets up the serial port,
; since the serial port can have an interrupt handler tied to it.

6F6C    DI                      ;Disable interrupts

; The following section of code deals with the serial port input
; mask. The mask is stored in the NEC's upper memory working space
; at location FE4C.

6F6D    MOV A,C                 ;Move mask to accumulator
6F6E    STA FE4C                ;Store mask in holding location in RAM
6F71    POP PSW                 ;Restore accumulator from stack
6F72    PUSH PSW                ;Restore stack copy of accumulator

; The NEC, like the M100, dispatches many tasks via the 8085 software
; interrupt system. This centralizes a table of call dispatch hooks.
; Instead of CALLing subroutines every place in the code where a routine
; needs these frequently-used hooks (requiring a 3-byte CALL), the
; ROM programmers substitute a one-byte RST 7 instruction followed
; immediately by a one-byte hook table offset. This saves 1 byte per
; CALL through the hook table.

6F73    CALL 6FB2               ;Unknown result at this time. The
                                ;routine calls the master hook table
                                ;via RST 7. Investigating.

6F76    CALL 6F21               ;Call set baud rate routine

        ; Subroutine called once by INIT_RS232, so the subroutine
        ; is inserted here for easy reference. I have not commented
        ; every line of the routine. I am still working through it
        ; and don't have all applicable data sheets handy.

        6F21    PUSH H          ;Save baud rate to stack
        6F22    MOV A,H         ;Move baud rate to accumulator
        6F23    RLC
        6F24    LXI H,6F3E
        6F27    MVI D,0
        6F29    MOV E,A
        6F2A    DAD D
        6F2B    SHLD FE4A       ;Baud rate table entry
        6F2E    POP H           ;Restore baud rate reg
        6F2F    PUSH H          ;Save baud rate to stack
        6F30    LHLD FE4A
        6F33    MOV A,M
        6F34    OUT BC          ;Port 188, low byte of timer
        6F36    INX H
        6F37    MOV A,M
        6F38    OUT BD          ;Port 189, hi byte of timer
        6F3A    MVI A,C3        ;11000011b
        6F3C    OUT B8          ;Port 184, 8155 command port
        6F3E    POP H           ;Restore stack to init condition
        6F3F    RET

; The following code sets up the RTS/DTR status of the serial port

6F79    IN BA                   ; Port 186, a multi-purpose I/O port
                                ; where:
                                ;
                                ; 7 6 5 4 3 2 1 0
                                ; | |     |
                                ; | |     -- Carrier (0), Ring (1)
                                ; | -------- DTR on
                                ; ---------- RTS on

6F7B    ANI 3F                  ;Mask out RTS status
6F7D    ORA B                   ;Set RTS/DTR status in accumulator
6F7E    OUT BA                  ;Set RTS/DTR for serial port

;The following code sets up the command register of the 6402 UART
;for the requested # data bits, parity, and # stop bits. The 6402's
;control word is 5 bits wide. The NEC uses the lower 5 bits of the
;byte. The order of the individual signals is based on the Model 100
;so the validity on the NEC is unverified.

;The 6402 employs a command register load (CRL) signal. The NEC code
;reviewed thus far does not seem to do anything special to assert
;this signal. Harris Semiconductor CDP6402 documentation says the
;signal may be hard wired high.

;The reason for the IN is uncertain, since it does not seem to serve
;any particular purpose. Investigating.

6F80    IN D8                   ;Port 216, 6402 UART command/status.

                                ;According to Covington, the M100's port
                                ;for the 6402 UART command/status input:

                                ;MSB 76543210 LSB

                                ;Bit 0: data on telephone line (CD?)
                                ;Bit 1: UART overrun
                                ;Bit 2: UART framing error
                                ;Bit 3: UART parity error
                                ;Bit 4: UART xmit buffer empty
                                ;Bit 5: Modem ring indicate
                                ;Bit 6: n/a
                                ;Bit 7: Low power signal (active low)

6F82    MOV A,L                 ;Move data/par/stop to accumulator.

                                ;According to Covington, the M100's port
                                ;for the 6402 UART command/status output:

                                ;MSB 76543210 LSB

                                ;Bit 7-5: n/a
                                ;Bit 4-3: data bits     00 = 5 bits
                                ;                       01 = 6 bits
                                ;                       10 = 7 bits
                                ;                       11 = 8 bits
                                ;Bit 2:   parity?        0 = no parity
                                ;                        1 = use parity
                                ;Bit 1:   parity         0 = even
                                ;                        1 = odd
                                ;Bit 0:   stop bits      0 = 2
                                ;                        1 = 1, 1.5

6F83    ANI 1F                  ;Mask out upper 3 bits
6F85    OUT D8                  ;Output data to 6402 command reg

; The following routine is a clean up routine.

6F87    CALL 6F95

        ; Subroutine called once, so it is included here for
        ; easy reference.

        6F95    XRA A           ;Zero out the accumulator
        6F96    MOV L,A         ;Zero out L
        6F97    MOV H,A         ;Zero out H
        6F98    SHLD FE40       ;Zero out XOF not received
        6F9B    SHLD FE45       ;Zero out char count in COM1 queue
        6F9E    SHLD FE47       ;Zero out write pointer
        6FA1    SHLD F9B7       ;Zero out shift in/out send status
        6FA4    STA FE49        ;Zero out XOF has been sent
        6FA7    RET

6F8A    JMP 7266h               ;Unconditional jump to exit code

7266    POP PSW                 ;Restore registers to init conditions
7267    POP B
7268    POP D
7269    POP H
726A    EI                      ;Reenable interrupts
726B    RET                     ;Exit INIT_RS232



Original author of this page: David Firth.


This page best viewed on ANY browser. This author strongly supports access by persons with limited-capability and text-only browsers. Content is better than flash & dazzle.