;midixfer (Spectrum version)
;by Stephen K Mulrine
;load any normal Spectrum program/code (less than 41456 bytes)
;and shove the whole lot through the RAM Music Machine's MIDI OUT
;fun for all the family!
	org 23296	;assemble into printer buffer
	xor a
	scf
	ld ix,24064
	ld de,17
	call 1366	;load a 17-byte header at 24064
	ld hl,(24075)	;get length of file
	ex de,hl
	ld ix,24081
	ld a,255
	scf
	call 1366	;load rest of file after header in memory
	ld a,1
	out (95),a	;replace interrupts with ACIA IRQ signal
	ld bc,127
	ld a,21
	out (c),a	;keep Spectrum's hands off ACIA
	ld de,17
	ld hl,(24075)
	add hl,de	;total number of bytes to transfer
	ex de,hl
	ld bc,383
	ld a,e
	out (c),a	;send LSB of length down cable
	ld bc,639
loop1	in a,(c)	;read status
	bit 1,a
	jr z,loop1	;wait until sent
	ld bc,383
	ld a,d
	out (c),a	;send MSB of length down cable
	ld bc,639
loop2	in a,(c)	;read status
	bit 1,a
	jr z,loop2	;wait until sent
	inc de		;can't remember why I did this
	ld hl,24064
loop3	ld bc,383	;dig those labels
	ld a,(hl)	;get byte to send
	out (c),a	;send it
	and 7
	out (254),a	;tamper with border for laffs
	ld bc,639
loop4	in a,(c)	;read status (again)
	bit 1,a
	jr z,loop4	;wait until sent (again)
	inc hl
	dec de		;I assembled this by hand, you know
	ld a,d
	or e		;all bytes sent?
	jr nz,loop3	;this is how the pros do it, honest
	ld bc,127
	ld a,131
	out (c),a	;give ACIA back to Spectrum
	xor a
	out (95),a	;restore interrupts
	ret		;auf wiedersehen
