home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
modems
/
modem7
/
mo700rv.asm
< prev
next >
Wrap
Assembly Source File
|
1994-07-13
|
20KB
|
896 lines
; NOTE: This overlay is VERY dependent on version of the MODM7xx
; that it is running with. As of 5 Nov 84, it is configured
; for MODM700.COM as distributed. Be careful if configuring
; for different versions of MODM7xx.
; You should be able to configure it for your system just
; by modifying the two routines SETDTRH and SETDTRL. They
; are USART-specific. Then just overlay this file AFTER
; overlaying your normal configure file. Make sure that
; your normal configure file doesn't go past 3FFH since this
; one starts at 400H.
;
; MO700RV.ASM Racal-Vadic VA212PA overlay for MODM700
;
; The Racal-Vadic VA212PA modem is configured as follows
;
; 1*2 STANDART OPTN 2*1 ASYNCH/SYNCH
; 3*2 DATA RATE SEL 4*1 103 OPERATION
; 5*3 CHARACTER LEN 6*1 ORIG/ANS MODE
; 7*2 SLAVE CLOCK 8*2 DTR CONTROL
; 9*2 ATT/UNATT DISC 10*1 LOSS CXR DISC
; 11*2 REC SPACE DISC 12*2 SEND SPACE DIS
; 13*1 ABORT DISC 14*1 REMOT TST RESP
; 15*4 DSR CONTROL 16*2 CXR CONTROL
; 17*1 AUTO LINKING 18*3 ALB CONTROL
; 19*6 AUTO ANSWER 20*1 TERMINAL BELL
; 21*1 LOCAL COPY 22*3 DIAL MODE
; 23*2 BLIND DIAL 24*1 CALL PROGRESS
; 25*2 FAIL CALL SEL 26*9 AUTO REDIAL
;
; #, K, and * may be used in the phone number command line,
; CAL #8K9Kxxx-xxx-xxxx (up to 31 digits).
;
; Initialization routines need to be changed to support your I/O devices
; are: SETDTRH and SETDTRL - Examples for USART
; initialization may be found in BYE2-16.LBR. The modem is disconnected
; from on-line by dropping the DTR line, this must be implemented in the
; SETDTRL: routine in accordance with your I/O devices. The modem is
; enabled by setting DTR high and must be implemented in your SETDTRH:
; routine.
;
; To install the overlay make your changes for the USART
; dependent routines. This overlay may directly be used
; if your system uses the Intel 8251 USART.
;
; A>DDT MODM700.COM <== Start with MODM700.COM (or .OBJ)
; DDT VERS 2.2
; NEXT PC
; 4A00 0100
; -IM7xx-1.HEX
; -R <== Read in your normal MDM7xx overlay
; -IMO700RV.HEX
; -R <== Read in this to add PA212 support
; NEXT PC
; 4A00 0000
; -G0
;
; A>SAVE 73 MODM700.COM
;
; K, # and * are valid characters for the Racal (#8K9Kxxx-xxxx) and may
; be included in the phone number. #8 is used by some PBX systems to
; have a clear phone line with no call waiting signals. INSURE ALL NAMES
; IN THE PHONE NUMBER LIBRARY HAVE LOWER CASE "k" and phone numbers upper
; case "K" if needed.
;
;***********************************************************************
;
; 11/5/84 - Adjusted for MODM700 - mabry
; 3/28/84 - Adjusted equates for MDM730 - mabry
; 3/16/84 - Adjusted equates for MDM728 - mabry
; 3/5/84 - Adjusted equates for MDM727 - mabry
; 2/18/84 - Adjusted equates for MDM724 - mabry
; 2/16/84 - Adjusted equates for MDM723 and modified DIAL routine so
; it can handle the new 36 number phone number library. - mabry
; 1/5/84 - Set up equates at end for MDM716 and removed all hardware-
; specific routines (except SETDTRH and SETDTRL) so that
; this file can be used with most other systems assuming
; there is an overlay for those systems already. - mabry
; 11/11/83 - Renamed to M7RV-1.ASM, no changes - Irv Hoff
; 10/15/83 - First version for Racal-Vadic - Fred Willink
;
;***********************************************************************
;
YES: EQU 0FFH
NO: EQU 0
;
CANCEL: EQU 'X'-40H ;^X = Cancel
ESC: EQU '['-40H ;^[ = escape
BELL: EQU 'G'-40H ;^G = bell character
LF: EQU 'J'-40H ;^J = linefeed
CR: EQU 'M'-40H ;^M = carriage RETRN
PRINT: EQU 9
BDOS: EQU 0005H
;
LIBLEN: EQU 34 ; Length of each phone number
;
;=======================================================================
;
ORG 0100H
;
;
DS 3 ; Skip JMP START
;
PMMIMODEM: DB NO
SMARTMODEM: DB YES ; yes=Racal-Vadic VA122PA the main
; program test this byte to use the
; new routines
DS 1
CLOCK: DS 1 ;clock speed x10, up to 25.5 mhz.
;2 MHz=20, 3.68 MH=37, 4 MHz=40, etc.
MSPEED: DS 1 ;sets display time for sending a file
;0=110 1=300 2=450 3=600 4=710
;5=1200 6=2400 7=4800 8=9600 9=19200
DS 3
SETUPTST: DS 1 ;yes=non-PMMI setup routine
SCRNTEST: DS 1 ;yes=home cursor and clear screen
DS 29
;
;
; Handles in/out ports for data and status
;
IN$MODCTL1: DS 10 ;in modem control port
OUT$MODDATP: DS 10 ;out modem data port
IN$MODDATP: DS 10 ;in modem data port
ANI$MODRCVB: DS 3 ;bit to test for receive ready
CPI$MODRCVR: DS 3 ;value of receive bit when ready
ANI$MODSNDB: DS 3 ;bit to test for send ready
CPI$MODSNDR: DS 3 ;value of send bit when ready
;
IN$BAUDRP: DS 3 ;in baudrate port
OUT$BAUDRP: DS 3 ;out baudrate port
OUT$MODCTL1: DS 3 ;out modem control port #1
OUT$MODCTL2: DS 3 ;out modem control port #2
;
LOGONPTR: DS 2
JMP$DIAL: JMP DIAL ; \
JMP$DISCONNT: JMP DISCONNT ; > We change these vectors
JMP$GOODBYE: JMP GOODBYE ; /
JMP$INITMOD: DS 3
JMP$NEWBAUD: RET ; Defeat this one...
DS 2
JMP$NOPARITY: RET ; ...and this one...
DS 2
JMP$PARITY: RET ; ...and this one...
DS 2
JMP$SETUPR: DS 3
JMP$SPCLMENU: RET ; ...and this one.
DS 2
JMP$SYSVER: DS 3
JMP$BREAK: DS 3
;
JMP$ILPRT: DS 3
JMP$INBUF: DS 3
JMP$INLNCOMP: DS 3
JMP$INMODEM: DS 3
JMP$NXTSCRN: DS 3
JMP$TIMER: DS 3
;
;.....
; After all the absolute locations above will generally be the user's
; hardware-specific subroutines. We allow up to 3FFH for those and
; then start some routines of our own that support the Racal-Vadic PA212
; modem. If the user's routines need more room, this might be able to
; start a little lower, but just a few bytes probably.
ORG 400H
;
; NOTE: You will have to change these next two routines if you don't
; have an 8251A for your USART.
;
ENABL EQU 37H
DTR EQU 2
;
; Raise DTR to enable modem
;
SETDTRH: MVI A,enabl
JMP OUT$MODCTL1
;.....
;
;
; Drop DTR to disable modem
;
SETDTRL: MVI A,enabl-dtr
JMP OUT$MODCTL1
RET
;.....
;
; End of USART dependent routines
;=======================================================================
;
; RACAL-VADIC DIALING ROUTINES
;
;=======================================================================
;
; Dialing routine
;
DIAL: XRA A ; Zero out some flags
STA CRFLAG
STA RNGBKFL
STA RINGFLG
STA DOT ; Indicates dot encountered in library
LXI H,0
SHLD DIALCT
LXI H,CMDBUF+1 ; Point to character count of user
MOV A,M ; input to prompt
CPI 3+1 ; More than 3 letters input ?
JC DIAL1 ; No, then go display library of #'s
;
;
; If there were only 3 characters, then "CAL<RET>" was typed -- the user
; obviously expecting to get a phone number (or letter) from the library
; file. If 4 or more, a number (or letter) was typed in from the menu
; command line, so move the characters down 4 to compensate. Needed for
; auto-redialing of menu command line entries.
;
MOV C,A
MVI B,0
SUI 4 ; Adjust count down by 4
MOV M,A ; Store back in CMDBUF+1
INX H ; Point to CMDBUF+2
XCHG
LXI H,CMDBUF+6
CALL MOVER ; Move buffer down by 4
JMP DIAL4
;...
;
;
; Comes here if no phone number was manually entered after "CAL" and if
; no phone library letter was entered. Displays the phone number li-
; brary, then asks for an entry.
;
DIAL1: MVI C,18 ; Lines of phone numbers to display
LXI H,NUMBLIB
LXI D,BUFFER
CALL NEWLINE
STAX D
INX D
;
DIAL2: MVI B,LIBLEN
CALL MOVE
CALL SPACES
MVI B,LIBLEN
CALL MOVE
CALL NEWLINE
DCR C
JNZ DIAL2
;
DIAL3: MVI A,'$'
STAX D
CALL CLRTST ;clear screen
MVI C,PRINT
LXI D,BUFFER ;show library
CALL BDOS
CALL JMP$ILPRT
DB CR,LF,'Enter library letter or phone number,',CR,LF
DB 'CTL-X quits while dialing or ringing: ',0
LXI D,CMDBUF
CALL INBUF ;get input, library letter or phone #
;
;
; You now have either a library letter or a manually entered phone num-
; ber. These either came from the menu command line or from the library
; command line. Next we see if a letter, if so, get the corresponding
; line with phone number from the library. If a number we ignore the
; library look-up. (Ringback numbers must end with letter 'R'.)
;
DIAL4: LXI H,CMDBUF+1
MOV A,M ; Get character count
ORA A ; No entry ?
JZ DIALEXIT ; then exit
PUSH H
CALL DISCONNT ;disconnect the modem and place in idle
POP H
MOV A,M ; Get count again
CPI 1 ; One character (ie. get phone number
JZ DIAL4A ; from library) ?
MVI A,YES ; Set dot flag so that we don't skip
STA DOT ; anything user types in
JMP DIAL9
DIAL4A:
INX H ; Point to user entry
MVI B,'A' ; Need to compare against A-Z
MVI E,0
MVI C,'Z'-'A'+1 ; How many to check
MOV A,M ; Get user input character
;
DIAL5: CMP B ; Compare against letter (A-Z)
JZ DIAL6 ; Got match
INR B ; Next letter
INR E ; Keep count
DCR C
JNZ DIAL5 ; Loop for all letters
; Checked all letters, now do numbers 0-9
MVI B,'0' ; Start at 0
MVI C,'9'-'0'+1 ; How many to check
DIAL5A:
CMP B ; Compare against number
JZ DIAL6 ; Got match
INR B ; Next number
INR E ; Keep counter
DCR C
JNZ DIAL5A ; Loop for all numbers (0-9)
JMP DIAL9 ; This should only happen with illegal
; entries.
;
;
; Now have a match between the requested letter and one in the library
; E-reg. holds the decimal equivalent (0-25) of the letter (A-Z) or
; (26-35) of the number (0-9).
;
DIAL6: LXI H,NUMBLIB ; Starting address of library
LXI B,LIBLEN ; Length of each entry of library
MOV A,E
ORA A
JZ DIAL8
;
DIAL7: MOV A,M
ORA A ; Make sure we don't go past library
JZ DIALBAD ; Jump if we do
DAD B ; Index into library by (E)*LIBLEN
DCR E
JNZ DIAL7
;
;
; Now have the line in the phone number library matching the requested
; letter so store that line starting at 'CMDBUF+1'
;
DIAL8: MVI B,LIBLEN
LXI D,CMDBUF+1
XCHG
MOV M,B
XCHG
INX D
CALL MOVE
;
;
; Now have the full line including phone number in 'CMDBUF' area.
;
DIAL9: LDA SMARTMODEM
ORA A
CNZ SMINIT
;
DIAL10: LXI H,CMDBUF+1
MOV E,M
INX H
;
DIAL11: MOV A,M
ORA A
JZ DIALBAD
;
;
; Dial a digit, check keyboard for abort
;
CALL DIALA
CALL STAT
JZ DIAL13
CALL KEYIN
CPI CANCEL
JNZ DIAL13
JMP DIALEXIT
;
DIAL13: INX H
DCR E
JNZ DIAL11
;
;
; Show the number of dial attempts
;
MVI B,CR ;end with cr
CALL SNDCHR
;
EATIT: CALL JMP$INMODEM ;gobble the modem response
JNC EATIT
CALL JMP$ILPRT
DB ' - try #',0
LHLD DIALCT
INX H
SHLD DIALCT
CALL DECOUT
MVI A,' '
CALL TYPE
MVI B,CR
CALL SNDCHR
;
DIAL14: CALL JMP$INMODEM
JNC DIAL14
JMP SMRESULT
;
DIALAGN: LDA CRFLAG
ORA A
JNZ DIALAGN1
CALL JMP$ILPRT
DB ' Redial? '
DB '(Y/N/C): ',BELL,0
CALL KBDCHR
CALL CRLF
CPI 'N'
JZ DIALAGN2
CPI 'Y'
JZ DIALAGN1
CPI 'C'
JNZ DIALAGN
MVI A,1
STA CRFLAG
;
DIALAGN1: MVI B,35
CALL JMP$TIMER
CALL CRLF
LDA RNGBKFL
ORA A
JZ DIAL4
STA CMDBUF+1
JMP DIAL4
;.....
;
;
DIALAGN2: CALL DIALBGN ;disconnect the modem
JMP MENU
;
;
; Connection has been made
;
CONMADE: CALL JMP$ILPRT
DB CR,LF,LF,'CONNECTION MADE',BELL,0
LDA CRFLAG
ORA A
JZ RETRN
CALL JMP$ILPRT
DB ' - hit any key to stop the bell ',0
;
CONMADE1: CALL STAT
JZ CONMADE2
CALL KEYIN
XRA A
JMP RETRN
;
CONMADE2: MVI B,10
CALL JMP$TIMER
MVI A,BELL
CALL TYPE
JMP CONMADE1
;.....
;
;
; Automatic dialing routine, prints the number being dialed
;
DIALA: CALL TYPE
CPI 'R'
JNZ DIALA1
PUSH PSW
MOV A,E
CPI 1
JZ RINGBK
POP PSW
;
DIALA1: MOV B,A
CALL DIALAD
CPI '.' ; Are we at a dot in the string ?
JNZ DIALA1A ; Jump around if no
MVI A,YES
STA DOT ; Set flag if yes
DIALA1A:
LDA DOT ; Have we encountered a dot yet ?
ORA A
RZ ; RETRN if no
MOV A,B
CPI '*' ;* is valid dial digit
JZ DIALA2
CPI '#' ;# is valid dial digit
JZ DIALA2
CPI 'K' ;k indicates wait for next dial tone
JZ DIALA2 ;all k's in phone # library should be
CPI '0' ;lower case.
RC
CPI '9'+1
RNC
;
;
; Sends the digit to the modem.
;
DIALA2: MOV C,A
JMP SNDCHR
;
;
; Print bad library number message and abort if a null is encountered.
;
DIALBAD: CALL JMP$ILPRT
DB CR,LF,'++ Bad library number called ++',CR,LF,0
;
DIALEXIT: CALL DISCONNT
;
DIALEXT1: CALL CRLF
XRA A
STA CRFLAG
;
DIALEXT2: CALL JMP$INMODEM
JNC DIALEXT2
CALL JMP$GOODBYE
JMP MENU
;.....
;
;
DIALBGN: JMP DISCONNT
;
;
; Do any alternate dialing such as 'MCI' or 'SPRINT'
;
DIALAD: MOV A,B
CPI '<'
JNZ DIALAD1
PUSH H
LXI H,ALTDL1
JMP DIALAD2
;
DIALAD1: CPI '>'
RNZ
PUSH H
LXI H,ALTDL2
;
DIALAD2: MOV A,M
CPI '$'
JZ DIALAD3
CALL TYPE
MOV B,A
CALL SNDCHR
INX H
CALL STAT
JZ DIALAD2
CALL KEYIN
CPI CANCEL
JZ DIALEXIT
JMP DIALAD2
;
DIALAD3: MVI A,' '
CALL TYPE
POP H
RET
;.....
;
;
; Disconnect the Smartmodem from the phone line
;
GOODBYE:
DISCONNT: CALL SETDTRL ;drop dtr
LXI H,DISC0 ;send the idle command just in case
CALL SENDMDM ;the modem was in command mode instead
;of on line
DISCONN2: CALL JMP$INMODEM ;gobble the idle message from the
JNC DISCONN2 ;modem after the 'I' command is
MVI B,10 ;sent and give it time to
CALL JMP$TIMER ;reinitialize
CALL SETDTRH ; Set DTR active again
RET
;.....
;
;
DISC0: DB 'I',CR,'$'
DOT: DS 1 ; Flag for don encountered
;.....
;
;
; Set Smartmodem for dialing
;
SMINIT: CALL SETDTRH ;enable dtr
LXI H,SM$DAL1 ;put racal in command mode
CALL SENDMDM
JMP SMRESULT ;get results (hello:i'M READY)
;
SMINIT0: MVI B,10
CALL JMP$TIMER
LXI H,SM$DAL2 ;put racal in dial mode
CALL SENDMDM
CALL JMP$INMODEM ;gobble the modem echo smresult
;will take care of the the rest
JMP SMRESULT ;number?
;
SMINIT1: RET
;.....
;
;
SM$DAL1: DB 'E'-40H,CR,'$' ;get into command mode
;
SM$DAL2: DB 'D',CR,'$' ;dial
;
;
; Send the string pointed to by 'HL' to both the CRT and the modem.
;
SENDOUT: PUSH H
CALL SNDNOW
POP H
MOV A,M
CPI '$'
RZ
MOV A,M
CALL OUT$MODDATP
CALL TYPE
INX H
JMP SENDOUT
;.....
;
;
; Send the string pointed to by 'HL' to the modem only
;
SENDMDM: PUSH H
CALL SNDNOW
POP H
MOV A,M
CPI '$'
RZ
CALL OUT$MODDATP
INX H
JMP SENDMDM
;......
;
;
; Checks for answer from Smartmodem
;
SMRESULT: LXI H,RESULBUF
PUSH H
;
SMRESUL2: CALL RCVRDY
JZ SMRESUL1
CALL STAT
JZ SMRESUL2
CALL KEYIN
CPI CANCEL
JNZ SMRESUL2
MVI B,CR
CALL SNDCHR
POP H
JMP DIALEXT1
;
RESULBUF: DS 16
;
SMRESUL1: CALL JMP$INMODEM
JC SMRESUL4
;
SMRESUL6: ANI 7FH
CPI ' '
JZ SMRESUL1 ;throw away spaces, lf, cr, nuls
CPI LF ;bell, and * in the resulbuf
JZ SMRESUL1
CPI 00H
JZ SMRESUL1
CPI '*'
JZ SMRESUL1
CPI CR
JZ SMRESUL1
CPI BELL
JZ SMRESUL1
POP H
MOV M,A
INX H
PUSH H
JMP SMRESUL2
;
;
; Compare the Racal response
;
SMRESUL4: POP H
LXI D,RESULBUF
CALL JMP$INLNCOMP
DB 'HE',0 ;hello:i'M READY
JNC SMINIT0
CALL JMP$INLNCOMP
DB 'NU',0 ;number?
JNC SMINIT1
CALL JMP$INLNCOMP
DB 'BU',0 ;busy
JNC NUM$BUSY
CALL JMP$INLNCOMP
DB 'DI',0 ;dialing...
JNC SMRESULT
CALL JMP$INLNCOMP
DB 'RI',0 ;ringing...
JNC RING
CALL JMP$INLNCOMP
DB 'AN',0 ;answer tone
JNC SMRESULT
CALL JMP$INLNCOMP
DB 'ON',0 ;on line
JNC CONMADE
CALL JMP$INLNCOMP
DB 'NO',0 ;no dial tone
JNC NO$DT
CALL JMP$INLNCOMP
DB 'FA',0 ;failed call
JNC FAILCAL
CALL JMP$INLNCOMP
DB 'VO',0 ;voice
JNC VOICE
CALL JMP$INLNCOMP
DB 'ID',0 ;idle
JNC FAILCAL
;
SMDM1: JMP FAILCAL
;.....
;
;
VOICE: CALL CRLF
CALL JMP$ILPRT
DB 'VOICE !!! pick up reciever and enter RETRN ',BELL,0
CALL KBDCHR
CPI CR
JNZ VOICE
CALL SNDCHR
;
VOICE1: CALL JMP$INMODEM ;gobble modem response
JNC VOICE1
CALL DISCONNT
JMP MENU
;
;
; Failed call is the result of no answer after 60 sec of ringing, wrong
; baud rate, or an incorrect response from the modem.
;
FAILCAL: CALL CRLF
CALL JMP$ILPRT
DB 'No answer... Failed call....',0
JMP DIALAGN
;
;
; No dial tone can occur when using the alternate dialing option and a
; dial tone is not detected after the pause 'K' or within 5 sec after
; the start of the modem dialing routine
;
NO$DT: CALL CRLF
CALL JMP$ILPRT
DB 'No dial tone present....',0
JMP DIALAGN
;
NUM$BUSY: CALL CRLF
CALL JMP$ILPRT
DB 'Number busy....',0
JMP DIALAGN
;
RING: LDA RINGFLG
ORA A
JZ SMRESULT
JMP RINGBK1
;
;
; Handles the special ringback numbers. Dials, lets it ring only once,
; hangs up and then redials.
;
RINGFLG: DB 0
;
RINGBK: POP PSW
LDA CMDBUF+1
STA RNGBKFL
STA RINGFLG
SUI 1
STA CMDBUF+1
RET
;.....
;
;
; Hang up and redial
;
RINGBK1: CALL HANGUP
MVI B,50
CALL JMP$TIMER
CALL CRLF
JMP DIAL9
;.....
;
;
HANGUP: MVI B,CR ;abort the dialing process
CALL SNDCHR
XRA A
STA RINGFLG ;clear flag for next dial
;
HANGUP1: CALL JMP$INMODEM ;wait for the modem to complete its
JNC HANGUP1 ;response to the cr
JMP DISCONNT ;RETRN here
;.....
;
;
; Time-out routine. Must be called with mask in 'D' reg. for input at
; relative port 2 and number of seconds (times 10) in 'C' reg.
;
WAIT: MVI B,2
CALL JMP$TIMER
CALL IN$MODCTL1
ANA D
RZ
PUSH B
PUSH D
CALL STAT
JZ WAIT1
CALL KEYIN
CPI CANCEL
JZ WAIT2
;
WAIT1: POP D
POP B
DCR C
JNZ WAIT
STC
RET
;.....
;
;
WAIT2: POP D
POP B
JMP DONETD
;.....
;
;
; Patch for STUPENT: to prevent sending of Hayes commands to Racal
;
;
ORG STUPENT
;
;
LDA SETUPTST
ORA A
JZ NOTVLD
CALL JMP$SETUPR
JMP XPRT
;
;
;
; Lets fix the byebye routine. It calls GOODBYE: directly and not
; through the jump vectors at the begining so make it use the jump
; vectors.
;
;
ORG BYEBYE
;
;
LDA PMMIMODEM
ORA A
CNZ JMP$GOODBYE
LDA SMARTMODEM
ORA A
CNZ JMP$GOODBYE
CALL JMP$ILPRT
DB CR,LF,'<<Exit to CP/M>>',CR,LF,0
JMP EXIT
;.....
;
;
; Fix for DONETD: the routines GOODBYE: and DISCONNT: are the same so
; no need to call twice.
;
;
ORG DONETD
;
;
CALL JMP$ILPRT
DB CR,LF,'<< DISCONNECTED >>',BELL,CR,LF,0
CALL JMP$GOODBYE
JMP MENU0
;
;
;
; M730RV.ASM uses these routines located in the main program.
; These equates have to be set for particular releases of MDM7xx.
; Currently they are set for MDM730.
;
ALTDL1: EQU 0DCEH ;alt dial 1
ALTDL2: EQU 0DE6H ;alt dial 2
BUFFER: EQU 4F00H
BYEBYE: EQU 404DH
CLRTST: EQU 4862H ;clear screen test
CMDBUF: EQU 49A7H ;cmd buffer
CRFLAG: EQU 4992H ;cr flag
CRLF: EQU 2B7BH ;print crlf
DECOUT: EQU 2BBDH
DIALCT: EQU 4987H
DONETD: EQU 2B04H
EXIT: EQU 2C5AH
INBUF: EQU 2F3EH
KBDCHR: EQU 2BAAH ;wait for keyboard input
KEYIN: EQU 2B93H ;kbd input
MENU: EQU 32EDH ;menu
MENU0: EQU 32A6H
MOVE: EQU 2C9BH
MOVER: EQU 30DFH ;move routine
NEWLINE: EQU 4814H
NOTVLD: EQU 3F78H
NUMBLIB: EQU 0E00H ;number library
RCVRDY: EQU 1E38H ;receiver ready
RETRN: EQU 197EH
RNGBKFL: EQU 49A2H ;ring back flag
SNDCHR: EQU 2CA4H ;send character
SNDNOW: EQU 1E4AH
STUPENT: EQU 46F1H
SPACES: EQU 481DH
STAT: EQU 2B88H ;console status
TYPE: EQU 2B9DH ;type
XPRT: EQU 3DFEH
;
END