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