; programm   : waehl.asm
; syntax     : a86
; datum      : 22.07.88
; programm waehlt eine als parameter uebergebene telefon-nummer
; die telefon-nummer darf nur aus ziffern bestehen und muss mit
; einem "$" enden.
; aufruf :  waehl 1234567$

baud1      equ 03f8       ; alle angaben fuer com1
baud2      equ 03f9
leitung    equ 03fb
modemkon   equ 03fc
modemsta   equ 03fe
parame     equ 082
para_c     equ b[080h]

verz       macro
           mov cx,#1
l0:        push cx
           mov cx,013f
l1:        nop
           loop l1
           pop cx
           loop l0
#em
bild       macro
           mov ah,09
           mov dx,offset #1
           int 021
#em
warten     macro
           mov ah,01
           int 021
#em
ein        macro
           mov dx,#1
           in al,dx
#em
aus        macro
           mov dx,#1
           mov al,#2
           out dx,al
#em
           jmp start

falsch     db 'Programm falsch aufgerufen * ABBRUCH',13,10,10
           db 'Aufruf : waehl 123456$'
nummer     db '1'
da         db  30 dup(0)
aufleg     db 13,10,'Den H”rer jetzt auflegen und Taste drcken$'
abnehm     db 13,10,'Den H”rer jetzt abnehmen und Taste drcken$'

start:     cmp PARA_c,0
           jg star1
           mov dx,offset falsch
           mov ah,040
           mov bx,0002
           mov cx,(offset nummer - offset falsch)
           int 021h
           mov ah,04ch
           int 021
star1:     push ax,bx,cx,dx,di,si
           pushf
           mov bx,parame
           call holen
           call initser
           bild aufleg
           warten
           call waehlen
           aus modemkon,11
           bild abnehm
           warten
           aus modemkon,8
back:      popf
           pop si,di,dx,cx,bx,ax
           mov ah,04c
           int 021
           endp

holen:     proc near
           mov di,offset nummer
           add di,1
           mov al,[bx]
hol1:      mov [di],al
           inc di
           inc bx
           mov al,[bx]
           cmp al,'$'
           je weiter
           jmp short hol1
weiter:    mov [di],al
           ret
           endp

initser:   proc near             ; erst schnittstelle vorbereiten
           aus leitung,080
           aus baud1,0c          ; auf 9600 baud einstellen
           aus baud2,0
           aus leitung,010
           ein leitung
           or al,3
           aus leitung,al
           ein leitung
           or al,04
           aus leitung,al
           aus modemkon,10
           ret
           endp

waehlen:   proc near
           mov di,offset nummer ; beginn der zahl
w2:        mov bh,[di]
           cmp bh,'$'         ; wenn ende dann zurck
           jne w1
           ret
w1:        sub bh,48          ; 48 abziehen
           cmp bh,0
           jne w4
           mov bh,10
w4:        aus modemkon,11    ; erst 100ms relais anziehen
           verz 100           
eins:      aus modemkon,8     ; dann 45ms relais abfallen
           verz 45
           aus modemkon,11    ; dann wieder 45ms relais anziehen
           verz 45
           dec bh
           cmp bh,0           ; ist die ziffer fertig ?
           je wend
           jmp short eins
wend:      verz 1000          ; 1 sek relais anziehen
           inc di             ; naechste ziffer
           jmp w2
           endp




