The freeze appear to on this location as if CDC status were never "ready":
Code: Select all
.waitSTAT:
	BIOS_CDCSTAT			; Check CDC status
	bcs.s	.waitSTAT		; If not ready, branch
Code: Select all
	; Set DMA to PRG-RAM
	move.b	#5,(CDC_Mode).w
	; Load Volume VolumeDescriptor
	moveq	#$10,d0					; Start Sector
	move.l	#2*$800,d1				; Read 2 sectors
	move.w	#FileSysBuffer/8,(CDC_DMA_Adr).w	; Destination
	bsr.w	ReadCD					; Read Data
	; (...)
ReadSector:    macro
.waitSTAT:
	BIOS_CDCSTAT			; Check CDC status
	bcs.s	.waitSTAT		; If not ready, branch
.waitREAD:
	BIOS_CDCREAD			; Read data
	bcs.s	.waitREAD		; If not done, branch
	BIOS_CDCACK			; Acknowledge transfer
	endm
ReadCD:
	pushr	d0-d7/a0-a6		; Store all registers
	move.l	d1,d6			; ++
	lsr.l	#8,d1			; ++ '' Bitshift filesize (to get sector count)
	lsr.l	#3,d1			; ++ ''
	andi.l	#$7FF,d6		; ++ D6 will contain the size of "incomplete" sector
	lea	BiosPacket(pc),a5	; Load bios packet
	move.l	d0,(a5)			; Write start sector to packet
	move.l	d1,4(a5)		; Write size to packet
	movea.l	a5,a0			; Put packet to a0 (for BIOS)
	tst.l	d1			; ++ Is there any "complete" sector needing to be read?
	beq.s	RCD_ByteSpecificTransfer ; ++ If not, branch
	BIOS_CDCSTOP			; Stop CDC
	BIOS_ROMREADN			; Begin data read
RCD_SectorReadLoop:
	ReadSector
	addq.l	#1, (a5)		; Increment starting sector
	addi.l	#$0800,8(a5)		; Increment destination address
	subq.l	#1,4(a5)		; Decrement sectors left
	bne.s	RCD_SectorReadLoop	; If not finished, branch
	tst.l	d6			; ++ Is there any "incomplete" sector needing to be read?
	beq.w	RCD_Return		; ++ If not, branch
RCD_ByteSpecificTransfer:		; ++
	move.l	#1,4(a5)
	move.l	8(a5),d7
	move.l	#SectorBuffer,8(a5)
	; For some reason (maybe timing?) we need to
	; re-setup the reader
	movea.l	a5,a0			; Put packet to a0 (for BIOS)
	BIOS_CDCSTOP			; Stop CDC
	BIOS_ROMREADN			; Begin data read
	ReadSector
	clr.l	4(a5)
RCD_Return:
	popr	d0-d7/a0-a6		; Restore all registers
	rts				; Return