Code:
(10) I create a value in AX which has AL=0 and AH=80h, then push it onto the stack. (In other words, I set bit-15 and reset the rest.)
...
(17) I recover (to EAX) the value on the stack which was put there in step (10). I then post that value to ESI+58h to set the RIRB write-pointer to the right place for the replies from the codec.
Have you accidentally deleted the line that does step (17)? You certainly need it to reset the RIRB write-pointer. I currently do that by sending 0x8000 to port 58h (though in doing so I'm writing zeros to seven reserved bits, so technically I should be reading the port first, then setting bit-15 to 1 and bits 0 to 7 to zero before sending the result back).
If you need to do further debugging experiments, it could be worth reading 4Ah to see if CORB has sent the instruction out - that would tell us if one of the DMA engines is working. I've never run my code on an emulator, and because they can sometimes be more fussy than most real hardware, there may be something else needing to be fixed before your code works on it, so study the specification and try to guess what extra things QEMU might require you to do.