; 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