[ บทความ : เรียนรู้ 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 โปรแกรม ... ( พอดีช่วงนี้ไม่ค่อยว่าง แต่ไม่อยากเลื่อนบทความออกไป) ... เจอกันอีกครั้งคราวหน้าครับ