; Initialization program for Televideo 801/802 ; written by Les Freed ; Version 1.0 3/17/82 ; ;07/25/82 Corrected error which had SIO initialization code going to data port ; rather than status/control port and inserted code using Z80 block ; output instruction from a program I had written previously. Actually ; the Televideo seems to initialize the SIO somewhere in the system ; software and for the most part only needs the CTC initialized to set ; the baud rate, which is why this program worked before. (Bob Clyne) ; bdos equ 5 ;CP/M entry point ; udta equ 20h ;usart data port usta equ 22h ;usart status port ; cr equ 0dh ;carriage return lf equ 0ah ;line feed ; org 100h ; start: lxi d,signon ;print table call print ; lxi d,msg1 ;print message call print i1: call input ;get input call check ;check range jc i1 ;try again if carry set sui 30h ;remove ASCii bias sta baud ;store divisor ; show: lxi d,clear ; clear screen call print lxi d,msg1 ;print 'baud rate:' call print lda baud ;get a's divisor call prbaud ;print a's baud rate lxi d,crmsg ;ask user if okay call print call input cpi cr jnz start ;if not CR, then start over ; ; SIO-INIT.ASM ; Version 02 ; Originally written by Bob Clyne ; November 22, 1981 ; ;This code initializes a Z80-SIO or Z80-DART IC for asynchronous communication. ;It uses Z80 instructions and therefore will only run on a Z80 CPU. This ;program can be run prior to using the I/O port or this code may be transferred ;to the initialization section of another program such as one of the MODEM ;programs. The status/control port number will need to be set for each ;application. ; ;01/21/82 Changed introduction and added equates for XEROX 820 Channel A. ; FALSE EQU 0 TRUE EQU NOT FALSE ; ;Only one of the following equates should be set true. ; XEROX EQU FALSE ALTOS EQU FALSE TELEVID EQU TRUE ;Added 07/25/82 ; IF ALTOS ;ALTOS 2nd printer port DPORT EQU 28H ;DATA PORT (Included for information only, not used.) CTRLPT EQU 29H ;Status/control port. ENDIF ; IF XEROX ;XEROX 820 Channel A serial port. CTRLPT EQU 06H ;Status/control port. ENDIF ; IF TELEVID CTRLPT EQU usta ;Use port equate from begining of pgm. (RAC 07/25/82) ENDIF ; ; MACLIB Z80 ;To assemble using ASM comment out this line and make ;the change noted below. ; ; ORG 100H ; SIO: MVI B,07H ;NUMBER OF BYTES NEEDED TO INITIALIZE THE SERIAL PORT MVI C,CTRLPT;PORT TO SEND INITIALIZATION BYTES TO LXI H,INITBL;ADDRESS OF TABLE OF BYTES TO SEND ; OUTIR ;OUTPUT THE BLOCK DB 0EDH,0B3H;To assemble on ASM, comment out the above instruction ;and remove the ';' from in front of 'DB' ; RET ;RETURN TO CPM JMP CTC ;Jump to old code to set the CTC (RAC 07/25/82) ; INITBL: DB 18H ;CHANNEL RESET DB 04H ;WRITE REGISTER 4 DB 44H ;SET X16 CLOCK, 1 STOP BIT, NO PARITY DB 05H ;WRITE REGISTER 5 DB 0EAH ;SET DTR & RTS ACTIVE & ENABLE 8 BIT TRANSMIT DB 03H ;WRITE REGISTER 3 DB 0E1H ;ENABLE 8 BIT RECEIVE & AUTO ENABLES ; DB 0C1H ;Enable 8 bit receive without AUTO ENABLES. ;Comment out whichever of the above 2 lines you don't ;... want. ; END ; CTC: mvi a,47h ; counter mode follows (Lable added RAC) out 08h ; send lda baud ; get baud rate divisor out 08h ; send to port ; lxi d,msg ;tell user we're done call print ret ;& return to CP/M ; print: mvi c,9 ;CP/M print string call call bdos ret ; input: mvi c,1 ;CP/M get char. call call bdos ret ; check: cpi 30h ;at least '0' jc notok cpi 37h ;& not >'6' jnc notok stc ;reset carry cmc ret ; notok: lxi d,badmsg ;print message, move back up screen call print stc ! ret ;return w/ carry set ; prbaud: cpi 0 ;find divisor, convert & print baud rate jnz pr1 lxi d,m19 mvi a,2 jmp pr8 ; pr1: cpi 1 jnz pr2 lxi d,m96 mvi a,4 jmp pr8 ; pr2: cpi 2 jnz pr3 lxi d,m48 mvi a,8 jmp pr8 ; pr3: cpi 3 jnz pr4 lxi d,m24 mvi a,10h jmp pr8 ; pr4: cpi 4 jnz pr5 lxi d,m12 mvi a,20h jmp pr8 ; pr5: cpi 5 jnz pr6 lxi d,m6 mvi a,40h jmp pr8 ; pr6: cpi 6 jnz pr8 lxi d,m3 mvi a,80h ; pr8: sta baud jmp print ; ; signon: db 1ah,'INIT v 1.0 3-18-82',cr,lf,lf,lf db 'Select Baud Rate: ',cr,lf,lf ; db 'Speed',cr,lf db '19200 0',cr,lf db ' 9600 1',cr,lf db ' 4800 2',cr,lf db ' 2400 3',cr,lf db ' 1200 4',cr,lf db ' 600 5',cr,lf db ' 300 6',cr,lf db lf,lf,lf,'$' ; m19: db ' 19200$' m96: db ' 9600$' m48: db ' 4800$' m24: db ' 2400$' m12: db ' 1200$' m6: db ' 600$' m3: db ' 300$' ; badmsg: db cr,lf,7,'Re-enter',cr db 11,12,12,12,12,12,12 db 12,12,12,12,12,'$' ;move cursor back to entry ; clear: db 1ah,'$' ; crmsg: db cr,lf,lf,lf,lf,'Press RETURN to set baud rate :','$' ; msg: db cr,lf,'Port initialized',0dh,0ah,'$' msg1: db cr,lf,'Baud rate :$' ; baud ds 1 ; end