Kode Mesin Z80, 8 6 byte *
<8ww8>
* Mengasumsikan kondisi tertentu dengan memasukkan dari 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
awalnya 0 ketika dimasukkan dari BASIC. Ini menambah A
n kali, lalu menulisnya n kali ke lokasi memori yang sama (yang diatur ke lokasi yang sedikit acak oleh BASIC)! Operasi JR
Jump Relative tidak pernah melakukan apa-apa karena C
flag selalu tidak disetel, sehingga digunakan untuk "mengomentari" byte berikut! Versi ini sedikit curang dengan mengasumsikan kondisi entri tertentu, yaitu masuk dari jaminan BASIC yang A
selalu 0. Lokasi (HL)
tidak dijamin aman, dan mungkin merupakan lokasi berbahaya. Kode di bawah ini jauh lebih kuat dan karena itu jauh lebih lama.
Kode Mesin Z80, 30 byte
Sebagai ASCII:
o!.ww.!>A=o>{))((}<o=A<!.ww.!o
Pada dasarnya, babak pertama menjamin penciptaan nilai nol dan babak kedua menambahkannya dan menulisnya ke memori. Dalam versi yang diperluas di bawah ini ##
menunjukkan kode yang tidak memiliki tujuan di bagian cerminnya.
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
Rincian instruksi yang diizinkan:
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
Dari 39 instruksi yang diizinkan, 28 adalah operasi pemuatan (blok dari 0x40 hingga 0x7F adalah semua LD
instruksi byte tunggal ), yang sebagian besar tidak membantu di sini! Satu-satunya instruksi memuat ke memori masih diperbolehkan adalah LD (HL), A
yang berarti saya harus menyimpan nilai A
. Karena A
hanya register yang tersisa dengan INC
instruksi yang diizinkan, ini sebenarnya cukup berguna!
Saya tidak dapat memuat A
dengan 0x00 untuk memulainya karena ASCII 0x00 bukan karakter yang diizinkan! Semua nilai yang tersedia jauh dari 0 dan semua instruksi matematika dan logis telah dianulir! Kecuali ... saya masih bisa melakukannya ADD HL, HL
, tambahkan 16-bit HL
ke dirinya sendiri! Terlepas dari memuat nilai secara langsung (tidak digunakan di sini!), Menambah A
dan Menurunkan A
, L
atau HL
ini adalah satu-satunya cara saya mengubah nilai register! Sebenarnya ada satu instruksi khusus yang bisa membantu di babak pertama tetapi menyusahkan untuk mengerjakan di babak kedua, dan instruksi satu-pelengkap yang hampir tidak berguna di sini dan hanya akan mengambil ruang.
Jadi, saya menemukan nilai terdekat dengan 0 saya bisa: 0x41. Bagaimana itu mendekati 0? Dalam biner itu 0x01000001. Jadi saya mengurangi, memuatnya L
dan melakukan ADD HL, HL
dua kali! L
sekarang nol, yang saya masukkan kembali ke A
! Sayangnya, kode ASCII untuk ADD HL, HL
ini )
sehingga saya sekarang harus menggunakan (
dua kali. Untungnya, (
ini JR Z, e
, di mana e
adalah byte berikutnya. Jadi itu memakan byte kedua dan saya hanya perlu memastikan itu tidak melakukan apa-apa dengan berhati-hati dengan Z
bendera! Instruksi terakhir untuk mempengaruhi Z
flag adalah DEC A
(kontra-intuitif, ADD HL, HL
tidak mengubahnya) dan karena saya tahu A
itu 0x40 pada saat itu dijamin Z
tidak diatur.
Instruksi pertama di babak kedua JR Z, #28
tidak akan melakukan apa-apa 255 kali pertama karena bendera Z hanya dapat diatur jika A telah meluap dari 255 ke 0. Setelah itu output akan salah, namun karena itu hanya menyimpan nilai 8-bit tetap saja bahwa seharusnya tidak masalah. Kode tidak boleh diperluas lebih dari 255 kali.
Kode harus dieksekusi sebagai potongan karena semua cara yang tersedia untuk kembali dengan bersih telah dianulir. Semua instruksi RETurn di atas 0x80 dan beberapa operasi Jump diizinkan hanya dapat melompat ke offset positif, karena semua nilai negatif 8-bit telah dianulir juga!
#
adalah relection sendiri juga, tetapi, Anda benar, bukan di konsol.