Author Topic: พบ บัค CPU Z80 V3.5 R1  (Read 5893 times)  Share 

0 Members and 1 Guest are viewing this topic.

Offline misaru

  • ไอทีซีเนียร์
  • ***
  • Posts: 114
  • Karma: +0/-0
พบ บัค CPU Z80 V3.5 R1
« on: December 21, 2007, 04:57:20 PM »
วันนี้ผมเรียน วิชา ไมโครโปรเซสเซอร์

โจทย์ กำหนดให้หาค่าความต่าง เลข 8 บิด 2จำนวน
กำหนดให้
Address
2040         =   7A
2041         =   1E
คำตอบอยู่ที่ 2042   = ??

ผมก็เขียนเลยฮะ
Code: [Select]
ADR        Memonic           OP-Code

2000   LD   HL,2040             21 40 20
2003   LD   A,(2041)            31 41 20
2006   SUB A,HL                 96
2007   INC HL                   23
2008   INC HL                   23
2009   LD HL,A                  77
2010   RST 10H                  DF

========================

แค่นี้แหล่ะ

บัคเข้าเลย

ค่า ที่ 2040 มันจะเป็น 20 ตลอดเลย แก้แล้วก็ไม่หาย

แล้วผลที่ต่างที่ แก้สมการออกมาจะ มีค่า 7E ตลอด

ไม่ว่าจะใส่ค่า Input 2040 ไปเท่าไหร่ แต่พอแก้สมการออกมาแล้ว จะเป็น 20 อย่างเดียวเลย

งง มักๆ

แล้วเครื่องนั้นก็ แก้สมการออกมาผิด ตลอดเลย หลังจาก ผมใส่ Sorce Code ข้างบนไปแล้ว

อย่างผมเขียนขึ้นมาใหม่ จากโจทย์เดิม
กำหนด
2040=FF
2041=FE

Code: [Select]
ADR        Memonic           OP-Code

2000    LD      HL,2040      21 40 20
2003    LD      A,HL         7E
2004    INC     HL           23
2005    SUB     A,HL         96
2006    INC     HL           23
2007    LD      HL,A         77
2008    RST     10H          DF

2042 จะเท่ากับ 01 ในเครื่้องปกติ แต่เครื่อง ที่ผมวางบัคแล้ว มันไม่ได้ 01 มันได้ E7 ครับ แล้วมันก็เอ๋อตลอดเลย

ลองทำดูครับ ผมทำแล้ว เจ๋งไป 2 เครื่องรวดเลย
อยากรู้จักผมมากขึ้นไหมหล่ะ
การเปิดใจของผมไม่ได้มีบ่อยหลอกนะ

http://forums.it.kmitl.ac.th/index.php/topic,1711.msg15239.html#msg15239

Offline WingGundamZeroCustom.co.th

  • นักศึกษาปริญญาตรี รุ่นที่ 2
  • พระเจ้าจอร์ช มันขุดได้ยอดมากเลย
  • *
  • Posts: 2,726
  • Karma: +1/-0
  • Gender: Male
  • My name is Rx-93 ν Gundam
    • Blog@WingInfotech.net
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #1 on: December 21, 2007, 08:28:08 PM »
What the??!!! ไม่ยู้เยื่องอ่าาาา
I will change the world, to the better day.

My blog, My world: http://blog.winginfotech.net




Offline ShinKun

  • นักศึกษาปริญญาตรี
  • พระเจ้าจอร์ช มันขุดได้ยอดมากเลย
  • *
  • Posts: 1,725
  • Karma: +0/-0
  • Gender: Male
  • Master of IT, University of Sydney
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #2 on: December 21, 2007, 08:44:38 PM »
ผมไม่เชี่ยว low level
Winners never quit. Quitters never win.

email & msn: shinemon ที่ gmail.com
Facebook: www.facebook.com/shinemon <accept only request with personal message>
Twitter: @shinemonkun

Offline YiM

  • นักศึกษาปริญญาตรี
  • ไอทีมือเก๋า
  • *
  • Posts: 265
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #3 on: December 21, 2007, 09:02:03 PM »
ไม่เคยเขียนบน Z80 นะ เคยเขียนแค่ MCS 51 แต่ว่าพอเปิด manual ดูแล้วก็งงกับโค้ดน้องเล็กน้อย

อย่างแรก Manual ของ z80 ไม่มีคำสั่ง SUB A,HL ซึ่งอันที่พี่หาอาจจะเก่าไปแล้ว ช่างมัน ๆ

พี่จะตั้งสมมิตฐานว่าน้องสั่งกำหนดค่าที่ตำแหน่ง 2040 กะ 2041 เรียบร้อยแล้ว ดังนั้นการทำงานของโค้ดนี้จะเป็นว่า

Code: [Select]
ADR        Memonic           Instruction

2000   LD   HL,2040             Load data from 2040 to HL
2003   LD   A,(2041)            Load data from 2041 to A
2006   SUB A,HL                 Subtract A by HL and keep data in A
2007   INC HL                   Increase HL by 1
2008   INC HL                   Increase HL by 1
2009   LD HL,A                  Load data to HL
2010   RST 10H                  Jump to 10H
I'm not sure why you wrote 2007 - 2008.. I think it's so useless you increased value but you didn't use that value.. In addition, you want to subtract 2040 by 2041, but your code will subtract 2041 by 2040. And you said that you kept result to 2042 but I could not found that you move the result from A to anywhere???

For the second code
Code: [Select]
ADR        Memonic           Instruction
2000    LD      HL,2040      Load data from 2040 to HL
2003    LD      A,HL         Load data from HL to A
2004    INC     HL           Increase HL by 1
2005    SUB     A,HL         Subtract A by HL and keep data in A
2006    INC     HL           Increase HL
2007    LD      HL,A         Load data from HL to A
2008    RST     10H          DF

This code is also strangth... you increased HL so it mean if 2040's value is 1, the subtract instruction will calculate that 1 - 2... So the result is not 1.

I could not check symetic of your code because I never use z80. I don't know the register layout.But there are many logical mistake in your code..

And your big mistake is that "7A - 1E = 5C".. you can check by calculator...

Blame yourself before anyone else... If z80 really has bug like this, it cann't be sold arround the world
« Last Edit: December 21, 2007, 09:06:06 PM by YiM »

Offline Chaotic

  • นักศึกษาปริญญาตรี
  • มือใหม่หัดเข้าไอที
  • *
  • Posts: 32
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #4 on: December 21, 2007, 10:12:11 PM »
พี่ไม่เคยเขียน Z80 เหมือนกันนะ เคยแต่ PIC กะ ARM7 อ้ะ

Quote
ค่า ที่ 2040 มันจะเป็น 20 ตลอดเลย แก้แล้วก็ไม่หาย

แล้วผลที่ต่างที่ แก้สมการออกมาจะ มีค่า 7E ตลอด

ไม่ว่าจะใส่ค่า Input 2040 ไปเท่าไหร่ แต่พอแก้สมการออกมาแล้ว จะเป็น 20 อย่างเดียวเลย

งง มักๆ

แล้วเครื่องนั้นก็ แก้สมการออกมาผิด ตลอดเลย หลังจาก ผมใส่ Sorce Code ข้างบนไปแล้ว

ข้อนี้น้อง misaru ลองดู Code คำสั่ง

2000   LD   HL,2040             Load data from 2040 to HL

ดู Comment ของมันนะครับ
มันเป็นการโหลดข้อมูลจากหน่วยความจำตำแหน่ง 2040 ไปไว้ในรีจีสเตอร์ HL
แต่ code LD HL,2040 เป็นการโหลดข้อมูล 2040 ไปไว้รีจีสเตอร์ HL รึเปล่าครับ

LD HL,2040 กับ LD HL,(2040) มันต่างกันครับ

มันผิดตั้งแต่ข้อมูลที่รับแล้วครับ
เพราะฉะนั้น ค่าที่หน่วยความจำ 2040 ไม่มีวันรับได้ครับ
ส่วนคำถามข้ออื่นถ้าแก้ไม่หายอีกก้อต้องไล่ดูอย่างอื่นอีกครับ

ปล. ผลเป็นไงบ้างก็ลอง reply มาดูนะครับ
« Last Edit: December 21, 2007, 10:16:46 PM by Chaotic »

Offline misaru

  • ไอทีซีเนียร์
  • ***
  • Posts: 114
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #5 on: December 21, 2007, 10:46:52 PM »
คืองี้ครับปัญหามันอยู๋ตรงที่ พอผมใส่ Code แรกไป แล้วผมไม่รู้ว่า Code แรกมัน ทำอะไรลงไป

แต่หลังจากใส่ไปแล้ว มันคำนวนทุกอย่างผิดพลาดหมดเลยอะครับ

อย่าง Code ที่ 2
 ผมลองใส่ เหมือนกันเด๊ กับ 2 เครื่อง โดยที่ อีกเครื่องนึง เคย Run Source 1 ไปแล้ว
4020=FF
4021=FE
4022= ควรจะเป็น 01

เครื่องที่ ผมยังไม่ได้ยุ่ง
ตอบ 01 จริง

เครื่องที่ ผม Runsource 1 ไปแล้ว มันไม่ได้ตอบ 01 และ ผมกลับไปดูInput 4020 ยังถูกแก้ จาก FF เป็น 20 ด้วย แถมคำตอบ 20 - FE ก็ยังได้คำตอบที่ไม่ตรงอีกต่างหาก ทั้ง แบบ ติดลบ และแบบ ไม่ติดลบ


Code: [Select]
เอ่อ เรื่องมันเป็นแบบนี้ครับ คู่มือ OP - Code ที่ผมเปิดอ่าน นะ
ผมเข้าใจว่า
LD HL,(nn)          21 20 20         (20=n)
ผมก็เลย เอาแบบนี้เลย
LD A,(nn)            31 xx xx      
****คู่มือไม่มีคำสั่ง LD A,(nn)  คู่มือมีแต่ LD A,nn  โดยใช้ 3A
ผมมั่วมาจาก LD HL
เพราะผมเห็นส่วนใหญ่ ของ
 LD HL,nn      2A XX XX
 LD HL,(nn)    21 XX XX         ผมก็เลยคิดว่า อันแน่ เปลี่ยน จาก A เป็น 1 ก็คงใช่


ผมว่า นี่แหล่ะครับ จุดพลาด
ฟันธงครับ รันคำสั่ง ชุดนี้
Code: [Select]


ADR        Memonic      OP-CODE              Instruction

2000   LD   HL,2040     21 40 20            ;Load data from 2040 to HL
2003   LD   A,(2041)    31 41 20            ;Load data from 2041 to A
2006   SUB A,HL         96                  ;Subtract A by HL and keep data in A
2007   INC HL           23                  ;Increase HL by 1
2008   INC HL           23                  ;Increase HL by 1
2009   LD HL,A          77                  ;Load data to HL
2010   RST 10H          DF                  ;Jump to 10H


แล้วทำให้ ระบบคำณวนผิดพลาดจริงๆ ผมซวยมาแล้ว สรุปวันนี้ผมทำเครื่อง เอ๋อ 3 เครื่องครับ (หวังว่า มันคงลืม แล้วกลับเป็นปกติ ในวันถัดไปนะครับ เพราะไม่มีถ่าน BIOS)

« Last Edit: December 21, 2007, 10:52:31 PM by misaru »
อยากรู้จักผมมากขึ้นไหมหล่ะ
การเปิดใจของผมไม่ได้มีบ่อยหลอกนะ

http://forums.it.kmitl.ac.th/index.php/topic,1711.msg15239.html#msg15239

Offline misaru

  • ไอทีซีเนียร์
  • ***
  • Posts: 114
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #6 on: December 21, 2007, 11:01:15 PM »
ทำคำสั่งบนแล้ว ทำคำสั่งนี้ แล้วจะรู้ครับ ว่า มันต้องไม่ใช่แบบนี้ จนต้อง ทำให้ผม ย้ายเครื่องใหม่ เหอะๆ
Code: [Select]
ADR        Memonic      OP-CODE              Instruction

2000   LD   HL,(2040)   21 40 20            ;Load data from 2040 to HL
2003   LD   A,HL        7E                  ;Load data from HL TO A
2007   INC HL           23                  ;Increase HL by 1 (HL now 2041)
2006   SUB A,HL         96                  ;Subtract A by HL and keep data in A
2008   INC HL           23                  ;Increase HL by 1 (HL now 2042)
2009   LD HL,A          77                  ;Load data to HL (2042 has ANSWER)
2010   RST 10H          DF                  ;Jump to 10H

มะเชื่อนะ ทดลองได้ ใส่ ค่า 2040=FF ,2041=FE แล้วรัน ADDRESS>2000 ดู แล้วกลับไปเช็ค 2040 มันจะกลายเป็น 20 เองอัตโนมัติ แล้วผมก็แก้ไม่หายด้วยเหอะๆ เพราะมะรู้จะไปแก้ตรงไหน
(2042 ควรจะ เป็น 01 ถ้าไม่ได้01 แสดงว่า บัคเรียบร้อยครัย เหอะๆ)

เพราะอย่างงี้ผมถึงไ้ด้บอกว่า บัค เต็มปากเต็มคำ
อยากรู้จักผมมากขึ้นไหมหล่ะ
การเปิดใจของผมไม่ได้มีบ่อยหลอกนะ

http://forums.it.kmitl.ac.th/index.php/topic,1711.msg15239.html#msg15239

Offline misaru

  • ไอทีซีเนียร์
  • ***
  • Posts: 114
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #7 on: December 21, 2007, 11:06:22 PM »
ไม่เคยเขียนบน Z80 นะ เคยเขียนแค่ MCS 51 แต่ว่าพอเปิด manual ดูแล้วก็งงกับโค้ดน้องเล็กน้อย

อย่างแรก Manual ของ z80 ไม่มีคำสั่ง SUB A,HL ซึ่งอันที่พี่หาอาจจะเก่าไปแล้ว ช่างมัน ๆ




จริงๆครับ ไม่มี คำสั่ง
SUB A,HL  ในหนังสือมันมีแค่
SUB A,nn        OP-code 97
SUB A            OP-code 96

ผมลอง 97 แล้วไม่ได้ แต่ถ้าใส่ A - nn น่่ะ ได

แต่ผมมั่วลอง 96 แล้ว สรุปคือ มันก็คือ A - HL นั่นเองครับ

ผมจึงนำ code 96 มาใ้ช้ในโปรแกรมนี้ไงครับ และก็ได้ด้วย อิอิ อาจารย์งง เพราะจานเค้าก็บอกเหมือนกัน ว่าไม่มี เหอะๆเลยอะ
« Last Edit: December 21, 2007, 11:07:34 PM by misaru »
อยากรู้จักผมมากขึ้นไหมหล่ะ
การเปิดใจของผมไม่ได้มีบ่อยหลอกนะ

http://forums.it.kmitl.ac.th/index.php/topic,1711.msg15239.html#msg15239

Offline Chaotic

  • นักศึกษาปริญญาตรี
  • มือใหม่หัดเข้าไอที
  • *
  • Posts: 32
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #8 on: December 22, 2007, 02:01:43 AM »
คือผมหมายความว่า คำสั่งทั้ง 2 ชุด มันผิดอ่ะคับ

ผมเข้าใจว่าคำสั่งบน คุณ misaru ต้องการจะบอกว่าทำให้เกิด bug
แต่คำสั่งบนมันผิดหน่ะครับ และมันไม่ได้ทำให้เกิด bug หรอกครับถ้า coding ถูก

ให้คุณ misaru ลองแก้คำสั่งดูนะทั้งคู่เลยอ่ะคับ
1.
__________________________________________________
Memonic
   LD   H,(2040)   ; Load ณตำแหน่ง 2040 เก็บใน H (ถ้าไม่มีวงเล็บ คือ Load ค่านั้น เก็บใน H)
   LD   A,(2041)   ; Load ณตำแหน่ง 2041 เก็บใน A
   SUB H             ; [ ลดค่า A ลง H ] หรือ ภาษาบ้านๆ A = A - H
   LD H,A            ; Load ที่รีจีสเตอร์ A เก็บใน H
   RST 10H
__________________________________________________

อันนี้ไม่ได้ show opt code กะ adr นะ เพราะผมแปลไม่ออกเหมือนกัน
ก้อผมก้อมะใช่ compiler นิน่า
ตัว compiler นะจะ gen ให้ ถ้าไม่ที gen เดี๋ยวจะพยายามแปลให้อีกรอบก้อได้นะ

2.

ส่วนอันนี้ตอนแรกกะจะแก้ให้ดู แต่ว่ามันผิดเยอะเหลือเกิน
จนยังไงยังไง ก้อคงต้องเขียนใหม่หมดเดี๋ยวจะอธิบายให้นะครับว่าผิดยังไงอีก reply

ปล1. จะพิมที่ผิดตัวแดงให้แล้ว แต่ว่ามันเยอะจนลบออกไปดีกว่า จะมึนเอา
ปล2. ถ้าคุณ misaru อ่านถึงบรรทัดนี้ก้อแสดงว่า
      คุณ misaru ตั้งใจกับ วิชา microprocessor มากๆเลย เหอๆ
      แนะนำว่า ควรพยายามอย่าตั้งสมมติฐานว่าเป็น bug ลองดู code ที่เขียนขึ้นมาก่อนนะครับ

Offline Chaotic

  • นักศึกษาปริญญาตรี
  • มือใหม่หัดเข้าไอที
  • *
  • Posts: 32
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #9 on: December 22, 2007, 02:23:14 AM »
ก่อนที่จะเริ่มขอ บอกว่า () วงเล็บใน code นั้น สำคัญนะครับ
มีหรือไม่มี แตกต่างอย่างมากๆๆๆๆ
// Code ที่ผิดนะครับบ
Code: [Select]
ADR        Memonic           OP-Code

2000   LD   HL,2040             21 40 20
2003   LD   A,(2041)            31 41 20
2006   SUB A,HL                 96
2007   INC HL                   23
2008   INC HL                   23
2009   LD HL,A                  77
2010   RST 10H                  DF

ผิดที่ 2000 Load HL,2040
แปลว่าเก็บค่า 2040 เก็บในรีจีสเตอร์ HL
เพราะฉะนั้นรีจีสเตอร์  HL = 2040

ผิดที่ 2006 SUB A,HL
แปลว่า ? มันไม่มีความหมายยย
งั้นลองดูที่ Opt-code 96 มันคือ คำสั่ง SUB (HL) และจะอธิบายคือ
ถ้า address ที่ 2041 = 80 และรีจีสเตอร์ HL = 2041 (อย่าสับสนกับข้อที่แล้ว เพราะมันใช้คนละจุดประสงค์กัน)
SUB (HL) พิมเป๊ะๆ เลยนะ หมายถึง ลบค่าในรีจีสเตอร์ A ลงตามค่าใน address ที่รีจีสเตอร์  HL เก็บไว้
ผลที่ได้คือ A = A - 80

ผิดที่ 2007-2008
INC HL หมายถึง
LD A,HL  แล้วก้อ SUB 1 แล้วก้อ LD HL,A
หมายถึง (ภาษา C)
A = HL;
A--;
HL = A;
อันนี้เข้าใจป่ะ เพราะงั้น A เลยถูกทับค่าไปด้วย

คำถาม แล้วทำไมผมถึงใช้ H แทนที่ HL
นั่นเพราะว่า SUB เป็น Operator 8 bit HL เป็น 16
ผมได้ใช้รีจีสเตอร์ 8bit หรือ รีจีสเตอร์ H
เพราะค่าที่ใส่ไม่เกิน 8 bit อยู่แล้วจะได้ง่ายต่อการ ลบ(SUB)นะครับ

// Code ที่ผิดนะครับบ
Code: [Select]
ADR        Memonic           OP-Code

2000    LD      HL,2040      21 40 20
2003    LD      A,HL         7E
2004    INC     HL           23
2005    SUB     A,HL         96
2006    INC     HL           23
2007    LD      HL,A         77
2008    RST     10H          DF

ผิดที่ 2000 เหมือน Code ที่แล้วเลย
ผิดที่ 2004, 2006 INC HL เหมือน Code ที่แล้ว
ผิดที่ 2005 SUB A,HL เหมือน Code ด้านบน
บรรทัดที่ 2007 ไม่ผิดมาก

ปล. ถ้าผิดที่ใดขออภัยด้วย (ท้วงด้วยนะ) มึนกะ senior project จริงๆ เหอๆ
ปล. ถ้าสงสัยก้อถามนะ และก้อถ้าผมอธิบายไม่รู้เรื่องก้อ ถาม อาจารย์ที่สอนด้วยอีกทีนึงนะครับ

Offline misaru

  • ไอทีซีเนียร์
  • ***
  • Posts: 114
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #10 on: December 22, 2007, 08:04:47 AM »
source code ชุดแรก ผิด
source code ชุด 2 ถูก ผมลองเทสแล้ว

LD HL,2040 โทษทีนะครับ ผมลืม ใส่ วงเล็บ  = LD HL,(2040) ก็คือ โหลดค่า จาก address 2040 to HL นั่นหล่ะครับ


อยากรู้จักผมมากขึ้นไหมหล่ะ
การเปิดใจของผมไม่ได้มีบ่อยหลอกนะ

http://forums.it.kmitl.ac.th/index.php/topic,1711.msg15239.html#msg15239

Offline Chaotic

  • นักศึกษาปริญญาตรี
  • มือใหม่หัดเข้าไอที
  • *
  • Posts: 32
  • Karma: +0/-0
Re: พบ บัค CPU Z80 V3.5 R1
« Reply #11 on: December 22, 2007, 07:25:28 PM »
ข้อ 2 ก้อผิดครับ
แค่น้อง misaru บอกว่ารับค่าจาก Memory 2040 กับ 2041
แล้ว Memory 2041 ล่ะครับ ไม่รับค่าแล้วจะมาลบกันยังไงล่ะครับ ??
เห็นมีการรับค่าอันเดียว (ตรงที่พี่แก้วงเล็บให้)


ADR        Memonic           OP-Code

2000    LD      HL,(2040)      21 40 20
2003    LD      A,HL         7E
2004    INC     HL           23
2005    SUB     A,HL         96
2006    INC     HL           23
2007    LD      HL,A         77
2008    RST     10H          DF