재무용 계산기의 사실상 표준인 HP-12C 계산기는 오랜기간 생산되는 동안 여러 version으로 나왔습니다. (각 version에 대한 표는 아래 참조)

그중에서 beast 또는 hp-12c+라고 불리는 model이 있습니다. 성능은 기본 model대비 60배, Platinum 대비 10배의 속도를 지녔다고 합니다. (platinum은 6배 빠릅니다.)

HP NUT 프로세서가 아닌 ARM core를 사용하기때문에 내부적으로는 에뮬레이터를 사용한다고 합니다.

 

hp-12c / hp-12c platinum을 쓰다보면 cash flow에서 irr(interest rate of return)이나 TVM에서 i(interest)를 계산할 때, 항상 뜨는 running을 보고 있으면 "참 이쁜 쓰레기"라는 생각이 떠오르곤 했습니다. 그렇지만, 재무관련 모든 교재나 설명에 있는 내용을 hp-12c는 계산할 수 있습니다. 교재가 TI-BA2 plus로 되어 있어도 약간만 손대면 그대로 쓸 수 있죠. 말 그대로 "de facto" standard의 위력입니다.

 

그러던중 hp community에서 60배 빠른 hp-12c의 존재를 알게 되었습니다. 거기서는 "beast"라고 부르던데, 60배면 얼마나 빠른거야.라는 생각을 하고 있었는데, 당근에서 영입했습니다! serial number를 조회해보니 2017년 중국 생산이네요.

 

써봤더니 말 그대로 무지하게 빠릅니다. cash flow의 irr이나 TVM의 i(이율) 계산할 때, running 화면이 살짝 뜨고 바로 값이 나옵니다.

한동안 만지다보니 단점도 보입니다. 버튼 입력이 좀 불안정합니다. 제가 가지고 있던 "느린" hp-12c에서 겪어보지 못해서 좀 당황스럽네요. 그래서 입력할 때, 화면을 확인해야 해서 속도 빠름의 장점이 희석되는 느낌입니다.

 

어쨌든, "beast"는 맞습니다. 기존 "느린" hp-12c와 외관상 구분점은 CR-2032 battery가 두개 들어간다는 것으로 구분 가능합니다. hp-12c 계산기의 version list 입니다.

# Model Years CPU Clock Power-Supply Speed
1 12C 81-88? 1LF5 (HP NUT) 884KHz 4.5V (3xLR44) x1
2 12C 81?-88? 1LM2 (HP NUT) 884KHz 4.5V (3xLR44) x1
3 12C 88-01? 1LQ9 (HP NUT) 884KHz 4.5V (3xLR44) x1
4 12C 95-01? 1RR2 (HP NUT) 884KHz 4.5V (3xLR44) x1
5 12C 99?-07 Agilent 2AF1-0001 (HP NUT) 884KHz 3V (1xCR2032) x1
6 12C 01?-07 Marvell 2AF1-0002 (HP NUT) 884KHz 3V (1xCR2032) x1
7 12C Platinum 03-05? Sunplus SPLB20D2 (6502) ~1MHz 3V (1xCR2032) x1.5?
8 12C Plat.(v2) 05?-10? Generalplus GPLB31A (6502) ~4MHz 3V (1xCR2032) x6?
9 12C Prestige 06-? Generalplus GPLB31A (6502) ~4MHz 3V (1xCR2032) x6?
10 12C Plat.25th AE 06-08? Generalplus GPLB31A (6502) ~4MHz 3V (1xCR2032) x6?
11 12C (+, v1) 08-? Atmel AT91SAM7L128 (ARM7DTMI) ~36MHz 3V (2xCR2032) x60
12 12C Plat.(v3) 10-? Generalplus GPLB31A (6502) ~4MHz 3V (2xCR2032) x6?
13 12C 30th AE LE 2011 Atmel AT91SAM7L128 (ARM7DTMI) ~36MHz 3V (2xCR2032) x60
14 12C (+, v2) 2015- Atmel ATSAM4LC2C (Cortex-M4) ~48MHz 3V (2xCR2032) x60?

 

한글 manual (hp-12c platinum)

hp-12c-platinum_user_guide_ko.pdf
0.84MB

카시오 fx-9860G

계산기 2023. 7. 6. 00:23 posted by tolkien

 공학용 계산기에 취미를 붙여서 어떻게 구하게 되면 사용자 설명서보면서 잠시 쓰다가 질리면 나면 보내고를 반복하고 있습니다. 제가 관심있게 보는 것은 TI와 HP쪽 제품들입니다. TI는 강력한 성능을 지닌 graphing calculator가 매력적이구요. 거기에 TI-BASIC도 나름 썩 훌륭합니다. HP는 그 독특함이 매력으로 구하면 그 사용법을 익히느라 시간 가는 줄 모르게 됩니다. 헌데 다 익히고 나면 사용처는 참 난감합니다. 계륵같은 존재이고, 저는 "예쁜 쓰레기"라는 별명을 붙여주었습니다. (아주 심심해서 한번도 안 써본 HP-Prime 빼고)

 

 그에 비해 Casio 제품군은 진짜 무난함이 장점이자 단점입니다. 시험용으로 접하는 fx-570 series부터 제가 소개하는 fx-9860 series까지 쉬운 인터페이스와 함께 강력한 성능은 시험이나 학업에 사용하는 보조기기로 제격입니다. 단점은 심심하다는 겁니다. 조금 익히면 그 담부터 볼 것이 없습니다.

 

 제가 지금 손에 쥔 것은 fx-9860G입니다. TI계열처럼 전지전능하지는 않지만, 대학교 수업에 필요한 것은 전부 갖추었다고 생각합니다. 복소수 연립방정식도 지원하고(저는 잘 모르는데, 전자쪽에서는 매우 유용하다고 합니다. fx-9750 series와의 차별점중 하나로 알고 있습니다.), 통계로 국한하면 List Editor로 입력도 편하게 할 수 있고, (통계) 함수도 다 갖추었다고 볼 수 있습니다. 그리고, usb micro-A cable을 사용하면 간단하게 add-in을 추가할 수 있구요. GIII에서는 python까지 쓸 수 있다 들었기에 한번은 건드려봐야지 하고 있긴 한데, 계산기라는 기능에 국한한다면 Casio-BASIC 정도면 무난할 것같구요. (설마 계산기에 탑재되어 있는 python이 numpy를 지원하는 것은 아니겠죠?)

 

 조금 예전 것이긴 한데 9860 한글 매뉴얼 첨부합니다. (version 2.00)

FX-9860G_v200_KO.pdf
12.27MB

HP-32SII

계산기 2023. 5. 10. 10:16 posted by tolkien

당근에서 운 좋게 HP-32SII를 영입했습니다.

(HP-32S였으면 좋겠지만, 아닙니다!)

 

이전에 써봤던 HP-17BII와 같은 Pioneer 시리즈라서

키감은 비슷한데, HP-17BII와 달리 LCD에 soft menu가 나오지 않습니다. 대신 HP-50g에서 보는 것처럼 left shift, right shift key가 있습니다.

 

제가 이전에 다루었던 HP-35GS, HP-12C와 조금 체계가 달라서 매뉴얼 보면서 공부하고 있습니다.

근데 매뉴얼 앞부분부터 나오는 것이 X,Y,T,Z stack 설명...

이전에 HP-50g도 살짝 손대보기도 했고, HP-12C를 쓰고 있으니 이게 왜 필요한지 아는데, HP RPN 계산기를 처음 쓰는 사람들에게는 필요없는 부분입니다.

처음에 계산기를 사면 간단히 계산부터 하고 싶어하지.

누가 계산기 내부 register 동작 원리를 알고 싶어 합니까.

쓰다보면 궁금한 점이 있으면 그때 볼 수 있게 Appendix 정도에 넣어주면 되는 내용을 2장에 넣어주는 HP...

(그래서 매니아가 많은 건가)

 

HP-32S는  menu에 들어가 있는 기능들을

그 후속작인 HP-32SII는 eft, right shift 조합으로 직접 대응시켰습니다.

HP-17BII, HP-35GS에서 보이던 soft menu가 사라지고,

HP-48 시리즈에서 보이는 left, right shift key를 보여주는 중간 형태의 기기라는 느낌이 강하네요.

(HP-50g에서 보이는 정신없는 키배치보다는 좀 덜 복잡합니다.)

공학용 계산기 TI-NSpire CX Emulator, Firebird

계산기 2023. 3. 29. 00:07 posted by tolkien

( https://m.blog.naver.com/nicecan/221112291936 ,

  https://cafe.naver.com/calc/33845 를 많이 참고했습니다.)

TI-NSpire 공식 에뮬레이터 대신 open source로 공개되어 있는 Firebird Emulator를 사용하는 방법입니다.

 

준비하기

1. BootCode를 아래 site에 가서 download 받습니다. (제일 아래로 내려가서 Boot1cx.img, Boot2cx.img만 받으시면 됩니다.)

https://www.intereseducation.com/resources/how-to-emulate-ti-nspire-cx-cas-touchpad-on-mac-windows-linux-with-firebird/

2. TI-Spire CX CAS ROM file은 TI 공식 홈페이지에서 받습니다.
- TI-Nspire™ CX CAS Handheld Operating System - Texas Instruments - US and Canada

3. 그리고, Firebird Emulator 실행파일은 

- Releases · nspire-emus/firebird (github.com) 에 가서 firebird-emu-win64.zip을 download.

파일을 한데 모아놓고, (예를 들어, E:\Users\john\Documents\calc-TI\Emu) 아래와 같이 설정합니다.

 

설치 및 설정하기

4. firebird-emu-win64.zip을 풀고나면, directory에 있는 firebird-emu.exe를 실행하면 아래와 같이 설정화면이 뜹니다. (그림 1)

5. 이제 파일들을 하나하나 지정해주어야 합니다.

  A. Boot1 : Boot1cx.img

  B. Flash에서는 "+" Icon을 눌러서 Flash File을 생성하는 화면(그림 2)으로 가서

      Boot2 : Boot2cx.img, OS : TI에서 받는 OS image (여기서는 TI-NspireCXCAS-4.3.0.702.tcc) 지정해주고, Save button을 누르면 FlashFile 이름을 물어보는데, 적당한 이름을 넣어줍니다. (저는 Firebird-flash.bin 이라고 주었습니다.)

 C. Snapshot button을 누르면 파일이름을 물어보는데, 적당한 이름을 넣어줍니다. (저는 Firebird-snapshot.raw 라고 주었습니다.) 제대로 설정이 되면 그림 3처럼 됩니다.

6. 그리고,  OK button을 누르면 Firebird Emu의 Desktop UI가 나옵니다. 모바일 UI가 실제 기기와 비슷해서 그걸로 설정합시다. Tools -> Switch To Mobile UI를 선택하면 아래와 같은 화면이 나옵니다. (그림 4, 크기를 적당히 조절해서 화면이 다 나오게 합시다)

7. 여기서 "Swipe here"을 누르면, 설정화면이 나오는데 여기서 "Start"를 누릅니다. (그림 5)

8. 좀 있으면 다음과 같은 화면이 나오는데, 여기서 " i " button을 누릅니다. (그림 6, PC가 아니라 emulator에 있는 " i " button입니다.)

9. 조금 기다리면 Firebird Emu가 TI-NSpire OS를 돌릴 준비가 된 것을 알 수 있습니다. (그림 7)

A futex overview and update

Personal Computer/Linux 2023. 3. 27. 22:38 posted by tolkien

 Rusty Russell, Hubertus Franke, Mathew Kirkwood에 의해 2.5.7에 도입된 futex 메커니즘은 사용자 애플리케이션을 위한 빠르고 가벼운 kernel-assisted locking primitive이다. 이것은 매우 빠른 비경합(uncontended) locking 획득 및 해제를 제공한다. futex 상태는 사용자 공간 변수(모든 플랫폼에서 부호 없는 32비트 정수)에 저장된다. atomic operation은 syscall의 오버헤드 없이 경합하지 않는(uncontended) 경우 futex의 상태를 변경하기 위해 사용된다. 경합(contended)하는 경우 커널을 호출하여 작업을 절전 모드로 전환하고 절전 모드를 해제한다.
 futex는 thread programming에서 일반적으로 사용되는 몇 가지 상호 배제(mutual exclusive) 구조의 기초이다. 여기에는 pthread mutex, condvar, semaphore, rwlock 및 장벽이 포함된다. 그들은 지난 몇 년 동안 많은 재건(reconstructive) 수술과 성형(cosmetic) 수술을 겪었고, 이제 그 어느 때보다 더 효율적이고, 더 기능적이며, 더 잘 문서화되었다.

 

Overview

 futex를 직접 사용하는 애플리케이션 개발자는 거의 없지만, 나중에 제시된 개선 사항을 평가하기 위해서는 그 방법에 대한 대략적인 지식이 필요하다. 간단한 예를 들어, futex는 잠금 상태를 저장하고 잠금에서 작업을 차단하기 위한 커널 대기열(waitqueue)을 제공하는 데 사용될 수 있다. syscall 오버헤드를 최소화하려면 잠금이 중단되지 않은 경우 이 상태에서 원자 잠금(atomic lock)을 획득할 수 있어야 한다. 상태는 다음과 같이 정의할 수 있다:


    0. unlocked
    1. locked

 

 locking을 획득하기 위해 atomic test-and-set 명령(예: cmpxchg())을 사용하여 0을 테스트하고 1로 설정할 수 있다. 이 경우, locking thread는 커널을 포함하지 않고 lock을 획득한다(그리고 커널은 이 futex가 존재한다는 것을 알지 못한다). 다음 스레드가 잠금을 획득하려고 할 때 0에 대한 테스트가 실패하고 커널이 관여해야 한다. 그런 다음 blocked thread는 futex_WAIT opcode와 함께 futex() 시스템 호출을 사용하여 futex에서 자체를 절전 모드로 전환하여 futex 상태 변수의 주소를 인수로 전달할 수 있다. 잠금을 해제하기 위해 소유자는 잠금 상태를 0(잠금 해제)으로 변경하고 FUTEX_WAKE opcode를 실행한다. FUTEX_WAKE opcode는 blocked thread를 사용자 공간으로 돌아가 잠금을 획득하려고 시도한다(위에서 설명한 대로). 이것은 최적화의 여지가 많은 명백한 사소한 예이다. Ulrich Drepper의 "futex are tricky"는 여전히 mutex와 같은 locking primitive를 구축하기 위해 futex를 사용하는 것에 대한 좋은 참조 문서이다. 여기에 제시된 예를 개선하기 위한 최적화뿐만 아니라 futex 사용과 관련된 많은 race condition을 언급하고 있다.
 사용자 thread가 futex() 시스템 호출과 함께 커널에 호출할 때 futex 상태의 주소(uaddr), 수행할 opcode(op) 및 다양한 다른 인수를 전달한다. uaddr은 커널이 futex를 참조하는 고유한 "futex_key"를 생성하는 데 사용된다. thread가 FUTEX_WAIT와 같이 futex에서 차단을 요청할 때, "futex_q"가 생성되고 "futex_queues" 해시 테이블에 queuing된다. futex에서 차단된 모든 작업에 대해 하나의 futex_q가 존재하며, 많은 futex당 futex_q가 존재할 수 있다. 여러 개의 futex_key가 동일한 큐에 해시하기 때문에 futex_queue 자체("futex_q's"가 아닌 해시 테이블 목록)는 futex 간에 공유된다. 이러한 관계는 아래에 설명되어 있다:

 대부분의 경우 사용자 공간 상태 변수를 사용하는 방법을 정의하는 정책은 없다. 응용 프로그램(또는 glibc와 같은 라이브러리)은 이 값을 사용하여 구현되는 locking 구조의 상태를 정의합니다. 이것은 부울 변수만큼 간단할 수 있지만(위의 예에서처럼) 최적화된 구현과 다른 locking 메커니즘은 더 복잡한 상태 값을 필요로 한다.
 커널은 간단한 FUTEX_WAIT 및 FUTEX_WAKE 작업 외에도 잠금 구조의 상태에 대한 지식이 사용자 공간에서 가질 수 있는 것보다 더 많은 지식을 필요로 하는 priority inheritance(PI) 체인과 강력한 목록을 관리한다. PI 및 강력한 futex는 상태 변수와 관련된 사용자 정의 정책 규칙의 예외이다. 그들의 상태는 mutex의 잠긴 상태뿐만 아니라 소유자의 신원과 웨이터의 유무에 따라 달라진다. 이와 같이 futex 값은 소유자의 스레드 식별자(TID)와 보류 중인 소유자를 나타내는 비트로 정의된다. 이 정책을 사용하면 사용자 공간 atomic operation을 통해 중단되지 않은 경우 커널 호출을 피할 수 있다.

 

개선 사항

 futex는 2.5.7에 처음 등장한 이후 소수의 개발자들로부터 수많은 개선을 보았다. 일부 주목할 만한 개선 사항에는 실시간 작업에 대한 우선 순위 기반 wakeup(Pierre Peifer)과 강력한 PI futex(Ingo Molnar 및 Thomas Gleixner)가 포함된다. 이러한 후자의 기능은 한동안 사용되어 왔으며 커널 메일링 목록에 대한 훌륭한 토론뿐만 아니라 LWN.net 에서도 적절하게 다루어졌다. 저자의 futex에 대한 시도는 2년반전 여기서 시작되었다. 희귀한 corner case와 race condition을 해결하기 위한 몇 가지 수정 사항 외에도, futex 코드는 이전의 기여 이후로 몇 가지 기능과 성능 향상을 보았다.
 futex 오버헤드를 줄이기 위해 상당한 노력을 기울였다. Eric Dumaze은 PTHREAD_PROCESS_PRIVATE pthread mutex에 대한 최적화로 private futex를 도입했다. private futex는 동일한 프로세스의 thread에서만 사용할 수 있다. 이들은 단순히 가상 주소로 서로 구별할 수 있는 반면, shared futex는 각 프로세스에서 서로 다른 가상 주소를 가지고 있어 커널이 고유한 식별을 위해 물리적 주소를 검색해야 한다. 이 최적화를 통해 private futex에 mmap_sem semaphore를 사용할 필요가 없으므로 시스템 전체의 경합이 줄어든다. 또한 private futex의 reference counting에 사용되는 atomic operation을 제거하여 SMP 머신에서 cache-line 바운스가 줄어든다. Glibc는 이제 기본적으로 private futex를 사용한다.
 Peter Ziljstra는 빠른 경로에서는 get_user_pages_fast()를 사용하고, (일반적인 상황에서는) get_user_pages()를 사용하며, 느린 경로 주변에서만 mmap_sem lock을 사용하도록 강하게 푸시함으로써 futex의 mmap_sem 의존성을 더욱 줄였다(2008년 9월). 이러한 변경은 kernel/futex.c에서 가상 메모리 관련 로직의 대부분을 제거하여 코드를 상당히 단순화하는 추가적인 이점이 있었다. 사용자 공간 주소에 의존하기 때문에 futex는 몇 가지 가능한 fault point을 부담한다. mmap_sem을 사용하는한, get_user()를 호출하기 전에 해제해야 했기 때문에 장애 로직이 복잡해졌다. mmap_sem 사용이 줄면서 작성자는 장애 로직을 크게 단순화하여(2009년 3월) 훨씬 더 읽기 쉬운 코드를 생성했다.
 bitset conditional wakeup은 glibc에서 최적화된 rwlock 구현을 가능하게 하기 위해 Thomas Gleixner(2008년 2월)에 의해 추가되었다. FUTEX_WAIT_BITSET 및 FUTEX_WAKE_BITSET을 사용하면 대기 시간에 동일한 bitset(또는 FUTEX_BITSET_MATCH_ANY와 같은 수퍼 세트)를 지정한 작업으로 wake up task를 제한하는 bitmask를 지정할 수 있다.
 PI futex의 도입 이후, pthread_cond_broadcast()의 glibc condvar 구현은 PI futex로의 대기열을 위한 지원이 부족하기 때문에 FUTEX_REQUEUE의 이점을 활용하지 않고 모든 대기자를 깨울 수밖에 없었다. 이것은 모든 waiter들이 사용자 공간으로 돌아가 lock을 얻기 위한 다툼을 벌이기 때문에 웨이크업 스톰(wakeup storm)이 발생한다. 또한 우선 순위가 가장 높은 작업이 먼저 잠금을 획득하는지 확인하지 못한다. 최근 커널(2.6.31-rt* 및 2.6.32-rc*)에는 이제 작성자의 FUTEX_CMP_REQUEUE가 추가되었다. PI 패치(2009년 4월)는 비PI futex에서 PI futex로 waiter를 대기시키기 위한 커널측 지원을 제공한다. Dinakar Guniguntala의 작업에서 glibc 패치를 통해 실시간 애플리케이션은 곧 guaranteed wakeup order와 더 적은 overall wake-up으로 pthread conditional variable을 사용할 수 있게 될 것이다.

 

자 이제는 뭐죠?

 현재 구현된 kernel/mutex.c를 뒤로 하고, futex 개발자들은 다음 항목들을 고려하고 있다. (다음 단계에 처리할 항목을 담은 문서가 아직 나와 있지 않다.)

man page: 현재 man 페이지에는 새로운 futex 작업의 일부가 포함되어 있지 않다. 이들은 futex의 값에 대한 정책을 제안하고 있으며, 이로 인해 futex 사용에 대한 혼란이 발생하고 있다. 무엇보다도, 사용자 공간 futex() 정의가 /usr/include/linux/futex.h에서 제거되어 man 페이지가 불완전할 뿐만 아니라 부정확해졌다. futex 사용자는 syscall 인터페이스를 직접 사용해야 한다.

adaptive futex: futex의 스케줄링 오버헤드 중 일부는 커널에서 잠들기 전에 적절한 양의 spinning으로 줄일 수 있다. 그러나, futex가 그들의 상태를 사용자 공간에 노출시키기 때문에, 이 spinning은 현재 glibc의 adaptive mutex에서 수행되는 것처럼 사용자 공간에서도 수행될 수 있으며, 소유자가 실행 중인지 여부에 대한 지식이 없어도 spinning은 단순한 최대 재시도 루프로 감소된다.

interruptible futex: 대규모 독점 소프트웨어 프로젝트의 interrupt blocking lock operation에 관심이 있다. 현재 Futex 작업은 signal 발생 시 -EINTR을 사용자 공간으로 되돌리는 대신 자체적으로 재시작된다. futex는 FUTEX_INTRUSTIBLE로 플래그가 지정될 수 있으며, signal발생으로 인한 wakeup시 이 플래그는 시스템 호출을 다시 시작해야 하는지 또는 -ECANCELED를 사용자 공간으로 반환해야 하는지 결정한다. 이러한 기능을 pthread lock primitive로 공개하면 pthread 라이브러리에 대한 non-POSIX compliant 변경이 수반되지만 이는 전례가 없는 것은 아니다.

scalability enhancement: LKML은 NUMA에 최적화된 해시 테이블뿐만 아니라 비공개 해시 테이블에 대해서도 논의되어 왔다. futex 해시 테이블은 모든 프로세스에서 공유되며 특히 대규모 시스템에서 실제 오버헤드로 이어질 수 있는 spinlock에 의해 보호된다. 이 오버헤드는 시스템이 NUMA 노드에서 파티셔닝되거나 private futex를 단독으로 사용하는 프로세스에 대해서는 적용되지 않는다.

futex test suite: 작성자가 futex 기능을 검증하기 위해 전체 테스트 제품군에 대한 요구 사항 목록을 작성하고 있다. 이 test suite는 향후 개발을 위한 regression suite 역할을 할 것이다. futex로 가능한 많은 corner case와 misuse case는 test suite를 복잡하게 만들고 설계에 문제를 제기한다.

 

Acknowledgement

나는 John Stultz, Will Schmidt, Paul McKenney, Nivedita Singhvi, 그리고 물론 Jon Corbet에게 감사를 표하고 싶다. 그의 리뷰는 이 기사를 그렇지 않았을 때보다 훨씬 더 읽기 쉽고 완전하게 만들었다.

TI-84/TI-83 plus에서 가장 아쉬운 것이 복소수 행렬지원입니다. 정확히 말하면 복소수 행렬을 통한 복소수 연립방정식이죠. 이 기능의 부재로 인해서 같은 회사의 상위기종인 TI-89나 TI-NSpire로 넘어가게 됩니다. 아니면, 카시오 fx-9860 시리즈로 가게 되죠. (fx-9750 시리즈는 지원하지 않습니다. 그외 레어템인 TI-86, 카시오 afx-2.0 등이 복소수 행렬 연산을 지원합니다.)

 그래서, 이에 극복하기 위한 여러 방법이 있는데, 그중에서 아리조나 주립대 공과대학에서 작성한 TI-84/TI-83plus용 app이 사용하기 깔끔하기에 소개합니다. 아래식을 예로 들면,

(1+i)x -2iy = 6-2i
3ix + (-2+i)y = -1
  1. SIMEQMWM.8xp를 설치하고,
  2. STAT -> Edit... -> L1에 입력합니다. 순서는 x계수, y계수, R-value 순으로.
  3. 2nd -> Quit로 종료한 다음에, SIMEQMWM을 실행합니다. NUM=?을 물어보면 미지수 갯수인 2를 입력합니다.
  4. 다시 STAT -> Edit... 로 들어가면 L2에 해가 들어 있습니다. (참,  쉽죠?)

TI-BASIC code이므로 다른 계산기에도 이식이 쉽게 될 것같습니다. (->은 STO, L1, L2는 List 1, List 2입니다.)

SetUpEditor
ClrList L2
Prompt N
{2N,2N+1->dim([A])
For(I,1,N)
For(J,1,N)
real(L1((I-1)N+I+J-1))->[A](I,J)
[A](I,J)->[A](N+I,N+J)
imag(L1((I-1)N+I+J-1))->[A](N+I,J)
-[A](N+I,J)->[A](I,N+J)
End
real(L1(I(N+1)))->[A](I,2N+1)
imag(L1(I(N+1)))->[A](N+I,2N+1)
End
rref([A])->[A]
For(I,1,N)
[A](I,2N+1)+i[A](N+I,2N+1)->L2(I)
End
DelVar [A]

 

참고문헌

  1. https://uweb.engr.arizona.edu/~mwm/classes/220/Other_Resources/SIMEQMWM.htm
  2. https://education.ti.com/en/customer-support/knowledge-base/ti-83-84-plus-family/product-usage/34843
  3. https://m.blog.naver.com/kyhilsang131/221863854577
  4. https://allcalc.org/21582

SIMEQMWM.8xp
0.00MB

 

TI-86 공학용 계산기(2)

계산기 2023. 2. 12. 16:39 posted by tolkien

TI-86 계산기를 가지고, GuideBook을 보면서 하나하나 익혀가고 있습니다.

 

원래 TI-83 plus를 구하려다 꿩대신 닭이라고 손에 넣은 것인데, 써보니까 TI-89의 모습이 더 많이 보입니다. 기능을 넣다가 cpu의 한계를 느껴서 m68k로 넘어간 것이 아닌가.하는 느낌이 듭니다.

 

하지만, 후속작인 TI-84를 보면 TI-86의 흔적은 사라지고, TI-83 plus도 다시 돌아갔습니다. TI-84 UI는 왜 TI-86에서 시도한 것을 사용하지 않았는지 궁금합니다. soft-menu라는 개념이 학생들에게 가르치기 까다로워서 뺀 것인지.


 미분방정식 그래프를 그리는 부분들 따라하다보면 그런 느낌이 확신으로 바뀌는데요. 같은 TI 계산기라서 그런 것일 수도 있겠다 싶지만. (아니면, 미분방정식 그래프는 이런 식으로만 그려야만 하는 것일 수도 있네요. Casio나 HP에서 해당 기능을 한번 확인해봐야겠습니다.)


미분방정식 그래프 출력은 비슷하게 나옵니다. TI-89는 menu가 좁은 화면의 위를 차지하지만, TI-86은 다 그리면 soft-menu가 하단에 작게 위치합니다. 그래서인지 TI-86이 화면이 더 좁다고 느끼지 않습니다.

 값 및 식을 입력하는 부분에 있어서는 TI-89가 더 보기 좋습니나. TI-89는 "Y=" editor에서 필요한 방정식과 초기값을 한꺼번에 넣을 수 있게 되어 있습니다. 그외 다른 parameter들은 FORMAT이라는 menu로 따로 입력해야 합니다(F1 -> 9). 그리고, Windows parameter나 Zoom parameter를 적당히 넣으면 그래프가 나옵니다. (빠르게!)
 그에 비해 TI-86는 좀  여기저기 뛰어 다녀야 합니다. "Q(t)=" editor에서 방정식을 넣고, INITC menu에서 초기값을 넣습니다. MORE key를 눌러서 FORMT menu를 호출해서 다른 parameter를 넣어야 합니다. 현재까지는 조금 번거롭다.정도이지 심각한 단점은 아닙니다. (심각한 단점은 심하게 느린 cpu입니다. TI-83 plus보다 느린 것같아요.)

 

 TI-89대비 TI-86에서 맘에 드는 점은 LIST Editor입니다. (MATRIX Editor 포함)

 TI-89를 쓰면서 가장 아쉬웠던 점은 LIST Editor입니다. 계산에 사용할 LIST를 HOME에서 command line으로 입력하는 것은 악몽과도 같은 일입니다. 그래서 TI-89를 손에 넣자마자 제일 먼저하는 일은 "Statistics with LIST Editor"를 TI-89에 설치하는 일입니다. TI-83/86에서 제공하는 LIST Editor는 Casio나 Sharp의 그것보다 더 편한데, 그 이유는 HOME에서 직접 불러서 작업할 수 있다는 점입니다. 계산중에 LIST Editor를 호출해서 list를 만들고, 바로 써먹을 수 있습니다. (TI-89에서 추가된 LIST Editor도 마찬가지로 "HOME에서 빠져 나와서" 사용해야 합니다.)

 

 또, 단점때문에 장점처럼 느껴지는 것은 추가된 app들도 기존 built-in menu처럼 쓸 수 있다는 점입니다. TI-86는 TI-83 plus나 TI-84처럼 Flash Storage가 없습니다. TI-84에서 apps를 누른 다음 선택해서 실행해야 하는 것들이 MATH menu에 붙어있습니다. 궁여지책으로 내놓은 해결책일텐데, 이게 나쁘지 않습니다. 무엇보다 HOME에서 떠날 필요가 없으니까요. (정확히 말하면 떠나지 못하는 것입니다만.) TI-86에 없는 통계패키지나 재무 프로그램을 PC에서 download 받은 다음 "설치"하면  MATH menu에 확장으로 붙습니다. menu에 붙지 못하면 CATALOG를 통해서 실행하는 방식외에는 없습니다.

TI-86 공학용 계산기

계산기 2023. 2. 3. 23:24 posted by tolkien

우연히 TI-86 계산기를 손에 넣게 되었습니다.

TI-83 plus 랑 비교해보면

TI-86 공학용 계산기

  • Flash ROM이 없습니다. program은 RAM memory에 저장만 가능합니다. 따라서 PC와 link해서 backup해야 합니다.
  • TI-83 시리즈보다 더 유연한 듯 합니다. LIST의 경우, L1~L6만으로 제한되었던 TI-83과 달리 LIST 변수를 자유롭게 생성할 수 있습니다. 그것때문인지 모르겠지만,
  • 속도가 조금 느린 듯 합니다. TI-83에 porting했던 memory game을 넣어서 실행해보면 좀 시간이 더 걸리는 느낌입니다. 스펙상으로는 같은 6 Mhz인데. TI-83에서 L1~L6로 제한해서 변수 처리의 유연성을 줄인 대신 속도를 얻은 것 같습니다. 뭐 대규모 프로그램이 아닌 이상 LIST 6개면 무난할 것같기도 합니다.
  • 소프트 메뉴 버튼: HP 계산기에 보여준 soft menu button이 있습니다. TI-89에서 windows 95등에서 보여주는 상단에 menu등을 보여주는데, TI-86는 활성화된 menu를 화면 하단에 보여줍니다.

TI-89 menu
TI-89의 menu

 

TI-86의 soft menu
TI-86의 soft menu

 

마찬가지로 memory 게임을 porting해봤습니다. TI-83과 문법은 같은데, keyword가 조금 다릅니다. 또, TI-83과 달리 TI-89처럼 keyword를 직접 타이핑할 수 있습니다. (이것때문에 느려진 것인가?)

code는 아래와 같습니다. ('->'는 STO입니다. !=는 'not equal')

더보기
program: MEMORY
19->dimL L6
100->L6(10)

Lbl INIT
ClLCD 
For(I,1,9)
I->L6(I)
End
For(I,1,9)
int (rand*10)->J
If J!=0
Then
L6(I)->K
L6(J)->L6(I)
K->L6(J)
End
End
For(I,1,9)
I->L6(10+I)
End
For(I,1,9)
int (rand*10)->J
If J!=0
Then
L6(10+I)->K
L6(10+J)->L6(10+I)
K->L6(10+J)
End
End

0->W
0->R
For(I,2,6,2)
For(J,2,6,2)
Outpt(J,I,0)
Outpt(J,9+I,0)
End
End

Lbl LOOP
Outpt(4,8,"<"
Outpt(4,9,"-"
0->S
-1->Z

While S==0 or Z<0
getKy->S
If S==45
Return 
If S!=0
Then
S->X
0->Y
1->Z
MDISP
Z->U
End
End
Outpt(4,8,"-"
Outpt(4,9,">"
0->T
-1->Z
While T==0 or Z<0
getKy->T
If T!=0
Then
T->X
9->Y
1->Z
MDISP
Z->V
End
End
0->K
While K==0
getKy->K
End
If U!=V
Then
0->Z
Else
W+1->W
2->Z
End
S->X
0->Y
MDISP
T->X
9->Y
MDISP
R+1->R
If W<9
Goto LOOP
If L6(10)>R
R->L6(10)
ClLCD 
Disp "SCORE:"
Disp R
Disp "BEST SCORE:"
Disp L6(10)
0->K
While K==0
getKy->K
End
Goto INIT

program:MDISP
0->A
If Y!=0
Then
Y+1->C
Else
0->C
End
If X==72
Then
Y+2->A
2->B
C+7->C
End
If X==82
Then
Y+2->A
4->B
C+4->C
End
If X==92
Then
Y+2->A
6->B
C+1->C
End
If X==73
Then
Y+4->A
2->B
C+8->C
End
If X==83
Then
Y+4->A
4->B
C+5->C
End
If X==93
Then
Y+4->A
6->B
C+2->C
End
If X==74
Then
Y+6->A
2->B
C+9->C
End
If X==84
Then
Y+6->A
4->B
C+6->C
End
If X==94
Then
Y+6->A
6üB
C+3->C
End
If A==0
Then
-2->Z
Return 
End
If L6(C)==0
Then
-1->Z
Return 
End
If Z==2
Then
0->L6(C)
Return 
End
If Z!=0
Then
L6(C)->Z
End
Outpt(B,A,Z)
Return

실행 code 및 manual 첨부합니다.

MDISP.86p
0.00MB
MEMORY.86p
0.00MB
86bookeng.pdf
2.60MB

 

TI-83 plus에서 메모리 게임.

계산기 2022. 12. 7. 15:49 posted by tolkien

 

https://tinuviel.tistory.com/1071 - Casio Algebra fx-2.0에서 memory game 에서 작성했던 TI-83 plus에서 동작하는 memory game 실행 code입니다. TI-Editor와 Wabbitemu를 이용해서 작성 및 검증했습니다.

MDISP.8xp
0.00MB
MEMORY.8xp
0.00MB

 

TI-Editer는 200x년대에 TI에서 배포한 TI-connect package에 들어있는 프로그램입니다. ti-planet에서 구했는데, TI 공학용 계산기(TI-73부터 TI-89, voyage-200)에 사용할 프로그램 작성용으로 매우 유용합니다.

TIProgramEditor2.zip
0.90MB

 

Wabbitemu는 Android는 못 쓸 물건인데, Windows용은 쓸만하네요. TI-84까지만 됩니다. TI-89 이상은 다른 emulator를 구해야 할 것 같습니다. (Windows 10 64bit에서 확인했습니다.)

Wabbitemu.exe
4.58MB

Casio Algebra fx-2.0에서 memory game

계산기 2022. 10. 21. 22:02 posted by tolkien

TI-83 plus에 구현해 놓은 memory game을 afx-2.0에 porting해봤습니다.
(원래 code는 여기에 있습니다.) 이걸 옮기다가 몇가지 변경을 했습니다.

  1. 카드 뒤집는 부분을 subroutine으로 뺐습니다. key 값을 X에 담고, Y에는 세트 구분 (0: 세트 A, 9: 세트 B), 처리 명령을 Z에 담았습니다. Z는 구체적으로...
    1. Z=0: 틀렸으므로 카드를 뒤집어라. (0으로 다시 돌려놓음)
    2. Z=1: 해당 카드의 숫자를 보여줄 것.
    3. Z=2: 맞았으니까, 해당 위치의 값을 0으로 바꾸고 출력 부분은 건드리지 않음.
    4. 반환시 Z=-1 : 해당 위치는 이미 뒤집었슴.
    5. 반환시 Z=-2 : invalid key input
  2. 카드 상태를 저장을 A,B,... 변수가 아닌 List를 사용했습니다. 덕분에 원래 source coe에서 보이던 변수 쥐어짜기를 할 필요가 없어졌습니다.
  3. 해놓고 보니, 괜찮아서 다시 TI-83 plus에 back porting했습니다. (그래서, 화면은 TI-83 plus)
  4. TI-83 plus로 다시 작성할 때, afx-2.0과 다른 점은
    1. muli statement가 되지 않아서 code가 길어졌습니다.
    2. key code가 다릅니다.
    3. repeat ~ while 문이 없어서 while ~ end문을 쓰다보니 S->0과 같은 변수 초기화를 해주어야 하네요. 그외에는 code는 대동소이합니다. 

code를 아래와 같습니다.  '->'는 →입니다. !=는 'not equal'입니다.

더보기
FILE:MEMORY
ClrText:100->Q
Lbl 0
For 1->I To 9
I->List 19[I]
Next
For 1->I To 9
Int (Ran# x10)->J
If J!=0:Then
List 19[I]->K
List 19[J]->List 19[I]
K->List 19[J]
EndIf:Next
0->List 19[10]
For 1->I To 9
I->List 19[10+I]
Next
For 1->I To 9
Int (Ran# x10)->J
If J!=0:Then
List 19[10+I]->K
List 19[10+J]->List 19[10+I]
K->List 19[10+J]
EndIf:Next

0->W:0->R
For 2->I To 6 Step 2
For 2->J To 6 Step 2
Locate I,J,0
Locate 10+I,J,0
Next:Next

Lbl 1
Locate 9,4,"<"
Locate 10,4,"-"
Do:LpWhile Getkey!=0
Do:Getkey->S
If S=47:Then Return:IfEnd
If S!=0:Then S->X:0->Y:1->Z:Prog "~MDISP":Z->U:IfEnd
LpWhile S=0 Or Z<0
Locate 9,4,"-"
Locate 10,4,">"
Do:LpWhile Getkey!=0
Do:Getkey->T
If T!=0:Then T->X:10->Y:1->Z:Prog "~MDISP":Z->V:IfEnd
LpWhile T=0 Or Z<0
Do:LpWhile Getkey!=0
Do:Getkey->K:LpWhile K=0
If U!=V:Then 0->Z
Else W+1->W:2->Z:IfEnd
S->X:0->Y:Prog "~MDISP"
T->X:10->Y:Prog "~MDISP"
R+1->R
Locate 2,7,"TRIAL:     "
Locate 9,7,R
If W<9:Then Goto 1:IfEnd
If Q>R:Then R->Q
Locate 2,7,"BEST : "
Locate 9,7,R
IfEnd
Goto 0

FILE:~MDISP
0->A
If X=74:Then
Y+2->A:2->B:Y+7->C
IfEnd
If X=73:Then
Y+2->A:4->B:Y+4->C
IfEnd
If X=72:Then
Y+2->A:6->B:Y+1->C
IfEnd
If X=64:Then
Y+4->A:2->B:Y+8->C
IfEnd
If X=63:Then
Y+4->A:4->B:Y+5->C
IfEnd
If X=62:Then
Y+4->A:6->B:Y+2->C
IfEnd
If X=54:Then
Y+6->A:2->B:Y+9->C
IfEnd
If X=53:Then
Y+6->A:4->B:Y+6->C
IfEnd
If X=52:Then
Y+6->A:6->B:Y+3->C
IfEnd
If A=0:Then
-2->Z:Return:IfEnd
If List 19[C]=0:Then
-1->Z:Return:IfEnd
If Z=2:Then 
0->List 19[C]:Return:IfEnd
If Z!=0:Then
List 19[C]->Z:IfEnd
Locate A,B,Z
Return

FX-9860에서 동작확인한 code입니다. (FA-124에서 IMPORT로 가져올 수 있습니다.)

MEMORY.G1M
0.00MB
MDISP.G1M
0.00MB

 

TI-83 plus에서 동작하는 code입니다. (text file. TI-83 plus에서 일일이 입력해야 합니다.)

memory_ti-83p.txt
0.00MB

이걸 Sharp EL-5230에 porting 할 수 있을지 생각중입니다. memory가 충분할 지...

( 2023/05/03 : fx-9860에서 동작하도록 Getkey buffer가 clear가 됨을 확인하는 code 추가. )