รหัสเครื่อง Z80, 8 6 ไบต์ *
<8ww8>
* สมมติเงื่อนไขบางอย่างโดยการป้อนจาก Amstrad BASIC
< INC A // A=A+1
8w JR C, #77 ## C is unset unless A has overflowed, does nothing
w LD (HL), A // Saves A to memory location in HL (randomly initialised)
8> JR C, #3E ## C is still unset, does nothing
A
เริ่มต้น 0 เมื่อป้อนจาก BASIC มันเพิ่มขึ้นA
nครั้งจากนั้นเขียนมันnครั้งไปยังตำแหน่งหน่วยความจำเดียวกัน (ซึ่งถูกตั้งค่าเป็นตำแหน่งสุ่มเล็กน้อยโดยพื้นฐาน)! การJR
ดำเนินการ Jump Relative ไม่เคยทำอะไรเลยตั้งแต่การC
ตั้งค่าสถานะไม่ได้ถูกตั้งค่าไว้เสมอดังนั้นใช้เพื่อ "comment out" byte ต่อไปนี้! รุ่นนี้มีการโกงเล็กน้อยโดยสมมติว่าเงื่อนไขการเข้าบางอย่างคือการป้อนจากการรับประกันขั้นพื้นฐานที่A
เป็น 0 เสมอตำแหน่งของ(HL)
ไม่รับประกันว่าจะปลอดภัยและในความเป็นจริงอาจเป็นสถานที่อันตราย โค้ดด้านล่างมีความทนทานมากกว่าซึ่งเป็นสาเหตุที่ทำให้ใช้เวลานานกว่านั้นมาก
รหัสเครื่อง Z80 ขนาด 30 ไบต์
เป็น ASCII:
o!.ww.!>A=o>{))((}<o=A<!.ww.!o
โดยทั่วไปครึ่งแรกรับประกันการสร้างค่าศูนย์และครึ่งหลังเพิ่มขึ้นและเขียนลงในหน่วยความจำ ในเวอร์ชันที่ขยายด้านล่าง##
แสดงถึงรหัสที่ไม่มีจุดประสงค์ในครึ่งหนึ่งของมิเรอร์
o LD L, A ##
!.w LD HL, #772E // Load specific address to not corrupt random memory!
w LD (HL), A ## Save random contents of A to memory
.! LD L, #21 ##
>A LD A, #41 // A=#41
= DEC A // A=#40
o LD L, A // L=#40
>{ LD A, #7B ##
) ADD HL, HL // HL=#EE80
) ADD HL, HL // HL=#DD00. L=#00 at this point
(( JR Z, #28 ##
} LD A, L // A=L
< INC A // A=L+1
o LD L, A // L=L+1
= DEC A // A=L
A LD B, C ##
< INC A // A=L+1
!.w LD HL, #772E // Load address back into HL
w LD (HL), A // Save contents of A to memory
.! LD L, #21 ##
o LD L, A // L=A
รายละเอียดของคำแนะนำที่อนุญาต:
n op description
-- ---- -----------
28 LD LoaD 8-bit or 16-bit register
3 DEC DECrement 8-bit or 16-bit register
1 INC INCrement 8-bit or 16-bit register
1 ADD ADD 8-bit or 16-bit register
Available but useless instructions:
3 JR Jump Relative to signed 8-bit offset
1 DAA Decimal Adjust Accumulator (treats the A register as two decimal digits
instead of two hexadecimal digits and adjusts it if necessary)
1 CPL 1s ComPLement A
1 HALT HALT the CPU until an interrupt is received
จากคำสั่งที่ได้รับอนุญาต 39 คำสั่ง 28 การดำเนินการโหลด (บล็อกจาก 0x40 ถึง 0x7F เป็นLD
คำสั่งไบต์เดียวทั้งหมด) ซึ่งส่วนใหญ่ไม่มีความช่วยเหลือที่นี่! คำแนะนำในการโหลดไปยังหน่วยความจำเท่านั้นที่อนุญาตยังคงอยู่LD (HL), A
ซึ่งหมายความว่าฉันต้องเก็บค่าA
ไว้ เนื่องจากA
เป็นเพียงการลงทะเบียนที่เหลือพร้อมกับINC
คำแนะนำที่ได้รับอนุญาตนี่จึงค่อนข้างมีประโยชน์!
ฉันไม่สามารถโหลดA
ด้วย 0x00 เพื่อเริ่มต้นด้วยเพราะ ASCII 0x00 ไม่ใช่ตัวละครที่ได้รับอนุญาต! ค่าที่ใช้ได้ทั้งหมดอยู่ไกลจาก 0 และคำสั่งทางคณิตศาสตร์และตรรกะทั้งหมดไม่ได้รับอนุญาต! ยกเว้น ... ฉันยังสามารถทำได้ADD HL, HL
เพิ่ม 16 บิตHL
เอง! นอกเหนือจากการโหลดโดยตรงค่า (ใช้ไม่ได้ที่นี่!), การเพิ่มA
และ decrementing A
, L
หรือHL
นี้เป็นวิธีเดียวที่ฉันมีการเปลี่ยนแปลงค่าของการลงทะเบียนที่! จริง ๆ แล้วมีคำสั่งพิเศษหนึ่งอย่างที่อาจเป็นประโยชน์ในครึ่งแรก แต่ความเจ็บปวดในการทำงานในช่วงครึ่งหลังและคำแนะนำแบบเติมเต็มที่เกือบจะไร้ประโยชน์ที่นี่และจะใช้พื้นที่มากขึ้น
ดังนั้นฉันจึงพบค่าใกล้เคียงที่สุดกับ 0 ฉันสามารถ: 0x41 มันใกล้เคียงกับ 0 อย่างไร? ในไบนารีมันคือ 0x01000001 ดังนั้นฉันจะลดมันโหลดมันลงไปL
แล้วทำADD HL, HL
สองครั้ง! L
ตอนนี้เป็นศูนย์ซึ่งฉันโหลดกลับไปA
! น่าเสียดายที่รหัส ASCII สำหรับADD HL, HL
คือ)
ตอนนี้ฉันต้องใช้(
สองครั้ง โชคดีที่(
เป็นJR Z, e
ที่e
เป็นไบต์ต่อไป ดังนั้นมันจึงกลืนกินไบต์ที่สองและฉันแค่ต้องแน่ใจว่ามันไม่ได้ทำอะไรเลยโดยระวังZ
ธง! คำสั่งสุดท้ายที่จะส่งผลกระทบต่อZ
ธงคือDEC A
(ตอบโต้ADD HL, HL
ไม่เปลี่ยนแปลง) และเนื่องจากฉันรู้ว่าA
มันคือ 0x40 ณ จุดนั้นจึงรับประกันZ
ได้ว่าไม่ได้ตั้งค่า
คำสั่งแรกในครึ่งปีหลังJR Z, #28
จะไม่ทำอะไรเลย 255 ครั้งแรกเนื่องจากสามารถตั้งค่าสถานะ Z ได้เฉพาะเมื่อ A มีโอเวอร์โฟลว์จาก 255 ถึง 0 หลังจากนั้นเอาต์พุตจะไม่ถูกต้องอย่างไรก็ตามเนื่องจากเป็นการบันทึกค่า 8 บิตเท่านั้น ไม่ควรสำคัญ รหัสไม่ควรขยายเกิน 255 ครั้ง
รหัสจะต้องมีการดำเนินการเป็นตัวอย่างเพราะวิธีการที่มีอยู่ทั้งหมดของการกลับมาอย่างหมดจดไม่ได้รับอนุญาต คำสั่ง RETurn ทั้งหมดอยู่เหนือ 0x80 และการปฏิบัติการข้ามไม่กี่ครั้งที่อนุญาตสามารถข้ามไปยังออฟเซ็ตบวกได้เท่านั้นเนื่องจากค่าลบ 8 บิตทั้งหมดไม่ได้รับอนุญาตเช่นกัน!
#
ก็คือการเลือกของตัวเองเช่นกัน แต่คุณพูดถูกไม่ใช่ใน Consolas