ここから本文です
Dr.Kikkie (KIKI) : 不許無断天才|免責:本稿を真に受けて損害があっても知らん。

書庫全体表示

記事検索
検索
えいやっと!今度はBASICのプログラムのアップロード・テスト。
BASICはTABを使ってないから、勝手に書式を書き換えられる心配はないかな?
でも半角スペースが2個以上続いたら1個になるとかないかな?

内容は、ん〜〜、ご覧のとおりです。いかにもデバッグ中でしょ?w
いつになったら満足に動くのでしょうね。←他人事モード

1000 '==================
1010 'SD3.BAS
1020 '==================
1030 SAVE "SD3.BAS"
1040 SCREEN0:KEY OFF:KEY1,"_SYSTEM"+CHR$(13)
1050 CLEAR 100,&HBFFF:DEFINT A-Z
1060 BLOAD "SD3.OBJ"
1070 DEFUSR0=&HC000:DEFUSR1=&HC003
1080 PRINT"R/W?";:I$=INPUT$(1):PRINT I$:I=INSTR("RrWw",I$):IF I=0 THEN 1080
1090 IF(I=1)OR(I=2)THEN GOSUB 1110:ELSE GOSUB 1270
1100 GOTO 1060
1110 '
1120 N=0:INPUT "ARG1";N:POKE &HC00D,N
1130 N=0:INPUT "ARG2";N:POKE &HC00E,N
1140 N=0:INPUT "ARG3";N:POKE &HC00F,N
1150 D=USR0(0)
1160 PRINT "CMD_0RES:";RIGHT$("0"+HEX$(PEEK(&HC006)),2)
1170 PRINT "CMD_1RES:";RIGHT$("0"+HEX$(PEEK(&HC007)),2)
1180 PRINT "CMD16RES:";RIGHT$("0"+HEX$(PEEK(&HC008)),2)
1190 PRINT "CMD17RES:";RIGHT$("0"+HEX$(PEEK(&HC009)),2)
1200 PRINT "CMD17STB:";RIGHT$("0"+HEX$(PEEK(&HC00C)),2)
1210 PRINT
1220 FOR I=0 TO 511
1230   C=PEEK(&HC013+I):IF(C<32)OR(C=127)THEN C$="." ELSE C$=CHR$(C)
1240   PRINT C$;
1250 NEXT I
1260 PRINT:PRINT:RETURN
1270 '
1280 'N=0:INPUT "ARG1";N:POKE &HC00D,N
1290 'N=0:INPUT "ARG2";N:POKE &HC00E,N
1300 'N=0:INPUT "ARG3";N:POKE &HC00F,N
1310 'N$="":INPUT "CHAR";N$:POKE &HC011,ASC(N$)
1320 D=USR1(0)
1330 'PRINT "CMD_0RES:";RIGHT$("0"+HEX$(PEEK(&HC006)),2)
1340 'PRINT "CMD_1RES:";RIGHT$("0"+HEX$(PEEK(&HC007)),2)
1350 'PRINT "CMD16RES:";RIGHT$("0"+HEX$(PEEK(&HC008)),2)
1360 'PRINT "CMD24RES:";RIGHT$("0"+HEX$(PEEK(&HC00A)),2)
1370 'PRINT "CMD24DRS:";RIGHT$("0"+HEX$(PEEK(&HC00B)),2)
1380 'FOR I=0 TO 511
1390 '  C=PEEK(&HC013+I):IF(C<32)OR(C=127)THEN C$="." ELSE C$=CHR$(C)
1400 '  PRINT C$;
1410 'NEXT I
1420 'PRINT:PRINT:RETURN
2000 FOR A1=0 TO &HFF
2010   FOR A2=0 TO &HFF
2020     FOR A3=1 TO &HFE STEP2
2030       POKE &H11,65
2040       D=USR1(0)
2050     NEXT A3
2060   NEXT A2
2070 NEXT A1
2080 END

えいや!っと。まだデバッグ中ですが、アップロードのテストしてみました。
ここにアップロードするとTABが半角スペースに変換されるので、コメントなどに半角スペースを使わないようにしました。いったんメモ帳などにコピーして、半角スペースをTABに置換したら元に戻るかな?と。
【追記】やってみると、そう簡単にはいかないようで。
でもASM.COMにはかけられるかもしんまい。

内容について。
コマンドレスポンスは正常に戻りますが、実際に読み書きできていないようです。ダメじゃん?CLKの上げ下げに問題があるのかなと試行錯誤中であります。

;===========================
;SD3.ASM
;
;ASM_SD2.ASM_XCD/B->SD2.OBJ
;Use_J-PORT_B
;(C)KIKI_2015
;===========================
PSGA EQU 0A0H ;PSG_R/W_ADRS
PSGW EQU 0A1H ;PSG_Write
PSGR EQU 0A2H ;PSG_Read
DO EQU 0 ;DO(#14-0)B-1pin
CS EQU 2 ;CS(#15-2)B-6pin
DIN EQU 3 ;DIN(#15-3)B-7pin
CLK EQU 5 ;CLK(#15-5)B-8pin
JPTB EQU 6 ;JPort-B(#15-6)
BREAKX EQU 000B7H ;BIOS_Ctrl+STOP
BDOS EQU 0F37DH ;BDOS_Call
WAIT EQU 01H ;WaitLoop
 ORG 0C000H
MAIN:;----------
 JP SDR ;USR0      =C000H
 JP SDW ;USR1      =C003H
;WORK----------
CMD0RS: DEFB 0FFH ;CMD0Res   =C006H
CMD1RS: DEFB 0FFH ;CMD1Res   =C007H
CMD16R: DEFB 0FFH ;CMD16Res  =C008H
CMD17R: DEFB 0FFH ;CMD17Res  =C009H
CMD24R: DEFB 0FFH ;CMD24Res  =C00AH
C24DR: DEFB 0FFH ;CMD24DR   =C00BH
STTBYT: DEFB 0FFH ;CMD17Start=C00CH
USRAG1: DEFB 00H ;USR_ARG1  =C00DH
USRAG2: DEFB 00H ;USR_AUG2  =C00EH
USRAG3: DEFB 00H ;USR_AUG3  =C00FH
USRAG4: DEFB 00H ;USR_AUG4  =C010H
CHAR: DEFB 40H ;WritDATA  =C011H
C24STB: DEFB 0FEH ;CMD24STB  =C012H
BUFF: DEFS 512 ;BUFF      =C013H
CRC: DEFS 2 ;BUFF_CRC
PSG0: DEFS 1 ;PSG_OrgData
PSG1: DEFS 1 ;PSG_NewData
CMD0: DEFB 40H,00H,00H,00H,00H,095H
CMD1: DEFB 41H,00H,00H,00H,00H,0F9H
CMD16: DEFB 50H,00H,00H,02H,00H,00H
CMD17: DEFB 51H
CMD17A: DEFB 00H
 DEFB 00H
 DEFB 00H
 DEFB 00H
 DEFB 00H
CMD24: DEFB 58H
CMD24A: DEFB 00H
 DEFB 00H
 DEFB 00H
 DEFB 00H
 DEFB 00H
SDR:;---------------------------
 DI
 CALL INIT
 CALL CMD7S
 CALL REPSG
 EI
 RET
SDW:;---------------------------
 DI
 CALL INIT
 CALL CMD4S
 CALL REPSG
 EI
 RET
INIT:;-------------------------------------------
 LD A,15  ;SavePSG_Data
 OUT (PSGA),A
 IN A,(PSGR)
 LD (PSG0),A
 SET JPTB,A  ;UseJPT-B
 LD (PSG1),A
;DummyCLK80------------------------------------
 CALL CSH  ;/CS=H
 CALL DINH  ;DIN=H
 CALL CLKL  ;CLK=L
 LD B,80  ;Dummy80CLK
DMY80L: CALL CLKH
 CALL CLKL
 DJNZ DMY80L
 CALL CSL  ;/CS=L
CMD0S:;-------------------------------------------
 LD HL,CMD0  ;CMD0_Start
 CALL CMDX
 LD B,80  ;Counter
 LD E,0FFH  ;E:Temp.
CMD0L: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA   ;bit0->Cy
 RL E  ;Ebit0<-Cy
 LD A,E
 LD (CMD0RS),A ;SaveCMD0Res
 CP 01H  ;A=01H?
 JR Z,CMD0OK ;Yes->CMD0OK
 SLA E  ;ShiftLeft
 DJNZ CMD0L
 LD DE,CMD0TO ;CMD0:TimeOut
 CALL PUTS
 RET
CMD0TO: DEFM 'CMD_0:TimeOut'
 DEFB 0DH,0AH,'$'
CMD0OK: LD DE,CMD0C ;CMD0:OK
 CALL PUTS
 JR CMD0E
CMD0C: DEFM 'CMD_0:Done'
 DEFB 0DH,0AH,'$'
CMD0E: CALL DMY8
CMD1S:;-----------------------------------------
 LD B,080H  ;Counter
 LD E,0FFH  ;E:Temp.
CMD1L1: LD HL,CMD1
 CALL CMDX
 LD C,32
CMD1L2: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA
 RL E
 LD A,E
 LD (CMD1RS),A ;SaveCMD1RS
 CP 00H  ;A=00H?
 JR Z,CMD1OK
 DEC C
 JR NZ,CMD1L2
 DJNZ CMD1L1
 LD DE,CMD1TO ;CMD1:TimeOut
 CALL PUTS
 RET
CMD1TO: DEFM 'CMD_1:TimeOut'
 DEFB 0DH,0AH,'$'
CMD1OK: LD DE,CMD1C
 CALL PUTS
 JR CMD1E
CMD1C: DEFM 'CMD_1:Done'
 DEFB 0DH,0AH,'$'
CMD1E: CALL DMY8
CMD6S:;CMD16-----------------------------------
 LD HL,CMD16 ;CMD16_Start
 CALL CMDX
 LD B,80  ;Counter
 LD E,0FFH  ;E:Temp.
CMD6L: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA   ;bit0->Cy
 RL E  ;Ebit0<-Cy
 LD A,E
 LD (CMD16R),A ;SaveCMD16Res
 CP 00H  ;A=00H?
 JR Z,CMD6OK ;Yes->CMD16OK
 SLA E  ;ShiftLeft
 DJNZ CMD6L
 LD DE,CMD6TO ;CMD16:TimeOut
 CALL PUTS
 RET
CMD6TO: DEFM 'CMD16:TimeOut'
 DEFB 0DH,0AH,'$'
CMD6OK: LD DE,CMD6C ;CMD16:OK
 CALL PUTS
 JR CMD6E
CMD6C: DEFM 'CMD16:Done'
 DEFB 0DH,0AH,'$'
CMD6E: CALL DMY8
 RET
CMD7S:;CMD17=Read-----------------------------------
 LD BC,4
 LD DE,CMD17A
 LD HL,USRAG1
 LDIR
 LD HL,CMD17 ;CMD17_Start
 CALL CMDX
 LD B,80  ;Counter
 LD E,0FFH  ;E:Temp.
CMD7L: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA   ;bit0->Cy
 RL E  ;Ebit0<-Cy
 LD A,E
 LD (CMD17R),A ;SaveCMD17Res
 CP 00H  ;A=00H?
 JR Z,CMD7OK ;Yes->CMD7OK
 SLA E  ;ShiftLeft
 DJNZ CMD7L
 LD DE,CMD7TO ;CMD7:TimeOut
 CALL PUTS
 RET
CMD7TO: DEFM 'CMD17:TimeOut'
 DEFB 0DH,0AH,'$'
CMD7OK: LD DE,CMD7C ;CMD7:OK
 CALL PUTS
 JR CMD7E
CMD7C: DEFM 'CMD17:Done'
 DEFB 0DH,0AH,'$'
CMD7E: LD B,80  ;Counter
 LD E,0FFH  ;E:Temp.
CMD7L2: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA   ;bit0->Cy
 RL E  ;Ebit0<-Cy
 LD A,E
 LD (STTBYT),A ;SaveStartByte
 CP 0FEH  ;A=FEH?
 JR Z,CMD7RK ;Yes->CMD17RK
 SLA E  ;SiftLeft
 DJNZ CMD7L2
 LD DE,CMD7RO ;CMD17:ReadTimeOut
 CALL PUTS
 RET
CMD7RO: DEFM 'CMD17:ReadTimeOut'
 DEFB 0DH,0AH,'$'
CMD7RK: LD DE,CMD7RC ;CMD17:ReadStartOK
 CALL PUTS
 JR CMD7RE
CMD7RC: DEFM 'CMD17:ReadStart'
 DEFB 0DH,0AH,'$'
CMD7RE: LD HL,BUFF
 LD BC,512  ;512Bytes
CMD7L3: PUSH BC
 PUSH HL
 LD E,0FFH  ;E:Temp.
 LD B,8
CMD7L4: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA   ;bit0->Cy
 RL E  ;Ebit0<-Cy
 DJNZ CMD7L4
 POP HL
 LD (HL),E
 INC HL
 POP BC
 DEC BC
 LD A,B
 OR C
 JR NZ,CMD7L3
 LD DE,CMD7EB ;CMD17:ReadEnd
 CALL PUTS
 JR CMD7ED
CMD7EB: DEFM 'CMD17:ReadEnd'
 DEFB 0DH,0AH,'$'
CMD7ED: CALL DMY8  ;CRC1
 CALL DMY8  ;CRC2
 CALL DMY8
 RET
CMD4S:;CMD24=Write-----------------------------------
 LD BC,512  ;Fill_BUFF_Char.
 LD HL,BUFF
 LD A,(CHAR)
 LD E,A
CMD4L1: LD (HL),E
 INC HL
 DEC BC
 LD A,B
 OR C
 JR NZ,CMD4L1
 LD BC,4
 LD DE,CMD24A
 LD HL,USRAG1
 LDIR
 LD HL,CMD24 ;CMD24_Start
 CALL CMDX
 LD B,80  ;Counter
 LD E,0FFH  ;E:Temp.
CMD4L2: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA   ;bit0->Cy
 RL E  ;Ebit0<-Cy
 LD A,E
 LD (CMD24R),A ;SaveCMD24Res
 CP 00H  ;A=00H?
 JR Z,CMD4OK ;Yes->CMD24OK
 SLA E  ;ShiftLeft
 DJNZ CMD4L2
 LD DE,CMD4TO ;CMD24:TimeOut
 CALL PUTS
 RET
CMD4TO: DEFM 'CMD24:TimeOut'
 DEFB 0DH,0AH,'$'
CMD4OK: LD DE,CMD4C ;CMD24:OK
 CALL PUTS
 JR CMD4E
CMD4C: DEFM 'CMD24:Done'
 DEFB 0DH,0AH,'$'
CMD4E: LD HL,C24STB ;CMD24StartByte
 LD BC,515  ;STB+512+CRC2Bytes
CMD4L3: PUSH BC
 LD A,(HL)
 CALL CMDW8
 INC HL
 POP BC
 DEC BC
 LD A,B
 OR C
 JR NZ,CMD4L3
CMD4L4: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA   ;bit0->Cy
 RL E  ;Ebit0<-Cy
 LD A,E
 LD (C24DR),A ;SaveCMD24DataRes
 AND 1FH  ;Mask  (00011111B)
 CP 05H  ;A=05H?(00000101B)
 JR Z,CMD4WK ;Yes->CMD24WK
 SLA E  ;ShiftLeft
 DJNZ CMD4L4
 LD DE,CMD4WO ;CMD24:ReadTimeOut
 CALL PUTS
 RET
CMD4WO: DEFM 'CMD24:TimeOut'
 DEFB 0DH,0AH,'$'
CMD4WK: LD DE,CMD4WT ;CMD24:WriteOK
 CALL PUTS
 JR CMD4BS
CMD4WT: DEFM 'CMD24:WriteOK'
 DEFB 0DH,0AH,'$'
CMD4BS: LD B,0  ;Counter
 LD E,0FFH  ;E:Temp.
CMD4L5: CALL CLKH
 LD A,14
 OUT (PSGA),A
 IN A,(PSGR)
 CALL CLKL
 RRA   ;bit0->Cy
 RL E  ;Ebit0<-Cy
 LD A,E
 CP 00H  ;A=00H(=Bussy)
 JR NZ,CMD4BK ;No->CMD24BK
 SLA E  ;ShiftLeft
 DJNZ CMD4L5
 LD DE,CMD4BO ;CMD24:BussyTimeOut
 CALL PUTS
 RET
CMD4BO: DEFM 'CMD24:BussyTimeOut'
 DEFB 0DH,0AH,'$'
CMD4BK: LD DE,CMD4FN ;CMD24:WriteFinished
 CALL PUTS
 JR CMD4WE
CMD4FN: DEFM 'CMD24:Finish'
 DEFB 0DH,0AH,'$'
CMD4WE: CALL DMY8
 RET
DMY8:;DummyCLK8-------------------
 CALL CSH  
 CALL DINH
 CALL CLKL
 LD B,8
DMY8L: CALL CLKH
 CALL CLKL
 DJNZ DMY8L
 CALL DINL
 CALL CSL
 RET
CMDX:;CMD_Handler-----------------
 LD A,(HL) ;CMD
 CALL CMDW8
 INC HL
 LD A,(HL) ;ARG1
 CALL CMDW8
 INC HL
 LD A,(HL) ;ARG2
 CALL CMDW8
 INC HL
 LD A,(HL) ;ARG3
 CALL CMDW8
 INC HL
 LD A,(HL) ;ARG4
 CALL CMDW8
 INC HL
 LD A,(HL) ;CRC
 CALL CMDW8
 RET
CMDW8: LD B,8
 CALL CLKL
CMDW8L: CALL CLKH
 RLA
 CALL C,DINH
 CALL NC,DINL
 CALL CLKL
 DJNZ CMDW8L
 RET
;CS_H/L------------------
CSH: PUSH AF
 LD A,15
 OUT (PSGA),A
 LD A,(PSG1)
 SET CS,A
 OUT (PSGW),A
 LD (PSG1),A
 POP AF
 RET
CSL: PUSH AF
 LD A,15
 OUT (PSGA),A
 LD A,(PSG1)
 RES CS,A
 OUT (PSGW),A
 LD (PSG1),A
 POP AF
 RET
;CLK_H/L------------------
CLKH: PUSH AF
 LD A,15
 OUT (PSGA),A
 LD A,(PSG1)
 SET CLK,A
 OUT (PSGW),A
 LD (PSG1),A
 CALL WLP
 POP AF
 RET
CLKL: PUSH AF
 LD A,15
 OUT (PSGA),A
 LD A,(PSG1)
 RES CLK,A
 OUT (PSGW),A
 LD (PSG1),A
 CALL WLP
 POP AF
 RET
;DIN_H/L------------------
DINH: PUSH AF
 LD A,15
 OUT (PSGA),A
 LD A,(PSG1)
 SET DIN,A
 OUT (PSGW),A
 LD (PSG1),A
 LD (DE),A
 POP AF
 RET
DINL: PUSH AF
 LD A,15
 OUT (PSGA),A
 LD A,(PSG1)
 RES DIN,A
 OUT (PSGW),A
 LD (PSG1),A
 LD (DE),A
 POP AF
 RET
REPSG:;RestorePSG---------------
 PUSH AF
 LD A,15
 OUT (PSGA),A
 LD A,(PSG0)
 OUT (PSGW),A
 POP AF
 RET
WLP:;WaitLoop-----------------
 PUSH AF
 PUSH BC
 LD B,WAIT
WLPL: DJNZ WLPL
 POP BC
 POP AF
 RET
;MarkingForDebug----------
MK: PUSH DE
 LD DE,MARK
 CALL PUTS
 POP DE
 RET
MARK: DEFM '.$'
;PutString(BDOS-CALL)-----
PUTS: PUSH AF
 PUSH BC
 PUSH DE
 PUSH HL
 LD C,9
 CALL BDOS
 POP HL
 POP DE
 POP BC
 POP AF
 RET
 END


現実逃避日和

多少現実逃避気味の今日この頃。
先日触れた小型LCDを発作的にMSXのJポートに接続できるカタチにしました。左にあるのは例によって、サイズ比較見本のNATO5.56mm弾。以前「どこのご家庭でもお馴染みの」とサイズ比較見本に使って以来の習慣ですが、なんだか最近、冗談で済まなくなってきたような気がします。こういう冗談は自粛したほうがいいのでしょうかね? って、自粛する気は全然ないけれどw

逆挿し防止のためにLCDの土台部分に「LCD」と、ダイモのテープをかっこよく貼ろうと思ったら、肝心なときにダイモが見当たらない。だいなしやな。已む無く手書きと相成りました。ダイモが見つかったら上から貼ります。

イメージ 1

ほいで作ってから気が付きましたが、小さく作り過ぎて多くのMSXでは筐体と干渉して挿せないのね(大笑い)。っていうか、挿せるのは1chipMSXぐらいじゃないかしら? そういうときこそコレの出番です。「MSXジョイスティックポート延長コネクタ」。こういう製品が、製品としてあるのがMSXの不思議な世界です。1個500円(内税)。

イメージ 2
取り急ぎ紹介したくて写真を無断借用してしまいました。後ほど改めて使用願いを提出させていただきます。

さて、LCDのハードウエアは作ったものの、まだ1文字の表示もしていません。I2Cの勉強から始めないと。しかし、世の中にはこういうクールなことをやってのける人もいるのですなあ。PICを使っているそうですが処理速度以外はMSXも負けてないぞ! やってやれないことはない!かもしれないw
I2C-LCD (AQM0802A) Graph drawing technique with PIC  

おっとその前にSDCをなんとかしないと(・∀・;)

精神修養

バグ取りにいささか飽きてきたので、今日は部品取りしました。かつてヤフオクで入手したジャンクをバラしました。ハズせるところまでバラバラにするのは、一種の快感がありますね。猟奇的?ぼくだけかな?
そのうえで、しげしげと基板に見入ります。プリンタ端子などは労多くして功少なし。ハンダ大盛りでガッチリ固定されています。やはり狙うのはIC類。あまり足の多いのはウンザリしますが。下の写真はその一部。

イメージ 1

Z80はいくつか持ってます。MSXに限らず、最期を看取ったPCはデスクトップ・ノートにかかわらずCPUを形見に残しています。ペンティアムとかセレロンとか。MZ-80Cの形見のZ80もどこかに眠っているはず。
YAMAHAのYZなんちゃらは、PSG(AY-3-8910)のちょっびっと改良版ですね。いつかいじってみたいものです。ソフトウエア的にではなく、ハードウエア的にパッチングで音色を変えるなんてことはできるのでしょうか?

右上のMCMなんちゃらは2KBのDRAMです。SONY HB-75のVRAMに使われていたものです。外してみたものの使い道が考え付きません。同じ基板にはでっかい8255も載っています。そのうち外してやろう。
三端子レギュレータ7812は外したものの在庫十分。10.738MHzの水晶発振子が2個入手できました。あとはもうどうでもいいものばかりですね。

部品ほしさに、ではなくて精神修養代わりに部品取りしています。ハンダを溶かして吸い込む道具も持っていますが、ハンダ吸い取り線(線というより網ですが)で、丁寧にぬぐっていくほうが精神修養っぽいですな。部品取りは冬のほうがいいです。夏は汗が基板に落ちないよう気をつかいます。
さて、お勤めが終わって明日からSDCとの格闘再開。なんか「やれやれ」って気分になってきたぞw(・∀・)
まだ読み出しのデバッグが終わってないというのに、書き込みコマンドに手を付けちゃいました。書き込みのほうが一手間多いのに、なんか上手くいっているみたい。使用したカードは、Canonのコンパクトデジカメについていた16MBのSDC。16GBちゃいませ、16MBでっせ。そういう時代もあったのですなあ。と感慨に耽っている場合ではありません。
 
まず、SDCのコマンドについておさらい。
一般に次の6バイトの形式で発行します。
  [CMD][ARG1][ARG2][ARG3][ARG4][CRC]
[CMD]の部分は、読み出しなら[0x51]、書き込みなら[0x58]を入れます。続く[ARG1]〜[ARG4]は引数で、512バイト目から読み書きしたいときは、
  [0x00][0x00][0x02][0x00]
となります。多くの場合、512Bが1単位となりますから、[ARG4]は[0x00]のままで、[ARG1][ARG2][ARG3]の3バイトでアドレスを指定することになります。[ARG3]に注目すると、第0セクタのときは[0x00]、512バイト目からの第1セクタのときは[0x02]、第2セクタのときは[0x04]・・・と偶数になるわけですね。
最後の[CRC]は、SPIモードでアクセスするときに意味を持つのは[CMD0]のときだけで[0x95]となります。
 
まとめると、
  CMD  0:[0x40][0x00][0x00][0x00][0x00][0x95]
  CMD  1:[0x41][0x00][0x00][0x00][0x00][0xF9]
  CMD16:[0x50][0x00][0x00][0x02][0x00][0x00]
  CMD17:[0x51][0x00][0x00][0x00][0x00][0x00]
  CMD24:[0x58][0x00][0x00][0x00][0x00][0x00]
これだけ知っていれば、初期化して(CMD0、CMD1)、512B単位に設定して(CMD16)、読み(CMD17)、書き(CMD24)ができます。
 
イメージ 1
 
さて、ここでどうしようかな?というのが、MSX-BASICからの引数の渡し方です。
2バイト整数で渡せばいいじゃん♪と思っていたら、SDCのセクタ数はもっと多いのですね。MSX-BASICの2バイト整数は正負ありなので−32768〜32767の範囲。しかし今回は正の偶数のみなので、2倍して32767より小さい16383がA=USR(n×2)のnに入る最大値ということになる?(間違ってたら教えてね。)
512B × 16383 =8,388,096B、つまり8MB余りが2バイト整数でアクセスできる限界?
「いや、そこは単精度なり倍精度を使えばいいじゃん」と思うかもしれませんが、MSX-BASICでは内部的には単精度や倍精度はBCD形式になってるんですよね。だからメモリからSDCにポイポイと[ARG1][ARG2][ARG3]の3バイトに放り込めないのですよ。一個ずつPOKEするしか思いつきません。
3バイト使えば、512B × 0xFF × 0xFF × 0xFE = 8,456,371,200B。およそ8.5GBまでアクセスできるんですねえ。・・・ってこれで合ってるの? なんかメチャ少ないんですけど?
 
ま、苦手な計算は得意な人に任せておいて、下の写真でも眺めていただきましょう。
CMD24で書き込みのテストをしているところです。左端の上の[ARG1]〜[ARG3]はコマンドの引数([ARG4]がないのはどうせ0x00だから)。次の[CHAR]は書き込みたい文字。512Bのバッファをこの文字で埋めます。[CMD_0:Done]から[CMD24:Finish]まではマシン語が返しているメッセージ。
続く[CMD_0RES:01]から[CMD24DRS:05]は、BASICがマシン語のワークエリアから拾ってきたコマンドレスポンス。全て正しいレスポンスが返ってるでしょ?
ほいで、書き込みを指示した文字が「w」だから「wwwwwwww」となっているわけです。
最後の「R/W」は、本当は先頭にあって「読み込み/書き込み」を選択します。
というわけで、だいたいの機能は盛り込めたと思うのですが、最初に書いたように、読み込みのデバッグがまだ出来てないのですよ >┼○ バタッ
 
書き込みも、本当に書き込めているのかSDCのセクタ毎にダンプできるツールで確かめてみたいところです。
今日はここまで来ました(・∀・)
 
イメージ 2
 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

過去の記事一覧

最新のコメント最新のコメント

すべて表示

kik**41010
kik**41010
非公開 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ
みんなの更新記事