home *** CD-ROM | disk | FTP | other *** search
- title 'X25.ASM'
- ;************************************************
- ;* *
- ;* X25.ASM *
- ;* *
- ;* X.25 protocol packet interface main program *
- ;* *
- ;* rev 0.46 05/04/85 E. Elizondo *
- ;* *
- ;* (c) 1985 E. Elizondo - all rights reserved. *
- ;* *
- ;* This program may be used freely for non- *
- ;* commercial applications. It may not be sold *
- ;* or used for commercial applications without *
- ;* written permission of the author. *
- ;* *
- ;************************************************
- ;
- revmon equ 05 ;program revision month
- revday equ 04 ;program revision day
- revyr equ 85 ;program revision year
-
- maclib Z80 ;DR Z80 macro library
-
- ; miscellaneous equates
- false equ 0
- true equ not false
- debug equ true
-
- ; standard ASCII equates
- bell equ 07h
- tab equ 09h
- cr equ 0dh
- lf equ 0ah
- ff equ 0ch
- esc equ 1bh
- bs equ 08h
- del equ 7fh
-
-
- ; design parameters
-
- ; system commands
- mencmd: equ esc ;command for main menu
- delcmd: equ 'U'-40h ;command to delete typed line
- lstcmd: equ 'P'-40h ;command to toggle printer flag
- brkcmd: equ 'B'-40h ;command to send interrupt packet
-
- ; Big Board parameters
- pfm: equ 0f003h ;PFM-80 warm start entry
- clscrn: equ 1ah ;clear screen character
- clrlin: equ 18h ;clear to end of line
-
- ; CP/M address equates:
- wboot: equ 0000h ;warm boot address
-
-
-
- ; hooks for other programs
- public l4stat ;level 4 status flags
-
- ; definition of l4stat status bits
- ; bit set condition
- ; 0 prompt console for packet input
- ; 1 unasigned
- ; 2 unasigned
- ; 3 unasigned
- ; 4 unasigned
- ; 5 unasigned
- ; 6 unasigned
- ; 7 unasigned
-
-
-
- ; external subroutines
-
- ; from level1 module:
- extrn inisio ;initialize level 1 hardware
- extrn txabo ;transmit level 1 abort
- extrn poll ;poll & service hardware
- extrn sbaud ;set baud rate
- extrn t1off ;turn off T1 timer
-
- ; from level2 module:
- extrn initl2 ;initialize level 2 parameters
- extrn conlk ;connect level 2 link
- extrn disclk ;disconnect level 2 link
- extrn qlksta ;query level 2 link status
- extrn txifrm ;transmit level 2 I frame
- extrn rxfrm ;process received level 2 frame
- extrn txbadf ;transmit bad frame
-
- ; from level3 module:
- extrn initl3 ;initialize level 3 parameters
- extrn txdpk ;transmit data packet if avail
- extrn rxpk ;receive packet if avail
- extrn txintp ;transmit interrupt packet
- extrn txclrr ;transmit clear request packet
- extrn txstar ;transmit restart packet
-
- ; from files module:
- extrn iparms ;initialize system parameters
- extrn wparms ;write system parameters to disk
- extrn otxfil ;open tx file
- extrn orxfil ;open rx file
- extrn olgfil ;open log file
- extrn crxfil ;close rx file
- extrn ctxfil ;close tx file
- extrn clgfil ;close log file
-
- ; from xutil module:
- extrn ilprt ;in-line print routine
- extrn ctype ;type character
- extrn cview ;display char on console (only)
- extrn instr ;input console string
- extrn decbin ;convert ASCII decimal to binary
- extrn hexbin ;convert ASCII hex to binary
- extrn pbin ;print byte in '1' and '0's
- extrn pdec ;print binary number in decimal
- extrn phex1 ;print nibble in hex
- extrn disptch ;dispatch to address in table
-
- ; from buffers module:
- extrn inibuf ;initialize buffer parameters
- extrn clrtxb ;clear all tx buffers
- extrn putbuf ;put byte into a fifo buffer
- extrn getbuf ;get byte from a fifo buffer
- extrn dcrbuf ;decrement buffer count
- extrn clrbuf ;clear buffer
- extrn setrdy ;set buffer ready flag
- extrn getrdy ;get state of buffer ready flag
- extrn clrrdy ;clear buffer ready flag
- extrn getbct ;get buffer count
-
-
-
- ; external addresses
-
- extrn inbuf ;A(console input buffer)
- extrn cibcb ;A(console input buffer bcb)
- extrn cobcb ;A(console output buffer bcb)
- extrn pobcb ;A(printer output buffer bcb)
- extrn ctbcb ;A(console transmit buffer bcb)
- extrn crbcb ;A(console receive buffer bcb)
- extrn rxfree ;A(list of free rx buffers bcb)
- extrn rxflst ;A(list of rx frame buffers bcb)
- extrn rxplst ;A(list of rx packet buffers bcb)
-
-
- ; system status flags
-
- extrn rxstat ;level 1 rx status
- extrn txstat ;level 1 tx status
- extrn tistat ;timer status
- extrn lkstat ;level 2 link status
- extrn l2stat ;level 2 status flags
- extrn dtemod ;DTE/DCE mode flag
- extrn l3stat ;level 3 status flags
- extrn chstat ;level 3 logical channel status
- extrn fstat ;file status
- extrn prnflg ;printer ena/dis flag
-
- ; level 1 parameters
- extrn baudop ;default baud rate option
-
- ; level 2 parameters
-
- extrn vr ;V(r)
- extrn vs ;V(s)
- extrn lastnr ;last received N(r)
- extrn lastvs ;last sent V(s)
- extrn maxvs ;highest sent V(s)
- extrn pfbit ;P/F bit
-
- ; level 3 parameters
-
- extrn pr ;P(r)
- extrn ps ;P(s)
- extrn lastpr ;last rx P(r)
- extrn lrxps ;last rx P(s)
- extrn ltxps ;last tx P(s)
- extrn pvcmod ;PVC/VC mode flag
- extrn laddr ;local DTE address
- extrn raddr ;remote DTE address
- extrn laddrl ;local DTE address length
- extrn raddrl ;remote DTE address length
- extrn chan ;logical channel #
- extrn qbit ;Q bit
- extrn dbit ;D bit
- extrn group ;logical group #
-
- ; level 1 diagnostic counters
-
- extrn rxbfct ;bad rx frames
- extrn rxgfct ;good rx frames
- extrn rxbbct ;rx chars lost due to buff not avail
- extrn rxboct ;rx chars lost due to buff overrun
- extrn rxcect ;rx crc errors
- extrn rxoect ;rx overrun errors
- extrn rxabct ;rx aborts
- extrn txefct ;tx end of frames
- extrn txuect ;tx underrun errors
- extrn txabct ;tx aborts
-
- ; level 2 diagnostic counters
-
- extrn rbafct ;rx bad address frames
- extrn rxbrct ;rx bad response frames
- extrn rxbcct ;rx bad command frames
- extrn rxcfct ;rx command frames
- extrn rxrfct ;rx response frames
- extrn rxifct ;rx I frames
- extrn txifct ;tx I frames
- extrn txfct ;tx frames
- extrn txirct ;I frame retransmissions
-
- ; level 3 diagnostic counters
-
- extrn txpct ;total tx packets
- extrn txfpct ;total tx file data packets
- extrn txcpct ;total tx console data packets
- extrn ntxbct ;errors due to no free tx buffer
- extrn rxpct ;total rx packets
- extrn rxdpct ;total rx data packets
- extrn rbfpct ;total rx bad format packets
- extrn rbcpct ;total rx bad channel packets
- extrn rbapct ;total rx bad address packets
- extrn rbipct ;total rx bad id packets
- extrn rbgpct ;total rx bad group packets
- extrn rxxpct ;total discarded rx packets
-
-
- ; *************************
- ; * start of program *
- ; *************************
-
-
- jmp begin ;jump around debug entry point
- jmp mloop ;debug entry point
- begin:
- di ;disable interrupts
- lxi h,0 ;get & save stack pointer
- dad sp ; /
- shld oldstk ; /
- lxi sp,stack ;set up local stack
- ei ;enable interrupts
- ;
- call clear ;clear crt screen
- call ilprt ;log on
- db cr,lf
- db 'X.25 packet communications program '
- db '(','0'+revmon/10,'0'+revmon mod 10,'/'
- db '0'+revday/10,'0'+revday mod 10,'/'
- db '0'+revyr/10,'0'+revyr mod 10,')',cr,lf
- db '(c) 1984 Ed Elizondo - all rights reserved'
- db cr,lf,0
- ;
- call iparms ;initialize system defaults
- call inibuf ;initialize buffer parameters
- call inisio ;initialize level 1 hardware
- call initl2 ;initialize level 2 parameters
- call initl3 ;initialize level 3 parameters
- ;
- call menu2 ;get option
- call plstat ;print link status
-
-
-
- ; *************************
- ; * main program loop *
- ; *************************
- ;
- ; note: form optimum thruput, the following
- ; is recommended:
- ; # of calls to rxfrm = 2 x # of calls to txifrm
- ; # of calls to txifrm = 2 x # of calls to rxpk
- ; # of calls to rxpk = 2 x # of calls to txdpk
-
- mloop: call poll ;service non interrupt hardware
- call pchar ;process typed char, if any
- call rxfrm ;process received frame
- call rxpk ;process received packet
- call txdpk ;transmit data packet to level 2
- call txifrm ;transmit I frame
- call rxmsg ;process received packet message
- call prompt ;prompt for console packet data
- jmp mloop ;keep doing it forever
-
-
- ; *************************************************
- ; * service routines for main program loop *
- ; *************************************************
-
-
- ; get and process typed character, if any
- pchar: xra a ;clear <a> and flags
- lxi h,cibcb ;console character avail?
- call getbuf ; /
- rc ;no, exit
- ;
- ani 07fh ;else strip parity
- cpi mencmd ;escape?
- jz menu1 ;yes, go display main menu
- ;
- cpi del ;delete?
- jz delchar ;yes, go process it
- ;
- cpi delcmd ;delete line command?
- jz deline ;yes, go process it
- ;
- cpi brkcmd ;break command?
- jz intrpt ;yes, go process it
- ;
- cpi lstcmd ;printer command?
- jz ptoggle ;yes, go process it
- ;
- cpi cr ;carriage return?
- jz cxfin ;yes, handle end of message
- ;
- ; else typed character is not special command
- call ctype ;display char on console
- call cxmit ;transmit char if link connected
- ret
-
-
- ; delete character previously typed
- delchar:
- mvi a,bs ;get a backspace
- call ctype ;back up cursor
- mvi a,' ' ;blank last typed char
- call ctype ; /
- mvi a,bs ;and back up cursor again
- call ctype ; /
- lxi h,lkstat ;link connected?
- bit 2,m ; /
- rz ;no, do nothing else
- ;
- lxi h,ctbcb ;else point to console tx buffer
- call getrdy ;ready flag set?
- rnz ;yes, do nothing
- ;
- call dcrbuf ;else delete last char
- ret
-
-
- ; delete last line typed
- deline:
- mvi a,cr ;move cursor to beginning of line
- call cview ; /
- mvi a,clrlin ;now clear to end of line
- call cview ; /
- lxi h,lkstat ;link connected?
- bit 2,m ; /
- rz ;no, do nothing else
- ;
- lxi h,ctbcb ;point to console tx buffer
- call getrdy ;ready flag set?
- rnz ;yes, do nothing
- ;
- call clrbuf ;else clear buffer
- ret
-
-
- ; send interrupt packet
- intrpt:
- mvi b,0 ;<b>=interrupt cause (0 for now)
- call txintp ;transmit interrupt packet
- ret
-
-
- ; toggle printer on/off
- ptoggle:
- lda prnflg ;get printer on/off flag
- cma ;toggle it
- ora a ;printer going off?
- jz ptog1 ;yes, keep going
- ;
- mvi a,bell ;else ding the console
- call cview ;...like CP/M+
- mvi a,0ffh ;get printer on flag
- ;
- ptog1: sta prnflg ;and save new flag
- ret
-
-
- ; transmit character if link connected
- ; on entry: <a>=character
- ; on exit: flags, <a>,<hl> clobbered
-
- cxmit: lxi h,lkstat ;link connected?
- bit 2,m ; /
- rz ;no, do nothing else
- ;
- lxi h,ctbcb ;else point to console tx buffer
- call putbuf ;put in tx buffer
- ret
-
-
- ; handle end of message if in flow control ready state
- cxfin: call ctype ;display cr on console
- call plf ;and also a line feed
- lxi h,lkstat ;link connected?
- bit 2,m ; /
- rz ;no, do nothing else
- ;
- lxi h,ctbcb ;else point to console tx buffer
- mvi a,cr ;put in cr
- call putbuf ; /
- mvi a,lf ;and line feed
- call putbuf ; /
- call setrdy ;signal buffer ready
- lxi h,l3stat ;point to level 3 status
- setb 7,m ;and signal message waiting
- ret
-
-
- ; print a line feed on console
- plf: mvi a,lf
- call ctype
- ret
-
-
- ; process a byte from received packet message to console
- rxmsg:
- lxi h,crbcb ;point to console rx buffer
- call getrdy ;ready?
- rz ;no, exit
- ;
- call getbuf ;is anything there?
- rc ;no, exit
- ;
- if debug
- mov b,a ;save first byte in <b>
- ; tag all received packets for debug with '<r>'
- mvi a,'<' ;indicate received msg
- call ctype ; /
- mvi a,'r' ; /
- call ctype ; /
- mvi a,'>' ; /
- call ctype ; /
- mov a,b ;now restore first byte
- endif
- ;
- ; strip out all non-displayable characters
- rxmsg1: cpi 20h ;displayable ASCII char?
- jnc rxmsg2 ;yes, keep going
- ;
- cpi cr ;carriage ret?
- jz rxmsg2 ;yes, keep going
- ;
- cpi lf ;line feed?
- jz rxmsg2 ;yes, keep going
- ;
- cpi ff ;form feed?
- jz rxmsg2 ;yes, keep going
- ;
- cpi tab ;horizontal tab?
- jz rxmsg2 ;yes, keep going
- ;
- cpi bell ;bell?
- jz rxmsg2 ;yes, keep going
- ;
- cpi bs ;back space?
- jz rxmsg2 ;yes, keep going
- ;
- mvi a,'.' ;else substitute a period
- ;
- rxmsg2:
- call ctype ;send to console
- call getbuf ;get next byte
- jnc rxmsg1 ;and process it if there
- ret ;else quit
-
-
- ; clear crt screen
- ; (internally called)
- clear: mvi a,clscrn
- call cview
- ret
-
-
- ; process menu command:
- ; print main option menu
- menu1: call clear ;clear crt screen
- menu2: call ilprt
- db cr,lf,'X.25 main menu:',cr,lf
- db lf,'normal operation: '
- db tab,'diagnostics:',cr,lf
- db ' 1. initialize link '
- db tab,tab,'10. display system parameters',cr,lf
- db ' 2. transmit restart packet'
- db tab,tab,'11. display status flags',cr,lf
- db ' 3. transmit file '
- db tab,tab,'12. display L1 and L2 statistics',cr,lf
- db ' 4. abort file transmission'
- db tab,tab,'13. display L3 statistics',cr,lf
- db ' 5. receive file '
- db tab,tab,'14. set flow control ready flags',cr,lf
- db ' 6. abort file reception '
- db tab,tab,'15. transmit bad frame',cr,lf
- db ' 7. transmit clear req. packet'
- db tab,'16. change frame sequence',cr,lf
- db ' 8. query link status '
- db tab,tab,'17. start frame logging',cr,lf
- db ' 9. disconnect link '
- db tab,tab,'18. stop frame logging',cr,lf
- db lf,'miscellaneous:',cr,lf
- db ' 19. change default parameters'
- db tab,'21. exit to monitor',cr,lf
- db ' 20. change remote DTE address'
- db tab,'22. exit to CP/M',cr,lf
- db 0
- optlp: call getopt ;get option
- rz ;exit if nothing there
- ;
- jc optlp ;get another if invalid
- ;
- cpi (optend-optbeg)/2 ;in range?
- jnc optlp ;no, get another one
- ;
- call disptch ;else dispatch on option in a
- optbeg: dw optlp ;option 0 address
- dw conlk ;option 1
- dw txstar ;option 2
- dw txfile ;option 3
- dw txfabo ;option 4
- dw rxfile ;option 5
- dw crxfil ;option 6
- dw txclrr ;option 7
- dw qlksta ;option 8
- dw disclk ;option 9
- dw pparms ;option 10
- dw pflags ;option 11
- dw pl2stat ;option 12
- dw pl3stat ;option 13
- dw setlkc ;option 14
- dw txbadf ;option 15
- dw chgseq ;option 16
- dw olgfil ;option 17
- dw clgfil ;option 18
- dw cparms ;option 19
- dw craddr ;option 20
- dw pfmexit ;option 21
- dw cpmexit ;option 22
- optend: equ $
-
-
- ; get selected option
- ; on entry: no parameters
- ; on exit: <a>= option #
- ; carry set if invalid (non numeric)
-
- getopt: call ilprt
- db lf,'option (cr to exit)= ',0
- call instr ;input reply
- call plf ;type line feed
- lxi h,inbuf ;get # of characters
- inx h ; /
- mov a,m ; /
- ora a ;any there?
- rz ;no, return with no action
- ;
- call decbin ;convert input to binary
- rc ;return with carry set if invalid
- ;
- mov a,d ;is upper byte=0?
- ora a ; /
- stc ;return with carry set if not
- rnz ; /
- ;
- mov a,e ;get lower byte of number
- ora a ;set flags
- ret
-
-
- ; prompt for console packet data input
- prompt:
- lxi h,l4stat ;point to level 4 status
- bit 0,m ;prompt request?
- rz ;no, return
- ;
- res 0,m ;else reset request flag
- call ilprt ;and show prompt
- db cr,lf,'>>',0
- ret
-
-
-
- ; *************************
- ; * command options *
- ; *************************
-
-
- ; exit program to CP/M
- cpmexit:
- call crxfil ;close receiv file if open
- call ctxfil ;close transmit file if open
- call clgfil ;close log file if open
- lhld oldstk ;get old stack pointer
- sphl ;restore it
- jmp wboot ;and warm boot CP/M
-
-
- ; exit program to Big Board Monitor (PFM)
-
- pfmexit:jmp pfm
-
-
- ; transmit file
- txfile: call otxfil ;open tx file
- call plstat ;print link status
- ret
-
- ; abort file transmission
- txfabo: lxi h,fstat ;point to file status
- bit 1,m ;tx file open?
- rz ;no, do nothing
- ;
- call ilprt ;else tell operator
- db cr,lf,'L4: file transmission aborted',cr,lf,0
- call ctxfil ;close tx file
- ret
-
-
- ; receive file
- rxfile: call orxfil ;open rx file
- call plstat ;print link status
- ret
-
- ; change frame transmit sequence number
- ; (to force a reject packet & retransmission)
- chgseq: lda vs ;get current V(s)
- dcr a ;decrement mod 7
- ani 7 ; /
- sta vs ;and update it
- ret
-
-
- ; print system parameters
-
- pparms:
- call clear ;clear crt screen
- call ilprt ;print title
- db tab,tab,'System Parameters:',cr,lf
- db cr,lf,lf,tab,'Level 2'
- db tab,tab,tab,tab,'Level 1'
- db cr,lf,lf,'mode = ',0
- lda dtemod ;get DTE/CE mode flag
- cpi 1 ;is it DTE?
- jnz ppar1 ;no, keep going
- ;
- call ilprt ;yes, print 'DTE'
- db 'DTE ',0 ; /
- jmp ppar2 ;and keep going
- ;
- ppar1: cpi 2 ;is it DCE?
- jnz ppar1a ;no, keep going
- ;
- call ilprt ;yes, print 'DCE'
- db 'DCE ',0 ; /
- jmp ppar2 ;and keep going
- ;
- ppar1a: cpi 3 ;is it self test mode?
- jnz ppar2 ;no, don't know mode
- ;
- call ilprt ;else print 'self test'
- db 'self test',0 ; /
- ;
- ppar2: call ilprt ;print baud rate
- db tab,tab,'baud rate = ',0
- lda baudop ;get current baud option
- lxi h,150 ;<hl>= 150 baud
- dbaud: dad h ;multiply baud rate
- dcr a ;by number of option
- jnz dbaud ;until finished
- ;
- call pdec ;and print resulting number
- ;
- mvi h,0 ;clear <h>
- call ilprt ;print last N(r)
- db cr,lf,'last N(r) = ',0
- lda lastnr
- mov l,a
- call pdec
- ;
- call ilprt ;print V(r)
- db cr,lf,'V(r) = ',0
- lda vr
- mov l,a
- call pdec
- ;
- call ilprt ;print V(s)
- db cr,lf,'V(s) = ',0
- lda vs
- mov l,a
- call pdec
- ;
- call ilprt ;print last V(s) sent
- db cr,lf,'last V(s) = ',0
- lda lastvs
- mov l,a
- call pdec
- ;
- call ilprt ;print max V(s) sent
- db cr,lf,'max V(s) = ',0
- lda maxvs
- mov l,a
- call pdec
- ;
- call ilprt ;print P(r)
- db cr,lf,lf,tab,tab,tab,'Level 3',lf
- db cr,lf,'mode = ',0
- lda pvcmod ;get PVC/VC mode flag
- cpi 1 ;is it VC?
- jnz ppar3 ;no, keep going
- ;
- call ilprt ;else print 'VC'
- db ' VC',0
- jmp ppar4 ;and keep going
- ;
- ppar3: cpi 2 ;is it PVC?
- jnz ppar4 ;no, keep going
- ;
- call ilprt ;else print 'PVC'
- db 'PVC',0
- ;
- ppar4:
- call ilprt
- db tab,tab,'local DTE address length = ',0
- lda laddrl
- mov l,a
- call pdec
- ;
- call ilprt
- db cr,lf,'P(r) = ',0
- lda pr
- mov l,a
- call pdec
- ;
- call ilprt
- db tab,tab,'local DTE address (hex) = ',0
- lda laddrl ;get local address length
- inr a ;increment by one
- mov b,a ;and save in <b>
- lxi h,laddr ;point to address
- ppar5: dcr b ;end of address?
- jz ppar6 ;yes, exit loop
- ;
- mov a,m ;else get char
- call phex1 ;display it in hex
- inx h ;bump pointer
- jmp ppar5 ;and get next char
- ;
- ppar6: call ilprt ;print P(s)
- db cr,lf,'P(s) = ',0
- lda ps
- mvi h,0
- mov l,a
- call pdec
- ;
- call ilprt
- db tab,tab,'remote DTE address length= ',0
- lda raddrl
- mov l,a
- mvi h,0
- call pdec
- ;
- call ilprt ;print last tx P(s)
- db cr,lf,'last tx P(s) = ',0
- lda ltxps
- mov l,a
- call pdec
- ;
- call ilprt
- db tab,tab,'remote DTE address (hex) = ',0
- lda raddrl ;get remote address length
- inr a ;increment by one
- mov b,a ;and save in <b>
- lxi h,raddr ;point to address
- ppar7: dcr b ;end of address?
- jz ppar8 ;yes, exit loop
- ;
- mov a,m ;else get char
- call phex1 ;display it in hex
- inx h ;bump pointer
- jmp ppar7 ;and get next char
- ;
- ppar8: call ilprt ;print last rx P(r)
- db cr,lf,'last rx P(r) = ',0
- lda lastpr
- mov l,a
- mvi h,0
- call pdec
- ;
- call ilprt
- db tab,tab,'logical group number = ',0
- lda group
- mov l,a
- mvi h,0
- call pdec
- ;
- call ilprt ;print last rx P(s)
- db cr,lf,'last rx P(s) = ',0
- lda lrxps
- mov l,a
- mvi h,0
- call pdec
- ;
- call ilprt
- db tab,tab,'logical channel number = ',0
- lda chan
- mov l,a
- mvi h,0
- call pdec
- ;
- call ilprt
- db cr,lf,lf,0
- ret
-
-
-
-
- ; change system defaults
- cparms:
- call setbaud ;select & set baud rate
- call setl2m ;select level 2 mode
- call initl2 ;and re-initialize level 2
- call setl3m ;select level 3 mode
- call setaddr ;select level 3 addresses
- call initl3 ;and re-initialize level 3
- call wparms ;write parameters on file
- call ilprt
- db cr,lf,lf,0
- ret
-
-
- ; select & set baud rate
- ; on entry: no parameters
- ; on exit: all regs, flags clobbered
-
- setbaud:
- call ilprt
- db cr,lf,lf
- db 'baud rates:',cr,lf,lf
- db '1. 300 baud',cr,lf
- db '2. 600 baud',cr,lf
- db '3. 1200 baud',cr,lf
- db '4. 2400 baud',cr,lf
- db '5. 4800 baud',cr,lf
- db '6. 9600 baud',cr,lf
- db '7. 19200 baud',cr,lf,0
- bdlp: call getopt ;get option
- rz ;return if cr typed
- ;
- jc bdlp ;if invalid try again
- cpi 8 ;out of range?
- jnc bdlp ;yes, get another one
- ;
- call sbaud ;set baud rate
- ret
-
-
-
- ; set level 2 DTE/DCE mode
- ; on entry: no parameters
- ; on exit: all regs, flags clobbered
-
- setl2m:
- call ilprt
- db cr,lf,lf
- db 'level 2 mode:',cr,lf,lf
- db '1. DTE (normal mode)',cr,lf
- db '2. DCE (test mode)',cr,lf
- db '3. self-test mode (with loopback connector)',cr,lf,0
- modlp: call getopt ;get option
- rz ;return if cr typed
- ;
- jc modlp ;if invalid get another
- ;
- cpi 4 ;out of range
- jnc modlp ;yes, get another
- ;
- sta dtemod ;else update mode flag
- ret
-
-
- ; set level 3 VC/PVC mode
- ; on entry: no parameters
- ; on exit: all regs, flags clobbered
-
- setl3m:
- call ilprt
- db cr,lf,lf
- db 'level 3 mode:',cr,lf,lf
- db '1. Virtual Call circuit (VC)',cr,lf
- db '2. Permanent Virtual Circuit (PVC)',cr,lf,0
- modlp3: call getopt ;get option
- rz ;return if cr typed
- ;
- jc modlp3 ;if invalid get another
- ;
- cpi 3 ;out of range
- jnc modlp3 ;yes, get another
- ;
- sta pvcmod ;update mode flag
- ret
-
-
- ; set level 3 dte addresses
- ; on entry: no parameters
- ; on exit: all regs, flags clobbered
-
- setaddr:
- ; clear local DTE address
- mvi b,15 ;max address size (hex digits)
- lxi h,laddr ;point to address
- xra a ;clear <a>
- sta laddrl ;and address length
- seta1: mov m,a ;clear digit
- inx h ;bump pointer
- dcr b ;last digit?
- jnz seta1 ;no, keep going
-
- ; get local DTE address
- call ilprt
- db cr,lf,'local DTE address '
- db '(0-15 hex digits) = ',0
- call instr ;input reply
- call plf ;print line feed
- lxi h,inbuf ;get # of hex digits
- inx h ; /
- mov a,m ; /
- ora a ;any there?
- jz craddr ;no, next parameter
- ;
- cpi 16 ;>15 digits?
- jnc setaddr ;yes, invalid
- ;
- sta laddrl ;else save address length
- mov b,a ;and save it in <b>
- inx h ;increment input buffer pointer
- lxi d,laddr ;point <de> to address buffer
- seta2: mov a,m ;get a char from input buffer
- call hexbin ;convert to binary
- jc setaddr ;restart if conversion error
- ;
- stax d ;else save in buffer
- inx h ;bump pointers
- inx d ; /
- dcr b ;last char?
- jnz seta2 ;no, get another
- ; else drop through to:
-
-
- ; set level 3 remote DTE address
- ; (internally called)
- ; on entry: no parameters
- ; on exit: all regs, flags clobbered
- craddr:
- ; clear remote DTE address
- mvi b,15 ;max address size (hex digits)
- lxi h,raddr ;point to address
- xra a ;clear <a>
- sta raddrl ;and address length
- seta4: mov m,a ;clear digit
- inx h ;bump pointer
- dcr b ;last digit?
- jnz seta4 ;no, keep going
-
- ; get remote DTE address
- call ilprt
- db cr,lf,'remote DTE address '
- db '(0-15 hex digits) = ',0
- call instr ;input reply
- call plf ;print line feed
- lxi h,inbuf ;get # of hex digits
- inx h ; /
- mov a,m ; /
- ora a ;any there?
- rz ;no, return
- ;
- cpi 16 ;>15 digits?
- jnc craddr ;yes, invalid
- ;
- sta raddrl ;else save address length
- mov b,a ;and save it in <b>
- inx h ;increment input buffer pointer
- lxi d,raddr ;point <de> to address buffer
- seta5: mov a,m ;get a char from input buffer
- call hexbin ;convert to binary
- jc craddr ;restart if conversion error
- ;
- stax d ;else save in buffer
- inx h ;bump pointers
- inx d ; /
- dcr b ;last char?
- jnz seta5 ;no, get another
- ret ;else exit
-
-
-
- ; get number input
- ; on entry: no parameters
- ; on exit: carry set if error
- ; <de>=number in binary (0-35756)
-
- getnum:
- call instr ;input reply
- call plf ;print line feed
- lxi h,inbuf ;get # of characters
- inx h ; /
- mov a,m ; /
- ora a ;any there?
- stc ;no, set carry
- rz ;and return
- ;
- call decbin ;else convert input to binary
- ret ;return with carry if invalid
-
-
-
- ; display status flags
-
- pflags:
- call clear ;clear crt screen
- call ilprt
- db lf
- db tab,tab,tab,'System Status Flags',cr,lf,lf
- db tab,'Level 1',tab,tab,tab,tab,'Level 2'
- db cr,lf,' bit # 76543210'
- db tab,' bit # 76543210'
- db cr,lf,' rx status: ',0
- lda rxstat
- call pbin
- call ilprt
- db tab,' link status: ',0
- lda lkstat
- call pbin
- call ilprt
- db cr,lf,' tx status: ',0
- lda txstat
- call pbin
- call ilprt
- db tab,' P/F bit: ',0
- lda pfbit
- call pbin
- call ilprt
- db cr,lf,' Timer status: ',0
- lda tistat
- call pbin
- call ilprt
- db tab,' flow status: ',0
- lda l2stat
- call pbin
- call ilprt
- db cr,lf,lf
- db tab,'Level 3',tab,tab,tab,tab,'Disk Files'
- db cr,lf,' bit # 76543210'
- db tab,' bit # 76543210'
- db cr,lf,'channel status: ',0
- lda chstat
- call pbin
- call ilprt
- db tab,'disk file status: ',0
- lda fstat
- call pbin
- call ilprt
- db cr,lf,'flow status : ',0
- lda l3stat
- call pbin
- call ilprt
- db cr,lf,' Q bit: ',0
- lda qbit
- call pbin
- call ilprt
- db tab,tab,'Level 4'
- db cr,lf,' D bit: ',0
- lda dbit
- call pbin
- call ilprt
- db tab,' bit # 76543210',0
- call ilprt
- db cr,lf,tab,tab,tab
- db tab,' flow status: ',0
- lda l4stat
- call pbin
- call ilprt
- db cr,lf,lf,0
- ret
-
-
- ; print level 1 and level 2 statistics
- pl2stat:
- call clear ;clear crt screen
- call ilprt
- db lf
- db tab,tab,tab,' System Statistics:',cr,lf
- db tab,'receive',tab,tab,tab,tab,tab,tab,'transmit',cr,lf
- db tab,'-------',tab,tab,tab,tab,tab,tab,'--------',cr,lf
- db tab,tab,tab,tab,'Level 1',cr,lf
- db 'good frames = ',0
- lhld rxgfct
- call pdec
- call ilprt
- db tab,tab,' total completed frames= ',0
- lhld txefct
- call pdec
- call ilprt
- db cr,lf,'bad frames = ',0
- lhld rxbfct
- call pdec
- call ilprt
- db tab,tab,tab,'underrun errors= ',0
- lhld txuect
- call pdec
- call ilprt
- db cr,lf,'aborts = ',0
- lhld rxabct
- call pdec
- call ilprt
- db tab,tab,tab,'aborts = ',0
- lhld txabct
- call pdec
- call ilprt
- db cr,lf,'crc errors = ',0
- lhld rxcect
- call pdec
- call ilprt
- db cr,lf,'overrun errors = ',0
- lhld rxoect
- call pdec
- call ilprt
- db cr,lf,'chars lost due to buffer unavail= ',0
- lhld rxbbct
- call pdec
- call ilprt
- db cr,lf,'chars lost due to buffer overrun= ',0
- lhld rxboct
- call pdec
- call ilprt
- db cr,lf,lf,tab,tab,tab,tab,'Level 2'
- db cr,lf,'command frames = ',0
- lhld rxcfct
- call pdec
- call ilprt
- db tab,tab,tab,' total frames= ',0
- lhld txfct
- call pdec
- call ilprt
- db cr,lf,'I frames = ',0
- lhld rxifct
- call pdec
- call ilprt
- db tab,tab,tab,' I frames= ',0
- lhld txifct
- call pdec
- call ilprt
- db cr,lf,'response frames = ',0
- lhld rxrfct
- call pdec
- call ilprt
- db tab,tab,'I frame retransmissions= ',0
- lhld txirct
- call pdec
- call ilprt
- db cr,lf,'bad address frames = ',0
- lhld rbafct
- call pdec
- call ilprt
- db cr,lf,'bad command frames = ',0
- lhld rxbcct
- call pdec
- call ilprt
- db cr,lf,'bad response frames= ',0
- lhld rxbrct
- call pdec
- call ilprt
- db cr,lf,lf,0
- ret
-
- ; print level 3 statistics
- pl3stat:
- call clear ;clear crt screen
- call ilprt
- db lf
- db tab,tab,tab,' System Statistics:',cr,lf
- db tab,'receive',tab,tab,tab,tab,tab,tab,'transmit',cr,lf
- db tab,'-------',tab,tab,tab,tab,tab,tab,'--------',cr,lf
- db cr,lf,tab,tab,tab,tab,'Level 3',cr,lf
- db cr,lf,'total packets = ',0
- lhld rxpct
- call pdec
- call ilprt
- db tab,tab,'total packets = ',0
- lhld txpct
- call pdec
- call ilprt
- db cr,lf,'data packets = ',0
- lhld rxdpct
- call pdec
- call ilprt
- db tab,tab,'file data packets = ',0
- lhld txfpct
- call pdec
- call ilprt
- db cr,lf,'bad format packets = ',0
- lhld rbfpct
- call pdec
- call ilprt
- db tab,tab,'console data packets = ',0
- lhld txcpct
- call pdec
- call ilprt
- db cr,lf,'bad channel packets = ',0
- lhld rbcpct
- call pdec
- call ilprt
- db tab,tab,'errors due to no free buffer = ',0
- lhld ntxbct
- call pdec
- call ilprt
- db cr,lf,'bad address packets = ',0
- lhld rbapct
- call pdec
- call ilprt
- db cr,lf,'bad identifier packets = ',0
- lhld rbipct
- call pdec
- call ilprt
- db cr,lf,'bad group # packets = ',0
- lhld rbgpct
- call pdec
- call ilprt
- db cr,lf,'total discarded packets = ',0
- lhld rxxpct
- call pdec
- call ilprt
- db cr,lf,lf
- db tab,tab,tab,tab,'Buffers',cr,lf
- db cr,lf,'free rx buffers = ',0
- lxi h,rxfree
- call getbct
- xchg
- call pdec
- call ilprt
- db cr,lf,'buffers with frames = ',0
- lxi h,rxflst
- call getbct
- xchg
- call pdec
- call ilprt
- db cr,lf,'buffers with packets = ',0
- lxi h,rxplst
- call getbct
- xchg
- call pdec
- call ilprt
- db cr,lf,lf,0
- ret
-
- ; set link connect and flow control ready flags (for debug)
- ; (internally called)
- ; on entry: no parameters
- ; on exit: all flags, regs unchanged
- setlkc: push psw ;save flags
- push h ;save <hl>
- call t1off ;turn off T1 timer
- lxi h,lkstat ;point to link status flags
- mvi m,0 ;clear all flags
- setb 2,m ;and set link connected flag
- lxi h,chstat ;point to chanel status flags
- mvi m,0 ;clear all flags
- setb 0,m ;and set flow control ready state
- call plstat ;tell operator
- pop h ;restore <hl>
- pop psw ;restore flags
- ret
-
-
- ; print link status
- ; (internally called)
- ; on entry: no parmameters
- ; on exit: <a>,flags clobbered
- ; all other regs unchanged
- plstat: push h ;save <hl>
- lxi h,lkstat ;point to link status
- bit 0,m ;link connect in process?
- jnz plsta2 ;yes, exit
- ;
- bit 2,m ;link connected?
- jz plsta1 ;no, keep going
- ;
- call ilprt ;else display status
- db 'L2: link connected',cr,lf,0
- jmp plsta2 ;and exit
- ;
- plsta1: call ilprt
- db 'L2: waiting for link connect from DCE',cr,lf,0
- plsta2: pop h ;restore <hl>
- ret ;and exit
-
-
-
- ; *****************
- ; * data area *
- ; *****************
-
-
- dseg ;data segment
-
- l4stat: db 0 ;level 4 status flags
- oldstk: ds 2 ;old stack pointer
- ds 200h ;really big local stack area
- stack: equ $
-
-
-