; ; PROGRAM: RECORD ; AUTHOR: RICHARD CONN ; VERSION: 1.4 ; DATE: 6 Jan 83 ; PREVIOUS VERSIONS: 1.3 (5 Jan 83) ; PREVIOUS VERSIONS: 1.0 (30 Dec 82), 1.1 (31 Dec 82), 1.2 (1 Jan 83) ; VERS EQU 14 ; ; This program is Copyright (c) 1982, 1983 by Richard Conn ; All Rights Reserved ; ; ZCPR2 and its utilities, including this one, are released ; to the public domain. Anyone who wishes to USE them may do so with ; no strings attached. The author assumes no responsibility or ; liability for the use of ZCPR2 and its utilities. ; ; The author, Richard Conn, has sole rights to this program. ; ZCPR2 and its utilities may not be sold without the express, ; written permission of the author. ; ; ; RECORD enables and disables the disk output redirectable I/O ; drivers for ZCPR2. This command takes two forms: ; ; RECORD ON <-- Turn on console recording ; RECORD OFF <-- Turn off console recording ; RECORD ON LST <-- Turn on printer recording ; RECORD OFF LST <-- Turn off printer recording ; ext print,fname,bbline fcb equ 5dh ;FCB Input fcb2 equ 6dh ;FCB2 Input cr equ 0dh lf equ 0ah ; ; Branch to Start of Program ; jmp start ; ;****************************************************************** ; ; SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format ; ; This data block precisely defines the data format for ; initial features of a ZCPR2 system which are required for proper ; initialization of the ZCPR2-Specific Routines in SYSLIB. ; ; ; EXTERNAL PATH DATA ; EPAVAIL: DB 0FFH ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES) EPADR: DW 40H ; ADDRESS OF EXTERNAL PATH IF AVAILABLE ; ; INTERNAL PATH DATA ; INTPATH: DB 0,0 ; DISK, USER FOR FIRST PATH ELEMENT ; DISK = 1 FOR A, '$' FOR CURRENT ; USER = NUMBER, '$' FOR CURRENT DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 ; DISK, USER FOR 8TH PATH ELEMENT DB 0 ; END OF PATH ; ; MULTIPLE COMMAND LINE BUFFER DATA ; MCAVAIL: DB 0FFH ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE? MCADR: DW 0FF00H ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE ; ; DISK/USER LIMITS ; MDISK: DB 4 ; MAXIMUM NUMBER OF DISKS MUSER: DB 31 ; MAXIMUM USER NUMBER ; ; FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK ; DOK: DB 0FFH ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES) UOK: DB 0FFH ; ALLOW USER CHANGE? (0=NO, 0FFH=YES) ; ; PRIVILEGED USER DATA ; PUSER: DB 10 ; BEGINNING OF PRIVILEGED USER AREAS PPASS: DB 'chdir',0 ; PASSWORD FOR MOVING INTO PRIV USER AREAS DS 41-($-PPASS) ; 40 CHARS MAX IN BUFFER + 1 for ending NULL ; ; CURRENT USER/DISK INDICATOR ; CINDIC: DB '$' ; USUAL VALUE (FOR PATH EXPRESSIONS) ; ; DMA ADDRESS FOR DISK TRANSFERS ; DMADR: DW 80H ; TBUFF AREA ; ; NAMED DIRECTORY INFORMATION ; NDRADR: DW 00000H ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY NDNAMES: DB 64 ; MAX NUMBER OF DIRECTORY NAMES DNFILE: DB 'NAMES ' ; NAME OF DISK NAME FILE DB 'DIR' ; TYPE OF DISK NAME FILE ; ; REQUIREMENTS FLAGS ; EPREQD: DB 000H ; EXTERNAL PATH? MCREQD: DB 000H ; MULTIPLE COMMAND LINE? MXREQD: DB 000H ; MAX USER/DISK? UDREQD: DB 000H ; ALLOW USER/DISK CHANGE? PUREQD: DB 000H ; PRIVILEGED USER? CDREQD: DB 000H ; CURRENT INDIC AND DMA? NDREQD: DB 000H ; NAMED DIRECTORIES? Z2CLASS: DB 1 ; CLASS 1 DB 'ZCPR2' DS 10 ; RESERVED ; ; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA ; ;****************************************************************** ; iobase: dw 0 ; I/O Driver Base Address ; ; Start of Program ; start: call print db 'RECORD, Version ' db (vers/10)+'0','.',(vers mod 10)+'0',0 lhld iobase ;Check for I/O Driver Defn mov a,h ora l jnz start0 call print db cr,lf,'Abort -- I/O Driver Address NOT Defined',0 ret start0: call status ;Call Status Routine jz nodriver ;No Driver Available? cpi 80H ;MUST have Disk Driver Module (> 80H) Loaded jnc start1 call print db cr,lf,'Abort -- Disk Driver Module NOT Loaded',0 ret nodriver: call print db cr,lf,'Abort -- No I/O Driver Module Loaded',0 ret start1: lda fcb ;Get first char cpi 'O' ;Must be O jnz help lda fcb+1 ;Get 2nd char cpi 'N' ;ON? jnz off on: call getfile ;Get File Name lda fcb2 ;Printer? cpi 'P' jnz on1 call lopen ;TTY (HL pts to File FCB) call print db cr,lf,'++ TTY Recording ON ++',0 ret on1: call copen ;CRT (HL pts to File FCB) call print db cr,lf,'++ CRT Recording ON ++',0 ret off: lda fcb2 ;Printer? cpi 'P' jnz off1 call print db cr,lf,'++ TTY Recording OFF ++',cr,lf,0 call lclose ;Close Disk File ret off1: call print db cr,lf,'++ CRT Recording OFF ++',cr,lf,0 call cclose ;Close Disk File ret ; ; Print Help Message ; help: call print db cr,lf db cr,lf,'RECORD turns on and off recording of screen displays' db cr,lf,'on disk under ZCPR2 with the SYSIO Redirectable I/O ' db 'Drivers' db cr,lf,'engaged.' db cr,lf db cr,lf,'It is invoked by two forms:' db cr,lf db cr,lf,' RECORD ON or RECORD ON PRINTER' db cr,lf,' RECORD OFF or RECORD OFF PRINTER' db cr,lf db cr,lf,'Minimum Required Option Forms are ON, OF, and P:' db cr,lf,' RECORD ON P = RECORD ON PRINTER' db cr,lf,'If the P option is given, then TTY output is ' db 'recorded,' db cr,lf,'else CRT output is recorded.' db cr,lf,0 ret ; ; Obtain Name of Output File and Return Pointer to its FCB in HL ; getfile: call print db cr,lf,'Output File Name ( for DISKOUT)? ',0 mvi a,0ffh ;Caps call bbline ;Get user Input call sblank ;Skip to Non-Blank ora a ;EOL? jz defexit ;Done if Default lxi d,confcb ;Pt to FCB push d ;Save ptr for return call fname ;Extract Name jz uderr ;No UD Allowed mov a,c ;Check for any UD cpi 0ffh jnz uderr mov a,b cpi 0ffh jz getf1 uderr: call print db cr,lf,'Override -- File is Placed in your Current Directory' db cr,lf,0 getf1: pop h ;Get ptr to FCB ret defexit: lxi h,confcb ;Default FCB lda fcb2 ;Check for Printer cpi 'P' rnz lxi h,prtfcb ;Printer FCB ret ; ; Skip to Non-Blank ; sblank: mov a,m ;Get char inx h ;Pt to next cpi ' ' ;Loop if Space jz sblank dcx h ;Pt to Non-Blank Char ret ; ; I/O Driver Interface Routines ; status: push h ;Save HL push d ;Save DE lxi d,0 ;No Offset for Status runio: lhld iobase ;Get I/O Base Address dad d ;Pt to Routine pop d ;Restore DE xthl ;Restore HL and Place Address on Stack ret ;"Run" Routine copen: push h ;Save Regs push d lxi d,36 ;Offset for Console Open Routine jmp runio ;Run Routine cclose: push h ;Save Regs push d lxi d,39 ;Offset for Console Close Routine jmp runio lopen: push h ;Save Regs push d lxi d,42 ;Offset for Printer Open Routine jmp runio lclose: push h ;Save Regs push d lxi d,45 ;Offset for Printer Close Routine jmp runio ; ; FCBs ; confcb: db 0 db 'DISKOUT ' db 'CON' ds 24 prtfcb: db 0 db 'DISKOUT ' db 'PRT' ds 24 end