/ Tip Pemrograman Lanjutan HP-41 /
Seperti yang diketahui banyak orang, pada akhir 1980-an, mikrokulator terprogram yang kompatibel dengan B3-34 sangat populer di Uni Soviet: MK-54, MK-61, MK-52 . Bagi mereka, mereka membuat program, permainan, menjelajahi fitur-fitur tak berdokumen, menulis artikel. Saya sendiri mengalami ini pada waktunya. Dan baru-baru ini saya berpikir: tetapi di AS, juga, seharusnya ada sesuatu yang serupa, dengan semangat yang hampir sama dengan semua yang terjadi di sekitar kalkulator kami yang dapat diprogram. Dan ya - saya benar. Perkenalkan HP-41.
Seperti B3-34, HP-41 adalah kalkulator RPN yang dapat diprogram (RPN - notasi Polandia terbalik, kalkulasi dalam bentuk "2 2 +", bukan "2 + 2 =") dengan ideologi serupa, tetapi jauh lebih fungsional. Itu muncul hampir bersamaan dengan B3-34 - 1979 dan segera menjadi tahun kultus: banyak program ditulis untuknya, buku - termasuk tentang fitur yang tidak terdokumentasi, dan bahkan modul tambahan masih dirilis. Sebanyak 1,5 juta kalkulator ini diproduksi.
Untuk nasib yang sama, kita dapat menambahkan bahwa, seperti halnya MK-52 yang terbang di Soyuz sebagai perangkat komputasi cadangan, begitu pula HP-41 yang terbang dengan Shuttle.
Meskipun ada tiga modifikasi HP-41 (C, CV, CX), mereka dapat dianggap kompatibel sepenuhnya, karena mereka sedikit berbeda - pada kenyataannya, hanya dalam jumlah memori. Kalkulator HP dengan nomor lain tidak kompatibel dengan HP-41, meskipun memiliki beberapa fitur umum.
Salah satu fitur HP-41 adalah indikator 14 segmen, yang cukup langka untuk kalkulator. Ini memungkinkan Anda untuk menampilkan huruf dan berbagai simbol pada HP-41, yang, bersama dengan modul suara dan ekspansi, merupakan keuntungan besar dibandingkan B3-34.
Memori HP-41C dari sudut pandang pengguna adalah 63 register, masing-masing 7 byte. Dalam hal ini, Anda dapat memilih berapa banyak yang digunakan untuk program dan berapa banyak untuk datanya. Modul ekspansi meningkatkan memori yang tersedia - katakanlah 82106A - 64 register lagi. Maksimum dengan bantuan modul semacam itu, Anda bisa mendapatkan sekitar 2kb jika Anda menempati keempat slot.
Prosesornya sendiri, spesifik. Ini paling sering disebut sebagai NUT CPU, meskipun ini adalah nama umum untuk beberapa prosesor yang berbeda. Frekuensi clock 0,35 MHz. Mengenai kedalaman bit, seperti yang sering terjadi pada kalkulator, karena spesifikasi arsitekturnya, sulit untuk menyebutkan angka pastinya.
Selain modul memori (untuk HP-41C), ada banyak modul ekspansi lainnya - pustaka program pada ROM, penulis / pembaca kartu magnetik, pembaca barcode, dll.
Seiring dengan mode perintah tradisional untuk semua kalkulator, saat penghitungan dilakukan secara langsung, ada tiga cara untuk memprogram HP-41.
Yang pertama dan utama adalah bahasa standar kalkulator yang dapat diprogram. Secara ideologis, ini mirip dengan bahasa B3-34 dan, meskipun disebut FOCAL, ini tidak ada hubungannya dengan bahasa pemrograman dengan nama yang sama - kata tersebut adalah singkatan dari "Forty One Calculator Language". Perintah FOCAL sebenarnya adalah panggilan ke subrutin dalam kode mesin - seperti instruksi dalam mesin virtual, dipertajam untuk kalkulasi, sistem desimal, dan titik mengambang.
Metode kedua, yang sangat populer, disebut Pemrograman sintetis dan merupakan rangkaian ekstensi FOCAL yang tidak berdokumen berdasarkan eksploitasi kerentanan di firmware kalkulator yang memungkinkan pembuatan perintah baru.
Ketiga, cara langka adalah memprogram secara langsung dalam kode mesin mikroprosesor kalkulator, yang disebut MCODE. Cara ini cukup rumit karena alasan yang akan dibahas di bawah ini.
Pada artikel ini, saya akan berbicara terutama tentang metode pertama, dua lainnya akan saya bahas secara singkat.
Mode keyboard dan perintah
Terlepas dari indikator alfanumerik canggih, keyboard kalkulator adalah yang paling umum. Itu, dengan sejumlah besar mode dan fungsi yang berbeda, membuat memasuki program dan mengoperasikannya menjadi tugas yang sangat membosankan (cukup sebanding dengan kalkulator yang kompatibel dengan B3-34).
Setiap tombol memiliki tiga fungsi (dalam beberapa kasus lebih). Misalnya, tombol "0" selain angka 0 dimaksudkan untuk memasukkan spasi dan angka Pi.
Tidak semua fungsi tersedia melalui kombinasi tombol - beberapa perlu diketik dengan huruf, dalam mode "ALPHA". Huruf-huruf tersebut diberi label di bagian bawah tombol dengan urutan "ABCDEF ...".
Saya harus mengatakan bahwa keyboard dibuat dengan kualitas yang sangat tinggi. Teknik tipikal untuk perangkat keras HP digunakan - tombol memiliki sumbu di bagian bawah dan saat ditekan berputar di sekitarnya. Indikatornya, meski minim cahaya latar, juga cukup mudah dibaca. Hanya penyegaran gambar yang lambat yang melelahkan (yang kemungkinan besar karena prosesor yang lambat).
Menariknya, operator yang tersedia melalui kombinasi tombol dapat dimasukkan huruf demi huruf. Misalnya, bip ("BEEP") diperoleh dengan menekan SHIFT 4, tetapi Anda dapat menekan tombol XEQ, lalu ALPHA, mengeja kata "BEEP", tekan ALPHA lagi.
Sebenarnya, XEQ (dari kata "mengeksekusi") memungkinkan Anda untuk segera menjalankan fungsi bawaan apa pun atau memanggil yang sudah ada di RAM atau ROM - termasuk dalam modul ekspansi.
Daftar semua fungsi yang sebenarnya tersedia di kalkulator dapat diperoleh melalui SHIFT CATALOG 3 (kontrol tampilan melalui R / S, SST, BST)
Mendaftar dan bekerja dengan mereka
Di bawah ini kita berbicara tentang register yang dapat langsung diakses oleh pengguna kalkulator. Ini bukan register mikroprosesor!
ALPHA register (A) - dapat menyimpan hingga 24 karakter dan isinya ditampilkan di layar.
0,1,2,3, ... - register data, dapat menyimpan satu angka atau hingga 6 karakter (atau hingga 7 langkah program)
X, Y, Z, T - register tumpukan (sebenarnya, juga register data, tetapi diatur dalam tampilan tumpukan). X - atas.
L - terakhir, sebelum diubah, isi register X disimpan
PC - langkah program saat ini
. Tampilan biasanya menampilkan isi register X atau ALPHA, tetapi yang lain dapat ditampilkan.
Jika Anda hanya mengetikkan angka di keyboard, angka tersebut termasuk dalam register X (karenanya, akan ditampilkan di layar).
Jika Anda mengetikkan string karakter pada keyboard (setelah menekan tombol ALPHA), string tersebut ditempatkan di register ALPHA (demikian pula, ditampilkan di layar).
Namun, keberadaan informasi apa pun di layar tidak berarti bahwa informasi itu ada di register. Ini berlaku, misalnya, untuk pesan kesalahan dan hasil LIHAT. Mereka menutup daftar yang ditampilkan di atas. Dalam kasus seperti itu, untuk menghapus pesan tanpa mengubah isi register, gunakan tombol "<-".
Dalam kasus ketika isi register ditampilkan di layar, kunci "<-" yang sama menghapus isinya.
Menekan ENTER akan mendorong salinan nomor tersebut ke tumpukan. Artinya, jika Anda mengetik 1 ENTER, maka 1 akan muncul di register X dan register Y. Jika Anda mengetik 2, maka register X akan menjadi 2, register Y akan menjadi 1.
CLX membersihkan X, CLA menghapus ALPHA
X <> Y menukar konten X dan Y
+, -, *, / melakukan operasi pada konten X dan Y dan meletakkan hasilnya di X, sedangkan yang ada di register Y hilang, dan apa yang ada di X ditempatkan di register L (dapat disalin kembali ke X dengan perintah LASTX jika perlu).
RCL register_number - menyalin isi register data dengan nomor yang ditentukan ke X (yaitu, memetakannya)
ARCL register_number - menambahkan isi register data dengan nomor yang ditentukan ke register ALPHA
ASHF menggeser isi register ALPHA tersisa 6 karakter (6 karakter pertama hilang).
Anda dapat melihat isi register tanpa menempatkannya di X yang ditampilkan. Untuk melakukan ini, gunakan perintah VIEW (untuk melihat register stack) dan AVIEW (untuk melihat register ALPHA).
Perlu dicatat bahwa tidak ada operasi lain dengan string di sistem perintah. Dan ini bukan kebetulan - faktanya adalah hanya ada sedikit memori yang bekerja dengan string, bahkan dengan modul ekspansi memori, tidak masuk akal. Namun, ada modul ekstensi tempat operasi string diterapkan.
STO register_number - menyalin isi register X ke register data yang ditentukan
ASTO register_num - menyalin isi register ALPHA (hanya 6 karakter pertama!) Ke register data yang ditentukan
Agar RCL dan STO dapat bekerja dengan register stack bernama, tambahkan ".": STO .Z
Perintah SIZE mengatur jumlah register data yang dapat digunakan (masing-masing, jumlah langkah program yang tersedia bertambah atau berkurang):
Semakin kecil SIZE, semakin banyak ruang untuk kode.
Untuk menghapus semua memori, Anda perlu menyalakan kalkulator dengan menahan tombol "<-" dan setelah menyalakannya segera lepaskan. Pesan "MEMORYLOST" akan muncul (sangat tidak stabil).
Mode program
Beralih ke mode pemrograman (dan kembali) - dengan menekan tombol PRGM. Jika tidak ada program, "00 REG nn" ditampilkan. Angka nn menunjukkan jumlah register yang tersedia untuk langkah-langkah program (lihat di atas tentang SIZE). Saat Anda mengetik program, kalkulator terkadang menulis PACKING untuk mencoba memadatkan kode. Jika tidak ada cukup memori untuk perintah berikutnya, tulis COBA LAGI.
Saat memasuki program, langkah saat ini ditampilkan di sebelah kiri. Satu langkah - satu perintah (tidak masalah, dimasukkan dengan satu tombol atau huruf demi huruf). Tetapi harus diingat bahwa satu langkah dapat memakan jumlah memori yang berbeda - sedikit jika itu adalah perintah sederhana seperti CLA, dan banyak jika itu, katakanlah, string teks yang panjang.
Bergerak dalam langkah - SST (maju) dan BST (mundur). Menghapus langkah saat ini - "<-".
Program dimulai dari mode perintah (misalnya PRGM harus ditekan lagi) dengan tombol R / S. Dia juga berhenti.
Dalam mode program, hampir semua fungsi yang tersedia dalam mode perintah tersedia. Memasukkan perintah yang ditandai pada tombol dilakukan hanya dengan menekan. Perintah lainnya dimasukkan melalui XEQ. Misalnya untuk memasukkan TONE 3, tekan XEQ, kemudian tekan ALPHA, kemudian ketik TONE huruf demi huruf, tekan ALPHA lagi lalu tekan 3.
Menghapus program: Label CLP (dihapus dari label hingga END)
Ke langkah tertentu: GTO.002 (Anda harus keluar dari program terlebih dahulu mode).
Pergi ke awal: SHIFT RTN
Anda dapat mengetahui posisi saat ini dari mode perintah dengan menekan dan menahan tombol R / S atau SST
Label, yang kemudian dapat dilompati, ditetapkan melalui "label LBL" dan terdiri dari dua jenis - global (nama teks, dimasukkan dalam mode ALPHA) dan lokal (nama teks numerik atau satu huruf). Digit membutuhkan lebih sedikit memori.
Lompat ke label "GTP label"
Berguna untuk selalu memberi label pada langkah pertama program. Ini memungkinkan Anda untuk menjalankannya tanpa harus memulai setiap saat - melalui label XEQ atau label GTO.
Ada juga transisi tidak langsung ke GTO IND (penggemar HP-41 mengutip ini sebagai bukti bahwa mesin Turing sudah lengkap;).
Di akhir program, GTO… dimasukkan (pesan PACKING muncul). Pada titik ini, END muncul di layar
Misalnya, program untuk mengalikan bilangan apa pun dengan 2 terlihat seperti ini:
LBL "PRGNAME" 2 * END
Bekerja dengan subrutin (hingga enam penumpukan diperbolehkan):
XEQ 04 ... LBL 04 ...... RTN
Cabang bersyarat:
X=Y? 2 1
Dalam contoh ini, jika X sama dengan Y, maka 2 akan didorong ke stack (register X), sebaliknya 1
Dengan kata lain, jika kondisi tidak terpenuhi, maka perintah setelah pemeriksaan akan dilewati. ISG
Loops
- Increment dan Skip jika Greater
DSE - Decrement dan Skip jika Sama dengan atau kurang dari
Contoh
1.00301 STO 01 LBL 01 BEEP ISG 01 GTO 01
Potongan ini dapat digunakan dalam wawancara sebagai pengganti penutup lubang got. Dengan pertanyaan "Berapa kali BEEP dijalankan dan mengapa?" Jawaban yang benar adalah 3 kali.
Penjelasan: Parameter loop ditentukan dengan satu nomor pecahan yang didorong ke tumpukan. Nomor tersebut memiliki format iiiii.fffcc, di mana:
iiii - inisial, ini adalah arus, nilai counter (indeks),
fff - nilai akhir
cc - langkah
Jadi, 1,00301 berarti penghitungan dari 1 hingga 3 dengan langkah 1
Jelas, solusi aneh seperti itu memungkinkan Anda untuk menyimpan memori, meskipun kode dapat dibaca, katakanlah, sedikit menderita.
Sedikit tentang menampilkan string:
AVIEW menampilkan register ALPHA, VIEW menampilkan register X.
Perintah APPEND menambahkan karakter yang ditentukan ke string dalam register ALPHA. Itu dimasukkan dari keyboard sebagai SHIFT K, dalam sumbernya terlihat seperti> "TEXT"
Contoh:
"HELLO WORLD!" ; ALPHA AVIEW ; PSE ; CLD ;
Ketika layar dibersihkan, simbol standar "angsa terbang" kembali untuk menunjukkan bahwa program sedang berjalan. Jika ada teks di layar, angsa tidak muncul.
Meskipun layar memiliki 12 karakter spasi, panjang baris maksimum dalam satu langkah program adalah 15. Dengan menggunakan APPEND, Anda bisa mendapatkan 24 (yaitu, panjang penuh register ALPHA). Ketika garis panjang ditampilkan di layar, secara otomatis akan menggulir:
"1234567890" >"ABCDEFGHIJKLMN" AVIEW
Operasi dengan string dibatasi hingga tiga perintah:
ASTO X - menempatkan 6 karakter pertama dari ALPHA ke dalam register yang ditentukan
ARCL X - menambahkan string ke akhir ALPHA dari register yang ditentukan
ASHF - menggeser ALPHA 6 karakter ke kiri (hilang)
Input data:
PROMPT - menampilkan isi register ALPHA dan menghentikan program (masing-masing, Anda dapat memasukkan sesuatu dan menekan R / S, sehingga melanjutkan eksekusi)
PSE - menghentikan eksekusi program selama sekitar satu detik. Dalam kasus ini, jika angka atau huruf ditekan, jeda diperpanjang untuk satu detik lagi, dan nilai total ditempatkan dalam register untuk diproses lebih lanjut.
Tentang suara:
BEEP - memainkan urutan standar dari empat nada yang sama
Nomor NADA - derit pendek salah satu dari 10 frekuensi (0 - terendah ... 9 - tertinggi). Frekuensi dipilih dengan cara yang agak aneh. Rupanya, ini karena penghematan memori.
Satu penjelasan
«The biggest problem is the fact that the high or low time of the signal driving the piezo element has to be a multiple of the instruction cycle time. This cycle time is nominally 155.6uS. So, for example TONE 9 has a three-instruction low and high time, giving a frequency of 1071Hz. TONE 8 has a four-instruction low and high time, giving a frequency of 803Hz. TONE 7 has a five-instruction low and high time, giving a frequency of 643Hz. These tones are individually coded. The remainder of the tones use a common routine to save code space. This common routine is 6+n instruction time long (for each phase of the piezo drive). And n is set by the TONE number as follows: TONE 6 has n=2, TONE 5 has n=4, and so on, down to TONE 0 with n=14. So, you could get better control at the low end of the frequency range, but it would take more code space. I guess that what they came up with was a reasonable compromise.»
Keliling
Perangkat periferal termasuk modul ekspansi memori, ROM dengan program siap pakai, pembaca / penulis pita magnetik (HP 82161A), kartu magnetik (HP82104A), pembaca barcode, port inframerah, printer, plotter, jam, antarmuka HP-IL (melalui yang dapat menghubungkan kalkulator ke berbagai peralatan) dan lainnya.
Saya mendapat pembaca / penulis kartu magnetik lengkap dengan HP-41. Kartu adalah potongan pita magnetis di atas alas kertas (stasiun metro Moskow dulu memiliki jenis kartu perjalanan yang serupa).
Setiap strip memiliki dua trek - mis. itu bisa disisipkan dengan sisi kiri atau kanan. 112 byte muat di setiap sisi. Program tipikal mencakup beberapa kartu.
Anda dapat melindungi sisi kartu dari tulisan dengan memotong sudutnya.
Saat modul dimasukkan ke dalam kalkulator, ROM-nya digunakan. Karenanya, banyak perintah baru untuk bekerja dengan peta muncul di kalkulator. Anda dapat membaca dan menulis program, register, dll. Anda bahkan dapat melindungi program yang sedang direkam agar tidak dilihat (yaitu Anda dapat mengunduh dan menjalankannya, tetapi Anda tidak dapat melihat program itu sendiri).
Di sini Anda dapat melihat cara kerja drive kartu magnetik.
Sayangnya, perangkat ini tidak dapat diandalkan dan sangat haus baterai (didukung oleh kalkulator itu sendiri). Punyaku tidak berfungsi - itu bersenandung dengan motor, tetapi tidak meregangkan pita. Ternyata pressure roller di dalamnya tidak hanya pecah, tapi benar-benar lenyap, hanya menyisakan setetes kotoran kental. Saya mengganti roller menjadi buatan sendiri, tetapi jelas meregangkan pita dengan susah payah - Anda harus menyesuaikan diameternya secara akurat. Masalahnya sangat umum sehingga ebay bahkan menjual kit video ini.
Perangkat menarik lainnya. Yang juga cukup umum di antara pemilik HP-41 adalah pembaca kode batang, yang digunakan antara lain untuk mendownload program ke kalkulator langsung dari buku. Bayangkan - tidak lama lagi mengemudi dalam program dari keyboard! .. Ini terlihat seperti ini:
Perkembangan dari
Tentu saja, Anda dapat menulis dalam FOCAL langsung di kalkulator. Tetapi ini agak membosankan - jauh lebih nyaman untuk menulis program dalam file teks. Tetapi situasi dengan kompiler dan emulator rumit. Semuanya agak aneh dan tidak terlalu stabil. Dari yang berjalan di bawah Win10, ada sim41 dan v41 (v.7b). Yang pertama diluncurkan hanya dari Visual Runfox, tetapi memiliki editor program terpisah (yaitu tidak perlu masuk dan mengeditnya dari keyboard kalkulator).
Yang kedua diluncurkan tanpa pendahuluan, ini mengemulasi kalkulator jauh lebih baik (meskipun tidak pada tingkat perangkat keras, yang ditunjukkan, misalnya, dengan desinkronisasi suara dengan kode), tetapi program harus dimasukkan baik secara manual, atau dimuat sebagai biner .raw, yang bukan kode mesin , dan representasi biner FOCAL). Masalahnya adalah untuk mengkompilasi sumber teks menjadi mentah, Anda harus menggunakan utilitas HP41UC.EXE, yang hanya dapat dijalankan dari bawah DOS. Saya menggunakan vDos dengan file batch, setelah memetakan direktori yang diperlukan ke disk melalui penggunaan f: c: \ tmp
Mengkompilasi sumber menjadi biner:
hp41uc /t=test.txt /r=test.raw Mendekompilasi
biner menjadi sumber:
hp41uc /r=text.raw / t = text.txt
Untuk merasakan platform yang lebih baik, saya menulis intro kecil 256 byte untuk pesta demo DiHALT.
Ini 256 byte, hanya karena kalkulator tidak muat lebih banyak, bahkan dengan modul ekspansi RAM terpasang. Jelas bahwa seseorang tidak boleh mengharapkan efek visual khusus dari kalkulator. Output dari berbagai garis digunakan, termasuk pengguliran otomatis garis panjang. Animasi dengan wajah - menghasilkan dua baris dalam satu lingkaran. DTMF disimulasikan dengan sangat bersyarat, musiknya juga sangat berbeda dari aslinya - karena fakta bahwa tidak mungkin untuk memilih kunci atau durasi yang diinginkan. Meski demikian, tetap terdengar seperti musik. Pada akhirnya, fitur kalkulator standar digunakan - untuk menampilkan "angsa terbang" saat prosesor sibuk dan register ALPHA kosong.
Awalnya, intro itu dua kali lebih lama, bahkan menggunakan subrutin. Tetapi ketika semuanya di-debug di emulator dan saya mulai memasukkan case ini ke dalam kalkulator, ternyata case ini tidak sesuai di sana (saya berharap emulator akan melaporkan kekurangan memori, tetapi tidak). Saya harus mempersingkat dan menulis ulang.
Di sini Anda dapat melihat kedua sumber tersebut.
Pemrograman sintetis
Pemrograman sintetis adalah teknik yang didasarkan pada eksploitasi kerentanan yang ditemukan di editor program kalkulator. Instruksi standar biasa dikodekan dalam memori kalkulator dalam beberapa byte. Kerentanan memungkinkan (setelah prosedur persiapan yang agak rumit) untuk mengubah byte ini, menerima instruksi baru dengan berbagai fungsionalitas. Misalnya, Anda bisa mendapatkan lebih banyak suara dari perintah TONE daripada yang diizinkan secara default. Anda dapat menampilkan lebih banyak karakter (dari satu set di ROM), mengakses flag sistem dan sejumlah hal berguna lainnya. Sekali lagi, sulit dan membosankan untuk menggunakan teknik ini dalam praktiknya. Benar, ada modul dengan subrutin yang memfasilitasi ini.
Situasi dapat muncul ketika, sebagai akibat dari tindakan sintetik yang salah atau tidak akurat, kalkulator akan membeku (misalnya, tidak akan merespons tombol) hingga baterai perlu dilepaskan dan dimasukkan. Ini pernah terjadi pada saya. Menariknya, dalam literatur ada peringatan bahwa, dalam beberapa kasus, agar kalkulator menyala kembali, baterai harus ditarik keluar selama dua hari (!).
Masalah lain dengan instruksi sintetis adalah terkadang instruksi tersebut terdiri dari karakter non-ASCII. Di sana, kesulitan khusus muncul baik dengan inputnya maupun dengan mencetak program seperti itu pada printer standar HP-41. Ya, bahkan hanya menerbitkan program seperti itu di buku atau majalah adalah masalah keseluruhan (biasanya di sebelah perintah mereka menulis penjelasan tentang bagaimana mereka harus dipahami). Salah satu solusi untuk masalah ini adalah membaca setiap karakter menggunakan pembaca barcode dari tabel khusus:
Sebenarnya, pemrograman sintetik sangat dekat dengan "egogologi" dalam kalkulator yang kompatibel dengan B3-34. Sebagai gambaran, Anda bisa melihat surat ini .
Orang-orang bahkan menulis puisi tentang hal ini! (diambil dari Synthetic Programming untuk HP41C (WCWickes)
KEYBOARDLOCKY
KEYBOARDLOCKY
'Twas octal, and the synthetic codes
were scanned without a loss.
In and out of PRGM mode,
Byte-jumpers nybbled the CMOS.
«Beware 0 STO c, my son,
The MEMORY LOST, the keyboard lock.
Beware the NNN, and shun
The curious phase 1 clock.»
He took his black box codes in hand,
Long time the backwards goose he sought;
The secret beast from Aitchpee land--
All searches came to nought.
In demented thought he stood, and then:
The goose, with LCD's alight,
A leap for every LBL 10,
Came honking left-to-right!
STO b! STO d!, and RCL P!
His keyboard went clickety-clack.
With the proper code in number mode
The goose came flapping back.
«And hast thou found the phantom fowl?
Come to my arms, my binary boy.
Let Corvallis hear us howl
As we chortle in our joy!»
'Twas octal, and the synthetic codes
Were scanned without a loss.
In and out of PRGM mode,
Byte-jumpers nybbled the CMOS.
--Apologies to Lewis Carroll
'Twas octal, and the synthetic codes
were scanned without a loss.
In and out of PRGM mode,
Byte-jumpers nybbled the CMOS.
«Beware 0 STO c, my son,
The MEMORY LOST, the keyboard lock.
Beware the NNN, and shun
The curious phase 1 clock.»
He took his black box codes in hand,
Long time the backwards goose he sought;
The secret beast from Aitchpee land--
All searches came to nought.
In demented thought he stood, and then:
The goose, with LCD's alight,
A leap for every LBL 10,
Came honking left-to-right!
STO b! STO d!, and RCL P!
His keyboard went clickety-clack.
With the proper code in number mode
The goose came flapping back.
«And hast thou found the phantom fowl?
Come to my arms, my binary boy.
Let Corvallis hear us howl
As we chortle in our joy!»
'Twas octal, and the synthetic codes
Were scanned without a loss.
In and out of PRGM mode,
Byte-jumpers nybbled the CMOS.
--Apologies to Lewis Carroll
MCODE
Kode mesin yang dieksekusi langsung oleh mikroprosesor di kalkulator HP-41 disebut MCODE - ini 5-120 kali lebih cepat daripada FOCAL standar.
Untuk berjalan di kalkulator, program di MCODE harus ditulis ke ROM (atau ke emulator ROM). Ada modul khusus yang memungkinkan Anda memuat kode melalui USB atau RS232 dan bahkan menulis ke M-CODE langsung di kalkulator. Umumnya mereka disebut MLDL dan keduanya kuno, dari HP itu sendiri, dan modern .
Dari cross-assembler, saya hanya menemukan yang kuno - untuk DOS.
Beberapa kata tentang arsitektur prosesor. Karena difokuskan terutama pada matematika, ada kekhususan. Register utama (dan register prosesor bukanlah register yang digunakan dalam FOCAL!) A, B, C, N, M adalah 56-bit.
Ada juga register yang lebih pendek untuk flag, keyboard, speaker, pointer, counter instruksi 16-bit, dan stack balik empat tingkat (empat register 16-bit).
Di ROM, yang dihubungkan ke prosesor oleh bus serial dan di mana program kontrol kalkulator yang ditulis dalam MCODE berada, lebar byte 10 bit. Prosesor mengalamatkan 64K ROM, yang 12K ditempati oleh sistem operasi. Sedangkan untuk RAM, itu tidak dipetakan ke dalam ruang alamat dan merupakan perangkat periferal untuk prosesor. Byte RAM memiliki lebar 8 bit, tetapi prosesor secara logis memperlakukan RAM sebagai register 56-bit.
Karena saya tidak menulis di MCODE (dicekik oleh katak seharga $ 250 untuk emulator ROM), saya tidak dapat berbagi pengalaman pribadi saya pemrograman di MCODE.
Instruksi di sana cukup tradisional, meskipun banyak mnemoniknya cukup spesifik. Sebagai contoh:
B=A ; A B A<>C ; A C A=A+B ; A B A A=B=C=0 ; 0 A,B,C C=0 M ; 0 ( 3-12) C ?A<C ; , A C JC -02 ; , READ n ; ( 1 15) C PUSH addr ; GOSUB 815B ;
Perkiraan analog MCODE dari perintah FOCAL TONE n:
178 C=REG 5/M ; recalls status register M 358 ST=C ; rightmost byte (nybbles 1 and 0 ) are loaded in status bits (flags 0 to 7) 379 * 05A NCGO 16DE ; XTONE
Sedangkan untuk kontrol indikator, pengontrolnya tidak memungkinkan untuk menghidupkan dan mematikan segmen sembarang - Anda hanya dapat menampilkan simbol yang ada di generator karakter. Ini juga yang menjadi alasan kenapa saya tidak ambil pusing dengan ROM emulator dan pemrograman di MCODE.
Untuk menampilkan simbol, Anda perlu memilih indikator dengan instruksi prosesor PRPH SLCT FD dan kemudian bekerja dengan register indikator melalui WRIT / READ
Epilog
Sejujurnya, logika kalkulator dan sistem perintah agak membingungkan. Menurut pendapat saya, bagi seseorang yang bisa menguasai ini, tidak ada masalah hanya untuk menulis kode mesin dari beberapa prosesor sederhana. Pada kalkulator kompatibel B3-34 kami, semuanya, tentu saja, juga tidak mudah, tetapi ada kemungkinan yang jauh lebih sedikit, itulah sebabnya tidak ada perasaan kebingungan seperti itu.
Pada dasarnya, argumen untuk menumpuk pseudo-code di atas mikroprosesor di HP-41 adalah kebutuhan untuk perhitungan matematis, karena bagaimanapun, ini seharusnya mudah bagi pengguna kalkulator pada umumnya.
Hal yang sama berlaku untuk keyboard - keyboard alfanumerik biasa dapat dibuat langsung, tanpa menggantung perintah pada tombol. Bagaimanapun, fungsionalitas input perintah huruf demi huruf telah diterapkan (namun, kalkulator dengan keyboard lengkap segera mulai diproduksi).
Berbagai dokumentasi HP41 sudah saya kumpulkan dalam satu arsip, jika ada yang berminat bisa mendownloadnya (saya posting sebentar, maka saya akan menghapusnya).