; breako
;
cr	equ	0dh
lf	equ	0ah
;
.z80
.request syslib
;
start:	ld	sp,stack
	ld	a,(5dh)
	cp	' '
	jr	nz,..hf
	call	print##
	cr,lf,7,'No file specified',cr,lf,0
	rst	0
;
..hf:	ld	hl,65h
	ld	a,'O'
	cp	(hl)
	jr	nz,..no
	inc	hl
	ld	a,' '
	cp	(hl)
	jr	nz,..no
	inc	hl
	cp	(hl)
	jr	z,..ho
..no:	call	print##
	cr,lf,7,'Not .O file',cr,lf,0
	rst	0
;
..ho:	ld	de,5ch
	call	fi0$open##
	jr	z,..oo
	call	print##
	cr,lf,7,'Not found',cr,lf,0
	rst	0
;
..oo:	call	f0$get##
	jp	nz,..eof
	cp	0ffh
	jp	z,..eof
	cp	0fbh			; header?
	jr	z,..hh
	jr	..oo
;
..hh:	call	header
..loop:	call	f0$get##
	jp	nz,..eof
	cp	0feh
	jr	z,eom
.neo:	call	f1$put##
	jr	..loop
;
eom:	call	f1$put##
	ld	b,4
.eoml:	call	f0$get##
	or	a
	jr	nz,.neo
	call	f1$put##
	djnz	.eoml
	ld	a,0ffh
	call	f1$put##
	call	fo1$close##
	jp	..oo
;
header:	ld	hl,outfcb+1
	push	hl
	ld	b,8
..fbl:	ld	(hl),' '
	inc	hl
	djnz	..fbl
	pop	hl
	call	print##
	cr,lf,'Extracting ',0
	ld	b,8
..ghl:	call	f0$get##
	and	5fh
	or	a
	jr	z,..eoh
	call	cout##
	ld	(hl),a
	inc	hl
	djnz	..ghl
;
..eoh:	ld	de,outfcb
	call	initfcb##
	call	f$delete##
	call	f$make##
	call	fo1$open##
	ld	a,0fbh
	call	f1$put##
	ld	hl,outfcb+1
	ld	b,8
..ph:	ld	a,(hl)
	cp	' '
	jr	z,..phx
	call	f1$put##
	inc	hl
	djnz	..ph
..phx:	xor	a
	call	f1$put##
	ret
;
..eof:	call	print##
	cr,lf,'Done',cr,lf,0
	rst	0
;
	dseg
;
outfcb:	db	0,'        ','O  '
	ds	24

	ds	100
stack	equ	$
	end
