home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
BEEHIVE
/
COMMS
/
MODEM9.ARC
/
MAIN.ASM
< prev
next >
Wrap
Assembly Source File
|
1991-02-02
|
23KB
|
1,283 lines
;
; MAIN.ASM
;
;Main line routines for MODEM9.xx.
;
ORG 0AD0H
;
START: LXI H,0
DAD SP ;GET CP/M'S STACK
SHLD STACK ;SAVE IT
LXI SP,STACK ;START LOCAL STACK
CALL INITADR ;INITIALIZE ADDRESSES
CALL VERNUM ;GIVE CONFIGURATION MESSAGE
; CALL INITMOD ;SET DEFAULT BAUD RATE (300)
CALL GETUSR ;GET USER
STA SAVUSR ;SAVE FOR EXIT
MVI A,TRUE ;0FFH
STA NFILFLG
CMA ;0
STA SAVEFLG
CALL PROCOPT ;PROCESS CONTROL OPTIONS
;
RESTART:
LDA OPTION ;GET MAIN OPTION
CPI ' ' ;NO OPTION SPEC'D?
JZ MENU ;TRUE, GO MENU
CPI 'H' ;MENU ASKED FOR?
JZ MENU2 ;YES, GO MENU2
CALL INITMOD
CALL MOVEFCB
CALL IN$MODDATP ;GOBBLE UP GARBAGE..
CALL IN$MODDATP ;..CHARACTERS ON LINE
XRA A
STA ECHOFLG ;RESET ECHO FLAG
STA LOCFLG ;RESET LOCAL FLAG
LDA OPTION ;PROCESS MAIN OPTION
CPI 'E' ;ECHO MODE?
JNZ NOECH ;JUMP IF NOT
MVI A,TRUE ;SET ECHO TO TRUE
STA ECHOFLG
JMP DSKSAVE
NOECH: CPI 'L' ;LOCAL ECHO MODE
JNZ NOLOC
MVI A,TRUE
STA LOCFLG
JMP DSKSAVE
NOLOC: CPI 'T' ;TERMINAL MODE?
JZ DSKSAVE ;YES
CPI 'S' ;SEND A FILE?
JZ SENDFIL ;YES
CPI 'R' ;RECEIVE A FILE?
JZ RCVFIL ;YES
CALL NOTVLDMSG ;SAY NOT A VALID OPTION
JMP MENU ;NO VALID OPTION SPEC'D, GO MENU
;
INITADR:
LHLD 1
LXI D,3
DAD D
SHLD VSTAT+1
DAD D
SHLD VKEYIN+1
DAD D
SHLD VTYPE+1
DAD D
SHLD VLIST+1
LXI D,30
DAD D
SHLD VLSTAT+1
JMP INITMOD ;RETURN DONE FROM THIS ROUTINE..
;
; CHECK OPTIONS, PUT 0 IN APPROPRIATE PLACES IN OPTION TABLE
; IF OPTION SELECTED
;
PROCOPT:
LXI D,FCB+1
LDAX D
STA OPTION
OPTLP: INX D
LDAX D
CPI ' '
JZ ENDOPT
LXI H,OPTBL
MVI B,OPTBE-OPTBL
OPTCK: CMP M
JNZ OPTNO
CPI 'B'
JNZ OPTCK1
LDA OPTION
CPI 'S'
JZ OPTCK1
CPI 'R'
JNZ OPTNO1
OPTCK1: MVI M,0
JMP OPTLP
;
OPTNO: INX H
DCR B
JNZ OPTCK
OPTNO1: CALL NOTVLDMSG
POP PSW ;PRESERVE STACK
JMP MENU
;
ENDOPT: LDA VSEEFLG
ORA A
RNZ
STA QFLG ;IF VIEWING SUPPRESS ALL ELSE
RET
;
MOVEFCB:
LXI H,FCB+16
LXI D,FCB
MVI B,16
CALL MOVE
XRA A
STA FCBSNO
STA FCBEXT
RET
;
;
PRTMSG: MVI C,PRINT
JMP BDOS
;
EXIT: LDA SAVUSR
MOV E,A
CALL SETUSR
LXI D,80H
MVI C,STDMA
CALL BDOS
CALL CKMODM ;CATCH ANY GARBAGE CHARACTERS
LHLD STACK
SPHL
LDA SAVCCP
ORA A
JZ 0 ;WARM BOOT
RET
;
;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH
;
SETFCB: LXI D,CMDBUF
LXI H,FCB
CALL CPMLINE
CALL PROCOPT
CHECKNM:
LDA FCB+1 ;CHECK ON THE PRIMARY OPTION
CPI 'E' ;RETURN IF ECHO OPTION
RZ
CPI 'H' ;RETURN IF HELP OPTION
RZ
CPI 'L' ;RETURN IF LOCAL ECHO OPTION
RZ
CPI 'T'
JZ TERMSEL
CPI 'S'
JZ CKFILE
CPI 'R'
JNZ BDOPT
LDA BATCHFLG ;IF MULT FILE MODE, THEN..
ORA A ;..RECV OPT DOES NOT NEED..
RZ ;..NAME.
JMP CKFILE
;
BDOPT: CALL ILPRT
DB CR,LF,'++ Bad Option ++',CR,LF,0
JMP REENT
CKFILE: LDA FCB+17 ;IF OPTION THAT NEEDS FILE NAME,..
CPI ' ' ;..THEN CHECK TO SEE IF NAME..
RNZ ;..EXISTS. IF NOT..
REENT: CALL ILPRT ;..DO EVERYTHING OVER.
DB CR,LF,'Re-enter PRIMARY option and file name only: ',BELL,0
LXI D,CMDBUF
CALL INBUFF
JMP SETFCB
;
TERMSEL:
LDA FCB+17
CPI ' '
JNZ SAVAGN
MVI A,FALSE
STA SAVEFLG
MVI A,TRUE
STA NFILFLG
RET
;
SAVAGN:
MVI A,FALSE
STA NFILFLG
RET
;
;
;ADJUSTS LOOP COUNTERS FOR VARIOUS CLOCK SPEEDS
;
FIXCNT: LDA CLOCK
CPI 1
RZ
PUSH D
PUSH H
POP D
CNTMUL: DAD D
DCR A
JNZ CNTMUL
POP D
RET
;
MOVE128:
MVI B,128
MOVE: MOV A,M
STAX D
INX H
INX D
DCR B
JNZ MOVE
RET
;
MENU0:
LDA NFILFLG
ORA A
JNZ MENU ;GO IF NO FILE ACTIVE
CALL ILPRT ;ELSE PRINT MESSAGE
DB CR,LF,LF
DB 1Bh,47h,44h ;reverse video
DB '** There may be text in the memory buffer **',CR,LF
DB 1Bh,47h,30h ;normal video
DB '** It will be lost unless NOL or WRT commands are used **'
DB CR,LF,BELL,0
MVI B,2 ;2 MORE BELLS
BLOOP: LDA BELRPT ;GET TIME
MOV C,A
BCLOOP: LXI H,1000 ;ABOUT 0.03 SECONDS
CALL FIXCNT
BILOOP: MOV A,L
ORA H
DCX H
JNZ BILOOP
DCR C
JNZ BCLOOP
MVI A,BELL
CALL TYPE
DCR B
JNZ BLOOP
;
MENU: LXI H,RESTSN ;RESTORE SECTOR NUMBERS..
LXI D,SECTNOB ;..FOR NEW FILE TRANSFER.
MVI B,SECTNOE-SECTNOB
CALL MOVE
LXI H,RESTROPT ;RESTORE OPTION TABLE
LXI D,OPTBL
MVI B,OPTBE-OPTBL
CALL MOVE
MVI A,0
STA MFFLG1 ;RESET MFACCESS ROUTINE..
CMA ;..AND MULTI TRANS IN CASE..
STA FSTFLG ;..OF ABORT.
JMP XPRT
;
MENU2: CALL CLRTST
CALL ILPRT
DB ' Single Letter Commands',CR,LF,LF
DB ' H - Display this information',CR,LF
DB ' ? - Display current settings',CR,LF,LF
DB ' T - Terminal mode',CR,LF
DB ' E - Terminal mode with echo',CR,LF
DB ' L - Terminal mode with local echo',CR,LF
DB ' For capturing text use T(or E or L) FILENAME.TYP and'
DB CR,LF
DB ' Start & Stop toggles described on subsequent screen.'
DB CR,LF,LF
DB ' R - Receive CP/M file using Christensen Protocol',CR,LF
DB ' S - Send CP/M file using Christensen Protocol',CR,LF
DB ' Command is: R(or S) FILENAME.TYP',CR,LF
DB ' R and S can use the following subcommands:',CR,LF
DB ' B - Bulk transfer using wildcards (e.g. *.*)',CR,LF
DB ' Q - Quiet mode (no messages to console)',CR,LF
DB ' T - Return to terminal mode after transfer',CR,LF
DB ' V - View bytes transferred on console',CR,LF,LF
DB 'The single letter commands may also be used on the',CR,LF
DB 'command line when the program is initially executed.'
DB CR,LF,LF,0
;
CALL NXTSCRN
;
CALL ILPRT
DB ' Three Letter Commands',CR,LF,LF
DB 'CPM - Exit from this program to CP/M',CR,LF
DB 'DIR - List directory and space free (may specify drive)'
DB CR,LF
DB 'ERA - Erase file (may specify drive)',CR,LF
DB 'LOG - Change default drive/user (specify drive/user)'
DB CR,LF
DB ' and reset disks. e.g. LOG A0, LOG B (user unchanged)'
DB CR,LF
DB 'FOP - Display commands for setting terminal mode file',CR,LF
DB ' output parameters',CR,LF,0
;
LDA DISCFLG
ORA A
JZ NODISC
CALL ILPRT
DB 'DSC - Disconnect the modem from the telephone line',CR,LF,0
;
NODISC: LDA SETUPTST
ORA A
JNZ NOTIME
CALL ILPRT
DB 'TIM - Set S mode time-to-send message',CR,LF,0
;
NOTIME:
LDA TOGGLECRC
ORA A
JZ NOTOGCRC
CALL ILPRT
DB 'TCC - Toggle Checksum/CRC mode on receive',CR,LF,0
;
NOTOGCRC:
LDA TOGGLEBK
ORA A
JZ NOTOGBK
CALL ILPRT
DB 'TBR - Toggle backspace to rub conversion',CR,LF,0
;
NOTOGBK:
LDA TOGGLELOC
ORA A
JZ NOTOGLOC
CALL ILPRT
DB 'TLC - Toggle 1) local command immediate',CR,LF
DB ' 2) local command after ',0
LDA EXTCHR
CALL SHFTYPE
DB CR,LF,0
;
NOTOGLOC:
LDA TOGGLELF
ORA A
JZ NOTOGLF
CALL ILPRT
DB 'TLF - Toggle send linefeed after carriage return',CR,LF,0
;
NOTOGLF:
CALL ILPRT
DB 'NUM - List remote systems',CR,LF,0
LDA SETUPTST
ORA A
JZ NOSETUP
CALL ILPRT
DB 'SET - Set communication ports',CR,LF,0
;
NOSETUP:
MVI A,LF
CALL TYPE
CALL ILPRT
DB ' The following are terminal text buffer commands:'
DB CR,LF,0
CALL ILPRT
DB 'DEL - Delete memory buffer and file',CR,LF
DB 'NOL - Return to terminal mode - no loss of data in buffer'
DB CR,LF
DB 'WRT - Write memory buffer to disk file',CR,LF,LF,0
CALL NXTSCRN
;
CALL ILPRT
DB ' Local Commands while in Terminal Mode',CR,LF,LF,0
LDA EXITCHR
CALL SHFTYPE
DB ' - Exit to command mode',CR,LF,LF,0
LDA TRANLOGON
ORA A
JZ NOTRANLOG
LDA LOGCHR
CALL SHFTYPE
DB ' - Transmit string',CR,LF
DB ' Must be followed by number of string (0-9)',CR,LF
DB ' or L to display list of strings',CR,LF,LF,0
;
NOTRANLOG:
LDA LSTTST
ORA A
JZ NOLST2
LDA LSTCHR
CALL SHFTYPE
DB ' - Toggle printer',CR,LF,0
;
NOLST2:
MVI A,LF
CALL TYPE
LDA SAVECHR
CALL SHFTYPE
DB ' - Start copy into buffer',CR,LF,0
LDA UNSAVECHR
CALL SHFTYPE
DB ' - Stop copy into buffer',CR,LF
DB ' Start & Stop may be toggled as often as desired.',CR,LF
DB ' A ":" at start of line indicates buffer is open.',CR,LF
DB ' XOFF automatically used to stop input when writing',CR,LF
DB ' full buffer to disk, XON sent to resume.',CR,LF,LF,0
LDA TRANCHR
CALL SHFTYPE
DB ' - Transfer ASCII file to remote',CR,LF,LF,0
LDA LOCONEXTCHR
ORA A
LDA EXTCHR
JNZ REMDFLT
CALL SHFTYPE
DB ' - Send local control character to remote',CR,LF,0
JMP XPRT
REMDFLT:
CALL SHFTYPE
DB ' - Next character will be used for local control',CR,LF,0
;
XPRT:
CALL ILPRT
DB CR,LF,'Drive ',0
MVI C,CURDSK ;CURRENT DISK FUNCTION
CALL BDOS
ADI 'A' ;MAKE ASCII
CALL TYPE
;
IF CPM2X ;IF CPM VER 2.X
;
CALL GETUSR ;GET CURRENT USER NUMBER
CPI 0
JZ SR3B ;SKIP IF USER 0
PUSH PSW
CALL ILPRT
DB ', User ',0
POP PSW
MVI H,0
MOV L,A
CALL DECOUT ;REPORT USER
;
ENDIF ;CPM2X
;
SR3B: CALL CRLF
LDA NFILFLG
ORA A
JNZ NOBUFMSG
CALL GETSPC
CALL ILPRT
DB ' bytes of buffer free',CR,LF,0
NOBUFMSG:
CALL ILPRT
DB 'COMMAND (H for Help): ',0
GETCMD:
LXI D,CMDBUF ;ENTER COMMAND
CALL INBUFF
CALL CRLF
LXI D,CMDBUF+2 ;POINT TO COMMAND
CALL ILCOMP
DB 'CPM',0
JNC EXIT
CALL ILCOMP
DB 'LOG',0
JNC LOGNEW
CALL ILCOMP
DB 'DIR',0
JNC DIR
CALL ILCOMP
DB 'ERA',0
JNC ERASEF
CALL ILCOMP
DB 'DSC',0
JNC DISC
CALL ILCOMP
DB '?',0
JNC CURPAR
CALL ILCOMP
DB 'SPD',0
JNC SETSPD
CALL ILCOMP
DB 'FOP',0
JNC TFOMENU
CALL ILCOMP
DB 'TIM',0
JNC SETTIM
CALL ILCOMP
DB 'TCC',0
JNC TOGCRC
CALL ILCOMP
DB 'TBR',0
JNC TOGBKSP
CALL ILCOMP
DB 'TLC',0
JNC TOGLOC
CALL ILCOMP
DB 'TLF',0
JNC TOGLF
CALL ILCOMP
DB 'TSL',0
JNC TOGSTL
CALL ILCOMP
DB 'TXF',0
JNC TOGTXOFF
CALL ILCOMP
DB 'TXN',0
JNC TOGTXON
CALL ILCOMP
DB 'TWE',0
JNC TOGWECH
CALL ILCOMP
DB 'TEF',0
JNC TOGTEOF
CALL ILCOMP
DB 'NUM',0
JNC NUMPRN
LDA SETUPTST
ORA A
JZ NOSETUP2
CALL ILCOMP
DB 'SET',0
JNC SETUPENT
NOSETUP2:
CALL ILCOMP
DB 'NOL',0
JC NXTOPT1 ;CARRY SET = NO MATCH
LDA NFILFLG
ORA A
JNZ NOFILOPN ;GO TELL OPERATOR IF NO FILE OPEN
CALL BUFMSG
LHLD HLSAVE ;RETURN TO TERMINAL..
JMP TERM ;..MODE WITH SAVE OPTION..
;..IF PREVIOUSLY ENABLED.
;
NXTOPT1:
CALL ILCOMP
DB 'WRT',0
JNC WRTFIL
CALL ILCOMP
DB 'DEL',0
JNC NEWFILE
PUSH H
LDA CMDBUF+2
LXI H,COMPLIST
CALL COMPARE ;COMPARES LIST POINTED TO BY HL..
POP H ;..TO CHAR IN A-REG.
JC NOTVLD ;CARRY SET = NO MATCH
DOOPT: PUSH H ;LOAD ORIGINAL FCB WITH TRANSFER..
CALL SETFCB ;..CMDS AND GO TO BEGINNING OF..
POP H ;..PROGRAM. WILL FOLLOW SAME LOGIC..
JMP RESTART ;..AS IF PROGRAM WERE CALLED WITH..
;..CP/M COMMAND LINE.
;
NOTVLD:
CALL NOTVLDMSG
JMP XPRT
;
NOTVLDMSG:
CALL ILPRT
DB '++ Invalid Command ++',CR,LF,BELL,0
RET
;
DIR:
MVI C,CURDSK
CALL BDOS
STA DISKSAV
CALL DIRLST
LDA DISKSAV
MOV E,A
MVI C,SELDSK
CALL BDOS
JMP XPRT
;
LOGNEW: LDA NFILFLG
ORA A
JZ NORESET
LDA CMDBUF+6
CPI ' '
JNZ SPECIFD
MVI C,CURDSK
CALL BDOS
ADI 'A'
SPECIFD:
SUI 'A'
STA DISKSAV
CPI 16
JNC NOTVLD
;
IF CPM2X ;IF CPM VER. 2.X
;
LDA CMDBUF+7 ;GET NEW USER NUMBER
CPI ' ' ;CHECK FOR SPACE
JZ SR7A ;EXIT IF NO NEW USER NUMBER SPECIFIED
CALL NUMCHK ;CHECK TO SEE IF IT IS A NUMBER
MOV B,A ;SAVE
LDA CMDBUF+8 ;GET SECOND DIGIT
CPI ' '
JZ SR7B ;GO IF SPACE
CALL NUMCHK
MOV C,A ;SAVE
MOV A,B ;GET SAVED FIRST DIGIT
ADD A ; X2
ADD A ; X4
ADD A ; X8
ADD B ; X9
ADD B ; X10
ADD C
CPI 16 ;CHECK FOR < 16
JNC NOTVLD ;GO IF NOT
MOV B,A
SR7B: PUSH B
CALL GETUSR
POP B ;RESTORE SELECTED USER
CMP B ;AND COMPARE THEM
JZ SR7A ;EXIT IF UNCHANGED
MOV E,B ;ELSE SET NEW USER
CALL SETUSR
;
ENDIF ;CPM2X
;
SR7A: CALL ILPRT
DB 'Insert disk for drive ',0
LDA DISKSAV
ADI 'A'
CALL TYPE
NOTCR: CALL ILPRT
DB CR,LF,'Hit return when ready',0
CALL KEYIN
CPI CR
JNZ NOTCR
CALL CRLF
MVI C,RESET
CALL BDOS
LDA DISKSAV
MOV E,A
MVI C,SELDSK
CALL BDOS
JMP XPRT
;
IF CPM2X
;
GETUSR: MVI E,0FFH ;GET CURRENT USER
SETUSR: MVI C,USER ;SET-UP FUNCTION CALL
CALL BDOS ;NUMBER IN RETURNED IN A
RET
;
ENDIF ;CPM2X
;
NORESET:
CALL ILPRT
DB '++ Terminal mode file open ++',CR,LF
DB '++ Use WRT or DEL before LOG command ++',CR,LF
DB CR,LF,LF,BELL,0
XRA A
JMP XPRT
;
ERASEF: LXI D,CMDBUF ;PUT CMD LINE INTO FCB AT HL
LXI H,FCB
CALL CPMLINE
CALL MOVEFCB ;MOVE FCB+16 TO FCB
LDA FCB+1
CPI ' '
JZ NOTVLD ;GO IF NO FILE SPECIFIED
LXI D,FCB
MVI C,SRCHF
CALL BDOS
INR A ;0 IF FILE NOT FOUND
JNZ ERAFILE ;OK, GO ERASE
CALL ILPRT
DB '++ File not found ++',CR,LF,BELL,0
JMP XPRT
;
ERAFILE:
LXI D,FCB
MVI C,ERASE
CALL BDOS
CALL ILPRT
DB 'File erased',CR,LF,0
JMP XPRT
;
DISC:
LDA DISCFLG
ORA A
JZ NOTVLD
CALL DISCR
CALL ILPRT
DB '** Disconnected **',CR,LF,BELL,0
JMP XPRT
;
SETSPD:
CALL ILPRT
DB 'Enter character output delay [0(none) - 9(longest delay)]: ',0
CALL NUMGET
JNC NOCHG1
STA BYTDLY
NOCHG1: CALL SPDMSG
CALL ILPRT
DB CR,LF,'Enter additional delay after <CR> [0-9]: ',0
CALL NUMGET
JNC NOCHG2
RLC ;X2
RLC ;X4
STA CRDLY
NOCHG2: CALL CRDLYMSG
JMP XPRT
;
NUMGET: LXI D,CMDBUF
CALL INBUFF
LDA CMDBUF+2 ;GET NUMBER
CPI ' '
RZ
NUMCHK: SUI '0'
CPI 10
RC
POP PSW ;PRESERVE STACK
JMP NOTVLD
;
SPDMSG: CALL ILPRT
DB 'Terminal mode file output delay is 0.',0
LDA BYTDLY
CALL GIVNUM
CALL ILPRT
DB ' seconds per character',CR,LF,0
RET
;
CRDLYMSG:
CALL ILPRT
DB 'Additional delay after <CR> is 0.',0
LDA CRDLY
CALL GIVNUM
CALL ILPRT
DB ' seconds',CR,LF,0
RET
;
GIVNUM: ADD A ;2X
CPI 10
MOV B,A
JNC NOZERO
MVI A,'0'
CALL TYPE
MOV A,B
NOZERO: PUSH H
MOV L,A
MVI H,0
CALL DECOUT
POP H
RET
;
SETTIM:
LDA SETUPTST
ORA A
JNZ NOTVLD
CALL ILPRT
DB 'Use 0-5 to give baud rate for S mode time-to-send message,'
DB CR,LF
DB 'where 0=110, 1=300, 2=600, 3=1200, 4=2400',CR,LF
DB '5=4800, and 6=9600 baud',CR,LF,LF,'Enter value: ',0
CALL NUMGET
CPI 6
JNC NOTVLD
STA MSPEED
CALL SETTIM2
JMP XPRT
;
SETTIM2:
LDA SETUPTST
ORA A
JNZ SETTIM3
CALL ILPRT
DB 'Rate for the S mode time-to-send message is set to ',0
JMP SETTIM4
SETTIM3:
CALL ILPRT
DB 'Modem speed is ',0
SETTIM4:
CALL BAUDPRT
RET
;
;Shows baud rates set for 'time to send' file transfer.
;
BAUDPRT:
LXI H,BAUDSPD
MVI D,0
LDA MSPEED ;GET BAUD RATE CODE
ADD A ;X2
MOV E,A
DAD D ;POINT TO CORRECT RATE
MOV A,M ;GET FIRST DIGIT
CALL TYPE
INX H
MOV A,M ;GET SECOND DIGIT
CALL TYPE
LDA MSPEED ;CHECK FOR GREATER THAN 1000
CPI 3
JC NOTHOU ;GO IF LESS
MVI A,'0' ;PRINT EXTRA 0
CALL TYPE
NOTHOU: CALL ILPRT
DB '0 baud',CR,LF,0
RET
;
BAUDSPD DB '11','30','60','12','24','48','96'
;
TOGCRC:
LDA TOGGLECRC
ORA A
JZ NOTVLD
LDA CKSUMDFLT
CMA
STA CKSUMDFLT
CALL TOGCRC2
JMP XPRT
;
TOGCRC2:
ORA A
JNZ CHEKMSG
CALL ILPRT
DB 'CRC mode set',CR,LF,0
RET
;
CHEKMSG:
CALL ILPRT
DB 'Checksum mode set',CR,LF,0
RET
;
TOGBKSP:
LDA TOGGLEBK
ORA A
JZ NOTVLD
LDA CONVBKSP
CMA
STA CONVBKSP
CALL TOGBKSP2
JMP XPRT
;
TOGBKSP2:
LDA CONVBKSP
ORA A
JZ NORUBMSG
CALL ILPRT
DB 'Backspace is rub',CR,LF,0
RET
;
NORUBMSG:
CALL ILPRT
DB 'Backspace is backspace',CR,LF,0
RET
;
TOGLOC: LDA TOGGLELOC
ORA A
JZ NOTVLD
LDA LOCONEXTCHR
CMA
STA LOCONEXTCHR
CALL TOGLOC2
JMP XPRT
;
TOGLOC2:
CALL ILPRT
DB 'Use ',0
LDA LOCONEXTCHR
ORA A
LDA EXTCHR
JZ LOCMSG
CALL SHFTYPE
DB ' before local command',CR,LF,0
RET
;
LOCMSG: CALL SHFTYPE
DB ' to send local command to remote',CR,LF,0
RET
;
TOGLF: LDA TOGGLELF
ORA A
JZ NOTVLD
LDA ADDLF
CMA
STA ADDLF
CALL TOGLF2
JMP XPRT
;
TOGLF2:
CALL ILPRT
DB 'Linefeed ',0
LDA ADDLF
ORA A
JNZ LFMSG
CALL ILPRT
DB 'NOT ',0
LFMSG: CALL ILPRT
DB 'sent after <CR>',CR,LF,0
RET
;
TOGSTL: LDA TOGSLF
ORA A
JZ NOTVLD
LDA STRLF
CMA
STA STRLF
CALL TOGSTL2
JMP XPRT
;
TOGSTL2:
CALL ILPRT
DB 'Linefeed ',0
LDA STRLF
ORA A
JZ SLFMSG
CALL ILPRT
DB 'NOT ',0
SLFMSG: CALL ILPRT
DB 'sent after <CR> in terminal mode file output',CR,LF,0
RET
;
TOGTXOFF:
LDA TOGXOFF
ORA A
JZ NOTVLD
CALL ILPRT
DB 'Use XOFF testing? (Y/N): ',0
CALL GETANS
JC NOCHG3
STA XOFFTST
NOCHG3: CALL XOFFMSG
LDA XOFFTST
ORA A
JZ XPRT
CMA
STA XONWAIT
STA ECHWAIT
CALL THEREF
CALL XONMSG
CALL ECHMSG
JMP XPRT
;
TOGTXON:
CALL ILPRT
DB 'Use XON waiting after <CR> (Y/N): ',0
CALL GETANS
JC NOCHG4
STA XONWAIT
NOCHG4: CALL XONMSG
LDA XONWAIT
ORA A
JZ XPRT
CMA
STA XOFFTST ;DON'T ALLOW BOTH
STA ECHWAIT
CALL THEREF
CALL XOFFMSG
CALL ECHMSG
JMP XPRT
;
TOGWECH:
CALL ILPRT
DB 'Use echo waiting before transmitting next character (Y/N): ',0
CALL GETANS
JC NOCHG5
STA ECHWAIT
NOCHG5: CALL ECHMSG
LDA ECHWAIT
ORA A
JZ XPRT
CMA
STA XOFFTST
STA XONWAIT
CALL THEREF
CALL XOFFMSG
CALL XONMSG
JMP XPRT
;
ECHMSG: CALL ILPRT
DB 'Waiting for character echo ',0
LDA ECHWAIT
ORA A
JNZ ECHMSG2
CALL ILPRT
DB 'NOT ',0
ECHMSG2:
CALL ILPRT
DB 'used in terminal mode file output',CR,LF,0
RET
;
GETANS:
LXI D,CMDBUF
CALL INBUFF
LDA CMDBUF+2 ;GET ANSWER
CPI ' '
CMC
RZ
MOV B,A
CPI 'N'
MVI A,FALSE
RZ
MOV A,B
CPI 'Y'
MVI A,TRUE
RZ
POP PSW ;PRESERVE STACK
JMP NOTVLD
;
THEREF: CALL ILPRT
DB 'Therefore -',CR,LF,0
RET
;
XOFFMSG:
CALL ILPRT
DB 'XOFF testing ',0
LDA XOFFTST
ORA A
JNZ XOTSTON
CALL ILPRT
DB 'NOT ',0
XOTSTON:
CALL ILPRT
DB 'used',0
XONMSG3:
CALL ILPRT
DB ' in terminal mode file output',CR,LF,0
RET
;
XONMSG:
CALL ILPRT
DB 'XON ',0
LDA XONWAIT
ORA A
JNZ XONMSG2
CALL ILPRT
DB 'NOT ',0
XONMSG2:
CALL ILPRT
DB 'automatically tested after <CR>',0
JMP XONMSG3
;
SETUPENT:
LDA SETUPTST
ORA A
JZ NOTVLD
CALL SETUPR
JMP XPRT
;
NEWFILE:
LDA NFILFLG
ORA A
JNZ NOFILOPN
LDA FCB3+1 ;CHECK THAT FILE WAS REQUESTED
CPI ' '
JZ NOFILOPN ;IF NO FILE, DON'T ERASE
LXI D,FCB3
MVI C,ERASE
CALL BDOSRT
MVI A,TRUE ;DO NOT ALLOW TERMINAL..
STA NFILFLG ;..SAVE SINCE NO FILE..
CMA ;..SPECIFIED.
STA SAVEFLG
LXI H,FCB3
CALL INITFCBS
LXI H,BOTTRAM
SHLD HLSAVE
JMP XPRT
;
WRTFIL:
LDA NFILFLG
CPI TRUE
JZ NOFILOPN
LDA FCB3+1 ;CHECK THAT FILE WAS REQUESTED
CPI ' '
JZ NOFILOPN
LHLD HLSAVE
CALL NUMRECS ;DISK WRITE ROUTINE AS USED IN..
CALL WRTDSK ;..IN THE INTDSKSV ROUTINE.
CALL CLOSE3
MVI A,TRUE
STA NFILFLG
CMA
STA SAVEFLG
LXI H,FCB3
CALL INITFCBS ;BLANK OUT FCB SO WRITTEN FILE CAN'T BE ERASED.
LXI H,BOTTRAM
SHLD HLSAVE
JMP XPRT
;
NOFILOPN:
CALL ILPRT
DB '++ No File Open ++',CR,LF,BELL,0
JMP XPRT
;
COMPARE:
MOV B,M ;COMPARES A-REG WITH LIST..
COMPLP:
INX H ;..ADDRESSED BY HL. FIRST ELEMENT..
CMP M ;..OF LIST MUST BE NUMBER OF ELEMENTS..
JZ VALID ;..BEING COMPARED. RETURNS WITH..
DCR B ;..CARRY SET IF A-REG DOES NOT..
JNZ COMPLP ;.. CONTAIN AN ELEMENT IN LIST.
STC
VALID:
RET
;
NXTSCRN:
CALL ILPRT
DB 'HIT any KEY to CONTINUE',0
NOKEY1: CALL STAT ;GET KEYBOARD STATUS
JZ NOKEY1 ;KEEP LOOPING UNTIL KEYPRESS
CALL KEYIN ;GOBBLE UP KEYPRESS
CALL CLRTST
RET
;
CLRTST: LDA SCRNTEST
ORA A
JZ LOTSALF
CALL CLRSCRN
RET
;
LOTSALF:
MVI A,CR
CALL TYPE
MVI B,12
MVI A,LF
LFLOOP: CALL TYPE
DCR B
JNZ LFLOOP
RET
;
CURPAR:
CALL CLRTST
CALL ILPRT
DB ' Current Settings',CR,LF,LF,LF,0
LDA CKSUMDFLT
CALL TOGCRC2
LDA LSTTST
ORA A
JZ NOLST3
CALL LSTMSG
NOLST3:
CALL DETCAR
CALL SETTIM2
CALL TOGBKSP2
CALL TOGLF2
CALL TOGLOC2
CALL ILPRT
DB 'Terminal mode file buffer is ',0
LDA NFILFLG
ORA A
JZ ACTIVE
CALL ILPRT
DB 'in',0
ACTIVE:
CALL ILPRT
DB 'active',CR,LF,'Unused portion of buffer is ',0
CALL GETSPC
CALL ILPRT
DB ' bytes',CR,LF,0
LDA SETUPTST
ORA A
JZ NOSETP
CALL GIVEPRM
NOSETP: CALL TOGSTL2
CALL TOGTEOF2
CALL XOFFMSG
CALL XONMSG
CALL ECHMSG
CALL SPDMSG
CALL CRDLYMSG
CALL CRLF
JMP XPRT
;
GETSPC: CALL GETMAX
MOV B,A
LHLD HLSAVE
STC
CMC
MVI A,0
SBB L
MOV L,A
MOV A,B
SBB H
MOV H,A
CALL DECOUT
RET
;
TFOMENU:
CALL CLRTST
CALL ILPRT
DB ' Commands for Setting Terminal Mode File Output'
DB ' Parameters',CR,LF,LF,LF
DB 'SPD - Set speed of file output',CR,LF
DB 'TEF - Toggle transmission of end-of-file character',CR,LF,0
LDA TOGSLF
ORA A
JZ NOTOGSLF
CALL ILPRT
DB 'TSL - Toggle stripping linefeeds',CR,LF
DB 'TWE - Toggle wait for character echo',CR,LF,0
;
NOTOGSLF:
LDA TOGXOFF
ORA A
JZ NOTOGXOFF
CALL ILPRT
DB 'TXF - Toggle XOFF testing',CR,LF
DB 'TXN - Toggle XON waiting after <CR>',CR,LF,LF,LF,0
;
NOTOGXOFF:
JMP XPRT
;
TOGTEOF:
LDA EOFSEND
CMA
STA EOFSEND
CALL TOGTEOF2
JMP XPRT
;
TOGTEOF2:
CALL ILPRT
DB 'End-of-file character ',0
LDA EOFSEND
ORA A
JNZ EOFMSG
CALL ILPRT
DB 'NOT ',0
EOFMSG: CALL ILPRT
DB 'sent in terminal mode file output',CR,LF,0
RET
;
;
;THIS ROUTINE DISPLAYS THE PHONE NUMBERS IN THE LIBRARY
;
; Mods by G Coady 19-oct-83
; Fitted search function so routine doesn't print blank entries to screen
;
NUMPRN:
PUSH H
CALL CLRTST
CALL ILPRT
DB ' Library of Phone Numbers of Remote Systems',0
MVI C,13 ;NUMBER OF LINES TO MOVE
LXI H,NUMBLIB ;ADDRESS OF SOURCE MEMORY
LXI D,DBUF ;ADDRESS OF TARGET MEMORY
CALL NEWLINE ;START WITH CRLF
STAX D ;+LF
INX D ;AND BUMP IT
NUMPRN1:
CALL NUMSCAN ;MOVE FIRST HALF LINE
CALL SPACES ;2 ENTRIES + 3 SPACES = 63 CHARACTERS
CALL NUMSCAN ;SECOND HALF
CALL NEWLINE
JMP NUMPRN1 ;numscan has routine exit !!
;
NUMSCAN:
MOV A,M ;GET CURRENT CHAR
INX H ;POINT TO NEXT
ORA A ;TEST FOR END OF TABLE
JZ NUMPRN2 ;HAVE END OF TABLE, GO PRINT
CPI '=' ;TEST FOR START OF NAME
JNZ NUMSCAN ;KEEP SCANNING FOR '='
MOV A,M ;GET CURRENT CHAR
CPI ' ' ;BLANK ???
JZ NUMSCAN ; YES, TRY FOR NEXT ENTRY
MVI B,30 ;CHAR COUNT FOR MOVE
CALL MOVE ;STASH IN OUTPUT BUFFER
RET
;
NEWLINE: ;PUTS CR-LF AT MEMORY POINTED BY 'DE'
MVI A,CR ;CR
STAX D ;STORE IT
MVI A,LF ;LF
INX D ;BUMP POINTER
STAX D ;STORE LF
INX D ;BUMP POINTER
RET
;
SPACES: MVI A,20H ;SPACE
STAX D
INX D ;1
STAX D
INX D ;2
STAX D
INX D ;3
RET
;
NUMPRN2:
MVI A,'$'
STAX D
MVI C,PRINT
LXI D,DBUF ;POINT TO TABLE OF NUMBERS TO PRINT
CALL BDOS
CALL CRLF
POP H
JMP XPRT
;
;
LINK CONSOLE
;