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部を示します。
- 1000 'PROM READ/WRITE PROGRAM FOR FM-7
- 1010 '
- 1020 WIDTH 80,25
- 1030 CLEAR ,&H47FF
- 1040 MADR=&H4800 :'store subroutine
- 1050 BUFTOP%=&H5000
- 1060 BUFEND%=&H7000 :'buffer size is 8KB
- 1070 POKE MADR+&H12,BUFTOP% \ &H100
- 1080 POKE MADR+&H13,BUFTOP% MOD &H100
- 1090 POKE MADR+&H14,BUFEND% \ &H100
- 1100 POKE MADR+&H15,BUFEND% MOD &H100
- 1110 PRINT:PRINT"Initializing..."
- 1120 'PIA INIT
- 1130 PIA=&HFD9C:PIADA=PIA:PIACA=PIA+1:PIADB=PIA+2:PIACB=PIA+3
- 1140 POKE PIACA,&H30 :'DDRA
- 1150 POKE PIACB,&H30 :'DDRB
- 1160 POKE PIADA,&HFF :'PORTA OUT
- 1170 POKE PIADB,&HFF :'PORTB OUT
- 1180 POKE PIACA,&H3C
- 1190 POKE PIACB,&H3C
- 1200 '
- 1210 CMD$="ITBPDERWVLSQ"
- 1220 ROMTYP$(0)="2716 ":ROMTYP$(1)="2732 ":ROMTYP$(2)="2764 "
- 1230 ROMTYP$(3)="27128":ROMTYP$(4)="27256":ROMTYP$(5)="27512"
- 1240 ROMNO%=3 :'default ROM type is 2764
- 1250 PWIDTH%=1 :'default write pulse width is 1ms
- 1260 BLKNO%=1 :'default block no
- 1270 LDFN$="ROMDAT"
- 1280 SVFN$="ROMDATS"
- 1290 '
- 1300 '===== SET PROGRAM CODE =====
- 1310 LOADM "PWRSUB" :'Load subroutine
- 1320 '
- 1330 '+++++ COMMAND INPUT +++++
- 1340 PRINT:PRINT "Command:"
- 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"
- 1360 PRINT "Command in: ";
- 1370 KIN$=INKEY$ :IF KIN$="" THEN 1370
- 1380 PRINT KIN$
- 1390 IF ASC(KIN$)>&H61 THEN KIN$=CHR$(ASC(KIN$)-&H20)
- 1400 CMD=INSTR(1,CMD$,KIN$)
- 1410 IF CMD=1 THEN GOSUB 1560 :GOTO 1340 :'Info
- 1420 IF CMD=2 THEN GOSUB 1640 :GOTO 1340 :'Type
- 1430 IF CMD=3 THEN GOSUB 1740 :GOTO 1340 :'Block
- 1440 IF CMD=4 THEN GOSUB 1960 :GOTO 1340 :'Pwidth
- 1450 IF CMD=5 THEN GOSUB 2880 :GOTO 1340 :'Dump
- 1460 IF CMD=6 THEN GOSUB 2030 :GOTO 1340 :'Erase
- 1470 IF CMD=7 THEN GOSUB 2110 :GOTO 1340 :'Read
- 1480 IF CMD=8 THEN GOSUB 2360 :GOTO 1340 :'Write
- 1490 IF CMD=9 THEN GOSUB 2620 :GOTO 1340 :'Verify
- 1500 IF CMD=10 THEN GOSUB 2930 :GOTO 1340 :'Load
- 1510 IF CMD=11 THEN GOSUB 2990 :GOTO 1340 :'Save
- 1520 IF CMD=12 THEN END :'Quit
- 1530 GOTO 1340
- 1540 '
- 1550 '===== INFORMATION =====
- 1560 PRINT:PRINT "ROM type is ";ROMTYP$(ROMNO%-1)
- 1570 PRINT "Block no (0:ALL) is";BLKNO%
- 1580 PRINT "Write pulse width is";PWIDTH%;"ms"
- 1590 PRINT "Load Filename is ";LDFN$
- 1600 PRINT "Save Filename is ";SVFN$
- 1610 RETURN
- 1620 '
- 1630 '===== SELECT ROM TYPE =====
- 1640 PRINT:PRINT "Select ROM: ";
- 1650 FOR I=0 TO 5
- 1660 PRINT USING "#!& &";I+1;")";ROMTYP$(I);
- 1670 NEXT
- 1680 PRINT
- 1690 INPUT "Input ROM no (1..6):";ROMNO%
- 1700 IF ROMNO%<1 OR ROMNO%>6 THEN 1690
- 1710 PRINT:PRINT "ROM type is ";ROMTYP$(ROMNO%-1)
- 1720 '
- 1730 '===== SELECT BLOCK NO =====
- 1740 PRINT:PRINT "Select Block No: "
- 1750 BLKNO%=1
- 1760 IF ROMNO%<=3 THEN PRINT "2716,32,64 is BlockNo=1" :GOTO 1860
- 1770 PRINT "Input block no (0:ALL,";
- 1780 ON ROMNO%-3 GOTO 1790,1810,1830
- 1790 INPUT "1-2):";KIN$
- 1800 IF KIN$<"0" OR KIN$>"2" THEN 1770 ELSE 1850
- 1810 INPUT "1-4):";KIN$
- 1820 IF KIN$<"0" OR KIN$>"4" THEN 1770 ELSE 1850
- 1830 INPUT "1-8):";KIN$
- 1840 IF KIN$<"0" OR KIN$>"8" THEN 1770 ELSE 1850
- 1850 BLKNO%=VAL(KIN$)
- 1860 POKE MADR+&H1B,ROMNO%-1
- 1870 RETURN
- 1880 '
- 1890 '===== SET VARIABLE =====
- 1900 POKE MADR+&H1A,PWIDTH%
- 1910 POKE MADR+&H1B,ROMNO%-1
- 1920 POKE MADR+&H1C,BLKNO%
- 1930 RETURN
- 1940 '
- 1950 '===== SET WRITE PULSE WIDTH =====
- 1960 PRINT:INPUT "Write pulse width (1..50ms): ";KIN$
- 1970 IF VAL(KIN$)<1 OR VAL(KIN$)>50 THEN 1960
- 1980 PWIDTH%=VAL(KIN$)
- 1990 POKE MADR+&H1A,PWIDTH%
- 2000 RETURN
- 2010 '
- 2020 '===== ERASE CHECK =====
- 2030 PRINT:PRINT "Erase checking"
- 2040 GOSUB 1900
- 2050 DEF USR1=MADR+3:'Erase check command
- 2060 A%=USR1(0) :'Exec command
- 2070 IF A%=0 THEN PRINT " Erase check complete!" ELSE PRINT " !!! not BLANK !!!"
- 2080 RETURN
- 2090 '
- 2100 '===== READ =====
- 2110 PRINT :PRINT "Reading BlockNo:"
- 2120 'set variable
- 2130 GOSUB 1900
- 2140 DEF USR2=MADR+6 :'Read command
- 2150 SVBLKNO%=BLKNO%
- 2160 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
- 2170 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
- 2180 'Read
- 2190 GOSUB 2250
- 2200 'Read end
- 2210 BLKNO%=SVBLKNO%
- 2220 IF A%=0 THEN PRINT "Read complete!"
- 2230 RETURN
- 2240 '
- 2250 'Read subroutine
- 2260 FOR I=STNO% TO MAXNO%
- 2270 BLKNO%=I
- 2280 PRINT BLKNO%;
- 2290 POKE MADR+&H1C,BLKNO%
- 2300 A%=USR2(0) :'Exec
- 2310 IF A%=0 THEN PRINT ELSE PRINT " !!! Read ERROR !!!"
- 2320 NEXT
- 2330 RETURN
- 2340 '
- 2350 '===== WRITE =====
- 2360 PRINT:PRINT "Writing BlockNo:"
- 2370 'set variable
- 2380 GOSUB 1900
- 2390 DEF USR3=MADR+9:'Write command
- 2400 SVBLKNO%=BLKNO%
- 2410 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
- 2420 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
- 2430 'Write
- 2440 GOSUB 2500
- 2450 'Write end
- 2460 BLKNO%=SVBLKNO%
- 2470 IF A%=0 THEN PRINT "Write complete!"
- 2480 RETURN
- 2490 '
- 2500 'Write subroutine
- 2510 FOR I=STNO% TO MAXNO%
- 2520 BLKNO%=I
- 2530 PRINT BLKNO%;
- 2540 POKE MADR+&H1C,BLKNO%
- 2550 LOADM LDFN$+HEX$(BLKNO%)
- 2560 A%=USR3(0) :'Exec
- 2570 IF A%=0 THEN PRINT ELSE PRINT " !!! Write ERROR !!!"
- 2580 NEXT
- 2590 RETURN
- 2600 '
- 2610 '===== VERIFY =====
- 2620 PRINT:PRINT "Verifying BlockNo:"
- 2630 'set variable
- 2640 GOSUB 1900
- 2650 DEF USR4=MADR+12 :'Verify command
- 2660 SVBLKNO%=BLKNO%
- 2670 IF ROMNO%<=3 THEN MAXNO%=1 ELSE MAXNO%=2^(ROMNO%-3)
- 2680 IF BLKNO%=0 THEN STNO%=1 ELSE STNO%=BLKNO% :MAXNO%=BLKNO%
- 2690 'Verify
- 2700 GOSUB 2760
- 2710 'Verify end
- 2720 BLKNO%=SVBLKNO%
- 2730 IF A%=0 THEN PRINT "Verify complete!"
- 2740 RETURN
- 2750 '
- 2760 'Verify subroutine
- 2770 FOR I=STNO% TO MAXNO%
- 2780 BLKNO%=I
- 2790 PRINT BLKNO%;
- 2800 POKE MADR+&H1C,BLKNO%
- 2810 LOADM LDFN$+HEX$(BLKNO%)
- 2820 A%=USR4(0) :'Exec
- 2830 IF A%=0 THEN PRINT ELSE PRINT " !!! Verify ERROR !!!"
- 2840 NEXT
- 2850 RETURN
- 2860 '
- 2870 '===== Memory Dump =====
- 2880 DEF USR5=MADR+15 'Buffer dump command
- 2890 A%=USR5(0) :'Exec
- 2900 RETURN
- 2910 '
- 2920 '===== Load from File =====
- 2930 INPUT "Load Filename (except block no):";LDFN$
- 2940 PRINT "Load for BlockNo:";BLKNO%
- 2950 LOADM LDFN$+HEX$(BLKNO%)
- 2960 RETURN
- 2970 '
- 2980 '===== Save to File =====
- 2990 INPUT "Save Filename (except block no):";SVFN$
- 3000 PRINT "Save for BlockNo:";BLKNO%
- 3010 SAVEM SVFN$+HEX$(BLKNO%),BUFTOP%,BUFEND%,&H0
- 3020 RETURN
- 3030 '
- 3040 END
機械語サブルーチン部を示します。
- *
- * PROMSUB
- *
- * PROM Read/Write subroutine for FM-7
- *
- * argument of USR function
- * MADR+&H17 :PWIDTH
- * MADR+&H18 :ROMNO-1
- * MADR+&H19 :BLKNO
- *
- * First version Ver 1.0 '2020.10.10
- * Original FLEX9 version '2020.09.13
- * Copyright by Y.Yamamoto
- *
- BIOS EQU $FBFA ;F-Basic bios
- PIA EQU $FD9C
- PIADA EQU PIA ;ADRSH,ADRSL,DATA
- PIACA EQU PIA+1
- PIADB EQU PIA+2 ;PB5:VPPCNT,PB4:OE,PB3:CE,PB1:AHI,PB0:ALO for 2716,32,256,512
- * ;PB5:VPPCNT,PB4:OE,PB3:PGM,PB2:CE:PB1:AHI,PB0:ALO for 2764,128
- PIACB EQU PIA+3
- *
- ORG $4800
-
- START EQU *
- LBRA SETPRM point by USR0() ;+0
- LBRA CERASE point by USR1() ;+3
- LBRA CREAD point by USR2() ;+6
- LBRA CWRITE point by USR3() ;+9
- LBRA CVERIFY point by USR4() ;+12
- LBRA CDUMP point by USR5() ;+15
- *
- BUFTOP FDB $5000 ;start addr
- BUFEND FDB $7000 ;end addr
- STADR FDB 0000 ;page top addr
- EDADR FDB 0000 ;page end addr
- PWIDTH FCB 01 ;PWIDTH:write pulse length (default 1ms)
- ROMNO FCB 00 ;ROMNO-1 (0..5)
- BLKNO FCB 00 ;BLKNO (0,1..8)
- DATCNT FCB 00 ;data count for disp
- CPARA1 FCB 00 ;cmd parameter(9bytes)
- CPARA2 FCB 00
- CPARA3 FCB 00
- CPARA4 FCB 00
- CPARA5 FCB 00
- CPARA6 FCB 00
- CPARA7 FCB 00
- CPARA8 FCB 00
- CPARA9 FCB 00
- *
- *------------------------------
- * get parameter & set read param
- *------------------------------
- GETPRM EQU *
- PSHS B,X
- LDB ROMNO ;ROMNO-1 (0..5)
- LEAX PARARD,PCR
- LSLB
- LSLB x4
- ABX
- LDB #4 ;counter
- BSR SETPRM
- PULS B,X,PC
- *
- *------------------------------
- * set read/write parameter
- * B:counter
- * X:adr of CPARARD or CPARAWR
- *------------------------------
- SETPRM EQU *
- PSHS A,Y
- LEAY CPARA1,PCR
- SR1 LDA ,X+
- STA ,Y+
- DECB
- BNE SR1
- PULS A,Y,PC
- *
- *read,verify,erase parameter
- PARARD EQU *
- FCB $28,$2A,$2B,$23 ;for 2716
- FCB $28,$2A,$2B,$23 ;for 2732
- FCB $20,$22,$23,$2B ;for 2764
- FCB $20,$22,$23,$2B ;for 27128
- FCB $28,$2A,$2B,$23 ;for 27256
- FCB $28,$2A,$2B,$23 ;for 27512
- *
- *write parameter
- PARAWR EQU *
- FCB $10,$12,$13,$13,$1B,$13,$13,$03,$13 ;for 2716
- FCB $28,$2A,$2B,$0B,$03,$0B,$2B,$23,$2B ;for 2732
- FCB $1C,$1E,$1F,$1B,$13,$1B,$1B,$0B,$1B ;for 2764
- FCB $1C,$1E,$1F,$1B,$13,$1B,$1B,$0B,$1B ;for 27128
- FCB $38,$3A,$3B,$1B,$13,$1B,$1B,$0B,$1B ;for 27256
- FCB $28,$2A,$2B,$0B,$03,$0B,$2B,$23,$2B ;for 27512
- *
- *------------------------------
- * set start & end adrs
- * 2716,32,64 :whole rom(2k,4k,8k)
- * 27128,256,512 :8k(block specified by BLKNO)
- *
- * STADR decided by BLKNO
- *------------------------------
- SETADR EQU *
- PSHS A,B,X
- LDX #0
- STX STADR
- STX EDADR
- LDB BLKNO ;BLKNO
- BEQ SE1
- DECB
- LDA #$20 ;8kb
- MUL
- EXG A,B
- STD STADR
- STD EDADR
- SE1 LDA #$08 ;2kb
- LDB ROMNO ;ROMNO-1
- BEQ SE2 ;2716 2kb
- LSLA
- DECB
- BEQ SE2 ;2732 4kb
- LSLA else ;8kb
- SE2 ADDA EDADR
- STA EDADR ;2k,4,8k
- *set bufend
- LDA #$58 ;$5000+2k
- LDB ROMNO ;ROMNO-1
- BEQ SE3 ;if 2716
- ADDA #$08 ;4k
- DECB
- BEQ SE3 ;if 2732
- ADDA #$10 ;8k
- SE3 STA BUFEND ;2k,4k,8k
- PULS A,B,X,PC
- *
- *============================
- * ERASE CHECK all ROM area
- *============================
- CERASE EQU *
- *set read parameter
- PSHS X ;save for return parameter
- *get param & set read param
- LBSR GETPRM
- *set start & end adrs
- LDX #0
- STX STADR ;start adrs is 0
- STX EDADR
- LDB ROMNO ;ROMNO-1
- INCB ROMNO
- LDA #$04 ;assume 1k
- CE0 LSLA
- DECB
- BNE CE0
- STA EDADR ;2k,4k,8k,16k,32k,64k
- *
- *erase check
- LDX STADR
- LDY EDADR
- CE1 LDA CPARA1
- STA PIADB
- *ADRS SET
- TFR X,D ;read adrs
- STA PIADA ;adrsH
- LDA CPARA2
- STA PIADB ;adrsH set
- STB PIADA ;adrsL
- LDA CPARA3
- STA PIADB ;adrsL set
- *READ DATA & CHECK
- LDA CPARA4
- STA PIADB ;ce:H->L
- LDA #$FF
- STA PIADA ;change to input mode
- LDA PIADA ;read data
- CMPA #$FF ;blank data?
- BNE CERERR
- LEAX 1,X
- LEAY -1,Y
- BHI CE1
- CLRA ;no error
- CEEND
- PULS X
- STA 2,X
- STA 3,X
- RTS
- *
- CERERR
- LDA #-1 ;error
- BRA CEEND
- *
- *============================
- * READ DATA of 1 block
- *============================
- CREAD EQU *
- *set read parameter
- PSHS X save for return parameter
- *get param & set read param
- LBSR GETPRM
- *
- *set start & end adrs
- CR0 LBSR SETADR
- *read data
- LDX STADR
- LDY BUFTOP
- *
- CR1 BSR DSPCNT
- LDA CPARA1
- STA PIADB
- *ADRS SET
- TFR X,D ;read adrs
- STA PIADA ;adrsH
- LDA CPARA2
- STA PIADB ;adrsH set
- STB PIADA ;adrsL
- LDA CPARA3
- STA PIADB ;adrsL set
- *READ DATA
- LDA CPARA4
- STA PIADB ;ce:H->L
- LDA #$FF
- STA PIADA ;change to input mode
- LDA PIADA ;read data
- STA ,Y+
- LEAX 1,X
- BEQ CR2 ;for EDADR=0 (27512)
- CMPY BUFEND
- BLO CR1
- CR2 CLRA ;no error
- PULS X
- STA 2,X
- STA 3,X
- RTS
- *
- *-------------------------
- * DISP READ/WRITE COUNTER
- *-------------------------
- DSPCNT EQU *
- PSHS A,B,X
- TFR X,D
- TSTB
- BNE DSPEND
- LDA #'.
- JSR PUTCHR
- DSPEND PULS A,B,X,PC
- *
- *============================
- * WRITE DATA of 1 block
- *============================
- CWRITE EQU *
- PSHS X ;SAVE for return parameter
- LDB ROMNO ;ROMNO-1
- PSHS B
- LEAX PARAWR,PCR
- LSLB
- LSLB
- LSLB x8
- ABX
- PULS B
- ABX x9
- LDB #9 ;counter
- LBSR SETPRM
- *set start & end adrs
- CW0 LBSR SETADR
- *write data
- LDX STADR
- LDY BUFTOP
- *
- CW1 BSR DSPCNT
- LDA CPARA1
- STA PIADB ;start
- *ADRS SET
- TFR X,D
- STA PIADA ;adrsH
- LDA CPARA2
- STA PIADB ;adrsH set
- STB PIADA ;adrsL
- LDA CPARA3
- STA PIADB ;adrsL set
- LDA ,Y
- CMPA #$FF ;if $ff then skip
- BEQ CW4
- STA PIADA ;data
- LDA CPARA4
- STA PIADB ;data set
- *WRITE PULSE
- LDB PWIDTH ;write pulse width
- LDA CPARA5
- STA PIADB ;write pulse
- PSHS X
- CW2 LDX #256
- CW3 LEAX -1,X
- BNE CW3
- DECB
- BNE CW2
- PULS X
- LDA CPARA6 ;end write pulse
- STA PIADB
- LDA CPARA7 ;gap
- STA PIADB
- *DATA READ for VERIFY
- LDA CPARA8
- STA PIADB ;verify
- LDA #$FF
- STA PIADA ;change to input mode
- LDA PIADA ;data read
- CMPA ,Y
- BNE CWERR
- LDA CPARA9
- STA PIADB ;end verify
- CW4 LEAY 1,Y
- LEAX 1,X
- BEQ CW5 ;for EDADR=0 (27512)
- CMPY BUFEND
- BLO CW1
- CW5 CLRA ;no error
- CWEND
- PULS X
- STA 2,X
- STA 3,X
- LDA #$38 ;VPP=0,OE,CE=H
- STA PIADB
- RTS
- *
- CWERR LDA #-1
- BRA CWEND
- *
- *============================
- * VERIFY DATA of 1 block
- * compare ROM(STADR-EDADR) and BUF(TOP-END)
- *============================
- CVERIFY EQU *
- *set read parameter
- PSHS X ;save for return parameter
- *get param & set read param
- LBSR GETPRM
- *set start & end adrs
- CV0 LBSR SETADR
- *verify check
- LDX STADR
- LDY BUFTOP
- *
- CV1 LBSR DSPCNT
- LDA CPARA1
- STA PIADB
- *ADRS SET
- TFR X,D ;read adrs
- STA PIADA ;adrsH
- LDA CPARA2
- STA PIADB ;adrsH set
- STB PIADA ;adrsL
- LDA CPARA3
- STA PIADB ;adrsL set
- *READ DATA & CHECK
- LDA CPARA4
- STA PIADB ;ce:H->L
- LDA #$FF
- STA PIADA ;change to input mode
- LDA PIADA ;read data
- CMPA ,Y+ ;match data?
- BNE CVERR
- LEAX 1,X
- BEQ CV2 ;for EDADR=0 (27512)
- CMPY BUFEND
- BLO CV1
- CV2 CLRA ;no error
- CVEND
- PULS X
- STA 2,X
- STA 3,X
- RTS
- *
- CVERR
- LDA #-1 ;error
- BRA CVEND
- *
- *============================
- * DUMP BUFFER DATA
- *============================
- CDUMP EQU *
- LBSR PCRLF
- LDX BUFTOP
- STX STADR
- MDMP0 LBSR DSPTTL
- LDX STADR
- LDB #16
- STB DATCNT ;data cntr in line
- MDMP1 STX STADR
- PSHS B
- LEAX STADR,PCR
- LBSR OUTADR
- LDA #':
- LBSR PUTCHR
- LDA #$20
- LBSR PUTCHR
- * display hexa data
- LDX STADR
- LDB DATCNT
- LBSR HEXDSP
- LDB DATCNT
- * display ascii data
- LDX STADR
- LDB DATCNT
- LBSR ASCDSP
- STX STADR ;set new start addr
- LBSR PCRLF
- * page ?
- PULS B
- DECB
- BNE MDMP1
- *
- MD1 LDX STADR
- CMPX BUFEND
- BLO MD2
- MDEND LBSR PCRLF
- RTS
- *
- MD2 LEAX MSKIN,PCR
- LBSR PSTRNG
- LBSR GETCHR
- ANDA #$DF
- CMPA #'Q quit?
- BEQ MDEND
- CMPA #'P Prev page?
- BEQ MD5
- CMPA #'S Set address?
- BNE MD4
- MD3 LEAX MADRS,PCR
- LBSR PSTRNG
- LBSR ADRIN
- CMPX BUFTOP
- BLO MD3
- PSHS X
- LEAX -$100,X
- CMPX BUFEND
- PULS X
- BHS MD3
- TFR X,D
- CLRB
- TFR D,X
- STX STADR
- MD4 LBRA MDMP0
- *
- MD5 LDX STADR
- LEAX -$200,X
- CMPX BUFTOP
- BMI MD6
- BRA MD7
- MD6 LEAX $100,X
- MD7 STX STADR
- BRA MD4
- *
- *--------------------
- * display title
- DSPTTL EQU *
- LEAX MDTTL1,PCR
- BSR OUTSTR
- DEND BSR PCRLF
- RTS
- *--------------------
- * hexa data disp of 1 line
- * B:counter
- HEXDSP
- BSR OUTHEX
- LDA #$20
- BSR PUTCHR
- DECB
- BNE HEXDSP
- RTS
- *--------------------
- * ascii data disp of 1 line
- * B:counter
- ASCDSP LDA ,X+
- CMPA #$20
- BHS ADSP1
- LDA #'.
- BRA ADSP2
- ADSP1 CMPA #$7F
- BLS ADSP2
- LDA #'.
- ADSP2
- BSR PUTCHR
- DECB
- BNE ASCDSP
- RTS
- *
- *--------------------
- OUTSTR EQU *
- OU1 LDA ,X+
- BEQ OUEND
- BSR PUTCHR
- BRA OU1
- OUEND RTS
- *
- *--------------------
- * display split line
- VSPLN
- LDB #57 display split line
- LDA #'-
- VSP BSR PUTCHR
- DECB
- BNE VSP
- BSR PCRLF
- RTS
- *
- *--------------------
- GETCHR EQU *
- PSHS X,Y
- LEAX RCBKIN,PCR
- LEAY DBAKIN,PCR
- STY 2,X
- GE1 JSR [BIOS]
- LDA DBAKIN+1
- BEQ GE1
- LDA DBAKIN
- PULS X,Y
- *
- PUTCHR EQU *
- PSHS X,Y
- LEAX RCBOUT,PCR
- LEAY DBAOUT,PCR
- STY 2,X
- STA 6,X
- JSR [BIOS]
- PULS X,Y,PC
- *
- PCRLF EQU *
- LDA #$0D
- BSR PUTCHR
- LDA #$0A
- BSR PUTCHR
- RTS
- *
- PSTRNG EQU *
- PS1 LDA ,X+
- CMPA #4
- BEQ PS2
- BSR PUTCHR
- BRA PS1
- PS2 RTS
- *
- OUTHEX EQU *
- LDA ,X+
- PSHS A
- ANDA #$F0
- LSRA
- LSRA
- LSRA
- LSRA
- BSR PHEX
- PULS A
- ANDA #$0F
- BSR PHEX
- RTS
- *
- PHEX EQU *
- CMPA #10
- BCS PH1
- ADDA #7
- PH1 ADDA #$30
- BSR PUTCHR
- RTS
- *
- OUTADR EQU *
- BSR OUTHEX
- BSR OUTHEX
- RTS
- *
- ADRIN EQU *
- *clear buffer
- LEAX INBUF+6,PCR
- LDB #6
- CLRA
- AD1 STA ,-X
- DECB
- BNE AD1
- *input 4chr
- LDB #4
- AD2 BSR GETCHR
- CMPA #$0D
- BEQ AD3
- STA ,X+
- DECB
- BNE AD2
- *change hex
- LDB #2
- LEAY INADRS,PCR
- AD3 LEAX INBUF,PCR
- AD4 PSHS B
- LDD ,X++
- SUBA #$30
- CMPA #10
- BCS AD5
- SUBA #7
- AD5 LSLA
- LSLA
- LSLA
- LSLA
- STA ,Y
- SUBB #$30
- CMPB #10
- BCS AD6
- SUBB #7
- AD6 ADDB ,Y
- STB ,Y+
- PULS B
- DECB
- BNE AD4
- *get adrs
- LDX -2,Y
- RTS
- *
- INBUF FCB 0,0,0,0
- INADRS FCB 0,0
- *
- RCBKIN EQU *
- FCB 21 KEYIN
- FCB 0
- FDB DBAKIN
- FDB 00
- *
- DBAKIN FCB 0,0
- *
- RCBOUT EQU *
- FCB 20 OUTPUT
- FCB 0
- FDB DBAOUT
- FDB 0001
- *
- DBAOUT FCB 0,0
- *
- MDTTL1 FCC $0D,$0A,$0D,$0A,/ADDR: +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 0123456789ABCDEF/
- FCC $0D,$0A,/---- ----------------------------------------------- ----------------/
- FCB 0
- MSKIN FCC $0D,$0A,/Keyin (Q:Quit, P:Prev page, S:Select address, else:Next page):/
- FCB 4
- MADRS FCC $0D,$0A,/Address ($xxxx) = $/
- FCB 4
-
- 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のディスクに保存できます。