URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [Flex9/] [f9-monex.asm] - Rev 99
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 ADDRESSDATREG EQU IC11 DAT REGISTERS** 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** DRIVE GEOMETRY*EMAXSEC EQU 14 ROM DISKEMAXTRK EQU 48 3 * 16 * 14 * 256 = 172,032 BytesETOTSEC EQU EMAXTRK*EMAXSEC-EMAXSEC*RMAXSEC EQU 14 RAM DISKRMAXTRK EQU 192 12 * 16 * 14 * 256 = 688,128 BytesRTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC** DRIVE TYPES*DTYPROM EQU 0 ROM DISKDTYPRAM EQU 1 RAM DISKDTYPFLS EQU 2 FLASH DISKDTYPNET EQU 3 FLEXNET DISK*ORG $DE00** DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006* Disk driver for RAM Disk.** 14 SECTORS PER TRACK* 16 * N TRACKS PER DISK** ROM DISK OCCUPIES $10000 - $1E000 ... $30000 - $3E000* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000* Track Buffer page mapped at $E000 - $EFFF* MAPPAG = $00 = 0 x $1000 (4 K pages)* ON SWTPC ROM AT $XF000 AND IO AT $XE000* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER* WHEN USING RAM AS A RAMDISK.* THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT* THE LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED**** FLEX disk jump table.*READ JMP READSCWRITE JMP WRITSCVERIFY JMP BUSYRESTOR JMP RESTR1DRIVE JMP DRVSELDRVRDY JMP CHKRDYQUICK JMP CHKQIKCOLDDR JMP DINITWARMDR JMP DWARMSEEK JMP SEEKTS** RAM SPACE*DRVNUM FCB 0TRACK FCB 0SECTOR FCB 0CHKSUM FCB 0CCSAVE FCB 0BLKNUM FCB 0 Xmodem block numberBYTCNT FCB 0 Xmodem byte countXSTATE FDB 0 Xmodem State VectorDELCNT FCB $00,$00,$00 Xmodem Poll timer** Disc driver type table.* Indexed by drive number*DTYPTAB FCB DTYPROM Drive 0 (ROM Disk)FCB DTYPRAM Drive 1 (RAM Disk)FCB DTYPFLS Drive 2 (FLASH Disk)FCB DTYPNET Drive 3 (NETPC Disk)** RAM Disk offset* Indexed by drive type*DOFFTAB FCB $10 ROM Disk $10000FCB $40 RAM DISK $40000FCB $FF Flash DiskFCB $FF NETPC Disk*REAVEC RMB 2 Disc driver jump table.WRIVEC RMB 2VERVEC RMB 2RSTVEC RMB 2DRVVEC RMB 2CHKVEC RMB 2QUIVEC RMB 2INIVEC RMB 2WARVEC RMB 2SEEVEC RMB 2** SECTOR BUFFER*BUFFER RMB 256SYNCREG RMB 4 Prom input register******************************************* START OF EXTENSION COMMANDS******************************************ORG MONEXTFDB NEXTEXT Jump to next extended command******************************************** Disk drivers ** ------------ ** The system dependant code for the ** disc drivers fits here. Two tables ** must be included. These are DTYPTAB a ** four byte table that defines which of ** the (up to four) following sets of ** jump tables to use, and TABSRT the ** jump tables themselves. For a full ** description of the floppy drivers see ** section 4 (pp9-14) of the general ** Flex adaptation guide. ******************************************** Mass storage drivers for embedded applications.** Jump tables.TABSRT FDB EREAD Drive type 0 (ROM disk).FDB EWRITEFDB ECHECKFDB ECHECKFDB ECHECKFDB ECHECKFDB ECHECKFDB DDUMMYFDB DDUMMYFDB DDUMMY*FDB EREAD Drive type 1 (RAM disk).FDB EWRITEFDB ECHECKFDB ECHECKFDB ECHECKFDB ECHECKFDB ECHECKFDB DDUMMYFDB DDUMMYFDB DDUMMY*FDB DDUMMY Drive type 2 (External Flash disk).FDB DDUMMYFDB DDUMMYFDB DDUMMYFDB DDUMMYFDB DDUMMYFDB DDUMMYFDB DDUMMYFDB DDUMMYFDB DDUMMY*FDB NREAD Drive type 3 (NetPC drive via serial port).FDB NWRITEFDB NVERIFYFDB NCHECKFDB NCHECKFDB NCHECKFDB NCHECKFDB DDUMMYFDB DDUMMYFDB DDUMMY*** Dummy routine (no errors).DDUMMY CLRBTSTB Set (z)=1ANDCC #$FF-CFLAG Set (c)=0RTS* **************************** Main Flex entry points **************************** Read sector routine.* Entry: (X) = address where sector is to be placed.* (A) = Track number.* (B) = Sector number.* Exit: (B) = Error code (z)=1 if no error.READSC JMP [REAVEC]** Write track routine.* Entry: (X) = Address of area of memory from which the data will be taken.* (A) = Track number.* (B) = Sector number.* Exit: (B) = Error condition, (Z)=1 no an error.WRITSC JMP [WRIVEC]** Verify sector routine.* Entry: no parameters.* Exit: (B) = Error condition (Z)=1 if no error.BUSY JMP [VERVEC]** Restore drive to track 00.* Entry: (X) = FCB address (3,X contains drive number).* Exit: (B) = Error condition, (Z)=1 if no error.RESTR1 BSR DRVSEL Select drive first.BEQ RST1RTSRST1 JMP [RSTVEC]** Select current drive.* Entry: (X) = FCB address (3,X contains drive number).* Exit: (B) = Error condition, (Z)=0 and (c)=1 if error.* (B) = $0F if non existant drive.DRVSEL PSHS X,YLDB 3,X Get driver type.STB DRVNUMLDX #DTYPTABLDA B,XCMPA #$FF Is the drive nonexistant?BNE DRIVE1PULS X,YLDB #$0FTSTBORCC #$01RTS*DRIVE1 LDB #20 Get correct table start address.MULLDX #TABSRTLEAX D,XLDY #REAVEC Copy table into ram.LDB #20DRIVE2 LDA 0,X+STA 0,Y+DECBBNE DRIVE2PULS X,YJMP [DRVVEC]** Check for drive ready.* Entry: (X) = FCB address (3,X contains drive number)>* Exit: (B) = Error condition, (Z)=0 AND (C)=1 if drive is not ready.CHKRDY JMP [CHKVEC]** Quick drive ready check.* Entry: (X) = FCB address (3,X contains drive number).* Exit: (B) = Error condition, (Z)=0 AND (c)=1 if drive not ready.CHKQIK JMP [QUIVEC]** Init (cold start).* Entry: no parameters.* Exit: no change.DINIT CLRADINIT1 STA DRVNUM Init each valid drive in turn.LDX #DRVNUM-3BSR DRVSELBCS DINIT2JSR [INIVEC]DINIT2 LDA DRVNUMINCACMPA #4BNE DINIT1RTS** Warm start.* Entry: no parameters.* Exit: no change.DWARM JMP [WARVEC]** Seek track.* Entry: (A) = Track number.* (B) = Sector number.* Exit: (B) = Error condition, (Z)=1 if no error.SEEKTS JMP [SEEVEC]******************************************************** ROMdisk drivers ** --------------- ** Drivers to support a ROMdisk in the external RAM ** of the SYS09. The ROMdisk base address is $10000 ******************************************************* Dummy return for ROM disk (write protected!)** MAP RAM DISK INTO MEMORY SPACE*MAPIN TFR CC,A ; Save state of interrupt masksSTA CCSAVEORCC #FFLAG+IFLAG ; Mask interrupts while IO mapped outLDU #DTYPTAB ; Point to Drive Type tableLDB DRVNUM ; Get working drive numberLDB B,ULDU #DOFFTABLDA TRACKADDA B,U ; Add Base offset into RAMANDA #$F0 ; Mask MSNSTA ,-S ; Save A on stack*LDA SECTORSUBA #1 ; Sectors 1 to 14 => 0 to 13EORA #$0F ; Complement LSNybbleANDA #$0F*ADDA ,S+ ; Add sector to LSN of Track and popSTA DATREG+MAPPAG*LDA TRACK ; LSN of Track indexes into 4K pageANDA #$0FADDA #MAPPAG*16CLRBTFR D,URTS** MAP RAM DISK OUT OF MEMORY*MAPOUT LDA #MAPPAG ; Point to the Flex pageEORA #$0F ; Complement LSNybbleSTA DATREG+MAPPAG ; map in Flex pageLDA CCSAVE ; restore interrupt masksTFR A,CCRTS** Seek track and sector* A holds track number (0-32)* B holds sector number (1-14)*ESEEK STA TRACKSTB SECTORANDCC #$FE ; CLEAR CARRYORCC #$04 ; SET ZRTS** MARK DISK READ ONLY*EDUMMY LDB #$40TSTBORCC #$01RTS*EREAD PSHS X,Y,U push sequentialy to preserve order on stackLBSR ESEEKLBSR MAPIN build external ram address*LDY #BUFFERCLRBERLOOP1 LDA 0,U+ move 256 bytes to buffer from external RAMSTA 0,Y+DECBBNE ERLOOP1*LBSR MAPOUT*LDY #BUFFERCLRBERLOOP2 LDA 0,Y+ move 256 bytes from buffer to Flex RAMSTA 0,X+DECBBNE ERLOOP2*CLRBPULS X,Y,U,PC restore all registers** check for marker bytes $AA55 in first bytes of first track/sector**ECHECK CLRA* LDB #1* LDX #BUFFER* BSR EREAD* LDD BUFFER* CMPD #$AA55* BNE EERR* LBRA DDUMMY*EERR LDB #$80 not ready bit set* TSTB* ORCC #$01* RTSECHECK CLRBRTS** Write Sector*EWRITE PSHS X,Y,ULBSR ESEEKLDU #DTYPTAB ; Point to Drive Type tableLDB DRVNUM ; Get working drive numberLDB B,U ; Fetch Drive typeCMPB #DTYPRAM ; Is it a RAM Disk ?BEQ EWOK ; Yep, can write to itCMPB #DTYPROM ; Allow writes to ROM Disk tooBEQ EWOKLBRA EDUMMY ; Nope report read only*EWOK LDY #BUFFERCLRBEWLOOP1 LDA 0,X+ move 256 bytes to buffer from Flex RAMSTA 0,Y+DECBBNE EWLOOP1*LBSR MAPIN*LDY #BUFFERCLRBEWLOOP2 LDA 0,Y+ move 256 bytes from buffer to external RAMSTA 0,U+DECBBNE EWLOOP2*LBSR MAPOUT*CLRBPULS X,Y,U,PC******************************************************** FlexNet drivers ** --------------- ** Drivers to support a remote connection via the ** serial port using the FlexNet protocol as defined ** in FLEXNet_421B ********************************************************* read sector from remote drive*NREAD PSHS BPSHS ACLR CHKSUM clear checksumCLR CHKSUM+1*LDA #'s Send read sector commandJSR SCHARBCC NRD_DNR if timeout, then flag drive not ready*LDA DRVNUM send driveJSR SCHARBCC NRD_DNR*PULS A send trackJSR SCHARBCC NRD_DNR*PULS A send sectorJSR SCHARBCC NRD_DNR** transfer 256 bytesCLRBNREAD1 JSR RCHAR read byteBCC NRD_DNR if timeout, then flag drive not readySTA 0,X+ADDA CHKSUM+1 update checksumSTA CHKSUM+1BCC NREAD2INC CHKSUMNREAD2 DECBBNE NREAD1** compare checksumsJSR RCHAR get checksum msbBCC NRD_DNRPSHS AJSR RCHAR get checksum lsbBCC NRD_DNRTFR A,BPULS ACMPD CHKSUM compare checksumsBNE NRD_ERR if checksum error, then flag crc read error*LDA #ACK no checksum error, send ACK charJSR SCHARBCC NRD_DNRCLRB all OK, flag no errorBRA NRD_END*NRD_DNR LDB #16 flag drive not readyBRA NRD_END*NRD_ERR LDA #NAK send NAKJSR SCHARBCC NRD_DNRLDB #09 flag crc read error*NRD_END STB CHKSUM used by VERIFYTSTBRTS*** write sector to remote drive*NWRITE PSHS BPSHS ACLR CHKSUM clear checksumCLR CHKSUM+1*LDA #'r Send write sector commandJSR SCHARBCC NRD_DNR if timeout, then flag drive not ready*LDA DRVNUM send driveJSR SCHARBCC NRD_DNR*PULS A send trackJSR SCHARBCC NRD_DNR*PULS A send sectorJSR SCHARBCC NRD_DNR** transfer 256 bytesCLRBNWRITE1 LDA 0,X+JSR SCHAR write byteBCC NRD_DNR if timeout, then flag drive not readyADDA CHKSUM+1 update checksumSTA CHKSUM+1BCC NWRITE2INC CHKSUMNWRITE2 DECBBNE NWRITE1** compare checksumsLDA CHKSUMJSR SCHAR send checksum msbBCC NRD_DNRLDA CHKSUM+1JSR SCHAR send checksum lsbBCC NRD_DNR*JSR RCHAR get checksum responseBCC NRD_DNRCMPA #ACKBNE NWR_ERR if checksum error, then flag write error*CLRB all OK, flag no errorBRA NWR_END*NWR_ERR LDB #10 flag write error*NWR_END STB CHKSUM used by VERIFYTSTBRTS*** verify last sector written to remote drive*NVERIFY LDB CHKSUM test last checksumTSTBRTS*** quck check and check drive ready*NCHECK LDA #'Q quick check commandJSR SCHARBCC NCK_ERR if timeout, then flag drive not readyJSR RCHAR get response from hostBCC NCK_ERRCMPA #ACKBNE NCK_ERR if NAK, then flag drive not readyCLRB all OK, flag drive readyBRA NCK_END*NCK_ERR LDB #16 report drive not readyORCC #$01 check needs carry set as well*NCK_END TSTBRTS*** 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 RAMdisc to FLEX standard.*DISFOS FCB $0A,$0DFCC 'Formating RAMdisk... 'FCB 4MESS6 FCB $0A,$0D,4FCC 'Ramdisk not allocated! 'FCB 4*UFSUB LDX #DISFOSJSR PDATA1LDX #DTYPTAB search for allocated ramdiskCLRBFMT9 LDA B,XCMPA #DTYPRAM driver type 1 is ramdiskBEQ FFOUNDINCBCMPB #4 end of table? then not allocated.BNE FMT9LDX #MESS6JSR PDATA1RTS*FFOUND STB 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*LDX #BUFFERCLRALDB #1JSR READSCLDX #BUFFERLDA #$AA set the init flagSTA 0,XLDA #$55STA 1,XCLRALDB #1JMP WRITSC********************************** System specific Boot ** command goes here. *********************************** Boot FLEX from the FPGA's internal pre-loaded scratch RAM*UBMESS FCB $08, $08FCC 'Booting internal FLEX....'FCB $0D,$0A,$04*UBSUB LDX #UBMESSJSR PDATA1*LDX #$D3E5LDY #CONTAB Overlay console driver tableUB1 LDD 0,Y++STD 0,X++CMPX #$D3FDBNE UB1*LDX #$DE00 Overlay disk driver tableLDY #DISTABUB2 LDD 0,Y++STD 0,X++CMPX #$DE1EBNE UB2*UBEND JMP $CD00** FLEX console jump table.CONTAB FDB INPNE INPUT NO ECHOFDB DUMMY INTERRUPT HANDLERFDB MONRAM+$02 SWI VECTORFDB MONRAM+$08 IRQ VECTORFDB DUMMY TIMER OFFFDB DUMMY TIMER ONFDB DUMMY TIMER INITIALIZATIONFDB CONTRL MONITORFDB DUMMY TERMINAL INITIALIZATIONFDB STATUS INPUT CHECKFDB OUTP TERMINAL OUTPUTFDB INPE TERMINAL INPUT WITH ECHO** FLEX disk jump table.DISTAB JMP READSCJMP WRITSCJMP BUSYJMP RESTR1JMP DRVSELJMP CHKRDYJMP CHKQIKJMP DINITJMP DWARMJMP SEEKTS** Monitor jumps*PDATA1 JMP [PDATAV]OUTP JMP [OUTCHV]INPE JMP [INCHEV]INPNE JMP [INCHV]STATUS JMP [INCHKV]CONTRL JMP [MONITV]DUMMY RTS*** 'UL' LOAD ROM DISK VIA SERIAL PORT*ULMES FCC 'Serial ROM Disk upload ...'FCB $0D,$0A,$04ULMES1 FCC 'ROM Disk Loaded'FCB $0D,$0A,$04*ULSUB LDX #ULMESJSR PDATA1*LDA #$00STA DRVNUMCLRA TRACK 0LDB #$01 SECTOR 1ULLOOP0 STA TRACKSTB SECTOR`LBSR MAPIN*CLRB xfer 256 bytes at a time.ULLOOP1 JSR LRBYTE transfer should be hex bytesSTA ,U+DECBBNE ULLOOP1*LBSR MAPOUT*LDA TRACKLDB SECTORINCBCMPB #EMAXSEC+1BNE ULLOOP0LDB #1INCACMPA #EMAXTRKBNE ULLOOP0*ULEXIT LDX #ULMES1JMP 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*** 'UX' Xmodem ROM Disk upload*UXMES FCB $0D,$0AFCC 'Xmodem ROM Disk Upload'FCB 4UXMES1 FCB $0D,$0AFCC 'Upload Complete'FCB 4UXMES2 FCB $0D,$0AFCC 'Upload Error'FCB 4*UXSUB LDX #UXMESLBSR PDATA1*LDA #1STA BLKNUMLDX #XSTSTRSTX XSTATE*LDA #$00STA DRVNUMCLRA TRACK 0LDB #$01 SECTOR 1UXLOOP0 STA TRACKSTB SECTORLBSR MAPIN*CLRB xfer 256 bytes at a time.UXLOOP1 LBSR XBYTE transfer should be hex bytesBCS UXERRSTA ,U+DECBBNE UXLOOP1*LBSR MAPOUT*LDA TRACKLDB SECTORINCBCMPB #EMAXSEC+1BNE UXLOOP0LDB #1INCACMPA #EMAXTRKBNE UXLOOP0*UXEXIT LDX #UXMES1JMP PDATA1*UXERR LBSR MAPOUTLDX #UXMES2LBRA PDATA1** Get a Byte using XModem protocol* Carry clear => no errors* Carry set => errors*XBYTE PSHS XLDX XSTATE*XBYTE0 LBSR INTERBVC XBYTE1LDA #NAKLBSR OUTTERLDX #XSTSTRBRA XBYTE0*XBYTE1 JSR ,XBNE XBYTE0STX XSTATEPULS X,PC** START - LOOK FOR SOH (START OF HEADER) = $01*XSTSTR CMPA #SOHBNE XSTSTR1LDX #XSTBLKANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS*XSTSTR1 CMPA #EOTBNE XSTSTR2LDA #ACKLBSR OUTTERORCC #CFLAG+ZFLAG Set (c)=1 abort & exitRTS*XSTSTR2 CMPA #CANBNE XSTSTR3ORCC #CFLAG+ZFLAG Set (c)=1 abort & exitRTS*XSTSTR3 ANDCC #$FF-CFLAG-ZFLAGRTS** Got SOH* Now get block number*XSTBLK CMPA BLKNUMBNE XSTBLKELDX #XSTCOMANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Error in block number*XSTBLKE LDA #NAKLBSR OUTTERLDX #XSTSTRANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Get complement of block number*XSTCOM COMACMPA BLKNUMBNE XSTBLKECLR CHKSUMLDA #128STA BYTCNTLDX #XSTDATANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)RTS** Get data bytes*XSTDAT PSHS AADDA CHKSUMSTA CHKSUMPULS ADEC BYTCNTBNE XSTDAT1LDX #XSTCHKXSTDAT1 ANDCC #$FF-CFLAG No abortORCC #ZFLAG Valid data (exit)RTS** Byte count reached zero* Check checksum byte*XSTCHK CMPA CHKSUMBNE XSTCHK1 retry if wrong checksum** Checksum OK ...* increment block number* and send ACK*INC BLKNUMLDA #ACKBRA XSTCHK2** Checksum Error detected ...* Reset Sector counter in ACCB to last 128 byte boundary* and send NAK*XSTCHK1 PSHS BTFR U,DDECBANDB #128TFR D,UPULS BLDA #NAKXSTCHK2 LBSR OUTTERLDX #XSTSTRANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)RTS*** 'UP' Load ROMdisk via config PROM.*UPMES FCB $08,$08FCC 'Load ROM disk from config PROM.'FCB 4UPMES1 FCC 'Found SYNC, loading data...'FCB $0A,$0D,4UPMES2 FCC 'ROM Disk Loaded.'FCB $0A,$0D,4UPMES3 FCC 'ROM Disk Not Found.'FCB $0A,$0D,4*UPSUB LDX #UPMESJSR PDATA1*BSR UPRESETLDY #$0020 Set up count for 2 MBitLDX #$0000UPSUB1 BSR UPBIT Shift in bitBSR UPSYNC Test for Sync pattern`BEQ UPSUB4 Skip if foundLEAX -1,X Count Down inner loopCMPX #$0000BNE UPSUB1 Branch if inner loop not completeLEAY -1,X Count down outer loopCMPY #$0000BNE UPSUB1 Branch if outer loop not complete*LDX #UPMES3 2MBits scanned, no synch, report errorJMP PDATA1*UPSUB4 LDX #UPMES1 Sync found, now load diskJSR PDATA1*CLRASTA DRVNUM select Drive 0LDB #$01UPSUB2 STA TRACK track 0STB SECTOR sector 1*LBSR MAPIN map in bufferCLRB 256 byte sectorUPSUB3 BSR UPBYTE read byte from promSTA ,U+ Store in bufferDECBBNE UPSUB3 Loop until sector read`LBSR MAPOUT map out buffer*LDA TRACK Advance sectorLDB SECTORINCBCMPB #EMAXSEC+1 Wrap on max sector countBNE UPSUB2LDB #1INCA Advance trackCMPA #EMAXTRKBNE UPSUB2*UPEXIT LDX #UPMES2 Load complete, report messageJMP PDATA1** Reset Serial PROM*UPRESET LDA #PRSTHI Strobe the reset lineSTA PROMREGLDA #PRSTLOSTA PROMREGLDX #$0000 Delay a while`UPRST1 LEAX -1,XCMPX #$0000BNE UPRST1STX SYNCREG+0 Clear Sync Shift RegisterSTX SYNCREG+2RTS** Input 1 Bit From PROM*UPBIT LDA #PCLKHISTA PROMREGLDA #PCLKLOSTA PROMREGLDA PROMREGLSRAASL SYNCREG+3RTS** Test for 32 bit Sync Word*UPSYNC ROL SYNCREG+2ROL SYNCREG+1ROL SYNCREG+0LDD #SYNCLOCMPD SYNCREG+2BNE UPSYNCXLDD #SYNCHICMPD SYNCREG+0UPSYNCX RTS** Input 1 Byte From PROM*UPBYTE PSHS BLDB #8UPBYTE1 BSR UPBITDECBBNE UPBYTE1LDA SYNCREG+3PULS B,PC****** NEXTCMD ******NEXTEXT LBSR INPE GET ONE CHAR. FROM TERMINALANDA #$7F STRIP PARITY FROM CHAR.TFR A,BLDA #$20LBSR OUTP 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 'L' LOAD ROM DISK OVER SERIAL PORTFDB ULSUBFCC 'F' FORMAT RAM DISKFDB UFSUBFCC 'P' LOAD ROM DISK FROM PROMFDB UPSUBFCC 'X' XMODEM ROM DISK UPLOADFDB UXSUB*EXTEND EQU **MSGWHAT FCC "WHAT ?"FCB $0A,$0D,$04END
Go to most recent revision | Compare with Previous | Blame | View Log
