Assembler release DWC_2.0 version 2.11
|
Assembler release DWC_2.0 version 2.11
|
May 6, 2004 (c) Motorola (free ware)
|
May 6, 2004 (c) Motorola (free ware)
|
0001 * 6809 Debug monitor for use with NOICE09
|
0001 * 6809 Debug monitor for use with NOICE09
|
0002 *
|
0002 *
|
0003 * Copyright (c) 1992-2006 by John Hartman
|
0003 * Copyright (c) 1992-2006 by John Hartman
|
0004 *
|
0004 *
|
0005 * Modification History:
|
0005 * Modification History:
|
0006 * 14-Jun-93 JLH release version
|
0006 * 14-Jun-93 JLH release version
|
0007 * 24-Aug-93 JLH bad constant for COMBUF length compare
|
0007 * 24-Aug-93 JLH bad constant for COMBUF length compare
|
0008 * 25-Feb-98 JLH assemble with either Motorola or Dunfield
|
0008 * 25-Feb-98 JLH assemble with either Motorola or Dunfield
|
0009 * 1-May-06 JLH slight cleanup
|
0009 * 1-May-06 JLH slight cleanup
|
0010 * 4-Jul-06 JEK Modified for System09 ACIA at $E000/$E001
|
0010 * 4-Jul-06 JEK Modified for System09 ACIA at $E000/$E001
|
0011 * 2K monitor RAM at $F000 - $F7FF
|
0011 * 2K monitor RAM at $F000 - $F7FF
|
0012 * Allocated 1536 bytes ($600) for user stack.
|
0012 * Allocated 1536 bytes ($600) for user stack.
|
0013 * disables watchdog timer
|
0013 * disables watchdog timer
|
0014 *
|
0014 *
|
0015 *============================================================================
|
0015 *============================================================================
|
0016 *
|
0016 *
|
0017 * To customize for a given target, you must change code in the
|
0017 * To customize for a given target, you must change code in the
|
0018 * hardware equates, the string TSTG, and the routines RESET and REWDT.
|
0018 * hardware equates, the string TSTG, and the routines RESET and REWDT.
|
0019 * You may or may not need to change GETCHAR, PUTCHAR, depending on
|
0019 * You may or may not need to change GETCHAR, PUTCHAR, depending on
|
0020 * how peculiar your UART is.
|
0020 * how peculiar your UART is.
|
0021 *
|
0021 *
|
0022 * This file has been assembled with the Motorola Freeware assembler
|
0022 * This file has been assembled with the Motorola Freeware assembler
|
0023 * available from the Motorola Freeware BBS and elsewhere.
|
0023 * available from the Motorola Freeware BBS and elsewhere.
|
0024 * BUT: you must first "comment out" the conditionals as required,
|
0024 * BUT: you must first "comment out" the conditionals as required,
|
0025 * because the Motorola assemblers do not have any IFEQ/ELSE/ENDIF
|
0025 * because the Motorola assemblers do not have any IFEQ/ELSE/ENDIF
|
0026 *
|
0026 *
|
0027 * This file may also be assembled with the Dunfield assembler
|
0027 * This file may also be assembled with the Dunfield assembler
|
0028 *
|
0028 *
|
0029 * To add mapped memory support:
|
0029 * To add mapped memory support:
|
0030 * 1) Define map port MAPREG here
|
0030 * 1) Define map port MAPREG here
|
0031 * 2) Define or import map port RAM image MAPIMG here if MAPREG is
|
0031 * 2) Define or import map port RAM image MAPIMG here if MAPREG is
|
0032 * write only. (The application code must update MAPIMG before
|
0032 * write only. (The application code must update MAPIMG before
|
0033 * outputing to MAPREG)
|
0033 * outputing to MAPREG)
|
0034 * 3) Search for and modify MAPREG, MAPIMG, and REG_PAGE usage below
|
0034 * 3) Search for and modify MAPREG, MAPIMG, and REG_PAGE usage below
|
0035 * 4) In TSTG below edit "LOW AND HIGH LIMIT OF MAPPED MEM"
|
0035 * 4) In TSTG below edit "LOW AND HIGH LIMIT OF MAPPED MEM"
|
0036 * to appropriate range (typically 4000H to 07FFFH for two-bit MMU)
|
0036 * to appropriate range (typically 4000H to 07FFFH for two-bit MMU)
|
0037 *
|
0037 *
|
0038 *============================================================================
|
0038 *============================================================================
|
0039 *
|
0039 *
|
0040 * I/O equates for Heng's ROM emulator (set true if used)
|
0040 * I/O equates for Heng's ROM emulator (set true if used)
|
0041 ***ROMEM SET 1
|
0041 ***ROMEM SET 1
|
0042 *
|
0042 *
|
0043 *============================================================================
|
0043 *============================================================================
|
0044 * HARDWARE PLATFORM CUSTOMIZATIONS
|
0044 * HARDWARE PLATFORM CUSTOMIZATIONS
|
0045 *
|
0045 *
|
0046 *RAM_START EQU $D800 START OF MONITOR RAM
|
0046 *RAM_START EQU $D800 START OF MONITOR RAM
|
0047 F000 RAM_START EQU $F000 START OF MONITOR RAM
|
0047 F000 RAM_START EQU $F000 START OF MONITOR RAM
|
0048 FC00 ROM_START EQU $FC00 START OF MONITOR CODE
|
0048 FC00 ROM_START EQU $FC00 START OF MONITOR CODE
|
0049 FFF0 HARD_VECT EQU $FFF0 START OF HARDWARE VECTORS
|
0049 FFF0 HARD_VECT EQU $FFF0 START OF HARDWARE VECTORS
|
0050
|
0050
|
0051 *============================================================================
|
0051 *============================================================================
|
0052 * Equates for memory mapped 16450 serial port on Heng's ROM emulator board
|
0052 * Equates for memory mapped 16450 serial port on Heng's ROM emulator board
|
0053 *;* IFEQ ROMEM,1
|
0053 *;* IFEQ ROMEM,1
|
0054 *
|
0054 *
|
0055 *S16450 equ $A000 base of 16450 UART
|
0055 *S16450 equ $A000 base of 16450 UART
|
0056 *RXR equ 0 Receiver buffer register
|
0056 *RXR equ 0 Receiver buffer register
|
0057 *TXR equ 0 Transmitter buffer register
|
0057 *TXR equ 0 Transmitter buffer register
|
0058 *IER equ 1 Interrupt enable register
|
0058 *IER equ 1 Interrupt enable register
|
0059 *LCR equ 3 Line control register
|
0059 *LCR equ 3 Line control register
|
0060 *MCR equ 4 Modem control register
|
0060 *MCR equ 4 Modem control register
|
0061 *DTR equ 1 Bit equate used to control status LED
|
0061 *DTR equ 1 Bit equate used to control status LED
|
0062 *LSR equ 5 Line status register
|
0062 *LSR equ 5 Line status register
|
0063 *
|
0063 *
|
0064 * Define monitor serial port
|
0064 * Define monitor serial port
|
0065 *SER_STATUS EQU S16450+LSR
|
0065 *SER_STATUS EQU S16450+LSR
|
0066 *SER_RXDATA EQU S16450+RXR
|
0066 *SER_RXDATA EQU S16450+RXR
|
0067 *SER_TXDATA EQU S16450+TXR
|
0067 *SER_TXDATA EQU S16450+TXR
|
0068 *RXRDY EQU $01 BIT MASK FOR RX BUFFER FULL
|
0068 *RXRDY EQU $01 BIT MASK FOR RX BUFFER FULL
|
0069 *TXRDY EQU $20 BIT MASK FOR TX BUFFER EMPTY
|
0069 *TXRDY EQU $20 BIT MASK FOR TX BUFFER EMPTY
|
0070 *;* ELSE
|
0070 *;* ELSE
|
0071 *
|
0071 *
|
0072 * Put you UART equates here
|
0072 * Put you UART equates here
|
0073 E000 SER_STATUS EQU $E000
|
0073 E000 SER_STATUS EQU $E000
|
0074 E001 SER_RXDATA EQU $E001
|
0074 E001 SER_RXDATA EQU $E001
|
0075 E001 SER_TXDATA EQU $E001
|
0075 E001 SER_TXDATA EQU $E001
|
0076 0001 RXRDY EQU $01
|
0076 0001 RXRDY EQU $01
|
0077 0002 TXRDY EQU $02
|
0077 0002 TXRDY EQU $02
|
0078 *
|
0078 *
|
0079 *;* ENDIF
|
0079 *;* ENDIF
|
0080 *
|
0080 *
|
0081 * Watchdog timer (if any) See REWDT for use
|
0081 * Watchdog timer (if any) See REWDT for use
|
0082 *WDT EQU $207
|
0082 *WDT EQU $207
|
0083 *
|
0083 *
|
0084 * Condition code bits
|
0084 * Condition code bits
|
0085 0001 C EQU 1
|
0085 0001 C EQU 1
|
0086 000A I EQU 10H
|
0086 000A I EQU 10H
|
0087 0028 F EQU 40H
|
0087 0028 F EQU 40H
|
0088 0050 E EQU 80H
|
0088 0050 E EQU 80H
|
0089 *
|
0089 *
|
0090 *============================================================================
|
0090 *============================================================================
|
0091 * RAM definitions:
|
0091 * RAM definitions:
|
0092 F000 ORG RAM_START
|
0092 F000 ORG RAM_START
|
0093 *
|
0093 *
|
0094 * RAM interrupt vectors (first in SEG for easy addressing, else move to
|
0094 * RAM interrupt vectors (first in SEG for easy addressing, else move to
|
0095 * their own SEG)
|
0095 * their own SEG)
|
0096 0008 NVEC EQU 8 number of vectors
|
0096 0008 NVEC EQU 8 number of vectors
|
0097 F000 RAMVEC RMB 2*NVEC
|
0097 F000 RAMVEC RMB 2*NVEC
|
0098 *
|
0098 *
|
0099 * Initial user stack
|
0099 * Initial user stack
|
0100 * (Size and location is user option)
|
0100 * (Size and location is user option)
|
0101 * RMB 64
|
0101 * RMB 64
|
0102 F010 RMB $600
|
0102 F010 RMB $600
|
0103 INITSTACK
|
0103 INITSTACK
|
0104 *
|
0104 *
|
0105 * Monitor stack
|
0105 * Monitor stack
|
0106 * (Calculated use is at most 7 bytes. Leave plenty of spare)
|
0106 * (Calculated use is at most 7 bytes. Leave plenty of spare)
|
0107 F610 RMB 16
|
0107 F610 RMB 16
|
0108 MONSTACK
|
0108 MONSTACK
|
0109 *
|
0109 *
|
0110 * Target registers: order must match that in TRGHC11.C
|
0110 * Target registers: order must match that in TRGHC11.C
|
0111 TASK_REGS
|
0111 TASK_REGS
|
0112 F620 REG_STATE RMB 1
|
0112 F620 REG_STATE RMB 1
|
0113 F621 REG_PAGE RMB 1
|
0113 F621 REG_PAGE RMB 1
|
0114 F622 REG_SP RMB 2
|
0114 F622 REG_SP RMB 2
|
0115 F624 REG_U RMB 2
|
0115 F624 REG_U RMB 2
|
0116 F626 REG_Y RMB 2
|
0116 F626 REG_Y RMB 2
|
0117 F628 REG_X RMB 2
|
0117 F628 REG_X RMB 2
|
0118 F62A REG_B RMB 1 B BEFORE A, SO D IS LEAST SIG. FIRST
|
0118 F62A REG_B RMB 1 B BEFORE A, SO D IS LEAST SIG. FIRST
|
0119 F62B REG_A RMB 1
|
0119 F62B REG_A RMB 1
|
0120 F62C REG_DP RMB 1
|
0120 F62C REG_DP RMB 1
|
0121 F62D REG_CC RMB 1
|
0121 F62D REG_CC RMB 1
|
0122 F62E REG_PC RMB 2
|
0122 F62E REG_PC RMB 2
|
0123 0010 TASK_REG_SZ EQU *-TASK_REGS
|
0123 0010 TASK_REG_SZ EQU *-TASK_REGS
|
0124 *
|
0124 *
|
0125 * Communications buffer
|
0125 * Communications buffer
|
0126 * (Must be at least as long as TASK_REG_SZ. At least 19 bytes recommended.
|
0126 * (Must be at least as long as TASK_REG_SZ. At least 19 bytes recommended.
|
0127 * Larger values may improve speed of NoICE memory move commands.)
|
0127 * Larger values may improve speed of NoICE memory move commands.)
|
0128 0080 COMBUF_SIZE EQU 128 DATA SIZE FOR COMM BUFFER
|
0128 0080 COMBUF_SIZE EQU 128 DATA SIZE FOR COMM BUFFER
|
0129 F630 COMBUF RMB 2+COMBUF_SIZE+1 BUFFER ALSO HAS FN, LEN, AND CHECK
|
0129 F630 COMBUF RMB 2+COMBUF_SIZE+1 BUFFER ALSO HAS FN, LEN, AND CHECK
|
0130 *
|
0130 *
|
0131 F6B3 RAM_END EQU * ADDRESS OF TOP+1 OF RAM
|
0131 F6B3 RAM_END EQU * ADDRESS OF TOP+1 OF RAM
|
0132 *
|
0132 *
|
0133 *===========================================================================
|
0133 *===========================================================================
|
0134 FC00 ORG ROM_START
|
0134 FC00 ORG ROM_START
|
0135 *
|
0135 *
|
0136 * Power on reset
|
0136 * Power on reset
|
0137 RESET
|
0137 RESET
|
0138 *
|
0138 *
|
0139 * Set CPU mode to safe state
|
0139 * Set CPU mode to safe state
|
0140 FC00 1A 32 ORCC #I+F INTERRUPTS OFF
|
0140 FC00 1A 32 ORCC #I+F INTERRUPTS OFF
|
0141 FC02 10 CE F6 20 LDS #MONSTACK CLEAN STACK IS HAPPY STACK
|
0141 FC02 10 CE F6 20 LDS #MONSTACK CLEAN STACK IS HAPPY STACK
|
0142 *
|
0142 *
|
0143 *----------------------------------------------------------------------------
|
0143 *----------------------------------------------------------------------------
|
0144 *;* IFEQ ROMEM,1
|
0144 *;* IFEQ ROMEM,1
|
0145 *
|
0145 *
|
0146 * Initialize S16450 UART on ROM emulator
|
0146 * Initialize S16450 UART on ROM emulator
|
0147 *
|
0147 *
|
0148 * Delay here in case the UART has not come out of reset yet.
|
0148 * Delay here in case the UART has not come out of reset yet.
|
0149 FC06 8E 00 00 LDX #0
|
0149 FC06 8E 00 00 LDX #0
|
0150 FC09 30 1F LOP LEAX -1,X DELAY FOR SLOW RESETTING UART
|
0150 FC09 30 1F LOP LEAX -1,X DELAY FOR SLOW RESETTING UART
|
0151 FC0B 12 NOP
|
0151 FC0B 12 NOP
|
0152 FC0C 12 NOP
|
0152 FC0C 12 NOP
|
0153 FC0D 26 FA BNE LOP
|
0153 FC0D 26 FA BNE LOP
|
0154 *
|
0154 *
|
0155 * access baud generator, no parity, 1 stop bit, 8 data bits
|
0155 * access baud generator, no parity, 1 stop bit, 8 data bits
|
0156 * LDA #$83
|
0156 * LDA #$83
|
0157 * STA S16450+LCR
|
0157 * STA S16450+LCR
|
0158 *
|
0158 *
|
0159 * fixed baud rate of 19200: crystal is 3.686400 Mhz.
|
0159 * fixed baud rate of 19200: crystal is 3.686400 Mhz.
|
0160 * Divisor is 3,686400/(16*baud)
|
0160 * Divisor is 3,686400/(16*baud)
|
0161 * LDA #12 fix at 19.2 kbaud
|
0161 * LDA #12 fix at 19.2 kbaud
|
0162 * STA S16450+RXR lsb
|
0162 * STA S16450+RXR lsb
|
0163 * LDA #0
|
0163 * LDA #0
|
0164 * STA S16450+RXR+1 msb=0
|
0164 * STA S16450+RXR+1 msb=0
|
0165 *
|
0165 *
|
0166 * access data registers, no parity, 1 stop bits, 8 data bits
|
0166 * access data registers, no parity, 1 stop bits, 8 data bits
|
0167 * LDA #$03
|
0167 * LDA #$03
|
0168 * STA S16450+LCR
|
0168 * STA S16450+LCR
|
0169 *
|
0169 *
|
0170 * no loopback, OUT2 on, OUT1 on, RTS on, DTR (LED) on
|
0170 * no loopback, OUT2 on, OUT1 on, RTS on, DTR (LED) on
|
0171 * LDA #$0F
|
0171 * LDA #$0F
|
0172 * STA S16450+MCR
|
0172 * STA S16450+MCR
|
0173 *
|
0173 *
|
0174 * disable all interrupts: modem, receive error, transmit, and receive
|
0174 * disable all interrupts: modem, receive error, transmit, and receive
|
0175 * LDA #$00
|
0175 * LDA #$00
|
0176 * STA S16450+IER
|
0176 * STA S16450+IER
|
0177 *
|
0177 *
|
0178 *;* ELSE
|
0178 *;* ELSE
|
0179 *
|
0179 *
|
0180 * Initialize your UART here
|
0180 * Initialize your UART here
|
0181 FC0F 86 03 LDA #$03 Reset ACIA
|
0181 FC0F 86 03 LDA #$03 Reset ACIA
|
0182 FC11 B7 E0 00 STA SER_STATUS
|
0182 FC11 B7 E0 00 STA SER_STATUS
|
0183 FC14 86 11 LDA #$11 8 data 2 stop no parity
|
0183 FC14 86 11 LDA #$11 8 data 2 stop no parity
|
0184 FC16 B7 E0 00 STA SER_STATUS
|
0184 FC16 B7 E0 00 STA SER_STATUS
|
0185 FC19 7D E0 01 TST SER_RXDATA
|
0185 FC19 7D E0 01 TST SER_RXDATA
|
0186 *;* ENDIF
|
0186 *;* ENDIF
|
0187 *
|
0187 *
|
0188 *----------------------------------------------------------------------------
|
0188 *----------------------------------------------------------------------------
|
0189 *
|
0189 *
|
0190 * Initialize RAM interrupt vectors
|
0190 * Initialize RAM interrupt vectors
|
0191 FC1C 10 8E FC AC LDY #INT_ENTRY ADDRESS OF DEFAULT HANDLER
|
0191 FC1C 10 8E FC AC LDY #INT_ENTRY ADDRESS OF DEFAULT HANDLER
|
0192 FC20 8E F0 00 LDX #RAMVEC POINTER TO RAM VECTORS
|
0192 FC20 8E F0 00 LDX #RAMVEC POINTER TO RAM VECTORS
|
0193 FC23 C6 08 LDB #NVEC NUMBER OF VECTORS
|
0193 FC23 C6 08 LDB #NVEC NUMBER OF VECTORS
|
0194 FC25 10 AF 81 RES10 STY ,X++ SET VECTOR
|
0194 FC25 10 AF 81 RES10 STY ,X++ SET VECTOR
|
0195 FC28 5A DECB
|
0195 FC28 5A DECB
|
0196 FC29 26 FA BNE RES10
|
0196 FC29 26 FA BNE RES10
|
0197 *
|
0197 *
|
0198 * Initialize user registers
|
0198 * Initialize user registers
|
0199 FC2B CC F6 10 LDD #INITSTACK
|
0199 FC2B CC F6 10 LDD #INITSTACK
|
0200 FC2E B7 F6 23 STA REG_SP+1 INIT USER'S STACK POINTER MSB
|
0200 FC2E B7 F6 23 STA REG_SP+1 INIT USER'S STACK POINTER MSB
|
0201 FC31 F7 F6 22 STB REG_SP LSB
|
0201 FC31 F7 F6 22 STB REG_SP LSB
|
0202 *
|
0202 *
|
0203 FC34 CC 00 00 LDD #0
|
0203 FC34 CC 00 00 LDD #0
|
0204 FC37 FD F6 2E STD REG_PC
|
0204 FC37 FD F6 2E STD REG_PC
|
0205 FC3A B7 F6 2B STA REG_A
|
0205 FC3A B7 F6 2B STA REG_A
|
0206 FC3D B7 F6 2A STA REG_B
|
0206 FC3D B7 F6 2A STA REG_B
|
0207 FC40 B7 F6 2C STA REG_DP
|
0207 FC40 B7 F6 2C STA REG_DP
|
0208 FC43 FD F6 28 STD REG_X
|
0208 FC43 FD F6 28 STD REG_X
|
0209 FC46 FD F6 26 STD REG_Y
|
0209 FC46 FD F6 26 STD REG_Y
|
0210 FC49 FD F6 24 STD REG_U
|
0210 FC49 FD F6 24 STD REG_U
|
0211 FC4C B7 F6 20 STA REG_STATE initial state is "RESET"
|
0211 FC4C B7 F6 20 STA REG_STATE initial state is "RESET"
|
0212 *
|
0212 *
|
0213 * Initialize memory paging variables and hardware (if any)
|
0213 * Initialize memory paging variables and hardware (if any)
|
0214 FC4F B7 F6 21 STA REG_PAGE initial page is zero
|
0214 FC4F B7 F6 21 STA REG_PAGE initial page is zero
|
0215 *;;; STA MAPIMG
|
0215 *;;; STA MAPIMG
|
0216 *;;; STA MAPREG set hardware map
|
0216 *;;; STA MAPREG set hardware map
|
0217 *
|
0217 *
|
0218 FC52 86 82 LDA #E+I+F state "all regs pushed", no ints
|
0218 FC52 86 82 LDA #E+I+F state "all regs pushed", no ints
|
0219 FC54 B7 F6 2D STA REG_CC
|
0219 FC54 B7 F6 2D STA REG_CC
|
0220 *
|
0220 *
|
0221 * Set function code for "GO". Then if we reset after being told to
|
0221 * Set function code for "GO". Then if we reset after being told to
|
0222 * GO, we will come back with registers so user can see the crash
|
0222 * GO, we will come back with registers so user can see the crash
|
0223 FC57 86 FA LDA #FN_RUN_TARG
|
0223 FC57 86 FA LDA #FN_RUN_TARG
|
0224 FC59 B7 F6 30 STA COMBUF
|
0224 FC59 B7 F6 30 STA COMBUF
|
0225 FC5C 7E FD D1 JMP RETURN_REGS DUMP REGS, ENTER MONITOR
|
0225 FC5C 7E FD D1 JMP RETURN_REGS DUMP REGS, ENTER MONITOR
|
0226 *
|
0226 *
|
0227 *===========================================================================
|
0227 *===========================================================================
|
0228 * Get a character to A
|
0228 * Get a character to A
|
0229 *
|
0229 *
|
0230 * Return A=char, CY=0 if data received
|
0230 * Return A=char, CY=0 if data received
|
0231 * CY=1 if timeout (0.5 seconds)
|
0231 * CY=1 if timeout (0.5 seconds)
|
0232 *
|
0232 *
|
0233 * Uses 6 bytes of stack including return address
|
0233 * Uses 6 bytes of stack including return address
|
0234 *
|
0234 *
|
0235 GETCHAR
|
0235 GETCHAR
|
0236 FC5F 34 10 PSHS X
|
0236 FC5F 34 10 PSHS X
|
0237 FC61 8E 00 00 LDX #0 LONG TIMEOUT
|
0237 FC61 8E 00 00 LDX #0 LONG TIMEOUT
|
0238 FC64 BD FC 8E GC10 JSR REWDT PREVENT WATCHDOG TIMEOUT
|
0238 FC64 BD FC 8E GC10 JSR REWDT PREVENT WATCHDOG TIMEOUT
|
0239 FC67 30 1F LEAX -1,X
|
0239 FC67 30 1F LEAX -1,X
|
0240 FC69 27 0D BEQ GC90 EXIT IF TIMEOUT
|
0240 FC69 27 0D BEQ GC90 EXIT IF TIMEOUT
|
0241 FC6B B6 E0 00 LDA SER_STATUS READ DEVICE STATUS
|
0241 FC6B B6 E0 00 LDA SER_STATUS READ DEVICE STATUS
|
0242 FC6E 84 01 ANDA #RXRDY
|
0242 FC6E 84 01 ANDA #RXRDY
|
0243 FC70 27 F2 BEQ GC10 NOT READY YET.
|
0243 FC70 27 F2 BEQ GC10 NOT READY YET.
|
0244 *
|
0244 *
|
0245 * Data received: return CY=0. data in A
|
0245 * Data received: return CY=0. data in A
|
0246 FC72 4F CLRA CY=0
|
0246 FC72 4F CLRA CY=0
|
0247 FC73 B6 E0 01 LDA SER_RXDATA READ DATA
|
0247 FC73 B6 E0 01 LDA SER_RXDATA READ DATA
|
0248 FC76 35 90 PULS X,PC
|
0248 FC76 35 90 PULS X,PC
|
0249 *
|
0249 *
|
0250 * Timeout: return CY=1
|
0250 * Timeout: return CY=1
|
0251 FC78 1A 01 GC90 ORCC #C CY=1
|
0251 FC78 1A 01 GC90 ORCC #C CY=1
|
0252 FC7A 35 90 PULS X,PC
|
0252 FC7A 35 90 PULS X,PC
|
0253 *
|
0253 *
|
0254 *===========================================================================
|
0254 *===========================================================================
|
0255 * Output character in A
|
0255 * Output character in A
|
0256 *
|
0256 *
|
0257 * Uses 5 bytes of stack including return address
|
0257 * Uses 5 bytes of stack including return address
|
0258 *
|
0258 *
|
0259 PUTCHAR
|
0259 PUTCHAR
|
0260 FC7C 34 02 PSHS A
|
0260 FC7C 34 02 PSHS A
|
0261 FC7E BD FC 8E PC10 JSR REWDT PREVENT WATCHDOG TIMEOUT
|
0261 FC7E BD FC 8E PC10 JSR REWDT PREVENT WATCHDOG TIMEOUT
|
0262 FC81 B6 E0 00 LDA SER_STATUS CHECK TX STATUS
|
0262 FC81 B6 E0 00 LDA SER_STATUS CHECK TX STATUS
|
0263 FC84 84 02 ANDA #TXRDY RX READY ?
|
0263 FC84 84 02 ANDA #TXRDY RX READY ?
|
0264 FC86 27 F6 BEQ PC10
|
0264 FC86 27 F6 BEQ PC10
|
0265 FC88 35 02 PULS A
|
0265 FC88 35 02 PULS A
|
0266 FC8A B7 E0 01 STA SER_TXDATA TRANSMIT CHAR.
|
0266 FC8A B7 E0 01 STA SER_TXDATA TRANSMIT CHAR.
|
0267 FC8D 39 RTS
|
0267 FC8D 39 RTS
|
0268 *
|
0268 *
|
0269 *======================================================================
|
0269 *======================================================================
|
0270 *
|
0270 *
|
0271 * RESET WATCHDOG TIMER. MUST BE CALLED AT LEAST ONCE EVERY LITTLE WHILE
|
0271 * RESET WATCHDOG TIMER. MUST BE CALLED AT LEAST ONCE EVERY LITTLE WHILE
|
0272 * OR COP INTERRUPT WILL OCCUR
|
0272 * OR COP INTERRUPT WILL OCCUR
|
0273 *
|
0273 *
|
0274 * Uses 2 bytes of stack including return address
|
0274 * Uses 2 bytes of stack including return address
|
0275 *
|
0275 *
|
0276 FC8E 4F REWDT CLRA
|
0276 FC8E 4F REWDT CLRA
|
0277 * STA WDT
|
0277 * STA WDT
|
0278 FC8F 4C INCA
|
0278 FC8F 4C INCA
|
0279 * STA WDT CU-style WDT: must leave bit high
|
0279 * STA WDT CU-style WDT: must leave bit high
|
0280 FC90 39 RTS
|
0280 FC90 39 RTS
|
0281 *
|
0281 *
|
0282 *======================================================================
|
0282 *======================================================================
|
0283 * Response string for GET TARGET STATUS request
|
0283 * Response string for GET TARGET STATUS request
|
0284 * Reply describes target:
|
0284 * Reply describes target:
|
0285 FC91 05 TSTG FCB 5 2: PROCESSOR TYPE = 6809
|
0285 FC91 05 TSTG FCB 5 2: PROCESSOR TYPE = 6809
|
0286 FC92 80 FCB COMBUF_SIZE 3: SIZE OF COMMUNICATIONS BUFFER
|
0286 FC92 80 FCB COMBUF_SIZE 3: SIZE OF COMMUNICATIONS BUFFER
|
0287 FC93 00 FCB 0 4: NO TASKING SUPPORT
|
0287 FC93 00 FCB 0 4: NO TASKING SUPPORT
|
0288 FC94 00 00 00 00 FDB 0,0 5-8: LOW AND HIGH LIMIT OF MAPPED MEM (NONE)
|
0288 FC94 00 00 00 00 FDB 0,0 5-8: LOW AND HIGH LIMIT OF MAPPED MEM (NONE)
|
0289 FC98 01 FCB B1-B0 9: BREAKPOINT INSTR LENGTH
|
0289 FC98 01 FCB B1-B0 9: BREAKPOINT INSTR LENGTH
|
0290 FC99 3F B0 SWI 10: BREAKPOINT INSTRUCTION
|
0290 FC99 3F B0 SWI 10: BREAKPOINT INSTRUCTION
|
0291 FC9A 36 38 30 39 20 6D B1 FCC '6809 monitor V1.0' DESCRIPTION, ZERO
|
0291 FC9A 36 38 30 39 20 6D B1 FCC '6809 monitor V1.0' DESCRIPTION, ZERO
|
6F 6E 69 74 6F 72
|
6F 6E 69 74 6F 72
|
20 56 31 2E 30
|
20 56 31 2E 30
|
0292 FCAB 00 FCB 0
|
0292 FCAB 00 FCB 0
|
0293 001B TSTG_SIZE EQU *-TSTG SIZE OF STRING
|
0293 001B TSTG_SIZE EQU *-TSTG SIZE OF STRING
|
0294 *
|
0294 *
|
0295 *======================================================================
|
0295 *======================================================================
|
0296 * HARDWARE PLATFORM INDEPENDENT EQUATES AND CODE
|
0296 * HARDWARE PLATFORM INDEPENDENT EQUATES AND CODE
|
0297 *
|
0297 *
|
0298 * Communications function codes.
|
0298 * Communications function codes.
|
0299 00FF FN_GET_STAT EQU $FF reply with device info
|
0299 00FF FN_GET_STAT EQU $FF reply with device info
|
0300 00FE FN_READ_MEM EQU $FE reply with data
|
0300 00FE FN_READ_MEM EQU $FE reply with data
|
0301 00FD FN_WRITE_M EQU $FD reply with status (+/-)
|
0301 00FD FN_WRITE_M EQU $FD reply with status (+/-)
|
0302 00FC FN_READ_RG EQU $FC reply with registers
|
0302 00FC FN_READ_RG EQU $FC reply with registers
|
0303 00FB FN_WRITE_RG EQU $FB reply with status
|
0303 00FB FN_WRITE_RG EQU $FB reply with status
|
0304 00FA FN_RUN_TARG EQU $FA reply (delayed) with registers
|
0304 00FA FN_RUN_TARG EQU $FA reply (delayed) with registers
|
0305 00F9 FN_SET_BYTE EQU $F9 reply with data (truncate if error)
|
0305 00F9 FN_SET_BYTE EQU $F9 reply with data (truncate if error)
|
0306 00F8 FN_IN EQU $F8 input from port
|
0306 00F8 FN_IN EQU $F8 input from port
|
0307 00F7 FN_OUT EQU $F7 output to port
|
0307 00F7 FN_OUT EQU $F7 output to port
|
0308 *
|
0308 *
|
0309 00F7 FN_MIN EQU $F7 MINIMUM RECOGNIZED FUNCTION CODE
|
0309 00F7 FN_MIN EQU $F7 MINIMUM RECOGNIZED FUNCTION CODE
|
0310 00F0 FN_ERROR EQU $F0 error reply to unknown op-code
|
0310 00F0 FN_ERROR EQU $F0 error reply to unknown op-code
|
0311 *
|
0311 *
|
0312 *===========================================================================
|
0312 *===========================================================================
|
0313 * Common handler for default interrupt handlers
|
0313 * Common handler for default interrupt handlers
|
0314 * Enter with A=interrupt code = processor state
|
0314 * Enter with A=interrupt code = processor state
|
0315 * All registers stacked, PC=next instruction
|
0315 * All registers stacked, PC=next instruction
|
0316 INT_ENTRY
|
0316 INT_ENTRY
|
0317 FCAC B7 F6 20 STA REG_STATE SAVE STATE
|
0317 FCAC B7 F6 20 STA REG_STATE SAVE STATE
|
0318 *
|
0318 *
|
0319 * Save registers from stack to reg block for return to master
|
0319 * Save registers from stack to reg block for return to master
|
0320 * Host wants least significant bytes first, so flip as necessary
|
0320 * Host wants least significant bytes first, so flip as necessary
|
0321 FCAF 35 02 PULS A
|
0321 FCAF 35 02 PULS A
|
0322 FCB1 B7 F6 2D STA REG_CC CONDITION CODES
|
0322 FCB1 B7 F6 2D STA REG_CC CONDITION CODES
|
0323 FCB4 35 02 PULS A
|
0323 FCB4 35 02 PULS A
|
0324 FCB6 B7 F6 2B STA REG_A A
|
0324 FCB6 B7 F6 2B STA REG_A A
|
0325 FCB9 35 02 PULS A
|
0325 FCB9 35 02 PULS A
|
0326 FCBB B7 F6 2A STA REG_B B
|
0326 FCBB B7 F6 2A STA REG_B B
|
0327 FCBE 35 02 PULS A
|
0327 FCBE 35 02 PULS A
|
0328 FCC0 B7 F6 2C STA REG_DP DP
|
0328 FCC0 B7 F6 2C STA REG_DP DP
|
0329 FCC3 35 06 PULS D
|
0329 FCC3 35 06 PULS D
|
0330 FCC5 B7 F6 29 STA REG_X+1 MSB X
|
0330 FCC5 B7 F6 29 STA REG_X+1 MSB X
|
0331 FCC8 F7 F6 28 STB REG_X LSB X
|
0331 FCC8 F7 F6 28 STB REG_X LSB X
|
0332 FCCB 35 06 PULS D
|
0332 FCCB 35 06 PULS D
|
0333 FCCD B7 F6 27 STA REG_Y+1 MSB Y
|
0333 FCCD B7 F6 27 STA REG_Y+1 MSB Y
|
0334 FCD0 F7 F6 26 STB REG_Y LSB Y
|
0334 FCD0 F7 F6 26 STB REG_Y LSB Y
|
0335 FCD3 35 06 PULS D
|
0335 FCD3 35 06 PULS D
|
0336 FCD5 B7 F6 25 STA REG_U+1 MSB U
|
0336 FCD5 B7 F6 25 STA REG_U+1 MSB U
|
0337 FCD8 F7 F6 24 STB REG_U LSB U
|
0337 FCD8 F7 F6 24 STB REG_U LSB U
|
0338 *
|
0338 *
|
0339 * If this is a breakpoint (state = 1), then back up PC to point at SWI
|
0339 * If this is a breakpoint (state = 1), then back up PC to point at SWI
|
0340 FCDB 35 10 PULS X PC AFTER INTERRUPT
|
0340 FCDB 35 10 PULS X PC AFTER INTERRUPT
|
0341 FCDD B6 F6 20 LDA REG_STATE
|
0341 FCDD B6 F6 20 LDA REG_STATE
|
0342 FCE0 81 01 CMPA #1
|
0342 FCE0 81 01 CMPA #1
|
0343 FCE2 26 02 BNE NOTBP BR IF NOT A BREAKPOINT
|
0343 FCE2 26 02 BNE NOTBP BR IF NOT A BREAKPOINT
|
0344 FCE4 30 1F LEAX -1,X ELSE BACK UP TO POINT AT SWI LOCATION
|
0344 FCE4 30 1F LEAX -1,X ELSE BACK UP TO POINT AT SWI LOCATION
|
0345 FCE6 1F 10 NOTBP TFR X,D TRANSFER PC TO D
|
0345 FCE6 1F 10 NOTBP TFR X,D TRANSFER PC TO D
|
0346 FCE8 B7 F6 2F STA REG_PC+1 MSB
|
0346 FCE8 B7 F6 2F STA REG_PC+1 MSB
|
0347 FCEB F7 F6 2E STB REG_PC LSB
|
0347 FCEB F7 F6 2E STB REG_PC LSB
|
0348 FCEE 7E FE 37 JMP ENTER_MON REG_PC POINTS AT POST-INTERRUPT OPCODE
|
0348 FCEE 7E FE 37 JMP ENTER_MON REG_PC POINTS AT POST-INTERRUPT OPCODE
|
0349 *
|
0349 *
|
0350 *===========================================================================
|
0350 *===========================================================================
|
0351 * Main loop wait for command frame from master
|
0351 * Main loop wait for command frame from master
|
0352 *
|
0352 *
|
0353 * Uses 6 bytes of stack including return address
|
0353 * Uses 6 bytes of stack including return address
|
0354 *
|
0354 *
|
0355 FCF1 10 CE F6 20 MAIN LDS #MONSTACK CLEAN STACK IS HAPPY STACK
|
0355 FCF1 10 CE F6 20 MAIN LDS #MONSTACK CLEAN STACK IS HAPPY STACK
|
0356 FCF5 8E F6 30 LDX #COMBUF BUILD MESSAGE HERE
|
0356 FCF5 8E F6 30 LDX #COMBUF BUILD MESSAGE HERE
|
0357 *
|
0357 *
|
0358 * First byte is a function code
|
0358 * First byte is a function code
|
0359 FCF8 BD FC 5F JSR GETCHAR GET A FUNCTION (6 bytes of stack)
|
0359 FCF8 BD FC 5F JSR GETCHAR GET A FUNCTION (6 bytes of stack)
|
0360 FCFB 25 F4 BCS MAIN JIF TIMEOUT: RESYNC
|
0360 FCFB 25 F4 BCS MAIN JIF TIMEOUT: RESYNC
|
0361 FCFD 81 F7 CMPA #FN_MIN
|
0361 FCFD 81 F7 CMPA #FN_MIN
|
0362 FCFF 25 F0 BLO MAIN JIF BELOW MIN: ILLEGAL FUNCTION
|
0362 FCFF 25 F0 BLO MAIN JIF BELOW MIN: ILLEGAL FUNCTION
|
0363 FD01 A7 80 STA ,X+ SAVE FUNCTION CODE
|
0363 FD01 A7 80 STA ,X+ SAVE FUNCTION CODE
|
0364 *
|
0364 *
|
0365 * Second byte is data byte count (may be zero)
|
0365 * Second byte is data byte count (may be zero)
|
0366 FD03 BD FC 5F JSR GETCHAR GET A LENGTH BYTE
|
0366 FD03 BD FC 5F JSR GETCHAR GET A LENGTH BYTE
|
0367 FD06 25 E9 BCS MAIN JIF TIMEOUT: RESYNC
|
0367 FD06 25 E9 BCS MAIN JIF TIMEOUT: RESYNC
|
0368 FD08 81 80 CMPA #COMBUF_SIZE
|
0368 FD08 81 80 CMPA #COMBUF_SIZE
|
0369 FD0A 22 E5 BHI MAIN JIF TOO LONG: ILLEGAL LENGTH
|
0369 FD0A 22 E5 BHI MAIN JIF TOO LONG: ILLEGAL LENGTH
|
0370 FD0C A7 80 STA ,X+ SAVE LENGTH
|
0370 FD0C A7 80 STA ,X+ SAVE LENGTH
|
0371 FD0E 81 00 CMPA #0
|
0371 FD0E 81 00 CMPA #0
|
0372 FD10 27 0C BEQ MA80 SKIP DATA LOOP IF LENGTH = 0
|
0372 FD10 27 0C BEQ MA80 SKIP DATA LOOP IF LENGTH = 0
|
0373 *
|
0373 *
|
0374 * Loop for data
|
0374 * Loop for data
|
0375 FD12 1F 89 TFR A,B SAVE LENGTH FOR LOOP
|
0375 FD12 1F 89 TFR A,B SAVE LENGTH FOR LOOP
|
0376 FD14 BD FC 5F MA10 JSR GETCHAR GET A DATA BYTE
|
0376 FD14 BD FC 5F MA10 JSR GETCHAR GET A DATA BYTE
|
0377 FD17 25 D8 BCS MAIN JIF TIMEOUT: RESYNC
|
0377 FD17 25 D8 BCS MAIN JIF TIMEOUT: RESYNC
|
0378 FD19 A7 80 STA ,X+ SAVE DATA BYTE
|
0378 FD19 A7 80 STA ,X+ SAVE DATA BYTE
|
0379 FD1B 5A DECB
|
0379 FD1B 5A DECB
|
0380 FD1C 26 F6 BNE MA10
|
0380 FD1C 26 F6 BNE MA10
|
0381 *
|
0381 *
|
0382 * Get the checksum
|
0382 * Get the checksum
|
0383 FD1E BD FC 5F MA80 JSR GETCHAR GET THE CHECKSUM
|
0383 FD1E BD FC 5F MA80 JSR GETCHAR GET THE CHECKSUM
|
0384 FD21 25 CE BCS MAIN JIF TIMEOUT: RESYNC
|
0384 FD21 25 CE BCS MAIN JIF TIMEOUT: RESYNC
|
0385 FD23 34 02 PSHS A SAVE CHECKSUM
|
0385 FD23 34 02 PSHS A SAVE CHECKSUM
|
0386 *
|
0386 *
|
0387 * Compare received checksum to that calculated on received buffer
|
0387 * Compare received checksum to that calculated on received buffer
|
0388 * (Sum should be 0)
|
0388 * (Sum should be 0)
|
0389 FD25 BD FE B4 JSR CHECKSUM
|
0389 FD25 BD FE B4 JSR CHECKSUM
|
0390 FD28 AB E0 ADDA ,S+ ADD SAVED CHECKSUM TO COMPUTED
|
0390 FD28 AB E0 ADDA ,S+ ADD SAVED CHECKSUM TO COMPUTED
|
0391 FD2A 26 C5 BNE MAIN JIF BAD CHECKSUM
|
0391 FD2A 26 C5 BNE MAIN JIF BAD CHECKSUM
|
0392 *
|
0392 *
|
0393 * Process the message.
|
0393 * Process the message.
|
0394 FD2C 8E F6 30 LDX #COMBUF
|
0394 FD2C 8E F6 30 LDX #COMBUF
|
0395 FD2F A6 80 LDA ,X+ GET THE FUNCTION CODE
|
0395 FD2F A6 80 LDA ,X+ GET THE FUNCTION CODE
|
0396 FD31 E6 80 LDB ,X+ GET THE LENGTH
|
0396 FD31 E6 80 LDB ,X+ GET THE LENGTH
|
0397 FD33 81 FF CMPA #FN_GET_STAT
|
0397 FD33 81 FF CMPA #FN_GET_STAT
|
0398 FD35 27 42 BEQ TARGET_STAT
|
0398 FD35 27 42 BEQ TARGET_STAT
|
0399 FD37 81 FE CMPA #FN_READ_MEM
|
0399 FD37 81 FE CMPA #FN_READ_MEM
|
0400 FD39 27 26 BEQ JREAD_MEM
|
0400 FD39 27 26 BEQ JREAD_MEM
|
0401 FD3B 81 FD CMPA #FN_WRITE_M
|
0401 FD3B 81 FD CMPA #FN_WRITE_M
|
0402 FD3D 27 25 BEQ JWRITE_MEM
|
0402 FD3D 27 25 BEQ JWRITE_MEM
|
0403 FD3F 81 FC CMPA #FN_READ_RG
|
0403 FD3F 81 FC CMPA #FN_READ_RG
|
0404 FD41 27 24 BEQ JREAD_REGS
|
0404 FD41 27 24 BEQ JREAD_REGS
|
0405 FD43 81 FB CMPA #FN_WRITE_RG
|
0405 FD43 81 FB CMPA #FN_WRITE_RG
|
0406 FD45 27 23 BEQ JWRITE_REGS
|
0406 FD45 27 23 BEQ JWRITE_REGS
|
0407 FD47 81 FA CMPA #FN_RUN_TARG
|
0407 FD47 81 FA CMPA #FN_RUN_TARG
|
0408 FD49 27 22 BEQ JRUN_TARGET
|
0408 FD49 27 22 BEQ JRUN_TARGET
|
0409 FD4B 81 F9 CMPA #FN_SET_BYTE
|
0409 FD4B 81 F9 CMPA #FN_SET_BYTE
|
0410 FD4D 27 21 BEQ JSET_BYTES
|
0410 FD4D 27 21 BEQ JSET_BYTES
|
0411 FD4F 81 F8 CMPA #FN_IN
|
0411 FD4F 81 F8 CMPA #FN_IN
|
0412 FD51 27 20 BEQ JIN_PORT
|
0412 FD51 27 20 BEQ JIN_PORT
|
0413 FD53 81 F7 CMPA #FN_OUT
|
0413 FD53 81 F7 CMPA #FN_OUT
|
0414 FD55 27 1F BEQ JOUT_PORT
|
0414 FD55 27 1F BEQ JOUT_PORT
|
0415 *
|
0415 *
|
0416 * Error: unknown function. Complain
|
0416 * Error: unknown function. Complain
|
0417 FD57 86 F0 LDA #FN_ERROR
|
0417 FD57 86 F0 LDA #FN_ERROR
|
0418 FD59 B7 F6 30 STA COMBUF SET FUNCTION AS "ERROR"
|
0418 FD59 B7 F6 30 STA COMBUF SET FUNCTION AS "ERROR"
|
0419 FD5C 86 01 LDA #1
|
0419 FD5C 86 01 LDA #1
|
0420 FD5E 7E FE 92 JMP SEND_STATUS VALUE IS "ERROR"
|
0420 FD5E 7E FE 92 JMP SEND_STATUS VALUE IS "ERROR"
|
0421 *
|
0421 *
|
0422 * long jumps to handlers
|
0422 * long jumps to handlers
|
0423 FD61 7E FD 8E JREAD_MEM JMP READ_MEM
|
0423 FD61 7E FD 8E JREAD_MEM JMP READ_MEM
|
0424 FD64 7E FD A5 JWRITE_MEM JMP WRITE_MEM
|
0424 FD64 7E FD A5 JWRITE_MEM JMP WRITE_MEM
|
0425 FD67 7E FD D1 JREAD_REGS JMP READ_REGS
|
0425 FD67 7E FD D1 JREAD_REGS JMP READ_REGS
|
0426 FD6A 7E FD E6 JWRITE_REGS JMP WRITE_REGS
|
0426 FD6A 7E FD E6 JWRITE_REGS JMP WRITE_REGS
|
0427 FD6D 7E FD F8 JRUN_TARGET JMP RUN_TARGET
|
0427 FD6D 7E FD F8 JRUN_TARGET JMP RUN_TARGET
|
0428 FD70 7E FE 4B JSET_BYTES JMP SET_BYTES
|
0428 FD70 7E FE 4B JSET_BYTES JMP SET_BYTES
|
0429 FD73 7E FE 79 JIN_PORT JMP IN_PORT
|
0429 FD73 7E FE 79 JIN_PORT JMP IN_PORT
|
0430 FD76 7E FE 84 JOUT_PORT JMP OUT_PORT
|
0430 FD76 7E FE 84 JOUT_PORT JMP OUT_PORT
|
0431
|
0431
|
0432 *===========================================================================
|
0432 *===========================================================================
|
0433 *
|
0433 *
|
0434 * Target Status: FN, len
|
0434 * Target Status: FN, len
|
0435 *
|
0435 *
|
0436 * Entry with A=function code, B=data size, X=COMBUF+2
|
0436 * Entry with A=function code, B=data size, X=COMBUF+2
|
0437 *
|
0437 *
|
0438 TARGET_STAT
|
0438 TARGET_STAT
|
0439 FD79 8E FC 91 LDX #TSTG DATA FOR REPLY
|
0439 FD79 8E FC 91 LDX #TSTG DATA FOR REPLY
|
0440 FD7C 10 8E F6 31 LDY #COMBUF+1 POINTER TO RETURN BUFFER
|
0440 FD7C 10 8E F6 31 LDY #COMBUF+1 POINTER TO RETURN BUFFER
|
0441 FD80 C6 1B LDB #TSTG_SIZE LENGTH OF REPLY
|
0441 FD80 C6 1B LDB #TSTG_SIZE LENGTH OF REPLY
|
0442 FD82 E7 A0 STB ,Y+ SET SIZE IN REPLY BUFFER
|
0442 FD82 E7 A0 STB ,Y+ SET SIZE IN REPLY BUFFER
|
0443 FD84 A6 80 TS10 LDA ,X+ MOVE REPLY DATA TO BUFFER
|
0443 FD84 A6 80 TS10 LDA ,X+ MOVE REPLY DATA TO BUFFER
|
0444 FD86 A7 A0 STA ,Y+
|
0444 FD86 A7 A0 STA ,Y+
|
0445 FD88 5A DECB
|
0445 FD88 5A DECB
|
0446 FD89 26 F9 BNE TS10
|
0446 FD89 26 F9 BNE TS10
|
0447 *
|
0447 *
|
0448 * Compute checksum on buffer, and send to master, then return
|
0448 * Compute checksum on buffer, and send to master, then return
|
0449 FD8B 7E FE 9C JMP SEND
|
0449 FD8B 7E FE 9C JMP SEND
|
0450
|
0450
|
0451 *===========================================================================
|
0451 *===========================================================================
|
0452 *
|
0452 *
|
0453 * Read Memory: FN, len, page, Alo, Ahi, Nbytes
|
0453 * Read Memory: FN, len, page, Alo, Ahi, Nbytes
|
0454 *
|
0454 *
|
0455 * Entry with A=function code, B=data size, X=COMBUF+2
|
0455 * Entry with A=function code, B=data size, X=COMBUF+2
|
0456 *
|
0456 *
|
0457 READ_MEM
|
0457 READ_MEM
|
0458 *
|
0458 *
|
0459 * Set map
|
0459 * Set map
|
0460 *;;; LDA 0,X
|
0460 *;;; LDA 0,X
|
0461 *;;; STA MAPIMG
|
0461 *;;; STA MAPIMG
|
0462 *;;; STA MAPREG
|
0462 *;;; STA MAPREG
|
0463 *
|
0463 *
|
0464 * Get address
|
0464 * Get address
|
0465 FD8E A6 02 LDA 2,X MSB OF ADDRESS IN A
|
0465 FD8E A6 02 LDA 2,X MSB OF ADDRESS IN A
|
0466 FD90 E6 01 LDB 1,X LSB OF ADDRESS IN B
|
0466 FD90 E6 01 LDB 1,X LSB OF ADDRESS IN B
|
0467 FD92 1F 02 TFR D,Y ADDRESS IN Y
|
0467 FD92 1F 02 TFR D,Y ADDRESS IN Y
|
0468 *
|
0468 *
|
0469 * Prepare return buffer: FN (unchanged), LEN, DATA
|
0469 * Prepare return buffer: FN (unchanged), LEN, DATA
|
0470 FD94 E6 03 LDB 3,X NUMBER OF BYTES TO RETURN
|
0470 FD94 E6 03 LDB 3,X NUMBER OF BYTES TO RETURN
|
0471 FD96 F7 F6 31 STB COMBUF+1 RETURN LENGTH = REQUESTED DATA
|
0471 FD96 F7 F6 31 STB COMBUF+1 RETURN LENGTH = REQUESTED DATA
|
0472 FD99 27 07 BEQ GLP90 JIF NO BYTES TO GET
|
0472 FD99 27 07 BEQ GLP90 JIF NO BYTES TO GET
|
0473 *
|
0473 *
|
0474 * Read the requested bytes from local memory
|
0474 * Read the requested bytes from local memory
|
0475 FD9B A6 A0 GLP LDA ,Y+ GET BYTE
|
0475 FD9B A6 A0 GLP LDA ,Y+ GET BYTE
|
0476 FD9D A7 80 STA ,X+ STORE TO RETURN BUFFER
|
0476 FD9D A7 80 STA ,X+ STORE TO RETURN BUFFER
|
0477 FD9F 5A DECB
|
0477 FD9F 5A DECB
|
0478 FDA0 26 F9 BNE GLP
|
0478 FDA0 26 F9 BNE GLP
|
0479 *
|
0479 *
|
0480 * Compute checksum on buffer, and send to master, then return
|
0480 * Compute checksum on buffer, and send to master, then return
|
0481 FDA2 7E FE 9C GLP90 JMP SEND
|
0481 FDA2 7E FE 9C GLP90 JMP SEND
|
0482
|
0482
|
0483 *===========================================================================
|
0483 *===========================================================================
|
0484 *
|
0484 *
|
0485 * Write Memory: FN, len, page, Alo, Ahi, (len-3 bytes of Data)
|
0485 * Write Memory: FN, len, page, Alo, Ahi, (len-3 bytes of Data)
|
0486 *
|
0486 *
|
0487 * Entry with A=function code, B=data size, X=COMBUF+2
|
0487 * Entry with A=function code, B=data size, X=COMBUF+2
|
0488 *
|
0488 *
|
0489 * Uses 6 bytes of stack
|
0489 * Uses 6 bytes of stack
|
0490 *
|
0490 *
|
0491 WRITE_MEM
|
0491 WRITE_MEM
|
0492 *
|
0492 *
|
0493 * Set map
|
0493 * Set map
|
0494 FDA5 A6 80 LDA ,X+
|
0494 FDA5 A6 80 LDA ,X+
|
0495 *;;; STA MAPIMG
|
0495 *;;; STA MAPIMG
|
0496 *;;; STA MAPREG
|
0496 *;;; STA MAPREG
|
0497 *
|
0497 *
|
0498 * Get address
|
0498 * Get address
|
0499 FDA7 E6 80 LDB ,X+ LSB OF ADDRESS IN B
|
0499 FDA7 E6 80 LDB ,X+ LSB OF ADDRESS IN B
|
0500 FDA9 A6 80 LDA ,X+ MSB OF ADDRESS IN A
|
0500 FDA9 A6 80 LDA ,X+ MSB OF ADDRESS IN A
|
0501 FDAB 1F 02 TFR D,Y ADDRESS IN Y
|
0501 FDAB 1F 02 TFR D,Y ADDRESS IN Y
|
0502 *
|
0502 *
|
0503 * Compute number of bytes to write
|
0503 * Compute number of bytes to write
|
0504 FDAD F6 F6 31 LDB COMBUF+1 NUMBER OF BYTES TO RETURN
|
0504 FDAD F6 F6 31 LDB COMBUF+1 NUMBER OF BYTES TO RETURN
|
0505 FDB0 C0 03 SUBB #3 MINUS PAGE AND ADDRESS
|
0505 FDB0 C0 03 SUBB #3 MINUS PAGE AND ADDRESS
|
0506 FDB2 27 14 BEQ WLP50 JIF NO BYTES TO PUT
|
0506 FDB2 27 14 BEQ WLP50 JIF NO BYTES TO PUT
|
0507 *
|
0507 *
|
0508 * Write the specified bytes to local memory
|
0508 * Write the specified bytes to local memory
|
0509 FDB4 34 34 PSHS B,X,Y
|
0509 FDB4 34 34 PSHS B,X,Y
|
0510 FDB6 A6 80 WLP LDA ,X+ GET BYTE TO WRITE
|
0510 FDB6 A6 80 WLP LDA ,X+ GET BYTE TO WRITE
|
0511 FDB8 A7 A0 STA ,Y+ STORE THE BYTE AT ,Y
|
0511 FDB8 A7 A0 STA ,Y+ STORE THE BYTE AT ,Y
|
0512 FDBA 5A DECB
|
0512 FDBA 5A DECB
|
0513 FDBB 26 F9 BNE WLP
|
0513 FDBB 26 F9 BNE WLP
|
0514 *
|
0514 *
|
0515 * Compare to see if the write worked
|
0515 * Compare to see if the write worked
|
0516 FDBD 35 34 PULS B,X,Y
|
0516 FDBD 35 34 PULS B,X,Y
|
0517 FDBF A6 80 WLP20 LDA ,X+ GET BYTE JUST WRITTEN
|
0517 FDBF A6 80 WLP20 LDA ,X+ GET BYTE JUST WRITTEN
|
0518 FDC1 A1 A0 CMPA ,Y+
|
0518 FDC1 A1 A0 CMPA ,Y+
|
0519 FDC3 26 07 BNE WLP80 BR IF WRITE FAILED
|
0519 FDC3 26 07 BNE WLP80 BR IF WRITE FAILED
|
0520 FDC5 5A DECB
|
0520 FDC5 5A DECB
|
0521 FDC6 26 F7 BNE WLP20
|
0521 FDC6 26 F7 BNE WLP20
|
0522 *
|
0522 *
|
0523 * Write succeeded: return status = 0
|
0523 * Write succeeded: return status = 0
|
0524 FDC8 86 00 WLP50 LDA #0 RETURN STATUS = 0
|
0524 FDC8 86 00 WLP50 LDA #0 RETURN STATUS = 0
|
0525 FDCA 20 02 BRA WLP90
|
0525 FDCA 20 02 BRA WLP90
|
0526 *
|
0526 *
|
0527 * Write failed: return status = 1
|
0527 * Write failed: return status = 1
|
0528 FDCC 86 01 WLP80 LDA #1
|
0528 FDCC 86 01 WLP80 LDA #1
|
0529
|
0529
|
0530 * Return OK status
|
0530 * Return OK status
|
0531 FDCE 7E FE 92 WLP90 JMP SEND_STATUS
|
0531 FDCE 7E FE 92 WLP90 JMP SEND_STATUS
|
0532
|
0532
|
0533 *===========================================================================
|
0533 *===========================================================================
|
0534 *
|
0534 *
|
0535 * Read registers: FN, len=0
|
0535 * Read registers: FN, len=0
|
0536 *
|
0536 *
|
0537 * Entry with A=function code, B=data size, X=COMBUF+2
|
0537 * Entry with A=function code, B=data size, X=COMBUF+2
|
0538 *
|
0538 *
|
0539 READ_REGS
|
0539 READ_REGS
|
0540 *
|
0540 *
|
0541 * Enter here from SWI after "RUN" and "STEP" to return task registers
|
0541 * Enter here from SWI after "RUN" and "STEP" to return task registers
|
0542 RETURN_REGS
|
0542 RETURN_REGS
|
0543 FDD1 10 8E F6 20 LDY #TASK_REGS POINTER TO REGISTERS
|
0543 FDD1 10 8E F6 20 LDY #TASK_REGS POINTER TO REGISTERS
|
0544 FDD5 C6 10 LDB #TASK_REG_SZ NUMBER OF BYTES
|
0544 FDD5 C6 10 LDB #TASK_REG_SZ NUMBER OF BYTES
|
0545 FDD7 8E F6 31 LDX #COMBUF+1 POINTER TO RETURN BUFFER
|
0545 FDD7 8E F6 31 LDX #COMBUF+1 POINTER TO RETURN BUFFER
|
0546 FDDA E7 80 STB ,X+ SAVE RETURN DATA LENGTH
|
0546 FDDA E7 80 STB ,X+ SAVE RETURN DATA LENGTH
|
0547 *
|
0547 *
|
0548 * Copy the registers
|
0548 * Copy the registers
|
0549 FDDC A6 A0 GRLP LDA ,Y+ GET BYTE TO A
|
0549 FDDC A6 A0 GRLP LDA ,Y+ GET BYTE TO A
|
0550 FDDE A7 80 STA ,X+ STORE TO RETURN BUFFER
|
0550 FDDE A7 80 STA ,X+ STORE TO RETURN BUFFER
|
0551 FDE0 5A DECB
|
0551 FDE0 5A DECB
|
0552 FDE1 26 F9 BNE GRLP
|
0552 FDE1 26 F9 BNE GRLP
|
0553 *
|
0553 *
|
0554 * Compute checksum on buffer, and send to master, then return
|
0554 * Compute checksum on buffer, and send to master, then return
|
0555 FDE3 7E FE 9C JMP SEND
|
0555 FDE3 7E FE 9C JMP SEND
|
0556
|
0556
|
0557 *===========================================================================
|
0557 *===========================================================================
|
0558 *
|
0558 *
|
0559 * Write registers: FN, len, (register image)
|
0559 * Write registers: FN, len, (register image)
|
0560 *
|
0560 *
|
0561 * Entry with A=function code, B=data size, X=COMBUF+2
|
0561 * Entry with A=function code, B=data size, X=COMBUF+2
|
0562 *
|
0562 *
|
0563 WRITE_REGS
|
0563 WRITE_REGS
|
0564 *
|
0564 *
|
0565 FDE6 5D TSTB NUMBER OF BYTES
|
0565 FDE6 5D TSTB NUMBER OF BYTES
|
0566 FDE7 27 0B BEQ WRR80 JIF NO REGISTERS
|
0566 FDE7 27 0B BEQ WRR80 JIF NO REGISTERS
|
0567 *
|
0567 *
|
0568 * Copy the registers
|
0568 * Copy the registers
|
0569 FDE9 10 8E F6 20 LDY #TASK_REGS POINTER TO REGISTERS
|
0569 FDE9 10 8E F6 20 LDY #TASK_REGS POINTER TO REGISTERS
|
0570 FDED A6 80 WRRLP LDA ,X+ GET BYTE TO A
|
0570 FDED A6 80 WRRLP LDA ,X+ GET BYTE TO A
|
0571 FDEF A7 A0 STA ,Y+ STORE TO REGISTER RAM
|
0571 FDEF A7 A0 STA ,Y+ STORE TO REGISTER RAM
|
0572 FDF1 5A DECB
|
0572 FDF1 5A DECB
|
0573 FDF2 26 F9 BNE WRRLP
|
0573 FDF2 26 F9 BNE WRRLP
|
0574 *
|
0574 *
|
0575 * Return OK status
|
0575 * Return OK status
|
0576 FDF4 4F WRR80 CLRA
|
0576 FDF4 4F WRR80 CLRA
|
0577 FDF5 7E FE 92 JMP SEND_STATUS
|
0577 FDF5 7E FE 92 JMP SEND_STATUS
|
0578
|
0578
|
0579 *===========================================================================
|
0579 *===========================================================================
|
0580 *
|
0580 *
|
0581 * Run Target: FN, len
|
0581 * Run Target: FN, len
|
0582 *
|
0582 *
|
0583 * Entry with A=function code, B=data size, X=COMBUF+2
|
0583 * Entry with A=function code, B=data size, X=COMBUF+2
|
0584 *
|
0584 *
|
0585 RUN_TARGET
|
0585 RUN_TARGET
|
0586 *
|
0586 *
|
0587 * Restore user's map
|
0587 * Restore user's map
|
0588 ** LDA REG_PAGE USER'S PAGE
|
0588 ** LDA REG_PAGE USER'S PAGE
|
0589 ** STA MAPIMG SET IMAGE
|
0589 ** STA MAPIMG SET IMAGE
|
0590 ** STA MAPREG SET MAPPING REGISTER
|
0590 ** STA MAPREG SET MAPPING REGISTER
|
0591 *
|
0591 *
|
0592 * Switch to user stack
|
0592 * Switch to user stack
|
0593 FDF8 B6 F6 23 LDA REG_SP+1 BACK TO USER STACK
|
0593 FDF8 B6 F6 23 LDA REG_SP+1 BACK TO USER STACK
|
0594 FDFB F6 F6 22 LDB REG_SP
|
0594 FDFB F6 F6 22 LDB REG_SP
|
0595 FDFE 1F 04 TFR D,S TO S
|
0595 FDFE 1F 04 TFR D,S TO S
|
0596 *
|
0596 *
|
0597 * Restore registers
|
0597 * Restore registers
|
0598 FE00 B6 F6 2F LDA REG_PC+1 MS USER PC FOR RTI
|
0598 FE00 B6 F6 2F LDA REG_PC+1 MS USER PC FOR RTI
|
0599 FE03 F6 F6 2E LDB REG_PC LS USER PC FOR RTI
|
0599 FE03 F6 F6 2E LDB REG_PC LS USER PC FOR RTI
|
0600 FE06 34 06 PSHS D
|
0600 FE06 34 06 PSHS D
|
0601 *
|
0601 *
|
0602 FE08 B6 F6 25 LDA REG_U+1
|
0602 FE08 B6 F6 25 LDA REG_U+1
|
0603 FE0B F6 F6 24 LDB REG_U
|
0603 FE0B F6 F6 24 LDB REG_U
|
0604 FE0E 34 06 PSHS D
|
0604 FE0E 34 06 PSHS D
|
0605 *
|
0605 *
|
0606 FE10 B6 F6 27 LDA REG_Y+1
|
0606 FE10 B6 F6 27 LDA REG_Y+1
|
0607 FE13 F6 F6 26 LDB REG_Y
|
0607 FE13 F6 F6 26 LDB REG_Y
|
0608 FE16 34 06 PSHS D
|
0608 FE16 34 06 PSHS D
|
0609 *
|
0609 *
|
0610 FE18 B6 F6 29 LDA REG_X+1
|
0610 FE18 B6 F6 29 LDA REG_X+1
|
0611 FE1B F6 F6 28 LDB REG_X
|
0611 FE1B F6 F6 28 LDB REG_X
|
0612 FE1E 34 06 PSHS D
|
0612 FE1E 34 06 PSHS D
|
0613 *
|
0613 *
|
0614 FE20 B6 F6 2C LDA REG_DP
|
0614 FE20 B6 F6 2C LDA REG_DP
|
0615 FE23 34 02 PSHS A
|
0615 FE23 34 02 PSHS A
|
0616 *
|
0616 *
|
0617 FE25 B6 F6 2A LDA REG_B
|
0617 FE25 B6 F6 2A LDA REG_B
|
0618 FE28 34 02 PSHS A
|
0618 FE28 34 02 PSHS A
|
0619 *
|
0619 *
|
0620 FE2A B6 F6 2B LDA REG_A
|
0620 FE2A B6 F6 2B LDA REG_A
|
0621 FE2D 34 02 PSHS A
|
0621 FE2D 34 02 PSHS A
|
0622 *
|
0622 *
|
0623 FE2F B6 F6 2D LDA REG_CC SAVE USER CONDITION CODES FOR RTI
|
0623 FE2F B6 F6 2D LDA REG_CC SAVE USER CONDITION CODES FOR RTI
|
0624 FE32 8A 50 ORA #E _MUST_ BE "ALL REGS PUSHED"
|
0624 FE32 8A 50 ORA #E _MUST_ BE "ALL REGS PUSHED"
|
0625 FE34 34 02 PSHS A
|
0625 FE34 34 02 PSHS A
|
0626 *
|
0626 *
|
0627 * Return to user
|
0627 * Return to user
|
0628 FE36 3B RTI
|
0628 FE36 3B RTI
|
0629 *
|
0629 *
|
0630 *===========================================================================
|
0630 *===========================================================================
|
0631 *
|
0631 *
|
0632 * Common continue point for all monitor entrances
|
0632 * Common continue point for all monitor entrances
|
0633 * SP = user stack
|
0633 * SP = user stack
|
0634 ENTER_MON
|
0634 ENTER_MON
|
0635 FE37 1F 40 TFR S,D USER STACK POINTER
|
0635 FE37 1F 40 TFR S,D USER STACK POINTER
|
0636 FE39 B7 F6 23 STA REG_SP+1 SAVE USER'S STACK POINTER (MSB)
|
0636 FE39 B7 F6 23 STA REG_SP+1 SAVE USER'S STACK POINTER (MSB)
|
0637 FE3C F7 F6 22 STB REG_SP LSB
|
0637 FE3C F7 F6 22 STB REG_SP LSB
|
0638 *
|
0638 *
|
0639 * Change to our own stack
|
0639 * Change to our own stack
|
0640 FE3F 10 CE F6 20 LDS #MONSTACK AND USE OURS INSTEAD
|
0640 FE3F 10 CE F6 20 LDS #MONSTACK AND USE OURS INSTEAD
|
0641 *
|
0641 *
|
0642 * Operating system variables
|
0642 * Operating system variables
|
0643 ** LDA MAPIMG GET CURRENT USER MAP
|
0643 ** LDA MAPIMG GET CURRENT USER MAP
|
0644 FE43 86 00 LDA #0 ... OR ZERO IF UNMAPPED TARGET
|
0644 FE43 86 00 LDA #0 ... OR ZERO IF UNMAPPED TARGET
|
0645 FE45 B7 F6 21 STA REG_PAGE SAVE USER'S PAGE
|
0645 FE45 B7 F6 21 STA REG_PAGE SAVE USER'S PAGE
|
0646 *
|
0646 *
|
0647 * Return registers to master
|
0647 * Return registers to master
|
0648 FE48 7E FD D1 JMP RETURN_REGS
|
0648 FE48 7E FD D1 JMP RETURN_REGS
|
0649
|
0649
|
0650 *===========================================================================
|
0650 *===========================================================================
|
0651 *
|
0651 *
|
0652 * Set target byte(s): FN, len { (page, alow, ahigh, data), (...)... }
|
0652 * Set target byte(s): FN, len { (page, alow, ahigh, data), (...)... }
|
0653 *
|
0653 *
|
0654 * Entry with A=function code, B=data size, X=COMBUF+2
|
0654 * Entry with A=function code, B=data size, X=COMBUF+2
|
0655 *
|
0655 *
|
0656 * Return has FN, len, (data from memory locations)
|
0656 * Return has FN, len, (data from memory locations)
|
0657 *
|
0657 *
|
0658 * If error in insert (memory not writable), abort to return short data
|
0658 * If error in insert (memory not writable), abort to return short data
|
0659 *
|
0659 *
|
0660 * This function is used primarily to set and clear breakpoints
|
0660 * This function is used primarily to set and clear breakpoints
|
0661 *
|
0661 *
|
0662 * Uses 1 byte of stack
|
0662 * Uses 1 byte of stack
|
0663 *
|
0663 *
|
0664 SET_BYTES
|
0664 SET_BYTES
|
0665 FE4B CE F6 31 LDU #COMBUF+1 POINTER TO RETURN BUFFER
|
0665 FE4B CE F6 31 LDU #COMBUF+1 POINTER TO RETURN BUFFER
|
0666 FE4E 86 00 LDA #0
|
0666 FE4E 86 00 LDA #0
|
0667 FE50 A7 C0 STA ,U+ SET RETURN COUNT AS ZERO
|
0667 FE50 A7 C0 STA ,U+ SET RETURN COUNT AS ZERO
|
0668 FE52 54 LSRB
|
0668 FE52 54 LSRB
|
0669 FE53 54 LSRB LEN/4 = NUMBER OF BYTES TO SET
|
0669 FE53 54 LSRB LEN/4 = NUMBER OF BYTES TO SET
|
0670 FE54 27 20 BEQ SB99 JIF NO BYTES (COMBUF+1 = 0)
|
0670 FE54 27 20 BEQ SB99 JIF NO BYTES (COMBUF+1 = 0)
|
0671 *
|
0671 *
|
0672 * Loop on inserting bytes
|
0672 * Loop on inserting bytes
|
0673 FE56 34 04 SB10 PSHS B SAVE LOOP COUNTER
|
0673 FE56 34 04 SB10 PSHS B SAVE LOOP COUNTER
|
0674 *
|
0674 *
|
0675 * Set map
|
0675 * Set map
|
0676 *;;; LDA 0,X
|
0676 *;;; LDA 0,X
|
0677 *;;; STA MAPIMG
|
0677 *;;; STA MAPIMG
|
0678 *;;; STA MAPREG
|
0678 *;;; STA MAPREG
|
0679 *
|
0679 *
|
0680 * Get address
|
0680 * Get address
|
0681 FE58 A6 02 LDA 2,X MSB OF ADDRESS IN A
|
0681 FE58 A6 02 LDA 2,X MSB OF ADDRESS IN A
|
0682 FE5A E6 01 LDB 1,X LSB OF ADDRESS IN B
|
0682 FE5A E6 01 LDB 1,X LSB OF ADDRESS IN B
|
0683 FE5C 1F 02 TFR D,Y MEMORY ADDRESS IN Y
|
0683 FE5C 1F 02 TFR D,Y MEMORY ADDRESS IN Y
|
0684 *
|
0684 *
|
0685 * Read current data at byte location
|
0685 * Read current data at byte location
|
0686 FE5E A6 A4 LDA 0,Y
|
0686 FE5E A6 A4 LDA 0,Y
|
0687 *
|
0687 *
|
0688 * Insert new data at byte location
|
0688 * Insert new data at byte location
|
0689 FE60 E6 03 LDB 3,X GET BYTE TO STORE
|
0689 FE60 E6 03 LDB 3,X GET BYTE TO STORE
|
0690 FE62 E7 A4 STB 0,Y WRITE TARGET MEMORY
|
0690 FE62 E7 A4 STB 0,Y WRITE TARGET MEMORY
|
0691 *
|
0691 *
|
0692 * Verify write
|
0692 * Verify write
|
0693 FE64 E1 A4 CMPB 0,Y READ TARGET MEMORY
|
0693 FE64 E1 A4 CMPB 0,Y READ TARGET MEMORY
|
0694 FE66 35 04 PULS B RESTORE LOOP COUNT, CC'S INTACT
|
0694 FE66 35 04 PULS B RESTORE LOOP COUNT, CC'S INTACT
|
0695 FE68 26 0C BNE SB90 BR IF INSERT FAILED: ABORT
|
0695 FE68 26 0C BNE SB90 BR IF INSERT FAILED: ABORT
|
0696 *
|
0696 *
|
0697 * Save target byte in return buffer
|
0697 * Save target byte in return buffer
|
0698 FE6A A7 C0 STA ,U+
|
0698 FE6A A7 C0 STA ,U+
|
0699 FE6C 7C F6 31 INC COMBUF+1 COUNT ONE RETURN BYTE
|
0699 FE6C 7C F6 31 INC COMBUF+1 COUNT ONE RETURN BYTE
|
0700 *
|
0700 *
|
0701 * Loop for next byte
|
0701 * Loop for next byte
|
0702 FE6F 30 04 LEAX 4,X STEP TO NEXT BYTE SPECIFIER
|
0702 FE6F 30 04 LEAX 4,X STEP TO NEXT BYTE SPECIFIER
|
0703 FE71 F1 F6 31 CMPB COMBUF+1
|
0703 FE71 F1 F6 31 CMPB COMBUF+1
|
0704 FE74 26 E0 BNE SB10 *LOOP FOR ALL BYTES
|
0704 FE74 26 E0 BNE SB10 *LOOP FOR ALL BYTES
|
0705 *
|
0705 *
|
0706 * Return buffer with data from byte locations
|
0706 * Return buffer with data from byte locations
|
0707 SB90
|
0707 SB90
|
0708 *
|
0708 *
|
0709 * Compute checksum on buffer, and send to master, then return
|
0709 * Compute checksum on buffer, and send to master, then return
|
0710 FE76 7E FE 9C SB99 JMP SEND
|
0710 FE76 7E FE 9C SB99 JMP SEND
|
0711
|
0711
|
0712 *===========================================================================
|
0712 *===========================================================================
|
0713 *
|
0713 *
|
0714 * Input from port: FN, len, PortAddressLo, PAhi (=0)
|
0714 * Input from port: FN, len, PortAddressLo, PAhi (=0)
|
0715 *
|
0715 *
|
0716 * While the 6809 has no input or output instructions, we retain these
|
0716 * While the 6809 has no input or output instructions, we retain these
|
0717 * to allow write-without-verify
|
0717 * to allow write-without-verify
|
0718 *
|
0718 *
|
0719 * Entry with A=function code, B=data size, X=COMBUF+2
|
0719 * Entry with A=function code, B=data size, X=COMBUF+2
|
0720 *
|
0720 *
|
0721 IN_PORT
|
0721 IN_PORT
|
0722 *
|
0722 *
|
0723 * Get port address
|
0723 * Get port address
|
0724 FE79 A6 01 LDA 1,X MSB OF ADDRESS IN A
|
0724 FE79 A6 01 LDA 1,X MSB OF ADDRESS IN A
|
0725 FE7B E6 84 LDB 0,X LSB OF ADDRESS IN B
|
0725 FE7B E6 84 LDB 0,X LSB OF ADDRESS IN B
|
0726 FE7D 1F 02 TFR D,Y MEMORY ADDRESS IN Y
|
0726 FE7D 1F 02 TFR D,Y MEMORY ADDRESS IN Y
|
0727 *
|
0727 *
|
0728 * Read the requested byte from local memory
|
0728 * Read the requested byte from local memory
|
0729 FE7F A6 A4 LDA 0,Y
|
0729 FE7F A6 A4 LDA 0,Y
|
0730 *
|
0730 *
|
0731 * Return byte read as "status"
|
0731 * Return byte read as "status"
|
0732 FE81 7E FE 92 JMP SEND_STATUS
|
0732 FE81 7E FE 92 JMP SEND_STATUS
|
0733
|
0733
|
0734 *===========================================================================
|
0734 *===========================================================================
|
0735 *
|
0735 *
|
0736 * Output to port FN, len, PortAddressLo, PAhi (=0), data
|
0736 * Output to port FN, len, PortAddressLo, PAhi (=0), data
|
0737 *
|
0737 *
|
0738 * Entry with A=function code, B=data size, X=COMBUF+2
|
0738 * Entry with A=function code, B=data size, X=COMBUF+2
|
0739 *
|
0739 *
|
0740 OUT_PORT
|
0740 OUT_PORT
|
0741 *
|
0741 *
|
0742 * Get port address
|
0742 * Get port address
|
0743 FE84 A6 01 LDA 1,X MSB OF ADDRESS IN A
|
0743 FE84 A6 01 LDA 1,X MSB OF ADDRESS IN A
|
0744 FE86 E6 84 LDB 0,X LSB OF ADDRESS IN B
|
0744 FE86 E6 84 LDB 0,X LSB OF ADDRESS IN B
|
0745 FE88 1F 02 TFR D,Y MEMORY ADDRESS IN Y
|
0745 FE88 1F 02 TFR D,Y MEMORY ADDRESS IN Y
|
0746 *
|
0746 *
|
0747 * Get data
|
0747 * Get data
|
0748 FE8A A6 02 LDA 2,X
|
0748 FE8A A6 02 LDA 2,X
|
0749 *
|
0749 *
|
0750 * Write value to port
|
0750 * Write value to port
|
0751 FE8C A7 A4 STA 0,Y
|
0751 FE8C A7 A4 STA 0,Y
|
0752 *
|
0752 *
|
0753 * Do not read port to verify (some I/O devices don't like it)
|
0753 * Do not read port to verify (some I/O devices don't like it)
|
0754 *
|
0754 *
|
0755 * Return status of OK
|
0755 * Return status of OK
|
0756 FE8E 4F CLRA
|
0756 FE8E 4F CLRA
|
0757 FE8F 7E FE 92 JMP SEND_STATUS
|
0757 FE8F 7E FE 92 JMP SEND_STATUS
|
0758
|
0758
|
0759 *===========================================================================
|
0759 *===========================================================================
|
0760 * Build status return with value from "A"
|
0760 * Build status return with value from "A"
|
0761 *
|
0761 *
|
0762 SEND_STATUS
|
0762 SEND_STATUS
|
0763 FE92 B7 F6 32 STA COMBUF+2 SET STATUS
|
0763 FE92 B7 F6 32 STA COMBUF+2 SET STATUS
|
0764 FE95 86 01 LDA #1
|
0764 FE95 86 01 LDA #1
|
0765 FE97 B7 F6 31 STA COMBUF+1 SET LENGTH
|
0765 FE97 B7 F6 31 STA COMBUF+1 SET LENGTH
|
0766 FE9A 20 00 BRA SEND
|
0766 FE9A 20 00 BRA SEND
|
0767
|
0767
|
0768 *===========================================================================
|
0768 *===========================================================================
|
0769 * Append checksum to COMBUF and send to master
|
0769 * Append checksum to COMBUF and send to master
|
0770 *
|
0770 *
|
0771 FE9C BD FE B4 SEND JSR CHECKSUM GET A=CHECKSUM, X->checksum location
|
0771 FE9C BD FE B4 SEND JSR CHECKSUM GET A=CHECKSUM, X->checksum location
|
0772 FE9F 40 NEGA
|
0772 FE9F 40 NEGA
|
0773 FEA0 A7 84 STA 0,X STORE NEGATIVE OF CHECKSUM
|
0773 FEA0 A7 84 STA 0,X STORE NEGATIVE OF CHECKSUM
|
0774 *
|
0774 *
|
0775 * Send buffer to master
|
0775 * Send buffer to master
|
0776 FEA2 8E F6 30 LDX #COMBUF POINTER TO DATA
|
0776 FEA2 8E F6 30 LDX #COMBUF POINTER TO DATA
|
0777 FEA5 E6 01 LDB 1,X LENGTH OF DATA
|
0777 FEA5 E6 01 LDB 1,X LENGTH OF DATA
|
0778 FEA7 CB 03 ADDB #3 PLUS FUNCTION, LENGTH, CHECKSUM
|
0778 FEA7 CB 03 ADDB #3 PLUS FUNCTION, LENGTH, CHECKSUM
|
0779 FEA9 A6 80 SND10 LDA ,X+
|
0779 FEA9 A6 80 SND10 LDA ,X+
|
0780 FEAB BD FC 7C JSR PUTCHAR SEND A BYTE
|
0780 FEAB BD FC 7C JSR PUTCHAR SEND A BYTE
|
0781 FEAE 5A DECB
|
0781 FEAE 5A DECB
|
0782 FEAF 26 F8 BNE SND10
|
0782 FEAF 26 F8 BNE SND10
|
0783 FEB1 7E FC F1 JMP MAIN BACK TO MAIN LOOP
|
0783 FEB1 7E FC F1 JMP MAIN BACK TO MAIN LOOP
|
0784
|
0784
|
0785 *===========================================================================
|
0785 *===========================================================================
|
0786 * Compute checksum on COMBUF. COMBUF+1 has length of data,
|
0786 * Compute checksum on COMBUF. COMBUF+1 has length of data,
|
0787 * Also include function byte and length byte
|
0787 * Also include function byte and length byte
|
0788 *
|
0788 *
|
0789 * Returns:
|
0789 * Returns:
|
0790 * A = checksum
|
0790 * A = checksum
|
0791 * X = pointer to next byte in buffer (checksum location)
|
0791 * X = pointer to next byte in buffer (checksum location)
|
0792 * B is scratched
|
0792 * B is scratched
|
0793 *
|
0793 *
|
0794 CHECKSUM
|
0794 CHECKSUM
|
0795 FEB4 8E F6 30 LDX #COMBUF pointer to buffer
|
0795 FEB4 8E F6 30 LDX #COMBUF pointer to buffer
|
0796 FEB7 E6 01 LDB 1,X length of message
|
0796 FEB7 E6 01 LDB 1,X length of message
|
0797 FEB9 CB 02 ADDB #2 plus function, length
|
0797 FEB9 CB 02 ADDB #2 plus function, length
|
0798 FEBB 86 00 LDA #0 init checksum to 0
|
0798 FEBB 86 00 LDA #0 init checksum to 0
|
0799 FEBD AB 80 CHK10 ADDA ,X+
|
0799 FEBD AB 80 CHK10 ADDA ,X+
|
0800 FEBF 5A DECB
|
0800 FEBF 5A DECB
|
0801 FEC0 26 FB BNE CHK10 loop for all
|
0801 FEC0 26 FB BNE CHK10 loop for all
|
0802 FEC2 39 RTS return with checksum in A
|
0802 FEC2 39 RTS return with checksum in A
|
0803
|
0803
|
0804 ***********************************************************************
|
0804 ***********************************************************************
|
0805 *
|
0805 *
|
0806 * Interrupt handlers to catch unused interrupts and traps
|
0806 * Interrupt handlers to catch unused interrupts and traps
|
0807 * Registers are stacked. Jump through RAM vector using X, type in A
|
0807 * Registers are stacked. Jump through RAM vector using X, type in A
|
0808 *
|
0808 *
|
0809 * This will affect only interrupt routines looking for register values!
|
0809 * This will affect only interrupt routines looking for register values!
|
0810 *
|
0810 *
|
0811 * Our default handler uses the code in "A" as the processor state to be
|
0811 * Our default handler uses the code in "A" as the processor state to be
|
0812 * passed back to the host.
|
0812 * passed back to the host.
|
0813 *
|
0813 *
|
0814 FEC3 86 07 RES_ENT LDA #7
|
0814 FEC3 86 07 RES_ENT LDA #7
|
0815 FEC5 BE F0 00 LDX RAMVEC+0
|
0815 FEC5 BE F0 00 LDX RAMVEC+0
|
0816 FEC8 6E 84 JMP 0,X
|
0816 FEC8 6E 84 JMP 0,X
|
0817 *
|
0817 *
|
0818 FECA 86 06 SWI3_ENT LDA #6
|
0818 FECA 86 06 SWI3_ENT LDA #6
|
0819 FECC BE F0 02 LDX RAMVEC+2
|
0819 FECC BE F0 02 LDX RAMVEC+2
|
0820 FECF 6E 84 JMP 0,X
|
0820 FECF 6E 84 JMP 0,X
|
0821 *
|
0821 *
|
0822 FED1 86 05 SWI2_ENT LDA #5
|
0822 FED1 86 05 SWI2_ENT LDA #5
|
0823 FED3 BE F0 04 LDX RAMVEC+4
|
0823 FED3 BE F0 04 LDX RAMVEC+4
|
0824 FED6 6E 84 JMP 0,X
|
0824 FED6 6E 84 JMP 0,X
|
0825 *
|
0825 *
|
0826 * May have only PC and CC's pushed (unless we were waiting for an interrupt)
|
0826 * May have only PC and CC's pushed (unless we were waiting for an interrupt)
|
0827 * Push all registers here for common entry (else we can't use our RAM vector)
|
0827 * Push all registers here for common entry (else we can't use our RAM vector)
|
0828 FED8 B7 F6 2B FIRQ_ENT STA REG_A SAVE A REG
|
0828 FED8 B7 F6 2B FIRQ_ENT STA REG_A SAVE A REG
|
0829 FEDB 35 02 PULS A GET CC'S FROM STACK
|
0829 FEDB 35 02 PULS A GET CC'S FROM STACK
|
0830 FEDD 85 50 BITA #E
|
0830 FEDD 85 50 BITA #E
|
0831 FEDF 26 09 BNE FIRQ9 BR IF ALL REGISTERS PUSHED ALREADY
|
0831 FEDF 26 09 BNE FIRQ9 BR IF ALL REGISTERS PUSHED ALREADY
|
0832 FEE1 34 7C PSHS U,Y,X,DP,B ELSE PUSH THEM NOW
|
0832 FEE1 34 7C PSHS U,Y,X,DP,B ELSE PUSH THEM NOW
|
0833 FEE3 F6 F6 2B LDB REG_A
|
0833 FEE3 F6 F6 2B LDB REG_A
|
0834 FEE6 34 04 PSHS B
|
0834 FEE6 34 04 PSHS B
|
0835 FEE8 8A 50 ORA #E SET AS "ALL REGS PUSHED"
|
0835 FEE8 8A 50 ORA #E SET AS "ALL REGS PUSHED"
|
0836 FEEA 34 02 FIRQ9 PSHS A REPLACE CC'S
|
0836 FEEA 34 02 FIRQ9 PSHS A REPLACE CC'S
|
0837 FEEC 86 04 LDA #4
|
0837 FEEC 86 04 LDA #4
|
0838 FEEE BE F0 06 LDX RAMVEC+6
|
0838 FEEE BE F0 06 LDX RAMVEC+6
|
0839 FEF1 6E 84 JMP 0,X
|
0839 FEF1 6E 84 JMP 0,X
|
0840 *
|
0840 *
|
0841 FEF3 86 03 IRQ_ENT LDA #3
|
0841 FEF3 86 03 IRQ_ENT LDA #3
|
0842 FEF5 BE F0 08 LDX RAMVEC+8
|
0842 FEF5 BE F0 08 LDX RAMVEC+8
|
0843 FEF8 6E 84 JMP 0,X
|
0843 FEF8 6E 84 JMP 0,X
|
0844 *
|
0844 *
|
0845 FEFA 86 02 NMI_ENT LDA #2
|
0845 FEFA 86 02 NMI_ENT LDA #2
|
0846 FEFC BE F0 0C LDX RAMVEC+12
|
0846 FEFC BE F0 0C LDX RAMVEC+12
|
0847 FEFF 6E 84 JMP 0,X
|
0847 FEFF 6E 84 JMP 0,X
|
0848 *
|
0848 *
|
0849 FF01 86 01 SWI_ENT LDA #1
|
0849 FF01 86 01 SWI_ENT LDA #1
|
0850 FF03 7E FC AC JMP INT_ENTRY
|
0850 FF03 7E FC AC JMP INT_ENTRY
|
0851 *
|
0851 *
|
0852 *============================================================================
|
0852 *============================================================================
|
0853 * VECTORS THROUGH RAM
|
0853 * VECTORS THROUGH RAM
|
0854 FFF0 ORG HARD_VECT
|
0854 FFF0 ORG HARD_VECT
|
0855
|
0855
|
0856 FFF0 FE C3 FDB RES_ENT fff0 (reserved)
|
0856 FFF0 FE C3 FDB RES_ENT fff0 (reserved)
|
0857 FFF2 FE CA FDB SWI3_ENT fff2 (SWI3)
|
0857 FFF2 FE CA FDB SWI3_ENT fff2 (SWI3)
|
0858 FFF4 FE D1 FDB SWI2_ENT fff4 (SWI2)
|
0858 FFF4 FE D1 FDB SWI2_ENT fff4 (SWI2)
|
0859 FFF6 FE D8 FDB FIRQ_ENT fff6 (FIRQ)
|
0859 FFF6 FE D8 FDB FIRQ_ENT fff6 (FIRQ)
|
0860 FFF8 FE F3 FDB IRQ_ENT fff8 (IRQ)
|
0860 FFF8 FE F3 FDB IRQ_ENT fff8 (IRQ)
|
0861 FFFA FF 01 FDB SWI_ENT fffa (SWI/breakpoint)
|
0861 FFFA FF 01 FDB SWI_ENT fffa (SWI/breakpoint)
|
0862 FFFC FE FA FDB NMI_ENT fffc (NMI)
|
0862 FFFC FE FA FDB NMI_ENT fffc (NMI)
|
0863 FFFE FC 00 FDB RESET fffe reset
|
0863 FFFE FC 00 FDB RESET fffe reset
|
0864 *
|
0864 *
|
0865 END RESET
|
0865 END RESET
|
Program + Init Data = 790 bytes
|
Program + Init Data = 790 bytes
|
Error count = 0
|
Error count = 0
|
|
|