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