WARM EQU 0H ; CP/M warm start FDOS EQU 5H ; BDOS functions subroutine CHAR EQU 2H ; BDOS function # for console character out STRING EQU 9H ; BDOS function # for string output SIODPA EQU 4H ; Serial channel A data port SIODPB EQU 5H ; Serial channel B data port SIOCPA EQU 6H ; Serial channel A control/status port SIOCPB EQU 7H ; Serial channel B control/status port PTRDAT EQU 8H ; Parallel printer data port BITDAT EQU 1CH ; System bit-control port LF EQU 0AH CR EQU 0DH CRLF EQU 0D0AH BAUDA EQU 0H ; COM8116 channel A baud rate port B110 EQU 02H ; COM8116 baud rate divisor values B300 EQU 05H B1200 EQU 07H ORG 100H ; CP/M .COM file LD A,7FH LD (LEDS),A LD A,0FFH OUT (PTRDAT),A LD A,0 LD (SAVER),A TEST0 CALL WAIT CALL SHIFT ; Check parallel printer port via LEDs TEST1 CALL INITA LD C,0AAH ; First test character CALL INOUT ; Routine will bomb out to CP/M LD C,55H ; if character doesn't check CALL INOUT LD C,0 CALL INOUT LD C,0FFH CALL INOUT TEST2 CALL CHKHDS FINIS LD HL,SAVER LD A,0 CP (HL) CALL Z,MGOOD LD HL,SAVER LD A,0 CP (HL) CALL NZ,MBAD LD A,55H OUT (PTRDAT),A LD C,STRING LD DE,OKSIO CALL FDOS ; Print a message to signal success JP WARM ; and do a normal exit MGOOD LD DE,GOOD LD C,9 CALL 5 RET MBAD LD DE,BADM LD C,9 CALL 5 RET INITA LD A,18H ; Reset channel A OUT (SIOCPA),A LD HL,TABLE ; Point to serial init table LD B,BYTES ; Number of bytes in init table LD C,SIOCPA ; Point to channel A control port OTIR ; Init channel A LD A,B1200 ; Select baud rate OUT (BAUDA),A ; for serial channel A RET BEEP IN A,(SIOCPB) ; Get SIO/b status byte AND 100B ; Check TBE status bit JR Z,BEEP LD A,02 ; Short beep OUT (SIODPB),A RET NGBEEP CALL WAIT CALL WAIT CALL WAIT ; Virtual duplicate of BEEP IN A,(SIOCPB) AND 100B JR Z,NGBEEP LD A,04 ; and the beep is longer OUT (SIODPB),A ; on an error exit RET WAITT RET WAIT PUSH HL ; Save the two RPs used for looping PUSH BC LD BC,1 ; Decrementing by 1 LD HL,08000H WLOOP SBC HL,BC ; Subtract RP sets carry JR NC,WLOOP ; only on borrow POP BC POP HL ; Restore the 2 RPs used RET ; and return with no arguement SHIFT CALL BEEP CALL WAIT LD A,(LEDS) ; Get the LED pattern OUT (PTRDAT),A RRA A ; Move the blip over one LED LD (LEDS),A ; Store the changed pattern JR C,SHIFT ; Loop if LEDs not all dark CALL WAIT LD A,(LEDS) OUT (PTRDAT),A ; Display last pattern CALL BEEP CALL WAIT RET SEGSS RET SEGS PUSH HL LD HL,SEGX SEGL LD A,(HL) CP 15H JP Z,DONS OUT (PTRDAT),A CALL BEEP CALL WAIT INC HL JR SEGL DONS POP HL RET SEGTBL DB 0C0H,67H,7FH,7,7DH,0EDH,66H,4FH,5BH,6,3FH,15H SEGX DB 3FH,5BH,66H,7DH,7FH,0C0H,15H RCVA CALL WAIT ; Allow character to catch up with CPU IN A,(SIOCPA) ; Get SIO/a status byte BIT 0,A ; Check Data Available bit JR NZ,REXIT ; If byte there, return OK RER LD HL,SAVER LD A,0 CP (HL) RET NZ LD A,1 LD (SAVER),A LD C,STRING ; Else announce failure LD DE,TRNER CALL FDOS CALL NGBEEP RET ; and exit the test cycle REXIT IN A,(SIODPA) ; Routine returns character in A CP C RET Z LD DE,RXERR LD C,9 CALL 5 RET INOUT CALL XMITA ; send a character from the SIO CALL RCVA ; to itself RET ; Return if character returned is same XMITA LD HL,SAVER LD A,0 CP (HL) RET NZ IN A,(SIOCPA) ; Get SIO/a status byte BIT 2,A ; Check TBE status bit JP NZ,BEMPTY ; Continue if buffer empty XER LD C,STRING ; else signal LD DE,TRERR CALL FDOS CALL NGBEEP ENDX RET ; and exit the test cycle BEMPTY LD A,C ; Routine expects character passed in C OUT (SIODPA),A RET CHKHDS LD A,5 OUT (6),A LD A,2 OUT (6),A IN A,(1CH) RES 4,A OUT (1CH),A IN A,(1CH) BIT 3,A CALL NZ,RTSER LD A,10H OUT (6),A IN A,(6) BIT 3,A CALL NZ,DCDER IN A,(6) BIT 5,A CALL Z,CTSER LD A,5 OUT (6),A LD A,80H OUT (6),A IN A,(1CH) SET 4,A OUT (1CH),A IN A,(1CH) BIT 3,A CALL Z,RTSER LD A,10H OUT (6),A IN A,(6) BIT 3,A CALL Z,DCDER IN A,(6) BIT 5,A CALL NZ,CTSER RET DCDER LD A,1 LD (SAVER),A CALL NGBEEP LD C,9 LD DE,DCDERR CALL 5 RET CTSER LD A,1 LD (SAVER),A CALL NGBEEP LD C,9 LD DE,CTSERR CALL 5 RET RTSER LD A,1 LD (SAVER),A CALL NGBEEP LD C,9 LD DE,RTSERR CALL 5 RET DCDERR DB ' DCD/DTR ERROR, PINS 8 & 20 OF RS-232 ',0DH,0AH,'$' CTSERR DB ' CTS ERROR, PIN 5 OF RS-232, PIN 1 OF PRINTER',0DH,0AH,'$' RTSERR DB ' RTS ERROR, PIN 4 OF RS-232, PIN 11 OF PRINTER',0DH,0AH,'$' RXERR DB ' RECIEVE ERROR, PINS 2 & 3 OF RS-232',0DH,0AH,'$' TRNER DB ' TRANSMIT ERROR, PINS 2 & 3 OF RS-232',0DH,0AH,'$' GOOD DB 0DH,0AH,'NO ERRORS, SIO GOOD',0DH,0AH,'$' BADM DB 0DH,0AH,'SIO FAILED',0DH,0AH,'$' OKSIO DB 0DH,0AH,' TEST COMPLETE',0DH,0AH,'$' TRERR DB ' TRANSMIT BUFFER FULL',0DH,0AH,'$' SAVER DS 1 LEDS DS 1 ; Byte pattern for LED check BYTES EQU 8 ; Number of bytes to transfer from table TABLE DB 4 ; Point to Write Register 4 DB 44H ; Set clock divider, 1 stop bit, no parity DB 1 ; Point to Write Register 1 DB 0 ; No interrupts DB 3 ; Point to Write Register 3 DB 0D1H ; 8 bits/ch, auto enable, enable RCVR DB 5 ; Point to Write Register 5 DB 068H ; note: this byte controls HANDShaking signals END