mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
0
Source/Apps/ZMD/-29sep88
Normal file
0
Source/Apps/ZMD/-29sep88
Normal file
24
Source/Apps/ZMD/-notice.doc
Normal file
24
Source/Apps/ZMD/-notice.doc
Normal file
@@ -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.
|
||||
|
||||
|
||||
10
Source/Apps/ZMD/-zmd.for
Normal file
10
Source/Apps/ZMD/-zmd.for
Normal file
@@ -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
|
||||
|
||||
37
Source/Apps/ZMD/Build.cmd
Normal file
37
Source/Apps/ZMD/Build.cmd
Normal file
@@ -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
|
||||
|
||||
10
Source/Apps/ZMD/Clean.cmd
Normal file
10
Source/Apps/ZMD/Clean.cmd
Normal file
@@ -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
|
||||
10
Source/Apps/ZMD/Makefile
Normal file
10
Source/Apps/ZMD/Makefile
Normal file
@@ -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
|
||||
36
Source/Apps/ZMD/autoinst.doc
Normal file
36
Source/Apps/ZMD/autoinst.doc
Normal file
@@ -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.
|
||||
|
||||
|
||||
|
||||
88
Source/Apps/ZMD/equates.ins
Normal file
88
Source/Apps/ZMD/equates.ins
Normal file
@@ -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
|
||||
;
|
||||
;
|
||||
;
|
||||
;--------------------------------------------------------------------------
|
||||
|
||||
44
Source/Apps/ZMD/mkcoms.sub
Normal file
44
Source/Apps/ZMD/mkcoms.sub
Normal file
@@ -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...
|
||||
;
|
||||
|
||||
420
Source/Apps/ZMD/zforp.z80
Normal file
420
Source/Apps/ZMD/zforp.z80
Normal file
@@ -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
|
||||
|
||||
233
Source/Apps/ZMD/zfors.z80
Normal file
233
Source/Apps/ZMD/zfors.z80
Normal file
@@ -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
|
||||
|
||||
268
Source/Apps/ZMD/zmap.z80
Normal file
268
Source/Apps/ZMD/zmap.z80
Normal file
@@ -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
|
||||
|
||||
BIN
Source/Apps/ZMD/zmd.pdf
Normal file
BIN
Source/Apps/ZMD/zmd.pdf
Normal file
Binary file not shown.
1144
Source/Apps/ZMD/zmd.ws
Normal file
1144
Source/Apps/ZMD/zmd.ws
Normal file
File diff suppressed because it is too large
Load Diff
4858
Source/Apps/ZMD/zmd.z80
Normal file
4858
Source/Apps/ZMD/zmd.z80
Normal file
File diff suppressed because it is too large
Load Diff
264
Source/Apps/ZMD/zmdel.z80
Normal file
264
Source/Apps/ZMD/zmdel.z80
Normal file
@@ -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
|
||||
|
||||
916
Source/Apps/ZMD/zmdhb.z80
Normal file
916
Source/Apps/ZMD/zmdhb.z80
Normal file
@@ -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
|
||||
637
Source/Apps/ZMD/zmdhdr.z80
Normal file
637
Source/Apps/ZMD/zmdhdr.z80
Normal file
@@ -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
|
||||
;
|
||||
|
||||
517
Source/Apps/ZMD/znewp.z80
Normal file
517
Source/Apps/ZMD/znewp.z80
Normal file
@@ -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
|
||||
|
||||
298
Source/Apps/ZMD/znews.z80
Normal file
298
Source/Apps/ZMD/znews.z80
Normal file
@@ -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
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
::call BuildDisk.cmd bp wbw_hd512 || exit /b
|
||||
::goto :eof
|
||||
|
||||
echo.
|
||||
echo Building Floppy Disk Images...
|
||||
echo.
|
||||
call BuildDisk.cmd cpm22 wbw_fd144 ..\cpm22\cpm_wbw.sys || exit /b
|
||||
call BuildDisk.cmd zsdos wbw_fd144 ..\zsdos\zsys_wbw.sys || exit /b
|
||||
::call BuildDisk.cmd nzcom wbw_fd144 ..\zsdos\zsys_wbw.sys || exit /b
|
||||
call BuildDisk.cmd cpm3 wbw_fd144 ..\cpm3\cpmldr.sys || exit /b
|
||||
::call BuildDisk.cmd cpm3 wbw_fd144 ..\cpm3\cpmldr.sys || exit /b
|
||||
::call BuildDisk.cmd zpm3 wbw_fd144 ..\cpm3\cpmldr.sys || exit /b
|
||||
call BuildDisk.cmd ws4 wbw_fd144 || exit /b
|
||||
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
#
|
||||
SYSTEMS = ../CPM22/cpm_wbw.sys ../ZSDOS/zsys_wbw.sys ../CPM3/cpmldr.sys
|
||||
|
||||
FDIMGS = fd144_cpm22.img fd144_zsdos.img \
|
||||
fd144_cpm3.img fd144_ws4.img
|
||||
FDIMGS = fd144_cpm22.img fd144_zsdos.img fd144_ws4.img
|
||||
HD512IMGS = hd512_cpm22.img hd512_zsdos.img hd512_nzcom.img \
|
||||
hd512_cpm3.img hd512_zpm3.img hd512_ws4.img
|
||||
# HDIMGS += hd512_bp.img
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
../../Binary/Apps/zmterm.ovr 15:
|
||||
../../Binary/Apps/zminit.ovr 15:
|
||||
../../Binary/Apps/zmconfig.ovr 15:
|
||||
../../Binary/Apps/zmd.com 15:
|
||||
|
||||
#
|
||||
#../../Binary/Apps/i2clcd.com 2:
|
||||
#../../Binary/Apps/i2cscan.com 2:
|
||||
|
||||
@@ -27,6 +27,7 @@ d_cpm22/ReadMe.txt 0:
|
||||
../../Binary/Apps/zmterm.ovr 0:
|
||||
../../Binary/Apps/zminit.ovr 0:
|
||||
../../Binary/Apps/zmconfig.ovr 0:
|
||||
../../Binary/Apps/zmd.com 0:
|
||||
#
|
||||
#../../Binary/Apps/i2clcd.com 2:
|
||||
#../../Binary/Apps/i2cscan.com 2:
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
../../Binary/Apps/zmterm.ovr 0:
|
||||
../../Binary/Apps/zminit.ovr 0:
|
||||
../../Binary/Apps/zmconfig.ovr 0:
|
||||
../../Binary/Apps/zmd.com 0:
|
||||
#
|
||||
#../../Binary/Apps/i2clcd.com 2:
|
||||
#../../Binary/Apps/i2cscan.com 2:
|
||||
|
||||
@@ -44,6 +44,7 @@ d_zsdos/u0/*.* 0:
|
||||
../../Binary/Apps/zmterm.ovr 0:
|
||||
../../Binary/Apps/zminit.ovr 0:
|
||||
../../Binary/Apps/zmconfig.ovr 0:
|
||||
../../Binary/Apps/zmd.com 0:
|
||||
#
|
||||
#../../Binary/Apps/i2clcd.com 2:
|
||||
#../../Binary/Apps/i2cscan.com 2:
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
../../Binary/Apps/zmterm.ovr 15:
|
||||
../../Binary/Apps/zminit.ovr 15:
|
||||
../../Binary/Apps/zmconfig.ovr 15:
|
||||
../../Binary/Apps/zmd.com 15:
|
||||
#
|
||||
#../../Binary/Apps/i2clcd.com 2:
|
||||
#../../Binary/Apps/i2cscan.com 2:
|
||||
|
||||
@@ -40,6 +40,7 @@ d_cpm22/u0/XSUB.COM 0:
|
||||
../../Binary/Apps/zmterm.ovr 0:
|
||||
../../Binary/Apps/zminit.ovr 0:
|
||||
../../Binary/Apps/zmconfig.ovr 0:
|
||||
../../Binary/Apps/zmd.com 0:
|
||||
#
|
||||
#../../Binary/Apps/i2clcd.com 2:
|
||||
#../../Binary/Apps/i2cscan.com 2:
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
#DEFINE RMN 1
|
||||
#DEFINE RUP 1
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "3.1.1-pre.125"
|
||||
#DEFINE BIOSVER "3.1.1-pre.126"
|
||||
|
||||
@@ -3,5 +3,5 @@ rmn equ 1
|
||||
rup equ 1
|
||||
rtp equ 0
|
||||
biosver macro
|
||||
db "3.1.1-pre.125"
|
||||
db "3.1.1-pre.126"
|
||||
endm
|
||||
|
||||
Reference in New Issue
Block a user