home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
mbug
/
mbug097.arc
/
CACHE.MAC
< prev
next >
Wrap
Text File
|
1979-12-31
|
4KB
|
244 lines
;
;
; 512k operating system support program.
; Disk cache control program.
;
;
bdos equ 5
cr equ 13
lf equ 10
tab equ 9
bell equ 7
command_line equ 80h
bios_start equ 0E700h
id equ 218h
id_val equ 0AA55h
cache_pages equ 226h
restore_cache equ 28Fh
cache_table equ 158h
num_drives equ 12Bh
md_pages equ 225h
mem_page equ 292h
normal_map equ 4
bios_map equ 0Ch
map_port equ 50h
rst_00h equ 0C7h
aseg
org 100h
ld de,start_mesg
ld c,9
call bdos
ld hl,(bios_start+id)
ld de,id_val
or a
sbc hl,de
jp nz,get_lost
ld hl,command_line
ld a,(hl)
or a
jr z,show_use
ld b,a
ld de,cache_off_mesg
ld a,(bios_start+restore_cache)
or a
jp z,prt_ret
parse:
inc hl
ld a,(hl)
cp '?'
jr z,show_size
or 'a'-'A'
cp 'e'
jr z,enable
cp 'd'
jr z,disable
cp ' '
jr nz,show_use
djnz parse
show_use:
ld de,use_mesg
ld c,9
call bdos
jr show_size
enable:
ld c,0 ; Enabled flag
call load_map_c
jr purge_drives
disable:
ld c,0FFh
call load_map_c
purge_drives:
ld b,4
ld c,0
pd_1:
push bc
ld a,6 ; XBIOS purge disk (C)
rst 28h
pop bc
inc c
djnz pd_1
force_boot:
; ld a,rst_00h
; ld (ret_instr),a
show_size:
; Replace 'D:' in message with 'L:' if less than 4 drives
ld a,(bios_start+num_drives)
cp 4
jr nc,ss_3
ld a,'L'
ld (cache_drives_mesg+1),a
ss_3:
; Loop to find which drives enabled
ld hl,bios_start+cache_table+4
ld ix,cache_drives_mesg
ld bc,4*256+0
; ld c,0 ; Number found disabled
ss_2:
dec hl
ld a,(hl)
sub 0FFh
jr nz,ss_enabled
inc c
ld (ix),a
ld (ix+1),a
ld (ix+2),a
ss_enabled:
dec ix
dec ix
dec ix
djnz ss_2
; Are none enabled ?
ld de,cache_temp_off_mesg
ld a,c
cp 4
jr z,ss_1
; Are all enabled
ld de,cache_on_mesg
or a
jr z,ss_1
; 1..3 enabled
ld de,cache_some_mesg
; is just 1 enabled
sub 3
jr nz,ss_1
ld (cache_pl_mesg),a
ss_1:
ld c,9
call bdos
ld a,(bios_start+restore_cache)
dec a
ld b,a
add a,b
add a,b
ld e,a
ld d,0
ld hl,cache_sizes
add hl,de
ld de,cache_size_loc
ld bc,3
ldir
ld de,cache_size_mesg
jr prt_ret
get_lost:
ld de,wb_mesg
prt_ret:
ld c,9
call bdos
ret_instr:
ret
; Load flag in C into cache available map
load_map_c:
ld ix,bios_start+cache_table
dec b
jr z,en_3
; Allow/disallow buffering on selected drives ( flag them 0/0FFh )
en_sel_drives:
inc hl
ld a,(hl)
or 'a'-'A'
sub 'a'
jr c,en_2
cp 'L'-'A'
jr nz,en_4
sub 'L'-'D'
en_4:
cp 'D'-'A'+1
jr nc,en_2
ld (ix_offs_1),a
ix_offs_1 equ $+2
ld (ix+0),c ; flag
en_2:
djnz en_sel_drives
ret
; Enable/disable all
en_3:
ld b,4
en_all:
ld (ix),c
inc ix
djnz en_all
ret
start_mesg:
db cr,lf,'Microbee 512k Enhanced Operating System v2.2,'
db ' (c) 1987 Peter Broughton.',cr,lf
db 'CACHE : disk cache control program.',cr,lf,lf,'$'
wb_mesg:
db bell,'Wrong operating system !!',cr,lf,lf,'$'
use_mesg:
db 'Use : CACHE E/D/? [A:/B:/C:/D:/L:].',cr,lf
db tab,'E - Enable cache on all or selected drives,',cr,lf
db tab,'D - Disable cache on all or selected drives,',cr,lf
db tab,'? - Query status.',cr,lf,lf,'$'
cache_off_mesg:
db 'Cache disabled (no memory allocated).'
db cr,lf,lf,'$'
cache_size_mesg:
db 'Memory available to cache : '
cache_size_loc:
db '000k.',cr,lf,lf,'$'
cache_sizes:
db 0,'32',0,'64',0,'96128'
cache_on_mesg:
db 'Cache enabled for all drives.',cr,lf,'$'
cache_some_mesg:
db 'Cache enabled for drive'
cache_pl_mesg:
db 's A: B: C:'
cache_drives_mesg:
db ' D:.',cr,lf,'$'
cache_temp_off_mesg:
db 'Cache disabled for all drives.',cr,lf,'$'
if ($ and 7Fh) ne 0
ds 80h-($ and 7Fh)
endif
end