URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [fmt/] [fmt_ide.asm] - Rev 131
Go to most recent revision | Compare with Previous | Blame | View Log
*** FLEX 9 DISK DRIVERS** FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM* THE FIRST 64K IS USED BY FLEX,* THE SECOND 128K IS USED AS A ROM DISK* THE REMAINING RAM IS USED FOR A RAM DISK**CFLAG EQU $01 CARRY FLAGVFLAG EQU $02 OVERFLOW FLAGZFLAG EQU $04 ZERO FLAGNFLAG EQU $08 NEGATIVE FLAGIFLAG EQU $10 IRQ MASK CCHFLAG EQU $20 HALF CARRYFFLAG EQU $40 FIRQ MASK CCEFLAG EQU $80 ENTIRE FLAG*MAPPAG EQU $00 PAGE $0000 DAT ADDRESS** Serial Port*ACIAS EQU $E000ACIAC1 EQU ACIASACIAD1 EQU ACIAS+1DELCON EQU 1250 Delay (Processor clock in MHz * 50)** XMODEM Control characters*SOH EQU $01EOT EQU $04ACK EQU $06NAK EQU $15CAN EQU $18** Some dummy Constants*RMAXTRK EQU 64RMAXSEC EQU 255RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC** Start*ORG $0100START LBSR UFSUBJMP [$F800] Jump to monitor on Completion.*** RAM SPACE*DRVNUM FCB 0TRACK FCB 0SECTOR FCB 0CHKSUM FCB 0BLKNUM FCB 0 Xmodem block numberBYTCNT FCB 0 Xmodem byte countXSTATE FDB 0 Xmodem State VectorDELCNT FCB $00,$00,$00 Xmodem Poll timerMAXTRK FCB 0MAXSEC FCB 0ORG $0200** SECTOR BUFFER*BUFFER RMB 256*** recieve char from remote drive.* timeout if no response for approx 1s.* Entry: no parameters* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.*RCHAR PSHS X,Y*LDX #1000 1000x inner loopRCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).RCHAR2 LDA ACIAC1 test for recieved charASRABCS RCHAR3 get characterLEAY -1,Y else, continue to count delayBNE RCHAR2LEAX -1,XBNE RCHAR1PULS X,Y,PC return with error if timed out*RCHAR3 LDA ACIAD1 return data (carry bit still set)PULS X,Y,PC*** transmit char to remote drive.* timeout if no response for approx 1s. (allows for use of hardware flow control)* Entry: (A) = char to transmit* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.*SCHAR PSHS X,YPSHS A*LDX #1000 1000x inner loopSCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).SCHAR2 LDA ACIAC1 test for space in transmit FIFOASRAASRABCS SCHAR3 send characterLEAY -1,Y else, continue to count delayBNE SCHAR2LEAX -1,XBNE SCHAR1PULS APULS X,Y,PC return with error if timed out*SCHAR3 PULS ASTA ACIAD1 send data (carry bit still set)PULS X,Y,PC*** 'UF' Format IDE Drive to FLEX standard.*DISFOS FCB $0A,$0DFCC 'Formating IDE disk... 'FCB $0A,$0DFCC 'Drive Number ?'FCB 4MESS6 FCB $0A,$0D,4FCC 'IDE drive not allocated! 'FCB 4UFMSG1 FCB $0A,$0DFCC 'Format Complete'FCB 4*UFSUB JSR INITDRLDX #DISFOSJSR PDATA1UFSUB1 LBSR RCHARBCC UFSUB1LBSR SCHARCMPA #'0'LBLO UFEXITCMPA #'3'LBHI UFEXITSUBA #'0'TFR A,BSTB DRVNUMLDX #DRVNUM-3JSR DRVSEL** set up free chain*LDX #BUFFER clear out bufferCLRACLRBDFL1 STA 0,X+DECBBNE DFL1*CLR TRACKLDA #1STA SECTORDFL2 LDX #BUFFERLDA TRACKSTA 0,XLDA SECTORINCACMPA #RMAXSEC+1 last sector on track?BNE DFL3INC 0,XLDA #1DFL3 STA 1,XLDA TRACKLDB SECTORJSR WRITSCINC SECTORLDA SECTORCMPA #RMAXSEC+1BNE DFL2LDA #1STA SECTORINC TRACKLDA TRACKCMPA #RMAXTRKBNE DFL2* break free chain at last track/sectorLDX #BUFFERLDA #RMAXTRK-1LDB #RMAXSECJSR READSCLDX #BUFFERCLR 0,XCLR 1,XLDA #RMAXTRK-1LDB #RMAXSECJSR WRITSC* set up sector structure, SIR, directory etcLDX #BUFFERCLRALDB #RMAXSECJSR READSCLDX #BUFFERCLR 0,X break end of directory chainCLR 1,XCLRALDB #RMAXSECJSR WRITSC*LDX #BUFFERCLRALDB #3 set up SIRJSR READSCLDX #BUFFERCLR 0,X break forward linkCLR 1,XLDD #$5241 set volume name (RAMDISK )STD 16,XLDD #$4D44STD 18,XLDD #$4953STD 20,XLDD #$4B20STD 22,XLDD #1 volume numberSTD 27,XLDD #$0101 first trk/sec 01-01STD 29,XLDA #RMAXTRK-1LDB #RMAXSECSTD 31,XSTD 38,XLDD #RTOTSEC total DATA sectors (2912-14)STD 33,X*LDA #01 month set default creation date (SYS09's birthday!)STA 35,XLDA #07 daySTA 36,XLDA #07 yearSTA 37,X*RF3 CLRALDB #3JSR WRITSC** Not sure what this is about* put bootstrap on track 0 sector 1** LDX #BUFFER* CLRA* LDB #1* JSR READSC* LDX #BUFFER* LDA #$AA set the init flag* STA 0,X* LDA #$55* STA 1,X* CLRA* LDB #1* JSR WRITSC** Write Boot sector*LDX #$C000CLRA TRACK 0LDB #$01 SECTOR 1STA TRACKSTB SECTORLBSR WRITSC*UFEXIT LDX #UFMSG1JMP PDATA1** Read a byte from the serial port*LRBYTE PSHS BBSR LRHEX Get hex digit.ASLAASLA Shift to msb.ASLAASLATFR A,B Save in B.BSR LRHEX Get next digit.PSHS BADDA 0,S+ Add together bytes.PULS B,PC*LRHEX JSR INTERBVS LRHEXSUBA #$30 Remove ascii bias.BMI LRHEXCMPA #$09 Number?BLE LRHEX1 Yes.CMPA #$11 Keep testing.BMI LRHEXCMPA #$16BGT LRHEXSUBA #$07LRHEX1 RTS** ACIA INPUT TEST*INTEST LDA ACIAC1BITA #$01RTS** RESET ACIA*ACIRST LDA #$03 master resetSTA ACIAC1LDA #$11STA ACIAC1RTS** ACIA INPUT*INTER LDA #16STA DELCNT+0CLR DELCNT+1CLR DELCNT+2INTER0 LDA ACIAC1BITA #$01BNE INTER1BITA #$78BEQ INTER2BSR ACIRSTBRA INTER*INTER1 LDA ACIAD1ANDCC #VFLAGRTS*INTER2 DEC DELCNT+2BNE INTER0DEC DELCNT+1BNE INTER0DEC DELCNT+0BNE INTER0CLRAORCC #VFLAGRTS** ACIA OUTPUT*OUTTER PSHS A*OUTTE1 LDA ACIAC1BITA #$02BNE OUTTE2BITA #$78BEQ OUTTE1BSR ACIRSTBRA OUTTE1*OUTTE2 PULS ASTA ACIAD1RTS** Print Data*PDATA0 BSR OUTTERPDATA1 LDA ,X+CMPA #$04BNE PDATA0RTS*** FLEX 9 IDE DISK DRIVERS** FOR SYS09BUG 1.2 ON THE XSA-3S1000* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000**IMASK EQU $10 IRQ MASK CCFMASK EQU $40 FIRQ MASK CC*CF_BASE EQU $E100CF_DATA EQU CF_BASE+0CF_ERROR EQU CF_BASE+2 ; read errorCF_FEATURE EQU CF_BASE+2 ; write featureCF_SCNT EQU CF_BASE+4CF_SNUM EQU CF_BASE+6CF_CLO EQU CF_BASE+8CF_CHI EQU CF_BASE+10CF_HEAD EQU CF_BASE+12CF_STATUS EQU CF_BASE+14 ; read statusCF_COMAND EQU CF_BASE+14 ; write commandCF_AUX EQU CF_BASE+30** Command Equates*CMDREAD EQU $20 ; Read Single sectorCMDWRITE EQU $30 ; Write Single sectorAUXRESET EQU $06AUXRSTREL EQU $02HEADLBA EQU $E0** Status bit equates*BSY EQU $80DRDY EQU $40DRQ EQU $08ERR EQU $01*** INITIALIZE CF CARD FOR 8 BIT LBA MODE*INITDR LDD #AUXRESETSTD CF_AUXLDD #AUXRSTRELSTD CF_AUXLDD #HEADLBASTD CF_HEADBRA WAITRDY** RESTORE DISK DRIVER (SEEK TRACK 00)*RESTR1 BSR DRVSELCLRA ; Track 0LDB #$01 ; Sector 1** Seek track and sector* A holds track number (0 - ??)* B holds sector number (1 - ??)* Sector numbers starts from 1* subtract 1 to start from sector 0 on CF*SEEKTS PSHS ACLRADECBSTD CF_SNUMLDB ,SSTD CF_CLOLDB DRVNUMSTD CF_CHILDB #$01STD CF_SCNTCLRBPULS A,PC** READ SECTORS FROM CF**READSC BSR SEEKTSLDD #CMDREAD ; IDE READ MULTIPLESTD CF_COMANDBSR WAITRDY** READ LOOP*PSHS YLDY #256RDLP1 BSR WAITDRQLDD CF_DATASTB ,X+LEAY -1,YBNE RDLP1PULS Y*BSR WAITRDYCLRBRTS** WRITE SECTOR TO CF*WRITSC BSR SEEKTS ; SEEK TRACK & SECTORLDD #CMDWRITE ; IDE WRITE MULTIPLESTD CF_COMANDBSR WAITRDY** WRITE LOOP*PSHS YLDY #256CLRAWRTLP1 BSR WAITDRQLDB ,X+STD CF_DATALEAY -1,YBNE WRTLP1PULS Y*BSR WAITRDYCLRBRTS** CHECK FOR BUSY* Doubles as VERIFY*BUSY CLRB Never busyRTS** DRIVE SELECT DISK DRIVER*DRVSEL LDA 3,X GET DRIVE # FROM FCBCMPA #3BLS DRVS2 IF > 3, SET IT TO 0CLRADRVS2 STA DRVNUMCLRB ; SET Z, CLEAR CRTS** CHECK DRIVE READY DISK DRIVER*CHKDRV LDA 3,XCLRB ; CLEAR C, SET ZRTS** WAIT UNTIL READY*WAITRDY LDD CF_STATUSBITB #BSYBNE WAITRDYLDD CF_STATUSBITB #DRDYBEQ WAITRDYRTS** WAIT FOR DATA REQUEST*WAITDRQ LDD CF_STATUSBITB #DRQBEQ WAITDRQRTS********************************************************** Bootstrap FLEX Loader** SBUG1.8 loads the bootstap loader at $C000* however the Flex adaption manual has the* bootstrap loader residing at $C100********************************************************* Equates*STACK EQU $C0FFSCTBUF EQU $C300** Start of Utility*ORG $C000BOOT BRA LOAD0FCB 0,0,0TRK FCB 0 File start trackSCT FCB 0 File start sectorDNS FCB 0 Density Flag (not used)TADR FDB $C000 Transfer addressLADR FDB 0 Load AddressDRNUM FCB 0 Drive number 0*LOAD0 LDS #STACK Set up stackLDD TRK Set up start track and sectorSTD SCTBUFLDY #SCTBUF+256** Perform actual file load*LOAD1 BSR GETCH Get acharcaterCMPA #$02 Data record hearder ?BEQ LOAD2 Skip, is soCMPA #$16 Xfr address hearder ?BNE LOAD1 Loop if neither** Get transfer address*BSR GETCHSTA TADRBSR GETCHSTA TADR+1BRA LOAD1** Load data record*LOAD2 BSR GETCH Get load addressSTA LADRBSR GETCHSTA LADR+1BSR GETCH Get Bytes countTFR A,BTSTBBEQ LOAD1 Loop if count = 0LDX LADR Get load addressLOAD3 PSHS B,XBSR GETCH Get data characterPULS B,XSTA ,X+ Store at load addressDECBBNE LOAD3 Loop until count = 0BRA LOAD1** Get Character routine* Reads a sector if needed*GETCH CMPY #SCTBUF+256 out of data ?BNE GETCH4 Go read Character if notGETCH2 LDX #SCTBUF Point to bufferLDD 0,X Get forward LinkBEQ GO if zero, file is loadedBSR READ Read next sectorBNE BOOT start over if errorLDY #SCTBUF+4 Point past linkGETCH4 LDA ,Y+ Else, get a characterRTS** File is loaded, Jump to it*GO JMP [TADR] Jump to transfer address*** FLEX 9 IDE DISK DRIVERS** FOR SYS09BUG 1.2 ON THE XSA-3S1000* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000**IMASK EQU $10 IRQ MASK CC*FMASK EQU $40 FIRQ MASK CC**CF_BASE EQU $E100*CF_DATA EQU CF_BASE+0*CF_ERROR EQU CF_BASE+2 ; read error*CF_FEATURE EQU CF_BASE+2 ; write feature*CF_SCNT EQU CF_BASE+4*CF_SNUM EQU CF_BASE+6*CF_CLO EQU CF_BASE+8*CF_CHI EQU CF_BASE+10*CF_HEAD EQU CF_BASE+12*CF_STATUS EQU CF_BASE+14 ; read status*CF_COMAND EQU CF_BASE+14 ; write command*CF_AUX EQU CF_BASE+30** Command Equates**CMDREAD EQU $20 ; Read Single sector*CMDWRITE EQU $30 ; Write Single sector*HEADLBA EQU $E0*AUXRESET EQU $06*AUXRSTREL EQU $02** Status bit equates**BSY EQU $80*DRDY EQU $40*DRQ EQU $08*ERR EQU $01** Seek track and sector* A holds track number (0 - ??)* B holds sector number (1 - ??)* Sector numbers starts from 1* subtract 1 to start from sector 0 on CF*SEEK PSHS ACLRADECBSTD CF_SNUMLDB ,SSTD CF_CLOLDB DRNUMSTD CF_CHILDB #$01STD CF_SCNTCLRBPULS A,PC** READ SECTORS FROM CF**READ BSR SEEKLDD #CMDREAD ; IDE READ MULTIPLESTD CF_COMANDBSR WTRDY** READ LOOP*PSHS YLDY #256READ1 BSR WTDRQLDD CF_DATASTB ,X+LEAY -1,YBNE READ1PULS Y*BSR WTRDYCLRBRTS** WAIT UNTIL READY*WTRDY LDD CF_STATUSBITB #BSYBNE WTRDYLDD CF_STATUSBITB #DRDYBEQ WTRDYRTS** WAIT FOR DATA REQUEST*WTDRQ LDD CF_STATUSBITB #DRQBEQ WTDRQRTS*END START
Go to most recent revision | Compare with Previous | Blame | View Log
