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 |