; 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