URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [sys09bug/] [sys09ide.asm] - Rev 78
Go to most recent revision | Compare with Previous | Blame | View Log
*** SYS09BUG MONITOR EXTENSIONS** FOR SYS09BUG ON THE XESS XSA-3S100 / XST-3.0* WITH I/O MAPPED AT $XE000* 16 BIT IDE MAPPED AT $E100* AND ROM MAPPED AT $XF000**PAGE***************************************************** Serial PROM register****************************************************** CONFIGURATION PROM DEFINITIONS*PROMREG EQU MONIO+$C0PCLKHI EQU $01 Toggle PROM Clock HighPCLKLO EQU $00 Toggle PROM Clock LowPRSTHI EQU $02 Toggle PROM Reset HighPRSTLO EQU $00 Toggle PROM Reset LowSYNCHI EQU $AA55 Synch Pattern High WordSYNCLO EQU $FF00 Synch Pattern Low Word****************************************************** START OF ROM *****************************************************MONITV EQU MONROM+0 FDB MONITORNXTCMV EQU MONROM+2 FDB NEXTCMDINCHV EQU MONROM+4 FDB INCHINCHEV EQU MONROM+6 FDB INCHEINCHKV EQU MONROM+8 FDB INCHEKOUTCHV EQU MONROM+10 FDB OUTCHPDATAV EQU MONROM+12 FDB PDATAPCRLFV EQU MONROM+14 FDB PCRLFPSTRGV EQU MONROM+16 FDB PSTRNGLRAV EQU MONROM+18 FDB LRA** Condition code flags*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** Serial Port*ACIAC1 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 Disk Constants*RMAXTRK EQU 256RMAXSEC EQU 255RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC** RAM SPACE** PUT THIS DOWN THE BOTTOM OF MEMORY*ORG $0100DRVNUM RMB 1TRACK RMB 1SECTOR RMB 1CHKSUM RMB 1BLKNUM RMB 1 Xmodem block numberBYTCNT RMB 1 Xmodem byte countXSTATE RMB 2 Xmodem State VectorDELCNT RMB 3 $00,$00,$00 Xmodem Poll timerMAXTRK RMB 1MAXSEC RMB 1ORG $0200** SECTOR BUFFER*BUFFER RMB 256******************************************* START OF EXTENSION COMMANDS******************************************ORG MONEXTFDB NEXTEXT Jump to next extended command****** NEXTCMD ******NEXTEXT JSR [INCHEV] GET ONE CHAR. FROM TERMINALANDA #$7F STRIP PARITY FROM CHAR.TFR A,BLDA #$20JSR [OUTCHV] PRNT SPACECMPB #$60BLE NXTEX0SUBB #$20****** DO TABLE LOOKUP ****** FOR COMMAND FUNCTIONS*NXTEX0 LDX #EXTTAB POINT TO JUMP TABLENXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?BEQ JMPEXT BRANCH IF MATCH FOUNDLEAX 2,X POINT TO NEXT ENTRY IN TABLECMPX #EXTEND REACHED END OF TABLE YET ?BNE NXTEX1 IF NOT END, CHECK NEXT ENTRYLDX #MSGWHAT POINT TO MSG "WHAT?"LBRA PDATA1 PRINT MSG AND RETURNJMPEXT JMP [,X] JUMP TO COMMAND ROUTINE** EXTENDED COMMAND JUMP TABLE*EXTTAB EQU *FCC 'B' BOOT FLEXFDB UBSUBFCC 'F' FORMAT IDE DISKFDB UFSUBFCC 'X' XMODEM ROM DISK UPLOADFDB UXSUB*EXTEND EQU **MSGWHAT FCC "WHAT ?"FCB $0A,$0D,$04** GO TO FLEX RESIDENT IN MEMORY*UBSUB LDX #$CD00STX 10,UTFR U,SRTI** 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 4VOLMSG FCC 'IDEDISK '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,X*PSHS YLDY #VOLMSGLDB #16DFL4 LDA ,Y+STA B,XINCBCMPB #24BNE DFL4PULS Y*CLRALDB DRVNUM volume numberSTD 27,X*LDD #$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 #BOOTCLRA TRACK 0LDB #$01 SECTOR 1STA TRACKSTB SECTORLBSR WRITSC*UFEXIT LDX #UFMSG1JMP PDATA1** 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 #$FF-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**** 'UX' Xmodem IDE Disk upload*UXMES0 FCB $0D,$0AFCC 'Xmodem IDE Disk Upload'FCB 4UXMES1 FCB $0D,$0AFCC 'Upload Complete'FCB 4UXMES2 FCB $0D,$0AFCC 'Upload Error'FCB 4UXMSG3 FCB $0D,$0AFCC 'Drive Number :'FCB 4UXMSG4 FCB $0D,$0AFCC 'Are You Sure ? (Y/N)'FCB 4** Print Banner*UXSUB LDX #UXMES0LBSR PDATA1** Prompt for Disk drive number (0 to 3)*LDX #UXMSG3LBSR PDATA1UXSUB1 LBSR INTERBVS UXSUB1LBSR OUTTERCMPA #'0LBLO UXEXITCMPA #'3LBHI UXEXITSUBA #'0STA DRVNUM** Report selected drive*LDX #UXMSG3LBSR PDATA1LDA DRVNUMADDA #'0LBSR OUTTER** Ask for confirmation (Y/N)*LDX #UXMSG4LBSR PDATA1UXSUB2 LBSR INTERBVS UXSUB2LBSR OUTTERANDA #$5FCMPA #'NLBEQ UXEXITCMPA #'YBNE UXSUB** We have confirmation ... now load the disk image*LBSR INITDRLDU #XSTSTSTU XSTATELDA #1STA BLKNUM** Sector1*LDX #BUFFER*CLRA TRACK 0LDB #$01 SECTOR 1STA TRACKSTB SECTOR*LBSR XREADLBCS UXERRLBSR XACKLBSR XREADLBCS UXERR*LDX #BUFFERLDA TRACKLDB SECTORLBSR WRITSCLBSR XACK** Sector 2*LDX #BUFFER*LDA TRACKLDB SECTORINCBSTA TRACKSTB SECTOR*LBSR XREADLBCS UXERRLBSR XACKLBSR XREADLBCS UXERR*LDX #BUFFERLDA TRACKLDB SECTORLBSR WRITSC*LBSR XACK** Sector 3 - SIR*LDX #BUFFER*LDA TRACKLDB SECTORINCBSTA TRACKSTB SECTOR*LBSR XREADLBCS UXERRLBSR XACKLBSR XREADLBCS UXERR*LDX #BUFFERLDA 38,XINCASTA MAXTRKLDB 39,XINCBSTB MAXSECLDA TRACKLDB SECTORLBSR WRITSC*LBSR XACK** Sector 4 to Last Track & Sector**LDA TRACKLDB SECTORINCB*UXLOOP LDX #BUFFERSTA TRACKSTB SECTOR*LBSR XREADLBCS UXERRLBSR XACKLBSR XREADLBCS UXERR*LDX #BUFFERLDA TRACKLDB SECTORLBSR WRITSCLBSR XACK*LDA TRACKLDB SECTORINCBCMPB MAXSECBNE UXLOOPLDB #1INCACMPA MAXTRKBNE UXLOOP*** Write Boot sector*LDX #BOOTCLRA TRACK 0LDB #$01 SECTOR 1STA TRACKSTB SECTORLBSR WRITSC*UXEXIT LDX #UXMES1JMP PDATA1*UXERR LDX #UXMES2LBRA PDATA1** Get a Byte using XModem protocol* Carry clear => no errors* Carry set => errors*XREAD PSHS ULDU XSTATE*XBYTE0 LBSR INTERBVC XBYTE1LDA #NAKLBSR OUTTERLDU #XSTSTBRA XBYTE0*XBYTE1 JSR ,UBNE XBYTE0STU XSTATEPULS U,PC** START - LOOK FOR SOH (START OF HEADER) = $01*XSTST CMPA #SOHBNE XSTST1LDU #XSTBLANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS*XSTST1 CMPA #EOTBNE XSTST2LDA #ACKLBSR OUTTERORCC #CFLAG+ZFLAG Set (c)=1 abort & exitRTS*XSTST2 CMPA #CANBNE XSTST3ORCC #CFLAG+ZFLAG Set (c)=1 abort & exitRTS*XSTST3 ANDCC #$FF-CFLAG-ZFLAGRTS** Got SOH* Now get block number*XSTBL CMPA BLKNUMBNE XSTBLELDU #XSTCOMANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Error in block number*XSTBLE LDA #NAKLBSR OUTTERLDU #XSTSTANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Get complement of block number*XSTCOM COMACMPA BLKNUMBNE XSTBLECLR CHKSUMLDA #128STA BYTCNTLDU #XSTDAANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Get data bytes*XSTDA PSHS AADDA CHKSUMSTA CHKSUMPULS ADEC BYTCNTBNE XSTDA1LDU #XSTCKXSTDA1 STA ,X+ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS** Byte count reached zero* Check checksum byte*XSTCK CMPA CHKSUMBNE XSTCK1 retry if wrong checksum** Checksum OK ...* increment block number* Don't send ACK until data written to CF*INC BLKNUMLDU #XSTSTANDCC #$FF-CFLAG No abortORCC #ZFLAG Valid data (exit)RTS** Checksum Error detected ...* Reset Sector counter in ACCB to last 128 byte boundary* and send NAK*XSTCK1 PSHS BTFR X,DDECBANDB #128TFR D,XPULS BLDA #NAKXSTCK2 LBSR OUTTERLDU #XSTSTANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS** Acknowledge Data Received*XACK PSHS ALDA #ACKLBSR OUTTERPULS A,PC**** FLEX 9 IDE DISK DRIVERS** FOR SYS09BUG 1.2 ON THE XSA-3S1000* WITH I/O MAPPED AT $XE000* AND ROM MAPPED AT $XF000*** INITIALIZE CF CARD FOR 8 BIT LBA MODE*INITDR LDD #AUXRESETSTD CF_AUXLDD #AUXRSTRELSTD CF_AUXLDD #HEADLBASTD CF_HEADLBRA WTRDY** 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_SECNUMLDB ,SSTD CF_CYLLOLDB DRVNUMSTD CF_CYLHILDB #$01STD CF_SECCNTCLRBPULS A,PC** READ SECTORS FROM CF**READSC BSR SEEKTSLDD #CMDREAD ; IDE READ MULTIPLESTD CF_COMANDLBSR WTRDY** READ LOOP*PSHS YLDY #256RDLP1 LBSR WTDRQLDD CF_DATASTB ,X+LEAY -1,YBNE RDLP1PULS Y*LBSR WTRDYCLRBRTS** WRITE SECTOR TO CF*WRITSC BSR SEEKTS ; SEEK TRACK & SECTORLDD #CMDWRITE ; IDE WRITE MULTIPLESTD CF_COMANDLBSR WTRDY** WRITE LOOP*PSHS YLDY #256CLRAWRTLP1 LBSR WTDRQLDB ,X+STD CF_DATALEAY -1,YBNE WRTLP1PULS Y*LBSR WTRDYCLRBRTS** 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********************************************************* Bootstrap FLEX Loader** SBUG1.8 loads the bootstap loader at $C000* however the Flex adaption manual has the* bootstrap loader residing at $C100* Bootstrap Loader is position independent code********************************************************* Equates*BSSTACK EQU $C0FFSCTBUF EQU $C300** Start of Utility*ORG MONEXT+$0700BOOT BRA BLOAD0FCB 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*BLOAD0 LDS #BSSTACK Set up Bootstrap stackLDD TRK,PCR Set up start track and sectorSTD SCTBUFLDY #SCTBUF+256** Perform actual file load*BLOAD1 BSR GETCH Get acharcaterCMPA #$02 Data record hearder ?BEQ BLOAD2 Skip, is soCMPA #$16 Xfr address hearder ?BNE BLOAD1 Loop if neither** Get transfer address*BSR GETCHSTA TADR,PCRBSR GETCHSTA TADR+1,PCRBRA BLOAD1** Load data record*BLOAD2 BSR GETCH Get load addressSTA LADR,PCRBSR GETCHSTA LADR+1,PCRBSR GETCH Get Bytes countTFR A,BTSTBBEQ BLOAD1 Loop if count = 0LDX LADR,PCR Get load addressBLOAD3 PSHS B,XBSR GETCH Get data characterPULS B,XSTA ,X+ Store at load addressDECBBNE BLOAD3 Loop until count = 0BRA BLOAD1** 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 GOFLEX 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*GOFLEX JMP [TADR,PCR] Jump to transfer address*** FLEX 9 IDE DISK DRIVERS** 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_SECNUMLDB ,SSTD CF_CYLLOLDB DRNUM,PCRSTD CF_CYLHILDB #$01STD CF_SECCNTCLRBPULS 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 #BUSYBNE WTRDYLDD CF_STATUSBITB #DRDYBEQ WTRDYRTS** WAIT FOR DATA REQUEST*WTDRQ LDD CF_STATUSBITB #DRQBEQ WTDRQRTS*END
Go to most recent revision | Compare with Previous | Blame | View Log
