;Updated for ver 2.02 - 8/30/82 ;MORROW DESIGNS DECISION I, PORT 2 ;Clinton Computer, Clinton MD ; ; PATCH AREA FOR ASCOM MODEM PORT DRIVER ; ; THE FOLLOWING ROUTINES MUST BE PROVIDED FOR PROPER OPERATION OF ASCOM. ; THE FIVE JUMP INSTRUCTIONS AT THE START OF THE PROGRAM AREA MUST BE ; MAINTAINED AS SHOWN, ALTHOUGH THE ROUTINES THAT THE LAST FIVE OF THE ; JUMPS BRANCH TO SHOULD BE MODIFIED FOR THE PARTICULAR SERIAL PORT ; TO BE USED. THE MODEM ROUTINES DO NOT HAVE TO PROTECT ANY REGISTERS. ; ; ; ; grp equ 2 ;group (port) to use mbase equ 48H ;I/O base address grpsel equ mbase+7 ;group select port dll equ mbase ;baud rate (lsb) dlm equ mbase+1 ;baud rate (msb) ier equ mbase+1 ;interrupt enable register lcr equ mbase+3 ;line control register mcr equ mbase+4 lsr equ mbase+5 ;line status register msr equ mbase+6 rbr equ mbase ;rcvd data buffer thr equ mbase ;xmit data buffer dlab equ 80h ;divisor latch access bit thre equ 20h ;xmit ready bit dr equ 1 ;rcvd data bit wls0 equ 1 ;word length select bit 0 wls1 equ 2 ;word length select bit 1 stb equ 4 ;stop bit count (2 stop bits) ; ORG 103H ; START: JMP COMINI ;JUMP TO MODEM INIT JMP COMSTA ;JUMP TO MODEM STATUS JMP COMINP ;JUMP TO MODEM INPUT JMP COMOUT ;JUMP TO MODEM OUTPUT JMP COMBRK ;JUMP TO MODEM BREAK ROUTINE JMP COMDIL ;JUMP TO AUTO DIAL ROUTINE JMP COMANS ;JUMP TO AUTO ANSWER ROUTINE JMP COMHNG ;JUMP TO HANGUP ROUTINE JMP BEFDMP ;JUMP TO PRE-CAPTURE ROUTINE JMP AFTDMP ;JUMP TO POST-CAPTURE ROUTINE JMP USER1 ;JUMP TO FIRST USER ROUTINE JMP USER2 ;JUMP TO SECOND USER ROUTINE JMP USER3 ;JUMP TO THIRD USER ROUTINE JMP USER4 ;JUMP TO FOURTH USER ROUTINE ; ; ; BAUD VALUES ALLOWED- SOME NUMBER CONTAINED IN THIS TABLE MUST MATCH ; THE NUMBER ENTERED BY THE OPERATOR IN A "BAUD" COMMAND IN ORDER TO ; HAVE A "BAUDSL" NUMBER CHOSEN. THE DECIMAL NUMBER ENTERED BY THE ; OPERATOR WILL BE CONVERTED TO A BINARY INTEGER AND COMPARED AGAINS ; ALL THE ENTRIES IN THIS TABLE. IF NO MATCH IS FOUND, AN "ARGUMENT ; ERROR" WILL RESULT. IF A MATCH IS FOUND, THE NUMBER (0-15) WITHIN ; THE TABLE CORRESPONDING TO THE POSITION OF THE MATCHED ENTRY ; WILL BE PLACE AT LOCATION "BAUDSL". ; BAUDRT: DW 110 DW 300 DW 600 DW 1200 DW 1800 DW 2000 DW 2400 DW 3600 DW 4800 DW 7200 DW 9600 DW 19200 DW 38 ;38.4K BAUD DW 56 ;56K BAUD DW 0 DW 0 ; BAUDSL: DB 0 ;THIS ENTRY MUST BE HERE--WHEN MODEM INIT ; ROUTINE IS CALLED, IT WILL CONTAIN A ; NUMBER FROM 0 TO 15 CORRESPONDING ; TO THE SELECTED BAUD RATE ;USER SPECIFIED MESSAGE ADDRS SIGN: DW USIGN ;USER SIGNON USHELP: DW UHELP ;USER HELP STRING ADDR USIGN: DB 13,10,'Set up for Morrow Decision I, Port 2' DB 13,10,'$' UHELP: DB '$' ; BAUD VALUE TABLE CORRESPONDS TO BAUD RATES- THESE VALUES WILL BE USED ; BY YOUR CUSTOMIZED "INIT" ROUTINE AS THE BYTE TO BE GIVEN TO YOUR ; I/O CONTROLLER (ASSUMING YOU HAVE PROGRAMMABLE BAUD RATES). THERE ; MUST BE 16 BYTES IN THE TABLE EVEN IF YOU DO NOT HAVE 16 POSSIBLE ; BAUD RATES. THE BAUD RATES THAT CORRESPOND TO EACH ENTRY IN THIS TABLE ; ARE IN TABLE "BAUDRT". YOU SHOULD SET THESE TWO TABLES UP SO THAT ; BYTE VALUES IN THE "BAUDVL" TABLE CORRESPOND IN RELATIVE POSITION TO ; THE ENTRIES IN THE "BAUDRT" TABLE. ; BAUDVL: DB 17H ;110 BAUD (msb=4) DB 80H ;300 BAUD (msb=1) DB 192 ;600 BAUD DB 96 ;1200 BAUD DB 64 ;1800 BAUD DB 58 ;2000 BAUD DB 48 ;2400 BAUD DB 32 ;3600 BAUD DB 24 ;4800 BAUD DB 16 ;7200 BAUD DB 12 ;9600 BAUD DB 6 ;19200 BAUD DB 3 ;38400 BAUD DB 2 ;56000 BAUD DB 0 DB 0 ; ; MODEM INITIALIZATION ROUTINE-- THIS ROUTINE SHOULD DO EVERYTHING ; NECESSARY TO PREPARE YOUR SERIAL PORT FOR COMMUNICATIONS. THIS ; SETTING THE BAUD RATE IN PROGRAMMABLE BAUD RATE SYSTEMS. THE BYTE ; IN LOCATION "BAUDSL" WILL CONTAIN A NUMBER FROM 0 TO 15 INDICATING ; THE BAUD RATE SELECTED. THIS ROUTINE SHOULD LOOK THE BAUD RATE VALUE ; UP IN THE "BAUDVL" TABLE AND GIVE TO THE I/O CONTROLLER. ; COMINI: ;basic initialization mvi a,grp ;select group out grpsel mvi a,3 ;turn on DTR & RTS out mcr in rbr in rbr ;clear rcvr buffers xra a out lsr ;clear status out ier ;no interrupts ;set baud rate mvi d,4 ;baud divisor MSB for 110 baud lda baudsl ;get baud rate ora a ;110 baud? jz baud1 ;yes mvi d,1 ;divisor MSB for 300 baud cpi 1 ;300 baud? jz baud1 ;yes mvi d,0 ;divisor MSB for all other rates baud1: lxi h,baudvl ;point to value table add l ;add in offset mov l,a ;update pointer lsb mvi a,0 adc h ;just in case of a carry mov h,a ;update pointer msb mov e,m ;get divisor LSB from table mvi a,dlab+wls1+wls0+stb ;enable divisor access latch out lcr ;enable baud set mov a,d out dlm ;set MSB divisor mov a,e out dll ;set LSB divisor mvi a,wls1+wls0+stb ;close access out lcr xra a out lsr ;clear status register RET ; ; MODEM STATUS ROUTINE- THIS ROUTINE MUST RETURN WITH THE ZERO FLAG ; ON IF NO RECEIVED CHARACTER FROM MODEM IS AVAILABLE, AND THE ZERO ; OFF IF A CHARACTER IS READY. ; COMSTA: mvi a,grp ;select group out grpsel in lsr ;get status ani dr ;data rcvd? ret ;return with Z flg if no data ; ; MODEM OUTPUT ROUTINE-THIS ROUTINE SHOULD SEND THE CHARACTER CONTAINED ; IN REGISTER C TO THE MODEM TRANSMITTER. IT SHOULD FIRST BE SURE THAT ; THE MODEM IS READY TO TRANSMIT, AS THIS CHECK IS NOT DONE ELSEWHERE. ; COMOUT: mvi a,grp ;select group out grpsel comout1: in lsr ;get status ani thre ;xmit ready? jz comout1 ;wait if not mov a,c ;get char to send out thr ;send it... RET ; ; MODEM INPUT CHAR- THIS ROUTINE IS USED TO FETCH A RECEIVED CHARACTER ; FROM THE MODEM PORT AND PLACE IN THE A REGISTER. IT DOES NOT HAVE ; TO CHECK FOR RECEIVED DATA AVAILABLE SINCE ASCOM USES THE MODEM ; STATUS ROUTINE ABOVE BEFORE ANY ATTEMPT TO FETCH A CHARACTER IS MADE. ; COMINP: mvi a,grp ;select group out grpsel in rbr ;get character RET ; ; MODEM BREAK ROUTINE- IF AVAILABLE, YOU MAY PLACE A ROUTINE HERE THAT ; WILL BE USED BY ASCOM WHEN THE OPERATOR IN CONVERSATIONAL MODE ; REQUESTS A "BREAK" BY DEPRESSING CONTROL-B. IF YOUR SERIAL DEVICE ; DOES NOT SUPPORT A BREAK CHARACTER (DEFINED TO BE A 500ms LOW ON THE ; TRANSMITTED DATA LINE), THEN SIMPLY RETURN. ; COMBRK: RET COMDIL: COMANS: COMHNG: BEFDMP: AFTDMP: USER1: USER2: USER3: USER4: RET ; ; END