         .OUTPI ALFRES
         .ENTRY WRTCDE
         .VIRT8 AX,OPTR,WTEMP,ZPAG
;Write_Code outputs ax to the output file
;
WRTCDE   LDA #15
         SEC
         SBC NBITS
         TAX
WRT001   ASL AX      ;Butt data against the wall
         ROL AX+1
         DEX
         BPL WRT001
         LDA BITOFF
         STA OPTR
         LDA BITOFF+1
         STA OPTR+1
         ORA OPTR    ;If first time, zero buffer
         BNE WRT002
         JSR ZERBUF
WRT002   LDX #2      ;Divide to find byte offset
WRT003   LSR OPTR+1
         ROR OPTR    ;optr=bit_offset/2/2/2
         DEX
         BPL WRT003
         LDA OPTR               ;SAVE OFFSET AND CALC REAL ADDRESS
         STA WTEMP              ;OF TARGET BYTE IN BUFFER
         CLC
         ADC OUTBUF
         STA OPTR
         LDA OPTR+1
         STA WTEMP+1
         ADC OUTBUF+1
         STA OPTR+1
         LDA BITOFF
         AND #$07
         STA WTEMP
         BNE WRT004             ;IS IT A BYTE BOUNDARY
         LDY #0
         LDA AX+1               ;STUFF CODE IN BUFFER
         STA (OPTR),Y
         INY
         LDA AX
         STA (OPTR),Y
         JMP WRT007
WRT004   LDA AX                 ;SETUP OVERLAY BYTES
         STA NCODE
         LDA AX+1
         STA NCODE+1
         LDA #0
         STA NCODE+2
         LDA #7
         SEC
         SBC WTEMP              ;CALC LEFT SHIFTS REQUIRED
         TAX
WRT005   ASL NCODE
         ROL NCODE+1
         ROL NCODE+2
         DEX
         BPL WRT005
         LDY #0
         LDX #2
WRT006   LDA NCODE,X
         ORA (OPTR),Y           ;INSERT NEW CODE
         STA (OPTR),Y
         INY
         DEX
         BPL WRT006
WRT007   LDA NBITS              ;CALC NEW BIT OFFSET
         CLC
         ADC BITOFF
         STA BITOFF
         STA OPTR
         LDA #0
         ADC BITOFF+1
         STA BITOFF+1 ;Raise the bit offset
         STA OPTR+1
;Now see if we need to flush the buffer
         LDX #2      ;Divide to find byte offset
WRT008   LSR OPTR+1
         ROR OPTR    ;optr=bit_offset/2/2/2
         DEX
         BPL WRT008
         LDA MAXBUF
         SEC
         SBC OPTR
         STA WTEMP
         LDA MAXBUF+1
         SBC OPTR+1
         STA WTEMP+1
         LDA WTEMP+1
         BEQ WRT009
         RTS         ;No need, at least a page left
WRT009   LDA WTEMP
         CMP #5      ;Near the end ?
         BCC WRT010  ;Yep, so flush it out
         RTS
WRT010   LDA OUTBUF
         STA ADR
         LDA OUTBUF+1
         STA ADR+1
         LDA OPTR
         STA LEN
         LDA OPTR+1
         STA LEN+1
         LDA CMPSIZ
         CLC
         ADC LEN
         STA CMPSIZ
         LDA CMPSIZ+1
         ADC LEN+1
         STA CMPSIZ+1
         LDA CMPSIZ+2
         ADC #0
         STA CMPSIZ+2
         LDX #D2
         JSR BPUT    ;Flush the buffer
         BPL WRT011
         LDX #.LO.ERRM04        ;SAY OUTPUT ERROR
         LDY #.HI.ERRM04
         JSR SCRPRT
         JMP IOEXIT             ;AND EXIT
WRT011   LDA OUTBUF  ;Point to last maybe data byte
         STA ZPAG
         CLC
         ADC OPTR
         STA OPTR
         LDA OUTBUF+1
         STA ZPAG+1
         ADC OPTR+1
         STA OPTR+1
         LDY #0
         LDA (OPTR),Y
         STA (ZPAG),Y ;Move it to the start
         LDA BITOFF ;Get remaining bits
         AND #$07
         STA BITOFF
         LDA #0
         STA BITOFF+1
         JSR ZERBUF
         RTS
