|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 19456 (0x4c00)
Types: TextFile
Names: »FILEX.TXT«
└─⟦7b7460039⟧ Bits:30005889 KnowledgeMan - ACP - dBase II
└─⟦this⟧ »FILEX.TXT«
;FILEX program version 1.0 19 jan 83
`
boot equ 0000h ` warmboot entry
bdos equ 0005h ` bdos entry
`
false equ 0 `
true equ 1 `
`
reader equ 3 ` bdos functions
punch equ 4 `
print equ 9 `
readco equ 10 `
open equ 15 `
close equ 16 `
delete equ 19 `
read equ 20 `
write equ 21 `
make equ 22 `
setdma equ 26 `
`
ok equ 0 ` result values
nexist equ 1 `
full equ 2 `
eof equ 3 `
transm equ 4 `
`
dc1 equ 11h `
dc3 equ 13h `
`
`
org 0100h `
`
start: lxi sp,stack `
lxi d,0080h `
lxi h,conslen ` move program call parameters
ldax d ` to cons buffer
mov b,a `
mov m,a `
inx h `
inx d `
m1: mov a,b `
ora a `
jz mm `
ldax d `
mov m,a `
inx h `
inx d `
dcr b `
jmp m1 `
mm: lxi d,0080h `
ldax d `
cpi 0 `
jnz m2 `
lxi h,readcons ` readcons:=no parameters specified
mvi m,true ` after program name
m2: lxi d,sttext ` write('FILEX - ver x.x')`
mvi c,print `
call bdos `
`
act: lxi sp,stack `
call getnextitem ` getnextitem`
lxi h,itemlen `
lxi d,receive `
call comp `
jz sleep ` if item='REMOTE' then goto sleep`
lda itemlen `
cpi 0 `
jz endprog ` if item='' then goto endprog`
lxi h,itemlen `
lxi d,noend `
call comp `
jz boot ` if item='NOEND' then goto boot`
act2: call buildname ` name:=buildname(item)
lxi d,unitnr `
lda remote `
sta lhandside ` lhandside:= (Rx: specified)
cpi true `
jz act3 ` if not Rx: specified then
xra a ` begin
sta sfcbcr ` sfcbrc:=0`
lxi h,sfcb ` sfcbname:=name
jmp act4 ` end
act3: lxi h,bufname ` else
act4: call movename ` begin
call getnextitem ` buf.name:=name
lxi h,itemlen ` end`
lxi d,equal ` getnextitem`
call comp ` if item<>'=' then goto parameter-rror`
jnz parmerr ` getnextitem`
call getnextitem ` buildname(item)`
call buildname ` if lhandside=(Rx: specified)
lda remote ` then goto parameter-error`
lxi h,lhandside ` if Rx: specified then goto rtol`
cmp m `
jz parmerr `
cpi true `
jz rtol ` sfcbname:=name`
lxi d,unitnr ` sfcbrc:=0`
lxi h,sfcb `
call movename `
xra a `
sta sfcbcr `
`
` LOCAL -> REMOTE
ltor: mvi c,open ` open(source)`
lxi d,sfcb `
call bdos `
cpi 0ffh ` if open-error then abort
jz openerr `
lda bufname+1 ` if buf.name='' then
cpi ' ' `
jnz ltor1 ` begin
lxi d,name ` buf.name:=name (except unitno)
lxi h,bufname+1 ` end`
call moveonlyname `
ltor1: mvi a,2 `
sta bufop ` buf.operation:=2` (*make*)
lxi h,antal `
mvi m,19 `
inx h `
mvi m,0 ` antal:=19`
call outandin ` outline(buf,antal)`
` inline(buf,antal)`
lda bufst `
cpi transm ` if transmission error then abort
jz trxerr `
cpi ok ` if make-error then abort
jnz makeerr `
mvi c,setdma `
lxi d,bufarea `
call bdos ` setdma(buf.area)`
mvi a,4 `
sta bufop ` buf.operation:=4` (* write *)
ltor2: lxi d,sfcb ` while not eof(source) do
` begin
mvi c,read ` read(source)`
call bdos `
ora a `
jnz closefiles `
lxi h,antal `
mvi m,131 ` antal:=131`
inx h `
mvi m,0 `
call outandin ` outline(buf,antal)`
` inline(buf,antal)`
lda bufst `
cpi transm ` if transmission-error then abort
jz trxerr `
cpi ok ` if write-error then abort
jnz writeerr `
jmp ltor2 ` end`
`
`
` REMOTE -> LOCAL
rtol: lxi d,unitnr ` buf.name:=name
lxi h,bufname `
call movename `
xra a `
sta sfcbcr ` sfcbcr:=0`
lda sfcb+1 ` if destname='' then
cpi ' ' ` begin
jnz rtol1 ` sfcbname:=name`
lxi d,name `
lxi h,sfcb+1 `
call moveonlyname ` end`
rtol1: mvi a,1 `
sta bufop ` buf.operation:=1` (*open*)
lxi h,antal `
mvi m,19 ` antal:=19`
inx h `
mvi m,0 `
call outandin ` outline(buf,antal)`
` inline(buf,antal)`
lda bufst `
cpi transm ` if transmission-error then abort
jz trxerr `
cpi ok ` if open-error then abort
jnz openerr `
mvi c,delete ` delete(destination)`
lxi d,sfcb `
call bdos `
mvi c,make ` make(destination)`
lxi d,sfcb `
call bdos `
cpi 0ffh ` if make-error then abort
jz makeerr `
mvi c,setdma `
lxi d,bufarea ` setdma(buf.area)`
call bdos `
mvi a,3 ` buf.operation:=3` (* read *)
sta bufop `
rtol2: lxi h,antal `
mvi m,3 `
inx h `
mvi m,0 ` antal:=0`
call outandin ` outline(buffer,antal)`
` inline(buffer,antal)`
lda status `
ora a ` if receive_status=error or
jnz trxerr ` buffer_status=transm_error
lda bufst ` then exit to transmission_error
cmp transm ` else
jz trxerr ` begin
ora a ` if buffer_status<>0
jnz closefiles ` then close files
lxi d,sfcb ` end`
mvi c,write `
call bdos `
ora a ` if write-error then abort
jnz writeerr `
jmp rtol2 `
`
closefiles: `
mvi a,5 `
sta bufop ` buf.operation:=5 (* close *)
lxi h,antal `
mvi m,3 ` antal:=3`
call outandin ` outline(buf,antal)`
` inline(buf,antal)`
lda bufst `
cpi transm ` if transmission-error then abort
jz trxerr `
cpi ok `
jnz clsrerr ` if close-error on remote then abort
mvi c,close `
lxi d,sfcb `
call bdos ` close(source/destination)`
cpi 0ffh `
jz clslerr ` if close-error on local then abort
jmp act ` goto start:
`
endprog: `
mvi a,6 `
sta bufop ` buf.operation:=6 (* end *)
lxi h,antal `
mvi m,3 ` antal:=3`
call outandin ` outline(buf,antal)`
` inline(buf,antal)`
jmp boot ` warmboot`
`end.
`
**********************************************************************
* *
* sleeping partner *
* *
**********************************************************************
` sleep:
sleep: lxi d,oktext ` write('REMOTE OPERATION')`
mvi c,print `
call bdos `
sleep1: lxi h,result `
mvi m,ok `
call inline ` repeat
lda status ` inline(buffer,antal)
cpi ok ` if ok then
jnz transerr ` begin
lda bufop ` case buf.operation of
lxi h,jmptable-3 `
mov b,a `
add b `
add b `
mov c,a `
xra a `
mov b,a `
dad b `
pchl `
jmptable: `
jmp openf ` 1: openfile(buf.name)`
jmp makef ` 2: makefile(buf.name)`
jmp readf ` 3: readfile`
jmp writef ` 4: writefile`
jmp closef ` 5: closefile`
jmp endf ` 6: endsession`
`
`
transerr: `
lxi h,result `
mvi m,transm `
jmp senda3 `
openf: lxi d,bufname `
lxi h,sfcb `
call movename ` 1: begin (* open *)
sub a `
sta sfcbcr `
mvi c,open ` movename`
lxi d,sfcb `
call bdos ` open(buf.name)
inr a `
jnz open1 `
lxi h,result `
mvi m,nexist `
jmp senda3 `
open1: mvi c,setdma ` setdma(buf.area)
lxi d,bufarea `
call bdos `
jmp senda3 ` end`
`
makef: lxi d,bufname `
lxi h,sfcb `
call movename ` 2: begin (* make *)
sub a `
sta sfcbcr `
mvi c,delete ` movename`
lxi d,sfcb `
call bdos ` delete(buf.name)`
mvi c,make ` make(buf.name)`
lxi d,sfcb `
call bdos `
inr a `
jnz make1 `
lxi h,result `
mvi m,full `
jmp senda3 `
make1: mvi c,setdma ` setdma(buf.area)`
lxi d,bufarea `
call bdos `
jmp senda3 ` end`
`
readf: lxi d,sfcb ` 3: begin (* read *)
mvi c,read ` read`
call bdos `
ora a `
jz senda131 `
lxi h,result `
mvi m,eof `
jmp senda3 ` end`
`
writef: lxi d,sfcb ` 4: begin (* write *)
mvi c,write ` write`
call bdos `
ora a `
jz senda3 `
lxi h,result `
mvi m,full `
jmp senda3 ` end`
`
closef: lxi d,sfcb ` 5: begin (* close *)
mvi c,close ` close`
call bdos `
inr a `
jnz senda3 `
lxi h,result `
mvi m,full `
jmp senda3 ` end`
`
endf: ` 6: begin (* end *)
`
` end`
` end`
`
senda3: lxi h,antal `
mvi m,3 `
jmp senda `
`
senda131: `
lxi h,antal `
mvi m,131 `
`
senda: inx h `
mvi m,0 `
lda result `
sta bufst `
call outline ` outline(buffer,antal)`
lda bufop `
cpi 6 ` until bufop=6`
jnz sleep1 `
`
jmp boot `
`
`
openerr: `
lxi d,mopen `
jmp printerr `
`
makeerr: `
lxi d,mmake `
jmp printerr `
`
writeerr: `
lxi d,mwrite `
jmp printerr `
`
clsrerr: `
lxi d,mremclose `
jmp printerr `
`
clslerr: `
lxi d,mlocclose `
jmp printerr `
`
trxerr: `
lxi d,mtxmerr `
jmp printerr `
`
parmerr: `
lxi d,mparmerr `
jmp printerr `
`
`
printerr: `
mvi c,print `
call bdos ` write error message to console
lda readcons ` if read-from-console=false
cpi false ` then goto cpm
jz boot ` else
xra a ` begin
sta conslen ` len(cons):=0
jmp act ` end`
` goto start`
`
`
getnextitem: ` procedure getnextitem
lxi h,conspil ` begin
mvi b,0 ` while conspil<=len(cons) and
mov c,m ` cons(conspil)=' ' do
lxi h,cons ` begin
dcx h `
dad b ` conspil:=conspil+1`
getn2: lda conslen ` end`
cmp c `
jm getn3 `
mov a,m `
cpi ' ' `
jnz getn5 `
inr c `
inx h `
jmp getn2 `
getn3: lda readcons ` if conspil>len(cons) then
cpi 0 ` begin
jz getn10 ` if readcons then
lxi d,star ` begin
mvi c,print ` write('* ')`
call bdos ` readln(cons)`
lxi d,consmax `
mvi c,readco `
call bdos `
lxi d,crnl ` writeln`
mvi c,print `
call bdos `
lda conslen `
mov c,a ` for i=1 to len(cons) do
mvi b,32 ` begin
lxi h,cons ` if consÆiÅ>='a' then
getnn: mov a,m ` consÆiÅ:=consÆiÅ-('a'-'A')`
cpi 'a' ` (* convert lower case
jm getn ` to upper case *)
sub b ` end`
mov m,a `
getn: inx h `
dcr c `
jnz getnn `
mvi b,0 `
mvi c,1 ` pil := 1`
lxi h,cons `
dad b `
dcx h `
getn4: lda conslen `
cmp c ` while conspil<=len(cons) and
jm getn10 ` cons(conspil)=' ' do
mov a,m ` begin
cpi ' ' ` conspil:=conspil+1`
jnz getn5 ` end`
inr c `
inx h `
jmp getn4 ` end
getn10: lxi h,itemlen ` else
mvi m,0 ` begin
ret ` itemlen:=0`
` return`
` end`
getn5: lxi d,item `
mvi b,1 ` i := 1`
mov a,m `
cpi '=' ` if consÆpilÅ='=' then
jnz getn6 ` begin
stax d ` itemÆ1Å:='='`
lxi h,itemlen `
mvi m,1 ` itemlen:=1`
inr c `
lxi h,conspil ` pil:=pil+1`
mov m,c ` return`
ret ` end`
getn6: lda conslen ` while pil<=len(cons) and
cmp c ` cons(pil)<>' ' and
jm getn7 ` cons(pil)<>'=' do
mov a,m ` begin
cpi ' ' `
jz getn7 `
cpi '=' `
jz getn7 `
push b `
push h `
lxi h,badchar ` if pos('<>,`?*ÆÅ',consÆpilÅ)<>0
mvi b,m `
getchk: inx h ` (* check for illegal characters *)
cmp m `
jz parmerr ` then exit to parameter-error
dcr b `
jnz getchk ` else
pop h ` begin
pop b ` nameÆiÅ:=consÆpilÅ`
stax d ` i:=i+1`
inr b ` pil:=pil+1`
inr c ` end`
inx d `
inx h ` end`
jmp getn6 `
getn7: lxi d,itemlen ` itemlen:=i-1`
mov a,b `
dcr a `
stax d `
lxi h,conspil `
mov m,c `
ret `end`
`
buildname: ` procedure buildname`
lxi h,fejl ` begin
mvi m,false ` fejl:=false`
lxi h,remote `
mvi m,false ` remote:=false`
mvi b,11 `
lxi h,name `
build1: mvi m,' ' ` name:= ' '`
inx h ` name2:=' '`
dcr b `
jnz build1 `
lxi h,item+1 `
mov a,m `
cpi ':' ` if itemÆ2Å=':' then
jnz build2 ` begin
dcx h `
mov a,m `
mvi c,'A'-1 `
sub c `
lxi h,unitnr `
mov m,a ` unitnr:=ord(itemÆ1Å)-(ord('A')-1)`
lxi h,item+2 ` pos := 3`
mvi c,3 `
jmp build4 ` end`
build2: inx h ` else
mov a,m ` begin
cpi ':' ` if itemÆ3Å=':' and
jnz build3 `
lxi h,item `
mov a,m `
cpi 'R' ` itemÆ1Å='R' then
jnz build3 `
lxi h,remote ` begin
mvi m,true `
lxi h,item+1 ` remote:=true`
mov a,m `
mvi c,'A'-1 `
sub c `
lxi h,unitnr `
mov m,a ` unitnr:=ord(itemÆ2Å)-(ord('A')-1)`
lxi h,item+3 `
mvi c,4 ` end`
jmp build4 ` else
build3: lxi h,unitnr ` begin
mvi m,0 ` (* no disk specified *)
lxi h,item ` end`
mvi c,1 ` end`
build4: mvi b,1 ` pil :=1`
lxi d,name `
build5: lda itemlen ` while pos<=itemlen and
cmp c ` pil<=8 and
rm ` itemÆposÅ<>'.' do
mvi a,8 ` begin
cmp b ` nameÆpilÅ:=itemÆposÅ`
jm build6 ` pil:=pil+1`
mov a,m ` pos:=pos+1`
cpi '.' ` end`
jz build7 `
mov a,m `
stax d `
inr b `
inr c `
inx d `
inx h `
jmp build5 `
build6: lda itemlen ` while pos<=itemlen and
cmp c ` itemÆposÅ<>'.' do
rm ` begin
mov a,m ` pos:=pos+1`
cpi '.' ` end`
jz build7 `
inr c `
inx h `
jmp build6 `
build7: inr c ` while pos<=itemlen and
inx h ` pil<=3 do
mvi b,1 `
lxi d,name2 ` begin
build8: lda itemlen ` name2ÆpilÅ:=itemÆposÅ`
cmp c ` pil:=pil+1`
rm ` pos:=pos+1`
mvi a,3 ` end`
cmp b `
rm `
mov a,m `
cpi '.' `
jz parmerr `
stax d `
inr b `
inr c `
inx d `
inx h `
jmp build8 `
`
`
movename: ` procedure movename`
mvi c,16 ` begin
move1: ldax d `
mov m,a `
inx d `
inx h `
dcr c `
jnz move1 `
ret ` end`
`
moveonlyname: ` procedure moveonlyname`
mvi c,15 ` begin
jmp move1 ` end`
`
comp: ldax d ` function compare:boolean`
cmp m ` begin
rnz ` if len(s1)<>len(s2) then return`
mov b,a `
cmp1: inx d ` for i:=1 to len(s1) do
inx h ` begin
ldax d ` if s1ÆiÅ<>s2ÆiÅ then return`
cmp m `
rnz ` end`
dcr b `
jnz cmp1 `
ret ` return`
`end`
`
`
`
outandin: `procedure outandin`
call outline `begin
call inline ` outline(buf,antal)`
ret ` inline(buf,antal)`
`end`
`
`
inline: `procedure inline(buf,antal)`
`begin
inl1: call rec ` repeat
cpi 35 ` rec(ch)`
jnz inl1 ` until ord(ch)<>35`
lxi h,antal `
inx h `
call rdata ` rdata(right)`
dcx h `
call rdata ` rdata(left)`
lhld antal ` antal:=left shift 8 + right`
mov b,h `
mov c,l `
lxi h,buffer `
inl2: ` i:=0`
mov a,b ` while antal>0 do
ora c ` begin
jz inl3 `
call rdata ` rdata(buf.area(i))`
inx h ` i:=i+1`
dcx b ` antal:=antal-1`
jmp inl2 ` end`
inl3: lxi h,checksum ` rdata(checksum)`
call rdata `
call rec ` if rec(ch)=13 then
cpi 13 `
jnz inl6 ` begin
mvi a,0 `
lhld antal ` calc_check:=0`
mov b,h ` i:=0`
mov c,l `
lxi h,buffer `
inl4: mov d,a ` while antal>0 do
mov a,b ` begin
ora c `
mov a,d `
jz inl5 `
add m ` calc_check:=calc_check+buf.area(i)
inx h ` i:=i+1`
dcx b ` antal:=antal-1`
jmp inl4 ` end`
inl5: lxi h,checksum ` if calck_check+checksum=0 then
add m ` status:=ok
jnz inl6 ` else
sub a ` status:=error`
sta status ` end`
ret ` else
inl6: mvi a,1fh ` status:=error`
sta status `
ret ` end`
`
rdata: push h ` procedure rdata(ch)`
push b `
call rec ` begin
ani 0fh ` rec(ch1)`
rlc ` ch1:=(ch1 and 1111B) shift 4`
rlc `
rlc `
rlc `
mov e,a `
push d `
call rec ` rec(ch2)`
pop d `
ani 0fh ` ch2:=ch2 and 1111B`
ora e ` ch:=ch1+ch2`
pop b `
pop h `
mov m,a `
ret ` end`
`
rec: mvi c,reader ` procedure rec(ch)`
` begin
call bdos ` goto readerinput(ch)`
ani 7fh ` end`
ret `
`
` procedure outline(buf,antal)
outline: ` begin
mvi a,35 ` write(chr(35))`
call xmt `
lxi h,antal+1 `
call xdata ` xdata(antal div 256)`
dcx h `
call xdata ` xdata(antal mod 256)`
lhld antal `
mov b,h `
mov c,l `
lxi h,buffer ` i:=0`
outl1: mov a,b ` while antal>0 do
ora c ` begin
jz outl2 `
call xdata ` xdata(buffer(i))`
inx h ` i:=i+1`
dcx b ` antal:=antal-1`
jmp outl1 ` end`
outl2: sub a ` checksum:=0`
lhld antal `
mov b,h `
mov c,l `
lxi h,buffer ` i:=0`
outl3: mov d,a ` while antal>0 do
mov a,b ` begin
ora c `
mov a,d `
jz outl4 `
add m ` checksum:=checksum+buffer(i)`
inx h ` i:=i+1`
dcx b ` antal:=antal-1`
jmp outl3 ` end`
outl4: mov d,a `
sub a `
sub d ` checksum:=0-checksum`
sta checksum `
lxi h,checksum `
call xdata `
mvi a,13 ` xmt(13)`
call xmt `
mvi a,10 ` xmt(10)`
call xmt `
ret ` end`
`
xdata: mov a,m ` procedure xdata(i:integer)`
rrc ` begin
rrc ` xmt((i div 256)+32)`
rrc `
rrc `
ani 0fh `
ori 40h `
call xmt `
mov a,m `
ani 0fh `
ori 40h `
call xmt ` xmt((i mod 256)+32)`
ret ` end`
`
xmt: push psw `
push b `
push d `
push h `
mov e,a ` procedure xmt(c:char)`
push d `
xmt1: lhld 0001 ` begin
mvi c,4ah ` while buffer(reader)<>empty do
mvi b,0 ` begin
dad b `
call phl ` read(reader,ch)`
ora a `
jz xmt3 `
mvi c,reader `
call bdos `
cpi dc3 `
jnz xmt1 ` if ch=dc3 then
` begin
xmt2: mvi c,reader ` repeat
call bdos ` read(reader,ch)`
cpi dc1 `
jnz xmt2 ` until ch=dc1`
jmp xmt1 ` end`
` end`
xmt3: pop d `
mvi c,punch ` write(punch,c)`
call bdos `
pop h `
pop d `
pop b `
pop psw `
ret `
`
phl: pchl `
` end`
`
receive: `
db 6,'REMOTE' `
noend:
db 5,'NOEND' `
equal:
db 1,'=' `
badchar:
db 8,'<>,`?*ÆÅ' `
star: db '* $' `
oktext: db 'Remote operation' `
db 13,10,'$'
sttext: db 'FILEX vers. 1.0 83.01.19' `
crnl: db 13,10,'$' `
`
mopen:
db 'Cannot open source file'
db 13,10,'$'
mmake:
db 'Directory full on destination disk'
db 13,10,'$'
mwrite:
db 'No space on destination disk'
db 13,10,'$'
mremclose:
db 'Cannot close file on remote disk'
db 13,10,'$'
mlocclose:
db 'Cannot close file on local disk'
db 13,10,'$'
mtxmerr:
db 'Transmission error'
db 13,10,'$'
mparmerr:
db '*** Parameter error ***'
db 13,10,'$'
ds 32 `
stack: `
fejl: db false `
status: db 0 `
result: db ok `
lhandside: `
db false `
checksum: `
db 0 `
`
buffer: ds 131 `
bufop equ buffer `
bufref equ bufop+1 `
bufst equ bufref+1 `
bufarea equ bufst+1 `
bufname equ bufst+1 `
antal: dw 0 `
`
sfcb: ds 36 `
sfcbcr equ sfcb+32 `
`
conspil:db 1 `
consmax:db 80 `
conslen:db 0 `
cons: ds 80 `
`
itemlen:db 0 `
item: ds 20 `
`
remote: db false `
`
unitnr: db 0 `
name: ds 8 `
name2: ds 3 `
blanks: db 0,0,0,0 `
`
readcons: `
db false `
end start `
«eof»