2013.8.9
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第454回]


●イニシャルプログラムローダー(IPL)

今回はE−80ミニコンのIPL(Initial Program Loader)について説明をします。
IPLはE−80ミニコンのようにRAMが主体であるようなボードにシステムプログラムをロードするためのプログラムです。
IPLは普通はROMに書かれていることが多いのですが、短いプログラムですから、E−80ではPICに書き込んでそれをRAMに転送するように考えました。
PIC内蔵のプログラムをRAMに転送するのですから、PICのプログラムも一種のイニシャルプログラムローダーであるとも言えます。

下はそのIPLのアセンブルリストです。
このプログラムは前半部分(0000〜000E)と後半部分(FF80〜FFEA)に分かれています。
結構長いプログラムになってしまいました。
前回は128バイトもあれば十分です、と書きましたがほぼぎりぎりのところまで使ってしまっています。

2013/5/31  9:30  picldr2a.txt
END=FFEA
              ; E-80 initial loader in PIC16F886
              ;12/11/27 11/28 12/3 12/6 12/8
              ;12/12 12/13 12/14
              ;13/01/18 1/19
              ;5/26
              ;
                ORG $0000
              ;
0000 210E00     LD HL,DTTOP
0003 1180FF     LD DE,LDRTOP
0006 016A00     LD BC,$006A
0009 EDB0       LDIR
000B C380FF     JP LDRTOP
000E 00       DTTOP:NOP;
              ;
                ORG $FF80
              ;
FF80 310000   LDRTOP:LD SP,$0000
FF83 3E88       LD A,88
FF85 D3FB       OUT (FB),A
FF87 3EFF       LD A,FF
FF89 D3FA       OUT (FA),A
FF8B 3E30       LD A,30
FF8D ED         DB ED
FF8E 39         DB 39
FF8F 36         DB 36;refresh off
FF90 ED         DB ED
FF91 39         DB 39
FF92 32         DB 32;memory wait off
FF93 3E80       LD A,80
FF95 ED         DB ED
FF96 39         DB 39
FF97 3A         DB 3A;memory bank set
FF98 CDC3FF     CALL LDSUB
FF9B 6F         LD L,A
FF9C CDC3FF     CALL LDSUB
FF9F 67         LD H,A;HL=load top address
FFA0 CDC3FF     CALL LDSUB
FFA3 5F         LD E,A
FFA4 CDC3FF     CALL LDSUB
FFA7 57         LD D,A;DE=load end address
FFA8 CDC3FF     CALL LDSUB
FFAB 4F         LD C,A
FFAC CDC3FF     CALL LDSUB
FFAF 47         LD B,A;BC=JP address after loaded
FFB0 C5         PUSH BC
FFB1 13         INC DE
FFB2 EB         EX DE,HL
FFB3 B7         OR A
FFB4 ED52       SBC HL,DE
FFB6 EB         EX DE,HL;DE=load bytes
              ;
FFB7 CDC3FF   LOOP:CALL LDSUB
FFBA 77         LD (HL),A
FFBB 23         INC HL
FFBC 1B         DEC DE
FFBD 7A         LD A,D
FFBE B3         OR E
FFBF 20F6       JR NZ,LOOP
FFC1 E1         POP HL
FFC2 E9         JP (HL)
              ;
              ;load subroutine
FFC3 3E04     LDSUB:LD A,04;bit2=L,bit3=H,bit0-4 are INVERT
FFC5 D3FE       OUT (FE),A
FFC7 DBFE     LP1:IN A,(FE)
FFC9 E6C0       AND C0
FFCB 2812       JR Z,LP3;no data
FFCD FE80       CP 80
FFCF 20F6       JR NZ,LP1
FFD1 DBFC       IN A,(FC)
FFD3 F5         PUSH AF
FFD4 AF         XOR A
FFD5 D3FE       OUT (FE),A
FFD7 DBFE     LP2:IN A,(FE)
FFD9 E640       AND 40
FFDB 28FA       JR Z,LP2
FFDD F1         POP AF
FFDE C9         RET
FFDF AF       LP3:XOR A;bit2=H,bit3=H
FFE0 D3FE       OUT (FE),A
FFE2 DBFE     LP4:IN A,(FE)
FFE4 E640       AND 40
FFE6 28FA       JR Z,LP4
FFE8 18D9       JR LDSUB
FFEA 00       LDREND:NOP
              ;
DTTOP        =000E  LDREND       =FFEA  LDRTOP       =FF80  
LDSUB        =FFC3  LOOP         =FFB7  LP1          =FFC7  
LP2          =FFD7  LP3          =FFDF  LP4          =FFE2  

自分でいうのも何なのですが、巧妙な仕組みのプログラムになっています。
8080系のCPUはリセット後はアドレス0000からスタートします。
当然のこととして最初に実行されるプログラムは0000番地から書かなければなりません。
しかしここで悩ましい問題にぶつかります。
イニシャルプログラムローダーによってRAMにロードされるプログラムも0000番地からスタートするプログラムなのです。
もしもイニシャルプログラムローダーが0000番地に置かれていると、システムプログラムのロードを開始した途端に自分自身を破壊してしまいます。
そこでこのローダープログラムにはそれを避ける工夫がされています。
PICによってRAMに書き込まれたときはプログラムの後半部分は、前半部分の直後に置かれています。
PICがアクセスできるアドレスは0000〜007Fの範囲に限られることを思い出してください。
プログラムの後半部分が本物のイニシャルプログラムローダーです。
前半部分は何をやっているかといいますと、前半部分の直後に書き込まれたプログラムローダー本体をアドレスFF80〜にコピーしていているのです。
そしてコピー後にFF80にジャンプします。

本日は時間がなくなってしまいました。
続きは次回にいたします。

ワンボードマイコンでCP/Mを![第454回]
2013.8.9upload

前へ
次へ
ホームページトップへ戻る