📄 fuzzy.prn
字号:
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 + -