code	Segment Para
	Assume cs:code, ds:code
	org	100h
park	proc far
	jmp	init
x1coff 	dw	0
x1cseg 	dw	0
x13off 	dw	0
x13seg 	dw	0
parked	dw	0
count	dw	0
value	dw	0
flag	dw	0
oldax	dw	0
oldip	dw	0
oldcs	dw	0
oldflgs	dw	0
	even
x1cint:	push	ax
	push	bx
	push	cx
	push	dx
	push	ds
	mov	ax,cs
	mov	ds,ax
	xor	ax,ax
	cmp	parked,ax
	jne	x1cext
	dec	word ptr count
	cmp	count,ax
	jne	x1cext
	cmp	flag,1
	je	x1cext
	cli
	mov	ax,1
	mov	parked,ax
	mov	flag,ax
	mov	ax,value
	mov	count,ax
	pop	ds
	pop	dx
	pop	cx
	pop	bx
	pop	ax
	mov	cs:oldax,ax
	pop	ax	;ip
	mov	cs:oldip,ax
	pop	ax      ;cs
	mov	cs:oldcs,ax
	pop	ax      ;flags
	mov	cs:oldflgs,ax
	mov	ax,offset parks
 ;Generate an interrupt return to the parker
	pushf
	push	cs
	push	ax
	mov	ax,cs:oldax
	sti
	jmp	dword ptr cs:[x1coff]
x1cext:	jmp	x1cout
parks:	sti
	push	ax
	push	cx
	push	dx
	push	ds
	mov	ax,cs
	mov	ds,ax
;
;
;	Do the BIOS's dirty work so this code will work!
;
	mov	al,020h
	out	020h,al
;
;
;
	mov	ah,08
	mov	dx,80h
	int	13h
	mov	dx,80h
 	inc	ch
	jnc	p1
	add	cl,40h
p1:	mov	ax,0c01h
	int	13h
;
	mov	ah,08
	mov	dx,81h
	int	13h
	mov	dx,81h
  	inc	ch
	jnc	p2
	add	cl,40h
p2:	mov	ax,0c01h
	int	13h
;
	xor	ax,ax
	mov	flag,ax
	pop	ds
	pop	dx
	pop	cx
	mov	ax,cs:oldflgs
	push	ax
	popf
	pop	ax
 	jmp	dword ptr cs:[oldip]
x1cout:	pop	ds
	pop	dx
	pop	cx
	pop	bx
	pop	ax
x1cou1:	jmp	dword ptr cs:[x1coff]
x13int:	push	ax
	push	ds
	sti
	mov	ax,cs
	mov	ds,ax
	cmp	flag,1
	je	x13in1
	mov	ax,value
	mov	count,ax
	xor	ax,ax
	mov	parked,ax
x13in1:	pop	ds
	pop	ax
	jmp	dword ptr cs:[x13off]
	dw	0
table	dw	0
init:	xor	ax,ax
	mov	parked,ax
	mov	bx,80h
	mov	al,[bx]
	cmp	al,0
	jne	init1
	int	21h
init1:	inc	bx
	mov	al,[bx]
	cmp	al,32
	je	init1
	cmp	al,13
	jne	init3
init2:	xor	ax,ax
	int	21h
init3:	cmp	al,49
	jb	init2
	cmp	al,57
	ja	init2
	lea	dx,mess
	mov	cx,ax
	mov	ah,09
	int	21h
	mov	ax,cx
	xor	ah,ah
	mov	bx,0fh
	and	ax,bx
	mov	dx,1091
	mul	dx
	mov	value,ax
	mov	count,ax
	cli
	push	es
	xor	ax,ax
	mov	es,ax
	mov	bx,76
	mov	ax,es:[bx]
	mov	x13off,ax
	mov	ax,offset x13int
	mov	es:[bx],ax
	inc	bx
	inc	bx
	mov	ax,es:[bx]
	mov	x13seg,ax
	mov	ax,cs
	mov	es:[bx],ax
	xor	ax,ax
	mov	flag,ax
	mov	es,ax
	mov	bx,112
	mov	ax,es:[bx]
	mov	x1coff,ax
	mov	ax,offset x1cint
	mov	es:[bx],ax
	inc	bx
	inc	bx
	mov	ax,es:[bx]
	mov	x1cseg,ax
	mov	ax,cs
	mov	es:[bx],ax
	pop	es
	sti
	mov	dx,offset table
	int	27h
mess	db	'Alpha Computer Service timed parker is activated'
	db	13,10,'for hard disks C and, if present, D'
	db	13,10,'$'
park	endp
code	ends
	end park
