Rev 111 |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
| ?url?
;LAST UPDATE: 08.06.2013 savelij
include macros.a80
include sdcomand.a80
include ports_ngs.a80
include global_vars.a80
;
BYTSSEC
;
32 = 0XFF
;
,
NGS EQU 1 ;0- ZSD, 1- NEOGS
CONV_NUMSEC EQU 1 ;0-
, 1-
;
,
IF NGS=1
NUM_PAGE EQU 0X7F ;
/
BUFF_SEC EQU 0X5000 ;
ADR_LOADING EQU 0X8000 ;
/
ADR_EXEC EQU 0X6000 ;
ELSE
NUM_PAGE EQU 7 ;
/
BUFF_SEC EQU 0X8000 ;
ADR_LOADING EQU 0XC000 ;
/
ADR_EXEC EQU 0X6000 ;
ENDIF
ORG ADR_EXEC ;->
DI
LD HL,F_PATH ;
LD A,NUM_PAGE ;
/
CALL READ_CLS
JR $
; ,
8.3
F_PATH IF NGS=0
DB "DEMO/ANAMORIG.UDI",0
ELSE
DB "MP3/MIC-RO~1.MP3",0
ENDIF
;
"DIR/DIR/FILE.EXT" 0
;---------------------------------
;
BUF512 EQU BUFF_SEC ;200
TDIRCLS EQU BUF512+0X0200 ;400
ROOT
CAL_FAT EQU TDIRCLS+0X0400 ;1 FAT
BYTSSEC EQU CAL_FAT+1 ;1
ROOTCLS EQU BYTSSEC+1 ;4
ROOT
ROOTSEC EQU ROOTCLS+4 ;2
ROOT
SEC_FAT EQU ROOTSEC+2 ;4
FAT
RSVDSEC EQU SEC_FAT+4 ;2
STARTRZ EQU RSVDSEC+2 ;4 /
FRSTDAT EQU STARTRZ+4 ;4
BPB
SEC_DSC EQU FRSTDAT+4 ;4
/
CLS_DSC EQU SEC_DSC+4 ;4
/
FATSTR EQU CLS_DSC+4 ;4
FAT
ADRPATH EQU FATSTR+4 ;2
STATUS EQU ADRPATH+2 ;1
LOAD_SD
OLD_SP EQU STATUS+1 ;2
FB_EXT EQU OLD_SP+2 ;B
8.3
LVL_DIR EQU FB_EXT+0X0B ;1
LSTLOAD EQU LVL_DIR+1 ;4
;SD
ZAW003 LD A,0XEE
WR_STAT LD SP,(OLD_SP)
LD (STATUS),A
IF NGS=1
RET
ELSE
CS__LOW PUSH AF
LD A,1
OUT (P_CONF),A
POP AF
RET
CS_HIGH PUSH AF
LD A,3
OUT (P_CONF),A
XOR A
OUT (P_DATA),A
POP AF
RET
ENDIF
;
;
:A-
;HL-
;
. ROOT
;
: A=
;0X00-OK
;0XAA-
;0XDD-FAT
;0XEE-SD
READ_CLS LD IYL,A;LY,A ;
LD (ADRPATH),HL ;
LD (OLD_SP),SP ;
LD A,0XFF
LD (LSTLOAD+3),A ;
IF NGS=1
LD A,1
OUT (GSCFG0),A ; ,
LD A,%10011011
OUT (SCTRL),A ; CS=1 SD
ELSE
CALL CS_HIGH
ENDIF
LD B,0X10
LD A,0XFF
IF NGS=1
OUT (SD_SEND),A ;
0X10 0XFF
ELSE
OUT (P_DATA),A
ENDIF
DJNZ $-4
XOR A ;256 SD
EX AF,AF'
IF NGS=1
LD A,1
OUT (SCTRL),A ; SD CS=0
ENDIF
ZAW001 LD HL,CMD00
CALL OUTCOM ;
SPI 0
CALL IN_OOUT ;
EX AF,AF'
DEC A
JR Z,ZAW003 ;
256
EX AF,AF'
DEC A
JR NZ,ZAW001 ;
1
LD BC,SD_RSTR
LD HL,CMD08
CALL OUTCOM ;
CALL IN_OOUT ; "A"
R1
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C)
NOP
IN H,(C) ;
BIT 2,A ;
,
LD HL,0 ;
1.0
JR NZ,ZAW006 ;
LD H,0X40 ;
2.0
ZAW006 LD A,CMD_55
CALL OUT_COM ;
CALL IN_OOUT
IF NGS=1
LD BC,SD_SEND
ELSE
LD BC,P_DATA
ENDIF
LD A,ACMD_41
OUT (C),A
LD A,H
OUT (C),A
XOR A
OUT (C),A
NOP
OUT (C),A
NOP
OUT (C),A
DEC A
OUT (C),A
CALL IN_OOUT
AND A
JR NZ,ZAW006 ;
ZAW004 LD A,CMD_59
CALL OUT_COM ;
CRC16
CALL IN_OOUT
AND A
JR NZ,ZAW004
ZAW005 LD HL,CMD16
CALL OUTCOM ;
512
CALL IN_OOUT
AND A
JR NZ,ZAW005
;
FAT
WC_FAT LD DE,0
LD B,D
LD C,E
CALL LOADLST ;
0
PUSH HL
POP IX
LD DE,0X01BE
ADD HL,DE ;
LD A,(HL) ;
0,
AND A
JR NZ,RDFAT05 ;
0,
LD DE,4
ADD HL,DE ;
LD A,(HL)
LD B,0
CP 1 ;FAT12?
JR Z,RDFAT06
LD B,2
CP 0X0B ;FAT32?
JR Z,RDFAT06
CP 0X0C ;FAT32?
JR Z,RDFAT06
LD B,1
CP 6 ;FAT16?
JR Z,RDFAT06
CP 4 ;FAT16?
JR Z,RDFAT06
CP 0X0E ;FAT16?
JR NZ,RDFAT05
RDFAT06 LD A,B ;
"B"
LD (CAL_FAT),A ;
ADD HL,DE
CALL LOADZP ;
JR RDFAT00 ;
;MBR
,
0
RDFAT05 LD C,(IX+0X0D) ;C=
XOR A
LD E,A
LD B,8
RR C
ADC A,0
DJNZ $-4 ;
2
DEC A
JR NZ,$+3 ;
INC E ;+1,
LD A,(IX+0X0E)
OR (IX+0X0F)
JR Z,$+3 ;
>0
INC E ;+1,
LD A,(IX+0X13)
OR (IX+0X14)
JR NZ,$+3 ;
16?
INC E
LD A,(IX+0X20)
OR (IX+0X21)
OR (IX+0X22)
OR (IX+0X23)
JR NZ,$+3 ;
32?
INC E ; =0,
>0
LD A,(IX+0X15)
AND 0XF0
CP 0XF0
JR NZ,$+3 ;
1
INC E
LD A,E
CP 4 ; ?
LD A,0XDD ;FAT
JP NZ,WR_STAT
LD A,0XFF
LD (CAL_FAT),A ;
LD DE,0
LD B,D
LD C,E
RDFAT00 LD (STARTRZ),DE
LD (STARTRZ+2),BC ;
CALL LOADLST ;
LD HL,0
LD DE,(BUF512+0X16) ;BPB_FATSZ16
LD A,D
OR E
JR NZ,RDFAT01 ;
FAT12/16 (BPB_FATSZ16=0)
LD DE,(BUF512+0X24)
LD HL,(BUF512+0X26) ;BPB_FATSZ32
;
+36
RDFAT01 LD (SEC_FAT+2),HL
LD (SEC_FAT),DE ;
FAT-
LD HL,0
LD DE,(BUF512+0X13) ;BPB_TOTSEC16
LD A,D
OR E
JR NZ,RDFAT02 ;
FAT12/16 (BPB_TOTSEC16=0)
LD DE,(BUF512+0X20)
LD HL,(BUF512+0X22) ;BPB_TOTSEC32
;
+32
RDFAT02 LD (SEC_DSC+2),HL
LD (SEC_DSC),DE ;-
/
;
ROOTDIRSECTORS
LD BC,(BUF512+0X0B) ;BPB_BYTSPERSEC
LD DE,(BUF512+0X11) ;BPB_ROOTENTCNT
LD HL,0
LD A,D
OR E
JR Z,RDFAT03
LD B,H
LD C,L
LD A,0X10
CALL BCDE_A
EX DE,HL
;
;ROOTDIRSECTORS=((BPB_ROOTENTCNT*32)+(BPB_BYTSPERSEC-1))/BPB_BYTSPERSEC
; HL=ROOTDIRSECTORS.
FAT32, HL=0
RDFAT03 PUSH HL ;ROOTDIRSECTORS
LD (ROOTSEC),HL
LD A,(BUF512+0X10)
LD DE,(SEC_FAT)
LD HL,(SEC_FAT+2)
DEC A
EX DE,HL
ADD HL,HL
EX DE,HL
ADC HL,HL
DEC A
JR NZ,$-6
POP BC ;
FAT-
CALL HLDEPBC ; ROOTDIRSECTORS
LD BC,(BUF512+0X0E) ;BPB_RSVDSECCNT
LD (RSVDSEC),BC
CALL HLDEPBC ; BPB_RESVDSECCNT
LD (FRSTDAT),DE
LD (FRSTDAT+2),HL ;
LD B,H
LD C,L
LD HL,SEC_DSC ;BCDE+32-®¥
HL
CALL BCDEHLM ; -
LD A,(BUF512+0X0D)
LD (BYTSSEC),A
CALL BCDE_A ;
-
LD (CLS_DSC),DE
LD (CLS_DSC+2),BC ; -
LD A,(CAL_FAT)
CP 0XFF
JR NZ,RDFAT04
;
FAT MBR
LD DE,(SEC_FAT-1)
LD BC,(SEC_FAT+1)
LD E,0 ;BCDE=
*0X100
PUSH BC
PUSH DE ;
SRL B
RR C
RR D
RR E ;BCDE=
*0X80
LD HL,CLS_DSC ;
FAT
PUSH HL ;
CALL HLBCDEM ;
-(
*0X80)
LD A,E
AND 0X80 ;
128
FAT32
OR D
OR C
OR B
LD A,2
POP HL
POP DE
POP BC
JR Z,RDFAT04 ;FAT32
Z=0
CALL HLBCDEM ;
-(
*0X100)
LD A,D
OR C
OR B
LD A,1
JR Z,RDFAT04 ;FAT16
Z=0
XOR A ;
FAT12
; FAT12/16
; FAT32
+44,
BCDE-
ROOTDIR
RDFAT04 LD (CAL_FAT),A ;
EX AF,AF'
LD DE,(RSVDSEC)
LD BC,0
LD HL,STARTRZ
CALL BCDEHLP
LD (FATSTR),DE
LD (FATSTR+2),BC ;
FAT-T
EX AF,AF'
AND A
LD DE,0
LD B,D
LD C,E
JR Z,FSRROO2 ;FAT12-NONE
DEC A
JR Z,FSRROO2 ;FAT16
LD DE,(BUF512+0X2C)
LD BC,(BUF512+0X2E) ;FAT32
FSRROO2 LD (ROOTCLS),DE
LD (ROOTCLS+2),BC ;
ROOT
XOR A
LD (LVL_DIR),A ;
ROOT
LD HL,(ADRPATH) ;
FINDFL1 PUSH BC
PUSH DE ;
CALL FNDBUF ;
POP DE
POP BC ;
PUSH HL ;
LD HL,TDIRCLS ;
LD A,D
OR E
OR B
OR C
CALL SAVEZP ;
JR Z,LASTCLS ;
0, ROOT ( 12/16)
NEXTCLS PUSH HL
CALL RDFATZP ;
CALL LST_CLS ;
POP HL
JR C,LASTCLS
CALL SAVEZP ;
JR NEXTCLS ;
LASTCLS LD BC,0XFFFF
CALL SAVEZP ;
EXX
LD HL,LVL_DIR
LD A,(HL) ;
INC (HL) ;
AND A
LD BC,0 ;
ROOT
JR NZ,LASTCLS1
LD A,(CAL_FAT)
CP 2
JR NC,LASTCLS1
LD HL,(ROOTSEC) ;
ROOT
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD B,H
LD C,L
LASTCLS1 EXX
FINDFL INC BC ;
0
CALL RDDIRSC ;
LD A,C
AND 0X0F ;
16
LD E,A
LD D,0
EX DE,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE ;
EXX
DEC BC
LD A,B
OR C ;
ROOT
EXX
LD A,0XAA
JP Z,WR_STAT
LD A,(HL) ;
AND A
LD A,0XAA ;
=0,
JP Z,WR_STAT ;
=
PUSH HL
PUSH BC
CALL COMPARE ;
POP BC
POP DE
PUSH DE
POP IX ;
IX=
JR NZ,FINDFL ;
,
CALL RD_CLAS ;
EX (SP),HL ;
INC SP
INC SP ;
LD A,(HL)
AND A ;
?
JR NZ,FINDFL1 ;
,
LD A,(IX+0X0B) ;
?
AND 0X10
LD A,0XAA ;
,
JP NZ,WR_STAT ;
FINDFL2 LD A,IYL
DEC IYL
IF NGS=1
OUT (MPAG),A ;
ELSE
CALL PAGE_7FFD
ENDIF
LD HL,ADR_LOADING
FINDFL3 IF CONV_NUMSEC=1
PUSH BC
PUSH DE
PUSH HL
CALL REALSEC ;
POP HL
CALL SAVEZP ;
POP DE
POP BC
ELSE
CALL SAVEZP ;
ENDIF
LD A,H
AND A
JR Z,FINDFL2 ;
PUSH HL
CALL RDFATZP
CALL LST_CLS
POP HL
JR NC,FINDFL3
XOR A
LD B,0XFF
JP SAVEZP ;
= FF
SAVEZP LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),C
INC HL
LD (HL),B
INC HL
RET
LOADZP LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
INC HL
LD B,(HL)
INC HL
RET
;
DIR
BC
RDDIRSC PUSH BC
LD D,B
LD E,C
LD BC,0
LD A,0X10
CALL BCDE_A
LD A,E
PUSH AF
LD A,(BYTSSEC)
PUSH AF
CALL BCDE_A
LD HL,TDIRCLS
EX DE,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE
CALL LOADZP
CALL REALSEC
POP AF
DEC A
LD L,A
POP AF
AND L
LD L,A
LD H,0
ADD HL,DE
EX DE,HL
LD HL,0
ADC HL,BC
LD B,H
LD C,L
CALL LOADLST
POP BC
RET
;
LST_CLS LD A,(CAL_FAT) ;
AND A
JR NZ,LST_CL1
LD HL,0X0FF7 ;
12
SBC HL,DE
RET
LST_CL1 DEC A
JR NZ,LST_CL2
LST_CL3 LD HL,0XFFF7 ;
16 32
SBC HL,DE
RET
LST_CL2 LD HL,0X0FFF ;
32
SBC HL,BC
RET NZ
JR LST_CL3
;
RDFATZP LD A,(CAL_FAT) ;
AND A
JR Z,RDFATS0 ;
12
DEC A
JR Z,RDFATS1 ;
16
EX DE,HL ;
32
ADD HL,HL
EX DE,HL
LD HL,0
ADC HL,BC
ADC HL,BC ;
2
LD A,E
LD E,D
LD D,L
LD C,H
LD B,0 ;
256
CALL RDFATS2 ;
16
16
INC HL
LD C,(HL)
INC HL
LD B,(HL) ;
16
RET
;
16
16
RDFATS1 LD BC,0
LD A,E
LD E,D
LD D,C ;
256,
16 =0
RDFATS2 PUSH AF ;
16
16/32
PUSH BC
LD HL,FATSTR
CALL BCDEHLP ;
CALL LOADLST ;
POP BC
POP AF
LD E,A
LD D,0
ADD HL,DE
ADD HL,DE ;
LD E,(HL)
INC HL
LD D,(HL) ; 16
RET
;
12
12
RDFATS0 LD H,D
LD L,E
ADD HL,HL
ADD HL,DE ;HL=HL*3
SRL H
RR L ;HL=HL/2 -
1,5
LD A,E ;A-
LD E,H
LD D,0
LD B,D
LD C,D ;
256
SRL E
PUSH AF
PUSH HL
LD HL,FATSTR
CALL BCDEHLP ;
CALL LOADLST ;
POP BC
LD A,B
AND 1
LD B,A ;BC=
ADD HL,BC ;HL=
LD B,(HL) ;
INC HL ;
LD A,H
CP HIGH (BUF512)+2 ;
JR NZ,RDFATS4
PUSH BC ;
LD BC,0
INC DE
CALL LOADLST ;
POP BC
RDFATS4 POP AF
LD D,(HL) ;
LD E,B ;
DE=
LD BC,0
RRA ;
0
JR NC,RDFATS3
SRL D ;
12
RR E
SRL D
RR E
SRL D
RR E
SRL D
RR E
RDFATS3 LD A,D
AND 0X0F
LD D,A ;
4
RET
;
;
BCDE=
FAT
;
BCDE=
REALSEC LD A,B
OR C
OR D
OR E
JR NZ,REALSE1 ;BCDE=0?
LD HL,SEC_FAT ; ROOT
12/16
LD DE,(FATSTR) ;
ROOT
LD BC,(FATSTR+2)
PUSH HL
CALL BCDEHLP ;
POP HL
JP BCDEHLP ;
ROOT
REALSE1 LD HL,0XFFFE
EX DE,HL
ADD HL,DE
EX DE,HL
INC HL
ADC HL,BC ;HLDE=
-2
LD A,(BYTSSEC) ;
JR REALSE2
REALSE3 SLA E
RL D
RL L
RL H
REALSE2 RRCA
JR NC,REALSE3 ;
LD B,H
LD C,L
LD HL,STARTRZ
CALL BCDEHLP ;
LD HL,FRSTDAT
JP BCDEHLP ;
;BCDE=BCDE/512
BCDE200 LD E,D
LD D,C
LD C,B
LD B,0
LD A,2
JR BCDE_A
;BCDE>>A=BCDE
BCDE_A1 SRL B
RR C
RR D
RR E
BCDE_A RRCA
JR NC,BCDE_A1
RET
;(ADR)-BCDE=BCDE
BCDEHLM LD A,(HL)
INC HL
SUB E
LD E,A
LD A,(HL)
INC HL
SBC A,D
LD D,A
LD A,(HL)
INC HL
SBC A,C
LD C,A
LD A,(HL)
SBC A,B
LD B,A
RET
;(ADR)+BCDE=BCDE
BCDEHLP LD A,(HL)
INC HL
ADD A,E
LD E,A
LD A,(HL)
INC HL
ADC A,D
LD D,A
LD A,(HL)
INC HL
ADC A,C
LD C,A
LD A,(HL)
ADC A,B
LD B,A
RET
;HLDE+BC=HLDE
HLDEPBC EX DE,HL
ADD HL,BC
EX DE,HL
LD BC,0
ADC HL,BC
RET
;BCDE-(ADR)=BCDE
HLBCDEM LD A,E
SUB (HL)
INC HL
LD E,A
LD A,D
SBC A,(HL)
INC HL
LD D,A
LD A,C
SBC A,(HL)
INC HL
LD C,A
LD A,B
SBC A,(HL)
LD B,A
RET
;
LOADLST CALL CPNUMSC ;
JR NZ,LOADLST1
LD HL,BUF512 ;
RET
LOADLST1 LD (LSTLOAD+2),BC
LD (LSTLOAD),DE ;
LD HL,BUF512 ;
LD A,1 ; 1
PUSH HL
CALL RDMULTI ;
POP HL ;
HL=
RET
;
CPNUMSC LD HL,LSTLOAD
LD A,(HL)
INC HL
CP E
RET NZ
LD A,(HL)
INC HL
CP D
RET NZ
LD A,(HL)
INC HL
CP C
RET NZ
LD A,(HL)
CP B
RET
; SD
OUTCOM PUSH BC
IF NGS=1
LD BC,0X0600+SD_SEND ; 6
ELSE
LD BC,0X600+P_DATA
ENDIF
OTIR
POP BC
RET
; SD
0
OUT_COM PUSH BC
IF NGS=1
LD BC,SD_SEND
ELSE
CALL CS__LOW
LD BC,P_DATA
ENDIF
OUT (C),A ;
XOR A
OUT (C),A ; 31-24
NOP
OUT (C),A ; 23-16
NOP
OUT (C),A ; 15-8
NOP
OUT (C),A ; 7-0
DEC A
OUT (C),A ;
CRC16
POP BC
RET
SECM200 PUSH HL
PUSH BC
LD A,CMD_58
CALL OUT_COM
CALL IN_OOUT
IF NGS=1
LD BC,SD_RSTR
ELSE
LD BC,P_DATA
ENDIF
IN H,(C)
NOP
IN A,(C)
NOP
IN A,(C)
NOP
IN A,(C)
BIT 6,H
POP HL
JR NZ,SECN200
EX DE,HL
ADD HL,HL
EX DE,HL
ADC HL,HL
LD H,L
LD L,D
LD D,E
LD E,0
SECN200 LD A,CMD_18
IF NGS=1
LD C,SD_SEND
ELSE
LD C,P_DATA
ENDIF
OUT (C),A
NOP
OUT (C),H
NOP
OUT (C),L
NOP
OUT (C),D
NOP
OUT (C),E
LD A,0XFF
OUT (C),A
POP HL
RET
IN_OOUT EXX
LD DE,0X20FF
IN_WAIT IF NGS=1
IN A,(SD_RSTR)
ELSE
IN A,(P_DATA)
ENDIF
CP E
JR NZ,IN_EXIT
IN_NEXT DEC D
JR NZ,IN_WAIT
IN_EXIT EXX
RET
CMD00 DB 0X40,0X00,0X00,0X00,0X00,0X95;GO_IDLE_STATE
CMD08 DB 0X48,0X00,0X00,0X01,0XAA,0X87;SEND_IF_COND
CMD16 DB 0X50,0X00,0X00,0X02,0X00,0XFF;SET_BLOCKEN
;
SD
RDMULTI EX AF,AF'
CALL SECM200
EX AF,AF'
IF NGS=1
LD BC,SD_RSTR
ELSE
LD BC,P_DATA
ENDIF
RDMULT1 EX AF,AF'
CALL IN_OOUT
CP 0XFE
JR NZ,$-5
INIR
NOP
INIR
NOP
IN A,(C)
NOP
IN A,(C)
EX AF,AF'
DEC A
JR NZ,RDMULT1
LD A,CMD_12
CALL OUT_COM
CALL IN_OOUT
INC A
JR NZ,$-4
RET
;
RD_CLAS EX DE,HL
LD DE,0X14 ;
16
+20
ADD HL,DE
LD C,(HL)
INC HL
LD B,(HL)
LD E,5 ;
16
+26
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
INC HL
RET
PAGE_7FFD PUSH BC
LD BC,CONF_128
OR 0X10
OUT (C),A
POP BC
RET
;
COMPARE LD DE,FB_EXT
LD B,0X0B
LD A,(DE)
CP (HL)
RET NZ
INC HL
INC DE
DJNZ $-5
RET
;
FNDBUF LD BC,0X0802
LD DE,FB_EXT
FNDBUF4 LD A,(HL)
INC HL
CP "."
JR Z,FNDBUF2
CP "/"
JR Z,FNDBUF5
LD (DE),A
INC DE
DJNZ FNDBUF4
LD A,(HL)
AND A
RET Z
INC HL
JR FNDBUF3
FNDBUF5 LD A,C
AND A
RET Z
FNDBUF2 LD A,B
AND A
JR Z,FNDBUF3
LD A," "
LD (DE),A
INC DE
DJNZ $-2
FNDBUF3 LD B,3
DEC C
DEC HL
LD A,(HL)
CP "/"
JR Z,FNDBUF4
INC HL
JR FNDBUF4