.include "./config.s" .align 2 .section .text .drawAlways: ## orig blrl ## setup stwu r1, -spAdd(r1) stmw spReg, spRegOff(r1) lis r0, (0x40-logQ)<<8|4 # (-logQ, u8) mtspr 912+gqr.q, r0 lis rConf, $conf@ha la rConf, $conf@l(rConf) ### sin, cos table lwz rSinTable, jmaSinTable$r13(r13) mr. rSinTable, rSinTable beq- .done lwz rCosTable, jmaCosTable$r13(r13) ## b b .b.end .include "b.s" .include "./drawNgon.s" .include "./drawRect.s" .b.end: ### setup GX params addi r3, r1, spOffG mr r4, r22 # r22: JUTRect {0, 0, video.width, video.height} lis r12, J2DOrthoGraph_new_0@ha la r12, J2DOrthoGraph_new_0@l(r12) bl .call # return this ### line width lbz r0, .conf.lineWidth-.conf(rConf) stb r0, 0x38(r3) ### mtx lwz r0, .conf.mtx.scale-.conf(rConf) stw r0, 0x84+0x10*0+0x4*0(r3) # Sxx [0][0] stw r0, 0x84+0x10*1+0x4*1(r3) # Syy [1][1] psq_l f0, .conf.mtx.xy-.conf(rConf), 0, gqr.s16 ps_merge10 f1, f0, f0 psq_st f0, 0x84+0x10*0+0x4*3(r3), 1, gqr0 # dx [0][3] psq_st f1, 0x84+0x10*1+0x4*3(r3), 1, gqr0 # dy [1][3] ### setup2D lis r12, J2DOrthoGraph_setPort@ha la r12, J2DOrthoGraph_setPort@l(r12) bl .call ### GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR) li r3, -1 li r4, 1 lis r12, GC2D_Hx_GxInit@ha la r12, GC2D_Hx_GxInit@l(r12) bl .call ### var li rZero, 0 lis rGX, 0xCC00 ori rGX, rGX, 0x8000 lis rPad, mPadStatus@ha lhzu rBtn, mPadStatus@l(rPad) .set aPad0, 0 .draw.bg: .set aData0, .conf.bg la rData, aData0-.conf(rConf) li r3, GX_TRIANGLEFAN li r5, 4 lwz rColor, .conf.bg.color-aData0(rData) bl drawRect .draw.button: .set aData1, .conf.button .setDataEnd .conf.button.end .draw.button.loop: ### fill lbz r4, .Ngon.$m(rData) # mask rlwnm. r4, rBtn, r4, 0x1 beq+ .draw.button.loop.stroke li r3, GX_TRIANGLEFAN li r5, .Ngon.nCircle bl drawNgon ### go back to the same Ngon subi rData, rData, .Ngon.size .draw.button.loop.stroke: ### stroke li r3, GX_LINESTRIP li r5, .Ngon.nCircle+1 bl drawNgon .draw.button.loop.next: cmplw rData, rDataEnd blt+ .draw.button.loop .draw.trigger: .setDataEnd .conf.trigger.end .set aPadU, 4 .set aPad1, mPadButton$mPadStatus+0x10-aPadU # [0x10]=L(float) la rPad, aPad1-aPad0(rPad) .draw.trigger.loop: ### fill lbz r4, 4(rData) # mask rlwnm. r4, rBtn, r4, 0x1 psq_l f0, .TriggerInfo$stroke.x1(rData), 1, gqr.u8 lfsu f1, 4(rPad) bne- .draw.trigger.loop.fill.draw #### analog /** * f0 = x0 * f1 = input * f2 = w * ans = w*input+x0 = f1*f2+f0 */ psq_l f0, .TriggerInfo$fill.x0(rData), 1, gqr.u8 psq_l f2, .TriggerInfo$width.analog(rData), 1, gqr.s8 fmadds f0, f1, f2, f0 .draw.trigger.loop.fill.draw: psq_st f0, .TriggerInfo$fill.x1(rData), 1, gqr.u8 li r3, GX_TRIANGLEFAN li r5, 4 lwz rColor, .conf.trigger.fill-.conf(rConf) bl drawRect addi rData, rData, .TriggerInfo.size ### stroke li r3, GX_LINESTRIP li r5, 5 lwz rColor, .conf.trigger.stroke-.conf(rConf) bl drawRect .draw.trigger.loop.next: cmplw rData, rDataEnd blt+ .draw.trigger.loop .set aPad0, aPad1+aPadU*2 .draw.stick: .setDataEnd .conf.stick.end .set aPadU, mPadSStick$mPadStatus-mPadMStick$mPadStatus .set aPad1, mPadMStick$mPadStatus-aPadU la rPad, aPad1-aPad0(rPad) .draw.stick.loop: ### fill #### update (x, y) psq_l f0, .Ngon.$x+.Ngon.size(rData), 0, gqr.u8 # (x0, y0) (from next Ngon) psq_lu f1, aPadU(rPad), 0, gqr0 # input ps_neg f2, f1 # -input ps_merge01 f1, f1, f2 # (input.x, -input.y) psq_l f2, .Ngon.$m(rData), 1, gqr.u8 # StickMove ps_madds0 f0, f1, f2, f0 # input*StickMove+(x0, y0) psq_st f0, .Ngon.$x(rData), 0, gqr.u8 #### draw li r3, GX_TRIANGLEFAN li r5, .Ngon.nCircle bl drawNgon ### stroke li r3, GX_LINESTRIP li r5, 8+1 bl drawNgon .draw.stick.loop.next: cmplw rData, rDataEnd blt .draw.stick.loop .done: lmw spReg, spRegOff(r1) addi r1, r1, spAdd