; SYSTAT ver 1.00 by ESKAY
; Created (big bang) 13 Jul 85
;
cr      equ     0dh
lf      equ     0ah
cfunc   equ     5
tfunc   equ     50h
;
z80
request syslib
;
start:  ld      sp,stack
       call    print##
       cr,lf,lf
       'SYSTAT v1.00 by ESKAY',cr,lf,lf
       'TurboDOS Version ',0
       ld      c,12
       call    tfunc
       ld      a,c
       and     0f0h
       rra
       rra
       rra
       rra
       or      30h
       call    cout##
       ld      a,'.'
       call    cout##
       ld      a,c
       and     0fh
       or      30h
       call    cout##
       call    print##
       ', TurboDOS Serial Number ',0
       call    phlfdc##
       ld      a,'/'
       call    cout##
       ex      de,hl
       call    phlfdc##
       call    print##
       ', ',0
       ld      a,b
       or      a
       jr      nz,..pri
       call    print##
       'Non-',0
.pri:   call    print##
       'Privileged logon.',cr,lf,0
       ld      c,43
       ld      e,0ffh
       call    tfunc                   ; get current bank
       push    af                      ; save it
       ld      c,43
       ld      e,1
       call    tfunc                   ; set to bank 1
       ld      c,43
       ld      e,0ffh
       call    tfunc                   ; check bank
       or      a                       ; bank 1 active?
       jr      nz,..bnk
       call    print##
       'Non-',0
.bnk:   call    print##
       'Banked system (current bank = ',0
       pop     af                      ; get original bank
       call    pafdc##
       ld      e,a
       ld      c,43
       call    tfunc                   ; if changed, set back
       call    print##
       ') on circuit ',0
       ld      c,12
       call    cfunc
       ld      a,d
       call    pafdc##
       call    print##
       ', node ',0
       ld      a,e
       call    pafdc##
       call    print##
       '. CP/M version ',0
       ld      a,l
       and     0f0h
       rra
       rra
       rra
       rra
       or      30h
       call    cout##
       ld      a,'.'
       call    cout##
       ld      a,l
       and     0fh
       or      30h
       call    cout##
       call    print##
       cr,lf
       'Memory free in current bank: ',0
       ld      hl,(6)
       dec     h
       call    phlfdc##
       call    print##
       ' bytes (top of TPA = ',0
       inc     h
       dec     hl
       call    phl4hc##
       call    print##
       'H).',cr,lf,'Default drive is ',0
       ld      c,25
       call    cfunc
       ld      e,a
       ld      c,19
       call    tfunc
       bit     7,a
       jr      z,..rem
       call    print##
       'fixed',0
       jr      ..rfd
;
.rem:   call    print##
       'removable',0
.rfd:   and     7
       ld      b,a
       ld      a,1
       dec     b
       dec     b
cbls:   dec     b
       jr      z,cble
       add     a,a
       jr      cbls
;
cble:   call    print##
       ', block size = ',0
       call    pafdc##
       ld      b,a                     ; save block size
       call    print##
       'k. Disk has ',0
       ex      de,hl
       call    phlfdc##
       call    print##
       ' free blocks.',cr,lf
       'Accessible drives are : ',0
       ld      c,24
       call    cfunc
       ld      a,'A'
       ld      b,8
       call    ..rh
       ld      l,h
       ld      b,8
       call    ..rh
       call    print##
       cr,lf
       'Number of buffers: ',0
       ld      c,24
       call    tfunc
       ld      a,h
       call    pafdc##
       call    print##
       '. Buffer size: ',0
       ld      b,l
       ld      hl,64
       inc     b
.bfs:   add     hl,hl
       djnz    ..bfs
       call    phlfdc##
       call    print##
       ' bytes.',cr,lf
       'Current printing set to ',0
       ld      c,27
       ld      de,0ffffh
       ld      b,d
       call    tfunc
       inc     l
       dec     l
       jr      z,prdir
       dec     l
       jr      z,prspl
       call    print##
       'CONSOLE',cr,lf,0
       jr      prend
;
prdir:  call    print##
       'DIRECT TO PRINTER ',0
       ld      a,h
       add     a,'@'
       call    cout##
       call    crlf##
       jr      prend
;
prspl:  call    print##
       'SPOOLER ON DRIVE ',0
       add     a,'A'
       call    cout##
       ld      a,h
       or      a
       jr      z,pren0
       call    print##
       ' TO QUEUE ',0
       add     a,'@'
       call    cout##
pren0:  call    crlf##
prend:  call    print##
       'System printer assignments : ',cr,lf,0
       ld      b,0
syspl:  push    bc
       ld      de,0ffffh
       ld      c,29
       call    tfunc
       inc     a                       ; valid?
       jr      z,invp1
       call    print##
       9,9,'Printer ',0
       pop     bc
       push    bc
       ld      a,'A'
       add     a,b
       call    cout##
       dec     l                       ; check mode
       jp      z,sstop                 ; stopped
       ld      a,h                     ; get queue assignment
       or      a                       ; check offline
       jp      z,soffl
       call    print##
       ': Queue ',0
       add     a,'@'
       call    cout##
       call    crlf##
       jr      invp1
;
soffl:  call    print##
       ': Offline',cr,lf,0
       jr      invp1
;
sstop:  call    print##
       ': Stopped',cr,lf,0
invp1:  pop     bc                      ; get printer
       inc     b
       ld      a,b
       cp      16
       jp      nz,syspl                ; continue till done
       call    crlf##
       rst     0
;
.rh:    rr      l
       call    c,cout##
       inc     a
       djnz    ..rh
       ret
;
       dseg
;

       ds      100
stack   equ     $
       end