;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;Û                                                                           Û
;Û                             OPCODE PROCEDURES                             Û
;Û                                                                           Û
;Û                    These procedures are not optimized.                    Û
;Û                                                                           Û
;Û       NOTE: '&' - this char can use only with PROC/PROCS and MACRO.       Û
;Û                                                                           Û
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;-----------------------------------------------------------------------------
; Push all registers.
;-----------------------------------------------------------------------------
PHR MACRO
 pha
 txa
 pha
 tya
 pha
ENDM
;-----------------------------------------------------------------------------
; Pop all registers.
;-----------------------------------------------------------------------------
PLR MACRO
 pla
 tay
 pla
 tax
 pla
ENDM
;-----------------------------------------------------------------------------
; Divide YX:A=YX.A.
;-----------------------------------------------------------------------------
DIV PROC
 stx _bta_
 sty _bta_+1
 sta _btb_+2
 php
 lda #0
 sta _btb_+3
 plp
_div_print_:
 php
 lda #0
 sta _bta_+2
 STA _bta_+3
 sta _btb_+0
 sta _btb_+1
 ldx #16
_loop_div_:
 lsr _btb_+3
 ror _btb_+2
 ror _btb_+1
 ROR _btb_+0
 sec
 lda _bta_+0
 sbc _btb_+0
 tay
 lda _bta_+1
 sbc _btb_+1
 sta _div1_
 lda _bta_+2
 sbc _btb_+2
 sta _div2_
 lda _bta_+3
 sbc _btb_+3
 bcc _nxt_div_
 STY _bta_+0
 sta _bta_+3
 ldy _div1_
 lda _div2_
 sty _bta_+1
 sta _bta_+2
_nxt_div_:
 rol _rsl_
 ROL _rsl_+1
 dex
 bne _loop_div_
 ldx _rsl_
 ldy _rsl_+1
 lda _bta_
 plp
 rts
 ifndef _bta_
_bta_ dw 0,0
_btb_ dw 0,0
_rsl_ dw 0,0
 endndef
_div1_ db 0
_div2_ DB 0
ENDP
;-----------------------------------------------------------------------------
; Multiply YX*A=YXA.
;-----------------------------------------------------------------------------
MUL PROC
 php
 eor #%11111111
 STA _bta_
 stx _btb_
 sty _btb_+1
 ldx #0
 stx _btb_+2
 stx _rsl_
 stx _rsl_+1
 stx _rsl_+2
 ldx #8
_loop_mul_:
 lsr _bta_
 bcs _next_mul_
 lda _btb_
 adc _rsl_
 STA _rsl_
 lda _btb_+1
 adc _rsl_+1
 sta _rsl_+1
 lda _btb_+2
 adc _rsl_+2
 sta _rsl_+2
_next_mul_:
 ASL _btb_
 rol _btb_+1
 rol _btb_+2
 dex
 bne _loop_mul_
 lda _rsl_
 ldx _rsl_+1
 ldy _rsl_+2
 plp
 RTS
 ifndef _bta_
_bta_ DW 0,0
_btb_ dw 0,0
_rsl_ dw 0,0
 endndef
ENDP
;-----------------------------------------------------------------------------
; Add with CF=0.
;-----------------------------------------------------------------------------
ADD MACRO operand
   clc
   adc operand
ENDM
;-----------------------------------------------------------------------------
; Substract with CF=1.
;-----------------------------------------------------------------------------
SUB MACRO operand
   SEC
   SBC operand
ENDM
