概要
picoでmicropythonやってみた。
練習問題やってみた。
練習問題
俺言語インタープリタを拡張し、RTCを読め。
方針
?=hで、右項にhが来れば、時間を取得する。
?=mで、右項にmが来れば、分を取得する。
?=sで、右項にsが来れば、秒を取得する。
時、分、秒を表示するソースコード
10 ?=h
20 ?=" : "
30 ?=m
40 ?=" : "
50 ?=s
60 ?=!
70 "=1
80 #=10
サンプルコード
import random
import time
import sys
import utime
Ram = []
Lbf = 237
Bnd = 234
PC = 235
Ptr = 0
Cur = 0
Adr = 0
Adr2 = 0
Val = 0
C = 0
led = machine.Pin(25, machine.Pin.OUT)
adc = temp = machine.ADC(4)
def crlf():
print()
def put(b):
print(b, end = " ")
def putchar(b):
c = chr(b)
print(c, end = "")
def putl(pt, d):
while READB(pt) != d:
putchar(READB(pt))
pt = pt + 1
return pt
def putlp(d):
global Ptr
while READB(Ptr) != d:
putchar(READB(Ptr))
Ptr = Ptr + 1
def nxtln(pt):
while READB(pt) != ord('\0'):
pt = pt + 1
pt = pt + 1
return pt
def fndln():
global Bnd, PC, Cur
Cur = 0
while Cur != READB(Bnd):
if READB(Cur) == READB(PC):
return True
Cur = nxtln(Cur)
return False
def fndln2():
global Bnd, PC, Cur
Cur = 0
while Cur != READB(Bnd):
if READB(Cur) > READB(PC):
return True
Cur = nxtln(Cur)
return False
def WRITEB(adr, data):
global Ram
Ram[adr] = data
def READB(adr):
global Ram
v = Ram[adr]
return v
def num():
global Ptr
if (48 <= READB(Ptr)) and (READB(Ptr) <= 57):
return True
else:
return False
def getnm():
global Ptr, Val
if not(num()):
return False
n = 0
while (num()):
n *= 10
ch = READB(Ptr)
Ptr = Ptr + 1
n += (ch - 48)
Val = n
return True
def getvr():# hidari
global Ptr, Adr, PC, C
C = READB(Ptr)
if C == ord('a'):
Adr = 230
elif C == ord('#'):
Adr = PC
elif C == ord('b'):
Adr = 231
elif C == ord('c'):
Adr = 232
else:
Adr = 230
def getvr2():
global Ptr, Adr2, PC
cc = READB(Ptr)
if cc == ord('a'):
Adr2 = 230
elif cc == ord('#'):
Adr2 = PC
elif cc == ord('b'):
Adr2 = 231
elif cc == ord('c'):
Adr2 = 232
else:
Adr2 = 230
def term():
global Ptr, Val
cc = READB(Ptr)
val2 = Val
Ptr = Ptr + 1
factr()
if cc == ord('*'):
Val = val2 * Val
elif cc == ord('+'):
Val = val2 + Val
elif cc == ord('-'):
Val = val2 - Val
elif cc == ord('/'):
Val = val2 / Val
elif cc == ord('%'):
Val = val2 % Val
elif cc == ord('='):
if (val2 == Val):
Val = 1
else:
Val = 0
elif cc == ord('>'):
if (val2 >= Val):
Val = 1
else:
Val = 0
else:
if (val2 < Val):
Val = 1
else:
Val = 0
def factr():# migi
global Ptr, Val, Adr2
if READB(Ptr) == ord('\0'):
Val = 0
return
if getnm():
return
cc = READB(Ptr)
if cc == ord('$'):# rnd
r = random.random()
Val = int(r * 10)
Ptr = Ptr + 1
elif cc == ord('?'):# input
Val = int(input("?"))
Ptr = Ptr + 1
elif cc == ord('h'):# H
tm = utime.localtime()
Val = tm[3]
Ptr = Ptr + 1
elif cc == ord('m'):# m
tm = utime.localtime()
Val = tm[4]
Ptr = Ptr + 1
elif cc == ord('s'):# s
tm = utime.localtime()
Val = tm[5]
Ptr = Ptr + 1
elif cc == ord('l'):# adc
v = adc.read_u16()
v = v >> 7
Val = v & 0xff
Ptr = Ptr + 1
else:
getvr2()
Val = READB(Adr2)
Ptr = Ptr + 1
def expr():# migi
global Ptr
factr()# getval
cc = READB(Ptr)
while cc != ord('\0'):
term()# enzan
cc = READB(Ptr)
Ptr = Ptr + 1
def ordr():# siki hyouka
global Ptr, Val, C, Adr
getvr()# hidari
Ptr = Ptr + 2
if READB(Ptr) == ord('"'):
Ptr = Ptr + 1
putlp(ord('"'))
elif READB(Ptr) == ord('!'):
print()
else:
expr()# migi
if C == ord('?'):
put(Val)# print
elif C == ord('l'):# led
led.value(Val)
elif C == ord('"'):# sleep
time.sleep(Val)
else:
WRITEB(Adr, Val)# dainyuu
def run():
global Bnd, Ptr, Lbf, Cur, PC, Ram
for i in range(276):
Ram.append(0)
WRITEB(Bnd, 0)
print("oregengo v1.4")
while True:
str = input("\n>")
Ptr = Lbf
for j in str:
WRITEB(Ptr, ord(j))
Ptr = Ptr + 1
WRITEB(Ptr, ord('\0'))
ima = 0
Ptr = Lbf
if not(getnm()):# dairect
while True:
ima = READB(PC)
#print(ima)
ordr()# siki hyouka
if READB(PC) == 0 and ima == 0:
break
else:
if READB(PC) == 0:
WRITEB(PC, ima)
if READB(PC) == 1:
ima = 1
if READB(PC) == 300:
sys.exit()
if READB(PC) == ima:
if fndln2():
WRITEB(PC, READB(Cur))
Ptr = Cur + 2
else:
break
else:
if fndln():
WRITEB(PC, READB(Cur))
Ptr = Cur + 2
else:
break
else:
if Val == 0:
#print("#list")
pt = 0
while pt < READB(Bnd):
put(READB(pt))
pt = pt + 1
pt = putl(pt, ord('\0'))
crlf()
pt = pt + 1
else:# del insert append
f = 0
WRITEB(PC, Val)
if fndln():
#print("#del")
src = nxtln(Cur)
dst = Cur
while src != READB(Bnd):
WRITEB(dst, READB(src))
dst = dst + 1
src = src + 1
WRITEB(Bnd, dst)
if fndln2():
f = 1
src = READB(Bnd)
m = 2
h = Ptr
while READB(h) != ord('\0'):
m = m + 1
h = h + 1
if m > 2:
WRITEB(Bnd, (src + m))
if f == 1:
#print("#insert")
dst = READB(Bnd)
while src != Cur:
WRITEB(dst, READB(src))
dst = dst - 1
src = src - 1
WRITEB(dst, READB(src))
src = Cur
WRITEB(src, Val)
#print("#append")
src = src + 1
for k in range(m - 1):
WRITEB(src, READB(Ptr))
Ptr = Ptr + 1
src = src + 1
実行結果
以上。