BASIC compiler/interpreter for PIC32MX/MZ-80K
Revisão | 7ebd7151e8ef73c5e7556dbcf66924356aff8948 (tree) |
---|---|
Hora | 2019-01-07 09:07:04 |
Autor | Katsumi <kmorimatsu@sour...> |
Commiter | Katsumi |
Class C23LC for dip-8 SRAM 23LC512.
@@ -0,0 +1,126 @@ | ||
1 | +REM C23LC.BAS ver 0.1 | |
2 | +REM Class C23LC for MachiKania Type M | |
3 | +REM using SPI 8-pin SRAM 23LC512 | |
4 | + | |
5 | +FIELD PUBLIC ADDR | |
6 | +USEVAR BUFF,NUM | |
7 | + | |
8 | +REM Constructor. Parameters are: | |
9 | +REM 1st: Clock. Default 20000 | |
10 | +REM 2nd: CS port. Default 0x39 | |
11 | + | |
12 | +METHOD INIT | |
13 | + var i | |
14 | + dim BUFF(1) | |
15 | + REM Initialize SPI module. | |
16 | + if args(0)<1 then | |
17 | + SPI 20000 | |
18 | + elseif args(0)<2 then | |
19 | + SPI args(1) | |
20 | + else | |
21 | + SPI args(1),0,8,args(2) | |
22 | + endif | |
23 | + REM Check connection | |
24 | + i=gosub(RD8,0) XOR 0xFF | |
25 | + gosub WR8,i,0 | |
26 | + if gosub(RD8,0)!=i then | |
27 | + print "SRAM 23LC512 not connected" | |
28 | + end | |
29 | + endif | |
30 | + gosub WR8,i XOR 0xFF,0 | |
31 | + ADDR=0 | |
32 | + return | |
33 | + | |
34 | +REM WR8: Write byte (8 bits) | |
35 | +METHOD WR8 | |
36 | + NUM=1 | |
37 | +LABEL WRMAIN | |
38 | + REM Second parameter is address | |
39 | + if 2<=args(0) then ADDR=args(2) | |
40 | + POKE BUFF+2,ADDR>>8 | |
41 | + POKE BUFF+3,ADDR | |
42 | + REM First parameter is word to write | |
43 | + BUFF(1)=args(1) | |
44 | + SPIWRITEDATA BUFF+2,NUM+2,0x02 | |
45 | + REM Increment address | |
46 | + ADDR=(ADDR+NUM) and 0xffff | |
47 | + REM All done | |
48 | + return | |
49 | + | |
50 | +REM WR16: Write 16 bit word | |
51 | +METHOD WR16 | |
52 | + NUM=2 | |
53 | + goto WRMAIN | |
54 | + | |
55 | +REM WR32: Write 32 bit word | |
56 | +METHOD WR32 | |
57 | + NUM=4 | |
58 | + goto WRMAIN | |
59 | + | |
60 | +REM WRDATA: Write data | |
61 | +METHOD WRDATA | |
62 | + REM 1st parameter is buffer | |
63 | + REM 2nd parameter is # of write | |
64 | + REM 3rd parameter is address | |
65 | + if 3<=args(0) then ADDR=args(3) | |
66 | + SPIWRITEDATA args(1),args(2),0x02,ADDR>>8,ADDR | |
67 | + ADDR=(ADDR+args(2)) and 0xffff | |
68 | + return | |
69 | + | |
70 | +REM WRSTR: Write string | |
71 | +METHOD WRSTR | |
72 | + REM 1st parameter is string | |
73 | + REM 2nd parameter is address | |
74 | + if 2<=args(0) then ADDR=args(2) | |
75 | + gosub WRDATA,args(1),len(args$(1))+1 | |
76 | + return | |
77 | + | |
78 | +REM RD8: Read byte (8 bits) | |
79 | +METHOD RD8 | |
80 | + NUM=1 | |
81 | +LABEL RDMAIN | |
82 | + REM First parameter is address | |
83 | + if 1<=args(0) then ADDR=args(1) | |
84 | + BUFF(0)=0 | |
85 | + SPIREADDATA BUFF,NUM,0x03,ADDR>>8,ADDR | |
86 | + REM Increment address | |
87 | + ADDR=(ADDR+NUM) and 0xffff | |
88 | + REM All done | |
89 | + return BUFF(0) | |
90 | + | |
91 | +REM RD16: Read 16 bit word | |
92 | +METHOD RD16 | |
93 | + NUM=2 | |
94 | + goto RDMAIN | |
95 | + | |
96 | +REM RD32: Read 32 bit word | |
97 | +METHOD RD32 | |
98 | + NUM=4 | |
99 | + goto RDMAIN | |
100 | + | |
101 | +REM RDDATA: Read page | |
102 | +METHOD RDDATA | |
103 | + REM 1st parameter is buffer | |
104 | + REM 2nd parameter is # of write | |
105 | + REM 3rd parameter is address | |
106 | + if 3<=args(0) then ADDR=args(3) | |
107 | + SPIREADDATA args(1),args(2),0x03,ADDR>>8,ADDR | |
108 | + ADDR=(ADDR+args(2)) and 0xffff | |
109 | + return | |
110 | + | |
111 | +REM RDSTR: Read string | |
112 | +METHOD RDSTR | |
113 | + var i,T | |
114 | + REM 1st parameter is address | |
115 | + if 1<=args(0) then ADDR=args(1) | |
116 | + REM 2nd parameter is buffer size | |
117 | + REM Default 128 bytes. | |
118 | + if 2<=args(0) then NUM=args(2) else NUM=128 | |
119 | + dim T((NUM-1)/4) | |
120 | + SPIREADDATA T,NUM,0x03,ADDR>>8,ADDR | |
121 | + for i=0 to NUM-1 | |
122 | + if not(PEEK(T+i)) then break | |
123 | + next | |
124 | + NUM=i+1 | |
125 | + ADDR=(ADDR+NUM+1) and 0xffff | |
126 | + return T$ |
@@ -0,0 +1,63 @@ | ||
1 | +<クラス名およびバージョン> | |
2 | +C23LC | |
3 | +ver 0.1 | |
4 | + | |
5 | +<ファイル名> | |
6 | +C23LC.BAS | |
7 | + | |
8 | +<概要> | |
9 | +SRAM 23LC512読み書きの為のクラス。 | |
10 | + | |
11 | +<コンストラクター> | |
12 | +第1引数 | |
13 | + SPIクロックを、kHz単位で指定する。省略した場合は、20000。 | |
14 | +第2引数 | |
15 | + CS端子にどのポートを使うかを指定する。省略した場合は、0x39(PORTD9)。 | |
16 | + MachiKania type Mのhelpファイルを参照。 | |
17 | +MachiKania type Mのhelpファイル、 | |
18 | + | |
19 | +<パブリックフィールド> | |
20 | +ADDR | |
21 | + 次の読み書きを行なうアドレス(16 bits)。 | |
22 | + | |
23 | +<パブリックメソッド> | |
24 | +WR8(x[,y]) | |
25 | + 1バイト値、xを書き込む。yにアドレスを指定した場合は、指定位置に書き込む。 | |
26 | +WR16(x[,y]) | |
27 | + 16ビット値、xを書き込む。yにアドレスを指定した場合は、指定位置に書き込む。 | |
28 | +WR32(x[,y]) | |
29 | + 32ビット値、xを書き込む。yにアドレスを指定した場合は、指定位置に書き込む。 | |
30 | +WRSTR(x$[,y]) | |
31 | + 文字列、x$を書き込む。yにアドレスを指定した場合は、指定位置に書き込む。 | |
32 | +WRDATA(x,y[,z]) | |
33 | + バッファーxからyバイトを書き込む。zにアドレスを指定した場合は、指定位置に書 | |
34 | + き込む。 | |
35 | +RD8([x]) | |
36 | + 1バイト値を読み込み、返す。xにアドレスを指定した場合は、指定位置から読み込 | |
37 | + む。 | |
38 | +RD16([x]) | |
39 | + 16ビット値を読み込み、返す。xにアドレスを指定した場合は、指定位置から読み込 | |
40 | + む。 | |
41 | +RD32([x]) | |
42 | + 32ビット値を読み込み、返す。xにアドレスを指定した場合は、指定位置から読み込 | |
43 | + む。 | |
44 | +RDSTR([x,[y]]) | |
45 | + 文字列(127文字以内)を読み込み、ポインターとして返す。xにアドレスを指定した | |
46 | + 場合は、指定位置から読み込む。yは読み込みバッファーサイズ。省略した場合は、 | |
47 | + 128。 | |
48 | +WRDATA(x,y[,z]) | |
49 | + yバイトを読み込み、バッファーxに保存する。zにアドレスを指定した場合は、指定 | |
50 | + 位置から読み込む。 | |
51 | + | |
52 | +<使用例> | |
53 | + | |
54 | +アドレス0に文字列を書き込み、読み出す例。読み出し時の文字列ポインターの扱いに注 | |
55 | +意。 | |
56 | + | |
57 | +USECLASS C23LC | |
58 | +E=NEW(C23LC) | |
59 | +T=E.RDSTR():T$=T$ | |
60 | +PRINT T$ | |
61 | +CALL E.WRSTR("Hello objective MachiKania!",0) | |
62 | +T=E.RDSTR(0):T$=T$ | |
63 | +PRINT T$ |