投稿日: Mar 30, 2017 3:43:36 PM
+とかーというのはわたし、テンキーないしいちいちシフト使うの面倒くさいから n と p で next、prevってことにもしたいし、エンター使ってないじゃん。あと go したあといちいちリセットして復帰するのなんかダサくない? モニタでプログラム打ち込む場合もう、ループ組むのすら面倒くさいから便利なファンクションいろいろ必要でしょ! ってのを少し反映したものになります。
0x100から始まるのも、何か無駄な空間がもったいないので0x40を開始アドレスにしました。
コードを書いていて気になった部分があって、あちこちで out (0x0c),aとか書いていたのを、もしもこの後その部分をLEDへ出力だとかCLCDに出力だとかに対応させる場合 ものすごい苦労しそうだったので汎用ファンクションにputcharとか用意してそこをコールするようにしたり、地味な布石アクションが多いかも。
まだ用意してないんですが、メモリの内容をマルっと保存するファンクションも追加予定。
あとは前ポストの動的コールの部分も修正予定。
ひとまず中間報告として。(githubの方には随時反映してます)
; serial monitor ; (c)2017 sugarFlower ; cc,by-nc org 0x0000 jp start seek 0x0005 org 0x0005 bdos: ret seek 0x0008 org 0x0008 v1: ret seek 0x0010 org 0x0010 v2: ret seek 0x0018 org 0x0018 v3: ret seek 0x0020 org 0x0020 v4: ret seek 0x0028 org 0x0028 v5: ret seek 0x0030 org 0x0030 v6: ret seek 0x0038 org 0x0038 v7: ret seek 0x0040 org 0x0040 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 cp 0x72 ; r set add[R]ess jp z,cmd_set cp 0x2b ; [+] inc address jp z,cmd_inc cp 0x6e ; next jp z,cmd_inc cp 0x2d ; [-] dec address jp z,cmd_dec cp 0x70 ; prev 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 ld a,0x0d ;echo call putchar ld a,d call zpprt ld a,e call zpprt jp lp1 ;go address cmd_go: call calladd jp lp1 ;store opcode cmd_store: ld a,e call getaddress push de pop hl ld (hl),a call dispadop 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 call dispadop ld hl,address ;store address ld (hl),e inc hl ld (hl),d jp lp1 getaddress: ld hl,address ld e,(hl) inc hl ld d,(hl) ret ;disp address and opcode dispadop: ld a,0x0d call putchar ld a,h call zpprt ld a,l call zpprt ld a,' ' call putchar ld a,(hl) call zpprt ret ;disp cr+lf crlf: ld a,0x0d call putchar ld a,0x0a call putchar 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 calladd: db 0xcd address: db 0,0 db 0xc9 ; ; general function ; ;put char <- a putchar: out (0x0c),a ;serial write ret ;zero pudding print, Hex value <- a 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: call putchar pop af ret ;message print :address <- HL msgprt: push af msgprtl: ld a,(hl) or a jp z,msgprte call putchar inc hl jp msgprtl msgprte: pop af ret ;wait x ms <= a waitxms: push af push bc ld b,a ld a,5 waitxmsl1: dec b call nz,waitxmsl2 jp waitxmse waitxmsl2: nop dec a jp nz,waitxmsl2 ret waitxmse: pop bc pop af ret