;RAMDSKA2.68K	JUL-01-88	(ALSO SEE "INFOSTR")
;RAM DISK HANDLER FOR WRITE-PROTECTED KICKSTART RAM.
;
;REVISION HISTORY:
;
;INPUTS:
;    NBLKS:	NUMBER OF BLOCKS TO READ/WRITE
;    FADDR:	ADDRESS IN MEMORY TO WRITE/READ
;    BLKNOX:	BLOCK ON THE DISK TO START READ/WRITE

	NOLIST
	INCLUDE	SYSPAG
	LIST

UNTNUM	EQU	2		;UNIT NUMBER OF RAM DISK

SIZE	EQU	1024 *256	;MAX SIZE: 1024 BLOCKS
				; (ALSO SEE "INFOSTR")
ALTRAM	EQU	$74200		;BASE ADDRESS OF ALTERNATE RAM SPACE
				; HOLDS 6 BLOCKS ($600 BYTES)
SCRBLK	EQU	184		;BLOCK WHERE SCRATCH.SYS APPEARS

BASE0	EQU	$FBFE00		;BASE ADDRESS OF RAM DISK SPACE
;THE BOOT BOOT (THE REAL BOOT IN REAL ROM) DOES NOT COPY THE TWO BLOCKS
; CONTAINING "KICK" INTO RAM, HENCE THE RAM DISK APPEARS TO START AT
; FBFE00 (= FC0000 - 200). THIS UNIT IS 1024 BLOCKS LONG, AND IT
; ACTUALLY CONTAINS BLOCKS 2-1025. IN PRACTICE ONLY BLOCKS 9-1023 ARE
; USED.
;
;	DISK	RAM	CONTENTS
;	0	-	KICK
;	1	-	0
;	2	FC0000	BOOT
;	3	FC0100	0
;	4-8	FC0200	UNUSED
;	9-12	FC0700	DIR
;	13-16	FC0B00	BACKUP DIR
;	17-1023	FC0F00	NORMAL FILE SPACE
;	1024	FFFE00	EXTRA BLOCK
;	1025	FFFF00	EXTRA BLOCK
;
;
;HANDY COMPARISON CHART:
;	 HEX BYTES    MEGA BYTES	  BYTES			BLOCKS
;	 $40000		1/4		  262,144		1024
;	 $80000		1/2		  524,288		2048
;	 $C0000		3/4		  786,432		3072
;	$100000		1		1,048,576		4096

	ORG	$7CE00		;(END OF INTA)
START	EQU	@		;ADDRESS WHERE THIS HANDLER STARTS

;-----------------------------------------------------------------------
;
RAMDSK	DC.L	OPEN		;0
	DC.L	OPEN		;1
	DC.L	READ		;2
	DC.L	WRITE		;3
	DC.L	DUMMY		;4
	DC.L	GETINFO		;5
	DC.L	DUMMY		;6 (SPARE)
	DC.L	DUMMY		;7 (SPARE)

;-----------------------------------------------------------------------
;INITIALIZE ALTERNATE MEMORY WITH A COPY OF THE RAM DISK. THE DIRECTORY
; IS COPIED FROM THE ACTUAL RAM DISK TO ALTERNATE RAM. SCRATCH.SYS IS
; ASSUMED TO BE INVALID UNLESS SOMETHING HAS BEEN WRITTEN TO IT SINCE
; BOOTING UP.
;
OPEN	MOVEM.L	D0-D7/A0-A6,-(SP) ;SAVE ALL REGISTERS

	MOVEA.L	#9*256 +BASE0,A6 ;BLOCK 9 = DIRECTORY
	MOVEA.L	A6,A5		;A5:= MEMORY ADDRESS, THE REAL RAM DISK
	MOVEQ	#4,D0		;D0:= NUMBER OF BLOCKS TO WRITE
	MOVEQ	#32,D2		;USED FOR FAST INCREMENT
	BSR	DOWRITE

	MOVEM.L	(SP)+,D0-D7/A0-A6 ;RESTORE ALL REGISTERS
DUMMY	RTS

;-----------------------------------------------------------------------
;READ BYTES FROM RAM DISK AND STORE THEM INTO MEMORY
;
READ	MOVEM.L	D0-D7/A0-A6,-(SP) ;SAVE ALL REGISTERS
	BSR	SETUP		;SET UP D0, D2, A5, AND A6
	BRA.S	RD70		;ENTER LOOP CHECKING FOR ZERO BLOCKS

RD10	CMPA.L	#[SCRBLK+1]*256+BASE0,A6 ;READING ABOVE SCRATCH.SYS?
	BHI.S	RD60		;BRANCH IF SO -- DO NORMAL READ
	MOVEA.L	A6,A4		;SET UP POINTER TO ALTERNATE RAM
	CMPA.L	#SCRBLK*256+BASE0,A6 ;READING SCRATCH.SYS?
	BLO.S	RD40		;BRANCH IF NOT
	ADDA.L	#-[SCRBLK*256+BASE0] +ALTRAM +4*256, A4 ;ALT SCRATCH
	BRA.S	RD50		;GO MOVE BLOCK FROM ALTERNATE RAM (A4)
RD40
	CMPA.L	#9*256+BASE0,A6	;READING DIRECTORY?
	BLO.S	RD60		;BRANCH IF NOT -- DO NORMAL READ
	CMPA.L	#12*256+BASE0,A6
	BHI.S	RD60		;BRANCH IF NOT -- DO NORMAL READ
	ADDA.L	#-[9*256+BASE0] +ALTRAM, A4 ;POINT TO ALT DIRECTORY

;MOVE A 256-BYTE BLOCK FROM A4 TO A5, MOVE FROM ALTERNATE RAM TO MEMORY:
RD50	MOVEQ	#7,D1		;8 * 32 = 256 BYTES PER BLOCK
RD55	MOVEM.L	(A4)+,A1-A3/D3-D7 ;READ 32 BYTES AT A4
	MOVEM.L	A1-A3/D3-D7,(A5)  ;WRITE 32 BYTES AT A5
	ADDA.L	D2,A5		;+32 (POST INCREMENTING IS NOT ALLOWED)
	DBF	D1,RD55		;LOOP UNTIL ONE BLOCK IS MOVED

	ADDA.L	#256,A6		;MOVE DISK POINTER TO NEXT BLOCK
	BRA.S	RD70		;GO CHECK FOR NEXT BLOCK

;MOVE A 256-BYTE BLOCK FROM A6 TO A5, MOVE FROM DISK TO MEMORY:
RD60	MOVEQ	#7,D1		;8 * 32 = 256 BYTES PER BLOCK
RD65	MOVEM.L	(A6)+,A1-A3/D3-D7 ;READ 32 BYTES AT A6
	MOVEM.L	A1-A3/D3-D7,(A5)  ;WRITE 32 BYTES AT A5
	ADDA.L	D2,A5		;+32 (POST INCREMENTING IS NOT ALLOWED)
	DBF	D1,RD65		;LOOP UNTIL ONE BLOCK IS MOVED

RD70	DBF	D0,RD10		;DECREMENT BLOCK COUNT AND LOOP

	MOVEM.L	(SP)+,D0-D7/A0-A6 ;RESTORE ALL REGISTERS
	RTS

;-----------------------------------------------------------------------
;WRITE BYTES FROM MEMORY ONTO THE RAM DISK.
;
WRITE	MOVEM.L	D0-D7/A0-A6,-(SP)	;SAVE ALL REGISTERS

	BSR	SETUP		;SET UP D0, D2, A5, AND A6
	BSR	DOWRITE

	MOVEM.L	(SP)+,D0-D7/A0-A6	;RESTORE ALL REGISTERS
	RTS

;-----------------------------------------------------------------------
;RETURN THE ADDRESS OF THE INFORMATION BLOCK IN D0.
;
GETINFO	MOVE.L	#INFO,D0
	RTS

INFO	DC.L	START		;HANDLER START AND END ADDRESSES
	DC.L	END
	DC.L	INFOSTR
INFOSTR	ASCII	'RAMDSKA2  JUL-01-88  Memory, 1024 blocks'
	DC.B	0

;-----------------------------------------------------------------------
;SET UP REGISTERS.
; OUTPUTS:
;	D0 = NUMBER OF BLOCKS
;	D2 = 32
;	A5 = MEMORY ADDRESS
;	A6 = MEMORY ADDRESS ON RAM DISK
;
SETUP	LEA	BASE0.L,A6	;A6:= BLKNOX * 256 + BASE
	MOVE.L	BLKNOX,D0	; = MEMORY ADDRESS IN RAM DISK
	ASL.L	#8,D0
	ADDA.L	D0,A6

	MOVEA.L	FADDR,A5	;A5:= MEMORY ADDRESS

	MOVE.L	NBLKS,D0	;D0:= NBLKS

	MOVEQ	#32,D2		;USED FOR FAST INCREMENT
	RTS

;-----------------------------------------------------------------------
;WRITE BYTES FROM MEMORY ONTO THE RAM DISK
; INPUTS:
;	D0 = NUMBER OF BLOCKS
;	D2 = 32
;	A5 = MEMORY ADDRESS
;	A6 = MEMORY ADDRESS ON RAM DISK
; VIRTUALLY ALL REGISTERS ARE DISTROYED.
;
DOWRITE	BRA.S	WR70		;ENTER LOOP CHECKING FOR ZERO BLOCKS

WR10	CMPA.L	#[SCRBLK+1]*256+BASE0,A6 ;READING ABOVE SCRATCH.SYS?
	BHI.S	WR60		;BRANCH IF SO -- DO NORMAL READ
	MOVEA.L	A6,A4		;SET UP POINTER TO ALTERNATE RAM
	CMPA.L	#SCRBLK*256+BASE0,A6 ;READING SCRATCH.SYS?
	BLO.S	WR40		;BRANCH IF NOT
	ADDA.L	#-[SCRBLK*256+BASE0] +ALTRAM +4*256, A4 ;PNT TO ALT SCRATCH
	BRA.S	WR50		;GO MOVE BLOCK FROM ALTERNATE RAM (A4)
WR40
	CMPA.L	#9*256+BASE0,A6	;READING DIRECTORY?
	BLO.S	WR60		;BRANCH IF NOT -- DO NORMAL READ
	CMPA.L	#12*256+BASE0,A6
	BHI.S	WR60		;BRANCH IF NOT -- DO NORMAL READ
	ADDA.L	#-[9*256+BASE0] +ALTRAM, A4 ;POINT TO ALT DIRECTORY

;MOVE A 256-BYTE BLOCK FROM A5 TO A4, MOVE FROM MEMORY TO ALTERNATE RAM:
WR50	MOVEQ	#7,D1		;8 * 32 = 256 BYTES PER BLOCK
WR55	MOVEM.L	(A5)+,A1-A3/D3-D7 ;READ 32 BYTES AT A5
	MOVEM.L	A1-A3/D3-D7,(A4)  ;WRITE 32 BYTES AT A4
	ADDA.L	D2,A4		;+32 (POST INCREMENTING IS NOT ALLOWED)
	DBF	D1,WR55		;LOOP UNTIL ONE BLOCK IS MOVED

	ADDA.L	#256,A6		;MOVE DISK POINTER TO NEXT BLOCK
	BRA.S	WR70		;GO CHECK FOR NEXT BLOCK

WR60	JSR	VERROR		;CANNOT WRITE TO KICKSTART RAM
	ASCII	'0 - WRITE PROTECTED'
	DC.B	0
	BRA.S	WR90		;EXIT

WR70	DBF	D0,WR10		;DECREMENT BLOCK COUNT AND LOOP

WR90	RTS


	IF	@ > $7D000
	ERROR -- FILE IS TOO LONG
	ENDIF

END	EQU	@-1		;ADDRESS OF END OF HANDLER

;======================================================================
;HOOK THIS HANDLER INTO THE UNIT-HANDLER TABLE
;
	ORG	4 *UNTNUM +MAXTBL
	DC.L	SIZE /256

	ORG	4 *UNTNUM +OFFTBL
	DC.L	0

	ORG	4 *UNTNUM +UNTTBL
	DC.L	RAMDSK

	END
;
	ORG	4 *UNTNUM +MAXTBL
	DC.L	SIZE /256

	ORG	4 *UNTNUM +OFFTBL
	DC.L	0

	ORG