From 0f6b0e0ef4e8ec9d5fa6268e386726e7ae15633d Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 5 Dec 2017 16:16:38 -0500 Subject: [PATCH] dlowres_mode7: add initial checkin --- dlowres_mode7/Makefile | 27 + dlowres_mode7/apple2_1000.inc | 12 + dlowres_mode7/dlowres_flying.s | 1256 +++++++++++++++++++++++++++++ dlowres_mode7/dlowres_mode7.dsk | Bin 0 -> 143360 bytes dlowres_mode7/dlowres_mode7.s | 83 ++ dlowres_mode7/dlowres_sprites.inc | 60 ++ dlowres_mode7/dlowres_utils.s | 753 +++++++++++++++++ dlowres_mode7/dlowres_zp.inc | 194 +++++ dlowres_mode7/fast_multiply.s | 349 ++++++++ 9 files changed, 2734 insertions(+) create mode 100644 dlowres_mode7/Makefile create mode 100644 dlowres_mode7/apple2_1000.inc create mode 100644 dlowres_mode7/dlowres_flying.s create mode 100644 dlowres_mode7/dlowres_mode7.dsk create mode 100644 dlowres_mode7/dlowres_mode7.s create mode 100644 dlowres_mode7/dlowres_sprites.inc create mode 100644 dlowres_mode7/dlowres_utils.s create mode 100644 dlowres_mode7/dlowres_zp.inc create mode 100644 dlowres_mode7/fast_multiply.s diff --git a/dlowres_mode7/Makefile b/dlowres_mode7/Makefile new file mode 100644 index 00000000..a0202ffd --- /dev/null +++ b/dlowres_mode7/Makefile @@ -0,0 +1,27 @@ +include ../Makefile.inc + +DOS33 = ../dos33fs-utils/dos33 +PNG2GR = ../gr-utils/png2gr +PNG2RLE = ../gr-utils/png2rle + +all: dlowres_mode7.dsk + +$(DOS33): + cd ../dos33fs-utils && make + +dlowres_mode7.dsk: $(DOS33) DLOWRES_MODE7 + $(DOS33) -y dlowres_mode7.dsk BSAVE -a 0x1000 DLOWRES_MODE7 + +### + +DLOWRES_MODE7: dlowres_mode7.o + ld65 -o DLOWRES_MODE7 dlowres_mode7.o -C ./apple2_1000.inc + +dlowres_mode7.o: dlowres_mode7.s \ + dlowres_flying.s fast_multiply.s \ + dlowres_utils.s dlowres_zp.inc + ca65 -o dlowres_mode7.o dlowres_mode7.s -l dlowres_mode7.lst + +clean: + rm -f *~ *.o *.lst + diff --git a/dlowres_mode7/apple2_1000.inc b/dlowres_mode7/apple2_1000.inc new file mode 100644 index 00000000..e22976de --- /dev/null +++ b/dlowres_mode7/apple2_1000.inc @@ -0,0 +1,12 @@ +MEMORY { + ZP: start = $00, size = $1A, type = rw; + RAM: start = $1000, size = $8E00, file = %O; +} + +SEGMENTS { +CODE: load = RAM, type = ro; +RODATA: load = RAM, type = ro; +DATA: load = RAM, type = rw; +BSS: load = RAM, type = bss, define = yes; +ZEROPAGE: load = ZP, type = zp; +} diff --git a/dlowres_mode7/dlowres_flying.s b/dlowres_mode7/dlowres_flying.s new file mode 100644 index 00000000..9435f8eb --- /dev/null +++ b/dlowres_mode7/dlowres_flying.s @@ -0,0 +1,1256 @@ +;=========== +; CONSTANTS +;=========== +CONST_SHIPX EQU 15 +CONST_TILE_W EQU 64 +CONST_TILE_H EQU 64 +CONST_MAP_MASK_X EQU (CONST_TILE_W - 1) +CONST_MAP_MASK_Y EQU (CONST_TILE_H - 1) +CONST_LOWRES_W EQU 40 +CONST_LOWRES_H EQU 40 +CONST_BETA_I EQU $ff +CONST_BETA_F EQU $80 +CONST_SCALE_I EQU $14 +CONST_SCALE_F EQU $00 +CONST_LOWRES_HALF_I EQU $ec ; -(LOWRES_W/2) +CONST_LOWRES_HALF_F EQU $00 + +flying_start: + + ;=================== + ; Clear screen/pages + ;=================== + + jsr clear_screens +; jsr set_gr_page0 + + ;===================== + ; Set Up Double Lowres + ;===================== + + lda SET_GR ; graphics C050 + lda LORES ; lores C056 + lda TEXTGR ; mixset C053 + sta EIGHTYSTORE_OFF ; 80store C001 + sta EIGHTYCOL ; 80col C00d + lda AN3 ; AN3 C05E + + + jsr init_multiply_tables + + ;=============== + ; Init Variables + ;=============== + lda #20 + sta SHIPY + lda #0 + sta TURNING + sta ANGLE + sta SPACEX_I + sta SPACEY_I + sta CX_I + sta CX_F + sta CY_I + sta CY_F + sta DRAW_SPLASH + sta SPEED + sta SPLASH_COUNT + + lda #1 + sta ANGLE + + lda #2 ; initialize sky both pages + sta DRAW_SKY + + lda #4 ; starts out at 4.5 + sta SPACEZ_I + lda #$80 + sta SPACEZ_F + + jsr update_z_factor + +flying_loop: + + lda SPLASH_COUNT ; 3 + beq flying_keyboard ; 2nt/3 + dec SPLASH_COUNT ; decrement splash count ; 5 + +flying_keyboard: + + jsr get_key ; get keypress ; 6 + + lda LASTKEY ; 3 + +; cmp #('Q') ; if quit, then return +; bne skipskip +; rts + +;skipskip: + + cmp #('W') ; 2 + bne check_down ; 3/2nt + + ;=========== + ; UP PRESSED + ;=========== + + lda SHIPY + cmp #17 + bcc check_down ; bgt, if shipy>16 + dec SHIPY + dec SHIPY ; move ship up + inc SPACEZ_I ; incement height + jsr update_z_factor + lda #0 + sta SPLASH_COUNT + +check_down: + cmp #('S') + bne check_left + + ;============= + ; DOWN PRESSED + ;============= + + lda SHIPY + cmp #28 + bcs splashy ; ble, if shipy < 28 + inc SHIPY + inc SHIPY ; move ship down + dec SPACEZ_I ; decrement height + jsr update_z_factor + bcc check_left + +splashy: + lda #10 + sta SPLASH_COUNT + +check_left: + cmp #('A') + bne check_right + + ;============= + ; LEFT PRESSED + ;============= + + lda TURNING + bmi turn_left + beq turn_left + + lda #$0 + sta TURNING + clv + bvc check_right + +turn_left: + lda #253 ; -3 + sta TURNING + + dec ANGLE + +check_right: + cmp #('D') + bne check_speedup + + ;============== + ; RIGHT PRESSED + ;============== + + lda TURNING ;; FIXME: optimize me + bpl turn_right + lda #0 + sta TURNING + clv + bvc check_speedup + +turn_right: + lda #3 + sta TURNING + + inc ANGLE + +check_speedup: + cmp #('Z') + bne check_speeddown + + ;========= + ; SPEED UP + ;========= + lda #$8 + cmp SPEED + beq check_speeddown + inc SPEED + +check_speeddown: + cmp #('X') + bne check_brake + + ;=========== + ; SPEED DOWN + ;=========== + + lda SPEED + beq check_brake + dec SPEED + +check_brake: + cmp #(' '+128) + bne check_land + + ;============ + ; BRAKE + ;============ + lda #$0 + sta SPEED + +check_land: + cmp #13 + bne check_help + + ;===== + ; LAND + ;===== + + ; finds value in space_x.i,space_y.i + ; returns color in A + lda CX_I + sta SPACEX_I + lda CY_I + sta SPACEY_I + + jsr lookup_map + + cmp #COLOR_BOTH_LIGHTGREEN + bne must_land_on_grass + +landing_loop: + + jsr draw_background_mode7 + + ; Draw Shadow + lda #>shadow_forward + sta INH + lda #ship_forward + sta INH + lda #(grass_string) + sta OUTH + lda #<(grass_string) + sta OUTL + + jsr print_both_pages ; "NEED TO LAND ON GRASS!" + +check_help: + cmp #('H') + bne check_done + + ;===== + ; HELP + ;===== + +; jsr print_help + + lda #2 + sta DRAW_SKY + +check_done: + + ;================ + ; Wrap the Angle + ;================ + ; FIXME: only do this in right/left routine? + lda ANGLE ; 3 + and #$f ; 2 + sta ANGLE ; 3 + + ;================ + ; Handle Movement + ;================ + +speed_move: + ldx SPEED ; 3 + beq draw_background ; 2nt/3 + ;============= + lda ANGLE ; dx.i=fixed_sin[(angle+4)&0xf].i; // cos() ; 3 + clc ; 2 + adc #4 ; 2 + and #$f ; 2 + asl ; 2 + tay ; 2 + lda fixed_sin_scale,Y ; 4 + sta DX_I ; 3 + iny ; dx.f=fixed_sin[(angle+4)&0xf].f; // cos() ; 2 + lda fixed_sin_scale,Y ; 4 + sta DX_F ; 3 + + lda ANGLE ; dy.i=fixed_sin[angle&0xf].i; // sin() ; 3 + and #$f ; 2 + asl ; 2 + tay ; 2 + lda fixed_sin_scale,Y ; 4 + sta DY_I ; 3 + iny ; dx.f=fixed_sin[angle&0xf].f; // sin() ; 2 + lda fixed_sin_scale,Y ; 4 + sta DY_F ; 3 + ;============ + ; 54 +speed_loop: + + clc ; fixed_add(&cx,&dx,&cx); ; 2 + lda CX_F ; 3 + adc DX_F ; 3 + sta CX_F ; 3 + lda CX_I ; 3 + adc DX_I ; 3 + sta CX_I ; 3 + + clc ; fixed_add(&cy,&dy,&cy); ; 2 + lda CY_F ; 3 + adc DY_F ; 3 + sta CY_F ; 3 + lda CY_I ; 3 + adc DY_I ; 3 + sta CY_I ; 3 + + dex ; 2 + bne speed_loop ; 2nt/3 + ;============ + ; 45 + + ;==================== + ; Draw the background + ;==================== +draw_background: + jsr draw_background_mode7 ; 6 + +check_over_water: + ; See if we are over water + lda CX_I ; 3 + sta SPACEX_I ; 3 + lda CY_I ; 3 + sta SPACEY_I ; 3 + + jsr lookup_map ; 6 + + sec ; 2 + sbc #COLOR_BOTH_DARKBLUE ; 2 + sta OVER_LAND ; 3 + ;=========== + ; 31 + + ; Calculate whether to draw the splash + + lda #0 ; set splash drawing to 0 ; 2 + sta DRAW_SPLASH ; 3 + + lda SPEED ; if speed==0, no splash ; 3 + beq no_splash ; 2nt/3 + + lda TURNING ; 3 + beq no_turning_splash ; 2nt/3 + + lda SHIPY ; 3 + cmp #27 ; 2 + bcc no_turning_splash ; blt if shipy<25 skip ; 2nt/3 + + lda #1 ; 2 + sta SPLASH_COUNT ; 3 + +no_turning_splash: + lda OVER_LAND ; no splash if over land ; 3 + bne no_splash ; 2nt/3 + + lda SPLASH_COUNT ; no splash if splash_count expired ; 3 + beq no_splash ; 2nt/3 + + lda #1 ; 2 + sta DRAW_SPLASH ; 3 + +no_splash: + + ;============== + ; Draw the ship + ;============== + + clv ; 2 + lda TURNING ; 3 + beq draw_ship_forward ; 2nt/3 + bpl draw_ship_right ; 2nt/3 + bmi draw_ship_left ;; FIXME: optimize order ; 2nt/3 + +draw_ship_forward: + lda DRAW_SPLASH ; 2 + beq no_forward_splash ; 2nt/3 + + ; Draw Splash + lda #>splash_forward ; 2 + sta INH ; 3 + lda #shadow_forward ; 2 + sta INH ; 3 + lda #ship_forward ; 2 + sta INH ; 3 + lda #splash_right ; 2 + sta INH ; 3 + lda #shadow_right ; 2 + sta INH ; 3 + lda #ship_right ; 2 + sta INH ; 3 + lda #splash_left ; 2 + sta INH ; 3 + lda #shadow_left ; 2 + sta INH ; 3 + lda #ship_left ; 2 + sta INH ; 3 + lda #w(=H@0%+axUz%Ig|RDKDunEY6J`Yl8*v6rFB%qLc~&&JNlH<0&ds?=(w^6M zzVn^$JnlK?-gD0P(eA;1t!#D=n}DCTQ5+-PB>v3oJ;Top^3F5-x*(s{qhTU1{&ZK6 z2UHxq>kPkU*qonHoo9Ib3s0UAetSk3c?z&Ec`7zWt5K`yIK7VNSSFql?p#~TOH{S< z<`ZR@ok{awTjSD<`%z_L5Jy zdT$uJVzsZOv7db0wq;FKaOur2$j7N~`Ux{nOWTCQUrMy_moFtR@lo*E&!6T6?a~AF zOHb5GwDXI4=fQgKo_gnp^%CPeR4=j4!}T>E*E^PcMxu|^FD5nQk*LZq*vk2=@Z0*T z;2)NLQg3T{1(jecuk?OgpMLl=k{&+iXZ5>~u8Rv z0lTq##B;Ub{Ialr!N}3bUxSMY;0KC znD&U5+9IY%!OCAZ_FK|uEjs98twqA77aj5!(%Zs|FG?O_d0{PgO_x=hs4X`HH+vd} zytHO;B`7RubjY8$Qx4uhDZq8}xe#;{wYfz;7{U`azbO5!i_|B?7leh}k=$;!79k1p zw!5gR={wR+A?YpDmZ8Kf`&rBO6!{aoOK=2k1G3>%&fD^_gNo1Zk&n2hhrC|-V~KK< zr)(i8H&8FFPFX>1kvq=?fT2zW;XUdlIU$trZ?Y~zEpSu1-F3P=rA1~tQUXUq@o&q4 zNIY^=g@C^&xru|7z)&$oaR;TW7*1smb{Iacmg_@kf0NgBrCn{dFB&Ee-8r8POhwuh z?|fDqoW5^p;EGyJPOx)6TcMtHX4ibSDW!sOr}*`?balGWxoMN}C4qX$J=iRKwrNv8 z;_pb2Uxi}^fg!4)>S3OSvc@&T>>ih^%D6-RvSYl=bXvbU*$8a)~x+wjd$Jp=j%55UZ~&n(&jACeW{I%AxExWE`V=BJF7A86r|7>44hcni-{)KJQhn#52HZ`AQjs*xUT zxr|nug;avBWz@qB6n`nDW>U>e+CWCQoHa6u3{UqL;zkZk!@s`Q&@qDtrd>TS&6LEa zjl_Q_bdBZ8YlmLNUo~>*P+|>&HN?PQHgbrOSn&kwlZlQ;3Q$U76wIr;(p&={ z7s|yPMng79*IaWAGxVBkOi7`P%$JxhF%6>zUq0+gioa$sPmhcQ5(jhUF=MVAVt6(? z{j%rF__4iXK95PhWQjv4;$tX5b?uXv2sBmAWVnj7G=E9f5DV|h=Gqr;=X%=9T-pq? zE?L*Jb{r*arV@FVUDx<)-QzoqS^Q+3z&%u!9v&ucQAUV1GC~NiZoxmES%eNck)Qu!FUi!^9g+B@K_K=1L2~B z2M=mJ2M;QP1HyJOr`+nLR{FiNN;t4mU>hQVDJ#wPVDPQgwhy-CxR@nha4vSq7p#lk zVD-4-|6~pHS!{*3$hypmOk8}!62iB99OGM&CzP!Mv=&*5mVTioaVm%0$u~UN=;Ah5 zSB#=s8g=qJ8TFO)tLEG(vtlwW6=^{)>F= z($p$yQHrqbMQ~tFPItwksvM1WVd#q$0m)F?X+>pTJG-cY*9pIPdD48=E)ErzzPxEZ zn|xK8YSS02b3W@H3cq^A7py_GVm@ngZBpjgYP*%x*zCfqfM2BRj$$Y5iJ6i|{F!Sy zM#QWY!Of^Q%v!LeJd{aF6|>QeZhTpYeMRDHlchB0e04f1C(s+!RQtJmg!~!UuRYX} z<<9aCta!^@p(d=S6W&2_jH^s$R%Z*-x77XuMX4?97~>w}H&h&Q#g~s!h^?r8#bG!J zlqX&Z{bTlXfGDUBbdL!1kPJ=P?(74!nC(~B8q@70LX9jd`htrPUW|K$KVDXVO9=3j zbo=TNo2p+)YmU&@#zN)&NC}_?OBQVAu2xw z9Ll8zj-L*&eg?syi$&1IN=7)e7K=R(H2^Emmp0l?t@nPpGT`2IdZnz|_2o)ChQlc< zUBfW~{@;RU8lHK;^IMPIL#^EGJNS%om1WhXt0u3quPR*9jdvXNX=zPIb zrE9pYvNFGNhkU}erBccuAbrCx!l3k8llKLWOhzcR&Y+fT!t-u3FHEjRecs}6PVuD9 zc24%Bspi~LIp?NIouPLqc}X~VRlkPcdMY3A>@b}0Ztyr~V1`-it@8x5R-tlDk&9ZE zfyc&st49{9Mm9`-rczcB%&E^fkE(Lq&SNU?lxLhrR1znvy|;S;oby(Xt?XI5?UhQr z4A{Q(*nIWg_{y5NO1pQPr)I0iZkt?v@SyF6leU7OZDx?z1;K)#@TX_IlRbeRR_{%o zWvNAJDq9L(geq4jOZH`{gdLTzaE+uwX@r+n2`@e4yveilMvtv-)tq#Sq@Ci?c^ZtB z)&@f*Az=^2FZsFWrTzPt-r%WHHB9w9HEM_93;Viy5VOr+wGP?w{#ODIG+hxGT*WM% z;@SDUNAA4?o*heX_N=?vQ%N!V;qyD?2W&f6!FjZbLac4|D#i6X0~*5FUGgo~ba>F2 zZdp@QacCX*>Os)elA7=vx5l<&6=(-U|Kh-BRV+xzAEIrhcmjjq)O*lWw)aDv$X@Nm>QN>+bLb9>hF>8j|0y z(zRuvlsn`v0xvX7kkYP;1*HOXiaR|d^D6J19-Xe*oh@tKS?}db6-(UN@6D7dV&umW zo*`8*^5@<=Jo4|BPXN-2yFBi!6@?z#ewS4$3sEW>QW^`+?)S(C0xN~GXKjzKLTwA{ zp2btuUQ6XPzy{!b^KWb~U{CUtEwSW-Tws7PBkfNVjuYDcSZ^ z(tu4QNvB^|!5`41b@&anA62nH-yxq=BY};ra%b6|Is@xhXS}y~NGWdd*oWWm$x{g} ztEA$I_j}M)2@LgLhmu<{$rfQuvF%n2gG);O47^6y?mv! z!ROUhI`KI~i>44-NR;qgm9S)ue9Ct33le2}`#DS?cX+&WJhIL^*MkR)M&lw#lFs!Y zDZZVcVN|x3HDabaOUw|)traG%6_VDXMVy;`w(2!XR|^axpJc8PPAhq=UkgfvUxhW` zW3o_ih2J1X_`}+OL0G>wa9r@L4SYt@^nA`PX-5=z{9248luKfTx1aOg=c$?J5%xR> zMr!6L9tC0xJ||RHNu?vU`LJeH+2l0}y716y(gBCiGPiV|XUTmY0M^a()ZFK>-Md=2 z`8hn@bLM$4t_KA7I|h}lb&bRzmvr~~eRoy6Yxfl)CwI~6yFeb_cu0h8-;Qec#C@-m zh}T!|K!kIf&x*W@Y}?l^+3H*Jst*7xhBy0AZOWG>?>3+FRZ=M=Zo3c9&Y~Ca0SfgF zHqml~@qu7G5I{=8ODdSyuo|qI3-0nPFDPodzqVMc6=yG6zi8H)yH*zo;2n(HE5Vb3 z2euB|Js$VO!?$@Vva7dWUy%{`S^4XWb}W6>w`9A|rd#dRRe}d^OeJA}A{;W#tv-zO zV3P^6d7B6DYOmdc7(4kq*1BdVxJtr9y!3X@1k~y?ZcJkjcq)HOrZL+?Zad*tMaI^I z)##aoshO4T31X}JdU5BR>6Jpy2pIl?cf>2icWrO}Sty88e7oa?6t^;XlSdO?8WSk- z-nq7dLzlE&=|(Rh&Bp~2Ftyz6sci5eV|>cmOupdRr400rfZAI~`sf*qLEhL(ltqdm z9scR(Bo40k6(1t(%5)vL6h(i*GPngqf^UqU2K06VVe!~@!su``E~br z0>)kUcy`_G!DALkCnIBEpB;mJZ6PKWG|bulf^I_KlO&EzYIrE)@hC{DotVaUNosKB z-&4U1DaHJR$ta-Rfx$~#hA9+tw3W0*+?ogX2V&P;v8OGdDKgvL@1^~{2(JaFtH?}K zw+f35^5m)HXG3it>7uXt>|UQo%=B*bh#7W)`(s56Ep0cAl@Qq`*F+*paFQNtLIXXzcD zhI=KewhZ$uriA@PhQoHWq4O1=x5(pc^m%8K9_YnaI`mi#>9Ot%XRgPc>CE%kUHvva z;8~X8z!JmNe?!I!2_I}z_y^4@%19nChoAiNAFZs229TB9(TGk-{WN}#dNQ#QXK8RdZ(I1O!K%$Ij4HOY^6BL ztF9EUw&zUB*=@_s+&(pPdefBrUE{2oIlHp5ZQ0YBY`NoJ&!0r>akkv4O;fTnw`b4H zes#u_oM}yYxl?nd<>cNekt6Gzv6eczt#HYwym%F-^dUQJj>9Ht_q66w`Pig(ZB>t zsk0^+t8v;gCta7Hd0n^%Z1xK3v>Woyl0*L2P05@nOv}v`Y?)K8Ya;As zvd@<))iGVFQ%6xInu?*7 z>flfn%1=+VG_|(A;rebrRXK=cP+MiWwdt)lns@K7-(0tOBh~m=-6eli*UYH7r)H@4 zX>VuE=QX2ij9%xuUf##*9;{iCh4PI&*1m<;y%*1hcWV)I75hr+trx!ab_Bf1^ZKe!LM_Le}#@seEmt^G%;~ zx6k{Tud;cg^G`nKTR!hLUuDZi;p$pJzg~E!UbtpGFfr;j`5F|I1|?BL%SKF!&f~s@ zk2g9yeGU6JIzRO-ea|NaoqK%F4}IQ`>YRV^nQgbMmncu=pM3lGjF7*;oP(W_zx%w6 zKIa!c?^d4+VzDcO&p)IpJ5ZJTNLAidXM4Dg zB>5r~*@?&_i2MwZ0#zqe*N`;{2*dB&fS^^V+Tfy!mW{RjzD9VVwl-$NSgY{!4Z`m> z6xnU}5IpazKH)Dl;WPw!!&roo+O`9!U#LY|DI@l6pYv@W654*ZK`L`TQ>QHYo*@MQ z$EZ%M%ActV)qIFlsB|RDPdnRv^6}1nK3gAe7d}>H57&{TN~=_MY{XaI=8aok+qmRS zA4+c)ZdqSD6m96zFIic)VQg9qUa4C)jIAybp7hqNtZQkJKlZ-mtJ&>CIKB2y_!NQ+ z(}lL@C8`QTBo-7W?WDhv1|u!e(^*+3j9iERs+flLb=cFxl4DV}_jtXSC5$C-{FBzI zy%`gt!dGBw+60#iWiv1?&vK+tis{nmbhY?SdveoSLPc_sh>tglS?ENVqQZ@c#1aH?Uzqh>Gv!NB)U|aTy>R4>j;N?vgAWmR(Zeh;mRs%apmTX zz!I`+C1XvX&f&mbrgO{2B@G)}u!V?a?9AGlhK-IiwR~uKphMVJFHERM!K$bLSH;Lo z72EI{`g21I`m=rb+rDDjF0`*lvMIIFD|j~0lkDENeQ5w+9|o63z+xZDY=HNWE`bmkbl3nxK9oN1VwR1yIxr@{!Q+oX zz@_&7jZ}~K1K35LqG}0DO7zmVd`r-Orqtrg^jPQnKJ(na_?&<9fuys|H}|hT=LbI2 zE*Ph6Q)+8o_jy}=O9Et9cHKL^nm=R7M1u-b^Qs5Xn(ZF!@vb}Rb5TI%QFE!ad`&~$ zx-E6GZrzrRGI&FkEq%If$#OIXG6m`E+I3IY)ga6ujkn1|O5W^22KJ@OUM;qJ@lB44 zRcb7z+N1Xpgb2^*a6C>8lDU7Uw zVSP;p>U9Yo$E@dTD(hO7jdlLn7iupgLOfbbY77)u)g1OM zeZ{w=(YIfwTUrnJWaFXzK3R_qXsYudISv5CL%t=4efG`{6pai#DhxdKnpb`6w)@J* zE*jVQDgkW=Xe$ubVb!PEwavE+uSR6RIcYWs0cYS1JnA|lo z3`n!MC_LjE#mNo>2n~Z+s)pUb+ZO~ z_I!?2EkSzPR#J!l8n|Rvz?as`T*dzEGao)0R0KLZ3A3O2yaDt!%J~_2$HSO=V!he> zN!{E-bph?pPwOfYr6AtuF(h9NmY=D^gKnNho_XL`<6BD=Yu*Ex2` zofYKcu{TiX4EW?HL)pu;-3rn*0bh|>8Ap*G-+Zf1KX#l91}&|DI{66b1>*61f9C6b zye>rRs2#JHvjhFnhZ)R?w*G|hxzFb^c)T6H3AL)l6>(;?{@ndOKo`$F;G2E-KHuH# zzPmf{73QzxRql{)E(mleQ|n>hT+nC-jk)MCXgoY;7Cf>2@p_Xav2ssIEt~MgG|qPT zm4lK_=I};iuAtL-%<*_juwsKEmF!U1jjpL2aNRvI+}9gF%wPKW|9t?~?ATX(GIR2bcK{X?|2m zVpd{dO>@)(9u(_o>i5)Bk>dU1sK(q#;HE>bZ zfQnWzDwT>=sZESYWnxWg6KB$xc$3zoGsT$nrq~23flgo&R0(W?I)O{jB=8B^1YJT* zf<7TOkxHZ!nM740o2X9Y5;cjs#F#{VB3|VFtAB<^hvLqF&}_u}=V76jQ5a?rs6=5@ zqOc)RIMGK~E=a661d*vgvrBi19|=1Q!f=8f_H}&Z{>a~7J|gjAvXm$ek_ZbhtbGtn7C0%L$ri(c(Um(OyX>wo9D25B?7&qqs-7%^+oo z9}>r+gy16qM8mOX3ezXf5T@pipEe_Nin8gFl|K&qN|PvHbP95Ua3BFS5cb*KhXeZI z(;5i`@rUih^Bdu#;d4h7>WmrDa2kKNy%Po@~Jh^T8W%Odd}8 zDQu)w7cEQeNJVhS{`TaG5mtAqe{BUq=2TN0L z6oYVP@#2?jPU1WH>1AhH_OP{F<9zvOfNji^5AWZ@%R8|9h`Ru`fu`ZNH5$~C%O;u# zWH3&j+%n`=e-C^$%<}WFGyO5JXZUrnr~3QI8Pa6nCLb|e)p5jqWQYp8w2zzMDHD%W zQQqQ47j^Jp!<~%=7AFUB(lkxm=t|Q`Sx6&g5{nW)8*U(%88)0owZR(H;yxyxDnGgU z6bfN3I4YhAmtytFHOU)Jx0It4ekw3XOdArw)^9+(G)?DD8xk+aOY!2R8_o>6RGqf$ zjO`8j zbHN$$3=Yo(#h~5YiAF;=;6lBDODGaM%TFyHaz?4-loo}{PI2(+Q;R25@Pr>JzLq1r zNP){zmZi8a9h7E-yT5%zh2LI&iX<}^oD!9kXq~}!;l6})_lSL`Jo{Y~m`>?PA)ToU zioylNG_aU5BpyXmqCc~fB8Q=Y5bP*<3es>6c!Y#ci&o)@gd+1S#-A!5u}iK{L^p66 z0h4ltdpR6^=y8_@iG!s9Vv3Mw6y7qDC;2TS9`9o?N6AAij5pK8fEh^1=x1 z(#N$Tw?;c*hkV-kh?W30YemhPehOftwx}9=7P4x1TBDyzQynxApEzka)tH7GP)vYp zL^qJx)m%MuCl^wGh6dOB?)t9pRd8~fa z4^@Av7?oZXtBO;_|4Jv2enWNam&-KXzkn1ytGut^c>~_6kn|cIIJ?1F39X8h^kLzLQ zdVCFykjhgC5}WH|MUd-5GSVw{S5ycM2znq4!2fh^fL$N9K|jcif!)pxn8TT-bLQz> zkLg_BcFxoepgtDBIV5)kV}o4Z3eH@?nJPGa1@W6IM&X8&sUkTssPDVn+_$14HmD!) z@25#P9E}^<091%#Cz7BZz{G9{NP>i;+e!N-qFv5ML`g{KfLh28A|zEK zXRhITRFKvoLG+wpa&m=fOa&=BiZ;64+GkF(slqfsX$Y{tjy_&!lG(Ad;BO zK@;hm@1mEYa!@D9U@TN8iKG=suMU@&RHGg|BnQC^>`=`kiD^u`Y0Mncn0d)*cGEEY z&q+?To09PlpgkE6$Y|nGFz0Y%+PN|Ba$_ozOM}Vtg2|(T$!S5;FjPV?c^EwHNNyT7 z4}6+>;D1iCQVNralqfmYZtANP4P{3$2fWJ-K=-ZyKgpwm$*4(l(269cc2mN1F2T+v z%;6H+O$xGN+hHqDik;LFs*Bj|`T=u(fYI$AW{FF#oSLHALWqjfMncLztXQfoHI=4% z3-J_fQ5Dh_`gXby#zGgWVCWRZe|yMP;`3=rWu&tZ3xm6}z#;~CBz5;xN;n*kR5bSF z=uA3`9t*s&VHcNi!x##7m<)}X$+QYlcRi9kpS zuHSSzA3Ph9VNeqW)C8@j_*Oatu`(SCSlCvhlqeC)PGee8NBKBbDAR3B*wC_yVo;9^ zt*4auX$nT0W;5N!hUgm3#^7{j8@-u+g|6+g+XxqEKZC9-Jx{Ry3XGr7S1_C515PN9 zFb+zB62ur`Bp0kt%Yj)|ifHSh(_q7u-W zjFt)pQ&R^P(&K4PT}V%lE2KNvLb`+w(#Lr~RavOt4jOd^(-Bih-;KJy8#R0vdyl4& z&ZVz|$%-lL^$zgvM1L5MRBf6dovRMgzos29LAn(5G-1<5=&9Q24y115g7h)EoIb_^ zSEb;o9spijJmU0ks9IESs9&SobRnMFP|G$|D_z31(n~;j35~Eii*D0~xdP=j0z;{7 za4n!{0sa!0?F3H`I^dkpX@S|syhgvlY@=I|4se1*A?1rmB^((JSa2I*VC>6h?Y0 z-518FX;o+zpi~8*dN*3(Zc;)}%L1oMkmh&r{SIy`y%iTu$C%ugBi8kznnajRU zzstNw?`Ga(-bWe-y_D|Myid;s-Yle?1y>Ee3GW4c3+YAl?*aWiy@)Af3kDR@EBcVu zN8YI8S;GoRUqOoLg9-lUDZ~!apAUk|z)gmWI{#cK1V_VR^5Z{eEv8mHtrmiLcC1nb z)fOXKh)z*bc8w)$kh2(C@x&5(pQ(<~M~I<=40@5q5>F^0PIoI4WE^ymx5N<|+b|LY zNeafH3&yvqn(&U<#E2|hbrW)F(YCT83%7qOC!T5LT1hF?R6h@0f+rzBQ+?pWvlt+z z7fcU|j_(b(C){3Cs-<5EJx^yD0Gqd50-LiKmHwK8o0&u3Az~NZHog8Zfq=IeJO}9>7eZxuM|9t z9C@5b=K+V)Q|dh4VW5~iT2NW&-_Y-=^3bD}D<&WIle7ae85CEQ$7N``@R0L+DvEWW ze>fOQeOanL-*Pt+>&F&Q<$iQ_C5!A>Bt6w^uSJ{*hm zVLI9biYZ|_nG(>Dl@UIYnxeG>$oPu!UZGe?YcD|F;7kuH}|R7&|GYM>1K zzo?X27q3yEo9P(TxdS74E!rpst^*|j4qCv0`N2V-LYiTKDRF>etOn!@%*e2V zC{tN1#hg&6m7>h0Y%%Qn>3J%+Oeu$c!Q_%&z?9JUs>6mOeVEKKSuE8PJ~B4&6vNUR zX%9BgK!F;jxlH8xj+OA^ul%nL+^&V;7X+!!UIi zrpDSQKM`i3Qu}C?5^e@vLR==F?ty1V@q>%WSb>B?h*A9L7kTjKp(mA~r%i?*&ox(! zJlg06l$FfAs7v1T6V5-4{wa7}s&L7pXYgtY7-)GyAMH+_t1D)9+&*cA!N>dM3SG?a;Q;D={Zo5yBj+>!c6U?}GxtaL}S^ zCUT#NHRcj}xr$&p=xPOvtXEnvUSVW}5g7;O@Fnz<@IQ&sQluR*ohnkM(8y_3Rz6RL zM_dP84qCvWtGQ0}mt9DkPg^m@U@gJ7s#`dRx)VKRC*U>$Rb?65=)>wxW1FFb{#e~< zDoIsllzxS(4rk)_pxY2%nxKO7Mf%5Bw@9)f@z~yV6{TxPSB<3rONz+C#(Rg zC8Wk`<}B7d^a)_hVDeQ3Si2EgLDV5|nL-Au2+eq`G_bDJ?lzIt3P}%FRjA6sI;V}k z8F?v&tbdqAWJSr4)#YU5aVyMZK<}i>VF>oyFcZ;VCx-oG4TG9tvebplT&5rD_a;p~ z+8=F!HByMOljHzDS@AhAE;r(-nTZ)$&$Kc|K+*TqO8@Ih^)^yCV2~SdTIlVFiKHT9 zB3AK8M|vfBp9mTB&R(tPr6JmCGGcYZaVU7eF$0Goxl_O(G)kF!>G?3Fw6Qmdb09`d zw`yP0wyJK5CHbluk*2V+xryGV>ZJG4H|fJP01Gk?u=xl#l9X6WWii*OvY9M`0V<+_ ztR8n`zTFM?O8PCBEYJj(SUF|UJ7Hc`5p1LNA`7+e?=R3iB(E-3T#yNdaO zHe*&aYZML%mmyA(TJZz34drg5W0}vG0h;bPglVJ9;5Wn(@*}upO%WP{f+Pi=KLtan z0pcTJQZ}U&!yS0$NxIrT4)m|~=Jt;H*g|^5KUFqiPpEG#-_hRD-aNm8#YXZY{!BT+ zjor$ChHNvvn8#sb+unSKKT9^c?S?L(O0;*};lB}52>7Ol15C%m{+Tl8hOhZyh&O-? zBJp8=tUS{_N1W}RCl(7w&Hh$-l+dS_G*J9fN)S&=Ch@4*J%84KA!o#6!mmsUd>G*I z;!*666A*Ubn&%r{w}Y)@vhOSP!Oq(r?7R(1@LOe#(B~4e+vUCk`+;|?c{niEeTR7# zJ0u<(osCIiQ46tWk=PL6ZUu0U**&*lmN?fvr=UojV|L$HaF2MOdtSla;=CR5UhvnA zXWqjGRvCrzBFP6H0DLy6z#Rb@LEK3(2 zOcDzh-G$BIU*T}X?bs`J|0*Xa{>oWn&IzV5lI&b>CR_ApcaPok$;CXKcz?S4_5-}R z;Qs1OR3A{J#8T{aE`S@N`rx7x(!RXXoUSBsLCYrCWoD9N(IT{Sr0u^FclRPRc}c-t z;=ST8+z%EMV$*c?`HDe>8X8?!Mihih~J7z3lGU&JWB(#)z}4-NnxLh_4vcZZ4SJ$k*yu7sKYNH>LEh z;D!vS-c;Dzxz}vRtW18Ew$@fhRu%n<01C>*a%?J#cH#Bj?ovZ+y1RT|nON=?_bm`b_ks}M zF$GWxK>3=-?G#1bM){~ixW94;?rpewvMP9eFfmBMTpwJ8csPHDMJ>jQ<$ASlg zdxLvm4hD}Q{u_V#7@bzj^BN7uaccb7&<{t!LcbJ?(63K#bI%@$2_~b#5FZy88>`pr zV`9jos?};UuDR;65kpf44ZH+`Bl{%vHuvfYTp*i_KsUtSFnK~&#!u3(ylmv~p{Xf@ z23iPS-@XJ>LA|fYK68rAIxged(W9=sJnhoqLx&7b8I%k(L6JVWr0jt?ciud6%A^V7 z$7THVnsfze1h7&G+Ca;irx%w!cz4llH_e!ud%ZP#Y{pN2GWzPPKxyQq!-oNDQg(J0 zZgC5^caDqXlLXxAo;vjsiX8S*j(t6h0S2QuMt8L+VhCJ-p=P0kA;-NyeB8ZIEDs%; zn2cLiI61*Jmp7Mplw!W*I?C}^iaFAN(Vs_(N5qE%Z1dxQWnngb1Y#LL7jQs32sBn^ zIv&MrrNV6GAFBj%6ni4Xt!x)M9(9)nayuUGD04q9E^wEN3*8I+$v7uOi3>W!jz?uZ zItbq^Vs=~r+=c$WX|ZOU?^swMiX=J_Al48k^%WO3i=jWDJsMC8@APke6z5mmqMwGa z--Z63Y4>76`BIvW*+3^AMS+jWH{mQ9i8G|-D{(^+*BfyL#AV>n6Gt#*-mjOV(%cKpvpDO73FcWnMNBJ2;d$i@ zGCE+E=;VjN3#mX0xO`DOT_GsGa`<|7!Jk2hSKzb7(`YR4q)d`$i)r|VVj8}6F%1_e zrr{flc|)X_ygwQ8y}njd1_EJ|t&)SxtzA`syToKxt)hix2_#DK-~bbis@)ep$n-kO zr$R-S;j~wXgJ8I#*~m)C)}wFa9Fu~qmxkgr(-X>RCc9rP>!l$GZw-gz5FUx}&QO>f z_2O}=?|ieqPVTH~1xePxR0T)9q$8^r(XUUN+zpr#W}Dzh@l7Juu>%!s zJ^YM|ladJnxao!YmkIF~xsc#NxjV7q2_IY= zjHY}_X-c;^M5Pl?Vq!ljo^&rj%M_f%5y)h~^%J__3&ZdU;vgIXlzKz-U25dyYJ>$E zESSIoIqr5th=pDWSYQsq@RLkVy7o%w7$n6s4U&(9l9E%H)@)lIl?jO+Go}i{2w@^P zrDlxG965DlRwQ`i$e9B9jS!~hkzqPNPZ%jowdKwbvT|okqNe6$j>`^3Ps`1tresgc zpE8MHD`WXcA$!ua>?uf*89K6>qtGJpIg_R%E_cce)Wj~>#LPS@d+InPJVKb9pEHfh zvt?&ah13y+Or`+&DcRSYohw; z&f{b*Pa|u1Ha{Q?-MM~)m}IjXGzo2!3~p)5eKFd=tg8TGZ8 zS_>mk3-O1ThBhkZuh@)5q8LU=NKs{9jj1Iu_^3w`sZ|EbKv4!7(=SEg-5;NEJCVLq zvEd?2egsB-BpmXGAu0y4BV8VsigCfCgNvX`M`^KFjO7Kf@GA@!DsJ&e)5v0q3Y<7` z&&P6P;0Irkkxr|fos0>#D0kKcm?n&3#&;Nwcdw)c*dC?1N64;B;Z0lPf}D7@$R z@#11a>iA&ONPJADsFEY^kxHP7gP{XTT5bik0%6#kor8ziTt-e-P6k{Si_okr)SjKa z6MuFpi^^arHiOFI2{8y!fj@)ID$k%Omda2&lsJmw%Sa@Cj*tVHH_DF$H6)j;P&niu z3j|q`6NP0{ISj&GxZ%=;oDv0Bqu^@J!BvAU=wuNdiIv5&_z!1=h}aOv#V1h9;a^EG z7^ym{!s)Qi6!VlAxzgcqSRG1Fl%I4s@b7Sl4^Z-x%N@%dkW%A&j#{N=u^i;o8a1!hs&(oZwO$>oj#I~@tTfB8DwI~ua;%2sSuLw$V^}>K z%f_*|mwomwLH8W~3;oga|IzdR(ewXe^!$J5Uc<$F{+|oYGXI5x^!Lb8^!$HU<#N&U z{}=W7e=dg8bFo|;7d`(UJ^%l;3j)#e|H>i!3)~>UF?*a>Pl=xYkDmXJp8r=x&;J+V zMB7;tJ^vp){~ta7A3gscJ^zn0|IzdRIDHpA|BsWT(ewW}4Ie%KA3gscJ^vp)|Nq0B z|CcBOucKzlAEjP7`tmC-A3_b_6T5=xL#Rvn{$0VVhEPA@Q>jf?j=t=wD~6|0R{nA& zFzPAWEak^j3&zQ5TQ9rnnoXCbU4CWDxZ&fjSvZbb%I9_A zT|I_?4t<5+u7$^3c*V? zMugxkHhy~{c#Dna2*Gn0zl9LI#YPChgY`{9@LKzXgy4lr@y`jt``CCvA$Wu=5rU_X z#U}U(xFs{-3yDuBv+;w&5m%VV==qJLu9=I{|CC+Mo z<+2fEOcMAQz$2H9DvZKqhUWRCH1iG3XKx%Og>M`UHQ@|5d!g$_J$jStMzAB-jo`&~ zBiR4oy3x8G-FW^^*Nu`;kP|4#IoFNC1^kABhp!uvYS4sJ5J}7p(ZuGgCTsMM^>qdwxBJCWxZuFJ7 zyGfH@@Ve1i@DUAK$~8txY@{@V4ToL;zIG_Du9UPN$yK}gLG z-z}QnOSxN=*NgCNF1VMZFUG~9RNMwC=oPsQbSv?l=QhxDy+XHv_V#kl>hMP{el z>|BRCZqCQe&L_>zYO`~L8JCYL%+3{N=Zhrbw`S)`Gwy+PT{{ZjFxqC0+%I~=90u($ zpS^UnJpyd$!h73%&Sj%>E*jy2ktTA%XhFz}t3_+d-H+R`r2Aek75xt_886cNPd~~t z;nY8QWCOGmsCXrJn+gT1C1W(m;+6!M8EU0V%GB zT?TcOT%jvD!FoJWqXfAFw;l zkIo<6|Es-#60GR{-vyOm{do5OLNdUk^1q?0AS(YmD*rnw|2r!GJ1YM>D*rnw|2r!G zJ1YM>D*qe1K8ghIAFcdvvVZp?q=pln5x+udiy%FGKJ=mRER5CxneLkbDTHKovZn?8 zHVBn4Yw3F6Lzhg%r&+7wA*G&29P~7?JZ`@-DmC=3l&C!PDd@Awhl?FVjR(3NjBE+^ z)2gu2(9sVurI6bH5IvijM;8O1eMCRNgU~!s!dRHW*qelQ2^RTl zp-F)04IM@$Bu;Ii2V)e4zA9)IDAABy;0J%>p}!~;ZVqW+QZ>^LLZ`rk+UA()^wZc~ z1TJLx6Ae%$Oc~Mz6X6TNp)=@_5R?ff>Isy66S_4@fJ@*!JwLR=h?0~*iaaFAs~Cma zBlHt0g%2B9TIfzb@Df_@O9SA}S)AUQ(*y&5`v&=)L5XcGer z>F5*SF&-L7umg+sCOrpKEYQWH3JyeA(Io&qY-H~inv#ePI|o-{)AT;X7E|R z@+3JzY0y_5BzYpme7X;O4&?2?Qzk<1h2jV7=k)vtHo@iNQT74!EA&i8&BjBU!mW_% z{|fAUbv${R$o@Wd?X$33o{6$4+Irv)LT|69eY7F~{4W;}06sV@0Q|1r&h{Td0Ql1p z0pQQ{?yUHh0>H@`JT}RxOL7iLa$Zh^d~1@Nu}RM1NzSW?0C30x??+^TBcfN5Q%G`- zIV<`*eBf?;mq72S5gFf;x(WWaMu4_1yc?4K*)w?m5y9Ty@?-5qdj2gc|NFm7{zlq5I{tc;@A6))-h-LqGlmG3A$p8LLME>`063&tTt(1}R zr^^3G{x>Lv~O2`LwldCcidC-A3((?>FZkl)5>{^$14Ke{#|D zpV9N5dX1jfYxO#P47B^j>f`kBF;on0cg3h;*cf#T7o&;cW3(~4n3x!SOl(YCOuUZL z(K<$_(y=;((i`P=x|G?1sFAX5))Bi#z3Rfoz&nF5e`UuMf z2!1&$4(3krBVmUDDy|^OBJAt<$o-MOzkCEb(~==9V-Tb-1feGP4AF`;+$iWxcHnln z_n8aY#dh}|sJ{ECX|Jqxr4Ktf2w5WfMj`v1^uI(z-<+euclD{o z6QGqbAYLlP*K&}la;X%!3<_)AmkvrJifi|`kErk?Wi>SahDG0)N%KJT&HV}I6MYkb zepk^qUElrA6@3#16VW%Q{mw`?M{n1M_2>>?uncb-$^15QD6GMs{s7t^C|!jKRI8Owu5ioUsC|y+WY(pz`YR#;I-dH0XV3hqX7Ju ziUM%hkjR6$a}oC=0`M)00`S(}UsnMB zMo0m;9}2)p^tlSakNpb@z-!Jb0H38O0N+D){iEl9qUV3ga2h3g{^#O6{}Yw}fiqN5 z`5($FbXd#mzw|o&KbJTv|D&tPATj6S`$gq{bhUYGOsrn7(zAL+$#)m{$L)#A|G22- ze{}EMv2n5SdP-00neNaZxt|@)Qi9!X7lhD1{6feNPab737%~thCR7pM$3CIOQi%WC z3t?`z6sEu^0E;D`qK%nZV=ZH0!i}Q0b?uUZAwk%@S>a3&EW^ID*dk`i1%8qJ*zdUy z6k2Y-9mP&5wBWz+c1tLb0wAf0@0E$@`JWWr|B0Ue*^E0QL=#c;{LjU8{wFH`qf1w5 zRQ^X){zp{)M^yetRQ^X){zp{)M^yd??gaEy6{@muE4z)p88_(_Lqk>??&^={3z>IR zh4f^4I__FerzZn?CtVIhu-}H6h@1Ws!~Q~g5$g7~`ds24s|0csd!noswhJAPx=RDO z9S?VuxgQr7xXZ7l4Y$IqQX@B)TtZa-2gQ|f zlqM?wBP##n$0z@z`^g3aZD0&4L!2Q#o{FdAnRrz^8?TP%;x+Mnyf$7J9}};SkByIu zkB_6`=r|@$701S@EmMK;^H83F&45XV^y(i?0@@NvgrNK=>1Q& zF;70ce-AJ3u#?-Kr)(F`{m*lr|Nr)9wL7!_E`Rj=cUMgsG+o|{#}hsO-PP6xtwCpq zG3X7kU7#PoCwl(-qCWo}mH*SXg6kWM%KtH4obrF7@;@$a`5%-Knii-t|7f0nD1xAY z!uo;G`49;cmngCCZpI+I2k-!ijQr9mYQR_UNYt3qFo0hhjvIqSBpflpucSF&IFiM8 za4)8tKIgBV?_09s`E&j6ff_IJE?~ste=+|eLP{^zIxt?0AAPztHWUh7)Ia0J_|d0Z ziyLtR@?!oOFGisc-5T6@jv(r85f_Qq_?>S}|2QhhsE?GRcRbU)Zrj$kTo?K=l$K+g z{jas`_V0RaUDNjS;BgdBvD;hU`16}hZ+)=yjqOeKUqgzeH1W*#H{RaX+H|4Z{*y~m zW7o%CJ;&~De&=iao&^l2dd4&UofqPoATm@>l>hCf-DgvM)dv)Y-Ra-?Rd}~BL-isV zJ^u|kp)FXp1#R(X|E}%lZwrPp$1^S8K!dPL8RH`DZvu8xYwH``7&+I=P$r7mw)NH5 z|Gf3h?dPYl<%1y?G%bprU2i z^LD`q5uhaU?9O%mopRHg{;jR9om=00wWTXo@toVyOy|7SN2=w=?Y>HFh62&&h4J~5 zglRbwv!_zMpaAqG>Iz;*y<{0WRLII6mz_5)XL`0^%b7Y&7&_EKBmIU-11yano}qjms8hWM|@ZmV#iRp5RjznnS<#vrta{a^&jcuLi~pYv#0UlI(`u zd?71$ILxHM(}Za^wzfClf#a=4x82YMREhSEJN!4wyu>#>9AG*g_Ro|# zH+;~Timxm6mh&?0X(JvN&zTe^SB*D{B4wvI)v%@5Zv4FwS86a`e0&^ zg1J7p3h{cZyZTWAOi%c!;IZJr;NIXKn1jJ%i2uf4^!`Wm{s*o#+yq?`KyD^uI2P=zm@IU!ngsJnMfq z{jX0%l(jC4T;EuBuKri0jNeB8D=3BZzk*Uo|0_J*^}lve`kMaNa0$+@{}rnj(XUUN zOlT2(t}aSS5khQtQ}6m!{jVWzx*>d3|0^N;ujqe$^ZVBSx|`DQ4D~b>i?^VcsQ$`Z zPuIJUg-Rx`I+T^~iPw^8nYOXH(}eMvlcr@(y+OEIz$?nsoZLx5TH2KsY7*ZIn2+*i zU|Oe5%e!Xe$Qd(cT$+`QcbO@dPRgD(Qh65|iPOe;Q*yILP8&bnLWz8D>ZNO5qUw~l zCi1$2xUrdIZ8r!rkc}`c7ws_%^f5L_|5_EKOX(8T1JIDt7LPdn8>$x78|v5SHeDgz!2$vq zPBzGJD&bn`C6E@h1k#jj>MXiVTS(sxSx|RFMpPStK^l||t_2h=z+VEho#5#~he((L zofepF%xm-;%r?3e`2d0xA@l$3oeg|c)t&dxxp(HyOD36@BxEvqnVWGELID|HmO`KH z2e1PM8X>$)KxOMx&6K$5V~W*i^;08qb+nGgZrg?ZwEM|J9n0{zyRe_-sXo-*=n5tf zcW2k`E|tG?N8`S zHDddov!Ag>+CKgqTEwYF?pM$|dXDgBimj+M_nUu;`bxQ%S7Ked_UCg*b-NgEfs&Q5 zl>4PdC?756VQDj3xcM`@62WbOS`~V0!KZ3L`ak)Q{t3}r7+d-f+WZK)A0h4M&)^e0 zLoHxEg+I!tV1ErGeA{$@@0VWUzm{H-4xmk(Kg@?M2l%&P*NT>{NX^)8+V+-8($4w` zN`J!dlVYY8e~fRgz&@jOV;{Fpk7Y9T^=Q#NmF(ZEqd3Fgt3@gy4I;%pe@~5Ji)J81 zobQBkbbnzf8~UFS-XtT~5U@vXwRFgVT7+N+pGvVQ5J1ixs6ng*RK%8mAF(x1 zjo22T{cmSDVypSBA0e0v7;m@1-np8a&5RfFG-3;`GYisoeuB4`F+Na)GNgrtD63>V ziX$GiWbG8jn-q;V!A5Z~bCWghVp0=Va+5OOlDET} zUy_+Aj`JffF*zK#g39?W^q#9j4HPFm_%6PeTTyN`F&TYGR@~d?^92}rY~a=aO-4*>DqdA0Lk@k$sKVJvZ5dK*vYqX~;9CxWr*a8FzLB?25 zLXbCMET@nAL|HCRc6>7hoZ))dM598HC;QF1g_*{RV>M&eu*moDz_?yS%Uq9Sp=2%5 zOKv?PMbB2gUxeRrFGsM5Eu<}{Al5JPupGeW9)NnvJCffreht~a@tLu``W9h*WXo`8 zrh5+pwZOG3ET~_Rqh>-+biO@FBtw`C%6CC@#CM8NjVi9(<9Uo#$}V* z71aN{J7-#VRwJL!h;pymMStF%WmLPfZep#++ZD7@56Bc-yGpG4O0E0KT>DC0`wi%Of8!2%h>u8y|6llkbr}AC=VQbl z;X5&c4tSaT~s8A_zAA zWAw3|s~FXzjaj#El%B(gp7F0E-tJ(q(}N9tZ^+v#6ee4#Q^GqXsZiN3!J8@nGkiPhwR%r+Z0&YC#voXK z0rG|76HR9Szjv~W=$HT3>Mx(x8@Qrz*@7^pL9c3Dc=44hW-JI^8VZF1Y#L?-#M$Lm zC%fnBbm*BcvjvzHaL*cKFS%qcTaDl0uSp-OpL5CFOM9>0d&#A9de=dy!%6qg(ErLG^3utO zf*bl@W5?fIs+3wvt)-LcIl$2WGW5TcP)4c9DBd2W;t6GL7v<+>lzADYZcv#URlLoV zN68sB-i)UdtuhK?RFQp;GWQ9^D|*0UFylc?t%OZ!k5VdXVeiQ(eyDDVxP%rRC@dLg zfF`sVgNiq*lr*2c6VZ_RL2r6q-;%jKiuVbnv@5$|b2FZbOfcBxnb$?14j*LhU_(V) z(9`AdL;TCo|7r`CL?@~KSN`UYOld)>qqMNJsMI;dG{rncnPQn@ono6}pHeWzF{QAK zmEl*BGP%rDW-e38EM?X*TbaGApv+NL=w)8+mAtao9Q+F@GJtH3q~Q;K#N z`BzeI?V$Qi7kGY)fOc9t^;CJFWmwA~f%Aj+ zA3xd6cAR?jbnijacBSX`^s$jitpEI}^#3-FJ~-{P*vWOh*wtR_Wgk1rDooiQBAa@hEesF;yKBghex-)-p!Js zN9%^_=w!;5CPULkG`IlSQ8&$L&Q`w@MX57eI-)l@Mpr>7Rj6S#ba8(cYp~YTy)h#9OEudMj`7wpewUTixSUH(;H?vKZBA zX-i*Jv#K-Yhwqg&<#F4Rz3EelyJRZZC2N+)t3<&+$m_PQ+qNz(&j|JOv5@?xi*nl1 z8LTJN6HiMcN)JwjwCOQr@%-S@CQCbW+1?D{k1SsZ_3T-ecJHyK3!A7}!-EZ*8X8OG zz0~fYX!p2facBF_-)#ChQ~%<0+rve$@Pw$@u)wCim|@pO5~-+q(Wk z*=MK!KpxeSaLcIO@c5l0S0rzMHzeVs@mE6o0dY?I0a<82ApQ{Thq5v4hqn#whwiBx zfkfuNOh1bD!}@b*KWxouKm6}cqWyqgCul$XRA@gShV}#MCTKsLQFngrhcV+Z?FV#t z4(*4$^#tt)*q>MX;c3!-_@&T(SbrAnhrPP?!*kGnpz4X*4{v`8?T25CX+PX3v>$$x z*M9hqb7(&Vvf2;VmnUBSJhUHvnA3jPTt57RkD>iw_9Y5^i5b4cpOC(T)t7Mj60>}X zIX-AVl=%{>FEP)TXrMZuFL9ACafL7O^|NR{EYE8?T%VJ9xO$xS!^&LY>b%{$kEQ+a z{Dq?ZKw|?#|H06IF!Ue(kp4gQXVMEn|KSE!LCin>{-6E%e_7MgMSSDw1;(ixXs%D#!;{~x;ave4zYzu4LMg}?cz zk0XC@yD5|K_kXp?9qlVhJ5saow&Mlywj-JxZos?D;Z%$~)1EQ%GxR@L%CTEZOWjH; zNCF{HBl#lhe;E1?3sx>v7cPZJiMl{t3V*s^8N2V8I!(;nX=aB1S6SM|x()pYL;oQF zZaOB|=@@9+7_Srg>-7{AHZj#~jH$-VP*_nA?U0UZMb@GY^=L(`8HleizXIh~WK(He z57bLQtb=;1gB7j4j(VpaFcZ`bQY0V(en?^gPF7gm<6jVKj`rQZ3T{>3$tWtjxX9{p6vkt4eb60zf9VN9BlM;WNq*X zqyh6T1Z-QjcluPc)w|>!Xoh;tFWJ<|6R^&<(&WZ4R=JFOtL9zeA)|fH0I(M!>%Omg#0FI4t8=B7_TKW&a7g z8*x4?BJ~4HhA#sP_z30+KZ2g1>j3Ip52R2qBpdn1H9Ff15m@-NL%$i>M zj{Gh^N&!q8<^|NlFr^vtK7=z<_0}0T7`9{w%KR4D}<$?HN#PyYc(dZb>sCHSY!y z*K6xHX(puA{fc(FU+E{V&CIH{@eW)GBb-$rhih?!0(1~YN*Q;SBb|b@jMWFKI{11! z=`gIfk}|`3CEyn4vYF0lVs0s!rh!)h$$1Fq0~-U4NZf(~dl82S&BSO4J~&^w>_ z{2z`iTor)+`MIC{ubBAkzY+idJ^P37?0*S8`>&6KANo*BuEO&@^5&oF1Lynn_L-o;(w@q|^xDD?VI;4O!6>Kup zg-m##V2equQaLmXJE+ba;8UTZgZCA3g4~&ZuK!}J^o-~Kh2a33d&bj$!{RF&Aif{ISWFJkRRJ0%z6H4Y z%(nnHiXZ*|WcFT~i){b1&-GJ&w3T}&;q(9aJySjz=l>i0fBqCGpN#YW4gP=Z_?yd> za!a|j+~EJC8Ko_w=<#62f&5^`lgW76L>#49Y04RlnRP3JJ)XAxp4fhhnuvz{yq-4dR@nGm{F@ z!~>xOIyv{_EX4@`O@ts0v95_wLK+HmR%i7N=+HZ`4Z#dH2C;tZ(8M!u&@->iGjDw` z6!lEUUt6#~>Ivcxh0!1`khzo*mTk(sL1o^4WnNeC?o4ofCOA723}rmiA%c(zPDf@C z%{|lCV>>;i_%rx_@f}cJQ0^!%^f4dzLH*cg@|k^#&*HQCY(BfMz~}H4`igwc3Rb}@ zqzbvhRAH`ADl8S&3R{J}qM*W2QCLw_;jCnp@Gem)SDGr#l}e>0|MhZVW(@w{;QuEv z|NqgR{}-=~1C*i*v|FsknH$jqqNmW36;~>O0YK!|C(iR}#BzSQ)4E&!3297v~fg=kH9Px)> z;MHRo_;CXRKLZB(C>Z!1=fJ@KE{B2t{U^b|(dz^Z{O1A#M+^)cbrUe~GwRNdfsYxF zVc_WS92j`sdIAOx`}1Pp&k+Xxj{*a~<185Xzv&qGK49QfJrM&x{wXlQsfpcKs)3O+NYk6Ym^T5D2=P>Z@^5GwT3=G`iOO*H$m-!NZN~pKfN9^}(V!wfb zSNjrEeThZB#4@U@@g=_GODy&!R-6R`Uz5kXTXV#BbQ}hLO|I}8dAplG76$$=7X$`w z@ZSdiZSdcdlm9mOU+CJT>>zoQTAw4dd`m#*c~MwLcyGr9y!RrFtPTEGXj_&Qr(}%5 zO;D;+iq*2>q1sfz?%MQGlFD;E)HuZiWE>hj3qRjjFTp~3$$ zHf)jDuy{YK$4r(OfZuK1veb=?9jU?pV*eQYufhN3xZOMz3^LH*e+~Zk3~%g)|98Xx zyTSjS#UH%k|D6;b;`}A(BfNy1%}@FY(0dSNKjXF?`8+-c{B5VOK_6g&{ovzBU913Otq!#B5PaM_ z+)11;@pKqJi4hTMGZ-a_GA?nsNFP^q;GCp2x{1+~!36Vw8){-GqtVm}Y@@SK5P0By zi5x~R0VW~72+K5wNx!vo2t##O0}ihT5YSgR~J+}stc=& zs-1r3=YGjA`%QkcU-4V~R=>?}_ZRpbe#8H-;s4k0|J&2e-hA`v8+%-)-t_O{J<*V@ zr#oa%g&Q?bY5_$|duN8L2TqiCoPyhAM76!iceT-tCm$OXj&hG_r?Xy+A3OPYaL1|M zjqqaJ$3|*3xW!E?JE2Aiogj$S-6;ej)x4 z^2<9$evKI9*C!yqZaD|}mCBJ{Pka*c3%yPtzkVjjFT^0fP&a}6I-~CVCsp3f9=H`ZsDM5)qkxsYH^SC;P@&QV@irhi%5%izD*d~=+c=Cd$k)=sf&7>ny^ zr&UjB(cr%f{>$LM4F8YM^8t8*AfJ>2@YB#pei{^m|LWxr@y+~4U`>96wBO*r4F1dD zzrc8b=_EK&q%xX_a2&qDmG zn8*FFpwz7J;smcuumGco+1DMypHhHd#uHS|;rTgV2Tx159z5{DbT7A}97jh6e7#TsC|9N#EmEX6Tz+b#0(pq`7@QW}RhmH1S_=heg{c!`#d%kUOm3O{b} z`Fvb~hbDd<=83;2XW&u#Hq+yJkYkd;e;NFj!G9V2*Jg8^KfpI3#BqN)BY-m5OaZkM z>o#SVH&HFTLg`ldQoR;ETlszwe#gBW!4j7@;a-~!oLY-KEC+B$gx5Cd9m#K@HRk%t z_6^@uqAa^UvZXNv_!kP)0v`Hut*9;f6)Yix?!ySSxTNu2C^7gi!~Y-Hbm2kJ;J@Grl87;kOUbLG1$4lK(mq%FbtEo^0c0jU5WC7+kI7@Pf) z@6_wjkHLS@J#cdKUw&uy&G%$V4E`&BwAIPP{p3Ei!GGoU1XE?zq?%Plz0iI3NBO2$-|2?-d3(1rWL&kK4LJXXor!1CFRx*s^4^_ z!rCj81jG_@w18?P(FN*x{lEQNvHE5)_Q0?za?#|G5yy;GJye1ojznifdXVGDb+gT{ zvEIGu-(xGbZPjXb)B$Ab-BH(<88P^;KTiHDx^eWuX{WaWP}Ayq1*SHvO?_?FzwYsgX%6T}Uws;+ zSGQg-O*L$i~o0{@#b#RfOzUZb2kuSP&eZPxv3r6|jm(?ThW18iW_j`M+>6cR$+(3G?x2TmGIE5YY7OIBc%3HiGR$b;+_qf&jzhD5^ znmhpZt`2}zeii`OhkO5eMlfKAa|{@=V89T62m@9*#(=#$85ywGN|FzbOxyEdDu(NZ zUKLa*qJjQ^b!*eiTdFu%b80^o>fIUkL*slZw)^QdF>|b>TtPczrRZnEV z-u)B|*b`$6SgT;b4(7do{l9ZCU{kXU*tg0PgP#Wj_Ln&Z?61p*yFLa3X7?pLzQiTI z#8-&(D)c2veTmC`iLVj^R_ROB`VwJZ;wq~1`x5oO#Ff58(^(j><~#%TtsL(4jd2Xv znq1-9yxq66MIVg;>%Tx4FoXXx_^%6q{}Nv-r~9nwH@qnxyff`h-j%jvH1&S!N$pgZ zDsmflfa^h&dp>K-oJEynkcw!bEnNL!F;$5S#;?4u zFnu^Xj@^gPC#TDkoltuy7M~%L{R}4Y@iA0wEUnB9V}-FJ^(72u?-zsFXrDRlNKM1? zGuh=LEYHI73;J?$xB<_y!)N`{x2K1<^rK6YOWKmbHc4AH-*;b1uGP{FDSN}>%$(M# zOO`B|(<*BxwVCT0$emUe3cADHLrDxHBrBiW>c4}S2G_D=9+r6#! zmSftnbq#jPOXApxLv2dGxK0};`07OgU)k|Y;KWmeiWdw2H}_(p@&BmND;Hd~P=!~m z6)ZXIZOy)?z~)R%{a75zq&7{qYbWjAmXq4a8|LU~Vo3@(j&0Ed&%2uV`venXLN*nwa{RGoK%QLH;v5^xej=psC#EB6q6S_|} zGi6ycilUMB_T$HIjsc>|%<@bf99}#hsVPkVK+i=@H{yR3Y}b5~V7#pQ z?_2Z1d(Ah6H_m6wWbj|ueE<{n2#NSZRLBOPk<7|f_`nFrG0fAwUU<6-U{(nNufsBx ziB!}_IFsExj9LWDxrP-5*ih^7t;BM+9<6AuF=qUR`4zCcBAZI%dZ1qPZJ^%jU`1=K z%k_X+EpGTT35dYBx6$)S3&Zhfs( zGQQOC|Ao2vhW{^v|1$V5_(!k?iu!T4couh%jKO~y{FlLhf%w6#u; zX9t7-GW>s$mpg<1T3gc(4#SPGTu-sQn=gkax#fJfxu37K#|!%TDO^8mK~*2HK7=xw zN&bE7u)Uu@0v{(DKVln}Ugrluqhk&_me=r2=D4k&{}jwe1D4|aVf!#Y!VjPavWRm{ z2K@mRgvKqKz<4yEY^$&ufK4xEvd2*mJ1K4kAM_u5ac_N zGlF5^8_^eR_*P{Yyx_l}ZG<<#$KYbjLGL&BDsl5Ln3We$-bkf#*ge3Hn1|g1t`7d1 zdDzoYA0WRhRWbQEzfEp-#iXAUg5tydB7?A+---ZFdd?VlmI1!ms@I+1cVm`2)!hmY zdo2Z2dK+)X7(QopGd}@~)lx)m0lQCqWvCzC0{<@t|7GxB2LEO7U*zQzZ-?kxNwVs6 O&mDp(_W!Z+U;iJ((I*I)/4) +; square2_lo = <(((I-255)*(I-255))/4) +; square2_hi = >(((I-255)*(I-255))/4) + +; Note: DOS3.3 starts at $9600 + +square1_lo EQU $8E00 +square1_hi EQU $9000 +square2_lo EQU $9200 +square2_hi EQU $9400 + +; for(i=0;i<512;i++) { +; square1_lo[i]=((i*i)/4)&0xff; +; square1_hi[i]=(((i*i)/4)>>8)&0xff; +; square2_lo[i]=( ((i-255)*(i-255))/4)&0xff; +; square2_hi[i]=(( ((i-255)*(i-255))/4)>>8)&0xff; +; } + +init_multiply_tables: + + ; Build the add tables + + ldx #$00 + txa + .byte $c9 ; CMP #immediate - skip TYA and clear carry flag +lb1: tya + adc #$00 ; 0 +ml1: sta square1_hi,x ; square1_hi[0]=0 + tay ; y=0 + cmp #$40 ; subtract 64 and update flags (c=0) + txa ; a=0 + ror ; rotate +ml9: adc #$00 ; add 0 + sta ml9+1 ; update add value + inx ; x=1 +ml0: sta square1_lo,x ; square1_lo[0]=1 + bne lb1 ; if not zero, loop + inc ml0+2 ; increment values + inc ml1+2 ; increment values + clc ; c=0 + iny ; y=1 + bne lb1 ; loop + + ; Build the subtract tables based on the existing one + + ldx #$00 + ldy #$ff +second_table: + lda square1_hi+1,x + sta square2_hi+$100,x + lda square1_hi,x + sta square2_hi,y + lda square1_lo+1,x + sta square2_lo+$100,x + lda square1_lo,x + sta square2_lo,y + dey + inx + bne second_table + + + rts + + +; Fast 16x16 bit unsigned multiplication, 32-bit result +; Input: NUM1H:NUM1L * NUM2H:NUM2L +; Result: RESULT3:RESULT2:RESULT1:RESULT0 +; +; Does self-modifying code to hard-code NUM1H:NUM1L into the code +; carry=0: re-use previous NUM1H:NUM1L +; carry=1: reload NUM1H:NUM1L (58 cycles slower) +; +; clobbered: RESULT, X, A, C +; Allocation setup: T1,T2 and RESULT preferably on Zero-page. +; +; NUM1H (x_i), NUM1L (x_f) +; NUM2H (y_i), NUM2L (y_f) + +; NUM1L * NUM2L = AAaa +; NUM1L * NUM2H = BBbb +; NUM1H * NUM2L = CCcc +; NUM1H * NUM2H = DDdd +; +; AAaa +; BBbb +; CCcc +; + DDdd +; ---------- +; RESULT + +;fixed_16x16_mul_unsigned: + +multiply: + + bcc num1_same_as_last_time ; 2nt/3 + + ;============================ + ; Set up self-modifying code + ; this changes the code to be hard-coded to multiply by NUM1H:NUM1L + ;============================ + + lda NUM1L ; load the low byte ; 3 + sta sm1a+1 ; 3 + sta sm3a+1 ; 3 + sta sm5a+1 ; 3 + sta sm7a+1 ; 3 + eor #$ff ; invert the bits for subtracting ; 2 + sta sm2a+1 ; 3 + sta sm4a+1 ; 3 + sta sm6a+1 ; 3 + sta sm8a+1 ; 3 + lda NUM1H ; load the high byte ; 3 + sta sm1b+1 ; 3 + sta sm3b+1 ; 3 + sta sm5b+1 ; 3 +; sta sm7b+1 ; + eor #$ff ; invert the bits for subtractin ; 2 + sta sm2b+1 ; 3 + sta sm4b+1 ; 3 + sta sm6b+1 ; 3 +; sta sm8b+1 ; + ;=========== + ; 52 + +num1_same_as_last_time: + + ;========================== + ; Perform NUM1L * NUM2L = AAaa + ;========================== + + ldx NUM2L ; (low le) ; 3 + sec ; 2 +sm1a: + lda square1_lo,x ; 4 +sm2a: + sbc square2_lo,x ; 4 + + ; a is _aa + +; sta RESULT+0 ; + +sm3a: + lda square1_hi,x ; 4 +sm4a: + sbc square2_hi,x ; 4 + ; a is _AA + sta _AA+1 ; 3 + ;=========== + ; 24 + + ; Perform NUM1H * NUM2L = CCcc + sec ; 2 +sm1b: + lda square1_lo,x ; 4 +sm2b: + sbc square2_lo,x ; 4 + ; a is _cc + sta _cc+1 ; 3 +sm3b: + lda square1_hi,x ; 4 +sm4b: + sbc square2_hi,x ; 4 + ; a is _CC + sta _CC+1 ; 3 + ;=========== + ; 24 + + ;========================== + ; Perform NUM1L * NUM2H = BBbb + ;========================== + ldx NUM2H ; 3 + sec ; 2 +sm5a: + lda square1_lo,x ; 4 +sm6a: + sbc square2_lo,x ; 4 + ; a is _bb + sta _bb+1 ; 3 + +sm7a: + lda square1_hi,x ; 4 +sm8a: + sbc square2_hi,x ; 4 + ; a is _BB + sta _BB+1 ; 3 + ;=========== + ; 27 + + ;========================== + ; Perform NUM1H * NUM2H = DDdd + ;========================== + sec ; 2 +sm5b: + lda square1_lo,x ; 4 +sm6b: + sbc square2_lo,x ; 4 + ; a is _dd + sta _dd+1 ; 3 +;sm7b: +; lda square1_hi,x ; +;sm8b: +; sbc square2_hi,x ; + ; a = _DD +; sta RESULT+3 ; + ;=========== + ; 13 + + ;=========================================== + ; Add the separate multiplications together + ;=========================================== + + clc ; 2 +_AA: + lda #0 ; loading _AA ; 2 +_bb: + adc #0 ; adding in _bb ; 2 + sta RESULT+1 ; 3 + ;========== + ; 9 + ; product[2]=_BB+_CC+c + +_BB: + lda #0 ; loading _BB ; 2 +_CC: + adc #0 ; adding in _CC ; 2 + sta RESULT+2 ; 3 + ;=========== + ; 7 + + ; product[3]=_DD+c + +; bcc dd_no_carry1 ; +; inc RESULT+3 ; + clc ; 2 + ;============= + ; 2 +dd_no_carry1: + + ; product[1]=_AA+_bb+_cc + +_cc: + lda #0 ; load _cc ; 2 + adc RESULT+1 ; 3 + sta RESULT+1 ; 3 + + ; product[2]=_BB+_CC+_dd+c + +_dd: + lda #0 ; load _dd ; 2 + adc RESULT+2 ; 3 + sta RESULT+2 ; 3 + + ;=========== + ; 16 + ; product[3]=_DD+c + + +; bcc dd_no_carry2 ; +; inc RESULT+3 ; + + ;============= + ; 0 + +dd_no_carry2: + +; *z_i=product[1]; +; *z_f=product[0]; + +; rts ; 6 + + + ;================= + ; Signed multiply + ;================= + +;multiply: + +; jsr fixed_16x16_mul_unsigned ; 6 + + lda NUM1H ; x_i ; 3 + ;=========== + ; 12 + + + bpl x_positive ;^3/2nt + + sec ; 2 + lda RESULT+2 ; 3 + sbc NUM2L ; 3 + sta RESULT+2 ; 3 +; lda RESULT+3 ; +; sbc NUM2H ; +; sta RESULT+3 ; + ;============ + ; 10 + +x_positive: + + lda NUM2H ; y_i ; 3 + ;============ + ; ; 6 + + bpl y_positive ;^3/2nt + + + sec ; 2 + lda RESULT+2 ; 3 + sbc NUM1L ; 3 + sta RESULT+2 ; 3 +; lda RESULT+3 ; +; sbc NUM1H ; +; sta RESULT+3 ; + ;=========== + ; 10 + +y_positive: + ldx RESULT+2 ; *z_i=product[2]; ; 3 + lda RESULT+1 ; *z_f=product[1]; ; 3 + + rts ; 6 + ;========== + ; 12 +