XDATA 64 KB レジスタバンク 4 同じ番地が 2 つある R0-R7 が 4 組。PSW の RS1:RS0 で選ぶ 0x0003 から 8 バイト間隔で割り込みベクタ INT0 / T0 / INT1 / T1 / シリアル(+ T2 は 8052) 選んでいないバンクはただの RAM 上位 128 は IRAM と SFR で 0x20 ビットアドレス 128 bit ビット番地 0x00-0x7F(SETB / CLR / JB) MOV A,0x90 → SFR の P1 0x30 0x0000 番地が重なっている。 汎用。直接でも間接でも MOV R0,#0x90 MOV A,@R0 → IRAM 上位 SP のリセット値は 0x07 なので、最初の push は 0x08 = バンク 1 に載る MOVX でしか触れない 直接 → SFR、間接 → IRAM コンパイラの変数もここを取り合う MOVX A,@DPTR 16 bit で 64 KB 全域 SFR は 8 の倍数の番地だけが ビットアドレス可能(0x80-0xFF) 読み書きだけ。ここの命令は実行できない 外付け RAM でも内蔵周辺レジスタでもよい SDCC: __sfr __at(0x90) 命令フェッチと定数表 SFR 0x80-0xFF 読み出せるだけ。書く命令は無い 0x80 MOVC A,@A+DPTR / MOVC A,@A+PC 間接アドレッシングのみ 0x80 MOV A,@R0 / @R1 でしか届かない 内蔵 ROM か外付け ROM。外付けなら EA ピンで選び、PSEN で読む データ空間とは物理的に別(ハーバード) 直接で 0x80-0xFF と書くと SFR になる 8051 にはここが無い スタックはここまで伸ばせる SDCC: __code 0xFF 0xFFFF SDCC: __data / __idata 同じ番地 0x80-0xFF 8052 以降で追加された 128 B。元の (直接のみ) P0, SP, DPL/DPH, PCON TCON, TMOD, TL0/TH0, TL1/TH1 0x90 P1, SCON, SBUF 0xA0 P2, IE 0xB0 P3, IP 0xC0 機種ごとの周辺がここに生える 0xD0 PSW 0xE0 ACC(アキュムレータ) 0xF0 PDATA 256 B ̶ MOVX A,@R0 / @R1 が届く範囲 下位 8 bit は Ri、上位 8 bit は P2 が出す → ページは P2 を書けば動かせる 64 KB より広い記憶を載せる石は、この上に 窓とページレジスタを自前で足す SDCC: __xdata / __pdata B 0xFFFF どの空間に当たるかは命令が決める MOVC A,@A+DPTR / @A+PC → コード空間 64 KB MOVX A,@DPTR → XDATA 64 KB MOV A,direct (0x00-0x7F) → IRAM の下位 128 MOVX A,@R0 / @R1 → XDATA の 256 B ページ(上位は P2) MOV A,direct (0x80-0xFF) → SFR SETB / CLR / JB bit → ビット空間(IRAM 0x20-0x2F と SFR) MOV A,@R0 / @R1 → IRAM 256 B 全域 PUSH / POP / LCALL → IRAM(SP が指す)