[ บทความ : เรียนรู้ z80 ] ตอนที่ 17 เรื่อง เก็บตกคำสั่งที่จำเป็น

เรียนรู้ Z80 ตอนที่ 17

เก็บตกคำสั่งที่จำเป็น

ในบทความสำหรับสัปดาห์นี้เราจะมาเก็บตกคำสั่งที่มีความจำเป็นแต่ผมดันลืมอธิบาย (ไม่น่าให้อภัยเลย) ... คำสั่งเหล่านั้นคือ inc, dec, halt, di, ei และ nop ซึ่ง รูปแบบ และการทำงานของคำสั่งดังกล่าวจะเป็นดังนี้ครับ

ตาราง 17-1 เก็บตก

Instruction
Source/Target
Flag
Operation
INC
s
Z, V, S, N=0, H
เพิ่มค่าขึ้น 1
DEC
s
Z, V, S, N=1, H
ลดค่าลง 1
HALT
Z80 จะหยุดทำงาน
NOP
ไม่ทำอะไร (นิยมใช้สำหรับหน่วงเวลา)
EI
สั่งให้มีการทำงานแบบ Interrupt
DI
สั่งให้ยกเลิกการตรวจ Interrupt

หมายเหตุ

s คือ (HL), (IX+dd), (IY+dd), A, B, BC, C, D, DE, E, H, HL, IX, IY, L หรือ SP

คราวนี้มาลองดูตัวอย่างโปรแกรมกันครับ ... ในตัวอย่างโปรแกรมจะมีการใช้ วิธีการอ้อมๆ อยู่นิดนึง คือ เวลาที่ผมกำหนดให้ ตัวแปร ( register ) ใดเก็บค่า 0 ผมจะใช้คำสั่ง XOR ด้วยตัวมันเอง ซึ่ง ถ้าเราจำกันได้ว่า XOR ทำงานอย่างไร เราก็จะบอกได้เลยว่า มันให้ผลออกมา เหมือนการกำหนดให้ตัวแปรตัวนั้นเป็น 0 นั่นเอง ... ตัวอย่างโปรแกรมเป็นดังนี้ครับ


	;
	; Filename : Other.asz
	; Author   : Supachai Budsaratij   (raek@se-ed.net)
	; Date     : May 14, 2001
	; Hardware : ET-Board V6 (Z80 Mode)
	;            ET-Board V5
	;            ET-Board V4
	;            ET-Board V3.5 NewPower
	;            CP-jr180 Plus
	;
	;
	        INCL    "etv6.inz"         ; Include header for ET-V6
	;        INCL    "etv5.inz"         ; Include header for ET-V5
	;        INCL    "etv4.inz"         ; Include header for ET-V4
	;        INCL    "etv35.inz"        ; Include header for ET-V3.5
	;        INCL    "jr180.inz"        ; Include header for CP-jr180 Plus
	
	        ORG     UMEM_ORG        ; Start at UMEM_ORG
	
	main    LD      SP,UMEM_END
	        DI                      ; Disable Interrupt
	        LD      D,5             ; D = 5
	        XOR     B               ; B = 0
	loop    LD      A,B             ; A = B
	        CP      10              ; A = 10 ? (B = 10?)
	        JP      NZ,CON1A
	        XOR     B
	        DEC     D               ; D = D - 1
	        JP      CON1B           
	CON1A   INC     B               ; B = B + 1
	CON1B   LD      A,D
	        CP      0               ; A = 0 ? (D = 0?)
	        JP      NZ,loop         ; If not goto loop
	
	        NOP
	        EI                      ; Enabled Interrupt
	        HALT
	
	        END

ตามด้วย Flowchart ของโปรแกรม ก็เขียนออกมาได้ดังนี้ครับ (ยังใช้ระบบวาดด้วยมือเหมือนเดิมครับ ... ไม่อยากใช้ โปรแกรม วาด Flowchart น่ะครับ )

ก่อนจบบทความนี้ ผมมีคำถามว่า โปรแกรมที่เราเขียนไปนี้ มันทำงานกี่รอบเอ่ย ? ... ใครตอบได้บ้างครับ ...

ตอนนี้เราเหลือบทความอีก 1 ตอนเท่านั้น คือ เรื่องการเขียนโปรแกรมแบบ มีโปรแกรมย่อย แล้วเราก็จะจบบทความ Z80 กันเสียที ... ต้องขออภัยที่สัปดาห์นี้มีตัวอย่างโปรแกรมเพียง 1 โปรแกรม ... ( พอดีช่วงนี้ไม่ค่อยว่าง แต่ไม่อยากเลื่อนบทความออกไป) ... เจอกันอีกครั้งคราวหน้าครับ



เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง : ๑๔ พ.ค. ๒๕๔๔