************************************************************************* * * * The purpose of this program is to do initializations and other * * tasks that have been removed from the bios to keep the bios * * within the size limitations of the bios. * * * ************************************************************************* ORG 100H call terminit call lstset call conint jmp 0 ;Define the console and printer environments ;=========================================== ; The following is a list of possible baud rates and the decimal ; value needed for the cbaud and lbaud definitions ; ; Baud Rate cbaud/lbaud Baud Rate cbaud/lbaud ; 50 2304 2000 58 ; 75 1536 2400 48 ; 110 1047 3600 32 ; 134.5 857 4800 24 ; 150 768 7200 16 ; 300 384 9600 12 ; 600 192 19200 6 ; 1200 96 38400 3 ; 1800 64 56000 2 lbaud equ 1047 ;List Device Baud Rate cbaud equ 6 ;Console Baud Rate ;Multio/Wunderbuss Equates ;------------------------- ; The following equates will define the Decision I mother ; board I/O or the Multi I/O environments if needed. ; ;Location Definitions ;-------------------- mbase equ 48h ;Base address of Multi I/O or Decision I rbr equ mbase ;Read data buffer thr equ mbase ;Tranmitter data buffer dll equ mbase ;Divisor (lsb) strobe equ mbase ;parallel port strobe out status equ mbase ;parallel port status in dlm equ mbase+1 ;Divisor (msb) ier equ mbase+1 ;Interupt enable register sensesw equ mbase+1 ;Sense switches, only in gp 06 data equ mbase+1 ;parallel port data buffer clk equ mbase+2 ;WB14 printer select port lcr equ mbase+3 ;Line control register mcr equ mbase+4 lsr equ mbase+5 ;Line status register msr equ mbase+6 grpsel equ mbase+7 ;Group select port ; ;Define Transmitter/Reciever Mask Bytes ;-------------------------------------- dr equ 01h ;Line status DR bit cts equ 10h ;Clear to send dsr equ 20h ;Data set ready thre equ 20h ;Status line THRE bit dlab equ 80h ;Divisor latch access bit ; wls0 equ 1 ;Word length select bit 0 wls1 equ 2 ;Word length select bit 1 for 8 bit word stb equ 4 ;Stop bit count - 2 stop bits ; ; Define Modem Control Register bits ;----------------------------------- dtrenb equ 1 ;DTR enable rtsenb equ 2 ;RTS enable ; ;Define group select Masks ;------------------------- spp equ 0 ;select parallel port s0 equ 01h ;Group number (0-3) s1 equ 02h smask equ 03h bank equ 04h enint equ 08h restor equ 10h ;Printer restore on Multi I/O busy equ 20h ;parallel printer busy mask denable equ 20h ;Driver enable on Multi I/O ; ;Group Port Assignments ;---------------------- congrð eqõ ± ;Consolå porô (1=p1¬ 2=p2¬ 3=p3) lstgrp equ 3 ;Printer port (1=p1, 2=p2, 3=p3) ;Print a Message ;--------------- ;Utility routine to output the message pointed at by (hl) ;terminated with a null. ; message:mov a,m ;Get a character of the message inx h ;Bump text pointer ora a ;Test for end rz ;Return if done push h ;Save pointer to text mov c,a ;Output character in C call cout ;Output the character pop h ;Restore the pointer jmp message ;Continue until null reached ;Console Output ;-------------- ; db 1 ;used by swap.com cout: jmp conout conout: call conost ;Select console and test status jz conout mov a,c ;Character is in (c) ani 7fh out thr ;Output to transmitter buffer ret ;Console Status ;-------------- ; 1) Returns zero if character is not ready to be read. Otherwise, ; this routine returns 255 indicating a ready condition. ; const: call selcon ;Select console in lsr ;Read status register ani dr rz ;No charactter ready mvi a,0ffh ;Character ready ret ;Console Output Status Routine ;----------------------------- ; conost: call selcon in lsr ani thre rz mvi a,0ffh ret ;Console Select Routine ;---------------------- ; selcon: lxi d,group ;pass to application ldax d ori congrp out grpsel ret ;Group select routines ;--------------------- ; sellst: lxi d,group ;pass to application ldax d ;Select printer group ori lstgrp out grpsel ret ;********************************************************************* ;Begin Multio I/O or Wunderbus Console Initialization Routine (CIDRV2) ;********************************************************************* ; This routine reads the sense switch on the WB-14 and sets ; the speed accordingly. ; conint: call selg0 ;Select group 0 in sensesw ;Get sense switch (ff on a Multio) push psw call selcon ;Select console pop psw push psw call tini0 ;Initialize the console pop psw push psw ;temp call selrdr ;Select the reader/punch pop psw ;temp call tini0 ;Initialize the reader/punch ret tini0: ;ani 0e0h ;Mask in upper three bits ; rlc ;Move into lower 3 bits ; rlc ; rlc ; cpi 7 ;check for sense = 7 (Default setting) ; jz dfbaud ;Use default baud rate ; lxi h,btab ;Pointer to baud rate table ; add a ;Table of words so double ; mov e,a ;Make a 16 bit number into (de) ; mvi d,0 ; dad d ;Get a pointer into baud rate table ; mov e,m ;Get lower byte of word ; inx h ;Bump to high byte of word ; mov d,m ;Get upper byte. (de) now has divisor ; jmp setit ;Set baud rate dfbaud: lhld defcon ;Use default baud rate xchg ;Enable divisor access latch setit: mvi a,dlab+wls1+wls0+stb out lcr ;Set the baud rate in (de) mov a,d out dlm ;Set upper divisor mov a,e out dll ;Set lower divisor ;Clear Divisor latch mvi a,02 ;7 bit word len,no parity,1 stop ;wls1+wls0+stb out lcr xra a out ier ;Set no interrupts out lsr ;Clear status mvi a,dtrenb+rtsenb ;Enable DTR and RTS outputs to terminal out mcr in msr ;Clear MODEM Status Register in lsr ;Clear Line Status Register in rbr ;Clear reciever buffers in rbr ret selg0: lda group ;Select group zero out grpsel ret selrdr: lda group ;Select reader/punch group ori 5-lstgrp ;Use 'other' serial port out grpsel ret ;btab: dw 1047 ;110 Baud 000 ; dw 384 ;300 001 ; dw 96 ;1200 010 ; dw 48 ;2400 011 ; dw 24 ;4800 100 ; dw 12 ;9600 101 ; dw 6 ;19200 110 ; ;DEFCON 111 ;******************************************************************* ;Begiî Multiï I/Ï oò Wunderbusó Lisô anä Puncè Initializatioî ;Routine ;******************************************************************* ; lstset: call sellst ;Select printer group mvi a,dlab ;Access divisor latch out lcr lhld deflst ;Get LST: baud rate divisor mov a,h out dlm ;Set upper baud rate mov a,l out dll mvi a,stb+wls0+wls1 ;2 stop bits + 8 bit word out lcr mvi a,dtrenb+rtsenb ;DTR + RTS enabled out mcr in rbr ;Clear input buffer xra a out ier ;No interrupts ;fall thru to centronics init ;******************************************************************* ;Begin Multio I/O or Wunderbuss Parallel List Initialization Routine ;******************************************************************* ; punset: lda group out grpsel ;select parallel port in sensesw ;read motherboard switches cpi 0FFh ;FF is Multio jz imult mvi a,0FFh out strobe ;turn strobes off mvi a,0C0h out clk ;turn on drivers mvi a,07Fh out strobe ;assert restore (low true) mvi a,0FFh out strobe ;inactivate restore ret imult: lda group ori denable sta group ;turn parallel port drivers on out grpsel ;select parallel port mvi a,0C0h out strobe ;turn data strobe off lda group ori restor out grpsel ;assert restore lda group out grpsel ;de-assert restore ret page ************************************************************************* * * * INITIALIZE THE PARTICULAR TERMINAL BEING USED * * In this case it's a Televideo 950 * * 1. Set for 19200 baud * * * ************************************************************************* terminit:lxi h,t950str ;address of initialization string for terminal call message lxi h,0ffffh ;delay to allow terminal to do its "reconfig" termdly:xchg xchg dcx h mov a,l ana h jnz termdly ret t950str: db 1Bh ;ESC db '{' db '?' ;select 19200 baud db '0' ;1 stop bit db '0' ;parity disabled db '1' ;7 bit word length db 1Bh ;ESC db '\' db '1' ;24 lines per page db 0 ;end of string defcon: dw cbaud ;Console baud rate divisor value deflst: dw lbaud ;Printer baud rate divisor value group: db 0 ;Group byte end