home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ZSYS
/
SIMTEL20
/
ZCPR3
/
HELPCK.MAC
< prev
next >
Wrap
Text File
|
2000-06-30
|
10KB
|
520 lines
;
; PROGRAM NAME: HELPCK
; AUTHOR: RICHARD CONN
; DATE: 18 MAY 84
; VERSION: 1.0
; PREVIOUS VERSIONS: None
; DERIVATION: HELP.MAC 5.0 (18 MAY 84)
; NOTE: FOR USE WITH ZCPR3 ONLY
;
VERS EQU 10
Z3ENV SET 0F400H
;
; HELPCK performs a syntax check on HLP files. Refer
; to the file HELP.HLP for more details.
;
FALSE EQU 0
TRUE EQU NOT FALSE
;
; USER EQUATES:
; Set this to TRUE if all files must be of type HLP
;
FORCEHLP EQU TRUE ; TRUE IF FILES MUST BE OF TYPE HLP
;
; Address of Help File Buffer (Make Same as HELP.COM Buffer)
; Used to Test for Memory Overflow
;
HLPBUF EQU 0F00H ; I GOT THIS BY PEEKING AT MEM
; AFTER RUNNING HELP ON A FILE
;
; SYSLIB ROUTINES
;
EXT Z3INIT,Z3LOG,GETPRT
EXT PUTUD,GETUD
EXT SCTLFL,SPRINT,SOUT,CAPS,SADC,SHLDC,LOUT,SFN2
EXT INITFCB,F$EXIST,F$OPEN,F$READ,F$CLOSE
;
; CP/M Constants
;
UDFLAG EQU 4 ; ADDRESS OF USER/DISK FLAG
BDOS EQU 5 ; ADDRESS OF BDOS ENTRY POINT
FCB EQU 5CH ; ADDRESS OF FILE CONTROL BLOCK
FCB2 EQU 6CH ; 2ND FCB
BUFF EQU 80H ; ADDRESS OF DMA BUFFER
CR EQU 0DH ; <CR>
LF EQU 0AH ; <LF>
BEL EQU 'G'-'@' ; ^G
FF EQU 'L'-'@' ; ^L = FORM FEED
CTRLZ EQU 'Z'-'@' ; ^Z
CTRLC EQU 'C'-'@' ; ^C
;
; HELP Control Characters
;
IHCHAR EQU ';' ; FLAG INDICATING INDEXED BY USER
SECTCHAR EQU ':' ; DEFINED TO BE COLON
PRCHAR EQU 'P' ; PRINTER OUTPUT
;
; Environment Definition
;
if z3env ne 0
;
; External ZCPR3 Environment Descriptor
;
jmp start
db 'Z3ENV' ;This is a ZCPR3 Utility
db 1 ;External Environment Descriptor
z3eadr:
dw z3env
start:
lhld z3eadr ;pt to ZCPR3 environment
;
else
;
; Internal ZCPR3 Environment Descriptor
;
MACLIB Z3BASE.LIB
MACLIB SYSENV.LIB
z3eadr:
jmp start
SYSENV
start:
lxi h,z3eadr ;pt to ZCPR3 environment
endif
;
; Start of Program -- Initialize ZCPR3 Environment
;
call z3init ;initialize the ZCPR3 Env and the VLIB Env
MVI A,1 ; SELECT CONSOLE ONLY
STA SCTLFL ; SET SWITCHED OUTPUT FLAG
LDA FCB2+1 ; LOOK FOR PRINT OPTION
CPI 'P'
JNZ START1
MVI A,81H ; SELECT CONSOLE AND PRINTER
STA SCTLFL
START1:
LDA BDOS+2 ; BASE PAGE OF BDOS
SUI 10 ; 2K + 2 PAGES
STA TPAEND
XRA A ; A=0
STA ITYPE ; SET NON-INDEXED FOR TYPE OF FILE
CALL PUTUD ; SAVE HOME
CALL SPRINT
DB 'HELPCK Version '
db (vers/10)+'0','.',(vers mod 10)+'0',0
LXI H,FCB+1 ; CHECK FOR FILE NAME
MOV A,M
CPI '/' ; OPTION CAUGHT?
JZ STRT0
CPI ' ' ; NONE?
JNZ STRT1
;
; PRINT HELP MESSAGE
;
STRT0:
CALL SPRINT
DB CR,LF,'Syntax:'
DB CR,LF,' HELPCK dir:filename.typ o <-- Check File'
DB CR,LF,' HELPCK dir:filename o <-- Check filename.HLP'
DB CR,LF,'Options:'
DB CR,LF,' P = Output to Printer'
DB 0
RET
;
; BEGIN HELP CHECK PROGRAM
;
STRT1:
;
; CHECK FOR WILD CARDS IN FILE NAME -- ERROR IF SO
;
LXI H,FCB+1 ; PT TO FIRST BYTE OF FILE NAME
MVI B,11 ; 11 BYTES
FCBWCK:
MOV A,M ; GET BYTE
ANI 7FH ; MASK
CPI '?' ; WILD?
JZ FCBWERR
INX H ; PT TO NEXT
DCR B
JNZ FCBWCK
;
; CHECK FOR FILE TYPE
;
LXI H,FCB+9 ; CHECK FOR FILE TYPE
IF NOT FORCEHLP
MOV A,M ; CHECK FOR FILE TYPE SPECIFIED
CPI ' ' ; NONE?
JNZ STRT2
ENDIF
;
; PLACE DEFAULT FILE TYPE OF '.HLP' IN FCB
;
LXI D,DEFTYP ; DEFAULT FILE TYPE
MVI B,3
XCHG
CALL MOVE ; MOVE (HL) TO (DE) FOR (B) BYTES
;
; READ IN FILE
;
STRT2:
CALL SPRINT
DB ' Help File: ',0
LXI D,FCB+1 ; PT TO NAME
CALL SFN2
LXI D,FCB ; PT TO FCB
CALL Z3LOG ; LOG INTO DIRECTORY
CALL INITFCB ; RESET FCB
CALL F$EXIST ; IS FILE THERE?
JNZ STRT3
;
; FILE NOT FOUND
;
CALL SPRINT
DB CR,LF,' File Not Found',0
RET
;
; FILE CONTAINS WILD CARDS
;
FCBWERR:
CALL SPRINT
DB CR,LF,' AFN Not Allowed',0
RET
;
; LOAD HELP FILE INFORMATION
;
STRT3:
LXI D,FCB ; OPEN FILE
CALL F$OPEN
LXI H,HLPBUF ; PT TO BUFFER
SHLD NEXTADR ; SET PTR
;
; READ RECORDS UNTIL EOF
;
STRT4:
CALL READ ; READ INFO
JZ STRT4 ; NOT DONE IF ZERO RETURN
LXI D,FCB ; CLOSE FILE
CALL F$CLOSE
CALL GETUD ; RESTORE CURRENT DISK AND USER IF CHANGED
;
; START OF HELP PROGRAM
;
HELP:
MVI A,1 ; SET NUMBER OF INFO SECTION
STA INFONUM
LXI H,HLPBUF ; PT TO FIRST CHAR
MOV A,M ; NO HEADER SECTION?
ANI 7FH ; MASK OUT MSB
CPI SECTCHAR
JNZ HELP1 ; HEADER SECTION EXISTS
;
; CHECK NON-INDEXED HELP FILE
;
CALL SPRINT
DB CR,LF,' Help File is Not Indexed',0
CALL CKINFO ; CHECK HELP INFO PTED TO BY HL
RET
;
; CHECK INDEXED HELP FILE
;
HELP1:
STA ITYPE ; SET INDEX TYPE
CPI IHCHAR ; INDEXED BY USER?
JNZ HELP1A
CALL SPRINT
DB CR,LF,' Help File is User-Indexed',0
JMP HELP1B
HELP1A:
CALL SPRINT
DB CR,LF,' Help File is Indexed by HELP',0
HELP1B:
CALL CKHEADER ; CHECK HEADER
;
; CHECK INFORMATION SECTIONS OF INDEXED HELP FILE
;
HELP2:
CALL CKINFO ; CHECK INFO SECTION
PUSH PSW ; SAVE FLAG
LDA INFONUM ; INCREMENT NUMBER OF INFORMATION SECTION
INR A
STA INFONUM
POP PSW
CPI CTRLZ ; DONE?
JNZ HELP2
LDA ITYPE ; USER INDEXED?
CPI IHCHAR
JZ HELP3
LDA INFONUM ; GET COUNT OF INFO SECTIONS
DCR A ; ADJUST TO CORRECT NUMBER
MOV B,A ; SAVE IN B
CALL SPRINT
DB CR,LF,CR,LF,' Information Section Count is ',0
LDA IDXNUM ; GET NUMBER OF INDEX ENTRIES
CMP B
JZ HELP2A
CALL SPRINT
DB 'Incorrect',0
JMP HELP3
HELP2A:
CALL SPRINT
DB 'Correct',0
HELP3:
CALL SPRINT
DB CR,LF,' HELPCK Done',CR,LF,0
LDA SCTLFL ; CHECK FOR PRINTER SELECTED
ANI 80H
RZ ; DONE IF NO PRINTER OUTPUT
CALL GETPRT ; GET PRINTER DATA
INX H ; PT TO FF FLAG
INX H
INX H
MOV A,M ; GET FLAG
ORA A ; 0=NO FF
RZ
MVI A,FF ; OUTPUT FF
JMP LOUT
;
; MOVE BYTES PTED TO BY HL TO AREA PTED TO BY DE; B BYTES TO MOVE
;
MOVE:
MOV A,M ; GET BYTE
ANI 7FH ; MASK OFF MSB -- IN CASE A WS FILE
STAX D ; PUT BYTE
INX H ; PT TO NEXT
INX D
DCR B
JNZ MOVE
RET
;
; READ RECORD FROM DISK; NEXTADR CONTAINS ADDRESS TO READ TO
; ON RETURN, BDOS ERROR CODE IS IN A (0=NO ERROR)
;
READ:
LXI D,FCB ; PT TO FCB
CALL F$READ ; READ NEXT RECORD
PUSH PSW ; SAVE RETURN CODE
LHLD NEXTADR ; PT TO LOAD ADDRESS
LDA TPAEND ; CHECK AGAINST END PAGE OF TPA
CMP H ; IF AT SAME PAGE, YES
JZ READERROR
LXI D,BUFF ; PT TO BUFFER TO LOAD FROM
MVI B,128 ; NUMBER OF BYTES TO MOVE
XCHG
CALL MOVE
XCHG
MVI M,CTRLZ ; STORE ENDING CTRLZ IN CASE OF EOF
POP PSW ; GET RETURN CODE
ORA A ; DONE? <>0 IF SO
;
; READ DONE -- SAVE PTR TO NEXT BLOCK
;
SHLD NEXTADR ; SET NEXT ADDRESS
RET
READERROR:
POP PSW ; CLEAR PSW
POP PSW ; CLEAR RET ADR
CALL SPRINT
DB CR,LF,' Memory Full',0
RET
;
; CHECK HEADER
;
CKHEADER:
MVI A,0 ; SET LINE COUNT
STA IDXNUM
CKH1:
MOV A,M ; CHECK FOR DONE
CPI SECTCHAR ; DONE?
JZ CKH2
CPI CTRLZ ; EOF?
JZ CKH3
CALL SKPLINE ; SKIP TO NEXT LINE
LDA IDXNUM ; INCREMENT LINE COUNT
INR A
STA IDXNUM
JMP CKH1
CKH2:
CALL SPRINT
DB CR,LF,' Lines in Header: ',0
LDA IDXNUM ; GET COUNT
CALL SADC
RET
CKH3:
CALL SPRINT
DB CR,LF,' Premature EOF at Header',0
RET
;
; CHECK INFORMATION SECTION PTED TO BY HL
;
CKINFO:
CALL SPRINT
DB CR,LF,CR,LF,' Information Section ',0
LDA INFONUM ; GET NUMBER OF INFO SECTION
CALL SADC ; PRINT IT
MOV A,M ; CHECK FOR VALID SECTION CHAR
ANI 7FH
CPI SECTCHAR
JZ CKINFO1
CALL SPRINT
DB CR,LF,' Info Section Does Not Begin with :',0
CKINFO1:
INX H ; PT TO FIRST CHAR
LDA ITYPE ; TYPE OF INFO SECTION
CPI IHCHAR ; USER-INDEXED?
JZ CKINFO2
MOV A,M ; CHECK FOR EXTERNAL FILE REFERENCE
CPI SECTCHAR
JNZ CKINFO1C
INX H ; PT TO FIRST CHAR OF FILE NAME
CKIHF:
CALL SPRINT
DB CR,LF,' External Help File: ',0
PUSH H ; SAVE HL
CKINFO1A:
MOV A,M ; GET CHAR
INX H ; PT TO NEXT
ANI 7FH
CALL CAPS
CPI ' '+1 ; CHECK FOR RANGE
JC CKINFO1B
CALL SOUT ; PRINT CHAR
JMP CKINFO1A
CKINFO1B:
POP H ; RESTORE HL
CALL SKPLINE ; SKIP TO EOL
JMP CKINFO3
CKINFO1C:
CALL SKPLINE ; SKIP TO EOL
CALL EMPCK ; CHECK FOR EMPTY
JMP CKINFO3
CKINFO2:
CALL SPRINT
DB CR,LF,' User Indices: ',0
CKI2A:
MOV A,M ; GET CHAR
ANI 7FH
INX H ; PT TO NEXT
CPI SECTCHAR ; EXTERNAL HELP FILE?
JZ CKIHF
CPI LF
JZ CKI2C
CPI ' '
JZ CKI2A
CPI CR
JZ CKI2B
CALL CAPS ; CAPITALIZE
CALL SOUT ; PRINT INDEX
MVI A,' ' ; FOLLOWING SPACE
CALL SOUT
JMP CKI2A
CKI2B:
MOV A,M ; CHECK FOR LF
ANI 7FH
CPI LF
JZ CKI2C
INX H ; SKIP LF
CKI2C:
CALL EMPCK ; CHECK FOR EMPTY
CKINFO3:
PUSH H
LXI H,1 ; SET LINE COUNTER
SHLD LCOUNT
POP H
CKINFO4:
MOV A,M ; CHECK FOR NEW INFO SECTION
CPI SECTCHAR
JZ CKISUM
CPI CTRLZ ; EOF?
JZ CKISUM
CALL SKPLINE ; SKIP TO NEXT LINE
PUSH H ; INCREMENT LINE COUNT
LHLD LCOUNT
INX H
SHLD LCOUNT
POP H
JMP CKINFO4
CKISUM:
PUSH H
CALL SPRINT
DB CR,LF,' Number of Lines: ',0
LHLD LCOUNT
CALL SHLDC
POP H
RET
;
; CHECK TO SEE IF AT EOF OR INFO SECTION AND PRINT EMPTY MESSAGE IF SO
;
EMPCK:
MOV A,M ; GET CHAR
ANI 7FH
CPI CTRLZ ; EOF?
JZ EMPCK1
CPI SECTCHAR
RNZ
EMPCK1:
CALL SPRINT
DB CR,LF,' Information Section is Empty',0
RET
;
; SKIP TO END OF CURRENT LINE
;
SKPLINE:
MOV A,M ; GET CHAR
ANI 7FH ; MASK
CPI CTRLZ ; EOF?
RZ
INX H ; PT TO NEXT
CPI LF
RZ
JMP SKPLINE
;
; BUFFER SECTION
;
DEFTYP:
DB 'HLP' ; DEFAULT TYPE OF HELP FILE
ITYPE:
DS 1 ; TYPE OF HELP FILE (IF = IHCHAR, IT IS INDEXED BY USR)
TPAEND:
DS 1 ; END PAGE ADDRESS OF TPA
LCOUNT:
DS 2 ; LINE COUNTER
INFONUM:
DS 1 ; INFORMATION SECTION NUMBER
IDXNUM:
DS 1 ; INDEX NUMBER
FIRSTENTRY:
DS 2 ; PTR TO FIRST ENTRY OF INFORMATION SECTION
NEXTADR:
DS 2 ; NEXT LOAD ADDRESS
END