From 7db00165ddc240881285fca1f260069562abd528 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 10 Aug 2017 22:16:03 -0700 Subject: [PATCH] App updates - All XM variants integrated into a single XM.COM app that auto-detects primary serial port. - Include all relevant FD variants for each platform. --- Source/Apps/Build.cmd | 2 + Source/Apps/Clean.cmd | 4 +- Source/Apps/XM125/Build.cmd | 19 + Source/Apps/XM125/Clean.cmd | 7 + Source/Apps/XM125/xmdm125.asm | 5714 +++++++++++++++++ Source/Apps/XM125/xmdm125.zip | Bin 0 -> 56184 bytes Source/Apps/XM125/xmhb.180 | 329 + .../FD.COM => Images/hd0/s0/u0/FD_DIDE.COM} | Bin Source/Images/hd0/s0/u0/FD_DIO.COM | Bin 0 -> 7919 bytes .../FD.COM => Images/hd0/s0/u0/FD_DIO3.COM} | Bin .../N8/FD.COM => Images/hd0/s0/u0/FD_N8.COM} | Bin .../FD.COM => Images/hd0/s0/u0/FD_ZETA.COM} | Bin .../FD.COM => Images/hd0/s0/u0/FD_ZETA2.COM} | Bin Source/Images/hd0/s0/u0/HDIR.COM | Bin 0 -> 1408 bytes Source/Images/hd0/s0/u0/R.COM | Bin 0 -> 4224 bytes Source/Images/hd0/s0/u0/RSETSIMH.COM | Bin 0 -> 128 bytes Source/Images/hd0/s0/u0/TIMER.COM | Bin 0 -> 256 bytes Source/Images/hd0/s0/u0/URL.COM | Bin 0 -> 2176 bytes Source/Images/hd0/s0/u0/W.COM | Bin 0 -> 3968 bytes Source/RomDsk/MK4/FD_DIDE.COM | Bin 0 -> 7961 bytes Source/RomDsk/MK4/FD_DIO3.COM | Bin 0 -> 7974 bytes Source/RomDsk/MK4/XM-A0.COM | Bin 5373 -> 0 bytes Source/RomDsk/MK4/XM-A1.COM | Bin 5373 -> 0 bytes Source/RomDsk/MK4/XM5-A0.COM | Bin 3072 -> 0 bytes Source/RomDsk/MK4/XM5-A1.COM | Bin 3072 -> 0 bytes Source/RomDsk/N8/FD_N8.COM | Bin 0 -> 7925 bytes Source/RomDsk/N8/XM-A0.COM | Bin 5373 -> 0 bytes Source/RomDsk/N8/XM-A1.COM | Bin 5373 -> 0 bytes Source/RomDsk/N8/XM5-A0.COM | Bin 3072 -> 0 bytes Source/RomDsk/N8/XM5-A1.COM | Bin 3072 -> 0 bytes Source/RomDsk/SBC/FD_DIDE.COM | Bin 0 -> 7961 bytes Source/RomDsk/SBC/FD_DIO3.COM | Bin 0 -> 7974 bytes Source/RomDsk/SBC/XM.COM | Bin 5375 -> 0 bytes Source/RomDsk/SBC/XM5.COM | Bin 3072 -> 0 bytes Source/RomDsk/UNA/XM-A0.COM | Bin 5373 -> 0 bytes Source/RomDsk/UNA/XM-A1.COM | Bin 5373 -> 0 bytes Source/RomDsk/UNA/XM.COM | Bin 5375 -> 0 bytes Source/RomDsk/UNA/XM5-A0.COM | Bin 3072 -> 0 bytes Source/RomDsk/UNA/XM5-A1.COM | Bin 3072 -> 0 bytes Source/RomDsk/UNA/XM5.COM | Bin 3072 -> 0 bytes Source/RomDsk/ZETA/FD_ZETA.COM | Bin 0 -> 7974 bytes Source/RomDsk/ZETA/XM.COM | Bin 5375 -> 0 bytes Source/RomDsk/ZETA/XM5.COM | Bin 3072 -> 0 bytes Source/RomDsk/ZETA2/FD_ZETA2.COM | Bin 0 -> 7961 bytes Source/RomDsk/ZETA2/XM.COM | Bin 5375 -> 0 bytes Source/RomDsk/ZETA2/XM5.COM | Bin 3072 -> 0 bytes 46 files changed, 6074 insertions(+), 1 deletion(-) create mode 100644 Source/Apps/XM125/Build.cmd create mode 100644 Source/Apps/XM125/Clean.cmd create mode 100644 Source/Apps/XM125/xmdm125.asm create mode 100644 Source/Apps/XM125/xmdm125.zip create mode 100644 Source/Apps/XM125/xmhb.180 rename Source/{RomDsk/MK4/FD.COM => Images/hd0/s0/u0/FD_DIDE.COM} (100%) create mode 100644 Source/Images/hd0/s0/u0/FD_DIO.COM rename Source/{RomDsk/SBC/FD.COM => Images/hd0/s0/u0/FD_DIO3.COM} (100%) rename Source/{RomDsk/N8/FD.COM => Images/hd0/s0/u0/FD_N8.COM} (100%) rename Source/{RomDsk/ZETA/FD.COM => Images/hd0/s0/u0/FD_ZETA.COM} (100%) rename Source/{RomDsk/ZETA2/FD.COM => Images/hd0/s0/u0/FD_ZETA2.COM} (100%) create mode 100644 Source/Images/hd0/s0/u0/HDIR.COM create mode 100644 Source/Images/hd0/s0/u0/R.COM create mode 100644 Source/Images/hd0/s0/u0/RSETSIMH.COM create mode 100644 Source/Images/hd0/s0/u0/TIMER.COM create mode 100644 Source/Images/hd0/s0/u0/URL.COM create mode 100644 Source/Images/hd0/s0/u0/W.COM create mode 100644 Source/RomDsk/MK4/FD_DIDE.COM create mode 100644 Source/RomDsk/MK4/FD_DIO3.COM delete mode 100644 Source/RomDsk/MK4/XM-A0.COM delete mode 100644 Source/RomDsk/MK4/XM-A1.COM delete mode 100644 Source/RomDsk/MK4/XM5-A0.COM delete mode 100644 Source/RomDsk/MK4/XM5-A1.COM create mode 100644 Source/RomDsk/N8/FD_N8.COM delete mode 100644 Source/RomDsk/N8/XM-A0.COM delete mode 100644 Source/RomDsk/N8/XM-A1.COM delete mode 100644 Source/RomDsk/N8/XM5-A0.COM delete mode 100644 Source/RomDsk/N8/XM5-A1.COM create mode 100644 Source/RomDsk/SBC/FD_DIDE.COM create mode 100644 Source/RomDsk/SBC/FD_DIO3.COM delete mode 100644 Source/RomDsk/SBC/XM.COM delete mode 100644 Source/RomDsk/SBC/XM5.COM delete mode 100644 Source/RomDsk/UNA/XM-A0.COM delete mode 100644 Source/RomDsk/UNA/XM-A1.COM delete mode 100644 Source/RomDsk/UNA/XM.COM delete mode 100644 Source/RomDsk/UNA/XM5-A0.COM delete mode 100644 Source/RomDsk/UNA/XM5-A1.COM delete mode 100644 Source/RomDsk/UNA/XM5.COM create mode 100644 Source/RomDsk/ZETA/FD_ZETA.COM delete mode 100644 Source/RomDsk/ZETA/XM.COM delete mode 100644 Source/RomDsk/ZETA/XM5.COM create mode 100644 Source/RomDsk/ZETA2/FD_ZETA2.COM delete mode 100644 Source/RomDsk/ZETA2/XM.COM delete mode 100644 Source/RomDsk/ZETA2/XM5.COM diff --git a/Source/Apps/Build.cmd b/Source/Apps/Build.cmd index ed4fca82..4456b89a 100644 --- a/Source/Apps/Build.cmd +++ b/Source/Apps/Build.cmd @@ -19,6 +19,8 @@ call :asm OSLdr || goto :eof zx Z80ASM -SYSGEN/F +setlocal & cd XM125 && call Build || exit /b 1 & endlocal + goto :eof :asm diff --git a/Source/Apps/Clean.cmd b/Source/Apps/Clean.cmd index e7b9fd50..f10de89e 100644 --- a/Source/Apps/Clean.cmd +++ b/Source/Apps/Clean.cmd @@ -3,4 +3,6 @@ setlocal if exist *.bin del *.bin if exist *.com del *.com -if exist *.lst del *.lst \ No newline at end of file +if exist *.lst del *.lst + +setlocal & cd XM125 && call Clean || exit /b 1 & endlocal diff --git a/Source/Apps/XM125/Build.cmd b/Source/Apps/XM125/Build.cmd new file mode 100644 index 00000000..b5663ad9 --- /dev/null +++ b/Source/Apps/XM125/Build.cmd @@ -0,0 +1,19 @@ +@echo off +setlocal + +set TOOLS=..\..\..\Tools + +set PATH=%TOOLS%\zx;%PATH% + +set ZXBINDIR=%TOOLS%\cpm\bin\ +set ZXLIBDIR=%TOOLS%\cpm\lib\ +set ZXINCDIR=%TOOLS%\cpm\include\ + +zx mac xmdm125 +zx slr180 -xmhb/HF +zx mload25 XM=xmdm125,xmhb + +rem set PROMPT=[Build] %PROMPT% +rem %comspec% + +move /Y XM.com .. diff --git a/Source/Apps/XM125/Clean.cmd b/Source/Apps/XM125/Clean.cmd new file mode 100644 index 00000000..94273192 --- /dev/null +++ b/Source/Apps/XM125/Clean.cmd @@ -0,0 +1,7 @@ +@echo off +setlocal + +if exist *.hex del *.hex +if exist *.prn del *.prn +if exist *.lst del *.lst +if exist xm.com del xm.com diff --git a/Source/Apps/XM125/xmdm125.asm b/Source/Apps/XM125/xmdm125.asm new file mode 100644 index 00000000..83393755 --- /dev/null +++ b/Source/Apps/XM125/xmdm125.asm @@ -0,0 +1,5714 @@ +; +; TITLE 'XMODEM ver. 12.5 - 07/13/86' +; +; XMDM125.ASM - REMOTE CP/M FILE TRANSFER PROGRAM +; +; Originally adapted from Ward Christensen's MODEM2 +; by Keith Petersen, W8SDZ +; +; ASEG ;Needed by M80 assemblers, comment out if using MAC +; +; This program allows a remote user to transfer files (to or from) RCPM +; systems running under BYE (remote console program). It can be assem- +; bled with ASM, LASM, MAC, M80, SRLMAC and other 8080 assemblers. +; +; All comments and past revisions have been removed from this file and +; put into the XMODEM.UPD file. Place only the current revision at the +; beginning of this file and move the one that was here to XMODEM.UPD. +; +;======================================================================= +; +; v12.5 Fixed conditional assembly bug which caused date to +; 07/13/86 appear in log twice when MBBS and BYEBDOS were both set +; to YES. +; Fixed conditional assembly bug which did not allow MBFMSG +; to be set to YES while MBDESC was set to NO. +; Removed patch to log download before sending EOF because +; EOF would not be sent, leaving caller's program in file +; transfer mode, if LOGCALL routine exited with an error. +; This problem was noticed by Keith Petersen. +; Modified to abort any download which would result in a +; user exceeding his time limit when BYEBDOS is YES. +; Fixed bug which would cause caller to be logged off +; without updating log file if transmission errors caused +; his download to put him over time limit when BYEBDOS was +; YES and CLOCK and TIMEON in BYE were YES (call to TCHECK +; in BYE's extended BDOS call would hang up on caller). +; Revised comments for some equates to make them easier to +; understand. +; - Murray Simsolo +; +;======================================================================== +; +VERSION EQU 1 +INTERM EQU 2 +MODLEV EQU 5 +VMONTH EQU 07 +VDAY EQU 13 +VYEAR EQU 86 +; +NO EQU 0 +YES EQU NOT NO +; +; Define ASCII characters used +; +BS EQU 08H ; Backspace character +ACK EQU 06H ; Acknowledge +CAN EQU 18H ; CTL-X for cancel +CR EQU 0DH ; Carriage return +CRC EQU 'C' ; CRC request character +EOF EQU 1AH ; End of file - ^Z +EOT EQU 04H ; End of transmission +LF EQU 0AH ; Line feed +NAK EQU 15H ; Negative acknowledge +RLEN EQU 128 ; Record length +TAB EQU 09H ; Horizontal tab +SOH EQU 01H ; Start of header for 128-byte blocks +STX EQU 02H ; 'Start of header' for 1024 byte blocks +; +;======================================================================= +; +; Conditional equates - change to suit your system, then assemble +; +MHZ EQU 4 ; Clock speed, use integer (2,4,5,8, etc.) +CPM3 EQU NO ; Yes, if operating in CP/M v3.0 environment +STOPBIT EQU NO ; No, if using 1 stop bit, yes if using 2 +BYEBDOS EQU NO ; Yes, if using BYE338-up, BYE501-up, or NUBYE + ; with its I/O (CLOCK in BYE must be YES) + ; No if using your own hardware overlay +LUXMOD EQU NO ; Set to YES if LUXMODEM version desired rather + ; than standard XMODEM with upload options. +; +;======================================================================= +; +; If OK2400 is YES, then it overrides the TAGLBR and MAXMIN restrictions +; if the current caller is operating at 2400 baud (or higher). +; +OK2400 EQU NO ; Yes, no restrictions for 2400 bps callers +; +MSPEED EQU 3CH ; Location of speed byte set by BYE prgm, must + ; be set for OK2400 or BYEBDOS to work +; +DSPFNAM EQU YES ; Set to YES if you wish XMODEM to display the + ; file name being up or downloaded for user to + ; see and verify system received name correctly. +; +; If ZCPR3 is YES, then NO filetypes of .NDR or .RCP will be received. +; This is for security if you need LDR.COM on A0: for cold starts or if +; LDR is in the defined path. (If you don't have LDR on-line or +; accessible, then this equate isn't necessary for ZCPR3 systems.) +; +ZCPR3 EQU NO ; Yes, NO filetypes .NDR or .RCP received +; +;======================================================================= +; +; If ZCPR2 = yes, then the following will all be NO if wheel is set +; in local non-zero (0FFH) mode. SYSOP rules... +; +ZCPR2 EQU NO ; Yes, if using ZCPR* with WHEEL byte +; +WHEEL EQU 3EH ; Location of wheel byte (normally 3EH) +NOCOMR EQU NO ; Yes, change .COM to .OBJ on receive +NOCOMS EQU NO ; Yes, .COM files not sent +NOLBS EQU NO ; Yes, .??# files not sent +NOSYS EQU NO ; Yes, no $SYS files sent or reported +; +;======================================================================= +; +; The following are only used by NZCPR or ZCMD systems +; +USEMAX EQU NO ; Yes, using NZCPR for maximum du: values + ; No, use MAXDRV and MAXUSR specified next +DRIVMAX EQU 03DH ; Location of MAXDRIV byte +USRMAX EQU 03FH ; Location of MAXUSER byte +; +;======================================================================= +; +; Hard-coded system maximums allowed if USEMAX above is NO +; +MAXDRV EQU 16 ; Number of disk drives used (1=A, 2=B, etc) +MAXUSR EQU 16 ; Maximum 'SEND' user allowed +; +;======================================================================= +; +; File transfer buffer size - 16k is the same buffer length used in IMP, +; MDM7 and MEX so all those modem programs as well as XMODEM would be +; transferring from the buffer simultaneously, minimizing any delays. +; Slower floppy disk drives may require the use of a smaller buffer, try +; 8k, 4k, or 2k and use largest that does not result in a time-out at +; the sending end. Please note the requirement for the protocol to ac- +; cept any mixture of 1K and small blocks may result in effective buffer +; usage extending an additional 896 bytes (7*128) beyond the 'end' of +; the buffer defined here. (Actually, due to handshaking, the buffers +; are NOT loaded simultaneously, so the above statement is misleading, +; too large a buffer will slow things down if you have a slow disk +; drive.. Too small a buffer will really slow you down though, so +; stick with 16k...) +; +BUFSIZ EQU 16 ; File transfer buffer size in Kbytes (16k) +; +;======================================================================= +; +; DESCRIB is used to ask the uploader to give a description of the file +; he just uploaded. If YES and ZCPR2 is YES and wheel is set, it does +; NOT ask for a description unless ASKSYS is set to YES. +; (If using on an MBBS v4.1 and up system, use MBDESC instead of +; this option.) (NDESC can be used with either DESCRIB or MBDESC.) +; +DESCRIB EQU NO ; Yes asks for a description of uploaded file +DRIVE EQU 'A' ; Drive area for description of upload +USER EQU 14 ; User area for description of upload +BSIZE EQU 32*1024 ; Set for 16k, 24k or 32k as desired for DESCRIB +; +NDESC EQU NO ; If YES, user can add a "N" to option to skip + ; description for pre-arranged uploads or + ; for the sysop.. +ASKSYS EQU NO ; If YES, and ZCPR2=YES, the system will ask + ; the sysop for a description of the uploaded + ; file +ASKIND EQU NO ; IF YES, user is asked for the category of + ; the uploaded file. This category is auto- + ; matically added to the file description. +; +;======================================================================= +; +; XMODEM transfer log options +; +LOGCAL EQU NO ; Yes, logs XMODEM transfers +LOGDRV EQU 'A' ; Drive to place 'XMODEM.LOG' file +LOGUSR EQU 14 ; User area to put 'XMODEM.LOG' file +; +; OxGate BBS puts the date after the caller's name. If you are using +; either BYEBDOS or B3RTC or RTC, and have an OxGate, then set this +; equate to YES, so the date doesn't appear twice. +; +OXGATE EQU NO ; If yes, and B3RTC or RTC is yes, does not read + ; date in OxGate's LASTCALR file. +; +KNET EQU NO ; If yes, the log file is called XMODEM.TX# with + ; $SYS attr set (for K-NET 84(tm) RCP/M Systems) +; +LASTDRV EQU 'A' ; Drive to read 'LASTCALR' file from +LASTUSR EQU 14 ; User area of 'LASTCALR' file, if 'LOGCAL' yes +; +;======================================================================= +; +; The receiving station sends an 'ACK' for each valid sector received. +; It sends a 'NAK' for each sector incorrectly received. In poor con- +; ditions either may be garbled. Waiting for a valid 'NAK' can slow +; things down somewhat, giving more time for the interference to quit. +; +RETRY EQU NO ; Yes requires a valid NAK to resend a record + ; No resends a record after any non-ACK +; +; Note that some modem programs will send a "C" instead of a NAK when +; operating in CRC mode. Therefore, RETRY EQU NO will allow XMODEM to +; work correctly with more programs. +; +;======================================================================= +; +; When sending in 1K block mode, XMODEM will downshift to 128 byte +; blocks when the ratio of successfully transmitted blocks to total +; errors falls below the ratio defined here. +; +DWNSHFT EQU 5 ; must have at least this many good blocks for + ; every error, or will downshift to size 128 +; +MINKSP EQU 5 ; set this equate to the minimum MSPEED value + ; allowed to use the 1k block protocol.. +; +; MSPEED values: 1=300, 5=1200, 6=2400 +; +;======================================================================= +; +; Allows uploading to be done on a specified driver and user area so all +; can readily find the latest entries. +; +SETAREA EQU NO ; Yes, using designated du: to receive files + ; No, upload to currently logged du: +SPCDU EQU NO ; Yes, upload to designated du: if wheel set +; +DRV EQU 'B' ; Drive to receive file on +USR EQU 0 ; User area to receive file in +; +ASKAREA EQU NO ; If YES, ask user what type of upload and + ; set area accordingly. For Multiple + ; Operating system support. +; +SYSNEW EQU NO ; If YES, then new uploads are made $SYS + ; to "hide" them from users until cleared... +; +;======================================================================= +; +; Selects the DU: for uploading private files with XMODEM RP option. +; +PRDRV EQU 'A' ; Private drive for SYSOP to receive file +PRUSR EQU 0 ; Private user area for SYSOP to receive file +; +;======================================================================= +; +; Selects the DU: for private download files. This permits Sysop +; to put file(s) in this area, then leave a private note to that +; person mentioning the name(s) of the file and its location. +; +SPLDRV EQU 'A' ; Special drive area for downloading SYSOP files +SPLUSR EQU 0 ; Special user area for downloading SYSOP files +; +;======================================================================= +; +; Selects the DU: used for message files uploaded with the "RM" option. +; (Used only if MBFMSG option enabled) +; +MSGDRV EQU 'A' ; Drive used to receive message files +MSGUSR EQU 15 ; User used to receive message files +; +;======================================================================= +; +; SYSOP may use NSWP or TAG and set the high bit of F1 to disallow the +; sending of large .LBR files. If TAGLBR is YES, only LUX or the option +; XMODEM L will allow transfer of individual member files from tagged +; .LBR files. The entire .LBR file can NOT be sent using XMODEM S NAME. +; +TAGLBR EQU NO ; Yes tagged .LBR files not sent +; +; Note: The OK2400 equate if YES will bypass this restriction if the +; caller is operating at 2400 baud (or faster). +; +;======================================================================= +; +; Some modems will either go onhook immediately after carrier loss or +; can be set to lower values. A good value with the Smartmodem is five +; seconds, since it catches all "call forwarding" breaks. Not all is +; lost after timeout in XMODEM; BYE will still wait some more, but the +; chance of someone slipping in is less now. +; +TIMOUT EQU 2 ; Seconds to abort after carrier loss +; +;======================================================================= +; +; Count the number of up/down loads since login. Your BBS program can +; check UPLDS and NDLDS when user logs out and update either the users +; file or another file for this purpose. +; +LOGLDS EQU NO ; Count number of up/down loads since login. +; + IF LOGLDS +UPLDS EQU 054H ; Clear these values to Zero from your BBS pro- +DNLDS EQU 055H ; gram when somebody logs in. NOTE: Clear + ; ONLY when a user logs in. Not when he re- + ; enters the BBS program for CP/M. + ENDIF +; +;====================================================================== +; +; Maximum file transfer time allowed. +; +; NOTE: If ZCPR2 = YES and WHEEL byte is set, send time is unlimited. +; +; TIME 300 BPS 1200 BPS +; ------ ------- -------- +; 30 min 48.7k 180k +; 45 min 73.1k 270k +; 60 min 97.5k 360k +; +MAXTIM EQU NO ; Yes if limiting transmission time +; +MAXMIN EQU 60 ; Minutes for maximum file transfer time. + ; this should be set to 60 if TIMEON is YES + ; (99 minutes maximum.) (This is ignored if + ; BYEBDOS is set.) +; +; Note: The OK2400 equate if YES will bypass MAXMIN limits. +; +;====================================================================== +; +; The following equates need to be set ONLY if you are NOT using the +; BYE-BDOS calls supported in BYE338 and newer. +; +; Length of external patch program. If over 128 bytes, get/set size +; +LARGEIO EQU YES ; Yes, if modem patch area over 128 bytes +LARSIZE EQU 100H ; If 'LARGEIO' set patch area size (bytes) here +; +;======================================================================= +; +; USECON allows XMODEM to display the record count on the local CRT +; during transfers. All new remote console programs support this +; feature. BYE3* and MBYE3* will tell XMODEM where to find the local +; console's output vector. +; +USECON EQU NO ; Yes to get CONOUT address from BYE + ; NO, get CONOUT address from the XMODEM overlay +; +CONOFF EQU 15 ; Offset to COVECT where original console output + ; routine address is stored in BYE3/MBYE + ; versions immediately followed by BYE as a + ; check to insure BYE is running. +; +;======================================================================= +; start of TIMEON area +; +RTC EQU NO ; If YES, add clock and date reader code at + ; start of GETTIME: and GETDATE: below +; +; The TIMEON and RTC equates should be NO if B3RTC is YES +; +TIMEON EQU NO ; If YES and BYEBDOS is NO, add your clock reader + ; code at the start of label GETTIME: and return + ; time in registers A & B. Also set to YES if + ; BYEBDOS is YES and you want XMODEM to check + ; time on system (not necessary if TIMEON in BYE + ; is YES - saves unnecessary code). +TOSEXIT EQU NO ; If YES, time on system displayed on exit if + ; B3RTC or TIMEON or BYEBDOS set to YES +; + IF TIMEON AND NOT CPM3 +LHOUR EQU 050H ; Set by BBS (or BYE) in binary when user logs +LMIN EQU 051H ; on and his status +STATUS EQU 053H + ENDIF +; + IF TIMEON AND CPM3 +LHOUR EQU 022H ; Set by BBS (or BYE) in binary when user logs +LMIN EQU 023H ; on and his status +STATUS EQU 024H + ENDIF +; +; end of TIMEON area +;======================================================================== +; Miscellaneous Support Bytes +;======================================================================== +; Set this equate to enable access byte support. ACBOFF specifies +; the offset from the JMP COLDBOOT instruction as above with WRTLOC. +; MBBS and some newer BBS's support this byte, therefore, it is no +; longer specific to MBBS. You must determine if your system uses this. +; +ACCESS EQU NO ; Yes, check flags for upload/dwnld restrictions +ACBOFF EQU 21 ; # of bytes from JMP COLDBOOT to ACCESS byte. +ACWRIT EQU 8 ; Bit to test for BBS msg write OK (1=OK,0=NOT OK) +ACDNLD EQU 32 ; Bit to test for downloads OK (1=OK,0=NOT OK) +ACUPLD EQU 64 ; Bit to test for uploads OK (1=OK,0=NOT OK) +DWNTAG EQU NO ; If YES, files with F3 attribute bit can be + ; downloaded regardless of access byte restrictions +; +; Access byte flag bit assignments +; +; Bit ; Used for +; 0 ; System access (no admittance if off) +; 1 ; BBS access (if off, dumped to CP/M) +; 2 ; Read access (if off, no "R" command allowed) +; 3 ; Write access (if off, no "E" command allowed) +; 4 ; CP/M access (if off, no admittance to CP/M) +; 5 ; Download access (if off, no downloads permitted) +; 6 ; Upload access (if off, no uploads permitted) +; 7 ; Privileged user (if on, user is "privileged") +; +; Of these bits, only 5 and 6 are used by XMODEM. Bit numbers are +; powers of 2, bit 0 being least significant bit of byte. +;------------------------------------------------------------------------- +; The CONFUN and WRTLOC are supported by BYE339 and many BBS's require +; the WRTLOC for propoer operation. These functions are not specific to +; MBBS and therefore have been made independant of the MBBS equate. +; +; (Set CONFUN/WRTLOC YES if using with MBBS) +; +CONFUN EQU YES ; Yes, check local console for function keys +SYSABT EQU YES ; If yes, sysop can abort up/downloads with ^X + ; (CONFUN must be enabled to use this option) +; +; If you set CONFUN true, a call to the console status check routine in +; the BIOS will be done during waiting periods and when sector counts +; are displayed on the local console in order to allow MBYE and BYE339 +; function keys to work. This is for MBYE. Other versions of BYE3 +; may or may not check for console function keys during the console +; status check "MSTAT" routine. +; +WRTLOC EQU YES ; Yes, set/reset WRTLOC so BYE won't hang up +LOCOFF EQU 12 ; # of bytes from JMP COLDBOOT to WRTLOC byte +; +; NOTE: Code to set/reset WRTLOC assumes WRTLOC byte to be +; located "LOCOFF" bytes from the JMP COLDBOOT instruction at +; the beginning of the BYE3 BIOS jump table. On BYE3 versions +; and MBYE versions, this offset is usually 12. Note: +; TIMEON and RTC should be set to no if B3RTC is on. +; (If BYEBDOS is enabled, the appropriate extended BDOS +; calls are used to set and reset the WRTLOC if this +; equate is set and LOCOFF is ignored in these cases.) +; +; End of Miscellaneous Support Bytes +;======================================================================= +; start of MBBS/MBYE specific information +; +B3RTC EQU NO ; If YES, your clock is setup in BYE3 (or MBYE) + ; set to NO if using BYEBDOS +B3COFF EQU 25 ; OFFSET from COLDBOOT: to RTCBUF address +B3CMOS EQU 7 ; OFFSET from RTCBUF: to mins on system +; +MBMXT EQU NO ; If YES, running MBYE with max. time on system +MBMXO EQU 24 ; OFFSET from COLDBOOT: to MXML address +; +; If B3RTC is YES and LOGCAL is YES, the log file will show +; the date and time of all up/downloads. Note: Set RTC, TIMEON, +; and BYEBDOS to NO if using B3RTC or MBMXT. +; +; Note: Some of these equates may not be valid if you are using MBYE* +; with another BBS program - check them carefully. +; +MBBS EQU NO ; Yes if running MBBS v2.9 up +LOGSYS EQU NO ; Set YES if running MBBS v3.1 or earlier +MBDESC EQU NO ; Yes if running MBBS v4.0 up for upload desc. +NEWPRV EQU NO ; Yes: all new uploads are private initially +MBFMSG EQU NO ; Yes if running MBYE v4.1 up with MFMSG +; +; +;---------------------------------------------------------------------- +; +; If B3RTC is YES download time may be limited using the following +; equates instead of using MAXMIN. MAXMIN will be the default value +; if BYE is not running. +; +B3TOS EQU NO ; Yes if using BYE3/MBYE and want to show time on sys +; +MTOS EQU NO ; Yes if using maximum time on system instead + ; of MAXMIN to limit transmission time +; + IF MTOS AND MBMXT ; both must be YES +MXTOS EQU YES ; (leave YES) + ENDIF +; + IF NOT (MTOS AND MBMXT) ; (if either is NO) +MXTOS EQU NO ; (leave NO) + ENDIF +; +MXTL EQU NO ; Yes if limiting transmission time to time + ; left plus MAXMIN. MXTOS must be yes. +; + IF MXTL AND MXTOS ; both must be YES +MTL EQU YES ; (leave YES) + ENDIF +; + IF NOT (MXTL AND MXTOS); (if either are NO) +MTL EQU NO ; (leave NO) + ENDIF +; +; end of MBBS/MBYE specific information +;======================================================================= +; + ORG 100H + JMP BEGIN +; +;----------------------------------------------------------------------- +; +; This is the I/O patch area. Assemble the appropriate I/O patch file +; for your modem, then integrate it into this program via DDT (or SID). +; Initially, all jumps are to zero, which will cause an unpatched XMODEM +; to simply execute a warm boot. All routines must end with RET. +; + IF NOT BYEBDOS ; Universal I/O +CONOUT: JMP 0 ; See 'CONOUT' discussion above +MINIT: JMP 0 ; Initialization routine (if needed) +UNINIT: JMP 0 ; Undo whatever MINIT did (or return) +SENDR: JMP 0 ; Send character (via POP PSW) +CAROK: JMP 0 ; Test for carrier +MDIN: JMP 0 ; Receive data byte +GETCHR: JMP 0 ; Get character from modem +RCVRDY: JMP 0 ; Check receive ready (A - ERRCDE) +SNDRDY: JMP 0 ; Check send ready +SPEED: JMP 0 ; Get speed value for transfer time +EXTRA1: JMP 0 ; Extra for custom routine +EXTRA2: JMP 0 ; Extra for custom routine +EXTRA3: JMP 0 ; Extra for custom routine + ENDIF +; +;----------------------------------------------------------------------- +; + IF NOT (LARGEIO OR BYEBDOS) + ORG 100H+80H ; Origin plus 128 bytes for patches + ENDIF +; + IF LARGEIO AND NOT BYEBDOS + ORG 100H+LARSIZE ; I/O patch area size if over 128 bytes + ENDIF +; +; PRIVATE/SETAREA UPLOAD DISK/USER AREAS: +; +; (Here at start (usually 180H unless LARGEIO) so can be easily patched +; in .COM file using DDT without needing to reassemble. All references +; are made to these locations in memory and not to DRV/PRDRV/USR/PRUSR +; equates directly.) +; +XPRDRV: DB PRDRV ; Private uploads go to this disk/user +XPRUSR: DB PRUSR +; +XDRV: DB DRV ; Forced uploads (if SETAREA EQU YES) +XUSR: DB USR ; Go to this disk/user +; + IF MBFMSG +XMDRV: DB MSGDRV ; Message uploads go to this disk/user +XMUSR: DB MSGUSR ; (if MBFMSG option enabled) + ENDIF +; +;----------------------------------------------------------------------- +; +; File descriptors, change as desired if this list is not suitable. +; Move the line with the terminating '$' up, if fewer descriptors are +; desired. +; + IF ASKIND AND DESCRIB +; +KIND0: DB ' 0) - CP/M',CR,LF +KIND1: DB ' 1) - ZCPR',CR,LF +KIND2: DB ' 2) - MS-DOS/PC-DOS',CR,LF +KIND3: DB ' 3) - dBASE',CR,LF +KIND4: DB ' 4) - Basic',CR,LF +KIND5: DB ' 5) - General',CR,LF +KIND6: DB ' 6) - Modems',CR,LF +KIND7: DB ' 7) - Games',CR,LF +KIND8: DB ' 8) - Xerox/KPro',CR,LF +KIND9: DB ' 9) - RCP/M',CR,LF + DB '$' + ENDIF +;..... +; +;---------------------------------------------------------------------- +; +; If ASKAREA and SETAREA are set, then set these areas up and modify +; the message text in the FILTYP: function below if you desire a +; different choice. (As released in XMDM121, 1 = CP/M, 2 = MS/PC-DOS +; and 3 = General Interest.) +; + IF ASKAREA AND SETAREA +; +MAXTYP EQU '3' ; Set maximum type choice # here +; +TYPTBL: DB 'B',0 ; CHOICE 1 (CP/M NORMAL) + DB 'B',9 ; CHOICE 1 (CP/M PRIVATE) + DB 'B',3 ; CHOICE 2 (MS/PC-DOS NORMAL) + DB 'B',9 ; CHOICE 2 (MS/PC-DOS PRIVATE) + DB 'B',0 ; CHOICE 3 (General interest NORMAL) + DB 'B',9 ; CHOICE 3 (General interest PRIVATE) +; + ENDIF +; +;======================================================================= +; +; PROGRAM STARTS HERE +; +;======================================================================= +; +; Save CP/M stack, initialize new one for this program +; +BEGIN: LXI H,0 + DAD SP + SHLD STACK + LXI SP,STACK ; Initialize new stack +; + IF BYEBDOS + CALL BYECHK + JZ BYEOK + CALL ILPRT + DB 'You need to be running BYEBDOS',CR,LF,0 + JMP EXIT2 ; Get stack pointer back and return +; +BYEOK: MVI C,BDSTOS ; Get current maximum time on system + MVI E,255 + CALL BDOS + STA MAXTOS + ENDIF +; + IF B3RTC AND MXTOS AND (NOT BYEBDOS) + CALL BYECHK ; If BYE not active + MVI A,MAXMIN ; (we'll use MAXMIN as default) + JNZ EXTMXT ; Skip MXML update + LHLD 0001H ; Get JMP COLDBOOT + DCX H + MOV D,M + DCX H + MOV E,M + LXI H,MBMXO ; + MBMXO offset to MXML + DAD D + MOV A,M ; = max time allowed on system +; +EXTMXT: STA MAXTOS ; Store max download time + ENDIF +; +; Get address of RTCBUF in BYE3 or MBYE +; + IF B3RTC AND (NOT BYEBDOS) + CALL BYECHK ; See if BYE3/MBYE is running + JNZ NOBYE0 ; If not, skip this junk + LHLD 0001H ; Get COLDBOOT addr + DCX H ; (just before JMP WBOOT) + MOV D,M ; And stuff in DE + DCX H + MOV E,M + LXI H,B3COFF ; Add offset to RTCBUF address + DAD D ; (in HL) + MOV E,M ; Get RTCBUF address + INX H ; And + MOV D,M ; Stuff in DE + XCHG ; Swap into HL + SHLD RTCBUF ; Save for use later + ENDIF +; +NOBYE0: IF CONFUN ; Console status checks to be done? + LHLD 0001H ; If so get addr of warmboot (jmp table) + INX H + INX H + INX H ; + 3 = address of console status check + SHLD CONCHK+1 ; Stuff after call for FUNCHK + ENDIF +; + IF WRTLOC ; Set WRITE LOCK? + CALL SETLCK + ENDIF +; +; Save the current drive and user area +; +NOBYE1: MVI E,0FFH ; Get the current user area + MVI C,SETUSR + CALL BDOS + STA OLDUSR ; Save user number here + MVI C,CURDRV ; Get the current drive + CALL BDOS + STA OLDDRV ; Save drive here +; + IF B3TOS OR TIMEON + CALL TIME ; Get user's time status + ENDIF +; + IF BYEBDOS AND (NOT TIMEON) + MVI C,BDPTOS ; Display time on system and + CALL BDOS ; log off if over time limit + ENDIF +; + CALL ILPRT + DB CR,LF +; + IF LUXMOD + DB 'LUX-' + ENDIF +; + DB 'XMODEM v' + DB VERSION+'0',INTERM+'0','.',MODLEV+'0',' - ' + DB VMONTH/10+'0',VMONTH MOD 10+'0','/' + DB VDAY/10+'0',VDAY MOD 10+'0','/' + DB VYEAR/10+'0',VYEAR MOD 10+'0',CR,LF,0 +; +; Stuff address of BIOS CONOUT vector in our routine as default. +; + IF USECON AND NOT BYEBDOS + LHLD 0001H ; Point to warm boot for normal BIOS + LXI D,9 + DAD D ; Calc addr of normal BIOS conout vector + SHLD CONOUT+1 ; Save in case no BYE program is active + CALL BYECHK + JNZ NOBYE + XCHG ; Point to the console output routine + SHLD CONOUT+1 ; Save vector address supplied by BYE + ENDIF +; +; Get option +; +NOBYE: LXI H,FCB+1 ; Get primary option + MOV A,M + STA OPTSAV ; Save option + CPI 'R' ; Receive file? + JZ RECVOPT +; +; Send option processor +; Single option: "K" - force 1k mode +; + INX H ; Look for a 'K' + MOV A,M + CPI ' ' ; Is it a space? + JZ ALLSET ; Then we're ready to send... + CPI 'K' + JNZ OPTERR ; "K" is the only setable 2nd option + LDA MSPEED + CPI MINKSP ; If less than MINKSP bps, ignore 1k + JC ALLSET ; Request + MVI A,'K' ; Set 1k mode + STA KFLAG ; First, force us to 1K mode + CALL ILPRT + DB '(1k protocol selected)',CR,LF,0 + JMP ALLSET ; That's it for send... +; +; Receive option processor +; 3 or 4 options: "X" - disable auto-protocol select +; "P" - receive file in private area +; "C" - force checksum protocol +; "M" - message file upload (if MBFMSG) +; +RECVOPT:MVI A,'K' ; First off, default to 1K mode + STA KFLAG + MVI A,0 ; And default to CRC mode + STA CRCFLG +; + CALL RCVOPC ; Check 1st option + CALL RCVOPC ; Check 2nd option + CALL RCVOPC ; Check 3rd option +; + IF MBFMSG + CALL RCVOPC ; Check 4th option + ENDIF +; + IF NDESC + CALL RCVOPC ; Check 4th (or 5th) option + ENDIF +; + JMP OPTERR ; If 5th or 6th option, whoops! +; +RCVOPC: INX H ; Increment pointer to next character + MOV A,M ; Get option character HL points to + CPI ' ' ; Space? + JNZ CHK1ST ; No, we have an option + POP PSW ; Else, we are done (restore stack) + JMP ALLSET ; Exit routine now +; +CHK1ST: CPI 'P' ; Got a "P" option? + JNZ CHK2ND ; Nope + STA PRVTFL ; Yep, set private upload flag + RET ; Check next option +; +CHK2ND: CPI 'C' ; Got a "C" option? + JNZ CHK3RD ; Nope + STA CRCFLG ; Set checksum flag (crc flag="C") + CALL ILPRT + DB '(Checksum protocol selected)',CR,LF,0 + RET +; +CHK3RD: CPI 'X' ; Got an "X" for first option? + JNZ CHK4TH + MVI A,0 + STA KFLAG ; Disable "1K" flag + CALL ILPRT + DB '(128 byte protocol only)',CR,LF,0 + RET +; +CHK4TH: + IF MBFMSG ; Allowing "RM" for message uploads? + CPI 'M' ; Got an "M" for message upload? + JNZ CHK5TH ; If not, bad option + STA MSGFLG ; If "M", set MSGFLG + MVI A,'P' ; Also, set PRVTFL + STA PRVTFL + LDA XMDRV ; And copy XMDRV + STA XPRDRV + LDA XMUSR ; And XMUSR to XPRDRV / XPRUSR + STA XPRUSR + RET + ENDIF +; +CHK5TH: + IF NDESC ; Allowing "RN" to skip upload descript? + CPI 'N' ; Got an 'N'? + JNZ BADROP ; If nope, is NG.. + STA NDSCFL ; else set flag to skip descript phase + RET + ENDIF +; +BADROP: POP PSW ; Restore stack + JMP OPTERR ; is bad option +; +; All options have been set, gobble up garbage characters from the line +; prior to receive or send and initialize whatever has to be initialized +; +ALLSET: CALL GETCHR + CALL GETCHR + CALL MINIT +; +; Jump to appropriate function +; + LDA OPTSAV ; Get primary option again +; + IF LOGCAL + STA LOGOPT ; But save it + ENDIF +; + CPI 'L' ; To send a file from a library? + JZ SENDFIL + CPI 'R' ; To receive a file? + JZ RCVFIL + CPI 'S' + JZ SENDFIL ; Otherwise go send a file +; +; Invalid option +; +OPTERR: +; + IF ASKAREA AND SETAREA + LDA OPTSAV ; Check 'option' + CPI 'A' ; If 'A' (avail upload space option) + CZ FILTYP ; ask type of upload... + ENDIF +; + IF NOT (SETAREA OR LUXMOD) + CALL ILPRT + DB CR,LF,'Uploads files to specified or ' + DB 'current disk/user',0 + ENDIF +; + IF SETAREA AND NOT LUXMOD + CALL ILPRT + DB CR,LF,'Uploads files to ',0 + LDA XDRV + CALL CTYPE + LDA XUSR + MVI H,0 + MOV L,A + CALL DECOUT + MVI A,':' + CALL CTYPE + CALL ILPRT + DB ' (',0 + LDA XDRV + STA KDRV + CALL KSHOW + MVI A,')' + CALL CTYPE + ENDIF +; + IF NOT LUXMOD + CALL ILPRT + DB CR,LF,'Private files to ',0 + LDA XPRDRV + CALL CTYPE + LDA XPRUSR + MVI H,0 + MOV L,A + CALL DECOUT + MVI A,':' + CALL CTYPE + LDA XPRDRV ; If private drive is + MOV B,A + LDA XDRV ; The same as forced upload drive + SUB B + JZ SKSK2 ; Skip showing space available 2nd time + CALL ILPRT + DB ' (',0 + LDA XPRDRV ; Else show it.. + STA KDRV + CALL KSHOW + MVI A,')' + CALL CTYPE +; +SKSK2: CALL ILPRT + DB CR,LF,0 + ENDIF +; + LDA OPTSAV ; Check 'option' + CPI 'A' ; If 'A' (avail upload space option) + JZ EXIT ; Skip error message +; + IF WRTLOC AND NOT BYEBDOS + CALL RSTLCK + ENDIF +; + CALL ERXIT ; Exit with error + DB '++ Examples of valid options: ++ ' + DB '(use Ctrl-C or Ctrl-K to abort)',CR,LF,LF +; + IF NOT LUXMOD + DB 'XMODEM S HELLO.DOC send a file to you',CR,LF + DB 'XMODEM S B1:HELLO.DOC send from a named ' + DB 'drive/area',CR,LF + DB 'XMODEM SK HELLO.DOC send in 1k blocks',CR,LF + DB 'XMODEM L CAT.LBR CAT.COM send a file from a library' + DB CR,LF + DB 'XMODEM LK CAT.LBR CAT.COM send in 1k blocks',CR,LF + DB ' The ".LBR" file extension may be omitted',CR,LF,LF + DB 'XMODEM R HELLO.DOC receive a file from you' + DB CR,LF + DB 'XMODEM RP HELLO.DOC receive in a private area' + DB CR,LF + ENDIF +; + IF (MBDESC OR DESCRIB) AND NDESC + DB 'XMODEM RN FILE.EXT receive without description' + DB CR,LF + ENDIF +; + IF (NOT LUXMOD) AND MBFMSG + DB 'XMODEM RM MESSAGE.FIL receive message for MBBS' + DB CR,LF + ENDIF +; + IF NOT LUXMOD + DB ' Add "C" for forced checksum ("RC" "RPC")',CR,LF + DB ' Add "X" for forced 128 byte protocol ("RX" "RPX")' + DB CR,LF + DB ' "R" switches from CRC to checksum after 5 retries' + DB CR,LF,LF + DB 'XMODEM A shows areas/space for ' + DB 'uploads$' + ENDIF +; + IF LUXMOD + DB 'SEND MEMBERNAME.TYP sends member with CRC' + DB CR,LF + DB 'SENDK MEMBERNAME.TYP sends using 1k packets' + DB CR,LF,LF + DB 'XMODEM S MEMBERNAME.TYP same as SEND command' + DB CR,LF + DB 'XMODEM SK MEMBERNAME.TYP same as SENDK',CR,LF,LF + DB '(XMODEM can NOT receive while in LUX.)$' + ENDIF +; +; +;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +; +; ---> SENDFIL sends a CP/M file +; +;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +; +; The CP/M file specified in the XMODEM command is transferred over the +; phone to another computer running modem with the "R" (receive) option. +; The data is sent one record at a time with headers and checksums, and +; retransmission on errors. +; +SENDFIL:CALL LOGDU ; Check file name or drive/user option + LDA OPTSAV + CPI 'L' ; If library option skip 'CNREC' + CNZ CNREC ; Ignore if in library mode + CALL OPENFIL ; Open the file + MVI E,100 ; Wait 100 sec for initial 'NAK' + CALL WAITNAK + LHLD RCNT ; XMDM116.FIX + CALL CKKSIZ ; XMDM116.FIX -- Murray Simsolo +; +SENDLP: CALL CHKERR ; Check ratio of blocks to errors + CALL RDRECD ; Read a record + JC SENDEOF ; Send 'EOF' if done + CALL INCRRNO ; Bump record number + XRA A ; Initialize error count to zero + STA ERRCT +; +SENDRPT:CALL SENDHDR ; Send a header + CALL SENDREC ; Send data record + LDA CRCFLG ; Get 'CRC' flag + ORA A ; 'CRC' in effect? + CZ SENDCRC ; Yes, send 'CRC' + CNZ SENDCKS ; No, send checksum + CALL GETACK ; Get the 'ACK' + JC SENDRPT ; Repeat if no 'ACK' + CALL UPDPTR ; Update buffer pointers and counters + LDA OPTSAV ; Get the command option again + CPI 'L' + JNZ SENDLP ; If not library option, go ahead +; +; +; Check to see if done sending LBR member yet, downshift to small blocks +; if less that 8 remaining +; + LHLD RCNT + MOV A,H + ORA L ; See if L and H both zero now + JZ SENDEOF ; If finished, exit + LDA KFLAG ; Was last record a 1024 byte one? + ORA A + JZ SNRPT0 ; Just handled an normal 128 byte record + DCX H ; Otherwise, must have be a BIG one, so + DCX H ; Seven ... + DCX H + DCX H + DCX H + DCX H + DCX H ; Plus +; +SNRPT0: DCX H ; One, is either 1 or 8 + SHLD RCNT ; One (or eight) less to go + CALL CKKSIZ ; Check to see if at least 8 left + JMP SENDLP ; Loop until EOF +; +; File sent, send EOT's +; +SENDEOF: IF LOGLDS + LDA DNLDS ; Get Down loads Counter + INR A ; One more download since log in + STA DNLDS ; And update counter + ENDIF +; +SNDEOFL:LDA EOFCTR ; Get EOF counter + CPI 5 ; Tried five times ? + JZ EXITLG ; Yes, quit trying + MVI A,EOT ; Send an 'EOT' + CALL SEND + LDA EOFCTR ; Get EOF counter + INR A ; Add one + STA EOFCTR ; Save new count + CALL GETACK ; Get the ACK + JC SNDEOFL ; Loop if no ACK + JMP EXITLG ; All done +;..... +; +; +;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +; +; ---> RCVFIL Receive a CP/M file +; +;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +; +; Receives a file in block format as sent by another person doing +; "XMODEM S FILENAME.TYP". Can be invoked by "XMODEM R FILENAME.TYPE" +; or by "XMODEM RC FILENAME.TYP" if checksum is to be used. +; +RCVFIL: IF ACCESS + CALL BYECHK + JNZ RCVFL1 + LHLD 0001H ; Get JMP COLDBOOT + DCX H + MOV D,M + DCX H + MOV E,M + LXI H,ACBOFF ; + ACBOFF + DAD D + MOV A,M ; = ACCESS byte address + ANI ACUPLD ; Test upload access bit + JNZ RCVFL0 ; If bit on, uploads OK + CALL ERXIT + DB 'Sorry, but you are not allowed to upload files ' + DB 'at this time...$' + ENDIF +; +RCVFL0: IF ACCESS AND MBFMSG + LDA MSGFLG + ORA A ; Is this "RM" upload? + JZ RCVFL1 ; If not, skip ACWRIT check + MOV A,M + ANI ACWRIT ; If "RM", check if WRITE access + JNZ RCVFL1 ; If so, ok + CALL ERXIT + DB 'Sorry, but you are not allowed to enter messages ' + DB 'at this time...$' + ENDIF +; +RCVFL1: + CALL LOGDU ; Check file name or drive/user option +; + IF ZCPR2 + LDA WHEEL ; Let SYSOP put file wherever he wants + ORA A + JZ RCVFL5 ; If WHEEL byte not set, stay normal + LDA RCVDRV + ORA A + ENDIF +; +; + IF ZCPR2 AND NOT SPCDU + JZ RCVFL2 + ENDIF +; + IF ZCPR2 AND SPCDU + JZ RCVFL2 + ENDIF +; + IF ZCPR2 + SUI 'A' ; Convert ASCII drive to binary + JMP RCVFL3 +; +RCVFL2: LDA OLDDRV +; +RCVFL3: INR A + STA FCB + ADI 'A'-1 ; Convert binary to ASCII + STA XDRV ; Drive + LDA RCVDRV ; See if a drive was requested + ORA A + LDA OLDUSR ; Current user + JZ RCVFL4 ; If not, use current user + LDA RCVUSR ; Else get requested user +; +RCVFL4: STA XUSR ; User + JMP CONTIN + ENDIF ; ZCPR2 +; +RCVFL5: IF SETAREA + LDA XDRV + SUI 40H + STA FCB + ENDIF +; + LDA PRVTFL ; Receiving to a private area? + ORA A + JZ RCVFL6 ; If not, exit + LDA XPRDRV ; Private area takes precedence + SUI 40H + STA FCB ; Store drive to be used +; +RCVFL6: IF NOCOMR + LXI H,FCB+9 ; Point to filetype + MVI A,'C' ; 1st letter + CMP M ; Is it C ? + JNZ RCVFL7 ; If not, continue normally + INX H ; Get 2nd letter + MVI A,'O' ; 2nd letter + CMP M ; Is it O ? + JNZ RCVFL7 ; If not, continue normally + INX H ; Get 3rd letter + MVI A,'M' ; 3rd letter + CMP M ; Is it M ? + JNZ RCVFL7 ; If not, continue normally + CALL ILPRT ; Print renaming message + DB 'Auto-renaming file to ".OBJ"',CR,LF,0 + LXI H,FCB+9 + MVI M,'O' + INX H + MVI M,'B' + INX H + MVI M,'J' + JMP CONTIN + ENDIF ; NOCOMR +; +RCVFL7: IF NOCOMR AND CPM3 + LXI H,FCB+9 ; Point to filetype + MVI A,'P' ; 1st letter + CMP M ; Is it P ? + JNZ RCVFL8 ; If not, continue normally + INX H ; Get 2nd letter + MVI A,'R' ; 2nd letter + CMP M ; Is it R ? + JNZ RCVFL8 ; If not, continue normally + INX H ; Get 3rd letter + MVI A,'L' ; 3rd letter + CMP M ; Is it L ? + JNZ RCVFL8 ; If not, continue normally + CALL ILPRT ; Print renaming message + DB 'Auto-renaming file to ".OBP"',CR,LF,0 + LXI H,FCB+9 + MVI M,'O' + INX H + MVI M,'B' + INX H + MVI M,'P' + JMP CONTIN + ENDIF ; NOCOMR AND CPM3 +; +; Check to see if filetype is .NDR, if so do NOT allow upload +; +RCVFL8: IF ZCPR3 + LXI H,FCB+9 ; Point to filetype + MVI A,'N' ; 1st letter + CMP M ; Is it N ? + JNZ RCVFL9 ; If not, continue normally + INX H ; Get 2nd letter + MVI A,'D' ; 2nd letter + CMP M ; Is it D ? + JNZ RCVFL9 ; If not, continue normally + INX H ; Get 3rd letter + MVI A,'R' ; 3rd letter + CMP M ; Is it R ? + JNZ RCVFL9 ; If not, continue normally + CALL ERXIT ; Print renaming message + DB 'Cannot receive filetype ".NDR"',CR,LF,'$' +; +; Check to see if filetype is .RCP, if so do NOT allow upload +; +RCVFL9: LXI H,FCB+9 ; Point to filetype + MVI A,'R' ; 1st letter + CMP M ; Is it R ? + JNZ CONTIN ; If not, continue normally + INX H ; Get 2nd letter + MVI A,'C' ; 2nd letter + CMP M ; Is it C ? + JNZ CONTIN ; If not, continue normally + INX H ; Get 3rd letter + MVI A,'P' ; 3rd letter + CMP M ; Is it P ? + JNZ CONTIN ; If not, continue normally + CALL ERXIT ; Abort with error msg + DB 'Cannot receive filetype ".RCP"',CR,LF,'$' + ENDIF ; ZCPR3 +; +CONTIN: + IF MBFMSG + LDA MSGFLG + ORA A ; Is this "RM" upload? + JNZ DONT ; If yes, skip asking what kind of upload + ENDIF +; + IF ASKAREA AND SETAREA AND (NOT ZCPR2) + CALL FILTYP ; Ask caller what kinda beast it is + ENDIF +; + IF ASKAREA AND SETAREA AND ZCPR2 + LDA WHEEL ; Don't ask the SYSOP + ORA A + JNZ DONT ; If WHEEL byte set, skip asking + CALL FILTYP ; Ask caller what kinda beast it is + ENDIF +; +DONT: CALL ILPRT ; Print the message +; + IF NOT DSPFNAM + DB CR,LF,'File will be received on ',0 + ENDIF +; + IF DSPFNAM + DB CR,LF,'Receiving: ',0 + ENDIF +; + LDA PRVTFL ; Going to store in the private area? + ORA A + JZ CONT1 ; If not, exit +; + LDA XPRDRV ; Get private drive + JMP CONT2 ; If yes, it takes priority +; +CONT1: + IF SETAREA + LDA XDRV ; Setarea uses a specified drive + ENDIF +; + IF NOT SETAREA + LDA OLDDRV ; Otherwise get current drive + ADI 'A' ; Convert to ASCII +; +NOTDRV: DB 0,0 ; Filled in by 'GETDU' if requested + ENDIF +; +CONT2: + STA KDRV ; Save drive for KSHOW + SUI 40H ; Convert ASCII to binary + STA FCB ; Stuff in FCB + LDA KDRV ; Get ASCII version back again + CALL CTYPE ; Print the drive to store on + LDA PRVTFL ; Going to store in the private area? + ORA A + JZ NOPRVL ; If nope, skip ahead +; + IF LOGCAL + MVI A,'P' ; If private upload + STA LOGOPT ; Show "P" as option + ENDIF +; + LDA XPRUSR ; Get private user area + JMP CONT3 ; It takes priority +; +NOPRVL: + IF SETAREA + LDA XUSR ; Setarea takes next precedence + ENDIF +; + IF NOT SETAREA + LDA OLDUSR ; Get current drive for default +; +NOTUSR: DB 0,0 ; Filled in by 'GETDU' if requested + ENDIF +; +CONT3: MVI H,0 + MOV L,A + CALL DECOUT ; Print the user area +; + IF NOT DSPFNAM + CALL ILPRT + DB ':',CR,LF,0 + ENDIF +; + IF DSPFNAM + MVI A,':' + CALL CTYPE ; We showed disk/user: + LXI H,FCB+1 ; Now display filename + CALL DSPFN + CALL ILPRT + DB CR,LF,0 + ENDIF +; + CALL KSHOW ; Show available space remaining + CALL ILPRT + DB CR,LF,0 + CALL CHEKFIL ; See if file exists + CALL MAKEFIL ; If not, start a new file + CALL ILPRT + DB 'File open - ready to receive',CR,LF + DB 'To cancel: Ctrl-X, pause, Ctrl-X',CR,LF,0 +; + IF B3RTC AND (NOT MBMXT OR BYEBDOS) + CALL GETTOS ; Get time on system + SHLD TOSSAV ; Save it for exit + ENDIF +; +RCVLP: CALL RCVRECD ; Get a record + JC RCVEOT ; Got 'EOT' + CALL WRRECD ; Write the record + CALL INCRRNO ; Bump record number + CALL SENDACK ; Ack the record + JMP RCVLP ; Loop until 'EOF' +; +; +; Got EOT on record so flush buffers then done +; +RCVEOT: LHLD RECDNO ; Check for zero length file + MOV A,H ; If no records, no file + ORA L + JNZ EOT1 ; If not zero, continue, else abort + CALL RCVSABT ; Abort and erase the zero length file + JMP EXIT ; And exit +; +EOT1: CALL WRBLOCK ; Write the last block + CALL SENDACK ; Ack the record + CALL CLOSFIL ; Close the file + XRA A ; Clear CTYPE's console + STA CONONL ; Output only flag +; + IF LOGLDS + LDA UPLDS ; Get Upload Counter + INR A ; One more upload since log in + STA UPLDS ; Update Counter + ENDIF +; +; Logging upload or crediting time on? +; + IF LOGCAL + LHLD VRECNO ; If yes, get virtual # of recs + SHLD RCNT ; And stuff in RCNT + CALL FILTIM ; Calculate appox. xfer time + ENDIF +; + IF B3RTC AND MBMXT AND (NOT BYEBDOS) + CALL BYECHK ; If BYE not active + JNZ EXITLG ; Skip MXML update + LHLD 0001H ; Get JMP COLDBOOT + DCX H + MOV D,M + DCX H + MOV E,M + LXI H,MBMXO ; + MBMXO offset to MXML + DAD D + MOV A,M ; = max time allowed on system + ORA A ; Check it (zero?) + JZ EXITLG ; If unlimited time, skip update + INR A ; Else, increment it (for secs) + ADD C ; Add mins LSB (can't be >255) + JC MAK255 ; If overflow, make it max (255) + JZ MAK255 ; (if zero, make 255) + MOV M,A ; Update it (credit them for upload) + JMP EXITLM +; +MAK255: MVI A,255 ; If up to max, make sure they don't + MOV M,A ; Get LESS than what they had.. + ENDIF +; + IF B3RTC AND NOT (BYEBDOS OR MBMXT) + CALL BYECHK + JNZ EXITLG ; SKIP this if BYE not running + LHLD RTCBUF ; Get address of RTCBUF in HL + LXI D,B3CMOS ; Add offset to mins on system + DAD D ; (addr in HL) + LDA TOSSAV ;Get saved time on system + MOV M,A ; And restore it + INX H ; (don't count upload time + LDA TOSSAV+1 ; Against them) + MOV M,A + ENDIF +; + IF BYEBDOS AND (NOT B3RTC) + LDA MAXTOS ; Get maximum time allowed + ORA A + JZ EXITLG ; If zero, he's a super-guy anyway + INR A + ADD C ; Add in upload time + JC MAK254 ; Make it 254 minutes if overflow + JZ MAK254 ; (or zero) + CPI 255 ; (or 255) + JNZ MAXSTR +; +MAK254: MVI A,254 ; (254 is max allowed) +; +MAXSTR: STA MAXTOS ; Save for internal use + MOV E,A + MVI C,BDSTOS ; Set maximum time on system + CALL BDOS + ENDIF +; +EXITLM: IF BYEBDOS OR (B3RTC AND MBMXT) + CALL ILPRT + DB CR,LF,'Upload time credited towards maximum timeon.' + DB CR,LF,0 + ENDIF +; + JMP EXITLG +; +;----------------------------------------------------------------------- +; +; SUBROUTINES +; +;----------------------------------------------------------------------- +; +; FILTYP: Ask file type for uploads +; + IF ASKAREA AND SETAREA +; +; Routine to get file type for uploads (modified from XMDM10XX.ASM +; by Russ Pencin (Dallas Connection)). (Modify MAXTYP and TYPTBL +; near the top of the program.) +; +FILTYR: CALL ILPRT + DB CR,LF,0 +; +FILTYP: CALL ILPRT ; Modify message as needed + DB CR,LF,'Is file for:',CR,LF,CR,LF + DB ' (1) CP/M',CR,LF + DB ' (2) MS/PC-DOS',CR,LF + DB 'or (3) General interest?',CR,LF,CR,LF + DB 'Enter choice (1, 2 or 3): ',0 + ENDIF ;ASKAREA AND SETAREA +; + IF ASKAREA AND SETAREA AND WRTLOC + CALL RSTLCK ;Turn off WRTLOC so RDCON will work + ENDIF +; + IF ASKAREA AND SETAREA + MVI C,RDCON + CALL BDOS + CPI '1' ;is it a cpm file + JC FILTYR ;nope, ask again use default upload area(s) + CPI MAXTYP+1 + JNC FILTYR + SUI '1' ;GET OFFSET FOR TYPTBL + RAL + RAL + MVI D,0 + MOV E,A + LXI H,TYPTBL + DAD D + MOV A,M + STA XDRV ;set drive + INX H + MOV A,M ;user + STA XUSR + INX H + MOV A,M ;private drive + STA XPRDRV + INX H + MOV A,M ;and private user values + STA XPRUSR + CALL ILPRT + DB CR,LF,0 + ENDIF ;ASKAREA AND SETAREA +; + IF ASKAREA AND SETAREA AND WRTLOC + CALL SETLCK ;Turn WRTLOC back on + ENDIF +; + IF ASKAREA AND SETAREA + RET + ENDIF +; +;--------------------------------------------------------------------- +; WRTLOC ROUTINES (SETLCK AND RSTLCK) +; + IF WRTLOC AND NOT BYEBDOS +SETLCK: CALL BYECHK ; Is BYE running + RNZ ; If not, skip this + LHLD 0001H ; Get JMP COLDBOOT + DCX H + MOV D,M + DCX H + MOV E,M + LXI H,LOCOFF ; + LOCOFF + DAD D + ORI 0FFH ; = WRTLOC address + MOV M,A ; Turn the lock on + RET +; +RSTLCK: CALL BYECHK ; Is BYE running + RNZ ; Nope, don't touch a thing + LHLD 0001H ; If so, time to reset it + DCX H ; Get JMP COLDBOOT addr. + MOV D,M + DCX H + MOV E,M + LXI H,LOCOFF ; + LOCOFF bytes + DAD D ; = WRTLOC address + XRA A ; Clear it + MOV M,A ; (so ctrl-C/ctrl-K work) + RET + ENDIF ;WRTLOC AND NOT BYEBDOS +; + IF WRTLOC AND BYEBDOS +SETLCK: MVI C,BDWRTL ; Set/Get writeloc function + MVI E,1 ; Turn on WRTLOC flag + CALL BDOS + RET +; +RSTLCK: MVI C,BDWRTL ; Set/Get writeloc function + MVI E,0 ; Turn off WRTLOC flag + CALL BDOS + RET + ENDIF +; +;--------------------------------------------------------------------- +; +; Display file name function +; + IF DSPFNAM ; HL=FCB address +DSPFN: MVI B,8 +; +PRNAM: MOV A,M + ANI 7FH ; Strip any attribute bits + CPI ' ' ; Don't print blanks + CNZ CTYPE ; Print filename + INX H + DCR B + JNZ PRNAM +; +PRDOT: MVI A,'.' ; After first part, print dot + CALL CTYPE + MVI B,3 +; +PRTYP: MOV A,M + ANI 7FH ; Strip any attribute bits + CPI ' ' ; Don't print blanks + CNZ CTYPE ; Print filetype + INX H + DCR B + JNZ PRTYP + RET + ENDIF ; DSPFNAM +; +; Check to see if BYE is running before getting CONOUT, checking MBBS +; ACCESS byte or setting/resetting WRTLOC. This routine also returns +; the address of the original cold boot routine in DE. +; +; Go through a big search to see if BYE is active. +; + IF BYEBDOS +BYECHK: MVI C,32 ; This bizarre combination determines + MVI E,241 ; If BYE is not there. + CALL BDOS + CPI 77 ; Is it there? + RET + ENDIF +; + IF (NOT BYEBDOS) AND (USECON OR ACCESS OR WRTLOC) +BYECHK: LHLD 0001H ; Point to warm boot again + DCX H ; If BYE active, + MOV D,M ; Pick up pointer to BYE variables + DCX H ; (COVECT) followed by 'BYE' + MOV E,M + LXI H,CONOFF ; Calculate address of BYE variable + DAD D ; Where ptr to orig BIOS vector stored + MOV E,M ; Load that address into DE, if BIOS + INX H ; Is active, DE now points to original + MOV D,M ; BIOS console output vector + INX H ; Point to BYE signon message +; +; Note that if more BYE variables are added after the cold boot pointer, +; extra INX may be needed. Fix to match your BYE. +; + MOV A,M ; Get letter + ANI 05FH ; Convert to upper case if needed + CPI 'B' ; Try to match 'BYE' + RNZ ; Out if BYE not active + INX H + MOV A,M + ANI 05FH ; Convert to upper case if needed + CPI 'Y' + RNZ + INX H + MOV A,M + ANI 05FH ; Convert to upper case if needed + CPI 'E' + RET + ENDIF +; +; Check next character to see if a space or non-space, file name error +; if no ASCII character. +; +CHKFSP: DCR B + JZ NFN ; Error if end of chars. + MOV A,M + CPI ' '+1 + RNC ; Ok if valid character so return + INX H + JMP CHKFSP ; Look at next character +; +; Check next character to see if a space or non-space, go to menu if a +; command error. +; +CHKSP: DCR B + JZ OPTERR + INX H + MOV A,M ; Get the char. there + CPI ' ' ; Space character? + RET ; JZ = space, JNZ = non-space +; +; Exit, but first write record to log file and ask for description +; +EXITLG: +; + IF LOGCAL OR MBDESC OR MBFMSG + CALL LOGCALL + ENDIF +; +; Ask sysop for a description of the file if ASKSYS is yes +; + IF DESCRIB AND ZCPR2 AND (NOT ASKSYS) + LDA WHEEL ; If its the Sysop, don't ask + ORA A ; For a description because he + JNZ EXIT ; Might want to batch recv files + ENDIF +; + IF DESCRIB AND NDESC + LDA NDSCFL ; If user picked "N" option + ORA A ; allow them to skip upload + JNZ EXIT ; descript + ENDIF +; + IF DESCRIB AND WRTLOC + CALL RSTLCK ; Clear WRTLOC before DESCRIB + ENDIF +; + IF DESCRIB + CALL ASK ; If yes, ask for description of file + ENDIF +; +; Finished, clean up and return to CP/M, send thank-you and timeon +; messages if enabled. +; +EXIT: XRA A + STA CONONL ; Reset 'console only' flag for timeon +; + IF WRTLOC + CALL RSTLCK ; Clear WRTLOC + ENDIF +; +NOBYE2: CALL UNINIT ; Reset vectors (if needed) + LDA OLDDRV ; Restore the original drive + CALL RECDRX + LDA OLDUSR ; Restore the original number + CALL RECARE + LXI D,TBUF ; Reset to default DMA address + MVI C,SETDMA + CALL BDOS + LDA OPTSAV ; If so check option flag + CPI 'R' ; Was it 'R' for receive + JNZ EXIT1 ; If not, then skip this, + CALL ILPRT ; And print + DB CR,LF,'Thanks for the upload',CR,LF,0 +; + IF SYSNEW + CALL ILPRT + DB CR,LF,'(Upload set as SYS file and cannot be examined' + DB CR,LF,'or downloaded until released by the SYSOP....)' + DB CR,LF,0 + ENDIF +; + IF B3RTC AND NOT (MBMXT OR BYEBDOS) + CALL ILPRT ; And print + DB CR,LF,'Time online is not increased during uploads' + DB CR,LF,0 + ENDIF +; + IF MBFMSG + LDA MSGFLG ; Was this a "XMODEM RM" upload? + ORA A + JZ NOTMSG + CALL BYECHK + JNZ EXIT1 + CALL ILPRT + DB CR,LF + DB 'Loading MFMSG for message input, please stand by...' + DB CR,LF,LF,0 + LXI D,81H ; Our buffer starts at 81H + MVI C,0 ; C=# of characters (stuff at 80H) + CALL MBDFIL + STA 80H ; Save # of chars in 80H + MVI A,0C2H ; Stuff C2H (JNZ instruction) + STA 0000H + ORA A ; Make sure NZ flag set so JNZ will jump + JMP 0000H +; +NOTMSG: ENDIF ; MBFMSG +; + IF MBFMSG AND NOT MBDESC + JMP EXIT1 ; If not message upload, exit + ENDIF +; +;----------------------------------------------------------------------- +; + IF MBDESC AND ZCPR2 AND (NOT ASKSYS) + LDA WHEEL ; If its the Sysop, don't ask + ORA A ; For a description because he + JNZ EXIT1 ; Might want to batch recv files + ENDIF +; + IF MBDESC AND NDESC + LDA NDSCFL ; If user picked "N" option + ORA A ; allow them to skip upload + JNZ EXIT1 ; descript + ENDIF +; + IF MBDESC + CALL BYECHK + JNZ EXIT1 + CALL ILPRT + DB CR,LF + DB 'Loading MBBS for upload description, ' + DB 'please stand by...',CR,LF,LF,0 + ENDIF +; + IF MBDESC AND NEWPRV + MVI A,'P' ; ALL "NEW UPLOADS:" private to start + ENDIF +; + IF MBDESC AND NOT NEWPRV + LDA PRVTFL ; 80H=0 if public, "P" if private + ENDIF +; + IF MBDESC + STA 80H ; Stuff "private" flag in page zero + LXI D,82H ; Our buffer starts at 82H + MVI C,0 ; C=# of characters (stuff at 81H) + LXI H,MBDSH ; Heading ("NEW UPLOAD: ") +; +MBDSHP: MOV A,M + CPI 0 + JZ MBDFS + CALL MBDPUT + INX H + JMP MBDSHP +; +MBDFS: CALL MBDFIL + STA 81H ; Save # of chars in 81H + MVI A,0CAH ; Stuff CAH (JZ instruction) + STA 0000H + XRA A ; Make sure Z flag set so JZ will jump + JMP 0000H +; +MBDSH: DB 'NEW UPLOAD: ',0 ; Heading stuffed ahead of filename + ENDIF ; MBDESC +; + IF MBDESC OR MBFMSG +MBDFIL: LDA FCB ; Get drive code + ORA A ; Check it + JNZ MWDRV ; If auto login, use it + LDA DSKSAV ; Else, get current disk + INR A +; +MWDRV: ADI 'A'-1 + CALL MBDPUT ; Stuff in command line buffer + LDA USRSAV ; Get user # + CPI 10 ; Are we 0-9 or above? + JC US0 ; Must be 0-9 + ORA A ; Clear flags + DAA ; Decimal adjust + RAR ; Shift down tens digit + RAR + RAR + RAR + ANI 0FH ; Mask out tens digit + ADI '0' ; Make it ASCII + CALL MBDPUT + LDA USRSAV + ORA A ; Clear flags + DAA ; Decimal adjust + ANI 0FH ; Mask out singles digit +; +US0: ADI '0' ; Make it ASCII + CALL MBDPUT + MVI A,':' ; Put in a colon + CALL MBDPUT + LXI H,FCB+1 ; Stuff in filename without spaces + MVI B,8 +; +DESNM: MOV A,M + CPI ' ' + CNZ MBDPUT + INX H + DCR B + JNZ DESNM + MVI A,'.' + CALL MBDPUT + MVI B,3 +; +DESNM3: MOV A,M + CPI ' ' + JZ DESGO + CPI 0 + JZ DESGO + CALL MBDPUT + INX H + DCR B + JNZ DESNM3 +; +DESGO: MOV A,C + RET +; +MBDPUT: ANI 7FH ; Strip off any high bits + STAX D ; Short routine to stuff A in (DE) and + INX D ; Increment pointer and character count + INR C + RET + ENDIF ; MBDESC OR MBFMSG +; +;----------------------------------------------------------------------- +; +EXIT1: IF (TIMEON OR B3TOS) AND (NOT LUXMOD) AND TOSEXIT + CALL TIME ; Tell user how long he's been on + ENDIF +; + IF (BYEBDOS AND (NOT TIMEON)) AND TOSEXIT AND (NOT LUXMOD) + MVI C,BDPTOS ; Print time on system + CALL BDOS + ENDIF +; +EXIT2: XRA A + LHLD STACK + SPHL + RET +; +; Check local console status in order to let BYE function keys work in +; MBYE and possibly other BYE versions also. (Your BYE must check for +; console function keys in MSTAT.) +; + IF CONFUN +FUNCHK: PUSH B ; Save everything + PUSH D ; (to be safe) + PUSH H + PUSH PSW +; +CONCHK: CALL 0000H ; Address patched in by START +; + ENDIF +; + IF CONFUN AND SYSABT + ORA A ; If SYSABT set, check for + JZ CONDNE ; CANCEL (^X) typed by sysop + MVI C,RDCON + CALL BDOS + CPI CAN + JNZ CONDNE + STA SYSABF + ENDIF +; +CONDNE: + IF CONFUN + POP PSW ; For BIOS JMP CONSTAT + POP H + POP D + POP B ; Restore everything + RET ; And return + ENDIF +; +; Get Disk and User from DUSAVE and log in if valid. +; +GETDU: CALL CHKFSP ; See if a file name is included + SHLD SAVEHL ; Save location of the filename + LDA PRVTFL ; Uploading to a private area? + ORA A + JNZ TRAP ; If yes, going to a specified area + LXI H,DUSAVE ; Point to drive/user + LDA OLDDRV ; Get current drive + STA DUD + ADI 'A' + STA RCVDRV + MOV A,M ; Get 1st character + CPI '0' + JC GETDU1 + CPI '9'+1 + JC NUMER1 +; +GETDU1: STA RCVDRV ; Allows SYSOP to upload to any drive + CPI 'A'-1 + JC NUMER ; Satisfied with current drive + SUI 'A' + STA DUD +; + IF ZCPR2 + LDA WHEEL ; SYSOP using the system? + ORA A + LDA DUD ; Get the value back (flags stay) + JNZ GETDU2 ; If sysop, all things are possible + ENDIF +; + IF NOT USEMAX + CPI MAXDRV + JNC ILLDU ; Drive selection not available + ENDIF +; + IF USEMAX + PUSH H + LXI H,DRIVMAX ; Point to max drive byte + INR M + CMP M ; And check it + PUSH PSW ; Save flags from the CMP + DCR M ; Restore max drive to normal + POP PSW ; Restore flags from the CPM + JNC ILLDU + POP H + ENDIF +; +GETDU2: INX H ; Get 2nd character +; +NUMER: MOV A,M + CPI ':' + JZ OK4 ; Colon for drive only, no user number + CALL CKNUM ; Check if numeric +; +NUMER1: SUI '0' ; Convert ASCII to binary + STA DUU ; Save it + INX H ; Get 3rd character if any + MOV A,M + CPI ':' + JZ OK1 + LDA DUU + CPI 1 ; Is first number a '1'? + JNZ ILLDU + MOV A,M + CALL CKNUM + SUI '0'-10 + STA DUU + INX H ; Get 4th (and last character) if any + MOV A,M + CPI ':' + JNZ ILLDU +; +OK1: LDA OPTSAV ; Get the option back + CPI 'R' ; Receiving a file? + LDA DUU ; Get desired user area + JZ OK2 ; Yes, can not use special download area + LDA DUD ; Get desired drive + CPI SPLDRV-'A' ; Special download drive requested? + LDA DUU ; Get user area requested + JNZ OK2 ; If none, exit + CPI SPLUSR ; Special download area requested? + JZ OK3 ; If yes, process request +; +OK2: IF ZCPR2 + LDA WHEEL ; SYSOP using the system? + ORA A + LDA DUU ; Restore desired user area + STA RCVUSR ; Allows SYSOP to upload anywhere + JNZ OK3 ; If yes, let him have all user areas + ENDIF +; + IF NOT USEMAX + CPI MAXUSR+1 ; Check for maximum user download area + JNC ILLDU ; Error if more (and not special area) + ENDIF +; + IF USEMAX + PUSH H + LXI H,USRMAX ; Point at maximum user byte + CMP M ; And check it + JNC ILLDU + POP H + ENDIF +; +OK3: MOV E,A +; + IF NOT SETAREA + STA NOTUSR+1 ; Store requested user area + MVI A,3EH ; 'MVI A,--' instruction + STA NOTUSR + ENDIF +; + MVI C,SETUSR + CALL BDOS ; Set to requested user area +; +OK4: LDA DUD ; Get drive + MOV E,A +; + IF NOT SETAREA + ADI 'A' + STA NOTDRV+1 ; Store requested drive + MVI A,3EH ; 'MVI A,--' instruction + STA NOTDRV + ENDIF +; + MVI C,SELDSK + CALL BDOS ; Set to requested drive +; +XIT: JMP TRAP ; Now find file selected +; +; Shows available space on upload disk/area. Uses KDRV data area which +; must be loaded before calling this routine. (So KSHOW will work with +; user specified disk if SETAREA equate is not set YES.) +; +; Print the free space remaining for the received file +; +CPMVER EQU 0CH +CURDPB EQU 1FH +GALLOC EQU 1BH +SELDSK EQU 0EH +GETFRE EQU 46 +; +KDRV: DB 0 ; Drive stored here before calling KSHOW +; +KSHOW: LDA KDRV ; Get drive ('A','B','C',etc.) + SUI 41H ; Convert to numeric (0,1,2,etc.) + MOV E,A ; Stuff in E for BDOS call + MVI C,SELDSK ; Select the directory drive to retrieve + CALL BDOS ; The proper allocation vector + MVI C,CURDPB ; It's 2.X or MP/M...request DPB + CALL BDOS + INX H + INX H + MOV A,M ; Get block shift + STA BLKSHF + INX H ; Bump to block mask + MOV A,M + INX H + INX H + MOV E,M ; Get max block # + INX H + MOV D,M + XCHG + SHLD BLKMAX ; Save it + XCHG + INX H + MOV E,M ; Get directory size + INX H + MOV D,M + XCHG +; +; Calculate # of K free on selected drive +; + MVI C,CPMVER ; Get CP/M version number + CALL BDOS + MOV A,L ; Get returned version number + CPI 30H ; 3.0? + JC FREE20 ; Use old method if not + LDA KDRV ; Get drive # + SBI 'A' ; Change from ASCII to binary + MOV E,A ; Use new Compute Free Space BDOS call + MVI C,GETFRE + CALL BDOS + MVI C,3 ; Answer is a 24-bit integer +; +FRE3L1: LXI H,80H+2 ; Answer is in 1st 3 bytes of DMA adr + MVI B,3 ; Convert it from sectors to K + ORA A ; By dividing by 8 +; +FRE3L2: MOV A,M + RAR + MOV M,A + DCX H + DCR B + JNZ FRE3L2 ; Loop for 3 bytes + DCR C + JNZ FRE3L1 ; Shift 3 times + LHLD 80H ; Now get result in K + JMP SAVFRE ; Go store it +; +FREE20: MVI C,GALLOC ; Get address of allocation vector + CALL BDOS + XCHG + LHLD BLKMAX ; Get its length + INX H + LXI B,0 ; Init block count to 0 +; +GSPBYT: PUSH D ; Save alloc address + LDAX D + MVI E,8 ; Set to process 8 blocks +; +GSPLUP: RAL ; Test bit + JC NOTFRE + INX B +; +NOTFRE: MOV D,A ; Save bits + DCX H ; Count down blocks + MOV A,L + ORA H + JZ ENDALC ; Quit if out of blocks + MOV A,D ; Restore bits + DCR E ; Count down 8 bits + JNZ GSPLUP ; Do another bit + POP D ; Bump to next byte.. + INX D ; Of alloc. vector + JMP GSPBYT ; Process it +; +ENDALC: POP D ; Clear stack of allocation vector ptr. + MOV L,C ; Copy block to HL + MOV H,B + LDA BLKSHF ; Get block shift factor + SUI 3 ; Convert from sectors to K + JZ SAVFRE ; Skip shifts if 1K blocks... +; ; Return free in HL +FREKLP: DAD H ; Multiply blocks by K/BLK + DCR A + JNZ FREKLP +; +; Print the amount of free space remaining on the selected drive +; +SAVFRE: CALL DECOUT + CALL ILPRT + DB 'k available for uploads',0 + RET +; +; Log into drive and user (if specified). If none mentioned, it falls +; through to 'TRAP' routine for normal use. +; +LOGDU: LXI H,TBUF ; Point to default buffer command line + MOV B,M ; Store number of characters in command + INR B ; Add in current location +; +LOG1: CALL CHKSP ; Skip spaces to find 1st command + JZ LOG1 +; +LOG2: CALL CHKSP ; Skip 1st command (non-spaces) + JNZ LOG2 + INX H + CALL CHKFSP ; Skip spaces to find 2nd command + SHLD SAVEHL ; Save start address of the 2nd command +; +; Now point to the first byte in the argument, i.e., if it was of format +; similar to: B6:HELLO.DOC then we point at the drive character 'B'. +; + LXI D,DUSAVE + MVI C,4 ; Drive/user is 4 characters maximum +; +CPLP: MOV A,M + CPI ' '+1 ; Space or return, finished + JC TRAP + STAX D + INX H + INX D + CPI ':' + JZ GETDU ; If colon, get drive/user and log in + DCR B ; One less position to check + DCR C ; One less to go + JNZ CPLP +; +; Check for no file name or ambiguous name +; +TRAP: CALL MOVEFCB ; Move the filename into the file block + LXI H,FCB+1 ; Point to file name + MOV A,M ; Get first character of file name + CPI ' ' ; Any there? + JNZ ATRAP ; Yes, check for ambigous file name +; +NFN: CALL ERXIT ; Print message, exit + DB '++ No file name requested ++$' +; +ATRAP: MVI B,11 ; 11 characters to check +; +TRLOOP: MOV A,M ; Get char from FCB + CPI '?' ; Ambiguous? + JZ TRERR ; Yes, exit with error message + CPI '*' ; Even more ambiguous? + JZ TRERR ; Yes, exit with error message + INX H ; Point to next character + DCR B ; One less to go + JNZ TRLOOP ; Not done, check some more + RET +; +TRERR: CALL ERXIT ; Print message, exit + DB '++ Wild-card options are not valid ++$' +; +CKNUM: CPI '0' + JC ILLDU ; Error if less than ascii '0' + CPI '9'+1 + RC ; Error if more than ascii '9' +; +ILLDU: CALL ERXIT + DB '++ Improper drive/user combination ++$' +; +; Receive a record - returns with carry bit set if EOT received +; +RCVRECD:XRA A ; Initialize error count to zero + STA ERRCT +; +RCVRPT: IF CONFUN ; Check for function key? + CALL FUNCHK ; Yeah, why not? + ENDIF +; + IF CONFUN AND SYSABT + LDA SYSABF ; If SYSABT option, check + ORA A ; to see if Abort + JNZ RCVSABT ; If so, bail out now... + ENDIF +; + MVI B,10-1 ; 10-second timeout + CALL RECV ; Get any character received + JC RCVSTOT ; Timeout +; +RCVRPTB:CPI SOH ; 'SOH' for a 128-byte block? + JZ RCVSOH ; Yes + CPI STX ; A 1024-byte block? + JZ RCVSTX ; + ORA A ; + JZ RCVRPT ; Ignore nulls + CPI CRC ; Ignore our own 'CRC' if needed + JZ RCVRPT + CPI NAK ; Ignore our own 'NAK' if needed + JZ RCVRPT + CPI CAN ; CANcel? + JZ CANRCV ; (look for CAN CAN) + CPI EOT ; End of transfer? + STC ; Return with carry set if 'EOT' + RZ +; +; Didn't get SOH or EOT - or - didn't get valid header - purge the line, +; then send nak +; +RCVSERR:MVI B,1 ; Wait for 1 second + CALL RECV ; After last char. received + JNC RCVSERR ; Loop until sender done + LDA FRSTIM ; Is it the first time? + ORA A + MVI A,NAK + JNZ RCVSER2 ; If not first time, send NAK +; +; First time through...do crc/1k/checksum select +; + LDA CRCFLG ; Get 'CRC' flag + ORA A ; 'CRC' in effect? + MVI A,NAK ; Put 'NAK' in accum + JNZ RCVSER2 ; And go send it + MVI A,CRC ; Tell sender 'CRC' is in effect + CALL SEND + LDA KFLAG ; Did we want 1k protocol? + ORA A + JZ RCVSERX ; No, just send the "C" + MVI A,'K' ; Else send a C and a K +; +RCVSER2:CALL SEND ; The 'NAK' or 'CRC' request +; +RCVSERX:LDA ERRCT ; Abort if + INR A ; We have reached + STA ERRCT ; The error + CPI 10 ; Limit? + JZ RCVSABT ; Yes, abort + CPI 5 ; Have we tried 5 times already? + JNZ RCVRPT ; No, try again with same mode + MVI A,'C' ; Else flip to checksum mode if CRC + STA CRCFLG + JMP RCVRPT ; And try again +; +; Error limit exceeded, so abort +; +CANRCV: CALL DELAY ; Wait 100ms + CALL RCVRDY ; Character waiting? + JZ RCVRPT ; If so, no pause, skip CANcel + MVI B,4 + CALL RECV ; Else wait for 2nd character + JC RCVSERR ; If no second character received, error + CPI CAN + JNZ RCVRPTB ; If second character not CAN, check it +; +RCVSABT:CALL CLOSFIL ; Close file + CALL ILPRT + DB CR,LF,CR,LF,'++ Receive cancelled ++',0 + CALL DELFILE ; Delete received file + CALL ERXIT ; Print second half of message + DB '++ Partial file deleted ++$' +; +; Deletes the received file (used if receive aborts) +; +DELFILE:LXI D,FCB ; Point to file + MVI C,DELET ; Get function + CALL BDOS ; Delete it + INR A ; Delete ok? + RNZ ; Yes, return + CALL ERXIT ; No, abort + DB '++ Can''t delete received file ++$' +; +; Timed out on receive +; +RCVSTOT:JMP RCVSERR ; Bump error count, etc. +; +; Got SOH or STX - get block number, block number complemented +; +RCVSOH: LXI H,128 ; 128 bytes in this block + XRA A ; Zero-out KFLAG + JMP RCVHDR +; ; +RCVSTX: MVI A,0FFH ; Set KFLAG true + LXI H,1024 ; 1024 bytes in block +; +RCVHDR: SHLD BLKSIZ ; Store block size for later + STA KFLAG ; Set KFLAG as appropriate + MVI B,1 ; Timeout = 1 sec + MVI A,1 ; Need something to store at FRSTIM + STA FRSTIM ; Indicate first 'SOH' received + CALL RECV ; Get record + JC RCVSTOT ; Got timeout + MOV D,A ; D=block number + MVI B,1 ; Timeout = 1 sec + CALL RECV ; Get complimented record number + JC RCVSTOT ; Timeout + CMA ; Calculate the complement + CMP D ; Good record number? + JZ RCVDATA ; Yes, get data +; +; Got bad record number +; + JMP RCVSERR ; Bump error count +; +RCVDATA:MOV A,D ; Get record number + STA RCVRNO ; Save it + MVI C,0 ; Initialize checksum + CALL CLRCRC ; Clear CRC counter + LHLD BLKSIZ ; Get block size, + XCHG ; And put in DE pair to initialize count + LHLD RECPTR ; Get buffer address +; +RCVCHR: MVI B,1 ; 1 sec timeout + CALL RECV ; Get the character + JC RCVSTOT ; Timeout + MOV M,A ; Store the character + INX H ; Point to next character + DCX D ; Done? + MOV A,D + ORA E + JNZ RCVCHR ; No, loop if <= BLKSIZ + LDA CRCFLG ; Get 'CRC' flag + ORA A ; 'CRC' in effect? + JZ RCVCRC ; Yes, to receive 'CRC' +; +; Verify checksum +; + MOV D,C ; Save checksum + MVI B,1 ; Timeout length + CALL RECV ; Get checksum + JC RCVSTOT ; Timeout + CMP D ; Checksum ok? + JNZ RCVSERR ; No, error +; +; Got a record, it's a duplicate if = previous, or OK if = 1 + previous +; record. +; +CHKSNUM:LDA RCVRNO ; Get received + MOV B,A ; Save it + LDA RECDNO ; Get previous + CMP B ; Prev repeated? + JZ RECVACK ; 'ACK' to catch up + INR A ; Calculate next record number + CMP B ; Match? + JNZ ABORT ; No match - stop sender, exit + RET ; Carry off - no errors +; +; Receive the Cyclic Redundancy Check characters (2 bytes) and see if +; the CRC received matches the one calculated. If they match, get next +; record, else send a NAK requesting the record be sent again. +; +RCVCRC: MVI E,2 ; Number of bytes to receive +; +RCVCRC2:MVI B,1 ; 1 sececond timeout + CALL RECV ; Get crc byte + JC RCVSTOT ; Timeout + DCR E ; Decrement the number of bytes + JNZ RCVCRC2 ; Get both bytes + CALL CHKCRC ; Check received CRC against calc'd CRC + ORA A ; Is CRC okay? + JZ CHKSNUM ; Yes, go check record numbers + JMP RCVSERR ; Go check error limit and send NAK +; +; Previous record repeated, due to the last ACK being garbaged. ACK it +; so sender will catch up +; +RECVACK:CALL SENDACK ; Send the ACK + JMP RCVRECD ; Get next block +; +; Send an ACK for the record +; +SENDACK:MVI A,ACK ; Get 'ACK' + CALL SEND ; And send it + RET +; +; Send the record header +; +; Send [(SOH) or (STX)] (block number) (complemented block number) +; +SENDHDR:LDA KFLAG ; 1k blocks enabled? + ORA A + JNZ SENDBIG ; Yes + MVI A,SOH ; 128 blocks, use SOH + JMP MORHDR ; Send it +; +SENDBIG:MVI A,STX ; 1024 byte block - Start of Header +; +MORHDR: CALL SEND ; One Start of Header or another + LDA RECDNO ; Then send record number + CALL SEND + LDA RECDNO ; Then record number + CMA ; Complemented + CALL SEND ; Record number + RET ; From SENDHDR +; +; Send the data record +; +SENDREC:MVI C,0 ; Initialize checksum + CALL CLRCRC ; Clear the 'CRC' counter + LDA KFLAG ; Are we using 1K blocks? + ORA A + JNZ SEND1 ; Yes, 1k size + LXI D,128 ; Initialize small count + JMP SEND2 +; +SEND1: LXI D,1024 ; Initialize big count +; +SEND2: LHLD RECPTR ; Get buffer address +; +SENDC: MOV A,M ; Get a character + CALL SEND ; Send it + INX H ; Point to next character + DCX D ; Done? + MOV A,D + ORA E + JNZ SENDC ; Loop if <=Blocksize + RET ; From SENDREC +; +; Send the checksum +; +SENDCKS:MOV A,C ; Send the + CALL SEND ; Checksum + RET ; From 'SENDCKS' +; +; Send the two Cyclic Redundancy Check characters. Call FINCRC to cal- +; culate the CRC which will be in 'DE' upon return. +; +SENDCRC:CALL FINCRC ; Calculate the 'CRC' for this record + MOV A,D ; Put first 'CRC' byte in accumulator + CALL SEND ; Send it + MOV A,E ; Put second 'CRC' byte in accumulator + CALL SEND ; Send it + XRA A ; Set zero return code + RET +; +; Returns with carry clear if ACK received. If an ACK is not received, +; the error count is incremented, and if less than 10, carry is set and +; the record is resent. if the error count is 10, the program aborts. +; waits 12 seconds to avoid any collision with the receiving station. +; +GETACK: MVI B,10 ; Wait 10 seconds max + CALL RECVDG ; Receive with garbage collect + JC ACKERR ; Timed out + CPI ACK ; Was it an 'ACK' character? + RZ ; Yes, return +; + IF RETRY + CPI NAK ; Was it an authentic 'NAK'? + JNZ GETACK ; Ignore if neither 'ACK' nor 'NAK' + ENDIF +; +; Timeout or error on ACK - bump error counters then resend the record +; if error limit is not exceeded. +; +ACKERR: LDA ERRCT ; Get count + INR A ; Bump it + STA ERRCT ; Save back + LHLD TOTERR ; Total errors this run + INX H + SHLD TOTERR ; Update and put back + CPI 10 ; At limit? + RC ; If not, go resend the record +; +; Reached error limit +; + CALL ERXIT + DB '++ Send file cancelled ++$' +; +CHKERR: LDA KFLAG + ORA A ; Check to see if in 1024 mode + RZ ; No, so don't bother with rest + LHLD TOTERR ; Check on errors to date... + MOV A,L ; Skip if less than DWNSHFT error so far + CPI DWNSHFT + RC ; Not enough errors to bother with yet + XCHG ; Total errors to DE + LHLD RECDNO ; Get records sent so far + CALL DVHLDE ; Divide by errors so far + MOV A,C ; Take low order byte of quotient... + CPI DWNSHFT ; Compare to specified ratio... + RNC ; Better ratio than needed, so return + XRA A ; Noisy line, let's try + STA KFLAG ; 128 byte blocks + RET +; +ABORT: LXI SP,STACK +; +ABORTL: MVI B,1 ; One second without characters + CALL RECV + JNC ABORTL ; Loop until sender done + MVI A,CAN ; CTL-X + CALL SEND ; Stop sending end +; +ABORTW: MVI B,1 ; One second without chracters + CALL RECV + JNC ABORTW ; Loop until sender done + MVI A,CR ; Get a space... + CALL SEND ; To clear out CTL-X + CALL ERXIT ; Exit with abort message + DB '++ XMODEM aborted ++$' +; +; Increment record number +; +INCRRNO:PUSH H + LHLD RECDNO ; Increment record number + INX H + SHLD RECDNO + LHLD VRECNO ; Update Virtual Record Number + LDA KFLAG ; Was last record a 1024 byte one? + ORA A ; + JZ INCRR1 ; Just handled an normal 128 byte record + INX H ; Otherwise, must have be a BIG one, so + INX H ; Seven ... + INX H + INX H + INX H + INX H + INX H ; Plus +; +INCRR1: INX H ; One + SHLD VRECNO ; Equals the new virtual record number +; + IF NOT (USECON OR BYEBDOS) + LHLD CONOUT+1 ; Check to see if showing count on crt + MOV A,H ; If both zero, user did not fill out + ORA L ; 'CONOUT: jmp 0000H' in patch area + JZ INCRN5 ; With his own console output address + ENDIF +; +; Display the record count on the local CRT if "CONOUT" was filled in by +; the implementor +; + MVI A,1 + STA CONONL ; Set local only + LDA OPTSAV ; See if receive or send mode + CPI 'R' + JZ RMSG + CALL ILPRT + DB CR,'Sending # ',0 + JMP REST +; +RMSG: CALL ILPRT + DB CR,'Received # ',0 +; +REST: LDA KFLAG + ORA A + JZ REST1 + LHLD VRECNO + DCX H ; Stupid but simple way to subtract 7 + DCX H ; Without dying on high-byte + DCX H + DCX H + DCX H + DCX H + DCX H + CALL DECOUT + MVI A,'-' + CALL CTYPE +; +REST1: LHLD VRECNO ; Virtual record number to minimize + CALL DECOUT ; Confusion between 1K and normal + CALL ILPRT ; 'record' sizes (always in terms of + DB ' ',18H,0 ; 128-byte records) +; + IF CONFUN ; Check for sysop console function + CALL FUNCHK ; Keys if CONFUN EQU YES + ENDIF +; +INCRN5: POP H ; Here from above if no CONOUT + RET +; +; See if file exists - if it exists, ask for a different name. +; +CHEKFIL: IF NOT SETAREA + LDA PRVTFL ; Receiving in private area? + ORA A + CNZ RECAREA ; If yes, set drive and user area + ENDIF +; + IF SETAREA + CALL RECAREA ; Set the designated area up + ENDIF +; + LXI D,FCB ; Point to control block + MVI C,SRCHF ; See if it + CALL BDOS ; Exists + INR A ; Found? + RZ ; No, return + CALL ERXIT ; Exit, print error message + DB '++ File exists, use a different name ++$' +; +; Makes the file to be received +; +MAKEFIL:XRA A ; Set extent and record number to 0 + STA FCBEXT + STA FCBRNO + LXI D,FCB ; Point to FCB + MVI C,MAKE ; Get BDOS FNC + CALL BDOS ; To the make + INR A ; 0FFH=bad? + RNZ ; Open ok +; +; Directory full - can't make file +; + CALL ERXIT + DB '++ Error: can''t make file -' + DB ' directory may be full? ++$' +; +; Computes record count, and saves it until a successful file-open. +; +CNREC: MVI C,CFSIZE ; Computes file size + LXI D,FCB + CALL BDOS ; Read first + LHLD RANDOM ; Get the file size + SHLD RCNT ; Save total record count + MOV A,H + ORA L + RNZ ; Return if not zero length +; +NONAME: CALL ERXIT + DB '++ File not found, check DIR ++','$' +; +; Opens the file to be sent +; +OPENFIL:XRA A ; Set extent and rec number to 0 + STA FCBEXT ; For proper open + STA FCBRNO + LXI D,FCB ; Point to file + MVI C,OPEN ; Get function + CALL BDOS ; Open it + INR A ; Open ok? + JNZ OPENOK ; If yes, exit + LDA OPTSAV ; Get command line option + CPI 'L' ; Want to send a library file? + JNZ NONAME ; Exit, if not + CALL ILPRT + DB CR,LF,'++ Member not found, check DIR ++',CR,LF,0 + JMP OPTERR +; +; Check to see if the SYSOP has tagged a .LBR file for NO SEND - if so, +; only allow XMODEM L NAME to transfer individual files. If requested +; file is a $SYS file or has any high bits set, disallow unless WHEEL. +; +OPENOK: IF ZCPR2 + LDA WHEEL ; Check wheel status if ZCPR2 + ORA A ; Is it zero + JNZ OPENOK1 ; If non-zero skip all restrictions + ENDIF +; + IF DWNTAG + LDA FCB+3 ; Regardless of access byte? + ANI 80H ; If so, + JNZ OPENOK1 ; Allow it if F3 set regardless + ENDIF +; + IF ACCESS + CALL BYECHK + JNZ SNDFOK + LHLD 0001H ; Get JMP COLDBOOT + DCX H + MOV D,M + DCX H + MOV E,M + LXI H,ACBOFF ; + ACBOFF + DAD D + MOV A,M ; = ACCESS byte address + ANI ACDNLD ; Test download access bit + JNZ SNDFOK ; If bit on, downloads OK + CALL ERXIT + DB 'Sorry, but you are not allowed to download files ' + DB 'at this time...','$' + ENDIF +; +SNDFOK: IF NOSYS AND NOT LUXMOD + LDA FCB+10 + ANI 80H + JNZ NONAME ; If $SYS then fake a "file not found" + ENDIF +; + IF OK2400 AND TAGLBR AND NOT LUXMOD + LDA MSPEED ; Check baudrate byte set by BYE + CPI 6 ; Is caller >=2400 baud? + JNC OPENOK1 ; If so - let em send the file (PAT2) + ENDIF +; + IF TAGLBR AND NOT LUXMOD + LDA OPTSAV ; Has SYSOP tagged a large .LBR file? + CPI 'L' ; Using XMODEM L? + JZ OPENOK1 ; Yes, skip tag test + LDA FCB+1 ; First char of file name + ANI 80H ; Check bit 7 for tag + JZ OPENOK1 ; If on, file cannot be sent + ENDIF +; + IF TAGLBR AND NOT LUXMOD +OPENOT: CALL ERXIT ; Exit with message + DB '++ File is not for distribution, sorry. ++',CR,LF,CR,LF + DB 'For large LBR files please use XMODEM L or LUX',CR,LF + DB 'to transfer individual member files','$' + ENDIF +; +OPENOK1:LDA OPTSAV + CPI 'L' + JNZ OPN2 + LXI D,TBUF + MVI C,SETDMA + CALL BDOS + MVI C,READ + LXI D,FCB + CALL BDOS + ORA A ; Read ok? + JNZ LERROR + LHLD TBUF+14 ; Value in buffer where DIRSIZE is + SHLD DIRSZ + LXI H,TBUF + MOV A,M + ORA A + JZ CKDIR ; Check directory present? +; +NOTLBR: CALL ERXIT + DB '++ Bad .LBR directory, notify Sysop ++','$' +; +; Check to see if there is a .LBR file directory with that name and +; complain if not. +; +CKDIR: MVI B,11 ; Maximum length of file name + MVI A,' ' ; First entry must be all blanks + INX H +; +CKDLP: CMP M + JNZ NOTLBR + DCR B + INX H + JNZ CKDLP +; +; The first entry in the .LBR directory is indeed blank. Now see if the +; directory size is more than 0. +; + MOV D,M ; Get directory starting location + INX H ; Which must be 0000H... + MOV A,M + ORA D + JNZ NOTLBR ; Directory does not start in record 0 + INX H + MOV A,M ; Get size of directory + INX H + ORA M + JZ NOTLBR ; Directory must be >0 records! + LXI H,TBUF ; Point to directory +; +; The next routine checks the .LBR directory for the specified member. +; Name one sector at a time. +; +CMLP: MOV A,M ; Get member active flag + ORA A ; 00=active, anything else can be... + MVI B,11 ; Regarded as invalid (erased or blank) + INX H ; Point to member name + JNZ NOMTCH ; No match if inactive entry +; +CKLP: LDAX D ; Now compare the file name specified... + CMP M ; Against the member file name + JNZ NOMTCH ; Exit loop if no match found + INX H + INX D + DCR B + JNZ CKLP ; Check all 11 characters + MOV E,M ; Got the file - get file address + INX H + MOV D,M + XCHG + SHLD INDEX ; Save file address in .LBR + XCHG + INX H + MOV E,M ; Get the file size + INX H + MOV D,M + XCHG + DCX H + SHLD RCNT ; Save size a # of records + LHLD INDEX ; Get file address + SHLD RANDOM ; Place it into random field + XRA A + STA RANDOM+2 ; Must zero the 3rd byte + STA FCBRNO ; Also zero FCB record # + LXI D,FCB ; Point to FCB of .LBR file + MVI C,RRDM ; Read random + CALL BDOS + JMP OPENOK3 ; No need to error check +; +; Come here if no file name match and another sector is needed +; +NOMTCH: INX H ; Skip past the end of the file entry + DCR B + JNZ NOMTCH + LXI B,20 ; Point to next file entry + DAD B + LXI D,MEMFCB ; Point to member name again + MOV A,H ; See if we checked all 4 entries + ORA A + JZ CMLP ; No, check next + LHLD DIRSZ ; Get directory size + MOV A,H + ORA L + JNZ INLBR ; Continue if still more to check + CALL ERXIT + DB '++ Member not found, check DIR ++$' +; +INLBR: DCX H ; Decrement dirctory size + SHLD DIRSZ + MVI C,READ ; Read next sector of directory + LXI D,FCB + CALL BDOS + ORA A ; Read ok? + JNZ LERROR + LXI H,TBUF ; Set our pointers for compare + LXI D,MEMFCB + JMP CMLP ; Check next sector +; +OPN2: IF ZCPR2 + LDA WHEEL ; Check status of wheel if zcpr2 + ORA A ; Is it zero + JNZ OPENOK3 ; If not then skip the # and .com check + ENDIF +; + IF NOLBS OR NOCOMS ; Check for send restrictions + LXI H,FCB+11 + MOV A,M ; Check for protect attr + ANI 7FH ; Remove CP/M 2.x attrs + ENDIF +; + IF NOLBS ; Do not allow '#' to be sent + CPI '#' ; Chk for '#' as last first + JNZ OPELOK ; If '#', can not send, show why + CALL ERXIT + DB '++ File not for distribution ++$' +; +OPELOK: ENDIF +; + IF NOCOMS ; Do not allow '.COM' to be sent + CPI 'M' ; If not, check for '.COM' + JNZ OPENOK3 ; If not, ok to send + DCX H + MOV A,M ; Check next character + ANI 7FH ; Strip attributes + CPI 'O' ; 'O'? + JNZ OPENOK3 ; If not, ok to send + DCX H + MOV A,M ; Now check 1st character + ANI 7FH ; Strip attributes + CPI 'C' ; 'C' as in '.COM'? + JNZ OPENOK3 ; If not, continue + CALL ERXIT ; Exit with message + DB '++ Sending .COM files not allowed ++$' + ENDIF ; NOCOMS +; +OPENOK3: IF NOT DSPFNAM + CALL ILPRT ; Print the message + DB 'File open: ',0 + ENDIF +; + IF DSPFNAM + CALL ILPRT + DB 'Sending: ',0 + LDA OPTSAV + CPI 'L' + JNZ SFNNL ; If not L opt, just show name + LXI H,MEMFCB + CALL DSPFN + CALL ILPRT + DB ' from ',0 +; +SFNNL: LXI H,FCB+1 + CALL DSPFN + CALL ILPRT + DB CR,LF,'File size: ',0 + ENDIF +; + LHLD RCNT ; Get record count + LDA OPTSAV + CPI 'L' + JNZ OPENOK4 ; If send from library add 1 to + INX H ; Show correct record count +; +OPENOK4:CALL CKKSIZ ; Check to see if it is at least 1K... + CALL DECOUT ; Print decimal number of records + PUSH H + CALL ILPRT + DB ' records (',0 + POP H ; Get # of 128 byte records + LXI D,8 ; Divide by 8 + CALL DVHLDE ; To get # of 1024 byte blocks + MOV A,H + ORA L ; Check if remainder + MOV H,B ; Get quotient + MOV L,C + JZ EXKB ; If 0 remainder, exact kilobytes + INX H ; Else, increment to next k +; +EXKB: CALL DECOUT ; Show # of kilobytes + CALL ILPRT + DB 'k)',CR,LF,0 + CALL ILPRT + DB 'Send time: ',0 + CALL FILTIM ; Get file xfer time in mins in BC + PUSH H ; Save seconds in HL +; + IF ZCPR2 AND MAXTIM + LDA WHEEL ; Check wheel status if zcpr2 + ORA A ; Is it zero + JNZ SKIPTIM ; If its not then skip the limit + ENDIF +; + IF OK2400 ; No restrictions for 2400 bps callers? + LDA MSPEED ; Check baudrate byte set by BYE + CPI 6 ; Is >=2400? + JNC SKIPTIM ; If so, skip time check + ENDIF +; + IF MAXTIM + MOV A,C ; If limiting get length of this program + INR A ; Increment to next full minute + ENDIF +; + IF MAXTIM AND TIMEON + LXI H,TON + ADD M ; Add time on to xfer time, TON will + ENDIF +; + IF MAXTIM + STA MINUTE ; Store value for later comparison + MOV A,B ; Get high byte of minute if >255 + JNZ MXTMC2 ; If no carry from increment/add + INR A +; +MXTMC2: STA MINUTE+1 + ENDIF +; +SKIPTIM:MOV L,C + MOV H,B + CALL DECOUT ; Print decimal number of minutes + MVI A,':' + CALL CTYPE ; Output colon + POP H ; Get seconds + MOV A,L + CPI 10 + MVI A,'0' ; Needs a leading zero + CC CTYPE + CALL DECOUT ; Print the seconds portion + CALL ILPRT + DB ' at ',0 + LXI H,SPTBL ; Start of baud rate speeds + MVI D,0 ; Zero the 'D' register + CALL SPEED ; Get speed indicator + ADD A ; Index into the baud rate table + ADD A + MOV E,A ; Now have the index factor in 'DE' + DAD D ; Add to 'HL' + XCHG ; Put address in 'DE' regs. + MVI C,PRINT ; Show the baud + CALL BDOS + CALL SPEED + CPI 5 + MVI A,'0' ; Adds a zero for 1200, 2400, 4800 and + CNC CTYPE ; 9600 bps +; +OPENOK5:CALL ILPRT + DB ' baud',CR,LF,0 +; + IF ZCPR2 AND MAXTIM + LDA WHEEL ; Check wheel status if zcpr2 + ORA A ; Is it zero + JNZ SKIPEM ; If not then no time limits + ENDIF +; + IF MAXTIM AND (BYEBDOS OR MXTOS) + LDA MAXTOS ; Get maximum time on system + ORA A ; If zero, this guy is a winner + JZ SKIPEM ; (skip restrictions) + LDA MINUTE+1 ; Is it over 255 minutes? + ORA A + JNZ OVERTM + ENDIF +; + IF MTL + CALL GETTOS ; Get time on system in HL + ENDIF +; + IF MAXTIM AND BYEBDOS AND (NOT TIMEON) + MVI C,BDGRTC ; Get time on system in A + CALL BDOS + MOV B,A ; Put in B + ENDIF +; + IF MAXTIM AND (BYEBDOS OR MXTOS) + LDA MAXTOS + INR A + ENDIF +; + IF MAXTIM AND BYEBDOS AND (NOT TIMEON) + SUB B + ENDIF +; + IF MTL + SUB L ; Get how much time is left + ADI MAXMIN ; Give them MAXMIN extra + ENDIF +; + IF MAXTIM AND (BYEBDOS OR MXTOS) + MOV B,A ; Put max time on sys in B + LDA MINUTE ; Are we > max time on sys? + CMP B + JNC OVERTM + ENDIF +; + IF MAXTIM AND NOT (BYEBDOS OR MXTOS) + LDA MINUTE+1 ; Get minute count high byte + ORA A ; Check if zero + JNZ OVERTM ; If not, is over 255 minutes! + LDA MINUTE ; Get minute count + CPI MAXMIN+1 ; Compare to MAXTIM value + JNC OVERTM ; If greater than MAXTIM + ENDIF +; +SKIPEM: CALL ILPRT + DB 'To cancel: Ctrl-X, pause, Ctrl-X',CR,LF,0 + RET +; + IF MAXTIM +OVERTM: CALL ILPRT + DB CR,LF,'++ XMODEM ABORTED - send time exceeds the ',0 + ENDIF +; + IF MAXTIM AND NOT (BYEBDOS OR MXTOS) + LXI H,MAXMIN + ENDIF +; + IF MAXTIM AND BYEBDOS + MVI C,BDGRTC + CALL BDOS + MOV B,A + ENDIF +; + IF MTL + CALL GETTOS ; Get TOS back into HL + ENDIF +; + IF MAXTIM AND (BYEBDOS OR MXTOS) + LDA MAXTOS + ENDIF +; + IF MAXTIM AND BYEBDOS + SUB B + ENDIF +; + IF MTL + SUB L ; Get time left + ADI MAXMIN ; Add MAXMIN + ENDIF +; + IF MAXTIM AND (BYEBDOS OR MXTOS) + MVI H,0 + MOV L,A + ENDIF +; + IF MAXTIM + CALL DECOUT + CALL ERXIT1 + DB ' minutes allowed ++$' + ENDIF +; +BTABLE: IF NOT STOPBIT ; One stop bit + DW 5,13,19,25,30,48,85,141,210,280,0 + ENDIF +; + IF STOPBIT ; Two stop bits + DW 5,12,18,23,27,44,78,128,191,255,0 + ENDIF +; +KTABLE: IF NOT STOPBIT ; One stop bit + DW 5,14,21,27,32,53,101,190,330,525,0 + ENDIF +; + IF STOPBIT ; Two stop bits + DW 5,13,19,25,29,48,92,173,300,477,0 + ENDIF +; +RECTBL: IF NOT STOPBIT ; One stop bit + DB 192,74,51,38,32,20,11,8,5,3,0 + ENDIF +; + IF STOPBIT ; Two stop bits + DB 192,80,53,42,36,22,12,7,5,4,0 + ENDIF +; +KECTBL: IF NOT STOPBIT ; One stop bit + DB 192,69,46,36,30,18,10,5,3,2,0 + ENDIF +; + IF STOPBIT ; Two stop bits + DB 192,74,51,38,33,20,10,6,3,2,0 + ENDIF +; +SPTBL: DB '110$','300$','450$','600$','710$','120$','240$' + DB '480$','960$','1920$' +; +; Pass record count in RCNT: returns file's approximate download/upload +; time in minutes in BC, seconds in HL, also stuffs the # of mins/secs +; values in PGSIZE if LOGCAL is YES. +; +FILTIM: CALL SPEED ; Get speed indicator + MVI D,0 + MOV E,A ; Set up for table access + LXI H,BTABLE ; Point to baud factor table + LDA KFLAG + CPI 'K' + JNZ FILTI1 + LXI H,KTABLE ; The guy is using 1k file xfers +; +FILTI1: DAD D ; Index to proper factor + DAD D + MOV E,M + INX H + MOV D,M + LHLD RCNT ; Get number of records + LDA OPTSAV + CPI 'L' ; If not L download + JNZ SKINCR ; Skip increment of record count + INX H ; Increment record count +; +SKINCR: CALL DVHLDE ; Divide HL by value in DE (records/min) + PUSH H ; Save remainder + LXI H,RECTBL ; Point to divisors for seconds calc. + LDA KFLAG + CPI 'K' + JNZ FILTI2 + LXI H,KECTBL ; The guy is using 1k file transfers +; +FILTI2: MVI D,0 + CALL SPEED ; Get speed indicator + MOV E,A + DAD D ; Index into table + MOV A,M ; Get multiplier + POP H ; Get remainder + CALL MULHLA ; Multiply 'H' by 'A' + CALL SHFTHL + CALL SHFTHL + CALL SHFTHL + CALL SHFTHL + MVI H,0 ; HL now = seconds (L=secs,H=0) +; + IF LOGCAL + MOV A,C ; Add minutes of length (to 0 or 1) + STA PGSIZE ; Save as LSB of minutes + MOV A,B ; Get MSB of minutes + STA PGSIZE+1 ; Save as MSB of minutes (>255?) + MOV A,L ; Get LSB of seconds (can't be >59) + STA PGSIZE+2 ; Save for LOGCALL + ENDIF +; + RET ; End of FILTIM routine +; +; Divides 'HL' by value in 'DE' - upon exit: BC=quotient, HL=remainder +; +DVHLDE: PUSH D ; Save divisor + MOV A,E + CMA ; Negate divisor + MOV E,A + MOV A,D + CMA + MOV D,A + INX D ; 'DE' is now two's complemented + LXI B,0 ; Init quotient +; +DIVL1: DAD D ; Subtract divisor from divident + INX B ; Bump quotient + JC DIVL1 ; Loop until sign changes + DCX B ; Adjust quotient + POP D ; Retrieve divisor + DAD D ; Readjust remainder + RET +; +; Multiply the value in 'HL' by the value in 'A', return with answer in +; 'HL'. +; +MULHLA: XCHG ; Multiplicand to 'DE' + LXI H,0 ; Init product + INR A +; +MULLP: DCR A + RZ + DAD D + JMP MULLP +; +; Shift the 'HL' register pair one bit to the right +; +SHFTHL: MOV A,L + RAR + MOV L,A + ORA A ; Clear the carry bit + MOV A,H + RAR + MOV H,A + RNC + MVI A,128 + ORA L + MOV L,A + RET +; +; Closes the received file +; +CLOSFIL:LXI D,FCB ; Point to file + MVI C,CLOSE ; Get function + CALL BDOS ; Close it + INR A ; Close ok? + JNZ CLSEXIT ; Yes, continue + CALL ERXIT ; No, abort + DB '++ Can''t close file ++$' +; +CLSEXIT: + IF SYSNEW + LDA FCB+10 ; Set $SYS attribute + ORI 80H + STA FCB+10 + LXI D,FCB ; Point to file + MVI C,SETATT ; Set attribute function + CALL BDOS + ENDIF +; + RET +; +; Decimal output routine - call with decimal value in 'HL' +; +DECOUT: PUSH B + PUSH D + PUSH H + LXI B,-10 + LXI D,-1 +; +DECOU2: DAD B + INX D + JC DECOU2 + LXI B,10 + DAD B + XCHG + MOV A,H + ORA L + CNZ DECOUT + MOV A,E + ADI '0' + CALL CTYPE + POP H + POP D + POP B + RET +; +; Makes sure there are enough records to send. For speed, this routine +; buffers up 16 records at a time. +; +RDRECD: LDA KFLAG ; Check for 1024 byte records + ORA A + JNZ RDRECDK ; Using 1K blocks +; +NOTKAY: LDA RECNBF ; Get number of records in buffer + DCR A ; Decrement it + JM RDBLOCK ; Exhausted? need more + ORA A ; Otherwise, clear carry and... + RET ; From 'RDRECD' +; +RDRECDK:LDA RECNBF ; Get number of records in buffer + ORA A ; Any records in buffer? + JZ RDBLOCK ; Nope, get more + SUI 8 ; Decrement count of records + RNC ; 8 or more left + XRA A ; Less than 8 left + STA KFLAG ; Revert to 128 blocks + JMP NOTKAY ; Continue with short blocks +; +; Update buffer pointers and counters AFTER sending a good block. +; +UPDPTR: LDA KFLAG + ORA A + JNZ BIG + LXI D,128 ; Small pointer increment + MVI B,1 ; Small sector number + JMP UPDPTR1 +; +BIG: LXI D,1024 ; Big pointer increment + MVI B,8 ; Number of sectors in big block +; +UPDPTR1:LDA RECNBF ; Update buffer sector count + SUB B + STA RECNBF + LHLD RECPTR ; Get buffer address + DAD D ; To next buffer + SHLD RECPTR ; Save buffer address + RET +; +; Buffer is empty - read in another block of 16 +; +RDBLOCK:LDA EOFLG ; Get 'EOF' flag + CPI 1 ; Is it set? + STC ; To show 'EOF' + RZ ; Got 'EOF' + MVI C,0 ; Records in block + LXI D,DBUF ; To disk buffer +; +RDRECLP:PUSH B + PUSH D + MVI C,SETDMA ; Set DMA address + CALL BDOS + LXI D,FCB + MVI C,READ + CALL BDOS + POP D + POP B + ORA A ; Read ok? + JZ RDRECOK ; Yes + DCR A ; 'EOF'? + JZ REOF ; Got 'EOF' +; +; Read error +; +LERROR: CALL ERXIT + DB '++ File read error ++$' +; +RDRECOK:LXI H,128 ; Add length of one record + DAD D ; To next buffer + XCHG ; Buffer to 'DE' + INR C ; More records? + MOV A,C ; Get count + CPI BUFSIZ*8 ; Done? + JZ RDBFULL ; Yes, buffer is full + JMP RDRECLP ; Read more +; +REOF: MVI A,1 + STA EOFLG ; Set EOF flag + MOV A,C +; +; Buffer is full, or got EOF +; +RDBFULL:STA RECNBF ; Store record count + LXI H,DBUF ; Init buffer pointear + SHLD RECPTR ; Save buffer address + LXI D,TBUF ; Reset DMA address + MVI C,SETDMA + CALL BDOS + JMP RDRECD ; Pass record to caller +; +; Writes the record into a buffer. When 16 have been written, writes +; the block to disk. +; +; Entry point "WRBLOCK" flushes the buffer at EOF +; +WRRECD: LHLD BLKSIZ ; Get length of last record + XCHG ; Get ready for add + LHLD RECPTR ; Get buffer address + DAD D ; To next buffer + SHLD RECPTR ; Save buffer address + XCHG ; Move BLKSIZ to HL + CALL SHFTHL ; Divide by 128 to get recors + CALL SHFTHL + CALL SHFTHL + CALL SHFTHL + CALL SHFTHL + CALL SHFTHL + CALL SHFTHL + LDA RECNBF ; Bump the records number in the buffer + ADD L + STA RECNBF + CPI BUFSIZ*8 ; Equal to, or past 'end' of buffer? + RC ; No, return +; +; Writes a block to disk +; +WRBLOCK:LDA RECNBF ; Number of records in the buffer + ORA A ; 0 means end of file + RZ ; None to write + MOV C,A ; Save count + LXI D,DBUF ; Point to disk buff +; +DKWRLP: PUSH H + PUSH D + PUSH B + MVI C,SETDMA ; Set DMA + CALL BDOS ; To buffer + LXI D,FCB ; Then write the block + MVI C,WRITE + CALL BDOS + POP B + POP D + POP H + ORA A + JNZ WRERR ; Oops, error + LXI H,128 ; Length of 1 record + DAD D ; 'HL'= next buff + XCHG ; To 'DE' for setdma + DCR C ; More records? + JNZ DKWRLP ; Yes, loop + XRA A ; Get a zero + STA RECNBF ; Reset number of records + LXI H,DBUF ; Reset buffer buffer + SHLD RECPTR ; Save buffer address +; +RSDMA: LXI D,TBUF ; Reset DMA address + MVI C,SETDMA + CALL BDOS + RET +; +WRERR: CALL RSDMA ; Reset DMA to normal + MVI C,CAN ; Cancel + CALL SEND ; Sender + CALL RCVSABT ; Kill receive file + CALL ERXIT ; Exit with msg: + DB '++ Error writing file ++$' +; +; 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 record calling 'RECVDG' will delete any line-noise-induced +; characters "long" before the ACK/NAK would be received. +; +RECVDG: CALL GETCHR + CALL GETCHR +; +RECV: PUSH D ; Save 'DE' regs. + MVI E,MHZ ; Get the clock speed + XRA A ; Clear the 'A' reg. +; +MSLOOP: ADD B ; Number of seconds + DCR E ; One less mhz. to go + JNZ MSLOOP ; If not zero, continue + MOV B,A ; Put total value back into 'B' +; +MSEC: IF NOT BYEBDOS + LXI D,6600 ; 1 second DCR count + ENDIF +; + IF BYEBDOS + LXI D,2800 ; (includes BYEBDOS overhead) + ENDIF +; +MWTI: CALL RCVRDY ; Input from modem ready + JZ MCHAR ; Got the character + DCR E ; Count down for timeout + JNZ MWTI + DCR D + JNZ MWTI + DCR B ; More seconds? + JNZ MSEC ; Yes, wait +; +; Test for the presence of carrier - if none, go to 'CARCK' and continue +; testing for specified time. If carrier returns, continue. If it does +; not return, exit. +; + CALL CAROK ; Is carrier still on? + CNZ CARCK ; If not, test for 15 seconds +; +; Modem timed out receiving - but carrier is still on. +; + POP D ; Restore 'DE' + STC ; Carry shows timeout + RET +; +; Get character from modem. +; +MCHAR: CALL MDIN ; Get data byte from modem + POP D ; Restore 'DE' +; +; Calculate checksum and CRC +; + PUSH PSW ; Save the character + CALL UPDCRC ; Calculate CRC + ADD C ; Add to checksum + MOV C,A ; Save checksum + POP PSW ; Restore the character + ORA A ; Carry off: no error + RET ; From 'RECV' +; +; Common carrier test for receive and send. If carrier returns within +; TIMOUT seconds, normal program execution continues. Else, it will +; abort to CP/M via EXIT. +; +CARCK: MVI E,TIMOUT*10 ; Value for 15 second delay +; +CARCK1: CALL DELAY ; Kill .1 seconds + CALL CAROK ; Is carrier still on? + RZ ; Return if carrier on + DCR E ; Has 15 seconds expired? + JNZ CARCK1 ; If not, continue testing +; +; See if got a local console, and report if so. +; + IF NOT (USECON OR BYEBDOS) + LHLD CONOUT+1 ; Get conout address + MOV A,H ; Zero if no local console + ORA L + JZ CARCK2 + ENDIF +; + MVI A,1 ; Print local only + STA CONONL + CALL ILPRT ; Report loss of carrier + DB CR,LF,'++ Carrier lost in XMODEM ++',CR,LF,0 +; +CARCK2: LDA OPTSAV ; Get option + CPI 'R' ; If not receive + JNZ EXIT ; Then abort now, else + CALL DELFILE ; Get rid of the junk first + JMP EXIT ; Else, abort to CP/M +; +; Delay - 100 millisecond delay. +; +DELAY: PUSH B ; Save 'BC' + LXI B,MHZ*4167 ; Value for 100 ms. delay +; +DELAY2: DCX B ; Update count + MOV A,B ; Get MSP byte + ORA C ; Count = zero? + JNZ DELAY2 ; If not, continue + POP B ; Restore 'BC' + RET ; Return to CARCK1 +; +;----------------------------------------------------------------------- +; +; Tells user to add description of an uploaded file +; + IF DESCRIB +ASK: LDA OPTSAV ; Get the option + CPI 'R' + RNZ ; If not receiving a file, exit + LDA PRVTFL ; Sending to "private area"? + ORA A + RNZ ; If yes, do not ask for description + ENDIF +; + IF DESCRIB AND ZCPR2 AND (NOT ASKSYS) + LDA WHEEL + ORA A + RNZ + ENDIF +; + IF DESCRIB + MVI B,2 ; Short delay to wait for an input char. + CALL RECV + ENDIF +; + IF DESCRIB AND ASKIND +ASK1: CALL DELAY + CALL SHONM ; Show the file name + CALL DILPRT + DB ' - this file is for:',CR,LF,CR,LF,0 + MVI C,PRINT ; Display the file descriptors + LXI D,KIND0 + CALL BDOS + CALL DILPRT + DB CR,LF,'Select one: ',0 + CALL INPUT ; Get a character + CALL TYPE + CPI '0' + JC ASK1 + CPI '9'+1 + JNC ASK1 + STA KIND + ENDIF +; + IF DESCRIB AND (NOT ASKIND) +ASK1: CALL DELAY + CALL SHONM + ENDIF +; + IF DESCRIB +ASK2: LXI H,0 + SHLD OUTPTR ; Initialize the output pointers + CALL DILPRT + DB CR,LF,CR,LF + DB 'Please describe this file (7 lines or less). Tell ' + DB 'what equipment can use',CR,LF,'it and what the ' + DB 'program does. Extra RET to quit.',CR,LF,CR,LF,0 + CALL SENBEL +; +; Get the file name from FCB, skip any blanks +; + LXI H,HLINE + CALL DSTOR1 + MVI B,8 ; Get FILENAME + LXI D,FCB+1 + LXI H,OLINE + CALL LOPFCB + MVI M,'.' + MOV A,M ; Separate FILENAME and EXTENT + CALL TYPE + INX H + MVI B,3 ; Get EXTENT name + CALL LOPFCB + ENDIF +; + IF DESCRIB AND ASKIND +AFIND1: LDA KIND + CPI '0' ; File category 0 + LXI D,KIND0+4 + CZ DKIND ; File category 1 + CPI '1' + LXI D,KIND1+4 + CZ DKIND ; File category 1 + CPI '2' + LXI D,KIND2+4 + CZ DKIND ; File category 2 + CPI '3' + LXI D,KIND3+4 + CZ DKIND ; File category 3 + CPI '4' + LXI D,KIND4+4 + CZ DKIND ; File category 4 + CPI '5' + LXI D,KIND5+4 + CZ DKIND ; File category 5 + CPI '6' + LXI D,KIND6+4 + CZ DKIND ; File category 6 + CPI '7' + LXI D,KIND7+4 + CZ DKIND ; File category 7 + CPI '8' + LXI D,KIND8+4 + CZ DKIND ; File category 8 + CPI '9' + LXI D,KIND9+4 + CZ DKIND ; File category 9 + ENDIF ; DESCRIB AND ASKIND +; + IF DESCRIB AND (NOT ASKIND) + MVI M,CR + INX H + MVI M,LF + ENDIF +; + IF DESCRIB + CALL DSTOR ; Put FILENAME line into memory + CALL DILPRT + DB CR,LF,CR,LF,'0: ---------1---------2---------3' + DB '---------4---------5---------6---------',CR,LF,0 + XRA A + STA ANYET ; Reset the flag for no information yet + MVI C,'0' +; +EXPLN: INR C + MOV A,C + CPI '7'+1 + JNC EXPL1 + CALL TYPE + MVI A,' ' + CALL OUTCHR + CALL OUTCHR + CALL OUTCHR + CALL DILPRT + DB ': ',0 + CALL DESC ; Get a line of information + CALL DSTOR + JMP EXPLN +; +EXPL1: + MVI A,CR ; All finished, put in an extra CR-LF + CALL OUTCHR + MVI A,LF + CALL OUTCHR + MVI A,'$' + CALL OUTCHR + CALL DILPRT + DB ' Repeating to verify:',CR,LF,CR,LF,0 + LHLD OUTADR + XCHG + MVI C,PRINT + CALL BDOS + LHLD OUTPTR + DCX H + SHLD OUTPTR +; +EXPL2: CALL DILPRT + DB CR,LF,'Is this ok (Y/N)? ',0 + CALL INPUT + CALL TYPE ; Display answer + ANI 5FH ; Change to upper case + CPI 'N' + JZ ASK1 ; If not, do it over + CPI 'Y' + JNZ EXPL2 ; If yes, finish up, else ask again +; +; Now open the file and put this at the beginning +; +EXPL3: LDA 0004H ; Get current drive/user + STA DRUSER ; Store +; +; Set drive/user to the area listed above +; + MVI E,USER ; Set user to WHATSFOR.TXT area + MVI C,SETUSR + CALL BDOS + MVI A,DRIVE ; Set drive to WHATSFOR.TXT area + SUI 41H + MOV E,A + MVI C,SELDSK + CALL BDOS +; +; Open source file +; + CALL DILPRT + DB CR,LF,0 + LXI D,FILE ; Open WHATSFOR.TXT file + MVI C,OPEN + CALL BDOS + INR A ; Check for no open + JNZ OFILE ; File exists, exit + MVI C,MAKE ; None exists, make a new file + LXI D,FILE + CALL BDOS + INR A + JZ NOROOM ; Exit if cannot open new file +; +OFILE: LXI H,FILE ; Otherwise use same filename + LXI D,DEST ; With .$$$ extent for now + MVI B,9 + CALL MOVE +; +; Open the destination file +; + XRA A + STA DEST+12 + STA DEST+32 + LXI H,BSIZE ; Get Buffer allocated size + SHLD OUTSIZ ; Set for comparison + MVI C,DELET ; Delete any existing file that name + LXI D,DEST + CALL BDOS + MVI C,MAKE ; Now make a new file that name + LXI D,DEST + CALL BDOS + INR A + JZ NOROOM ; Cannot open file, no directory room + CALL DILPRT + DB CR,LF,'Wait a moment...',0 +; +; Read sector from source file +; +READLP: LXI D,TBUF + MVI C,SETDMA + CALL BDOS + LXI D,FILE ; Read from WHATSFOR.TXT + MVI C,READ + CALL BDOS + ORA A ; Read ok? + JNZ RERROR + LXI H,TBUF ; Read buffer address +; +; Write sector to output file (with buffering) +; +WRDLOP: MOV A,M ; Get byte from read buffer + ANI 7FH ; Strip parity bit + CPI 7FH ; Del (rubout)? + JZ NEXT ; Yes, ignore it + CPI EOF ; End of file marker? + JZ TDONE ; Transfer done, close, exit + CALL OUTCHR +; +NEXT: INR L ; Done with sector? + JZ READLP ; If yes get another sector + JMP WRDLOP ; No, get another byte +; +; Handle a backspace character while entering a character string +; +BCKSP: CALL TYPE + MOV A,B ; Get position on line + ORA A + JNZ BCKSP1 ; Exit if at initial column + CALL SENBEL ; Send a bell to the modem + MVI A,' ' ; Delete the character + JMP BCKSP3 +; +BCKSP1: DCR B ; Show one less column used + DCX H ; Decrease buffer location + MVI A,' ' + MOV M,A ; Clear memory at this point + CALL TYPE ; Backspace the "CRT" +; +BCKSP2: MVI A,BS ; Reset the "CRT" again +; +BCKSP3: CALL TYPE ; Write to the "CRT" + RET +; +; Asks for line of information +; +DESC: MVI B,0 + LXI H,OLINE +; +DESC1: CALL INPUT ; Get keyboard character + CPI CR + JZ DESC4 + CPI TAB + JZ DESC6 + CPI BS + JNZ DESC2 + CALL BCKSP + JMP DESC1 ; Get the next character +; +DESC2: CPI ' ' + JC DESC1 ; If non-printing character, ignore + JZ DESC3 ; If a space, continue + STA ANYET ; Show a character has been sent now +; +DESC3: MOV M,A + CALL TYPE ; Display the character + INX H + INR B + MOV A,B + CPI 70 ; Do not exceed line length + JC DESC1 + CALL SENBEL ; Send a bell to the modem + CALL BCKSP2 + CALL BCKSP1 ; Do not allow a too-long line + JMP DESC1 +; +DESC4: LDA ANYET ; Any text typed on first line yet? + ORA A + JNZ DESC5 ; If yes, exit + POP H + JMP ASK1 ; Ask again for a description +; +DESC5: MVI M,CR + MOV A,M + CALL TYPE + INX H ; Ready for next character + MVI M,LF + MOV A,M + CALL TYPE ; Display the line feed + INX H + MOV A,B ; See if at first of line + ORA A + RNZ ; If not, ask for next line + POP H ; Clear "CALL" from stack + JMP EXPL1 +; +DESC6: MOV A,B ; At end of line now? + CPI 68 + JNC DESC1 ; If yes, disregard + MVI M,' ' + MOV A,M + CALL TYPE + INX H + INR B + MOV A,B + ANI 7 + JNZ DESC6 + JMP DESC1 ; Ask for next character +; +DSTOR: LXI H,OLINE +; +DSTOR1: MOV A,M + CALL OUTCHR + CPI LF + RZ + INX H + JMP DSTOR1 +; +; Print message then exit to CP/M +; +DEXIT: POP D ; Get message address + MVI C,PRINT ; Print message + CALL BDOS + CALL RESET ; Reset the drive/user + JMP EXIT ; all done +; +; Inline print routine - prints string pointed to by stack until a zero +; is found. Returns to caller at the next address after the zero ter- +; minator. +; +DILPRT: XTHL ; Save hl, get message address +; +DILPLP: MOV A,M ; Get char + CALL TYPE ; Output it + INX H ; Point to next + MOV A,M ; Test + ORA A ; For end + JNZ DILPLP + XTHL ; Restore hl, ret address + RET ; Return past the end of the message +; +; +; Disk is full, save original file, erase others. +; +FULL: MVI C,DELET + LXI D,DEST + CALL BDOS + CALL DEXIT + DB CR,LF,'++ DISK FULL, ABORTING, SAVING ORIGINAL FILE','$' +; +; Get a character, if none ready wait up to 3 minutes, then abort pgm +; +INPUT: PUSH H ; Save current values + PUSH D + PUSH B +; +INPUT1: LXI D,1200 ; Outer loop count (about 2 minutes) +; +INPUT2: LXI B,MHZ*100 ; Roughly 100 ms. +; +INPUT3: PUSH D ; Save the outer delay count + PUSH B ; Save the inner delay count + MVI E,0FFH + MVI C,DIRCON ; Get console status + CALL BDOS + ANI 7FH + POP B ; Restore the inner delay count + POP D ; Restore the outer delay count + ORA A ; Have a character yet? + JNZ INPUT4 ; If yes, exit and get it + DCX B + MOV A,C ; See if inner loop is finished + ORA B + JNZ INPUT3 ; If not loop again + DCX D + MOV A,E + ORA D + JNZ INPUT2 ; If not reset inner loop and go again + MVI A,CR + CALL OUTCHR + MVI A,LF + CALL OUTCHR + LXI SP,STACK ; Restore the stack + CALL EXPL3 ; Finish appending previous information + JMP EXIT ; Finished +; +INPUT4: POP B + POP D + POP H + RET +; +; Stores the Filename/extent in the buffer temporarily +; +LOPFCB: LDAX D ; Get FCB FILENAME/EXT character + CPI ' '+1 + JC LOPF1 + MOV M,A ; Store in OLINE area + CALL TYPE ; Display on CRT + INX H ; Next OLINE position +; +LOPF1: INX D ; Next FCB position + DCR B ; One less to go + JNZ LOPFCB ; If not done, get next one + RET +; +; No room to open a new file +; +NOROOM: CALL DEXIT + DB CR,LF,'++ No DIR space: output ++$' +; +; Output error - cannot close destination file +; +OERROR: CALL DEXIT + DB CR,LF,'++ Cannot close output ++$' +; +; Output a character to the new file buffer - first, see if there is +; room in the buffer for this character. +; +OUTCHR: PUSH H + PUSH PSW ; Store the character for now + LHLD OUTSIZ ; Get buffer size + XCHG ; Put in 'DE' + LHLD OUTPTR ; Now get the buffer pointers + MOV A,L ; Check to see if room in buffer + SUB E + MOV A,H + SBB D + JC OUT3 ; If room, go store the character + LXI H,0 ; Otherwise reset the pointers + SHLD OUTPTR ; Store the new pointer address +; +OUT1: XCHG ; Put pointer address into 'DE' + LHLD OUTSIZ ; Get the buffer size into 'HL' + MOV A,E ; See if buffer is max. length yet + SUB L ; By subtracting 'HL' from 'DE' + MOV A,D + SBB H + JNC OUT2 ; If less, exit and keep going +; +; No more room in buffer, stop and transfer to destination file +; + LHLD OUTADR ; Get the buffer address + DAD D ; Add pointer value + XCHG ; Put into 'DE' + MVI C,SETDMA + CALL BDOS + LXI D,DEST + MVI C,WRITE + CALL BDOS + ORA A + JNZ FULL ; Exit with error, if disk is full now + LXI D,RLEN + LHLD OUTPTR + DAD D + SHLD OUTPTR + JMP OUT1 +; +OUT2: LXI D,TBUF + MVI C,SETDMA + CALL BDOS + LXI H,0 + SHLD OUTPTR +; +OUT3: XCHG + LHLD OUTADR + DAD D + XCHG + POP PSW ; Get the character back + STAX D ; Store the character + LHLD OUTPTR ; Get the buffer pointer + INX H ; Increment them + SHLD OUTPTR ; Store the new pointer address + POP H + RET +; +RERROR: CPI 1 ; File finished? + JZ TDONE ; Exit, then + MVI C,DELET ; Erase destination file, keep original + LXI D,DEST + CALL BDOS + CALL DEXIT + DB '++ Source file read error ++$' +; +; Reset the Drive/User to original, then back to original caller +; +RESET: LDA DRUSER ; Get original drive/user area back + RAR + RAR + RAR + RAR + ANI 0FH ; Just look at the user area + MOV E,A + MVI C,SETUSR ; Restore original user area + CALL BDOS + LDA DRUSER ; Get the original drive/user back + ANI 0FH ; Just look at the drive for now + MOV E,A + MVI C,SELDSK ; Restore original drive + CALL BDOS + CALL DILPRT ; Print CRLF before quitting + DB CR,LF,0 + RET ; Return to caller (Not JMP EXIT1) +; +; Send a bell just to the modem +; +SENBEL: CALL SNDRDY ; Is modem ready for another character? + JNZ SENBEL ; If not, wait + MVI A,7 + PUSH PSW ; Overlay has the "POP PSW" + JMP SENDR ; Send to the modem only +; +;..... +; +; +; Shows the Filename/extent +; +SHONM: CALL DILPRT + DB CR,LF,CR,LF,0 + LXI H,FCB+1 + MVI B,8 ; Maximum size of file name + CALL SHONM1 + MOV A,M ; Get the next character + CPI ' ' ; Any file extent? + RZ ; If not, finished + MVI A,'.' + CALL TYPE + MVI B,3 ; Maximum size of file extent +; +SHONM1: MOV A,M ; Get FCB FILENAME/EXT character + CPI ' '+1 ; Skip any blanks + JC $+6 + CALL TYPE ; Display on CRT + INX H ; Next FCB position + DCR B ; One less to go + JNZ SHONM1 ; If not done, get next one + RET +;..... +; +; Transfer is done - close destination file +; +TDONE: LHLD OUTPTR + MOV A,L + ANI RLEN-1 + JNZ TDONE1 + SHLD OUTSIZ +; +TDONE1: MVI A,EOF ; Fill remainder of record with ^Z's + PUSH PSW + CALL OUTCHR + POP PSW + JNZ TDONE + MVI C,CLOSE ; Close WHATSFOR.TXT file + LXI D,FILE + CALL BDOS + MVI C,CLOSE ; Close WHATSFOR.$$$ file + LXI D,DEST + CALL BDOS + INR A + JZ OERROR +; +; Rename both files as no destination file name was specified +; + LXI H,FILE+1 ; Prepare to rename old file to new + LXI D,DEST+17 + MVI B,16 + CALL MOVE + MVI C,DELET ; Delete original WHATSFOR.TXT file + LXI D,FILE + CALL BDOS + LXI D,DEST ; Rename WHATSFOR.$$$ to WHATSFOR.TXT + MVI C,RENAME + CALL BDOS + JMP RESET ; Reset the drive/user, back to caller +; +TYPE: PUSH B + PUSH D + PUSH H + PUSH PSW + MOV E,A ; Character to 'E' for CP/M + MVI C,WRCON ; Write to console + CALL BDOS + POP PSW + POP H + POP D + POP B + RET + ENDIF ; DESCRIB +; + IF DESCRIB AND ASKIND +DKIND: LDAX D ; Get the character from the string + CALL TYPE ; Otherwise display the character + MOV M,A ; Put in the buffer + CPI LF ; Done yet? + JZ DKIND1 ; Exit if a LF, done + INX D ; Next position in the string + INX H ; Next postion in the buffer + JMP DKIND ; Keep going until a LF +; +DKIND1: LDA KIND ; Get the kind of file back + RET ; Finished + ENDIF +;..... +; +;----------------------------------------------------------------------- +; +; Send a character to the modem +; +SEND: PUSH PSW ; Save the character + CALL UPDCRC ; Calculate CRC + ADD C ; Calcculate checksum + MOV C,A ; Save cksum +; +SENDW: CALL SNDRDY ; Is transmit ready + JZ SENDR ; Yes, go send +; +; Xmit status not ready, so test for carrier before looping - if lost, +; go to CARCK and give it up to 15 seconds to return. If it doesn't, +; return abort via EXIT. +; + PUSH D ; Save 'DE' + CALL CAROK ; Is carrier still on? + CNZ CARCK ; If not, continue testing it + POP D ; Restore 'DE' + JMP SENDW ; Else, wait for xmit ready +; +; Waits for initial NAK - to ensure no data is sent until the receiving +; program is ready, this routine waits for the first timeout-nak or the +; letter 'C' for CRC from the receiver. If CRC is in effect then Cyclic +; Redundancy Checks are used instead of checksums. 'E' contains the +; number of seconds to wait. If the first character received is a CAN +; (CTL-X) then the send will be aborted as though it had timed out. +; Since 1K extensions require CRC, KFLAG is set to NULL if the receiver +; requests checksum +; +WAITNAK: IF CONFUN ; Check for Sysop function key? + CALL FUNCHK ; Yeah, go ahead.. Twit? + ENDIF +; + IF CONFUN AND SYSABT + LDA SYSABF ; If SYSABT option, check + ORA A ; to see if Abort + JNZ ABORT ; If so, bail out now... + ENDIF +; + MVI B,1 ; Timeout delay + CALL RECV ; Did we get + CPI 'K' ; Did he send a "K" first? + JZ SET1KX + CPI CRC ; 'CRC' indicated? + JZ SET1K ; Yes, send block + CPI NAK ; A 'NAK' indicating checksum? + JZ SETNAK ; Yes go put checksum in effect + CPI CAN ; Was it a cancel (CTL-X)? + JZ ABORT ; Yes, abort + DCR E ; Finished yet? + JZ ABORT ; Yes, abort + JMP WAITNAK ; No, loop +; +; Turn on checksum flag +; +SETNAK: XRA A + STA KFLAG ; Make sure transfer uses small blocks + MVI A,'C' ; Change to checksum + STA CRCFLG + RET +; +; Turn on 1k flag +; +SET1K: MVI B,1 ; Wait up to 1 second to get "K" + CALL RECV + CPI 'K' ; Did we get a "K" or something else + RNZ ; (or nothing) +; +SET1KX: LDA MSPEED + CPI 5 + RC + MVI A,'K' + STA KFLAG ; Set 1k flag + RET +; +; This routine moves the filename from the default command line buffer +; to the file control block (FCB). +; +MOVEFCB:LHLD SAVEHL ; Get position on command line + CALL GETB ; Get numeric position + LXI D,FCB+1 + CALL MOVENAM ; Move name to FCB + XRA A + STA FCBRNO ; Zero record number + STA FCBEXT ; Zero extent + LDA OPTSAV ; This going to be a library file? + CPI 'L' + RNZ ; If not, finished +; +; Handles library entries, first checks for proper .LBR extent. If no +; extent was included, it adds one itself. +; + SHLD SAVEHL + LXI H,FCB+9 ; 1st extent character + MOV A,M + CPI ' ' + JZ NOEXT ; No extent, make one + CPI 'L' ; Check 1st character in extent + JNZ LBRERR + INX H + MOV A,M + CPI 'B' ; Check 2nd character in extent + JNZ LBRERR + INX H + MOV A,M + CPI 'R' ; Check 3rd character in extent + JNZ LBRERR +; +; Get the name of the desired file in the library +; +MOVEF1: LHLD SAVEHL ; Get current position on command line + CALL CHKMSP ; See if valid library member file name + INR B ; Increment for move name + LXI D,MEMFCB ; Store member name in special buffer + JMP MOVENAM ; Move from command line to buffer, done +; +; Check for any spaces prior to library member file name, if none (or +; only spaces remaining), no name. +; +CHKMSP: DCR B + JZ MEMERR + MOV A,M + CPI ' '+1 + RNC + INX H + JMP CHKMSP +; +; Gets the count of characters remaining on the command line +; +GETB: MOV A,L + SUI TBUF+2 ; Start location of 1st command + MOV B,A ; Store for now + LDA TBUF ; Find length of command line + SUB B ; Subtract those already used + MOV B,A ; Now have number of bytes remaining + RET +; +LBRERR: CALL ERXIT + DB '++ Invalid library name ++$' +; +MEMERR: CALL ILPRT + DB CR,LF,'++ No library member file requested ++',CR,LF,0 + JMP OPTERR +; +; Add .LBR extent to the library file name +; +NOEXT: LXI H,FCB+9 ; Location of extent + MVI M,'L' + INX H + MVI M,'B' + INX H + MVI M,'R' + JMP MOVEF1 ; Now get the library member name +; +; Move a file name from the 'TBUF' command line buffer into FCB +; +MOVENAM:MVI C,1 +; +MOVEN1: MOV A,M + CPI ' '+1 ; Name ends with space or return + JC FILLSP ; Fill with spaces if needed + CPI '.' + JZ CHKFIL ; File name might be less than 8 chars. + STAX D ; Store + INX D ; Next position to store the character + INR C ; One less to go + MOV A,C + CPI 12+1 + JNC NONAME ; 11 chars. maximum filename plus extent +; +MOVEN2: INX H ; Next char. in file name + DCR B + JZ OPTERR ; End of name, see if done yet + JMP MOVEN1 +; +; See if any spaces needed between file name and .ext +; +CHKFIL: CALL FILLSP ; Fill with spaces + JMP MOVEN2 +; +FILLSP: MOV A,C + CPI 9 + RNC ; Up to 1st character in .ext now + MVI A,' ' ; Be sure there is a blank there now + STAX D + INR C + INX D + JMP FILLSP ; Go do another +; +CTYPE: PUSH B ; Save all registers + PUSH D + PUSH H + MOV E,A ; Character to 'E' in case BDOS (normal) + LDA CONONL ; Want to bypass 'BYE' output to modem? + ORA A + JNZ CTYPEL ; Yes, go directly to CRT, then + MVI C,WRCON ; BDOS console output, to CRT and modem + CALL BDOS ; Since 'BYE' intercepts the char. + POP H ; Restore all registers + POP D + POP B + RET +; +CTYPEL: MOV C,E ; BIOS needs it in 'C' + CALL CONOUT ; BIOS console output routine, not BDOS + POP H ; Restore all registers saved by 'CTYPE' + POP D + POP B + RET +; +HEXO: PUSH PSW ; Save for right digit + RAR ; Right justify the left digit + RAR + RAR + RAR + CALL NIBBL ; Print left digit + POP PSW ; Restore right +; +NIBBL: ANI 0FH ; Isolate digit + ADI 90H + DAA + ACI 40H + DAA + JMP CTYPE ; Type it +; +; Inline print of message, terminates with a 0 +; +ILPRT: XTHL ; Save HL, get HL=message +; +ILPLP: MOV A,M ; Get the character + INX H ; To next character + ORA A ; End of message? + JZ ILPRET ; Yes, return + CALL CTYPE ; Type the message + JMP ILPLP ; Loop +; +ILPRET: XTHL ; Restore HL + RET ; Past message +; +; Exit printing message following call +; +ERXIT: CALL ILPRT + DB CR,LF,0 + XRA A + STA OPTSAV ; Reset option to zero for TELL +; +ERXIT1: MVI C,DIRCON ; Use BDOS Direct + MVI E,0FFH ; Console input function + CALL BDOS ; To check for abort + CPI 'C'-40H ; CTL-C + JZ ERXITX ; Abort msg + CPI 'K'-40H ; CTL-K + JZ ERXITX ; Abort msg + POP H ; Get address of next char + MOV A,M ; Get char + INX H ; Increment to next char + PUSH H ; Save address + CPI '$' ; End of message? + JZ EXITXL ; If '$' is end of message + CALL CTYPE ; Else print char on console + JMP ERXIT1 ; And repeat until abort/end +; +EXITXL: CALL ILPRT + DB CR,LF,0 +; +ERXITX: POP H ; Restore stack + JMP EXIT ; Get out of here +; +; Restore the old user area and drive from a received file +; +RECAREA:CALL RECDRV ; Ok set the drive to its place + LDA PRVTFL ; Private area wanted? + ORA A + LDA XPRUSR ; Yes, set to private area + JNZ RECARE + LDA XUSR ; Ok now set the user area +; +RECARE: MOV E,A ; Stuff it in E + MVI C,SETUSR ; Tell BDOS what we want to do + CALL BDOS ; Now do it + RET +; +RECDRV: LDA PRVTFL + ORA A + LDA XPRDRV ; Get private upload drive + JNZ RECDR1 + LDA XDRV ; Or forced upload drive +; +RECDR1: SUI 'A' ; Adjust it +; +RECDRX: MOV E,A ; Stuff it in E + MVI C,SELDSK ; Tell BDOS + CALL BDOS + RET +; +MOVE: MOV A,M ; Get a character + STAX D ; Store it + INX H ; To next 'from' + INX D ; To next 'to' + DCR B ; More? + JNZ MOVE ; Yes, loop + RET +; +;----------------------------------------------------------------------- +; +; CRC SUBROUTINES +; +;----------------------------------------------------------------------- +; +CHKCRC: PUSH H ; Check 'CRC' bytes of received message + LHLD CRCVAL + MOV A,H + ORA L + POP H + RZ + MVI A,0FFH + RET +; +CLRCRC: PUSH H ; Reset 'CRC' store for a new message + LXI H,0 + SHLD CRCVAL + POP H + RET +; +FINCRC: PUSH PSW ; Finish 'CRC' calculation + XRA A + CALL UPDCRC + CALL UPDCRC + PUSH H + LHLD CRCVAL + MOV D,H + MOV E,L + POP H + POP PSW + RET +; +UPDCRC: PUSH PSW ; Update 'CRC' store with byte in 'A' + PUSH B + PUSH H + MVI B,8 + MOV C,A + LHLD CRCVAL +; +UPDLOOP:MOV A,C + RLC + MOV C,A + MOV A,L + RAL + MOV L,A + MOV A,H + RAL + MOV H,A + JNC SKIPIT + MOV A,H ; The generator is x^16 + x^12 + x^5 + 1 + XRI 10H + MOV H,A + MOV A,L + XRI 21H + MOV L,A +; +SKIPIT: DCR B + JNZ UPDLOOP + SHLD CRCVAL + POP H + POP B + POP PSW + RET +; +; end of CRC routines +;----------------------------------------------------------------------- +; start of LOGCAL routines +; +; The following allocations are used by the LOGCALL routines +; + IF LOGCAL +PGSIZE: DB 0,0,0 ; Program length in minutes and seconds +LOGOPT: DB '?' ; Primary option stored here +DEFAULT$DISK: + DB 0 ; Disk for open stored here +DEFAULT$USER: + DB 0 ; User for open stored here +FCBCALLER: + DB 0,'LASTCALR???' ; Last caller file FCB + DB 0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0 +CALLERPTR: + DW LOGBUF +FCBLOG: DB 0 ; Log file FCB + ENDIF +; + IF LOGCAL AND NOT (LOGSYS OR KNET) + DB 'XMODEM ' + DB 'L','O'+80H,'G' ; (the +80H makes this a $SYS file) + ENDIF +; + IF LOGCAL AND LOGSYS AND NOT KNET + DB 'LOG ' + DB 'S','Y'+80H,'S' + ENDIF +; + IF LOGCAL AND KNET AND NOT LOGSYS + DB 'XMODEM ' + DB 'T','X'+80H,'#' + ENDIF +; + IF LOGCAL + DB 0,0,0,0,0,0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0 +LOGPTR: DW DBUF +LOGCNT: DB 0 +LOGK: DB 'k ' + ENDIF +; + IF LOGCAL OR MBFMSG OR MBDESC +DSKSAV: DB 0 ; Up/download disk saved here +USRSAV: DB 0 ; Up/download user saved here + ENDIF +; + IF LOGCAL AND (RTC OR B3RTC OR BYEBDOS) +YYSAV: DB 0 +MMSAV: DB 0 +DDSAV: DB 0 +MNSAV: DB 0 + ENDIF +; +; Main log file routine, adds record to log file +; + IF LOGCAL OR MBDESC OR MBFMSG +LOGCALL: + MVI C,CURDRV ; Get current disk + CALL BDOS ; (where down/upload occurred) + STA DSKSAV ; And save it... + MVI C,SETUSR ; Get current user area + MVI E,0FFH ; (where down/upload occurred) + CALL BDOS + STA USRSAV ; And save it... + ENDIF +; + IF (MBDESC OR MBFMSG) AND (NOT LOGCAL) + RET ; Skip logging if no log + ENDIF +; + IF LOGCAL + XRA A + STA FCBCALLER+12 + STA FCBCALLER+32 + MVI A,LASTDRV-'A' + STA DEFAULT$DISK + MVI A,LASTUSR + STA DEFAULT$USER + LXI D,FCBCALLER + CALL OPENF ; Open LASTCALR file + JNZ LOGC1 + CALL ERXIT + DB '++ No last caller file found +++$' +; +LOGC1: MVI C,SETRRD ; Get random record # + LXI D,FCBCALLER ; (for first record in file) + CALL BDOS + LXI D,DBUF ; Set DMA to DBUF + MVI C,SETDMA + CALL BDOS + LXI D,FCBCALLER ; Read first (& only) record + MVI C,RRDM + CALL BDOS + ENDIF ;LOGCAL +; + IF LOGCAL AND NOT (MBBS AND (RTC OR B3RTC OR BYEBDOS)) + LXI H,DBUF ; Set pointer to beginning of record + ENDIF +; + IF LOGCAL AND (MBBS AND (RTC OR B3RTC OR BYEBDOS)) + LXI H,DBUF+11 ; Set pointer to skip log on date + ENDIF +; + IF LOGCAL + SHLD CALLERPTR + LXI D,LOGBUF ; Set DMA address to LOGBUF + MVI C,SETDMA + CALL BDOS + XRA A + STA FCBLOG+12 + STA FCBLOG+32 + MVI A,LOGDRV-'A' + STA DEFAULT$DISK + MVI A,LOGUSR + STA DEFAULT$USER + LXI D,FCBLOG + CALL OPENF ; Open log file + JNZ LOGC4 ; If file exists, skip create + LXI D,FCBLOG + MVI C,MAKE ; Create a new file if needed + CALL BDOS + INR A + JNZ LOGC2 ; No error, cont. + CALL ERXIT ; File create error + DB '++ No dir space: log ++$' +; +LOGC2: MVI C,SETRRD ; Set random record # + LXI D,FCBLOG ; (for first record in file) + CALL BDOS +; +LOGC3: MVI A,EOF + STA LOGBUF + JMP LOGC4B +; +LOGC4: MVI C,CFSIZE ; Get file length + LXI D,FCBLOG + CALL BDOS ; (end+1) + LHLD FCBLOG+33 ; Back up to last record + MOV A,L + ORA H + JZ LOGC3 ; Unless zero length file + DCX H + SHLD FCBLOG+33 + LXI D,FCBLOG + MVI C,RRDM ; And read it + CALL BDOS +; +LOGC4B: CALL RSTLP ; Initialize LOGPTR and LOGCNT +; +LOGC6: CALL GETLOG ; Get characters out of last record + CPI EOF + JNZ LOGC6 ; Until EOF + LDA LOGCNT ; Then backup one character + DCR A + STA LOGCNT + LHLD LOGPTR + DCX H + SHLD LOGPTR + LDA LOGOPT ; Get option back and put in file + CALL PUTLOG + CALL SPEED ; Get speed factor + ADI 30H + CALL PUTLOG + CALL PUTSP ; Blank + LDA PGSIZE ; Now the program size in minutes.. + CALL PNDEC ; Of transfer time (mins) + MVI A,':' + CALL PUTLOG ; ':' + LDA PGSIZE+2 + CALL PNDEC ; And secs.. + CALL PUTSP ; Blank +; +; Log the drive and user area as a prompt +; + LDA FCB + ORA A + JNZ WDRV + LDA DSKSAV + INR A +; +WDRV: ADI 'A'-1 + CALL PUTLOG + LDA USRSAV + CALL PNDEC + MVI A,'>' ; Make it look like a prompt + CALL PUTLOG + LDA OPTSAV + CPI 'L' + JNZ WDRV1 + LXI H,MEMFCB ; Name of file in library + MVI B,11 + CALL PUTSTR + CALL PUTSP ; ' ' +; +WDRV1: LXI H,FCB+1 ; Now the name of the file + MVI B,11 + CALL PUTSTR + LDA OPTSAV + CPI 'L' + JNZ WDRV2 + MVI C,1 + JMP SPLOOP +; +WDRV2: MVI C,13 +; +SPLOOP: PUSH B + CALL PUTSP ; Put ' ' + POP B + DCR C + JNZ SPLOOP + LHLD VRECNO ; Get VIRTUAL record count + LXI D,8 ; Divide record count by 8 + CALL DVHLDE ; To get # of 1024 byte blocks + MOV A,H + ORA L ; Check if remainder + MOV H,B ; Get quotient + MOV L,C + JZ EXKB2 ; If 0 remainder, exact kb + INX H ; Else increment to next kb +; +EXKB2: CALL PNDEC3 ; Print to log file (right just xxxk) + LXI H,LOGK ; 'k ' + MVI B,2 + CALL PUTSTR + ENDIF +; + IF LOGCAL AND BYEBDOS + MVI C,BDSTOS ; Set max time to 0 so BYE won't + MVI E,0 ; hang up when doing BYEBDOS calls + CALL BDOS ; when getting time/date + ENDIF +; + IF LOGCAL AND (B3RTC OR RTC OR BYEBDOS) + CALL GETDATE ; IF RTC, get current date + PUSH B ; (save DD/YY) + CALL PNDEC ; Print MM + MVI A,'/' ; '/' + CALL PUTLOG + POP PSW ; Get DD/YY + PUSH PSW ; Save YY + CALL PNDEC ; Print DD + MVI A,'/' ; '/' + CALL PUTLOG + POP B ; Get YY + MOV A,C + CALL PNDEC ; Print YY + CALL PUTSP ; ' ' + CALL GETTIME ; IF RTC, get current time + STA MNSAV ; Save min + MOV A,B ; Get current hour + CALL PNDEC ; Print hr to file + MVI A,':' ; With ':' + CALL PUTLOG ; Between HH:MM + LDA MNSAV ; Get min + CALL PNDEC ; And print min + CALL PUTSP ; Print a space + ENDIF +; + IF LOGCAL AND BYEBDOS + LDA MAXTOS ; Reset time on system + MOV E,A ; So BYE will hang up + MVI C,BDSTOS ; If caller is over time limit + CALL BDOS + ENDIF +; + IF LOGCAL AND OXGATE AND (B3RTC OR RTC OR BYEBDOS) + XRA A + STA CMMACNT ; Clear comma count + ENDIF +; + IF LOGCAL +CLOOP: CALL GETCALLER ; And the caller + CPI EOF + JZ QUIT + CPI CR ; Do not print 2nd line of 'LASTCALR' + JNZ CLOP1 + CALL PUTLOG + MVI A,LF + CALL PUTLOG ; And add a LF + JMP QUIT +; +CLOP1: CPI ',' ; Do not print the ',' between names + JNZ CLOP2 + ENDIF ; LOGCAL +; + IF LOGCAL AND OXGATE AND (B3RTC OR RTC OR BYEBDOS) + LDA CMMACNT ; Get comma count + INR A + STA CMMACNT + CPI 2 ; If reached second comma, do CRLF exit + JZ CLOPX + ENDIF +; + IF LOGCAL + MVI A,' ' ; Instead send a ' ' +CLOP2: CALL PUTLOG + JMP CLOOP + ENDIF +; + IF LOGCAL AND OXGATE AND (B3RTC OR RTC OR BYEBDOS) +CLOPX: MVI A,CR ; Cloop exit... do a CRLF and finish up. + CALL PUTLOG + MVI A,LF + CALL PUTLOG + ENDIF +; + IF LOGCAL +QUIT: MVI A,EOF ; Put in EOF + CALL PUTLOG + LDA LOGCNT ; Check count of chars in buffer + CPI 1 + JNZ QUIT ; Fill last buffer & write it + LXI D,FCBCALLER ; Close lastcaller file + MVI C,CLOSE + CALL BDOS + INR A + JZ QUIT1 + LHLD FCBLOG+33 ; Move pointer back to show + DCX H ; Actual file size + SHLD FCBLOG+33 + LXI D,FCBLOG ; Close log file + MVI C,CLOSE + CALL BDOS + INR A + RNZ ; If OK, return now... +; +QUIT1: CALL ERXIT ; If error, oops + DB '++ Cannot close log ++$' + ENDIF ; LOGCAL +; +;----------------------------------------------------------------------- +; +; Support routines for LOGCAL +; +; Gets a single byte from DBUF +; + IF LOGCAL +GETCALLER: + LHLD CALLERPTR + MOV A,M + INX H + SHLD CALLERPTR + RET +; +; Gets a single byte from log file +; +GETLOG: LDA LOGCNT + INR A + STA LOGCNT + CPI 129 + JZ EOLF + LHLD LOGPTR + MOV A,M + INX H + SHLD LOGPTR + RET +; +EOLF: LHLD FCBLOG+33 + INX H + SHLD FCBLOG+33 + LXI H,LOGBUF+1 + SHLD LOGPTR + MVI A,1 + STA LOGCNT + MVI A,EOF + RET +; +; Open file with FCB pointed to by DE (disk/user passed in DEFAULT$DISK +; and DEFAULT$USER) +; +OPENF: PUSH D ; Save FCB address + LDA DEFAULT$DISK ; Get disk for file + CALL RECDRX ; Log into it + LDA DEFAULT$USER ; Get default user + CALL RECARE ; Log into it + POP D ; Get FCB address + MVI C,OPEN ; Open file + CALL BDOS + CPI 255 ; Not present? + RET ; Return to caller +; +; Write character to log file +; +PUTLOG: LHLD LOGPTR ; Get pointer + ANI 7FH ; Mask off any high bits + MOV M,A ; Put data + INX H ; Increment pointer + SHLD LOGPTR ; Update pointer + MOV B,A ; Save character in B + LDA LOGCNT ; Get count + INR A ; Increment it + STA LOGCNT ; Update count + CPI 129 ; Check it + RNZ ; If not EOB, return + PUSH B ; Save character + LXI D,FCBLOG ; Else, write this sector + MVI C,WRDM + CALL BDOS + ORA A + JZ ADVRCP ; If ok, cont. + CALL ERXIT + DB '++ Disk full - cannot add to log ++$' +; +ADVRCP: LHLD FCBLOG+33 ; Advance record number + INX H + SHLD FCBLOG+33 + CALL RSTLP ; Reset buffer pointers + POP PSW ; Get saved character + JMP PUTLOG ; Put it in buffer and return +; +RSTLP: LXI H,LOGBUF ; Reset pointers + SHLD LOGPTR ; And return + MVI A,0 + STA LOGCNT + RET +; +; Print number in decimal format (into log file) +; IN: HL=binary number +; OUT: nnn=right justified with spaces +; +PNDEC3: MOV A,H ; Check high byte + ORA A + JNZ DECOT ; If on, is at least 3 digits + MOV A,L ; Else, check low byte + CPI 100 + JNC TEN + CALL PUTSP +; +TEN: CPI 10 + JNC DECOT + CALL PUTSP + JMP DECOT +; +; Puts a single space in log file, saves PSW/HL +; +PUTSP: PUSH PSW + PUSH H + MVI A,' ' + CALL PUTLOG + POP H + POP PSW + RET +; +; Print number in decimal format (into log file) +; +PNDEC: CPI 10 ; Two column decimal format routine + JC ONE ; One or two digits to area number? + JMP TWO +; +ONE: PUSH PSW + MVI A,'0' + CALL PUTLOG + POP PSW +; +TWO: MVI H,0 + MOV L,A +; +DECOT: PUSH B + PUSH D + PUSH H + LXI B,-10 + LXI D,-1 +; +DECOT2: DAD B + INX D + JC DECOT2 + LXI B,10 + DAD B + XCHG + MOV A,H + ORA L + CNZ DECOT + MOV A,E + ADI '0' + CALL PUTLOG + POP H + POP D + POP B + RET +; +; Put string to log file +; +PUTSTR: MOV A,M + PUSH H + PUSH B + CALL PUTLOG + POP B + POP H + INX H + DCR B + JNZ PUTSTR + RET + ENDIF ; LOGCAL +; +; end of LOGCAL routine +;----------------------------------------------------------------------- +; start of TIMEON routine +; +; Calculate time on system and inform user. Log him off if =>MAXMIN +; unless STATUS is non-zero. +; + IF TIMEON +TIME: PUSH B ; Save BC pair + CALL GETTIME ; Get time from system's RTC + STA CMTEMP ; Save in current-hour-temp + MOV A,B ; Get current hour + POP B ; Restore BC + ENDIF +; + IF TIMEON AND BYEBDOS + PUSH PSW ; save the current hour <== BUG FIX + PUSH B ; Lhour was safely moved to highmem + PUSH D ; in newer versions of BYE + MVI C,BDGRTC + CALL BDOS + LXI D,11 ; Get address of LHOUR + DAD D + POP D + POP B + POP PSW ; Restore current hour...BDOS killed it + ENDIF +; + IF TIMEON AND NOT BYEBDOS + LXI H,LHOUR ; Point to log-on hour (in low memory) + ENDIF +; + IF TIMEON + CMP M ; Equal? + INX H ; Point to logon minutes + JNZ TIME1 ; No + MOV D,M + LDA CMTEMP ; Current minutes + SUB D + STA TON ; Store total time on + JMP TIME2 +; +TIME1: MOV D,M ; Get logon minutes + MVI A,03CH ; 60 min into A + SUB D + LXI H,CMTEMP ; Point at current min + ADD M ; Add current minutes + STA TON + ENDIF +; +TIME2: IF ZCPR2 AND TIMEON + LDA WHEEL ; Check wheel status if ZCPR + ORA A ; Is it zero + JNZ TIME3 ; If not then this is a special user + ENDIF +; + IF TIMEON + LDA MAXTOS + ORA A ; If maxtos is zero, guy is superuser + JZ TIME3 + ENDIF +; + IF TIMEON AND NOT BYEBDOS ; BYEBDOS doesn't use status byte + ORA A ; Special user? + JNZ TIME3 ; Yes, skip log off check + LDA TON + SUI MAXMIN ; Subtract max time allowed + ENDIF +; + IF TIMEON AND BYEBDOS + LDA MAXTOS + MOV B,A + LDA TON + SUB B + ENDIF +; + IF TIMEON + JC TIME3 ; Still time left + CALL TIMEUP ; Time is up, inform user + MVI A,0CDH ; Alter jump vector + STA 0 ; At zero + JMP 0000H ; And log him off +; +TIME3: LXI H,MSG1+015H ; Point at message insert bytes + LDA TON ; Convert to ASCII + MVI B,0FFH +; +TIME4: INR B + SUI 0AH ; Subtract 10 + JNC TIME4 ; Until done + ADI 0AH + ORI '0' ; Make ASCII + MOV M,A + DCX H + MVI A,'0' + ADD B + MOV M,A + CALL ILPRT +; +MSG1: DB CR,LF,'Time on system is 00 minutes',CR,LF,0 + ENDIF +; + IF TIMEON AND NOT BYEBDOS + LDA STATUS ; Check user status + ORA A ; Special user? + JNZ TIME5 ; Yes, reset TON + ENDIF +; + IF TIMEON + RET + ENDIF +; + IF TIMEON AND NOT BYEBDOS +TIME5: MVI A,0 ; Reset timeout for good guys + STA TON + RET + ENDIF +; + IF TIMEON +TIMEUP: CALL ILPRT + DB CR,LF,CR,LF + DB 'Your time is up - wait 24 hours to call back',CR,LF,0 + RET +; +TON: DB 0 ; Storage for time on system +CMTEMP: DB 0 ; Storage for current minute value + ENDIF +; +; Get caller's time on system from BYE3 or MBYE and display on console. +; + IF B3RTC AND B3TOS +TIME: CALL ILPRT + DB CR,LF,'Time on system is ',0 + CALL GETTOS ; Get Time On System from MBYE's RTC + CALL DECOUT ; Print it on the screen + CALL ILPRT + DB ' minutes',CR,LF,0 + RET + ENDIF +; +; Get caller's time on system (returned in HL). +; + IF B3RTC AND (NOT BYEBDOS) +GETTOS: LHLD RTCBUF ; Get RTCBUF addr + MOV A,H + ORA L + RZ ; If 0000H, BYE not running so TOS=0 + MOV A,M ; If hours = 99 + CPI 099H + LXI H,0 + RZ ; Return with TOS=0 + LHLD RTCBUF + LXI D,B3CMOS ; Get offset to TOS word + DAD D ; (addr in HL) + MOV E,M ; Get minutes on system + INX H + MOV D,M ; Stuff into DE + XCHG ; Swap into HL + RET + ENDIF +; + IF BYEBDOS OR MXTOS +MAXTOS: DB 0 ; Maximum time on system + ENDIF +; +; end of TIMEON routine +;----------------------------------------------------------------------- +; +GETDATE: IF (RTC AND LOGCAL) AND NOT (CPM3 OR BYEBDOS) + LDA 45H ; Get the binary day number + MOV B,A ; Set to return binary day # B reg. + LDA 46H ; Get the binary year number + MOV C,A ; Set to return binary year # in C reg. + LDA 44H ; Get the binary month number + RET + ENDIF +; +;----------------------------------------------------------------------- +; start of CPM+ date routine + + IF RTC AND LOGCAL AND CPM3 + MVI C,GETTIM ; BDOS function to get date and time + LXI D,TIMEPB ; Get address of 4-byte data structure + CALL BDOS ; Transfer the current date/time + LHLD TIMEPB + MVI B,78 ; Set years counter +; +LOOP: CALL CKLEAP + LXI D,-365 ; Set up for subtract + JNZ NOLPY ; Skip if no leap year + DCX D ; Set for leap year +; +NOLPY: DAD D ; Subtract + JNC YDONE ; Continue if years done + MOV A,H + ORA L + JZ YDONE + SHLD TIMEPB ; Else save days count + INR B ; Increment years count + JMP LOOP ; And do again +; +; The years are now finished, the years count is in 'B' and TIMEPB holds +; the days (HL is invalid) +; +YDONE: MOV A,B + STA YEAR + CALL CKLEAP ; Check if leap year + MVI A,-28 + JNZ FEBNO ; February not 29 days + MVI A,-29 ; Leap year +; +FEBNO: STA FEB ; Set february + LHLD TIMEPB ; Get days count + LXI D,MTABLE ; Point to months table + MVI B,0FFH ; Set up 'B' for subtract + MVI A,0 ; Set a for # of months +; +MLOOP: PUSH PSW + LDAX D ; Get month + MOV C,A ; Put in 'C' for subtract + POP PSW + SHLD TIMEPB ; Save days count + DAD B ; Subtract + INX D ; Increment months counter + INR A + JC MLOOP ; Loop for next month +; +; The months are finished, days count is on stack. First, calculate +; the month. +; +MDONE: MOV B,A ; Save months + LHLD TIMEPB + MOV A,H + ORA L + JNZ NZD + DCX D + DCX D + LDAX D + CMA + INR A + MOV L,A + DCR B +; +NZD: MOV A,B + STA MONTH + MOV A,L + STA DAY + LDA YEAR + MOV C,A + LDA DAY + MOV B,A + LDA MONTH + RET +; +; This routine checks for leap years. +; +CKLEAP: MOV A,B + ANI 0FCH + CMP B + RET +; +; This is the month's table +; +MTABLE: DB -31 ; January +FEB: DB -28 ; February + DB -31,-30,-31,-30 ; Mar-Jun + DB -31,-31,-30 ; Jul-Sep + DB -31,-30,-31 ; Oct-Dec +; +YEAR: DB 0 +MONTH: DB 0 +DAY: DB 0 + ENDIF ; RTC AND LOGCAL AND CPM3 +; +; end of CPM+ date routine +;----------------------------------------------------------------------- +; + IF LOGCAL AND B3RTC AND NOT BYEBDOS + CALL BYECHK ; See if BYE is running + JZ GETBDAT ; If so, get date from buffer & convert + MVI A,0 ; Else, return 00/00/00 + MOV B,A + MOV C,A + RET + ENDIF +; + IF LOGCAL AND B3RTC AND (NOT BYEBDOS) +GETBDAT:LHLD RTCBUF ; Get RTC buffer in HL + ENDIF +; + IF LOGCAL AND BYEBDOS AND (NOT B3RTC) + MVI C,BDGRTC ; Get RTC buffer in HL + CALL BDOS + ENDIF +; + IF LOGCAL AND (BYEBDOS OR B3RTC) + LXI D,4 ; Offset to YY + DAD D ; HL=YY Address + MOV A,M ; Get YY + CALL BCDBIN ; Make it binary + STA YYSAV ; Save YY + INX H ; Point to MM + MOV A,M ; Get MM + CALL BCDBIN ; Convert BCD to binary + STA MMSAV ; Save it + INX H ; Point to DD + MOV A,M ; Get DAY + CALL BCDBIN ; Convert it to binary + MOV B,A ; Stuff DD in B + LDA YYSAV ; Get YY + MOV C,A ; Put YY in C + LDA MMSAV ; Get MM in A + RET ; And return + ENDIF +; +; +; The routine here should read your real-time clock and return with the +; following information: +; +; register: A - current minute (0-59) +; B - current hour (0-23) +; +GETTIME: IF (TIMEON OR RTC) AND NOT (B3RTC OR CPM3 OR BYEBDOS) +; +;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +;; (this example is for the Serria SBC-100) +;; +;;SBCHR EQU 040H ; Low memory area where stored +;;SBCMN EQU 041H +;; +;; LDA SBCHR ; Get hour from BIOS memory-clock +;; MOV B,A +;; LDA SBCMN ; Get minute from BIOS memory-clock +;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; +;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +;; (this example is for Don Brown's computer) +;; +;; LDA 43h ; Get the current binary hour number +;; MOV B,A ; Set to return binary hour number in Reg. B +;; LDA 42h ; Get the current binary minute number +;; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +; + RET + ENDIF +; +; The following code is for CP/M Plus +; + IF (TIMEON OR RTC) AND CPM3 + MVI C,GETTIM ; BDOS function to get date and time + LXI D,TIMEPB ; Get address of 4-byte data structure + CALL BDOS ; Transfer the current date/time + LDA TIMEPB+2 ; Get current hour + CALL BCDBIN ; Convert BCD hour to binary + MOV B,A ; Position hour for return + PUSH B ; Save the binary hour + LDA TIMEPB+3 ; Get current minute + CALL BCDBIN ; Convert BCD minute to binary + POP B ; Restore the binary hour + RET + ENDIF +; + IF LOGCAL AND B3RTC AND (NOT BYEBDOS) + CALL BYECHK ; See if BYE is running + JZ GETBTIM ; If so, get time from buffer & convert + MVI A,0 ; Else, return 00:00 + MOV B,A + RET +; +GETBTIM:LHLD RTCBUF ; Get RTC buffer address + ENDIF +; + IF LOGCAL AND BYEBDOS AND (NOT B3RTC) + MVI C,BDGRTC ; Get RTC buffer address + CALL BDOS + ENDIF +; + IF LOGCAL AND (B3RTC OR BYEBDOS) + MOV A,M ; Get hours on system + CALL BCDBIN ; Convert BCD value to binary + PUSH PSW ; Save hr on stack + INX H ; Point to minute + MOV A,M ; Get min + CALL BCDBIN ; Convert BCD to binary + POP B ; Get hr in B (min in A) + RET ; And return + ENDIF +; +; Convert BCD value in A to binary in A +; + IF LOGCAL AND (B3RTC OR CPM3 OR BYEBDOS) +BCDBIN: PUSH PSW ; Save A + ANI 0F0H ; Mask high nibble + RRC ; Move to low nibble + RRC + RRC + RRC + MOV C,A ; And stuff in C (C=A) + MVI B,9 ; X10 (*9) +; +BCDBL: ADD C ; Add orig value to A + DCR B ; Decrement B + JNZ BCDBL ; Loop nine times (A+(C*9)=A*10) + MOV B,A ; Save result in B + POP PSW ; Get original value + ANI 0FH ; Mask low nibble + ADD B ; +B gives binary value of BCD digit A + RET ; Return + ENDIF +; +; Check to see that HL register is at least 8 records. If it not, make +; sure 1K blocks are turned off +; +CKKSIZ: MOV A,H ; Get high order byte + ORA A ; Something there? + RNZ ; Yes, certainly more than 8 + MOV A,L ; Get low order byte + CPI 8 ; Looking for at least this many records + RNC ; Not Carry means 8 or more records + XRA A ; Get nothing + STA KFLAG ; Turn off 1K blocks + RET +; +;----------------------------------------------------------------------- +; +; BYEBDOS access routines +; +;----------------------------------------------------------------------- +; + IF BYEBDOS +CONOUT: MOV E,C ; Get character into E + MVI C,BDCONO ; Console output (local only) + JMP BDOS ; Go to it... +; +MINIT: +UNINIT: RET ; Modem's already initialized +; +SENDR: POP PSW ; Needed by specifications + PUSH B + PUSH D + PUSH H + MOV E,A ; Put character in E + MVI C,BDMOUT + CALL BDOS + POP H + POP D + POP B + RET +; +GETCHR: +MDIN: PUSH B + PUSH D + PUSH H + MVI C,BDMINP + CALL BDOS + POP H + POP D + POP B + RET +; +; The following 3 routines operate in differently than BYE does, so we +; must make things "backwards" +; +CAROK: PUSH B + PUSH D + PUSH H + MVI C,BDCSTA + CALL BDOS + JMP BKWDS +; +RCVRDY: PUSH B + PUSH D + PUSH H + MVI C,BDMIST + CALL BDOS + JMP BKWDS +; +SNDRDY: PUSH B + PUSH D + PUSH H + MVI C,BDMOST + CALL BDOS +; +; Flip around bytes, if A>0 then make A zero & set flags +; if A=0 then make A =255 & set flags +BKWDS: ORA A + MVI A,255 + JZ NOSIG + XRA A +; +NOSIG: ORA A + POP H + POP D + POP B + RET +; +SPEED: LDA MSPEED + RET + ENDIF +; +;----------------------------------------------------------------------- +; +; Temporary storage area +; +;----------------------------------------------------------------------- +; + IF DESCRIB +FILE: DB 0,'WHATSFORTXT',0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0 +DEST: DB 0,' $$$',0,0,0,0,0,0,0 + DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ENDIF +; +; Put this ram stuff in the RAM section at the end +; +LZFLG: DB 0 ; For the free space printer +BLKSHF: DB 0 +BLKMAX: DB 0,0 +; + IF B3RTC AND NOT BYEBDOS ; If BYE3/MBYE real-time clock +RTCBUF: DW 0 ; Address of RTCBUF saved here + ENDIF +; + IF B3RTC AND NOT (MBMXT OR BYEBDOS) +TOSSAV: DW 0 + ENDIF +; + IF LOGCAL AND OXGATE AND (B3RTC OR RTC OR BYEBDOS) +CMMACNT:DB 0 ; Comma counter + ENDIF +; + IF TIMEON AND CPM3 +TIMEPB: DS 4 ; Storage for the system date/time + ENDIF +; +MINUTE: DW 0 ; Transfer time in mins for MAXTIM +MEMFCB: DB ' ' ; Library name (16 bytes required) +ANYET: DB 0 ; Any description typed yet? +BLKSIZ: DW 0 ; Number of bytes, 128 or 1024 +CONONL: DB 0 ; CTYPE console-only flag +CRCFLG: DB 0 ; Sets to 'C' if checksum requested +CRCVAL: DW 0 ; Current CRC value +DIRSZ: DW 0 ; Directory size +DRUSER: DB 0 ; Original drive/user, for return +DUD: DB 0 ; Specified disk +DUSAVE: DB 0,0,0,0 ; Buffer for drive/user +DUU: DB 0 ; Specified user +ERRCT: DB 0 ; Error count +FRSTIM: DB 0 ; Turned on after first 'SOH' received +INDEX: DW 0 ; Index into directory +KFLAG: DB 0 ; Non-zero if sending 1K blocks +OUTPTR: DW 0 +RCNT: DW 0 ; Record count +RCVDRV: DB 0 ; Requested drive number +RCVRNO: DB 0 ; Record number received +RCVUSR: DB 0 ; Requested user number +RECDNO: DW 0 ; Current record number +KIND: DB 0 ; Asks what kind of file this is +OLDDRV: DB 0 ; Save the original drive number +OLDUSR: DB 0 ; Save the original user number +OPTSAV: DB 0 ; Save option here for carrier loss +PRVTFL: DB 0 ; Private user area option flag +MSGFLG: DB 0 ; Message upload flag +SAVEHL: DW 0 ; Saves TBUF command line address +TOTERR: DW 0 ; Total errors for transmission attempt +VRECNO: DW 0 ; Virtual record # in 128 byte records +; +EOFLG: DB 0 ; 'EOF' flag (1=yes) +EOFCTR: DB 0 ; EOF send counter +OUTADR: DW LOGBUF +OUTSIZ: DW BSIZE +RECPTR: DW DBUF +RECNBF: DW 0 ; Number of records in the buffer +; + IF CONFUN AND SYSABT +SYSABF: DB 0 ; set if sysop uses ^X to abort + ENDIF +; + IF (DESCRIB OR MBDESC) AND NDESC +NDSCFL: DB 0 ; Used to store "RN" option + ENDIF ; to bypass upload descriptions +; + IF DESCRIB +HLINE: DB '-------------------',CR,LF +OLINE: DS 80 ; Temporary buffer to store line + ENDIF +; + DS 80 ; Minimum stack area +; +; Disk buffer +; + ORG ($+127)/128*128 +; +DBUF EQU $ ; 16-record disk buffer +STACK EQU DBUF-2 ; Save original stack address +LOGBUF EQU DBUF+128 ; For use with LOGCAL +; +;----------------------------------------------------------------------- +; +; BDOS equates +; +;----------------------------------------------------------------------- +; +RDCON EQU 1 ; Get character from console +WRCON EQU 2 ; Output to console +DIRCON EQU 6 ; Direct console output +PRINT EQU 9 ; Print string function +VERNO EQU 12 ; Get CP/M version number +SELDSK EQU 14 ; Select drive +OPEN EQU 15 ; 0FFH = not found +CLOSE EQU 16 ; " " +SRCHF EQU 17 ; " " +SRCHN EQU 18 ; " " +DELET EQU 19 ; Delete file +READ EQU 20 ; 0=OK, 1=EOF +WRITE EQU 21 ; 0=OK, 1=ERR, 2=?, 0FFH=no dir. space +MAKE EQU 22 ; 0FFH=bad +RENAME EQU 23 ; Rename a file +CURDRV EQU 25 ; Get current drive +SETDMA EQU 26 ; Set DMA +SETATT EQU 30 ; Set file attributes +SETUSR EQU 32 ; Set user area to receive file +RRDM EQU 33 ; Read random +WRDM EQU 34 ; Write random +CFSIZE EQU 35 ; Compute file size +SETRRD EQU 36 ; Set random record +GETTIM EQU 105 ; CP/M Plus get date/time +BDOS EQU 0005H +TBUF EQU 0080H ; Default DMA address +FCB EQU 005CH ; System FCB +FCBEXT EQU FCB+12 ; File extent +FCBRNO EQU FCB+32 ; Record number +RANDOM EQU FCB+33 ; Random record field +; +; Extended BYEBDOS equates +; + IF BYEBDOS +BDMIST EQU 61 ; Modem raw input status +BDMOST EQU 62 ; Modem raw output status +BDMOUT EQU 63 ; Modem output 8 bit char +BDMINP EQU 64 ; Modem input 8 bit char +BDCSTA EQU 65 ; Modem carrier status +BDCONS EQU 66 ; Local console input status +BDCONI EQU 67 ; Local console input char +BDCONO EQU 68 ; Local console output char +BDMXDR EQU 69 ; Set/get maximum drive +BDMXUS EQU 70 ; Set/get maximum user area +BDNULL EQU 72 ; Set/get nulls +BDTOUT EQU 71 ; Set/get idle timeout +BDULCS EQU 73 ; Set/get upperlowercase switch +BDLFMS EQU 74 ; Set/get line-feed mask +BDHRDL EQU 76 ; Set/get hardlog +BDWRTL EQU 75 ; Set/get writeloc +BDMDMO EQU 77 ; Set/get mdmoff flag +BDBELL EQU 78 ; Set/get bell mask flag +BDGRTC EQU 79 ; Get address of rtc buffer +BDGLCB EQU 80 ; Get address of lc buffer +BDSTOS EQU 81 ; Maximum time on system +BDSLGT EQU 82 ; Set login time +BDPTOS EQU 83 ; Print Time on System + ENDIF ; BYEBDOS +; + END + \ No newline at end of file diff --git a/Source/Apps/XM125/xmdm125.zip b/Source/Apps/XM125/xmdm125.zip new file mode 100644 index 0000000000000000000000000000000000000000..dd3694803181e6c493e37fc3dfed29251e12ffb2 GIT binary patch literal 56184 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 literal 0 HcmV?d00001 diff --git a/Source/Apps/XM125/xmhb.180 b/Source/Apps/XM125/xmhb.180 new file mode 100644 index 00000000..9581c3b6 --- /dev/null +++ b/Source/Apps/XM125/xmhb.180 @@ -0,0 +1,329 @@ +;======================================================================= +; +; XMHB.Z80 - XMODEMXX PATCH FILE FOR ROMWBW HBIOS +; +; Wayne Warthen - wwarthen@gmail.com +; Updated: 2017-08-09 +; +;======================================================================= +; +; Overlay file is Z80, build with M80: +; M80 =XMHB +; L80 XMHB,XMHB/N/X/E +; + .Z80 + ASEG +; +NO EQU 0 +YES EQU NOT NO +; +ERRDET EQU NO ; detect parity/framing/overrun errs +; +BASE EQU 100H ; start of cp/m normal program area +; +;======================================================================= +; +; Jump table: The jump table must be in exactly the same sequence as the +; one in XMODEM. Note the ORG of 103H - This jump table has no jump to +; 'BEGIN'. +; + ORG BASE + 3 ;start after 'JMP BEGIN' +; + JP CONOUT ;must be 00000h if not used, see below + JP MINIT ;initialization routine (if needed) + JP UNINIT ;undo whatever 'MINIT' did (or return) +JPTBL: + JP SENDR ;send character (via pop psw) + JP CAROK ;test for carrier + JP MDIN ;receive data byte + JP GETCHR ;get character from modem + JP RCVRDY ;check receive ready + JP SNDRDY ;check send ready + JP SPEED ;get speed value for file transfer time + JP EXTRA1 ;extra for custom routine + JP EXTRA2 ;extra for custom routine + JP EXTRA3 ;extra for custom routine +; +;----------------------------------------------------------------------- +; +; Output character to console +; +CONOUT EQU 0 ; not used +; +;----------------------------------------------------------------------- +; +; Initialize modem +; +; This procedure has been usurped to dynamically detect the type +; of system we are running on and install the *real* jump table +; entries as appropriate. +; +MINIT: + ; Get system type + LD D,2 + LD E,2 + MLT DE + BIT 2,E ; bit 2 wil be set if mlt happend + LD HL,U_JPTBL ; assume Z80 (UART) + JR Z,MINIT2 ; yes, Z80, do vector copy + LD HL,A_JPTBL ; otherwise Z180 (ASCI) +; +MINIT2: + ; Copy real vectors into active jump table + LD DE,JPTBL + LD BC,7 * 3 ; copy 7 3-byte entries + LDIR +; + RET ; no initialization required +; +;----------------------------------------------------------------------- +; +; Uninitialize modem +; +UNINIT: + RET ; not initialized, so no 'UN-INITIALIZE' +; +;----------------------------------------------------------------------- +; +; The following are all dummy routines that are unused because MINIT +; dynamically installs the real jump table. +; +SENDR: +CAROK: +MDIN: +GETCHR: +RCVRDY: +SNDRDY: +SPEED: +EXTRA1: +EXTRA2: +EXTRA3: + RET +; +;======================================================================= +;======================================================================= +; +; Standard RBC Projects 8250-like UART port @ 68H +; +; Will be used for all RBC Z80 systems. +; +;======================================================================= +;======================================================================= +; +; UART port constants +; +U_BASE EQU 68H ; UART base port +U_DATP EQU U_BASE + 0 ; data in port +U_DATO EQU U_BASE + 0 ; data out port +U_CTLP EQU U_BASE + 5 ; control/status port +U_SNDB EQU 20H ; bit to test for send ready +U_SNDR EQU 20H ; value when ready to send +U_RCVB EQU 01H ; bit to test for receive ready +U_RCVR EQU 01H ; value when ready to receive +U_PARE EQU 04H ; bit for parity error +U_OVRE EQU 02H ; bit for overrun error +U_FRME EQU 08H ; bit for framing error +; +; Following jump table is dynamically patched into real jump +; table at program startup. See MINIT above. Note that only a +; subset of the jump table is overlaid (SENDR to SPEED). +; +U_JPTBL: + JP U_SENDR ; send character (via pop psw) + JP U_CAROK ; test for carrier + JP U_MDIN ; receive data byte + JP U_GETCHR ; get character from modem + JP U_RCVRDY ; check receive ready + JP U_SNDRDY ; check send ready + JP U_SPEED ; get speed value for file transfer time +; +;----------------------------------------------------------------------- +; +; Send character on top of stack +; +U_SENDR: + POP AF ; get character to send from stack + OUT (U_DATO),A ; send to port + RET +; +;----------------------------------------------------------------------- +; +; Test and rep;ort carrier status, Z set if carrier present +; +U_CAROK: + XOR A ; not used, always indicate present + RET +; +;----------------------------------------------------------------------- +; +; Get a character (assume character ready has already been tested) +; +U_MDIN: +U_GETCHR: + IN A,(U_DATP) ; read character from port + RET +; +;----------------------------------------------------------------------- +; +; Test for character ready to receive, Z = ready +; Error code returned in A register +; *** Error code does not seem to be used *** +; +U_RCVRDY: + IN A,(U_CTLP) ; get modem status +; + IF ERRDET +; + ; With error detection (slower) + PUSH BC ; save scratch register + PUSH AF ; save full status on stack + AND U_FRME | U_OVRE | U_PARE ; isolate line err bits + LD B,A ; save err status in B + POP AF ; get full status back + AND U_RCVB ; isolate ready bit + CP U_RCVR ; test it (set flags) + LD A,B ; get the error code back + POP BC ; restore scratch register +; + ELSE +; + ; No error detection (faster) + AND U_RCVB ; isolate ready bit + CP U_RCVR ; test it (set flags) + LD A,0 ; report no line errors +; + ENDIF +; + RET +; +;----------------------------------------------------------------------- +; +; Test for ready to send a character, Z = ready +; +U_SNDRDY: + IN A,(U_CTLP) ; get status + AND U_SNDB ; isolate transmit ready bit + CP U_SNDR ; test for ready value + RET +; +;----------------------------------------------------------------------- +; +; Report baud rate (index into SPTBL returned in regsiter A) +; +U_SPEED: + LD A,8 ; arbitrarily return 9600 baud + RET +; +;======================================================================= +;======================================================================= +; +; Standard RBC Projects Z180 primary ASCI port +; +; Will be used for all RBC Z180 systems. +; +;======================================================================= +;======================================================================= +; +; ASCI port constants +; +A_DATP EQU 48H ;Z180 TSR - ASCI receive data port +A_DATO EQU 46H ;Z180 TDR - ASCI transmit data port +A_CTLP EQU 44H ;Z180 STAT - ASCI status port +A_CTL2 EQU 40H ;Z180 CNTLA - ASCI control port +A_SNDB EQU 02H ;Z180 STAT:TDRE - xmit data reg empty bit +A_SNDR EQU 02H ;Z180 STAT:TDRE - xmit data reg empty value +A_RCVB EQU 80H ;Z180 STAT:RDRF - rcv data reg full bit +A_RCVR EQU 80H ;Z180 STAT:RDRF - rcv data reg full value +A_PARE EQU 20H ;Z180 STAT:PE - parity error bit +A_OVRE EQU 40H ;Z180 STAT:OVRN - overrun error bit +A_FRME EQU 10H ;Z180 STAT:FE - framing error bit +; +; Following jump table is dynamically patched over initial jump +; table at program startup. See MINIT above. Note that only a +; subset of the jump table is overlaid (SENDR to SPEED). +; +A_JPTBL: + JP A_SENDR ;send character (via pop psw) + JP A_CAROK ;test for carrier + JP A_MDIN ;receive data byte + JP A_GETCHR ;get character from modem + JP A_RCVRDY ;check receive ready + JP A_SNDRDY ;check send ready + JP A_SPEED ;get speed value for file transfer time +; +;----------------------------------------------------------------------- +; +; Send character on top of stack +; +A_SENDR: + POP AF ; get character to send from stack + OUT0 (A_DATO),A ; send to port + RET +; +;----------------------------------------------------------------------- +; +; Test and rep;ort carrier status, Z set if carrier present +; +A_CAROK: + XOR A ; not used, always indicate present + RET +; +;----------------------------------------------------------------------- +; +; Get a character (assume character ready has already been tested) +; +A_MDIN: +A_GETCHR: + IN0 A,(A_DATP) ; read character from port + RET +; +;----------------------------------------------------------------------- +; +; Test for character ready to receive, Z = ready +; Error code returned in A register +; *** Error code does not seem to be used *** +; +A_RCVRDY: + IN0 A,(A_CTLP) ; get modem status + PUSH BC ; save scratch register + PUSH AF ; save full status on stack + AND A_FRME | A_OVRE | A_PARE ; isolate line err bits + LD B,A ; save err status in B + + ; Z180 ASCI ports will stall if there are errors. + ; Error bits are NOT cleared by merely reading + ; the status register. Below, bit 3 of ASCI + ; control register is written with a zero to + ; clear error(s) if needed. + JP Z,A_RCVRDY2 ; if no errs, continue + IN0 A,(A_CTL2) ; get current control register + AND 0F7H ; force err reset bit to zero + OUT0 (A_CTL2),A ; write control register + +A_RCVRDY2: + POP AF ; get full status back + AND A_RCVB ; isolate ready bit + CP A_RCVR ; test it (set flags) + LD A,B ; get the error code back + POP BC ; restore scratch register + RET +; +;----------------------------------------------------------------------- +; +; Test for ready to send a character, Z = ready +; +A_SNDRDY: + IN A,(A_CTLP) ; get status + AND A_SNDB ; isolate transmit ready bit + CP A_SNDR ; test for ready value + RET +; +;----------------------------------------------------------------------- +; +; Report baud rate (index into SPTBL returned in regsiter A) +; +A_SPEED: + LD A,8 ; arbitrarily return 9600 baud + RET +; + END diff --git a/Source/RomDsk/MK4/FD.COM b/Source/Images/hd0/s0/u0/FD_DIDE.COM similarity index 100% rename from Source/RomDsk/MK4/FD.COM rename to Source/Images/hd0/s0/u0/FD_DIDE.COM diff --git a/Source/Images/hd0/s0/u0/FD_DIO.COM b/Source/Images/hd0/s0/u0/FD_DIO.COM new file mode 100644 index 0000000000000000000000000000000000000000..d411a1fbc5f540a5deef0588a61be9f06cf6e44a GIT binary patch literal 7919 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 O>hJiQjH>?E$bSIH0%WBC literal 0 HcmV?d00001 diff --git a/Source/RomDsk/SBC/FD.COM b/Source/Images/hd0/s0/u0/FD_DIO3.COM similarity index 100% rename from Source/RomDsk/SBC/FD.COM rename to Source/Images/hd0/s0/u0/FD_DIO3.COM diff --git a/Source/RomDsk/N8/FD.COM b/Source/Images/hd0/s0/u0/FD_N8.COM similarity index 100% rename from Source/RomDsk/N8/FD.COM rename to Source/Images/hd0/s0/u0/FD_N8.COM diff --git a/Source/RomDsk/ZETA/FD.COM b/Source/Images/hd0/s0/u0/FD_ZETA.COM similarity index 100% rename from Source/RomDsk/ZETA/FD.COM rename to Source/Images/hd0/s0/u0/FD_ZETA.COM diff --git a/Source/RomDsk/ZETA2/FD.COM b/Source/Images/hd0/s0/u0/FD_ZETA2.COM similarity index 100% rename from Source/RomDsk/ZETA2/FD.COM rename to Source/Images/hd0/s0/u0/FD_ZETA2.COM diff --git a/Source/Images/hd0/s0/u0/HDIR.COM b/Source/Images/hd0/s0/u0/HDIR.COM new file mode 100644 index 0000000000000000000000000000000000000000..170966222615a619b48a3038204b03eaeaa738a3 GIT binary patch literal 1408 zcmbtU-A^1<6u*1-UJNuK6B@G^C1-?E*kHax&v?T+%fHP9St*|I@;yzJN5@8dj ze&94jv5>HolkNDN%h{YH2V-~w3B!X#6#f?^iG(Pf2PR3XIn* z@dHsFNBjHYQ=+y=xjAm(dkLZfA5;}XIa&>Dq+*P>3qO&UnhETFb;Wxr8U#! Mx60w`;s4hE2dzr%$p8QV literal 0 HcmV?d00001 diff --git a/Source/Images/hd0/s0/u0/R.COM b/Source/Images/hd0/s0/u0/R.COM new file mode 100644 index 0000000000000000000000000000000000000000..fecaa4ac0f8317af918e2a835a36f51d13cb0678 GIT binary patch literal 4224 zcmbtXeQXow89(P7C;q;Jt#Z(Y-b>6z9O5`8Ut}aHNr=`hDJY>pmvwO17sti%Wwt{| zM<8YDq*iSIY?GjT{@bbAb=oGRsT8(@j$^t%0%KFHS(~X`Q7r#4v9V>F$e!mte+AH_ zYF3oo`@GNR@A*B?#p=AH?WLp`k$TDa&K<*K`&2Y0k+?V`^^?ibSDd!NXk1JzkdQpP zu;y|qAfvZSLgu5XX@U`pQN-S|OB&{>takL4HGTdN08#ps{riV@jTM7HR%QKUBGgvxo9a)D z54Dx*d`8V^Q=QTOv>|eQZM13xD%l~r1_ZQ^;b=k%rDW(c?E7px3!Lm3$5)P%``vqLL9Ap~1K$h6&|kqqmWW@i2u|LQa4HH6TA^ z4w(^Cp=n5<(ThDN3F+H&z+hSeWsbi+*y#oMy^McrH$1@ufRaW>_Mz7`4A6SI@=A6FHB0TpD1sj*nTLc&6zRse*&j}_50;r93 z!g+ML0W7Xlm%`_tFxKz6)1Y>uY*~Yrn(&y(>9^dPZ;6R422Zn!?=&0Xmzailq%g^v z_USh6_RDn@A>Ye@C>^a6%%)-v`XjD#UouL+Q74>cJJc(6d<}!wX!YYdJe$ksck95N z@4F1Wyo?52HJ|~1J3a5BQInBLG3bfm2lnafxb!vS0L((1)0gX^o$7B;*aV86yK=;! zCvRmi9I)f|Cp2lALOjCzX){`^K-CCuRP~>F{yPkk)@J4ZvWgcCnK^Tb@TcmLfh|^a z$6sO_Ff=Uy0txGYGAz(RbpvfVOQXvYJjVvlv!H15GWsb_Z>jU0Wq~J`SOu!?GVu;0 zF$nj2tAW93ib47ZG_tD?YTA>H{}dtpb4*Zq%!)l@bW- zKo2E&^n719MHx)FQu0{B(_*Vga89X3S~yKD4(#(?f`9<~790OOg9kdLLNCOlx<)<7 zRY>Hd4e~85L3PDdxm+v!p;jr3=ZfNjds*+`_+?zKu=a-O_Vb+w zKw)QP>;m`1D#Jwybv&>OlcmaWjS00B;Bry7>l~0jYC0XTqv)y=zDRZSrn<%81y<33 z6fmSnitUa=hl|?=Iu1rV9l{dR>B(pY)#!jDxdDtsQ8!0dLvafrJ3m4bO~1>b%@R0A zGJ*4R4w|5g28X*&&&O0?DP@y`j3jxvq47EkPvz5xtZ=Osz&4o~eFUiCsJ=XArez#A zEASVn(DP4~ae{tvEvwhu!npAwL2$lc#5UG_dDA1p2c3&S)}+8f2Ub8&f%7o!@FqIw zG)`?4k9|(u?I0=9$#X|pWQX{U)%MDR%j=C?Aw<7T?tHo1k9r5jl4l#9j5a5=!+1;g9-+(x?i zUM_)In7qKkD+2)2T@I=U%)5uT#!FB4TdOXvs=smzKc$q!Qft<Y}8_@E{e)6v`b5y3~J^xS!e@8&&*e`D?-P-UN zIN_Sn8ocz8ziYX>8$KXb`_Z3mwybaRJXE@uvl>j}04xtr&2y{SOzv(bo7t9G`84n0 zH`e4m_KoJe$C4k8Y+IR*WU{~BwvxZ0<&#bJh4*eI@Hcs=nY>;ves>}hFAc8!!cjay zkvf;jDw@m6H}g<1f0lEtS8Ex;#4GcC53*c`$J)RC&SRzT!41x5VfdBRhUJyK@@cP$ zzf8>ipS$z;x6H)u(eXW_gJf@OyFU>02inQzz}D7bDbyP1BJJJ1ojtuBoz2WQdIDrN SA%~=7626#J|Hu7*#s4p+*ixtf literal 0 HcmV?d00001 diff --git a/Source/Images/hd0/s0/u0/RSETSIMH.COM b/Source/Images/hd0/s0/u0/RSETSIMH.COM new file mode 100644 index 0000000000000000000000000000000000000000..e055f07a9a16d97b2849d970633e74ff226d9173 GIT binary patch literal 128 zcmZQ;u;aV@kM$4>qg4aL_7hf34FAFo2+A??ah_#mILXTulv!FaDSCU$k wmYAHXkdmL5s>jQv;*e=B%d=eBu;o~)fF$p;#~M4NxP<%|7#QYB0STf209!g6lmGw# literal 0 HcmV?d00001 diff --git a/Source/Images/hd0/s0/u0/TIMER.COM b/Source/Images/hd0/s0/u0/TIMER.COM new file mode 100644 index 0000000000000000000000000000000000000000..83e6e68842ba2f259ef8acde0649e66d73464674 GIT binary patch literal 256 zcmX?H&KO#pn4W5-5aQ|U8l(_h6HpV#%cYUl^%Fm)c3u^88uVI_ zl3ov>WtF0&;)JM4hjAt-1@Y`MIT|M`v$&YaW}!TxEJ)xK=T>H+-RU&U1%CxiN)@uW zn6{@{Qsy%`+3uWDl?C82eI`C}{4}O4p{frdugB|o87NL4pLivRk12~QYDP}yaaafm zcy0wxO27e6C(??VJB$~p71V6&B{8uOR8*NFbff?6H6PzSM!FEMhpOOge<&yj_&_M! z|7s!E9}*7Q`@zR^KtClWBz$&eW(LwvN>cJ)Awd|xR5WwSl4Q$=LfV?q3X6-1nx~B> zRcR@s6hL28a7qempgCK3I4Nae%}JVdQo#!fs3VzCr9@s)SFpB7+lxzLCM(W05Am2% z$R=@4$>Ric$+u=pxxBhUfyOi1JO*WCpOB2ad**gV*xBG!05DJFEgMC5xpx}`R zJi!AB4pARiC^$^NcP?|1BkibG$uX6bt7d-5mXaLxwb?%TiHG-~W|GNp<@XpOpvqfJ z<*ci#W}ae7mzgK=@7S7|Xt6g~UO>&XBp29r$mVUf{4GQFq8fP<(GK$J-G-v`4P^eo zmNyvkg|lYH81rM!T;~k34LLVi!~C8(f6jDroP4+(}0h-Ua$VbiQ_ZYHGk-8zV;h}(Wl(qS8c zOUPc?NjGru*4T1L^fCs4V^H2B@gL8Pgqrw4=y;hAW$HeioVgxN_OeV+8&#fS}0mXfKZ5 zPBE~*UfL414chYn?e~cXLNPm80l{8l6&Vx(S>Y{5c$+S?shcUfeL5c9_L`;bVDXpi zIVWiuoY)rQGasMbyDUT@kFIo?rL{xdJ7vBar1BgB0h&9C_cG*J258oH+#Bqg`8>ya z8R!V}q2?J}VL-OkwI3$xuNzhPURHG3pmwEZx=^L6ysaCn*CMxc!`xskBmSDDEAl8` zzfg}0j`lIDe!+_2pAGn_j2U{ZK2^OHF)Uc&m|XIl7saE7i}Vo7Pu`qpzj~b_Z5ESE=eoM?25814Dk5 z>*y@G5V^zY#n^)qH{fd@?YzCM#~ysbtp(iZ(59u|AGyQbz|81#x3|AW(~~ErPM?T3 vU+UqY5W)w9BmLu2qF)%op~%SK@W{a6K{Puo;6+tQNSX#O@79;%f7|~r#(~Pl literal 0 HcmV?d00001 diff --git a/Source/Images/hd0/s0/u0/W.COM b/Source/Images/hd0/s0/u0/W.COM new file mode 100644 index 0000000000000000000000000000000000000000..2e5ab12ac360516107ed5d5618a89797e11f4263 GIT binary patch literal 3968 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 G@c%z+v(K^s literal 0 HcmV?d00001 diff --git a/Source/RomDsk/MK4/FD_DIDE.COM b/Source/RomDsk/MK4/FD_DIDE.COM new file mode 100644 index 0000000000000000000000000000000000000000..409cf1f8caf10ed76a4e69543e335aefc9b99621 GIT binary patch literal 7961 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 literal 0 HcmV?d00001 diff --git a/Source/RomDsk/MK4/FD_DIO3.COM b/Source/RomDsk/MK4/FD_DIO3.COM new file mode 100644 index 0000000000000000000000000000000000000000..dcea26ca44b975b9d92b0bc60620a845ea841419 GIT binary patch literal 7974 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 diff --git a/Source/RomDsk/MK4/XM-A1.COM b/Source/RomDsk/MK4/XM-A1.COM deleted file mode 100644 index 42a67c311fb07b82a40a8bc9e4fa7789b96d9812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5373 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 diff --git a/Source/RomDsk/MK4/XM5-A0.COM b/Source/RomDsk/MK4/XM5-A0.COM deleted file mode 100644 index e233bee9221e2d4ef887763f7a41ba60b3d38a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 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 M$iRyX{NEY)8wjFS>Hq)$ diff --git a/Source/RomDsk/N8/FD_N8.COM b/Source/RomDsk/N8/FD_N8.COM new file mode 100644 index 0000000000000000000000000000000000000000..0090b8c84c5b0c97ff5b0e1b01b72ac9c39bde69 GIT binary patch literal 7925 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 Tbp>f;RIL7^2Vap{&GJOqdcC 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 diff --git a/Source/RomDsk/N8/XM-A1.COM b/Source/RomDsk/N8/XM-A1.COM deleted file mode 100644 index 42a67c311fb07b82a40a8bc9e4fa7789b96d9812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5373 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 diff --git a/Source/RomDsk/N8/XM5-A0.COM b/Source/RomDsk/N8/XM5-A0.COM deleted file mode 100644 index e233bee9221e2d4ef887763f7a41ba60b3d38a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 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 M$iRyX{NEY)8wjFS>Hq)$ diff --git a/Source/RomDsk/SBC/FD_DIDE.COM b/Source/RomDsk/SBC/FD_DIDE.COM new file mode 100644 index 0000000000000000000000000000000000000000..409cf1f8caf10ed76a4e69543e335aefc9b99621 GIT binary patch literal 7961 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 literal 0 HcmV?d00001 diff --git a/Source/RomDsk/SBC/FD_DIO3.COM b/Source/RomDsk/SBC/FD_DIO3.COM new file mode 100644 index 0000000000000000000000000000000000000000..dcea26ca44b975b9d92b0bc60620a845ea841419 GIT binary patch literal 7974 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 diff --git a/Source/RomDsk/SBC/XM5.COM b/Source/RomDsk/SBC/XM5.COM deleted file mode 100644 index 8ea2b66108110674084d8d5a4be9e590645554e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmeHI?Qc_67(chY?Y*bEvWb%y1D=hEZXGad5Ur!8+}@2!*E?@JUZRtXQ5n#!%Q|oy zWzHDm2R{)L`G$$a4}NM)Bqbn*-8#~HnVJ;~_^~*y9OB_6NeD zAW=GFAtgfKS9T;R9UXy4(Br9cb(~5KlOu5wB_Ab+NK}pl-zF-7DR^c(sw~N&{c@G7 zfd*{!q=VjeZ0@8NMH&-k?{M@xKI1)&>5`p_yl)g|f8EUgvVo@_e)cymr*VFsekrom z9WEzeX5k)Bi332lg~BofCPx6QDhGmxNKC0XL-c}ecBhR_3*dqNVP9Iz)q$=6Q;GyI zRo9KiO`@H!SwJHSvFt?x9Wse_%2KE;BwO$roX?D#?-(PtEeODVn;183 zehGm3PUBWkHC?mc+8|6o>G5<$0($^y1svHER-}D^I+LetLX@qzy)QtZJ|QBYFzUHa<8Qh)O!6%P$i*%YFe03E^Etp$FKzfa2;5k?6_il zWrxEt?+|t)N^so-T0Q%?S^LJ$z#0Ynd#jsQG)TY@Zuh0|W#g{B^|E$?*Eic%k2h&I z?eqw!TxV9HV7Uu6zZ0^f`#F}Q6fXVmU|XvW$6?W|RrC5N+okW}F?gSWC!<3l-W6w$ z@uoBXIKQ`^gv>Y##Fb)-`md}uU)23o6rrYJyrq5^(>!cU&CGKTS87&P@Y>k|&$$r3 zpT6`jV1NWeZEdnDM`DEWx6Hsk0;fW!TnrC!k5I!ttjRj#D^P8V?+HQ)^{)1zhDDc^7)N5$u^J21CrV0 zTaKTn&pSrEgLoWV<<2`Y;I<55jpfwkw47RZ-a=v_h4!^Dp>1?RYg?Ew!X=s5-cYne zdU%%tR3S~#m>SyC#d=vYi7Kjk$g;qi$?-&-D1-3<$SFZhgP6X|ZXbCS(RORHH$Kux zqE>=ZRjyZi1_y_dBggxDhU1CRlEPi*{8m&}>pwn_Y9^?d76eE^c{3I7O_AXwNyP__ zlAdAmdP@sA(sSx)ap`$a6VZmX0@%N<)BLYQ^@?ss!lhFZgyv_=t|^2poUn_tR#tj_hv@EXs_wa&Gj#E z(60N%O&3y(un#lkLquCK5}8}X;gVpiY$HT^`?r??jb&y4(_eI`!or6bTKCNaJd zX9~G<;^NId-D(tOZQhiOpG0%Laf06jPwt|~KDv5cf@RTJP1oTJupGF~dck404Un#)vxPJKTv>Pu7ePEl#<$D@LBc3m>P?$~r2PCuwVcJ@IXaLJ3A)a0VRlmUeBn+MTY icX3f?lk}xx-oK)wCx*nKYZ$FO9ZxgxGz0%%2L1+F7h!t< diff --git a/Source/RomDsk/UNA/XM-A0.COM b/Source/RomDsk/UNA/XM-A0.COM deleted file mode 100644 index 6afb31f307de0049afa557d27887f99daabb4d04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5373 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 diff --git a/Source/RomDsk/UNA/XM-A1.COM b/Source/RomDsk/UNA/XM-A1.COM deleted file mode 100644 index 42a67c311fb07b82a40a8bc9e4fa7789b96d9812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5373 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 diff --git a/Source/RomDsk/UNA/XM.COM b/Source/RomDsk/UNA/XM.COM deleted file mode 100644 index abcc6828ee42c017913236211641ddcf5558b163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5375 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 diff --git a/Source/RomDsk/UNA/XM5-A0.COM b/Source/RomDsk/UNA/XM5-A0.COM deleted file mode 100644 index e233bee9221e2d4ef887763f7a41ba60b3d38a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 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 M$iRyX{NEY)8wjFS>Hq)$ diff --git a/Source/RomDsk/UNA/XM5.COM b/Source/RomDsk/UNA/XM5.COM deleted file mode 100644 index 8ea2b66108110674084d8d5a4be9e590645554e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmeHI?Qc_67(chY?Y*bEvWb%y1D=hEZXGad5Ur!8+}@2!*E?@JUZRtXQ5n#!%Q|oy zWzHDm2R{)L`G$$a4}NM)Bqbn*-8#~HnVJ;~_^~*y9OB_6NeD zAW=GFAtgfKS9T;R9UXy4(Br9cb(~5KlOu5wB_Ab+NK}pl-zF-7DR^c(sw~N&{c@G7 zfd*{!q=VjeZ0@8NMH&-k?{M@xKI1)&>5`p_yl)g|f8EUgvVo@_e)cymr*VFsekrom z9WEzeX5k)Bi332lg~BofCPx6QDhGmxNKC0XL-c}ecBhR_3*dqNVP9Iz)q$=6Q;GyI zRo9KiO`@H!SwJHSvFt?x9Wse_%2KE;BwO$roX?D#?-(PtEeODVn;183 zehGm3PUBWkHC?mc+8|6o>G5<$0($^y1svHER-}D^I+LetLX@qzy)QtZJ|QBYFzUHa<8Qh)O!6%P$i*%YFe03E^Etp$FKzfa2;5k?6_il zWrxEt?+|t)N^so-T0Q%?S^LJ$z#0Ynd#jsQG)TY@Zuh0|W#g{B^|E$?*Eic%k2h&I z?eqw!TxV9HV7Uu6zZ0^f`#F}Q6fXVmU|XvW$6?W|RrC5N+okW}F?gSWC!<3l-W6w$ z@uoBXIKQ`^gv>Y##Fb)-`md}uU)23o6rrYJyrq5^(>!cU&CGKTS87&P@Y>k|&$$r3 zpT6`jV1NWeZEdnDM`DEWx6Hsk0;fW!TnrC!k5I!ttjRj#D^P8V?+HQ)^{)1zhDDc^7)N5$u^J21CrV0 zTaKTn&pSrEgLoWV<<2`Y;I<55jpfwkw47RZ-a=v_h4!^Dp>1?RYg?Ew!X=s5-cYne zdU%%tR3S~#m>SyC#d=vYi7Kjk$g;qi$?-&-D1-3<$SFZhgP6X|ZXbCS(RORHH$Kux zqE>=ZRjyZi1_y_dBggxDhU1CRlEPi*{8m&}>pwn_Y9^?d76eE^c{3I7O_AXwNyP__ zlAdAmdP@sA(sSx)ap`$a6VZmX0@%N<)BLYQ^@?ss!lhFZgyv_=t|^2poUn_tR#tj_hv@EXs_wa&Gj#E z(60N%O&3y(un#lkLquCK5}8}X;gVpiY$HT^`?r??jb&y4(_eI`!or6bTKCNaJd zX9~G<;^NId-D(tOZQhiOpG0%Laf06jPwt|~KDv5cf@RTJP1oTJupGF~dck404Un#)vxPJKTv>Pu7ePEl#<$D@LBc3m>P?$~r2PCuwVcJ@IXaLJ3A)a0VRlmUeBn+MTY icX3f?lk}xx-oK)wCx*nKYZ$FO9ZxgxGz0%%2L1+F7h!t< diff --git a/Source/RomDsk/ZETA/FD_ZETA.COM b/Source/RomDsk/ZETA/FD_ZETA.COM new file mode 100644 index 0000000000000000000000000000000000000000..ef602c05a205fa5d48dcd62b1d82dbfbc7979356 GIT binary patch literal 7974 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%0APB_mj#f*fmFu@1RlldTI2D2a? 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 diff --git a/Source/RomDsk/ZETA/XM5.COM b/Source/RomDsk/ZETA/XM5.COM deleted file mode 100644 index 8ea2b66108110674084d8d5a4be9e590645554e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmeHI?Qc_67(chY?Y*bEvWb%y1D=hEZXGad5Ur!8+}@2!*E?@JUZRtXQ5n#!%Q|oy zWzHDm2R{)L`G$$a4}NM)Bqbn*-8#~HnVJ;~_^~*y9OB_6NeD zAW=GFAtgfKS9T;R9UXy4(Br9cb(~5KlOu5wB_Ab+NK}pl-zF-7DR^c(sw~N&{c@G7 zfd*{!q=VjeZ0@8NMH&-k?{M@xKI1)&>5`p_yl)g|f8EUgvVo@_e)cymr*VFsekrom z9WEzeX5k)Bi332lg~BofCPx6QDhGmxNKC0XL-c}ecBhR_3*dqNVP9Iz)q$=6Q;GyI zRo9KiO`@H!SwJHSvFt?x9Wse_%2KE;BwO$roX?D#?-(PtEeODVn;183 zehGm3PUBWkHC?mc+8|6o>G5<$0($^y1svHER-}D^I+LetLX@qzy)QtZJ|QBYFzUHa<8Qh)O!6%P$i*%YFe03E^Etp$FKzfa2;5k?6_il zWrxEt?+|t)N^so-T0Q%?S^LJ$z#0Ynd#jsQG)TY@Zuh0|W#g{B^|E$?*Eic%k2h&I z?eqw!TxV9HV7Uu6zZ0^f`#F}Q6fXVmU|XvW$6?W|RrC5N+okW}F?gSWC!<3l-W6w$ z@uoBXIKQ`^gv>Y##Fb)-`md}uU)23o6rrYJyrq5^(>!cU&CGKTS87&P@Y>k|&$$r3 zpT6`jV1NWeZEdnDM`DEWx6Hsk0;fW!TnrC!k5I!ttjRj#D^P8V?+HQ)^{)1zhDDc^7)N5$u^J21CrV0 zTaKTn&pSrEgLoWV<<2`Y;I<55jpfwkw47RZ-a=v_h4!^Dp>1?RYg?Ew!X=s5-cYne zdU%%tR3S~#m>SyC#d=vYi7Kjk$g;qi$?-&-D1-3<$SFZhgP6X|ZXbCS(RORHH$Kux zqE>=ZRjyZi1_y_dBggxDhU1CRlEPi*{8m&}>pwn_Y9^?d76eE^c{3I7O_AXwNyP__ zlAdAmdP@sA(sSx)ap`$a6VZmX0@%N<)BLYQ^@?ss!lhFZgyv_=t|^2poUn_tR#tj_hv@EXs_wa&Gj#E z(60N%O&3y(un#lkLquCK5}8}X;gVpiY$HT^`?r??jb&y4(_eI`!or6bTKCNaJd zX9~G<;^NId-D(tOZQhiOpG0%Laf06jPwt|~KDv5cf@RTJP1oTJupGF~dck404Un#)vxPJKTv>Pu7ePEl#<$D@LBc3m>P?$~r2PCuwVcJ@IXaLJ3A)a0VRlmUeBn+MTY icX3f?lk}xx-oK)wCx*nKYZ$FO9ZxgxGz0%%2L1+F7h!t< diff --git a/Source/RomDsk/ZETA2/FD_ZETA2.COM b/Source/RomDsk/ZETA2/FD_ZETA2.COM new file mode 100644 index 0000000000000000000000000000000000000000..214698d43f64ebf1d1c632ed74493506ed2bfce2 GIT binary patch literal 7961 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 literal 0 HcmV?d00001 diff --git a/Source/RomDsk/ZETA2/XM.COM b/Source/RomDsk/ZETA2/XM.COM deleted file mode 100644 index abcc6828ee42c017913236211641ddcf5558b163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5375 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 diff --git a/Source/RomDsk/ZETA2/XM5.COM b/Source/RomDsk/ZETA2/XM5.COM deleted file mode 100644 index 8ea2b66108110674084d8d5a4be9e590645554e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmeHI?Qc_67(chY?Y*bEvWb%y1D=hEZXGad5Ur!8+}@2!*E?@JUZRtXQ5n#!%Q|oy zWzHDm2R{)L`G$$a4}NM)Bqbn*-8#~HnVJ;~_^~*y9OB_6NeD zAW=GFAtgfKS9T;R9UXy4(Br9cb(~5KlOu5wB_Ab+NK}pl-zF-7DR^c(sw~N&{c@G7 zfd*{!q=VjeZ0@8NMH&-k?{M@xKI1)&>5`p_yl)g|f8EUgvVo@_e)cymr*VFsekrom z9WEzeX5k)Bi332lg~BofCPx6QDhGmxNKC0XL-c}ecBhR_3*dqNVP9Iz)q$=6Q;GyI zRo9KiO`@H!SwJHSvFt?x9Wse_%2KE;BwO$roX?D#?-(PtEeODVn;183 zehGm3PUBWkHC?mc+8|6o>G5<$0($^y1svHER-}D^I+LetLX@qzy)QtZJ|QBYFzUHa<8Qh)O!6%P$i*%YFe03E^Etp$FKzfa2;5k?6_il zWrxEt?+|t)N^so-T0Q%?S^LJ$z#0Ynd#jsQG)TY@Zuh0|W#g{B^|E$?*Eic%k2h&I z?eqw!TxV9HV7Uu6zZ0^f`#F}Q6fXVmU|XvW$6?W|RrC5N+okW}F?gSWC!<3l-W6w$ z@uoBXIKQ`^gv>Y##Fb)-`md}uU)23o6rrYJyrq5^(>!cU&CGKTS87&P@Y>k|&$$r3 zpT6`jV1NWeZEdnDM`DEWx6Hsk0;fW!TnrC!k5I!ttjRj#D^P8V?+HQ)^{)1zhDDc^7)N5$u^J21CrV0 zTaKTn&pSrEgLoWV<<2`Y;I<55jpfwkw47RZ-a=v_h4!^Dp>1?RYg?Ew!X=s5-cYne zdU%%tR3S~#m>SyC#d=vYi7Kjk$g;qi$?-&-D1-3<$SFZhgP6X|ZXbCS(RORHH$Kux zqE>=ZRjyZi1_y_dBggxDhU1CRlEPi*{8m&}>pwn_Y9^?d76eE^c{3I7O_AXwNyP__ zlAdAmdP@sA(sSx)ap`$a6VZmX0@%N<)BLYQ^@?ss!lhFZgyv_=t|^2poUn_tR#tj_hv@EXs_wa&Gj#E z(60N%O&3y(un#lkLquCK5}8}X;gVpiY$HT^`?r??jb&y4(_eI`!or6bTKCNaJd zX9~G<;^NId-D(tOZQhiOpG0%Laf06jPwt|~KDv5cf@RTJP1oTJupGF~dck404Un#)vxPJKTv>Pu7ePEl#<$D@LBc3m>P?$~r2PCuwVcJ@IXaLJ3A)a0VRlmUeBn+MTY icX3f?lk}xx-oK)wCx*nKYZ$FO9ZxgxGz0%%2L1+F7h!t<