mirror of https://github.com/wwarthen/RomWBW.git
33 changed files with 9831 additions and 6 deletions
@ -0,0 +1,24 @@ |
|||
|
|||
----------------------------------------------------------------------- |
|||
Copyright (c) 1987, 1988 by Robert W. Kramer III, ALL RIGHTS RESERVED |
|||
Release 1.50 1569 40th St. |
|||
09/29/88 Rock Island, Il. 61201 |
|||
Voice: (309) 786-6711, 24hr |
|||
RI RCPM-RDOS (128 Meg) Data: (309) 786-6227, 24hr, 300/1200/2400 |
|||
----------------------------------------------------------------------- |
|||
|
|||
|
|||
USER AGREEMENT: |
|||
--------------- |
|||
|
|||
ZMD is free to use, providing program signon messages (my name, program |
|||
name, release date and copyright notices) remain intact as released. |
|||
You may modify any .Z80 file as you wish so long as your modified copy |
|||
is used for your own personal non-profit use and is NOT passed on to |
|||
any other party. |
|||
|
|||
You are encouraged to distribute ZMD releases to any interested party |
|||
providing all files remain in their ORIGINAL UNMODIFIED RELEASE FORM |
|||
as distributed from RI RCPM-RDOS. |
|||
|
|||
|
|||
@ -0,0 +1,10 @@ |
|||
----- |
|||
ZMD150.LBR - CP/M Communications |
|||
09/29/88 - This release is super clean, super fast - and smaller. |
|||
Some major problems in the way Ymodem Batch protocol was implemented |
|||
on CP/M systems has been fixed, virtually eliminating all delays |
|||
between files. CPM3 systems can now run all ZMD programs with no |
|||
problems. Some other bug fixes, modifications and enhancements. |
|||
This is probably the last release of ZMD until ZMD with ZMODEM is |
|||
released. Bob Kramer - RI RCPM-RDOS (128 Mb) - (309) 786-6711 |
|||
|
|||
@ -0,0 +1,37 @@ |
|||
@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 z80asm -zmd/fm |
|||
zx l80 -zmd,zmd/n/e |
|||
|
|||
zx z80asm -zmap/fm |
|||
zx l80 -zmap,zmap/n/e |
|||
|
|||
zx z80asm -znews/fm |
|||
zx l80 -znews,znews/n/e |
|||
|
|||
zx z80asm -znewp/fm |
|||
zx l80 -znewp,znewp/n/e |
|||
|
|||
zx z80asm -zfors/fm |
|||
zx l80 -zfors,zfors/n/e |
|||
|
|||
zx z80asm -zforp/fm |
|||
zx l80 -zforp,zforp/n/e |
|||
|
|||
zx z80asm -zmdel/fm |
|||
zx l80 -zmdel,zmdel/n/e |
|||
|
|||
zx z80asm -zmdhb/fh |
|||
zx mload25 zmd=zmd.com,zmdhb |
|||
|
|||
copy /Y zmd.com ..\..\..\Binary\Apps\ || exit /b |
|||
|
|||
@ -0,0 +1,10 @@ |
|||
@echo off |
|||
setlocal |
|||
|
|||
ren zmdsubs.rel zmdsubs.rel.sav |
|||
if exist *.rel del *.rel |
|||
ren zmdsubs.rel.sav zmdsubs.rel |
|||
if exist *.hex del *.hex |
|||
if exist *.prn del *.prn |
|||
if exist *.lst del *.lst |
|||
if exist *.com del *.com |
|||
@ -0,0 +1,10 @@ |
|||
OBJECTS = zmd.com |
|||
DEST = ../../../Binary/Apps |
|||
TOOLS = ../../../Tools |
|||
OTHERS = *.hex zmd.rel |
|||
|
|||
include $(TOOLS)/Makefile.inc |
|||
|
|||
zmd.com: zmd.rel zmdhb.hex |
|||
$(ZXCC) $(CPM)/l80 -zmd,zmd/n/e |
|||
$(ZXCC) $(CPM)/MLOAD25 zmd=zmd.com,zmdhb |
|||
@ -0,0 +1,36 @@ |
|||
|
|||
----------------------------------------------------------------------- |
|||
Copyright (c) 1987, 1988 by Robert W. Kramer III, ALL RIGHTS RESERVED |
|||
Release 1.50 1569 40th St. |
|||
09/29/88 Rock Island, Il. 61201 |
|||
Voice: (309) 786-6711, 24hr |
|||
RI RCPM-RDOS (128 Meg) Data: (309) 786-6227, 24hr, 300/1200/2400 |
|||
----------------------------------------------------------------------- |
|||
|
|||
|
|||
ZMD AUTO-INSTALL FEATURE |
|||
------------------------ |
|||
|
|||
ZINSTL can automatically install the new release of ZMD (and utilities) |
|||
with the use of the '!' option. ZINSTL ! will read all switch/toggle |
|||
configurations and port/modem/rtc overlays from your already installed |
|||
version of ZMD where you can then use them to install this new release. |
|||
|
|||
Follow these steps: |
|||
|
|||
1) Extract all files from ZMDnnn.LBR |
|||
2) Rename your already configured ZMD.COM to ZMD149.COM |
|||
3) Run ZINSTL (Release 1.50) with the '!' option: ZINSTL ! |
|||
4) Answer any questions ZINSTL may ask |
|||
5) Use the 'J' option to save configurations |
|||
6) Rename ZMD150.COM to ZMD.COM |
|||
|
|||
|
|||
NOTE: This will not work with any other version of ZMD except for 1.49 |
|||
and 1.50. Running ZINSTL without the ! option will cause it to run just |
|||
like you've all been used to. In the future, if the new release header |
|||
file ZMDHDR.Z80 becomes incompatible with that of the previous release |
|||
this feature will be disabled. |
|||
|
|||
|
|||
|
|||
@ -0,0 +1,88 @@ |
|||
; |
|||
; Version identification |
|||
; |
|||
VERS EQU 1 ; Release |
|||
MODLEV EQU 5 ; Major modification level |
|||
REV EQU 0 ; Minor revision number |
|||
|
|||
VMONTH EQU 09 ; Version month |
|||
VDAY EQU 29 ; Version day |
|||
VYEAR EQU 88 ; Version year |
|||
; |
|||
;========================================================================== |
|||
; |
|||
NO EQU 0 |
|||
YES EQU 0FFH |
|||
; |
|||
;-------------------------------------------------------------------------- |
|||
; Define ASCII characters used |
|||
;-------------------------------------------------------------------------- |
|||
|
|||
SOH EQU 1 ; ^A - start of header |
|||
STX EQU 2 ; ^B - start of 1k header |
|||
CTRLC EQU 3 ; ^C - abort/break character |
|||
EOT EQU 4 ; ^D - end of transmission |
|||
ACK EQU 6 ; ^F - acknowledge |
|||
BELL EQU 7 ; ^G - bell |
|||
BS EQU 8 ; ^H - backspace |
|||
TAB EQU 9 ; ^I - horizontal tab |
|||
LF EQU 10 ; ^J - line feed |
|||
CTRLK EQU 11 ; ^K - abort character |
|||
CR EQU 13 ; ^M - carriage return |
|||
PAUSE EQU 19 ; ^S - pause request |
|||
NAK EQU 21 ; ^U - negative acknowledge |
|||
CANCEL EQU 24 ; ^X - cancel |
|||
EOF EQU 26 ; ^Z - end of file |
|||
CRC EQU 67 ; C - CRC request character |
|||
KSND EQU 75 ; K - 1k block request character |
|||
DEL EQU 127 ; Delete/Rubout |
|||
; |
|||
; |
|||
; Define standard CP/M BDOS equates |
|||
; |
|||
DIRCON EQU 6 ; Direct console output |
|||
PRINT EQU 9 ; Print string function |
|||
GETVER EQU 12 ; Get CP/M version |
|||
SELDSK EQU 14 ; Select drive |
|||
OPEN EQU 15 ; Open file |
|||
CLOSE EQU 16 ; Close file |
|||
SRCHF EQU 17 ; Search for first occurence |
|||
SRCHN EQU 18 ; Search for next occurence |
|||
DELETE EQU 19 ; Delete file |
|||
READ EQU 20 ; Read record |
|||
WRITE EQU 21 ; Write record |
|||
MAKE EQU 22 ; Make new file |
|||
RENAME EQU 23 ; Rename a file |
|||
CURDRV EQU 25 ; Get current drive |
|||
SETDMA EQU 26 ; Set DMA |
|||
SETFILE EQU 30 ; Set file attributes |
|||
SETUSR EQU 32 ; Set user area to receive file |
|||
RRDM EQU 33 ; Read random |
|||
WRDM EQU 34 ; Write random |
|||
FILSIZ EQU 35 ; Compute file size |
|||
SETRRD EQU 36 ; Set random record |
|||
|
|||
BDOS EQU 0005H ; Address for BDOS jump vectors |
|||
TBUF EQU 0080H ; Default DMA address |
|||
FCB EQU 005CH ; System FCB |
|||
FCB1 EQU 006CH ; Secondary FCB area |
|||
FCBEXT EQU FCB+12 ; File extent |
|||
FCBRNO EQU FCB+32 ; Record number |
|||
RANDOM EQU FCB+33 ; Random record field |
|||
RLEN EQU 128 ; Record length |
|||
ITEMSZ EQU 16 ; Number of data bytes in each filename entry |
|||
; |
|||
; |
|||
TAGFIL EQU 7 |
|||
DWNTAG EQU 6 |
|||
NOSYS EQU 5 |
|||
NOLBS EQU 4 |
|||
NOCOMS EQU 3 |
|||
NOCOMR EQU 2 |
|||
RESERV1 EQU 1 |
|||
ZCPR EQU 0 |
|||
; |
|||
; |
|||
; |
|||
;-------------------------------------------------------------------------- |
|||
|
|||
@ -0,0 +1,44 @@ |
|||
; |
|||
; |
|||
; MKCOMS.SUB - 09/29/88 - Assemble/Link ZMD and utilities |
|||
; |
|||
; To use this file with M80, you'll have to edit all 'z80asm ' |
|||
; to 'm80 ='. Older versions of M80 which truncate labels to 6 |
|||
; bytes will not assemble the programs properly. |
|||
; |
|||
; --> MICROSOFT MACRO-80 v3.43 has been tested and proven to |
|||
; assemble them without error. |
|||
; |
|||
; |
|||
z80asm zmd/m |
|||
l80 zmd,zmd/n/e |
|||
era zmd.rel |
|||
; |
|||
z80asm zmap/m |
|||
l80 zmap,zmap/n/e |
|||
era zmap.rel |
|||
; |
|||
z80asm znews/m |
|||
l80 znews,znews/n/e |
|||
era znews.rel |
|||
; |
|||
z80asm znewp/m |
|||
l80 znewp,znewp/n/e |
|||
era znewp.rel |
|||
; |
|||
z80asm zfors/m |
|||
l80 zfors,zfors/n/e |
|||
era zfors.rel |
|||
; |
|||
z80asm zforp/m |
|||
l80 zforp,zforp/n/e |
|||
era zforp.rel |
|||
; |
|||
z80asm zmdel/m |
|||
l80 zmdel,zmdel/n/e |
|||
era zmdel.rel |
|||
; |
|||
; |
|||
; Done... |
|||
; |
|||
|
|||
@ -0,0 +1,420 @@ |
|||
; |
|||
|
|||
TITLE ZFORP.Z80 - 09/29/88 - ZMD Public Description Utility |
|||
; Copyrighted (c) 1987, 1988 |
|||
; Robert W. Kramer III |
|||
|
|||
PAGE |
|||
;- -; |
|||
; Update History ; |
|||
; ; |
|||
; Date Release Comments ; |
|||
; -------- ------- ---------------------------------------------- ; |
|||
; ; |
|||
; 09/29/88 v1.50 - No change(s) made to this file. ; |
|||
; 03/18/88 v1.49 - No change(s) made to this file ; |
|||
; 03/13/88 v1.48 - Redefined buffer table at end of programs. STACK; |
|||
; and filename buffers now EQUated with offsets ; |
|||
; from the last switch/toggle in program instead ; |
|||
; of with DS directive. ; |
|||
; - Some systems which do NOT have an interrupt ; |
|||
; driven keyboard may have noticed problems when ; |
|||
; an invalid key was entered in the ZNEWP, ZFORP ; |
|||
; and ZMDEL programs. In ZNEWP and ZFORP, if a ; |
|||
; CR was entered to pause the output, output was ; |
|||
; limited to one line at a time per key pressed. ; |
|||
; If an invalid key was hit, output would have ; |
|||
; remained in a paused state until one of the ; |
|||
; abort keys were pressed. This was difficult to ; |
|||
; find since my keyboard is interrupt driven and ; |
|||
; I could not duplicate the problem on my own ; |
|||
; system. ; |
|||
; 02/25/88 v1.47 - No change(s) made to this file ; |
|||
; 01/27/88 v1.46 - Some changes were made to ZMDSUBS that are not ; |
|||
; directly related to this file ; |
|||
; - Fixed typo in help guide reflecting '/' as the ; |
|||
; flag to force LF in search routine ; |
|||
; 01/17/88 v1.45 - First public release ; |
|||
; 12/24/87 v1.01 - Some trivial bugs fixed ; |
|||
; 11/10/87 v1.00 - Initial version ; |
|||
;- -; |
|||
|
|||
;-------------------------------------------------------------------------; |
|||
; EXTERNAL Declarations: | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
EXTRN CKABRT,CMDBUF,DBUF,ERXIT,EXIT,ILPRTB,LINCNT,NOFILE |
|||
EXTRN NOFOR,OLDDRV,OLDUSR,PRINTV,RECAR1,RECDR1,RENFCB |
|||
EXTRN RSDMA,SHONM4,STACK,TYPE,UCASE,NOFOR |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Program Starts Here | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
.Z80 |
|||
ASEG |
|||
ORG 100H ; Program starts |
|||
JP BEGIN ; Jump around configuration table |
|||
INCLUDE ZMDHDR.Z80 ; Include the ZMD header overlay |
|||
.REQUEST ZMDSUBS ; Include the ZMD subroutines |
|||
|
|||
; |
|||
; |
|||
; Save CP/M stack, initialize new one for this program |
|||
; |
|||
BEGIN: LD (STACK),SP ; Save return address to CCP |
|||
LD SP,STACK ; Initialize new one for this program |
|||
|
|||
; |
|||
; Get current drive/user and save for later |
|||
; |
|||
LD A,255 |
|||
CALL RECAR1 |
|||
LD (OLDUSR),A ; Save current user area |
|||
LD C,CURDRV |
|||
CALL BDOS |
|||
LD (OLDDRV),A ; Save current drive |
|||
|
|||
; |
|||
; Tell em who we are |
|||
; |
|||
LD HL,PUBFOR |
|||
CALL PRINTV |
|||
|
|||
; |
|||
; See if descriptions enabled |
|||
; |
|||
LD A,(DESCRIB) |
|||
OR A |
|||
JP NZ,BEGIN1 |
|||
LD A,(MSGDESC) |
|||
OR A |
|||
JP Z,NOFOR |
|||
|
|||
BEGIN1: CALL ILPRTB |
|||
DB '(S to Pause - C K or X Abort - ? for Help)' |
|||
DB CR,LF,LF,0 |
|||
LD A,8 |
|||
LD (LINCNT),A |
|||
|
|||
; |
|||
; See if user wants file displayed 'nonstop' ($N) |
|||
; |
|||
LD A,(TBUF) ; Number of bytes in command tail |
|||
OR A ; Were there any? |
|||
LD (SHOWALL),A ; Tell rest of program |
|||
JP Z,OPNFIL ; Just go display the file if not |
|||
|
|||
LD A,(FCB+1) ; Get first character on command line |
|||
CP '$' ; Must specify '$' first for pause disabling |
|||
JP NZ,CKHLP ; Nope, continue normal |
|||
|
|||
LD A,(FCB+2) ; Get second character on command line |
|||
CP 'N' ; 'N' for nonstop display? |
|||
JP NZ,CKHLP ; No |
|||
|
|||
XOR A |
|||
LD (SHOWALL),A ; Disable string search |
|||
LD (PAGLEN),A ; Else disable page pauses |
|||
JP OPNFIL |
|||
|
|||
; |
|||
; See if requesting help |
|||
; |
|||
CKHLP: LD A,(TBUF+2) ; Get character after space |
|||
CP '?' ; ?? |
|||
JP NZ,SAVTAIL ; No, save command tail for comparison |
|||
|
|||
LD A,(TBUF+3) ; Any more chracters? |
|||
OR A |
|||
JP Z,HELP ; No, so must want HELP |
|||
|
|||
; |
|||
; Move command line buffer to internal buffer |
|||
; |
|||
SAVTAIL:LD HL,TBUF ; Point to command line buffer |
|||
LD B,(HL) ; Character count is first byte into 'B' |
|||
LD DE,CMDBUF ; Destination is internal buffer |
|||
INC HL ; Increment to ' ', next INC gets first chr |
|||
LD A,(HL) ; Get this character |
|||
CP ' ' ; Is it a space? |
|||
JR Z,SVTAIL1 ; Yes, leave things alone |
|||
DEC HL ; No, decrement pointer |
|||
|
|||
SVTAIL1:INC HL ; Increment to next character |
|||
LD A,(HL) ; Into A |
|||
LD (DE),A ; Store in internal buffer |
|||
INC DE ; Increment pointer |
|||
DJNZ SVTAIL1 ; One less character on command line |
|||
|
|||
; |
|||
; Open FOR file |
|||
; |
|||
OPNFIL: LD A,(USER) ; Get user area to find FOR file |
|||
CALL RECAR1 ; Log into it |
|||
LD A,(DRIVE) ; Get drive to find FOR file |
|||
CALL RECDR1 ; Log into it |
|||
|
|||
LD HL,FILE ; Initialize internal FCB1 |
|||
LD DE,FORNAM ; With FOR filename |
|||
CALL RENFCB |
|||
|
|||
LD DE,FILE ; Internal FCB1 contains filename |
|||
LD C,OPEN ; Now attempt open |
|||
CALL BDOS |
|||
INC A ; Open successful? |
|||
LD HL,FORNAM ; Point to FOR filename for 'not found' |
|||
JP Z,NOFILE ; No, inform user and abort |
|||
|
|||
; |
|||
; Read a 128 byte record into DBUF at end of program |
|||
; |
|||
XOR A |
|||
LD (FILE+12),A ; Start with first extent |
|||
LD (FILE+32),A ; And first record |
|||
LD DE,DBUF ; Destination buffer |
|||
|
|||
; |
|||
RDRECD: PUSH DE ; Save current data buffer address |
|||
CALL RSDMA ; Reset DMA |
|||
|
|||
LD C,READ ; Read next record |
|||
LD DE,FILE ; From FOR file |
|||
CALL BDOS |
|||
POP DE ; Get current DBUF address back |
|||
OR A ; Read successful? |
|||
JP NZ,RERROR ; No, go check EOF |
|||
LD HL,TBUF ; 128 byte buffer in page 0 |
|||
|
|||
WRDLP: LD A,(LINEND) ; At end of line? |
|||
OR A |
|||
JP Z,WDLP1 ; No |
|||
|
|||
XOR A |
|||
LD (LINEND),A ; Else we aren't anymore |
|||
|
|||
LD A,(HL) ; Get the character |
|||
AND 7FH ; Strip parity |
|||
CP '-' ; Start of next description? |
|||
JP NZ,WDLP1 ; No |
|||
|
|||
LD A,3 |
|||
LD (DE),A ; Stuff a break for beginning of last descrip |
|||
JP SEARCH |
|||
|
|||
WDLP1: LD A,(HL) ; Get character |
|||
AND 7FH ; Strip high bit |
|||
CP DEL ; Rubout? |
|||
JP Z,NEXT ; Yes, ignore and get next character |
|||
CP EOF ; EOF - End of file marker? |
|||
JP Z,ENDFIL ; Yes, all done |
|||
LD B,A ; Save character for now |
|||
LD A,(SHOWALL) ; Looking for specified string? |
|||
OR A |
|||
LD A,B ; Get our character back now |
|||
JP NZ,WDLP2 ; Yes, just write to memory |
|||
CALL TYPE ; Output to console |
|||
EX AF,AF' ; Save flags (NZ=displaying to console) |
|||
LD A,0 ; A=0 disables pausing while checking abort |
|||
EX AF,AF' ; Save it for now, get character back |
|||
JP WDLP3 ; And see if at end of line |
|||
|
|||
WDLP2: LD (DE),A ; Else writing to memory |
|||
INC DE ; Next buffer position |
|||
EX AF,AF' ; Save flags (Z=writing to memory) |
|||
LD A,1 ; A=1 enables puasing while checking abort |
|||
EX AF,AF' ; Save it for now, get character back |
|||
|
|||
WDLP3: CP LF ; Are we at end of line? |
|||
JP NZ,NEXT ; No get next character |
|||
|
|||
LD A,(SHOWALL) ; Get string search toggle |
|||
LD (LINEND),A ; If set, at end of line, and writng to memory |
|||
EX AF,AF' ; AF'=1 enable pauses, disable if 0 |
|||
CALL CKABRT ; Check for user abort (and pauses if A=1) |
|||
|
|||
NEXT: INC L ; One more byte |
|||
JP Z,RDRECD ; If no more get next record |
|||
JP WRDLP ; Else get next character |
|||
|
|||
; |
|||
; Search for a match with search string |
|||
; |
|||
SEARCH: PUSH HL ; Save HL |
|||
LD HL,CMDBUF ; Point to buffer containing command tail |
|||
|
|||
SEARC1: LD (CMDPTR),HL ; Save command tail buffer pointer |
|||
LD HL,DBUF ; Disk buffer with FOR text |
|||
|
|||
SEARC2: LD DE,(CMDPTR) ; Get command tail buffer pointer again |
|||
PUSH HL ; Save it (command tail pointer still in DE) |
|||
|
|||
SEARC3: LD A,(DE) ; Get a character |
|||
CP '\' ; Force LF? |
|||
JP NZ,SEARC4 ; No |
|||
LD A,LF ; Else LF value in A for comparison |
|||
|
|||
SEARC4: INC DE ; Increment to next command tail character |
|||
OR A ; Anything there? |
|||
JP Z,SEARC8 ; No |
|||
CP '|' ; String seperator? |
|||
JP Z,SEARC8 ; Yes |
|||
LD B,A ; Save character for compare |
|||
LD A,(HL) ; Get a FOR text character in A |
|||
CALL UCASE ; Convert it to uppercase |
|||
|
|||
SEARC5: LD C,A ; Put FOR text character in C for now |
|||
INC HL ; And increment to next one |
|||
LD A,B ; Get comparison character back (from CMDBUF) |
|||
CP '?' ; Accept any character? |
|||
JP Z,SEARC3 ; Yes, call it a match |
|||
CP C ; Else are they the same? |
|||
JP Z,SEARC3 ; Yes, call it a match |
|||
POP HL ; Else get FOR buffer address back |
|||
INC HL ; Increment to next character |
|||
LD B,0 ; Initialize count to 0 |
|||
LD A,(HL) ; Get next character from FOR buffer |
|||
CP CTRLC ; Beginning of description entry? |
|||
JP Z,SEARC6 ; Yes |
|||
CP 4 ; End of file? |
|||
JP NZ,SEARC2 ; No |
|||
INC B ; Else, show we hit end of buffer |
|||
|
|||
SEARC6: LD HL,(CMDPTR) ; Get command tail pointer back |
|||
|
|||
SEARC7: LD A,(HL) ; Get character from saved command tail |
|||
INC HL ; Point to next one |
|||
CP '|' ; Searching for multiple strings? |
|||
JP Z,SEARC1 ; Yes, go search next one |
|||
OR A ; Else are we all done? |
|||
JP NZ,SEARC7 ; No, keep looking |
|||
LD A,B ; Else see if at end of buffer |
|||
OR A |
|||
JP NZ,ENDFL1 ; Yes |
|||
LD DE,DBUF+1 |
|||
POP HL ; Get record count back |
|||
JP NEXT ; Go get next |
|||
|
|||
SEARC8: POP HL |
|||
LD A,CR |
|||
CALL TYPE ; Output CR for end of line |
|||
LD HL,DBUF |
|||
|
|||
SEARC9: LD A,(HL) ; Get character |
|||
CP CTRLC ; Start of description? |
|||
JP Z,SEARC10 ; Yes, go get next character |
|||
CP 4 ; End of file? |
|||
JP Z,ENDFL1 ; Yes |
|||
CALL TYPE ; Output character to console |
|||
CP LF ; At end of line? |
|||
LD A,0 ; Disable page pauses |
|||
CALL Z,CKABRT ; Check for aborts |
|||
INC HL ; Next character |
|||
JP SEARC9 ; Loop until a ^C or ^D |
|||
|
|||
SEARC10:POP HL |
|||
LD DE,DBUF+1 |
|||
JP NEXT ; Go get next byte |
|||
|
|||
; |
|||
; The following routine displays the help guide to the user |
|||
; |
|||
HELP: CALL PRTABT |
|||
DB CR,LF |
|||
DB 'Usage examples:' |
|||
DB CR,LF |
|||
DB CR,LF,' FOR Show entire file' |
|||
DB CR,LF,' FOR $N Show entire file without paging' |
|||
DB CR,LF,' FOR ZMD All descriptions containing string ''ZMD''' |
|||
DB CR,LF,' FOR ZMD|LU ''|'' seperates multiple strings to search' |
|||
DB CR,LF,' FOR \ZMD ''\'' forces line feed and looks at filenames' |
|||
DB CR,LF,' FOR ZM? ''?'' matches any character in this position' |
|||
DB CR,LF,0 |
|||
|
|||
LD A,(INCLDU) |
|||
OR A |
|||
JP Z,HELP1 |
|||
CALL PRTABT |
|||
DB ' FOR (B0:) Descriptions for files received on B0:',0 |
|||
|
|||
HELP1: CALL PRTABT |
|||
DB CR,LF,0 |
|||
LD A,(DSTAMP) |
|||
OR A |
|||
JP Z,HELP4 |
|||
LD A,(EDATE) |
|||
OR A |
|||
JP Z,HELP2 |
|||
CALL PRTABT |
|||
DB ' FOR ??/12',0 |
|||
JP HELP3 |
|||
|
|||
HELP2: CALL PRTABT |
|||
DB ' FOR 12/??',0 |
|||
|
|||
HELP3: CALL PRTABT |
|||
DB ' Show files received in month of December',0 |
|||
|
|||
HELP4: CALL ERXIT |
|||
DB CR,LF,LF,LF,LF,'$' |
|||
|
|||
; |
|||
; Inline print routine checks for user abort on each line feed |
|||
; |
|||
PRTABT: POP HL ; Get address following CALL |
|||
|
|||
AM1: LD A,(HL) ; Character in A |
|||
OR A ; Null terminator? |
|||
JP Z,AM2 ; Yes, all done |
|||
CALL TYPE ; Else output to console |
|||
CP LF ; Was it a LF? |
|||
LD A,0 ; Enable page pauses |
|||
CALL Z,CKABRT ; Check for user abort, or pause request |
|||
INC HL ; Point to next character |
|||
JP AM1 ; Loop until a null |
|||
|
|||
AM2: PUSH HL ; Current address in HL=return address |
|||
RET |
|||
|
|||
; |
|||
; |
|||
RERROR: CP 1 |
|||
JP Z,ENDFIL |
|||
CALL ERXIT |
|||
DB '-- Source file read error$' |
|||
; |
|||
ENDFIL: LD A,(SHOWALL) |
|||
OR A |
|||
JP Z,ENDFL1 |
|||
LD A,4 |
|||
LD (DE),A |
|||
JP SEARCH |
|||
|
|||
ENDFL1: LD C,CLOSE |
|||
LD DE,FILE |
|||
CALL BDOS |
|||
CALL ERXIT |
|||
DB CR |
|||
DB '-----' |
|||
DB CR,LF |
|||
DB '-- End of file --$' |
|||
|
|||
|
|||
; |
|||
; These next are dummy routines to satisfy external ZMDSUBS requests. |
|||
; They do nothing, but leave alone |
|||
; |
|||
DONE:: JP EXIT |
|||
TIME:: RET |
|||
|
|||
|
|||
LINEND: DB 0 |
|||
SHOWALL:DB 0 |
|||
CMDPTR: DW 0 |
|||
|
|||
|
|||
END |
|||
|
|||
@ -0,0 +1,233 @@ |
|||
; |
|||
|
|||
TITLE ZFORS.Z80 - 09/29/88 - ZMD Sysop Description Utility |
|||
; Copyrighted (c) 1987, 1988 |
|||
; Robert W. Kramer III |
|||
|
|||
PAGE |
|||
;- -; |
|||
; Update History ; |
|||
; ; |
|||
; Date Release Comments ; |
|||
; -------- ------- ---------------------------------------------- ; |
|||
; ; |
|||
; 09/29/88 v1.50 - Added trivial routines to display the user's ; |
|||
; prompt selections to screen. ; |
|||
; 03/13/88 v1.49 - No changes made to this file ; |
|||
; 03/13/88 v1.48 - Had a small problem with TPA fix which has been ; |
|||
; corrected. CHKTPA was calculating the total ; |
|||
; number of bytes available for DBUF, but wasn't ; |
|||
; clearing register L (forcing an even amount of ; |
|||
; sectors before initializing OUTSIZ buffer limit ; |
|||
; comparison word). This may have introduced ; |
|||
; minimal garbage to your FOR file if your FOR ; |
|||
; file is large enough to fill available TPA with ; |
|||
; ZMD, ZFORS or to the log file if running ZMDEL. ; |
|||
; - Rewrote OUTCHR routine in ZMDSUBS. ; |
|||
; - Redefined buffer table at end of programs. STACK; |
|||
; and filename buffers now EQUated with offsets ; |
|||
; from the last switch/toggle in program instead ; |
|||
; of with DS directive. ; |
|||
; - Some systems which do NOT have an interrupt ; |
|||
; driven keyboard may have noticed problems when ; |
|||
; an invalid key was entered in the ZNEWP, ZFORP ; |
|||
; and ZMDEL programs. In ZNEWP and ZFORP, if a ; |
|||
; CR was entered to pause the output, output was ; |
|||
; limited to one line at a time per key pressed. ; |
|||
; If an invalid key was hit, output would have ; |
|||
; remained in a paused state until one of the ; |
|||
; abort keys were pressed. This was difficult to ; |
|||
; find since my keyboard is interrupt driven and ; |
|||
; I could not duplicate the problem on my own ; |
|||
; system. ; |
|||
; 02/25/88 v1.47 - No change(s) made to this file |
|||
; 01/27/88 v1.46 - Set MODE to 255 so ZMDSUBS knows we might be ; |
|||
; running in local mode and not to worry if BYE ; |
|||
; is running or not when CHKENV checks to see ; |
|||
; which clock features are valid. ; |
|||
; 01/17/88 v1.45 - First public release ; |
|||
; 12/06/87 v1.02 - Fixed numerous trivial bugs. ; |
|||
;- -; |
|||
|
|||
;-------------------------------------------------------------------------; |
|||
; EXTERNAL Declarations: | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
EXTRN CLRLIN,DECOUT,DSCFLG,ERXIT,EXIT,FILCNT,GETDAT |
|||
EXTRN GETDSC,GETFN,GETKIND,ILPRTB,INPUT,NEWNAM,OLDDRV |
|||
EXTRN OLDUSR,OPNFOR,PRINTV,RECAR1,SHOCAT,STACK,TYPE |
|||
EXTRN UCASE,NOFOR,MODE |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Program Starts Here | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
.Z80 |
|||
ASEG |
|||
ORG 100H ; Program starts |
|||
JP BEGIN ; Jump around configuration table |
|||
INCLUDE ZMDHDR.Z80 ; Include the ZMD header overlay |
|||
.REQUEST ZMDSUBS ; Include the ZMD subroutines |
|||
|
|||
; |
|||
; |
|||
; Save CP/M stack, initialize new one for this program |
|||
; |
|||
BEGIN: LD (STACK),SP ; Save return address to CCP |
|||
LD SP,STACK ; Initialize new one for this program |
|||
|
|||
; |
|||
; Save current drive/user |
|||
; |
|||
LD A,255 ; Get current user |
|||
CALL RECAR1 |
|||
LD (OLDUSR),A ; Store it |
|||
LD C,CURDRV ; Get current drive |
|||
CALL BDOS |
|||
LD (OLDDRV),A ; Store it |
|||
|
|||
; |
|||
; Disable sleepy caller timeout and set description routines for up to |
|||
; 50 new entries |
|||
; |
|||
XOR A |
|||
LD (DESWAIT),A ; Disable sleepy caller timer |
|||
LD A,50 |
|||
LD (FILCNT),A ; Allow up to 50 descriptions |
|||
|
|||
LD A,255 |
|||
LD (MODE),A ; Tell ZMDSUBS we're a sysop utility |
|||
|
|||
; |
|||
; Display program name and version |
|||
; |
|||
BEGIN1: LD HL,SYSFOR ; Point to name of this program |
|||
CALL PRINTV ; Display it |
|||
|
|||
LD A,(DESCRIB) ; Regular FOR descriptions? |
|||
OR A |
|||
JP NZ,MAKDESC ; Yes, skip next |
|||
|
|||
LD A,(MSGDESC) ; BBS message base descriptions? |
|||
OR A |
|||
JP Z,NOFOR ; No, descriptions disabled |
|||
LD A,1 |
|||
LD (DSCFLG),A ; Set flag to show message base descriptions |
|||
LD A,(PRUSR) ; Get the private user |
|||
LD (USER),A ; FOR destination |
|||
LD A,(PRDRV) ; Get the private drive |
|||
LD (DRIVE),A ; FOR destination |
|||
JP MAKFN ; Skip date stuff |
|||
|
|||
; |
|||
; Get the date of the upload if suppose to. |
|||
; |
|||
MAKDESC:LD A,(DSTAMP) ; Datestamping description header? |
|||
OR A |
|||
JP Z,MAKFN ; No, go get filename |
|||
CALL ILPRTB |
|||
DB 'Date of upload: ',0 |
|||
CALL GETDAT ; Get the date |
|||
|
|||
; |
|||
; Get the filename (no spaces with '.' filename seperator) |
|||
; |
|||
MAKFN: CALL ILPRTB |
|||
DB CR,LF |
|||
DB ' Name of file: ',0 |
|||
CALL GETFN ; Get filename |
|||
CALL CLRLIN ; Clear current line |
|||
LD A,B ; Get filename bytes remaining count in A |
|||
CP 11 ; Anything entered? |
|||
JP NZ,GOTNM1 ; Yes, skip this |
|||
|
|||
; |
|||
; No filename was entered, check for save or abort, else continue |
|||
; |
|||
CALL ILPRTB |
|||
DB 'Save, Continue, Abort: ',0 |
|||
CALL INPUT ; Get character |
|||
CALL UCASE ; Convert to uppercase |
|||
CP 'S' ; Save changes? |
|||
JP Z,OPNFOR ; Yes, write current buffer to FOR file |
|||
|
|||
CP 'A' ; Abort program? |
|||
JP NZ,BEGIN1 ; No, get next character |
|||
CALL ILPRTB |
|||
DB CR |
|||
DB 'Abort with NO changes? ',0 |
|||
CALL INPUT |
|||
CALL UCASE |
|||
CP 'Y' |
|||
JP NZ,BEGIN1 |
|||
JP EXIT ; Then abort |
|||
|
|||
; |
|||
; Display file descriptor/upload areas and get choice |
|||
; |
|||
GOTNM1: CALL GETKIND ; Get file category for description header |
|||
|
|||
; |
|||
; Show the drive/user |
|||
; |
|||
LD A,(MSGDESC) ; Using BBS message base for descriptions? |
|||
OR A |
|||
JP NZ,SHOWDU ; Yes, show drive/user of uploaded file |
|||
LD A,(INCLDU) ; Include du in description header? |
|||
OR A |
|||
JP Z,SHOWFN ; No, then skip this stuff |
|||
|
|||
SHOWDU: LD A,(DRV) ; Get upload drive |
|||
CALL TYPE ; Output to console |
|||
LD A,(USR) ; Get upload user area |
|||
LD H,0 |
|||
LD L,A ; In A |
|||
CALL DECOUT ; Decimal output routine |
|||
LD A,':' ; Output colon |
|||
CALL TYPE |
|||
|
|||
; |
|||
; Show the filename |
|||
; |
|||
SHOWFN: LD HL,NEWNAM |
|||
|
|||
SHONM1: LD A,(HL) |
|||
CP LF |
|||
JP Z,SHOWCT |
|||
CALL TYPE |
|||
INC HL |
|||
JP SHONM1 |
|||
|
|||
; |
|||
; Show the file descriptor/upload area |
|||
; |
|||
SHOWCT: LD A,(ASKIND) ; Supposed to be showing file descriptor? |
|||
OR A |
|||
JP Z,MKENTRY ; No, get the description |
|||
CALL ILPRTB |
|||
DB ' - ',0 |
|||
CALL SHOCAT ; If so, show it |
|||
|
|||
; |
|||
; Get up to 7 lines for description |
|||
; |
|||
MKENTRY:CALL GETDSC ; Get up to 7 lines for description |
|||
JP NZ,BEGIN1 ; If none entered, or incorrect, skip next |
|||
|
|||
LD IY,FILCNT ; Else point to maximum entries left |
|||
DEC (IY) ; One less to go |
|||
JP BEGIN1 ; Get next one |
|||
|
|||
; |
|||
; These next are dummy routines to satisfy ZMDSUBS external requests. |
|||
; They do nothing, but leave them alone. |
|||
; |
|||
DONE:: JP EXIT ; Exit routine can take care of us |
|||
TIME:: RET |
|||
|
|||
|
|||
END |
|||
|
|||
@ -0,0 +1,268 @@ |
|||
; |
|||
|
|||
TITLE ZMAP.Z80 - 09/29/88 - ZMD System MAP Utility |
|||
; Copyrighted (c) 1988 |
|||
; Robert W. Kramer III |
|||
|
|||
PAGE |
|||
;- -; |
|||
; Update History ; |
|||
; ; |
|||
; Date Release Comments ; |
|||
; -------- ------- ---------------------------------------------- ; |
|||
; ; |
|||
; 09/29/88 v1.50 - Initial release ; |
|||
;- -; |
|||
|
|||
;-------------------------------------------------------------------------; |
|||
; EXTERNAL Declarations: | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
EXTRN EXIT,ILPRTB,OLDDRV,OLDUSR,PRINTV,RECAR1,STACK,TYPE |
|||
EXTRN KIND,CATADR,SHONM4,WHLCHK,DECOUT |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Program Starts Here | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
.Z80 |
|||
ASEG |
|||
ORG 100H ; Program starts |
|||
JP BEGIN ; Jump around configuration table |
|||
INCLUDE ZMDHDR.Z80 ; Include the ZMD header overlay |
|||
.REQUEST ZMDSUBS ; Include the ZMD subroutines |
|||
|
|||
; |
|||
; |
|||
; Save CP/M stack, initialize new one for this program |
|||
; |
|||
BEGIN: LD (STACK),SP ; Save return address to CCP |
|||
LD SP,STACK ; Initialize new one for this program |
|||
|
|||
; |
|||
; Save current drive/user |
|||
; |
|||
LD A,255 ; Get current user |
|||
CALL RECAR1 |
|||
LD (OLDUSR),A ; Store it |
|||
LD C,CURDRV ; Get current drive |
|||
CALL BDOS |
|||
LD (OLDDRV),A ; Store it |
|||
|
|||
; |
|||
; |
|||
; Display program name and version |
|||
; |
|||
BEGIN1: LD HL,MAPNAM ; Point to name of this program |
|||
CALL PRINTV ; Display it |
|||
|
|||
LD A,(ASKAREA) |
|||
OR A |
|||
JP Z,NOTDEF ; Upload areas not enabled, Abort |
|||
|
|||
CALL WHLCHK |
|||
JP Z,BEGIN2 |
|||
LD A,1 |
|||
LD (SPECIAL),A |
|||
|
|||
BEGIN2: CALL HBORD |
|||
|
|||
LD A,'A' |
|||
LD (KIND),A |
|||
|
|||
LD A,(MAXTYP) |
|||
RRA |
|||
PUSH AF |
|||
|
|||
LD A,(MAXTYP) |
|||
SUB A,'A' |
|||
RRA |
|||
LD C,A |
|||
|
|||
POP AF |
|||
JP NC,NOTODD |
|||
LD A,1 |
|||
LD (ISODD),A |
|||
|
|||
NOTODD: INC C |
|||
LD A,'A' |
|||
ADD A,C |
|||
LD C,A ; C contains letter of 2nd column descriptors |
|||
|
|||
LD A,(MAXTYP) |
|||
SUB A,'@' |
|||
LD B,A ; B contains binary number of descriptors |
|||
|
|||
LD DE,DESTBL ; DE contains address to 26 byte table |
|||
LD A,C |
|||
EX AF,AF' |
|||
LD A,'A' ; Initialize first entry |
|||
|
|||
SETLP: LD (DE),A |
|||
INC DE |
|||
INC A |
|||
EX AF,AF' |
|||
DJNZ SETLP |
|||
LD A,0 |
|||
LD (DE),A ; Stuff terminator for display routines |
|||
|
|||
; |
|||
; Main program loop |
|||
; |
|||
LOOP: LD A,(COLM) |
|||
OR A |
|||
JP NZ,DOCOL2 |
|||
|
|||
CALL ILPRTB |
|||
DB ' | ',0 |
|||
JP ATEND |
|||
|
|||
DOCOL2: CALL ILPRTB |
|||
DB ' || ',0 |
|||
|
|||
ATEND: CALL SHOWFD |
|||
CALL SHOWDU |
|||
LD A,(COLM) |
|||
OR A |
|||
JP Z,ATEND1 |
|||
CALL ILPRTB |
|||
DB ' |' |
|||
DB CR,LF,0 |
|||
XOR A |
|||
JP ATEND2 |
|||
|
|||
ATEND1: LD A,1 |
|||
|
|||
ATEND2: LD (COLM),A |
|||
|
|||
LD HL,(TBLSAV) |
|||
INC HL |
|||
LD (TBLSAV),HL |
|||
LD A,(HL) |
|||
LD (KIND),A |
|||
OR A |
|||
JP NZ,LOOP |
|||
|
|||
LD A,(ISODD) |
|||
OR A |
|||
JP Z,ISDN1 |
|||
|
|||
ISDONE: CALL ILPRTB |
|||
DB ' || ',0 |
|||
LD A,(SPECIAL) |
|||
OR A |
|||
JP Z,IS1 |
|||
CALL ILPRTB |
|||
DB ' ',0 |
|||
|
|||
IS1: CALL ILPRTB |
|||
DB ' |',CR,LF,0 |
|||
|
|||
ISDN1: CALL HBORD |
|||
CALL ILPRTB |
|||
DB CR,LF |
|||
DB ' Use FOR/NEW to view recent upload description/log listings.' |
|||
DB 0 |
|||
JP EXIT |
|||
; |
|||
; |
|||
SHOWDU: LD A,(KIND) |
|||
SUB 'A' |
|||
RLA |
|||
RLA |
|||
LD D,0 |
|||
LD E,A |
|||
LD IY,TYPTBL |
|||
ADD IY,DE |
|||
LD A,(IY) |
|||
CALL TYPE |
|||
|
|||
LD A,(IY+1) |
|||
CALL SHODU1 |
|||
|
|||
CALL ILPRTB |
|||
DB ' ',0 |
|||
|
|||
LD A,(SPECIAL) |
|||
OR A |
|||
RET Z |
|||
|
|||
LD A,(IY+2) |
|||
CALL TYPE |
|||
|
|||
LD A,(IY+3) |
|||
|
|||
SHODU1: CP 10 |
|||
PUSH AF |
|||
|
|||
LD H,0 |
|||
LD L,A |
|||
CALL DECOUT |
|||
CALL ILPRTB |
|||
DB ':',0 |
|||
|
|||
POP AF |
|||
RET C |
|||
|
|||
CALL ILPRTB |
|||
DB ' ',0 |
|||
RET |
|||
|
|||
; |
|||
; |
|||
SHOWFD: CALL CATADR |
|||
INC DE |
|||
INC DE |
|||
LD B,23 |
|||
|
|||
SHOFD1: LD A,(DE) |
|||
CALL TYPE |
|||
INC DE |
|||
DJNZ SHOFD1 |
|||
CALL ILPRTB |
|||
DB ' ',0 |
|||
RET |
|||
|
|||
; |
|||
; Show horizontal border for top and bottom |
|||
; |
|||
HBORD: CALL ILPRTB |
|||
DB ' ================================================================',0 |
|||
LD A,(SPECIAL) |
|||
OR A |
|||
JP Z,HBORD1 |
|||
CALL ILPRTB |
|||
DB '==========',0 |
|||
|
|||
HBORD1: CALL ILPRTB |
|||
DB CR,LF,0 |
|||
RET |
|||
|
|||
NOTDEF: CALL ILPRTB |
|||
DB CR,LF |
|||
DB 'ZMD Upload Routing feature not enabled, ',0 |
|||
LD HL,MAPNAM |
|||
CALL SHONM4 |
|||
CALL ILPRTB |
|||
DB 'aborting...',0 |
|||
JP EXIT |
|||
; |
|||
; These next are dummy routines to satisfy ZMDSUBS external requests. |
|||
; They do nothing, but leave them alone. |
|||
; |
|||
DONE:: JP EXIT ; Exit routine can take care of us |
|||
TIME:: RET |
|||
|
|||
TBLSAV: DW DESTBL |
|||
DESTBL: DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
|||
ISODD: DB 0 |
|||
COUNT: DB 0 |
|||
COLM: DB 0 |
|||
SPECIAL:DB 0 |
|||
|
|||
|
|||
END |
|||
|
|||
Binary file not shown.
File diff suppressed because it is too large
File diff suppressed because it is too large
@ -0,0 +1,264 @@ |
|||
; |
|||
|
|||
TITLE ZMDEL.Z80 - 09/29/88 - ZMD Sysop Transfer Log Purge Utility |
|||
; Copyrighted (c) 1987, 1988 |
|||
; Robert W. Kramer III |
|||
|
|||
PAGE |
|||
;- -; |
|||
; Update History ; |
|||
; ; |
|||
; Date Release Comments ; |
|||
; -------- ------- ---------------------------------------------- ; |
|||
; ; |
|||
; 09/29/88 v1.50 - No change(s) made to this file ; |
|||
; 03/18/88 v1.49 - No change(s) made to this file ; |
|||
; 03/13/88 v1.48 - Had a small problem with TPA fix which has been ; |
|||
; corrected. CHKTPA was calculating the total ; |
|||
; number of bytes available for DBUF, but wasn't ; |
|||
; clearing register L (forcing an even amount of ; |
|||
; sectors before initializing OUTSIZ buffer limit ; |
|||
; comparison word). This may have introduced ; |
|||
; minimal garbage to your FOR file if your FOR ; |
|||
; file is large enough to fill available TPA with ; |
|||
; ZMD, ZFORS or to the log file if running ZMDEL. ; |
|||
; - Rewrote OUTCHR routine in ZMDSUBS. ; |
|||
; - Redefined buffer table at end of programs. STACK; |
|||
; and filename buffers now EQUated with offsets ; |
|||
; from the last switch/toggle in program instead ; |
|||
; of with DS directive. ; |
|||
; - Some systems which do NOT have an interrupt ; |
|||
; driven keyboard may have noticed problems when ; |
|||
; an invalid key was entered in the ZNEWP, ZFORP ; |
|||
; and ZMDEL programs. In ZNEWP and ZFORP, if a ; |
|||
; CR was entered to pause the output, output was ; |
|||
; limited to one line at a time per key pressed. ; |
|||
; If an invalid key was hit, output would have ; |
|||
; remained in a paused state until one of the ; |
|||
; abort keys were pressed. This was difficult to ; |
|||
; find since my keyboard is interrupt driven and ; |
|||
; I could not duplicate the problem on my own ; |
|||
; system. ; |
|||
; 02/25/88 v1.47 - Fixed line count display routine. Number of ; |
|||
; lines read was being improperly decremented ; |
|||
; before displaying. Same fix included removing ; |
|||
; code that added an extra CR,LF to the beginning ; |
|||
; of the file. Count is now right. ; |
|||
; 01/27/88 v1.46 - Some changes were made to the ZMDSUBS file that ; |
|||
; are not directly related to this file ; |
|||
; 01/17/88 v1.45 - First public release ; |
|||
; 11/20/87 v1.00 - Initial version ; |
|||
;- -; |
|||
|
|||
;-------------------------------------------------------------------------; |
|||
; EXTERNAL Declarations: | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
EXTRN CKABRT,CLEARIT,CLRLIN,DBUF,DECOUT,ERXIT,EXIT,ILPRTB |
|||
EXTRN INPUT,NOFILE,NOLOG,NOROOM,OLDDRV,OLDUSR,OUTCHR,PRINTV |
|||
EXTRN RECAR1,RECDR1,RENFCB,RERROR,RSDMA,SHONM4,STACK,STDMA |
|||
EXTRN TDONE,TYPE,UCASE |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Program Starts Here | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
.Z80 |
|||
ASEG |
|||
ORG 100H ; Program starts |
|||
JP BEGIN ; Jump around configuration table |
|||
INCLUDE ZMDHDR.Z80 ; Include the ZMD header overlay |
|||
.REQUEST ZMDSUBS ; Include the ZMD subroutines |
|||
|
|||
; |
|||
; |
|||
; Save CP/M stack, initialize new one for this program |
|||
; |
|||
BEGIN: LD (STACK),SP ; Save return address to CCP |
|||
LD SP,STACK |
|||
|
|||
; |
|||
; Save current drive/user |
|||
; |
|||
LD A,255 ; Get user function |
|||
CALL RECAR1 |
|||
LD (OLDUSR),A ; Save user area for later |
|||
LD C,CURDRV ; Get current drive function |
|||
CALL BDOS |
|||
LD (OLDDRV),A ; Save drive for later |
|||
|
|||
; |
|||
; Tell em who we are and ask if they want to continue |
|||
; |
|||
LD HL,PRGUTL |
|||
CALL PRINTV |
|||
|
|||
LD A,(LOGCAL) ; Log file enabled? |
|||
OR A |
|||
JP Z,NOLOG ; No, then don't run program |
|||
|
|||
CALL ILPRTB |
|||
DB 'Purge all except "R" entries from log? ',0 |
|||
LD A,0 |
|||
LD (DESWAIT),A ; Disable sleepy caller timout |
|||
CALL INPUT |
|||
CALL UCASE |
|||
CP 'Y' ; Continue? |
|||
JP NZ,EXIT ; No, exit to CP/M |
|||
CALL CLRLIN |
|||
|
|||
; |
|||
; Now log into drive/user area of ZMD.LOG |
|||
; |
|||
LD A,(LOGUSR) ; Get user area to find ZMD.LOG file |
|||
CALL RECAR1 |
|||
LD A,(LOGDRV) ; Get drive to find ZMD.LOG file |
|||
CALL RECDR1 |
|||
|
|||
; |
|||
; Open the 'ZMD .LOG' file |
|||
; |
|||
LD DE,LOGNAM ; Point to LOG filename |
|||
LD HL,FILE ; Destination is internal FCB1 |
|||
CALL RENFCB ; Initialize FCB |
|||
|
|||
LD DE,FILE ; Point to ZMD.LOG FCB |
|||
LD C,OPEN ; Open file |
|||
CALL BDOS |
|||
INC A ; Does file exist? |
|||
LD HL,LOGNAM ; Point to log filename |
|||
JP Z,NOFILE ; No, inform user and abort to CP/M |
|||
|
|||
; |
|||
; Open the ' .$$$' file |
|||
; |
|||
LD DE,TEMPFIL ; Point to temporary filename |
|||
LD HL,DEST ; Destination is internal FCB2 |
|||
CALL RENFCB ; Initialize FCB |
|||
|
|||
LD HL,FILE ; Point to default FCB |
|||
LD DE,DEST ; |
|||
LD BC,9 ; Move drive and filename bytes |
|||
LDIR |
|||
|
|||
LD C,DELETE ; Delete possible '$$$' temporary file |
|||
LD DE,DEST |
|||
CALL BDOS |
|||
|
|||
LD C,MAKE ; And make new one for this session |
|||
LD DE,DEST |
|||
CALL BDOS |
|||
INC A ; Successful create? |
|||
JP Z,NOROOM ; No, inform user and exit to CP/M |
|||
|
|||
CALL ILPRTB ; Warn them of the wait |
|||
DB CR |
|||
DB 'Cleaning ',0 |
|||
LD HL,LOGNAM |
|||
CALL SHONM4 |
|||
|
|||
RDRECD: CALL RSDMA ; Reset DMA |
|||
LD DE,FILE ; Read a record from ZMD.LOG |
|||
LD C,READ |
|||
CALL BDOS |
|||
OR A ; Read ok? |
|||
JP NZ,RERROR ; No, inform user and exit |
|||
LD HL,TBUF ; Point to first character in read buffer |
|||
|
|||
GETBYT: LD A,(HL) ; Get a byte from read buffer |
|||
AND 7FH ; Strip parity bit |
|||
CP 7FH ; Del (Rubout) |
|||
JP Z,NEXT ; Yes, ignore it |
|||
CP EOF ; End of file marker |
|||
JP Z,TDONE ; Transfer done. Close and exit |
|||
LD B,A ; Save character |
|||
CP LF ; Was it a line feed? |
|||
JP Z,NEWLIN ; Yes toggle line counters, start new line |
|||
|
|||
; |
|||
; LOGMODE is set to 0 everytime a line feed is encountered. If LOGMODE is |
|||
; is 0 at this point, the current byte is anylized as this log entry's |
|||
; mode of transfer. Only entries made in the 'R' receive mode are written |
|||
; to the new ZMD.$$$ file. Encountering an 'R' when LOGMODE is 0 causes |
|||
; KEEPER to be set non zero |
|||
; |
|||
LD A,(LOGMODE) ; Start of new line? |
|||
OR A |
|||
JP NZ,NXTBYT ; No, then we don't care what this byte is |
|||
INC A |
|||
LD (LOGMODE),A ; Else show we are not on LOGMODE byte anymore |
|||
LD A,B ; Get the character back |
|||
CP 'R' ; Is this an upload entry? |
|||
LD (KEEPER),A ; Indicate saving byte just in case |
|||
JP Z,NXTBYT ; Yes, leave KEEPER non-zero so it's written |
|||
XOR A |
|||
LD (KEEPER),A ; Else 0 keep flag (0=don't keep this entry) |
|||
|
|||
NXTBYT: LD A,(KEEPER) ; Keeping this log entry? |
|||
OR A |
|||
JP Z,NEXT ; No, get next byte |
|||
|
|||
; |
|||
; Place current byte in buffer and write to disk if buffer full |
|||
; |
|||
WRTBYT: LD A,B |
|||
CALL OUTCHR |
|||
|
|||
NEXT: INC L ; Done with sector? |
|||
JP Z,RDRECD ; Yes, get another sector |
|||
JP GETBYT ; Else get another byte |
|||
|
|||
NEWLIN: XOR A ; Zero accumulator |
|||
LD (LOGMODE),A ; Show current byte is log mode byte |
|||
LD IY,(LNSREAD) ; Get lines read counter |
|||
INC IY ; Add one more |
|||
LD (LNSREAD),IY |
|||
LD A,1 ; Disable page pauses |
|||
CALL CKABRT ; User abort? |
|||
LD A,(KEEPER) ; Are we keeping this entry? |
|||
OR A |
|||
JP Z,NEXT ; No, read another byte |
|||
LD IY,(LNSWROT) ; Get lines written count |
|||
INC IY ; Add one more |
|||
LD (LNSWROT),IY |
|||
JP WRTBYT |
|||
|
|||
; |
|||
DONE:: CALL CLRLIN |
|||
CALL ILPRTB |
|||
DB CR,'Finished.' |
|||
DB CR,LF |
|||
DB ' ',0 |
|||
|
|||
LD HL,(LNSREAD) |
|||
CALL DECOUT |
|||
CALL ILPRTB |
|||
DB TAB |
|||
DB 'original lines',CR,LF |
|||
DB ' ',0 |
|||
|
|||
LD HL,(LNSWROT) |
|||
CALL DECOUT |
|||
CALL ILPRTB |
|||
DB TAB |
|||
DB 'retained lines ',0 |
|||
JP EXIT |
|||
|
|||
; |
|||
; These next are dummy routines to satisfy external ZMDSUBS requests. |
|||
; They do nothing, but leave alone. |
|||
; |
|||
TIME:: RET |
|||
|
|||
|
|||
KEEPER: DB 0 |
|||
LOGMODE:DB 0 |
|||
LNSREAD:DW 0 |
|||
LNSWROT:DW 0 |
|||
|
|||
|
|||
END |
|||
|
|||
@ -0,0 +1,916 @@ |
|||
;======================================================================= |
|||
; |
|||
; XMHB.Z80 - XMODEM12 PATCH FILE FOR ROMWBW HBIOS |
|||
; |
|||
; Wayne Warthen - wwarthen@gmail.com |
|||
; |
|||
; 2020-05-23 WBW Rewrite for HBIOS FastPath(tm) |
|||
; |
|||
;======================================================================= |
|||
; |
|||
ASEG |
|||
; |
|||
BASE EQU 100H ; Start of CP/M normal program area |
|||
FCB EQU 005CH ; System FCB |
|||
; |
|||
BDOS EQU 0005H ; BDOS function dispatch vector |
|||
; |
|||
;======================================================================= |
|||
; |
|||
; Jump table: The jump table must be in exactly the same sequence as the |
|||
; one in ZMD. |
|||
; |
|||
ORG 0580H ; ZMD I/O overlay address |
|||
; |
|||
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 (not present in ZMD) |
|||
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 |
|||
; |
|||
ORG 0600H |
|||
; |
|||
; ZMD expects to find a byte with the baud rate code somewhere. For |
|||
; lack of a better location, we put it at 0600H. The highest baud |
|||
; rate code understood by ZMD is 9 which means 19200 baud. We just |
|||
; use that since we are almost certainly running faster than this. |
|||
; |
|||
BAUDCD DB 9 ; Baud rate storage |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Output character to console |
|||
; |
|||
; This is intended to write file transfer progress to a RCPM |
|||
; BBS console. It is stubbed out because it will write to the |
|||
; active file transfer port when not using an RCPM. |
|||
; |
|||
CONOUT: |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; 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: |
|||
; |
|||
; Scan the command line for a number. If found, this is used |
|||
; as the HBIOS unit number. |
|||
; |
|||
LD HL,FCB+1 ; Start after drive byte |
|||
LD B,8 ; Check 8 characters |
|||
MINIT1: |
|||
LD A,(HL) ; Get character |
|||
CP '0' ; Start of numerics |
|||
JR C,MINIT2 ; If below '0', continue scan |
|||
CP '9' ; Last numeric |
|||
JR NC,MINIT2 ; If above '9', continue scan |
|||
SUB '0' ; Got it, convert to binary |
|||
LD (UNIT),A ; Save it |
|||
LD A,' ' ; Space character to accum |
|||
LD (HL),A ; Remove numberic from FCB |
|||
JR MINIT3 ; Proceed with initialization |
|||
|
|||
MINIT2: |
|||
INC HL |
|||
DJNZ MINIT1 |
|||
|
|||
MINIT3: |
|||
; Announce |
|||
LD DE,TAG ; Tagline |
|||
LD C,9 ; BDOS string display function |
|||
CALL BDOS ; Do it |
|||
; |
|||
; Identify BIOS (RomWBW HBIOS or UNA UBIOS) |
|||
CALL IDBIO ; 1=HBIOS, 2=UBIOS |
|||
LD (BIOID),A ; Save it |
|||
DEC A ; Test for HBIOS |
|||
JR Z,MINIT_HB ; Do HBIOS setup |
|||
DEC A ; Test for UBIOS |
|||
JR Z,MINIT_UB ; Do UBIOS setup |
|||
; |
|||
; Neither UNA nor RomWBW |
|||
LD DE,ERR_BIO ; BIOS error message |
|||
JP FAIL ; Print msg and bail out |
|||
; |
|||
MINIT_HB: |
|||
; Display RomWBW notification string |
|||
LD DE,HB_TAG ; BIOS notification string |
|||
LD C,9 ; BDOS string display function |
|||
CALL BDOS ; Do it |
|||
; |
|||
; Get CPU speed from RomWBW HBIOS and save it |
|||
LD B,0F8H ; HBIOS SYSGET function 0xF8 |
|||
LD C,0F0H ; CPUINFO subfunction 0xF0 |
|||
RST 08 ; Do it, L := CPU speed in MHz |
|||
LD A,L ; Move it to A |
|||
LD (CPUSPD),A ; Save it |
|||
; |
|||
; Get HBIOS bank id |
|||
LD BC,0F8F2H ; HBIOS SYSGET, Bank Info |
|||
RST 08 ; do it |
|||
JP NZ,APIERR ; handle API error |
|||
LD A,D ; BIOS bank id to A |
|||
LD (BIOSBID),A ; save it |
|||
; |
|||
LD A,(UNIT) ; get current unit specified |
|||
CP 0FFH ; check for undefined |
|||
JR NZ,MINIT_HB1 ; if not undefined, go ahead |
|||
; |
|||
; Lookup current console to use as default for transfer |
|||
LD B,0FAH ; HBIOS PEEK |
|||
LD A,(BIOSBID) ; get BIOS bank id |
|||
LD D,A ; ... and put in D |
|||
LD HL,100H + 12H ; HCB console unit address |
|||
RST 08 ; E := value |
|||
LD A,E ; put in A |
|||
LD (UNIT),A ; replace UNIT with console UNIT |
|||
; |
|||
MINIT_HB1: |
|||
; Get HBIOS device type |
|||
LD B,06H ; HBIOS DEVICE function 0x06 |
|||
LD A,(UNIT) ; Get xfer unit |
|||
LD C,A ; Put in C |
|||
RST 08 ; Do it, D=device type |
|||
LD A,D ; Put result in A |
|||
CP 00H ; UART? |
|||
JP Z,MINIT_HB2 ; If so, do UART H/W init |
|||
CP 80H ; USB-FIFO? |
|||
JP Z,UF_INIT ; If so, do USB-FIFO H/W init |
|||
JP HB_INIT ; Otherwise, use BIOS I/O |
|||
; |
|||
MINIT_HB2: |
|||
; Handle UART driver special. If receive interrupts active, |
|||
; we must use BIOS I/O. Otherwise, direct UART I/O is best |
|||
LD B,06H ; Serial device function |
|||
LD A,(UNIT) ; Get xfer unit |
|||
LD C,A ; Put in C |
|||
RST 08 ; Do it, H = UART TYPE |
|||
BIT 7,H ; Check for interrupt driven receive |
|||
JP Z,UA_INIT ; If not, do direct UART I/O |
|||
JP HB_INIT ; else use BIOS I/O |
|||
; |
|||
MINIT_UB: |
|||
; Display UNA notification string |
|||
LD DE,UB_TAG ; BIOS notification string |
|||
LD C,9 ; BDOS string display function |
|||
CALL BDOS ; Do it |
|||
; |
|||
; Get CPU speed from UNA and save it |
|||
LD C,0F8H ; UNA BIOS Get PHI function |
|||
RST 08 ; Returns speed in Hz in DE:HL |
|||
LD B,4 ; Divide MHz in DE:HL by 100000H |
|||
MINIT_UB1: |
|||
SRL D ; ... to get approx CPU speed in |
|||
RR E ; ...MHz. Throw away HL, and |
|||
DJNZ MINIT_UB1 ; ...right shift DE by 4. |
|||
INC E ; Fix up for value truncation |
|||
LD A,E ; Put in A |
|||
LD (CPUSPD),A ; Save it |
|||
; |
|||
JP UB_INIT ; UNA BIOS init |
|||
; |
|||
MINIT_RET: |
|||
PUSH HL ; Save HL (JP table adr) |
|||
|
|||
; Display handler label |
|||
LD C,9 ; BDOS string display function |
|||
CALL BDOS ; Do it |
|||
; |
|||
; Display port (unit number) |
|||
LD DE,COM_LBL ; Prefix |
|||
LD C,9 ; BDOS string display function |
|||
CALL BDOS ; Do it |
|||
LD A,(UNIT) ; Get unit number |
|||
ADD A,'0' ; Make displayable |
|||
LD E,A ; Put in E for display |
|||
LD C,2 ; BDOS console write char |
|||
CALL BDOS ; Do it |
|||
; |
|||
; Newline |
|||
LD C,9 ; BDOS string display function |
|||
LD DE,CRLF ; Newline |
|||
CALL BDOS ; Do it |
|||
; |
|||
; Copy real vectors into active jump table |
|||
POP HL ; Recover HL |
|||
LD DE,JPTBL ; Real jump table is destination |
|||
LD BC,7 * 3 ; Copy 7 3-byte entries |
|||
LDIR ; Do the copy |
|||
; |
|||
; Return with CPU speed in A |
|||
LD A,(CPUSPD) ; A := CPU speed in MHz |
|||
LD HL,(RCVSCL) ; HL := receive scalar |
|||
RET ; and return |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Uninitialize modem |
|||
; |
|||
UNINIT: |
|||
LD A,(BIOID) |
|||
CP 1 ; Is HBIOS? |
|||
JR Z,HUNINIT ; Handle HBIOS |
|||
CP 2 ; Is UBIOS? |
|||
JR Z,UUNINIT ; Handle UBIOS |
|||
RET ; Just return |
|||
; |
|||
HUNINIT: |
|||
; HBIOS: Reset character device 0 |
|||
LD B,04H ; HBIOS CIOINIT function 0x04 |
|||
LD A,(UNIT) ; HBIOS serial unit number |
|||
LD C,A ; Put in C for func call |
|||
LD DE,-1 ; Reset w/ current settings |
|||
RST 08 ; Do it |
|||
RET ; not initialized, so no 'UN-INITIALIZE' |
|||
; |
|||
UUNINIT: |
|||
; UBIOS: Reset character device 0 |
|||
LD C,10H ; UNA INIT function 0x10 |
|||
LD A,(UNIT) ; UBIOS serial unit number |
|||
LD B,A ; Put in B for func call |
|||
LD DE,-1 ; Reset w/ current settings |
|||
RST 08 ; Do it |
|||
RET ; not initialized, so no 'UN-INITIALIZE' |
|||
; |
|||
; Identify active BIOS. RomWBW HBIOS=1, UNA UBIOS=2, else 0 |
|||
; |
|||
IDBIO: |
|||
; |
|||
; Check for UNA (UBIOS) |
|||
LD A,(0FFFDH) ; fixed location of UNA API vector |
|||
CP 0C3H ; jp instruction? |
|||
JR NZ,IDBIO1 ; if not, not UNA |
|||
LD HL,(0FFFEH) ; get jp address |
|||
LD A,(HL) ; get byte at target address |
|||
CP 0FDH ; first byte of UNA push ix instruction |
|||
JR NZ,IDBIO1 ; if not, not UNA |
|||
INC HL ; point to next byte |
|||
LD A,(HL) ; get next byte |
|||
CP 0E5H ; second byte of UNA push ix instruction |
|||
JR NZ,IDBIO1 ; if not, not UNA, check others |
|||
LD A,2 ; UNA BIOS id = 2 |
|||
RET ; and done |
|||
; |
|||
IDBIO1: |
|||
; Check for RomWBW (HBIOS) |
|||
LD HL,(0FFFEH) ; HL := HBIOS ident location |
|||
LD A,'W' ; First byte of ident |
|||
CP (HL) ; Compare |
|||
JR NZ,IDBIO2 ; Not HBIOS |
|||
INC HL ; Next byte of ident |
|||
LD A,~'W' ; Second byte of ident |
|||
CP (HL) ; Compare |
|||
JR NZ,IDBIO2 ; Not HBIOS |
|||
LD A,1 ; HBIOS BIOS id = 1 |
|||
RET ; and done |
|||
; |
|||
IDBIO2: |
|||
; No idea what this is |
|||
XOR A ; Setup return value of 0 |
|||
RET ; and done |
|||
; |
|||
HWERR: |
|||
; Failed to identify target comm hardware |
|||
LD DE,ERR_HW ; Hardware error message |
|||
JP FAIL ; Print message and bail out |
|||
; |
|||
APIERR: |
|||
; API returned unepected failure |
|||
LD DE,ERR_API ; API error message |
|||
JP FAIL ; Pprint message and bail out |
|||
; |
|||
FAIL: |
|||
; DE has error string address |
|||
LD C,9 ; BDOS string display function |
|||
CALL BDOS ; Do it |
|||
JP 0 ; Bail out! |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; 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 |
|||
; |
|||
BIOID DB 0 ; BIOS ID, 1=HBIOS, 2=UBIOS |
|||
CPUSPD DB 10 ; CPU speed in MHz |
|||
RCVSCL DW 6600 ; RECV loop timeout scalar |
|||
UNIT DB 0FFH ; BIOS serial device unit number |
|||
BIOSBID DB 00H ; BIOS bank id |
|||
; |
|||
TAG DB "RomWBW, 30-May-2020$" |
|||
; |
|||
HB_LBL DB ", HBIOS FastPath$" |
|||
UB_LBL DB ", UNA UBIOS$" |
|||
UA_LBL DB ", UART$" |
|||
UF_LBL DB ", USB-FIFO$" |
|||
COM_LBL DB " on COM$" |
|||
; |
|||
UB_TAG DB " [UNA]$" |
|||
HB_TAG DB " [WBW]$" |
|||
; |
|||
CRLF DB 13, 10, "$" |
|||
; |
|||
ERR_BIO DB 13, 10, 13, 10, "++ Unknown BIOS ++", 13, 10, "$" |
|||
ERR_HW DB 13, 10, 13, 10, "++ Unknown Hardware ++", 13, 10, "$" |
|||
ERR_API DB 13, 10, 13, 10, "++ BIOS API Error ++", 13, 10, "$" |
|||
; |
|||
;======================================================================= |
|||
;======================================================================= |
|||
; |
|||
; RomWBW HBIOS Interface |
|||
; |
|||
;======================================================================= |
|||
;======================================================================= |
|||
; |
|||
; 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). |
|||
; |
|||
HB_JPTBL: |
|||
JP HB_SENDR ; send character (via pop psw) |
|||
JP HB_CAROK ; test for carrier |
|||
;JP HB_MDIN ; receive data byte (not present in ZMD) |
|||
JP HB_GETCHR ; get character from modem |
|||
JP HB_RCVRDY ; check receive ready |
|||
JP HB_SNDRDY ; check send ready |
|||
JP HB_SPEED ; get speed value for file transfer time |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; HBIOS initialization |
|||
; |
|||
HB_INIT: |
|||
LD HL,2150 ; Smaller receive loop timeout scalar |
|||
LD (RCVSCL),HL ; ... to compensate for BIOS overhead |
|||
; |
|||
; Patch SENDR w/ FastPath addresses |
|||
LD BC,0F801H ; Get CIO func/data adr |
|||
LD D,01H ; Func=CIO OUT |
|||
LD A,(UNIT) ; get desired char unit |
|||
LD E,A ; and put in E |
|||
RST 08 |
|||
JP NZ,APIERR ; handle API error |
|||
LD (HB_UDAT),DE ; Plug in data adr |
|||
LD (HB_SCFN),HL ; Plug in func adr |
|||
; |
|||
; Patch GETCHR/MDIN w/ FastPath addresses |
|||
LD BC,0F801H ; Get CIO func/data adr |
|||
LD D,00H ; Func=CIO IN |
|||
LD A,(UNIT) ; get desired char unit |
|||
LD E,A ; and put in E |
|||
RST 08 |
|||
JP NZ,APIERR ; handle API error |
|||
LD (HB_GCFN),HL ; Plug in func adr |
|||
; |
|||
; Patch RCVRDY w/ FastPath addresses |
|||
LD BC,0F801H ; Get CIO func/data adr |
|||
LD D,02H ; Func=CIO IST |
|||
LD A,(UNIT) ; get desired char unit |
|||
LD E,A ; and put in E |
|||
RST 08 |
|||
JP NZ,APIERR ; handle API error |
|||
LD (HB_RRFN),HL ; Plug in func adr |
|||
; |
|||
; Patch SNDRDY w/ FastPath addresses |
|||
LD BC,0F801H ; Get CIO func/data adr |
|||
LD D,03H ; Func=CIO OST |
|||
LD A,(UNIT) ; get desired char unit |
|||
LD E,A ; and put in E |
|||
RST 08 |
|||
JP NZ,APIERR ; handle API error |
|||
LD (HB_SRFN),HL ; Plug in func adr |
|||
; |
|||
; Claim 1 MHz CPU to offset overhead of HBIOS |
|||
LD A,1 |
|||
LD (CPUSPD),A ; Save it |
|||
; |
|||
LD HL,HB_JPTBL |
|||
LD DE,HB_LBL |
|||
JP MINIT_RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Send character on top of stack |
|||
; |
|||
HB_SENDR: |
|||
POP AF ; get character to send from stack |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
LD E,A ; character to E |
|||
LD IY,(HB_UDAT) |
|||
LD A,(BIOSBID) ; call into HBIOS bank |
|||
LD IX,0000H |
|||
HB_SCFN EQU $-2 |
|||
CALL 0FFF9H ; HBIOS bank call |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test and report carrier status, Z set if carrier present |
|||
; |
|||
HB_CAROK: |
|||
XOR A ; not used, always indicate present |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Get a character |
|||
; |
|||
; GETCHR must not block |
|||
; |
|||
HB_GETCHR: |
|||
CALL HB_RCVRDY |
|||
RET NZ |
|||
; Fall thru if char ready |
|||
; |
|||
; MDIN can assume a character is ready |
|||
; |
|||
HB_MDIN: |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
LD IY,(HB_UDAT) |
|||
LD A,(BIOSBID) ; call into HBIOS bank |
|||
LD IX,0000H |
|||
HB_GCFN EQU $-2 |
|||
CALL 0FFF9H ; HBIOS bank call |
|||
LD A,E ; byte received to A |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test for character ready to receive, Z = ready |
|||
; Error code returned in A register |
|||
; *** Error code does not seem to be used *** |
|||
; |
|||
HB_RCVRDY: |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
LD IY,(HB_UDAT) |
|||
LD A,(BIOSBID) ; call into HBIOS bank |
|||
LD IX,0000H |
|||
HB_RRFN EQU $-2 |
|||
CALL 0FFF9H ; HBIOS bank call |
|||
SUB 1 ; CF set IFF zero |
|||
RL A ; CF to bit 0 of A |
|||
AND 01H ; set Z flag as needed |
|||
LD A,0 ; report no line errors |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test for ready to send a character, Z = ready |
|||
; |
|||
HB_SNDRDY: |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
LD IY,(HB_UDAT) |
|||
LD A,(BIOSBID) ; call into HBIOS bank |
|||
LD IX,0000H |
|||
HB_SRFN EQU $-2 |
|||
CALL 0FFF9H ; HBIOS bank call |
|||
SUB 1 ; CF set IFF zero |
|||
RL A ; CF to bit 0 of A |
|||
AND 01H ; set Z flag as needed |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Report baud rate (index into SPTBL returned in register A) |
|||
; |
|||
HB_SPEED: |
|||
LD A,8 ; arbitrarily return 9600 baud |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
HB_UDAT DW 0000H ; Unit data address |
|||
; |
|||
; |
|||
;======================================================================= |
|||
;======================================================================= |
|||
; |
|||
; UNA UBIOS Interface |
|||
; |
|||
;======================================================================= |
|||
;======================================================================= |
|||
; |
|||
; 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). |
|||
; |
|||
UB_JPTBL: |
|||
JP UB_SENDR ; send character (via pop psw) |
|||
JP UB_CAROK ; test for carrier |
|||
;JP UB_MDIN ; receive data byte (not present in ZMD) |
|||
JP UB_GETCHR ; get character from modem |
|||
JP UB_RCVRDY ; check receive ready |
|||
JP UB_SNDRDY ; check send ready |
|||
JP UB_SPEED ; get speed value for file transfer time |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; UBIOS initialization |
|||
; |
|||
UB_INIT: |
|||
; |
|||
; TODO: |
|||
; - TEST!!! |
|||
; - ADJUST RCVSCL? |
|||
; |
|||
LD HL,3000 ; Smaller receive loop timeout scalar |
|||
LD (RCVSCL),HL ; ... to compensate for BIOS overhead |
|||
; |
|||
; Claim 1 MHz CPU to offset overhead of HBIOS |
|||
LD A,1 |
|||
LD (CPUSPD),A ; Save it |
|||
; |
|||
LD HL,UB_JPTBL |
|||
LD DE,UB_LBL |
|||
JP MINIT_RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Send character on top of stack |
|||
; |
|||
UB_SENDR: |
|||
POP AF ; get character to send from stack |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
LD BC,0012H ; unit 0, func 12h (write char) |
|||
LD E,A ; character to E |
|||
RST 08 |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test and report carrier status, Z set if carrier present |
|||
; |
|||
UB_CAROK: |
|||
XOR A ; not used, always indicate present |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Get a character |
|||
; |
|||
; GETCHR must not block |
|||
; |
|||
UB_GETCHR: |
|||
CALL UB_RCVRDY |
|||
RET NZ |
|||
; Fall thru if char ready |
|||
; |
|||
; MDIN can assume a character is ready |
|||
; |
|||
UB_MDIN: |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
LD BC,0011H ; unit 0, func 12h (write char) |
|||
RST 08 |
|||
LD A,E ; byte received to A |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test for character ready to receive, Z = ready |
|||
; Error code returned in A register |
|||
; *** Error code does not seem to be used *** |
|||
; |
|||
UB_RCVRDY: |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
LD BC,0013H ; unit 0, func 13h (input stat) |
|||
RST 08 |
|||
XOR A ; zero accum ; 4 |
|||
CP E ; CF means not zero ; 4 |
|||
CCF ; CF means zero ; 4 |
|||
RLA ; ZF means not zero ; 4 |
|||
LD A,0 ; report no line errors |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test for ready to send a character, Z = ready |
|||
; |
|||
UB_SNDRDY: |
|||
PUSH BC |
|||
PUSH DE |
|||
PUSH HL |
|||
LD BC,0014H ; unit 0, func 14h (output stat) |
|||
RST 08 |
|||
XOR A ; zero accum ; 4 |
|||
CP E ; CF means not zero ; 4 |
|||
CCF ; CF means zero ; 4 |
|||
RLA ; ZF means not zero ; 4 |
|||
POP HL |
|||
POP DE |
|||
POP BC |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Report baud rate (index into SPTBL returned in register A) |
|||
; |
|||
UB_SPEED: |
|||
LD A,8 ; arbitrarily return 9600 baud |
|||
RET |
|||
; |
|||
;======================================================================= |
|||
;======================================================================= |
|||
; |
|||
; 8250-like UART |
|||
; |
|||
;======================================================================= |
|||
;======================================================================= |
|||
; |
|||
; UART constants |
|||
; |
|||
UA_SNDB EQU 20H ; bit to test for send ready |
|||
UA_SNDR EQU 20H ; value when ready to send |
|||
UA_RCVB EQU 01H ; bit to test for receive ready |
|||
UA_RCVR EQU 01H ; value when ready to receive |
|||
UA_PARE EQU 04H ; bit for parity error |
|||
UA_OVRE EQU 02H ; bit for overrun error |
|||
UA_FRME EQU 08H ; bit for framing error |
|||
UA_ERRS EQU UA_FRME | UA_OVRE | UA_PARE |
|||
; |
|||
; 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). |
|||
; |
|||
UA_JPTBL: |
|||
JP UA_SENDR ; send character (via pop psw) |
|||
JP UA_CAROK ; test for carrier |
|||
;JP UA_MDIN ; receive data byte (not present in ZMD) |
|||
JP UA_GETCHR ; get character from modem |
|||
JP UA_RCVRDY ; check receive ready |
|||
JP UA_SNDRDY ; check send ready |
|||
JP UA_SPEED ; get speed value for file transfer time |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; UART initialization |
|||
; |
|||
UA_INIT: |
|||
LD DE,13000 ; receive loop timeout scalar |
|||
LD (RCVSCL),DE ; ... for UART RCVRDY timing |
|||
; |
|||
LD A,L ; get base I/O port address |
|||
LD (UA_SCP),A ; set port value in SENDR |
|||
LD (UA_GCP),A ; set port value in GETCHR |
|||
ADD A,5 ; UART control port is 5 higher |
|||
LD (UA_RRP),A ; set port value in RCVRDY |
|||
LD (UA_SRP),A ; set port value in SNDRDY |
|||
; |
|||
LD HL,UA_JPTBL |
|||
LD DE,UA_LBL |
|||
JP MINIT_RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Send character on top of stack |
|||
; |
|||
UA_SENDR: |
|||
POP AF ; get character to send from stack |
|||
OUT (0FFH),A ; send to port |
|||
UA_SCP EQU $-1 ; port value |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test and report carrier status, Z set if carrier present |
|||
; |
|||
UA_CAROK: |
|||
XOR A ; not used, always indicate present |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Get a character |
|||
; |
|||
; GETCHR must not block |
|||
; |
|||
UA_GETCHR: |
|||
CALL UA_RCVRDY |
|||
RET NZ |
|||
; Fall thru if char ready |
|||
; |
|||
; MDIN can assume a character is ready |
|||
; |
|||
UA_MDIN: |
|||
IN A,(0FFH) ; read character from port |
|||
UA_GCP EQU $-1 ; port value |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test for character ready to receive, Z = ready |
|||
; Error code returned in A register |
|||
; *** Error code does not seem to be used *** |
|||
; |
|||
UA_RCVRDY: |
|||
IN A,(0FFH) ; get modem status |
|||
UA_RRP EQU $-1 ; port value |
|||
AND UA_RCVB ; isolate ready bit |
|||
CP UA_RCVR ; test it (set flags) |
|||
LD A,0 ; report no line errors |
|||
; |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test for ready to send a character, Z = ready |
|||
; |
|||
UA_SNDRDY: |
|||
IN A,(0FFH) ; get status |
|||
UA_SRP EQU $-1 ; port value |
|||
AND UA_SNDB ; isolate transmit ready bit |
|||
CP UA_SNDR ; test for ready value |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Report baud rate (index into SPTBL returned in register A) |
|||
; |
|||
UA_SPEED: |
|||
LD A,8 ; arbitrarily return 9600 baud |
|||
RET |
|||
; |
|||
; |
|||
; |
|||
UA_BASE DB 00H ; UART base port I/O address |
|||
UA_CTLP DB 00H ; UART control port I/O address |
|||
; |
|||
; |
|||
;======================================================================= |
|||
;======================================================================= |
|||
; |
|||
; WILL SOWERBUTTS ECB USB-FIFO |
|||
; |
|||
;======================================================================= |
|||
;======================================================================= |
|||
; |
|||
UF_BASE EQU 0CH |
|||
UF_DATA EQU (UF_BASE+0) |
|||
UF_STATUS EQU (UF_BASE+1) |
|||
UF_SEND_IMM EQU (UF_BASE+2) |
|||
; |
|||
; 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). |
|||
; |
|||
UF_JPTBL: |
|||
JP UF_SENDR ; send character (via pop psw) |
|||
JP UF_CAROK ; test for carrier |
|||
;JP UF_MDIN ; receive data byte (not present in ZMD) |
|||
JP UF_GETCHR ; get character from modem |
|||
JP UF_RCVRDY ; check receive ready |
|||
JP UF_SNDRDY ; check send ready |
|||
JP UF_SPEED ; get speed value for file transfer time |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; USB-FIFO initialization |
|||
; |
|||
UF_INIT: |
|||
LD DE,12000 ; receive loop timeout scalar |
|||
LD (RCVSCL),DE ; ... for UART RCVRDY timing |
|||
; |
|||
LD A,L ; get base I/O port address (data port) |
|||
LD (UF_SCDP),A ; set data port in SENDR |
|||
LD (UF_GCDP),A ; set data port in GETCHR/MDIN |
|||
INC A ; bump to status port |
|||
LD (UF_RRSP),A ; set status port in RCVRDY |
|||
LD (UF_SRSP),A ; set status port in SNDRDY |
|||
INC A ; bump to send immediate port |
|||
LD (UF_SCIP),A ; set send immed port in SENDR |
|||
; |
|||
LD HL,UF_JPTBL |
|||
LD DE,UF_LBL |
|||
JP MINIT_RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Send character on top of stack |
|||
; |
|||
UF_SENDR: |
|||
|
|||
POP AF ; get character to send from stack |
|||
OUT (0FFH),A ; write to fifo |
|||
UF_SCDP EQU $-1 ; data port |
|||
OUT (0FFH),A ; send immediate |
|||
UF_SCIP EQU $-1 ; send immediate port |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test and report carrier status, Z set if carrier present |
|||
; |
|||
UF_CAROK: |
|||
XOR A ; not used, always indicate present |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Get a character (assume character ready has already been tested) |
|||
; |
|||
; GETCHR must not block |
|||
; |
|||
UF_GETCHR: |
|||
CALL UF_RCVRDY ; check for char ready |
|||
RET NZ ; return if not |
|||
; Fall thru if char ready |
|||
; |
|||
; MDIN can assume a character is ready |
|||
; |
|||
UF_MDIN: |
|||
IN A,(0FFH) ; get char |
|||
UF_GCDP EQU $-1 ; data port |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test for character ready to receive, Z = ready |
|||
; Error code returned in A register |
|||
; *** Error code does not seem to be used *** |
|||
; |
|||
UF_RCVRDY: |
|||
IN A,(0FFH) ; bit 7 = 0 if char avail, = 1 if no char. |
|||
UF_RRSP EQU $-1 ; status port |
|||
RLCA ; bit 0 = 0 if char avail, = 1 if no char. |
|||
AND 00000001B ; A = 0, ZF = 1 if no char, A = 1, ZF = 0 if char avail. |
|||
LD A,0 ; no errors |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Test for ready to send a character, Z = ready |
|||
; |
|||
UF_SNDRDY: |
|||
IN A,(0FFH) ; bit 0 = 0 if space avail, = 1 if full |
|||
UF_SRSP EQU $-1 ; status port |
|||
AND 00000001B ; A = 0, ZF = 1 if space avail, A = 1, ZF = 0 if full. |
|||
RET |
|||
; |
|||
;----------------------------------------------------------------------- |
|||
; |
|||
; Report baud rate (index into SPTBL returned in register A) |
|||
; |
|||
UF_SPEED: |
|||
LD A,8 ; arbitrarily return 9600 baud |
|||
RET |
|||
; |
|||
END |
|||
@ -0,0 +1,637 @@ |
|||
; |
|||
|
|||
TITLE ZMDHDR.Z80 - 09/29/88 - ZMD Configuration Header |
|||
; Copyrighted (c) 1987, 1988 |
|||
; Robert W. Kramer III |
|||
|
|||
PAGE |
|||
;- -; |
|||
; Update History ; |
|||
; ; |
|||
; Date Release Comments ; |
|||
; -------- ------- ---------------------------------------------- ; |
|||
; ; |
|||
; 09/29/88 v1.50 - Changed file descriptor table. (Sorry, but as ; |
|||
; many times as I am required to reassemble the ; |
|||
; ZMD system, it saves alot of time for me). ; |
|||
; 03/18/88 v1.49 - No change(s) were made to this file ; |
|||
; 03/13/88 v1.48 - Added STDBUF switch to enable/disable automatic ; |
|||
; calculation of memory available for DBUF. If ; |
|||
; enabled, CHKTPA will set OUTSIZ with an even ; |
|||
; paged maximum memory comparison word according ; |
|||
; to the address contained at location 6 and 7. ; |
|||
; The value set as end of program during assembly ; |
|||
; is subtracted from it. If BYE is NOT running, ; |
|||
; an additional 806H is subtracted. The LSB of ; |
|||
; the result is discarded and the new even paged ; |
|||
; value is stored for later comparison as maximum ; |
|||
; Read/Write memory available for disk buffer ; |
|||
; operations. ; |
|||
; ; |
|||
; * * SPECIAL NOTE * * MOST ALL systems will benefit by enabling this ; |
|||
; feature. Some special CP/M systems which place ; |
|||
; buffers below location (6 and 7), may need to ; |
|||
; disable this feature in which case DBUF size ; |
|||
; will be set to 16k. This fix consumed 1 more ; |
|||
; byte in the switch/value table below. Previous ; |
|||
; configuration headers are incompatible with this; |
|||
; release. Additional program code is 9 bytes. ; |
|||
; (See explaination at STDBUF:) ; |
|||
; ; |
|||
; 02/25/88 v1.47 - No change(s) made to configuration file ; |
|||
; 01/27/88 v1.46 - No change(s) made to configuration file ; |
|||
; 01/17/88 v1.45 - First public release ; |
|||
; 11/19/87 v1.00 - Initial version ; |
|||
;- -; |
|||
|
|||
;-------------------------------------------------------------------------; |
|||
; Introduction | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; This document is a detailed listing of all the program option toggles |
|||
; and their functions within the ZMD environment which when used in |
|||
; conjunction with the source listings, install program and reference |
|||
; manual, provide all the necessary documentation to support program |
|||
; maintenance. |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; EQUates Header | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
INCLUDE EQUATES.INS ; Include system constant definitions |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; PUBLIC Declarations: | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
PUBLIC ACCMAP,ASKAREA,ASKIND,CLRSCRN,CLRSTR,DESWAIT,DRV |
|||
PUBLIC LOCOFF,MHZ,MINKSPD,MSPEED,PAGLEN,PRDRV,PRUSR,USR,WHEEL |
|||
PUBLIC WRAP,WRTLOC,CONOUT,MDINST,MDINP,MDOUTST,MDCARCK,MDOUTP |
|||
PUBLIC KNDTBL,TYPTBL,MAXTYP,DESCRIB,FORNAM,MSGDESC,DSTAMP |
|||
PUBLIC INCLDU,UNINIT,DRIVE,USER,LOGNAM,SETAREA,CLOCK,RTC |
|||
PUBLIC TIMEON,CREDIT,EDATE,DSPTOS,STDBUF |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; EXTERNAL Declarations: | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
EXTRN MONTH,DAY,YEAR,HOUR,MINUTE,DEST,FILE,ZMDNAM,INSNAM |
|||
EXTRN MAPNAM,PRGUTL,PUBFOR,PUBNEW,SYSFOR,PUBFOR,INSNAM |
|||
EXTRN SYSNEW,FCBCLR,FCBLOG,TEMPFIL,BCDBIN,TIMBUF,DUD,DUU |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Program configuration starts here | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; Options that are most often changed are marked with ';*' at the start of |
|||
; the comment line for that option. Simple systems not using time clocks, |
|||
; user logs, etc. will keep most of those 'NO'. RCPM systems running the |
|||
; usual bulletin board systems, etc., will change most of those to 'YES'. |
|||
; |
|||
MHZ: DB 10 ; Microprocessor speed - use integer 1,4,5, etc. |
|||
;MSPEED: DW 003CH ; Location of modem speed indicator byte |
|||
MSPEED: DW 0600H ; Location of modem speed indicator byte |
|||
; [WBW] placed in I/O overlay |
|||
|
|||
WRTLOC: DB NO ; Set/reset WRTLOC so BYE won't hang up. Check |
|||
LOCOFF: DB 12 ; your BBS documentation - many modern systems |
|||
; don't need WRTLOC. If unsure, set WRTLOC to NO. |
|||
; Code to set and reset WRTLOC assumes the WRTLOC |
|||
; byte to be located "LOCOFF" bytes from the JP |
|||
; COLDBOOT instruction at the beginning of the BYE |
|||
; BIOS jump table. (YES for MBBS and PBBS). |
|||
|
|||
STDBUF: DB NO ; If the size of your TPA cannot be calculated by |
|||
; using one of the two following methods, disable |
|||
; this by setting to NO. ZMD will Automatically |
|||
; calculate the maximum disk buffer size allowed. If |
|||
; enabled, CHKTPA will determine whether or not |
|||
; BYE is running, if so uses (0006)-1. Else |
|||
; subtracts 806H from (0006). If disabled, DBUF |
|||
; setting will be used as default (Normally set to |
|||
; 16k). Either way, if descriptions are allowed, |
|||
; the total number of uploads allowed is set based |
|||
; on the value of OUTSIZ divided by maximum bytes |
|||
; per description entry. |
|||
|
|||
DESWAIT:DB 2 ; This is the number of minutes of inactivity during |
|||
; an upload description or Help Guide prompt before |
|||
; logging aborting the input routine. If the |
|||
; caller was entering a description, the current |
|||
; description buffer is written to disk before |
|||
; resetting your BYE program's disk write lock flag |
|||
; (WRTLOC), if enabled. |
|||
|
|||
MINKSPD:DB 1 ; Minimum speed acceptable for 1k packet file |
|||
; transfers. If you are on a network such as PC |
|||
; Pursuit, and are able to RECEIVE incoming calls, |
|||
; set this byte to 1. The delays these networks |
|||
; use to send data back and forth make 1k packets |
|||
; advantageous to even 300 bps users. If you are |
|||
; not on a network such as PC Pursuit, it's simply |
|||
; a matter of preference, but why not let the 300 |
|||
; bps callers experience the 1k packet transfers? |
|||
; (1 = 300, 5 = 1200, 6 = 2400, ..., 9 = 19,200) |
|||
|
|||
BUFSIZ: DB 16 ; Normal disk systems can transfer 16k from |
|||
; computer to disk in 2-3-4 seconds and less. Some |
|||
; very slow 5-1/4" floppy systems (such as North |
|||
; Star) may take up to 20-30 seconds to transfer |
|||
; 16k. This would cause several timeouts at 10 |
|||
; seconds each. If you experience any timeouts, |
|||
; try changing BUFSIZ to something smaller, perhaps |
|||
; 8k or even 4k. |
|||
|
|||
CLRSCRN:DB NO ; Yes, you want ZMD to clear your screen locally |
|||
CLRSTR: DB 1AH,00H ; during display of batch file transfers and all |
|||
DB 00H,00H ; the help menus. If you set CLRSCRN to YES, enter |
|||
DB 00H,00H ; your clear screen sequence in the 6 bytes aside. |
|||
DB '$' ; (If your terminal uses ^Z, leave as is, 1AH = ^Z) |
|||
|
|||
PAGLEN: DB 24 ; This is the number of lines to display in between |
|||
; [more] pauses. (Set to 0 to disable pauses). |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Timekeeping Considerations | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; If you have a clock installed (either in your BYE program or internal), |
|||
; set the following switches to your liking. If running ZMD without a |
|||
; clock, set these all NO. |
|||
; |
|||
CLOCK: DB NO ; Clock/date reader code installed in BYE program |
|||
RTC: DB NO ; Clock/date reader code installed at RTCTIM: |
|||
|
|||
TIMEON: DB NO ; Restrict downloads to maximum time allowed |
|||
MAXMIN: DB 60 ; Total minutes allowed for downloads. This should |
|||
; be set if TIMEON is YES and CLOCK is NO. |
|||
DSPTOS: DB NO ; Yes to display 'Online nn minutes' messages |
|||
LHOUR: DW 0000H ; Logon hour address (If RTC). LHOUR+2 = logon |
|||
; minute address. |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Bit Map Layout | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; The following byte contains information corresponding to the filename |
|||
; bytes of the file being considered for transfer. Enabling any of the |
|||
; options causes ZMD to look at the high bit of the byte position |
|||
; indicated below (F1=filename byte 1, T2=file type byte 2, etc). These |
|||
; restrictions are always bypassed when using ZCPR and the WHEEL is set. |
|||
; |
|||
; Bit: 76543210 ; Correspond to definitions below |
|||
; |||||||| |
|||
ACCMAP: DB 11111101B ; Set any bits of this byte according |
|||
; __________\______/ ; to your own preference. |
|||
; / |
|||
; |
|||
; 7 | F1 | File not for distribution. If file is a ARK/ARC/LBR |
|||
; | | file, individual members may be downloaded (no Batch) |
|||
; 6 | F3 | File can be downloaded regardless of user's access |
|||
; 5 | T2 | $SYS files not sent or reported |
|||
; 4 | T3 | .??# files with labels not sent |
|||
; 3 | T1/2/3 | .COM files not sent or reported |
|||
; 2 | T1/2/3 | Rename .COM to .OBJ and .PRL to .OBP on receive |
|||
; 1 | -- | RESERVED FOR FUTURE USE |
|||
; 0 | T1/2/3 | .SYS, .NDR, .RCP, file extents not accepted. (ZCPR) |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; ZCMD/ZCPR | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; If using ZCPR low memory bytes to keep track of maximum drive and user, |
|||
; set USEMAX to yes. ZMD will use the values at locations DRIVMAX and |
|||
; USRMAX for maximum drive/user. If USEMAX is NO, hardcode MAXDRV and |
|||
; MAXUSR to your own requirements. |
|||
; |
|||
WHEEL: DW 3EH ; Location of ZCPR wheel byte |
|||
USEMAX: DB NO ;*Use values at DRIVMAX and USRMAX for maximum |
|||
; (Else use MAXDRV and MAXUSR values) |
|||
DRIVMAX:DW 3DH ; ZCPR maximum drive memory byte |
|||
USRMAX: DW 3FH ; ZCPR maximum user memory byte |
|||
MAXDRV: DB 16 ; Maximum download drive allowed |
|||
MAXUSR: DB 16 ; Maximum download user allowed |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Access Restrictions | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; If ACCESS is YES, ZMD will inspect AFBYTE (located ACBOFF bytes from JP |
|||
; COLDBOOT) for the following flag data: |
|||
; |
|||
; |
|||
; Bit: 7 6 5 4 3 2 1 0 |
|||
; | | | | | | | | |
|||
; Privileged user ---* | | | | | | | |
|||
; Upload -----* | | | | | | |
|||
; Download -------* | | | | | * Of these bits, only 3, 5, 6 |
|||
; CP/M ---------+ | | | | and 7 are used by ZMD. Bit |
|||
; Write -----------* | | | numbers are powers of 2, with |
|||
; Read -------------+ | | bit 0 being least significant |
|||
; BBS ---------------+ | bit of byte. |
|||
; System -----------------+ |
|||
; |
|||
; |
|||
ACCESS: DB NO ;*Yes, your system sets BYE's bit-mapped flag |
|||
; register to restrict user's ability to upload, |
|||
; download, use the 'RM' option to upload message |
|||
; files to your BBS's message base, or to use the |
|||
; 'RW' option for 'privileged user' upload without |
|||
; being required to give upload descriptions. |
|||
|
|||
ACBOFF: DB 21 ; If you set ACCESS to YES, you 'might' need to |
|||
; set this to reflect the number of bytes from JP |
|||
; COLDBOOT to ACCESS byte. In most cases, leave |
|||
; alone. |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Upload Configurations | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
MSGFIL: DB NO ; Some BBS's allow callers to upload preformatted |
|||
; text files which are appended to the message |
|||
; base. (MBBS and PBBS are examples of this). If |
|||
; you're running MBBS or PBBS and wish to support |
|||
; this, simply set MSGFIL to YES. Message file |
|||
; uploads go to PRDRV and PRUSR. |
|||
|
|||
HIDEIT: DB NO ; Yes, make all normal uploads $SYS files. This |
|||
; way, new uploads will not appear in a DIRectory |
|||
; listing and cannot be viewed or even downloaded |
|||
; until they are cleared by SYSOP. (New uploads |
|||
; will show up when the WHEEL byte is ON and a $S |
|||
; option is used to show SYSTEM files. Use the $O |
|||
; option to list ONLY $SYS files. Reference will |
|||
; be made to these files in the in the NEW and FOR |
|||
; listings if those features are enabled). Private |
|||
; uploads, and uploads made with the WHEEL byte |
|||
; set are NOT made $SYS. You can use POWER or |
|||
; NSWEEP to set to $DIR. |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Upload Routing Options | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; The following equates determine what drive/user area uploads will be sent |
|||
; to. If you prefer to enable upload routing (ASKAREA set YES), you will |
|||
; have to set MAXTYP to the letter of the highest category you wish to |
|||
; support, and configure TYPTBL: and KNDTBL: tables below for your own |
|||
; system. Do NOT set ASKAREA and SETAREA both to YES. |
|||
; |
|||
ASKAREA:DB NO ;*Yes, you want upload routing to multiple drive |
|||
; and user areas. The caller will be asked what |
|||
; the file (or files) he is uploading are for and |
|||
; his uploads will then be forwarded to the |
|||
; appropriate area. You will need to set up the |
|||
; categories at KNDTBL: for your own system and |
|||
; set the drive/user area each category belongs on |
|||
; at label TYPTBL:. There can be up to 26 different |
|||
; drive/user and category combinations. This applies |
|||
; for both private and normal uploads. Upload |
|||
; routing is disabled when the WHEEL byte is set, |
|||
; in which case, normal uploads will go to the |
|||
; current drive/user area and private uploads will |
|||
; go to the drive/user equated at PRDRV and PRUSR. |
|||
|
|||
SETAREA:DB NO ;*Yes, you wish to have all regular uploads sent |
|||
DRV: DB 'B' ; to the drive/user equated at DRV and USR to left. |
|||
USR: DB 0 ; If WHEEL byte is set, regular uploads will go to |
|||
; the current or specified drive/user. Unless you |
|||
; ASKAREA is YES, all private files uploaded with |
|||
; the 'RP' option will be sent to PRDRV and PRUSR |
|||
; regardless of WHEEL status. |
|||
|
|||
PRDRV: DB 'H' ;*This is the drive/user area where ALL files sent |
|||
PRUSR: DB 15 ;*to the sysop with the 'RP' option will go (unless |
|||
; ASKAREA below is YES). This permits experimental |
|||
; files, replacement and/or proprietary programs to |
|||
; be sent to an area only accessible by the sysop. |
|||
; This is also the drive and user area where message |
|||
; files are uploaded, if MSGFIL is set YES. (If |
|||
; ASKAREA is YES, this is the drive/user where |
|||
; uploads will go when 'RP' is specified, and WHEEL |
|||
; is set). (If MSGDESC is YES, this is the drive |
|||
; and user area the FOR text file will be placed |
|||
; before appending it to the BBS system's message |
|||
; base). |
|||
|
|||
CREDIT: DB NO ;*Yes, callers are given credit for the amount of |
|||
; time they spend uploading non-private files. A |
|||
; caller who spends 30 minutes sending an upload |
|||
; gets 30 minutes added to his TLOS. (You must |
|||
; set either CLOCK or TIMEON to YES to use this |
|||
; feature). |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Upload Description Options | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; This section has to do with upload descriptions. If you do not intend |
|||
; on implementing upload descriptions, set DESCRIB and MSGDESC to NO. The |
|||
; rest of these values are then ignored. If using descriptions, set ONLY |
|||
; one of these to YES, not both. |
|||
; |
|||
MSGDESC:DB NO ; Yes, your BBS system supports message uploads, |
|||
; and you prefer upload descriptions to be placed |
|||
; in your BBS message system (set DESCRIB NO). |
|||
; MBBS users need to install MFMSG.COM with the |
|||
; MBBSINIT program. Then set your BYE program to |
|||
; know about message file uploads by setting the |
|||
; MSGFIL option in BYE/MBYE to YES. If set YES, |
|||
; ZMD will produce a FOR text file when writing |
|||
; upload descriptions. This FOR file will go to |
|||
; the drive and user area equated at PRDRV and |
|||
; PRUSR just before being appended to your BBS |
|||
; system's message base. |
|||
|
|||
DESCRIB:DB NO ;*Yes, requiring users to provide descriptions for |
|||
; any files they upload. These descriptions will |
|||
; be added to the current FOR file where they can |
|||
; be viewed by callers with the ZFORP utility. |
|||
; Sysop can add new descriptions with the ZFORS |
|||
; utility (See ZMD.WS for more information on ZMD |
|||
; support files). Uploads sent to the SYSOP private |
|||
; upload area will not be require descriptions, nor |
|||
; will files uploaded with the 'RW' option - user |
|||
; must be a privileged user (bit 7 in ACCESS byte |
|||
; set) or have WHEEL access and PUPOPT must be set |
|||
; YES to use the 'RW' option. |
|||
|
|||
FORNAM: DB 'FOR ' ; Description text file (Must be 11 bytes) |
|||
DRIVE: DB 'A' ;*If using with DESCRIB set YES, you must indicate |
|||
USER: DB 14 ;*what drive/user you want the 'FOR' file to be |
|||
; placed. |
|||
|
|||
; |
|||
; If DESCRIB above is set to YES, you'll have to tell ZMD what information |
|||
; you want included in the first line of each description. Code is included |
|||
; in ZMD to place all (any) information in the upload description header in |
|||
; in the same column position no matter what the filename or file category |
|||
; length is. The following illustrates a full implementation of DESCRIB. |
|||
; |
|||
; Example upload description header: |
|||
; |
|||
; ----- |
|||
; ZMD150.LBR - Communications (C3:) Rcvd: 09/21/88 |
|||
; / / / |
|||
; _______/ ______/ _______/ |
|||
; ASKIND INCLDU DSTAMP |
|||
; |
|||
; |
|||
ASKIND: DB NO ;*Yes, ask for the category of uploads and write it |
|||
; into the upload description header. If you set |
|||
; this to YES, make sure you set MAXTYP below to |
|||
; the highest letter choice you wish to support and |
|||
; edit the text at KNDTBL: up to and including your |
|||
; MAXTYP setting. (Used only with DESCRIB). |
|||
|
|||
INCLDU: DB YES ;*Yes, include the drive/user area of the uploaded |
|||
; file into the upload description header. |
|||
; (Used only with DESCRIB). |
|||
|
|||
DSTAMP: DB YES ;*Yes, include the date the upload was received into |
|||
; the upload description header. (NO if no clock) |
|||
; (Used only with DESCRIB). |
|||
|
|||
PUPOPT: DB YES ;*Yes, description request of file upload will be |
|||
; skipped when "RW" is used in the ZMD command line |
|||
; (i.e. ZMD RW FILE.EXT). This command may only be |
|||
; used by those considered "priviledged" users on |
|||
; your system or WHEEL users. Uploads of this type |
|||
; will be tagged in the ZMD.LOG file as private, so |
|||
; as not to display with the NEW command. (See |
|||
; ACCESS equate description above for information |
|||
; on 'priviledged' users). |
|||
|
|||
WRAP: DB 64 ; Column position where word wrap will occur. If |
|||
; you are using MSGDESC and have problems with an |
|||
; 'Invalid format' error from MFMSG.COM, try setting |
|||
; WRAP to something smaller, like 62 or 63. (Word |
|||
; wrap can be disabled by the user with ^W during |
|||
; description entry. Enter 72 here to disable |
|||
; completely). |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Special Sysop Downloads | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
SPLDRV: DB 'H' ;*Drive/user area for downloading private files |
|||
SPLUSR: DB 14 ;*from sysop. This permits him to put a special |
|||
; file in this area, then leave a private note |
|||
; to that person mentioning the name of the file |
|||
; and how to download it (ZMD SP filename.ext). |
|||
; Although anybody 'could' download that program, |
|||
; they don't know what (if any) files are there. |
|||
; A high degree of security exists, while the |
|||
; SYSOP still has the ability to make special |
|||
; files available. Thus any person can be a |
|||
; temporary 'privileged user'. |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; File Transfer Log | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
LOGCAL: DB NO ;*ZMD.LOG is produced if LOGCAL is set YES. All |
|||
; file transfers are logged. You can then use |
|||
; ZNEWP.COM to show listings of recent uploads. |
|||
EDATE: DB NO ; Yes, show date in ZMD.LOG in dd/mm/yy format |
|||
; instead of mm/dd/yy format. |
|||
|
|||
LOGNAM: DB 'ZMD LOG' ; File transfer log (Must be 11 bytes) |
|||
LOGDRV: DB 'A' ;*Drive to find ZMD.LOG on. |
|||
LOGUSR: DB 14 ;*User area to find ZMD.LOG on. |
|||
|
|||
LSTCLR: DB 'LASTCALR???' ; Last caller file (Must be 11 bytes) |
|||
LASTDRV:DB 'A' ;*Drive to find LASTCALR??? file on. |
|||
LASTUSR:DB 14 ;*User area to find LASTCALR??? file on. |
|||
LCNAME: DB 0 ;*Position of last caller's name in the LASTCALR??? |
|||
; file. (MBBS is 11, PBBS is 0). |
|||
|
|||
LOGLDS: DB NO ;*Count number of up/down loads since login. Your |
|||
UPLDS: DW 0054H ; BBS program can check UPLDS and DNLDS when a user |
|||
DNLDS: DW 0055H ; logs out and update either the user's file or a |
|||
; file for this purpose. You can either modify |
|||
; your BBS entry program to check the LASTCALR file |
|||
; before updating and then update (risky), or make |
|||
; a separate program that BYE calls when logging off |
|||
; a user (preferred). (YES for PBBS). Clear UPLDS |
|||
; and DNLDS to 0 from your BBS program when somebody |
|||
; logs in. NOTE: Clear ONLY when a user logs in, |
|||
; not when he re-enters the BBS program from CP/M. |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; File Descriptors | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; This table defines the text to be included in upload description headers |
|||
; (DESCRIB and ASKIND) and/or defines categories for uploading to multiple |
|||
; drive/user areas (If ASKAREA and NOT SETAREA). Change as desired, if |
|||
; this list is not suitable. Do NOT remove any of the text at KNDTBL:. |
|||
; Simply edit the text below up to/and including your MAXTYP setting. |
|||
; MAXTYP below must be set to whatever letter your maximum choice will be. |
|||
; Make sure you leave all the following categories EXACTLY 31 bytes long |
|||
; (29 bytes of text plus the CR,LF equals 31) or you will be CERTAIN to |
|||
; have problems with the double column formatting later on in the program. |
|||
; |
|||
MAXTYP: DB 'W' ; Letter of highest category you will support. |
|||
|
|||
KNDTBL: DB ' A) - BBS Lists, PC Pursuit ',CR,LF |
|||
DB ' B) - CP/M Modem Program ',CR,LF |
|||
DB ' C) - CP/M Utility ',CR,LF |
|||
DB ' D) - CP/M Lbr, Ark, Catalog',CR,LF |
|||
DB ' E) - CP/M Plus Specific ',CR,LF |
|||
DB ' F) - CP/M Games & Humor ',CR,LF |
|||
DB ' G) - CP/M Wordprocessing ',CR,LF |
|||
DB ' H) - CP/M Printer Utility ',CR,LF |
|||
DB ' I) - CP/M OS Enhancement ',CR,LF |
|||
DB ' J) - CP/M BBS Software ',CR,LF |
|||
DB ' K) - CP/M Assemb/Disassemb ',CR,LF |
|||
DB ' L) - CP/M Language (Other) ',CR,LF |
|||
DB ' M) - Turbo Pascal ',CR,LF |
|||
DB ' N) - dBase & Database ',CR,LF |
|||
DB ' O) - "C" ',CR,LF |
|||
DB ' P) - Text & Information ',CR,LF |
|||
DB ' Q) - DOS Modem Program ',CR,LF |
|||
DB ' R) - DOS BBS Software ',CR,LF |
|||
DB ' S) - DOS Language ',CR,LF |
|||
DB ' T) - DOS Assemb/Disassemb ',CR,LF |
|||
DB ' U) - DOS Lbr, Arc, Catalog ',CR,LF |
|||
DB ' V) - DOS Wordprocessing ',CR,LF |
|||
DB ' W) - DOS Printer Utility ',CR,LF |
|||
DB ' X) - DOS Games & Humor ',CR,LF |
|||
DB ' Y) - DOS Application ',CR,LF |
|||
DB ' Z) - DOS Utility ',CR,LF |
|||
DB 0 ; leave the table terminator alone. |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Upload Routing Table | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; If ASKAREA is set YES, then set these areas up to match the message text |
|||
; in KNDTBL: above. Note that PRIVATE uploads may be sent to a different |
|||
; drive as well as a different user area. Each entry is expressed as |
|||
; 'drive letter',user area. Simply set MAXTYP above to the highest |
|||
; letter choice supported. (Do NOT comment out any of the following |
|||
; storage bytes). |
|||
; |
|||
; _________ |
|||
; NOTE: / A \ <--- 'A' Corresponds to category 'A' above |
|||
; 'A',1,'B',15, |
|||
; \ / \ / |
|||
; Normal upload --+ | |
|||
; Private upload -------+ |
|||
; |
|||
|
|||
TYPTBL: |
|||
; _________ _________ _________ _________ |
|||
; / A \ / B \ / C \ / D \ |
|||
DB 'B',1,'F',15, 'B',0,'F',15, 'B',2,'F',15, 'B',4,'F',15 |
|||
; _________ _________ _________ _________ |
|||
; / E \ / F \ / G \ / H \ |
|||
DB 'B',5,'F',15, 'B',6,'F',15, 'C',0,'F',15, 'C',1,'F',15 |
|||
; _________ _________ _________ _________ |
|||
; / I \ / J \ / K \ / L \ |
|||
DB 'C',2,'F',15, 'C',3,'F',15, 'A',1,'F',15, 'A',5,'F',15 |
|||
; _________ _________ _________ _________ |
|||
; / M \ / N \ / O \ / P \ |
|||
DB 'A',2,'F',15, 'A',3,'F',15, 'A',4,'F',15, 'A',6,'F',15 |
|||
; _________ _________ _________ _________ |
|||
; / Q \ / R \ / S \ / T \ |
|||
DB 'E',0,'F',15, 'E',1,'F',15, 'E',2,'F',15, 'E',3,'F',15 |
|||
; _________ _________ _________ _________ |
|||
; / U \ / V \ / W \ / X \ |
|||
DB 'F',0,'F',15, 'F',1,'F',15, 'F',2,'F',15, 'F',3,'F',15 |
|||
; _________ _________ |
|||
; / Y \ / Z \ |
|||
DB 'G',0,'F',15, 'H',0,'F',15 |
|||
|
|||
; |
|||
;=========================================================================; |
|||
;>>>>>>>>>>>>>> DO NOT CHANGE ANYTHING BEYOND THIS POINT <<<<<<<<<<<<<<<| |
|||
;=========================================================================; |
|||
;-------------------------------------------------------------------------; |
|||
; Version Identification | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; If/when INSTALL is first ran, it checks these next 3 bytes to make sure |
|||
; it is installing the proper version of ZMD.COM. If these bytes do not |
|||
; match, the INSTALL procedure will abort. (Don't change this one) |
|||
; |
|||
INSVERS:DB '150' ; Don't change this one |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; User Definable Storage Bytes | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; If you make changes to the configuration table, make them here. You |
|||
; are allowed 2 bytes for switches, or storage for an address, etc. Any |
|||
; changes before this point and ZINSTL will not run. |
|||
; |
|||
SPARE1: DB 0 ; User definable storage |
|||
SPARE2: DB 0 |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Clock/Date Reader Code | |
|||
;-------------------------------------------------------------------------; |
|||
; |
|||
; Install your clock/date reader code here. RTCTIM gets called to retrieve |
|||
; the current date and time. All values must be stored in binary form. |
|||
; A 6 byte clock buffer called TIMBUF can be used as a work area. Call |
|||
; BCDBIN to convert your BCD (Binary Coded Decimal) value in A to binary |
|||
; value in A. Delete all ';<=' lines; after installing your custom |
|||
; routine. |
|||
; |
|||
ORG 4FEH ; Allow 130 bytes for RTC insert |
|||
; |
|||
RTCTIM::LD A,0 ;<= Delete lines if reader code installed |
|||
LD (MONTH),A ;<= Current month (1-12) |
|||
LD (DAY),A ;<= Current date (1-31) |
|||
LD (YEAR),A ;<= Current year (0-99) |
|||
LD (MINUTE),A ;<= Current minute (0-59) |
|||
LD (HOUR),A ;<= Current hour (0-23) |
|||
RET |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Input/Output Patch Area | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
ORG 580H ; Modem routine starts here |
|||
|
|||
CONOUT: JP 0000H ; BIOS local console output routine address |
|||
MINIT: JP 0000H ; Startup initialization routine |
|||
UNINIT: JP 0000H ; Exit uninitialize routine |
|||
MDOUTP: JP 0000H ; Send character out modem |
|||
MDCARCK:JP 0000H ; Test for carrier |
|||
MDINP: JP 0000H ; Get character from modem |
|||
MDINST: JP 0000H ; Check receive ready |
|||
MDOUTST:JP 0000H ; Check send ready |
|||
|
|||
;ORG 600H ; Allow 128 bytes for I/O overlay |
|||
ORG 1000H ; Allow for large I/O overlay |
|||
|
|||
|
|||
; |
|||
; Overlay ends here |
|||
; |
|||
|
|||
@ -0,0 +1,517 @@ |
|||
; |
|||
|
|||
TITLE ZNEWP.Z80 - 09/29/88 - ZMD Public Transfer Log Utility |
|||
; Copyrighted (c) 1987, 1988 |
|||
; Robert W. Kramer III |
|||
|
|||
;- -; |
|||
; Update History ; |
|||
; ; |
|||
; Date Release Comments ; |
|||
; -------- ------- ---------------------------------------------- ; |
|||
; ; |
|||
; 09/29/88 v1.50 - No change(s) made to this file ; |
|||
; 03/18/88 v1.49 - No change(s) made to this file ; |
|||
; 03/13/88 v1.48 - Redefined buffer table at end of programs. STACK; |
|||
; and filename buffers now EQUated with offsets ; |
|||
; from the last switch/toggle in program instead ; |
|||
; of with DS directive. ; |
|||
; - Some systems which do NOT have an interrupt ; |
|||
; driven keyboard may have noticed problems when ; |
|||
; an invalid key was entered in the ZNEWP, ZFORP ; |
|||
; and ZMDEL programs. In ZNEWP and ZFORP, if a ; |
|||
; CR was entered to pause the output, output was ; |
|||
; limited to one line at a time per key pressed. ; |
|||
; If an invalid key was hit, output would have ; |
|||
; remained in a paused state until one of the ; |
|||
; abort keys were pressed. This was difficult to ; |
|||
; find since my keyboard is interrupt driven and ; |
|||
; I could not duplicate the problem on my own ; |
|||
; system. ; |
|||
; 02/25/88 v1.47 - Fixed to determine if CLOCK is enabled before ; |
|||
; inserting spaces after 8 'date' positions. ; |
|||
; (Keeps caller name from being split with an ; |
|||
; extra space at column 52). ; |
|||
; 01/27/88 v1.46 - Now uses BDOS call 35 to calculate virtual size ; |
|||
; of log file (in records) which is returned in ; |
|||
; bytes 33 and 34 of log FCB. It then uses BDOS ; |
|||
; call 33 to compute the extent of the specified ; |
|||
; record number (bytes 33 and 34 of log FCB), ; |
|||
; decrements the record number for next random ; |
|||
; read and displays current record. This method ; |
|||
; of reading the log file allows for files up to ; |
|||
; 8,388,480 bytes in size to be displayed at an ; |
|||
; instant. ; |
|||
; 01/17/88 v1.45 - First public release ; |
|||
; 11/01/87 v1.00 - Initial version ; |
|||
;- -; |
|||
|
|||
;-------------------------------------------------------------------------; |
|||
; EXTERNAL Declarations: | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
EXTRN CKABRT,CLEARIT,DBUF,ERXIT,EXIT,ILPRTB,LINCNT,MODE |
|||
EXTRN NOFILE,NOLOG,OLDDRV,OLDUSR,PRINTV,PRIVATE,RECAR1 |
|||
EXTRN RECDR1,RENFCB,RSDMA,SHONM4,STACK,TYPE,WHLCHK |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Program Starts Here | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
.Z80 |
|||
ASEG |
|||
ORG 100H ; Program starts |
|||
JP BEGIN ; Jump around configuration table |
|||
INCLUDE ZMDHDR.Z80 ; Include the ZMD header overlay |
|||
.REQUEST ZMDSUBS ; Include the ZMD subroutines |
|||
|
|||
; |
|||
; |
|||
; Save CP/M stack, initialize new one for this program |
|||
; |
|||
BEGIN: LD (STACK),SP ; Save return address to CCP |
|||
LD SP,STACK ; Initialize new one for this program |
|||
|
|||
; |
|||
; Get current drive/user |
|||
; |
|||
LD A,255 ; Get current user |
|||
CALL RECAR1 |
|||
LD (OLDUSR),A ; Store it |
|||
LD C,CURDRV ; Get current drive |
|||
CALL BDOS |
|||
LD (OLDDRV),A ; Store it |
|||
|
|||
; |
|||
; Tell em who we are |
|||
; |
|||
LD A,255 ; Need this so discrepency check will |
|||
LD (MODE),A ; Leave clock settings alone in case local |
|||
LD HL,PUBNEW ; Point to this filename |
|||
CALL PRINTV ; Display it |
|||
|
|||
LD A,(LOGCAL) ; See if log file enabled |
|||
OR A |
|||
JP Z,NOLOG ; Don't run program if not |
|||
|
|||
CALL ILPRTB |
|||
DB '(S to Pause - C K or X Abort)' |
|||
DB CR,LF,LF |
|||
DB 0 |
|||
|
|||
LD A,9 ; Leave program name on first screen |
|||
LD (LINCNT),A |
|||
|
|||
; |
|||
; If WHEEL byte set, check to see if 'A' specified in command tail. If |
|||
; it is, set switch to display entire transfer log |
|||
; |
|||
CALL WHLCHK ; WHEEL byte set? |
|||
JP Z,BEGIN2 ; No don't look for options |
|||
LD A,(FCB+1) ; Get possible option |
|||
CP 'A' ; Want to show all of file? |
|||
JP NZ,BEGIN2 ; No |
|||
LD A,1 |
|||
LD (SHOWALL),A ; Set to show all entries |
|||
LD A,8 |
|||
LD (LINCNT),A |
|||
|
|||
; |
|||
; See if user wants file displayed 'nonstop' ($N) |
|||
; |
|||
BEGIN2: LD HL,FCB+1 ; Get first character on command line |
|||
LD A,(HL) ; Into A |
|||
CP '$' ; Must specify '$' first |
|||
JP NZ,OPNLOG ; Nope, continue normal |
|||
INC HL ; Point to next byte |
|||
LD A,(HL) ; Into A for comparison |
|||
CP 'N' ; 'N' for nonstop display? |
|||
JP NZ,OPNLOG ; No |
|||
LD A,0 |
|||
LD (PAGLEN),A ; Else disable page pauses |
|||
|
|||
; |
|||
; Set drive/user to the log file area and open ZMD.LOG |
|||
; |
|||
OPNLOG: LD A,(LOGUSR) ; Set user area to ZMD.LOG area |
|||
CALL RECAR1 |
|||
LD A,(LOGDRV) ; Set drive to ZMD.LOG area |
|||
CALL RECDR1 |
|||
|
|||
LD HL,FILE ; Destination is internal FCB |
|||
LD DE,LOGNAM ; For log filename |
|||
CALL RENFCB ; Initialize and rename |
|||
|
|||
LD DE,FILE |
|||
LD C,OPEN ; Open log file |
|||
CALL BDOS |
|||
INC A ; Check for no open |
|||
LD HL,FILE+1 |
|||
JP Z,NOFILE ; No file, exit |
|||
|
|||
; |
|||
; See if special sysop access was allowed/requested. Display enabled |
|||
; message if so. |
|||
; |
|||
LD A,(SHOWALL) ; Showing entire transfer log? |
|||
OR A |
|||
JP Z,SHOHDR ; No, display header as usual |
|||
CALL ILPRTB |
|||
DB CR |
|||
DB '-- Sysop access enabled --',0 |
|||
JP CALCSIZ |
|||
|
|||
; |
|||
; Display all applicable field titles |
|||
; |
|||
SHOHDR: CALL ILPRTB |
|||
DB CR |
|||
DB 'D/u Filename Size Speed ',0 |
|||
|
|||
LD A,(CLOCK) |
|||
OR A |
|||
JP Z,SHOHDR1 |
|||
CALL ILPRTB |
|||
DB ' Date Time ',0 |
|||
|
|||
SHOHDR1:CALL ILPRTB |
|||
DB ' Uploaded by' |
|||
DB CR,LF,0 |
|||
|
|||
; |
|||
; Get number of records in log file |
|||
; |
|||
CALCSIZ:LD DE,FILE ; Point to log FCB |
|||
LD C,FILSIZ ; Compute file size function |
|||
CALL BDOS |
|||
LD DE,DBUF+81 ; Point to beggining of write buffer |
|||
LD A,CR |
|||
LD (DE),A ; Force first CR |
|||
DEC E |
|||
|
|||
; |
|||
; Decrement number of records left. If any left, read on into write |
|||
; buffer, otherwise close file and exit |
|||
; |
|||
NXTRCD: PUSH DE ; Save write buffer address |
|||
LD HL,FILE+33 ; Get current record counter |
|||
LD E,(HL) ; LSB record count |
|||
INC HL |
|||
LD D,(HL) ; MSB record count |
|||
DEC DE ; Decrement it |
|||
LD (HL),D ; Put it back |
|||
DEC HL |
|||
LD (HL),E |
|||
LD A,E |
|||
CP 0FFH ; Any more records? |
|||
JP NZ,RDRCD ; Yes, go read it |
|||
LD A,D ; Maybe not, check MSB |
|||
CP 0FFH ; Any more? |
|||
JP Z,TDONE ; No, all done |
|||
|
|||
; |
|||
; Read a record from source file |
|||
; |
|||
RDRCD: CALL RSDMA ; Reset DMA to 80H |
|||
LD DE,FILE |
|||
LD C,RRDM ; Random read |
|||
CALL BDOS |
|||
POP DE ; Get write buffer address back |
|||
OR A ; Read ok? |
|||
JP NZ,RDERR ; Yes |
|||
LD HL,TBUF+127 ; End address of read buffer |
|||
LD B,128 ; Buffer is filled backwards |
|||
|
|||
; |
|||
; Write record from disk to memory (in reverse order) |
|||
; |
|||
WRTBYT: LD A,(HL) ; Get byte from read buffer |
|||
AND 7FH ; Strip parity bit |
|||
CP LF ; End of line? |
|||
JP Z,DSPLIN ; Yes, show it if supposed to |
|||
CP 7FH ; Del (rubout)? |
|||
JP Z,NXTBYT ; Yes, ignore it |
|||
CP EOF ; End of file marker? |
|||
JP Z,NXTBYT ; Yes, ignore it |
|||
LD (DE),A |
|||
DEC E ; Decrement write buffer pointer |
|||
|
|||
NXTBYT: DEC L ; Decrement read buffer pointer |
|||
DJNZ WRTBYT ; And character count, get next if any left |
|||
JP NXTRCD ; Else read another record |
|||
|
|||
; |
|||
; Found end (CR) of current entry. Display it. |
|||
; |
|||
DSPLIN: DEC B ; Decrement character counter |
|||
PUSH AF ; Save flags |
|||
DEC L ; Decrement write buffer pointer |
|||
PUSH HL ; Save write address |
|||
PUSH BC ; Save character count |
|||
EX DE,HL ; HL now contains current buffer read address |
|||
LD (HL),A ; Store the LF |
|||
|
|||
LD A,(SHOWALL) ; Show entire file? |
|||
OR A |
|||
JP NZ,NEXT ; Yes |
|||
|
|||
INC L ; Else next character is transfer mode |
|||
LD A,(HL) ; Get it |
|||
DEC L ; Restore read pointer |
|||
CP 'R' ; Uploaded entry? |
|||
JP NZ,SENDLF1 ; No, ignore it and reset pointers |
|||
|
|||
; |
|||
; Get next character from read buffer. If end of line, go display CR,LF. |
|||
; |
|||
NEXT: INC L ; Increment next read byte |
|||
LD A,(HL) ; Get character |
|||
LD B,A ; Into B |
|||
CP CR ; End of line? |
|||
JP Z,SENDLF ; Yes, send a CR,LF and reset pointers |
|||
|
|||
LD A,(COLUMN) ; Get column count |
|||
CP 79 ; End of line? |
|||
JP Z,DSPLP2 ; Yes, start new line |
|||
OR A ; At beginning of line? |
|||
JP NZ,DSPLP3 ; No, continue |
|||
INC A |
|||
LD (COLUMN),A ; We aren't anymore |
|||
|
|||
LD A,B ; Get the character back |
|||
LD (STORE),A ; Store it for later comparison |
|||
|
|||
CP 'P' ; This entry private upload? |
|||
JP NZ,DSPLP1 ; No, check for regular upload |
|||
LD A,(SHOWALL) ; Yes, were we supposed to show entire file? |
|||
OR A |
|||
JP Z,DSPLP2 ; No, so ignore it |
|||
LD (PRIVATE),A ; Set private flag |
|||
JP DSPLP4 ; Go show it |
|||
|
|||
DSPLP1: CP 'R' ; Regular upload? |
|||
JP Z,DSPLP4 ; Yes, keep the flag set |
|||
|
|||
LD A,(SHOWALL) |
|||
OR A |
|||
JP NZ,DSPLP4 |
|||
|
|||
XOR A |
|||
LD (STORE),A |
|||
LD (COLUMN),A ; Start in column 0 |
|||
JP NEXT |
|||
|
|||
DSPLP2: XOR A |
|||
LD (STORE),A ; Otherwise reset flag to zero |
|||
|
|||
DSPLP3: LD A,(STORE) ; Storing into memory? |
|||
OR A |
|||
JP Z,NEXT ; If not, exit |
|||
|
|||
DSPLP4: LD A,(COLUMN) ; Increment the column counter |
|||
INC A |
|||
LD (COLUMN),A |
|||
|
|||
CP 3 ; User's modem speed is in column 2 |
|||
JP NZ,DSPLP5 ; If not column 2, continue |
|||
LD A,B ; Otherwise get the character |
|||
LD (STORE),A ; Store it for conversion to baud rate |
|||
JP NEXT ; Do not print the "MSPEED" number |
|||
|
|||
DSPLP5: CP 11 |
|||
JP C,NEXT ; Skip everything through column 10 |
|||
|
|||
; |
|||
; Display drive and user of file |
|||
; |
|||
CP 14 |
|||
JP C,SEND ; Print everything through column 13 |
|||
JP NZ,DSPFN |
|||
|
|||
; |
|||
; If a private file, make a special note of it |
|||
; |
|||
LD A,(PRIVATE) ; Private entry? |
|||
OR A |
|||
JP Z,DSPDU ; No |
|||
|
|||
XOR A ; Reset flag for next time |
|||
LD (PRIVATE),A |
|||
LD A,'*' ; Displays entry is private |
|||
CALL TYPE |
|||
LD B,' ' ; Keep our distance from next field |
|||
JP SEND |
|||
|
|||
DSPDU: LD A,':' ; Stick in a colon after column 12 |
|||
CALL TYPE |
|||
LD B,' ' ; Send a space |
|||
JP SEND |
|||
|
|||
; |
|||
; Display filename and extent |
|||
; |
|||
DSPFN: CP 22 ; Print through column 20 |
|||
JP C,SEND |
|||
JP NZ,DSPFT |
|||
LD A,B |
|||
CALL TYPE ; Send character in colum 21 |
|||
LD B,'.' ; Add a period after the file name |
|||
JP SEND |
|||
|
|||
DSPFT: CP 27 |
|||
JP C,SEND ; Print file type and some spaces |
|||
CALL Z,PRTSPC |
|||
CP 39 |
|||
JP C,NEXT ; Ignore the "big gap" |
|||
CP 43 |
|||
JP C,SEND ; Print the file size |
|||
JP Z,DSPBD |
|||
JP DSPDAT |
|||
|
|||
; |
|||
; Display the baud rate (300-19200 bps) |
|||
; |
|||
DSPBD: PUSH HL |
|||
LD A,(STORE) |
|||
CP '1' |
|||
JP Z,B300 |
|||
CP '5' |
|||
JP Z,B1200 |
|||
CP '6' |
|||
JP Z,B2400 |
|||
CP '7' |
|||
JP Z,B4800 |
|||
CP '8' |
|||
JP Z,B9600 |
|||
CP '9' |
|||
JP Z,B19200 |
|||
CALL ILPRTB |
|||
DB ' ',0 |
|||
POP HL |
|||
JP NEXT ; Go get next byte from read buffer |
|||
|
|||
B300: CALL ILPRTB |
|||
DB ' 3',0 |
|||
JP BFINISH |
|||
|
|||
B1200: CALL ILPRTB |
|||
DB ' 12',0 |
|||
JP BFINISH |
|||
|
|||
B2400: CALL ILPRTB |
|||
DB ' 24',0 |
|||
JP BFINISH |
|||
|
|||
B4800: CALL ILPRTB |
|||
DB ' 48',0 |
|||
JP BFINISH |
|||
|
|||
B9600: CALL ILPRTB |
|||
DB ' 96',0 |
|||
JP BFINISH |
|||
|
|||
B19200: CALL ILPRTB |
|||
DB ' 192',0 |
|||
|
|||
BFINISH:CALL ILPRTB |
|||
DB '00 bps ',0 |
|||
POP HL |
|||
JP NEXT |
|||
|
|||
; |
|||
; Display time and date |
|||
; |
|||
DSPDAT: LD A,(CLOCK) ; Clock enabled? |
|||
OR A |
|||
LD A,(COLUMN) |
|||
JP Z,SEND ; No, leave caller's name alone |
|||
CP 52 |
|||
JP C,SEND ; Print the date |
|||
JP NZ,DSPTIM |
|||
CALL PRTSPC ; Keep our distance from next field |
|||
JP SEND |
|||
|
|||
DSPTIM: CP 58 |
|||
JP C,SEND ; Print the time |
|||
JP NZ,SEND |
|||
CALL PRTSPC ; Keep our distance from next field |
|||
|
|||
; |
|||
; Display character in B |
|||
; |
|||
SEND: LD A,B ; Get the character back |
|||
CALL TYPE ; Display it |
|||
JP NEXT |
|||
|
|||
; |
|||
; Reached end of entry. Send CR,LF and reset pointers |
|||
; |
|||
SENDLF: LD A,CR ; Output CR |
|||
CALL TYPE |
|||
LD A,LF ; And LF for next line |
|||
CALL TYPE |
|||
XOR A ; Enable page pauses for output |
|||
JP $+5 |
|||
|
|||
SENDLF1:LD A,1 |
|||
CALL CKABRT ; Check for aborts/pauses |
|||
XOR A ; Start new line |
|||
LD (COLUMN),A ; And indicate column 0 |
|||
LD DE,DBUF+80 ; Beginning of write buffer again |
|||
POP BC ; Number of characters left in buffer |
|||
POP HL ; Current read buffer address |
|||
POP AF ; Were there any characters left? |
|||
JP Z,NXTRCD ; No, get next record |
|||
JP WRTBYT ; Else get next character |
|||
|
|||
; |
|||
; S u b r o u t i n e s |
|||
;----------------------- |
|||
; |
|||
; Routine to display a space - saves character in A on entry |
|||
; |
|||
PRTSPC: PUSH AF |
|||
LD A,' ' |
|||
CALL TYPE |
|||
POP AF |
|||
RET |
|||
|
|||
; |
|||
; Transfer is done - close destination file |
|||
; |
|||
TDONE: LD C,CLOSE |
|||
LD DE,FILE |
|||
CALL BDOS |
|||
CALL ERXIT |
|||
DB CR,LF |
|||
DB '-- End of listing','$' |
|||
|
|||
; |
|||
RDERR: CALL ILPRTB |
|||
DB CR,LF |
|||
DB '-- Read Error: ',0 |
|||
LD HL,FILE+1 |
|||
CALL SHONM4 |
|||
JP EXIT |
|||
|
|||
; |
|||
; |
|||
; These next are just to satisfy ZMDSUBS external requests. Leave alone. |
|||
; |
|||
DONE:: JP EXIT |
|||
TIME:: RET |
|||
; |
|||
; |
|||
; Initialized storage area |
|||
;-------------------------- |
|||
; |
|||
COLUMN: DB 0 ; Column of ZMD.LOG line |
|||
STORE: DB 0 |
|||
SHOWALL:DB 0 ; 1=all transfers, 0=uploads only |
|||
|
|||
|
|||
END |
|||
|
|||
@ -0,0 +1,298 @@ |
|||
; |
|||
|
|||
TITLE ZNEWS.Z80 - 09/29/88 - ZMD Sysop Transfer Log Utility |
|||
; Copyrighted (c) 1987, 1988 |
|||
; Robert W. Kramer III |
|||
|
|||
PAGE |
|||
;- -; |
|||
; Update History ; |
|||
; ; |
|||
; Date Release Comments ; |
|||
; -------- ------- ---------------------------------------------- ; |
|||
; ; |
|||
; 09/29/88 v1.50 - Fixed problem that caused a 'ZMD .L$$' file ; |
|||
; to not be deleted from directory after aborted ; |
|||
; sessions. ; |
|||
; - Also, was moving 9 filename bytes intead of 8, ; |
|||
; this is what caused the mysterious filename of ; |
|||
; '.L$$' as mentioned above. The filename left ; |
|||
; in the directory should have been '.$$$'. ; |
|||
; - Some minor cosmetic changes. ; |
|||
; 03/18/88 v1.49 - No change(s) made to this file ; |
|||
; 03/13/88 v1.48 - Redefined buffer table at end of programs. STACK; |
|||
; and filename buffers now EQUated with offsets ; |
|||
; from the last switch/toggle in program instead ; |
|||
; of with DS directive. ; |
|||
; 02/25/88 v1.47 - No change(s) made to this file |
|||
; 01/27/88 v1.46 - Some changes were made to ZMDSUBS file that are ; |
|||
; not directly related to this file ; |
|||
; 01/17/88 v1.45 - First public release ; |
|||
; 11/19/87 v1.00 - Initial version ; |
|||
;- -; |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; EXTERNAL Declarations: | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
EXTRN CASEFLG,CKABRT,CLEARIT,CMDBUF,DESC,DSTOR,DSTOR1,ERXIT |
|||
EXTRN EXIT,ILPRTB,INPUT,LNLNGTH,NOFILE,NOLOG,NOROOM,OLDDRV |
|||
EXTRN OLDUSR,OLINE,PRINTV,RECAR1,RECDR1,RENFCB,RERROR,RSDMA |
|||
EXTRN SHONM4,STACK,TDONE,UCASE |
|||
|
|||
; |
|||
;-------------------------------------------------------------------------; |
|||
; Program Starts Here | |
|||
;-------------------------------------------------------------------------; |
|||
|
|||
|
|||
.Z80 |
|||
ASEG |
|||
ORG 100H ; Program starts |
|||
JP BEGIN ; Jump around configuration table |
|||
INCLUDE ZMDHDR.Z80 ; Include the ZMD header overlay |
|||
.REQUEST ZMDSUBS ; Include the ZMD subroutines |
|||
|
|||
; |
|||
; |
|||
; Save CP/M stack, initialize new one for this program |
|||
; |
|||
BEGIN: LD (STACK),SP ; Save current CCP stack address |
|||
LD SP,STACK ; Initialize new one for this program |
|||
|
|||
; |
|||
; Get current drive/user area and store for later |
|||
; |
|||
LD A,255 ; Get current user area |
|||
CALL RECAR1 |
|||
LD (OLDUSR),A ; Save it |
|||
LD C,CURDRV ; Get current drive |
|||
CALL BDOS |
|||
LD (OLDDRV),A ; Save it |
|||
|
|||
; |
|||
; Display program name, version, and copyright notice |
|||
; |
|||
BEGIN1: LD HL,SYSNEW |
|||
CALL PRINTV |
|||
|
|||
LD A,(LOGCAL) ; Log file enabled? |
|||
OR A |
|||
JP Z,NOLOG ; No, then don't run program |
|||
|
|||
LD A,(GOTLAST) ; Already located last entry? |
|||
OR A |
|||
JP NZ,GTNEW ; Yes, then just show it |
|||
LD (DESWAIT),A ; Disable sleepy caller time out |
|||
|
|||
CALL ILPRTB |
|||
DB 'Working.',0 |
|||
|
|||
; |
|||
; Log into log file drive/user |
|||
; |
|||
LD A,(LOGUSR) ; User area to find ZMD.LOG |
|||
CALL RECAR1 |
|||
LD A,(LOGDRV) ; Drive to find ZMD.LOG |
|||
CALL RECDR1 |
|||
|
|||
; |
|||
; Open 'ZMD .LOG' file |
|||
; |
|||
LD DE,LOGNAM ; Current log filename |
|||
LD HL,FILE ; Internal FCB |
|||
CALL RENFCB ; Initialize |
|||
|
|||
LD DE,FILE |
|||
LD C,OPEN ; Open log file |
|||
CALL BDOS |
|||
INC A ; ZMD.LOG file exist? |
|||
LD HL,LOGNAM |
|||
JP Z,NOFILE ; No, inform user and exit to CP/M |
|||
|
|||
; |
|||
; Open 'ZMD .$$$' file |
|||
; |
|||
LD DE,TEMPFIL ; Current '$$$' filename |
|||
LD HL,DEST ; Internal FCB |
|||
CALL RENFCB ; Initialize |
|||
|
|||
LD HL,FILE+1 ; Point to log filename |
|||
LD DE,DEST+1 ; And temporary filename |
|||
LD BC,8 ; Set to move filename bytes only |
|||
LDIR |
|||
|
|||
LD C,OPEN ; Open new log file |
|||
LD DE,DEST |
|||
CALL BDOS |
|||
INC A ; Did file already exist? |
|||
|
|||
LD C,DELETE ; Prepare for delete |
|||
LD DE,DEST |
|||
CALL NZ,BDOS ; Yes, delete existing file |
|||
|
|||
LD C,MAKE ; Make new temporary file |
|||
LD DE,DEST |
|||
CALL BDOS |
|||
INC A |
|||
LD HL,DEST+1 |
|||
JP Z,NOROOM ; Exit if no more disk space |
|||
|
|||
; |
|||
; Read record from ZMD.LOG file |
|||
; |
|||
LD DE,CMDBUF ; Point to last log entry buffer |
|||
|
|||
RDRECD: PUSH DE ; Save current buffer position |
|||
CALL RSDMA ; Reset DMA |
|||
LD DE,FILE |
|||
LD C,READ |
|||
CALL BDOS |
|||
POP DE ; Last entry buffer address |
|||
OR A ; Read ok? |
|||
JP NZ,RERROR ; No |
|||
|
|||
; |
|||
; Now look for the end of the file overwriting OLINE with each entry found |
|||
; (from LF to LF). Upon ^Z (EOF) display last entry and get prompt for new |
|||
; one |
|||
; |
|||
LD HL,TBUF |
|||
|
|||
WRDLP: LD A,(HL) ; Get a character |
|||
AND 7FH |
|||
CP 7FH ; Delete character? |
|||
JP Z,NEXT ; Yes, don't store this character |
|||
|
|||
CP EOF ; End of file? |
|||
JP Z,GTNEW ; Yes, display last entry and get new one |
|||
|
|||
LD (DE),A ; Else store character in last entry buffer |
|||
INC DE ; Next positition in last entry buffer |
|||
CP LF ; Was it a line feed? |
|||
JP NZ,NEXT ; No, get next character |
|||
|
|||
; |
|||
; Check periodically (every LF) for user abort |
|||
; |
|||
LD A,1 ; Disable page pausing |
|||
CALL CKABRT ; Check for user requests |
|||
LD A,'$' ; Terminator for BDOS print function |
|||
LD (DE),A ; At end of last entry string |
|||
|
|||
PUSH HL |
|||
LD HL,CMDBUF |
|||
CALL DSTOR1 |
|||
POP HL |
|||
LD DE,CMDBUF |
|||
|
|||
NEXT: INC L |
|||
JP Z,RDRECD |
|||
JP WRDLP |
|||
|
|||
; |
|||
; Get new entry to ZMD.LOG. First display the last entry added to the file |
|||
; for use as a typing guide. |
|||
; |
|||
GTNEW: CALL ILPRTB |
|||
DB CR |
|||
DB 'Current format of ',0 |
|||
|
|||
LD HL,LOGNAM ; Point to log filename |
|||
CALL SHONM4 |
|||
|
|||
CALL SHWLAST ; Show last entry in log file |
|||
LD A,1 |
|||
LD (GOTLAST),A ; Show we've found/displayed last entry |
|||
|
|||
; |
|||
; Get the new entry. Process input - CR terminates entry. |
|||
; |
|||
LD A,79 |
|||
LD (LNLNGTH+1),A ; Set for up to 79 character string |
|||
LD (WRAP),A ; Disable word wrap |
|||
LD (CASEFLG),A ; Convert all input to uppercase |
|||
CALL DESC ; Go get string |
|||
LD A,0 |
|||
LD (CASEFLG),A ; Disable uppercase lock |
|||
JP Z,NOCHANG ; Z=CR entered on blank line |
|||
LD (HL),'$' ; Place a '$' for BDOS print function |
|||
|
|||
; |
|||
; Done with entry, ask for verification before writing to disk |
|||
; |
|||
CALL ILPRTB |
|||
DB CR,LF |
|||
DB ' Repeating to verify:',0 |
|||
|
|||
CALL SHWLAST ; Show last entry |
|||
LD DE,OLINE ; Point to new entry buffer |
|||
LD C,PRINT ; BDOS print function |
|||
CALL BDOS |
|||
|
|||
CALL ILPRTB |
|||
DB CR,LF |
|||
DB 'Correct? (Y/N): ',0 |
|||
|
|||
GETOK1: CALL INPUT ; Get repsonse |
|||
CALL UCASE ; Convert to uppercase |
|||
CP 'N' ; No? |
|||
JP NZ,GETOK2 ; Yes, all done |
|||
|
|||
CALL ILPRTB |
|||
DB 'No.' |
|||
DB CR,LF,0 |
|||
JP BEGIN1 |
|||
|
|||
GETOK2: CP 'Y' ; Yes? |
|||
JP NZ,GETOK1 ; Loop until we get a yes or no |
|||
|
|||
CALL ILPRTB |
|||
DB CR |
|||
DB 'Writing log entry to ',0 |
|||
LD HL,LOGNAM |
|||
CALL SHONM4 |
|||
CALL ILPRTB |
|||
DB '...',0 |
|||
CALL DSTOR ; Go store it in disk buffer |
|||
JP TDONE ; Transfer to disk |
|||
; |
|||
; |
|||
;------------------- |
|||
; UTILITIES SECTION |
|||
;------------------- |
|||
; |
|||
NOCHANG:CALL ILPRTB ; Else nothing typed, abort |
|||
DB CR,LF |
|||
DB '-- Log entry aborted... ',0 |
|||
|
|||
LD C,DELETE |
|||
LD DE,DEST |
|||
CALL BDOS ; Clean up (Erase 'ZMD .$$$' file) |
|||
|
|||
JP EXIT |
|||
|
|||
; |
|||
; Show last entry in ZMD.LOG file |
|||
; |
|||
SHWLAST:CALL ILPRTB |
|||
DB CR,LF,LF,0 |
|||
LD DE,CMDBUF ; Point to last entry buffer |
|||
LD C,PRINT ; BDOS print function |
|||
JP BDOS |
|||
|
|||
; |
|||
; These next are just dummy routines to satisfy external ZMDSUBS requests. |
|||
; They do nothing but leave alone. |
|||
; |
|||
DONE:: JP EXIT |
|||
TIME:: RET |
|||
|
|||
|
|||
GOTLAST:DB 0 |
|||
|
|||
|
|||
END |
|||
|
|||
Loading…
Reference in new issue