OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

[/] [System09/] [trunk/] [src/] [Flex9/] [f9-monex.asm] - Diff between revs 59 and 66

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 59 Rev 66
*
*
** 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
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.