# heartbeat demo from Hauppauge 4860 motherboard docs delay_count = 1000000 iobase = 0xF8000000 # .atmp r31 # always r31 in ATT syntax .text nop .globl _start _start: st.c %r0,%psr st.c %r0,%fsr ld.c %fir,%r0 # clear pipeline pfadd.ss %f0,%f0,%f0 pfadd.ss %f0,%f0,%f0 pfadd.ss %f0,%f0,%f0 pfmul.ss %f0,%f0,%f0 pfmul.ss %f0,%f0,%f0 pfmul.ss %f0,%f0,%f0 mov iobase, %r4 loop: #call delay # nop call getlink # (watch following delay slot!) shl %r0, %r4, %r16 # mov r4, r16 - save base(?)address addu 1, %r16, %r17 # add 1 and into r17 call putlink # (watch following delay slot!) shl %r0, %r4, %r16 # mov r4, r16 - save base(?)address br loop nop # Read a byte from the C012 getlink: ld.b 0x17(%r16), %r17 # Read C012 Output Status and 1, %r17, %r0 # if "0" (No Data) set carry st.b %r0, 0(%r0) # dummy store nop bc getlink ld.b 7(%r16), %r16 st.b %r0, 0(%r0) # dummy store nop bri %r1 # return sub (watch following delay slot!) and 0xFF, %r16, %r16 # return data in r16, remove sign # End of function getlink # Write a byte from the C012 putlink: ld.b 0x1F(%r16), %r20 # Read C012 Input Status and 1, %r20, %r0 # if "0" (Not Ready) set carry st.b %r0, 0(%r0) # dummy store nop bc putlink # loop if carry set (not ready) st.b %r0, 0(%r0) # dummy store nop bri %r1 # return sub (watch following delay slot!) st.b %r17,0xF(%r16) # Write byte from r17 into 0xF # End of function putlink .end