;;; zorba - CIOS for MITE utility / Zorba, Smartmodem verison ; ; L.E. Hughes ; ; Mycroft Labs, Inc. ; P.O. Box 6045 ; Tallahassee, FL 32301 ; ; (904) 385-2708 stat equ 021H data equ 020H rate equ 00H rda equ 02H tbe equ 01H cr equ 0DH ;carriage return lf equ 0AH ;line feed eos equ '$' ;end of string org 180H ;; jump vector ; jmp initm jmp modin jmp modout jmp chkrr jmp chktr jmp chkcd jmp chkpe jmp chkfe jmp chkoe jmp chkri jmp setbr jmp setpar jmp set8db jmp set2sb jmp setorg jmp setoh jmp settxe jmp setbrk jmp dial jmp tenths jmp w1ms ;;; initm - initialize modem ; initm: mvi a,40H out stat mvi a,01111010B out stat sta cr1 mvi a,00100111B out stat sta cr2 ; interrupt routine init for modem lxi h,comint ;point to interrupt routine shld 0ff88H ;save somewhere mvi a,02 ;set interrupt mask on rda out 26H ;out to interrupt mask lxi h,comque ;set pointer to buffer shld comnxt ;set next pointer shld comlst ;set last pointer ei ret ;;; comint - communications interrupt routine ; ; comint: push psw push b push d push h ;save state in stat ani rda jz comin2 lhld comlst ;get address for next character in data mov m,a ;put char in buffer inx h shld comlst ;save pointer mov a,l ora a ;check for end jnz comin2 ;jump if now comin1: lxi h,comque shld comlst ;reset to beginning comin2: pop h pop d pop b pop psw ei ret ;;; modin - input character from modem ; ; exit: A character from modem ;modin: in data ; ret modin: push h push d call chkrr ;check for character there jnc modin3 ;exit if not lhld comnxt ;point to char mov a,m ;get character push psw ;save it inx h shld comnxt ;update pointer mov a,l ;check for end ora a jnz modin2 ;jump if not modin1: lxi h,comque shld comnxt ;reset to beginning modin2: pop psw modin3: pop d pop h ret ;;; modout - output character to modem ; ; entry: A character for modem modout: out data ret ;;; chkrr - check for receiver ready ; ; exit: c-flag set if character available ;chkrr: in stat ; ani 02H ; jz chkrr1 ; stc ; ret ;xchkrr1: ora a ; ret chkrr: push h push d lhld comnxt ;compare first with last in buffer xchg lhld comlst mov a,h sub d jnz chkrr0 ;character ready mov a,l sub e jnz chkrr0 ;character ready ora a pop d pop h ret ;exit no character chkrr0: stc pop d pop h ret ;exit with character ready ;;; chktr - check for tranmitter ready ; ; exit: c-flag set if transmitter ready chktr: in stat ani 01H jz chktr1 stc ret chktr1: ora a ret ;; chkcd - check for carrier detect ; ; exit: c-flag set if carrier present chkcd: in stat ani 80H jz chkcd1 stc ret chkcd1: ora a ret ;;; chkpe - check for parity error ; ; exit: c-flag set if parity error chkpe: in stat ani 08H jz chkpe1 stc ret chkpe1: ora a ret ;;; chkfe - check for frame error ; ; exit: c-flag set if frame error chkfe: in stat ani 20H jz chkfe1 stc ret chkfe1: ora a ret ;;; chkoe - check for overrun error ; ; exit: c-flag set if overrun error chkoe: in stat ani 10H jz chkoe1 stc ret chkoe1: ora a ret ;;; chkri - check for ring indicate ; ; exit: c-flag set if incoming call chkri: stc ret ;;; setbr - set baud rate ; ; entry: HL baud rate ; ; exit: c-flag set if error setbr: lxi d,110 lxi b,0c111H call cmpde jz setbrx lxi d,150 lxi b,050DH call cmpde jz setbrx lxi d,300 lxi b,8306H call cmpde jz setbrx lxi d,600 lxi b,4103H call cmpde jz setbrx lxi d,1200 lxi b,0a101H call cmpde jz setbrx lxi d,2400 lxi b,0d000H call cmpde jz setbrx lxi d,4800 lxi b,6800H call cmpde jz setbrx lxi d,9600 lxi b,3400H call cmpde jz setbrx lxi d,19200 lxi b,1a00H call cmpde jz setbrx stc ret setbrx: mvi a,36H out rate+3 mov a,b out rate mov a,c out rate ora a ret ;;; setpar - set parity ; ; entry: A parity select code: ; 0 = NONE ; 1 = ODD ; 2 = EVEN setpar: ora a ;jump if A .ne. 0 jnz setp1 mvi b,10H jmp cr1off setp1: dcr a ;jump if A .ne. 1 jnz setp2 mvi b,10H call cr1on mvi b,20H jmp cr1off setp2: mvi b,10H call cr1on mvi b,20H jmp cr1on ;;; set8db - set number of data bits ; ; entry: A data bits select code: ; 0 = 7 data bits ; 1 = 8 data bits set8db: ora a ;jump if A .ne. 0 jnz set8d1 mvi b,04H call cr1off ret set8d1: mvi b,04H call cr1on ret ;;; set2sb - set number of stop bits ; ; entry: A stop bits select code: ; 0 = 1 stop bit ; 1 = 2 stop bits set2sb: ora a ;jump if A .ne. 0 jnz set2s1 mvi b,80H jmp cr1off set2s1: mvi b,80H jmp cr1on ;;; setorg - set modem mode (answer or originate) ; ; entry: A mode select code: ; 0 = answer ; 1 = originate setorg: ret ;;; setoh - set phone "off hook" ; ; entry: A hook select code: ; 0 = on hook (hung up) ; 1 = off hook setoh: ora a jnz setoh1 mvi b,02H jmp cr2off setoh1: mvi b,02H jmp cr2on ;;; settxe - set transmitter enable ; ; entry: A transmitter enable code: ; 0 = disabled ; 1 = enabled settxe: ret ;;; setbrk - set communications line break ; ; entry: A break enable code: ; 0 = normal ; 1 = break setbrk: ora a ;jump if A .ne. 0 (break) jnz setbk1 mvi b,08H jmp cr2off setbk1: mvi b,08H jmp cr2on ;; cr1on - turn on bit(s) on modem control reg. one ; ; entry conditions ; ; b ones in positions to turn on cr1on: push psw mvi a,40H out stat lda cr1 ora b sta cr1 out stat lda cr2 out stat pop psw ret ;; cr1off - turn bit(s) off on modem control reg. one ; ; entry conditions ; ; b ones in positions to turn off cr1off: push psw mvi a,40H out stat mov a,b cma mov b,a lda cr1 ana b sta cr1 out stat lda cr2 out stat pop psw ret ;; cr2on - turn on bit(s) on modem control reg. two ; ; entry conditions ; ; b ones in positions to turn on cr2on: push psw lda cr2 ora b sta cr2 out stat pop psw ret ;; cr2off - turn bit(s) off on modem control reg. two ; ; entry conditions ; ; b ones in positions to turn off cr2off: push psw mov a,b cma mov b,a lda cr2 ana b sta cr2 out stat pop psw ret ;;; cmpde - compare de to hl ; ; exit: c-flag set if de < hl ; z-flag set if de = hl cmpde: mov a,h cmp d rnz mov a,l cmp e ret ;;; dial - dial phone number ; ; entry: HL points to phone number, term by 0 byte dial: push h lxi d,str1 ;point to header string call wasm ;write to 'modem' pop h dial1: mov a,m ;fetch next digit ora a ;jump if end of string jz dial2 call wacm ;write to modem inx h jmp dial1 dial2: mvi a,cr ;issue CR call wacm ret ;; wasm - write ASCII string to modem ; wasm: ldax d cpi '$' rz call wacm inx d jmp wasm ;; wacm - write ASCII character to modem ; wacm: push psw wacm1: call chktr jnc wacm1 pop psw jmp modout ;; racm - read ASCII character from modem ; racm: call chkrr jnc racm jmp modin ;; tenths - wait B tenths of a second ; ; entry: B number of tenths of a second to wait tenths: call tenth dcr b jnz tenths ret ;; tenth - wait 1 tenth of a second ; tenth: push b mvi b,100 tenth1: call w1ms dcr b jnz tenth1 pop b ret ;; w1ms - wait one millisecond ; w1ms: push psw push h lxi h,160 w1ms1: dcx h mov a,h ora l jnz w1ms1 pop h pop psw ret str1: db cr,'AT D$' ;SMARTMODEM dial header cr1: ds 1 cr2: ds 1 comnxt: ds 2 comlst: ds 2 comque equ ($+255)/256*256 ds 256 end sanyo