;PATVLU  version 1.0  01/11/88

;This file patches VLU101-D.COM so that it will run on a non-ZCPR3 system.
;It was put together from Z3BASE2.LIB and SYSENV.LIB.  What it does is to
;tack the environment descriptor onto the end of VLU and patch a couple of
;addresses to keep VLU happy.  The file is currently set up for an Osborne I
;so unless that's the computer that you're using you will want to change the
;terminal stuff starting at the label 'envorg2'.  Make sure that you don't
;change the size of the code before CL string.  The code can be variable
;length after that, with a 0 terminator on each string.  You may also want
;to change things like the maximum disk and screen size.  After you've made
;the necessary changes, just ASM and MLOAD.

;Thanks to Steve Greenberg and Ben Grey for their help.
;	enjoy
;		Bob Schultz


;================================================================
; Update 1/17/88					 v. blade

false	equ	0
true	equ	not false

; Now capable of patching dim- or reverse-video version of VLU for
; Osborne I, Kaypro II, Kaypro 4/10/2X, Epson QX-10, Commodore 128
; or TVI955.  Though these are the only equates provided, notice
; that many terminals share the same video commands.  For example,
; the Osborne I, Epson QX-10, Qume QVT-102, TVI912, TVI920, and
; C-128 are exactly the same as far as VLU is concerned.  The TVI955
; (and TVI905) differ only in the clear screen sequence.	vb

dimvideo	equ	false

OsborneI	equ	false		;elect only one
KayproII	equ	false
Kaypro2X	equ	true		;4/10/2X
EpsonQX		equ	false
C128		equ	false
TVI955		equ	false



; EXTERNAL PATH
;
;	The following equates define the address of the ZCPR3 External
; Path and the number of two-byte elements contained in this path (maximum).
; If there is no ZCPR3 External Path, both of these values should be set to 0.
;
EXPATH	EQU	0	; EXTERNAL PATH
EXPATHS	EQU	0	;  (PATH SIZE = EXPATHS*2 + 1)

; WHEEL BYTE
;
;	The following equate defines the address of the ZCPR3 Wheel Byte.
; If there is no ZCPR3 Wheel Byte, this value should be set to 0.
;
Z3WHL	EQU	0	; WHEEL BYTE ADDRESS

; RCP LOCATION
;
;	The following equates define the address of the ZCPR3 Resident
; Command Package and its size in 128-byte blocks.  If there is no
; ZCPR3 Resident Command Package, both of these values should be 0.
;
RCP	EQU	00000H	; RESIDENT COMMAND PACKAGE
RCPS	EQU	00	; 00 128-byte Blocks (0K bytes)

; IOP LOCATION
;
;	The following equates define the address of the ZCPR3 Input/Output
; Package and its size in 128-byte blocks.  If there is no ZCPR3 Input/Output
; Package, both of these values should be 0.
;
IOP	EQU	00000H	; REDIRECTABLE I/O PACKAGE
IOPS	EQU	00	; 00 128-byte Blocks (0K bytes)

; FCP LOCATION
;
;	The following equates define the address of the ZCPR3 Flow Command
; Package and its size in 128-byte blocks.  If there is no ZCPR3 Flow Command
; Package, both of these values should be 0.
;
FCP	EQU	00000H	; FLOW COMMAND PACKAGE
FCPS	EQU	0	; 0 128-byte Blocks (0K bytes)

; ENV LOCATION
;
;	The following equates define the address of the ZCPR3 Environment
; Descriptor and its size in 128-byte blocks.  If there is no ZCPR3 Environment
; Descriptor, both of these values should be 0.
;
;**************************************************
;***		DON'T change this		*** 
;**************************************************

	 if dimvideo
z3env	equ	03e19h	; environment descriptor
	 else
z3env	equ	03dcbh
	 endif

z3envs	equ	2	; size of environment descriptor in 128-byte blocks

; SHELL STACK
;
;	The following equates define the address of the ZCPR3 Shell Stack,
; the number of entries permitted in the ZCPR3 Shell Stack, and the size
; of each entry in the Shell Stack in terms of bytes.  If there is no ZCPR3
; Shell Stack, all three values should be 0.
;
SHSTK	EQU	0	; ZCPR3 SHELL STACK
SHSTKS	EQU	0	; NUMBER OF SHSIZE-BYTE SHELL STACK ENTRIES
SHSIZE	EQU	0	; SIZE OF A SHELL STACK ENTRY
			;   (STACK SIZE = SHSTKS * SHSIZE)

; ZCPR3 MESSAGES
;
;	The following equate defines the address of the ZCPR3 Message Buffer.
; This buffer is always 80 bytes long.  If there is no ZCPR3 Message Buffer,
; this address should be 0.
;
Z3MSG	EQU	0	; ZCPR3 MESSAGE BUFFER

; EXTERNAL FCB
;
;	The following equate defines the address of the ZCPR3 External FCB.
; This buffer is always 36 bytes long.  If there is no ZCPR3 External FCB,
; this address should be 0.
;
EXTFCB	EQU	0	; ZCPR3 EXTERNAL FCB

; NAMED DIRECTORY BUFFER
;
;	The following equates define the address and size (in terms of 18-byte
; entries) of the ZCPR3 Named Directory Buffer.  If there is no such buffer,
; both of these values should be 0.
;
Z3NDIR	EQU	0	; ZCPR3 NAMED DIRECTORY AREA
Z3NDIRS	EQU	0	; 14 18-byte Named Directory Elements permitted
			;   (NDIR SIZE = Z3NDIRS*18 + 1 for trailing 0)

; COMMAND LINE
;
;	The following equates define the address and size (in terms of bytes)
; of the ZCPR3 Command Line Buffer (formerly called the Multiple Command Line
; Buffer under ZCPR2).  If there is no such buffer, both of these values should
; be 0.
;
Z3CL	EQU	0	; ZCPR3 COMMAND LINE BUFFER
Z3CLS	EQU	0	; SIZE OF COMMAND LINE BUFFER

; EXTERNAL STACK
;
;	The following equate defines the address of the ZCPR3 External Stack.
; This stack is always 48 bytes in size.  If there is no such stack, this
; value should be 0.
;
EXTSTK	EQU	0	; ZCPR3 EXTERNAL STACK



	org	109h
	dw	z3env		;patch envptr

	 if dimvideo
	org	0127ch		;patch free memory pointer
	 else
	org	01244h
	 endif

	dw	z3env+z3envs*80h


;
;  Environment Descriptor
;	If inline, there is a leading JMP just before this
;
	org	z3env

	ds	3
envorg1:
	db	'Z3ENV'		; Environment ID
	db	2		; class 2 environment (internal)

	dw	expath		; external path address
	db	expaths		; number of 2-byte elements in path

	dw	rcp		; RCP address
	db	rcps		; number of 128-byte blocks in RCP

	dw	iop		; IOP address
	db	iops		; number of 128-byte blocks in IOP

	dw	fcp		; FCP address
	db	fcps		; number of 128-byte blocks in FCP

	dw	z3ndir		; NDR address
	db	z3ndirs		; number of 18-byte entries in NDR

	dw	z3cl		; ZCPR3 Command Line
	db	z3cls		; number of bytes in Command Line

	dw	z3env		; ZCPR3 Environment Descriptor
	db	z3envs		; number of 128-byte blocks in Descriptor

	dw	shstk		; Shell Stack address
	db	shstks		; number of shsize-byte entires in Shell Stack
	db	shsize		; size of a Shell Stack entry

	dw	z3msg		; ZCPR3 Message buffer

	dw	extfcb		; ZCPR3 External FCB

	dw	extstk		; ZCPR3 External Stack

	db	0		; quiet flag (1=quiet, 0=not quiet)

	dw	z3whl		; address of Wheel Byte

	db	4		; Processor Speed in MHz

	db	'C'-'@'		; maximum disk
	db	31		; maximum user

	db	1		; 1=OK to accept DU, 0=not OK

	db	0		; CRT selection (0=CRT 0, 1=CRT 1)
	db	0		; Printer selection (n=Printer n)

	db	80		; width of CRT 0
	db	24		; number of lines on CRT 0
	db	24		; number of lines of text on CRT 0

	db	128		; width of CRT 1
	db	24		; number of lines on CRT 1
	db	24		; number of lines of text on CRT 1

	db	80		; width of Printer 0
	db	66		; number of lines on Printer 0
	db	58		; number of lines of text on Printer 0
	db	1		; form feed flag (0=can't formfeed, 1=can)

	db	102		; width of Printer 1
	db	66		; number of lines on Printer 1
	db	58		; number of lines of text on Printer 1
	db	1		; form feed flag (0=can't formfeed, 1=can)

	db	80		; width of Printer 2
	db	66		; number of lines on Printer 2
	db	58		; number of lines of text on Printer 2
	db	0		; form feed flag (0=can't formfeed, 1=can)

	db	102		; width of Printer 3
	db	66		; number of lines on Printer 3
	db	58		; number of lines of text on Printer 3
	db	0		; form feed flag (0=can't formfeed, 1=can)

	db	'SH      '	; shell variable filename
	db	'VAR'		; shell variable filetype

	db	'        '	; filename 1
	db	'   '		; filetype 1

	db	'        '	; filename 2
	db	'   '		; filetype 2

	db	'        '	; filename 3
	db	'   '		; filetype 3

	db	'        '	; filename 4
	db	'   '		; filetype 4

	ds	80H-($-envorg1+3)	; make exactly 80H bytes long
					; (+3 compensates for leading JMP)
;
; Terminal Capabilities Data
;
envorg2:
	 if OsborneI or EpsonQX or TVI955 or C128

	 if OsborneI
	DB	'Osborne I       '	;Name of Terminal
	 endif
	 if EpsonQX
	DB	'QX-10 Epson     '
	 endif
	 if TVI955
	DB	'TVI955          '
	 endif
	 if C128
	DB	'C128 Commodore  '
	 endif

	DB	'K'-'@'			;Cursor UP
	DB	'J'-'@'			;Cursor DOWN
	DB	'L'-'@'			;Cursor RIGHT
	DB	'H'-'@'			;Cursor LEFT
	DB	00			;CL Delay
	DB	00			;CM Delay
	DB	00			;CE Delay
	 if TVI955
	DB	1bh,'+',0
	 else
	DB	1ah,0			;CL String   clear screen
	 endif ;TVI955
	DB	1bh,'=%+ %+ ',0		;CM String   cursor addressing
	DB	1bh,'T',0		;CE String   clear to end of line
	DB	1bh,')',0		;SO String   into highlighting
	DB	1bh,'(',0		;SE String   exit highlighting
	DB	0			;TI String   terminal initialization
	DB	0			;TE String   terminal deinitialization

	 endif ;OsborneI or EpsonQX or TVI955 or C128

	 if KayproII or Kaypro2X

	 if Kaypro2X
	DB	'KP-10 Kaypro 10 '
	 else
	DB	'KP-2 Kaypro II  '	;Name of Terminal
	 endif ;Kaypro2X

	DB	'K'-'@'			;Cursor UP
	DB	'J'-'@'			;Cursor DOWN
	DB	'L'-'@'			;Cursor RIGHT
	DB	'H'-'@'			;Cursor LEFT
	DB	00			;CL Delay
	DB	00			;CM Delay
	DB	00			;CE Delay
	DB	1ah,0			;CL String   clear screen
	DB	1bh,'=%+ %+ ',0		;CM String   cursor addressing
	DB	18h,0			;CE String   clear to end of line
	 if Kaypro2X
	 if dimvideo
	DB	1bh,'B1',0		;SO String   into highlighting
	DB	1bh,'C1',0		;SE String   exit highlighting
	 else
	DB	1bh,'B0',0		;you don't really like inverse-video
	DB	1bh,'C0',0		;do you?
	 endif ;dimvideo
	 else
	DB	0			;SO String   into highlighting
	DB	0			;SE String   exit highlighting
	 endif ;Kaypro2X
	DB	0			;TI String   terminal initialization
	DB	0			;TE String   terminal deinitialization

	 endif ;KayproII of Kaypro2X

	 if 0	;model tcap for those who still need to build their own

	DB	'Terminal name   '	;16 characters

					;arrow keys, one byte each
	DB	'K'-'@'			;Cursor UP
	DB	'J'-'@'			;Cursor DOWN
	DB	'L'-'@'			;Cursor RIGHT
	DB	'H'-'@'			;Cursor LEFT

					;delays for cursor routines
	DB	00			;CL Delay
	DB	00			;CM Delay
	DB	00			;CE Delay

					;cursor routines, 0 terminated
	DB	1ah,0			;CL String   clear screen
	DB	1bh,'=%+ %+ ',0		;CM String   cursor addressing
	DB	18h,0			;CE String   clear to end of line
	DB	1bh,'B1',0		;SO String   into highlighting
	DB	1bh,'C1',0		;SE String   exit highlighting
	DB	0			;TI String   terminal initialization
	DB	0			;TE String   terminal deinitialization

; cursor addressing sequence:
; %    represents the row and column coordinates (first one is row)
; %+c  add offset c to coordinate ('%+ ' adds a space, 20h, to coordinate)
; %d   output coordinate as decimal characters (as many as needed)
; %2   output coordinate as two decimal characters
; %3   output coordinate as three decimal characters
;
; the following codes affect interpretation of the entire string and
; may appear anytime before the first coordinate
; %i   increment, home position is (1,1) instead of (0,0)
; %r   reverse, send column figure first
;
; %%   send '%' character
;
; example:  1bh,'[%i%d;%dH'  translates as   esc  [   1   ;   1   H
;					     1bh 5bh 31h 3bh 31h 48h
;           1bh,'=%+ %+ '    translates as   esc  =           
;					     1bh 3dh 20h 20h
;
; Of course, you could get Z3TCAP26.LBR and look in the source code,
; but what fun would that be?

	 endif ;0

	ds	80H-($-envorg2)		; make exactly 80H bytes long

;
;  End of Environment Descriptor
;

; The following code change corrects an intermittent bug that could
; inhibit constructing libraries under ZCPR3 and standard CP/M.
; It sacrifices nothing under ZCPR33.
;								vb

	 if dimvideo
	org	00d44h
	call	02776h
	 else
	org	00d17h
	call	02728h
	 endif


	end
