;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. ; ; ; ; 0002 = grp equ 2 ;group (port) to use 0048 = mbase equ 48H ;I/O base address 004F = grpsel equ mbase+7 ;group select port 0048 = dll equ mbase ;baud rate (lsb) 0049 = dlm equ mbase+1 ;baud rate (msb) 0049 = ier equ mbase+1 ;interrupt enable register 004B = lcr equ mbase+3 ;line control register 004C = mcr equ mbase+4 004D = lsr equ mbase+5 ;line status register 004E = msr equ mbase+6 0048 = rbr equ mbase ;rcvd data buffer 0048 = thr equ mbase ;xmit data buffer 0080 = dlab equ 80h ;divisor latch access bit 0020 = thre equ 20h ;xmit ready bit 0001 = dr equ 1 ;rcvd data bit 0001 = wls0 equ 1 ;word length select bit 0 0002 = wls1 equ 2 ;word length select bit 1 0004 = stb equ 4 ;stop bit count (2 stop bits) ; 0103 ORG 103H ; START: 0103 C38C01 JMP COMINI ;JUMP TO MODEM INIT 0106 C3CB01 JMP COMSTA ;JUMP TO MODEM STATUS 0109 C3E301 JMP COMINP ;JUMP TO MODEM INPUT 010C C3D401 JMP COMOUT ;JUMP TO MODEM OUTPUT 010F C3EA01 JMP COMBRK ;JUMP TO MODEM BREAK ROUTINE 0112 C3EB01 JMP COMDIL ;JUMP TO AUTO DIAL ROUTINE 0115 C3EB01 JMP COMANS ;JUMP TO AUTO ANSWER ROUTINE 0118 C3EB01 JMP COMHNG ;JUMP TO HANGUP ROUTINE 011B C3EB01 JMP BEFDMP ;JUMP TO PRE-CAPTURE ROUTINE 011E C3EB01 JMP AFTDMP ;JUMP TO POST-CAPTURE ROUTINE 0121 C3EB01 JMP USER1 ;JUMP TO FIRST USER ROUTINE 0124 C3EB01 JMP USER2 ;JUMP TO SECOND USER ROUTINE 0127 C3EB01 JMP USER3 ;JUMP TO THIRD USER ROUTINE 012A C3EB01 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: 012D 6E00 DW 110 012F 2C01 DW 300 0131 5802 DW 600 0133 B004 DW 1200 0135 0807 DW 1800 0137 D007 DW 2000 0139 6009 DW 2400 013B 100E DW 3600 013D C012 DW 4800 013F 201C DW 7200 0141 8025 DW 9600 0143 004B DW 19200 0145 2600 DW 38 ;38.4K BAUD 0147 3800 DW 56 ;56K BAUD 0149 0000 DW 0 014B 0000 DW 0 ; 014D 00 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 014E 5201 SIGN: DW USIGN ;USER SIGNON 0150 7B01 USHELP: DW UHELP ;USER HELP STRING ADDR 0152 0D0A536574USIGN: DB 13,10,'Set up for Morrow Decision I, Port 2' 0178 0D0A24 DB 13,10,'$' 017B 24 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: 017C 17 DB 17H ;110 BAUD (msb=4) 017D 80 DB 80H ;300 BAUD (msb=1) 017E C0 DB 192 ;600 BAUD 017F 60 DB 96 ;1200 BAUD 0180 40 DB 64 ;1800 BAUD 0181 3A DB 58 ;2000 BAUD 0182 30 DB 48 ;2400 BAUD 0183 20 DB 32 ;3600 BAUD 0184 18 DB 24 ;4800 BAUD 0185 10 DB 16 ;7200 BAUD 0186 0C DB 12 ;9600 BAUD 0187 06 DB 6 ;19200 BAUD 0188 03 DB 3 ;38400 BAUD 0189 02 DB 2 ;56000 BAUD 018A 00 DB 0 018B 00 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 018C 3E02 mvi a,grp ;select group 018E D34F out grpsel 0190 3E03 mvi a,3 ;turn on DTR & RTS 0192 D34C out mcr 0194 DB48 in rbr 0196 DB48 in rbr ;clear rcvr buffers 0198 AF xra a 0199 D34D out lsr ;clear status 019B D349 out ier ;no interrupts ;set baud rate 019D 1604 mvi d,4 ;baud divisor MSB for 110 baud 019F 3A4D01 lda baudsl ;get baud rate 01A2 B7 ora a ;110 baud? 01A3 CAAF01 jz baud1 ;yes 01A6 1601 mvi d,1 ;divisor MSB for 300 baud 01A8 FE01 cpi 1 ;300 baud? 01AA CAAF01 jz baud1 ;yes 01AD 1600 mvi d,0 ;divisor MSB for all other rates baud1: 01AF 217C01 lxi h,baudvl ;point to value table 01B2 85 add l ;add in offset 01B3 6F mov l,a ;update pointer lsb 01B4 3E00 mvi a,0 01B6 8C adc h ;just in case of a carry 01B7 67 mov h,a ;update pointer msb 01B8 5E mov e,m ;get divisor LSB from table 01B9 3E87 mvi a,dlab+wls1+wls0+stb ;enable divisor access latch 01BB D34B out lcr ;enable baud set 01BD 7A mov a,d 01BE D349 out dlm ;set MSB divisor 01C0 7B mov a,e 01C1 D348 out dll ;set LSB divisor 01C3 3E07 mvi a,wls1+wls0+stb ;close access 01C5 D34B out lcr 01C7 AF xra a 01C8 D34D out lsr ;clear status register 01CA C9 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: 01CB 3E02 mvi a,grp ;select group 01CD D34F out grpsel 01CF DB4D in lsr ;get status 01D1 E601 ani dr ;data rcvd? 01D3 C9 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: 01D4 3E02 mvi a,grp ;select group 01D6 D34F out grpsel comout1: 01D8 DB4D in lsr ;get status 01DA E620 ani thre ;xmit ready? 01DC CAD801 jz comout1 ;wait if not 01DF 79 mov a,c ;get char to send 01E0 D348 out thr ;send it... 01E2 C9 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: 01E3 3E02 mvi a,grp ;select group 01E5 D34F out grpsel 01E7 DB48 in rbr ;get character 01E9 C9 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: 01EA C9 RET COMDIL: COMANS: COMHNG: BEFDMP: AFTDMP: USER1: USER2: USER3: USER4: 01EB C9 RET ; ; 01EC END