⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fuzzy.prn

📁 Embedded magazine soure code for the year 1991
💻 PRN
📖 第 1 页 / 共 2 页
字号:
275 B67B 18E600   [ 5] IF_LOOP     LDAB    0,Y           Get rule byte 00AA AXXX; If X is A
276 B67E 2B63     [ 3]             BMI     THEN_LOOP     If MSB=1, exit to then loop
277 B680 CE0000   [ 3]             LDX     #CURRENT_INS  Point at current input data area
278 B683 C407     [ 2]             ANDB    #$07          Save only input number
279 B685 37       [ 3]             PSHB                  Will need input # again
280 B686 3A       [ 3]             ABX                   Point to specific input data
281 B687 A600     [ 4]             LDAA    0,X           Get current input data
282 B689 CEB600   [ 3]             LDX     #IN_MF_PTRS   Point at offsets for input MFs
283 B68C 33       [ 4]             PULB                  Recover input number 0000 0XXX
284 B68D 3A       [ 3]             ABX                   Point at pointer for this input #
285 B68E EE00     [ 5]             LDX     0,X           Get pointer into MF data area
286 B690 18E600   [ 5]             LDAB    0,Y           Get rule if part 00AA AXXX
287 B693 C438     [ 2]             ANDB    #$38          00AA A000 is 8 times AAA
288 B695 54       [ 2]             LSRB                  000A AA00 4 times AAA
289 B696 3A       [ 3]             ABX                   X points at MF points & slopes
290 B697 A100     [ 4]             CMPA    0,X           Compare input data to MF pt1
291 B699 2403     [ 3]             BHS     NOT_SEG0      Branch if not segment zero
292 B69B 5F       [ 2]             CLRB                  In seg 0 grade is zero
293 B69C 2025     [ 3]             BRA     HAVE_GRADE    Have grade of membership
294 B69E A102     [ 4] NOT_SEG0    CMPA    2,X           Compare input data to MF pt2
295 B6A0 2211     [ 3]             BHI     IS_SEG2       Branch if segment two
296 B6A2 E601     [ 4]             LDAB    1,X           Slope1 -> B
297 B6A4 2709     [ 3]             BEQ     JAM_FF        If vert slope, jam $FF
298 B6A6 A000     [ 4]             SUBA    0,X           Input value - pt1 -> A
299 B6A8 3D       [10]             MUL                   Grade in B if D < $100
300 B6A9 1A830100 [ 5]             CPD     #$100         Check for overflow
301 B6AD 2514     [ 3]             BLO     HAVE_GRADE    If < $100 grade OK in B
302 B6AF C6FF     [ 2] JAM_FF      LDAB    #$FF          Else limit B to $FF
303 B6B1 2010     [ 3]             BRA     HAVE_GRADE    Have grade of membership
304 B6B3 E603     [ 4] IS_SEG2     LDAB    3,X           Slope2 -> B
305 B6B5 A002     [ 4]             SUBA    2,X           Input value - pt2 -> A
306 B6B7 3D       [10]             MUL                   Grade in B if D < $100
307 B6B8 1A830100 [ 5]             CPD     #$100         Check for overflow
308 B6BC 2502     [ 3]             BLO     B_OK          If < $100 value in B OK
309 B6BE C6FF     [ 2]             LDAB    #$FF          Else limit B to $FF
310 B6C0 86FF     [ 2] B_OK        LDAA    #$FF          Grade should be $FF - (B)
311 B6C2 10       [ 2]             SBA                   Grade of membership in B
312 B6C3 D12C     [ 3] HAVE_GRADE  CMPB    LOWEST_IF     Is grade lowest so far ?
313 B6C5 2418     [ 3]             BHS     NOT_LOWR      Branch if not lower
314 B6C7 D72C     [ 3]             STAB    LOWEST_IF     If lower, replace lowest if
315 B6C9 2614     [ 3]             BNE     NOT_LOWR      Skip ahead if not zero
316 B6CB 1808     [ 4] FIND_THEN   INY                   Adv rule pointer to then part
317 B6CD 18E600   [ 5]             LDAB    0,Y           Get next rule byte
318 B6D0 2AF9     [ 3]             BPL     FIND_THEN     MSB set means its a then part
319 B6D2 1808     [ 4] FIND_IF     INY                   Adv rule pointer to if part
320 B6D4 18E600   [ 5]             LDAB    0,Y           Get next rule byte
321 B6D7 2A9E     [ 3]             BPL     RULE_TOP      MSB clear means its an if part
322 B6D9 C1FF     [ 2]             CMPB    #$FF          $FF is no more rules marker
323 B6DB 26F5     [ 3]             BNE     FIND_IF       Continue looking for if or $FF
324 B6DD 2020     [ 3]             BRA     DEFUZ         When all rules done, go defuzzify
325 B6DF 1808     [ 4] NOT_LOWR    INY                   Point to next rule byte
326 B6E1 2098     [ 3]             BRA     IF_LOOP       Continue for all if parts
327 B6E3 CE0008   [ 3] THEN_LOOP   LDX     #FUZ_OUTS     Point at fuzzy outputs
328 B6E6 C41F     [ 2]             ANDB    #$1F          Save 8 times out # + label #
329 B6E8 3A       [ 3]             ABX                   X points at fuzzy output
330 B6E9 962C     [ 3]             LDAA    LOWEST_IF     Grade of membership for rule
331 B6EB A100     [ 4]             CMPA    0,X           Compare to fuzzy output
332 B6ED 2502     [ 3]             BLO     NOT_HIER      Branch if not higher
333 B6EF A700     [ 4]             STAA    0,X           Grade is higher so update
334 B6F1 1808     [ 4] NOT_HIER    INY                   Point to next rule byte
335 B6F3 18E600   [ 5]             LDAB    0,Y           Get rule byte
336 B6F6 2B03     [ 3]             BMI     CHK_END       If MSB=0 its a new rule
337 B6F8 7EB677   [ 3]             JMP     RULE_TOP      Else process next rule byte
338 B6FB C1FF     [ 2] CHK_END     CMPB    #$FF          Check for end of rules flag
339 B6FD 26E4     [ 3]             BNE     THEN_LOOP     If not $FF, must be a then part
340 B6FF 18CEB644 [ 4] DEFUZ       LDY     #SGLTN_POS    Point at 1st output singleton
341 B703 CE0008   [ 3]             LDX     #FUZ_OUTS     Point at 1st fuzzy output
342 B706 7F0032   [ 6]             CLR     COGDEX        Loop index will run from 0->4
343 B709 C608     [ 2] COG_LOOP    LDAB    #8            8 fuzzy outs per COG output
344 B70B D733     [ 3]             STAB    SUMDEX        Inner loop runs 8->0
345 B70D CC0000   [ 3]             LDD     #$0000        Used for quicker clears
346 B710 DD2D     [ 4]             STD     SUM_OF_FUZ    Sum of fuzzy outputs
347 B712 DD30     [ 4]             STD     SUM_OF_PROD+1 Low 16-bits of sum of products
348 B714 972F     [ 3]             STAA    SUM_OF_PROD   Upper 8-bits
349 B716 E600     [ 4] SUM_LOOP    LDAB    0,X           Get a fuzzy output
350 B718 4F       [ 2]             CLRA                  Clear upper 8-bits
351 B719 D32D     [ 5]             ADDD    SUM_OF_FUZ    Add to sum of fuzzy outputs
352 B71B DD2D     [ 4]             STD     SUM_OF_FUZ    Update RAM variable
353 B71D A600     [ 4]             LDAA    0,X           Get fuzzy output again
354 B71F 18E600   [ 5]             LDAB    0,Y           Get Output singleton position
355 B722 3D       [10]             MUL                   Position times weight
356 B723 D330     [ 5]             ADDD    SUM_OF_PROD+1 Low 16-bits of sum of products
357 B725 DD30     [ 4]             STD     SUM_OF_PROD+1 Update low 16-bits
358 B727 962F     [ 3]             LDAA    SUM_OF_PROD   Upper 8-bits
359 B729 8900     [ 2]             ADCA    #0            Add carry from 16-bit add
360 B72B 972F     [ 3]             STAA    SUM_OF_PROD   Upper 8-bits of 24-bit sum
361 B72D 1808     [ 4]             INY                   Point at next singleton pos.
362 B72F 08       [ 3]             INX                   Point at next fuzzy output
363 B730 7A0033   [ 6]             DEC     SUMDEX        Inner loop index
364 B733 26E1     [ 3]             BNE     SUM_LOOP      For all labels this output
365 B735 3C       [ 4]             PSHX                  Save index for now
366 B736 4F       [ 2]             CLRA                  In case divide by zero
367 B737 DE2D     [ 4]             LDX     SUM_OF_FUZ    Demominator for divide
368 B739 2718     [ 3]             BEQ     SAV_OUT       Branch if denominator is 0
369 B73B 7D002F   [ 6]             TST     SUM_OF_PROD   See if more than 16-bit
370 B73E 2607     [ 3]             BNE     NUM_BIG       If not zero, # is > 16-bits
371 B740 DC30     [ 4]             LDD     SUM_OF_PROD+1 Numerator for divide
372 B742 02       [41]             IDIV                  Result in low 8-bits of X
373 B743 8F       [ 3]             XGDX                  Result now in B
374 B744 17       [ 2]             TBA                   Move result to A
375 B745 200C     [ 3]             BRA     SAV_OUT       Go save output
376 B747 DC2F     [ 4] NUM_BIG     LDD     SUM_OF_PROD   Numerator upper 16 of 24-bit
377 B749 7D0031   [ 6]             TST     SUM_OF_PROD+2 Check for rounding error
378 B74C 2A03     [ 3]             BPL     NO_ROUND      If MSB clear, don't round
379 B74E C30001   [ 4]             ADDD    #1            Round numerator up 1
380 B751 03       [41] NO_ROUND    FDIV                  D/X -> X, use upper 8 of 16
381 B752 8F       [ 3]             XGDX                  Result now in A
382 B753 CE0028   [ 3] SAV_OUT     LDX     #COG_OUTS     Point to 1st defuz output
383 B756 D632     [ 3]             LDAB    COGDEX        Curent output number
384 B758 3A       [ 3]             ABX                   Point to correct output
385 B759 A700     [ 4]             STAA    0,X           Update defuzzified output
386 B75B 38       [ 5]             PULX                  Recover index
387 B75C 5C       [ 2]             INCB                  Increment loop index
388 B75D D732     [ 3]             STAB    COGDEX        Update
389 B75F C104     [ 2]             CMPB    #4            Done with all four outs?
390 B761 26A6     [ 3]             BNE     COG_LOOP      If not, continue loop
391 
392           * Inference engine has completed one pass of all rules.
393 B763

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -