MASTER EQU 0 SLAVE EQU 1 ;======================================================== R170 EQU #0050 ;Data R171 EQU #0051 ;Error R172 EQU #0052 ;Direct R173 EQU #0053 ;Reserve R174 EQU #0054 ;Lenght block low R175 EQU #0055 ;Lenght block high R176 EQU #4052 ;Drive device R177 EQU #4053 ;Status W170 EQU #0150 ;Data W171 EQU #0151 ;???? W172 EQU #0152 ;???? W173 EQU #0153 ;Reserve W174 EQU #0154 ;Lenght block low W175 EQU #0155 ;Lenght block high W176 EQU #4152 ;Drive device W177 EQU #4153 ;Command BSY EQU 7 DRQ EQU 3 ERR EQU 0 ;-----------------------------------------------------------------------; SIZESEC: DW #0800 PKTSIZE: DB 12 ;-----------------------------------------------------------------------; CDCMD BIT 7,C JP NZ,EXTCD INC C DEC C JP Z,RESETCD ; 0 DEC C JP Z,RESETCD ; 1 DEC C JP Z,NOPCDC ; 2 DEC C JP Z,CHEK_C ; 3 DEC C JP Z,GBPB_C ; 4 ; [ ] перенести в DSS DEC C JP Z,READC ; 5 DEC C JP Z,NOPCDC ; 6 NOPCDC LD A,1 SCF RET EXTCD RES 7,C INC C DEC C JP Z,NOPCDC DEC C JP Z,OPENC DEC C JP Z,CLOSC JP NOPCDC RESETCD LD B,50 RESECD PUSH BC LD A,(CDDRIVE) CALL CD_TEST POP BC RET NC OR A RET Z EI HALT DJNZ RESECD RET CHEK_C LD A,(CDDRIVE) CALL CD_TEST LD A,#FF AND A RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; [ ] перенести в DSS GBPB_C LD HL,CD_BPB LD BC,#0200 LDIR XOR A RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; READC LD A,(CDDRIVE) JP CD_READ OPENC LD A,(CDDRIVE) JP CD_OPEN CLOSC LD A,(CDDRIVE) JP CD_CLOS CD_TEST LD HL,CMDNOPP LD DE,0 JP AP_COM CD_OPEN LD HL,CMDOPEN LD DE,0 JP AP_COM CD_CLOS LD HL,CMDCLOS LD DE,0 JP AP_COM ; HL:IX - SECTOR ; DE - ADDRESS ; B - SECTOR COUNT ; A - DRIVE CD_READ: LD C,A LD A,H LD (SECREAD+0),A LD A,L LD (SECREAD+1),A LD A,XH LD (SECREAD+2),A LD A,XL LD (SECREAD+3),A LD A,B LD (COUNT+1),A LD HL,CMDREAD LD A,C CALL AP_COM RET ; INPUT: HL - AP paket (12bytes) ; RETURN: CF - ERROR ; 01h - RECOVERED ERROR ; 02h - NOT READY ; 03h - MEDIUM ERROR ; 04h - HARDWARE ERROR ; 05h - ILLEGAL REQUEST ; 06h - UNIT ATTETION ; 07h - DATA PROTECT ; 0Bh - ABORTED COMMAND ; 80h - TIME OUT AP_COM ;AND #01 ;LD A,#A0 ;0 ;JR Z,APCOM1 ;LD A,#B0 APCOM1 ;LD BC,W176 ;OUT (C),A ;SELECT DRIVE EXX LD DE,#8000 LD BC,R177 CALL WAITPRT EXX JR NC,CDREADY LD BC,W177 LD A,#08 OUT (C),A LD B,#80 DJNZ $ EXX LD DE,#8000 LD BC,R177 CALL WAITPRT EXX RET C CDREADY XOR A EXX LD BC,W171 OUT (C),A LD DE,(SIZESEC) ;SIZE BLOCK LD BC,W174 OUT (C),E LD BC,W175 OUT (C),D LD BC,W177 LD A,#A0 ;ATAPI.Packet OUT (C),A LD DE,#8000 LD BC,R177 CALL WAITPRT EXX RET C EXX LD DE,#0908 LD BC,R177 CALL WAITPRT EXX BIT ERR,A JR NZ,CDERROR JR NC,YEP_DRQ LD A,#80 RET YEP_DRQ LD BC,W170 LD A,(PKTSIZE) SRL A OUTPKT OUTI OUTI DEC A JR NZ,OUTPKT LD B,#80 DJNZ $ AP_LOOP EXX LD DE,#8000 LD BC,R177 CALL WAITPRT EXX RET C LD BC,R177 IN A,(C) BIT ERR,A JR Z,NO_ERR CDERROR LD BC,R171 ;ERROR IN A,(C) RRCA RRCA RRCA RRCA AND #0F SCF RET NO_ERR BIT DRQ,A LD A,0 RET Z ;NO DATA REQUEST EX DE,HL LD BC,R174 IN E,(C) LD BC,R175 IN D,(C) ;TRANSFER BLOCK SIZE LD A,D OR E RET Z ;BLOCK = 0 LD BC,R172 IN A,(C) AND #02 ;CP #02 JP NZ,FROM_CD TO_CD LD BC,R170 WR_T_CD OUTI OUTI DEC DE DEC DE LD A,D OR E JR NZ,WR_T_CD EX DE,HL JR AP_LOOP FROM_CD LD A,H OR L JR Z,NULL LD BC,R170 RD_F_CD INI INI DEC DE DEC DE LD A,D OR E JR NZ,RD_F_CD EX DE,HL JR AP_LOOP NULL LD BC,R170 RD_N_CD IN A,(C) DEC B IN A,(C) DEC B DEC DE DEC DE LD A,D OR E JR NZ,RD_N_CD ; DE = 0 !!! JR AP_LOOP ; E - Second * 10 PAUSE LD HL,#0000 PAUSE1 DEC L JR NZ,PAUSE1 DEC H JR NZ,PAUSE1 DEC E JR NZ,PAUSE1 RET ; D - MASK ; E - PATTERN ; BC - PORT WAITPRT LD A,100 LD HL,#0000 WAITPX EX AF,AF' WAITP0 IN A,(C) CP #FF JR Z,WAITP1 AND D CP E JR NZ,WAITP2 AND A RET WAITP2 DEC L JR NZ,WAITP0 DEC H JR NZ,WAITP0 EX AF,AF' DEC A JR NZ,WAITPX EX AF,AF' WAITP1 SCF RET CMDNOPP DEFB #00 DEFB 00,00,00 DEFB #00 DEFB 00,00,00 DEFB 00,00,00 DEFB #00 CMDOPEN DEFB #1B DEFB #00,#00,#00 DEFB #02 DEFB #00,#00,#00,#00,#00,#00,#00 CMDCLOS DEFB #1B DEFB #00,#00,#00 DEFB #03 DEFB #00,#00,#00,#00,#00,#00,#00 ;CMDREAD DEFB #28,#00 CMDREAD DEFB #28,#00 SECREAD DEFB #00,#00,#00,#00 DEFB #00 COUNT DEFB #00,#01 DEFB #00,#00,#00 ; Area for boot sector [512Bytes] CD_BPB DB #00,#00,#00 ; +00 JMP DB " " ; +03 DOS NAME ; Block Parameters BIOS DW #0200 ; +0B BYTE PER SECTOR DB 4 ; +0D SECTORS PER CLUSTER DW 1 ; +0E RESERVE SECTORS DB 1 ; +10 AMOUNT FATS DW 512 ; +11 FILES IN DIRECTORY DW 0 ; +13 ALL SECTORS ON DISK DB #F8 ; +15 ID FORMAT DW 1 ; +16 SIZE FAT IN SECTORS DW 63 ; +18 SECTOR PER TRACK DW 255 ; +1A AMOUNT SIDES DW #0010 ; +1C HIDDEN SECTORS DS 24 DB "FAT16" ; +36 FAT ID DS 453 ; end boot sector ;========================================================