日本橋電気街徘徊日誌

いいとしのおっさんがジャンク屋で買ったものをいじったり電子工作したりします。

FM-7のFDCエミュカードのバグもとれてないのにまた拡張カードを作った件(6809側コード等)

2018-08-20 23:24:10 | 電子工作


拡張BIOSと漢字ROMの隙間に置くローダーです。
ここまでの情報で基板は作成できると思いますが、コメント等で
リクエストいただければ一式をメール等でお送りできます。



ebios6.a

;

;Copyright (C) 2018 pakapoo http://blog.goo.ne.jp/purupoo. All rights reserved.
;
ORG $3000
;
; TEST MAIN
;
 LDX #RCB
 JSR READ
 RTS
;
 ORG $3010
 LDX #RCB
 JSR WRITE
 RTS
;
 ORG $3020
 LDX #RCB
 JSR [$FBFA]
 RTS
;
 ORG $30C0
RCB:FCB 10
RCBST:FCB 0
RCBADR:FDB $3100
RCBTRK:FCB 0
RCBSCT:FCB 1
RCBSID:FCB 0
RCBUNT:FCB 0
TSTST:FDB 0
 ORG $3C00
;
SPICD:EQU $FD08
SPIDT:EQU $FD09
STRD:EQU $D7
FTOB:EQU $53
B1RD:EQU $D1
B1WT:EQU $84
BTOF:EQU $83
APRW:EQU $58
;
;
SCOFST:EQU 128
ORGBIO:EQU $F17D
;
; BIOS EXTEND
;
 PSHS CC
 ORCC #$50
 LEAX ENDADR,PCR
 STX EASAVE,PCR
;
 LEAX BIOS,PCR
 LDY $33
 STY $DF
;
BIOL1:LDA ,X+
 STA ,Y+
 CMPX EASAVE,PCR
 BNE BIOL1
;
 CLR ,Y+
 STY $33
;
 PULS CC
;
;      CLRA
;      JSR  $8F32
 RTS
;
EASAVE:FDB 0
;
BIOS:EQU *
 PSHS CC,A,B,X,Y
 LDA ,X
 CMPA #8
 BNE BIOSL1
 BSR REST
 BRA BIOSEX
BIOSL1:CMPA #9
 BNE BIOSL2
 LBSR WRITE
 BRA BIOSEX
BIOSL2:CMPA #10
 BNE BIOSL3
 LBSR READ
 BRA BIOSEX
BIOSL3:EQU *
 PULS CC,A,B,X,Y
 JMP ORGBIO
;
;
;
;
;
BIOSEX:EQU *
 PULS CC,A,B,X,Y
 CLR 1,X
 RTS
;
;
REST:EQU *
;      CLR  1,X
 RTS
;
;
; DRIVE TABLE
DRVTBL:FCB 1,1,2,2
;
;
SPIWT:EQU *
 TST SPICD
 BMI SPIWT
 RTS
;
SSSEL:EQU *
 PSHS A,B
 LDA 7,X
 LEAY DRVTBL,PCR
 LEAY A,Y
 LDA ,Y
 STA SPICD
 PULS A,B
 RTS
;
;
RDYCHK:EQU *
 BSR SSSEL
;
 LDA #STRD
 STA SPIDT
 BSR SPIWT
 CLR SPIDT
 BSR SPIWT
 LDA SPIDT
;
 CLR SPICD
 RTS
;
;
; 4 BYTE COMMAND
;
CMD4:EQU *
 BSR SSSEL
;
 STA SPIDT
 BSR SPIWT
;
TST1:EQU *
 LDB 5,X
 DECB
 LEAY PNUM,PCR
 CLR 0,Y
 STB 1,Y
;
 LDB 6,X
 LDA #16
 MUL
 ADDD ,Y
 STD ,Y
;
 LDB 4,X
 LDA #32
 MUL
 ADDD ,Y
;
 ADDD #SCOFST
 TST 7,X
 BEQ CMDL1
 ADDD #1280
CMDL1:EQU *
;
;
 ANDA #$3F
 LSLB
 ROLA
;
 LSLB
 ROLA
;
 STA SPIDT
 BSR SPIWT
 STB SPIDT
 BSR SPIWT
 CLR SPIDT
 BSR SPIWT
;
 CLR SPICD
 RTS
;
;
PNUM:FCB 0
PNUML:FCB 0
;
;
CMD:EQU *
 BSR SSSEL
;
 STA SPIDT
 BSR SPIWT
 CLR SPIDT
 BSR SPIWT
 CLR SPIDT
 LBSR SPIWT
 CLR SPIDT
 LBSR SPIWT
 RTS
;
;
;
READ:EQU *
 LDA #FTOB
 BSR CMD4
READL2:LBSR RDYCHK
 CMPA #$AC
 BNE READL2
 LDA #B1RD
 BSR CMD
 CLRB
 LDY 2,X
READL1:EQU *
 CLR SPIDT
 LBSR SPIWT
 LDA SPIDT
 STA ,Y+
 DECB
 BNE READL1
 CLR SPICD
 RTS
;
;
WRITE:EQU *
 LDA #B1WT
 BSR CMD
 CLRB
 LDY 2,X
WTLP1:EQU *
 LDA ,Y+
 STA SPIDT
 LBSR SPIWT
 DECB
 BNE WTLP1
;
 CLR SPICD
;
 LDA #BTOF
 LBSR CMD4
WTLP2:EQU *
 LBSR RDYCHK
 CMPA #$AC
 BNE WTLP2
;
 LDA #APRW
 LBSR CMD4
WTLP3:EQU *
 LBSR RDYCHK
 CMPA #$AC
 BNE WTLP3
;
 CLR SPICD
 RTS
ENDADR:EQU *









spirom.a
ORG $3000
 LDA #1
 STA $FD08
 LDA #$03
 BSR SPI
 CLRA
 BSR SPI
 BSR SPI
 BSR SPI
 LDX #$2000
LP1:BSR SPI
 LDA $FD09
 STA ,X+
 CMPX #$4000
 BNE LP1
 CLR $FD08
 JSR $2000
;RTS
;NOP
;NOP
SPI:STA $FD09
SPIWT:LDB $FD08
 BMI SPIWT
 RTS
;
;
  B $FD08
 BMI SPIWT
 RTS


FM-7のFDCエミュカードのバグもとれてないのにまた拡張カードを作った件(ツール)

2018-08-18 23:42:12 | 電子工作

SPIフラッシュにDISK BASICと拡張BIOSとそのブートコードを
書き込みツールとディスクイメージをSPIフラッシュに書き込む
ツールです。

ファイル名: spi_t4
2300行から実行するとSPIフラッシュにDISK BASICと
拡張BIOSのローダーを書き込みます。
また、途中テストコードが入ってます。

100 CLEAR 300,&H1FFF
110 DEFINT A-Z
130 'main
140 GOSUB 1660
980 'GOTO 10
990 END
1000 '
1010 PRINT HEX$(PEEK(&HFD09));":";
1020 RETURN
1030 '
1040 'status register read(D7h)
1050 POKE &HFD08,1
1060 POKE &HFD09,&HD7
1070 POKE &HFD09,0
1080 ST1=PEEK(&HFD09)
1082 POKE &HFD09,0
1084 ST2=PEEK(&HFD09)
1090 'PRINT HEX$(ST1);":";HEX$(ST2)
1100 POKE &HFD08,0
1110 RETURN
1120 '
1130 '
1140 '
1150 '
1160 '
1170 '4 byte command
1180 POKE &HFD08,1
1190 POKE &HFD09,OPCD
1200 POKE &HFD09,PH
1210 POKE &HFD09,PL
1220 POKE &HFD09,0
1230 POKE &HFD08,0
1240 RETURN
1250 '
1260 'buffer write 1
1270 POKE &HFD08,1
1280 POKE &HFD09,&H84
1290 POKE &HFD09,0
1300 POKE &HFD09,BH
1310 POKE &HFD09,BL
1320 'FOR I=255 TO 0 STEP -1
1330 FOR I=0 TO 255
1340 'POKE &HFD09,I
1350 POKE &HFD09,&H39
1360 NEXT
1370 POKE &HFD08,0
1380 RETURN
1390 '
1400 'buffer read 1(low freq)
1410 POKE &HFD08,1
1420 POKE &HFD09,&HD1
1430 POKE &HFD09,0
1440 POKE &HFD09,BH
1450 POKE &HFD09,BL
1460 FOR I=0 TO 255
1470   POKE &HFD09,0
1480   POKE &H2000+I,PEEK(&HFD09)
1490 NEXT
1500 POKE &HFD08,0
1510 RETURN
1520 '
1530 'page 0 fill
1540 OPCD=&H53:PH=0:PL=0:GOSUB 1160
1550 GOSUB 1250
1560 OPCD=&H83:PH=0:PL=0:GOSUB 1160
1570 OPCD=&H58:PH=0:PL=0:GOSUB 1160
1580 RETURN
1590 '
1600 'page 0 read
1610 OPCD=&H53:PH=0:PL=4:GOSUB 1160
1620 GOSUB 1390
1630 RETURN
1640 '
1650 'manufacturer and devicd id read
1660 POKE &HFD08,1
1670 POKE &HFD09,&H9F
1680 POKE &HFD09,0:GOSUB 1000
1690 POKE &HFD09,0:GOSUB 1000
1700 POKE &HFD09,0:GOSUB 1000
1710 'POKE &HFD09,0:GOSUB 1000
1720 'POKE &HFD09,0:GOSUB 1000
1730 POKE &HFD08,0
1740 RETURN
1750 '
1760 'continuous array read(low freq)
1770 POKE &HFD08,1
1780 POKE &HFD09,&H3
1790 POKE &HFD09,0
1800 POKE &HFD09,0
1810 POKE &HFD09,0
1820 FOR ADR=&H2000 TO &H23FF
1830   POKE &HFD09,0
1840   POKE ADR,PEEK(&HFD09)
1850 NEXT
1860 RETURN
1870 '
1880 'BIOS DREAD set
1890 RESTORE
1900 READ PO$:ADR=&H2000
1910 WHILE(PO$ <> "end")
1920   PO=VAL("&H"+PO$)
1930   POKE ADR,PO
1940   ADR=ADR+1
1950   READ PO$
1960 WEND
1970 RETURN
1980 DATA 8e,20,08,ad,ff,fb,fa,39,end
1990 '
2000 'BIOS DREAD CALL
2010 POKE &H2008,10
2020 POKE &H2009,0
2030 POKE &H200A,BADR
2040 POKE &H200B,0
2050 POKE &H200C,TR
2060 POKE &H200D,SC
2070 POKE &H200E,HD
2080 POKE &H200F,0
2090 EXEC &H2000
2100 RETURN
2110 '
2120 'BIOS DREAD test
2130 GOSUB 1870
2140 TR=0:SC=15:HD=0:BADR=&H21
2150 GOSUB 1990
2160 RETURN
2170 '
2180 'fdd tr0 tr1 to $2000-$3fff
2190 GOSUB 1870
2200 TR=0
2210 BADR=&H30
2220 FOR HD=0 TO 1
2230 FOR SC=1 TO 16
2240 POKE &H200A,BADR
2250 GOSUB 1990
2260 BADR=BADR+1
2270 NEXT
2280 NEXT
2290 RETURN
2300 '
2310 'basic tr0 to spi
2320 PRINT "tr 0 read before"
2330 GOSUB 2170
2340 PRINT "tr 0 read after"
2350 '
2360 POKE &H3000,&H39
2370 LOADM "1:spi_b1.m",&H1000
2380 LOADM "1:ebios6.m"
2390 DST=&H3F00
2400 FOR I=&HFDC0 TO &HFDF4
2410   POKE DST,PEEK(I)
2420 ' PRINT HEX$(I)
2430   DST=DST+1
2440 NEXT
2450 POKE &H3F23,&H2C
2460 'END
2470 '
2480 PADR=&H3000
2490 FOR PL=0 TO 60 STEP 4
2500   PRINT PL
2510   OPCD=&H53:PH=0:GOSUB 1160
2520 ' GOSUB 1120
2530 '
2540 'buffer write 1
2550   POKE &HFD08,1
2560   POKE &HFD09,&H84
2570   POKE &HFD09,0
2580   POKE &HFD09,0
2590   POKE &HFD09,0
2600   FOR I=0 TO 527
2610   POKE &HFD09,PEEK(PADR)
2620   PADR=PADR+1
2630   NEXT
2640   POKE &HFD08,0
2650   OPCD=&H83:PH=0:GOSUB 1160
2660   PRINT "R/B":GOSUB 1040:IF ST1<>&HAC THEN 2680
2670   OPCD=&H58:PH=0:GOSUB 1160
2680   PRINT "R/B":GOSUB 1040:IF ST1<>&HAC THEN 2680
2690   OPCD=&H60:PH=0:GOSUB 1160
2700   PRINT "R/B":GOSUB 1040:IF ST1<>&HAC THEN 2680
2710 NEXT

ファイル名: SCTTST2
ディスクイメージをフラッシュメモリに書き込みます。
ドライブ選択はRCBのドライブをあらかじめ書き換えてから
実行することにより行います。

1000 DEFINT A-Z
1010 FOR TRK=0 TO 39
1020   POKE &H30C4,TRK
1030   FOR SID=0 TO 1
1040     POKE &H30C6,SID
1050     FOR SCT=1 TO 16
1060       POKE &H30C5,SCT
1065       PRINT USING " trk=## sid=# sct=##";TRK;SID;SCT
1070       EXEC &H3020
1080       EXEC &H3010
1090     NEXT
1100   NEXT
1110 NEXT


あとは拡張BIOSのソースと漢字ROMの隙間に置く
DISK BASICをロードするコードのソースですが、
これはEDASで書いてるので変換に手間取ってます。
明日以降掲載します。


FM-7のFDCエミュカードのバグもとれてないのにまた拡張カードを作った件(基板仕様)

2018-08-18 11:26:00 | 電子工作

基板の仕様を書いていなかったので書きます。

$fd08 SPI送出状況/SPI選択
読み込んでビット7が1なら転送中です。
TSTしてBMIで転送待ちループに使います。
ビット1・ビット0はSPIのセレクト線を示します。
00 SS0=1 SS1=1 SS2=1(選択なし)
01 SS0=0 SS1=1 SS2=1(SS0が選択)
10 SS0=1 SS1=0 SS2=1(SS1が選択)
11 SS0=1 SS1=1 SS2=0(SS2が選択)

$fd09 SPIデータ
書き込むとSPIに転送しつつデータが読み込まれます。
$fd08のフラグを見つつ読み書きします。


$fd20 漢字ROMアドレス上位8ビット
$fd21 漢字ROMアドレス下位8ビット
$fd22 漢字ROMデータ左側8ビット
$fd23 漢字ROMデータ右側8ビット
FM-7ユーザーズマニュアルシステム仕様の
漢字ROMカードと同じ機能を持ちます。


$fdc0~$fdff
漢字ROMの非漢字と漢字の隙間$73c0~$73f0の値が現れます。
漢字ROMの$6000~$73ffは空いているようなので
SPIにシリアルフラッシュメモリをつながない場合でも
小さいプログラムをこの隙間に焼いて利用することも可能です。

以上となります。


FM-7のFDCエミュカードのバグもとれてないのにまた拡張カードを作った件(基板資料その2)

2018-08-17 22:39:56 | 電子工作


Quartus II Version 9.0 Build 235 06/17/2009 Service Pack 2 SJ Web Edition
CHIP  "fm7-kanji"  ASSIGNED TO AN: EPM3128ATC100-10

Pin Name/Usage  : Location  : Dir.   : I/O Standard  : Voltage : I/O Bank  : User Assignment
-------------------------------------------------------------------------------------------------------------
RESERVED    : 1     :    :  :     :       :                
RESERVED    : 2     :    :  :     :       :                
VCCIO       : 3     : power  :  : 3.3V    :       :                
TDI         : 4     : input  : 3.3-V LVTTL   :     :       : N              
RESERVED    : 5     :    :  :     :       :                
RESERVED    : 6     :    :  :     :       :                
RESERVED    : 7     :    :  :     :       :                
RESERVED    : 8     :    :  :     :       :                
RESERVED    : 9     :    :  :     :       :                
RESERVED    : 10    :    :  :     :       :                
GND         : 11    : gnd    :  :     :       :                
RESERVED    : 12    :    :  :     :       :                
RESERVED    : 13    :    :  :     :       :                
RESERVED    : 14    :    :  :     :       :                
TMS         : 15    : input  : 3.3-V LVTTL   :     :       : N              
RESERVED    : 16    :    :  :     :       :                
RESERVED    : 17    :    :  :     :       :                
VCCIO       : 18    : power  :  : 3.3V    :       :                
RESERVED    : 19    :    :  :     :       :                
RESERVED    : 20    :    :  :     :       :                
RESERVED    : 21    :    :  :     :       :                
RESERVED    : 22    :    :  :     :       :                
RESERVED    : 23    :    :  :     :       :                
RESERVED    : 24    :    :  :     :       :                
RESERVED    : 25    :    :  :     :       :                
GND         : 26    : gnd    :  :     :       :                
EE          : 27    : input  : 3.3-V LVTTL   :     :       : Y              
EQ          : 28    : input  : 3.3-V LVTTL   :     :       : Y              
EAB[7]      : 29    : input  : 3.3-V LVTTL   :     :       : Y              
EAB[6]      : 30    : input  : 3.3-V LVTTL   :     :       : Y              
EAB[5]      : 31    : input  : 3.3-V LVTTL   :     :       : Y              
EAB[4]      : 32    : input  : 3.3-V LVTTL   :     :       : Y              
GND         : 33    : gnd    :  :     :       :                
VCCIO       : 34    : power  :  : 3.3V    :       :                
EAB[3]      : 35    : input  : 3.3-V LVTTL   :     :       : Y              
EAB[2]      : 36    : input  : 3.3-V LVTTL   :     :       : Y              
EAB[1]      : 37    : input  : 3.3-V LVTTL   :     :       : Y              
GND         : 38    : gnd    :  :     :       :                
VCCINT      : 39    : power  :  : 3.3V    :       :                
EAB[0]      : 40    : input  : 3.3-V LVTTL   :     :       : Y              
EDB[7]      : 41    : bidir  : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[10] : 42    : output : 3.3-V LVTTL   :     :       : Y              
GND         : 43    : gnd    :  :     :       :                
OKnjAdr[11] : 44    : output : 3.3-V LVTTL   :     :       : Y              
EDB[6]      : 45    : bidir  : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[9]  : 46    : output : 3.3-V LVTTL   :     :       : Y              
EDB[5]      : 47    : bidir  : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[8]  : 48    : output : 3.3-V LVTTL   :     :       : Y              
EDB[4]      : 49    : bidir  : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[13] : 50    : output : 3.3-V LVTTL   :     :       : Y              
VCCIO       : 51    : power  :  : 3.3V    :       :                
nEIOS       : 52    : input  : 3.3-V LVTTL   :     :       : Y              
GND         : 53    : gnd    :  :     :       :                
ERW         : 54    : input  : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[14] : 55    : output : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[0]  : 56    : output : 3.3-V LVTTL   :     :       : Y              
EDB[3]      : 57    : bidir  : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[1]  : 58    : output : 3.3-V LVTTL   :     :       : Y              
GND         : 59    : gnd    :  :     :       :                
OKnjAdr[2]  : 60    : output : 3.3-V LVTTL   :     :       : Y              
EDB[2]      : 61    : bidir  : 3.3-V LVTTL   :     :       : Y              
TCK         : 62    : input  : 3.3-V LVTTL   :     :       : N              
EDB[1]      : 63    : bidir  : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[3]  : 64    : output : 3.3-V LVTTL   :     :       : Y              
GND         : 65    : gnd    :  :     :       :                
VCCIO       : 66    : power  :  : 3.3V    :       :                
EDB[0]      : 67    : bidir  : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[4]  : 68    : output : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[5]  : 69    : output : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[6]  : 70    : output : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[7]  : 71    : output : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[12] : 72    : output : 3.3-V LVTTL   :     :       : Y              
TDO         : 73    : output : 3.3-V LVTTL   :     :       : N              
GND         : 74    : gnd    :  :     :       :                
OKnjAdr[15] : 75    : output : 3.3-V LVTTL   :     :       : Y              
OKnjAdr[16] : 76    : output : 3.3-V LVTTL   :     :       : Y              
nOKnjOE     : 77    : output : 3.3-V LVTTL   :     :       : Y              
GND         : 78    : gnd    :  :     :       :                
nOKnjCS     : 79    : output : 3.3-V LVTTL   :     :       : Y              
SCLK        : 80    : output : 3.3-V LVTTL   :     :       : Y              
SS0         : 81    : output : 3.3-V LVTTL   :     :       : Y              
VCCIO       : 82    : power  :  : 3.3V    :       :                
SS1         : 83    : output : 3.3-V LVTTL   :     :       : Y              
SS2         : 84    : output : 3.3-V LVTTL   :     :       : Y              
MOSI        : 85    : output : 3.3-V LVTTL   :     :       : Y              
GND         : 86    : gnd    :  :     :       :                
GCLK        : 87    : input  : 3.3-V LVTTL   :     :       : Y              
GND+        : 88    :    :  :     :       :                
nERESET     : 89    : input  : 3.3-V LVTTL   :     :       : Y              
GND+        : 90    :    :  :     :       :                
VCCINT      : 91    : power  :  : 3.3V    :       :                
MISO        : 92    : input  : 3.3-V LVTTL   :     :       : Y              
RESERVED    : 93    :    :  :     :       :                
LED5        : 94    : output : 3.3-V LVTTL   :     :       : Y              
GND         : 95    : gnd    :  :     :       :                
LED4        : 96    : output : 3.3-V LVTTL   :     :       : Y              
LED3        : 97    : output : 3.3-V LVTTL   :     :       : Y              
LED2        : 98    : output : 3.3-V LVTTL   :     :       : Y              
LED1        : 99    : output : 3.3-V LVTTL   :     :       : Y              
LED0        : 100   : output : 3.3-V LVTTL   :     :       : Y              




疲れたのでローダーや拡張BIOS、その他ツール類は
明日以降に掲載します。


FM-7のFDCエミュカードのバグもとれてないのにまた拡張カードを作った件(基板資料)

2018-08-17 21:57:32 | 電子工作


CPLDのソース(VHDL)は以下の通りです。
素人が独学でなんとなく書いたものなので
まともに勉強されている方からするとぼろぼろだと
思いますが暖かく見守ってアドバイスなどいただけると
ありがたいです。

MAX3128Aは5Vトレラントなので、基本的に
信号名に対応するFM-7の拡張バスのピンと
漢字ROMのピンにつないでいくだけです。

注意点はGCLKは使用するCPLDのグローバルクロックを
使用する。nERESETはCPLDのグローバルリセットを
使用する。SCLKはプルダウンする(CPLD起動時は0以外に
なってると誤動作のもと)。MISOはプルダウンする
(入力はフローティングになってると最悪壊れる)。
SCLKはノイズ取りに直列抵抗(1Kを入れました)や
小さなコンデンサ(22ピコFを入れました)をつなぐ。
バイパスコンデンサはつけられるだけつける。
ぐらいでしょうか。


GCLKに接続する発振器ですが、私は25MHzを使用しましたが
多少違っても問題ありません。
SPIには大概のものは接続できると思いますが、拡張BIOSでは
たまたま入手できたAT45DB161Dをターゲットとしていますので
他のSPIシリアルフラッシュでは動かないと思います。
ウェブでSPIシリアルフラッシュの用例を検索しましたが
どうやら普通は読み込みに03コマンド、書き込みに02コマンドを
使用するようですがAT45DB161Dは02コマンドがないため
AT45DB161D専用となっています。
ただ、AT45DB161D専用コードから03・02コマンドに書き直すのは
たいした手間ではないと思いますので興味のある方はチャレンジ
してみてください。


----------------------------------------------------------------------------------
--
-- FM-7 kanji-spi-loaderrom card
-- Copyright (C) 2018 pakapoo http://blog.goo.ne.jp/purupoo. All rights reserved.
--
--

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity top is
    Port (
        EAB            : in std_logic_vector(7 downto 0);
        EDB            : inout std_logic_vector(7 downto 0);
        EQ            : in std_logic;
        EE            : in std_logic;
        nEIOS        : in std_logic;
        nERESET        : in std_logic;
        ERW            : in std_logic;
--        nEEXTDET    : out std_logic;
--        nEIRQ        : inout std_logic;
--        CLK2p5        : in std_logic;
--
        OKnjAdr        : out std_logic_vector(16 downto 0);
        nOKnjCS        : out std_logic;
        nOKnjOE        : out std_logic;
--
        GCLK        : in std_logic;
        LED5        : out std_logic;
        LED4        : out std_logic;
        LED3        : out std_logic;
        LED2        : out std_logic;
        LED1        : out std_logic;
        LED0        : out std_logic;
--
        SCLK        : out std_logic;
        MISO        : in  std_logic;
        MOSI        : out std_logic;
        SS0            : out std_logic;
        SS1            : out std_logic;
        SS2            : out std_logic);
end top;

architecture Behavioral of top is


signal S_LED3    : std_logic;
signal S_LED0    : std_logic;



signal    S_EQ_trg    : std_logic_vector(1 downto 0);
signal    S_EQ_DBUF    : std_logic;
signal    S_EE_trg    : std_logic_vector(1 downto 0);
signal    S_EE_DBUF    : std_logic;
signal    S_BUS        : std_logic_vector(7 downto 0);


signal S_cnt    : std_logic_vector(20 downto 0);

signal S_KnjadrH    : std_logic_vector(7 downto 0);
signal S_KnjadrL    : std_logic_vector(7 downto 0);
signal S_OknjAdr0    : std_logic;
signal S_nOKnjOE    : std_logic;


--signal S_SPIC    : std_logic_vector(7 downto 0);
--signal S_SPIC_BUSY    : std_logic;
signal S_SPIC_SS    : std_logic_vector(1 downto 0);
signal S_SPID        : std_logic_vector(7 downto 0);
signal S_LED1        : std_logic;
constant LEDCNTWIDTH    : integer:=8;
constant LCWLN            : std_logic_vector(2 downto 0) := "000";
signal S_LEDCNT        : std_logic_vector(LEDCNTWIDTH downto 0);
signal S_LEDTRG        : std_logic;
signal S_LEDEND        : std_logic;
signal S_SS0        : std_logic;
signal S_SS1        : std_logic;
signal S_SS2        : std_logic;
signal S_SCLK        : std_logic;
signal S_MOSI        : std_logic;
signal S_MISO        : std_logic;
signal S_MISO_DBUF    : std_logic;
signal S_SPIDIN        : std_logic_vector(7 downto 0);

begin




-- EQトリガー取得
    process(GCLK) begin
        if(GCLK = '1' and GCLK'event) then
            S_EQ_trg(1)
            S_EQ_DBUF               S_EQ_trg(0)         end if;    
    end process;
-- EEトリガー取得
    process(GCLK) begin
        if(GCLK = '1' and GCLK'event) then
            S_EE_trg(1)
            S_EE_DBUF               S_EE_trg(0)         end if;    
    end process;

--    process(GCLK) begin
--        if(S_RESET = '0') then
--            S_cnt '0');
--            S_RESET <= '1';
--        elsif(GCLK = '1' and GCLK'event) then
--            S_cnt --            S_LED0 --        end if;    
--    end process;



--    FM-7から書き込まれた場合の対応
    process (GCLK,nERESET) begin
        if(nERESET = '0') then
            S_LED0 <= '0';
        elsif(GCLK = '1' and GCLK'event) then
            if(S_EQ_trg="10" and nEIOS='0' and ERW='0') then
                if(EAB = X"20") then
                    S_KnjadrH --                    S_LED3 <= '1';
                    S_LED0                 elsif(EAB = X"21") then
                    S_KnjadrL                 else
                end if;
            end if;
        end if;
    end process;
    process (GCLK,nERESET) begin
        if(nERESET = '0') then
            S_SPIC_SS <= "00";
            S_SPID --            S_LEDCNT '0');
            S_LEDTRG <= '0';
        elsif(GCLK = '1' and GCLK'event) then
            if(S_EQ_trg="10" and nEIOS='0' and ERW='0') then
                if(EAB = X"08") then
                    S_SPIC_SS                 elsif(EAB = X"09") then
                    S_SPID                     S_LEDTRG <= '1';
                else
                end if;
            end if;
            if(S_LEDEND = '1') then
                S_LEDTRG <= '0';
            end if;
        end if;
    end process;
    process (GCLK,nERESET) begin
        if(nERESET = '0') then
            S_LED1 <= '0';
            S_LEDCNT '0');
            S_LEDEND <= '0';
            S_SCLK <= '0';
            S_MOSI <= '0';
            S_SPIDIN '0');
        elsif(GCLK = '1' and GCLK'event) then
            if(S_LEDTRG = '1') then
                S_LED1 <= '1';
                if(S_LEDCNT = "000000"&LCWLN) then
                    S_MOSI                 elsif(S_LEDCNT = "000100"&LCWLN) then
                    S_SCLK <= '1';
                elsif(S_LEDCNT = "001000"&LCWLN) then
                    S_SPIDIN(7)                 elsif(S_LEDCNT = "001001"&LCWLN) then
                    S_SCLK <= '0';
                elsif(S_LEDCNT = "001010"&LCWLN) then
                    S_MOSI                 elsif(S_LEDCNT = "001011"&LCWLN) then
                    S_SCLK <= '1';
                elsif(S_LEDCNT = "001100"&LCWLN) then
                    S_SPIDIN(6)                 elsif(S_LEDCNT = "001101"&LCWLN) then
                    S_SCLK <= '0';
                elsif(S_LEDCNT = "001110"&LCWLN) then
                    S_MOSI                 elsif(S_LEDCNT = "001111"&LCWLN) then
                    S_SCLK <= '1';
                elsif(S_LEDCNT = "010000"&LCWLN) then
                    S_SPIDIN(5)                 elsif(S_LEDCNT = "010001"&LCWLN) then
                    S_SCLK <= '0';
                elsif(S_LEDCNT = "010010"&LCWLN) then
                    S_MOSI                 elsif(S_LEDCNT = "010011"&LCWLN) then
                    S_SCLK <= '1';
                elsif(S_LEDCNT = "010100"&LCWLN) then
                    S_SPIDIN(4)                 elsif(S_LEDCNT = "010101"&LCWLN) then
                    S_SCLK <= '0';
                elsif(S_LEDCNT = "010110"&LCWLN) then
                    S_MOSI                 elsif(S_LEDCNT = "010111"&LCWLN) then
                    S_SCLK <= '1';
                elsif(S_LEDCNT = "011000"&LCWLN) then
                    S_SPIDIN(3)                 elsif(S_LEDCNT = "011001"&LCWLN) then
                    S_SCLK <= '0';
                elsif(S_LEDCNT = "011010"&LCWLN) then
                    S_MOSI                 elsif(S_LEDCNT = "011011"&LCWLN) then
                    S_SCLK <= '1';
                elsif(S_LEDCNT = "011100"&LCWLN) then
                    S_SPIDIN(2)                 elsif(S_LEDCNT = "011101"&LCWLN) then
                    S_SCLK <= '0';
                elsif(S_LEDCNT = "011110"&LCWLN) then
                    S_MOSI                 elsif(S_LEDCNT = "011111"&LCWLN) then
                    S_SCLK <= '1';
                elsif(S_LEDCNT = "100000"&LCWLN) then
                    S_SPIDIN(1)                 elsif(S_LEDCNT = "100001"&LCWLN) then
                    S_SCLK <= '0';
                elsif(S_LEDCNT = "100010"&LCWLN) then
                    S_MOSI                 elsif(S_LEDCNT = "100011"&LCWLN) then
                    S_SCLK <= '1';
                elsif(S_LEDCNT = "100100"&LCWLN) then
                    S_SPIDIN(0)                 elsif(S_LEDCNT = "100101"&LCWLN) then
                    S_SCLK <= '0';
                elsif(S_LEDCNT = "110000"&LCWLN) then
                    S_LEDEND <= '1';
                elsif(S_LEDCNT = "110001"&LCWLN) then
                elsif(S_LEDCNT = "110010"&LCWLN) then
                elsif(S_LEDCNT = "110011"&LCWLN) then
                elsif(S_LEDCNT = "110100"&LCWLN) then
                elsif(S_LEDCNT = "110101"&LCWLN) then
                elsif(S_LEDCNT = "110110"&LCWLN) then
                elsif(S_LEDCNT = "110111"&LCWLN) then
                end if;
                S_LEDCNT             else
                S_LED1 <= '0';
                S_LEDEND <= '0';
                S_LEDCNT '0');
            end if;
        end if;
    end process;
    process (GCLK,nERESET) begin
        if(nERESET = '0') then
            S_SS0 <= '1';
            S_SS1 <= '1';
            S_SS2 <= '1';
        elsif(GCLK = '1' and GCLK'event) then
            if(S_SPIC_SS = "00") then
                S_SS0 <= '1';
                S_SS1 <= '1';
                S_SS2 <= '1';
            elsif(S_SPIC_SS = "01") then
                S_SS0 <= '0';
                S_SS1 <= '1';
                S_SS2 <= '1';
            elsif(S_SPIC_SS = "10") then
                S_SS0 <= '1';
                S_SS1 <= '0';
                S_SS2 <= '1';
            elsif(S_SPIC_SS = "11") then
                S_SS0 <= '1';
                S_SS1 <= '1';
                S_SS2 <= '0';
            else
                S_SS0 <= '1';
                S_SS1 <= '1';
                S_SS2 <= '1';
            end if;
        end if;
    end process;



    process(GCLK,nERESET) begin
        if(nERESET = '0') then
            S_LED3 <= '0';
        elsif(GCLK = '1' and GCLK'event) then
--        if(GCLK = '1' and GCLK'event) then
            if(nEIOS='0' and EAB=X"20") then
                S_LED3 <= '1';
            end if;
        end if;
    end process;







--    FM-7からの読み込みに対応
    process (GCLK) begin
        if(GCLK = '1' and GCLK'event) then
            if(S_EQ_trg="10" and nEIOS='0' and ERW='1') then
                if(EAB = X"20") then
                    S_BUS                 elsif(EAB = X"21") then
                    S_BUS                 elsif(EAB = X"08") then
                    S_BUS                 elsif(EAB = X"09") then
                    S_BUS                 elsif(EAB(7 downto 6) = "11") then

                else
                end if;
            end if;
        end if;
    end process;
    process (GCLK) begin
        if(GCLK = '1' and GCLK'event) then
            if(S_EQ_trg="10" and nEIOS='0' and ERW='1') then
                if(EAB = X"22") then
                    S_OKnjAdr0 <= '0';
                    S_nOKnjOE <= '0';
                elsif(EAB = X"23") then
                    S_OKnjAdr0 <= '1';
                    S_nOKnjOE <= '0';
                else
                    S_OKnjAdr0 <= '0';
                    S_nOKnjOE <= '1';
                end if;
            end if;
        end if;
    end process;


--    バスが0x18台以外の場合はハイインピーダンスにする
    EDB             else     "ZZZZZZZZ";

    LED5 <= '0';
    LED4 <= '0';


--    OKnjAdr     OKnjAdr                 else    S_KnjAdrH & S_KnjAdrL & S_OknjAdr0;
    
    nOKnjCS <= '0';
--    nOKnjOE <= '1';
--    nOKnjOE     nOKnjOE                 else    S_nOKnjOE;

    LED3     LED2 <= '0';
    LED1     LED0


    SCLK     MOSI --    S_MISO_DBUF --    S_MISO     S_MISO     SS0     SS1     SS2



end Behavioral;

 


ピンの割り当ては次の記事に掲載します。

 

 






FM-7のFDCエミュカードのバグもとれてないのにまた拡張カードを作った件

2018-08-17 20:59:14 | 電子工作

FM-7のFDCエミュカードのバグのバグ取りに非常に苦しんで
もう一年以上放置ですが、やっぱり漢字ROMぐらいはほしいなと
いうことで、3月ごろに漢字ROM機能だけ作りました。

最初は漢字ROM機能だけ載せたんですが、
ジャンクのPCIカードからはがしてきたMAX3128Aの
1/3くらいの容量しか使ってなくてもったいないので
SPIマスタ通信機能を載せました。
それでもまだまだ容量が余っているのでI/O 84/1に
掲載されている、I/O領域に小さなROMをマップして、
プログラムのローダを置く機能も載せました。
そこまでできたなら、そのローダを使用して
DISK BASICをSPIフラッシュから起動してやることも
可能だろうと思い、この連休にチャレンジしたところ、
あっさりできました。
BIOSを拡張する形なのでDE番地をコールしないものや
直接FDCを叩くものは全く動きませんが雑誌に載ってたような
ツール類やゲームはたいした問題もなく動くんじゃないかと
思います。
これはほぼCPLDとROMとフラッシュメモリをつなぐだけで
再現性も高そうなので同じものを作って楽しんでいただけたら
と思います。
(いないと思うけど、勝手に同じもの作って売るのはかんべんしてね)

 



$fdc0にローダーをマップしているのでそこから起動。

 

 


どこからでもいいからシステムディスクのC=0,H=0,R=15から
C=0,H=1,R=16までの5キロを$6e00から展開して$6e00から
実行すればディスクがつながっていなくても起動できるん
ですね。あとでOh!FMの過去記事を読み直してみれば
それを利用したRAMディスクの記事も見つかりましたが
最初はそんなことできるんだろうかという感じでしたが
あっさり起動しました。

 

 

次はBIOSを拡張します。
BASICの起動処理でディスクBASICなら$6e00まで、
ROM BASICなら$8000まで初期化するように指定するので
じゃあメモリの初期化を$6c00までにしておいて
そこにBIOSを拡張するプログラムを置いておこうかと
考えたのですが、なぜかメモリが$6e00付近まで初期化
されていないとBASIC起動時に暴走するので
BASICの起動処理の空き領域$6f00にBIOS拡張プログラムの
ローダを仕込むことにしました。
ここをコールするとBIOS拡張プログラムをSPIフラッシュから
読み込んでBIOSを拡張します。

 

拡張BIOSはBASICテキスト領域の前に配置しました。
最初は$7000から配置したのですが、起動後BASICに
戻ってこない前提で$7000-$7fffを破壊するプログラムは
ここにBIOSがあると動かないのでそうしました。
プログラム中の最後にROMのnewの処理に飛ばしてやれば
かっこいいんですが、私が参考にした本と私のFM-7では
newの位置が違っているようで暴走し、ROMのテーブルを
プログラムで調べて飛ばすのも面倒だったので
これでいいことにしました。


BIOSが拡張されたのでディスクが見えるようになりました。
BIOSが拡張されるまでディスクが接続されていないので
STARTUPは動きません。

 

 

いつものホバーアタックです。

 

DOH-Cのディスク版も動いてくれました。
設計データ等は次の記事で。