Vol.786 10.Jan.2020

背張り用糊で本を修復 PasoconMiniPC8001(3)〜16進入力

B 背張り用糊で本を修復

by fjk

 IO等の雑誌からスキャナーで取り込む時に、ページを開きすぎて、ページが外れることがある。そこで、修復用に背張り専用糊「ブックグルーミニ 01539」(フィルムルックス、\1,760、200g)を入手した。他にもっと安い(約\400)の物もあったが、ドイツNeschen AG社製で、「世界の図書館で使われている」とのことで、これに決定した。
 糊は乾くまで時間がかかるので、百均でメニュースタンドと角材を入手した。剥がれた背張り部分に筆で専用糊を塗り、雑誌の乾燥中は、背張り部を下にして、スタンドに立てて24時間放置した。乾燥後に本を開いても外れず、逆さまにしてもページが落ちないことを確認した。
外れたページ 背張り修復後
背張り用糊
(Book Glue)
百均で準備した道具
(ブックエンドでも可)
筆で糊付け中
(糊は水溶性)
乾燥中(背に隙間が
無いように固定)

 折角、背張り専用糊があるので、修理では無く新たに背張りで本を作成してみた。最近のマニュアルは電子化され、PDFファイルを小雑誌形式で印刷し、中心部をホッチキスで閉じているが、厚みがあり、縁もバラバラである。そこで、印刷したマニュアルの中心をちょうど半分になるようにロータリーカッターで切断し、背の部分に専用糊を塗り、さらに市販の製本テープ(幅25mm)で補強した。
中とじ(左)・背張り(右) 作業風景(アングルで
挟み糊が乾くまで固定)


P PasoconMiniPC8001(3) 〜16進入力

by fjk

 PC8001ではBASICだけでなく機械語を使ったプログラムも結構多い。その機械語の入力にはモニタモードの「S」コマンドで入力できるが、もっと効率よく&正確に入力したい。そこで、テンキーを使って16進コードを入力するプログラムを作成した(通常キーも併用可)。
 プログラムはすべてBASICで記述し、効率よりも読みやすさを目指したので、実行速度は期待できない。プログラム開始後、画面の表示方法を聞いてくるので、80x25から40x20までを選択できる。80文字表示時はサムチェックとアスキー文字表示されるが、40文字表示時はサムチェックのみ表示。
 画面上で16進数を入力すると、その場所の文字が赤字となり、サムチェックやASCII文字も同時に赤色で表示され、変更されたことがわかる。しかしこの状態では変更した文字はまだメモリにセットされておらず、「S」コマンドかページ移動の「P」または「N」コマンドを実行後、Save?に「Y」を入力することでメモリにセット(セーブ)される。なお、(Y or N)で「N」を選ぶと変更内容が全てキャンセルされるので注意(編集画面に戻るには「Cancel」)。プログラムの終了は「X」コマンド。
 なお、アドレス(番地)入力時にはテンキーの16進入力が使えないので注意(手抜きです)。
 プログラムで1文字入力にはINPUT$(1)を使っている(INKEY$はカーソルが消える)
入力画面(80x25モード) 入力画面例(40x20モード)

≪16進キーモード時≫  大文字小文字は区別されず、全て大文字に変換される。【 】はPC8001キー表示
「0」〜「9」,「A」〜「F]・・・そのままのデータ
「Space」 ・・・次データーへ移動
「BackSpace」【DEL】 ・・・前データへ移動
「S」 ・・・データのセーブ
「N」 ・・・次ページへ
「P」 ・・・前ページへ
「R」 ・・・アドレスの再入力
「?」 ・・・コマンドのヘルプ表示
「X」 ・・・プログラムの終了

<テンキー>(フルキーの文字も同じ)
「0」〜「9」 ・・・そのままのデータ
「NumLock」【HOME】 ・・・「A」
「/」【,】 ・・・「B」
「*」 ・・・「C」
「−」【=】 ・・・「D」
「+」 ・・・「E」
「Enter」【Ret】 ・・・「F」
「.」 ・・・サム計算のOn/Off

・16進入力モードはHEXデータ入力時のみで、アドレスやコマンド入力時には使えません。
・16進データのセーブは全メモリエリアで行え、システムエリアなどに書き込んだ場合の動作は保証できないので、本プログラムの使用は自己責任でお願いします(バグもあるかも)。
・行番号25のCLEAR文を利用すると、ユーザーメモリエリアを確保できる。
・行番号495のprint文は文字の色が消えないためのおまじない?(PC8001の文字色指定の制約により、変更した文字の色が赤くならない場合がある)。
・サムチェック計算は時間がかかるので、「.」で計算のOn/Offができる(off時は青字表示)。
・サムチェックは1バイト(2桁)で表示しているが、計算は整数で行っているので、必要であれば本プログラムのサムチェック表示を2バイト(4桁)表示に変更して下さい。

<Memory Dump & Set Program>
 hexin.cmt(zip)
 zipファイルを展開し、cmtファイルをminiPC8001のPCMフォルダーにコピー。
 *緑字はコメント。
10  '=== Memory Dump & Set ===
20  CONSOLE ,,0,1: COLOR 7
25  'CLEAR 500,&HDFFF
30  INPUT "1:80x25,2:40x25,3:80x20,4:40x20";W
40  ON W GOTO 50,60,70,80,90
50  WIDTH 80,25:DX=16:DY=8:GOTO 100
60  WIDTH 40,25:DX=8 :DY=8:GOTO 100
70  WIDTH 80,20:DX=16:DY=8:GOTO 100
80  WIDTH 40,20:DX=8 :DY=8:GOTO 100
90  WIDTH 80,25:DX=16:DY=16
100 DIM B(DY,DX)
110 YF=4:XF=6+DX*3		:'->YF,XF:Screen Offset
119 '--- Dump Data
120 COLOR 7: PRINT CHR$(12)
130 INPUT "Address(Hex)";A$
140 PRINT
170 AS=VAL("&H"+A$) AND &HFFF0	:'->Page Top Address
180 GOSUB 1400			:'->Title Print
190 CF=0: SF=0
200 FOR Y=0 TO DY-1		:'->Y:Row Number
210   A=AS+DX*Y
220   FOR I=0 TO DX-1
230     B(Y,I)=PEEK(A+I)
240   NEXT I
250   GOSUB 1500		:'->Address & Data Print
260   GOSUB 1650		:'->Sum Check Print
270   IF DX=16 THEN GOSUB 1750	:'->Ascii Print
275   PRINT
280 NEXT Y
289 '--- Key Input
290 Y=0:X=0:CF=0
300 LOCATE 5+X+INT(X/2),YF+Y,1
310 K$=INPUT$(1): GOSUB 1250
320 IF INSTR("SNP",K$)>0      THEN 550 :'->Page Change
330 IF K$="R"                 THEN 700 :'->Address ReEnter
335 IF K$="?"                 THEN 750 :'->Help
340 IF K$=CHR$(8)             THEN 800 :'->prev Address
345 IF K$=" "                 THEN 850 :'->next Address
350 IF K$="X"                 THEN 950 :'->Program End
355 IF k$="."                 THEN GOSUB 1620: GOTO 300
360 IF K$=CHR$(28) AND X<DX-1 THEN X=X+1:GOTO 300
370 IF K$=CHR$(29) AND X>0    THEN X=X-1:GOTO 300
380 IF K$=CHR$(30) AND Y>O    THEN Y=Y-1:GOTO 300
390 IF K$=CHR$(31) AND Y<DY-1 THEN Y=Y+1:GOTO 300
400 '--- Edit Memory
410 GOSUB 1000			:'->KeyInputData check
420 IF B$="" THEN 310		:'->Key Re-Enter
430 CF=1			:'->Data Change Flag
440 COLOR 2:PRINT B$;		:'->Data Print
450 XX = INT(X/2)		:'->XX:Data X-Index
460 IF X MOD 2=0 THEN 470 ELSE 490
470   B(Y,XX)=(B(Y,XX) AND &H0F)+VAL("&H"+B$)*16
480   GOTO 500
489 'else
490   B(Y,XX)=(B(Y,XX) AND &HF0)+VAL("&H"+B$)
495   PRINT " ";
499 'EndIf
500 IF SF=0 THEN GOSUB 1600	:'->Sum ReCalc & Print
510 IF DX=16 THEN GOSUB 1700	:'-> Ascii 1char Print
520 IF X<DX*2-1 THEN X=X+1: GOTO 300
530 X=0: IF Y<DY-1 THEN Y=Y+1
540 GOTO 300
549 '--- Page Change & Data Set
550 B$=K$
560 IF CF=0 THEN 640
570 E$="Save(Yes or No or Cancel)":GOSUB 1200
575 IF K$="C" THEN 300
580 IF NOT(K$="Y") THEN 640
590 FOR J=0 TO DY-1
600   FOR I=0 TO DX-1
610     POKE AS+J*DX+I,B(J,I)
620   NEXT I
630 NEXT J
640 IF B$="P" THEN AS=AS-DY*DX:GOTO 660
650 IF B$="N" THEN AS=AS+DY*DX
660 LOCATE 0,YF
670 GOTO 190
699 '--- Address ReEnter
700 IF CF=0 THEN 120
710 E$="No Save(Y or N)":GOSUB 1200
720 IF NOT(B$="Y") THEN 300
730 GOTO 120
749 '--- Help Print
750 LOCATE 0,YF+DY+2:COLOR 4
760 PRINT "Spc:Next,Del:Prev,C:Cursol,X:End";
765 IF DX=8 THEN PRINT
770 Print "S:SaveData,N:NextPage,P:PrevPage"
780 GOTO 300
799 '--- PrevData
800 IF (X MOD 2)=0 THEN X=X-2 ELSE X=X-1
810 IF X<0 THEN X=(DX-1)*2-1:IF Y>0 THEN Y=Y-1
820 GOTO 300
849 '--- NextData
850 IF (X MOD 2)=0 THEN X=X+2 ELSE X=X+1
860 IF X>DX*2-1 THEN X=0:IF Y<DY-1 THEN Y=Y+1
870 GOTO 300
949 '--- END
950 E$="End(Y or N)":GOSUB 1200
960 IF NOT(K$="Y") THEN 300
990 END

998 '=== SubRoutins ===
999  '--- KeyData Change Sub.   <=K$  =>B$
1000 GOSUB 1250
1010 IF K$>="0" AND K$<="9" THEN B$=K$:RETURN
1020 IF K$>="A" AND K$<="F" THEN B$=K$:RETURN
1030 IF K$=CHR$(12) THEN B$="A":RETURN
1040 IF K$="," THEN B$="B":RETURN
1050 IF K$="*" THEN B$="C":RETURN
1060 IF K$="=" THEN B$="D":RETURN
1070 IF K$="+" THEN B$="E":RETURN
1080 IF K$=CHR$(13) THEN B$="F":RETURN
1090 B$="":RETURN

1199 '--- Check Message Sub.
1200 LOCATE 0,YF+DY+1:COLOR 7:PRINT SPC(30);
1210 LOCATE 0,YF+DY+1:PRINT E$;:INPUT K$
1249 '--- To Lower Sub.
1250 IF K$>="a" AND K$<="z" THEN K$=CHR$(ASC(K$)-&H20)
1260 RETURN
1299 '--- Calc CheckSum Sub.  <=Y,B(Y,*) =>SM  [I]
1300 SM=0
1310 FOR I=0 TO DX-1
1320   SM=SM+B(Y,I)
1330 NEXT I
1340 SM=SM AND 255
1350 RETURN
1399 '--- Title Print Sub.
1400 COLOR 4
1410 PRINT "Addr  +0 +1+ 2 +3 +4 +5 +6 +7 ";
1415 IF DX=16 THEN PRINT"+8 +9 +a +b +c +d +e +f ";
1420 PRINT "Sum";
1425 IF DX=16 THEN PRINT" --- ASCII Code --";
1430 PRINT:RETURN
1499 '--- Address & HexData Print  <= A,B(Y,*)  [I]
1500 COLOR 6
1510 PRINT RIGHT$("000"+HEX$(A),4);":";
1520 COLOR 7
1530 FOR I=0 TO DX-1
1540   PRINT RIGHT$("0"+HEX$(B(Y,I)),2);" ";
1550 NEXT I
1560 RETURN
1599 '--- Sum Check Print (Changed)  <= XF,YF,Y   [SM]
1600 COLOR 2
1610 GOTO 1660
1619''--- Sum Check Calc. On/Off 
1620 SF=SF XOR 1
1630 IF SF=0 THEN 1600
1635 COLOR 1
1640 GOTO 1665
1649 '--- Sum Check Print (NormaI)
1650 COLOR 3
1660 GOSUB 1300			:'<- Calc Sum
1665 LOCATE XF,YF+Y
1670 PRINT ":";RIGHT$("00"+HEX$(SM),2);" ";
1680 RETURN
1699 '--- Ascii 1Char Print  <= X,XF,Y,YF,B(Y,*)  [V,C$]
1700 COLOR 2
1710 LOCATE XF+4+X/2,YF+Y
1720 V=B(Y,X/2):GOSUB 1800:PRINT C$;
1730 RETURN

1749 '--- AsciiChar Print  <=B(Y,*)  [I,V,C$]
1750 COLOR 5
1760 FOR I=0 TO DX-1
1770   V=B(Y,I):GOSUB 1800:PRINT C$;
1780 NEXT I
1790 RETURN

1799 '--- Trance ASCII Data   <=V  =>C$
1800 IF V<&H20 THEN C$=CHR$(&HA5):RETURN
1810 IF V=&H60 THEN C$=CHR$(&HA5):RETURN
1820 IF V=&H7F THEN C$=CHR$(&HA5):RETURN
1830 IF V>&HF7 THEN C$=CHR$(&HA5):RETURN
1840 C$=CHR$(V)
1850 RETURN

前のPC8001記事<ー N-BASIC


背張り用糊で本を修復 PasoconMiniPC8001(3)〜16進入力