CP/M立ち上げ準備 -- OS/2編 ― 2015年08月02日 17:50
OS/2の作業環境を作成します。
ツールなど一切合財を入れるディレクトリー"CPM"をDドライブの直下に作ります。まずここに、 "CP/M CD-ROM"から、 OS/2版CP/Mエミュレーターを入れます。"CP/M CD-ROM"の内容は、"The Retrocomputing Archive"のサイトの http://www.retroarchive.org/cpm/cdrom/にあります。ここの、"emulator"->"os2"とたどり、 "OS2CPM.ZIP"をダウンロードし、"d:\cpm"にunzipします。この中には、 CP/Mエミュレーターは、3つがあります。
- CPM8080.EXE i8080をエミュレーションするCP/Mエミュレーター
- CPMZ80.EXE Z80をエミュレーションするCP/Mエミュレーター
- CPM.EXE ファミリーAPI版のZ80をエミュレーションするCP/Mエミュレーター
CP/Mのコマンド類は、"The Unofficial CP/M Web site"http://www.cpm.z80.de/の "Digital Research Binaries"ページの"CP/M 2.2 BINARY"cpm22-b.zipをダウンロードし、 "d:\cpm"にunzipします。さしあたって、ASM.COM、DDT.COM、LOAD.COMぐらいしか、使う予定はありません。
動作の確認をします。サンプルプログラムは下記の通り。
; hello.asm -- CP/M simple sample
ORG 100H
START: MVI C,9
LXI D,HELLO
CALL 5
RET
HELLO: DB 'HELLO WORLD.$'
END START
実際に、アセンブルして実行してみます。
find -- 文型の照合 その2 照合パターンの作りこみ ― 2015年08月09日 07:36
照合パターンを作りこみは、 getpat()で行います。実際には、makpat()が照合パターンの作成を行う。
findでは、この文型照合パターンpatに特別な記号を挿入し、管理します。
getpat()は、findとmakpat()のつなぎこみをするだけである。
RATFOR版は、下記の通り。
# getpat.r4 -- convert arguments into pattern
integer function getpat(arg,pat)
character arg(MAXARG),pat(MAXPAT)
integer makpat
getpat = makpat(arg,1,EOS,pat)
return
end
WATCOM Fortran 77版は下記の通り。
c getpat.for -- convert arguments into pattern
integer function getpat(arg,pat)
integer*1 arg(81),pat(81) ! MAXARG(81) MAXPAT(81)
integer makpat
getpat = makpat(arg,1,-2,pat) ! EOS(-2)
return
end
makpat()では、照合パターンの先頭以外に出てきた"%"は、そのものを表すことにします。 同様に、文型の末尾以外に出現した"$"、文型の先頭に出てきた"*"を特別扱いしないで、 その文字そのものとして扱う ようにします。そうすれば、エスケープ"@"を使って文字そのものの意味にする必要がなくなり、 使い勝手が向上します。
makpat()では、patに照合パターンをaddset()を使って設定していきます。 これを使うことでpatからあふれ出すことなく 安全に照合パターンを作りことができます。
文字の類が出現した場合、getccl()使って文字の類の符号化をします。 また、stclos()を使って閉包の処理に必要な情報をセットします。 これを使うことにより閉包の情報構造を隠ぺいすることができます。
RATFOR版は下記の通り。
# makpat.r4 -- make pattern from arg(from), teminate delim
integer function makpat(arg,from,delim,pat)
character arg(MAXARG),delim,pat(MAXPAT)
integer from
character esc
integer stclos,addset,getccl
integer i,j,junk,lastcl,lastj,lj
j = 1
lastj = 1
lastcl = 0
for (i = from; arg(i) != delim & arg(i) != EOS; i = i + 1) {
lj = j
if (arg(i) == ANY)
junk = addset(ANY,pat,j,MAXPAT)
else if (arg(i) == BOL & i == from)
junk = addset(BOL,pat,j,MAXPAT)
else if (arg(i) == EOL & arg(i+1) == delim)
junk = addset(EOL,pat,j,MAXPAT)
else if (arg(i) == CCL) {
if (getccl(arg,i,pat,j) == ERR) then
exit
end if
junk = addset(COLEND,pat,j,MAXPAT)
}
else if (arg(i) == CLOSURE & i > from) {
lj = lastj
if (pat(lj) == BOL | pat(lj) == EOL | pat(lj) == CLOSURE)
break
lastcl = stclos(pat,j,lastj,lastcl)
}
else {
junk = addset(CHAR,pat,j,MAXPAT)
junk = addset(esc(arg,i),pat,j,MAXPAT)
}
lastj = lj
}
if (arg(i) .ne. delim) then # terminated erarly
makpat = ERR
else if (addset(EOS,pat,j,MAXPAT) == NO) # no room
makpat = ERR
else
makpat = i
end if
return
end
WATCOM Fortran77版は下記の通り。
c makpat.for -- make pattern from arg(from), teminate delim
integer function makpat(arg,from,delim,pat)
integer*1 arg(81),pat(81),delim ! MAXARG(81) MAXPAT(81)
integer from
integer*1 esc
integer stclos,addset,getccl
integer i,j,junk,lastcl,lastj,lj
j = 1
lastj = 1
lastcl = 0
i = from
while ((arg(i) .ne. delim) .and. (arg(i) .ne. -2)) do ! EOS(-2)
lj = j
if (arg(i) .eq. 63) then ! ANY(63 '?')
junk = addset(63,pat,j,81) ! ANY(63 '?') MAXPAT(81)
else if ((arg(i) .eq. 37) ! BOL(37 '%')
1 .and. (i .eq. from)) then
junk = addset(37,pat,j,81) ! BOL(37 '%') MAXPAT(81)
else if ((arg(i) .eq. 36) .and. (arg(i+1) .eq. delim)) then ! EOL(36 '$')
junk = addset(36,pat,j,81) ! EOL(36 '%') MAXPAT(81)
else if (arg(i) .eq. 91) then ! CCL(91 '[')
if (getccl(arg,i,pat,j) .eq. 0) then ! NO(0)
exit
end if
! junk = addset(93,pat,j,81) ! COLEND(93 ']') MAXPAT(81)
else if ((arg(i) .eq. 42) .and. (i .gt. from)) then ! CLOSURE(42 '*')
lj = lastj
if ((pat(lj) .eq. 37) ! BOL(37 '%')
1 .or. (pat(lj) .eq. 36) ! EOL(36 '$')
2 .or. (pat(lj) .eq. 42)) then ! CLOSURE(42 '*')
exit
end if
lastcl = stclos(pat,j,lastj,lastcl)
else
junk = addset(97,pat,j,81) ! CHAR(97 'a') MAXPAT(81)
junk = addset(esc(arg,i),pat,j,81) ! MAXPAT(81)
end if
lastj = lj
i = i + 1
end while
if (arg(i) .ne. delim) then ! terminated erarly
makpat = -1 ! ERR(-1)
else if (addset(-2,pat,j,81) .eq. 0) then ! no room EOS(-2) MAXPAT(81) NO(0)
makpat = -1 ! ERR(-1)
else
makpat = i
end if
return
end
getccl()のRATFOR版は下記の通り。
# getccl.r4 -- expand char class at atg(i) into pat(j)
integer function getccl(arg,i,pat,j)
character arg(MAXARG),pat(MAXPAT)
integer i,j
integer addset,junk,jstart
i = i + 1
if (arg(i) == NOT) {
junk = addset(NCCL,pat,j,MAXPAT)
i = i + 1
}
else
junk = addset(CCL,pat,j,MAXPAT)
jstart = j
junk = addset(0,pat,j,MAXPAT) # leave room for count
call filset(CCLEND,arg,i,pat,j,MAXPAT)
pat(jstart) = j - jstart - 1
if (arg(i) == CCLEND)
getccl = OK
else
getccl = ERR
return
end
WATCOM Fortran77版は下記の通り。
c getccl.for -- expand char class at atg(i) into pat(j)
integer function getccl(arg,i,pat,j)
integer*1 arg(81),pat(81) ! MAXARG(81) MAXPAT(81)
integer i,j
integer addset,junk,jstart
i = i + 1
if (arg(i) .eq. 33) then ! NOT(33 '!')
junk = addset(110,pat,j,81) ! NCCL(110, 'n') MAXPAT(81)
i = i + 1
else
junk = addset(91,pat,j,81) ! CCL(91, '[') MAXPAT(81)
end if
jstart = j
junk = addset(0,pat,j,81) ! leave room for count MAXPAT(81)
call filset(93,arg,i,pat,j,81) ! COLEND(93 ']') MAXPAT(81)
pat(jstart) = j - jstart - 1 ! save count
if (arg(i) .eq. 93) then ! COLEND(93 ']')
getccl = 1 ! OK(1)
else
getccl = -1 ! ERR(-1)
end if
return
end
stclos()のRATFOR版は下記の通り。
# stclos.r4 -- insert closure entry at pat(j)
integer function stclos(pat,j,lastj,lastcl)
character pat(MAXPAT)
integer j,junk,jp,jt,lastj,lastcl
integer addset,
for (jp = j - 1; jp >= lastj; jp = jp - 1) { make a hole
jt = jp + COLSIZE
junk = addset(pat(jp),pat,jt,MAXPAT)
}
j = j + CLOSIZE
stclos = lastj
junk = addset(CLOSURE,pat,lastj,MAXPAT) # put closure in it
junk = addset(0,pat,lastj,MAXPAT) # COUNT
junk = addset(lastcl,pat,lastj,MAXPAT) # PREVCL
junk = addset(0,pat,lastj,MAXPAT) # START
return
end
WATCOM Fortran77版は下記の通り。
c stclos.for -- insert closure entry at pat(j)
integer function stclos(pat,j,lastj,lastcl)
integer*1 pat(81) ! MAXPAT(81)
integer j,lastj,lastcl
integer addset,junk,jp,jt
jp = j - 1 ! make a hole
while (jp .ge. lastj) do
jt = jp + 4 ! COLSIZE(4)
junk = addset(pat(jp),pat,jt,81) ! MAXPAT(81)
jp = jp - 1
end while
j = j + 4 ! CLOSIZE(4)
stclos = lastj
junk = addset(42,pat,lastj,81) ! CLOSURE(42 '*') MAXPAT(81)
junk = addset(0,pat,lastj,81) ! COUNT MAXPAT(81)
junk = addset(lastcl,pat,lastj,81) ! PREVCL MAXPAT(81)
junk = addset(0,pat,lastj,81) ! START MAXPAT(81)
return
end
最近のコメント