home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************
- ;* *
- ;* TEST FILE BUILDING PROGRAM - BUILDS MARKED 1024 BYTE BLOCKS *
- ;* *
- ;****************************************************************
-
- ; CP/M function call definitions
- ;
- PRINT EQU 9 ;Print string @ DE, terminate with "$"
- OPEN EQU 15 ;Open file, FCB @ DE
- CLOSE EQU 16 ;Close file, FCB @ DE
- SRCHF EQU 17 ;Search for first match, FCB @ DE
- SRCHN EQU 18 ;Search for next match, FCB @ DE
- ERASE EQU 19 ;Erase specified file(s), FCB @ DE
- READ EQU 20 ;Read from file, FCB @ DE
- WRITE EQU 21 ;Write to file, FCB @ DE
- MAKE EQU 22 ;Make a new file name in dir, FCB @ DE
- SETDMA EQU 26 ;Set DMA address for disk I/O @ DE
-
- ; CP/M Entry and FCB definitions
- ;
- BDOS EQU 0005H ;BDOS call address, or entry point
- FCB EQU 005CH ;Default FCB, set up by CP/M CCP.
-
- ; ASCII Character definitions
- ;
- CR EQU 0DH ;Carriage Return
- LF EQU 0AH ;Line Feed
-
- ORG 100H ;CPM TPA convention, program starts
-
- START: LXI H,0000 ;Save the system
- DAD SP ;stack pointer for
- SHLD OLDSP ;use at program exit.
- LXI SP,STACK ;Allocate local stack.
-
- LDA FCB+1 ;Consider the requested
- CPI ' ' ;file name. (all sp=none specified)
- JZ NONAM ;If name was specified, then
-
- LXI D,FCB ;Use the default FCB (file name)
- MVI C,ERASE ;Erase the specified file
- CALL BDOS ;if it already exists.
-
- LXI D,FCB ;Use the default FCB (file name)
- MVI C,MAKE ;Create an empty file name
- CALL BDOS ;as requested, ready to use.
-
- CALL WFILE ;Fill the new file with data
-
- LXI D,FCB ;Use the default FCB (file name)
- MVI C,CLOSE ;Close the now-written file
- CALL BDOS ;completing the file operation.
-
- NONAM: LHLD OLDSP ;Use the system stack pointer
- SPHL ;restoring SP to entry value.
- RET ;Return to operating system.
-
- ; BUILD A DATA FILE IN 1024 BYTE BLOCKS, LABELED WITH BLOCK I/D
- ;
- WFILE: MVI A,8 ;Eight sectors in each block.
- LXI H,DBLOCK ;Start at the beginning of
- WSECL: SHLD BLKPT ;the data block for each set.
- STA SECNT ;Record current sector count.
- XCHG ;DE <- Address of next sector
- MVI C,SETDMA ;Set data transfer address for
- CALL BDOS ;this sector write (128 bytes)
-
- LXI D,FCB ;Use the default FCB (file name)
- MVI C,WRITE ;Write the selected sector data
- CALL BDOS ;to the open disk file.
-
- LHLD BLKPT ;The block pointer must
- LXI D,128 ;step over one sector
- DAD D ;(128 bytes of data).
-
- LDA SECNT ;If the sector count has run out
- DCR A ;its quota of 128 byte sectors,
- JNZ WSECL ;(this block is done), then:
-
- ; COUNT UP THE LABEL IN THE DATA BLOCK, TO NEXT VALUE (IN ASCII)
- ; (NUMBER MUST HAVE BEEN PRE-INITIALIZED TO ASCII 000001)
-
- LXI H,LABEL+5 ;Point to lowest digit of label
- MVI B,6 ;Consider up to the full 6 digits
- LCNTL: MOV A,M ;Examine the current digit
- INR A ;plus 1, whether still numeric.
- MOV M,A ;Assume no overflow, number is done.
- CPI '9'+1 ;If numeric overflow did occur
- JNZ LTCMP ;then (else compare termination)
- MVI M,'0' ;reset this digit to "0"
- DCX H ;step to the next higher digit.
- DCR B ;If there was a next higher digit,
- JNZ LCNTL ;propagate the carry. (else truncate)
-
-
- ; COMPARE THE DATA BLOCK LABEL WITH THE TERMINATION VALUE (IN ASCII)
- ; (TERMINATION VALUE MUST HAVE BEEN PRESET TO AN ASCII NUMBER)
- ;
- LTCMP: LXI H,LABEL ;Point to highest digit of label
- LXI D,TERMV ;Point to highest digit of terminator
- MVI B,6 ;Compare up to 6 equal digits.
- LTCML: LDAX D ;If the current terminator digit
- CMP M ;is the same as the current label digit
- JNZ PLNUM ;then: (else print out this label number)
- INX H ;Step over label digit
- INX D ;Step over terminator digit
- DCR B ;If there is another digit to compare
- RZ ;then: (else all digits are equal - end)
- JMP LTCML ;compare next digit of label (block number).
-
- ; PRINT OUT THE CURRENT BLOCK NUMBER BEING WRITTEN TO DISK
- ;
- PLNUM: LXI D,PLABL ;Point to label numeric string
- MVI C,PRINT ;print it out on the console
- CALL BDOS ;for operator observation.
- JMP WFILE ;write this block to disk
-
-
- DS 64 ;Local stack allocation
- STACK: ;Stack pointer initialization address
- OLDSP: DW 0080H ;System stack pointer
- BLKPT: DW DBLOCK ;Sector data pointer (in block)
- SECNT: DB 8 ;Sectors done in block - counter
- TERMV: DB '001024' ;Required block count, in ASCII
- PLABL: DB CR ;Cursor position for label display
- LABEL: ;Label occupies first 6 Chars of data block
- DBLOCK: ;Data block to be written to disk
- DB '000001 $$ Is the current block number in this test data file..',CR,LF
- DB 'Sector 1 in this block of a test file of 1024 byte data blocks',CR,LF
- DB 'ABCDEFGHI This is a test file containing 1024 byte data blocks',CR,LF
- DB 'Sector 2 in this block of a test file of 1024 byte data blocks',CR,LF
- DB 'JKLMNOPQR This is a test file containing 1024 byte data blocks',CR,LF
- DB 'Sector 3 in this block of a test file of 1024 byte data blocks',CR,LF
- DB 'STUVWXYZ. This is a test file containing 1024 byte data blocks',CR,LF
- DB 'Sector 4 in this block of a test file of 1024 byte data blocks',CR,LF
- DB 'abcdefghi This is a test file containing 1024 byte data blocks',CR,LF
- DB 'Sector 5 in this block of a test file of 1024 byte data blocks',CR,LF
- DB 'jklmnopqr This is a test file containing 1024 byte data blocks',CR,LF
- DB 'Sector 6 in this block of a test file of 1024 byte data blocks',CR,LF
- DB 'stuvwxyz. This is a test file containing 1024 byte data blocks',CR,LF
- DB 'Sector 7 in this block of a test file of 1024 byte data blocks',CR,LF
- DB '123456789 This is a test file containing 1024 byte data blocks',CR,LF
- DB 'Sector 8 in this block of a test file of 1024 byte data blocks',CR,LF
-
- END
-
-