home *** CD-ROM | disk | FTP | other *** search
- ;
- ; INIT4TH Version 1.0 as of December 13, 1981
- ;
- ; By: Kelly Smith, CP/M-Net
- ;
- ; The purpose of INIT4TH, came about from the flagrant
- ; destruction of Fig-Forth screens that were co-resident on
- ; my CP/M diskettes...I would forget that the screens DO NOT
- ; appear in the CP/M directory, and as such are prone to
- ; eminent destruction (due totally to my stupidity) by the
- ; CP/M "PIP" command. What to do? Well, I also got tired of
- ; clearing out screens that were full of "e5's" from
- ; formatting, and decided to kill two birds with one
- ; stone...
- ;
- ; INIT4TH will allow retention of all relevant CP/M
- ; files (such as FORTH itself) on a CP/M and FORTH diskette,
- ; initialize all sectors NOT occupied by the resident CP/M
- ; files, and RESERVE all remaining sectors as available disk
- ; area for FORTH screens. How is it done? Well, INIT4TH
- ; creats one "super file" called RESERVED.4TH that is
- ; nothing but blanks (actually ASCII "space" code) that
- ; aquires all CP/M groups remaining after the resident CP/M
- ; files...once your quasi CP/M-FORTH diskette is
- ; initialized, it's FULL as far as CP/M is concerned for
- ; further PIPing, and ready for whatever you want to place
- ; into the available Fig-Forth screen area (my version
- ; starts with a blank screen number 17, up to 249). It's
- ; best, if you PIP all the CP/M files to a blank formatted
- ; diskette first to make them contiguous on the diskette (no
- ; "holes"), and then run INIT4TH on it to "take-up-the-
- ; slack".
- ;
- ; But WARNING...do not run this on a diskette that
- ; already has screens that you want to preserve...this is
- ; ONLY for diskette INITIALIZATION of FORTH screens...copy
- ; from another diskette as you normally do to place your
- ; "treasured" screens on it.
- ;
- ; A conditional assembly equate "SYS" is used to make
- ; RESERVED.4TH invisible in the directory (if you want it
- ; that way).
- ;
- ; I hope this is of some use to you, and if you make
- ; any changes, I would appreciate it, if you modem the
- ; program to CP/M-Net (805) 527-9321 as INIT4TH.NEW...
- ;
- ; P.S. I have learned many new WORDs using FORTH, but
- ; none are repeatable here...
- ;
- ; Best regards: Kelly Smith CP/M-Net
- ;
- ;
- ;
- ; define TRUE/FALSE assembly parameters
- ;
- true equ -1 ; define TRUE
- false equ not true; define FALSE
- sys equ true ; define SYS (make RESERVED.4TH a $SYS file)
- ;
- ;
- ; BDOS entry point and function codes
- ;
- base equ 0 ; base address of "standard" CP/M system
- bdos equ base+5 ; CP/M BDOS entry address
- msgfc equ 9 ; message function
- resdsk equ 13 ; reset disk system
- offc equ 15 ; open file
- cffc equ 16 ; close file
- wrfc equ 21 ; write record
- mffc equ 22 ; make file
- sdma equ 26 ; set dma address
- ;
- ; secondary FCB field definitions
- ;
- fn equ 1 ; file name field (rel)
- ft equ 9 ; file type field (rel)
- ex equ 12 ; file extent field (rel)
- frc equ 15 ; file record count (rel)
- nr equ 32 ; next record field (rel)
- ;
- ; ASCII control characters
- ;
- cr equ 0dh ; carriage return
- lf equ 0ah ; line feed
- bel equ 07h ; bell signal
- ;
- ;
- org base+100h
- ;
- lxi h,0 ; save old stack pointer
- dad sp
- shld oldstk
- lxi sp,stack; make a new stack pointer
- lxi d,initmsg ; Forth Screen initialization in progress
- mvi c,msgfc
- call bdos
- call reset ; reset disk in case it's R/O
- init4th:call open ; attempt to open RESERVED.4TH
- inr a ; check CP/M return code
- jnz makeok ; RESERVED.4TH already exist?
- call make ; make new file
- inr a ; check CP/M return code
- jnz makeok
- lxi d,dirful; oops...disk directory is full
- exit: mvi c,msgfc
- call bdos
- lhld oldstk ; get old CP/M stack pointer
- sphl
- ret
- ;
- ; RESERVED.4TH exists, so set the FCB entry for next append to file
- ;
- makeok:
- ;
- lxi d,active; indicate disk activity with "."
- mvi c,msgfc
- call bdos
- call setdma ; set dma for record to write
- call write ; write it out...
- push psw ; save possible error code
- lda fcb+frc ; get record count
- sta fcb+nr ; make next record
- pop psw ; get possible error code
- ora a ; disk full yet, all available records?
- jz makeok ; do more records, if not
- call close ; close-up shop, and go home
- lxi d,dskful; Forth Screens are now initialized...
- jmp exit ; exit to CP/M
- ;
- ; reset - reset disk
- ;
- reset:
- push h
- push d
- push b
- mvi c,resdsk
- call bdos
- pop b
- pop d
- pop h
- ret
- ;
- ; open - open disk file
- ;
- open:
- push h
- push d
- push b
- lxi d,fcb
- mvi c,offc
- call bdos
- pop b
- pop d
- pop h
- ret
- ;
- ; setdma - set dma for record
- ;
- setdma:
- push h
- push d
- push b
- lxi d,dbuf
- mvi c,sdma
- call bdos
- pop b
- pop d
- pop h
- ret
- ;
- ; write - write record
- ;
- write:
- push h
- push d
- push b
- lxi d,fcb
- mvi c,wrfc
- call bdos
- pop b
- pop d
- pop h
- ret
- ;
- ; close - close disk file
- ;
- close:
- push h
- push d
- push b
- lxi d,fcb
- mvi c,cffc
- call bdos
- pop b
- pop d
- pop h
- ret
- ;
- ; make - make new disk file
- ;
- make:
- push h
- push d
- push b
- lxi d,fcb
- mvi c,mffc
- call bdos
- pop b
- pop d
- pop h
- ret
- ;
-
- initmsg:db cr,lf,'Forth Screen initialization in progress',cr,lf,'$'
- ;
- active: db '.$'
- ;
- dirful: db cr,lf,'Oops, this diskette is already full!$'
- ;
- dskful: db cr,lf,lf,'Forth Screen initialization completed'
-
- if SYS
- db ' as (RESERVED.4TH)$'
- endif ; SYS
-
- if not SYS
- db ' as RESERVED.4TH$'
- endif ; SYS
-
- ;
- fcb: db 2 ; initialize diskette in B: drive
-
- if SYS
- db 'RESERVED4','T'+80H,'H'
- endif ; SYS
-
- if not SYS
- db 'RESERVED4TH'
- endif ; SYS
-
- db 0,0,0,0,0,0,0,0,0,0
- ;
- ; data area
- ;
- ds 128 ; 64 level stack
- stack equ $ ;local stack
- ;
- oldstk
- ds 2 ; storage for old CP/M stack pointer
- ;
- dbuf: db ' ' ; use blanks for initialization data
- db ' '
- db ' '
- db ' '
- db ' '
- db ' '
- db ' '
- db ' '
- ;
- end
-