home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol044
/
flags12.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
12KB
|
657 lines
version equ 12
;************************************************
; *
; <<< Flags Editor >>> *
; *
; by Dick Lieber *
; comment at 312-326-4014 *
; or via Chicago CBBS *
; *
; 11/7/81 *
; *
;11/14/81 Screen functions generalized, f1, f2 *
; attributes corrected. (C. Strom) *
;************************************************
;
no equ 0
yes equ not no
;
org 100h
;********************************************************
; <<< This must be configured for >>> *
; <<< your own terminal parameters >>> *
; *
lineeded equ yes ;yes if term needs lead-in *
lichar equ 126 ;lead in char for your term *
clrchar equ 28 ;clear screen character *
; ;modify for your terminal *
;
homeimp equ yes ;yes if you have a home cursor *
; ;character. lineeded applies. *
; ;clrchar is used if no *
homechar equ 18 ;character to home cursor *
; *
;********************************************************
bdos equ 05H
deffcb equ 5CH ;used for inital search
dmarea equ 80H ;used only
filenamlen equ 0CH
ptextlength equ 10H ;length of each flag descriptor
combuflen equ 16
cr equ 0dh
bs equ 8
ctlu equ 15h ;key to press to update flags
esc equ 1bh
;
; bdos commands
;
conin equ 1
conout equ 2
prstr equ 9
readbuff equ 10
searchf equ 17
setattr equ 30
;
; saveold and setup private stack
;
lxi h,0
dad sp
shld oldstack
lxi sp,stacktop
;
call inlnprt
db 'Set & Display file flags'
db 0dh,0ah
db 'Version '
db version/10 + '0','.',version mod 10 + '0'
db 0
call crlf
;
; check if file was specified
;
lxi h,deffcb+1
mvi a,' '
cmp m
jz leaveflags
;
; process file in defalut fcb at 5ch
;
again:
lxi d,deffcb ;use default fcb
mvi c,searchf ;find file
call bdos
cpi 0ffh ;ff if not found
jz nofile
lxi h,dmarea ;
rlc ;calculate address of found fcb
rlc
rlc
rlc
rlc
mov e,a
mvi d,0
dad d
shld filefcb ;save absolute fcb address
if homeimp ;if using home cursor screen must be erased
call erase ;initially
endif
;
; copy found fcb to a workspace
;
movoldtowk:
lhld filefcb
lxi d,workfcb
lxi b,filenamlen
call move
;
; move drive code to workfcb
;
lda deffcb ;get drive code
sta workfcb ;put drive code into workfcb
;
; main loop - this changes/displays flags in workfcb
;
doover: call doheader ;print top of page
call displayflags ;show flags status
call crlf
call crlf
call inlnprt
db ' Enter letter of flag to change or option > '
;
; need to erase old char if not erasing screen each time
;
if homeimp
db ' ',bs,0
else
db 0
endif
;
; get character from operator
;
mvi c,conin
call bdos
cpi esc
jz movoldtowk ;get old flags
cpi 3
jz leaveflags ;quit
cpi ctlu
jz updfile ;change flags in directory
ori 20h ;make lower case
cpi 'l'
jnc doover ;out of range, loop back
cpi 'a'
JC DOOVER ;out of range, loop back
;
; Change flag in temporary fcb
; a has flag position in 4 ls bits
;
lxi h,workfcb ;point to name
ani 0fh ;kill ascii
mov e,a ;put into de
mvi d,0
dad d ;point to absolute address
mov a,m ;get byte
xri 80h ;toggle flag
mov m,a ;put it back
jmp doover ;loopbac to begining
;
; update flags in directory
;
updfile:
lxi d,workfcb
lda deffcb ;get drive code
stax d ;set drive code in filename for setattr
mvi c,setattr
call bdos
jmp leaveflags
;
; print top of page
;
doheader:
if homeimp
call homecur
else
call erase
endif
call inlnprt
db 0DH,0AH,0AH
db ' File Parameter Flag Display/Change'
db ' ver '
db version/10 + '0','.',version mod 10 + '0'
db 0DH,0AH,0AH
db ' Options: ^C - leave as is'
db 0DH,0AH
db ' ^U - update file'
db 0Dh,0AH
db ' ESC -original flags'
db 0DH,0AH,0AH
db ' File: ',0
lxi h,workfcb
call shnm1 ;show mane of file
call crlf
call crlf
ret
;
; move bc bytes from hl to de
;
move: mov a,b
ora c
rz
mov a,m
stax d
inx h
inx d
dcx b
jmp move
;
; display status of flags, menu style
; workfcb contains file name with flags set
;
displayflags:
mvi a,'a' ;first letter of line
sta letterofline ;save for later
lxi h,flagsm ;point to start of flag descriptors
shld textpoint
lxi h,workfcb
shld flagpoint
displayloop:
call inlnprt
db ' ',0 ;a crude tab
lda letterofline ;print line letter
mov e,a
cpi 6ch ;must be less than 'l'
rz
inr a
sta letterofline
mov a,e
call printchar
mvi a,' '
call printchar
;
; point to next char in filename
;
lhld flagpoint
inx h
shld flagpoint
mov a,m
ani 80h
jz displayblank
;
; flag set - write SET
;
call displayset
jmp describflg
;
; flag not set - write four blanks
;
displayblank:
call blanks4
;
; now write flags discriptor text
;
describflg:
lhld textpoint
xchg
mvi c,prstr
call bdos
call crlf
lhld textpoint
lxi d,ptextlength
dad d
shld textpoint
jmp displayloop
;
; send char in a to con:
;
printchar:
mov e,a
push h
push b
mvi c,conout
call bdos
pop b
pop h
ret
;
; write four blanks
;
blanks4:
call inlnprt
db ' ',0
ret
;
; display the work SET
;
displayset:
call inlnprt
db 'SET ',0
ret
;
; search didn't find file
;
nofile:
call erase
call inlnprt
db 0ah,0ah,0ah,0ah,9,9
db 0
lxi h,deffcb
call shnm1
call inlnprt
db ' was not found.',0
jmp leaveflags1
crlf:
call inlnprt
db 0DH,0AH,0
ret
;
; display a file name
; hl points to file name/type as in fcb
;
showname:
lhld filefcb
shnm1: ;calling program set pointer
push h
;
; first show drive code if not current
;
mov a,m
inx h ;point to first char of name
ora a ;set flags
;
; print drive code if not current
;
jz dispfn
adi '@'
call printchar
mvi a,':'
call printchar
;
; print filename
;
dispfn: mvi c,8 ;max length of filename
call dispfnft
;
; then a dot
;
mvi a,'.'
call printchar
;
; and last the filetype
;
pop h ;get begining of name
lxi b,9 ;namelength + drive code length
dad b ;point to filetype
mvi c,3 ;max length of filetype
call dispfnft
ret
;
; display print character until count in c up or ' ' found
;
dispfnft:
mov a,m ;get char from fcb
cpi ' ' ;quit if space
rz
call printchar ;print character
inx h ;next charw
dcr c
rz ;quit if count up
jmp dispfnft
;
; In line print
;
inlnprt:
pop h ;get address of string
inlnloop:
mov a,m
ora a
jz inlndone
mov e,a
mvi c,conout
push h
call bdos
pop h
inx h
jmp inlnloop
inlndone:
inx h ;push to code after text
pchl ;go there
;
; exit this program
; give user a few choices
;
leaveflags:
leaveflags1:
call inlnprt
db 0dh,0ah,0ah,0ah,09h
db 'Enter file or RETURN to exit > ',0
lxi h,combuff
;
; fill buffer with ' ' so makefcb sees proper terminator
;
push h
pop d
lxi b,combuflen
mvi a,' '
call fillb ;in makefcb.lib
;
mvi m,combuflen-1 ;set max
xchg
mvi c,readbuff
push d
call bdos
pop d
xchg
inx h
mov a,m
ora a
jnz newfile ;if zero length then quit
lhld oldstack
sphl
ret ;to ccp with old stack intact
newfile:
inx h ;point to start of command string
lxi d,deffcb ;where to build fcb
call makefcb ;make fcb from string
jnc again ;if no error do flags again
call crlf
call inlnprt
db 9,9
db 'Bad file name: ',0
lxi h,deffcb
call shnm1
jmp leaveflags1
;
; erase screen
;
erase:
if lineeded
mvi a,lichar
call printchar
endif
mvi a,clrchar
jmp printchar
;
; home cursor (optional)
;
if homeimp
homecur:
endif
if homeimp and lineeded
mvi a,lichar
call printchar
endif
if homeimp
mvi a,homechar
jmp printchar
endif
;
;
; flag descriptors
; these must remain 16 chars long or change ptextlength
;
flagsm:
DB 'f1 no xmdm CP/M$'
DB 'f2 no xmdm MP/M$'
DB 'f3 $'
DB 'f4 $'
; above for user -- below reserved for system
DB 'f5 $'
DB 'f6 $'
DB 'f7 $'
DB 'f8 $'
db 'read only $'
DB 'no directory $'
DB 't3 $'
;
; make fcb from string with unambiguous file name
; hl=filename; de=fcb
; returns with carry set if bad name
;
makefcb:
xra a
sta flag ;flag non-zero if invalid char in name
push h ;save command pointer
push d ;save fcb pointer
;
; clear fcb
;
lxi b,36
call clrb
;
; put blanks in filename
;
pop d
push d
inx d ;point to start of filename
lxi b,11 ;length of name + type
mvi a,' ' ;char to fill
call fillb
;
; skip any leading blanks in filename string
;
call skipb
;
; look if drive specified
;
pop d ;get fcb
xchg
shld mfcbfcb
xchg
pop h ;get filename
call checkdrive
inx d ;point to file name in fcb
;
; process filename
; eight chars or until '.'
;
mvi c,8
call getname
;
; there may be a dot here if we counted down to zero
;
mov a,m
cpi '.'
jnz nodot
inx h ;skip dot
nodot:
;
; adjust de to start of filetype in fcb
;
push h
lhld mfcbfcb ;get fcbstart
lxi d,9 ;offset from start of fcb to filetype
dad d
xchg ;de is at filetype of fcb
pop h ;hl is at filetype (or 9th char of filename)
;
; process filetype
;
mvi c,3
call getname
lda flag
adi 1 ;set carry if bad name
ret
;
; move chars from (hl) to (de) until count in c is up or '.' found
;
getname:
mov a,m
inx h
call upcase ;make upper case if lower
call checkvalid ;set flag if invalid
cpi '.' ;look for seperator
rz
cpi ' '
rz
stax d ;put into fcb
inx d
dcr c ;count down
rz
jmp getname
;
; check if char is legal
; make flag non-zero if fails
;
checkvalid:
cpi '*'
jz badchar
cpi '['
jz badchar
cpi ']'
jz badchar
cpi ','
mov b,a
ani 30h
cpi 30h
mov a,b
rnz ;char is valid in filename
cpi ':'
rc ;3xH chars less than : are ok
badchar:
mvi a,0ffh
sta flag
ret
;
; check and process drive
; hl at start at first char of filename
; put drive code into fcb pointed to by de, if there
;
checkdrive:
inx h ;2nd byte is a colon if drive spec'd
mov a,m
dcx h ;point back to beginingv
cpi ':'
rnz ;no ':' no drive
mov a,m
call upcase ;make upper
ani 0fh ;remove ascii bias
stax d ;put into drive code of fcb
inx h ;point to colon
inx h ;point to first char of name
ret
;
; skip blanks in filename
; hl left pointing at first non-blank
;
skipb: mov a,m
cpi ' '
rnz
inx h
jmp skipb
;
; convert character to upper case (if needed)
; char in and returned in a
;
upcase: cpi '`' ;' has 60h bits set but is not lower case
rz
cpi '{' ;{ and above are good too
rnc
push psw ;save char
ani 60h ;isolate bits
cpi 60h
jnz notlower
pop psw
ani 5fh ;make upper
ret
notlower:
pop psw
ret
;
; fill bc bytes with char in a, starting at de
;
clrb: mvi a,0
fillb: inr b
dcr b
jnz fillb1
inr c
dcr c
rz
fillb1: stax d
inx d
dcx b
jmp fillb
;
; ram storage area
;
workfcb: ;this is the temporary filename
ds 36 ;used for all operations
letterofline: ;letter for display
ds 1
combuff: ;readbuffer for bdos cmd 10
ds combuflen
flagpoint: ;points to character in workfcb
ds 2
textpoint: ;points to flag descriptor in flagsm
ds 2
oldstack ds 2 ;save stack pointer for no-boot return
filefcb ds 2 ;absolute address of fcb
mfcbfcb ds 2 ;address of fcb under constructio for makefcb
flag: ds 1 ;ff if bad char in filename
ds 30
stacktop equ $ ;private stack
end