mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
520 lines
9.6 KiB
520 lines
9.6 KiB
;
|
|
; 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
|
|
|