DataMuseum.dk

Presents historical artifacts from the history of:

Jet Computer Jet80

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Jet Computer Jet80

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦7d1918047⟧ TextFile

    Length: 5120 (0x1400)
    Types: TextFile
    Names: »BYTOT.SRC«

Derivation

└─⟦c9df7130d⟧ Bits:30005915 Pascal MT+ Release 5.2 (Jet-80)
    └─ ⟦this⟧ »BYTOT.SRC« 

TextFile

;PUTS BYTE IN FILE DESCRIPTOR
;
	NAME BYTOT
	ENTRY BYTOT,BLKOT,NAMERR,DERR
	EXT SELDSK,POPHDB,PERROR,PUSHBD
	INCLUDE DEFLT.SRC
;
;
;BYTE OUT PUTS THE BYTE PASSED IN A IN THE FILE DESCRIPTOR
;POINTED TO BY HL.  REGISTER F IS DESTOYED.
BYTOT	CALL	PUSHBD		;SAVE ALL REGISTERS EXCEPT A
	MOV	A,C		; BYTE TO WRITE ===> A
	LXI	D,BYTPT
	DAD	D		;BYTE COUNTER
	INR	M
	JNZ	NTFULL		; FALL THROUGH IF BUFFER IS FULL.

;BLKOT WRITES A 256 BYTE BLOCK WHOSE FILE DESCRIPTOR IS POINTED
;TO BY HL - BYTPT.  IT DESTROYS  DE, BC, F.
;IF LSBYT IS FF THE BLOCK IS NOT WRITTEN.  IN ANY EVENT, LSBYT IS SET TO
;ZERO.  LSBYT SERVES AS A FLAG FOR THE VERY FIRST BYTOT DONE TO A FILE.
BLKOT:	PUSH	PSW
	PUSH	H	;BYTE COUNTER
	LXI	D,-BYTPT-3
	DAD	D	;'FLAGS' BYTE
	BIT	4,M	;'RANDOMLY ACCESSED' BIT
	JZ	BLKOT1	;FILE NOT RANDOMLY ACCESSED

	IF	NOT COMPILER	;COMPILER DOESN'T USE DIRECT ACCESS
;FILE HAS BEEN RANDOMLY ACCESSED. BUFFER IS REFILLED WHEN FULL BY
;RANDOMLY WRITING THE TWO 128 BYTE BLOCKS TO THE FILE AND RANDOMLY
;READING THE NEXT TWO BLOCKS INTO THE BUFFER.
; WRITE SECOND BUFFER FIRST
	INX	H
	INX	H
	INX	H	
	PUSH	H	;FCB
	CALL	SELDSK
	LXI	D,DATAB+128
	DAD	D	;FIRST BYTE FOR OUTPUT
	XCHG
	MVI	C,26	;CODE TO SET DMA
	CALL 	CPM
	POP	D	
	PUSH	D	;SAVE FCB ADDRESS
	MVI	C,SETRAN-2  ;WRITE RANDOM,128 BYTES FROM BUFFER
	CALL	CPM
	POP	H	;FILE CONTROL BLOCK
	PUSH	H
;WRITE FIRST 128-BYTE BLOCK FROM BUFFER
	LXI	D,RANREC 
	DAD	D	;LOW BYTE OF BLOCK NUMBER
	DCR	M	;SUBTRACT ONE FOR PREVIOUS BLOCK
	MOV	A,M
	INR	A	;CHECK FOR A BORROW
	JRNZ	W2SETB	;NO BORROW
	INX	H	;HIGH BYTE
	DCR	M
	MOV	A,M
	INR	A	;CHECK FOR A BORROW
	JRNZ	W2SETB	;NO BORROW
	INX	H	;OVERFLOW BYTE
	DCR	M
W2SETB:	POP	H	
	PUSH	H	;SAVE FCB
	LXI	D,DATAB	;FIRST FREE BYTE
	DAD	D
	XCHG
	MVI	C,26	;SET DMA FOR FIRST BLOCK
	CALL	CPM
	POP	D	;FCB
	PUSH	D
	MVI	C,SETRAN-2 ;RANDOM WRITE
	CALL	CPM
;READ FIRST BLOCK FROM FILE INTO BUFFER
	POP	D
	PUSH	D	;FCB
	LXI	H,RANREC-1
	DAD	D	;SET CURRENT RECORD TO ZERO
	MVI	M,0
	LXI	H,DATAB
	DAD	D	;FIRST BYTE FOR INPUT
	XCHG
	MVI	C,26	;CODE TO SET DMA
	CALL 	CPM
	POP	H	;FCB
	PUSH	H
	DCX	H	;SECOND 'FLAGS' BYTE
	BIT	0,M	;WRITING FIRST RECORD?
	RES	0,M	;RESET FLAG
	LXI	D,RANREC+1
	DAD	D	;LOW BYTE OF BLOCK NUMBER
	JRZ	W2SETC	;NOT WRITING FIRST RECORD
	MOV	M,A	;READ BLOCKS ZERO AND ONE
	INX	H
	XRA	A
	MOV	M,A
	INX	H
	MOV	M,A
	JR	R2SETA
W2SETC:	INR	M	;ADD TWO FOR NEXT BLOCK TO READ
	INR	M
	MOV	A,M
	CPI	2
	JRNC	R2SETA	;NO CARRY
	INX	H	;HIGH BYTE
	INR	M
	JRNZ	R2SETA	;NO CARRY
	INX	H	;OVERFLOW BYTE
	INR	M
R2SETA:	POP 	D	;FILE CONTROL BLOCK
	PUSH	D
	MVI	C,SETRAN-3  ;READ RANDOM,128 BYTES INTO BUFFER
	CALL	CPM
	POP	H	;FILE CONTROL BLOCK
	PUSH	H
;READ SECOND 128-BYTE BLOCK INTO BUFFER
	LXI	D,RANREC 
	DAD	D	;LOW BYTE OF BLOCK NUMBER
	INR	M	;ADD TWO FOR NEXT BLOCK TO READ
	JRNZ	R2SETB	;NO CARRY
	INX	H	;HIGH BYTE
	INR	M
	JRNZ	R2SETB	;NO CARRY
	INX	H	;OVERFLOW BYTE
	INR	M
R2SETB:	POP 	D	;FILE CONTROL BLOCK
	PUSH	D
	LXI	H,RANREC-1
	DAD	D
	MVI	M,0	;SET CURRENT RECORD TO ZERO
	POP	D
	PUSH	D
	LXI	H,DATAB+128	;FIRST FREE BYTE
	DAD	D
	XCHG
	MVI	C,26	;SET DMA FOR SECOND BLOCK
	CALL	CPM
	POP	D	;FCB
	PUSH	D
	MVI	C,SETRAN-3 ;RANDOM READ
	CALL	CPM
;SET BYTE POINTER
	POP	H	;FCB	
	LXI	D,BYTPT	;BUFFER BYTE POINTER/COUNTER
	DAD	D
	MVI	M,0	;SET BYTE COUNT TO ZERO
	LXI	D,-BYTPT+RANREC-1
	DAD	D	;CURRENT RECORD BYTE
	MVI	M,0	;SET CURRENT RECORD TO ZERO
	POP	H
	POP	PSW
	JMP	NTFULL
	ENDIF
;
;WRITE BLOCK FOR NON-RANDOMLY ACCESSED FILES
BLKOT1:	LXI	D,LSBYT+3
	DAD	D		; LSBYT BYTE
	MOV	A,M
	MVI	M,0		; SET LSBYT TO ZERO.
	INR	A		; TEST LSBYT FOR FF
	JRZ	FIRSTC		; BRANCH IF THIS IS FROM THE FIRST CALL OF BYTOT.
	LXI	D,FCB-LSBYT
	DAD	D		; HL NOW POINTS TO FCB.
	CALL	SELDSK		; SELECT PROPER DRIVE.
	PUSH	H
	LXI	D,DATAB
	DAD	D		; HL NOW POINTS TO START OF DATA BUFFER.
	XCHG
	MVI	C,26		; CP/M CODE TO SET DMA ADDRESS.
	CALL	CPM
	POP	H
	PUSH	H
	XCHG
	MVI	C,21		; CP/M CODE TO WRITE A SECTOR.
	CALL	CPM
	ORA	A		; TEST FOR ERROR CODE.
	JRNZ	DERR
	POP	H
	PUSH	H
	LXI	D,128+DATAB
	DAD	D		; HL NOW POINTS TO SECOND HALF OF DATA BUFFER.
	XCHG
	MVI	C,26		; CP/M CODE TO SET DMA ADDRESS.
	CALL	CPM
	POP	H
	XCHG
	MVI	C,21		; CP/M CODE TO WRITE A SECTOR.
	CALL	CPM
	ORA	A
	JRNZ	DERR
FIRSTC	POP	H
	POP	PSW

NTFULL	MOV	E,M
	MVI	D,0
	DAD	D
	INX	H
	INX	H		; HL NOW POINTS TO LOCATION FOR NEW BYTE.
	MOV	M,A		; STORE BYTE IN FILE DESCRIPTOR.
	JMP	POPHDB

;THIS DIAGONOSES THE TYPE OF DISK WRITE ERROR.
DERR	LXI	H,UNKERR	;DEFAULT ERROR MESSAGE.
	CPI	1		;TEST FOR ERROR IN EXTENDING FILE.
	JRNZ	NTEXTR
	LXI	H,EXTERR
NTEXTR	CPI	2		; TEST FOR DISK FULL
	JRNZ	NTDFUL
	LXI	H,FULERR
NTDFUL	CPI	255		; TEST FOR DIRECTORY FULL
	JRNZ	NTDIRF
	LXI	H,DIRERR
NTDIRF	JMP	PERROR

UNKERR	DB	'Disk erro','r'+80H	; FOR UNDEFINED ERROR CODES.
EXTERR	DB	'Error in extending fil','e'+80H
FULERR	DB	'Disk ful','l'+80H
DIRERR	DB	'Directory ful','l'+80H
NAMERR
	IF	NOT COMPILER	;compiler doesn't need this
	DB	'Bad filename',CR,LF+80H
	ENDIF
;
«eof»