Rev 112 |
Blame |
Compare with Previous |
Last modification |
View Log
| Download
| RSS feed
| ?url?
;LAST UPDATE: 24.04.2014 savelij
include ../macros.a80
include ../ports_ngs.a80
include ../sdcomand.a80
;
ADRLOAD EQU 0X8000
RAMCOD EQU 0X4080 ;
RAM8KB EQU 0X6000 ;
STRPAG EQU 0X8000 ;
FREQUENCY EQU C_20MHZ ;
ORG 0
DI
LD SP,RAMCOD
XOR A
OUT (VOL1),A
OUT (VOL2),A
OUT (VOL3),A
OUT (VOL4),A
OUT (VOL5),A
OUT (VOL6),A
OUT (VOL7),A
OUT (VOL8),A ;
; JP RDBYT_DBG ;
;
LD B,0 ;
256
IN A,(ZXSTAT) ;
RRA
JR C,RDBYT01
DJNZ $-5
DEC B ;
,
JR RDBYT03 ;
RDBYT01 IN A,(ZXCMD) ;
LD C,A ;
IN A,(ZXDATRD) ;
OUT (CLRCBIT),A ;
CP C ;
JR NZ,RDBYT03 ;
,
CP 0X55 ;
0X55?
JR NZ,RDBYT03 ;
,
LD B,0 ;
256
IN A,(ZXSTAT)
RRA
JR C,RDBYT02
DJNZ $-5
DEC B
JR RDBYT03 ;
,
RDBYT02 IN A,(ZXCMD) ;
LD C,A ;
IN A,(ZXDATRD) ;
CP C ;
JR NZ,RDBYT03 ;
,
RDBYT_DBG CP 0XAA ; 0XAA?
RDBYT03 EX AF,AF' ;
LD HL,GRUZILA
LD DE,RAMCOD
LD BC,RAMCEND-VERLOAD
LDIR ;
OUT (CLRCBIT),A ;
EX AF,AF' ;
JP Z,GRUZIM2 ;
,
JP GRUZIM0 ;
GRUZILA
PHASE RAMCOD
VERLOAD DB "Loader"
DW DATA_VERS
; GS
F_PATH DB "NEOGS.ROM",0
UPDATENAME DB "NGS_ROM.UPD",0
TXT1 DB "not found",0
TXT1E
TXT2 DB "beta",0
TXT2E
TXT3 DB 0;"stable",0
TXT3E
GRUZIM0 CALL RROMSD ;
SD ,
JP GS105 ;
GRUZIM2 LD A,0X11 ;
LD (NGS_MODES),A
OUT (GSCFG0),A ;
12
XOR A
OUT (MPAG),A ;
0
GRUZIM IN A,(ZXSTAT) ;
RRA
JR NC,GRUZIM
IN A,(ZXCMD) ;
CP 0X1D ;
?
JR NZ,GRUZIM1
LD A,0X76
OUT (ZXDATWR),A ;
OUT (CLRCBIT),A
JR GRUZIM ;
GRUZIM1 CP 0XF3
JP Z,GS105 ;
0XF3
CP 0XF4
JP Z,GS105 ;0XF4
CP LOW (FLOADE-FLOADER)/2+1
JP NC,GS105 ;
ADD A,A
LD L,A
LD H,0
LD DE,GRUZIM2
PUSH DE ;
LD DE,FLOADER
ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL) ;
EX DE,HL
JP (HL) ;
FLOADER DW LOADROM ;00 ROM
ROM
DW JPLDROM ;01
DW GS105 ;02
ROM
DW RROMSD ;03 ROM SD
DW LOADCOD ;04
DW LDINSD ;05 SD
DW RUNCOD ;06
DW STATSD ;07
DW VERPAGE ;08
DW GET_CRC ;09 CRC16
DW LOADUPDATE ;0A
DW SET_FREQ ;0B
FLOADE
SET_FREQ IN A,(ZXDATRD) ;
BIT 7,A
JR NZ,SET_FREQ2
OUT (CLRCBIT),A ;
AND 3
LD L,C_10MHZ ; 10
JR Z,SET_FREQ1
DEC A
LD L,C_12MHZ ; 12
JR Z,SET_FREQ1
DEC A
LD L,C_20MHZ ; 20
JR Z,SET_FREQ1
LD L,C_24MHZ ; 24
SET_FREQ1 LD A,(NGS_MODES)
AND %11001111
OR L
LD (NGS_MODES),A
OUT (GSCFG0),A
RET
SET_FREQ2 LD A,(NGS_MODES)
AND 0X30
RRCA
RRCA
RRCA
RRCA
OUT (CLRCBIT),A
OUT (ZXDATWR),A
JP WDN
;
TXT
VERPAGE IN A,(ZXDATRD) ;
AND 7 ;
5
EX AF,AF' ;
LD A,0X30
OUT (GSCFG0),A ; 10
EX AF,AF' ;
ADD A,A ;
32
; AND A ; 0?
; JR NZ,VERPAG1 ;
,
8
; LD HL,VERLOAD ;
; LD DE,RAMCEND
; LD BC,8
; PUSH DE
; LDIR
; POP DE
; JR VERPAG2 ;
VERPAG1 INC A
OUT (MPAG),A ;
16
LD HL,0XFFF8
LD BC,8
LD DE,RAMCEND
PUSH DE
LDIR ;
8
POP DE
VERPAG2 LD A,0X11
OUT (GSCFG0),A ;
12
XOR A
OUT (MPAG),A ;
0
LD B,8 ;
8 ,
0XFF ?
LD A,(DE)
INC DE
INC A
JR NZ,VFPGA1 ;
0XFF,
DJNZ $-5
DEC SP ;
8 0XFF,
DEC SP
POP DE
LD HL,TXT1
LD BC,TXT1E-TXT1
LDIR ;
JR VFPGA0
VFPGA1 DEC SP
DEC SP
POP DE
CALL UNVERS ;
8
VFPGA0 OUT (CLRCBIT),A ;
LD HL,RAMCEND
LD BC,ZXDATWR
VFPGA2 LD A,(HL)
OUTI
EX AF,AF'
CALL WDN
EX AF,AF'
AND A
JR NZ,VFPGA2 ;
0,
RET
;
UNVERS LD HL,6
ADD HL,DE ; 6
LD C,(HL) ;
LD (HL)," " ;
INC HL
LD B,(HL) ;
LD A,C ;
AND 0X1F ;
5 (
)
JR NZ,$+4
RES 7,B ;
0,
CP 32
JR C,$+4 ;
31
RES 7,B ;
CALL A2TXT ;
SRL B ;
1
RR C ;
LD A,C ;
RRCA
RRCA
RRCA
RRCA ;
AND 0X0F ;
4 (
)
JR NZ,$+4 ;
0
RES 6,B ;
CP 13 ;
12
JR C,$+4
RES 6,B ;
LD (HL),"." ;
INC HL
CALL A2TXT ;
LD (HL),"." ;
INC HL
LD A,B ;
AND 0X3F ; 6
CALL A2TXT ;
BIT 6,B ;
?
JR NZ,UNVERS1
LD DE,TXT2 ;
-
,
LD BC,TXT2E-TXT2
JR UNVERS2
UNVERS1 LD DE,TXT3 ;
LD BC,TXT3E-TXT3
UNVERS2 LD (HL)," " ;
(
)
INC HL
EX DE,HL
LDIR ;
EX DE,HL
LD (HL),0 ;
RET
;
"A"
.
0 99
A2TXT PUSH HL ;
LD L,A
LD H,0
LD DE,10
XOR A
DEC A
INC A
SBC HL,DE
JR NC,$-3 ;
ADD HL,DE ;
ADD A,"0" ;
LD D,A ;
LD A,L ;
ADD A,"0" ;
POP HL ;
LD (HL),D ;
INC HL
LD (HL),A ;
INC HL
RET
; SD
;
-
;
;
0,
LDINSD LD BC,ZXDATRD ;
LD HL,RAMCEND ;
PUSH HL
IN A,(C) ;
OUT (CLRCBIT),A ;
EX AF,AF'
LDINSD1 CALL WDY
IN A,(C)
LD (HL),A
INC HL
AND A
JR NZ,LDINSD1 ;
0
EX AF,AF'
POP HL
JP LOAD_SD ;
SD
;
LOADUPDATE LD HL,UPDATENAME ;
LD A,2 ; 2
OUT (CLRCBIT),A
JP LOAD_SD
; SD
STATSD LD A,(STATUS)
OUT (ZXDATWR),A
OUT (CLRCBIT),A
RET
; SD
;,
RROMSD LD HL,F_PATH ;
XOR A
CALL LOAD_SD ;
AND A
RET NZ ;
,
JP JPLDROM
;
;0-
;1-
;2-
RUNCOD LD BC,ZXDATRD ;
IN A,(C) ;
OUT (CLRCBIT),A ;
OUT (MPAG),A
CALL WDY
IN L,(C) ;
CALL WDY
IN H,(C) ;
JP (HL) ;
;0-
;1-
;2-
;
32
LOADCOD LD BC,ZXDATRD ;
LD HL,0X8000 ;
IN A,(C) ;
OUT (CLRCBIT),A ;
OUT (MPAG),A ;
CALL WDY
IN E,(C) ;
CALL WDY
IN D,(C) ;
LOADCO1 CALL WDY
INI
LD A,H
AND A
RET Z ;
,
DEC DE
LD A,D
OR E
JR NZ,LOADCO1 ;
RET
; 32
LOADROM XOR A
OUT (MPAG),A ;
LD HL,0X8000 ;
OUT (CLRCBIT),A ;
LD BC,ZXDATRD ;
LOADROM1 CALL WDY
INI
LD A,H
AND A
JR NZ,LOADROM1 ;
RET
; ROM
GS105 LD HL,STRPAG ;
LD A,4 ;
4 8
MOV1 EX AF,AF' ;
LD A,0X30
OUT (GSCFG0),A ;
LD A,2
OUT (MPAG),A ; 2
PUSH HL
LD DE,RAM8KB
LD BC,0X2000
LDIR ;
8
LD A,0X31
OUT (GSCFG0),A ;
XOR A
OUT (MPAG),A ; 0
POP DE
LD HL,RAM8KB
LD BC,0X2000
LDIR ;
8
EX DE,HL
EX AF,AF'
DEC A
JR NZ,MOV1 ; 4
;
JPLDROM XOR A
OUT (MPAG),A ; 0
; LD A,0X13 ; 12,
; LD A,0X23 ; 20,
LD A,3+FREQUENCY ; ,
OUT (GSCFG0),A
JP 0 ;
;
WDY IN A,(ZXSTAT)
RLA
JR NC,WDY
RET
;
WDN IN A,(ZXSTAT)
RLA
JR C,WDN
RET
;
CRC16
GET_CRC LD A,2
OUT (MPAG),A
DEC A
OUT (GSCFG0),A
LD HL,(0X8000)
SRL H
RR L
SRL H
RR L
SRL H
RR L
SRL H
RR L
LD A,L
LD IYH,A
; LD IX,0X8000
; LD C,(IX+0)
; LD B,(IX+1)
; CALL CRC16
; LD C,(IX+0)
; LD B,(IX+1)
; LD A,0X81
; AND A
; SBC HL,BC
; JR NZ,OUT_ERR ;CRC16 ERROR
LD IX,0X8000+8-0X10
SCHET LD DE,0X10
ADD IX,DE ; IX
LD C,(IX+4)
LD B,(IX+5) ; BC
LD E,(IX+1)
LD L,(IX+2)
LD H,(IX+3)
LD A,L
AND 0X7F
LD D,A ; DE
ADD HL,HL
LD A,2
ADD A,H
LD IYL,A
OUT (MPAG),A ;
PUSH IX
LD IX,0X8000
ADD IX,DE ; IX
CALL CRC16
POP IX
LD C,(IX+6)
LD B,(IX+7)
LD A,0X82
AND A
SBC HL,BC
JR NZ,OUT_ERR
DEC IYH
JR NZ,SCHET
ERR_OK LD A,0X80
;CRC16 ERROR
;0X80-CRC16 OK
;0X81-CRC16 ERROR
;0X82-CRC16 ERROR
OUT_ERR OUT (CLRCBIT),A
OUT (ZXDATWR),A
CALL WDN
LD A,L
OUT (ZXDATWR),A
CALL WDN
LD A,H
OUT (ZXDATWR),A
RET
CRC16 LD HL,0XFFFF
LD DE,0X1021
CRC_0 LD A,(IX)
INC IX
EX AF,AF'
LD A,IXL
OR IXH
JR NZ,CRC_3
INC IYL
LD A,IYL
OUT (MPAG),A
LD IX,0X8000
CRC_3 EX AF,AF'
XOR H
LD H,A
LD A,8
CRC_1 ADD HL,HL
JR NC,CRC_2
EX AF,AF'
LD A,L
XOR E
LD L,A
LD A,H
XOR D
LD H,A
EX AF,AF'
CRC_2 DEC A
JR NZ,CRC_1
DEC BC
LD A,B
OR C
JR NZ,CRC_0
LD A,2
OUT (MPAG),A
RET
;---------------------------------
;
BUF_512 EQU 0X5000 ;0X200
TDIRCLS EQU BUF_512+0X0200 ;0X400
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
NGS_MODES EQU LSTLOAD+4 ;1
;SD
ZAW003 LD A,0XEE
WR_STAT LD SP,(OLD_SP)
LD (STATUS),A
RET
;
;
:A-
;HL-
;
. ROOT
;
(
512 )
;
:
=0X80-
1
;=0X401-
3
;
: A=
;0X00-
;0XAA-
;0XDD-FAT
;0XEE-SD
LOAD_SD LD IYL,A;LY,A ;
LD (ADRPATH),HL ;
LD (OLD_SP),SP ;
LD A,0XFF
LD (LSTLOAD+3),A ;
LD A,1
OUT (GSCFG0),A ; ,
LD A,%10011011
OUT (SCTRL),A ; CS=1 SD
LD B,0X10
LOADSD1 LD A,0XFF
OUT (SD_SEND),A ;
0X80 0XFF
DJNZ LOADSD1
XOR A ;256 SD
EX AF,AF'
LD A,1
OUT (SCTRL),A ; SD CS=0
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
LD BC,SD_SEND
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,(BUF_512+0X16) ;BPB_FATSZ16
LD A,D
OR E
JR NZ,RDFAT01 ;
FAT12/16 (BPB_FATSZ16=0)
LD DE,(BUF_512+0X24)
LD HL,(BUF_512+0X26) ;BPB_FATSZ32
;
+36
RDFAT01 LD (SEC_FAT+2),HL
LD (SEC_FAT),DE ;
FAT-
LD HL,0
LD DE,(BUF_512+0X13) ;BPB_TOTSEC16
LD A,D
OR E
JR NZ,RDFAT02 ;
FAT12/16 (BPB_TOTSEC16=0)
LD DE,(BUF_512+0X20)
LD HL,(BUF_512+0X22) ;BPB_TOTSEC32
;
+32
RDFAT02 LD (SEC_DSC+2),HL
LD (SEC_DSC),DE ;-
/
;
ROOTDIRSECTORS
LD BC,(BUF_512+0X0B) ;BPB_BYTSPERSEC
LD DE,(BUF_512+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,(BUF_512+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,(BUF_512+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,(BUF_512+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-
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,(BUF_512+0X2C)
LD BC,(BUF_512+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
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 ;
DEC SP
DEC SP
POP HL ; HL
PUSH BC
PUSH DE
CALL LOADZP ;
( )
LD A,E
AND A
JR Z,$+3 ;
=0?
INC D ;
256
BIT 0,D ;
/
JR Z,$+3 ;
,
INC D ;
256
CALL BCDE200 ;
512 (
)
PUSH DE
EXX
POP HL
EXX
LD A,(BYTSSEC) ;
LD IXH,A ;
POP DE
POP BC
LD HL,0X8000 ;
;HX-
;HL'--
;BCDE-
;LY-
LD A,IYL ;
AND A
JR NZ,CP_PAGE ;
0
OUT (MPAG),A ;
0
EXX
LD A,L
LD DE,0X41
SBC HL,DE
JR C,$+4 ;
0X41
LD A,0X40 ; 0X40
EXX
JP LDMINI ;
; 1
CP_PAGE DEC A
LD A,0XAA
JP Z,WR_STAT
LD A,IYL
;
LDFILE0 OUT (MPAG),A ;
; 02...7F
LD_FILE EXX
LD E,IXH
LD D,0 ;DE=
AND A
SBC HL,DE ;
LD IXL,IXH ;LX=
EXX
JR NC,LDFILE1
EXX ;
ADD HL,DE
LD A,L
LD IXL,A ;LX=
EXX
LDFILE1 PUSH BC
PUSH DE
PUSH HL
CALL REALSEC ;
LD A,IXL
CP 0X41 ;
0X40?
JR C,$+4
LD A,0X40 ;
0X40
POP HL
LD IYH,A
CALL RDMULTI ;
LD A,IXH
AND 0X80
JR Z,LDFILE2
LD A,IXL
SUB IYH
JR Z,LDFILE4
JR C,LDFILE4
LD HL,0X40
ADD HL,DE
EX DE,HL
LD HL,0
ADC HL,BC
LD B,H
LD C,L
LD L,A
INC IYL
LD A,IYL
CP 0X40
JR C,LDFILE3
LDFILE4 INC SP
INC SP
INC SP
INC SP
JR LDEFILE
LDFILE3 OUT (MPAG),A ;
LD A,L
LD HL,0X8000
CALL RDMULTI
LDFILE2 POP DE
POP BC
PUSH HL
CALL RDFATZP
CALL LST_CLS
POP HL
JR C,LDEFILE
LD A,IXL
CP IXH
JR C,LDEFILE
LD A,H
AND A
JR NZ,LD_FILE
LD HL,0X8000
INC IYL
LD A,IYL
CP 0X40
JR C,LDFILE0
LDEFILE XOR A
JP WR_STAT
LDMINI EXX
LD L,A
LD A,IXH
LD H,A
CP L
JR C,$+3
LD A,L
EXX
PUSH BC
PUSH DE
PUSH AF
PUSH HL
CALL REALSEC
POP HL
POP AF
CALL RDMULTI
POP DE
POP BC
LD A,H
AND A
RET Z
PUSH HL
CALL RDFATZP
CALL LST_CLS
POP HL
JR C,LDEFILE
EXX
LD A,L
SUB H
EXX
JR NC,LDMINI
JR LDEFILE
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 (BUF_512)+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,BUF_512
RET
LOADLST1 LD HL,BUF_512 ;
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
LD BC,0X0600+SD_SEND ; 6
OTIR
POP BC
RET
; SD
0
OUT_COM PUSH BC
LD BC,SD_SEND
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
LD BC,SD_RSTR
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
LD C,SD_SEND
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 IN A,(SD_RSTR)
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'
LD BC,SD_RSTR
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
;
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
RAMCEND
DEPHASE