;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