*
|
*
|
** FLEX 9 DISK DRIVERS
|
** FLEX 9 DISK DRIVERS
|
*
|
*
|
* FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD
|
* FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD
|
* WITH I/O MAPPED AT $XE000
|
* WITH I/O MAPPED AT $XE000
|
* AND ROM MAPPED AT $XF000
|
* AND ROM MAPPED AT $XF000
|
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
|
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
|
* THE FIRST 64K IS USED BY FLEX,
|
* THE FIRST 64K IS USED BY FLEX,
|
* THE SECOND 128K IS USED AS A ROM DISK
|
* THE SECOND 128K IS USED AS A ROM DISK
|
* THE REMAINING RAM IS USED FOR A RAM DISK
|
* THE REMAINING RAM IS USED FOR A RAM DISK
|
*
|
*
|
*
|
*
|
CFLAG EQU $01 CARRY FLAG
|
CFLAG EQU $01 CARRY FLAG
|
VFLAG EQU $02 OVERFLOW FLAG
|
VFLAG EQU $02 OVERFLOW FLAG
|
ZFLAG EQU $04 ZERO FLAG
|
ZFLAG EQU $04 ZERO FLAG
|
NFLAG EQU $08 NEGATIVE FLAG
|
NFLAG EQU $08 NEGATIVE FLAG
|
IFLAG EQU $10 IRQ MASK CC
|
IFLAG EQU $10 IRQ MASK CC
|
HFLAG EQU $20 HALF CARRY
|
HFLAG EQU $20 HALF CARRY
|
FFLAG EQU $40 FIRQ MASK CC
|
FFLAG EQU $40 FIRQ MASK CC
|
EFLAG EQU $80 ENTIRE FLAG
|
EFLAG EQU $80 ENTIRE FLAG
|
*
|
*
|
MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
|
MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
|
DATREG EQU IC11 DAT REGISTERS
|
DATREG EQU IC11 DAT REGISTERS
|
*
|
*
|
* Serial Port
|
* Serial Port
|
*
|
*
|
ACIAC1 EQU ACIAS
|
ACIAC1 EQU ACIAS
|
ACIAD1 EQU ACIAS+1
|
ACIAD1 EQU ACIAS+1
|
DELCON EQU 1250 Delay (Processor clock in MHz * 50)
|
DELCON EQU 1250 Delay (Processor clock in MHz * 50)
|
*
|
*
|
* XMODEM Control characters
|
* XMODEM Control characters
|
*
|
*
|
SOH EQU $01
|
SOH EQU $01
|
EOT EQU $04
|
EOT EQU $04
|
ACK EQU $06
|
ACK EQU $06
|
NAK EQU $15
|
NAK EQU $15
|
CAN EQU $18
|
CAN EQU $18
|
*
|
*
|
* DRIVE GEOMETRY
|
* DRIVE GEOMETRY
|
*
|
*
|
EMAXSEC EQU 14 ROM DISK
|
EMAXSEC EQU 14 ROM DISK
|
EMAXTRK EQU 48 3 * 16 * 14 * 256 = 172,032 Bytes
|
EMAXTRK EQU 48 3 * 16 * 14 * 256 = 172,032 Bytes
|
ETOTSEC EQU EMAXTRK*EMAXSEC-EMAXSEC
|
ETOTSEC EQU EMAXTRK*EMAXSEC-EMAXSEC
|
*
|
*
|
RMAXSEC EQU 14 RAM DISK
|
RMAXSEC EQU 14 RAM DISK
|
RMAXTRK EQU 192 12 * 16 * 14 * 256 = 688,128 Bytes
|
RMAXTRK EQU 192 12 * 16 * 14 * 256 = 688,128 Bytes
|
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
|
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
|
*
|
*
|
* DRIVE TYPES
|
* DRIVE TYPES
|
*
|
*
|
DTYPROM EQU 0 ROM DISK
|
DTYPROM EQU 0 ROM DISK
|
DTYPRAM EQU 1 RAM DISK
|
DTYPRAM EQU 1 RAM DISK
|
DTYPFLS EQU 2 FLASH DISK
|
DTYPFLS EQU 2 FLASH DISK
|
DTYPNET EQU 3 FLEXNET DISK
|
DTYPNET EQU 3 FLEXNET DISK
|
*
|
*
|
ORG $DE00
|
ORG $DE00
|
*
|
*
|
* DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
|
* DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
|
* Disk driver for RAM Disk.
|
* Disk driver for RAM Disk.
|
*
|
*
|
* 14 SECTORS PER TRACK
|
* 14 SECTORS PER TRACK
|
* 16 * N TRACKS PER DISK
|
* 16 * N TRACKS PER DISK
|
*
|
*
|
* ROM DISK OCCUPIES $10000 - $1E000 ... $30000 - $3E000
|
* ROM DISK OCCUPIES $10000 - $1E000 ... $30000 - $3E000
|
* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
|
* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
|
* Track Buffer page mapped at $E000 - $EFFF
|
* Track Buffer page mapped at $E000 - $EFFF
|
* MAPPAG = $00 = 0 x $1000 (4 K pages)
|
* MAPPAG = $00 = 0 x $1000 (4 K pages)
|
|
|
* ON SWTPC ROM AT $XF000 AND IO AT $XE000
|
* ON SWTPC ROM AT $XF000 AND IO AT $XE000
|
* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
|
* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
|
* WHEN USING RAM AS A RAMDISK.
|
* WHEN USING RAM AS A RAMDISK.
|
* THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT
|
* 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 LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE
|
* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
|
* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
|
*
|
*
|
*
|
*
|
*
|
*
|
* FLEX disk jump table.
|
* FLEX disk jump table.
|
*
|
*
|
READ JMP READSC
|
READ JMP READSC
|
WRITE JMP WRITSC
|
WRITE JMP WRITSC
|
VERIFY JMP BUSY
|
VERIFY JMP BUSY
|
RESTOR JMP RESTR1
|
RESTOR JMP RESTR1
|
DRIVE JMP DRVSEL
|
DRIVE JMP DRVSEL
|
DRVRDY JMP CHKRDY
|
DRVRDY JMP CHKRDY
|
QUICK JMP CHKQIK
|
QUICK JMP CHKQIK
|
COLDDR JMP DINIT
|
COLDDR JMP DINIT
|
WARMDR JMP DWARM
|
WARMDR JMP DWARM
|
SEEK JMP SEEKTS
|
SEEK JMP SEEKTS
|
*
|
*
|
* RAM SPACE
|
* RAM SPACE
|
*
|
*
|
DRVNUM FCB 0
|
DRVNUM FCB 0
|
TRACK FCB 0
|
TRACK FCB 0
|
SECTOR FCB 0
|
SECTOR FCB 0
|
CHKSUM FCB 0
|
CHKSUM FCB 0
|
CCSAVE FCB 0
|
CCSAVE FCB 0
|
BLKNUM FCB 0 Xmodem block number
|
BLKNUM FCB 0 Xmodem block number
|
BYTCNT FCB 0 Xmodem byte count
|
BYTCNT FCB 0 Xmodem byte count
|
XSTATE FDB 0 Xmodem State Vector
|
XSTATE FDB 0 Xmodem State Vector
|
DELCNT FCB $00,$00,$00 Xmodem Poll timer
|
DELCNT FCB $00,$00,$00 Xmodem Poll timer
|
*
|
*
|
* Disc driver type table.
|
* Disc driver type table.
|
* Indexed by drive number
|
* Indexed by drive number
|
*
|
*
|
DTYPTAB FCB DTYPROM Drive 0 (ROM Disk)
|
DTYPTAB FCB DTYPROM Drive 0 (ROM Disk)
|
FCB DTYPRAM Drive 1 (RAM Disk)
|
FCB DTYPRAM Drive 1 (RAM Disk)
|
FCB DTYPFLS Drive 2 (FLASH Disk)
|
FCB DTYPFLS Drive 2 (FLASH Disk)
|
FCB DTYPNET Drive 3 (NETPC Disk)
|
FCB DTYPNET Drive 3 (NETPC Disk)
|
*
|
*
|
* RAM Disk offset
|
* RAM Disk offset
|
* Indexed by drive type
|
* Indexed by drive type
|
*
|
*
|
DOFFTAB FCB $10 ROM Disk $10000
|
DOFFTAB FCB $10 ROM Disk $10000
|
FCB $40 RAM DISK $40000
|
FCB $40 RAM DISK $40000
|
FCB $FF Flash Disk
|
FCB $FF Flash Disk
|
FCB $FF NETPC Disk
|
FCB $FF NETPC Disk
|
*
|
*
|
REAVEC RMB 2 Disc driver jump table.
|
REAVEC RMB 2 Disc driver jump table.
|
WRIVEC RMB 2
|
WRIVEC RMB 2
|
VERVEC RMB 2
|
VERVEC RMB 2
|
RSTVEC RMB 2
|
RSTVEC RMB 2
|
DRVVEC RMB 2
|
DRVVEC RMB 2
|
CHKVEC RMB 2
|
CHKVEC RMB 2
|
QUIVEC RMB 2
|
QUIVEC RMB 2
|
INIVEC RMB 2
|
INIVEC RMB 2
|
WARVEC RMB 2
|
WARVEC RMB 2
|
SEEVEC RMB 2
|
SEEVEC RMB 2
|
*
|
*
|
* SECTOR BUFFER
|
* SECTOR BUFFER
|
*
|
*
|
BUFFER RMB 256
|
BUFFER RMB 256
|
SYNCREG RMB 4 Prom input register
|
SYNCREG RMB 4 Prom input register
|
*
|
*
|
****************************************
|
****************************************
|
*
|
*
|
* START OF EXTENSION COMMANDS
|
* START OF EXTENSION COMMANDS
|
*
|
*
|
****************************************
|
****************************************
|
*
|
*
|
ORG MONEXT
|
ORG MONEXT
|
FDB NEXTEXT Jump to next extended command
|
FDB NEXTEXT Jump to next extended command
|
*
|
*
|
*
|
*
|
*****************************************
|
*****************************************
|
* Disk drivers *
|
* Disk drivers *
|
* ------------ *
|
* ------------ *
|
* The system dependant code for the *
|
* The system dependant code for the *
|
* disc drivers fits here. Two tables *
|
* disc drivers fits here. Two tables *
|
* must be included. These are DTYPTAB a *
|
* must be included. These are DTYPTAB a *
|
* four byte table that defines which of *
|
* four byte table that defines which of *
|
* the (up to four) following sets of *
|
* the (up to four) following sets of *
|
* jump tables to use, and TABSRT the *
|
* jump tables to use, and TABSRT the *
|
* jump tables themselves. For a full *
|
* jump tables themselves. For a full *
|
* description of the floppy drivers see *
|
* description of the floppy drivers see *
|
* section 4 (pp9-14) of the general *
|
* section 4 (pp9-14) of the general *
|
* Flex adaptation guide. *
|
* Flex adaptation guide. *
|
*****************************************
|
*****************************************
|
*
|
*
|
* Mass storage drivers for embedded applications.
|
* Mass storage drivers for embedded applications.
|
*
|
*
|
* Jump tables.
|
* Jump tables.
|
TABSRT FDB EREAD Drive type 0 (ROM disk).
|
TABSRT FDB EREAD Drive type 0 (ROM disk).
|
FDB EWRITE
|
FDB EWRITE
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
*
|
*
|
FDB EREAD Drive type 1 (RAM disk).
|
FDB EREAD Drive type 1 (RAM disk).
|
FDB EWRITE
|
FDB EWRITE
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB ECHECK
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
*
|
*
|
FDB DDUMMY Drive type 2 (External Flash disk).
|
FDB DDUMMY Drive type 2 (External Flash disk).
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
*
|
*
|
FDB NREAD Drive type 3 (NetPC drive via serial port).
|
FDB NREAD Drive type 3 (NetPC drive via serial port).
|
FDB NWRITE
|
FDB NWRITE
|
FDB NVERIFY
|
FDB NVERIFY
|
FDB NCHECK
|
FDB NCHECK
|
FDB NCHECK
|
FDB NCHECK
|
FDB NCHECK
|
FDB NCHECK
|
FDB NCHECK
|
FDB NCHECK
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
FDB DDUMMY
|
*
|
*
|
*
|
*
|
* Dummy routine (no errors).
|
* Dummy routine (no errors).
|
DDUMMY CLRB
|
DDUMMY CLRB
|
TSTB Set (z)=1
|
TSTB Set (z)=1
|
ANDCC #$FF-CFLAG Set (c)=0
|
ANDCC #$FF-CFLAG Set (c)=0
|
RTS
|
RTS
|
* *
|
* *
|
**************************
|
**************************
|
* Main Flex entry points *
|
* Main Flex entry points *
|
*************************
|
*************************
|
*
|
*
|
* Read sector routine.
|
* Read sector routine.
|
* Entry: (X) = address where sector is to be placed.
|
* Entry: (X) = address where sector is to be placed.
|
* (A) = Track number.
|
* (A) = Track number.
|
* (B) = Sector number.
|
* (B) = Sector number.
|
* Exit: (B) = Error code (z)=1 if no error.
|
* Exit: (B) = Error code (z)=1 if no error.
|
READSC JMP [REAVEC]
|
READSC JMP [REAVEC]
|
*
|
*
|
* Write track routine.
|
* Write track routine.
|
* Entry: (X) = Address of area of memory from which the data will be taken.
|
* Entry: (X) = Address of area of memory from which the data will be taken.
|
* (A) = Track number.
|
* (A) = Track number.
|
* (B) = Sector number.
|
* (B) = Sector number.
|
* Exit: (B) = Error condition, (Z)=1 no an error.
|
* Exit: (B) = Error condition, (Z)=1 no an error.
|
WRITSC JMP [WRIVEC]
|
WRITSC JMP [WRIVEC]
|
*
|
*
|
* Verify sector routine.
|
* Verify sector routine.
|
* Entry: no parameters.
|
* Entry: no parameters.
|
* Exit: (B) = Error condition (Z)=1 if no error.
|
* Exit: (B) = Error condition (Z)=1 if no error.
|
BUSY JMP [VERVEC]
|
BUSY JMP [VERVEC]
|
*
|
*
|
* Restore drive to track 00.
|
* Restore drive to track 00.
|
* Entry: (X) = FCB address (3,X contains drive number).
|
* Entry: (X) = FCB address (3,X contains drive number).
|
* Exit: (B) = Error condition, (Z)=1 if no error.
|
* Exit: (B) = Error condition, (Z)=1 if no error.
|
RESTR1 BSR DRVSEL Select drive first.
|
RESTR1 BSR DRVSEL Select drive first.
|
BEQ RST1
|
BEQ RST1
|
RTS
|
RTS
|
RST1 JMP [RSTVEC]
|
RST1 JMP [RSTVEC]
|
*
|
*
|
* Select current drive.
|
* Select current drive.
|
* Entry: (X) = FCB address (3,X contains drive number).
|
* Entry: (X) = FCB address (3,X contains drive number).
|
* Exit: (B) = Error condition, (Z)=0 and (c)=1 if error.
|
* Exit: (B) = Error condition, (Z)=0 and (c)=1 if error.
|
* (B) = $0F if non existant drive.
|
* (B) = $0F if non existant drive.
|
DRVSEL PSHS X,Y
|
DRVSEL PSHS X,Y
|
LDB 3,X Get driver type.
|
LDB 3,X Get driver type.
|
STB DRVNUM
|
STB DRVNUM
|
LDX #DTYPTAB
|
LDX #DTYPTAB
|
LDA B,X
|
LDA B,X
|
CMPA #$FF Is the drive nonexistant?
|
CMPA #$FF Is the drive nonexistant?
|
BNE DRIVE1
|
BNE DRIVE1
|
PULS X,Y
|
PULS X,Y
|
LDB #$0F
|
LDB #$0F
|
TSTB
|
TSTB
|
ORCC #$01
|
ORCC #$01
|
RTS
|
RTS
|
*
|
*
|
DRIVE1 LDB #20 Get correct table start address.
|
DRIVE1 LDB #20 Get correct table start address.
|
MUL
|
MUL
|
LDX #TABSRT
|
LDX #TABSRT
|
LEAX D,X
|
LEAX D,X
|
LDY #REAVEC Copy table into ram.
|
LDY #REAVEC Copy table into ram.
|
LDB #20
|
LDB #20
|
DRIVE2 LDA 0,X+
|
DRIVE2 LDA 0,X+
|
STA 0,Y+
|
STA 0,Y+
|
DECB
|
DECB
|
BNE DRIVE2
|
BNE DRIVE2
|
PULS X,Y
|
PULS X,Y
|
JMP [DRVVEC]
|
JMP [DRVVEC]
|
*
|
*
|
* Check for drive ready.
|
* Check for drive ready.
|
* Entry: (X) = FCB address (3,X contains drive number)>
|
* Entry: (X) = FCB address (3,X contains drive number)>
|
* Exit: (B) = Error condition, (Z)=0 AND (C)=1 if drive is not ready.
|
* Exit: (B) = Error condition, (Z)=0 AND (C)=1 if drive is not ready.
|
CHKRDY JMP [CHKVEC]
|
CHKRDY JMP [CHKVEC]
|
*
|
*
|
* Quick drive ready check.
|
* Quick drive ready check.
|
* Entry: (X) = FCB address (3,X contains drive number).
|
* Entry: (X) = FCB address (3,X contains drive number).
|
* Exit: (B) = Error condition, (Z)=0 AND (c)=1 if drive not ready.
|
* Exit: (B) = Error condition, (Z)=0 AND (c)=1 if drive not ready.
|
CHKQIK JMP [QUIVEC]
|
CHKQIK JMP [QUIVEC]
|
*
|
*
|
* Init (cold start).
|
* Init (cold start).
|
* Entry: no parameters.
|
* Entry: no parameters.
|
* Exit: no change.
|
* Exit: no change.
|
DINIT CLRA
|
DINIT CLRA
|
DINIT1 STA DRVNUM Init each valid drive in turn.
|
DINIT1 STA DRVNUM Init each valid drive in turn.
|
LDX #DRVNUM-3
|
LDX #DRVNUM-3
|
BSR DRVSEL
|
BSR DRVSEL
|
BCS DINIT2
|
BCS DINIT2
|
JSR [INIVEC]
|
JSR [INIVEC]
|
DINIT2 LDA DRVNUM
|
DINIT2 LDA DRVNUM
|
INCA
|
INCA
|
CMPA #4
|
CMPA #4
|
BNE DINIT1
|
BNE DINIT1
|
RTS
|
RTS
|
*
|
*
|
* Warm start.
|
* Warm start.
|
* Entry: no parameters.
|
* Entry: no parameters.
|
* Exit: no change.
|
* Exit: no change.
|
DWARM JMP [WARVEC]
|
DWARM JMP [WARVEC]
|
*
|
*
|
* Seek track.
|
* Seek track.
|
* Entry: (A) = Track number.
|
* Entry: (A) = Track number.
|
* (B) = Sector number.
|
* (B) = Sector number.
|
* Exit: (B) = Error condition, (Z)=1 if no error.
|
* Exit: (B) = Error condition, (Z)=1 if no error.
|
SEEKTS JMP [SEEVEC]
|
SEEKTS JMP [SEEVEC]
|
*
|
*
|
*
|
*
|
*****************************************************
|
*****************************************************
|
* ROMdisk drivers *
|
* ROMdisk drivers *
|
* --------------- *
|
* --------------- *
|
* Drivers to support a ROMdisk in the external RAM *
|
* Drivers to support a ROMdisk in the external RAM *
|
* of the SYS09. The ROMdisk base address is $10000 *
|
* of the SYS09. The ROMdisk base address is $10000 *
|
*****************************************************
|
*****************************************************
|
* Dummy return for ROM disk (write protected!)
|
* Dummy return for ROM disk (write protected!)
|
*
|
*
|
* MAP RAM DISK INTO MEMORY SPACE
|
* MAP RAM DISK INTO MEMORY SPACE
|
*
|
*
|
MAPIN TFR CC,A ; Save state of interrupt masks
|
MAPIN TFR CC,A ; Save state of interrupt masks
|
STA CCSAVE
|
STA CCSAVE
|
ORCC #FFLAG+IFLAG ; Mask interrupts while IO mapped out
|
ORCC #FFLAG+IFLAG ; Mask interrupts while IO mapped out
|
LDU #DTYPTAB ; Point to Drive Type table
|
LDU #DTYPTAB ; Point to Drive Type table
|
LDB DRVNUM ; Get working drive number
|
LDB DRVNUM ; Get working drive number
|
LDB B,U
|
LDB B,U
|
LDU #DOFFTAB
|
LDU #DOFFTAB
|
LDA TRACK
|
LDA TRACK
|
ADDA B,U ; Add Base offset into RAM
|
ADDA B,U ; Add Base offset into RAM
|
ANDA #$F0 ; Mask MSN
|
ANDA #$F0 ; Mask MSN
|
STA ,-S ; Save A on stack
|
STA ,-S ; Save A on stack
|
*
|
*
|
LDA SECTOR
|
LDA SECTOR
|
SUBA #1 ; Sectors 1 to 14 => 0 to 13
|
SUBA #1 ; Sectors 1 to 14 => 0 to 13
|
EORA #$0F ; Complement LSNybble
|
EORA #$0F ; Complement LSNybble
|
ANDA #$0F
|
ANDA #$0F
|
*
|
*
|
ADDA ,S+ ; Add sector to LSN of Track and pop
|
ADDA ,S+ ; Add sector to LSN of Track and pop
|
STA DATREG+MAPPAG
|
STA DATREG+MAPPAG
|
*
|
*
|
LDA TRACK ; LSN of Track indexes into 4K page
|
LDA TRACK ; LSN of Track indexes into 4K page
|
ANDA #$0F
|
ANDA #$0F
|
ADDA #MAPPAG*16
|
ADDA #MAPPAG*16
|
CLRB
|
CLRB
|
TFR D,U
|
TFR D,U
|
RTS
|
RTS
|
*
|
*
|
* MAP RAM DISK OUT OF MEMORY
|
* MAP RAM DISK OUT OF MEMORY
|
*
|
*
|
MAPOUT LDA #MAPPAG ; Point to the Flex page
|
MAPOUT LDA #MAPPAG ; Point to the Flex page
|
EORA #$0F ; Complement LSNybble
|
EORA #$0F ; Complement LSNybble
|
STA DATREG+MAPPAG ; map in Flex page
|
STA DATREG+MAPPAG ; map in Flex page
|
LDA CCSAVE ; restore interrupt masks
|
LDA CCSAVE ; restore interrupt masks
|
TFR A,CC
|
TFR A,CC
|
RTS
|
RTS
|
*
|
*
|
* Seek track and sector
|
* Seek track and sector
|
* A holds track number (0-32)
|
* A holds track number (0-32)
|
* B holds sector number (1-14)
|
* B holds sector number (1-14)
|
*
|
*
|
ESEEK STA TRACK
|
ESEEK STA TRACK
|
STB SECTOR
|
STB SECTOR
|
ANDCC #$FE ; CLEAR CARRY
|
ANDCC #$FE ; CLEAR CARRY
|
ORCC #$04 ; SET Z
|
ORCC #$04 ; SET Z
|
RTS
|
RTS
|
*
|
*
|
* MARK DISK READ ONLY
|
* MARK DISK READ ONLY
|
*
|
*
|
EDUMMY LDB #$40
|
EDUMMY LDB #$40
|
TSTB
|
TSTB
|
ORCC #$01
|
ORCC #$01
|
RTS
|
RTS
|
*
|
*
|
EREAD PSHS X,Y,U push sequentialy to preserve order on stack
|
EREAD PSHS X,Y,U push sequentialy to preserve order on stack
|
LBSR ESEEK
|
LBSR ESEEK
|
LBSR MAPIN build external ram address
|
LBSR MAPIN build external ram address
|
*
|
*
|
LDY #BUFFER
|
LDY #BUFFER
|
CLRB
|
CLRB
|
ERLOOP1 LDA 0,U+ move 256 bytes to buffer from external RAM
|
ERLOOP1 LDA 0,U+ move 256 bytes to buffer from external RAM
|
STA 0,Y+
|
STA 0,Y+
|
DECB
|
DECB
|
BNE ERLOOP1
|
BNE ERLOOP1
|
*
|
*
|
LBSR MAPOUT
|
LBSR MAPOUT
|
*
|
*
|
LDY #BUFFER
|
LDY #BUFFER
|
CLRB
|
CLRB
|
ERLOOP2 LDA 0,Y+ move 256 bytes from buffer to Flex RAM
|
ERLOOP2 LDA 0,Y+ move 256 bytes from buffer to Flex RAM
|
STA 0,X+
|
STA 0,X+
|
DECB
|
DECB
|
BNE ERLOOP2
|
BNE ERLOOP2
|
*
|
*
|
CLRB
|
CLRB
|
PULS X,Y,U,PC restore all registers
|
PULS X,Y,U,PC restore all registers
|
*
|
*
|
* check for marker bytes $AA55 in first bytes of first track/sector
|
* check for marker bytes $AA55 in first bytes of first track/sector
|
*
|
*
|
*ECHECK CLRA
|
*ECHECK CLRA
|
* LDB #1
|
* LDB #1
|
* LDX #BUFFER
|
* LDX #BUFFER
|
* BSR EREAD
|
* BSR EREAD
|
* LDD BUFFER
|
* LDD BUFFER
|
* CMPD #$AA55
|
* CMPD #$AA55
|
* BNE EERR
|
* BNE EERR
|
* LBRA DDUMMY
|
* LBRA DDUMMY
|
*EERR LDB #$80 not ready bit set
|
*EERR LDB #$80 not ready bit set
|
* TSTB
|
* TSTB
|
* ORCC #$01
|
* ORCC #$01
|
* RTS
|
* RTS
|
ECHECK CLRB
|
ECHECK CLRB
|
RTS
|
RTS
|
*
|
*
|
* Write Sector
|
* Write Sector
|
*
|
*
|
EWRITE PSHS X,Y,U
|
EWRITE PSHS X,Y,U
|
LBSR ESEEK
|
LBSR ESEEK
|
LDU #DTYPTAB ; Point to Drive Type table
|
LDU #DTYPTAB ; Point to Drive Type table
|
LDB DRVNUM ; Get working drive number
|
LDB DRVNUM ; Get working drive number
|
LDB B,U ; Fetch Drive type
|
LDB B,U ; Fetch Drive type
|
CMPB #DTYPRAM ; Is it a RAM Disk ?
|
CMPB #DTYPRAM ; Is it a RAM Disk ?
|
BEQ EWOK ; Yep, can write to it
|
BEQ EWOK ; Yep, can write to it
|
CMPB #DTYPROM ; Allow writes to ROM Disk too
|
CMPB #DTYPROM ; Allow writes to ROM Disk too
|
BEQ EWOK
|
BEQ EWOK
|
LBRA EDUMMY ; Nope report read only
|
LBRA EDUMMY ; Nope report read only
|
*
|
*
|
EWOK LDY #BUFFER
|
EWOK LDY #BUFFER
|
CLRB
|
CLRB
|
EWLOOP1 LDA 0,X+ move 256 bytes to buffer from Flex RAM
|
EWLOOP1 LDA 0,X+ move 256 bytes to buffer from Flex RAM
|
STA 0,Y+
|
STA 0,Y+
|
DECB
|
DECB
|
BNE EWLOOP1
|
BNE EWLOOP1
|
*
|
*
|
LBSR MAPIN
|
LBSR MAPIN
|
*
|
*
|
LDY #BUFFER
|
LDY #BUFFER
|
CLRB
|
CLRB
|
EWLOOP2 LDA 0,Y+ move 256 bytes from buffer to external RAM
|
EWLOOP2 LDA 0,Y+ move 256 bytes from buffer to external RAM
|
STA 0,U+
|
STA 0,U+
|
DECB
|
DECB
|
BNE EWLOOP2
|
BNE EWLOOP2
|
*
|
*
|
LBSR MAPOUT
|
LBSR MAPOUT
|
*
|
*
|
CLRB
|
CLRB
|
PULS X,Y,U,PC
|
PULS X,Y,U,PC
|
*
|
*
|
*
|
*
|
*****************************************************
|
*****************************************************
|
* FlexNet drivers *
|
* FlexNet drivers *
|
* --------------- *
|
* --------------- *
|
* Drivers to support a remote connection via the *
|
* Drivers to support a remote connection via the *
|
* serial port using the FlexNet protocol as defined *
|
* serial port using the FlexNet protocol as defined *
|
* in FLEXNet_421B *
|
* in FLEXNet_421B *
|
*****************************************************
|
*****************************************************
|
*
|
*
|
*
|
*
|
* read sector from remote drive
|
* read sector from remote drive
|
*
|
*
|
NREAD PSHS B
|
NREAD PSHS B
|
PSHS A
|
PSHS A
|
CLR CHKSUM clear checksum
|
CLR CHKSUM clear checksum
|
CLR CHKSUM+1
|
CLR CHKSUM+1
|
*
|
*
|
LDA #'s Send read sector command
|
LDA #'s Send read sector command
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR if timeout, then flag drive not ready
|
BCC NRD_DNR if timeout, then flag drive not ready
|
*
|
*
|
LDA DRVNUM send drive
|
LDA DRVNUM send drive
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR
|
BCC NRD_DNR
|
*
|
*
|
PULS A send track
|
PULS A send track
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR
|
BCC NRD_DNR
|
*
|
*
|
PULS A send sector
|
PULS A send sector
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR
|
BCC NRD_DNR
|
*
|
*
|
* transfer 256 bytes
|
* transfer 256 bytes
|
CLRB
|
CLRB
|
NREAD1 JSR RCHAR read byte
|
NREAD1 JSR RCHAR read byte
|
BCC NRD_DNR if timeout, then flag drive not ready
|
BCC NRD_DNR if timeout, then flag drive not ready
|
STA 0,X+
|
STA 0,X+
|
ADDA CHKSUM+1 update checksum
|
ADDA CHKSUM+1 update checksum
|
STA CHKSUM+1
|
STA CHKSUM+1
|
BCC NREAD2
|
BCC NREAD2
|
INC CHKSUM
|
INC CHKSUM
|
NREAD2 DECB
|
NREAD2 DECB
|
BNE NREAD1
|
BNE NREAD1
|
*
|
*
|
* compare checksums
|
* compare checksums
|
JSR RCHAR get checksum msb
|
JSR RCHAR get checksum msb
|
BCC NRD_DNR
|
BCC NRD_DNR
|
PSHS A
|
PSHS A
|
JSR RCHAR get checksum lsb
|
JSR RCHAR get checksum lsb
|
BCC NRD_DNR
|
BCC NRD_DNR
|
TFR A,B
|
TFR A,B
|
PULS A
|
PULS A
|
CMPD CHKSUM compare checksums
|
CMPD CHKSUM compare checksums
|
BNE NRD_ERR if checksum error, then flag crc read error
|
BNE NRD_ERR if checksum error, then flag crc read error
|
*
|
*
|
LDA #ACK no checksum error, send ACK char
|
LDA #ACK no checksum error, send ACK char
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR
|
BCC NRD_DNR
|
CLRB all OK, flag no error
|
CLRB all OK, flag no error
|
BRA NRD_END
|
BRA NRD_END
|
*
|
*
|
NRD_DNR LDB #16 flag drive not ready
|
NRD_DNR LDB #16 flag drive not ready
|
BRA NRD_END
|
BRA NRD_END
|
*
|
*
|
NRD_ERR LDA #NAK send NAK
|
NRD_ERR LDA #NAK send NAK
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR
|
BCC NRD_DNR
|
LDB #09 flag crc read error
|
LDB #09 flag crc read error
|
*
|
*
|
NRD_END STB CHKSUM used by VERIFY
|
NRD_END STB CHKSUM used by VERIFY
|
TSTB
|
TSTB
|
RTS
|
RTS
|
*
|
*
|
*
|
*
|
* write sector to remote drive
|
* write sector to remote drive
|
*
|
*
|
NWRITE PSHS B
|
NWRITE PSHS B
|
PSHS A
|
PSHS A
|
CLR CHKSUM clear checksum
|
CLR CHKSUM clear checksum
|
CLR CHKSUM+1
|
CLR CHKSUM+1
|
*
|
*
|
LDA #'r Send write sector command
|
LDA #'r Send write sector command
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR if timeout, then flag drive not ready
|
BCC NRD_DNR if timeout, then flag drive not ready
|
*
|
*
|
LDA DRVNUM send drive
|
LDA DRVNUM send drive
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR
|
BCC NRD_DNR
|
*
|
*
|
PULS A send track
|
PULS A send track
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR
|
BCC NRD_DNR
|
*
|
*
|
PULS A send sector
|
PULS A send sector
|
JSR SCHAR
|
JSR SCHAR
|
BCC NRD_DNR
|
BCC NRD_DNR
|
*
|
*
|
* transfer 256 bytes
|
* transfer 256 bytes
|
CLRB
|
CLRB
|
NWRITE1 LDA 0,X+
|
NWRITE1 LDA 0,X+
|
JSR SCHAR write byte
|
JSR SCHAR write byte
|
BCC NRD_DNR if timeout, then flag drive not ready
|
BCC NRD_DNR if timeout, then flag drive not ready
|
ADDA CHKSUM+1 update checksum
|
ADDA CHKSUM+1 update checksum
|
STA CHKSUM+1
|
STA CHKSUM+1
|
BCC NWRITE2
|
BCC NWRITE2
|
INC CHKSUM
|
INC CHKSUM
|
NWRITE2 DECB
|
NWRITE2 DECB
|
BNE NWRITE1
|
BNE NWRITE1
|
*
|
*
|
* compare checksums
|
* compare checksums
|
LDA CHKSUM
|
LDA CHKSUM
|
JSR SCHAR send checksum msb
|
JSR SCHAR send checksum msb
|
BCC NRD_DNR
|
BCC NRD_DNR
|
LDA CHKSUM+1
|
LDA CHKSUM+1
|
JSR SCHAR send checksum lsb
|
JSR SCHAR send checksum lsb
|
BCC NRD_DNR
|
BCC NRD_DNR
|
*
|
*
|
JSR RCHAR get checksum response
|
JSR RCHAR get checksum response
|
BCC NRD_DNR
|
BCC NRD_DNR
|
CMPA #ACK
|
CMPA #ACK
|
BNE NWR_ERR if checksum error, then flag write error
|
BNE NWR_ERR if checksum error, then flag write error
|
*
|
*
|
CLRB all OK, flag no error
|
CLRB all OK, flag no error
|
BRA NWR_END
|
BRA NWR_END
|
*
|
*
|
NWR_ERR LDB #10 flag write error
|
NWR_ERR LDB #10 flag write error
|
*
|
*
|
NWR_END STB CHKSUM used by VERIFY
|
NWR_END STB CHKSUM used by VERIFY
|
TSTB
|
TSTB
|
RTS
|
RTS
|
*
|
*
|
*
|
*
|
* verify last sector written to remote drive
|
* verify last sector written to remote drive
|
*
|
*
|
NVERIFY LDB CHKSUM test last checksum
|
NVERIFY LDB CHKSUM test last checksum
|
TSTB
|
TSTB
|
RTS
|
RTS
|
*
|
*
|
*
|
*
|
* quck check and check drive ready
|
* quck check and check drive ready
|
*
|
*
|
NCHECK LDA #'Q quick check command
|
NCHECK LDA #'Q quick check command
|
JSR SCHAR
|
JSR SCHAR
|
BCC NCK_ERR if timeout, then flag drive not ready
|
BCC NCK_ERR if timeout, then flag drive not ready
|
|
|
JSR RCHAR get response from host
|
JSR RCHAR get response from host
|
BCC NCK_ERR
|
BCC NCK_ERR
|
CMPA #ACK
|
CMPA #ACK
|
BNE NCK_ERR if NAK, then flag drive not ready
|
BNE NCK_ERR if NAK, then flag drive not ready
|
|
|
CLRB all OK, flag drive ready
|
CLRB all OK, flag drive ready
|
BRA NCK_END
|
BRA NCK_END
|
*
|
*
|
NCK_ERR LDB #16 report drive not ready
|
NCK_ERR LDB #16 report drive not ready
|
ORCC #$01 check needs carry set as well
|
ORCC #$01 check needs carry set as well
|
*
|
*
|
NCK_END TSTB
|
NCK_END TSTB
|
RTS
|
RTS
|
*
|
*
|
*
|
*
|
* recieve char from remote drive.
|
* recieve char from remote drive.
|
* timeout if no response for approx 1s.
|
* timeout if no response for approx 1s.
|
* Entry: no parameters
|
* Entry: no parameters
|
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
*
|
*
|
RCHAR PSHS X,Y
|
RCHAR PSHS X,Y
|
*
|
*
|
LDX #1000 1000x inner loop
|
LDX #1000 1000x inner loop
|
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
RCHAR2 LDA ACIAC1 test for recieved char
|
RCHAR2 LDA ACIAC1 test for recieved char
|
ASRA
|
ASRA
|
BCS RCHAR3 get character
|
BCS RCHAR3 get character
|
LEAY -1,Y else, continue to count delay
|
LEAY -1,Y else, continue to count delay
|
BNE RCHAR2
|
BNE RCHAR2
|
LEAX -1,X
|
LEAX -1,X
|
BNE RCHAR1
|
BNE RCHAR1
|
PULS X,Y,PC return with error if timed out
|
PULS X,Y,PC return with error if timed out
|
*
|
*
|
RCHAR3 LDA ACIAD1 return data (carry bit still set)
|
RCHAR3 LDA ACIAD1 return data (carry bit still set)
|
PULS X,Y,PC
|
PULS X,Y,PC
|
*
|
*
|
*
|
*
|
* transmit char to remote drive.
|
* transmit char to remote drive.
|
* timeout if no response for approx 1s. (allows for use of hardware flow control)
|
* timeout if no response for approx 1s. (allows for use of hardware flow control)
|
* Entry: (A) = char to transmit
|
* Entry: (A) = char to transmit
|
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
|
*
|
*
|
SCHAR PSHS X,Y
|
SCHAR PSHS X,Y
|
PSHS A
|
PSHS A
|
*
|
*
|
LDX #1000 1000x inner loop
|
LDX #1000 1000x inner loop
|
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
|
SCHAR2 LDA ACIAC1 test for space in transmit FIFO
|
SCHAR2 LDA ACIAC1 test for space in transmit FIFO
|
ASRA
|
ASRA
|
ASRA
|
ASRA
|
BCS SCHAR3 send character
|
BCS SCHAR3 send character
|
LEAY -1,Y else, continue to count delay
|
LEAY -1,Y else, continue to count delay
|
BNE SCHAR2
|
BNE SCHAR2
|
LEAX -1,X
|
LEAX -1,X
|
BNE SCHAR1
|
BNE SCHAR1
|
PULS A
|
PULS A
|
PULS X,Y,PC return with error if timed out
|
PULS X,Y,PC return with error if timed out
|
*
|
*
|
SCHAR3 PULS A
|
SCHAR3 PULS A
|
STA ACIAD1 send data (carry bit still set)
|
STA ACIAD1 send data (carry bit still set)
|
PULS X,Y,PC
|
PULS X,Y,PC
|
*
|
*
|
** 'UF' Format RAMdisc to FLEX standard.
|
** 'UF' Format RAMdisc to FLEX standard.
|
*
|
*
|
DISFOS FCB $0A,$0D
|
DISFOS FCB $0A,$0D
|
FCC 'Formating RAMdisk... '
|
FCC 'Formating RAMdisk... '
|
FCB 4
|
FCB 4
|
MESS6 FCB $0A,$0D,4
|
MESS6 FCB $0A,$0D,4
|
FCC 'Ramdisk not allocated! '
|
FCC 'Ramdisk not allocated! '
|
FCB 4
|
FCB 4
|
*
|
*
|
UFSUB LDX #DISFOS
|
UFSUB LDX #DISFOS
|
JSR PDATA1
|
JSR PDATA1
|
LDX #DTYPTAB search for allocated ramdisk
|
LDX #DTYPTAB search for allocated ramdisk
|
CLRB
|
CLRB
|
FMT9 LDA B,X
|
FMT9 LDA B,X
|
CMPA #DTYPRAM driver type 1 is ramdisk
|
CMPA #DTYPRAM driver type 1 is ramdisk
|
BEQ FFOUND
|
BEQ FFOUND
|
INCB
|
INCB
|
CMPB #4 end of table? then not allocated.
|
CMPB #4 end of table? then not allocated.
|
BNE FMT9
|
BNE FMT9
|
LDX #MESS6
|
LDX #MESS6
|
JSR PDATA1
|
JSR PDATA1
|
RTS
|
RTS
|
*
|
*
|
FFOUND STB DRVNUM
|
FFOUND STB DRVNUM
|
LDX #DRVNUM-3
|
LDX #DRVNUM-3
|
JSR DRVSEL
|
JSR DRVSEL
|
*
|
*
|
* set up free chain
|
* set up free chain
|
*
|
*
|
LDX #BUFFER clear out buffer
|
LDX #BUFFER clear out buffer
|
CLRA
|
CLRA
|
CLRB
|
CLRB
|
DFL1 STA 0,X+
|
DFL1 STA 0,X+
|
DECB
|
DECB
|
BNE DFL1
|
BNE DFL1
|
*
|
*
|
CLR TRACK
|
CLR TRACK
|
LDA #1
|
LDA #1
|
STA SECTOR
|
STA SECTOR
|
DFL2 LDX #BUFFER
|
DFL2 LDX #BUFFER
|
LDA TRACK
|
LDA TRACK
|
STA 0,X
|
STA 0,X
|
LDA SECTOR
|
LDA SECTOR
|
INCA
|
INCA
|
CMPA #RMAXSEC+1 last sector on track?
|
CMPA #RMAXSEC+1 last sector on track?
|
BNE DFL3
|
BNE DFL3
|
INC 0,X
|
INC 0,X
|
LDA #1
|
LDA #1
|
DFL3 STA 1,X
|
DFL3 STA 1,X
|
LDA TRACK
|
LDA TRACK
|
LDB SECTOR
|
LDB SECTOR
|
JSR WRITSC
|
JSR WRITSC
|
INC SECTOR
|
INC SECTOR
|
LDA SECTOR
|
LDA SECTOR
|
CMPA #RMAXSEC+1
|
CMPA #RMAXSEC+1
|
BNE DFL2
|
BNE DFL2
|
LDA #1
|
LDA #1
|
STA SECTOR
|
STA SECTOR
|
INC TRACK
|
INC TRACK
|
LDA TRACK
|
LDA TRACK
|
CMPA #RMAXTRK
|
CMPA #RMAXTRK
|
BNE DFL2
|
BNE DFL2
|
* break free chain at last track/sector
|
* break free chain at last track/sector
|
LDX #BUFFER
|
LDX #BUFFER
|
LDA #RMAXTRK-1
|
LDA #RMAXTRK-1
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
JSR READSC
|
JSR READSC
|
LDX #BUFFER
|
LDX #BUFFER
|
CLR 0,X
|
CLR 0,X
|
CLR 1,X
|
CLR 1,X
|
LDA #RMAXTRK-1
|
LDA #RMAXTRK-1
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
JSR WRITSC
|
JSR WRITSC
|
* set up sector structure, SIR, directory etc
|
* set up sector structure, SIR, directory etc
|
LDX #BUFFER
|
LDX #BUFFER
|
CLRA
|
CLRA
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
JSR READSC
|
JSR READSC
|
LDX #BUFFER
|
LDX #BUFFER
|
CLR 0,X break end of directory chain
|
CLR 0,X break end of directory chain
|
CLR 1,X
|
CLR 1,X
|
CLRA
|
CLRA
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
JSR WRITSC
|
JSR WRITSC
|
*
|
*
|
LDX #BUFFER
|
LDX #BUFFER
|
CLRA
|
CLRA
|
LDB #3 set up SIR
|
LDB #3 set up SIR
|
JSR READSC
|
JSR READSC
|
LDX #BUFFER
|
LDX #BUFFER
|
CLR 0,X break forward link
|
CLR 0,X break forward link
|
CLR 1,X
|
CLR 1,X
|
LDD #$5241 set volume name (RAMDISK )
|
LDD #$5241 set volume name (RAMDISK )
|
STD 16,X
|
STD 16,X
|
LDD #$4D44
|
LDD #$4D44
|
STD 18,X
|
STD 18,X
|
LDD #$4953
|
LDD #$4953
|
STD 20,X
|
STD 20,X
|
LDD #$4B20
|
LDD #$4B20
|
STD 22,X
|
STD 22,X
|
LDD #1 volume number
|
LDD #1 volume number
|
STD 27,X
|
STD 27,X
|
LDD #$0101 first trk/sec 01-01
|
LDD #$0101 first trk/sec 01-01
|
STD 29,X
|
STD 29,X
|
LDA #RMAXTRK-1
|
LDA #RMAXTRK-1
|
LDB #RMAXSEC
|
LDB #RMAXSEC
|
STD 31,X
|
STD 31,X
|
STD 38,X
|
STD 38,X
|
LDD #RTOTSEC total DATA sectors (2912-14)
|
LDD #RTOTSEC total DATA sectors (2912-14)
|
STD 33,X
|
STD 33,X
|
*
|
*
|
LDA #01 month set default creation date (SYS09's birthday!)
|
LDA #01 month set default creation date (SYS09's birthday!)
|
STA 35,X
|
STA 35,X
|
LDA #07 day
|
LDA #07 day
|
STA 36,X
|
STA 36,X
|
LDA #07 year
|
LDA #07 year
|
STA 37,X
|
STA 37,X
|
*
|
*
|
RF3 CLRA
|
RF3 CLRA
|
LDB #3
|
LDB #3
|
JSR WRITSC
|
JSR WRITSC
|
*
|
*
|
LDX #BUFFER
|
LDX #BUFFER
|
CLRA
|
CLRA
|
LDB #1
|
LDB #1
|
JSR READSC
|
JSR READSC
|
LDX #BUFFER
|
LDX #BUFFER
|
LDA #$AA set the init flag
|
LDA #$AA set the init flag
|
STA 0,X
|
STA 0,X
|
LDA #$55
|
LDA #$55
|
STA 1,X
|
STA 1,X
|
CLRA
|
CLRA
|
LDB #1
|
LDB #1
|
JMP WRITSC
|
JMP WRITSC
|
*
|
*
|
********************************
|
********************************
|
* System specific Boot *
|
* System specific Boot *
|
* command goes here. *
|
* command goes here. *
|
********************************
|
********************************
|
*
|
*
|
* Boot FLEX from the FPGA's internal pre-loaded scratch RAM
|
* Boot FLEX from the FPGA's internal pre-loaded scratch RAM
|
*
|
*
|
UBMESS FCB $08, $08
|
UBMESS FCB $08, $08
|
FCC 'Booting internal FLEX....'
|
FCC 'Booting internal FLEX....'
|
FCB $0D,$0A,$04
|
FCB $0D,$0A,$04
|
*
|
*
|
UBSUB LDX #UBMESS
|
UBSUB LDX #UBMESS
|
JSR PDATA1
|
JSR PDATA1
|
*
|
*
|
LDX #$D3E5
|
LDX #$D3E5
|
LDY #CONTAB Overlay console driver table
|
LDY #CONTAB Overlay console driver table
|
UB1 LDD 0,Y++
|
UB1 LDD 0,Y++
|
STD 0,X++
|
STD 0,X++
|
CMPX #$D3FD
|
CMPX #$D3FD
|
BNE UB1
|
BNE UB1
|
*
|
*
|
LDX #$DE00 Overlay disk driver table
|
LDX #$DE00 Overlay disk driver table
|
LDY #DISTAB
|
LDY #DISTAB
|
UB2 LDD 0,Y++
|
UB2 LDD 0,Y++
|
STD 0,X++
|
STD 0,X++
|
CMPX #$DE1E
|
CMPX #$DE1E
|
BNE UB2
|
BNE UB2
|
*
|
*
|
UBEND JMP $CD00
|
UBEND JMP $CD00
|
*
|
*
|
* FLEX console jump table.
|
* FLEX console jump table.
|
CONTAB FDB INPNE INPUT NO ECHO
|
CONTAB FDB INPNE INPUT NO ECHO
|
FDB DUMMY INTERRUPT HANDLER
|
FDB DUMMY INTERRUPT HANDLER
|
FDB MONRAM+$02 SWI VECTOR
|
FDB MONRAM+$02 SWI VECTOR
|
FDB MONRAM+$08 IRQ VECTOR
|
FDB MONRAM+$08 IRQ VECTOR
|
FDB DUMMY TIMER OFF
|
FDB DUMMY TIMER OFF
|
FDB DUMMY TIMER ON
|
FDB DUMMY TIMER ON
|
FDB DUMMY TIMER INITIALIZATION
|
FDB DUMMY TIMER INITIALIZATION
|
FDB CONTRL MONITOR
|
FDB CONTRL MONITOR
|
FDB DUMMY TERMINAL INITIALIZATION
|
FDB DUMMY TERMINAL INITIALIZATION
|
FDB STATUS INPUT CHECK
|
FDB STATUS INPUT CHECK
|
FDB OUTP TERMINAL OUTPUT
|
FDB OUTP TERMINAL OUTPUT
|
FDB INPE TERMINAL INPUT WITH ECHO
|
FDB INPE TERMINAL INPUT WITH ECHO
|
*
|
*
|
* FLEX disk jump table.
|
* FLEX disk jump table.
|
DISTAB JMP READSC
|
DISTAB JMP READSC
|
JMP WRITSC
|
JMP WRITSC
|
JMP BUSY
|
JMP BUSY
|
JMP RESTR1
|
JMP RESTR1
|
JMP DRVSEL
|
JMP DRVSEL
|
JMP CHKRDY
|
JMP CHKRDY
|
JMP CHKQIK
|
JMP CHKQIK
|
JMP DINIT
|
JMP DINIT
|
JMP DWARM
|
JMP DWARM
|
JMP SEEKTS
|
JMP SEEKTS
|
*
|
*
|
* Monitor jumps
|
* Monitor jumps
|
*
|
*
|
PDATA1 JMP [PDATAV]
|
PDATA1 JMP [PDATAV]
|
OUTP JMP [OUTCHV]
|
OUTP JMP [OUTCHV]
|
INPE JMP [INCHEV]
|
INPE JMP [INCHEV]
|
INPNE JMP [INCHV]
|
INPNE JMP [INCHV]
|
STATUS JMP [INCHKV]
|
STATUS JMP [INCHKV]
|
CONTRL JMP [MONITV]
|
CONTRL JMP [MONITV]
|
DUMMY RTS
|
DUMMY RTS
|
*
|
*
|
** 'UL' LOAD ROM DISK VIA SERIAL PORT
|
** 'UL' LOAD ROM DISK VIA SERIAL PORT
|
*
|
*
|
ULMES FCC 'Serial ROM Disk upload ...'
|
ULMES FCC 'Serial ROM Disk upload ...'
|
FCB $0D,$0A,$04
|
FCB $0D,$0A,$04
|
ULMES1 FCC 'ROM Disk Loaded'
|
ULMES1 FCC 'ROM Disk Loaded'
|
FCB $0D,$0A,$04
|
FCB $0D,$0A,$04
|
*
|
*
|
ULSUB LDX #ULMES
|
ULSUB LDX #ULMES
|
JSR PDATA1
|
JSR PDATA1
|
*
|
*
|
LDA #$00
|
LDA #$00
|
STA DRVNUM
|
STA DRVNUM
|
CLRA TRACK 0
|
CLRA TRACK 0
|
LDB #$01 SECTOR 1
|
LDB #$01 SECTOR 1
|
ULLOOP0 STA TRACK
|
ULLOOP0 STA TRACK
|
STB SECTOR`
|
STB SECTOR`
|
LBSR MAPIN
|
LBSR MAPIN
|
*
|
*
|
CLRB xfer 256 bytes at a time.
|
CLRB xfer 256 bytes at a time.
|
ULLOOP1 JSR LRBYTE transfer should be hex bytes
|
ULLOOP1 JSR LRBYTE transfer should be hex bytes
|
STA ,U+
|
STA ,U+
|
DECB
|
DECB
|
BNE ULLOOP1
|
BNE ULLOOP1
|
*
|
*
|
LBSR MAPOUT
|
LBSR MAPOUT
|
*
|
*
|
LDA TRACK
|
LDA TRACK
|
LDB SECTOR
|
LDB SECTOR
|
INCB
|
INCB
|
CMPB #EMAXSEC+1
|
CMPB #EMAXSEC+1
|
BNE ULLOOP0
|
BNE ULLOOP0
|
LDB #1
|
LDB #1
|
INCA
|
INCA
|
CMPA #EMAXTRK
|
CMPA #EMAXTRK
|
BNE ULLOOP0
|
BNE ULLOOP0
|
*
|
*
|
ULEXIT LDX #ULMES1
|
ULEXIT LDX #ULMES1
|
JMP PDATA1
|
JMP PDATA1
|
*
|
*
|
* Read a byte from the serial port
|
* Read a byte from the serial port
|
*
|
*
|
LRBYTE PSHS B
|
LRBYTE PSHS B
|
BSR LRHEX Get hex digit.
|
BSR LRHEX Get hex digit.
|
ASLA
|
ASLA
|
ASLA Shift to msb.
|
ASLA Shift to msb.
|
ASLA
|
ASLA
|
ASLA
|
ASLA
|
TFR A,B Save in B.
|
TFR A,B Save in B.
|
BSR LRHEX Get next digit.
|
BSR LRHEX Get next digit.
|
PSHS B
|
PSHS B
|
ADDA 0,S+ Add together bytes.
|
ADDA 0,S+ Add together bytes.
|
PULS B,PC
|
PULS B,PC
|
*
|
*
|
LRHEX JSR INTER
|
LRHEX JSR INTER
|
BVS LRHEX
|
BVS LRHEX
|
SUBA #$30 Remove ascii bias.
|
SUBA #$30 Remove ascii bias.
|
BMI LRHEX
|
BMI LRHEX
|
CMPA #$09 Number?
|
CMPA #$09 Number?
|
BLE LRHEX1 Yes.
|
BLE LRHEX1 Yes.
|
CMPA #$11 Keep testing.
|
CMPA #$11 Keep testing.
|
BMI LRHEX
|
BMI LRHEX
|
CMPA #$16
|
CMPA #$16
|
BGT LRHEX
|
BGT LRHEX
|
SUBA #$07
|
SUBA #$07
|
LRHEX1 RTS
|
LRHEX1 RTS
|
*
|
*
|
* ACIA INPUT TEST
|
* ACIA INPUT TEST
|
*
|
*
|
INTEST LDA ACIAC1
|
INTEST LDA ACIAC1
|
BITA #$01
|
BITA #$01
|
RTS
|
RTS
|
*
|
*
|
* RESET ACIA
|
* RESET ACIA
|
*
|
*
|
ACIRST LDA #$03 master reset
|
ACIRST LDA #$03 master reset
|
STA ACIAC1
|
STA ACIAC1
|
LDA #$11
|
LDA #$11
|
STA ACIAC1
|
STA ACIAC1
|
RTS
|
RTS
|
*
|
*
|
* ACIA INPUT
|
* ACIA INPUT
|
*
|
*
|
INTER LDA #16
|
INTER LDA #16
|
STA DELCNT+0
|
STA DELCNT+0
|
CLR DELCNT+1
|
CLR DELCNT+1
|
CLR DELCNT+2
|
CLR DELCNT+2
|
INTER0 LDA ACIAC1
|
INTER0 LDA ACIAC1
|
BITA #$01
|
BITA #$01
|
BNE INTER1
|
BNE INTER1
|
BITA #$78
|
BITA #$78
|
BEQ INTER2
|
BEQ INTER2
|
BSR ACIRST
|
BSR ACIRST
|
BRA INTER
|
BRA INTER
|
*
|
*
|
INTER1 LDA ACIAD1
|
INTER1 LDA ACIAD1
|
ANDCC #VFLAG
|
ANDCC #VFLAG
|
RTS
|
RTS
|
*
|
*
|
INTER2 DEC DELCNT+2
|
INTER2 DEC DELCNT+2
|
BNE INTER0
|
BNE INTER0
|
DEC DELCNT+1
|
DEC DELCNT+1
|
BNE INTER0
|
BNE INTER0
|
DEC DELCNT+0
|
DEC DELCNT+0
|
BNE INTER0
|
BNE INTER0
|
CLRA
|
CLRA
|
ORCC #VFLAG
|
ORCC #VFLAG
|
RTS
|
RTS
|
*
|
*
|
* ACIA OUTPUT
|
* ACIA OUTPUT
|
*
|
*
|
OUTTER PSHS A
|
OUTTER PSHS A
|
*
|
*
|
OUTTE1 LDA ACIAC1
|
OUTTE1 LDA ACIAC1
|
BITA #$02
|
BITA #$02
|
BNE OUTTE2
|
BNE OUTTE2
|
BITA #$78
|
BITA #$78
|
BEQ OUTTE1
|
BEQ OUTTE1
|
BSR ACIRST
|
BSR ACIRST
|
BRA OUTTE1
|
BRA OUTTE1
|
*
|
*
|
OUTTE2 PULS A
|
OUTTE2 PULS A
|
STA ACIAD1
|
STA ACIAD1
|
RTS
|
RTS
|
*
|
*
|
** 'UX' Xmodem ROM Disk upload
|
** 'UX' Xmodem ROM Disk upload
|
*
|
*
|
UXMES FCB $0D,$0A
|
UXMES FCB $0D,$0A
|
FCC 'Xmodem ROM Disk Upload'
|
FCC 'Xmodem ROM Disk Upload'
|
FCB 4
|
FCB 4
|
UXMES1 FCB $0D,$0A
|
UXMES1 FCB $0D,$0A
|
FCC 'Upload Complete'
|
FCC 'Upload Complete'
|
FCB 4
|
FCB 4
|
UXMES2 FCB $0D,$0A
|
UXMES2 FCB $0D,$0A
|
FCC 'Upload Error'
|
FCC 'Upload Error'
|
FCB 4
|
FCB 4
|
*
|
*
|
UXSUB LDX #UXMES
|
UXSUB LDX #UXMES
|
LBSR PDATA1
|
LBSR PDATA1
|
*
|
*
|
LDA #1
|
LDA #1
|
STA BLKNUM
|
STA BLKNUM
|
LDX #XSTSTR
|
LDX #XSTSTR
|
STX XSTATE
|
STX XSTATE
|
*
|
*
|
LDA #$00
|
LDA #$00
|
STA DRVNUM
|
STA DRVNUM
|
CLRA TRACK 0
|
CLRA TRACK 0
|
LDB #$01 SECTOR 1
|
LDB #$01 SECTOR 1
|
UXLOOP0 STA TRACK
|
UXLOOP0 STA TRACK
|
STB SECTOR
|
STB SECTOR
|
LBSR MAPIN
|
LBSR MAPIN
|
*
|
*
|
CLRB xfer 256 bytes at a time.
|
CLRB xfer 256 bytes at a time.
|
UXLOOP1 LBSR XBYTE transfer should be hex bytes
|
UXLOOP1 LBSR XBYTE transfer should be hex bytes
|
BCS UXERR
|
BCS UXERR
|
STA ,U+
|
STA ,U+
|
DECB
|
DECB
|
BNE UXLOOP1
|
BNE UXLOOP1
|
*
|
*
|
LBSR MAPOUT
|
LBSR MAPOUT
|
*
|
*
|
LDA TRACK
|
LDA TRACK
|
LDB SECTOR
|
LDB SECTOR
|
INCB
|
INCB
|
CMPB #EMAXSEC+1
|
CMPB #EMAXSEC+1
|
BNE UXLOOP0
|
BNE UXLOOP0
|
LDB #1
|
LDB #1
|
INCA
|
INCA
|
CMPA #EMAXTRK
|
CMPA #EMAXTRK
|
BNE UXLOOP0
|
BNE UXLOOP0
|
*
|
*
|
UXEXIT LDX #UXMES1
|
UXEXIT LDX #UXMES1
|
JMP PDATA1
|
JMP PDATA1
|
*
|
*
|
UXERR LBSR MAPOUT
|
UXERR LBSR MAPOUT
|
LDX #UXMES2
|
LDX #UXMES2
|
LBRA PDATA1
|
LBRA PDATA1
|
*
|
*
|
* Get a Byte using XModem protocol
|
* Get a Byte using XModem protocol
|
* Carry clear => no errors
|
* Carry clear => no errors
|
* Carry set => errors
|
* Carry set => errors
|
*
|
*
|
XBYTE PSHS X
|
XBYTE PSHS X
|
LDX XSTATE
|
LDX XSTATE
|
*
|
*
|
XBYTE0 LBSR INTER
|
XBYTE0 LBSR INTER
|
BVC XBYTE1
|
BVC XBYTE1
|
LDA #NAK
|
LDA #NAK
|
LBSR OUTTER
|
LBSR OUTTER
|
LDX #XSTSTR
|
LDX #XSTSTR
|
BRA XBYTE0
|
BRA XBYTE0
|
*
|
*
|
XBYTE1 JSR ,X
|
XBYTE1 JSR ,X
|
BNE XBYTE0
|
BNE XBYTE0
|
STX XSTATE
|
STX XSTATE
|
PULS X,PC
|
PULS X,PC
|
*
|
*
|
* START - LOOK FOR SOH (START OF HEADER) = $01
|
* START - LOOK FOR SOH (START OF HEADER) = $01
|
*
|
*
|
XSTSTR CMPA #SOH
|
XSTSTR CMPA #SOH
|
BNE XSTSTR1
|
BNE XSTSTR1
|
LDX #XSTBLK
|
LDX #XSTBLK
|
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
|
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
|
RTS
|
RTS
|
*
|
*
|
XSTSTR1 CMPA #EOT
|
XSTSTR1 CMPA #EOT
|
BNE XSTSTR2
|
BNE XSTSTR2
|
LDA #ACK
|
LDA #ACK
|
LBSR OUTTER
|
LBSR OUTTER
|
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
|
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
|
RTS
|
RTS
|
*
|
*
|
XSTSTR2 CMPA #CAN
|
XSTSTR2 CMPA #CAN
|
BNE XSTSTR3
|
BNE XSTSTR3
|
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
|
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
|
RTS
|
RTS
|
*
|
*
|
XSTSTR3 ANDCC #$FF-CFLAG-ZFLAG
|
XSTSTR3 ANDCC #$FF-CFLAG-ZFLAG
|
RTS
|
RTS
|
*
|
*
|
* Got SOH
|
* Got SOH
|
* Now get block number
|
* Now get block number
|
*
|
*
|
XSTBLK CMPA BLKNUM
|
XSTBLK CMPA BLKNUM
|
BNE XSTBLKE
|
BNE XSTBLKE
|
LDX #XSTCOM
|
LDX #XSTCOM
|
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
|
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
|
RTS
|
RTS
|
*
|
*
|
* Error in block number
|
* Error in block number
|
*
|
*
|
XSTBLKE LDA #NAK
|
XSTBLKE LDA #NAK
|
LBSR OUTTER
|
LBSR OUTTER
|
LDX #XSTSTR
|
LDX #XSTSTR
|
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
|
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
|
RTS
|
RTS
|
*
|
*
|
* Get complement of block number
|
* Get complement of block number
|
*
|
*
|
XSTCOM COMA
|
XSTCOM COMA
|
CMPA BLKNUM
|
CMPA BLKNUM
|
BNE XSTBLKE
|
BNE XSTBLKE
|
CLR CHKSUM
|
CLR CHKSUM
|
LDA #128
|
LDA #128
|
STA BYTCNT
|
STA BYTCNT
|
LDX #XSTDAT
|
LDX #XSTDAT
|
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
|
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
|
RTS
|
RTS
|
*
|
*
|
* Get data bytes
|
* Get data bytes
|
*
|
*
|
XSTDAT PSHS A
|
XSTDAT PSHS A
|
ADDA CHKSUM
|
ADDA CHKSUM
|
STA CHKSUM
|
STA CHKSUM
|
PULS A
|
PULS A
|
DEC BYTCNT
|
DEC BYTCNT
|
BNE XSTDAT1
|
BNE XSTDAT1
|
LDX #XSTCHK
|
LDX #XSTCHK
|
XSTDAT1 ANDCC #$FF-CFLAG No abort
|
XSTDAT1 ANDCC #$FF-CFLAG No abort
|
ORCC #ZFLAG Valid data (exit)
|
ORCC #ZFLAG Valid data (exit)
|
RTS
|
RTS
|
*
|
*
|
* Byte count reached zero
|
* Byte count reached zero
|
* Check checksum byte
|
* Check checksum byte
|
*
|
*
|
XSTCHK CMPA CHKSUM
|
XSTCHK CMPA CHKSUM
|
BNE XSTCHK1 retry if wrong checksum
|
BNE XSTCHK1 retry if wrong checksum
|
*
|
*
|
* Checksum OK ...
|
* Checksum OK ...
|
* increment block number
|
* increment block number
|
* and send ACK
|
* and send ACK
|
*
|
*
|
INC BLKNUM
|
INC BLKNUM
|
LDA #ACK
|
LDA #ACK
|
BRA XSTCHK2
|
BRA XSTCHK2
|
*
|
*
|
* Checksum Error detected ...
|
* Checksum Error detected ...
|
* Reset Sector counter in ACCB to last 128 byte boundary
|
* Reset Sector counter in ACCB to last 128 byte boundary
|
* and send NAK
|
* and send NAK
|
*
|
*
|
XSTCHK1 PSHS B
|
XSTCHK1 PSHS B
|
TFR U,D
|
TFR U,D
|
DECB
|
DECB
|
ANDB #128
|
ANDB #128
|
TFR D,U
|
TFR D,U
|
PULS B
|
PULS B
|
LDA #NAK
|
LDA #NAK
|
XSTCHK2 LBSR OUTTER
|
XSTCHK2 LBSR OUTTER
|
LDX #XSTSTR
|
LDX #XSTSTR
|
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
|
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
|
RTS
|
RTS
|
*
|
*
|
** 'UP' Load ROMdisk via config PROM.
|
** 'UP' Load ROMdisk via config PROM.
|
*
|
*
|
UPMES FCB $08,$08
|
UPMES FCB $08,$08
|
FCC 'Load ROM disk from config PROM.'
|
FCC 'Load ROM disk from config PROM.'
|
FCB 4
|
FCB 4
|
UPMES1 FCC 'Found SYNC, loading data...'
|
UPMES1 FCC 'Found SYNC, loading data...'
|
FCB $0A,$0D,4
|
FCB $0A,$0D,4
|
UPMES2 FCC 'ROM Disk Loaded.'
|
UPMES2 FCC 'ROM Disk Loaded.'
|
FCB $0A,$0D,4
|
FCB $0A,$0D,4
|
UPMES3 FCC 'ROM Disk Not Found.'
|
UPMES3 FCC 'ROM Disk Not Found.'
|
FCB $0A,$0D,4
|
FCB $0A,$0D,4
|
*
|
*
|
UPSUB LDX #UPMES
|
UPSUB LDX #UPMES
|
JSR PDATA1
|
JSR PDATA1
|
*
|
*
|
BSR UPRESET
|
BSR UPRESET
|
LDY #$0020 Set up count for 2 MBit
|
LDY #$0020 Set up count for 2 MBit
|
LDX #$0000
|
LDX #$0000
|
UPSUB1 BSR UPBIT Shift in bit
|
UPSUB1 BSR UPBIT Shift in bit
|
BSR UPSYNC Test for Sync pattern`
|
BSR UPSYNC Test for Sync pattern`
|
BEQ UPSUB4 Skip if found
|
BEQ UPSUB4 Skip if found
|
LEAX -1,X Count Down inner loop
|
LEAX -1,X Count Down inner loop
|
CMPX #$0000
|
CMPX #$0000
|
BNE UPSUB1 Branch if inner loop not complete
|
BNE UPSUB1 Branch if inner loop not complete
|
LEAY -1,X Count down outer loop
|
LEAY -1,X Count down outer loop
|
CMPY #$0000
|
CMPY #$0000
|
BNE UPSUB1 Branch if outer loop not complete
|
BNE UPSUB1 Branch if outer loop not complete
|
*
|
*
|
LDX #UPMES3 2MBits scanned, no synch, report error
|
LDX #UPMES3 2MBits scanned, no synch, report error
|
JMP PDATA1
|
JMP PDATA1
|
*
|
*
|
UPSUB4 LDX #UPMES1 Sync found, now load disk
|
UPSUB4 LDX #UPMES1 Sync found, now load disk
|
JSR PDATA1
|
JSR PDATA1
|
*
|
*
|
CLRA
|
CLRA
|
STA DRVNUM select Drive 0
|
STA DRVNUM select Drive 0
|
LDB #$01
|
LDB #$01
|
UPSUB2 STA TRACK track 0
|
UPSUB2 STA TRACK track 0
|
STB SECTOR sector 1
|
STB SECTOR sector 1
|
*
|
*
|
LBSR MAPIN map in buffer
|
LBSR MAPIN map in buffer
|
CLRB 256 byte sector
|
CLRB 256 byte sector
|
UPSUB3 BSR UPBYTE read byte from prom
|
UPSUB3 BSR UPBYTE read byte from prom
|
STA ,U+ Store in buffer
|
STA ,U+ Store in buffer
|
DECB
|
DECB
|
BNE UPSUB3 Loop until sector read`
|
BNE UPSUB3 Loop until sector read`
|
LBSR MAPOUT map out buffer
|
LBSR MAPOUT map out buffer
|
*
|
*
|
LDA TRACK Advance sector
|
LDA TRACK Advance sector
|
LDB SECTOR
|
LDB SECTOR
|
INCB
|
INCB
|
CMPB #EMAXSEC+1 Wrap on max sector count
|
CMPB #EMAXSEC+1 Wrap on max sector count
|
BNE UPSUB2
|
BNE UPSUB2
|
LDB #1
|
LDB #1
|
INCA Advance track
|
INCA Advance track
|
CMPA #EMAXTRK
|
CMPA #EMAXTRK
|
BNE UPSUB2
|
BNE UPSUB2
|
*
|
*
|
UPEXIT LDX #UPMES2 Load complete, report message
|
UPEXIT LDX #UPMES2 Load complete, report message
|
JMP PDATA1
|
JMP PDATA1
|
*
|
*
|
* Reset Serial PROM
|
* Reset Serial PROM
|
*
|
*
|
UPRESET LDA #PRSTHI Strobe the reset line
|
UPRESET LDA #PRSTHI Strobe the reset line
|
STA PROMREG
|
STA PROMREG
|
LDA #PRSTLO
|
LDA #PRSTLO
|
STA PROMREG
|
STA PROMREG
|
LDX #$0000 Delay a while`
|
LDX #$0000 Delay a while`
|
UPRST1 LEAX -1,X
|
UPRST1 LEAX -1,X
|
CMPX #$0000
|
CMPX #$0000
|
BNE UPRST1
|
BNE UPRST1
|
STX SYNCREG+0 Clear Sync Shift Register
|
STX SYNCREG+0 Clear Sync Shift Register
|
STX SYNCREG+2
|
STX SYNCREG+2
|
RTS
|
RTS
|
*
|
*
|
* Input 1 Bit From PROM
|
* Input 1 Bit From PROM
|
*
|
*
|
UPBIT LDA #PCLKHI
|
UPBIT LDA #PCLKHI
|
STA PROMREG
|
STA PROMREG
|
LDA #PCLKLO
|
LDA #PCLKLO
|
STA PROMREG
|
STA PROMREG
|
LDA PROMREG
|
LDA PROMREG
|
LSRA
|
LSRA
|
ASL SYNCREG+3
|
ASL SYNCREG+3
|
RTS
|
RTS
|
*
|
*
|
* Test for 32 bit Sync Word
|
* Test for 32 bit Sync Word
|
*
|
*
|
UPSYNC ROL SYNCREG+2
|
UPSYNC ROL SYNCREG+2
|
ROL SYNCREG+1
|
ROL SYNCREG+1
|
ROL SYNCREG+0
|
ROL SYNCREG+0
|
LDD #SYNCLO
|
LDD #SYNCLO
|
CMPD SYNCREG+2
|
CMPD SYNCREG+2
|
BNE UPSYNCX
|
BNE UPSYNCX
|
LDD #SYNCHI
|
LDD #SYNCHI
|
CMPD SYNCREG+0
|
CMPD SYNCREG+0
|
UPSYNCX RTS
|
UPSYNCX RTS
|
*
|
*
|
* Input 1 Byte From PROM
|
* Input 1 Byte From PROM
|
*
|
*
|
UPBYTE PSHS B
|
UPBYTE PSHS B
|
LDB #8
|
LDB #8
|
UPBYTE1 BSR UPBIT
|
UPBYTE1 BSR UPBIT
|
DECB
|
DECB
|
BNE UPBYTE1
|
BNE UPBYTE1
|
LDA SYNCREG+3
|
LDA SYNCREG+3
|
PULS B,PC
|
PULS B,PC
|
*
|
*
|
***** NEXTCMD *****
|
***** NEXTCMD *****
|
*
|
*
|
NEXTEXT LBSR INPE GET ONE CHAR. FROM TERMINAL
|
NEXTEXT LBSR INPE GET ONE CHAR. FROM TERMINAL
|
ANDA #$7F STRIP PARITY FROM CHAR.
|
ANDA #$7F STRIP PARITY FROM CHAR.
|
TFR A,B
|
TFR A,B
|
LDA #$20
|
LDA #$20
|
LBSR OUTP PRNT SPACE
|
LBSR OUTP PRNT SPACE
|
CMPB #$60
|
CMPB #$60
|
BLE NXTEX0
|
BLE NXTEX0
|
SUBB #$20
|
SUBB #$20
|
*
|
*
|
***** DO TABLE LOOKUP *****
|
***** DO TABLE LOOKUP *****
|
* FOR COMMAND FUNCTIONS
|
* FOR COMMAND FUNCTIONS
|
*
|
*
|
NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE
|
NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE
|
NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
|
NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
|
BEQ JMPEXT BRANCH IF MATCH FOUND
|
BEQ JMPEXT BRANCH IF MATCH FOUND
|
LEAX 2,X POINT TO NEXT ENTRY IN TABLE
|
LEAX 2,X POINT TO NEXT ENTRY IN TABLE
|
CMPX #EXTEND REACHED END OF TABLE YET ?
|
CMPX #EXTEND REACHED END OF TABLE YET ?
|
BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY
|
BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY
|
LDX #MSGWHAT POINT TO MSG "WHAT?"
|
LDX #MSGWHAT POINT TO MSG "WHAT?"
|
LBRA PDATA1 PRINT MSG AND RETURN
|
LBRA PDATA1 PRINT MSG AND RETURN
|
JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE
|
JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE
|
*
|
*
|
* EXTENDED COMMAND JUMP TABLE
|
* EXTENDED COMMAND JUMP TABLE
|
*
|
*
|
EXTTAB EQU *
|
EXTTAB EQU *
|
FCC 'B' BOOT FLEX
|
FCC 'B' BOOT FLEX
|
FDB UBSUB
|
FDB UBSUB
|
FCC 'L' LOAD ROM DISK OVER SERIAL PORT
|
FCC 'L' LOAD ROM DISK OVER SERIAL PORT
|
FDB ULSUB
|
FDB ULSUB
|
FCC 'F' FORMAT RAM DISK
|
FCC 'F' FORMAT RAM DISK
|
FDB UFSUB
|
FDB UFSUB
|
FCC 'P' LOAD ROM DISK FROM PROM
|
FCC 'P' LOAD ROM DISK FROM PROM
|
FDB UPSUB
|
FDB UPSUB
|
FCC 'X' XMODEM ROM DISK UPLOAD
|
FCC 'X' XMODEM ROM DISK UPLOAD
|
FDB UXSUB
|
FDB UXSUB
|
*
|
*
|
EXTEND EQU *
|
EXTEND EQU *
|
*
|
*
|
MSGWHAT FCC "WHAT ?"
|
MSGWHAT FCC "WHAT ?"
|
FCB $0A,$0D,$04
|
FCB $0A,$0D,$04
|
END
|
END
|
|
|