;TITLE - DIAL - Dialing Directory to phone nos. via POPCOM modem
; C.A.D. (Computer Aided Dialing ) Prog by R. Hirsh, 5-19-85  VER 1.1
;
; Program from REMARK Vol 6, Issue 10, Oct 85, page 73
;
;Prog is invoked with SHIFT-F12 key after installation.
;
BIOS    SEGMENT AT 40H
       ORG     9       ;DISPLAY CHAR IN AL
BIOS_CONOUT LABEL FAR   ; ON CONSOLE - SEE BCONIO.ASM
       ORG     18      ;OUTPUT CHAR IN AL
BIOS_AUXOUT LABEL FAR   ; TO AUX DEVICE - SEE BAUXIO.ASM
BIOS    ENDS
;
;DEFINITIONS
ESC     EQU     27
CR      EQU     13
LF      EQU     10
TAB     EQU     9
DEN     EQU     21      ;NO. OF ENTRIES IN DIRECTORY
KBDD    EQU     0F4H    ;KEYBOARD DATA PORT
KBDS    EQU     0F5H    ;KEYBOARD STATUS PORT: BIT 0, 1=> CHAR TO READ
                       ; BIT 1, 0=>KBD PROCESSOR READY
;
CODE    SEGMENT PARA PUBLIC 'CODE'
       ASSUME CS:CODE, DS:CODE, SS:CODE
       ORG     100H
;
START:  JMP     INIT    ;INIT INSTALLS INT SERV ROUT ADDR INTO VECTOR TABLE
;
;VARIABLES
BUFF    DB      3 DUP (?)       ;KEYBOARD INPUT BUFFER
CHRS    DB      37              ;CHARS IN DIALING STRING
INVMSG  DB      CR,ESC,'K','INVALID ENTRY!  ENTER A NUMBER: ',0
;
OPTIONS DB      ESC,'m70',ESC,'E',CR,LF
       DB      ESC,'m50',TAB,TAB,TAB,TAB,'MODEM DIALER',ESC,'m70',CR,LF,CR,LF
       DB      ESC,'m40','COMPUTERS:',ESC,'m70'
       DB          '    0...VAX, Node A                6...Another BBS',CR,LF
       DB      TAB,'    1...VAX, Node B                7...Byte BBS',CR,LF
       DB      TAB,'    2...VAX, Node C                8...CompuServe',CR,LF
       DB      TAB,'    3...VAX, Node D                9...    ',CR,LF
       DB      TAB,'    4...DEC10                      10...   ',CR,LF
       DB      TAB,'    5...Zenith BBS         11...   ',CR,LF
       DB      ESC,'m20','HUMAN:       ',ESC,'m70'
       DB          '   12...Blaze Pascal, Joliet, IL',CR,LF
       DB      TAB,'   13...Connie Cobol, Chgo, IL',CR,LF
       DB      TAB,'   14...Frank Fortran, Tampa, FL',CR,LF
       DB      TAB,'   15...   ',CR,LF
       DB      TAB,'   16...Weather    ',CR,LF
       DB      TAB,'   17...Smart Graphics, StL, MO',CR,LF
       DB      TAB,'   18...Heath Soft. Consult., OS and LangSoft.',CR,LF
       DB      TAB,'   19...Heath Soft Consult., Appl. Pgms.',CR,LF
       DB      TAB,'   20...   ',CR,LF
       DB      TAB,'   21...EXIT DIAL',CR,LF,CR,LF
       DB      ESC,'m60','Enter the number of the device or person you want to call and hit return: ',ESC,'m71',0
HGMG    DB      CR,ESC,'K','Hit "H" to hang up or RETURN to exit DIAL program',0
;
;Enter numbers and special characters here (comma = 2 second pause)
MSG0    DB      'ATD 123-4567,,,,,890123-111            ',CR    ;NODE A
       DB      'ATD 123-4567,,,,,890123-222            ',CR    ;Node B
       DB      'ATD 123-4567,,,,,890123-333            ',CR    ;Node C
       DB      'ATD 123-4567,,,,,890123-444            ',CR    ;Node D
       DB      'ATD 123-4567,,,,,890123-555            ',CR    ;Node D
       DB      'ATD 616-982-3503                       ',CR    ;ZEN 5
       DB      'ATD                                    ',CR    ;6
       DB      'ATD 603-924-9820                       ',CR    ;BYTE 7
       DB      'ATD 241-3101                   ',CR    ;COMS 8
       DB      'ATD                                    ',CR    ;9
       DB      'ATD                            ',CR    ;10
       DB      'ATD                                    ',CR    ;11
       DB      'ATD                                    ',CR    ;12
       DB      'ATD                                    ',CR    ;13
       DB      'ATD                                    ',CR    ;14
       DB      'ATD                                    ',CR    ;15
       DB      'ATD 321-2222                   ',CR    ;WEA 16
       DB      'ATD 314-962-7833                       ',CR    ;SG 17
       DB      'ATD 616-982-3860                       ',CR    ;ZEN OS 18
       DB      'ATD 616-982-3884                       ',CR    ;ZEN PG 19
       DB      'ATD                                    ',CR    ;20
       DB      'ATD                                    ',CR    ;EXIT 21
;
HGUP    DB      'ATH0',CR       ;HANG UP
;
;INT 5 SERVICE ROUTINE
INT5:   PUSH    DS
       PUSH    ES
       PUSH    SI
       PUSH    DI
       PUSH    BP
       PUSH    DX
       PUSH    CX
       PUSH    BX
       PUSH    AX
       PUSH    CS
       POP     DS

       CALL    MAIN

       POP     AX
       POP     BX
       POP     CX
       POP     DX
       POP     BP
       POP     DI
       POP     SI
       POP     ES
       POP     DS
       IRET
;
;MAIN PROGRAM
MAIN    PROC    NEAR
       MOV     SI,OFFSET OPTIONS       ;LIST THE DIRECTORY NUMBERS
       CALL    DISPLAY
;
GET_NUM:   CALL READKEYS                ;READ IN THE CHARS
       CALL    ASCII_BIN               ;CONVERTS TO BINARY (NO. IN AX)
       JNC     VALID                   ;IS THE ENTRY VALID?
       MOV     SI,OFFSET INVMSG                ; NO, DISPLAY ERROR MSG
       CALL    DISPLAY
       JMP     GET_NUM                 ; AND TRY AGAIN
VALID:  CMP     AL,DEN
       JNB     THRU                    ;EXI IF "DEN" OR GREATER IS CHOSEN
;
       MOV     BX, OFFSET MSG0         ;POINT TO MSG0
       MUL     CHRS                    ;AX=AX*37
       ADD     BX,AX                   ;POINT TO DESIRED MSG
;
       MOV     CX,37                   ;GET SET TO SEND 37 CHARS
       CALL    AUX_IT                  ;SEND STRING OUT TO AUX PORT
;
       MOV     SI,OFFSET HGMG          ;GIVE OPTION OF HANGING UP
       CALL    DISPLAY
;
       CALL    GET_KEY
       CMP     AL,'H'                  ;IS IT AN H?
       JNE     THRU                    ;NO, EXIT
;
       MOV     BX, OFFSET HGUP         ; YES, HANG UP
       MOV     CX,5                    ;GET SET TO SEND 5 CHARS
       CALL    AUX_IT                  ;SEND STRING OUT AUX PORT
;
THRU:   RET                             ;EXIT DIAL PROG
MAIN    ENDP
;
;PROC READS KEYS INTO BUFF UNTIL RETURN IS HIT.  ALLOWS THREE KEYS MAX.
READKEYS  PROC  NEAR            ;ON RETURN, BUFF'S STARTING ADDRESS IS IN BX AND
                               ;CHAR COUNT IS IN CX - FROM LJ SCANLON, P 236
       MOV     DI,0            ;DI IS KEY COUNT
       MOV     CX,3            ;GET READY FOR 3 KEYSTROKES MAX
GETKEY: CALL    GET_KEY         ;READ A KEY, PUT CHAR IN AL
       CALL    BIOS_CONOUT     ;DISPLAY IT
       CMP     AL,0DH          ;IS IT A RETURN?
       JE      SAV_CNT         ;IF SO, EXIT VIA SAV_CNT
       MOV     BUFF[DI],AL     ;IF NOT, STORE THE CHAR (AL) IN MEMORY
                               ;LOCATION BUFF+DI (DI IS KEY COUNT)
       INC     DI              ; AND UPDATE THE KEY COUNT
       LOOP    GETKEY          ;GET NEXT KEY
SAV_CNT: MOV    CX,DI           ;FINAL KEY COUNT IS PUT INTO CX
       MOV     BX,OFFSET BUFF  ; AND LEAVE ADDRESS OF BUFF IN BX
       RET
READKEYS        ENDP
;
;UPON ENTRY, STARTING ADRESS OF STRING SHOULD BE IN BX AND
; NO. OF CHARS IN CX. UPON RET. BIN NO. IS IN AX.
; IF NO. TYPED IS NON VALID CHAR, CARRY FLAG IS SET TO SIGNAL ERROR.
ASCII_BIN  PROC  NEAR
       XOR     AX,AX
; CONVERT THE STRING
RANGE:  CMP     BYTE PTR [BX],'0'       ;IS CHAR A NUMBER?
       JB      NON_DIG                 ;NO, JMP TO NON_DIG (ASCII CODE<30)
       CMP     BYTE PTR [BX],'9'       ;IS CHAR A NUMBER?
       JBE     DIGIT                   ;YES, JMP TO DIGIT (ASCII CODE<=39)
NON_DIG:        STC             ;IF NOT A DIGIT, SET CF FOR ERROR MARKING
       JC      END_CONV        ; AND EXIT
DIGIT:  MOV     SI,10           ;THE CHAR IS A NUMBER
       PUSH    DX
       MUL     SI              ; SO MULTIPLY AX BY 10
       POP     DX
       MOV     DL,[BX]     ;FETCH CHAR AND PUT IT IN DL (6 IN ASCII IS 36)
       AND     DX,0FH          ;SAVE ONLY LOW BITS (36H--> 06H)
       ADD     AX,DX           ;UPDATE PARTIAL RESULTS
       JC      END_CONV        ;EXIT IF RESULT IS TOO BIG (IF CF SET)
       INC     BX              ;OTHERWISE, INC BX AND CONTINUE
       LOOP    RANGE
       CLC                     ;WHEN DONE, CLEAR CF
END_CONV:       RET
ASCII_BIN       ENDP
;
;DISPLAY STRING AT SI ON CONSOLE
DISPLAY PROC    NEAR
       MOV     AL,BYTE PTR [SI]
       OR      AL,AL           ;DISPLAY IT UNTIL A '0' IS FOUND
       JNZ     DISCALL
       RET
DISCALL:  CALL  BIOS_CONOUT     ;DISPLAY CHAR IN AL
       INC     SI
       JMP     SHORT DISPLAY
DISPLAY ENDP
;
;PROC WAITS FOR A KEY TO BE HIT AND RETURN WITH CHAR IN AL
GET_KEY PROC    NEAR
WAIT:   IN      AL,KBDS         ;CHECK STATUS PORT
       AND     AL,1            ; IF AL=1, CHAR TO READ
       JZ      WAIT
       IN      AL,KBDD         ;READ CHAR
       RET
GET_KEY ENDP
;
;PROC SEND A STRING OUT THE AUX PORT.  ENTER WITH NO. OF CHARS TO SEND IN CX
; AND BX-->STARTING ADDRESS OF SRRING.
AUX_IT  PROC    NEAR
LOOP1:  MOV     AL,[BX]         ;PUT CHAR IN AL
       CALL    BIOS_AUXOUT     ;OUTPUT CHAR TO MODEM PORT
       INC     BX
       LOOP    LOOP1           ;OUTP[UT ALL THE CHARS
       RET
AUX_IT  ENDP
;
PGM_END LABEL   NEAR    ;*CODE BEYOND THIS POINT IS LOST AFTER INSTALLATION
;
;INSTALL INTERUPT SERVICE ROUTINE ADDRESS IN JUMP TABLE
INIT:   PUSH    DS
       XOR     AX,AX
       MOV     DS,AX           ;DS=SEGMENT OF INT SERV RT JMP TABLE (=0)
       MOV     SI,5*4          ;OFFSET OF INT 5
       CLI                     ;INTS OFF
       MOV     WORD PTR [SI],OFFSET INT5       ;INSTALL OFFSET OF ROUTINE
       MOV     WORD PTR [SI+2],CS              ;INSTALL SEGMENT OF ROUTINE
       STI                                     ;START INTS
       POP     DS
       MOV     SI,OFFSET MG            ;PRINT INSTALLATION MESSAGE ON CRT
       CALL    DISPLAY
       MOV     DX,OFFSET PGM_END       ;TERMINATE AND STAY RESIDENT
       INT     27H
;
MG      DB      ESC,'m20','DIAL Software Installed!',ESC,'m40',CR,LF
       DB      'Hit SHIFT-F12 when ready to dial.',ESC,'m70',CR,LF,0
;
CODE    ENDS
       END     START