home *** CD-ROM | disk | FTP | other *** search
- 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
-