( bucko | 2020. 11. 08., v – 20:42 )

Ronda kód, ami a C konveció kavarodása.

A lokális változók helye a stack, mind az ötszázé! Itt meg csak 1 van.

Azt, hogy az A és X mentve van-e hívás előtt, nem tudjuk. De azért használjuk, akkor maradjon így!

Adatmozgatás A-n keresztől nincs, tehát szabadon használható.

Így aztán a bit számlálót töltheted az A-ba (push #16) és rögtön 17 ciklussal rövidebb a program, mert a pop a is elmarad.

A 74164 élvezérelt, úgy szebb vezérelni, ahogy korábban írtam a ciklusban:

  • clock=0
  • shift
  • data out
  • clock=1
  • loop

Így "hordozható" lesz a kód, mert gyorsabb processzoron és/vagy lassabb 164-es esetén sem kell NOP-okat beszúrni.

A data vonalat felesleges "nullázni" a ciklus végén.

Gyilkoljuk ki egy kicsit a C-t! Hiszen engem már cseszegettek azért, mert a terabájtos ;) programot illik rakni a flash-be.

shift_outW macro
	lda	x, w
	call	shift_out16
	endm

shift_out16
	rept	#16
	rlcw	x
	bres	_PD_ODR, #PIN_CLK
	bccm	_PD_ODR, #PIN_DIN
	bset	_PD_ODR, #PIN_CLK
	endm
	return

Ez maximális sebességgel kishifteli a szót.

Hívása: shift_outW    w

Ha nem sok helyről hívod, akkor a betöltést lerakhatod az alsó makróba, kihagyod a return-t, és még egyszerűbb a kód.

shift_outW macro
	lda	x, w
	rept	#16
	rlcw	x
	bres	_PD_ODR, #PIN_CLK
	bccm	_PD_ODR, #PIN_DIN
	bset	_PD_ODR, #PIN_CLK
	endm
	endm

Jólvanna! Nem ez volt a kérdés.

Szerintem a processzor készítői azért találták ki az utasításokat, hogy jól lehessen őket használni. Aztán jön a C fordító...