CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 1 ; MODEMRB - 16-bit mode MODEM for the DEC RAINBOW (R) 100. ; ; by: Michael J. Mellinger ; Data Research Associates, Inc. ; 9270 Olive Boulevard ; St. Louis, Missouri 63132 ; ; Clearinghouse for comments, changes, suggestions: ; (No guarantee of response and no liability assumed) ; Thousand Oaks Technical RCP/M ; 805-492-5472 ; ; ; MODEM9 ; ;BASED ON THE CP/M MODEM PROGRAM CREATED BY WARD CHRISTENSEN ; ; ********* N O T I C E S ********* ; ; Revisers releasing new versions should only ; change the version number by 1 digit in the ; last place. ; ; ********************************** ; ;This is just a header file to give the HEX output the right name. ; ; = include a:deff.a86 = ; = ; DEFF.ASM = ; = ;Deffinitions for use in assembling MODEM9.xx. = ; = 00FF TRUE EQU 0FFH = 0000 FALSE EQU 0 = ; = 00FF CPM2X EQU TRUE ;TRUE IF CP/M 2.X = 0010 DBUFSIZ EQU 16 ;BUFFER SIZE FOR FILE TRANSFER IN KBYTES = ; = 0006 ERRCRC EQU 6 ;NUMBER OF TIMES TO TRY CRC MODE BEFORE = ;SWITCHING TO CHECKSUM = 000A ERRLIM EQU 10 ;NUMBER OF TIMES TO RETRY = ;SEND/RECEIVE ERRORS BEFORE QUIT = ; = ; = 0043 CRC EQU 'C' ;USED TO REQUEST 'CRC' INSTEAD OF 'CKSUM' = 001B ESC EQU '['-40H ; ^[ = ESCAPE = 0001 SOH EQU 'A'-40H ; ^A = START OF HEADER = 0004 EOT EQU 'D'-40H ; ^D = END OF TEXT = 0006 ACK EQU 'F'-40H ; ^F = ACKNOWLEDGE = 0006 OKNMCH EQU 'F'-40H ; ^F = OKAY NAME MATCH CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 2 = 0007 BELL EQU 'G'-40H ; ^G = BELL CHARACTER = 0008 BKSP EQU 'H'-40H ; ^H = BACKSPACE = 0009 TAB EQU 'I'-40H ; ^I = TAB = 000A LF EQU 'J'-40H ; ^J = LINEFEED = 000D CR EQU 'M'-40H ; ^M = CARRIAGE RETURN = 0011 XON EQU 'Q'-40H ; ^Q = XON CHARACTER = 0013 XOFF EQU 'S'-40H ; ^S = XOFF CHARACTER = 0015 NAK EQU 'U'-40H ; ^U = NOT ACKNOWLEDGE = 0018 CAN EQU 'X'-40H ; ^X = CANCEL SEND/RECEIVE = 001A EOFCHAR EQU 'Z'-40H ; ^Z = END OF FILE = 0020 SPACE EQU ' ' ; SPACE = 0075 BDNMCH EQU 75H ; BAD NAME MATCH = 007F RUB EQU 7FH ; RUB = ; = ; = ; BDOS EQUATES = ; = 0001 RDCON EQU 1 = 0002 WRCON EQU 2 = 0005 LSTOUT EQU 5 = 0006 DCONIO EQU 6 = 0009 PRINT EQU 9 = 000A RDBUF EQU 10 = 000B CONST EQU 11 = 000D RESET EQU 13 = 000E SELDSK EQU 14 = 000F OPEN EQU 15 = 0010 CLOSE EQU 16 = 0011 SRCHF EQU 17 = 0012 SRCHN EQU 18 = 0013 ERASE EQU 19 = 0014 READ EQU 20 = 0015 WRITE EQU 21 = 0016 MAKE EQU 22 = 0017 REN EQU 23 = 0019 CURDSK EQU 25 = 001A STDMA EQU 26 = 001B GETALC EQU 27 ;CP/M ALLOCATION VECTOR ADDRESS = 001F GETPARM EQU 31 ;CURRENT DISK PARAMETERS ADDRESS = 0020 USER EQU 32 = 0023 FILSIZ EQU 35 = 0005 BDOS EQU 5 = 0000 REIPL EQU 0 = 005C FCB EQU 5CH = 0068 FCBEXT EQU FCB+12 = 007C FCBSNO EQU FCB+32 = 007C FCBRNO EQU FCB+32 = 006C FCB2 EQU 6CH = ; = include a:start.a86 = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 3 = ; START.ASM = ; = ;This file is for making changes to MODEM9.xx which are not UART/MODEM = ;specific. UART/MODEM suport is provided by the various SYS files. = ; = ;The user can make the following changes in this file: = ; = ; a) Set the TRUE/FALSE statements in the lookup table which = ; begins with BAKUPBYTE and ends with EOFSEND = ; b) Change the control characters that are used for local commands, = ; this sequence starts with EXITCHR and ends with EXTCHR = ; c) Set STRGOK to TRUE and enter up to ten strings at location = ; STRINGS. These strings can be logon sequences or frequently = ; used commands that are sent to a remote computer = ; = ; = 00FF STRGOK EQU TRUE ;change to TRUE if you want to define = ;strings, such as logon sequences, for = ;transmission. Up to 10 strings may be = ;entered at location STRINGS in this file. = ; = ;*** Don't change the ORG locations in this file or in the files *** = ;*** SETUP and MAIN. This ORG statements provide standard locations *** = ;*** for modification by overaly files or DDT. *** = ; = CSEG = ORG 0100H = ; =0100 E91109 0A14 JMP START = ; =0103 00 BAKUPBYTE DB FALSE ;true=make .BAK file =0104 00 CKSUMDFLT DB FALSE ;true=default to Checksum checking = ;false=default to CRC checking =0105 FF TOGGLECRC DB TRUE ;true=allow toggling of Checksum to CRC =0106 00 CONVBKSP DB FALSE ;true=convert backspace to rub =0107 FF TOGGLEBK DB TRUE ;true=allow toggling of bksp to rub =0108 00 ADDLF DB FALSE ;true=add LF after CR =0109 FF TOGGLELF DB TRUE ;true=allow toggling of LF after CR =010A FF STRLF DB TRUE ;true=strip LF after CR in terminal file output =010B FF TOGSLF DB TRUE ;true=toggle strip LF after CR in file output =010C FF SAVCCP DB TRUE ;true=do not overwrite CCP =010D 00 LOCONEXTCHR DB FALSE ;true=local command if EXTCHR precedes = ;false=not local command if EXTCHR precedes =010E FF TOGGLELOC DB TRUE ;true=allow toggling of LOCONEXTCHR =010F FF LSTTST DB TRUE ;true=allow toggling of printer on/off = ;in terminal mode. Set to false if your = ;printer can't keep up with the modem =0110 00 XOFFTST DB FALSE ;true=allow testing of XOFF from remote = ;while transmitting a file in terminal mode =0111 00 XONWAIT DB FALSE ;true=wait for XON after sending CR while = ;transmitting a file in terminal mode =0112 FF TOGXOFF DB TRUE ;true=allow toggling of XOFF/XON testing CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 4 =0113 00 ECHWAIT DB FALSE ;true=wait for echo before sending next = ;character in terminal mode file output =0114 00 EOFSEND DB FALSE ;true=send eof in terminal mode file output =0115 00 NAKONLY DB FALSE ;true=resends a record only after a valid NAK = ;false=resends a record after any non-ACK = ;true is intended only for use with mainframes = ;that send, for example, xoff when buffer is = ;full = ; =0116 FF SETUPTST DB SETUP =0117 FF SCRNTEST DB SCRNCLR =0118 FF TRANLOGON DB STRGOK =0119 FF DISCFLG DB DISCON =011A FF CARDETFLG DB CARDET =011B 05 CLOCK DB CLKRATE = ; =011C 05 MSPEED DB 5 ;sets the display time to send a file = ;0=110 1=300 2=450 3=600 4=710 = ;5=1200 6=2400 7=4800 8=9600 =011D 00 BYTDLY DB 0 ;default time to send character in = ;terminal mode file transfer = ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec =011E 00 CRDLY DB 0 ;default time for extra wait after CR = ;in terminal mode file transfer = ;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec =011F 1E BELRPT DB 30 ;bell repeat time = value*0.03 sec =0120 05 NOOFCOL DB 5 ;number of directory columns, currently = ;set for 80 column screen = ; =0121 1C EXITCHR DB '\'-40H ; ^E = Exit without disconnect =0122 0E LOGCHR DB 'N'-40H ; ^O = Send logon =0123 1D LSTCHR DB ']'-40H ; ^P = Toggle printer =0124 04 UNSAVECHR DB 'D'-40H ; ^R = Close input text buffer =0125 16 TRANCHR DB 'V'-40H ; ^T = Transmit file to remote =0126 06 SAVECHR DB 'F'-40H ; ^Y = Open input text buffer =0127 1E EXTCHR DB '^'-40H ; ^^ = Send next character = ; =0128 E8EA24 2615 VERNUM: CALL ILPRT =012B 0D0A4D4F4445 DB CR,LF,'MODEM 9.01.02 - 07/08/83',CR,LF,0 4D20392E3031 2E3032202D20 30372F30382F 38330D0A00 =0148 E9EB04 0636 JMP SYSVER = ; = ;ALL STRINGS MUST BE 31 CHARACTERS OR LESS AND MUST BE TERMINATED WITH 0 = ; = STRINGS: =014B 535452494E47 DB 'STRING #0 at 240H',0 202330206174 203234304800 =015D RB (OFFSET STRINGS)-(OFFSET $)+32*1 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 5 =016B 535452494E47 DB 'STRING #1 at 260H',0 202331206174 203236304800 =017D RB (OFFSET STRINGS)-(OFFSET $)+32*2 =018B 535452494E47 DB 'STRING #2 at 280H',0 202332206174 203238304800 =019D RB (OFFSET STRINGS)-(OFFSET $)+32*3 =01AB 535452494E47 DB 'STRING #3 at 2A0H',0 202333206174 203241304800 =01BD RB (OFFSET STRINGS)-(OFFSET $)+32*4 =01CB 535452494E47 DB 'STRING #4 at 2C0H',0 202334206174 203243304800 =01DD RB (OFFSET STRINGS)-(OFFSET $)+32*5 =01EB 535452494E47 DB 'STRING #5 at 2E0H',0 202335206174 203245304800 =01FD RB (OFFSET STRINGS)-(OFFSET $)+32*6 =020B 535452494E47 DB 'STRING #6 at 300H',0 202336206174 203330304800 =021D RB (OFFSET STRINGS)-(OFFSET $)+32*7 =022B 535452494E47 DB 'STRING #7 at 320H',0 202337206174 203332304800 =023D RB (OFFSET STRINGS)-(OFFSET $)+32*8 =024B 535452494E47 DB 'STRING #8 at 340H',0 202338206174 203334304800 =025D RB (OFFSET STRINGS)-(OFFSET $)+32*9 =026B 535452494E47 DB 'STRING #9 at 360H',0 202339206174 203336304800 = ; = ; = ;PHONE NUMBER LIBRARY TABLE. = ; = ;EACH DB MUST BE 32 CHARACTERS LONG FOR PROPER OPERATION. = ;LAST DB MUST BE DB 0. UP TO 26 NUMBERS ARE ALLOWED. = ; = NUMBLIB: = ; '----5---10---15---20---25-----32' =027D 413D416D7261 DB 'A=Amrad 1-703-734-1387' ;'A' 642020202020 202020202020 312D3730332D 3733342D3133 3837 =029D 423D42656E20 DB 'B=Ben Bronson 1-312-955-4493' ;'B' 42726F6E736F CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 6 6E2020202020 312D3331322D 3935352D3434 3933 =02BD 433D43424253 DB 'C=CBBS Pasadena 1-213-799-1632' ;'C' 205061736164 656E61202020 312D3231332D 3739392D3136 3332 =02DD 443D504D4D49 DB 'D=PMMI 1-703-379-0303' ;'D' 202020202020 202020202020 312D3730332D 3337392D3033 3033 =02FD 453D54656368 DB 'E=Tech. CBBS 1-313-846-6127' ;'E' 2E2043424253 202020202020 312D3331332D 3834362D3631 3237 =031D 463D526F6E20 DB 'F=Ron Fowler 1-313-729-1905R' ;'F' 466F776C6572 202020202031 2D3331332D37 32392D313930 3552 =033D 473D4761736E DB 'G=Gasnet NASA 1-301-344-9156' ;'G' 6574204E4153 412020202020 312D3330312D 3334342D3931 3536 =035D 483D44617665 DB 'H=Dave Hardy 1-313-846-6127' ;'H' 204861726479 202020202020 312D3331332D 3834362D3631 3237 =037D 493D5761796E DB 'I=Wayne Hammerly 1-301-953-3753' ;'I' 652048616D6D 65726C792020 312D3330312D 3935332D3337 3533 =039D 4A3D52424253 DB 'J=RBBS Pasadena 1-213-356-1034' ;'J' 205061736164 656E61202020 312D3231332D 3335362D3130 3334 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 7 =03BD 4B3D44617669 DB 'K=David Kozinn 1-216-334-4604' ;'K' 64204B6F7A69 6E6E20202020 312D3231362D 3333342D3436 3034 =03DD 4C3D50726F67 DB 'L=Program Store 1-202-337-4694' ;'L' 72616D205374 6F7265202020 312D3230322D 3333372D3436 3934 =03FD 4D3D4B656C6C DB 'M=Kelly Smith 1-805-527-9321' ;'M' 7920536D6974 682020202020 312D3830352D 3532372D3933 3231 =041D 4E3D53757065 DB 'N=SuperBrain Sys 1-617-862-0781' ;'N' 72427261696E 205379732020 312D3631372D 3836322D3037 3831 =043D 4F3D522E4C2E DB 'O=R.L.Plouffe 1-703-524-2549' ;'O' 506C6F756666 652020202020 312D3730332D 3532342D3235 3439 =045D 503D4B2E5065 DB 'P=K.Petersen 1-313-759-6569R' ;'P' 74657273656E 202020202031 2D3331332D37 35392D363536 3952 =047D 513D42727563 DB 'Q=Bruce Ratoff 1-201-272-1874' ;'Q' 65205261746F 666620202020 312D3230312D 3237322D3138 3734 =049D 523D4D61726B DB 'R=Mark Pulver 1-312-789-0499' ;'R' 2050756C7665 722020202020 312D3331322D 3738392D3034 3939 =04BD 533D20202020 DB 'S= ' ;'S' 202020202020 202020202020 202020202020 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 8 202020202020 2020 =04DD 543D20202020 DB 'T= ' ;'T' 202020202020 202020202020 202020202020 202020202020 2020 =04FD 553D20202020 DB 'U= ' ;'U' 202020202020 202020202020 202020202020 202020202020 2020 =051D 563D20202020 DB 'V= ' ;'V' 202020202020 202020202020 202020202020 202020202020 2020 =053D 573D20202020 DB 'W= ' ;'W' 202020202020 202020202020 202020202020 202020202020 2020 =055D 583D20202020 DB 'X= ' ;'X' 202020202020 202020202020 202020202020 202020202020 2020 =057D 593D20202020 DB 'Y= ' ;'Y' 202020202020 202020202020 202020202020 202020202020 2020 =059D 5A3D20202020 DB 'Z= ' ;'Z' 202020202020 202020202020 202020202020 202020202020 2020 =05BD 00 DB 0 ; end = ; '----5---10---15---20---25-----32' = ; = INCLUDE a:SYS.A86 = ; = ; RAINBOW.A86 = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 9 = ; For the DEC Rainbow communications port. = ; = ; = ;Change the clock speed to suit your system. = 0005 CLKRATE EQU 5 ;clock speed in MHz, 8 MHz maximum = ; = ;Do not change the next three equates. = 00FF SETUP EQU TRUE = 00FF DISCON EQU TRUE = 00FF CARDET EQU TRUE = 00FF SCRNCLR EQU TRUE = ; = ;Z80 SIO equates. = 0001 MODRCVB EQU 01H ;bit to test for received data = 0001 MODRCVR EQU MODRCVB ;change to 0 if bit is 0 when = ;data received = 0004 MODSNDB EQU 04H ;bit to test for ready to send = 0004 MODSNDR EQU MODSNDB ;change to 0 if bit is 0 when = ;ready to send = ; = 0040 MODDATP EQU 040H = 0042 MODCTLP EQU 042H = 0006 MODBAUP EQU 06H = 0002 MODDTRP EQU 02H = ; = 001B CLR1 EQU 27 = 005B CLR2 EQU '[' = 0030 CLR3 EQU '0' = 004A CLR4 EQU 'J' = ; = 001B SCLR1 EQU 27 = 005B SCLR2 EQU '[' = 0032 SCLR3 EQU '2' = 004A SCLR4 EQU 'J' = 001B SCLR5 EQU 27 = 005B SCLR6 EQU '[' = 0048 SCLR7 EQU 'H' = ; =05BE E85420 2615 CLREOS: CALL ILPRT = ; =05C1 1B5B304A00 DB CLR1,CLR2,CLR3,CLR4,0 =05C6 C3 RET = ; =05C7 E84B20 2615 CLRSCRN: CALL ILPRT = ; =05CA 1B5B324A1B5B DB SCLR1,SCLR2,SCLR3,SCLR4,SCLR5,SCLR6,SCLR7,0 4800 =05D2 C3 RET = ; =05D3 E442C3 INMODCTLP: IN AL,MODCTLP ! RET ;in modem control port =05D6 RB OFFSET INMODCTLP-(offset $)+16 ;extra space =05E3 E640C3 OUTMODDATP: OUT MODDATP,AL ! RET ;out modem data port CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 10 =05E6 RB OFFSET OUTMODDATP-(offset $)+16 ;extra space =05F3 E440C3 INMODDATP: IN AL,MODDATP ! RET ;in modem data port =05F6 RB OFFSET INMODDATP-(offset $)+16 ;extra space =0603 2404C3 ANIMODSNDB: AND AL,MODSNDB ! RET ;bit to test for send ready =0606 RB OFFSET ANIMODSNDB-(offset $)+16 ;extra space =0613 3C04C3 CPIMODSNDR: CMP AL,MODSNDR ! RET ;value of send bit when ready =0616 RB OFFSET CPIMODSNDR-(offset $)+16 ;extra space =0623 2401C3 ANIMODRCVB: AND AL,MODRCVB ! RET ;bit to test for receive ready =0626 RB OFFSET ANIMODRCVB-(offset $)+16 ;extra space =0633 3C01C3 CPIMODRCVR: CMP AL,MODRCVR ! RET ;value of receive bit when ready = ; = ;This is where the message goes giving the system for = ;which MODEM9 has been customized. = ; = SYSVER: =0636 E8DC1F 2615 CALL ILPRT =0639 56657273696F DB 'Version for: DEC Rainbow',CR,LF,0 6E20666F723A 204445432052 61696E626F77 0D0A00 =0654 C3 RET = ; = ;The following are used in setting up the Z80 SIO. = ;No need to change for another micro if INIT and SETUP are FALSE. = ; = ;control bytes = 0018 RSTINS EQU 18H ;reset SIO - register 0 = 0030 RSTERR EQU 30H ;reset parity and overrun flags - register 0 = 0000 REG1INS EQU 0 ;no interrupts - register 1 = 00C1 REG3INS EQU 0C1H ;8 Rx bits, Rx enable -register 3 = 0001 RENABL EQU 1 ;Rx enable = 0044 REG4INS EQU 44H ;16X baud rate, 1 stop bit, no parity - register 4 = 0040 CLK16 EQU 40H ;16X baud rate = 00EA REG5INS EQU 0EAH ;8 Tx bits, Tx enable, RTS, DTR - register 5 = 008A ONINS EQU 8AH ;Tx enable, RTS, DTR - register 5 = 0068 OFFINS EQU 68H ;8 Tx bits, Tx enable, no RTS, no DTR -register 5 = ;End of Z80 SIO specific equates for initialization. = 0088 BAUD12 EQU 88H ;1200 baud = 000C DECDTR EQU 0CH ;DTR for special DEC DTR port = ; = ; = ;The following is used to initialize the Z80 SIO on execution = ;of MODEM9. = ; = INITMOD: =0655 B005 MOV AL,5 ;MSPEED 1200 baud value = 0656 INITSPD EQU OFFSET $ -1 =0657 2EA21C01 MOV MSPEED,AL = ; =065B B00C MOV AL,DECDTR =065D F6D0 NOT AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 11 =065F E602 OUT MODDTRP,AL = ; =0661 B000 MOV AL,0 ;select register 0 =0663 E642 OUT MODCTLP,AL =0665 B018 MOV AL,RSTINS =0667 E642 OUT MODCTLP,AL =0669 B001 MOV AL,1 ;select register 1 =066B E642 OUT MODCTLP,AL =066D B000 MOV AL,REG1INS =066F E642 OUT MODCTLP,AL =0671 B003 MOV AL,3 ;select register 3 =0673 E642 OUT MODCTLP,AL =0675 B0C1 MOV AL,REG3INS = 0676 PARM1 EQU OFFSET $ -1 =0677 E642 OUT MODCTLP,AL =0679 B004 MOV AL,4 ;select register 4 =067B E642 OUT MODCTLP,AL =067D B044 MOV AL,REG4INS = 067E PARM2 EQU OFFSET $ -1 =067F E642 OUT MODCTLP,AL =0681 B005 MOV AL,5 ;select register 5 =0683 E642 OUT MODCTLP,AL =0685 B0EA MOV AL,REG5INS = 0686 PARM3 EQU OFFSET $ -1 =0687 E642 OUT MODCTLP,AL =0689 B088 MOV AL,BAUD12 = 068A SETBD EQU OFFSET $ -1 =068B E606 OUT MODBAUP,AL =068D C3 RET = ; = ; = ;The following routine changes the baud rate, stop bits and parity on = ;the Z80 SIO from the command level. Note the routine MUST modify the = ;parameters used by the INITMOD routine. = ; = ;The following are parameters/masks used in setting word length = ;stop bits and parity for the Z80 SIO. = 00C0 MSKWD EQU 0C0H ;word length mask = 0040 RSEVEN EQU 40H ;receive seven bit word = 00C0 REIGHT EQU 0C0H ;receive eight bit word = 0020 TSEVEN EQU 20H ;transmit seven bit word = 0060 TEIGHT EQU 60H ;transmit eight bit word = 000C MSKST EQU 0CH ;stop bit mask = 0004 ONE EQU 04H ;one stop bit = 000C TWO EQU 0CH ;two stop bits = 0003 MSKPA EQU 03H ;mask for parity bits = 0000 NONE EQU 00H ;no parity = 0001 ODD EQU 01H ;odd parity = 0003 EVEN EQU 03H ;even parity = ; = ; =068E 53 SETUPR: PUSH BX CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 12 =068F E8321B 21C4 CALL CLRTST =0692 E8801F 2615 CALL ILPRT =0695 202020202020 DB ' UART/Modem Control',CR,LF,LF,LF 202020202020 202020202055 4152542F4D6F 64656D20436F 6E74726F6C0D 0A0A0A =06BC 43757272656E DB 'Current settings -',CR,LF,0 742073657474 696E6773202D 0D0A00 =06D1 E89715 1C6B CALL SETTIM2 =06D4 E80B02 08E2 CALL GIVEPRM =06D7 E83B1F 2615 CALL ILPRT =06DA 0D0A DB CR,LF =06DC 456E74657220 DB 'Enter choices below - for no change',CR,LF,0 63686F696365 732062656C6F 77202D203C43 523E20666F72 206E6F206368 616E67650D0A 00 =0707 BAD309 AGAIN: MOV DX,OFFSET BAUDBUF ;point to input buffer for ILCOMP =070A E8081F 2615 CALL ILPRT =070D 426175642052 DB 'Baud Rate (300, 600, 1200, 2400, 4800, 9600): ',0 617465202833 30302C203630 302C20313230 302C20323430 302C20343830 302C20393630 30293A2000 =073C E8F81E 2637 CALL INBUFF =073F BAD509 MOV DX,OFFSET BAUDBUF+2 =0742 E80720 274C CALL ILCOMP ;compare BAUDBUF+2 with characters below =0745 33303000 DB '300',0 =0749 B001 MOV AL,1 =074B 7348 0795 JNC OK ;go if got match =074D E8FC1F 274C CALL ILCOMP =0750 36303000 DB '600',0 =0754 B003 MOV AL,3 =0756 733D 0795 JNC OK =0758 E8F11F 274C CALL ILCOMP =075B 3132303000 DB '1200',0 =0760 B005 MOV AL,5 =0762 7331 0795 JNC OK =0764 E8E51F 274C CALL ILCOMP =0767 3234303000 DB '2400',0 =076C B006 MOV AL,6 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 13 =076E 7325 0795 JNC OK =0770 E8D91F 274C CALL ILCOMP =0773 3438303000 DB '4800',0 =0778 B007 MOV AL,7 =077A 7319 0795 JNC OK =077C E8CD1F 274C CALL ILCOMP =077F 3936303000 DB '9600',0 =0784 B008 MOV AL,8 =0786 730D 0795 JNC OK =0788 E8C11F 274C CALL ILCOMP =078B 2000 DB ' ',0 =078D 731E 07AD JNC AGAIN2 =078F E81802 09AA CALL WRONG =0792 E972FF 0707 JMP AGAIN ;try again = ; =0795 2EA25606 OK: MOV CS: BYTE PTR .INITSPD,AL =0799 2EA21C01 MOV MSPEED,AL =079D B400 MOV AH,0 =079F BBC609 MOV BX,(OFFSET BD300)-1 =07A2 03D8 ADD BX,AX =07A4 2E8A870000 MOV AL,CS: BYTE PTR [BX] ; GET BAUD RATE =07A9 2EA28A06 MOV CS: BYTE PTR .SETBD,AL ;store in INITMOD = ; =07AD BAD309 AGAIN2: MOV DX,OFFSET BAUDBUF ;point to input buffer for ILCOMP =07B0 E8621E 2615 CALL ILPRT =07B3 0D0A DB CR,LF =07B5 576F7264204C DB 'Word Length (7, 8): ',0 656E67746820 28372C203829 3A2000 =07CA E86A1E 2637 CALL INBUFF =07CD BAD509 MOV DX,OFFSET BAUDBUF+2 =07D0 E8791F 274C CALL ILCOMP ;compare BAUDBUF+2 with characters below =07D3 3700 DB '7',0 =07D5 B040 MOV AL,RSEVEN =07D7 B520 MOV CH,TSEVEN =07D9 7318 07F3 JNC OK2 =07DB E86E1F 274C CALL ILCOMP =07DE 3800 DB '8',0 =07E0 B0C0 MOV AL,REIGHT =07E2 B560 MOV CH,TEIGHT =07E4 730D 07F3 JNC OK2 =07E6 E8631F 274C CALL ILCOMP =07E9 2000 DB ' ',0 =07EB 730F 07FC JNC AGAIN3 =07ED E8BA01 09AA CALL WRONG =07F0 E9BAFF 07AD JMP AGAIN2 = ; =07F3 2EA2CF09 OK2: MOV RWDLEN,AL =07F7 2E882ED009 MOV TWDLEN,CH = ; =07FC BAD309 AGAIN3: MOV DX,OFFSET BAUDBUF ;point to input buffer for ILCOMP CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 14 =07FF E8131E 2615 CALL ILPRT =0802 0D0A DB CR,LF =0804 53746F702042 DB 'Stop Bits (1, 2): ',0 697473202831 2C2032293A20 00 =0817 E81D1E 2637 CALL INBUFF =081A BAD509 MOV DX,OFFSET BAUDBUF+2 =081D E82C1F 274C CALL ILCOMP ;compare BAUDBUF+2 with characters below =0820 3100 DB '1',0 =0822 B004 MOV AL,ONE =0824 7316 083C JNC OK3 =0826 E8231F 274C CALL ILCOMP =0829 3200 DB '2',0 =082B B00C MOV AL,TWO =082D 730D 083C JNC OK3 =082F E81A1F 274C CALL ILCOMP =0832 2000 DB ' ',0 =0834 730A 0840 JNC AGAIN4 =0836 E87101 09AA CALL WRONG =0839 E9C0FF 07FC JMP AGAIN3 = ; =083C 2EA2D109 OK3: MOV STPLN,AL = ; =0840 BAD309 AGAIN4: MOV DX,OFFSET BAUDBUF ;point to input buffer for ILCOMP =0843 E8CF1D 2615 CALL ILPRT =0846 0D0A DB CR,LF =0848 506172697479 DB 'Parity (None, Even, Odd): ',0 20284E6F6E65 2C204576656E 2C204F646429 3A2000 =0863 E8D11D 2637 CALL INBUFF =0866 BAD509 MOV DX,OFFSET BAUDBUF+2 =0869 E8E01E 274C CALL ILCOMP ;compare BAUDBUF+2 with characters below =086C 4E4F4E4500 DB 'NONE',0 =0871 B000 MOV AL,NONE =0873 7324 0899 JNC OK4 ;go if got match =0875 E8D41E 274C CALL ILCOMP =0878 4556454E00 DB 'EVEN',0 =087D B003 MOV AL,EVEN =087F 7318 0899 JNC OK4 =0881 E8C81E 274C CALL ILCOMP =0884 4F444400 DB 'ODD',0 =0888 B001 MOV AL,ODD =088A 730D 0899 JNC OK4 =088C E8BD1E 274C CALL ILCOMP =088F 2000 DB ' ',0 =0891 730A 089D JNC GOSET =0893 E81401 09AA CALL WRONG =0896 E9A7FF 0840 JMP AGAIN4 ;try again = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 15 =0899 2EA2D209 OK4: MOV PARIT,AL = ; =089D B001 GOSET: MOV AL,RENABL =089F 2E0A06CF09 OR AL,RWDLEN =08A4 2EA27606 MOV CS: BYTE PTR .PARM1,AL =08A8 B08A MOV AL,ONINS =08AA 2E0A06D009 OR AL,TWDLEN =08AF 2EA28606 MOV CS: BYTE PTR .PARM3,AL =08B3 2EA0D209 MOV AL,PARIT =08B7 2E0A06D109 OR AL,STPLN =08BC 0C40 OR AL,CLK16 =08BE 2EA27E06 MOV CS: BYTE PTR .PARM2,AL =08C2 E8501D 2615 CALL ILPRT =08C5 0D0A DB CR,LF =08C7 4E6577207365 DB 'New settings -',CR,LF,0 7474696E6773 202D0D0A00 =08D8 E89013 1C6B CALL SETTIM2 =08DB E80400 08E2 CALL GIVEPRM =08DE 5B POP BX =08DF E973FD 0655 JMP INITMOD ;reset Z80 SIO = ; = GIVEPRM: =08E2 E8A600 098B CALL GETPRM =08E5 E82D1D 2615 CALL ILPRT =08E8 576F7264206C DB 'Word length is ',0 656E67746820 69732000 =08F8 2EA0CF09 MOV AL,RWDLEN =08FC 3C40 CMP AL,RSEVEN =08FE 750C 090C JNZ NOTSEV =0900 E8121D 2615 CALL ILPRT =0903 736576656E00 DB 'seven',0 =0909 E90900 0915 JMP GIVEST =090C E8061D 2615 NOTSEV: CALL ILPRT =090F 656967687400 DB 'eight',0 =0915 E8FD1C 2615 GIVEST: CALL ILPRT =0918 2C206E756D62 DB ', number of stop bits is ',0 6572206F6620 73746F702062 697473206973 2000 =0932 2EA0D109 MOV AL,STPLN =0936 3C04 CMP AL,ONE =0938 750A 0944 JNZ NOTONE =093A E8D81C 2615 CALL ILPRT =093D 6F6E6500 DB 'one',0 =0941 E90700 094B JMP GIVEPA =0944 E8CE1C 2615 NOTONE: CALL ILPRT =0947 74776F00 DB 'two',0 =094B E8C71C 2615 GIVEPA: CALL ILPRT =094E 2C2070617269 DB ', parity is ',0 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 16 747920697320 00 =095B 2EA0D209 MOV AL,PARIT =095F 3C00 CMP AL,NONE =0961 750B 096E JNZ NOTNON =0963 E8AF1C 2615 CALL ILPRT =0966 6E6F6E650D0A DB 'none',CR,LF,0 00 =096D C3 RET =096E 2EA0D209 NOTNON: MOV AL,PARIT =0972 3C01 CMP AL,ODD =0974 750A 0980 JNZ NOTODD =0976 E89C1C 2615 CALL ILPRT =0979 6F64640D0A00 DB 'odd',CR,LF,0 =097F C3 RET =0980 E8921C 2615 NOTODD: CALL ILPRT =0983 6576656E0D0A DB 'even',CR,LF,0 00 =098A C3 RET = ; =098B 2EA07606 GETPRM: MOV AL,CS: BYTE PTR .PARM1 ;get present word length =098F 24C0 AND AL,MSKWD =0991 2EA2CF09 MOV RWDLEN,AL =0995 2EA07E06 MOV AL,CS: BYTE PTR .PARM2 ;get stop bits and parity =0999 8AE8 MOV CH,AL =099B 240C AND AL,MSKST =099D 2EA2D109 MOV STPLN,AL =09A1 8AC5 MOV AL,CH =09A3 2403 AND AL,MSKPA =09A5 2EA2D209 MOV PARIT,AL =09A9 C3 RET = ; =09AA E8681C 2615 WRONG: CALL ILPRT ;all matches failed - tell operator =09AD 2B2B20496E63 DB '++ Incorrect entry ++',CR,LF,BELL,0 6F7272656374 20656E747279 202B2B0D0A07 00 =09C6 C3 RET = ; = ;Table of baud rate parameters =09C7 66 BD300 DB 066H =09C8 00 BD450 DB 000H ;not used =09C9 77 BD600 DB 077H =09CA 00 BD710 DB 000H ;not used =09CB 88 BD1200 DB 088H =09CC BB BD2400 DB 0BBH =09CD DD BD4800 DB 0DDH =09CE EE BD9600 DB 0EEH =09CF C0 RWDLEN DB REIGHT =09D0 60 TWDLEN DB TEIGHT =09D1 04 STPLN DB ONE CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 17 =09D2 00 PARIT DB NONE = ; = BAUDBUF: =09D3 0A00 DB 10,0 =09D5 RB 10 = ; = ; = ;For MODEMs which disconnect from the telephone line when data terminal = ;ready (DTR) drops, the following routine will disconnect. = ; = 0000 HANGUP EQU 0 ;HANG UP THE TELEPHONE = ; =09DF B00C DISCR: MOV AL,DECDTR =09E1 E602 OUT MODDTRP,AL =09E3 C3 RET = ; = ; = ;The following routine will give the carrier detect status when the = ;Present version is used with a modem whose clear-to-send line follows = ;carrier detect. Change CTS to RLSD if your modem connection presents = ;the CXR line to the SIO. = ; = 0010 RSTEXS EQU 10H ;select register 0, reset external status = 0020 CTS EQU 20H ;CLEAR TO SEND = 0010 RLSD EQU 10H ;RECEIVED LINE SIGNAL (CARRIER) DETECT = ; =09E4 2EA01A01 DETCAR: MOV AL,CARDETFLG =09E8 0AC0 OR AL,AL =09EA 7427 0A13 JZ DETCARRET ;RETURN IF FALSE =09EC E8261C 2615 CALL ILPRT =09EF 436172726965 DB 'Carrier ',0 722000 =09F8 E402 IN AL,MODDTRP =09FA 2410 AND AL,RLSD =09FC 7408 0A06 JZ DETCAR1 =09FE E8141C 2615 CALL ILPRT =0A01 6E6F742000 DB 'not ',0 = DETCAR1: =0A06 E80C1C 2615 CALL ILPRT =0A09 70726573656E DB 'present',CR,LF,0 740D0A00 = DETCARRET: =0A13 C3 RET = ; = = include a:main.a86 = ; = ; MAIN.ASM = ; = ;Main line routines for MODEM9.xx. = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 18 =0A14 FC START: CLD =0A15 E87900 0A91 CALL INITADR ;INITIALIZE ADDRESSES =0A18 E80DF7 0128 CALL VERNUM ;GIVE CONFIGURATION MESSAGE =0A1B E85D0F 197B CALL GETUSR ;GET USER =0A1E 2EA25642 MOV SAVUSR,AL ;SAVE FOR EXIT =0A22 2EC6069541FF MOV NFILFLG,TRUE =0A28 2EC606BE4100 MOV SAVEFLG,FALSE =0A2E E86300 0A94 CALL PROCOPT ;PROCESS CONTROL OPTIONS = ; = RESTART: =0A31 2EA09641 MOV AL,OPTION ;GET MAIN OPTION =0A35 3C20 CMP AL,' ' ;NO OPTION SPEC'D? =0A37 7455 0A8E JZ MENUJMP ;TRUE, GO MENU =0A39 3C48 CMP AL,'H' ;MENU ASKED FOR? =0A3B 7429 0A66 JZ MENU2JMP ;YES, GO MENU2 =0A3D E815FC 0655 CALL INITMOD =0A40 E8A100 0AE4 CALL MOVEFCB =0A43 E8ADFB 05F3 CALL INMODDATP ;GOBBLE UP GARBAGE.. =0A46 E8AAFB 05F3 CALL INMODDATP ;..CHARACTERS ON LINE =0A49 2EC606C24100 MOV ECHOFLG,0 ; RESET ECHO FLAG =0A4F 2EC606C34100 MOV LOCFLG,0 ; RESET LOCAL FLAG =0A55 2EA09641 MOV AL,OPTION ;PROCESS MAIN OPTION =0A59 3C45 CMP AL,'E' ;ECHO MODE? =0A5B 750C 0A69 JNZ NOECH ;JUMP IF NOT =0A5D 2EC606C241FF MOV ECHOFLG,TRUE ;SET ECHO TO TRUE =0A63 E90F1D 2775 JMP DSKSAVE = ; = MENU2JMP: =0A66 E94D02 0CB6 JMP MENU2 = ; =0A69 3C4C NOECH: CMP AL,'L' ;LOCAL ECHO MODE =0A6B 7509 0A76 JNZ NOLOC =0A6D B0FF MOV AL,TRUE =0A6F 2EA2C341 MOV LOCFLG,AL =0A73 E9FF1C 2775 JMP DSKSAVE =0A76 3C54 NOLOC: CMP AL,'T' ;TERMINAL MODE? =0A78 7503 0A7D JNZ L@100 =0A7A E9F81C 2775 JMP DSKSAVE ;YES = L@100: =0A7D 3C53 CMP AL,'S' ;SEND A FILE? =0A7F 7503 0A84 JNZ L@101 =0A81 E9F524 2F79 JMP SENDFIL ;YES = L@101: =0A84 3C52 CMP AL,'R' ;RECEIVE A FILE? =0A86 7503 0A8B JNZ L@102 =0A88 E99C25 3027 JMP RCVFIL ;YES = L@102: =0A8B E8FC0D 188A CALL NOTVLDMSG ;SAY NOT A VALID OPTION = MENUJMP: =0A8E E90002 0C91 JMP MENU ;NO VALID OPTION SPEC'D, GO MENU = ; = INITADR: CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 19 =0A91 E9C1FB 0655 JMP INITMOD ;RETURN DONE FROM THIS ROUTINE.. = ; = ; CHECK OPTIONS, PUT 0 IN APPROPRIATE PLACES IN OPTION TABLE = ; IF OPTION SELECTED = ; = PROCOPT: =0A94 BA5D00 MOV DX,OFFSET FCB+1 =0A97 87DA XCHG BX,DX =0A99 8A07 MOV AL,BYTE PTR [BX] =0A9B 87DA XCHG BX,DX =0A9D 2EA29641 MOV OPTION,AL =0AA1 42 OPTLP: INC DX =0AA2 87DA XCHG BX,DX =0AA4 8A07 MOV AL,BYTE PTR [BX] =0AA6 87DA XCHG BX,DX =0AA8 3C20 CMP AL,' ' =0AAA 742B 0AD7 JZ ENDOPT =0AAC BB9741 MOV BX,OFFSET OPTBL =0AAF B507 MOV CH,OFFSET OPTBE- OFFSET OPTBL =0AB1 3A07 OPTCK: CMP AL,BYTE PTR [BX] =0AB3 7516 0ACB JNZ OPTNO =0AB5 3C42 CMP AL,'B' =0AB7 750C 0AC5 JNZ OPTCK1 =0AB9 2EA09641 MOV AL,OPTION =0ABD 3C53 CMP AL,'S' =0ABF 7404 0AC5 JZ OPTCK1 =0AC1 3C52 CMP AL,'R' =0AC3 750B 0AD0 JNZ OPTNO1 =0AC5 C60700 OPTCK1: MOV BYTE PTR [BX],0 =0AC8 E9D6FF 0AA1 JMP OPTLP = ; =0ACB 43 OPTNO: INC BX =0ACC FECD DEC CH =0ACE 75E1 0AB1 JNZ OPTCK =0AD0 E8B70D 188A OPTNO1: CALL NOTVLDMSG =0AD3 58 POP AX ;PRESERVE STACK =0AD4 E9BA01 0C91 JMP MENU = ; =0AD7 2EA09A41 ENDOPT: MOV AL,VSEEFLG =0ADB 0AC0 OR AL,AL =0ADD 7504 0AE3 JNZ ENDOPTRT =0ADF 2EA29741 MOV QFLG,AL ;IF VIEWING SUPPRESS ALL ELSE = ENDOPTRT: =0AE3 C3 RET = ; = MOVEFCB: =0AE4 BB6C00 MOV BX,OFFSET FCB+16 =0AE7 BA5C00 MOV DX,OFFSET FCB =0AEA B510 MOV CH,16 =0AEC E8F400 0BE3 CALL MOVE =0AEF C6067C0000 MOV BYTE PTR .FCBSNO,0 =0AF4 C606680000 MOV BYTE PTR .FCBEXT,0 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 20 =0AF9 C3 RET = ; = ; =0AFA B109 PRTMSG: MOV CL,PRINT =0AFC CDE0 INT 224 =0AFE C3 RET = ; =0AFF 2E8A165642 EXIT: MOV DL,SAVUSR =0B04 E8760E 197D CALL SETUSR =0B07 BA8000 MOV DX,OFFSET 80H =0B0A B11A MOV CL,STDMA =0B0C CDE0 INT 224 =0B0E E85C24 2F6D CALL CKMODM ;CATCH ANY GARBAGE CHARACTERS =0B11 2EF6060C01FF TEST SAVCCP,0FFH =0B17 7400 0B19 JZ COLDBOOT = ; RET = COLDBOOT: =0B19 B200 MOV DL,0 =0B1B B100 MOV CL,0 =0B1D CDE0 INT 224 = ; = ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH = ; =0B1F BAD241 SETFCB: MOV DX,OFFSET CMDBUF =0B22 BB5C00 MOV BX,OFFSET FCB =0B25 E8151B 263D CALL CPMLINE =0B28 E869FF 0A94 CALL PROCOPT = CHECKNM: =0B2B A05D00 MOV AL,BYTE PTR .FCB+1 ;CHECK ON THE PRIMARY OPTION =0B2E 3C45 CMP AL,'E' ;RETURN IF ECHO OPTION =0B30 7422 0B54 JZ CHECKNMRT =0B32 3C48 CMP AL,'H' ;RETURN IF HELP OPTION =0B34 741E 0B54 JZ CHECKNMRT =0B36 3C4C CMP AL,'L' ;RETURN IF LOCAL ECHO OPTION =0B38 741A 0B54 JZ CHECKNMRT =0B3A 3C54 CMP AL,'T' =0B3C 7503 0B41 JNZ L@103 =0B3E E97200 0BB3 JMP TERMSEL = L@103: =0B41 3C53 CMP AL,'S' =0B43 7503 0B48 JNZ L@104 =0B45 E92800 0B70 JMP CKFILE = L@104: =0B48 3C52 CMP AL,'R' =0B4A 7509 0B55 JNZ BDOPT =0B4C 2EA09D41 MOV AL,BATCHFLG ;IF MULT FILE MODE, THEN.. =0B50 0AC0 OR AL,AL ;..RECV OPT DOES NOT NEED.. =0B52 751C 0B70 JNZ CKFILE = CHECKNMRT: =0B54 C3 RET = ; =0B55 E8BD1A 2615 BDOPT: CALL ILPRT CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 21 =0B58 0D0A2B2B2042 DB CR,LF,'++ Bad Option ++',CR,LF,0 6164204F7074 696F6E202B2B 0D0A00 =0B6D E90700 0B77 JMP REENT =0B70 A06D00 CKFILE: MOV AL,BYTE PTR .FCB+17 ;IF OPTION THAT NEEDS FILE NAME,.. =0B73 3C20 CMP AL,' ' ;..THEN CHECK TO SEE IF NAME.. =0B75 75DD 0B54 JNZ CHECKNMRT ;...EXISTS. IF NOT.. =0B77 E89B1A 2615 REENT: CALL ILPRT ;..DO EVERYTHING OVER. =0B7A 0D0A52652D65 DB CR,LF,'Re-enter PRIMARY option and file name only: ',BELL,0 6E7465722050 52494D415259 206F7074696F 6E20616E6420 66696C65206E 616D65206F6E 6C793A200700 =0BAA BAD241 MOV DX,OFFSET CMDBUF =0BAD E8871A 2637 CALL INBUFF =0BB0 E96CFF 0B1F JMP SETFCB = ; = TERMSEL: =0BB3 803E6D0020 CMP BYTE PTR .FCB+17,' ' =0BB8 750D 0BC7 JNZ SAVAGN =0BBA 2EC606BE4100 MOV SAVEFLG,FALSE =0BC0 2EC6069541FF MOV NFILFLG,TRUE =0BC6 C3 RET = ; = SAVAGN: =0BC7 2EC606954100 MOV NFILFLG,FALSE =0BCD C3 RET = ; = ; = ;ADJUSTS LOOP COUNTERS FOR VARIOUS CLOCK SPEEDS = ; =0BCE 2EA01B01 FIXCNT: MOV AL,CLOCK =0BD2 3C01 CMP AL,1 =0BD4 740A 0BE0 JZ FIXCNTRT =0BD6 52 PUSH DX =0BD7 53 PUSH BX =0BD8 5A POP DX =0BD9 03DA CNTMUL: ADD BX,DX =0BDB FEC8 DEC AL =0BDD 75FA 0BD9 JNZ CNTMUL =0BDF 5A POP DX = FIXCNTRT: =0BE0 C3 RET = ; = MOVE128: =0BE1 B580 MOV CH,128 =0BE3 8BF3 MOVE: MOV SI,BX =0BE5 1E PUSH DS CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 22 =0BE6 07 POP ES =0BE7 8BFA MOV DI,DX = MOVE001: =0BE9 A4 MOVS BYTE PTR [DI], BYTE PTR [SI] =0BEA FECD DEC CH =0BEC 75FB 0BE9 JNZ MOVE001 =0BEE 8BDE MOV BX,SI =0BF0 8BD7 MOV DX,DI =0BF2 C3 RET = ; = MENU0: =0BF3 2EF6069541FF TEST NFILFLG,0FFH =0BF9 7403E99300 0BFE JZ $+5 ! JMP MENU ;GO IF NO FILE ACTIVE =0BFE E8141A 2615 CALL ILPRT ;ELSE PRINT MESSAGE =0C01 0D0A0A DB CR,LF,LF =0C04 2A2A20546865 DB '** There may be text in the memory buffer **',CR,LF 7265206D6179 206265207465 787420696E20 746865206D65 6D6F72792062 756666657220 2A2A0D0A =0C32 2A2A20497420 DB '** It will be lost unless NOL or WRT commands are used **' 77696C6C2062 65206C6F7374 20756E6C6573 73204E4F4C20 6F7220575254 20636F6D6D61 6E6473206172 652075736564 202A2A =0C6B 0D0A0700 DB CR,LF,BELL,0 =0C6F B502 MOV CH,2 ;2 MORE BELLS =0C71 2EA01F01 BLOOP: MOV AL,BELRPT ;GET TIME =0C75 8AC8 MOV CL,AL =0C77 BBE803 BCLOOP: MOV BX, 1000 ;ABOUT 0.03 SECONDS =0C7A E851FF 0BCE CALL FIXCNT =0C7D 8AC3 BILOOP: MOV AL,BL =0C7F 0AC7 OR AL,BH =0C81 4B DEC BX =0C82 75F9 0C7D JNZ BILOOP =0C84 FEC9 DEC CL =0C86 75EF 0C77 JNZ BCLOOP =0C88 B007 MOV AL,BELL =0C8A E8C618 2553 CALL TIPE =0C8D FECD DEC CH =0C8F 75E0 0C71 JNZ BLOOP = ; =0C91 BBA541 MENU: MOV BX,OFFSET RESTSN ;RESTORE SECTOR NUMBERS.. =0C94 BAB141 MOV DX,OFFSET SECTNOB ;..FOR NEW FILE TRANSFER. CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 23 =0C97 B50C MOV CH,OFFSET SECTNOE- OFFSET SECTNOB =0C99 E847FF 0BE3 CALL MOVE =0C9C BB9E41 MOV BX,OFFSET RESTROPT ;RESTORE OPTION TABLE =0C9F BA9741 MOV DX,OFFSET OPTBL =0CA2 B507 MOV CH,OFFSET OPTBE- OFFSET OPTBL =0CA4 E83CFF 0BE3 CALL MOVE =0CA7 B000 MOV AL,0 =0CA9 2EA2C941 MOV MFFLG1,AL ;RESET MFACCESS ROUTINE.. =0CAD F6D0 NOT AL ;..AND MULTI TRANS IN CASE.. =0CAF 2EA2C741 MOV FSTFLG,AL ;..OF ABORT. =0CB3 E90C0A 16C2 JMP XPRT = ; =0CB6 E80B15 21C4 MENU2: CALL CLRTST =0CB9 E85919 2615 CALL ILPRT =0CBC 202020202020 DB ' Single Letter Commands',CR,LF,LF 202020202020 20202053696E 676C65204C65 747465722043 6F6D6D616E64 730D0A0A =0CE4 204820202D20 DB ' H - Display this information',CR,LF 446973706C61 792074686973 20696E666F72 6D6174696F6E 0D0A =0D04 203F20202D20 DB ' ? - Display current settings',CR,LF,LF 446973706C61 792063757272 656E74207365 7474696E6773 0D0A0A =0D25 205420202D20 DB ' T - Terminal mode',CR,LF 5465726D696E 616C206D6F64 650D0A =0D3A 204520202D20 DB ' E - Terminal mode with echo',CR,LF 5465726D696E 616C206D6F64 652077697468 206563686F0D 0A =0D59 204C20202D20 DB ' L - Terminal mode with local echo',CR,LF 5465726D696E 616C206D6F64 652077697468 206C6F63616C 206563686F0D 0A =0D7E 202020202046 DB ' For capturing text use T(or E or L) FILENAME.TYP and' 6F7220636170 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 24 747572696E67 207465787420 757365205428 6F722045206F 72204C292046 494C454E414D 452E54595020 616E64 =0DB7 0D0A DB CR,LF =0DB9 202020202053 DB ' Start & Stop toggles described on subsequent screen.' 746172742026 2053746F7020 746F67676C65 732064657363 726962656420 6F6E20737562 73657175656E 742073637265 656E2E =0DF2 0D0A0A DB CR,LF,LF =0DF5 205220202D20 DB ' R - Receive CP/M file using Christensen Protocol',CR,LF 526563656976 652043502F4D 2066696C6520 7573696E6720 436872697374 656E73656E20 50726F746F63 6F6C0D0A =0E29 205320202D20 DB ' S - Send CP/M file using Christensen Protocol',CR,LF 53656E642043 502F4D206669 6C6520757369 6E6720436872 697374656E73 656E2050726F 746F636F6C0D 0A =0E5A 202020202043 DB ' Command is: R(or S) FILENAME.TYP',CR,LF 6F6D6D616E64 2069733A2052 286F72205329 2046494C454E 414D452E5459 500D0A =0E81 202020202052 DB ' R and S can use the following subcommands:',CR,LF 20616E642053 2063616E2075 736520746865 20666F6C6C6F 77696E672073 7562636F6D6D CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 25 616E64733A0D 0A =0EB2 202020202020 DB ' B - Bulk transfer using wildcards (e.g. *.*)',CR,LF 202020204220 202D2042756C 6B207472616E 736665722075 73696E672077 696C64636172 64732028652E 672E202A2E2A 290D0A =0EEB 202020202020 DB ' Q - Quiet mode (no messages to console)',CR,LF 202020205120 202D20517569 6574206D6F64 6520286E6F20 6D6573736167 657320746F20 636F6E736F6C 65290D0A =0F1F 202020202020 DB ' T - Return to terminal mode after transfer',CR,LF 202020205420 202D20526574 75726E20746F 207465726D69 6E616C206D6F 646520616674 657220747261 6E736665720D 0A =0F56 202020202020 DB ' V - View bytes transferred on console',CR,LF,LF 202020205620 202D20566965 772062797465 73207472616E 736665727265 64206F6E2063 6F6E736F6C65 0D0A0A =0F89 546865207369 DB 'The single letter commands may also be used on the',CR,LF 6E676C65206C 657474657220 636F6D6D616E 6473206D6179 20616C736F20 626520757365 64206F6E2074 68650D0A =0FBD 636F6D6D616E DB 'command line when the program is initially executed.' 64206C696E65 207768656E20 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 26 746865207072 6F6772616D20 697320696E69 7469616C6C79 206578656375 7465642E =0FF1 0D0A0A00 DB CR,LF,LF,0 = ; =0FF5 E8A511 219D CALL NXTSCRN = ; =0FF8 E81A16 2615 CALL ILPRT =0FFB 202020202020 DB ' Three Letter Commands',CR,LF,LF 202020202020 202020546872 6565204C6574 74657220436F 6D6D616E6473 0D0A0A =1022 43504D202D20 DB 'CPM - Exit from this program to CP/M',CR,LF 457869742066 726F6D207468 69732070726F 6772616D2074 6F2043502F4D 0D0A =1048 444952202D20 DB 'DIR - List directory and space free (may specify drive)' 4C6973742064 69726563746F 727920616E64 207370616365 206672656520 286D61792073 706563696679 206472697665 29 =107F 0D0A DB CR,LF =1081 455241202D20 DB 'ERA - Erase file (may specify drive)',CR,LF 457261736520 66696C652028 6D6179207370 656369667920 647269766529 0D0A =10A7 4C4F47202D20 DB 'LOG - Change default drive/user (specify drive/user)' 4368616E6765 206465666175 6C7420647269 76652F757365 722028737065 636966792064 726976652F75 73657229 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 27 =10DB 0D0A DB CR,LF =10DD 202020202020 DB ' and reset disks. e.g. LOG A0, LOG B (user unchanged)' 616E64207265 736574206469 736B732E2020 652E672E204C 4F472041302C 204C4F472042 202875736572 20756E636861 6E67656429 =1118 0D0A DB CR,LF =111A 464F50202D20 DB 'FOP - Display commands for setting terminal mode file',CR,LF 446973706C61 7920636F6D6D 616E64732066 6F7220736574 74696E672074 65726D696E61 6C206D6F6465 2066696C650D 0A =1151 202020202020 DB ' output parameters',CR,LF,0 6F7574707574 20706172616D 65746572730D 0A00 = ; =116B 2EF6061901FF TEST DISCFLG,0FFH =1171 7438 11AB JZ NODISC =1173 E89F14 2615 CALL ILPRT =1176 445343202D20 DB 'DSC - Disconnect the modem from the telephone line',CR,LF,0 446973636F6E 6E6563742074 6865206D6F64 656D2066726F 6D2074686520 74656C657068 6F6E65206C69 6E650D0A00 = ; =11AB 2EF6061601FF NODISC: TEST SETUPTST,0FFH =11B1 752B 11DE JNZ NOTIME =11B3 E85F14 2615 CALL ILPRT =11B6 54494D202D20 DB 'TIM - Set S mode time-to-send message',CR,LF,0 536574205320 6D6F64652074 696D652D746F 2D73656E6420 6D6573736167 650D0A00 = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 28 = NOTIME: =11DE 2EA00501 MOV AL,TOGGLECRC =11E2 0AC0 OR AL,AL =11E4 742F 1215 JZ NOTOGCRC =11E6 E82C14 2615 CALL ILPRT =11E9 544343202D20 DB 'TCC - Toggle Checksum/CRC mode on receive',CR,LF,0 546F67676C65 20436865636B 73756D2F4352 43206D6F6465 206F6E207265 63656976650D 0A00 = ; = NOTOGCRC: =1215 2EF6060701FF TEST TOGGLEBK,0FFH =121B 742E 124B JZ NOTOGBK =121D E8F513 2615 CALL ILPRT =1220 544252202D20 DB 'TBR - Toggle backspace to rub conversion',CR,LF,0 546F67676C65 206261636B73 706163652074 6F2072756220 636F6E766572 73696F6E0D0A 00 = ; = NOTOGBK: =124B 2EF6060E01FF TEST TOGGLELOC,0FFH =1251 745D 12B0 JZ NOTOGLOC =1253 E8BF13 2615 CALL ILPRT =1256 544C43202D20 DB 'TLC - Toggle 1) local command immediate',CR,LF 546F67676C65 20203129206C 6F63616C2063 6F6D6D616E64 20696D6D6564 696174650D0A =1280 202020202020 DB ' 2) local command after ',0 202020202020 20203229206C 6F63616C2063 6F6D6D616E64 206166746572 2000 =12A6 2EA02701 MOV AL,EXTCHR =12AA E85813 2605 CALL SHFTYPE =12AD 0D0A00 DB CR,LF,0 = ; = NOTOGLOC: =12B0 2EA00901 MOV AL,TOGGLELF =12B4 0AC0 OR AL,AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 29 =12B6 7436 12EE JZ NOTOGLF =12B8 E85A13 2615 CALL ILPRT =12BB 544C46202D20 DB 'TLF - Toggle send linefeed after carriage return',CR,LF,0 546F67676C65 2073656E6420 6C696E656665 656420616674 657220636172 726961676520 72657475726E 0D0A00 = ; = NOTOGLF: =12EE E82413 2615 CALL ILPRT =12F1 4E554D202D20 DB 'NUM - List remote systems',CR,LF,0 4C6973742072 656D6F746520 73797374656D 730D0A00 =130D 2EA01601 MOV AL,SETUPTST =1311 0AC0 OR AL,AL =1313 7423 1338 JZ NOSETUP =1315 E8FD12 2615 CALL ILPRT =1318 534554202D20 DB 'SET - Set communication ports',CR,LF,0 53657420636F 6D6D756E6963 6174696F6E20 706F7274730D 0A00 = ; = NOSETUP: =1338 B00A MOV AL,LF =133A E81612 2553 CALL TIPE =133D E8D512 2615 CALL ILPRT =1340 202020205468 DB ' The following are terminal text buffer commands:' 6520666F6C6C 6F77696E6720 617265207465 726D696E616C 207465787420 627566666572 20636F6D6D61 6E64733A =1374 0D0A00 DB CR,LF,0 =1377 E89B12 2615 CALL ILPRT =137A 44454C202D20 DB 'DEL - Delete memory buffer and file',CR,LF 44656C657465 206D656D6F72 792062756666 657220616E64 2066696C650D 0A CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 30 =139F 4E4F4C202D20 DB 'NOL - Return to terminal mode - no loss of data in buffer' 52657475726E 20746F207465 726D696E616C 206D6F646520 2D206E6F206C 6F7373206F66 206461746120 696E20627566 666572 =13D8 0D0A DB CR,LF =13DA 575254202D20 DB 'WRT - Write memory buffer to disk file',CR,LF,LF,0 577269746520 6D656D6F7279 206275666665 7220746F2064 69736B206669 6C650D0A0A00 =1404 E8960D 219D CALL NXTSCRN = ; =1407 E80B12 2615 CALL ILPRT =140A 202020202020 DB ' Local Commands while in Terminal Mode',CR,LF,LF,0 4C6F63616C20 436F6D6D616E 647320776869 6C6520696E20 5465726D696E 616C204D6F64 650D0A0A00 =1439 2EA02101 MOV AL,EXITCHR =143D E8C511 2605 CALL SHFTYPE =1440 20202D204578 DB ' - Exit to command mode',CR,LF,LF,0 697420746F20 636F6D6D616E 64206D6F6465 0D0A0A00 =145C 2EA01801 MOV AL,TRANLOGON =1460 0AC0 OR AL,AL =1462 7475 14D9 JZ NOTRANLOG =1464 2EA02201 MOV AL,LOGCHR =1468 E89A11 2605 CALL SHFTYPE =146B 20202D205472 DB ' - Transmit string',CR,LF 616E736D6974 20737472696E 670D0A =1480 20202020204D DB ' Must be followed by number of string (0-9)',CR,LF 757374206265 20666F6C6C6F 776564206279 206E756D6265 72206F662073 7472696E6720 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 31 28302D39290D 0A =14B1 20202020206F DB ' or L to display list of strings',CR,LF,LF,0 72204C20746F 20646973706C 6179206C6973 74206F662073 7472696E6773 0D0A0A00 = ; = NOTRANLOG: =14D9 2EF6060F01FF TEST LSTTST,0FFH =14DF 741C 14FD JZ NOLST2 =14E1 2EA02301 MOV AL,LSTCHR =14E5 E81D11 2605 CALL SHFTYPE =14E8 20202D20546F DB ' - Toggle printer',CR,LF,0 67676C652070 72696E746572 0D0A00 = ; = NOLST2: =14FD B00A MOV AL,LF =14FF E85110 2553 CALL TIPE =1502 2EA02601 MOV AL,SAVECHR =1506 E8FC10 2605 CALL SHFTYPE =1509 20202D205374 DB ' - Start copy into buffer',CR,LF,0 61727420636F 707920696E74 6F2062756666 65720D0A00 =1526 2EA02401 MOV AL,UNSAVECHR =152A E8D810 2605 CALL SHFTYPE =152D 20202D205374 DB ' - Stop copy into buffer',CR,LF 6F7020636F70 7920696E746F 206275666665 720D0A =1548 202020202053 DB ' Start & Stop may be toggled as often as desired.',CR,LF 746172742026 2053746F7020 6D6179206265 20746F67676C 656420617320 6F6674656E20 617320646573 697265642E0D 0A =157F 202020202041 DB ' A ":" at start of line indicates buffer is open.',CR,LF 20223A222061 742073746172 74206F66206C 696E6520696E CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 32 646963617465 732062756666 657220697320 6F70656E2E0D 0A =15B6 202020202058 DB ' XOFF automatically used to stop input when writing',CR,LF 4F4646206175 746F6D617469 63616C6C7920 757365642074 6F2073746F70 20696E707574 207768656E20 77726974696E 670D0A =15EF 202020202066 DB ' full buffer to disk, XON sent to resume.',CR,LF,LF,0 756C6C206275 666665722074 6F206469736B 2C20584F4E20 73656E742074 6F2072657375 6D652E0D0A0A 00 =1620 2EA02501 MOV AL,TRANCHR =1624 E8DE0F 2605 CALL SHFTYPE =1627 20202D205472 DB ' - Transfer ASCII file to remote',CR,LF,LF,0 616E73666572 204153434949 2066696C6520 746F2072656D 6F74650D0A0A 00 =164C 2EA00D01 MOV AL,LOCONEXTCHR =1650 0AC0 OR AL,AL =1652 2EA02701 MOV AL,EXTCHR =1656 7533 168B JNZ REMDFLT =1658 E8AA0F 2605 CALL SHFTYPE =165B 20202D205365 DB ' - Send local control character to remote',CR,LF,0 6E64206C6F63 616C20636F6E 74726F6C2063 686172616374 657220746F20 72656D6F7465 0D0A00 =1688 E93700 16C2 JMP XPRT = REMDFLT: =168B E8770F 2605 CALL SHFTYPE =168E 20202D204E65 DB ' - Next character will be used for local control',CR,LF,0 787420636861 726163746572 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 33 2077696C6C20 626520757365 6420666F7220 6C6F63616C20 636F6E74726F 6C0D0A00 = ; = XPRT: =16C2 E8500F 2615 CALL ILPRT =16C5 0D0A44726976 DB CR,LF,'Drive ',0 652000 =16CE B119 MOV CL,CURDSK ;CURRENT DISK FUNCTION =16D0 CDE0 INT 224 =16D2 0441 ADD AL,'A' ;MAKE ASCII =16D4 E87C0E 2553 CALL TIPE = ; =16D7 E8A102 197B CALL GETUSR ;GET CURRENT USER NUMBER =16DA 3C00 CMP AL,0 =16DC 7414 16F2 JZ SR3B ;SKIP IF USER 0 =16DE 50 PUSH AX =16DF E8330F 2615 CALL ILPRT =16E2 2C2055736572 DB ', User ',0 2000 =16EA 58 POP AX =16EB B700 MOV BH,0 =16ED 8AD8 MOV BL,AL =16EF E8BF0E 25B1 CALL DECOUT ;REPORT USER = ; =16F2 E8510E 2546 SR3B: CALL CRLF =16F5 2EF6069541FF TEST NFILFLG,0FFH =16FB 751E 171B JNZ NOBUFMSG =16FD E8B90B 22B9 CALL GETSPC =1700 E8120F 2615 CALL ILPRT =1703 206279746573 DB ' bytes of buffer free',CR,LF,0 206F66206275 666665722066 7265650D0A00 = NOBUFMSG: =171B E8F70E 2615 CALL ILPRT =171E 434F4D4D414E DB 'COMMAND (H for Help): ',0 442028482066 6F722048656C 70293A2000 = GETCMD: =1735 BAD241 MOV DX,OFFSET CMDBUF ;ENTER COMMAND =1738 E8FC0E 2637 CALL INBUFF =173B E8080E 2546 CALL CRLF =173E BAD441 MOV DX,OFFSET CMDBUF+2 ;POINT TO COMMAND =1741 E80810 274C CALL ILCOMP =1744 43504D00 DB 'CPM',0 =1748 7203 174D JC L@105 =174A E9B2F3 0AFF JMP EXIT CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 34 = L@105: =174D E8FC0F 274C CALL ILCOMP =1750 4C4F4700 DB 'LOG',0 =1754 7203 1759 JC L@106 =1756 E96501 18BE JMP LOGNEW = L@106: =1759 E8F00F 274C CALL ILCOMP =175C 44495200 DB 'DIR',0 =1760 7203 1765 JC L@107 =1762 E94201 18A7 JMP DIR = L@107: =1765 E8E40F 274C CALL ILCOMP =1768 45524100 DB 'ERA',0 =176C 7203 1771 JC L@108 =176E E97002 19E1 JMP ERASEF = L@108: =1771 E8D80F 274C CALL ILCOMP =1774 44534300 DB 'DSC',0 =1778 7203 177D JC L@109 =177A E9BE02 1A3B JMP DISC = L@109: =177D E8CC0F 274C CALL ILCOMP =1780 3F00 DB '?',0 =1782 7203 1787 JC L@110 =1784 E95A0A 21E1 JMP CURPAR = L@110: =1787 E8C20F 274C CALL ILCOMP =178A 53504400 DB 'SPD',0 =178E 7203 1793 JC L@111 =1790 E9D202 1A65 JMP SETSPD = L@111: =1793 E8B60F 274C CALL ILCOMP =1796 464F5000 DB 'FOP',0 =179A 7203 179F JC L@112 =179C E9360B 22D5 JMP TFOMENU = L@112: =179F E8AA0F 274C CALL ILCOMP =17A2 54494D00 DB 'TIM',0 =17A6 7203 17AB JC L@113 =17A8 E90104 1BAC JMP SETTIM = L@113: =17AB E89E0F 274C CALL ILCOMP =17AE 54434300 DB 'TCC',0 =17B2 7203 17B7 JC L@114 =17B4 E95305 1D0A JMP TOGCRC = L@114: =17B7 E8920F 274C CALL ILCOMP =17BA 54425200 DB 'TBR',0 =17BE 7203 17C3 JC L@115 =17C0 E99105 1D54 JMP TOGBKSP = L@115: =17C3 E8860F 274C CALL ILCOMP CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 35 =17C6 544C4300 DB 'TLC',0 =17CA 7203 17CF JC L@116 =17CC E9DC05 1DAB JMP TOGLOC = L@116: =17CF E87A0F 274C CALL ILCOMP =17D2 544C4600 DB 'TLF',0 =17D6 7203 17DB JC L@117 =17D8 E93D06 1E18 JMP TOGLF = L@117: =17DB E86E0F 274C CALL ILCOMP =17DE 54534C00 DB 'TSL',0 =17E2 7203 17E7 JC L@118 =17E4 E97A06 1E61 JMP TOGSTL = L@118: =17E7 E8620F 274C CALL ILCOMP =17EA 54584600 DB 'TXF',0 =17EE 7203 17F3 JC L@119 =17F0 E9D406 1EC7 JMP TOGTXOFF = L@119: =17F3 E8560F 274C CALL ILCOMP =17F6 54584E00 DB 'TXN',0 =17FA 7203 17FF JC L@120 =17FC E91D07 1F1C JMP TOGTXON = L@120: =17FF E84A0F 274C CALL ILCOMP =1802 54574500 DB 'TWE',0 =1806 7203 180B JC L@121 =1808 E96407 1F6F JMP TOGWECH = L@121: =180B E83E0F 274C CALL ILCOMP =180E 54454600 DB 'TEF',0 =1812 7203 1817 JC L@122 =1814 E9000C 2417 JMP TOGTEOF = L@122: =1817 E8320F 274C CALL ILCOMP =181A 4E554D00 DB 'NUM',0 =181E 7203 1823 JC L@123 =1820 E9510C 2474 JMP NUMPRN = L@123: =1823 2EA01601 MOV AL,SETUPTST =1827 0AC0 OR AL,AL =1829 740C 1837 JZ NOSETUP2 =182B E81E0F 274C CALL ILCOMP =182E 53455400 DB 'SET',0 =1832 7203 1837 JC NOSETUP2 =1834 E9BC08 20F3 JMP SETUPENT = NOSETUP2: =1837 E8120F 274C CALL ILCOMP =183A 4E4F4C00 DB 'NOL',0 =183E 7216 1856 JC NXTOPT1 ;CARRY SET = NO MATCH =1840 2EA09541 MOV AL,NFILFLG =1844 0AC0 OR AL,AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 36 =1846 7403E92909 184B JZ $+5 ! JMP NOFILOPN ;GO TELL OPERATOR IF NO FILE OPEN =184B E86310 28B1 CALL BUFMSG =184E 2E8B1ECA41 MOV BX,HLSAVE ;RETURN TO TERMINAL.. =1853 E9600F 27B6 JMP TERM ;..MODE WITH SAVE OPTION.. = ;..IF PREVIOUSLY ENABLED. = ; = NXTOPT1: =1856 E8F30E 274C CALL ILCOMP =1859 57525400 DB 'WRT',0 =185D 7203 1862 JC L@124 =185F E9D708 2139 JMP WRTFIL = L@124: =1862 E8E70E 274C CALL ILCOMP =1865 44454C00 DB 'DEL',0 =1869 7203 186E JC L@125 =186B E99608 2104 JMP NEWFILE = L@125: =186E 53 PUSH BX =186F 2EA0D441 MOV AL,CMDBUF+2 =1873 BB8E41 MOV BX,OFFSET COMPLIST =1876 E81709 2190 CALL COMPARE ;COMPARES LIST POINTED TO BY HL.. =1879 5B POP BX ;..TO CHAR IN A-REG. =187A 7208 1884 JC NOTVLD ;CARRY SET = NO MATCH =187C 53 DOOPT: PUSH BX ;LOAD ORIGINAL FCB WITH TRANSFER.. =187D E89FF2 0B1F CALL SETFCB ;..CMDS AND GO TO BEGINNING OF.. =1880 5B POP BX ;..PROGRAM. WILL FOLLOW SAME LOGIC.. =1881 E9ADF1 0A31 JMP RESTART ;..AS IF PROGRAM WERE CALLED WITH.. = ;..CP/M COMMAND LINE. = ; = NOTVLD: =1884 E80300 188A CALL NOTVLDMSG =1887 E938FE 16C2 JMP XPRT = ; = NOTVLDMSG: =188A E8880D 2615 CALL ILPRT =188D 2B2B20496E76 DB '++ Invalid Command ++',CR,LF,BELL,0 616C69642043 6F6D6D616E64 202B2B0D0A07 00 =18A6 C3 RET = ; = DIR: =18A7 B119 MOV CL,CURDSK =18A9 CDE0 INT 224 =18AB 2EA25542 MOV DISKSAV,AL =18AF E82324 3CD5 CALL DIRLST =18B2 2E8A165542 MOV DL,DISKSAV =18B7 B10E MOV CL,SELDSK =18B9 CDE0 INT 224 =18BB E904FE 16C2 JMP XPRT = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 37 =18BE 2EF6069541FF LOGNEW: TEST NFILFLG,0FFH =18C4 7503E9B900 18C9 JNZ $+5 ! JMP NORESET =18C9 2EA0D841 MOV AL,CMDBUF+6 =18CD 3C20 CMP AL,' ' =18CF 7506 18D7 JNZ SPECIFD =18D1 B119 MOV CL,CURDSK =18D3 CDE0 INT 224 =18D5 0441 ADD AL,'A' = SPECIFD: =18D7 2C41 SUB AL,'A' =18D9 2EA25542 MOV DISKSAV,AL =18DD 3C10 CMP AL,16 =18DF 7203E9A0FF 18E4 JC $+5 ! JMP NOTVLD = ; =18E4 2EA0D941 MOV AL,CMDBUF+7 ;GET NEW USER NUMBER =18E8 3C20 CMP AL,' ' ;CHECK FOR SPACE =18EA 7437 1923 JZ SR7A ;EXIT IF NO NEW USER NUMBER SPECIFIED =18EC E81102 1B00 CALL NUMCHK ;CHECK TO SEE IF IT IS A NUMBER =18EF 8AE8 MOV CH,AL ;SAVE =18F1 2EA0DA41 MOV AL,CMDBUF+8 ;GET SECOND DIGIT =18F5 3C20 CMP AL,' ' =18F7 741C 1915 JZ SR7B ;GO IF SPACE =18F9 E80402 1B00 CALL NUMCHK =18FC 8AC8 MOV CL,AL ;SAVE =18FE 8AC5 MOV AL,CH ;GET SAVED FIRST DIGIT =1900 02C0 ADD AL,AL ; X2 =1902 02C0 ADD AL,AL ; X4 =1904 02C0 ADD AL,AL ; X8 =1906 02C5 ADD AL,CH ; X9 =1908 02C5 ADD AL,CH ; X10 =190A 02C1 ADD AL,CL =190C 3C10 CMP AL,16 ;CHECK FOR < 16 =190E 7203E971FF 1913 JC $+5 ! JMP NOTVLD ;GO IF NOT =1913 8AE8 MOV CH,AL =1915 51 SR7B: PUSH CX =1916 E86200 197B CALL GETUSR =1919 59 POP CX ;RESTORE SELECTED USER =191A 3AC5 CMP AL,CH ;AND COMPARE THEM =191C 7405 1923 JZ SR7A ;EXIT IF UNCHANGED =191E 8AD5 MOV DL,CH ;ELSE SET NEW USER =1920 E85A00 197D CALL SETUSR = ; =1923 E8EF0C 2615 SR7A: CALL ILPRT =1926 496E73657274 DB 'Insert disk for drive ',0 206469736B20 666F72206472 6976652000 =193D 2EA05542 MOV AL,DISKSAV =1941 0441 ADD AL,'A' =1943 E80D0C 2553 CALL TIPE =1946 E8CC0C 2615 NOTCR: CALL ILPRT =1949 0D0A48697420 DB CR,LF,'Hit return when ready',0 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 38 72657475726E 207768656E20 726561647900 =1961 E80F0C 2573 CALL KEYIN =1964 3C0D CMP AL,CR =1966 75DE 1946 JNZ NOTCR =1968 E8DB0B 2546 CALL CRLF =196B B10D MOV CL,RESET =196D CDE0 INT 224 =196F 2E8A165542 MOV DL,DISKSAV =1974 B10E MOV CL,SELDSK =1976 CDE0 INT 224 =1978 E947FD 16C2 JMP XPRT = ; =197B B2FF GETUSR: MOV DL,0FFH ;GET CURRENT USER =197D B120 SETUSR: MOV CL,USER ;SET-UP FUNCTION CALL =197F CDE0 INT 224 ;NUMBER IN RETURNED IN A =1981 C3 RET = ; = NORESET: =1982 E8900C 2615 CALL ILPRT =1985 2B2B20202020 DB '++ Terminal mode file open ++',CR,LF 20205465726D 696E616C206D 6F6465206669 6C65206F7065 6E2020202020 202B2B0D0A =19AE 2B2B20557365 DB '++ Use WRT or DEL before LOG command ++',CR,LF 20575254206F 722044454C20 6265666F7265 204C4F472063 6F6D6D616E64 202B2B0D0A =19D7 0D0A0A0700 DB CR,LF,LF,BELL,0 =19DC 32C0 XOR AL,AL =19DE E9E1FC 16C2 JMP XPRT = ; =19E1 BAD241 ERASEF: MOV DX,OFFSET CMDBUF ;PUT CMD LINE INTO FCB AT HL =19E4 BB5C00 MOV BX,OFFSET FCB =19E7 E8530C 263D CALL CPMLINE =19EA E8F7F0 0AE4 CALL MOVEFCB ;MOVE FCB+16 TO FCB =19ED 803E5D0020 CMP BYTE PTR .FCB+1,' ' =19F2 7503E98DFE 19F7 JNZ $+5 ! JMP NOTVLD ;GO IF NO FILE SPECIFIED =19F7 BA5C00 MOV DX,OFFSET FCB =19FA B111 MOV CL,SRCHF =19FC CDE0 INT 224 =19FE FEC0 INC AL ;0 IF FILE NOT FOUND =1A00 751E 1A20 JNZ ERAFILE ;OK, GO ERASE =1A02 E8100C 2615 CALL ILPRT =1A05 2B2B2046696C DB '++ File not found ++',CR,LF,BELL,0 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 39 65206E6F7420 666F756E6420 2B2B0D0A0700 =1A1D E9A2FC 16C2 JMP XPRT = ; = ERAFILE: =1A20 BA5C00 MOV DX,OFFSET FCB =1A23 B113 MOV CL,ERASE =1A25 CDE0 INT 224 =1A27 E8EB0B 2615 CALL ILPRT =1A2A 46696C652065 DB 'File erased',CR,LF,0 72617365640D 0A00 =1A38 E987FC 16C2 JMP XPRT = ; = DISC: =1A3B 2EA01901 MOV AL,DISCFLG =1A3F 0AC0 OR AL,AL =1A41 7503E93EFE 1A46 JNZ $+5 ! JMP NOTVLD =1A46 E896EF 09DF CALL DISCR =1A49 E8C90B 2615 CALL ILPRT =1A4C 2A2A20446973 DB '** Disconnected **',CR,LF,BELL,0 636F6E6E6563 746564202A2A 0D0A0700 =1A62 E95DFC 16C2 JMP XPRT = ; = SETSPD: =1A65 E8AD0B 2615 CALL ILPRT =1A68 456E74657220 DB 'Enter character output delay [0(none) - 9(longest delay)]: ',0 636861726163 746572206F75 747075742064 656C6179205B 30286E6F6E65 29202D203928 6C6F6E676573 742064656C61 79295D3A2000 =1AA4 E84B00 1AF2 CALL NUMGET =1AA7 7304 1AAD JNC NOCHG1 =1AA9 2EA21D01 MOV BYTDLY,AL =1AAD E85B00 1B0B NOCHG1: CALL SPDMSG =1AB0 E8620B 2615 CALL ILPRT =1AB3 0D0A456E7465 DB CR,LF,'Enter additional delay after [0-9]: ',0 722061646469 74696F6E616C 2064656C6179 206166746572 203C43523E20 5B302D395D3A 2000 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 40 =1ADF E81000 1AF2 CALL NUMGET =1AE2 7308 1AEC JNC NOCHG2 =1AE4 D0C0 ROL AL,1 ;X2 =1AE6 D0C0 ROL AL,1 ;X4 =1AE8 2EA21E01 MOV CRDLY,AL =1AEC E86900 1B58 NOCHG2: CALL CRDLYMSG =1AEF E9D0FB 16C2 JMP XPRT = ; =1AF2 BAD241 NUMGET: MOV DX,OFFSET CMDBUF =1AF5 E83F0B 2637 CALL INBUFF =1AF8 2EA0D441 MOV AL,CMDBUF+2 ;GET NUMBER =1AFC 3C20 CMP AL,' ' =1AFE 740A 1B0A JZ NUMCHKRT =1B00 2C30 NUMCHK: SUB AL,'0' =1B02 3C0A CMP AL,10 =1B04 7204 1B0A JC NUMCHKRT =1B06 58 POP AX ;PRESERVE STACK =1B07 E97AFD 1884 JMP NOTVLD = NUMCHKRT: =1B0A C3 RET = ; =1B0B E8070B 2615 SPDMSG: CALL ILPRT =1B0E 5465726D696E DB 'Terminal mode file output delay is 0.',0 616C206D6F64 652066696C65 206F75747075 742064656C61 792069732030 2E00 =1B34 2EA01D01 MOV AL,BYTDLY =1B38 E85800 1B93 CALL GIVNUM =1B3B E8D70A 2615 CALL ILPRT =1B3E 207365636F6E DB ' seconds per character',CR,LF,0 647320706572 206368617261 637465720D0A 00 =1B57 C3 RET = ; = CRDLYMSG: =1B58 E8BA0A 2615 CALL ILPRT =1B5B 416464697469 DB 'Additional delay after is 0.',0 6F6E616C2064 656C61792061 66746572203C 43523E206973 20302E00 =1B7D 2EA01E01 MOV AL,CRDLY =1B81 E80F00 1B93 CALL GIVNUM =1B84 E88E0A 2615 CALL ILPRT =1B87 207365636F6E DB ' seconds',CR,LF,0 64730D0A00 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 41 =1B92 C3 RET = ; =1B93 02C0 GIVNUM: ADD AL,AL ;2X =1B95 3C0A CMP AL,10 =1B97 8AE8 MOV CH,AL =1B99 7307 1BA2 JNC NOZERO =1B9B B030 MOV AL,'0' =1B9D E8B309 2553 CALL TIPE =1BA0 8AC5 MOV AL,CH =1BA2 53 NOZERO: PUSH BX =1BA3 8AD8 MOV BL,AL =1BA5 B700 MOV BH,0 =1BA7 E8070A 25B1 CALL DECOUT =1BAA 5B POP BX =1BAB C3 RET = ; = SETTIM: =1BAC 2EA01601 MOV AL,SETUPTST =1BB0 0AC0 OR AL,AL =1BB2 7403E9CDFC 1BB7 JZ $+5 ! JMP NOTVLD =1BB7 E85B0A 2615 CALL ILPRT =1BBA 55736520302D DB 'Use 0-8 to give baud rate for S mode time-to-send message,' 3820746F2067 697665206261 756420726174 6520666F7220 53206D6F6465 2074696D652D 746F2D73656E 64206D657373 6167652C =1BF4 0D0A DB CR,LF =1BF6 776865726520 DB 'where 0=110, 1=300, 2=450, 3=600, 4=710, 5=1200, 6=2400',CR,LF 303D3131302C 20313D333030 2C20323D3435 302C20333D36 30302C20343D 3731302C2035 3D313230302C 20363D323430 300D0A =1C2F 373D34383030 DB '7=4800, and 8=9600 baud',CR,LF,LF,'Enter value: ',0 2C20616E6420 383D39363030 20626175640D 0A0A456E7465 722076616C75 653A2000 =1C57 E898FE 1AF2 CALL NUMGET =1C5A 3C09 CMP AL,9 =1C5C 7203E923FC 1C61 JC $+5 ! JMP NOTVLD CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 42 =1C61 2EA21C01 MOV MSPEED,AL =1C65 E80300 1C6B CALL SETTIM2 =1C68 E957FA 16C2 JMP XPRT = ; = SETTIM2: =1C6B 2EA01601 MOV AL,SETUPTST =1C6F 0AC0 OR AL,AL =1C71 753A 1CAD JNZ SETTIM3 =1C73 E89F09 2615 CALL ILPRT =1C76 526174652066 DB 'Rate for the S mode time-to-send message is set to ',0 6F7220746865 2053206D6F64 652074696D65 2D746F2D7365 6E64206D6573 736167652069 732073657420 746F2000 =1CAA E91300 1CC0 JMP SETTIM4 = SETTIM3: =1CAD E86509 2615 CALL ILPRT =1CB0 4D6F64656D20 DB 'Modem speed is ',0 737065656420 69732000 = SETTIM4: =1CC0 E80100 1CC4 CALL BAUDPRT =1CC3 C3 RET = ; = ;Shows baud rates set for 'time to send' file transfer. = ; = BAUDPRT: =1CC4 BBF81C MOV BX,OFFSET BAUDSPD =1CC7 B600 MOV DH,0 =1CC9 2EA01C01 MOV AL,MSPEED ;GET BAUD RATE CODE =1CCD 02C0 ADD AL,AL ;X2 =1CCF 8AD0 MOV DL,AL =1CD1 03DA ADD BX,DX ;POINT TO CORRECT RATE =1CD3 8A07 MOV AL,BYTE PTR [BX] ; GET FIRST DIGIT =1CD5 E87B08 2553 CALL TIPE =1CD8 43 INC BX =1CD9 8A07 MOV AL,BYTE PTR [BX] ; GET SECOND DIGIT =1CDB E87508 2553 CALL TIPE =1CDE 2EA01C01 MOV AL,MSPEED ;CHECK FOR GREATER THAN 1000 =1CE2 3C05 CMP AL,5 =1CE4 7205 1CEB JC NOTHOU ;GO IF LESS =1CE6 B030 MOV AL,'0' ;PRINT EXTRA 0 =1CE8 E86808 2553 CALL TIPE =1CEB E82709 2615 NOTHOU: CALL ILPRT =1CEE 302062617564 DB '0 baud',CR,LF,0 0D0A00 =1CF7 C3 RET = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 43 =1CF8 313133303435 BAUDSPD DB '11','30','45','60','71','12','24','48','96' 363037313132 323434383936 = ; = TOGCRC: =1D0A 2EA00501 MOV AL,TOGGLECRC =1D0E 0AC0 OR AL,AL =1D10 7503E96FFB 1D15 JNZ $+5 ! JMP NOTVLD =1D15 2EA00401 MOV AL,CKSUMDFLT =1D19 F6D0 NOT AL =1D1B 2EA20401 MOV CKSUMDFLT,AL =1D1F E80300 1D25 CALL TOGCRC2 =1D22 E99DF9 16C2 JMP XPRT = ; = TOGCRC2: =1D25 0AC0 OR AL,AL =1D27 7513 1D3C JNZ CHEKMSG =1D29 E8E908 2615 CALL ILPRT =1D2C 435243206D6F DB 'CRC mode set',CR,LF,0 646520736574 0D0A00 =1D3B C3 RET = ; = CHEKMSG: =1D3C E8D608 2615 CALL ILPRT =1D3F 436865636B73 DB 'Checksum mode set',CR,LF,0 756D206D6F64 65207365740D 0A00 =1D53 C3 RET = ; = TOGBKSP: =1D54 2EA00701 MOV AL,TOGGLEBK =1D58 0AC0 OR AL,AL =1D5A 7503E925FB 1D5F JNZ $+5 ! JMP NOTVLD =1D5F 2EA00601 MOV AL,CONVBKSP =1D63 F6D0 NOT AL =1D65 2EA20601 MOV CONVBKSP,AL =1D69 E80300 1D6F CALL TOGBKSP2 =1D6C E953F9 16C2 JMP XPRT = ; = TOGBKSP2: =1D6F 2EF6060601FF TEST CONVBKSP,0FFH =1D75 7417 1D8E JZ NORUBMSG =1D77 E89B08 2615 CALL ILPRT =1D7A 4261636B7370 DB 'Backspace is rub',CR,LF,0 616365206973 207275620D0A 00 =1D8D C3 RET = ; = NORUBMSG: CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 44 =1D8E E88408 2615 CALL ILPRT =1D91 4261636B7370 DB 'Backspace is backspace',CR,LF,0 616365206973 206261636B73 706163650D0A 00 =1DAA C3 RET = ; =1DAB 2EA00E01 TOGLOC: MOV AL,TOGGLELOC =1DAF 0AC0 OR AL,AL =1DB1 7503E9CEFA 1DB6 JNZ $+5 ! JMP NOTVLD =1DB6 2EF6160D01 NOT LOCONEXTCHR =1DBB E80300 1DC1 CALL TOGLOC2 =1DBE E901F9 16C2 JMP XPRT = ; = TOGLOC2: =1DC1 E85108 2615 CALL ILPRT =1DC4 5573652000 DB 'Use ',0 =1DC9 2EA00D01 MOV AL,LOCONEXTCHR =1DCD 0AC0 OR AL,AL =1DCF 2EA02701 MOV AL,EXTCHR =1DD3 741C 1DF1 JZ LOCMSG =1DD5 E82D08 2605 CALL SHFTYPE =1DD8 206265666F72 DB ' before local command',CR,LF,0 65206C6F6361 6C20636F6D6D 616E640D0A00 =1DF0 C3 RET = ; =1DF1 E81108 2605 LOCMSG: CALL SHFTYPE =1DF4 20746F207365 DB ' to send local command to remote',CR,LF,0 6E64206C6F63 616C20636F6D 6D616E642074 6F2072656D6F 74650D0A00 =1E17 C3 RET = ; =1E18 2EA00901 TOGLF: MOV AL,TOGGLELF =1E1C 0AC0 OR AL,AL =1E1E 7503E961FA 1E23 JNZ $+5 ! JMP NOTVLD =1E23 2EF6160801 NOT ADDLF =1E28 E80300 1E2E CALL TOGLF2 =1E2B E994F8 16C2 JMP XPRT = ; = TOGLF2: =1E2E E8E407 2615 CALL ILPRT =1E31 4C696E656665 DB 'Linefeed ',0 65642000 =1E3B 2EA00801 MOV AL,ADDLF =1E3F 0AC0 OR AL,AL =1E41 7508 1E4B JNZ LFMSG CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 45 =1E43 E8CF07 2615 CALL ILPRT =1E46 4E4F542000 DB 'NOT ',0 =1E4B E8C707 2615 LFMSG: CALL ILPRT =1E4E 73656E742061 DB 'sent after ',CR,LF,0 66746572203C 43523E0D0A00 =1E60 C3 RET = ; =1E61 2EA00B01 TOGSTL: MOV AL,TOGSLF =1E65 0AC0 OR AL,AL =1E67 7503E918FA 1E6C JNZ $+5 ! JMP NOTVLD =1E6C 2EF6160A01 NOT STRLF =1E71 E80300 1E77 CALL TOGSTL2 =1E74 E94BF8 16C2 JMP XPRT = ; = TOGSTL2: =1E77 E89B07 2615 CALL ILPRT =1E7A 4C696E656665 DB 'Linefeed ',0 65642000 =1E84 2EA00A01 MOV AL,STRLF =1E88 0AC0 OR AL,AL =1E8A 7408 1E94 JZ SLFMSG =1E8C E88607 2615 CALL ILPRT =1E8F 4E4F542000 DB 'NOT ',0 =1E94 E87E07 2615 SLFMSG: CALL ILPRT =1E97 73656E742061 DB 'sent after in terminal mode file output',CR,LF,0 66746572203C 43523E20696E 207465726D69 6E616C206D6F 64652066696C 65206F757470 75740D0A00 =1EC6 C3 RET = ; = TOGTXOFF: =1EC7 2EA01201 MOV AL,TOGXOFF =1ECB 0AC0 OR AL,AL =1ECD 7503E9B2F9 1ED2 JNZ $+5 ! JMP NOTVLD =1ED2 E84007 2615 CALL ILPRT =1ED5 55736520584F DB 'Use XOFF testing? (Y/N): ',0 464620746573 74696E673F20 28592F4E293A 2000 =1EEF E84001 2032 CALL GETANS =1EF2 7204 1EF8 JC NOCHG3 =1EF4 2EA21001 MOV XOFFTST,AL =1EF8 E86D01 2068 NOCHG3: CALL XOFFMSG =1EFB 2EA01001 MOV AL,XOFFTST =1EFF 0AC0 OR AL,AL =1F01 7503E9BCF7 1F06 JNZ $+5 ! JMP XPRT CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 46 =1F06 F6D0 NOT AL =1F08 2EA21101 MOV XONWAIT,AL =1F0C 2EA21301 MOV ECHWAIT,AL =1F10 E84301 2056 CALL THEREF =1F13 E89F01 20B5 CALL XONMSG =1F16 E8C200 1FDB CALL ECHMSG =1F19 E9A6F7 16C2 JMP XPRT = ; = TOGTXON: =1F1C E8F606 2615 CALL ILPRT =1F1F 55736520584F DB 'Use XON waiting after (Y/N): ',0 4E2077616974 696E67206166 746572203C43 523E2028592F 4E293A2000 =1F42 E8ED00 2032 CALL GETANS =1F45 7204 1F4B JC NOCHG4 =1F47 2EA21101 MOV XONWAIT,AL =1F4B E86701 20B5 NOCHG4: CALL XONMSG =1F4E 2EA01101 MOV AL,XONWAIT =1F52 0AC0 OR AL,AL =1F54 7503E969F7 1F59 JNZ $+5 ! JMP XPRT =1F59 F6D0 NOT AL =1F5B 2EA21001 MOV XOFFTST,AL ;DON'T ALLOW BOTH =1F5F 2EA21301 MOV ECHWAIT,AL =1F63 E8F000 2056 CALL THEREF =1F66 E8FF00 2068 CALL XOFFMSG =1F69 E86F00 1FDB CALL ECHMSG =1F6C E953F7 16C2 JMP XPRT = ; = TOGWECH: =1F6F E8A306 2615 CALL ILPRT =1F72 557365206563 DB 'Use echo waiting before transmitting next character (Y/N): ',0 686F20776169 74696E672062 65666F726520 7472616E736D 697474696E67 206E65787420 636861726163 746572202859 2F4E293A2000 =1FAE E88100 2032 CALL GETANS =1FB1 7204 1FB7 JC NOCHG5 =1FB3 2EA21301 MOV ECHWAIT,AL =1FB7 E82100 1FDB NOCHG5: CALL ECHMSG =1FBA 2EA01301 MOV AL,ECHWAIT =1FBE 0AC0 OR AL,AL =1FC0 7503E9FDF6 1FC5 JNZ $+5 ! JMP XPRT =1FC5 F6D0 NOT AL =1FC7 2EA21001 MOV XOFFTST,AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 47 =1FCB 2EA21101 MOV XONWAIT,AL =1FCF E88400 2056 CALL THEREF =1FD2 E89300 2068 CALL XOFFMSG =1FD5 E8DD00 20B5 CALL XONMSG =1FD8 E9E7F6 16C2 JMP XPRT = ; =1FDB E83706 2615 ECHMSG: CALL ILPRT =1FDE 57616974696E DB 'Waiting for character echo ',0 6720666F7220 636861726163 746572206563 686F2000 =1FFA 2EA01301 MOV AL,ECHWAIT =1FFE 0AC0 OR AL,AL =2000 7508 200A JNZ ECHMSG2 =2002 E81006 2615 CALL ILPRT =2005 4E4F542000 DB 'NOT ',0 = ECHMSG2: =200A E80806 2615 CALL ILPRT =200D 757365642069 DB 'used in terminal mode file output',CR,LF,0 6E207465726D 696E616C206D 6F6465206669 6C65206F7574 7075740D0A00 =2031 C3 RET = ; = GETANS: =2032 BAD241 MOV DX,OFFSET CMDBUF =2035 E8FF05 2637 CALL INBUFF =2038 2EA0D441 MOV AL,CMDBUF+2 ;GET ANSWER =203C 3C20 CMP AL,' ' =203E F5 CMC =203F 7414 2055 JZ GETANSRT =2041 8AE8 MOV CH,AL =2043 3C4E CMP AL,'N' =2045 B000 MOV AL,FALSE =2047 740C 2055 JZ GETANSRT =2049 8AC5 MOV AL,CH =204B 3C59 CMP AL,'Y' =204D B0FF MOV AL,TRUE =204F 7404 2055 JZ GETANSRT =2051 58 POP AX ;PRESERVE STACK =2052 E92FF8 1884 JMP NOTVLD = GETANSRT: =2055 C3 RET = ; =2056 E8BC05 2615 THEREF: CALL ILPRT =2059 546865726566 DB 'Therefore -',CR,LF,0 6F7265202D0D 0A00 =2067 C3 RET CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 48 = ; = XOFFMSG: =2068 E8AA05 2615 CALL ILPRT =206B 584F46462074 DB 'XOFF testing ',0 657374696E67 2000 =2079 2EA01001 MOV AL,XOFFTST =207D 0AC0 OR AL,AL =207F 7508 2089 JNZ XOTSTON =2081 E89105 2615 CALL ILPRT =2084 4E4F542000 DB 'NOT ',0 = XOTSTON: =2089 E88905 2615 CALL ILPRT =208C 7573656400 DB 'used',0 = XONMSG3: =2091 E88105 2615 CALL ILPRT =2094 20696E207465 DB ' in terminal mode file output',CR,LF,0 726D696E616C 206D6F646520 66696C65206F 75747075740D 0A00 =20B4 C3 RET = ; = XONMSG: =20B5 E85D05 2615 CALL ILPRT =20B8 584F4E2000 DB 'XON ',0 =20BD 2EA01101 MOV AL,XONWAIT =20C1 0AC0 OR AL,AL =20C3 7508 20CD JNZ XONMSG2 =20C5 E84D05 2615 CALL ILPRT =20C8 4E4F542000 DB 'NOT ',0 = XONMSG2: =20CD E84505 2615 CALL ILPRT =20D0 6175746F6D61 DB 'automatically tested after ',0 746963616C6C 792074657374 656420616674 6572203C4352 3E00 =20F0 E99EFF 2091 JMP XONMSG3 = ; = SETUPENT: =20F3 2EA01601 MOV AL,SETUPTST =20F7 0AC0 OR AL,AL =20F9 7503E986F7 20FE JNZ $+5 ! JMP NOTVLD =20FE E88DE5 068E CALL SETUPR =2101 E9BEF5 16C2 JMP XPRT = ; = NEWFILE: =2104 2EA09541 MOV AL,NFILFLG =2108 0AC0 OR AL,AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 49 =210A 7568 2174 JNZ NOFILOPN =210C 2EA0C942 MOV AL,FCB3+1 ;CHECK THAT FILE WAS REQUESTED =2110 3C20 CMP AL,' ' =2112 7460 2174 JZ NOFILOPN ;IF NO FILE, DON'T ERASE =2114 BAC842 MOV DX,OFFSET FCB3 =2117 B113 MOV CL,ERASE =2119 E83E0B 2C5A CALL BDOSRT =211C B0FF MOV AL,TRUE ;DO NOT ALLOW TERMINAL.. =211E 2EA29541 MOV NFILFLG,AL ;..SAVE SINCE NO FILE.. =2122 F6D0 NOT AL ;..SPECIFIED. =2124 2EA2BE41 MOV SAVEFLG,AL =2128 BBC842 MOV BX,OFFSET FCB3 =212B E87F0C 2DAD CALL INITFCBS =212E BB0044 MOV BX,OFFSET BOTTRAM =2131 2E891ECA41 MOV HLSAVE,BX =2136 E989F5 16C2 JMP XPRT = ; = WRTFIL: =2139 2E803E9541FF CMP NFILFLG,TRUE =213F 7433 2174 JZ NOFILOPN =2141 2EA0C942 MOV AL,FCB3+1 ;CHECK THAT FILE WAS REQUESTED =2145 3C20 CMP AL,' ' =2147 742B 2174 JZ NOFILOPN =2149 2E8B1ECA41 MOV BX,HLSAVE =214E E8C40A 2C15 CALL NUMRECS ;DISK WRITE ROUTINE AS USED IN.. =2151 E8E40A 2C38 CALL WRTDSK ;..IN THE INTDSKSV ROUTINE. =2154 E8FB0A 2C52 CALL CLOSE3 =2157 2EC6069541FF MOV NFILFLG,TRUE =215D 2EC606BE4100 MOV SAVEFLG,FALSE =2163 BBC842 MOV BX,OFFSET FCB3 =2166 E8440C 2DAD CALL INITFCBS ;BLANK OUT FCB SO WRITTEN FILE CAN'T BE ERASED. =2169 BB0044 MOV BX,OFFSET BOTTRAM =216C 2E891ECA41 MOV HLSAVE,BX =2171 E94EF5 16C2 JMP XPRT = ; = NOFILOPN: =2174 E89E04 2615 CALL ILPRT =2177 2B2B204E6F20 DB '++ No File Open ++',CR,LF,BELL,0 46696C65204F 70656E202B2B 0D0A0700 =218D E932F5 16C2 JMP XPRT = ; = COMPARE: =2190 8A2F MOV CH,BYTE PTR [BX] ;COMPARES A-REG WITH LIST.. = COMPLP: =2192 43 INC BX ;..ADDRESSED BY HL. FIRST ELEMENT.. =2193 3A07 CMP AL,BYTE PTR [BX] ;..OF LIST MUST BE NUMBER OF ELEMENTS.. =2195 7405 219C JZ VALID ;..BEING COMPARED. RETURNS WITH.. =2197 FECD DEC CH ;..CARRY SET IF A-REG DOES NOT.. =2199 75F7 2192 JNZ COMPLP ;.. CONTAIN AN ELEMENT IN LIST. =219B F9 STC CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 50 = VALID: =219C C3 RET = ; = NXTSCRN: =219D E87504 2615 CALL ILPRT =21A0 48495420616E DB 'HIT any KEY to CONTINUE',0 79204B455920 746F20434F4E 54494E554500 =21B8 E8A903 2564 NOKEY1: CALL STAT ;GET KEYBOARD STATUS =21BB 74FB 21B8 JZ NOKEY1 ;KEEP LOOPING UNTIL KEYPRESS =21BD E8B303 2573 CALL KEYIN ;GOBBLE UP KEYPRESS =21C0 E80100 21C4 CALL CLRTST =21C3 C3 RET = ; =21C4 2EF6061701FF CLRTST: TEST SCRNTEST,0FFH =21CA 7404 21D0 JZ LOTSALF =21CC E8F8E3 05C7 CALL CLRSCRN =21CF C3 RET = ; = LOTSALF: =21D0 B00D MOV AL,CR =21D2 E87E03 2553 CALL TIPE =21D5 B50C MOV CH,12 =21D7 B00A MOV AL,LF =21D9 E87703 2553 LFLOOP: CALL TIPE =21DC FECD DEC CH =21DE 75F9 21D9 JNZ LFLOOP =21E0 C3 RET = ; = CURPAR: =21E1 E8E0FF 21C4 CALL CLRTST =21E4 E82E04 2615 CALL ILPRT =21E7 202020202020 DB ' Current Settings',CR,LF,LF,LF,0 202020202020 202020204375 7272656E7420 53657474696E 67730D0A0A0A 00 =220C 2EA00401 MOV AL,CKSUMDFLT =2210 E812FB 1D25 CALL TOGCRC2 =2213 2EA00F01 MOV AL,LSTTST =2217 0AC0 OR AL,AL =2219 7403 221E JZ NOLST3 =221B E83308 2A51 CALL LSTMSG = NOLST3: =221E E8C3E7 09E4 CALL DETCAR =2221 E847FA 1C6B CALL SETTIM2 =2224 E848FB 1D6F CALL TOGBKSP2 =2227 E804FC 1E2E CALL TOGLF2 =222A E894FB 1DC1 CALL TOGLOC2 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 51 =222D E8E503 2615 CALL ILPRT =2230 5465726D696E DB 'Terminal mode file buffer is ',0 616C206D6F64 652066696C65 206275666665 722069732000 =224E 2EF6069541FF TEST NFILFLG,0FFH =2254 7406 225C JZ ACTIVE =2256 E8BC03 2615 CALL ILPRT =2259 696E00 DB 'in',0 = ACTIVE: =225C E8B603 2615 CALL ILPRT =225F 616374697665 DB 'active',CR,LF,'Unused portion of buffer is ',0 0D0A556E7573 656420706F72 74696F6E206F 662062756666 657220697320 00 =2284 E83200 22B9 CALL GETSPC =2287 E88B03 2615 CALL ILPRT =228A 206279746573 DB ' bytes',CR,LF,0 0D0A00 =2293 2EF6061601FF TEST SETUPTST,0FFH =2299 7403 229E JZ NOSETP =229B E844E6 08E2 CALL GIVEPRM =229E E8D6FB 1E77 NOSETP: CALL TOGSTL2 =22A1 E87E01 2422 CALL TOGTEOF2 =22A4 E8C1FD 2068 CALL XOFFMSG =22A7 E80BFE 20B5 CALL XONMSG =22AA E82EFD 1FDB CALL ECHMSG =22AD E85BF8 1B0B CALL SPDMSG =22B0 E8A5F8 1B58 CALL CRDLYMSG =22B3 E89002 2546 CALL CRLF =22B6 E909F4 16C2 JMP XPRT = ; =22B9 E87308 2B2F GETSPC: CALL GETMAX =22BC 8AE8 MOV CH,AL =22BE 2E8B1ECA41 MOV BX,HLSAVE =22C3 F9 STC =22C4 F5 CMC =22C5 B000 MOV AL,0 =22C7 1AC3 SBB AL,BL =22C9 8AD8 MOV BL,AL =22CB 8AC5 MOV AL,CH =22CD 1AC7 SBB AL,BH =22CF 8AF8 MOV BH,AL =22D1 E8DD02 25B1 CALL DECOUT =22D4 C3 RET = ; = TFOMENU: =22D5 E8ECFE 21C4 CALL CLRTST CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 52 =22D8 E83A03 2615 CALL ILPRT =22DB 202020202043 DB ' Commands for Setting Terminal Mode File Output' 6F6D6D616E64 7320666F7220 53657474696E 67205465726D 696E616C204D 6F6465204669 6C65204F7574 707574 =230E 20506172616D DB ' Parameters',CR,LF,LF,LF 65746572730D 0A0A0A =231D 535044202D20 DB 'SPD - Set speed of file output',CR,LF 536574207370 656564206F66 2066696C6520 6F7574707574 0D0A =233D 544546202D20 DB 'TEF - Toggle transmission of end-of-file character',CR,LF,0 546F67676C65 207472616E73 6D697373696F 6E206F662065 6E642D6F662D 66696C652063 686172616374 65720D0A00 =2372 2EA00B01 MOV AL,TOGSLF =2376 0AC0 OR AL,AL =2378 744C 23C6 JZ NOTOGSLF =237A E89802 2615 CALL ILPRT =237D 54534C202D20 DB 'TSL - Toggle stripping linefeeds',CR,LF 546F67676C65 207374726970 70696E67206C 696E65666565 64730D0A =239F 545745202D20 DB 'TWE - Toggle wait for character echo',CR,LF,0 546F67676C65 207761697420 666F72206368 617261637465 72206563686F 0D0A00 = ; = NOTOGSLF: =23C6 2EF6061201FF TEST TOGXOFF,0FFH =23CC 7446 2414 JZ NOTOGXOFF =23CE E84402 2615 CALL ILPRT =23D1 545846202D20 DB 'TXF - Toggle XOFF testing',CR,LF 546F67676C65 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 53 20584F464620 74657374696E 670D0A =23EC 54584E202D20 DB 'TXN - Toggle XON waiting after ',CR,LF,LF,LF,0 546F67676C65 20584F4E2077 616974696E67 206166746572 203C43523E0D 0A0A0A00 = ; = NOTOGXOFF: =2414 E9ABF2 16C2 JMP XPRT = ; = TOGTEOF: =2417 2EF6161401 NOT EOFSEND =241C E80300 2422 CALL TOGTEOF2 =241F E9A0F2 16C2 JMP XPRT = ; = TOGTEOF2: =2422 E8F001 2615 CALL ILPRT =2425 456E642D6F66 DB 'End-of-file character ',0 2D66696C6520 636861726163 7465722000 =243C 2EF6061401FF TEST EOFSEND,0FFH =2442 7508 244C JNZ EOFMSG =2444 E8CE01 2615 CALL ILPRT =2447 4E4F542000 DB 'NOT ',0 =244C E8C601 2615 EOFMSG: CALL ILPRT =244F 73656E742069 DB 'sent in terminal mode file output',CR,LF,0 6E207465726D 696E616C206D 6F6465206669 6C65206F7574 7075740D0A00 =2473 C3 RET = ; = ; = ;THIS ROUTINE DISPLAYS THE PHONE NUMBERS IN THE LIBRARY = ; = NUMPRN: =2474 53 PUSH BX =2475 E84CFD 21C4 CALL CLRTST =2478 E89A01 2615 CALL ILPRT =247B 202020202020 DB ' Library of Phone Numbers of Remote Systems',0 20202020204C 696272617279 206F66205068 6F6E65204E75 6D6265727320 6F662052656D CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 54 6F7465205379 7374656D7300 =24B1 B10D MOV CL,13 ;NUMBER OF LINES TO MOVE =24B3 BB7D02 MOV BX,OFFSET NUMBLIB ;ADDRESS OF SOURCE MEMORY =24B6 BA5843 MOV DX,OFFSET DBUF ;ADDRESS OF TARGET MEMORY =24B9 E82200 24DE CALL NEWLINE ;START WITH CRLF =24BC 87DA XCHG BX,DX =24BE 8807 MOV BYTE PTR [BX],AL ;+LF =24C0 87DA XCHG BX,DX =24C2 42 INC DX ;AND BUMP IT = NUMPRN1: =24C3 43 INC BX ;SKIP PMMI DIALING LETTER =24C4 43 INC BX ;AND EQUAL SIGN =24C5 B51E MOV CH,30 ;NUMBER OF BYTES TO MOVE =24C7 E819E7 0BE3 CALL MOVE ;MOVE TO BUFFER =24CA E82000 24ED CALL SPACES ;2 ENTRIES + 3 SPACES = 63 CHARACTERS =24CD 43 INC BX =24CE 43 INC BX =24CF B51E MOV CH,30 =24D1 E80FE7 0BE3 CALL MOVE =24D4 E80700 24DE CALL NEWLINE =24D7 FEC9 DEC CL ;NUMBER OF LINES TO PRINT =24D9 7422 24FD JZ NUMPRN2 =24DB E9E5FF 24C3 JMP NUMPRN1 = ; = NEWLINE: ;PUTS CR-LF AT MEMORY POINTED BY 'DE' =24DE B00D MOV AL,CR ;CR =24E0 87DA XCHG BX,DX =24E2 8807 MOV BYTE PTR [BX],AL =24E4 B00A MOV AL,LF ;LF =24E6 43 INC BX ;BUMP POINTER =24E7 8807 MOV BYTE PTR [BX],AL ;STORE LF =24E9 87DA XCHG BX,DX =24EB 42 INC DX ;BUMP POINTER =24EC C3 RET = ; =24ED B020 SPACES: MOV AL,20H ;SPACE =24EF 87DA XCHG BX,DX =24F1 8807 MOV BYTE PTR [BX],AL ;1 =24F3 43 INC BX =24F4 8807 MOV BYTE PTR [BX],AL ;2 =24F6 43 INC BX =24F7 8807 MOV BYTE PTR [BX],AL ;3 =24F9 43 INC BX =24FA 87DA XCHG BX,DX =24FC C3 RET = ; = NUMPRN2: =24FD B024 MOV AL,'$' =24FF 87DA XCHG BX,DX =2501 8807 MOV BYTE PTR [BX],AL =2503 87DA XCHG BX,DX CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 55 =2505 B109 MOV CL,PRINT =2507 BA5843 MOV DX,OFFSET DBUF ;POINT TO TABLE OF NUMBERS TO PRINT =250A CDE0 INT 224 =250C E83700 2546 CALL CRLF =250F E83400 2546 CALL CRLF =2512 5B POP BX =2513 E9ACF1 16C2 JMP XPRT = ; = INCLUDE a:CONSOLE.A86 = ; = ; CONSOLE.ASM = ; = ;Console I/O routines for MODEM9.xx. = ; =2516 3C0A SHOW: CMP AL,LF =2518 741F 2539 JZ CTYPE =251A 3C0D CMP AL,CR =251C 741B 2539 JZ CTYPE =251E 3C09 CMP AL,9 =2520 7417 2539 JZ CTYPE =2522 3C20 CMP AL,' ' =2524 7204 252A JC SHOWHEX =2526 3C7F CMP AL,7FH =2528 720F 2539 JC CTYPE = SHOWHEX: =252A 50 PUSH AX =252B B028 MOV AL,'(' =252D E80900 2539 CALL CTYPE =2530 58 POP AX =2531 E8B700 25EB CALL HEXO =2534 B029 MOV AL,')' =2536 E90000 2539 JMP CTYPE = ; =2539 51 CTYPE: PUSH CX =253A 52 PUSH DX =253B 53 PUSH BX =253C 8AD0 MOV DL,AL =253E B102 MOV CL,WRCON =2540 CDE0 INT 224 =2542 5B POP BX =2543 5A POP DX =2544 59 POP CX =2545 C3 RET = ; =2546 50 CRLF: PUSH AX =2547 B00D MOV AL,CR =2549 E80700 2553 CALL TIPE =254C B00A MOV AL,LF =254E E80200 2553 CALL TIPE =2551 58 POP AX =2552 C3 RET CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 56 = ; =2553 56 TIPE: PUSH SI =2554 51 PUSH CX =2555 52 PUSH DX =2556 53 PUSH BX =2557 247F AND AL,07FH =2559 B106 MOV CL,DCONIO =255B 8AD0 MOV DL,AL =255D CDE0 INT 224 =255F 5B POP BX =2560 5A POP DX =2561 59 POP CX =2562 5E POP SI =2563 C3 RET = ; =2564 51 STAT: PUSH CX =2565 52 PUSH DX =2566 53 PUSH BX =2567 B106 MOV CL,DCONIO =2569 B2FE MOV DL,0FEH =256B CDE0 INT 224 =256D 5B POP BX =256E 5A POP DX =256F 59 POP CX =2570 0AC0 OR AL,AL =2572 C3 RET = ; =2573 51 KEYIN: PUSH CX =2574 52 PUSH DX =2575 53 PUSH BX = KEYIN1: =2576 B106 MOV CL,DCONIO =2578 B2FF MOV DL,0FFH =257A CDE0 INT 224 =257C 0AC0 OR AL,AL =257E 74F6 2576 JZ KEYIN1 =2580 5B POP BX =2581 5A POP DX =2582 59 POP CX =2583 C3 RET = ; =2584 51 LISTER: PUSH CX =2585 52 PUSH DX =2586 53 PUSH BX =2587 8AD0 MOV DL,AL =2589 B105 MOV CL,LSTOUT =258B CDE0 INT 224 =258D 5B POP BX =258E 5A POP DX =258F 59 POP CX =2590 C3 RET = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 57 = LSTSTAT: =2591 51 PUSH CX =2592 52 PUSH DX =2593 53 PUSH BX =2594 BAA125 MOV DX, OFFSET LSTSTATBLOCK =2597 B132 MOV CL,032H ; DIRECT BIOS CALL =2599 CDE0 INT 224 =259B 5B POP BX =259C 5A POP DX =259D 59 POP CX =259E 0AC0 OR AL,AL =25A0 C3 RET = = LSTSTATBLOCK: =25A1 0F DB 15 =25A2 0000 DW 0 =25A4 0000 DW 0 = ; = ; =25A6 3C61 UCASE: CMP AL,61H ;CHANGES LOWER CASE CHARACTER.. =25A8 7206 25B0 JC UCASERET ;..IN A-REG TO UPPER CASE. =25AA 3C7B CMP AL,7BH =25AC 7302 25B0 JNC UCASERET =25AE 245F AND AL,5FH = UCASERET: =25B0 C3 RET = ; =25B1 50 DECOUT: PUSH AX =25B2 51 PUSH CX =25B3 52 PUSH DX =25B4 53 PUSH BX =25B5 B9F6FF MOV CX, -10 =25B8 BAFFFF MOV DX, -1 =25BB 03D9 DECOU2: ADD BX,CX =25BD 42 INC DX =25BE 72FB 25BB JC DECOU2 =25C0 B90A00 MOV CX,OFFSET 10 =25C3 03D9 ADD BX,CX =25C5 87DA XCHG BX,DX =25C7 8AC7 MOV AL,BH =25C9 0AC3 OR AL,BL =25CB 7403E8E1FF 25D0 JZ $+5 ! CALL DECOUT =25D0 8AC2 MOV AL,DL =25D2 0430 ADD AL,'0' =25D4 E862FF 2539 CALL CTYPE =25D7 5B POP BX =25D8 5A POP DX =25D9 59 POP CX =25DA 58 POP AX =25DB C3 RET = ; = ;----> DHXOUT: - DOUBLE PRECISION HEX OUTPUT ROUTINE. CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 58 = ; = DHXOUT: =25DC 53 PUSH BX =25DD 50 PUSH AX =25DE 8AC7 MOV AL,BH ;GET MS BYTE =25E0 E80800 25EB CALL HEXO ;OUTPUT HIGH ORDER BYTE =25E3 8AC3 MOV AL,BL ;GET LS BYTE =25E5 E80300 25EB CALL HEXO ;OUTPUT LOW ORDER BYTE =25E8 58 POP AX =25E9 5B POP BX =25EA C3 RET = ; =25EB 50 HEXO: PUSH AX =25EC D0D8 RCR AL,1 =25EE D0D8 RCR AL,1 =25F0 D0D8 RCR AL,1 =25F2 D0D8 RCR AL,1 =25F4 E80100 25F8 CALL NIBBL =25F7 58 POP AX =25F8 240F NIBBL: AND AL,0FH =25FA 3C0A CMP AL,10 =25FC 7202 2600 JC ISNUM =25FE 0407 ADD AL,7 =2600 0430 ISNUM: ADD AL,'0' =2602 E94EFF 2553 JMP TIPE = ; = SHFTYPE: =2605 50 PUSH AX =2606 E80C00 2615 CALL ILPRT =2609 6374726C2D00 DB 'ctrl-',0 =260F 58 POP AX =2610 0440 ADD AL,40H =2612 E83EFF 2553 CALL TIPE = ; = ;WRITE A STRING OF CHARACTERS = ; =2615 5E ILPRT: POP SI =2616 AC ILPLP: LODS BYTE PTR [SI] =2617 0AC0 OR AL,AL =2619 7405 2620 JZ ILPRET =261B E835FF 2553 CALL TIPE =261E EBF6 2616 JMPS ILPLP =2620 56 ILPRET: PUSH SI =2621 C3 RET = ; = ;WRITE A STRING OF CHARACTERS EXCEPT IN QUIET MODE = ; =2622 5E ILPRTQ: POP SI =2623 AC ILPLPQ: LODS BYTE PTR [SI] =2624 0AC0 OR AL,AL =2626 740D 2635 JZ ILPRETQ =2628 2EF6069741FF TEST QFLG,0FFH CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 59 =262E 7403 2633 JZ ILPLPQ1 =2630 E820FF 2553 CALL TIPE = ILPLPQ1: =2633 EBEE 2623 JMPS ILPLPQ = ILPRETQ: =2635 56 PUSH SI =2636 C3 RET = ; = ;Duplicates 'read buffer' routine same as CP/M function 10, = ;but does not use CTL-C (reason for the routine). Does = ;allow controls U, R, E and H (backspace). Outputs bell if = ;the input is greater than the buffer. = ; = INBUFF: =2637 B10A MOV CL,RDBUF =2639 E81E06 2C5A CALL BDOSRT =263C C3 RET = ; = ;Parses a CP/M buffer into format same as CP/M command line. = ; = ;Loads a command line addressed by 'DE' registers (max # characters in = ;line in 'DE', number of characters in the line in 'DE'+1, line starts = ;in 'DE'+2) into FCB addressed by 'HL' registers. The FCB should be at = ;least 33 bytes in length. The command line buffer must have a maximum = ;length of at least one more than the greatest number of characters = ;that will be needed. = ; = CPMLINE: =263D 50 PUSH AX =263E 51 PUSH CX =263F 52 PUSH DX =2640 53 PUSH BX =2641 E87500 26B9 CALL CINIT ;FILLS FCBS WITH BLANKS AND NULLS =2644 87DA XCHG BX,DX ;GET START OF COMMAND LINE IN 'HL' =2646 43 INC BX ;ADDRESS # BYTES IN CMD LINE =2647 8A17 MOV DL,BYTE PTR [BX];LOAD 'DE' PAIR WITH # BYTES =2649 B600 MOV DH,0 =264B 43 INC BX =264C 03DA ADD BX,DX ;POINT TO BYTE AFTER LAST CHAR.. =264E C6070D MOV BYTE PTR [BX],0DH ;..IN CMD LINE AND STORE DELIMITER =2651 5B POP BX ;RESTORE 'HL' AND 'DE' =2652 5A POP DX =2653 52 PUSH DX =2654 53 PUSH BX =2655 42 INC DX ;ADDRESS START OF COMMAND =2656 42 INC DX =2657 E88900 26E3 CALL DRIVE =265A B108 NAME1: MOV CL,8 ;TRANSFER FIRST FILENAME TO FCB =265C E8A000 26FF CALL TRANS =265F 3C0D CMP AL,0DH =2661 7441 26A4 JZ CDONE =2663 3C20 CMP AL,20H ;IF SPACE, THEN START OF.. CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 60 =2665 7410 2677 JZ NAME2 ;..SECOND FILENAME. =2667 5B TYPE1: POP BX ;FILETYPE MUST BE AFTER.. =2668 53 PUSH BX ;..EIGHTH BYTE OF NAME =2669 B90900 MOV CX, 9 =266C 03D9 ADD BX,CX =266E B103 MOV CL,3 ;TRANSFER TYPE OF FIRST FILE =2670 E88C00 26FF CALL TRANS =2673 3C0D CMP AL,0DH =2675 742D 26A4 JZ CDONE =2677 87DA NAME2: XCHG BX,DX =2679 8A07 MOV AL,BYTE PTR [BX] ;EAT MULTIPLE SPACES.. =267B 87DA XCHG BX,DX =267D 3C20 CMP AL,20H ;..BETWEEN NAMES =267F 7504 2685 JNZ NAME2C =2681 42 INC DX =2682 E9F2FF 2677 JMP NAME2 =2685 5B NAME2C: POP BX ;SECOND NAME STARTS IN 16TH BYTE =2686 53 PUSH BX ;POINT 'HL' TO THIS BYTE =2687 B91000 MOV CX, 16 =268A 03D9 ADD BX,CX =268C E85400 26E3 CALL DRIVE =268F B108 MOV CL,8 =2691 E86B00 26FF CALL TRANS =2694 3C0D CMP AL,0DH =2696 740C 26A4 JZ CDONE =2698 5B TYPE2: POP BX ;SECOND TYPE STARTS IN 25TH BYTE. =2699 53 PUSH BX =269A B91900 MOV CX,OFFSET 25 =269D 03D9 ADD BX,CX =269F B103 MOV CL,3 =26A1 E85B00 26FF CALL TRANS =26A4 5B CDONE: POP BX =26A5 53 PUSH BX =26A6 43 INC BX ;POINT TO 1ST CHAR OF 1ST NAME IN FCB =26A7 E87200 271C CALL CSCAN ;CHECK FOR * (AMBIGUOUS NAMES). =26AA 5B POP BX =26AB 53 PUSH BX =26AC B91100 MOV CX,OFFSET 17 ;POINT TO 1ST CHAR OF 2ND NAME IN FCB. =26AF 03D9 ADD BX,CX =26B1 E86800 271C CALL CSCAN =26B4 5B POP BX =26B5 5A POP DX =26B6 59 POP CX =26B7 58 POP AX =26B8 C3 RET = ; =26B9 53 CINIT: PUSH BX ;INITIALIZES FCB WITH 1 NULL (FOR 1ST DRIVE),.. =26BA 51 PUSH CX ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIVE),.. MOV BYTE PTR [BX],0 =26BB 43 INC BX =26BC B50B MOV CH,11 =26BE B020 MOV AL,20H CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 61 =26C0 E81800 26DB CALL INITFILL =26C3 B505 MOV CH,5 =26C5 B000 MOV AL,0 =26C7 E81100 26DB CALL INITFILL =26CA B50B MOV CH,11 =26CC B020 MOV AL,20H =26CE E80A00 26DB CALL INITFILL =26D1 B504 MOV CH,4 =26D3 B000 MOV AL,0 =26D5 E80300 26DB CALL INITFILL =26D8 59 POP CX =26D9 5B POP BX =26DA C3 RET = ; = INITFILL: =26DB 8807 MOV BYTE PTR [BX],AL =26DD 43 INC BX =26DE FECD DEC CH =26E0 75F9 26DB JNZ INITFILL =26E2 C3 RET = ; =26E3 42 DRIVE: INC DX ;CHECK 2ND BYTE OF FILENAME. IF IT.. =26E4 87DA XCHG BX,DX =26E6 8A07 MOV AL,BYTE PTR [BX] ;..IS A ":", THEN DRIVE WAS SPECIFIED =26E8 87DA XCHG BX,DX =26EA 4A DEC DX =26EB 3C3A CMP AL,':' =26ED 750E 26FD JNZ DEFDR ;ELSE ZERO FOR DEFAULT DRIVE ('INIT' PUT ZERO) =26EF 87DA XCHG BX,DX =26F1 8A07 MOV AL,BYTE PTR [BX] =26F3 87DA XCHG BX,DX =26F5 245F AND AL,5FH =26F7 2C40 SUB AL,40H ;CALCULATE DRIVE (A=1, B=2,...).. =26F9 8807 MOV BYTE PTR [BX],AL ;..AND PLACE IT IN FCB =26FB 42 INC DX ;ADDRESS FIRST BYTE OF.. =26FC 42 INC DX ;..IN CMD LINE.. =26FD 43 DEFDR: INC BX ;..AND NAME FIELD IN FCB = DEFDRRET: =26FE C3 RET = ; =26FF 87DA TRANS: XCHG BX,DX =2701 8A07 MOV AL,BYTE PTR [BX] =2703 87DA XCHG BX,DX ;TRANSFER FROM CMD LINE TO FCB.. =2705 42 INC DX ;..UP TO NUMBER OF CHARS SPECIFIED.. =2706 3C0D CMP AL,0DH ;..BY 'C' REG. KEEP SCANNING FIELD.. =2708 74F4 26FE JZ DEFDRRET ;..WITHOUT TRANSFER UNTIL A DELIMITING.. =270A 3C2E CMP AL,'.' ;..FIELD CHAR SUCH AS '.', BLANK, OR.. =270C 74F0 26FE JZ DEFDRRET ;..C/R (FOR END OF CMD LINE) =270E 3C20 CMP AL,20H =2710 74EC 26FE JZ DEFDRRET =2712 FEC9 DEC CL =2714 72E9 26FF JB TRANS ;ONCE 'C' REG IS LESS THAN '0' KEEP READING CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 62 =2716 8807 MOV BYTE PTR [BX],AL ;..CMD LINE BUT DO NOT TRANSFER TO FCB =2718 43 INC BX =2719 E9E3FF 26FF JMP TRANS = ; =271C B508 CSCAN: MOV CH,8 ;SCAN FILE NAME ADDRESSED BY 'HL' =271E 8A07 TSTNAM: MOV AL,BYTE PTR [BX] =2720 3C2A CMP AL,'*' ;IF '*' FOUND, FILL IN REST OF FIELD.. =2722 7408 272C JZ FILL1 ;..WITH '?' FOR AMBIGUOUS NAME =2724 43 INC BX =2725 FECD DEC CH =2727 75F5 271E JNZ TSTNAM =2729 E90300 272F JMP TSTTYP = ; =272C E81400 2743 FILL1: CALL FILL =272F B503 TSTTYP: MOV CH,3 ;SCAN AND FILL TYPE FIELD FOR NAME.. = TSTTYPL: =2731 8A07 MOV AL,BYTE PTR [BX] ;..SPECIFIED ABOVE =2733 3C2A CMP AL,'*' =2735 7408 273F JZ FILL2 =2737 43 INC BX =2738 FECD DEC CH =273A 7406 2742 JZ FILL2RET =273C E9F2FF 2731 JMP TSTTYPL = ; =273F E80100 2743 FILL2: CALL FILL = FILL2RET: =2742 C3 RET = ; =2743 C6073F FILL: MOV BYTE PTR [BX],'?' ;ROUTINE TRANSFERS '?' =2746 43 INC BX =2747 FECD DEC CH =2749 75F8 2743 JNZ FILL =274B C3 RET = ; = ; = ;In-line compare. Compares string addressed by 'DE' pair to string af- = ;the call (ends with '0'). Return with carry set means strings not the = ;same. All registers (except 'A') are unaffected. = ; = ILCOMP: =274C 5E POP SI ; POINT 'SI' TO 1ST CHARACTER =274D 53 PUSH BX =274E 8BDE MOV BX,SI =2750 52 PUSH DX = ILCOMPL: =2751 8A07 MOV AL,BYTE PTR [BX] ; 'BX' POINTS TO IN-LINE STRING =2753 0AC0 OR AL,AL ;END OF STRING IF ZERO =2755 7417 276E JZ SAME =2757 87DA XCHG BX,DX =2759 8A07 MOV AL,BYTE PTR [BX] =275B 87DA XCHG BX,DX =275D 3A07 CMP AL,BYTE PTR [BX] CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 63 =275F 7505 2766 JNZ NOTSAME =2761 43 INC BX =2762 42 INC DX =2763 E9EBFF 2751 JMP ILCOMPL = ; = NOTSAME: =2766 B000 MOV AL,0 ;IF NOT SAME, FINISH THRU.. =2768 43 NSLP: INC BX ;..STRING SO RETURN WILL.. =2769 3A07 CMP AL,BYTE PTR [BX] ;..GO TO INSTRUCTION AFTER.. =276B 75FB 2768 JNZ NSLP ;..STRING AND NOT REMAINDER OF STRING =276D F9 STC =276E 5A SAME: POP DX =276F 43 INC BX ;AVOIDS A NOP INSTRUCTION.. =2770 8BF3 MOV SI,BX ;..WHEN RETURNING =2772 5B POP BX =2773 56 PUSH SI =2774 C3 RET = ; = INCLUDE a:TERM.A86 = ; = ; TERM.ASM = ; = ;Terminal routines with text file I/O for MODEM9.xx. = ; = DSKSAVE: =2775 E8F507 2F6D CALL CKMODM =2778 A05D00 MOV AL,BYTE PTR .FCB+1 ;FIRST CHAR OF FILENAME =277B 3C20 CMP AL,' ' ;FILE SPEC'D =277D 750F 278E JNZ GOODNM ;YES, GOOD NAME =277F 2EC6069541FF MOV NFILFLG,TRUE =2785 2EC606BE4100 MOV SAVEFLG,FALSE =278B E92800 27B6 JMP TERM = ; =278E E89717 3F28 GOODNM: CALL ERASFIL =2791 E8D104 2C65 CALL MOVE2 =2794 BAC842 MOV DX,OFFSET FCB3 =2797 B116 MOV CL,MAKE =2799 CDE0 INT 224 =279B BAC842 MOV DX,OFFSET FCB3 =279E B10F MOV CL,OPEN =27A0 CDE0 INT 224 =27A2 BB0044 MOV BX,OFFSET BOTTRAM =27A5 2E891ECA41 MOV HLSAVE,BX =27AA 2EC606954100 MOV NFILFLG,0 =27B0 2EC606C64100 MOV LISTMOR,0 ;STOP ANY BUFFERED PRINTER OUTPUT =27B6 2EF606C641FF TERM: TEST LISTMOR,0FFH ;ANY BUFFERED PRINTER OUTPUT? =27BC 7403E8B803 27C1 JZ $+5 ! CALL GOLIST ;GO IF SO =27C1 E8A0FD 2564 CALL STAT ;KEYPRESS? =27C4 7503E9F102 27C9 JNZ $+5 ! JMP TERML ;NO, CHECK LINE =27C9 E8A7FD 2573 CALL KEYIN ;GET CHAR FROM KBD =27CC 3C20 CMP AL,' ' CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 64 =27CE 7203E9AF02 27D3 JC $+5 ! JMP NOTOG ;GO IF NOT CONTROL CHARACTER =27D3 8AE8 MOV CH,AL ;SAVE =27D5 3C08 CMP AL,BKSP ;TEST FOR BACKSPACE =27D7 750D 27E6 JNZ NOBKSP =27D9 2EF6060601FF TEST CONVBKSP,0FFH;CONVERT BACKSPACE TO RUB? =27DF 7405 27E6 JZ NOBKSP ;GO IF NO CONVERSION =27E1 B07F MOV AL,RUB =27E3 E99C02 2A82 JMP NOTOG =27E6 2EF606C141FF NOBKSP: TEST EXACFLG,0FFH ; EXACT ? =27EC 2EC606C14100 MOV EXACFLG,0 ;CLR FOR NEXT TIME =27F2 741D 2811 JZ NOTEXAFLG ;GO OF EXAFLG FALSE =27F4 2EF6060D01FF TEST LOCONEXTCHR,0FFH ;SHOULD WE SEND ON EXAFLG? =27FA 8AC5 MOV AL,CH =27FC 7503E98102 2801 JNZ $+5 ! JMP NOTOG ;YES, IF LOCONEXTCHR FALSE =2801 2EA02701 MOV AL,EXTCHR ;WE WANT TO SEND EXTCHR IN ANY CASE =2805 3AC5 CMP AL,CH =2807 8AC5 MOV AL,CH =2809 7503E97402 280E JNZ $+5 ! JMP NOTOG ;SEND IF EXTCHR =280E E91800 2829 JMP LOCCHK ;OTHERWISE DO LOCAL STUFF = NOTEXAFLG: =2811 2EA02701 MOV AL,EXTCHR ;TREAT NEXT CHARACTER IN SPECIAL WAY? =2815 3AC5 CMP AL,CH =2817 7503E92202 281C JNZ $+5 ! JMP EXTFLG ;YES, SET EXAFLG FOR NEXT CHAR =281C 2EA00D01 MOV AL,LOCONEXTCHR =2820 0AC0 OR AL,AL ;SHOULD WE SEND IF NOT EXAFLG =2822 8AC5 MOV AL,CH =2824 7403E95902 2829 JZ $+5 ! JMP NOTOG ;YES, IF LOCONEXTCHR TRUE =2829 2EA02101 LOCCHK: MOV AL,EXITCHR ;RETURN TO MENU? =282D 3AC5 CMP AL,CH =282F 7503E9C000 2834 JNZ $+5 ! JMP EXITMEN ;YES, RETURN TO MENU =2834 2EA02501 MOV AL,TRANCHR ;OUTPUT TEXT FILE TO REMOTE? =2838 3AC5 CMP AL,CH =283A 7503E83804 283F JNZ $+5 ! CALL TRANSFER ;SEND-A-FILE (BLIND SEND) =283F 7503E972FF 2844 JNZ $+5 ! JMP TERM ;LOOP =2844 2EA01801 MOV AL,TRANLOGON =2848 0AC0 OR AL,AL =284A 740B 2857 JZ SKPLOGON =284C 2EA02201 MOV AL,LOGCHR ;SEND LOGON? =2850 3AC5 CMP AL,CH =2852 7503E9C200 2857 JNZ $+5 ! JMP SENDLOG = SKPLOGON: =2857 2EA00F01 MOV AL,LSTTST =285B 0AC0 OR AL,AL =285D 7421 2880 JZ NOLST =285F 2EA02301 MOV AL,LSTCHR =2863 3AC5 CMP AL,CH =2865 7519 2880 JNZ NOLST =2867 2EA0C541 MOV AL,LISTFLG =286B F6D0 NOT AL =286D 2EA2C541 MOV LISTFLG,AL =2871 E8D2FC 2546 CALL CRLF =2874 E8CFFC 2546 CALL CRLF CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 65 =2877 E8D701 2A51 CALL LSTMSG =287A E8C9FC 2546 CALL CRLF =287D E93A02 2ABA JMP TERML =2880 2EA02401 NOLST: MOV AL,UNSAVECHR ;CLOSE INPUT BUFFER? =2884 3AC5 CMP AL,CH =2886 741D 28A5 JZ S2A ;IF YES, DISABLE COPY =2888 2EA02601 MOV AL,SAVECHR ;OPEN INPUT BUFFER? =288C 3AC5 CMP AL,CH =288E 8AC5 MOV AL,CH ;RESTORE CHARACTER TYPED =2890 7403E9ED01 2895 JZ $+5 ! JMP NOTOG =2895 2EA09541 MOV AL,NFILFLG ;DO NOT ALLOW SAVE IF.. =2899 3CFF CMP AL,TRUE ;..THIS FLAG IS SET. =289B 7503E91A02 28A0 JNZ $+5 ! JMP TERML =28A0 B0FF MOV AL,TRUE ;0FFH -- ALLOW COPY INTO FILE =28A2 E90200 28A7 JMP S2B =28A5 B000 S2A: MOV AL,FALSE ;0 -- STOP COPY INTO FILE =28A7 2EA2BE41 S2B: MOV SAVEFLG,AL =28AB E80300 28B1 CALL BUFMSG =28AE E90902 2ABA JMP TERML = ; =28B1 E861FD 2615 BUFMSG: CALL ILPRT =28B4 0D0A0A2A2A20 DB CR,LF,LF,'** Memory buffer ',0 4D656D6F7279 206275666665 722000 =28C9 2EF606BE41FF TEST SAVEFLG,0FFH =28CF 7411 28E2 JZ BUFMSG2 =28D1 E841FD 2615 CALL ILPRT =28D4 6F70656E202A DB 'open **',CR,LF,LF,':',BELL,0 2A0D0A0A3A07 00 =28E1 C3 RET = ; = BUFMSG2: =28E2 E830FD 2615 CALL ILPRT =28E5 636C6F736564 DB 'closed **',CR,LF,LF,BELL,0 202A2A0D0A0A 0700 =28F3 C3 RET = ; = EXITMEN: =28F4 E84FFC 2546 CALL CRLF =28F7 E8C4DC 05BE CALL CLREOS ;CLEAR TO END OF SCREEN TO CLEAN UP ANY MESS =28FA E9F6E2 0BF3 JMP MENU0 = ; = SENDREADY: =28FD E8D3DC 05D3 CALL INMODCTLP =2900 E800DD 0603 CALL ANIMODSNDB =2903 E80DDD 0613 CALL CPIMODSNDR =2906 C3 RET = ; =2907 E8F3FF 28FD SENDLF: CALL SENDREADY CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 66 =290A 7505 2911 JNZ NOLFYET ;GO IF NOT READY FOR OUTPUT YET =290C B00A MOV AL,LF =290E E97101 2A82 JMP NOTOG ;SEND LF = NOLFYET: =2911 E85200 2966 CALL EXITTEST =2914 73DE 28F4 JNC EXITMEN ;GO IF SO, SO DON'T GET HUNG UP =2916 E9EEFF 2907 JMP SENDLF ;ELSE KEEP TRYING TO SEND LF = ; = SENDLOG: =2919 53 PUSH BX =291A E847FC 2564 SNDLG2: CALL STAT =291D 74FB 291A JZ SNDLG2 =291F E851FC 2573 CALL KEYIN =2922 E881FC 25A6 CALL UCASE =2925 3C4C CMP AL,'L' ;TEST IF LIST OF STRINGS REQUESTED =2927 7454 297D JZ GIVESTRS =2929 2C30 SUB AL,'0' =292B 3C0A CMP AL,10 =292D 732F 295E JNC ENDLOG =292F 02C0 ADD AL,AL ;X2 =2931 02C0 ADD AL,AL ;X4 =2933 02C0 ADD AL,AL ;X8 =2935 02C0 ADD AL,AL ;X16 =2937 8AD0 MOV DL,AL =2939 B600 MOV DH,0 =293B 52 PUSH DX =293C 5B POP BX =293D 03DA ADD BX,DX ;X32 IN HL =293F BA4B01 MOV DX,OFFSET STRINGS ;DE POINTS TO START OF STRINGS =2942 03DA ADD BX,DX =2944 E8B6FF 28FD LOGLP: CALL SENDREADY =2947 750D 2956 JNZ NOSENDLOG ;GO IF NOT READY =2949 8A07 MOV AL,BYTE PTR [BX] ;GET LOGON BYTE =294B 43 INC BX =294C 3C00 CMP AL,0 ;IS IT THE END? =294E 740E 295E JZ ENDLOG ;GO IF SO =2950 E890DC 05E3 CALL OUTMODDATP =2953 E9EEFF 2944 JMP LOGLP = NOSENDLOG: =2956 E80D00 2966 CALL EXITTEST ;TEST SO DON'T GET HUNG UP =2959 7307 2962 JNC EXITLOG ;GO IF OPERATOR WANTS EXIT =295B E9E6FF 2944 JMP LOGLP = ; =295E 5B ENDLOG: POP BX =295F E95801 2ABA JMP TERML = ; = EXITLOG: =2962 5B POP BX =2963 E98EFF 28F4 JMP EXITMEN = ; = EXITTEST: =2966 E8FBFB 2564 CALL STAT ;KEYPRESS? CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 67 =2969 7410 297B JZ NOKEY =296B E805FC 2573 CALL KEYIN =296E 8AE8 MOV CH,AL =2970 2EA02101 MOV AL,EXITCHR ;SEE IF OPERATOR WANTS EXIT =2974 3AC5 CMP AL,CH =2976 7503 297B JNZ NOKEY ;GO IF WRONG KEY =2978 F9 STC =2979 F5 CMC ;RESET FOR EXIT =297A C3 RET =297B F9 NOKEY: STC ;SET FOR NO KEY OR WRONG KEY =297C C3 RET = ; = GIVESTRS: =297D E895FC 2615 CALL ILPRT =2980 0D0A20202020 DB CR,LF,' List of Strings',CR,LF,LF,LF,0 4C697374206F 662053747269 6E67730D0A0A 0A00 =299A BB4B01 MOV BX,OFFSET STRINGS =299D 2E891ED041 MOV STRSAVE,BX =29A2 B530 MOV CH,'0' = GVSTRS1: =29A4 8AC5 MOV AL,CH =29A6 E8AAFB 2553 CALL TIPE =29A9 E869FC 2615 CALL ILPRT =29AC 20203D202000 DB ' = ',0 =29B2 2E8B1ED041 MOV BX,STRSAVE =29B7 8A07 MOV AL,BYTE PTR [BX] =29B9 3C00 CMP AL,0 =29BB 7516 29D3 JNZ NONULL =29BD E855FC 2615 CALL ILPRT =29C0 2A206E756C6C DB '* null string *',0 20737472696E 67202A00 =29D0 E92200 29F5 JMP GVSTRS2 =29D3 2E8B1ED041 NONULL: MOV BX,STRSAVE =29D8 8A07 NONUL2: MOV AL,BYTE PTR [BX] =29DA 3C00 CMP AL,0 =29DC 7417 29F5 JZ GVSTRS2 =29DE 3C0D CMP AL,CR =29E0 7403E86EFB 29E5 JZ $+5 ! CALL TIPE =29E5 750A 29F1 JNZ NOTACR =29E7 53 PUSH BX =29E8 E82AFC 2615 CALL ILPRT =29EB 3C43523E00 DB '',0 =29F0 5B POP BX =29F1 43 NOTACR: INC BX =29F2 E9E3FF 29D8 JMP NONUL2 = ; = GVSTRS2: =29F5 B039 MOV AL,'9' CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 68 =29F7 3AC5 CMP AL,CH =29F9 7417 2A12 JZ GVSTRS3 =29FB FEC5 INC CH =29FD 2E8B1ED041 MOV BX,STRSAVE =2A02 BA2000 MOV DX,OFFSET 32 =2A05 03DA ADD BX,DX =2A07 2E891ED041 MOV STRSAVE,BX =2A0C E837FB 2546 CALL CRLF =2A0F E992FF 29A4 JMP GVSTRS1 = ; = GVSTRS3: =2A12 E800FC 2615 CALL ILPRT =2A15 0D0A0A456E74 DB CR,LF,LF,'Enter number to transmit string',CR,LF,0 6572206E756D 62657220746F 207472616E73 6D6974207374 72696E670D0A 00 =2A3A 5B POP BX =2A3B E9DBFE 2919 JMP SENDLOG = ; =2A3E B0FF EXTFLG: MOV AL,TRUE =2A40 2EA2C141 MOV EXACFLG,AL =2A44 E97300 2ABA JMP TERML = ; = RCVREADY: =2A47 E889DB 05D3 CALL INMODCTLP =2A4A E8D6DB 0623 CALL ANIMODRCVB =2A4D E8E3DB 0633 CALL CPIMODRCVR =2A50 C3 RET = ; =2A51 2EA0C541 LSTMSG: MOV AL,LISTFLG =2A55 0AC0 OR AL,AL =2A57 7414 2A6D JZ LSTMSG2 =2A59 E8B9FB 2615 CALL ILPRT =2A5C 5072696E7465 DB 'Printer is on',CR,LF,0 72206973206F 6E0D0A00 =2A6C C3 RET = LSTMSG2: =2A6D E8A5FB 2615 CALL ILPRT =2A70 5072696E7465 DB 'Printer is off',CR,LF,0 72206973206F 66660D0A00 =2A81 C3 RET = ; =2A82 50 NOTOG: PUSH AX = NOTOG1: =2A83 E877FE 28FD CALL SENDREADY =2A86 75FB 2A83 JNZ NOTOG1 =2A88 58 POP AX CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 69 =2A89 E857DB 05E3 CALL OUTMODDATP =2A8C 8AE8 MOV CH,AL =2A8E 2EA0C341 MOV AL,LOCFLG =2A92 0AC0 OR AL,AL =2A94 7508 2A9E JNZ LTYPE =2A96 2EA0C241 MOV AL,ECHOFLG =2A9A 0AC0 OR AL,AL =2A9C 740B 2AA9 JZ CHKCR =2A9E 8AC5 LTYPE: MOV AL,CH =2AA0 E8B0FA 2553 CALL TIPE =2AA3 E86000 2B06 CALL CHKSAVE ;TO STORE LOCAL IF BUFFER OPEN =2AA6 E88B00 2B34 CALL CHKPRNT =2AA9 B00D CHKCR: MOV AL,CR =2AAB 3AC5 CMP AL,CH =2AAD 750B 2ABA JNZ TERML =2AAF 2EA00801 MOV AL,ADDLF =2AB3 0AC0 OR AL,AL =2AB5 7403 2ABA JZ TERML =2AB7 E94DFE 2907 JMP SENDLF = ; =2ABA E88AFF 2A47 TERML: CALL RCVREADY ;TEST FOR RECEIVED CHARACTER =2ABD 7403E9F4FC 2AC2 JZ $+5 ! JMP TERM =2AC2 E82EDB 05F3 CALL INMODDATP =2AC5 247F AND AL,7FH ;STRIP PARITY =2AC7 7503E9EAFC 2ACC JNZ $+5 ! JMP TERM =2ACC 8AE8 GIVLF: MOV CH,AL =2ACE E882FA 2553 CALL TIPE =2AD1 E83200 2B06 CALL CHKSAVE =2AD4 E85D00 2B34 CALL CHKPRNT =2AD7 2EA0C241 MOV AL,ECHOFLG =2ADB 0AC0 OR AL,AL =2ADD 7405 2AE4 JZ NOECHO =2ADF 8AC5 MOV AL,CH =2AE1 E8FFDA 05E3 CALL OUTMODDATP =2AE4 B00D NOECHO: MOV AL,CR =2AE6 3AC5 CMP AL,CH =2AE8 7403E9C9FC 2AED JZ $+5 ! JMP TERM =2AED 2EA00801 MOV AL,ADDLF =2AF1 7503E9C0FC 2AF6 JNZ $+5 ! JMP TERM =2AF6 2EA0C241 MOV AL,ECHOFLG =2AFA 0AC0 OR AL,AL =2AFC 7403E906FE 2B01 JZ $+5 ! JMP SENDLF =2B01 B00A MOV AL,LF =2B03 E9C6FF 2ACC JMP GIVLF = ; = CHKSAVE: =2B06 2EA0BE41 MOV AL,SAVEFLG =2B0A 0AC0 OR AL,AL =2B0C 7501C3 2B0F JNZ $+3 ! RET =2B0F 882F MOV BYTE PTR [BX],CH =2B11 43 INC BX =2B12 2E891ECA41 MOV HLSAVE,BX ;MENU COMMAND DESTROYS HL-REG.. CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 70 =2B17 B00A MOV AL,LF =2B19 3AC5 CMP AL,CH =2B1B 7505 2B22 JNZ NOCOLON ;..TYPE ":" AFTER EACH LINE FEED.. =2B1D B03A MOV AL,':' ;..WHEN MEMORY SAVE ACTIVE. =2B1F E831FA 2553 CALL TIPE = NOCOLON: =2B22 E80A00 2B2F CALL GETMAX =2B25 3AC7 CMP AL,BH =2B27 51 PUSH CX =2B28 7503E88700 2B2D JNZ $+5 ! CALL INTDSKSV =2B2D 59 POP CX =2B2E C3 RET = ; =2B2F B087 GETMAX: MOV AL,XAST SHR 8 =2B31 FEC8 DEC AL ;..OR BDOS HAS BEEN.. =2B33 C3 RET ;..REACHED AND DISKSAVE IS NEEDED. = ; = CHKPRNT: =2B34 2EF606C541FF TEST LISTFLG,0FFH ;OUT TO PRINTER? =2B3A 7501C3 2B3D JNZ $+3 ! RET ;RETURN IF NOT =2B3D 2EF6069541FF TEST NFILFLG,0FFH ;IS BUFFER USED FOR FILE? =2B43 7428 2B6D JZ NOBUFF ;DON'T BUFFER PRINTER IF SO, HOWEVER CHARACTERS = ;WILL BE LOST IF PRINTER IS SLOWER THAN MODEM =2B45 E8E7FF 2B2F CALL GETMAX ;GET MAXIMUM FOR BUFFER =2B48 2E8B1ECC41 MOV BX,HLSAVE1 =2B4D 3AC7 CMP AL,BH ;ARE WE THERE? =2B4F 750D 2B5E JNZ NOTMAX ;GO IF NOT =2B51 BB0044 MOV BX,OFFSET BOTTRAM ;FLUSH BUFFER =2B54 2E891ECC41 MOV HLSAVE1,BX =2B59 2E891ECE41 MOV HLSAVE2,BX = NOTMAX: =2B5E 882F MOV BYTE PTR [BX],CH ;SAVE CHARACTER IN BUFFER =2B60 43 INC BX ;INCREMENT END OF BUFFER =2B61 2E891ECC41 MOV HLSAVE1,BX =2B66 B0FF MOV AL,TRUE ;SET FLAG FOR PRINTER OUTPUT =2B68 2EA2C641 MOV LISTMOR,AL =2B6C C3 RET = ; = NOBUFF: =2B6D E821FA 2591 CALL LSTSTAT =2B70 7501C3 2B73 JNZ $+3 ! RET ;RETURN IF PRINTER BUSY =2B73 8ACD MOV CL,CH ;ELSE PRINT CHARACTER =2B75 E80CFA 2584 CALL LISTER =2B78 C3 RET = ; = GOLIST: =2B79 E815FA 2591 CALL LSTSTAT =2B7C 7501C3 2B7F JNZ $+3 ! RET ;RETURN IF PRINTER BUSY =2B7F 2E8B1ECE41 MOV BX,HLSAVE2 ;GET LOCATION OF NEXT CHARACTER TO PRINT =2B84 8A0F MOV CL,BYTE PTR [BX] ;GET CHARACTER =2B86 43 INC BX ;INCREMENT POINTER =2B87 2E891ECE41 MOV HLSAVE2,BX CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 71 =2B8C E80400 2B93 CALL CMPBUFF ;CHECK FOR END OF BUFFER =2B8F E8F2F9 2584 CALL LISTER ;PRINT =2B92 C3 RET = ; = ;ROUTINE CHECKS FOR END OF BUFFER, RESETS BUFFER IF SO AND STOPS = ;PRINTER OUTPUT = ; = CMPBUFF: =2B93 2E8B1ECE41 MOV BX,HLSAVE2 =2B98 2E3B1ECC41 CMP BX,HLSAVE1 =2B9D 7401C3 2BA0 JZ $+3 ! RET =2BA0 BB0044 MOV BX,OFFSET BOTTRAM =2BA3 2E891ECC41 MOV HLSAVE1,BX =2BA8 2E891ECE41 MOV HLSAVE2,BX =2BAD 2EC606C64100 MOV LISTMOR,0 =2BB3 C3 RET = ; = INTDSKSV: =2BB4 B013 MOV AL,XOFF ;SEND A CTRL-S TO STOP.. =2BB6 E82ADA 05E3 CALL OUTMODDATP ;..REMOTE COMPUTER OUTPUT. =2BB9 B600 MOV DH,0 ;D IS THE BUFFER COUNT =2BBB E83A00 2BF8 CALL INMODEM ;GET LAST BYTES SENT.. =2BBE 2EA2BF41 MOV LASTBYT1,AL ;..AFTER CTRL-S. =2BC2 E83300 2BF8 CALL INMODEM ;ADD MORE CALLS TO INMODEM.. =2BC5 2EA2C041 MOV LASTBYT2,AL ;..AND STA LASTBYT# IF YOU ARE.. =2BC9 52 PUSH DX =2BCA E85100 2C1E CALL NUMREC1 =2BCD E86800 2C38 CALL WRTDSK ;WRITE THE RECORDS =2BD0 5A POP DX =2BD1 BB0044 MOV BX,OFFSET BOTTRAM =2BD4 FEC6 INC DH =2BD6 FECE DEC DH ;TEST BUFFER COUNT FOR ZERO =2BD8 7418 2BF2 JZ CTRLQ =2BDA 2EA0BF41 MOV AL,LASTBYT1 ;GET THE LAST BYTES THAT WERE.. =2BDE 8807 MOV BYTE PTR [BX],AL ;..SAVED AND PUT THEM IN.. =2BE0 43 INC BX ;..BOTTRAM. =2BE1 E86FF9 2553 CALL TIPE =2BE4 FECE DEC DH =2BE6 740A 2BF2 JZ CTRLQ =2BE8 2EA0C041 MOV AL,LASTBYT2 =2BEC 8807 MOV BYTE PTR [BX],AL =2BEE 43 INC BX =2BEF E861F9 2553 CALL TIPE = CTRLQ: =2BF2 B011 MOV AL,XON ;SEND START CHARACTER.. =2BF4 E8ECD9 05E3 CALL OUTMODDATP ;..TO REMOTE COMPUTER. =2BF7 C3 RET = ; = ;THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER = ;OR 100 MILLISECONDS. IF A CHARACTER IS RECEIVED, A FLAG IS SET = ;TO STORE THE CHARACTER. A MAXIMUM OF TWO CHARACTERS ARE STORED, = ;BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSKSV" CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 72 = ;ABOVE). = ; = INMODEM: =2BF8 53 PUSH BX =2BF9 BB7102 MOV BX,OFFSET 625 =2BFC E8CFDF 0BCE CALL FIXCNT =2BFF 53 PUSH BX =2C00 59 POP CX =2C01 5B POP BX = TIMERL: =2C02 E842FE 2A47 CALL RCVREADY =2C05 7408 2C0F JZ GETBYTE =2C07 49 DEC CX =2C08 8AC5 MOV AL,CH =2C0A 0AC1 OR AL,CL =2C0C 75F4 2C02 JNZ TIMERL =2C0E C3 RET = ; = GETBYTE: =2C0F E8E1D9 05F3 CALL INMODDATP =2C12 FEC6 INC DH =2C14 C3 RET = ; = NUMRECS: =2C15 C6071A MOV BYTE PTR [BX],EOFCHAR =2C18 43 INC BX =2C19 BA7F00 MOV DX,OFFSET 127 =2C1C 03DA ADD BX,DX = NUMREC1: =2C1E BA00BC MOV DX,-(OFFSET BOTTRAM) =2C21 03DA ADD BX,DX =2C23 8AC3 MOV AL,BL ;DIVIDE HL BY 128.. =2C25 0AC0 OR AL,AL =2C27 D0D0 RCL AL,1 ;..TO GET THE.. =2C29 8ADF MOV BL,BH ;..NUMBER OF SECTORS =2C2B B700 MOV BH,0 =2C2D 50 PUSH AX =2C2E 03DB ADD BX,BX =2C30 58 POP AX =2C31 B000 MOV AL,0 =2C33 12C3 ADC AL,BL =2C35 8AD8 MOV BL,AL ;RETURNS WITH NUMBER OF.. =2C37 C3 RET ;..128 BYTE RECORDS IN HL. = ; =2C38 BA0044 WRTDSK: MOV DX,OFFSET BOTTRAM = NEXTWRT: =2C3B B11A MOV CL,STDMA =2C3D E81A00 2C5A CALL BDOSRT =2C40 52 PUSH DX =2C41 BAC842 MOV DX,OFFSET FCB3 =2C44 B115 MOV CL,WRITE =2C46 E81100 2C5A CALL BDOSRT CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 73 =2C49 5A POP DX =2C4A 81C28000 ADD DX,128 =2C4E 4B DEC BX =2C4F 75EA 2C3B JNZ NEXTWRT =2C51 C3 RET = ; =2C52 BAC842 CLOSE3: MOV DX,OFFSET FCB3 =2C55 B110 MOV CL,CLOSE =2C57 CDE0 INT 224 =2C59 C3 RET = ; = BDOSRT: =2C5A 51 PUSH CX =2C5B 52 PUSH DX =2C5C 53 PUSH BX =2C5D 50 PUSH AX =2C5E CDE0 INT 224 =2C60 58 POP AX =2C61 5B POP BX =2C62 5A POP DX =2C63 59 POP CX =2C64 C3 RET = ; = MOVE2: =2C65 BBC842 MOV BX,OFFSET FCB3 =2C68 E84201 2DAD CALL INITFCBS =2C6B BB5C00 MOV BX,OFFSET FCB =2C6E BAC842 MOV DX,OFFSET FCB3 =2C71 B50C MOV CH,12 =2C73 E86DDF 0BE3 CALL MOVE =2C76 C3 RET = ; = ;FILE TRANSFER ROUTINE - CALLED WITH = ;CONTROL-T FROM TERMINAL ROUTINE. = ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X. = ; = TRANSFER: =2C77 53 PUSH BX =2C78 52 PUSH DX =2C79 51 PUSH CX =2C7A 50 PUSH AX =2C7B BBE942 MOV BX,OFFSET FCB4 =2C7E E82C01 2DAD CALL INITFCBS ;INITIALIZES FCBS POINTED.. =2C81 BB6C00 MOV BX,OFFSET FCB+16 ;..TO BY HL REG. =2C84 E82601 2DAD CALL INITFCBS = GET: =2C87 E83C01 2DC6 CALL GETNAME =2C8A 2EA0D441 MOV AL,CMDBUF+2 ;WAS FILE ENTERED =2C8E 3C20 CMP AL,20H =2C90 742B 2CBD JZ TRANSL2 =2C92 E87401 2E09 CALL MOVE4 =2C95 E87B01 2E13 CALL OPEN4 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 74 =2C98 3CFF CMP AL,0FFH ;RETURN WITH 0FFH MEANS =2C9A 757B 2D17 JNZ CONTIN ;FILE DOES NOT EXIST = TRANSL1: =2C9C E876F9 2615 CALL ILPRT =2C9F 0D0A2B2B2046 DB CR,LF,'++ File does not exist ++',CR,LF,0 696C6520646F 6573206E6F74 206578697374 202B2B0D0A00 = TRANSL2: =2CBD E855F9 2615 CALL ILPRT =2CC0 547970652022 DB 'Type "R" to return to modem',CR,LF 522220746F20 72657475726E 20746F206D6F 64656D0D0A =2CDD 547970652022 DB 'Type "A" to re-enter name: ',BELL,0 412220746F20 72652D656E74 6572206E616D 653A200700 =2CFA E876F8 2573 CALL KEYIN =2CFD E8A6F8 25A6 CALL UCASE =2D00 E850F8 2553 CALL TIPE ;ECHO RESPONSE =2D03 E840F8 2546 CALL CRLF =2D06 3C41 CMP AL,'A' =2D08 7503E97AFF 2D0D JNZ $+5 ! JMP GET =2D0D 3C52 CMP AL,'R' =2D0F 7503E99400 2D14 JNZ $+5 ! JMP RETURN =2D14 E9A6FF 2CBD JMP TRANSL2 = ; = CONTIN: =2D17 BA8000 MOV DX,OFFSET 80H =2D1A B11A MOV CL,STDMA =2D1C CDE0 INT 224 = READMR: =2D1E E8FA00 2E1B CALL READ80 =2D21 3C01 CMP AL,1 ;END OF FILE =2D23 7412 2D37 JZ RETURNS =2D25 3C02 CMP AL,2 ;BAD READ =2D27 7431 2D5A JZ RETURNU =2D29 E8F700 2E23 CALL SEND80C =2D2C 3C1A CMP AL,EOFCHAR ;END OF FILE - OMIT IF OBJECT.. =2D2E 7407 2D37 JZ RETURNS ;..CODE IS TO BE SENT. =2D30 3C18 CMP AL,CAN ;CANCELLATION? =2D32 7452 2D86 JZ TRANCAN =2D34 E9E7FF 2D1E JMP READMR = ; = RETURNS: =2D37 E8DBF8 2615 CALL ILPRT =2D3A 0D0A46696C65 DB CR,LF,'File transfer completed',CR,LF,BELL,0 207472616E73 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 75 66657220636F 6D706C657465 640D0A0700 =2D57 E94E00 2DA8 JMP RETURN = ; = RETURNU: =2D5A E8B8F8 2615 CALL ILPRT =2D5D 0D0A2B2B2046 DB CR,LF,'++ File transfer unsuccessful ++',CR,LF,BELL,0 696C65207472 616E73666572 20756E737563 636573736675 6C202B2B0D0A 0700 =2D83 E92200 2DA8 JMP RETURN = ; = TRANCAN: =2D86 E88CF8 2615 CALL ILPRT =2D89 0D0A0A2B2B20 DB CR,LF,LF,'++ Transfer cancelled ++',CR,LF,BELL,0 5472616E7366 65722063616E 63656C6C6564 202B2B0D0A07 00 = RETURN: =2DA8 58 POP AX =2DA9 59 POP CX =2DAA 5A POP DX =2DAB 5B POP BX =2DAC C3 RET = ; = INITFCBS: ;ENTRY AT +2 WILL LEAVE.. =2DAD C60700 MOV BYTE PTR [BX],0 ;..DRIVE NO. INTACT. =2DB0 43 INC BX ;WILL INITIALIZE AN FCB.. =2DB1 B50B MOV CH,11 ;..POINTED TO BY HL-REG. FILLS 1ST POS = LOOP10: =2DB3 C60720 MOV BYTE PTR [BX],' ' ;..WITH 0, NEXT 11 WITH.. =2DB6 43 INC BX ;..WITH BLANKS, AND LAST.. =2DB7 FECD DEC CH ;..21 WITH NULLS. =2DB9 75F8 2DB3 JNZ LOOP10 =2DBB B515 MOV CH,21 = LOOP11: =2DBD C60700 MOV BYTE PTR [BX],0 =2DC0 43 INC BX =2DC1 FECD DEC CH =2DC3 75F8 2DBD JNZ LOOP11 =2DC5 C3 RET = ; = GETNAME: =2DC6 E84CF8 2615 CALL ILPRT =2DC9 0D0A456E7465 DB CR,LF,'Enter file name to be transferred - TO QUIT: ',0 722066696C65 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 76 206E616D6520 746F20626520 7472616E7366 657272656420 2D20203C4352 3E20544F2051 5549543A2000 =2DFF BAD241 MOV DX,OFFSET CMDBUF =2E02 E832F8 2637 CALL INBUFF =2E05 E83EF7 2546 CALL CRLF =2E08 C3 RET = ; = MOVE4: =2E09 BAD241 MOV DX,OFFSET CMDBUF =2E0C BBE942 MOV BX,OFFSET FCB4 =2E0F E82BF8 263D CALL CPMLINE =2E12 C3 RET = ; = OPEN4: =2E13 BAE942 MOV DX,OFFSET FCB4 =2E16 B10F MOV CL,OPEN =2E18 CDE0 INT 224 =2E1A C3 RET = ; = READ80: =2E1B BAE942 MOV DX,OFFSET FCB4 =2E1E B114 MOV CL,READ =2E20 CDE0 INT 224 =2E22 C3 RET = ; = SEND80C: =2E23 B580 MOV CH,80H =2E25 BB8000 MOV BX,OFFSET 80H = SENDCH1: =2E28 52 PUSH DX =2E29 E87A00 2EA6 CALL SPEED =2E2C 5A POP DX =2E2D 8A07 MOV AL,BYTE PTR [BX] =2E2F 3C1A CMP AL,EOFCHAR =2E31 750B 2E3E JNZ SENDCH2 =2E33 2EA01401 MOV AL,EOFSEND =2E37 0AC0 OR AL,AL =2E39 7501C3 2E3C JNZ $+3 ! RET =2E3C 8A07 MOV AL,BYTE PTR [BX] = SENDCH2: =2E3E E81A00 2E5B CALL MODOUT =2E41 3C1A CMP AL,EOFCHAR =2E43 7501C3 2E46 JNZ $+3 ! RET =2E46 E81BF7 2564 CALL STAT ;TEST TO SEE IF =2E49 0AC0 OR AL,AL ;CANCELLATION REQUESTED =2E4B 7408 2E55 JZ SKIP12 =2E4D E823F7 2573 CALL KEYIN CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 77 =2E50 3C18 CMP AL,CAN =2E52 7501C3 2E55 JNZ $+3 ! RET =2E55 43 SKIP12: INC BX =2E56 FECD DEC CH =2E58 75CE 2E28 JNZ SENDCH1 =2E5A C3 RET = ; =2E5B 50 MODOUT: PUSH AX = MODOUTL: =2E5C 2EA01001 MOV AL,XOFFTST =2E60 0AC0 OR AL,AL =2E62 7403E89300 2E67 JZ $+5 ! CALL TXOFF =2E67 E893FA 28FD CALL SENDREADY =2E6A 75F0 2E5C JNZ MODOUTL =2E6C 2EA00A01 MOV AL,STRLF =2E70 0AC0 OR AL,AL =2E72 7406 2E7A JZ NOLFTST =2E74 58 POP AX =2E75 50 PUSH AX =2E76 3C0A CMP AL,LF =2E78 7414 2E8E JZ NOTMOUT = NOLFTST: =2E7A 58 POP AX =2E7B 50 PUSH AX =2E7C 2EA25742 MOV SAVEOUT,AL ;SAVE OUTPUT FOR POSSIBLE ECHO TEST =2E80 E860D7 05E3 CALL OUTMODDATP =2E83 2EA01301 MOV AL,ECHWAIT ;DO WE WANT TO TEST FOR ECHOED CHARACTER? =2E87 0AC0 OR AL,AL =2E89 7403E8A000 2E8E JZ $+5 ! CALL WAITECHO ;GO IF SO = NOTMOUT: =2E8E 58 POP AX =2E8F E8C1F6 2553 CALL TIPE =2E92 3C0D CMP AL,CR =2E94 7401 2E97 JZ DLYCR =2E96 C3 RET = ; =2E97 2EA01101 DLYCR: MOV AL,XONWAIT ;WAIT FOR XON AFTER CR? =2E9B 0AC0 OR AL,AL =2E9D 756E 2F0D JNZ WAITXON =2E9F 2EA01E01 MOV AL,CRDLY ;EXTRA DELAY AFTER CR =2EA3 E90400 2EAA JMP DLYCR2 = ; =2EA6 2EA01D01 SPEED: MOV AL,BYTDLY ;GET SPEED VALUE (0-9) = ;DELAY IS FROM 0.02 SEC FOR SPDVAL = 1 = ;TO 0.18 SEC FOR SPDVAL = 9 =2EAA 0AC0 DLYCR2: OR AL,AL =2EAC 7501C3 2EAF JNZ $+3 ! RET ;RETURN IF 0 =2EAF 8AC8 MOV CL,AL =2EB1 E80800 2EBC SPDLP: CALL SPD1 ;OUTER LOOP =2EB4 FEC9 DEC CL =2EB6 7501C3 2EB9 JNZ $+3 ! RET =2EB9 E9F5FF 2EB1 JMP SPDLP CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 78 = ; =2EBC 53 SPD1: PUSH BX =2EBD BB6501 MOV BX,OFFSET 357 ;ABOUT 0.02 SEC =2EC0 2EA01001 MOV AL,XOFFTST =2EC4 0AC0 OR AL,AL =2EC6 7416 2EDE JZ SPD2 =2EC8 BB6600 MOV BX,OFFSET 102 ;ADJUST FOR XOFF TESTING =2ECB 2EA0C241 MOV AL,ECHOFLG =2ECF 0AC0 OR AL,AL =2ED1 740B 2EDE JZ SPD2 =2ED3 2EA0C341 MOV AL,LOCFLG =2ED7 0AC0 OR AL,AL =2ED9 7403 2EDE JZ SPD2 =2EDB BB4C00 MOV BX,OFFSET 76 ;ADJUST AGAIN FOR REMOTE ECHO =2EDE E8EDDC 0BCE SPD2: CALL FIXCNT =2EE1 53 PUSH BX =2EE2 5A POP DX =2EE3 5B POP BX =2EE4 4A SPDLP1: DEC DX ;INNER LOOP =2EE5 2EA01001 MOV AL,XOFFTST =2EE9 0AC0 OR AL,AL =2EEB 7403E80A00 2EF0 JZ $+5 ! CALL TXOFF =2EF0 8AC2 MOV AL,DL =2EF2 0AC6 OR AL,DH =2EF4 7501C3 2EF7 JNZ $+3 ! RET =2EF7 E9EAFF 2EE4 JMP SPDLP1 = ; =2EFA E84AFB 2A47 TXOFF: CALL RCVREADY =2EFD 7401C3 2F00 JZ $+3 ! RET =2F00 E8F0D6 05F3 CALL INMODDATP =2F03 247F AND AL,7FH =2F05 3C13 CMP AL,XOFF =2F07 7503E80100 2F0C JNZ $+5 ! CALL WAITXON =2F0C C3 RET = ; = WAITXON: =2F0D E837FB 2A47 CALL RCVREADY =2F10 750A 2F1C JNZ WTXON2 =2F12 E8DED6 05F3 CALL INMODDATP =2F15 247F AND AL,7FH =2F17 3C11 CMP AL,XON =2F19 7501C3 2F1C JNZ $+3 ! RET =2F1C E845F6 2564 WTXON2: CALL STAT ;TEST TO SEE IF =2F1F 0AC0 OR AL,AL ;CANCELLATION REQUESTED =2F21 74EA 2F0D JZ WAITXON ;SO DON'T GET HUNG UP =2F23 E84DF6 2573 CALL KEYIN =2F26 3C18 CMP AL,CAN =2F28 7501C3 2F2B JNZ $+3 ! RET =2F2B E9DFFF 2F0D JMP WAITXON = ; = WAITECHO: =2F2E B032 MOV AL,50 ;1 SECOND MAXIMUM DELAY WAITING FOR ECHO CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 79 =2F30 2EA25842 MOV MECHDLY,AL =2F34 E810FB 2A47 WTECH1: CALL RCVREADY ;IS THERE INPUT? =2F37 751F 2F58 JNZ WTECH2 ;GO IF NOT =2F39 E8B7D6 05F3 CALL INMODDATP ;GET INPUT =2F3C 247F AND AL,7FH =2F3E 8AC8 MOV CL,AL ;SAVE INPUT =2F40 2EA05742 MOV AL,SAVEOUT ;GET OUTPUT =2F44 3AC1 CMP AL,CL ;ARE THEY THE SAME? =2F46 7501C3 2F49 JNZ $+3 ! RET ;RETURN IF SO =2F49 2EA05742 MOV AL,SAVEOUT ;GET OUTPUT =2F4D 3C09 CMP AL,TAB ;CHECK IF TAB =2F4F 7507 2F58 JNZ WTECH2 ;GO IF NOT =2F51 B020 MOV AL,SPACE ;MAYBE REMOTE CONVERTS TABS TO SPACES =2F53 3AC1 CMP AL,CL =2F55 7501C3 2F58 JNZ $+3 ! RET ;RETURN IF SPACE ECHOED ON TAB OUTPUT =2F58 2EA05842 WTECH2: MOV AL,MECHDLY ;LOOP FOR 1 SECOND =2F5C FEC8 DEC AL =2F5E 2EA25842 MOV MECHDLY,AL =2F62 7501C3 2F65 JNZ $+3 ! RET =2F65 B001 MOV AL,1 ;0.02 SECOND =2F67 E840FF 2EAA CALL DLYCR2 =2F6A E9C7FF 2F34 JMP WTECH1 = ; = ; Check for any garbage characters on line. = ; =2F6D E8D7FA 2A47 CKMODM: CALL RCVREADY ;ANY CHARACTERS READY TO RECEIVE? =2F70 7401C3 2F73 JZ $+3 ! RET ;IF NOT, RETURN =2F73 E87DD6 05F3 CALL INMODDATP ;OTHERWISE GET THE CHARACTER AND IGNORE =2F76 E9F4FF 2F6D JMP CKMODM ;CHECK FOR ANY ADDITIONAL CHARACTERS = ; = INCLUDE a:SENDRECV.A86 = ; = ; SENDRECV.ASM = ; = ;Christensen protocol routines for MODEM9.xx. = ; = ;SEND A CP/M FILE = ; = SENDFIL: =2F79 2EC606C441FF MOV CKSUMFLG,TRUE ;ALWAYS FORCE CHECKSUM MODE INITIALLY ON SEND =2F7F E8EBFF 2F6D CALL CKMODM ;REMOVE GARBAGE FROM LINE = SENDFIL1: =2F82 2EF6069D41FF TEST BATCHFLG,0FFH;CHECK IF MULTIPLE FILE.. =2F88 7549 2FD3 JNZ SENDC1 =2F8A E888F6 2615 CALL ILPRT =2F8D 526561647920 DB 'Ready to send in the batch mode',CR,LF,0 746F2073656E 6420696E2074 686520626174 6368206D6F64 650D0A00 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 80 =2FAF 2EC6065942FF MOV SENDFLG,TRUE ;INDICATE SEND FOR BATCH MODE =2FB5 2EA0C741 MOV AL,FSTFLG ;IF FIRST TIME THRU.. =2FB9 0AC0 OR AL,AL ;..SCAN THE COMMAND LINE.. =2FBB 7403 2FC0 JZ L@200 =2FBD E80503 32C5 CALL TNMBUF ;..FOR MULTIPLE NAMES. = L@200: =2FC0 E82F01 30F2 CALL SENDFN ;SENDS FILE NAME TO RECEIVER =2FC3 7318 2FDD JNC SENDC2 ;CARRY SET MEANS NO MORE FILES. =2FC5 2EC6069D4142 MOV BATCHFLG,'B' ;STOP BATCH ....MODE OPTION. =2FCB B004 MOV AL,EOT ;FINAL XFER END =2FCD E8B308 3883 CALL SEND =2FD0 E9D609 39A9 JMP DONE = ; = SENDC1: =2FD3 803E5D0020 CMP BYTE PTR .FCB+1,' ' =2FD8 7503E9E30F 2FDD JNZ $+5 ! JMP BLKFILE = SENDC2: =2FDD E84010 4020 CALL CNREC ;GET NUMBER OF RECORDS =2FE0 E85510 4038 CALL OPENFIL =2FE3 B250 MOV DL,80 =2FE5 E8CA08 38B2 CALL WAITNAK = =2FE8 E8D807 37C3 SENDLP: CALL CKABORT ;WANT TO TERMINATE WHLE SENDING FILE? =2FEB E89A10 4088 CALL RDSECT =2FEE 722A 301A JC SENDEOF =2FF0 E83608 3829 CALL INCRSNO =2FF3 2EC606B44101 MOV ERRCT,1 = SENDRPT: =2FF9 E8C707 37C3 CALL CKABORT ;WANT TO TERMINATE WHILE SENDING FILE? =2FFC E87C06 367B CALL SENDHDR =2FFF E8BF06 36C1 CALL SENDSEC =3002 2EA0C441 MOV AL,CKSUMFLG =3006 0AC0 OR AL,AL =3008 7505 300F JNZ L@201 =300A E8D806 36E5 CALL SENDCRC =300D EB03 3012 JMPS L@202 =300F E8CD06 36DF L@201: CALL SENDCKS = L@202: =3012 E8E006 36F5 CALL GETACK =3015 72E2 2FF9 JC SENDRPT =3017 E9CEFF 2FE8 JMP SENDLP = ; = SENDEOF: =301A B004 MOV AL,EOT =301C E86408 3883 CALL SEND =301F E8D306 36F5 CALL GETACK =3022 72F6 301A JC SENDEOF =3024 E98209 39A9 JMP DONE = ; = ;RECEIVE A FILE = ; =3027 2EA00401 RCVFIL: MOV AL,CKSUMDFLT ;GET MODE REQUESTED BY OPERATOR CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 81 =302B 2EA2C441 MOV CKSUMFLG,AL ;STORE IT =302F E83BFF 2F6D CALL CKMODM ;CATCH ANY GARBAGE CHARACTERS = RCVFIL1: =3032 2EA09D41 MOV AL,BATCHFLG ;CHECK IF MULT.. =3036 0AC0 OR AL,AL ;..FILE MODE. =3038 7514 304E JNZ RCVC1 =303A B000 MOV AL,FALSE ;FLAG WHERE TO RETURN.. =303C 2EA25942 MOV SENDFLG,AL ;..FOR NEXT FILE TRANS. =3040 E87201 31B5 CALL GETFN ;GET THE FILE NAME. =3043 7316 305B JNC RCVC2 ;CARRY SET MEANS NO MORE FILES. =3045 B042 MOV AL,'B' ;STOP BATCH.. =3047 2EA29D41 MOV BATCHFLG,AL ;..MODE OPTION. =304B E95B09 39A9 JMP DONE = ; =304E A05D00 RCVC1: MOV AL,BYTE PTR .FCB+1 ;MAKE SURE FILE IS NAMED =3051 3C20 CMP AL,' ' =3053 7503E9680F 3058 JNZ $+5 ! JMP BLKFILE =3058 E90600 3061 JMP RCVC3 = ; =305B E82F0E 3E8D RCVC2: CALL CKCPM2 =305E E8B00E 3F11 CALL CKBAKUP =3061 E8C40E 3F28 RCVC3: CALL ERASFIL =3064 E8760F 3FDD CALL MAKEFIL =3067 2EA09D41 MOV AL,BATCHFLG ;DON'T PRINT MSG IF IN BATCH =306B 0AC0 OR AL,AL =306D 7421 3090 JZ RCVFST =306F E8B0F5 2622 CALL ILPRTQ =3072 46696C65206F DB 'File open, ready to receive',CR,LF,0 70656E2C2072 656164792074 6F2072656365 6976650D0A00 =3090 2EA0C441 RCVFST: MOV AL,CKSUMFLG =3094 0AC0 OR AL,AL =3096 B015 MOV AL,NAK =3098 7502 309C JNZ RCVFIL2 =309A B043 MOV AL,CRC = RCVFIL2: =309C E8E407 3883 CALL SEND =309F 2EA0C441 MOV AL,CKSUMFLG =30A3 0AC0 OR AL,AL =30A5 7516 30BD JNZ RCVNAKM ;IF IN CRC MODE =30A7 E878F5 2622 CALL ILPRTQ ;THEN SAY SO =30AA 43524320696E DB 'CRC in effect',CR,LF,0 206566666563 740D0A00 =30BA E91800 30D5 JMP RCVLP = RCVNAKM: =30BD E862F5 2622 CALL ILPRTQ ;ELSE SAY CHECKSUM MODE =30C0 436865636B73 DB 'Checksum in effect',CR,LF,0 756D20696E20 656666656374 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 82 0D0A00 = RCVLP: =30D5 E8EB02 33C3 CALL RCVSECT =30D8 720C 30E6 JC RCVEOT =30DA E83210 410F CALL WRSECT =30DD E84907 3829 CALL INCRSNO =30E0 E89205 3675 CALL SENDACK =30E3 E9EFFF 30D5 JMP RCVLP = ; = RCVEOT: =30E6 E84910 4132 CALL WRBLOCK =30E9 E88905 3675 CALL SENDACK =30EC E8790F 4068 CALL CLOSFIL =30EF E9B708 39A9 JMP DONE = ; = ;SUBROUTINES = ; =30F2 E82DF5 2622 SENDFN: CALL ILPRTQ =30F5 417761697469 DB 'Awaiting name NAK',CR,LF,0 6E67206E616D 65204E414B0D 0A00 =3109 B250 MOV DL,80 =310B E8BE07 38CC CALL WAITNLP =310E B006 MOV AL,ACK ;GOT NAK, SEND ACK =3110 E87007 3883 CALL SEND =3113 BB5E42 MOV BX,OFFSET FILECT =3116 FE0F DEC BYTE PTR [BX] =3118 7818 3132 JS NOMRNM =311A 2E8B1E5A42 MOV BX,NBSAVE ;GET FILE NAME.. =311F BA5C00 MOV DX,OFFSET FCB ;..IN FCB =3122 B50C MOV CH,12 =3124 E8BCDA 0BE3 CALL MOVE =3127 2E891E5A42 MOV NBSAVE,BX =312C E80A00 3139 CALL SENDNM ;SEND IT =312F 0AC0 OR AL,AL ;CLEAR CARRY =3131 C3 RET = ; =3132 B004 NOMRNM: MOV AL,EOT =3134 E84C07 3883 CALL SEND =3137 F9 STC =3138 C3 RET = ; =3139 53 SENDNM: PUSH BX = SENDNM1: =313A B60B MOV DH,11 ;COUNT CHARS IN NAME =313C B100 MOV CL,0 ;INIT CHECKSUM =313E 8AC1 MOV AL,CL =3140 2EA26142 MOV FTYCNT,AL ;INITIATE FILE TYPE COUNT =3144 BB5D00 MOV BX,OFFSET FCB+1 ;ADDRESS NAME =3147 8A07 NAMLPS: MOV AL,BYTE PTR [BX] ;SEND NAME =3149 247F AND AL,07FH ;STRIP HIGH ORDER BIT SO CP/M 2.. CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 83 =314B E83507 3883 CALL SEND ;..WON'T SEND R/O FILE DESIGNATION. =314E 2EA09741 MOV AL,QFLG ;SHOW NAME IF.. =3152 0AC0 OR AL,AL ;..QFLG NOT SET. =3154 8A07 MOV AL,BYTE PTR [BX] =3156 7403 315B JZ ACKLP =3158 E8E700 3242 CALL FTYTST ;TYPE CHARACTER ETC. =315B 51 ACKLP: PUSH CX ;SAVE CKSUM =315C B501 MOV CH,1 ;WAIT FOR RECEIVER.. =315E E8D506 3836 CALL RECV ;..TO ACKNOWLEDGE.. =3161 59 POP CX ;..GETTING LETTER. =3162 7224 3188 JC SCKSER =3164 3C06 CMP AL,ACK =3166 75F3 315B JNZ ACKLP =3168 43 INC BX ;NEXT CHAR =3169 FECE DEC DH =316B 75DA 3147 JNZ NAMLPS =316D B01A MOV AL,EOFCHAR ;TELL RECEIVER END OF NAME =316F E81107 3883 CALL SEND =3172 2EA09741 MOV AL,QFLG =3176 0AC0 OR AL,AL =3178 7403 317D JZ L@203 =317A E8C9F3 2546 CALL CRLF = L@203: =317D 8AF1 MOV DH,CL ;SAVE CHECKSUM =317F B501 MOV CH,1 =3181 E8B206 3836 CALL RECV ;GET CHECKSUM.. =3184 3AC6 CMP AL,DH ;..FROM RECEIVER. =3186 7426 31AE JZ NAMEOK =3188 B075 SCKSER: MOV AL,BDNMCH ;BAD NAME-TELL RECEIVER =318A E8F606 3883 CALL SEND =318D E892F4 2622 CALL ILPRTQ =3190 436865636B73 DB 'Checksum error',CR,LF,0 756D20657272 6F720D0A00 =31A1 B250 MOV DL,80 ;DO HANDSHAKING OVER =31A3 E82607 38CC CALL WAITNLP ;DON'T PRINT "AWAITING NAK" MSG =31A6 B006 MOV AL,ACK =31A8 E8D806 3883 CALL SEND =31AB E98CFF 313A JMP SENDNM1 = ; = NAMEOK: =31AE B006 MOV AL,OKNMCH ;GOOD NAME-TELL RECEIVER =31B0 E8D006 3883 CALL SEND =31B3 5B POP BX =31B4 C3 RET = ; =31B5 BB5C00 GETFN: MOV BX,OFFSET FCB =31B8 E8F4FB 2DAF CALL INITFCBS+2 ;DOES NOT INITIALIZE DRIVE =31BB E864F4 2622 CALL ILPRTQ =31BE 417761697469 DB 'Awaiting file name',CR,LF,0 6E672066696C 65206E616D65 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 84 0D0A00 = GNAMELP: =31D3 E8D400 32AA CALL HSNAK =31D6 E80900 31E2 CALL GETNM ;GET THE NAME =31D9 3C04 CMP AL,EOT ;IF EOT, THEN NO MORE FILES =31DB 7403 31E0 JZ NOMRNMG =31DD 0AC0 OR AL,AL ;CLEAR CARRY =31DF C3 RET = ; = NOMRNMG: =31E0 F9 STC =31E1 C3 RET = ; = GETNM: =31E2 53 PUSH BX = GETNM1: =31E3 B100 MOV CL,0 ;INIT CHECKSUM =31E5 8AC1 MOV AL,CL =31E7 2EA26142 MOV FTYCNT,AL ;INITIATE COUNT FOR FILE TYPE =31EB BB5D00 MOV BX,OFFSET FCB+1 = NAMELPG: =31EE B505 MOV CH,5 =31F0 E84306 3836 CALL RECV ;GET CHAR =31F3 7324 3219 JNC GETNM3 =31F5 E82AF4 2622 CALL ILPRTQ =31F8 54696D65206F DB 'Time out receiving filename',CR,LF,0 757420726563 656976696E67 2066696C656E 616D650D0A00 =3216 E96700 3280 JMP GCKSER = ; = GETNM3: =3219 3C04 CMP AL,EOT ;IF EOT, THEN NO MORE FILES =321B 7503E98800 3220 JNZ $+5 ! JMP GNRET =3220 3C1A CMP AL,EOFCHAR ;GOT END OF NAME =3222 7443 3267 JZ ENDNAME =3224 8807 MOV BYTE PTR [BX],AL ;PUT NAME IN FCB =3226 2EA09741 MOV AL,QFLG ;CAN TYPE IT IF NO QFLG =322A 0AC0 OR AL,AL =322C 7403 3231 JZ SKPTYP =322E E81100 3242 CALL FTYTST =3231 51 SKPTYP: PUSH CX ;SAVE CKSUM =3232 B006 MOV AL,ACK ;ACK GETTING LETTER =3234 E84C06 3883 CALL SEND =3237 59 POP CX =3238 43 INC BX ;GET NEXT CHAR =3239 8AC3 MOV AL,BL ;DON'T LET NOISE... =323B 3C7F CMP AL,7FH ;..CAUSE OVERFLOW.. =323D 7441 3280 JZ GCKSER ;..INTO PROGRAM AREA. =323F E9ACFF 31EE JMP NAMELPG = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 85 = FTYTST: =3242 2EFE066142 INC FTYCNT =3247 2E803E614209 CMP FTYCNT,9 ; ARE WE AT THE FILE TYPE? =324D 740A 3259 JZ SPCTST ;GO IF SO =324F 8A07 ENDSPT: MOV AL,BYTE PTR [BX] =3251 3C20 CMP AL,' ' ;TEST FOR SPACE =3253 7403 3258 JZ L@204 =3255 E8FBF2 2553 CALL TIPE ;TYPE IF NOT = L@204: =3258 C3 RET = ; =3259 8A07 SPCTST: MOV AL,BYTE PTR [BX] =325B 3C20 CMP AL,' ' ;TEST FOR SPACE IN FIRST FILE TYPE BYTE =325D EBF9 3258 JMPS L@204 ;DON'T OUTPUT PERIOD IF SPACE =325F B02E MOV AL,'.' =3261 E8EFF2 2553 CALL TIPE =3264 E9E8FF 324F JMP ENDSPT ;OUTPUT FIRST FILE TYPE BYTE = ; = ENDNAME: =3267 2EA09741 MOV AL,QFLG =326B 0AC0 OR AL,AL =326D 7403E8D4F2 3272 JZ $+5 ! CALL CRLF =3272 8AC1 MOV AL,CL ;SEND CHECKSUM =3274 E80C06 3883 CALL SEND =3277 B501 MOV CH,1 =3279 E8BA05 3836 CALL RECV ;CHECKSUM GOOD? =327C 3C06 CMP AL,OKNMCH ;YES IF OKNMCH SENT.. =327E 7428 32A8 JZ GNRET ;..ELSE DO OVER. =3280 BB5C00 GCKSER: MOV BX,OFFSET FCB ;CLEAR FCB (EXCEPT DRIVE).. =3283 E829FB 2DAF CALL INITFCBS+2 ;..SINCE IT MIGHT BE DAMAGED.. =3286 E899F3 2622 CALL ILPRTQ =3289 0D0A2B2B2043 DB CR,LF,'++ Checksum error ++',CR,LF,0 6865636B7375 6D206572726F 72202B2B0D0A 00 =32A2 E80500 32AA CALL HSNAK ;DO HANDSHAKING OVER =32A5 E93BFF 31E3 JMP GETNM1 = ; =32A8 5B GNRET: POP BX =32A9 C3 RET = ; =32AA B2B4 HSNAK: MOV DL,180 ;3-MINUTE MAXIMUM WAIT FOR A FILE NAME =32AC E81405 37C3 HSNAK1: CALL CKABORT ;WANT TO ABORT? =32AF B015 MOV AL,NAK ;SEND NAK UNTIL RECEIVING ACK =32B1 E8CF05 3883 CALL SEND =32B4 B501 MOV CH,1 ;WAIT UP TO 1 SECOND FOR A CHARACTER =32B6 E87D05 3836 CALL RECV =32B9 3C06 CMP AL,ACK ;'ACK' IS WHAT WE WERE WAITING FOR =32BB 7501 32BE JNZ L@207 =32BD C3 RET = L@207: CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 86 =32BE FECA DEC DL ;ONE LESS TO TRY =32C0 75EA 32AC JNZ HSNAK1 =32C2 E91505 37DA JMP ABORT ;TIMED OUT, ABORT BACK TO COMMAND LINE = ; =32C5 B000 TNMBUF: MOV AL,FALSE ;CALL FROM SENDFIL ONLY ONCE. =32C7 2EA2C741 MOV FSTFLG,AL =32CB 2EA25E42 MOV FILECT,AL =32CF E85D00 332F CALL SCAN =32D2 BB5883 MOV BX,OFFSET NAMEBUF =32D5 2E891E5A42 MOV NBSAVE,BX ;SAVE ADDR OF 1ST NAME =32DA E8B700 3394 TNLP1: CALL TRTOBUF =32DD BB5C00 MOV BX,OFFSET FCB =32E0 BA0A43 MOV DX,OFFSET FCBBUF =32E3 E857F3 263D CALL CPMLINE ;PARSE NAME TO CP/M FORMAT =32E6 E83409 3C1D TNLP2: CALL MFNAME ;SEARCH FOR NAMES (* FORMAT) =32E9 7225 3310 JC NEXTNM =32EB A06600 MOV AL,BYTE PTR .FCB+10 ;IF CP/M 2 $SYS FILE.. =32EE 2480 AND AL,80H ;..DON'T SEND =32F0 75F4 32E6 JNZ TNLP2 =32F2 2E8B1E5A42 MOV BX,NBSAVE ;GET NAME =32F7 BA5C00 MOV DX,OFFSET FCB ;MOVE IT TO FCB =32FA 87DA XCHG BX,DX =32FC B50C MOV CH,12 =32FE E8E2D8 0BE3 CALL MOVE =3301 87DA XCHG BX,DX =3303 2E891E5A42 MOV NBSAVE,BX ;ADDR OF NEXT NAME =3308 BB5E42 MOV BX,OFFSET FILECT ;COUNT FILES FOUND =330B FE07 INC BYTE PTR [BX] =330D E9D6FF 32E6 JMP TNLP2 = ; =3310 BB6042 NEXTNM: MOV BX,OFFSET SNAMECT ;COUNT NAMES FOUND =3313 FE0F DEC BYTE PTR [BX] =3315 75C3 32DA JNZ TNLP1 =3317 BB5883 MOV BX,OFFSET NAMEBUF ;SAVE START OF BUFFER =331A 2E891E5A42 MOV NBSAVE,BX =331F 2EA05E42 MOV AL,FILECT =3323 3C41 CMP AL,65 ;NO MORE THAN 64 TRANSFERS =3325 7301 3328 JNC L@208 =3327 C3 RET = L@208: =3328 B040 MOV AL,64 ;ONLY X'FER FIRST 64 =332A 2EA25E42 MOV FILECT,AL =332E C3 RET = ; = ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE) = ;AFTER LAST NAME = ; =332F 53 SCAN: PUSH BX =3330 BB6042 MOV BX,OFFSET SNAMECT =3333 C60700 MOV BYTE PTR [BX],0 =3336 BBD341 MOV BX,OFFSET CMDBUF+1 ;FIND END OF CMD LINE.. =3339 8A0F MOV CL,BYTE PTR [BX] ;..AND PUT SPACE THERE. CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 87 =333B B500 MOV CH,0 =333D BBD441 MOV BX,OFFSET CMDBUF+2 =3340 03D9 ADD BX,CX =3342 C60720 MOV BYTE PTR [BX],20H =3345 BBD341 MOV BX,OFFSET CMDBUF+1 =3348 8A2F MOV CH,BYTE PTR [BX] =334A FEC5 INC CH =334C FEC5 INC CH = SCANLP1: =334E 43 INC BX =334F FECD DEC CH =3351 743C 338F JZ DNSCAN =3353 8A07 MOV AL,BYTE PTR [BX] =3355 3C20 CMP AL,20H =3357 75F5 334E JNZ SCANLP1 = SCANLP2: =3359 43 INC BX ;EAT EXTRA SPACES =335A FECD DEC CH =335C 7431 338F JZ DNSCAN =335E 8A07 MOV AL,BYTE PTR [BX] =3360 3C20 CMP AL,20H =3362 74F5 3359 JZ SCANLP2 =3364 2E891E5C42 MOV BGNMS,BX ;SAVE START OF NAMES IN CMDBUF =3369 FEC5 INC CH =336B 4B DEC BX = SCANLP3: =336C 43 INC BX =336D FECD DEC CH =336F 741E 338F JZ DNSCAN =3371 8A07 MOV AL,BYTE PTR [BX] =3373 3C20 CMP AL,20H =3375 75F5 336C JNZ SCANLP3 =3377 2EA06042 MOV AL,SNAMECT ;COUNTS NAMES =337B FEC0 INC AL =337D 2EA26042 MOV SNAMECT,AL = SCANLP4: =3381 43 INC BX ;EAT SPACES =3382 FECD DEC CH =3384 7409 338F JZ DNSCAN =3386 8A07 MOV AL,BYTE PTR [BX] =3388 3C20 CMP AL,20H =338A 74F5 3381 JZ SCANLP4 =338C E9DDFF 336C JMP SCANLP3 = ; = DNSCAN: =338F C60720 MOV BYTE PTR [BX],20H ;SPACE AFTER LAST CHAR =3392 5B POP BX =3393 C3 RET = ; = ;PLACES NEXT NAME IN BUFFER SO 'CPMLINE' MAY PARSE IT = ; = TRTOBUF: CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 88 =3394 2E8B1E5C42 MOV BX,BGNMS =3399 B500 MOV CH,0 =339B BA0C43 MOV DX,OFFSET FCBBUF+2 = TBLP: =339E 8A07 MOV AL,BYTE PTR [BX] =33A0 3C20 CMP AL,20H =33A2 740D 33B1 JZ TRBFEND =33A4 87DA XCHG BX,DX =33A6 8807 MOV BYTE PTR [BX],AL =33A8 87DA XCHG BX,DX =33AA 43 INC BX =33AB 42 INC DX =33AC FEC5 INC CH ;COUNT CHARS IN NAME =33AE E9EDFF 339E JMP TBLP = ; = TRBFEND: =33B1 43 INC BX =33B2 8A07 MOV AL,BYTE PTR [BX] ;EAT EXTRA SPACES =33B4 3C20 CMP AL,20H =33B6 74F9 33B1 JZ TRBFEND =33B8 2E891E5C42 MOV BGNMS,BX =33BD BB0B43 MOV BX,OFFSET FCBBUF+1 ;PUT # CHARS BEFORE NAME =33C0 882F MOV BYTE PTR [BX],CH =33C2 C3 RET = ; = RCVSECT: =33C3 B001 MOV AL,1 =33C5 2EA2B441 MOV ERRCT,AL =33C9 E8F703 37C3 RCVRPT: CALL CKABORT ;WANT TO STOP RECEIVING FILE? =33CC 2EA09741 MOV AL,QFLG =33D0 0AC0 OR AL,AL =33D2 742C 3400 JZ RCVSQ =33D4 E83EF2 2615 CALL ILPRT =33D7 0D4177616974 DB CR,'Awaiting # ',0 696E67202320 00 =33E4 53 PUSH BX ;SAVE IT =33E5 2E8B1EB241 MOV BX,SECTNO ;GET SECTOR NUMBER =33EA 43 INC BX ;BUMP IT =33EB E8C3F1 25B1 CALL DECOUT ;PRINT SECTOR NUMBER IN DECIMAL =33EE E824F2 2615 CALL ILPRT =33F1 202800 DB ' (', 0 =33F4 E8E5F1 25DC CALL DHXOUT ;16 BIT HEX CONVERSION & OUTPUT =33F7 E81BF2 2615 CALL ILPRT =33FA 482900 DB 'H)',0 =33FD 8AC3 MOV AL,BL ;ONLY LOW BYTE USED BY PROGRAM =33FF 5B POP BX ;RESTORE IT = ; = RCVSQ: ;WAIT FOR SOH OR EOT =3400 B50A MOV CH,10 ;10 SECONDS =3402 E83104 3836 CALL RECV =3405 7303E9CE00 340A JNC $+5 ! JMP RCVSTOT CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 89 =340A 3C01 CMP AL,SOH =340C 7503E95601 3411 JNZ $+5 ! JMP RCVSOH =3411 0AC0 OR AL,AL =3413 74EB 3400 JZ RCVSQ =3415 3C04 CMP AL,EOT =3417 F9 STC =3418 7501 341B JNZ L@209 =341A C3 RET = L@209: =341B 8AE8 MOV CH,AL =341D 2EA09741 MOV AL,QFLG =3421 0AC0 OR AL,AL =3423 7424 3449 JZ RCVSERR =3425 8AC5 RCVSEH: MOV AL,CH =3427 E81CF1 2546 CALL CRLF =342A E8BEF1 25EB CALL HEXO =342D E8E5F1 2615 CALL ILPRT =3430 482072656365 DB 'H received not SOH - ',0 69766564206E 6F7420534F48 202D2000 =3446 E82D05 3976 RCVPRN: CALL SHOWERR ;DISPLAY ERROR COUNT = RCVSERR: =3449 B501 MOV CH,1 ;WAIT FOR 1 SEC.. =344B E8E803 3836 CALL RECV ;..WITH NO CHARS =344E 73F9 3449 JNC RCVSERR ;LOOP UNTIL SENDER DONE =3450 E87003 37C3 CALL CKABORT ;WANT TO STOP RECEIVING NOW? =3453 2EA0C441 MOV AL,CKSUMFLG ;GET CHECKSUM FLAG =3457 0AC0 OR AL,AL ;CRC IN EFFECT? =3459 B015 MOV AL,NAK ;PUT NAK IN ACCUM =345B 750C 3469 JNZ RCVSER2 ;NO, SEND THE NAK =345D 2EA0C841 MOV AL,FIRSTME ;GET FIRST TIME SWITCH =3461 0AC0 OR AL,AL ;HAS FIRST SOH BEEN RECEIVED? =3463 B015 MOV AL,NAK ;PUT NAK IN ACCUM =3465 7402 3469 JZ RCVSER2 ;YES, THEN SEND NAK =3467 B043 MOV AL,CRC ;TELL SENDER CRC IS IN EFFECT = RCVSER2: =3469 E81704 3883 CALL SEND ;..THE NAK or CRC request =346C 2EA0B441 MOV AL,ERRCT ;ABORT IF.. =3470 FEC0 INC AL ;..WE HAVE REACHED.. =3472 2EA2B441 MOV ERRCT,AL ;..THE ERROR.. =3476 3C0A CMP AL,ERRLIM ;..LIMIT? =3478 7303E94CFF 347D JNC $+5 ! JMP RCVRPT ;..NO, TRY AGAIN =347D 2EA09741 MOV AL,QFLG =3481 0AC0 OR AL,AL =3483 7408 348D JZ RCVSABT =3485 E88704 390F RCVCKQ: CALL CKQUIT =3488 7503E936FF 348D JNZ $+5 ! JMP RCVSECT = RCVSABT: =348D E8D80B 4068 CALL CLOSFIL ;CLOSE THE PARTIAL FILE =3490 E8F50A 3F88 CALL NOASK ;DELETE PARTIAL FILE =3493 E87FF1 2615 CALL ILPRT CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 90 =3496 0D0A0A DB CR,LF,LF =3499 2B2B2046696C DB '++ File receive cancelled and unfinished file deleted ++' 652072656365 697665206361 6E63656C6C65 6420616E6420 756E66696E69 736865642066 696C65206465 6C6574656420 2B2B =34D1 070D0A00 DB BELL,CR,LF,0 =34D5 E9A505 3A7D JMP DONETCA = ; = RCVSTOT: =34D8 2EA09741 MOV AL,QFLG =34DC 0AC0 OR AL,AL =34DE E834F1 2615 RCVSPT: CALL ILPRT =34E1 0D0A2B2B2054 DB CR,LF,'++ Timeout ',0 696D656F7574 2000 =34EF E88404 3976 CALL SHOWERR = RCVSCRC: =34F2 E80300 34F8 CALL RCVSCRC2 =34F5 E951FF 3449 JMP RCVSERR = ; = ;ROUTINE WILL SWITCH FROM CRC TO CHECKSUM IF ERCNT REACHES ERRCRC = ;AND FIRSTME IS TRUE = ; = RCVSCRC2: =34F8 2EA0B441 MOV AL,ERRCT =34FC 3C06 CMP AL,ERRCRC =34FE 7566 3566 JNZ L@210 =3500 2EA0C841 MOV AL,FIRSTME =3504 0AC0 OR AL,AL =3506 745E 3566 JZ L@210 =3508 2EA0C441 MOV AL,CKSUMFLG =350C 0AC0 OR AL,AL =350E 7556 3566 JNZ L@210 =3510 F6D0 NOT AL =3512 2EA2C441 MOV CKSUMFLG,AL =3516 2EA20401 MOV CKSUMDFLT,AL =351A E805F1 2622 CALL ILPRTQ =351D 2B2B20537769 DB '++ Switching to Checksum mode ++',CR,LF 746368696E67 20746F204368 65636B73756D 206D6F646520 2B2B0D0A =353F 2B2B2053656E DB '++ Sender may not be CRC capable ++',CR,LF,BELL,0 646572206D61 79206E6F7420 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 91 626520435243 206361706162 6C65202B2B0D 0A0700 =3566 C3 L@210: RET = ; = ;Got SOH - get block #, block # complemented = ; =3567 32C0 RCVSOH: XOR AL,AL ;ZERO ACCUM =3569 2EA2C841 MOV FIRSTME,AL ;INDICATE FIRST SOH RECV'D =356D B501 MOV CH,1 ;TIMEOUT = 1 SEC =356F E8C402 3836 CALL RECV ;GET SECTOR =3572 7303E961FF 3577 JNC $+5 ! JMP RCVSTOT ;GOT TIMEOUT =3577 8AF0 MOV DH,AL =3579 B501 MOV CH,1 =357B E8B802 3836 CALL RECV =357E 7303E955FF 3583 JNC $+5 ! JMP RCVSTOT =3583 F6D0 NOT AL =3585 3AC6 CMP AL,DH =3587 742E 35B7 JZ RCVDATA =3589 2EA09741 MOV AL,QFLG =358D 0AC0 OR AL,AL =358F 7503E9B5FE 3594 JNZ $+5 ! JMP RCVSERR = RCVBSE: =3594 E87EF0 2615 CALL ILPRT =3597 0D0A2B2B2042 DB CR,LF,'++ Bad sector # in Header ',0 616420736563 746F72202320 696E20486561 6465722000 =35B4 E98FFE 3446 JMP RCVPRN = ; = RCVDATA: =35B7 8AC6 MOV AL,DH =35B9 2EA2B141 MOV RCVSNO,AL =35BD B001 MOV AL,1 =35BF 2EA2BC41 MOV DATAFLG,AL =35C3 B100 MOV CL,0 =35C5 E80D06 3BD5 CALL CLRCRC ;CLEAR CRC COUNTER =35C8 BB8000 MOV BX,OFFSET 80H = RCVCHR: =35CB B501 MOV CH,1 =35CD E86602 3836 CALL RECV =35D0 7303E903FF 35D5 JNC $+5 ! JMP RCVSTOT =35D5 8807 MOV BYTE PTR [BX],AL =35D7 FEC3 INC BL =35D9 75F0 35CB JNZ RCVCHR =35DB 2EA0C441 MOV AL,CKSUMFLG =35DF 0AC0 OR AL,AL =35E1 742E 3611 JZ RCVCRC =35E3 8AF1 MOV DH,CL ; 9.01.02 MJM 7/8/83 =35E5 32C0 XOR AL,AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 92 =35E7 2EA2BC41 MOV DATAFLG,AL =35EB B501 MOV CH,1 =35ED E84602 3836 CALL RECV =35F0 7303E9E3FE 35F5 JNC $+5 ! JMP RCVSTOT =35F5 3AC6 CMP AL,DH =35F7 7550 3649 JNZ RCVCERR = CHKSNUM: =35F9 2EA0B141 MOV AL,RCVSNO =35FD 8AE8 MOV CH,AL =35FF 2EA1B241 MOV AX,SECTNO =3603 3AC5 CMP AL,CH =3605 7468 366F JZ RECVACK =3607 FEC0 INC AL =3609 3AC5 CMP AL,CH =360B 7403E9CA01 3610 JZ $+5 ! JMP ABORT =3610 C3 RET = ; = RCVCRC: =3611 B202 MOV DL,2 ;NUMBER OF CRC BYTES = RCVCRC2: =3613 B501 MOV CH,1 =3615 E81E02 3836 CALL RECV =3618 7303E9BBFE 361D JNC $+5 ! JMP RCVSTOT =361D FECA DEC DL =361F 75F2 3613 JNZ RCVCRC2 =3621 E8EC05 3C10 CALL CHKCRC =3624 0AC0 OR AL,AL =3626 74D1 35F9 JZ CHKSNUM =3628 2EA09741 MOV AL,QFLG =362C 0AC0 OR AL,AL =362E 7503E916FE 3633 JNZ $+5 ! JMP RCVSERR = RCVCRER: =3633 E8DFEF 2615 CALL ILPRT =3636 0D0A2B2B2043 DB CR,LF,'++ CRC error ',0 524320657272 6F722000 =3646 E9FDFD 3446 JMP RCVPRN = ; = RCVCERR: =3649 2EA09741 MOV AL,QFLG =364D 0AC0 OR AL,AL =364F 7503E9F5FD 3654 JNZ $+5 ! JMP RCVSERR = RCVCPR: =3654 E8BEEF 2615 CALL ILPRT =3657 0D0A2B2B2043 DB CR,LF,'++ Checksum error ',0 6865636B7375 6D206572726F 722000 =366C E9D7FD 3446 JMP RCVPRN = ; = RECVACK: =366F E80300 3675 CALL SENDACK CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 93 =3672 E94EFD 33C3 JMP RCVSECT = ; = SENDACK: =3675 B006 MOV AL,ACK =3677 E80902 3883 CALL SEND =367A C3 RET = ; = SENDHDR: =367B 2EA09741 MOV AL,QFLG =367F 0AC0 OR AL,AL =3681 7428 36AB JZ SENDHNM =3683 E88FEF 2615 CALL ILPRT =3686 0D53656E6469 DB CR,'Sending # ',0 6E6720232000 =3692 53 PUSH BX =3693 2E8B1EB241 MOV BX,SECTNO ;GET SECTOR NUMBER =3698 E816EF 25B1 CALL DECOUT ;PRINT IT IN DECIMAL =369B E877EF 2615 CALL ILPRT =369E 202800 DB ' (',0 =36A1 E838EF 25DC CALL DHXOUT ;16 BIT HEX CONVERSION & OUTPUT =36A4 E86EEF 2615 CALL ILPRT =36A7 482900 DB 'H)',0 =36AA 5B POP BX = SENDHNM: =36AB B001 MOV AL,SOH =36AD E8D301 3883 CALL SEND =36B0 2EA1B241 MOV AX,SECTNO =36B4 E8CC01 3883 CALL SEND =36B7 2EA1B241 MOV AX,SECTNO =36BB F6D0 NOT AL =36BD E8C301 3883 CALL SEND =36C0 C3 RET = ; = SENDSEC: =36C1 B001 MOV AL,1 =36C3 2EA2BC41 MOV DATAFLG,AL =36C7 B100 MOV CL,0 =36C9 E80905 3BD5 CALL CLRCRC =36CC BB8000 MOV BX,OFFSET 80H = SENDC: =36CF 8A07 MOV AL,BYTE PTR [BX] =36D1 E8AF01 3883 CALL SEND =36D4 FEC3 INC BL =36D6 75F7 36CF JNZ SENDC =36D8 32C0 XOR AL,AL =36DA 2EA2BC41 MOV DATAFLG,AL =36DE C3 RET = ; = SENDCKS: =36DF 8AC1 MOV AL,CL =36E1 E89F01 3883 CALL SEND =36E4 C3 RET CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 94 = ; = SENDCRC: =36E5 E81805 3C00 CALL FINCRC =36E8 8AC6 MOV AL,DH =36EA E89601 3883 CALL SEND =36ED 8AC2 MOV AL,DL =36EF E89101 3883 CALL SEND =36F2 32C0 XOR AL,AL =36F4 C3 RET = ; = ; = ;After a record is sent, a character is returned telling if it was re- = ;ceived properly or not. An ACK allows the next record to be sent. A = ;NAK sends an error message and the current record is again repeated. = ;This occurs until the error limit has been reached. If the first NAK = ;is missed, it waits up to 12 seconds before declaring a 2nd error. = ;This insures there is no collision with the station attempting to send = ;the NAK, since it waits only 10 seconds. = ; =36F5 B50C GETACK: MOV CH,12 ;12 SECONDS =36F7 E83901 3833 CALL RECVDG ;WAIT FOR ACK OR NAK =36FA 7303E99C00 36FF JNC $+5 ! JMP GETATOT ;NO CHARACTER, TIMED OUT =36FF 3C06 CMP AL,ACK =3701 7501 3704 JNZ L@211 =3703 C3 RET ;IF ACK RETURN AND SEND NEXT RECORD = L@211: = ; = ;If the ACKNAK option is FALSE it will resend the sector when any char- = ;acter other than ACK is received (including NAK). = ; =3704 8AE8 MOV CH,AL =3706 2EA01501 MOV AL,NAKONLY =370A 0AC0 OR AL,AL =370C 7404 3712 JZ ALLOTH =370E 3C15 CMP AL,NAK ;WAS IT AN AUTHENTIC 'NAK'? =3710 75E3 36F5 JNZ GETACK ;IGNORE IF NEITHER 'ACK' NOR 'NAK' = ;WILL EVENTUALLY TIME OUT =3712 2EA09741 ALLOTH: MOV AL,QFLG =3716 0AC0 OR AL,AL =3718 743C 3756 JZ ACKERR =371A E8F8EE 2615 CALL ILPRT =371D 0D0A2B2B2000 DB CR,LF,'++ ',0 =3723 8AC5 MOV AL,CH =3725 3C15 CMP AL,NAK ;IS IT A 'NAK'? =3727 740B 3734 JZ GETACK2 ;SHOW 'NAK' IN THAT CASE =3729 E8BFEE 25EB CALL HEXO =372C B048 MOV AL,'H' =372E E822EE 2553 CALL TIPE =3731 E90700 373B JMP GETACK3 = GETACK2: =3734 E8DEEE 2615 CALL ILPRT =3737 4E414B00 DB 'NAK',0 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 95 = GETACK3: =373B E8D7EE 2615 CALL ILPRT ;PRINT THE ERROR MESSAGE =373E 207265636569 DB ' received not ACK - ',0 766564206E6F 742041434B20 2D2000 =3753 E82002 3976 CALL SHOWERR ;SHOW THE ERROR NUMBER =3756 2EA0B441 ACKERR: MOV AL,ERRCT =375A FEC0 INC AL =375C 2EA2B441 MOV ERRCT,AL =3760 FEC8 DEC AL =3762 3C0A CMP AL,ERRLIM =3764 7301 3767 JNC L@212 =3766 C3 RET = L@212: =3767 2EA09741 MOV AL,QFLG =376B 0AC0 OR AL,AL =376D 7407 3776 JZ CSABORT =376F E89D01 390F GACKV: CALL CKQUIT =3772 F9 STC =3773 7501 3776 JNZ CSABORT =3775 C3 RET = CSABORT: =3776 E81302 398C CALL ERXIT =3779 0D0A43616E27 DB CR,LF,'Can''t send sector -- Aborting',CR,LF,'$' 742073656E64 20736563746F 72202D2D2041 626F7274696E 670D0A24 = GETATOT: =379B 2EA09741 MOV AL,QFLG =379F 0AC0 OR AL,AL =37A1 74B3 3756 JZ ACKERR =37A3 E86FEE 2615 CALL ILPRT =37A6 0D0A2B2B2054 DB CR,LF,'++ Timeout on ACK - ',0 696D656F7574 206F6E204143 4B202D2000 =37BD E8B601 3976 CALL SHOWERR ;DISPLAY ERROR COUNT =37C0 E993FF 3756 JMP ACKERR = ; = CKABORT: =37C3 2EA09741 MOV AL,QFLG =37C7 0AC0 OR AL,AL =37C9 7501 37CC JNZ CKABGO =37CB C3 RET =37CC E895ED 2564 CKABGO: CALL STAT =37CF 7501 37D2 JNZ L@213 =37D1 C3 RET = L@213: =37D2 E89EED 2573 CALL KEYIN CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 96 =37D5 3C18 CMP AL,CAN =37D7 7401 37DA JZ ABORT =37D9 C3 RET = ABORT: =37DA B501 ABORTL: MOV CH,1 =37DC E85700 3836 CALL RECV =37DF 73F9 37DA JNC ABORTL =37E1 B018 MOV AL,CAN =37E3 E89D00 3883 CALL SEND =37E6 B501 ABORTW: MOV CH,1 =37E8 E84B00 3836 CALL RECV =37EB 73F9 37E6 JNC ABORTW =37ED B020 MOV AL,' ' =37EF E89100 3883 CALL SEND =37F2 B042 MOV AL,'B' ;TURN MULTI-FILE MODE.. =37F4 2EA29D41 MOV BATCHFLG,AL ;..OFF SO ROUTINE ENDS. =37F8 2EA09641 MOV AL,OPTION ;RECEIVING A FILE NOW? =37FC 3C52 CMP AL,'R' =37FE 7503E98AFC 3803 JNZ $+5 ! JMP RCVSABT ;IF YES, CANCEL THE UNFINISHED FILE =3803 E80FEE 2615 CALL ILPRT =3806 0D0A0A2B2B20 DB CR,LF,LF,'++ File send cancelled ++',CR,LF,BELL,0 46696C652073 656E64206361 6E63656C6C65 64202B2B0D0A 0700 =3826 E95402 3A7D JMP DONETCA = ; = INCRSNO: =3829 2EFF06B241 INC SECTNO ; INCREMENT SECTOR NUMBER =382E 2EA1B241 MOV AX,SECTNO ; NEED IT IN LOW BYTE, DON'T CARE ABOUT HIGH =3832 C3 RET = ; = ;----> RECV: Receive a character = ; = ;Timeout time is in B, in seconds. Entry via 'RECVDG' deletes garbage = ;characters on the line. For example, having just sent a sector, calling = ;RECVDG will delete any line noise induced characters LONG before the = ;ACK/NAK would be received. = ; =3833 E837F7 2F6D RECVDG: CALL CKMODM ;CATCH ANY GARBAGE CHARACTERS =3836 52 RECV: PUSH DX =3837 53 MSEC: PUSH BX =3838 BB8813 MOV BX,OFFSET 5000 =383B E890D3 0BCE CALL FIXCNT =383E 53 PUSH BX =383F 5A POP DX =3840 5B POP BX =3841 E87FFF 37C3 CALL CKABORT = MWTI: =3844 E800F2 2A47 CALL RCVREADY =3847 740F 3858 JZ MCHAR CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 97 =3849 FECA DEC DL =384B 75F7 3844 JNZ MWTI =384D FECE DEC DH =384F 75F3 3844 JNZ MWTI =3851 FECD DEC CH =3853 75E2 3837 JNZ MSEC =3855 5A POP DX =3856 F9 STC =3857 C3 RET = ; = MCHAR: = MCHAR1: =3858 E898CD 05F3 CALL INMODDATP =385B 5A POP DX =385C 50 PUSH AX =385D E87D03 3BDD CALL UPDCRC ;CALCULATE CRC =3860 02C8 ADD CL,AL =3862 2EA09841 MOV AL,RSEEFLG =3866 0AC0 OR AL,AL =3868 7410 387A JZ MONIN =386A 2EA09A41 MOV AL,VSEEFLG =386E 0AC0 OR AL,AL =3870 750D 387F JNZ NOMONIN =3872 2EA0BC41 MOV AL,DATAFLG =3876 0AC0 OR AL,AL =3878 7405 387F JZ NOMONIN =387A 58 MONIN: POP AX =387B 50 PUSH AX =387C E897EC 2516 CALL SHOW = NOMONIN: =387F 58 POP AX =3880 0AC0 OR AL,AL =3882 C3 RET = ; =3883 50 SEND: PUSH AX =3884 2EA09941 MOV AL,SSEEFLG =3888 0AC0 OR AL,AL =388A 7410 389C JZ MONOUT =388C 2EA09A41 MOV AL,VSEEFLG =3890 0AC0 OR AL,AL =3892 750D 38A1 JNZ NOMONOT =3894 2EA0BC41 MOV AL,DATAFLG =3898 0AC0 OR AL,AL =389A 7405 38A1 JZ NOMONOT =389C 58 MONOUT: POP AX =389D 50 PUSH AX =389E E875EC 2516 CALL SHOW = NOMONOT: =38A1 58 POP AX =38A2 50 PUSH AX =38A3 E83703 3BDD CALL UPDCRC ;CALCULATE CRC =38A6 02C8 ADD CL,AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 98 =38A8 E852F0 28FD SENDW: CALL SENDREADY =38AB 75FB 38A8 JNZ SENDW =38AD 58 POP AX =38AE E832CD 05E3 CALL OUTMODDATP =38B1 C3 RET = ; = WAITNAK: =38B2 E86DED 2622 CALL ILPRTQ =38B5 417761697469 DB 'Awaiting initial NAK',CR,LF,0 6E6720696E69 7469616C204E 414B0D0A00 = WAITNLP: =38CC E8F4FE 37C3 CALL CKABORT =38CF B501 MOV CH,1 =38D1 E862FF 3836 CALL RECV =38D4 3C15 CMP AL,NAK =38D6 7501 38D9 JNZ L@214 =38D8 C3 RET = L@214: =38D9 3C43 CMP AL,CRC ;CRC REQUEST? =38DB 7411 38EE JZ WAITCRC ;YES, GO SET CRC FLAG =38DD 3C18 CMP AL,CAN =38DF 7503E9F6FE 38E4 JNZ $+5 ! JMP ABORT =38E4 FECA DEC DL =38E6 7503E9EFFE 38EB JNZ $+5 ! JMP ABORT =38EB E9DEFF 38CC JMP WAITNLP = ; = WAITCRC: =38EE E831ED 2622 CALL ILPRTQ =38F1 435243207265 DB 'CRC request received',CR,LF,0 717565737420 726563656976 65640D0A00 =3908 32C0 XOR AL,AL =390A 2EA2C441 MOV CKSUMFLG,AL =390E C3 RET = ; = ;RETURNS W/ ZERO SET IF RETRY ASKED. IF MULTI-FILE MODE, THEN = ;NO QUESTIONS ASKED, JUST QUIT = ; = CKQUIT: =390F 2EA09D41 MOV AL,BATCHFLG =3913 0AC0 OR AL,AL =3915 7503 391A JNZ CKQTASK ;ASK FOR RETRY =3917 FEC0 INC AL ;RESET ZERO FLG =3919 C3 RET = ; = CKQTASK: =391A 2EC606B44101 MOV ERRCT,1 =3920 E8F2EC 2615 CALL ILPRT =3923 0D0A4D756C74 DB CR,LF,'Multiple errors encountered.',CR,LF CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 99 69706C652065 72726F727320 656E636F756E 74657265642E 0D0A =3943 547970652051 DB 'Type Q to quit, R to retry: ',BELL,0 20746F207175 69742C205220 746F20726574 72793A202007 00 =3962 E80EEC 2573 CALL KEYIN =3965 E8DEEB 2546 CALL CRLF =3968 E83BEC 25A6 CALL UCASE ;INSTEAD OF "ANI 5FH" =396B 3C52 CMP AL,'R' =396D 7406 3975 JZ L@215 =396F 3C51 CMP AL,'Q' =3971 759C 390F JNZ CKQUIT =3973 0AC0 OR AL,AL =3975 C3 L@215: RET = ; = ;Get the error count and display on CRT = ; = SHOWERR: =3976 53 PUSH BX ;SAVE THE CURRENT ADDRESS =3977 2E8A1EB441 MOV BL,ERRCT ;GET THE CURRENT ERROR NUMBER =397C B700 MOV BH,0 ;ONLY A 8-BIT NUMBER, NOW IN 'L' REG. =397E E830EC 25B1 CALL DECOUT ;DISPLAY THE ERROR IN DECIMAL =3981 5B POP BX ;RESTORE THE CURRENT ADDRESS =3982 E890EC 2615 CALL ILPRT =3985 202B2B0D0A00 DB ' ++',CR,LF,0 ;FINISH THE ERROR MESSAGE =398B C3 RET = ; =398C 5A ERXIT: POP DX =398D E86AD1 0AFA CALL PRTMSG =3990 B007 MOV AL,BELL =3992 E8BEEB 2553 CALL TIPE =3995 2EA09D41 MOV AL,BATCHFLG =3999 0AC0 OR AL,AL =399B 7403E9DD00 39A0 JZ $+5 ! JMP DONETCA =39A0 B051 MOV AL,'Q' ;RESET QFLG =39A2 2EA29741 MOV QFLG,AL =39A6 E931FE 37DA JMP ABORT ;ABORT OTHER COMPUTER = ; =39A9 2EA09D41 DONE: MOV AL,BATCHFLG =39AD 0AC0 OR AL,AL =39AF 7403E9A600 39B4 JZ $+5 ! JMP DONETC =39B4 2EA09741 MOV AL,QFLG =39B8 0AC0 OR AL,AL =39BA 746E 3A2A JZ NMSTRNS =39BC B50C MOV CH,12 ;ZERO OUT FTRNMSG =39BE BB0A3A MOV BX,OFFSET FTRNMSG CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 100 =39C1 B000 MOV AL,0 =39C3 8807 ZEROLP: MOV BYTE PTR [BX],AL =39C5 43 INC BX =39C6 FECD DEC CH =39C8 75F9 39C3 JNZ ZEROLP =39CA B50C MOV CH,12 ;PUT FILE NAME IN FTRNMSG =39CC BB5D00 MOV BX,OFFSET FCB+1 =39CF BA0A3A MOV DX,OFFSET FTRNMSG = LOADMSG: =39D2 B004 MOV AL,4 ;START OF FILE TYPE? =39D4 3AC5 CMP AL,CH =39D6 7419 39F1 JZ PERIOD ;PUT IN PERIOD IF SO =39D8 8A07 MOV AL,BYTE PTR [BX] =39DA 3C20 CMP AL,' ' ;DON'T PUT IN SPACE =39DC 7407 39E5 JZ SKPSP =39DE 87DA XCHG BX,DX =39E0 8807 MOV BYTE PTR [BX],AL ;STORE IN FTRNMSG =39E2 87DA XCHG BX,DX =39E4 42 INC DX =39E5 43 SKPSP: INC BX =39E6 FECD DEC CH =39E8 8AC5 MOV AL,CH =39EA 0AC0 OR AL,AL ;END OF FILE NAME? =39EC 7417 3A05 JZ FTRNMSG0 ;DISPLAY FILE NAME =39EE E9E1FF 39D2 JMP LOADMSG ;LOOP FOR ANOTHER CHARACTER = ; = PERIOD: =39F1 8A07 MOV AL,BYTE PTR [BX] =39F3 3C20 CMP AL,' ' ;IS FILE TYPE EMPTY? =39F5 740E 3A05 JZ FTRNMSG0 ;GO IF SO =39F7 B02E MOV AL,'.' ;ELSE PUT PERIOD IN MESSAGE =39F9 87DA XCHG BX,DX =39FB 8807 MOV BYTE PTR [BX],AL =39FD 87DA XCHG BX,DX =39FF 42 INC DX =3A00 FECD DEC CH =3A02 E9CDFF 39D2 JMP LOADMSG = ; = FTRNMSG0: =3A05 E80DEC 2615 CALL ILPRT =3A08 0D0A DB CR,LF =3A0A FTRNMSG RB 12 =3A16 00 DB 0 =3A17 E8FBEB 2615 CALL ILPRT =3A1A 205472616E73 DB ' Transferred',CR,LF,LF,0 666572726564 0D0A0A00 = NMSTRNS: =3A2A A05C00 MOV AL,BYTE PTR .FCB ;SAVE DRIVE NO. =3A2D 2EA25442 MOV DISKNO,AL =3A31 BB5C00 MOV BX,OFFSET FCB ;BLANK OUT FILE CONTROL BLOCKS =3A34 E876F3 2DAD CALL INITFCBS CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 101 =3A37 2EA05442 MOV AL,DISKNO ;PUT DRIVE NUMBER BACK =3A3B A25C00 MOV BYTE PTR .FCB,AL =3A3E BBA541 MOV BX,OFFSET RESTSN ;RESTORE SECTORE NUMBERS.. =3A41 BAB141 MOV DX,OFFSET SECTNOB ;..FOR NEW FILE TRANSFER. =3A44 B50C MOV CH,OFFSET SECTNOE-OFFSET SECTNOB ;ROUTINE ALSO DONE IN MENU. =3A46 E89AD1 0BE3 CALL MOVE =3A49 E821F5 2F6D CALL CKMODM ;CATCH ANY GARBAGE CHARACTERS =3A4C 2EA05942 MOV AL,SENDFLG ;GOES TO EITHER SEND OR.. =3A50 0AC0 OR AL,AL ;..RECEIVE FILE, DEPENDING.. =3A52 7403E92BF5 3A57 JZ $+5 ! JMP SENDFIL1 ;..UPON WHICH ROUTINE SET.. =3A57 E9D8F5 3032 JMP RCVFIL1 ;..THE FLAG IN MULTI-FILE MODE. = ; =3A5A E866FD 37C3 DONETC: CALL CKABORT ;SLIGHT DELAY FOR NEXT MESSAGE =3A5D E8B5EB 2615 CALL ILPRT =3A60 0D0A416C6C20 DB CR,LF,'All transfers completed',CR,LF,BELL,0 7472616E7366 65727320636F 6D706C657465 640D0A0700 = DONETCA: =3A7D B0FF MOV AL,TRUE =3A7F 2EA2C841 MOV FIRSTME,AL ;SET FIRST-TIME FLAG =3A83 2EA2C741 MOV FSTFLG,AL ;RESET MULTIFILE TRANS =3A87 2EA29541 MOV NFILFLG,AL ;..USED IN TERMINAL ROUTINE =3A8B F6D0 NOT AL =3A8D 2EA2BE41 MOV SAVEFLG,AL ;STOP MEMORY SAVE IN TERM ROUTINE =3A91 2EA2C641 MOV LISTMOR,AL ;STOP ANY BUFFERED OUTPUT TO PRINTER =3A95 BB0044 MOV BX,OFFSET BOTTRAM ;RESET PRINTER BUFFER POINTERS =3A98 2E891ECC41 MOV HLSAVE1,BX =3A9D 2E891ECE41 MOV HLSAVE2,BX =3AA2 2EA09B41 MOV AL,TERMFLG ;SEE IF RETURN TO.. =3AA6 0AC0 OR AL,AL ;..TERMINAL MODE.. =3AA8 7529 3AD3 JNZ L@205 ;..AFTER X'FER. =3AAA E868EB 2615 CALL ILPRT =3AAD 0D0A2A2A2045 DB CR,LF,'** Entering terminal mode **',CR,LF,LF,BELL,0 6E746572696E 67207465726D 696E616C206D 6F6465202A2A 0D0A0A0700 =3AD0 E9E3EC 27B6 JMP TERM =3AD3 E9BBD1 0C91 L@205: JMP MENU = ; = ;Shows the time to transfer a file at various baud rates = ; = SENDTIM: =3AD6 E83CEB 2615 CALL ILPRT ;PRINT: =3AD9 46696C65206F DB 'File open: ',0 70656E3A2020 00 =3AE6 2E8B1EBA41 MOV BX,RCNT ;GET RECORD COUNT. =3AEB E8C3EA 25B1 CALL DECOUT ;PRINT DECIMAL NUMBER OF RECORDS CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 102 =3AEE E824EB 2615 CALL ILPRT =3AF1 202800 DB ' (',0 =3AF4 E8E5EA 25DC CALL DHXOUT ;NOW PRINT SIZE IN HEX. =3AF7 E81BEB 2615 CALL ILPRT =3AFA 204865782920 DB ' Hex) Records',CR,LF 5265636F7264 730D0A =3B09 53656E642074 DB 'Send time: ',0 696D653A2020 00 =3B16 2EA01C01 MOV AL,MSPEED ;GET THE SPEED INDICATOR =3B1A B600 MOV DH,0 =3B1C 8AD0 MOV DL,AL ;SET UP FOR TABLE ACCESS =3B1E BB933B MOV BX,OFFSET BTABLE ;POINT TO BAUD FACTOR TABLE =3B21 03DA ADD BX,DX ;INDEX TO PROPER FACTOR =3B23 03DA ADD BX,DX =3B25 8A17 MOV DL,BYTE PTR [BX];FACTOR IN DE =3B27 43 INC BX =3B28 8A37 MOV DH,BYTE PTR [BX] =3B2A 2E8B1EBA41 MOV BX,RCNT ;GET # OF RECORDS =3B2F E87F00 3BB1 CALL DIVHLDE ;DIVIDE HL BY VALUE IN A (RECORDS/MIN) =3B32 53 PUSH BX =3B33 8BD9 MOV BX,CX =3B35 E879EA 25B1 CALL DECOUT ;PRINT THE MINUTES PORTION =3B38 E8DAEA 2615 CALL ILPRT =3B3B 206D696E732C DB ' mins, ',0 2000 =3B43 BBA73B MOV BX,OFFSET SECTBL ;POINT TO DIVISORS FOR SECONDS =3B46 BA0000 MOV DX,0 ; CALCULATION =3B49 2EA01C01 MOV AL,MSPEED ;GET INDEX FOR BAUD RATE =3B4D 8AD0 MOV DL,AL =3B4F 03DA ADD BX,DX ;INDEX INTO TABLE =3B51 8A07 MOV AL,BYTE PTR [BX];GET MULTIPLIER = (SEC/REC) x 16 =3B53 5B POP BX ;GET REMAINDER =3B54 E86A00 3BC1 CALL MULHLA ;MULTIPLY THE 'HL' x 'A' =3B57 E87700 3BD1 CALL SHFTHL ;DIVIDE BY 16 =3B5A E87400 3BD1 CALL SHFTHL =3B5D E87100 3BD1 CALL SHFTHL =3B60 E86E00 3BD1 CALL SHFTHL =3B63 B700 MOV BH,0 =3B65 E849EA 25B1 CALL DECOUT ;PRINT THE SECONDS PORTION =3B68 E8AAEA 2615 CALL ILPRT =3B6B 207365637320 DB ' secs at ',0 61742000 =3B75 E84CE1 1CC4 CALL BAUDPRT =3B78 E89AEA 2615 CALL ILPRT =3B7B 546F2063616E DB 'To cancel use ctrl-X',CR,LF,0 63656C207573 65206374726C 2D580D0A00 =3B92 C3 RET = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 103 =3B93 05000D001300 BTABLE DW 5,13,19,25,29,48,96,192,384,0 ;RECORDS/MIN FOR 110-9600 BAUD 19001D003000 6000C0008001 0000 =3BA7 C04A33262114 SECTBL DB 192,74,51,38,33,20,11,5,3,0 0B050300 = ; = ; = ;----> DIVHLDE: DIVIDES 'HL' BY VALUE IN 'DE', = ; UPON EXIT: 'BC'=QUOTIENT,'L'=REMAINDER = ; = DIVHLDE: =3BB1 52 PUSH DX ;SAVE DIVISOR = ; MOV AL,DL = ; NOT AL ;NEGATE DIVISOR = ; MOV DL,AL = ; MOV AL,DH = ; NOT AL = ; MOV DH,AL = ; INC DX ;DE IS NOW TWOS COMPLEMENTED =3BB2 F7DA NEG DX =3BB4 B90000 MOV CX,0 ;INITIATE QUOTIENT =3BB7 03DA DIVL1: ADD BX,DX ;SUBTRACT DIVISOR FROM DIVIDEND =3BB9 41 INC CX ;INCREASE QUOTIENT =3BBA 72FB 3BB7 JC DIVL1 ;LOOP UNTIL SIGN CHANGES =3BBC 49 DEC CX ;ADJUST QUOTIENT =3BBD 5A POP DX ;RETRIEVE DIVISOR =3BBE 03DA ADD BX,DX ;ADJUST REMAINDER =3BC0 C3 RET = = ; = ;----> MULHLA: MULTIPLY THE VALUE IN 'HL' BY THE VALUE IN 'A' = ; RETURN WITH ANSWER IN 'HL' = ; =3BC1 87DA MULHLA: XCHG BX,DX ;MULTIPLICAND TO DE =3BC3 BB0000 MOV BX,OFFSET 0 ;INITIALIZE PRODUCT =3BC6 FEC0 INC AL ;ADJUST MULTIPLIER =3BC8 FEC8 MULLP: DEC AL =3BCA 7501 3BCD JNZ L@206 =3BCC C3 RET = L@206: =3BCD 03DA ADD BX,DX =3BCF EBF7 3BC8 JMPS MULLP = ; = ; SHIFT 'HL' REGISTER PAIR ONE BIT TO THE RIGHT = ; =3BD1 F8 SHFTHL: CLC ;CLEAR THE CARRY =3BD2 D1DB RCR BX,1 =3BD4 C3 RET = ; = ;**************************************************************** = ;* * CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 104 = ;* CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20 * = ;* 8080 Mnemonics * = ;* * = ;* These subroutines will compute and check a true 16-bit * = ;* Cyclic Redundancy Code for a message of arbitrary length. * = ;* * = ;* The use of this scheme will guarantee detection of all * = ;* single and double bit errors, all errors with an odd * = ;* number of error bits, all burst errors of length 16 or * = ;* less, 99.9969% of all 17-bit error bursts, and 99.9984% * = ;* of all possible longer error bursts. (Ref: Computer * = ;* Networks, Andrew S. Tanenbaum, Prentiss-Hall, 1981) * = ;* * = ;* Designed & coded by Paul Hansknecht, June 13, 1981 * = ;* * = ;* Copyright (c) 1981, Carpenter Associates * = ;* Box 451 * = ;* Bloomfield Hills, MI 48013 * = ;* 313/855-3074 * = ;* * = ;* This program may be freely reproduced for non-profit use. * = ;* * = ;**************************************************************** = ; = ; = CLRCRC: ;RESET CRC ACCUMULATOR FOR A NEW MESSAGE. =3BD5 2EC7061B3C00 MOV CRCVAL,0 00 =3BDC C3 RET = ; = UPDCRC: ;UPDATE CRC ACCUMULATOR USING BYTE IN (A). =3BDD 50 PUSH AX =3BDE 51 PUSH CX =3BDF 53 PUSH BX =3BE0 B508 MOV CH,8 =3BE2 8AC8 MOV CL,AL =3BE4 2E8B1E1B3C MOV BX,CRCVAL = UPDLOOP: =3BE9 D0C1 ROL CL,1 = ; MOV AL,CL = ; ROL AL,1 = ; MOV CL,AL =3BEB D1D3 RCL BX,1 =3BED 7304 3BF3 JNC SKIPIT =3BEF 81F32110 XOR BX,1021H =3BF3 FECD SKIPIT: DEC CH ;AND XOR 05H FOR XOR 21H IN THE ADJACENT CODE =3BF5 75F2 3BE9 JNZ UPDLOOP =3BF7 2E891E1B3C MOV CRCVAL,BX =3BFC 5B POP BX =3BFD 59 POP CX =3BFE 58 POP AX =3BFF C3 RET CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 105 = ; = FINCRC: ;FINISH CRC CALCULATION FOR OUTPUT MESSAGE =3C00 50 PUSH AX =3C01 32C0 XOR AL,AL =3C03 E8D7FF 3BDD CALL UPDCRC =3C06 E8D4FF 3BDD CALL UPDCRC =3C09 2E8B161B3C MOV DX,CRCVAL =3C0E 58 POP AX =3C0F C3 RET = ; = CHKCRC: ;CHECK CRC BYTES OF RECEIVED MESSAGE =3C10 2EA11B3C MOV AX,CRCVAL =3C14 0AC4 OR AL,AH =3C16 7402 3C1A JZ CHKCRCRT =3C18 B0FF MOV AL,0FFH = CHKCRCRT: =3C1A C3 RET = ; =3C1B 0000 CRCVAL DW 0 = ; = INCLUDE a:FILES.A86 = ; = ; FILES.ASM = ; = ;Disk file routines for MODEM9.xx. = ; = ; = ;Multi-file access subroutine. Allows processing of multiple files = ;(i.e., *.ASM) from disk. This routine builds the proper name in the = ;FCB each time it is called. This command would be used in such pro- = ;grams such as modem transfer, tape save, etc. in which you want to = ;process single or multiple files. = ; = ;The FCB will be set up with the next name, ready to do normal proces- = ;sing (OPEN, READ, etc.) when routine is called. = ; = ;Carry is set if no more names can be found = ; = MFNAME: ;INIT DMA ADDR, FCB =3C1D B11A MOV CL,STDMA =3C1F BA8000 MOV DX,OFFSET 80H =3C22 CDE0 INT 224 =3C24 C606680000 MOV byte ptr .FCBEXT,0 =3C29 2EF606C941FF TEST MFFLG1,0FFH =3C2F 7535 3C66 JNZ MFN01 ;IF FIRST TIME =3C31 2EC606C94101 MOV MFFLG1,1 ;TURN OFF 1ST TIME SW =3C37 BB5C00 MOV BX,OFFSET FCB ;SAVE THE REQUESTED NAME =3C3A BA1943 MOV DX,OFFSET MFREQ =3C3D B90C00 MOV CX,OFFSET 12 =3C40 E88400 3CC7 CALL MOVER =3C43 A05C00 MOV AL,BYTE PTR .FCB CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 106 =3C46 2EA22543 MOV MFCUR,AL ;SAVE DISK IN CURRENT FCB =3C4A BB1943 MOV BX,OFFSET MFREQ ;SRCHF REQ NAME =3C4D BA5C00 MOV DX,OFFSET FCB =3C50 B90C00 MOV CX,OFFSET 12 =3C53 E87100 3CC7 CALL MOVER =3C56 51 PUSH CX =3C57 52 PUSH DX =3C58 53 PUSH BX =3C59 B111 MOV CL,SRCHF =3C5B BA5C00 MOV DX,OFFSET FCB =3C5E CDE0 INT 224 =3C60 5B POP BX =3C61 5A POP DX =3C62 59 POP CX =3C63 E92600 3C8C JMP MFN02 = ; =3C66 BB2543 MFN01: MOV BX,OFFSET MFCUR ;SRCHF CURR NAME =3C69 BA5C00 MOV DX,OFFSET FCB =3C6C B90C00 MOV CX,OFFSET 12 =3C6F E85500 3CC7 CALL MOVER =3C72 B111 MOV CL,SRCHF =3C74 BA5C00 MOV DX,OFFSET FCB =3C77 CDE0 INT 224 =3C79 BB1943 MOV BX,OFFSET MFREQ ;SRCHN REQ NAME =3C7C BA5C00 MOV DX,OFFSET FCB =3C7F B90C00 MOV CX,OFFSET 12 =3C82 E84200 3CC7 CALL MOVER =3C85 B112 MOV CL,SRCHN =3C87 BA5C00 MOV DX,OFFSET FCB =3C8A CDE0 INT 224 =3C8C FEC0 MFN02: INC AL ;RETURN CARRY IF NOT FOUND =3C8E F9 STC =3C8F 7505 3C96 JNZ MFFIX1 =3C91 2EA2C941 MOV MFFLG1,AL =3C95 C3 RET = ; =3C96 FEC8 MFFIX1: DEC AL ;MOVE NAME FOUND TO CURR =3C98 2403 AND AL,3 =3C9A 02C0 ADD AL,AL =3C9C 02C0 ADD AL,AL =3C9E 02C0 ADD AL,AL =3CA0 02C0 ADD AL,AL =3CA2 02C0 ADD AL,AL =3CA4 0481 ADD AL,81H =3CA6 8AD8 MOV BL,AL =3CA8 B700 MOV BH,0 =3CAA 53 PUSH BX ;SAVE NAME POINTER =3CAB BA2643 MOV DX,OFFSET MFCUR+1 =3CAE B90B00 MOV CX,OFFSET 11 =3CB1 E81300 3CC7 CALL MOVER =3CB4 5B POP BX ;MOVE NAME FOUND TO FCB =3CB5 BA5D00 MOV DX,OFFSET FCB+1 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 107 =3CB8 B90B00 MOV CX,OFFSET 11 =3CBB E80900 3CC7 CALL MOVER =3CBE 32C0 XOR AL,AL ;SETUP FCB =3CC0 A26800 MOV BYTE PTR .FCBEXT,AL =3CC3 A27C00 MOV BYTE PTR .FCBRNO,AL =3CC6 C3 RET = ; = ; Move subroutine = ; =3CC7 8A07 MOVER: MOV AL,BYTE PTR [BX] =3CC9 87DA XCHG BX,DX =3CCB 8807 MOV BYTE PTR [BX],AL =3CCD 87DA XCHG BX,DX =3CCF 43 INC BX =3CD0 42 INC DX =3CD1 49 DEC CX =3CD2 75F3 3CC7 JNZ MOVER =3CD4 C3 RET = ; = ;Lists directory and gives free space remaining on the requested drive. = ; = DIRLST: =3CD5 BAD241 MOV DX,OFFSET CMDBUF ;PUT COMMAND LINE IN FCB =3CD8 BB5C00 MOV BX,OFFSET 5CH =3CDB E85FE9 263D CALL CPMLINE =3CDE BB3143 MOV BX,OFFSET SRCHFCB =3CE1 E8C9F0 2DAD CALL INITFCBS =3CE4 A06C00 MOV AL,BYTE PTR .6CH ;GET DRIVE # =3CE7 2EA23143 MOV SRCHFCB,AL =3CEB A06D00 MOV AL,BYTE PTR .6DH =3CEE 3C20 CMP AL,20H ;IF BLANK GET ALL NAMES =3CF0 50 PUSH AX =3CF1 7503 3CF6 JNZ DIRLST1 =3CF3 E86601 3E5C CALL QSTMARK = DIRLST1: =3CF6 58 POP AX =3CF7 7403 3CFC JZ DIRLST2 =3CF9 E86F01 3E6B CALL MOVENAME ;ELSE MOVE NAME INTO FCB = DIRLST2: =3CFC BA8000 MOV DX,OFFSET 80H =3CFF B11A MOV CL,STDMA =3D01 CDE0 INT 224 =3D03 2EC606524300 MOV NAMEGD,0 =3D09 2EA02001 MOV AL,NOOFCOL ;GET NUMBER OF COLUMNS =3D0D 2EA25343 MOV NAMECT,AL ;STORE TO CALCULATE CRLF POSITION =3D11 BA3143 MOV DX,OFFSET SRCHFCB =3D14 B111 MOV CL,SRCHF ;DO FIRST SEARCH =3D16 CDE0 INT 224 =3D18 3CFF CMP AL,0FFH =3D1A 746C 3D88 JZ NOFILE =3D1C 50 PUSH AX =3D1D 58 DIRLP: POP AX CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 108 =3D1E E85601 3E77 CALL GETADD =3D21 83C30F ADD BX,15 ;OFFSET FOR RECORD COUNT =3D24 8A07 MOV AL,BYTE PTR [BX] =3D26 0AC0 OR AL,AL =3D28 7432 3D5C JZ NEXTSR ;NO LIST IF FILE IS ZERO LENGTH =3D2A 83C3FB ADD BX,-5 ;POINT TO $SYS ATTRIB BYTE =3D2D 8A07 MOV AL,BYTE PTR [BX] =3D2F 2480 AND AL,80H =3D31 7529 3D5C JNZ NEXTSR ;NO LIST IF $SYS FILE =3D33 83C3F6 ADD BX,-10 ;POINT TO BEGINNING OF NAME =3D36 43 INC BX ;POINT TO FIRST LETTER =3D37 BA483D MOV DX,OFFSET PRNTNAME =3D3A B508 MOV CH,8 =3D3C E8A4CE 0BE3 CALL MOVE =3D3F 42 INC DX =3D40 B503 MOV CH,3 =3D42 E89ECE 0BE3 CALL MOVE =3D45 E8CDE8 2615 CALL ILPRT = PRNTNAME: =3D48 202020202020 DB ' ','.',' ',' ', 0 ;8 SPACES, PERIOD, 3 SPACES, 1 SPACE 20202E202020 2000 =3D56 2EC6065243FF MOV NAMEGD,0FFH =3D5C BA3143 NEXTSR: MOV DX,OFFSET SRCHFCB =3D5F B112 MOV CL,SRCHN ;DO NEXT SEARCH =3D61 CDE0 INT 224 =3D63 3CFF CMP AL,0FFH =3D65 742C 3D93 JZ DIRDONE =3D67 50 PUSH AX =3D68 2EF6065243FF TEST NAMEGD,0FFH =3D6E 74AD 3D1D JZ DIRLP =3D70 2EFE0E5343 DEC NAMECT =3D75 7505 3D7C JNZ NEXTSR1 =3D77 E8D600 3E50 CALL NEWCT =3D7A EB03 3D7F JMPS NEXTSR2 = NEXTSR1: =3D7C E8CA00 3E49 CALL FENCE = NEXTSR2: =3D7F 2EC606524300 MOV NAMEGD,0 =3D85 E995FF 3D1D JMP DIRLP = ; =3D88 E88AE8 2615 NOFILE: CALL ILPRT =3D8B 4E4F2046494C DB 'NO FILE',0 4500 = ; = ; Determines free space remaining = ; = DIRDONE: =3D93 2EA03143 MOV AL,SRCHFCB =3D97 0AC0 OR AL,AL =3D99 7408 3DA3 JZ DEFLT =3D9B FEC8 DEC AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 109 =3D9D 8AD0 MOV DL,AL =3D9F B10E MOV CL,SELDSK =3DA1 CDE0 INT 224 =3DA3 B11F DEFLT: MOV CL,GETPARM ;CURRENT DISK PARAMETER BLOACK =3DA5 CDE0 INT 224 =3DA7 83C302 ADD BX,2 =3DAA 268A07 MOV AL,ES: BYTE PTR [BX] ;GET BLOCK SHIFT FACTOR =3DAD 2EA25743 MOV BSHIFTF,AL =3DB1 43 INC BX ;BUMP TO BLOCK MASK =3DB2 268A07 MOV AL,ES: BYTE PTR [BX] ;GET IT =3DB5 2EA25643 MOV BMASK,AL =3DB9 83C302 ADD BX,2 =3DBC 268B17 MOV DX,ES: WORD PTR [BX] ; GET MAX BLOCK NUMBER = ; MOV DL,ES: BYTE PTR [BX] ;GET MAX BLOCK NUMBER = ; INC BX = ; MOV DH,ES: BYTE PTR [BX] = ; XCHG BX,DX =3DBF 2E89165443 MOV BMAX,DX ;PUT IT AWAY =3DC4 B11B MOV CL,GETALC ;ADDRESS OF CP/M ALLOCATION VECTOR =3DC6 CDE0 INT 224 =3DC8 87DA XCHG BX,DX ;GET ITS LENGTH =3DCA 2E8B1E5443 MOV BX,BMAX =3DCF 43 INC BX =3DD0 B90000 MOV CX,0 ;INITIALIZE BLOCK COUNT TO ZERO =3DD3 52 GSPBYT: PUSH DX ;SAVE ALLOCATION ADDRESS =3DD4 87DA XCHG BX,DX =3DD6 268A07 MOV AL,ES: BYTE PTR [BX] =3DD9 87DA XCHG BX,DX =3DDB B208 MOV DL,8 ;SET TO PROCESS 8 BLOCKS =3DDD D0D0 GSPLUP: RCL AL,1 ;TEST BIT =3DDF 7201 3DE2 JC NOTFRE =3DE1 41 INC CX =3DE2 8AF0 NOTFRE: MOV DH,AL ;SAVE BITS =3DE4 4B DEC BX =3DE5 8AC3 MOV AL,BL =3DE7 0AC7 OR AL,BH =3DE9 740B 3DF6 JZ ENDALC ;QUIT IF OUT OF BLOCKS =3DEB 8AC6 MOV AL,DH ;RESTORE BITS =3DED FECA DEC DL ;COUNT DOWN 8 BITS =3DEF 75EC 3DDD JNZ GSPLUP ;DO ANOTHER BIT =3DF1 5A POP DX ;BUMP TO NEXT COUNT OF ALLOCATION VECTOR =3DF2 42 INC DX =3DF3 E9DDFF 3DD3 JMP GSPBYT ;PROCESS IT = ; =3DF6 5A ENDALC: POP DX ;CLEAR ALLOCATION VECTOR FROM STACK =3DF7 8BD9 MOV BX,CX ; COPY TO BX =3DF9 2EA05743 MOV AL,BSHIFTF ;GET BLOCK SHIFT FACTOR =3DFD 2C03 SUB AL,3 ;CONVERT FROM RECORDS TO THOUSANDS =3DFF 7406 3E07 JZ PRTFREE ;SKIP SHIFTS IF 1K BLOCKS =3E01 03DB FREKLP: ADD BX,BX ;MULTIPLY BLOCKS BY 'K PER BLOCK' =3E03 FEC8 DEC AL =3E05 75FA 3E01 JNZ FREKLP CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 110 = PRTFREE: =3E07 53 PUSH BX =3E08 E80AE8 2615 CALL ILPRT =3E0B 0D0A44726976 DB CR,LF,'Drive ',0 652000 =3E14 2EA03143 MOV AL,SRCHFCB ;IF NO DRIVE, GET =3E18 0AC0 OR AL,AL ;LOGGED IN DRIVE =3E1A 7506 3E22 JNZ PRNTHD =3E1C B119 MOV CL,CURDSK =3E1E CDE0 INT 224 =3E20 FEC0 INC AL =3E22 0440 PRNTHD: ADD AL,'A'-1 =3E24 2EA22B3E MOV DRNAME,AL =3E28 E8EAE7 2615 CALL ILPRT =3E2B 202068617320 DRNAME DB ' has ',0 00 =3E32 5B POP BX ;GET NUMBER OF BYTES AVAILABLE =3E33 E87BE7 25B1 CALL DECOUT =3E36 E8DCE7 2615 CALL ILPRT =3E39 4B2062797465 DB 'K bytes free',CR,LF,0 732066726565 0D0A00 =3E48 C3 RET = ; = ; Subroutines = ; =3E49 E8C9E7 2615 FENCE: CALL ILPRT =3E4C 7C2000 DB '| ',0 =3E4F C3 RET = ; =3E50 E8F3E6 2546 NEWCT: CALL CRLF =3E53 2EA02001 MOV AL,NOOFCOL =3E57 2EA25343 MOV NAMECT,AL =3E5B C3 RET = ; = QSTMARK: =3E5C B03F MOV AL,'?' ;IF BLANK IN FCB, PUT IN 11 ?'s =3E5E B50B MOV CH,11 =3E60 BB3243 MOV BX,OFFSET SRCHFCB+1 =3E63 8807 QSTLP: MOV BYTE PTR [BX],AL =3E65 43 INC BX =3E66 FECD DEC CH =3E68 75F9 3E63 JNZ QSTLP =3E6A C3 RET = ; = MOVENAME: =3E6B BB6D00 MOV BX,OFFSET 6DH =3E6E BA3243 MOV DX,OFFSET SRCHFCB+1 =3E71 B50B MOV CH,11 =3E73 E86DCD 0BE3 CALL MOVE ;MOVE IN MAIN PROGRAM =3E76 C3 RET = ; CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 111 =3E77 2403 GETADD: AND AL,03H ;GET MOD4 FOR CP/M 1.4 =3E79 02C0 ADD AL,AL ;ADD 32 =3E7B 02C0 ADD AL,AL =3E7D 02C0 ADD AL,AL =3E7F 02C0 ADD AL,AL =3E81 02C0 ADD AL,AL =3E83 8AD0 MOV DL,AL =3E85 B600 MOV DH,0 =3E87 BB8000 MOV BX,OFFSET 80H ;ADD DMA OFFSET =3E8A 03DA ADD BX,DX =3E8C C3 RET = ; = ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'. = ; = CKCPM2: =3E8D B11A MOV CL,STDMA =3E8F BA8000 MOV DX,OFFSET 80H =3E92 CDE0 INT 224 =3E94 B111 MOV CL,SRCHF ;SEARCH FOR FILE =3E96 BA5C00 MOV DX,OFFSET FCB =3E99 CDE0 INT 224 =3E9B 3CFF CMP AL,0FFH =3E9D 7501 3EA0 JNZ CKCPM2A =3E9F C3 RET = CKCPM2A: =3EA0 02C0 ADD AL,AL =3EA2 02C0 ADD AL,AL ;MULT A-REG BY.. =3EA4 02C0 ADD AL,AL =3EA6 02C0 ADD AL,AL ;..32 TO FIND.. =3EA8 02C0 ADD AL,AL ;..NAME IN DMA. =3EAA BB8000 MOV BX,OFFSET 80H =3EAD 02C3 ADD AL,BL =3EAF 8AD8 MOV BL,AL ;HL POINTS TO DIR NAME =3EB1 BA0900 MOV DX,OFFSET 9 =3EB4 03DA ADD BX,DX ;POINT TO R/O ATTRIB BYTE =3EB6 8A07 MOV AL,BYTE PTR [BX] =3EB8 2480 AND AL,80H ;TEST MSB =3EBA 7509 3EC5 JNZ MKCHG ;IF SET, MAKE CHANGE =3EBC 43 INC BX ;CHECK SYSTEM ATTRIB BYTE =3EBD 8A07 MOV AL,BYTE PTR [BX] =3EBF 2480 AND AL,80H =3EC1 7501 3EC4 JNZ CKCPM2B ; IS $SYS OR $R/O =3EC3 C3 RET = CKCPM2B: =3EC4 4B DEC BX =3EC5 BAF8FF MKCHG: MOV DX, -8 =3EC8 03DA ADD BX,DX ;POINT HL TO FILENAME + 1 =3ECA BA5D00 MOV DX,OFFSET FCB+1 ;MOVE DIR NAME TO FCB.. =3ECD B50B MOV CH,11 ;..WITHOUT CHANGING DRIVE. =3ECF E811CD 0BE3 CALL MOVE =3ED2 BB6500 MOV BX,OFFSET FCB+9 ;R/O ATTRIB =3ED5 80277F AND BYTE PTR [BX],07FH ; STRIP R/O ATTRIB CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 112 =3ED8 43 INC BX =3ED9 80277F AND BYTE PTR [BX],07FH ; STRIP SYS ATTRIB =3EDC BA5C00 MOV DX,OFFSET FCB =3EDF B11E MOV CL,30 ;SET NEW ATTRIBS IN DIR =3EE1 CDE0 INT 224 = ; = ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE = ; = PLANCHG: =3EE3 BB5C00 MOV BX,OFFSET FCB ;CHANGE NAME TO TYPE "BAK" =3EE6 BA6C00 MOV DX,OFFSET 6CH =3EE9 B509 MOV CH,9 ;MOVE DRIVE AND NAME (NOT TYPE) =3EEB E8F5CC 0BE3 CALL MOVE =3EEE BB7500 MOV BX,OFFSET 75H ;START OF TYPE IN FCB2 =3EF1 C60742 MOV BYTE PTR [BX],'B' =3EF4 43 INC BX =3EF5 C60741 MOV BYTE PTR [BX],'A' =3EF8 43 INC BX =3EF9 C6074B MOV BYTE PTR [BX],'K' =3EFC BA6C00 MOV DX,OFFSET 6CH =3EFF B113 MOV CL,ERASE ;ERASE ANY PREV BACKUPS =3F01 CDE0 INT 224 =3F03 BB6C00 MOV BX,OFFSET 6CH ;FCB2 DR FIELD SHOULD.. =3F06 C60700 MOV BYTE PTR [BX],0 ;..0 FOR RENAME. =3F09 BA5C00 MOV DX,OFFSET FCB =3F0C B117 MOV CL,23 ;RENAME =3F0E CDE0 INT 224 =3F10 C3 RET = ; = CKBAKUP: =3F11 2EA00301 MOV AL,BAKUPBYTE =3F15 0AC0 OR AL,AL =3F17 740E 3F27 JZ CKBAKUPR =3F19 B111 MOV CL,SRCHF =3F1B BA5C00 MOV DX,OFFSET FCB =3F1E CDE0 INT 224 =3F20 FEC0 INC AL =3F22 7403 3F27 JZ CKBAKUPR =3F24 E9BCFF 3EE3 JMP PLANCHG ;IN "CKCPM2" - RET DONE THERE = CKBAKUPR: =3F27 C3 RET = ; = ERASFIL: =3F28 BB5C00 MOV BX,OFFSET FCB ;CHECK FOR WILD CARDS =3F2B B50B MOV CH,11 = ERASFIL1: =3F2D 43 INC BX =3F2E 8A07 MOV AL,BYTE PTR [BX] =3F30 3C3F CMP AL,'?' ;IS IT A WILD CARD? =3F32 745C 3F90 JZ WILDERR ;GO IF SO =3F34 FECD DEC CH =3F36 75F5 3F2D JNZ ERASFIL1 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 113 =3F38 2EA09D41 MOV AL,BATCHFLG ;DON'T ASK FOR ERASE.. =3F3C 0AC0 OR AL,AL ;..IN MULTI-FILE MODE,.. =3F3E 7448 3F88 JZ NOASK ;..JUST DO IT. =3F40 BA5C00 MOV DX,OFFSET FCB =3F43 B111 MOV CL,SRCHF =3F45 CDE0 INT 224 =3F47 FEC0 INC AL =3F49 74DC 3F27 JZ CKBAKUPR =3F4B E8C7E6 2615 CALL ILPRT =3F4E 46696C652065 DB 'File exists -- Type ''Y'' to erase: ',BELL,0 786973747320 2D2D20547970 652027592720 746F20657261 73653A200700 =3F72 E8FEE5 2573 CALL KEYIN =3F75 50 PUSH AX =3F76 E8DAE5 2553 CALL TIPE =3F79 58 POP AX =3F7A E829E6 25A6 CALL UCASE =3F7D 3C59 CMP AL,'Y' =3F7F E90200E90CCD 3F84 JMP $+5 ! JMP MENU =3F85 E8BEE5 2546 CALL CRLF =3F88 BA5C00 NOASK: MOV DX,OFFSET FCB =3F8B B113 MOV CL,ERASE =3F8D CDE0 INT 224 =3F8F C3 RET = ; = WILDERR: =3F90 5B POP BX ;RESTORE STACK =3F91 E881E6 2615 CALL ILPRT =3F94 2B2B204E6F20 DB '++ No ambiguous file names allowed ++',CR,LF,BELL,0 616D62696775 6F7573206669 6C65206E616D 657320616C6C 6F776564202B 2B0D0A0700 =3FBD E9D1CC 0C91 JMP MENU = ; = BLKFILE: =3FC0 E852E6 2615 CALL ILPRT ;ROUTINE IF NO FILE IS NAMED FOR "SEND" OR "RECEIVE" =3FC3 0D0A4E6F2066 DB CR,LF,'No file specified',CR,LF,BELL,0 696C65207370 656369666965 640D0A0700 =3FDA E9B4CC 0C91 JMP MENU = = MAKEFIL: =3FDD BA5C00 MOV DX,OFFSET FCB =3FE0 B116 MOV CL,MAKE =3FE2 CDE0 INT 224 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 114 =3FE4 FEC0 INC AL =3FE6 7401 3FE9 JZ MAKEFIL1 =3FE8 C3 RET = MAKEFIL1: =3FE9 E8A0F9 398C CALL ERXIT =3FEC 4572726F7220 DB 'Error - Can''t make file',CR,LF 2D2043616E27 74206D616B65 2066696C650D 0A =4005 446972656374 DB 'Directory is likely full',CR,LF,'$' 6F7279206973 206C696B656C 792066756C6C 0D0A24 = ; =4020 B123 CNREC: MOV CL,FILSIZ ;COMPUTE FILE SIZE FUNCTION IN CP/M 2.x =4022 BA5C00 MOV DX,OFFSET FCB ;POINT TO FILE CONTROL BLOCK =4025 CDE0 INT 224 =4027 8B1E7D00 MOV BX,WORD PTR .FCB+33 ;GET RECORD COUNT =402B 2E891EBA41 MOV RCNT,BX ;STORE IT =4030 BB0000 MOV BX, 0 ;ZERO HL =4033 891E7D00 MOV WORD PTR .FCB+33,BX ;RESET RANDOM RECORD IN FCB =4037 C3 RET = ; = OPENFIL: =4038 32C0 XOR AL,AL =403A A26800 MOV BYTE PTR .FCBEXT,AL =403D BA5C00 MOV DX,OFFSET FCB =4040 B10F MOV CL,OPEN =4042 CDE0 INT 224 =4044 FEC0 INC AL =4046 7513 405B JNZ OPENOK =4048 E841F9 398C CALL ERXIT =404B 43616E277420 DB 'Can''t open file$' 6F70656E2066 696C6524 = OPENOK: =405B 2EA09741 MOV AL,QFLG =405F 0AC0 OR AL,AL =4061 7501C3 4064 JNZ $+3 ! RET =4064 E86FFA 3AD6 CALL SENDTIM ;A LIB MACRO SHOWS TIME TO SEND =4067 C3 RET = ; = CLOSFIL: =4068 BA5C00 MOV DX,OFFSET FCB =406B B110 MOV CL,CLOSE =406D CDE0 INT 224 =406F FEC0 INC AL =4071 7401 4074 JZ CLOSFIL1 =4073 C3 RET = CLOSFIL1: CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 115 =4074 E815F9 398C CALL ERXIT =4077 43616E277420 DB 'Can''t close file$' 636C6F736520 66696C6524 = RDSECT: =4088 2EFE0EB841 DEC SECINBF =408D 7811 40A0 JS RDBLOCK =408F 2E8B1EB641 MOV BX,SECPTR =4094 BA8000 MOV DX,OFFSET 80H =4097 E847CB 0BE1 CALL MOVE128 =409A 2E891EB641 MOV SECPTR,BX =409F C3 RET = ; = RDBLOCK: =40A0 2EA0B541 MOV AL,EOFLG =40A4 3C01 CMP AL,1 =40A6 F9 STC =40A7 7501 40AA JNZ RDBLOCK1 =40A9 C3 RET = RDBLOCK1: =40AA B100 MOV CL,0 =40AC BA5843 MOV DX,OFFSET DBUF = RDSECLP: =40AF 51 PUSH CX =40B0 52 PUSH DX =40B1 B11A MOV CL,STDMA =40B3 CDE0 INT 224 =40B5 BA5C00 MOV DX,OFFSET FCB =40B8 B114 MOV CL,READ =40BA CDE0 INT 224 =40BC 5A POP DX =40BD 59 POP CX =40BE 0AC0 OR AL,AL =40C0 741D 40DF JZ RDSECOK =40C2 FEC8 DEC AL =40C4 742B 40F1 JZ REOF =40C6 E8C3F8 398C CALL ERXIT =40C9 2B2B2046696C DB '++ File read error ++$' 652072656164 206572726F72 202B2B24 = RDSECOK: =40DF BB8000 MOV BX,OFFSET 80H =40E2 03DA ADD BX,DX =40E4 87DA XCHG BX,DX =40E6 FEC1 INC CL =40E8 8AC1 MOV AL,CL =40EA 3C80 CMP AL,DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS =40EC 740B 40F9 JZ RDBFULL =40EE E9BEFF 40AF JMP RDSECLP = ; =40F1 B001 REOF: MOV AL,1 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 116 =40F3 2EA2B541 MOV EOFLG,AL =40F7 8AC1 MOV AL,CL = RDBFULL: =40F9 2EA2B841 MOV SECINBF,AL =40FD BB5843 MOV BX,OFFSET DBUF =4100 2E891EB641 MOV SECPTR,BX =4105 BA8000 MOV DX,OFFSET 80H =4108 B11A MOV CL,STDMA =410A CDE0 INT 224 =410C E979FF 4088 JMP RDSECT = ; = WRSECT: =410F 2E8B1EB641 MOV BX,SECPTR =4114 87DA XCHG BX,DX =4116 BB8000 MOV BX,OFFSET 80H =4119 E8C5CA 0BE1 CALL MOVE128 =411C 87DA XCHG BX,DX =411E 2E891EB641 MOV SECPTR,BX =4123 2EA0B841 MOV AL,SECINBF =4127 FEC0 INC AL =4129 2EA2B841 MOV SECINBF,AL =412D 3C80 CMP AL,DBUFSIZ*8 ;BUFFER SIZE IN 128 BYTE SECTORS =412F 7401 4132 JZ WRBLOCK =4131 C3 RET = WRBLOCK: =4132 2EA0B841 MOV AL,SECINBF =4136 0AC0 OR AL,AL =4138 7501 413B JNZ WRBLOCK1 =413A C3 RET = WRBLOCK1: =413B 8AC8 MOV CL,AL =413D BA5843 MOV DX,OFFSET DBUF = DKWRLP: =4140 53 PUSH BX =4141 52 PUSH DX =4142 51 PUSH CX =4143 B11A MOV CL,STDMA =4145 CDE0 INT 224 =4147 BA5C00 MOV DX,OFFSET FCB =414A B115 MOV CL,WRITE =414C CDE0 INT 224 =414E 59 POP CX =414F 5A POP DX =4150 5B POP BX =4151 0AC0 OR AL,AL =4153 751A 416F JNZ WRERR =4155 BB8000 MOV BX,OFFSET 80H =4158 03DA ADD BX,DX =415A 87DA XCHG BX,DX =415C FEC9 DEC CL =415E 75E0 4140 JNZ DKWRLP =4160 32C0 XOR AL,AL CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 117 =4162 2EA2B841 MOV SECINBF,AL =4166 BB5843 MOV BX,OFFSET DBUF =4169 2E891EB641 MOV SECPTR,BX =416E C3 RET = ; =416F B118 WRERR: MOV CL,CAN =4171 E80FF7 3883 CALL SEND =4174 E815F8 398C CALL ERXIT =4177 0D0A4572726F DB CR,LF,'Error writing file',CR,LF,'$' 722077726974 696E67206669 6C650D0A24 = ; = INCLUDE a:FINISH.A86 = ; = ; FINISH.ASM = ; = ;Parameters and buffers for MODEM9.xx. = ; =418E 065352544548 COMPLIST DB 6, 'S', 'R', 'T', 'E', 'H', 'L' 4C =4195 00 NFILFLG DB FALSE ;NORMALLY SET TO FALSE. ALLOWS WRITE TO.. = ; ;..MEMORY IN TERMINAL MODE. =4196 00 OPTION DB 0 = ; = 4197 OPTBL EQU $ = ; =4197 51 QFLG DB 'Q' =4198 52 RSEEFLG DB 'R' =4199 53 SSEEFLG DB 'S' =419A 56 VSEEFLG DB 'V' =419B 54 TERMFLG DB 'T' =419C 4C LOCCHFLG DB 'L' =419D 42 BATCHFLG DB 'B' ;SET TO 'B' BY MENU. DOES NOT ALLOW MULTIFILE = ;XFER WHEN PROGRAM INITIALLY CALLED. = 419E OPTBE EQU $ = =419E 51525356544C RESTROPT DB 'Q','R','S','V','T','L','B' 42 = ;MUST BE IN SAME ORDER AS TABLE ABOVE = ; = ;THE NEXT 12 BYTES EQUAL THE NUMBER OF BYTES BETWEEN SECTNOB AND SECTNOE = RESTSN: =41A5 0000000000 DB 0,0,0,0,0 =41AA 5843 DW DBUF =41AC 0000000000 DB 0,0,0,0,0 = ; = 41B1 SECTNOB EQU $ ;START OF TABLE MARKER =41B1 00 RCVSNO DB 0 ;\ =41B2 0000 SECTNO DW 0 ; \ =41B4 00 ERRCT DB 0 ; \ CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 118 =41B5 00 EOFLG DB 0 ; \ =41B6 5843 SECPTR DW DBUF ; 12 BYTES BETWEEN TABLE MARKERS =41B8 00 SECINBF DB 0 ; / =41B9 00 MAXEXT DB 0 ; / =41BA 0000 RCNT DW 0 ; / =41BC 00 DATAFLG DB 0 ;/ = 41BD SECTNOE EQU $ ;END OF TABLE MARKER = ; =41BD 7F MODCTLB DB 07FH =41BE 00 SAVEFLG DB FALSE =41BF 00 LASTBYT1 DB 0 =41C0 00 LASTBYT2 DB 0 =41C1 00 EXACFLG DB 0 =41C2 00 ECHOFLG DB FALSE =41C3 00 LOCFLG DB FALSE =41C4 FF CKSUMFLG DB TRUE =41C5 00 LISTFLG DB FALSE =41C6 00 LISTMOR DB FALSE =41C7 FF FSTFLG DB TRUE =41C8 FF FIRSTME DB TRUE ;FIRST SOH RECEIVED SWITCH (ZERO AFTER 1ST SOH) =41C9 00 MFFLG1 DB 0 ;1ST TIME SW FOR MFACESS =41CA 0044 HLSAVE DW BOTTRAM =41CC 0044 HLSAVE1 DW BOTTRAM =41CE 0044 HLSAVE2 DW BOTTRAM =41D0 4B01 STRSAVE DW STRINGS =41D2 8000 CMDBUF DB 80H,0 =41D4 RB 80H =4254 DISKNO RB 1 =4255 DISKSAV RB 1 =4256 SAVUSR RB 1 =4257 SAVEOUT RB 1 =4258 MECHDLY RB 1 =4259 SENDFLG RB 1 =425A NBSAVE RW 1 =425C BGNMS RW 1 =425E FILECT RB 2 =4260 SNAMECT RB 1 =4261 FTYCNT RB 1 =4262 RB 100 =42C6 STACK RW 1 =42C8 FCB3 RB 33 =42E9 FCB4 RB 33 =430A FCBBUF RB 15 = ;Multi-file access work area =4319 MFREQ RB 12 ;REQ NAME =4325 MFCUR RB 12 ;CURR NAME = ;Unitialized storage for DIRLST =4331 SRCHFCB RB 33 =4352 NAMEGD RB 1 =4353 NAMECT RB 1 =4354 BMAX RW 1 ;HIGHEST BLOCK NUMBER ON DRIVE =4356 BMASK RB 1 ;(RECORDS/BLOCK)-1 CP/M ASM86 1.1 SOURCE: MODEMRB.A86 PAGE 119 =4357 BSHIFTF RB 1 ;NUMBER OF SHIFTS TO MULTIPLY BY REC/BLOCK = ; = 4400 BOTTRAM EQU (OFFSET $) + 0FFH AND 0FF00H = ; =4358 DBUF RB DBUFSIZ*1024 =8358 NAMEBUF RB 64*12 = ; = 8700 XAST EQU (OFFSET $) + 0FFH AND 0FF00H = ; = ; END ; END OF ASSEMBLY. NUMBER OF ERRORS: 0. USE FACTOR: 85% LOCK =