title 'NODE104 - TELENET node repeat dialer' ;============================================================================= ; ; ; This program will repeat-dial remote Telenet nodes until a connection is ; made using various CP/M+ function calls. It looks for the Telenet command ; prompt ("@") to determine that a non-connection condition has been deter- ; mined, and, upon detecting the remote node connection, calls the remote ; modem, and sets it to the more informative Racal-Vadic mode. ; ; At this point, the user's communication program is called, with provision ; for including the name of the remote node on the command line, i.e., ; "MEX ORPOR ". ; ; User also has the options of returning to his/her communication program, ; to the operating system or disconnection during the dialing cycle. ; ; You will need to select what assembler you are using (see "assembler ; selection;") and your operating system configuration. ; ; You will also need to insert the baudrate you wish to connect to at SPEED:, ; your Telenet identification string at label TNETID:, and your password at ; TNETPW. Place the name of the program you wish to chain to at PRGRM:. ; Each definable section is enclosed in ''++++++++'' boundaries. ; ; Use your favorite editor in non-document mode, and use the assembler you ; have selected below to assemble and link. ; ; My special thanks to Ben Grey for the extensive rewrite. ; Written April 28, 1988 Mike Heffernan ; Modified April 29, 1988 Ben Grey ; Extensively modified May 27, 1988 Mike Heffernan ; Corrected bug which prevented initial answer detect at any baud rate ; other than 1200; added "ASK" routine for use in conjunction with ; PCPCHAIN utility (included in new library)-May 30, 1988. --M.H. ; ; --V1.4:Added lookup table and related routine to allow ; NODE104 to access any Telenet remote node; eliminated ASK routine, added ; SELECT menu. Additional thanks to Ben Grey for extensive guidance with ; lookup table operation--June 13, 1988 --M.H. ;============================================================================= ; Should work on any CPM+ system which uses all the following calls. ; Assumes duplex and baudrate previously set. no equ 0 yes equ not no ; Version and Revision ver equ 01 ; Version rev equ 04 ; Revision ; Version Date vmth equ 05 ; Month vday equ 30 ; Day vyrs equ 88 ; Year ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Assembler Definition M80 equ yes ; Microsoft M80 SLR equ NO ; SLR Systems ZAS equ NO ; Echelon ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; System Configuration V1050 equ no ; Visual 1050 ; If YOU have a Visual 1050 ; contact me (see READ.ME)! CPM22 equ NO ; Standard CP/M ; Uses function calls NOT ; available in versions 2.2 or less CPM30 equ yes ; Standard CP/M+ (3.0) ZCPR3 equ NO ; ZCPR3 is CCP ZRDOS equ NO ; ZRDOS is OS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ base equ 0 bdosev equ base+0005h ; BDOS Entry Vector dmabuf equ base+0080h ; Default DMA Buffer tpa equ base+0100h ; Transient Program Area ; CPM Function Call Equates CONINP equ 01H ; Console Input CONOUT equ 02H ; Console Output AUXINP equ 03H ; aux port input--modem port AUXOUT equ 04H ; aux port output--modem port AUXIST equ 07H ; aux input status AUXOST equ 08H ; aux output status PRTSTR equ 09H ; print string CONST equ 0BH ; Console Status CHAIN equ 47 ; Chain-to-program CPM function CHNFLG equ 00H ; Default drive/user will be set ; Miscellaneous Equates if v1050 ; Visual 1050 f1key equ 0d4h ; Function Key 1 f2key equ 0d8h ; Function Key 2 f3key equ 0dch ; Function Key 3 f4key equ 0e0h ; Function Key 4 f5key equ 0e4h ; Function Key 5 helpkey equ 0c0h ; Help key on Visual cls equ 0ch ; Clear Screen esc equ 1bh ; Escape else f1key equ 'R'-'@' ; Control-R f2key equ 'W'-'@' ; Control-W f3key equ 'X'-'@' ; Control-X f4key equ 'D'-'@' ; Control-D f5key equ 'A'-'@' ; Control-A helpkey equ 'H'-'@' ; Control-H cls equ 0ch ; Some use this to clear screen esc equ 0 ; Not used ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; If your screen does NOT clear immediately upon calling NODE104, ; comment out the previous line and uncomment the following line. ; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;cls equ 'Z'-'@' ; Many use ^Z to clear screen endif ; V1050 nl equ 00h count equ 06h ;length of each table entry bell equ 07h tab equ 09h lf equ 0ah ; Line Feed cr equ 0dh ; Carriage Return page if m80 ; If using M80 .z80 ; Use Z80 Opcodes aseg ; Absolute Segment org tpa ; Origin of Segment endif ; M80 ;====================================================================== ; Start of Program ;====================================================================== jp start ; jump around headers ; program name msg: db cr,lf,tab,tab,tab,' -={NODE104}=- ' db tab,tab,tab db cr,lf,tab,tab,' Telenet auto-dialer for CP/M+ systems ' db tab,tab db '$' ; dialing strings kick: db cr ; Occasionally, PcP needs a nudge open: db 'ATZ' ; Otherwise, just ATZ does it db cr db 0 fdial: db 'ATDT' ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ db '######' ; Local Telenet indial phone number ; (the number you call to reach Telenet) ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ db cr db 0 bighang:db cr ; Routine to return to local modem db '@' ; and disconnect db cr db 0 hang: db 'HANGUP' db cr db 0 ; Telenet indial initialization initl: db cr ; Telenet initialization db 'D' ; For 1200 baud db cr ; Operation db 'D1' db cr db 0 ; Null terminated racal: db 'E'-'@' ; send control-E db cr ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Name of Program to Chain prgrm: db 'MEX ' ; Program command line db 0 ; Null terminated node: db 'xxxxxx' ; Do NOT change this line. ; MEX will read script files ; into its buffer if the name ; of the file is included on ; this command line. My scripts ; contain numbers of systems in ; each node, i.e. "ORPOR.MEX". db 0 prgmnd equ $ ; Dialing Strings dial: db 'C D/' ; Telenet Dial db 0 ; Null terminated speed: db '/12,' ; Telenet Speed ;...or "'/3,'" for 300 baud... ; ==>> Insert your Identification and Password here <<== tnetid: db 'XXXX####,' ; Telenet Identification tnetpw: db '####XXXX' ; Telenet Password db cr ; db 0 ; Null terminated ;=========================================================================== ; End of user definable section. ; Program starts here ;=========================================================================== ; Save system stack, set up local stack start: ld (stack),sp ;Save system stack ld sp,stack ;Load local stack ; program signon ld a,cls ;Clear screen call bdos3 if v1050 call revon ld de,msg ;Load opening message ld c,prtstr ;Print it call bdosev ;System call call revoff else ld de,msg ;Load opening message ld c,prtstr ;Print it call bdosev ;System call endif signon: ld de,msg1 ;Load help message ld c,prtstr ;Print it call bdosev ;System call askcon: ld de,menu ;Load SELECT menu ld c,prtstr ;Print it call bdosev ;System call wait: call bdos11 ;Check console for input jr z,wait ;If no input, check again call bdos2 ;Read console character ; Character was at Console cp f1key ; Was it function one? call z,navail ; Yep, Redial cp f2key ; Was it function two? jp z,mex ; 1Yep, go to comm program cp f3key ; Was it function three? jp z,exit ; Yep, go to CP/M cp f4key ; Was it function four? jp z,hangup ; Yep, hangup cp helpkey ; Was it the Help key? call z,help ; Yep, print help message ;Character received, move to next line push af ;save input character ld e,lf ;line feed ld c,conout ;console output call bdosev ;system call ld e,cr ;carriage return ld c,conout ;console output call bdosev ;system call pop af ;restore character ;Check range of zvalues received from console cp 'A' ;Compare to u/c A jr c,wait ;less than u/c A, so ignore cp 'Z'+1 ;Compare to u/c Z plus one jr c,rzero ;less than u/c Z, make relative zero ;by checking carry bit ;Range might be lower case (a-w) cp 'a' jr c,wait ;less than l/c A, ignore entry cp 'z'+1 jr nc,wait ;greater than l/c Z, ignore entry ;Lower case value is within range, put in upper case if not and 5fh ;Make entered value relative zero rzero: sub 41h ;Initialize for multiply ld hl,0 ;clear product area ld e,a ;move input relative 0 character into E ld d,0 ;clear D of DE register ld b,count ;table entry size repeat: add hl,de djnz repeat ld de,tbladr ;table base address (where it starts!) add hl,de ;calculate the table entry address ;move selected entry to NODE ld de,node ;destination ld bc,count ;table entry length ldir ;move entry-equate to NODE ; output dialing string open1: ld hl,open ; send ATZ call bdos8 ld hl,string ld (bufptr),hl ; save buffer pointer ; read modem response read: call bdos7 ;system call jr z,chkcon1 ;if nothing there, check console ld hl,(bufptr) ;load buffer pointer call bdos4 ;read aux character with echo ld (hl),a ;store it inc hl ;next buffer address ld (hl),0 ;null terminate ld (bufptr),hl ;so we mark the spot cp 'O' ;if O look for K jr z,read1 ;here cp '?' ;whoops, we are already connected jp z,loop ;so go to node dialing routine jp read ;otherwise, look again read1: call bdos7 ;system call jr z,read1 ;if nothing there, look again ld hl,(bufptr) ;pop hl call bdos4 ;read aux character with echo ld (hl),a ;push hl cp 'K' ;modem ready? jr z,dial1 ;yes, dial the phone jr nz,read ; Nothing for us, so begin again chkcon1:call bdos11 ;Check console for input jr z,open1 ;If no input, check again call bdos2 ;Read console character ; Character was at Console cp f1key ; Was it function one? jp z,open1 ; Yep, Redial cp f2key ; Was it function two? jp z,mex ; 1Yep, go to comm program cp f3key ; Was it function three? jp z,exit ; Yep, go to CP/M cp f4key ; Was it function four? jp z,hangup ; Yep, hangup cp f5key ; Recall request? jp z,recall ; Return to signon cp helpkey ; Was it the Help key? call z,help ; Yep, print help message jr open1 ; Nothing for us, so resend string dial1: ld hl,fdial ;indial number call bdos8 ld hl,string ;our buffer ld (bufptr),hl ;save it ; read modem response nread: call bdos7 ;system call jr z,chkcon2 ;if nothing there check console ld hl,(bufptr) ;load buffer pointer call bdos4 ;read aux character with echo ld (hl),a ;store it inc hl ;next buffer address ld (hl),0 ;null terminate ld (bufptr),hl ;so we mark the spot cp '0' ;if 0 look for another 0 jr z,nread1 ;here jr nz,nread ;otherwise, look again nread1: call bdos7 ;system call ld hl,(bufptr) ;load buffer pointer call bdos4 ;read aux character with echo ld (hl),a ;store it inc hl ;next buffer address ld (hl),0 ;null terminate ld (bufptr),hl ;so we mark the spot cp '0' ;if 0 look for next 0 jr z,nread2 ;here jr nz,nread ;otherwise, look again nread2: call bdos7 ;system call ld hl,(bufptr) ;pop hl call bdos4 ;show it ld (hl),a ;push hl inc hl ld (hl),0 ;null terminate ld (bufptr),hl ;save the pointer cp cr ;CONNECT ? jr z,init ;yes, send network logon jp nread ;Anything else, retry call chkcon2:call bdos11 ;Check console for input jr z,nread ;If no input, check again call bdos2 ;Read console character ; Character was at Console cp f1key ; Was it function one? jp z,dial1 ; Yep, Redial cp f2key ; Was it function two? jp z,mex ; 1Yep, go to comm program cp f3key ; Was it function three? jp z,exit ; Yep, go to CP/M cp f4key ; Was it function four? jp z,hangup ; Yep, hangup cp f5key ; Recall request? jp z,recall ; Return to signon cp helpkey ; Was it the Help key? call z,help ; Yep, print help message jr nread ;nothing for us, so resend string init: ld hl,initl ; Network logon call bdos8 ; Send it ld hl,string ; Buffer Address ld (bufptr),hl ; Save Buffer Pointer init1: call bdos7 ; system call jr z,chkcon3 ; nothing there so check console ld hl,(bufptr) ; Load Buffer Pointer call bdos4 ; Read Auxiliary Character with Echo ld (hl),a ; Store Character inc hl ; Next Buffer Address ld (hl),0 ; Null Terminate ld (bufptr),hl ; Save Buffer Pointer cp '@' ; Telenet ready? jp z,loop ; Yes, go to node dialer routine jr init1 ; If Z, Nuthin here chkcon3:call bdos11 ;Check console for input jr z,init1 ;If no input, check again call bdos2 ;Read console character ; Character was at Console cp f1key ; Was it function one? jp z,init ; Yep, Redial cp f2key ; Was it function two? jp z,mex ; 1Yep, go to comm program cp f3key ; Was it function three? jp z,exit ; Yep, go to CP/M cp f4key ; Was it function four? jp z,hangup ; Yep, hangup cp f5key ; Recall request? jp z,recall ; Return to signon cp helpkey ; Was it the Help key? call z,help ; Yep, print help message jr init ; Nothing for us, so resend string ; Dial remote node loop: ld hl,dial ; Load Dialing prefix call bdos8 ; Output Dialing Prefix ld hl,node ; Load NODE into HL call bdos8 ; Output Dialing String ld hl,speed ; Load Dialing suffix call bdos8 ; Output it ld hl,string ; Buffer Address ld (bufptr),hl ; Save Buffer Pointer ; Read Telenet Response loop1: call bdos7 ;system call jr z,chkcon4 ; If Z, Nuthin waitin, so check console ld hl,(bufptr) ; Load Buffer Pointer call bdos4 ; Read Auxiliary Character with Echo ld (hl),a ; Store Character inc hl ; Next Buffer Address ld (hl),0 ; Null Terminate ld (bufptr),hl ; Save Buffer Pointer cp '@' ; Telenet Prompt? jr z,loop ; yes, resend the string cp 4eh ; is it an N? jr z,test ; yes, look at next character jr nz,loop1 ; no, continue receiving Telenet test: call bdos7 ; System call jr z,test ; Nothing there yet, look again ld hl,(bufptr) ; Load Buffer Pointer call bdos4 ; Read Auxiliary Character with Echo ld (hl),a ; Store Character inc hl ; Next Buffer Address ld (hl),0 ; Null Terminate ld (bufptr),hl ; Save Buffer Pointer cp 4eh ; Is it the second N of CONNECT? jr z,atz ; yes, two Ns means connected jr nz,loop1 ; If Z, Nuthin here chkcon4:call bdos11 ;Check console for input jr z,loop1 ;If no input, check again call bdos2 ;Read console character ; Character was at Console cp f1key ; Was it function one? jp z,loop ; Yep, Redial cp f2key ; Was it function two? jp z,mex ; 1Yep, go to comm program cp f3key ; Was it function three? jp z,exit ; Yep, go to CP/M cp f4key ; Was it function four? jp z,hangup ; Yep, hangup cp f5key ; Recall request? jp z,recall ; Return to signon cp helpkey ; Was it the Help key? call z,help ; Yep, print help message jr loop1 ; Nothing for us, so resend string ;=========================================================================== ;Request Hayes mode from remote node ;=========================================================================== atz: ld hl,cr ; send carraige return call bdos8 ; system call ld hl,string ; load pointer ld (bufptr),hl ; save it call bdos7 ;system call jp nz,racalv ;if something there, go to RACAL request ld hl,kick ; ATZ again... call bdos8 ; system call ld hl,string ; load ATZ pointer into HL ld (bufptr),hl ; save buffer pointer ; read modem response hread: call bdos7 ;system call jr z,chkcon6 ;if nothing there, resend ld hl,(bufptr) ;load buffer pointer call bdos4 ;read aux character with echo ld (hl),a ;store it inc hl ;next buffer address ld (hl),0 ;null terminate ld (bufptr),hl ;so we mark the spot cp '*' ;in case it is already in R-V jp z,mex ;5Yep, go to comm program cp 'M' ;Manual answer? jp z,mex ;6Yep, go to comm program cp 'K' ;if K then OK from remote jp z,racalv ;so request R-V mode jr hread ;Not any of these so send ATZ again chkcon6:call bdos11 ; Check Console Status jr z,hread ; If Z, nothing here call bdos2 ; Read Console Character ; Character was at Console cp f1key ; Was it function one? jp z,atz ; Yep, Redial cp f2key ; Was it function two? jp z,mex ; 1Yep, go to comm program cp f3key ; Was it function three? jp z,exit ; Yep, go to CP/M cp f4key ; Was it function four? jp z,hangup ; Yep, hangup cp f5key ; Recall request? jp z,recall ; Return to signon cp helpkey ; Was it the Help key? call z,help ; Yep, print help message jr hread ; Nothing for us, so begin again ;========================================================================== recall: ld a,cls call bdos3 ld de,menu ld c,prtstr call bdosev jp wait ;=========================================================================== ;Help menu ;=========================================================================== help: ld a,cls call bdos3 ld de,msg2 ; Print help ld c,prtstr call bdosev ret ;============================================================================ ;Help not available message ;============================================================================ navail: call revon ld de,msg3 ; Print not available message ld c,prtstr call bdosev call revoff ld de,menu2 ld c,prtstr call bdosev ret ;============================================================================ ;Request Racal-Vadic mode ;============================================================================ racalv: ld hl,racal ; send Racal request call bdos8 ld hl,string ld (bufptr),hl ; save buffer pointer ; read modem response racalv1:call bdos7 jr z,chkcon7 ;if nothing there, look again ld hl,(bufptr) ;load buffer pointer call bdos4 ;read aux character with echo ld (hl),a ;store it inc hl ;next buffer address ld (hl),0 ;null terminate ld (bufptr),hl ;so we mark the spot cp 0 ;remote node asleep? jr z,racalv ;yep, resend the string cp '*' ;if * go to comm program jr z,ring ;here jp racalv1 ;otherwise, look again chkcon7:call bdos11 ; Check Console Status jr z,racalv1 ; If Z, Nuthin here call bdos2 ; Read Console Character ; Character was at Console cp f1key ; Was it function one? jr z,racalv ; Yep, Redial cp f2key ; Was it function two? jp z,mex ; 5Yep, go to comm program cp f3key ; Was it function three? jp z,exit ; Yep, exit to system cp f4key ; Was it function four? jp z,hangup ; Yep, drop Telenet cp f5key ; Recall request? jp z,recall ; Return to signon cp helpkey ; Was it the Help key? call z,help ; Yep, print help message jp racalv ;Sound bell ring: ld a,bell ; set up the bell call bdos3 ; ring it ;Function key 2 ;mex: ld hl,dmabuf ; Command Tail Address = DMA Buffer ; ld a,(hl) ; Command Tail Length ; or a ; Set Status ; jp nz,mex1 ; If NZ, Command Tail Entered ; No command tail entered, so use our own mex: ld hl,prgrm ; Move program command line ld de,dmabuf ; Default DMA Buffer ld bc,04h ; Length to move ldir ; Move it ld hl,node ld de,dmabuf+04h ld bc,count ldir mex1: ld e,chnflg ; Define default drive/user ld c,chain ; Chain to it call bdosev ; System call ret ; We're done with our part ; Function Key 3 exit: ld a,cls ; Clear Screen call bdos3 ; Output to Console ld sp,(stack) ; Users Stack ret ; Return to System page ;====================================================================== ; Read Console Character ;====================================================================== bdos2: ld c,coninp ; Read Console Byte call bdosev ; System call ret ;====================================================================== ; Send Console Character ;====================================================================== bdos3: ld e,a ; Character to E ld c,conout ; Console Output Function call bdosev ; System call ret ;====================================================================== ; Read Auxiliary Character (Echo to Console) ;====================================================================== bdos4: push hl ; Save Pointer ld c,auxinp ; Auxiliary Input call bdosev ; System Call ld e,a ; .. and put into E push af ; Save Character ld c,conout ; Console Output call bdosev ; System call pop af ; Load Character pop hl ; Load Pointer ret ;====================================================================== ; Check Auxiliary Input Status ;====================================================================== bdos7: ld c,auxist ; Auxiliary Input Status call bdosev ; System call or a ; any data? ret ;====================================================================== ; Output Dialing String ;====================================================================== bdos8: push hl ; Save Pointer bdos8a: ld c,auxost ; Auxiliary Output Status call bdosev ; System call or a ; Set Status jr z,bdos8a ; If Z, Not ready pop hl ; Load Pointer ld a,(hl) ; Check for terminator or a ; Set Status ret z ; If Z, exit ld e,a ; Character to output ld c,auxout ; Auxiliary Output push hl ; Save Pointer call bdosev ; System call pop hl ; Load Pointer inc hl ; Next Character jr bdos8 ; Continue ;====================================================================== ; Check Console Status ;====================================================================== bdos11: ld c,const ; Direct Console I/O call bdosev ; System call or a ; If Z, then nothing is there ret page ;====================================================================== ;Hangup routine ;====================================================================== hangup: call bdos7 jr z,chkcon8 ;nothing there, so check console ld hl,(bufptr) ;push buffer pointer call bdos4 ;read aux character with echo ld (hl),a ;store it inc hl ;next buffer address ld (hl),0 ;null terminate ld (bufptr),hl ;pop pointer cp '@' ;Local node response? jr z,ok ;Yes, send HANGUP to Telenet jp hangup ;Nothing we want, so look again ok: ld hl,hang ; send hangup string call bdos8 ld hl,string ; load hl with contents of string ld (bufptr),hl ; save buffer pointer ok1: call bdos7 ld hl,(bufptr) ;push buffer pointer call bdos4 ;read aux character with echo ld (hl),a ;store it inc hl ;next buffer address ld (hl),0 ;null terminate ld (bufptr),hl ;pop pointer cp '?' ;Local node confused? jr z,hangup ;Yes, send HANGUP again jp exit ;Nope, exit to OS chkcon8:call bdos11 ; Check Console Status jr z,hangup ; If Z, Nuthin here call bdos2 ; Read Console Character ; Character was at Console cp f1key ; Was it function one? jp z,hangup ; Yep, Redial cp f2key ; Was it function two? jp z,mex ; 4Yep, go to comm program cp f3key ; Was it function three? jp z,exit ; Yep, go to CP/M jp hangup ; Nuthin we want, so try again ;=========================================================================== ;Video reverse routine ;=========================================================================== revon: ld e,esc ;Signify escape sequence ld c,conout ;Console out call bdosev ;system call ld e,5bh ld c,conout call bdosev ld e,037h ;reverse video ld c,conout call bdosev ;system call ld e,6dh ld c,conout call bdosev ret revoff: ld e,esc ;Signify escape sequence ld c,conout ;Console out call bdosev ;system call ld e,5bh ld c,conout call bdosev ld e,30h ;end reverse video ld c,conout call bdosev ;system call ld e,6dh ld c,conout call bdosev ret ;====================================================================== ; Data Area ;====================================================================== bufptr: dw string ; Buffer Pointer string: ds 128 ; Telenet Response Code db 0 ; Null Terminator msg1: db cr,lf,tab,tab,'This program will dial Telenet, initialize it' db cr,lf,tab,tab,'for 1200 baud operation, and continuously attempt' db cr,lf,tab,tab,'to connect with the selected node. MEX will be' db cr,lf,tab,tab,'called when the remote node responds.' db cr,lf if v1050 msg2: db cr,lf,tab,tab,tab,'F1 = Resend current string' db cr,lf,tab,tab,tab,'F2 = Cancel, return to MEX' db cr,lf,tab,tab,tab,'F3 = Cancel, return to CPM' db cr,lf,tab,tab,tab,'F4 = Disconnect from Telenet' db cr,lf,tab,tab,tab,'F5 = Try another remote node' db cr,lf,tab,tab,tab,' HELP= This menu' db cr,lf,'$' else msg2: db cr,lf,tab,tab,tab,'^R = Resend current string' db cr,lf,tab,tab,tab,'^W = Cancel, return to MEX' db cr,lf,tab,tab,tab,'^X = Cancel, return to CPM' db cr,lf,tab,tab,tab,'^D = Disconnect from Telenet' db cr,lf,tab,tab,tab,'^A = Try another remote node' db cr,lf,tab,tab,tab,' ^H= This menu' db cr,lf,'$' endif menu: db cr,lf,tab,tab,'(A)AZPHO',tab,'(B)CAGLE',tab,'(C)CALAN' db cr,lf,tab,tab,'(D)CASAD',tab,'(E)CASAN',tab,'(F)CASFA' db cr,lf,tab,tab,'(G)CASJO',tab,'(H)CODEN',tab,'(I)DCWAS' db cr,lf,tab,tab,'(J)FLMIA',tab,'(K)FLTAM',tab,'(L)GAATL' db cr,lf,tab,tab,'(M)ILCHI',tab,'(N)MABOS',tab,'(O)MIDET' db cr,lf,tab,tab,'(P)MNMIN',tab,'(Q)MOKAN',tab,'(R)NCRTP' db cr,lf,tab,tab,'(S)NJNEW',tab,'(T)NYNYO',tab,'(U)ORPOR' db cr,lf,tab,tab,'(V)PAPHI',tab,'(W)TXHOU',tab,'(X)UTSLC' db cr,lf,tab,tab,tab,'(Y)WASEA',tab,'(Z)WIMIL' menu2: db cr,lf,'==Select?>','$' ;terminator msg3: db cr,lf,' =>Function not available!<= ',cr,lf,lf,'$' tbladr: db 'AZPHO',0 ; A = 0 db 'CAGLE',0 ; B = 1 db 'CALAN',0 ; C = 2 db 'CASAD',0 ; D = 3 db 'CASAN',0 ; E = 4 db 'CASFA',0 ; F = 5 db 'CASJO',0 ; G = 6 db 'CODEN',0 ; H = 7 db 'DCWAS',0 ; I = 8 db 'FLMIA',0 ; J = 9 db 'FLTAM',0 ; K = 10 db 'GAATL',0 ; L = 11 db 'ILCHI',0 ; M = 12 db 'MABOS',0 ; N = 13 db 'MIDET',0 ; O = 14 db 'MNMIN',0 ; P = 15 db 'MOKAN',0 ; Q = 16 db 'NCRTP',0 ; R = 17 db 'NJNEW',0 ; S = 18 db 'NYNYO',0 ; T = 19 db 'ORPOR',0 ; U = 20 db 'PAPHI',0 ; V = 21 db 'TXHOU',0 ; W = 22 db 'UTSLC',0 ; X = 23 db 'WASEA',0 ; Y = 24 db 'WIMIL',0 ; Z = 25 ds 64 ; Stack Area (32 levels) stack: dw 0 ; Stack Pointer end