0x0040286 シリアルI/F割り込み要因フラグレジスタ (byte) D0: FSERR0 SIF Ch.0受信エラー 1:要因発生 0:要因なし D1: FSRX0 SIF Ch.0受信バッファフル 1:要因発生 0:要因なし D2: FSTX0 SIF Ch.0送信バッファエンプティ 1:要因発生 0:要因なし D3: FSERR1 SIF Ch.1受信エラー 1:要因発生 0:要因なし D4: FSRX1 SIF Ch.1受信バッファフル 1:要因発生 0:要因なし D5: FSTX0 SIF Ch.1送信バッファエンプティ 1:要因発生 0:要因なし D6-7: reserved 0x004029f フラグセット/リセット方式選択レジスタ (byte) D0: RSTONLY 割り込み要因フラグリセット方式選択 1:リセットオンリー 0:RD/WR D1: IDMAONLY IDMAリクエストレジスタセット方式選択 1:セットオンリー 0:RD/WR D2: DENONLY IDMAイネーブルレジスタセット方式選択 1:セットオンリー 0:RD/WR D3-7: reserved |
isqr2: xld.w %r13,0x8000 ld.w %r10,0x0 ld.w %r11,%r10 isqr2_loop: add %r11,%r13 mltu.h %r11,%r11 ld.w %r14,%alr cmp %r12,%r14 jrult.d isqr2_skip srl %r13,1 ; delay ld.w %r10,%r11 isqr2_skip: jrne.d isqr2_loop ld.w %r11,%r10 ; delay ret |
isqr: xld.w %r13,0x40000000 ld.w %r10,0x0 ld.w %r11,%r10 xadd %r12,%r12,1 ld.w %r14,%r11 isqr_loop: add %r14,%r13 xsrl %r11,1 cmp %r14,%r12 jruge.d isqr_skip adc %r10,%r10 ; delay sub %r12,%r14 add %r11,%r13 isqr_skip: xsrl %r13,2 jrne.d isqr_loop ld.w %r14,%r11 ; delay ret |
1 |
第6、7ビットのセットが1以上なので、1をたてて12=1を引きます。 1をそのまま左に書きます。 1の下に同じ数1を書き、足し算します。 |
1 1 |
先ほど引き算した残りの第4ビットから上の数は111となっています。 左の10に対して、(100+1)×1=101が111以下なので、 1をたてて、101を111から引きます。 次に、左の10の右に1を書いて、101とし、これにさらに1を足します。 |
1 1 0 |
先ほど引き算した残りの第2ビットから上の数は1001となっています。 左の110に対して(1100+1)×1=1101が1001より大きいので、 0をたててそのままとします。 次に、左の110の右に0を書いて1100とし、これに0を足します。 |
1 1 0 1 |
先ほど引き算した残りの数が100100となっています。 左の1100に対して(11000+1)×1=11001が 100100以下なので、1をたてて11001を100100から引きます。 次に、左の1100の右に1を書いて11001とし、 これにさらに1を足します。 これで計算完了です。 |
unsigned int isqr(unsigned int s) { unsigned int t=0x40000000,h=0,a=0; do{ int b=h+t; a<<=1; h>>=1; if(s>=b){ s-=b; a++; h+=t; } }while(t>>=2); return a; } |
unsigned int isqr2(unsigned int s) { unsigned int r=0x8000,a=0; do{ unsigned int b=a+r; if(s>=b*b) a=b; }while(r>>=1); return(a); } |
isqr2: xld.w %r13,0x8000 ld.w %r10,0x0 ld.w %r11,%r10 isqr2_loop add %r11,%r13 mltu.h %r11,%r11 ld.w %r14,%alr cmp %r12,%r14 jrult isqr2_skip ld.w %r10,%r11 isqr2_skip: xsrl %r13,1 jrne.d isqr2_loop ld.w %r11,%r10 ;delay ret |
void sendkeycode( char *str //送出コントロール文字列 ); |
送出コントロール文字列は以下のような種類に対応しています。 a〜z キーボードのA〜Z 0〜9 キーボードの0〜9 -^@[];: ,./ キーボードの-^@[];: ,./ \n キーボードのEnter \t キーボードのTab また、%で囲んだ文字列で特殊キーに対応します。 %enter% キーボードのenter %esc% キーボードのesc %backspace% キーボードのbackspace %tab% キーボードのtab %space% キーボードのspace %capslock% キーボードのcapslock %f1%〜%f12% キーボードのF1〜F12 %printscreen% キーボードのprintscreen %scrolllock% キーボードのscrolllock %pause% キーボードのpause %insert% キーボードのinsert %home% キーボードのhome %pageup% キーボードのpageup %delete% キーボードのdelete %end% キーボードのend %pagedown% キーボードのpagedown %rightarrow% カーソルキーの→ %leftarrow% カーソルキーの← %downarrow% カーソルキーの↓ %uparrow% カーソルキーの↑ %numlock% テンキーのnumlock %n/% テンキーの/ %n*% テンキーの* %n-% テンキーの- %n+% テンキーの+ %nenter% テンキーのEnter %n0%〜%n9% テンキーの0〜9 %n.% テンキーの. %win+% Windowsキーを押した状態にする %win-% Windowsキーをはなした状態に戻す %shift+% shiftキーを押した状態にする %shift-% shiftキーをはなした状態に戻す %ctrl+% ctrlキーを押した状態にする %ctrl-% ctrlキーをはなした状態に戻す %alt+% altキーを押した状態にする %alt-% altキーをはなした状態に戻す注意すべき点として、%win+%、%shift+%、%ctrl+%、%alt+%等は以降ずっと該当キーを抑えたままと同じになるため、必要でなくなった時に%win-%等ではなした状態に戻すことを忘れないようにするということがあります。
番号 | アドレス | 割り込み要因 | IDMA | P/ECEの用途(割り込みレベル) |
0 | 400 | リセット | - | - |
1〜3 | 404〜40c | 予約 | - | - |
4 | 410 | ゼロ除算 | - | ゼロ除算エラー表示 |
5 | 414 | 予約 | - | - |
6 | 418 | アドレス不正例外 | - | アドレス不正例外エラー表示 |
7 | 41c | NMI | - | 1msタイマのカウント専用 |
8〜11 | 420〜42c | 予約 | - | - |
12 | 430 | ソフトウェア例外0 | - | - |
13 | 434 | ソフトウェア例外1 | - | CriticalKSEntry |
14 | 438 | ソフトウェア例外2 | - | - |
15 | 43c | ソフトウェア例外3 | - | - |
16 | 440 | ポート入力割り込み0 | 1 | - |
17 | 444 | ポート入力割り込み1 | 2 | USB INT_N(6) |
18 | 448 | ポート入力割り込み2 | 3 | 赤外線受信(7) |
19 | 44c | ポート入力割り込み3 | 4 | - |
20 | 450 | キー入力割り込み0 | - | スタンバイ解除(4) |
21 | 454 | キー入力割り込み1 | - | - |
22 | 458 | 高速DMA Ch.0 転送終了 | 5 | LCD転送 |
23 | 45c | 高速DMA Ch.1 転送終了 | 6 | サウンド再生(PWM値転送)(7/5) |
24 | 460 | 高速DMA Ch.2 転送終了 | - | - |
25 | 464 | 高速DMA Ch.3 転送終了 | - | - |
26 | 468 | インテリジェントDMA転送終了 | - | - |
27〜29 | 46c〜474 | 予約 | - | - |
30 | 478 | 16ビットタイマ0 コンペアB | 7 | 1msタイマ(6) |
31 | 47c | 16ビットタイマ0 コンペアA | 8 | 1msタイマ |
32〜33 | 480〜484 | 予約 | - | - |
34 | 488 | 16ビットタイマ1 コンペアB | 9 | サウンド再生(PWM) |
35 | 48c | 16ビットタイマ1 コンペアA | 10 | サウンド再生(PWM) |
36〜37 | 490〜494 | 予約 | - | - |
38 | 498 | 16ビットタイマ2 コンペアB | 11 | サウンド再生(予備) |
39 | 49c | 16ビットタイマ2 コンペアA | 12 | サウンド再生(予備) |
40〜41 | 4a0〜4a4 | 予約 | - | - |
42 | 4a8 | 16ビットタイマ3 コンペアB | 13 | - |
43 | 4ac | 16ビットタイマ3 コンペアA | 14 | - |
44〜45 | 4b0〜4b4 | 予約 | - | - |
46 | 4b8 | 16ビットタイマ4 コンペアB | 15 | USB 6MHz |
47 | 4bc | 16ビットタイマ4 コンペアA | 16 | USB 6MHz |
48〜49 | 4c0〜4c4 | 予約 | - | - |
50 | 4c8 | 16ビットタイマ5 コンペアB | 17 | 赤外線送信 |
51 | 4cc | 16ビットタイマ5 コンペアA | 18 | 赤外線送信(7) |
52 | 4d0 | 8ビットタイマ0 アンダーフロー | 19 | スタンバイ解除 |
53 | 4d4 | 8ビットタイマ1 アンダーフロー | 20 | - |
54 | 4d8 | 8ビットタイマ2 アンダーフロー | 21 | - |
55 | 4dc | 8ビットタイマ3 アンダーフロー | 22 | EXT端子用 |
56 | 4e0 | シリアル Ch.0 受信エラー | - | - |
57 | 4e4 | シリアル Ch.0 受信バッファフル | 23 | - |
58 | 4e8 | シリアル Ch.0 送信バッファエンプティ | 24 | - |
59 | 4ec | 予約 | - | - |
60 | 4f0 | シリアル Ch.1 受信エラー | - | EXT端子用 |
61 | 4f4 | シリアル Ch.1 受信バッファフル | 25 | EXT端子用 |
62 | 4f8 | シリアル Ch.1 送信バッファエンプティ | 26 | EXT端子用 |
63 | 4fc | 予約 | - | - |
64 | 500 | A/D変換完了 | 27 | K66,67電圧測定 |
65 | 504 | 計時タイマ | - | アラーム(4) |
66〜67 | 508〜50c | 予約 | - | - |
68 | 510 | ポート入力割り込み4 | 28 | - |
69 | 514 | ポート入力割り込み5 | 29 | - |
70 | 518 | ポート入力割り込み6 | 30 | - |
71 | 51c | ポート入力割り込み7 | 31 | - |
使い方 圧縮 plz.lzh(c言語ソースファイルとwin32コンソール実行ファイル) 圧縮したいファイル名がtest.bin、圧縮後の名前がtest.plzなら、 コマンドプロンプトから plz test.bin test.plzと入力します。 テストで展開してみる時はplz -d test.plz test.orgなどとします。 展開(P/ECE上) メモリ上の圧縮データ(plz.exeで圧縮したもの)へのポインタがsrc、 展開先へのポインタがdstの場合、この下のc言語decode()関数または アセンブラのdecode0サブルーチンを利用して decode(dst,src+8); とします。 圧縮データのフォーマット +0 4バイト 圧縮後(自分自身)のヘッダも含めたサイズ +4 4バイト 展開後のサイズ +8 任意 圧縮データ |
void decode(unsigned char *dst,unsigned char *src) { while(-1){ int ct=8,flag=*src++; do{ if(flag&0x80){ *dst++=*src++; }else{ unsigned int length,ptr=*src++; length=(ptr>>4)+3; if(!(ptr=((ptr&0xf)<<8)|(*src++))) return; /*************return**********/ { unsigned char *rp=dst-ptr; do{ *dst++=*rp++; }while(--length); } } flag<<=1; }while(--ct); } } |
decode0: xld.w %r4,0x8 ld.ub %r15,[%r13]+ swap %r15,%r15 decode0_loop0: adc %r15,%r15 xjruge decode0_dic ld.ub %r10,[%r13]+ ld.b [%r12]+,%r10 xsub %r4,%r4,1 xjrne decode0_loop0 xjp decode0 decode0_dic: ld.ub %r11,[%r13]+ ld.w %r10,%r11 xsrl %r10,4 xadd %r14,%r10,3 xand %r11,%r11,0xf xsll %r11,8 ld.ub %r10,[%r13]+ or %r10,%r11 xjreq decode0_return ld.w %r11,%r12 sub %r11,%r10 sub %r14,1 decode0_diccopy: ld.ub %r10,[%r11]+ ld.b [%r12]+,%r10 jrne.d decode0_diccopy sub %r14,1 ;delay xsub %r4,%r4,1 xjrne decode0_loop0 xjp decode0 decode0_return: ret |
000000 内蔵RAM 8KB 000000 システムが使用 000020 カーネルサービステーブル 000400 割り込みトラップテーブル 001000 ユーザが使用可能 ↓ユーザ ↑スタック 002000 |
040000 内蔵IOメモリ 040140 タイマ パワーコントロール シリアル A/D ポート DMA 0402e0 048120 バスコントローラ タイマレジスタ DMAレジスタ 048260 04ffff |
100000 外部SRAM 256KB 100000 ユーザエリア(アプリケーション) 140000 |
400000 USBコントローラ 400008 |
c00000 外部FLASH ROM 512KB c00000 リセットベクタ/ブート・ブロック(8KB) c02000 カーネル c0c000 文字フォント c28000 ファイル・システム c80000 |
1000000 |
int hypot4(int x,int y) // 誤差約1% 13bit符号付き整数まで { if(x<0) x=-x; if(y<0) y=-y; if(x<y){ int a=x; x=y;y=a; } if(x==0) return(0); return(x+((y*y/x*55)>>7)); } int hypot5(int x,int y) // 誤差約0.2% 13bit符号付き整数まで { if(x<0) x=-x; if(y<0) y=-y; if(x<y){ int a=x; x=y;y=a; } if(x==0) return(0); if(y*2<x) return(x+((y*y/x*121)>>8)); { int w=y-x/2; return(((143*x+62*w)>>7)+((w*w/x*7)>>5)); } } int hypot6(int x,int y) // 誤差約30% 32bit符号付き { if(x<0) x=-x; if(y<0) y=-y; if(x<y) return(y); return(x); } int hypot7(int x,int y) // 誤差約12% 31bit符号付き { if(x<0) x=-x; if(y<0) y=-y; if(x<y){ int a=x; x=y;y=a; } return(x+y/2); } |
double hypot(double x,double y) { return(sqrt(x*x+y*y)); } |
int hypot1(int x,int y) // 誤差約40% 31bit符号付き整数まで { if(x<0) x=-x; if(y<0) y=-y; return(x+y); } |
int hypot2(int x,int y) // 誤差約4% 16bit符号付き整数まで { if(x<0) x=-x; if(y<0) y=-y; if(x<y){ int a=x; x=y;y=a; } return((31470*x+13035*y)>>15); } |
int hypot3(int x,int y) // 16bit符号付き整数まで { return(x*x+y*y); } |
hypot3: mlt.h %r12,%r12 ld.w %r10,%alr mlt.h %r13,%r13 ld.w %r14,%alr ret.d add %r10,%r14 ;delay |
for(i=0;i<128*88;i++){ pset(rnd(128),rnd(88),3); } wait(5000); |
for(i=0;i<128*88*3;i++){ pset(rnd(128),rnd(88),3); } fill(0,0,127,87,3); wait(5000); |
static short pat[128*88]; for(i=0;i<128*88;i++){ //塗りつぶし順番を素直に初期化して pat[i]=i; } for(i=0;i<128*88;i++){ //それを乱数で入れ替え p=rnd(128*88); a=pat[i]; pat[i]=pat[p]; pat[p]=a; } for(i=0;i<128*88;i++){ //最後にできた順番で1ドットづつ描画 pset(pat[i]%128,pat[i]/128,3); } wait(5000); |
a=1; for(i=0;i<128*128;i++){ a=( ( ( ((a&0x2000)!=0)^((a&0x0010)!=0)^((a&0x0004)!=0)^((a&0x0001)!=0) )&1) | (a<<1) ) & 0x3fff; pset(a%128,a/128,3); } pset(0,0,3); wait(5000); |
void pceAppInit( void ) |
#include <s1c33cpu.h> |
hello.map |
hello.sym |
hello.map |
hello.sym |
#include <piece.h> |
hello.map |
/* |
hello.map |
unsigned long st,ed,time; |
ポケットステーション | 約30g |
ビジュアルメモリ | 約45g |
P/ECE | 約67g(電池含まず) |
ワンダースワン | 約93g(電池含まず) |
ワンダースワンカラー | 約95g(電池含まず) |
ゲームボーイポケット | 約125g(電池含まず) |
ゲームボーイカラー | 約138g(電池含まず) |
ゲームボーイライト | 約140g(電池含まず) |
ゲームボーイアドバンス | 約140g(電池含まず) |
ゲームボーイ | 約220g(電池含まず) |