投稿日: Mar 30, 2017 10:57:18 AM
とりあえず使える版。
つかいかた。
例えばアドレス0x240に移動するには
240rとタイプ。
そこにオペコードc9を入力するには
c9s
アドレスを前後に移動したい場合は + / - にて移動。
現在のアドレスを実行したい場合、 g を入力。
コマンド一覧。
set Add{r]ess
[s]tore
+
-
[g]o
考えるな、感じるんだ!
; serial monitor ; ; serial I/O ; 0x0c : serial write ; 0x0d : serial read ; 0x0e : serial available ; 0x0f : print hex ; org 0 jp start seek 0x100 org 0x100 start: ld sp,0x7fff ld hl,welcome call msgprt ld de,0 ;hex lp1: in a,(0x0e) ;serial available or a jp z,lp1 in a,(0x0d) ;serial read ; command process ; 'ENTER' cp 0x0d ;cr jp z,cmd_enter cp 0x72 ; r set add[R]ess jp z,cmd_set cp 0x2b ; [+] inc address jp z,cmd_inc cp 0x2d ; [-] dec address jp z,cmd_dec cp 0x73 ; [s]tore opcode jp z,cmd_store cp 0x67 jp z,cmd_go ; [g]o address (run) ;check key table ld hl,keycode ld c,0 kcloop: ld b,a xor a cp (hl) jp z,lpend ;keycode table end ld a,b cp (hl) ;input check jp z,kchit ;hit! inc c inc hl ;non hit, next char jp kcloop lpend: jp lp1 ; process key ; DE = (DE << 4) | c kchit: ld b,4 sethexl: call shiftde dec b jp nz,sethexl ld a,e or c ;store ld e,a ;echo ld a,0x0d out (0x0c),a ld a,d call zpprt ld a,e call zpprt jp lp1 ;go address cmd_go: call getaddress push de pop hl jp (hl) ;store opcode cmd_store: ld a,e call getaddress push de pop hl ld (hl),a inc de jp cmd_set ;inc address cmd_inc: call getaddress inc de jp cmd_set ;dec address cmd_dec: call getaddress dec de jp cmd_set ;set address cmd_set: push de pop hl call crlf ;disp address ld a,h call zpprt ld a,l call zpprt ; disp opcode ld a,' ' out (0x0c),a ld a,(hl) call zpprt ld hl,address ;store address ld (hl),e inc hl ld (hl),d jp lp1 cmd_enter: call crlf jp lp1 getaddress: ld hl,address ld e,(hl) inc hl ld d,(hl) ret ;disp cr+lf crlf: ld a,0x0d out (0x0c),a ld a,0x0a out (0x0c),a ret ;message print msgprt: push af msgprtl: ld a,(hl) or a jp z,msgprte out (0x0c),a inc hl jp msgprtl msgprte: pop af ret ;zero pudding print, Hex value zpprt: push af push af rra rra rra rra call prt4bit pop af and 0x0f call prt4bit pop af ret ; print 4bit hex prt4bit: push af cp 0x0a jp m,prt4bitn add a,0x37 ;print alphabet jp prt4bite prt4bitn: add a,0x30 ;print number prt4bite: out (0x0c),a pop af ret ;PCF8574N output - i2c address 0x20 pcfout: push af ld a,0x20 out (0xd0),a out (0xd4),a ;begintrans pop af push af xor 0xff out (0xd1),a ;write out (0xd5),a ;endtrans pop af ret ;bit shift left DE resister shiftde: push af ld a,d rla ld d,a ld a,e rla ld e,a jp nc,shiftdee ld a,d ; process carry or 0x01 ld d,a shiftdee: pop af ret ;data keycode: db '0123456789abcdef',0 welcome: db 'monitor v0.1',0x0d,0x0a db 'command: r,s,+,-,g',0x0d,0x0a,0 address: db 0,0
わざわざコード載せなくてもバイナリファイルでいいだろうみたいな感じではあるんですけど。
あちこちみたりしてるときに突然ダウンロードだと躊躇する感じがあったので、敢えて。
使ってないファンクションなんかも含まれてますが。
逆に欲しいファンクションがなかったりしますね。
メモリの内容をuSDにまとめて書き出すようなファンクションを用意しておけばそのアドレスにgoすれば全部保存できるので便利そうです。
電源を落とさない限り、Arduinoをリセットしても外付けSRAMの内容は残ってますので、基本的にgoしたあとはこのシリアルモニタの及ばないところに制御が移りますので。止めたいときはリセットで。