2020年10月11日日曜日

F-BASIC版のP-ROM Writerカード用ドライバが完成

 

F-BASIC版のP-ROM Writerカード用ドライブソフトも作りました


9月16日のブログで、P-ROMライター用のドライブソフトが完成したと書きましたが、それは、私が常用しているFlex9上で動作するものでしたので、オリジナルのOS-9版と同様、一般的ではありませんでした。
そこで、普段はほとんど使うことがないF-BASIC上で動作するものを作ろうとしたのですが、Flex9ではデータバッファとして32KBを確保できたのに対してF-BASICでは$8000番地から上がROMですのでそんなには取れません。
初めは裏RAMを使用することを考えたのですが、それでも32KBは無理です。(32KBにこだわるのは27256の容量だからです。)
結局、裏RAM使用は止めて少ないバッファ容量に合わせてデータを分割して読み込み、複数回の書き込みをすることとしました。(Flex9版でも27512では2回に分けて書き込んでいます。)
下図で分かりますように、バッファ容量として8KB確保しましたので、2716, 2732, 2764は一回で書き込めますが、27128では2回、27256では4回、27512では8回の書き込みを繰り返すことになります。







これに合わせて、Block選択コマンドを追加しました。(1ブロックは8KB)0を選択すると自動的に書き込みを繰り返して全ブロックを書き込みます。0以外では選択したブロックのみを書き込みます。
また、書き込むデータも全体をメモリ上には置いておけず、機械語ファイルとしてディスクに保存することになりますので、そのファイルのLoad, Saveコマンドも追加しました。
さらに、データファイルを8KB単位に分割して機械語ファイル形式に変換するためのソフトも別途必要です。

結局、実装したコマンドは Info, Type, Block, Pwidth, Dump, Erase, Read, Write, Verify, Load, Save, Quitの計12個となりました。


27512を選択した例を示します。




ブランクチェックをした後、書き込んでいます。
ブロック1から8までを連続して書き込んでいます。




ドライブソフトですが、ほとんどの機能を機械語サブルーチンに任せているので、BASIC部は基本的に初期化とコマンド選択・実行準備だけという簡単なものです。

BASIC部を示します。

  1. 1000 'PROM READ/WRITE PROGRAM FOR FM-7
  2. 1010 '
  3. 1020 WIDTH 80,25
  4. 1030 CLEAR ,&H47FF
  5. 1040 MADR=&H4800 :'store subroutine
  6. 1050 BUFTOP%=&H5000
  7. 1060 BUFEND%=&H7000 :'buffer size is 8KB
  8. 1070 POKE MADR+&H12,BUFTOP% \ &H100
  9. 1080 POKE MADR+&H13,BUFTOP% MOD &H100
  10. 1090 POKE MADR+&H14,BUFEND% \ &H100
  11. 1100 POKE MADR+&H15,BUFEND% MOD &H100
  12. 1110 PRINT:PRINT"Initializing..."
  13. 1120 'PIA INIT
  14. 1130 PIA=&HFD9C:PIADA=PIA:PIACA=PIA+1:PIADB=PIA+2:PIACB=PIA+3
  15. 1140 POKE PIACA,&H30 :'DDRA
  16. 1150 POKE PIACB,&H30 :'DDRB
  17. 1160 POKE PIADA,&HFF :'PORTA OUT
  18. 1170 POKE PIADB,&HFF :'PORTB OUT
  19. 1180 POKE PIACA,&H3C
  20. 1190 POKE PIACB,&H3C
  21. 1200 '
  22. 1210 CMD$="ITBPDERWVLSQ"
  23. 1220 ROMTYP$(0)="2716 ":ROMTYP$(1)="2732 ":ROMTYP$(2)="2764 "
  24. 1230 ROMTYP$(3)="27128":ROMTYP$(4)="27256":ROMTYP$(5)="27512"
  25. 1240 ROMNO%=3 :'default ROM type is 2764
  26. 1250 PWIDTH%=1 :'default write pulse width is 1ms
  27. 1260 BLKNO%=1 :'default block no
  28. 1270 LDFN$="ROMDAT"
  29. 1280 SVFN$="ROMDATS"
  30. 1290 '
  31. 1300 '===== SET PROGRAM CODE =====
  32. 1310 LOADM "PWRSUB" :'Load subroutine
  33. 1320 '
  34. 1330 '+++++ COMMAND INPUT +++++
  35. 1340 PRINT:PRINT "Command:"
  36. 1350 PRINT " I)nfo T)ype B)lock P)width D)ump E)rase R)ead W)rite V)erify L)oad S)ave Q)uit"
  37. 1360 PRINT "Command in: ";
  38. 1370 KIN$=INKEY$ :IF KIN$="" THEN 1370
  39. 1380 PRINT KIN$
  40. 1390 IF ASC(KIN$)>&H61 THEN KIN$=CHR$(ASC(KIN$)-&H20)
  41. 1400 CMD=INSTR(1,CMD$,KIN$)
  42. 1410 IF CMD=1 THEN GOSUB 1560 :GOTO 1340 :'Info
  43. 1420 IF CMD=2 THEN GOSUB 1640 :GOTO 1340 :'Type
  44. 1430 IF CMD=3 THEN GOSUB 1740 :GOTO 1340 :'Block
  45. 1440 IF CMD=4 THEN GOSUB 1960 :GOTO 1340 :'Pwidth
  46. 1450 IF CMD=5 THEN GOSUB 2880 :GOTO 1340 :'Dump
  47. 1460 IF CMD=6 THEN GOSUB 2030 :GOTO 1340 :'Erase
  48. 1470 IF CMD=7 THEN GOSUB 2110 :GOTO 1340 :'Read
  49. 1480 IF CMD=8 THEN GOSUB 2360 :GOTO 1340 :'Write
  50. 1490 IF CMD=9 THEN GOSUB 2620 :GOTO 1340 :'Verify
  51. 1500 IF CMD=10 THEN GOSUB 2930 :GOTO 1340 :'Load
  52. 1510 IF CMD=11 THEN GOSUB 2990 :GOTO 1340 :'Save
  53. 1520 IF CMD=12 THEN END :'Quit
  54. 1530 GOTO 1340
  55. 1540 '
  56. 1550 '===== INFORMATION =====
  57. 1560 PRINT:PRINT "ROM type is ";ROMTYP$(ROMNO%-1)
  58. 1570 PRINT "Block no (0:ALL) is";BLKNO%
  59. 1580 PRINT "Write pulse width is";PWIDTH%;"ms"
  60. 1590 PRINT "Load Filename is ";LDFN$
  61. 1600 PRINT "Save Filename is ";SVFN$
  62. 1610 RETURN
  63. 1620 '
  64. 1630 '===== SELECT ROM TYPE =====
  65. 1640 PRINT:PRINT "Select ROM: ";
  66. 1650 FOR I=0 TO 5
  67. 1660 PRINT USING "#!& &";I+1;")";ROMTYP$(I);
  68. 1670 NEXT
  69. 1680 PRINT
  70. 1690 INPUT "Input ROM no (1..6):";ROMNO%
  71. 1700 IF ROMNO%<1 OR ROMNO%>6 THEN 1690
  72. 1710 PRINT:PRINT "ROM type is ";ROMTYP$(ROMNO%-1)
  73. 1720 '
  74. 1730 '===== SELECT BLOCK NO =====
  75. 1740 PRINT:PRINT "Select Block No: "
  76. 1750 BLKNO%=1
  77. 1760 IF ROMNO%<=3 THEN PRINT "2716,32,64 is BlockNo=1" :GOTO 1860
  78. 1770 PRINT "Input block no (0:ALL,";
  79. 1780 ON ROMNO%-3 GOTO 1790,1810,1830
  80. 1790 INPUT "1-2):";KIN$
  81. 1800 IF KIN$<"0" OR KIN$>"2" THEN 1770 ELSE 1850
  82. 1810 INPUT "1-4):";KIN$
  83. 1820 IF KIN$<"0" OR KIN$>"4" THEN 1770 ELSE 1850
  84. 1830 INPUT "1-8):";KIN$
  85. 1840 IF KIN$<"0" OR KIN$>"8" THEN 1770 ELSE 1850
  86. 1850 BLKNO%=VAL(KIN$)
  87. 1860 POKE MADR+&H1B,ROMNO%-1
  88. 1870 RETURN
  89. 1880 '
  90. 1890 '===== SET VARIABLE =====
  91. 1900 POKE MADR+&H1A,PWIDTH%
  92. 1910 POKE MADR+&H1B,ROMNO%-1
  93. 1920 POKE MADR+&H1C,BLKNO%
  94. 1930 RETURN
  95. 1940 '
  96. 1950 '===== SET WRITE PULSE WIDTH =====
  97. 1960 PRINT:INPUT "Write pulse width (1..50ms): ";KIN$
  98. 1970 IF VAL(KIN$)<1 OR VAL(KIN$)>50 THEN 1960
  99. 1980 PWIDTH%=VAL(KIN$)
  100. 1990 POKE MADR+&H1A,PWIDTH%
  101. 2000 RETURN
  102. 2010 '
  103. 2020 '===== ERASE CHECK =====
  104. 2030 PRINT:PRINT "Erase checking"
  105. 2040 GOSUB 1900
  106. 2050 DEF USR1=MADR+3:'Erase check command
  107. 2060 A%=USR1(0) :'Exec command
  108. 2070 IF A%=0 THEN PRINT " Erase check complete!" ELSE PRINT " !!! not BLANK !!!"
  109. 2080 RETURN
  110. 2090 '
  111. 2100 '===== READ =====
  112. 2110 PRINT :PRINT "Reading BlockNo:"
  113. 2120 'set variable
  114. 2130 GOSUB 1900
  115. 2140 DEF USR2=MADR+6 :'Read command
  116. 2150 SVBLKNO%=BLKNO%
  117. 2160 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
  118. 2170 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
  119. 2180 'Read
  120. 2190 GOSUB 2250
  121. 2200 'Read end
  122. 2210 BLKNO%=SVBLKNO%
  123. 2220 IF A%=0 THEN PRINT "Read complete!"
  124. 2230 RETURN
  125. 2240 '
  126. 2250 'Read subroutine
  127. 2260 FOR I=STNO% TO MAXNO%
  128. 2270 BLKNO%=I
  129. 2280 PRINT BLKNO%;
  130. 2290 POKE MADR+&H1C,BLKNO%
  131. 2300 A%=USR2(0) :'Exec
  132. 2310 IF A%=0 THEN PRINT ELSE PRINT " !!! Read ERROR !!!"
  133. 2320 NEXT
  134. 2330 RETURN
  135. 2340 '
  136. 2350 '===== WRITE =====
  137. 2360 PRINT:PRINT "Writing BlockNo:"
  138. 2370 'set variable
  139. 2380 GOSUB 1900
  140. 2390 DEF USR3=MADR+9:'Write command
  141. 2400 SVBLKNO%=BLKNO%
  142. 2410 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
  143. 2420 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
  144. 2430 'Write
  145. 2440 GOSUB 2500
  146. 2450 'Write end
  147. 2460 BLKNO%=SVBLKNO%
  148. 2470 IF A%=0 THEN PRINT "Write complete!"
  149. 2480 RETURN
  150. 2490 '
  151. 2500 'Write subroutine
  152. 2510 FOR I=STNO% TO MAXNO%
  153. 2520 BLKNO%=I
  154. 2530 PRINT BLKNO%;
  155. 2540 POKE MADR+&H1C,BLKNO%
  156. 2550 LOADM LDFN$+HEX$(BLKNO%)
  157. 2560 A%=USR3(0) :'Exec
  158. 2570 IF A%=0 THEN PRINT ELSE PRINT " !!! Write ERROR !!!"
  159. 2580 NEXT
  160. 2590 RETURN
  161. 2600 '
  162. 2610 '===== VERIFY =====
  163. 2620 PRINT:PRINT "Verifying BlockNo:"
  164. 2630 'set variable
  165. 2640 GOSUB 1900
  166. 2650 DEF USR4=MADR+12 :'Verify command
  167. 2660 SVBLKNO%=BLKNO%
  168. 2670 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
  169. 2680 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
  170. 2690 'Verify
  171. 2700 GOSUB 2760
  172. 2710 'Verify end
  173. 2720 BLKNO%=SVBLKNO%
  174. 2730 IF A%=0 THEN PRINT "Verify complete!"
  175. 2740 RETURN
  176. 2750 '
  177. 2760 'Verify subroutine
  178. 2770 FOR I=STNO% TO MAXNO%
  179. 2780 BLKNO%=I
  180. 2790 PRINT BLKNO%;
  181. 2800 POKE MADR+&H1C,BLKNO%
  182. 2810 LOADM LDFN$+HEX$(BLKNO%)
  183. 2820 A%=USR4(0) :'Exec
  184. 2830 IF A%=0 THEN PRINT ELSE PRINT " !!! Verify ERROR !!!"
  185. 2840 NEXT
  186. 2850 RETURN
  187. 2860 '
  188. 2870 '===== Memory Dump =====
  189. 2880 DEF USR5=MADR+15 'Buffer dump command
  190. 2890 A%=USR5(0) :'Exec
  191. 2900 RETURN
  192. 2910 '
  193. 2920 '===== Load from File =====
  194. 2930 INPUT "Load Filename (except block no):";LDFN$
  195. 2940 PRINT "Load for BlockNo:";BLKNO%
  196. 2950 LOADM LDFN$+HEX$(BLKNO%)
  197. 2960 RETURN
  198. 2970 '
  199. 2980 '===== Save to File =====
  200. 2990 INPUT "Save Filename (except block no):";SVFN$
  201. 3000 PRINT "Save for BlockNo:";BLKNO%
  202. 3010 SAVEM SVFN$+HEX$(BLKNO%),BUFTOP%,BUFEND%,&H0
  203. 3020 RETURN
  204. 3030 '
  205. 3040 END


機械語サブルーチン部を示します。

  1. *
  2. * PROMSUB
  3. *
  4. * PROM Read/Write subroutine for FM-7
  5. *
  6. * argument of USR function
  7. * MADR+&H17 :PWIDTH
  8. * MADR+&H18 :ROMNO-1
  9. * MADR+&H19 :BLKNO
  10. *
  11. * First version Ver 1.0 '2020.10.10
  12. * Original FLEX9 version '2020.09.13
  13. * Copyright by Y.Yamamoto
  14. *
  15. BIOS EQU $FBFA ;F-Basic bios
  16. PIA EQU $FD9C
  17. PIADA EQU PIA ;ADRSH,ADRSL,DATA
  18. PIACA EQU PIA+1
  19. PIADB EQU PIA+2 ;PB5:VPPCNT,PB4:OE,PB3:CE,PB1:AHI,PB0:ALO for 2716,32,256,512
  20. * ;PB5:VPPCNT,PB4:OE,PB3:PGM,PB2:CE:PB1:AHI,PB0:ALO for 2764,128
  21. PIACB EQU PIA+3
  22. *
  23. ORG $4800
  24.  
  25. START EQU *
  26. LBRA SETPRM point by USR0() ;+0
  27. LBRA CERASE point by USR1() ;+3
  28. LBRA CREAD point by USR2() ;+6
  29. LBRA CWRITE point by USR3() ;+9
  30. LBRA CVERIFY point by USR4() ;+12
  31. LBRA CDUMP point by USR5() ;+15
  32. *
  33. BUFTOP FDB $5000 ;start addr
  34. BUFEND FDB $7000 ;end addr
  35. STADR FDB 0000 ;page top addr
  36. EDADR FDB 0000 ;page end addr
  37. PWIDTH FCB 01 ;PWIDTH:write pulse length (default 1ms)
  38. ROMNO FCB 00 ;ROMNO-1 (0..5)
  39. BLKNO FCB 00 ;BLKNO (0,1..8)
  40. DATCNT FCB 00 ;data count for disp
  41. CPARA1 FCB 00 ;cmd parameter(9bytes)
  42. CPARA2 FCB 00
  43. CPARA3 FCB 00
  44. CPARA4 FCB 00
  45. CPARA5 FCB 00
  46. CPARA6 FCB 00
  47. CPARA7 FCB 00
  48. CPARA8 FCB 00
  49. CPARA9 FCB 00
  50. *
  51. *------------------------------
  52. * get parameter & set read param
  53. *------------------------------
  54. GETPRM EQU *
  55. PSHS B,X
  56. LDB ROMNO ;ROMNO-1 (0..5)
  57. LEAX PARARD,PCR
  58. LSLB
  59. LSLB x4
  60. ABX
  61. LDB #4 ;counter
  62. BSR SETPRM
  63. PULS B,X,PC
  64. *
  65. *------------------------------
  66. * set read/write parameter
  67. * B:counter
  68. * X:adr of CPARARD or CPARAWR
  69. *------------------------------
  70. SETPRM EQU *
  71. PSHS A,Y
  72. LEAY CPARA1,PCR
  73. SR1 LDA ,X+
  74. STA ,Y+
  75. DECB
  76. BNE SR1
  77. PULS A,Y,PC
  78. *
  79. *read,verify,erase parameter
  80. PARARD EQU *
  81. FCB $28,$2A,$2B,$23 ;for 2716
  82. FCB $28,$2A,$2B,$23 ;for 2732
  83. FCB $20,$22,$23,$2B ;for 2764
  84. FCB $20,$22,$23,$2B ;for 27128
  85. FCB $28,$2A,$2B,$23 ;for 27256
  86. FCB $28,$2A,$2B,$23 ;for 27512
  87. *
  88. *write parameter
  89. PARAWR EQU *
  90. FCB $10,$12,$13,$13,$1B,$13,$13,$03,$13 ;for 2716
  91. FCB $28,$2A,$2B,$0B,$03,$0B,$2B,$23,$2B ;for 2732
  92. FCB $1C,$1E,$1F,$1B,$13,$1B,$1B,$0B,$1B ;for 2764
  93. FCB $1C,$1E,$1F,$1B,$13,$1B,$1B,$0B,$1B ;for 27128
  94. FCB $38,$3A,$3B,$1B,$13,$1B,$1B,$0B,$1B ;for 27256
  95. FCB $28,$2A,$2B,$0B,$03,$0B,$2B,$23,$2B ;for 27512
  96. *
  97. *------------------------------
  98. * set start & end adrs
  99. * 2716,32,64 :whole rom(2k,4k,8k)
  100. * 27128,256,512 :8k(block specified by BLKNO)
  101. *
  102. * STADR decided by BLKNO
  103. *------------------------------
  104. SETADR EQU *
  105. PSHS A,B,X
  106. LDX #0
  107. STX STADR
  108. STX EDADR
  109. LDB BLKNO ;BLKNO
  110. BEQ SE1
  111. DECB
  112. LDA #$20 ;8kb
  113. MUL
  114. EXG A,B
  115. STD STADR
  116. STD EDADR
  117. SE1 LDA #$08 ;2kb
  118. LDB ROMNO ;ROMNO-1
  119. BEQ SE2 ;2716 2kb
  120. LSLA
  121. DECB
  122. BEQ SE2 ;2732 4kb
  123. LSLA else ;8kb
  124. SE2 ADDA EDADR
  125. STA EDADR ;2k,4,8k
  126. *set bufend
  127. LDA #$58 ;$5000+2k
  128. LDB ROMNO ;ROMNO-1
  129. BEQ SE3 ;if 2716
  130. ADDA #$08 ;4k
  131. DECB
  132. BEQ SE3 ;if 2732
  133. ADDA #$10 ;8k
  134. SE3 STA BUFEND ;2k,4k,8k
  135. PULS A,B,X,PC
  136. *
  137. *============================
  138. * ERASE CHECK all ROM area
  139. *============================
  140. CERASE EQU *
  141. *set read parameter
  142. PSHS X ;save for return parameter
  143. *get param & set read param
  144. LBSR GETPRM
  145. *set start & end adrs
  146. LDX #0
  147. STX STADR ;start adrs is 0
  148. STX EDADR
  149. LDB ROMNO ;ROMNO-1
  150. INCB ROMNO
  151. LDA #$04 ;assume 1k
  152. CE0 LSLA
  153. DECB
  154. BNE CE0
  155. STA EDADR ;2k,4k,8k,16k,32k,64k
  156. *
  157. *erase check
  158. LDX STADR
  159. LDY EDADR
  160. CE1 LDA CPARA1
  161. STA PIADB
  162. *ADRS SET
  163. TFR X,D ;read adrs
  164. STA PIADA ;adrsH
  165. LDA CPARA2
  166. STA PIADB ;adrsH set
  167. STB PIADA ;adrsL
  168. LDA CPARA3
  169. STA PIADB ;adrsL set
  170. *READ DATA & CHECK
  171. LDA CPARA4
  172. STA PIADB ;ce:H->L
  173. LDA #$FF
  174. STA PIADA ;change to input mode
  175. LDA PIADA ;read data
  176. CMPA #$FF ;blank data?
  177. BNE CERERR
  178. LEAX 1,X
  179. LEAY -1,Y
  180. BHI CE1
  181. CLRA ;no error
  182. CEEND
  183. PULS X
  184. STA 2,X
  185. STA 3,X
  186. RTS
  187. *
  188. CERERR
  189. LDA #-1 ;error
  190. BRA CEEND
  191. *
  192. *============================
  193. * READ DATA of 1 block
  194. *============================
  195. CREAD EQU *
  196. *set read parameter
  197. PSHS X save for return parameter
  198. *get param & set read param
  199. LBSR GETPRM
  200. *
  201. *set start & end adrs
  202. CR0 LBSR SETADR
  203. *read data
  204. LDX STADR
  205. LDY BUFTOP
  206. *
  207. CR1 BSR DSPCNT
  208. LDA CPARA1
  209. STA PIADB
  210. *ADRS SET
  211. TFR X,D ;read adrs
  212. STA PIADA ;adrsH
  213. LDA CPARA2
  214. STA PIADB ;adrsH set
  215. STB PIADA ;adrsL
  216. LDA CPARA3
  217. STA PIADB ;adrsL set
  218. *READ DATA
  219. LDA CPARA4
  220. STA PIADB ;ce:H->L
  221. LDA #$FF
  222. STA PIADA ;change to input mode
  223. LDA PIADA ;read data
  224. STA ,Y+
  225. LEAX 1,X
  226. BEQ CR2 ;for EDADR=0 (27512)
  227. CMPY BUFEND
  228. BLO CR1
  229. CR2 CLRA ;no error
  230. PULS X
  231. STA 2,X
  232. STA 3,X
  233. RTS
  234. *
  235. *-------------------------
  236. * DISP READ/WRITE COUNTER
  237. *-------------------------
  238. DSPCNT EQU *
  239. PSHS A,B,X
  240. TFR X,D
  241. TSTB
  242. BNE DSPEND
  243. LDA #'.
  244. JSR PUTCHR
  245. DSPEND PULS A,B,X,PC
  246. *
  247. *============================
  248. * WRITE DATA of 1 block
  249. *============================
  250. CWRITE EQU *
  251. PSHS X ;SAVE for return parameter
  252. LDB ROMNO ;ROMNO-1
  253. PSHS B
  254. LEAX PARAWR,PCR
  255. LSLB
  256. LSLB
  257. LSLB x8
  258. ABX
  259. PULS B
  260. ABX x9
  261. LDB #9 ;counter
  262. LBSR SETPRM
  263. *set start & end adrs
  264. CW0 LBSR SETADR
  265. *write data
  266. LDX STADR
  267. LDY BUFTOP
  268. *
  269. CW1 BSR DSPCNT
  270. LDA CPARA1
  271. STA PIADB ;start
  272. *ADRS SET
  273. TFR X,D
  274. STA PIADA ;adrsH
  275. LDA CPARA2
  276. STA PIADB ;adrsH set
  277. STB PIADA ;adrsL
  278. LDA CPARA3
  279. STA PIADB ;adrsL set
  280. LDA ,Y
  281. CMPA #$FF ;if $ff then skip
  282. BEQ CW4
  283. STA PIADA ;data
  284. LDA CPARA4
  285. STA PIADB ;data set
  286. *WRITE PULSE
  287. LDB PWIDTH ;write pulse width
  288. LDA CPARA5
  289. STA PIADB ;write pulse
  290. PSHS X
  291. CW2 LDX #256
  292. CW3 LEAX -1,X
  293. BNE CW3
  294. DECB
  295. BNE CW2
  296. PULS X
  297. LDA CPARA6 ;end write pulse
  298. STA PIADB
  299. LDA CPARA7 ;gap
  300. STA PIADB
  301. *DATA READ for VERIFY
  302. LDA CPARA8
  303. STA PIADB ;verify
  304. LDA #$FF
  305. STA PIADA ;change to input mode
  306. LDA PIADA ;data read
  307. CMPA ,Y
  308. BNE CWERR
  309. LDA CPARA9
  310. STA PIADB ;end verify
  311. CW4 LEAY 1,Y
  312. LEAX 1,X
  313. BEQ CW5 ;for EDADR=0 (27512)
  314. CMPY BUFEND
  315. BLO CW1
  316. CW5 CLRA ;no error
  317. CWEND
  318. PULS X
  319. STA 2,X
  320. STA 3,X
  321. LDA #$38 ;VPP=0,OE,CE=H
  322. STA PIADB
  323. RTS
  324. *
  325. CWERR LDA #-1
  326. BRA CWEND
  327. *
  328. *============================
  329. * VERIFY DATA of 1 block
  330. * compare ROM(STADR-EDADR) and BUF(TOP-END)
  331. *============================
  332. CVERIFY EQU *
  333. *set read parameter
  334. PSHS X ;save for return parameter
  335. *get param & set read param
  336. LBSR GETPRM
  337. *set start & end adrs
  338. CV0 LBSR SETADR
  339. *verify check
  340. LDX STADR
  341. LDY BUFTOP
  342. *
  343. CV1 LBSR DSPCNT
  344. LDA CPARA1
  345. STA PIADB
  346. *ADRS SET
  347. TFR X,D ;read adrs
  348. STA PIADA ;adrsH
  349. LDA CPARA2
  350. STA PIADB ;adrsH set
  351. STB PIADA ;adrsL
  352. LDA CPARA3
  353. STA PIADB ;adrsL set
  354. *READ DATA & CHECK
  355. LDA CPARA4
  356. STA PIADB ;ce:H->L
  357. LDA #$FF
  358. STA PIADA ;change to input mode
  359. LDA PIADA ;read data
  360. CMPA ,Y+ ;match data?
  361. BNE CVERR
  362. LEAX 1,X
  363. BEQ CV2 ;for EDADR=0 (27512)
  364. CMPY BUFEND
  365. BLO CV1
  366. CV2 CLRA ;no error
  367. CVEND
  368. PULS X
  369. STA 2,X
  370. STA 3,X
  371. RTS
  372. *
  373. CVERR
  374. LDA #-1 ;error
  375. BRA CVEND
  376. *
  377. *============================
  378. * DUMP BUFFER DATA
  379. *============================
  380. CDUMP EQU *
  381. LBSR PCRLF
  382. LDX BUFTOP
  383. STX STADR
  384. MDMP0 LBSR DSPTTL
  385. LDX STADR
  386. LDB #16
  387. STB DATCNT ;data cntr in line
  388. MDMP1 STX STADR
  389. PSHS B
  390. LEAX STADR,PCR
  391. LBSR OUTADR
  392. LDA #':
  393. LBSR PUTCHR
  394. LDA #$20
  395. LBSR PUTCHR
  396. * display hexa data
  397. LDX STADR
  398. LDB DATCNT
  399. LBSR HEXDSP
  400. LDB DATCNT
  401. * display ascii data
  402. LDX STADR
  403. LDB DATCNT
  404. LBSR ASCDSP
  405. STX STADR ;set new start addr
  406. LBSR PCRLF
  407. * page ?
  408. PULS B
  409. DECB
  410. BNE MDMP1
  411. *
  412. MD1 LDX STADR
  413. CMPX BUFEND
  414. BLO MD2
  415. MDEND LBSR PCRLF
  416. RTS
  417. *
  418. MD2 LEAX MSKIN,PCR
  419. LBSR PSTRNG
  420. LBSR GETCHR
  421. ANDA #$DF
  422. CMPA #'Q quit?
  423. BEQ MDEND
  424. CMPA #'P Prev page?
  425. BEQ MD5
  426. CMPA #'S Set address?
  427. BNE MD4
  428. MD3 LEAX MADRS,PCR
  429. LBSR PSTRNG
  430. LBSR ADRIN
  431. CMPX BUFTOP
  432. BLO MD3
  433. PSHS X
  434. LEAX -$100,X
  435. CMPX BUFEND
  436. PULS X
  437. BHS MD3
  438. TFR X,D
  439. CLRB
  440. TFR D,X
  441. STX STADR
  442. MD4 LBRA MDMP0
  443. *
  444. MD5 LDX STADR
  445. LEAX -$200,X
  446. CMPX BUFTOP
  447. BMI MD6
  448. BRA MD7
  449. MD6 LEAX $100,X
  450. MD7 STX STADR
  451. BRA MD4
  452. *
  453. *--------------------
  454. * display title
  455. DSPTTL EQU *
  456. LEAX MDTTL1,PCR
  457. BSR OUTSTR
  458. DEND BSR PCRLF
  459. RTS
  460. *--------------------
  461. * hexa data disp of 1 line
  462. * B:counter
  463. HEXDSP
  464. BSR OUTHEX
  465. LDA #$20
  466. BSR PUTCHR
  467. DECB
  468. BNE HEXDSP
  469. RTS
  470. *--------------------
  471. * ascii data disp of 1 line
  472. * B:counter
  473. ASCDSP LDA ,X+
  474. CMPA #$20
  475. BHS ADSP1
  476. LDA #'.
  477. BRA ADSP2
  478. ADSP1 CMPA #$7F
  479. BLS ADSP2
  480. LDA #'.
  481. ADSP2
  482. BSR PUTCHR
  483. DECB
  484. BNE ASCDSP
  485. RTS
  486. *
  487. *--------------------
  488. OUTSTR EQU *
  489. OU1 LDA ,X+
  490. BEQ OUEND
  491. BSR PUTCHR
  492. BRA OU1
  493. OUEND RTS
  494. *
  495. *--------------------
  496. * display split line
  497. VSPLN
  498. LDB #57 display split line
  499. LDA #'-
  500. VSP BSR PUTCHR
  501. DECB
  502. BNE VSP
  503. BSR PCRLF
  504. RTS
  505. *
  506. *--------------------
  507. GETCHR EQU *
  508. PSHS X,Y
  509. LEAX RCBKIN,PCR
  510. LEAY DBAKIN,PCR
  511. STY 2,X
  512. GE1 JSR [BIOS]
  513. LDA DBAKIN+1
  514. BEQ GE1
  515. LDA DBAKIN
  516. PULS X,Y
  517. *
  518. PUTCHR EQU *
  519. PSHS X,Y
  520. LEAX RCBOUT,PCR
  521. LEAY DBAOUT,PCR
  522. STY 2,X
  523. STA 6,X
  524. JSR [BIOS]
  525. PULS X,Y,PC
  526. *
  527. PCRLF EQU *
  528. LDA #$0D
  529. BSR PUTCHR
  530. LDA #$0A
  531. BSR PUTCHR
  532. RTS
  533. *
  534. PSTRNG EQU *
  535. PS1 LDA ,X+
  536. CMPA #4
  537. BEQ PS2
  538. BSR PUTCHR
  539. BRA PS1
  540. PS2 RTS
  541. *
  542. OUTHEX EQU *
  543. LDA ,X+
  544. PSHS A
  545. ANDA #$F0
  546. LSRA
  547. LSRA
  548. LSRA
  549. LSRA
  550. BSR PHEX
  551. PULS A
  552. ANDA #$0F
  553. BSR PHEX
  554. RTS
  555. *
  556. PHEX EQU *
  557. CMPA #10
  558. BCS PH1
  559. ADDA #7
  560. PH1 ADDA #$30
  561. BSR PUTCHR
  562. RTS
  563. *
  564. OUTADR EQU *
  565. BSR OUTHEX
  566. BSR OUTHEX
  567. RTS
  568. *
  569. ADRIN EQU *
  570. *clear buffer
  571. LEAX INBUF+6,PCR
  572. LDB #6
  573. CLRA
  574. AD1 STA ,-X
  575. DECB
  576. BNE AD1
  577. *input 4chr
  578. LDB #4
  579. AD2 BSR GETCHR
  580. CMPA #$0D
  581. BEQ AD3
  582. STA ,X+
  583. DECB
  584. BNE AD2
  585. *change hex
  586. LDB #2
  587. LEAY INADRS,PCR
  588. AD3 LEAX INBUF,PCR
  589. AD4 PSHS B
  590. LDD ,X++
  591. SUBA #$30
  592. CMPA #10
  593. BCS AD5
  594. SUBA #7
  595. AD5 LSLA
  596. LSLA
  597. LSLA
  598. LSLA
  599. STA ,Y
  600. SUBB #$30
  601. CMPB #10
  602. BCS AD6
  603. SUBB #7
  604. AD6 ADDB ,Y
  605. STB ,Y+
  606. PULS B
  607. DECB
  608. BNE AD4
  609. *get adrs
  610. LDX -2,Y
  611. RTS
  612. *
  613. INBUF FCB 0,0,0,0
  614. INADRS FCB 0,0
  615. *
  616. RCBKIN EQU *
  617. FCB 21 KEYIN
  618. FCB 0
  619. FDB DBAKIN
  620. FDB 00
  621. *
  622. DBAKIN FCB 0,0
  623. *
  624. RCBOUT EQU *
  625. FCB 20 OUTPUT
  626. FCB 0
  627. FDB DBAOUT
  628. FDB 0001
  629. *
  630. DBAOUT FCB 0,0
  631. *
  632. MDTTL1 FCC $0D,$0A,$0D,$0A,/ADDR: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF/
  633. FCC $0D,$0A,/---- ----------------------------------------------- ----------------/
  634. FCB 0
  635. MSKIN FCC $0D,$0A,/Keyin (Q:Quit, P:Prev page, S:Select address, else:Next page):/
  636. FCB 4
  637. MADRS FCC $0D,$0A,/Address ($xxxx) = $/
  638. FCB 4
  639.  
  640. END START

また、P-ROMに書き込むデータはF-BASICの機械語データ形式なので、先頭が 0x00,データサイズ(2bytes),書き込みアドレス(2bytes)の計5バイトで始まり、その後にデータ本体が続き、末尾が 0xFF,0x00,0x00,0x00,0x00の計5バイトで終わる形となります。
Windows上でデータファイルを8KB毎に分割し、上記の機械語形式に合わせて先頭と末尾に必要な各5バイトを追加するためのツールソフト spltdat.exeを作成しました。

以上より、私の場合のP-ROMに書き込む標準的な手順をまとめると、
(1)Windows上で書き込むバイナリデータを作成する。
(2)spltdat.exeで8KB単位のデータファイルに分割する。
        元ファイル ROMDAT --> 変換後ファイル ROMDAT1, ROMDAT2,...,ROMDAT8
(3)作成されたデータファイルをFM-7に転送する。
     転送手段としてはRS-232Cカードを使用できますが、それ以外にも思い付きハードでソフトに七転八倒さんによるFT-245使用の高速転送カードやArduinoMega2560使用のカードも使用できます。
(4)ドライバ PROMWRと書き込みデータを同じディスクに入れておいて、PROMWRを起動する。
(5)P-ROMの種類、書き込むブロック範囲、書き込みパルス幅を指定して書き込む。
以上です。
もちろんF-BASIC上で書き込みデータを直接作成して、そのまま書き込むこともできますが、その場合には$5000~$6FFFのバッファにデータを置き、一旦SAVEMで末尾にブロック番号を付けたファイル名で保存する必要があります。

作成した 書き込みソフトPROMWR, PWRSUBとツールspltdat.exeをOneDriveに置いておきます。なお、PROMWRはF-BASICのASCIIセーブ形式、PWRSUBは機械語データ形式になっていますので、そのままでF-BASICのディスクに保存できます。