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

Subversion Repositories System09

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /System09/tags/pre_mkfiles_rev1_merge/src/sys09bug
    from Rev 27 to Rev 66
    Reverse comparison

Rev 27 → Rev 66

/sys09ads.lst
0,0 → 1,2777
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 NAM SYS09BUG FOR ADS6809
0000 INCLUDE "opt_ads.txt"
0001 *
0002 ***************************************************
0003 * OPTION SWITCHES
0004 ***************************************************
0005 *
0006 *
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0009 ** FOR LOADING AND SAVING S1 RECORDS
0010 *
0011 *S3EOPT EQU $FF SPARTAN3E STARTER
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
0015 00FF ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0017 *
0002 END
0000 INCLUDE "sys09equ.txt"
0001 *
0002 ***************************************************
0003 * MEMORY MAP EQUATES *
0004 ***************************************************
0005 E000 MONIO EQU $E000 I/O SPACE
0006 IFD S3EOPT
0007 MONRAM EQU $7FC0
0008 ELSE
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE
0010 ENDIF S3EOPT
0011 F800 MONROM EQU $F800 START OF ROM
0012 IFD S3SOPT
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0014 EXTCMD EQU $00 EXTENDED OFFSET
0015 ENDIF S3SOPT
0015 ENDIF S3SOPT
0016 IFD XESOPT
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0018 EXTCMD EQU $00 EXTENDED OFFSET
0019 ENDIF XESOPT
0019 ENDIF XESOPT
0020 ***************************************************
0021
0022 IFD S3EOPT
0023 *
0024 * DIGILENT SPARTAN 3E STARTER
0025 *
0026 ACIAOPT EQU $FF ACIA AT PORT 0
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0028 VDUOPT EQU $FF VDU AT $E030
0029 TRAOPT EQU $FF PIA TRACE TIMER
0030 ENDIF S3EOPT
0030 ENDIF S3EOPT
0031 *
0032 IFD S3SOPT
0033 *
0034 * DIGILENT SPARTAN 3 STARTER
0035 *
0036 ACIAOPT EQU $FF ACIA AT PORT 0
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0038 VDUOPT EQU $FF VDU AT $E030
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0041 EXTOPT EQU $FF EXTENDED COMMANDS
0042 ENDIF S3SOPT
0042 ENDIF S3SOPT
0043 *
0044 IFD B5XOPT
0045 *
0046 * BURCHED B5-X300
0047 *
0048 ACIAOPT EQU $FF ACIA AT PORT 0
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0050 VDUOPT EQU $FF VDU AT $E030
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0053 ENDIF B5XOPT
0053 ENDIF B5XOPT
0054 *
0055 IFD XESOPT
0056 *
0057 * XESS XSA-3S1000 & XST-3.0
0058 *
0059 ACIAOPT EQU $FF ACIA AT PORT 0
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0061 VDUOPT EQU $FF VDU AT $E030
0062 IDEOPT EQU $FF XESS IDE AT $E100
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0064 EXTOPT EQU $FF EXTENDED COMMANDS
0065 ENDIF XESOPT
0065 ENDIF XESOPT
0066 *
0067 IFD ADSOPT
0068 *
0069 * ACKERMAN DIGITAL ADS6809
0070 *
0071 00FF DG640OPT EQU $FF DG640 VDU AT $E800
0072 *RTCOPT EQU $FF REAL TIME CLOCK
0073 00FF PRTOPT EQU $FF PRINTER DRIVERS
0074 00FF MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0075 ENDIF ADSOPT
0076 *
0077 IFD SWTOPT
0078 *
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER
0080 *
0081 ACIAOPT EQU $FF ACIA AT PORT 0
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0085 ENDIF
0085 ENDIF
0086 *
0087 IFD ACIAOPT
0088 *
0089 ***************************************************
0090 * SERIAL PORT *
0091 ***************************************************
0092 *
0093 ** ACIA SITS ON PORT 0
0094 *
0095 ACIAS EQU MONIO+$00 CONTROL PORT
0096 *
0097 ENDIF ACIAOPT
0097 ENDIF ACIAOPT
0098 IFD MFDCOPT
0099 *
0100 ***************************************************
0101 * MINIFLOPPY DRIVE *
0102 ***************************************************
0103 *
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0105 *
0106 E014 DRVFDC EQU MONIO+$14
0107 E018 CMDFDC EQU MONIO+$18
0108 E01A SECFDC EQU MONIO+$1A
0109 E01B DATFDC EQU MONIO+$1B
0110 ENDIF MFDCOPT
0111 IFD PS2OPT
0112 *
0113 ***************************************************
0114 * VDU8 PS/2 KEYBOARD PORT *
0115 ***************************************************
0116 *
0117 ** KEYBOARD SITS ON PORT 2
0118 *
0119 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0120 ENDIF PS2OPT
0120 ENDIF PS2OPT
0121 IFD VDUOPT
0122 *
0123 ***************************************************
0124 * VDU8 DISPLAY DRIVER EQUATES *
0125 ***************************************************
0126 *
0127 ** VDU8 DISPLAY SITS ON PORT 3
0128 *
0129 VDU EQU MONIO+$30
0130 VDUCHR EQU 0 CHARACTER REGISTER
0131 VDUATT EQU 1 ATTRIBUTE REGISTER
0132 VDUCOL EQU 2 CURSOR COLUMN
0133 VDUROW EQU 3 CURSOR ROW
0134 VDUOFF EQU 4 ROW OFFSET
0135 *
0136 LINLEN EQU 80 LENGTH OF A LINE
0137 NUMLIN EQU 25 NUMBER OF LINES
0138 ENDIF VDUOPT
0138 ENDIF VDUOPT
0139 *
0140 IFD CF8OPT
0141 *
0142 ***************************************************
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER *
0144 ***************************************************
0145 *
0146 ** COMPACT FLASH SITS AT PORT 4
0147 *
0148 CF_BASE EQU MONIO+$40
0149 CF_DATA EQU CF_BASE+0
0150 CF_ERROR EQU CF_BASE+1 ; read error
0151 CF_FEATURE EQU CF_BASE+1 ; write feature
0152 CF_SECCNT EQU CF_BASE+2
0153 CF_SECNUM EQU CF_BASE+3
0154 CF_CYLLO EQU CF_BASE+4
0155 CF_CYLHI EQU CF_BASE+5
0156 CF_HEAD EQU CF_BASE+6
0157 CF_STATUS EQU CF_BASE+7 ; read status
0158 CF_COMAND EQU CF_BASE+7 ; write command
0159 *
0160 * Command Equates
0161 *
0162 CMDREAD EQU $20 ; Read Single sector
0163 CMDWRITE EQU $30 ; Write Single sector
0164 CMDFEATURE EQU $EF
0165 FEAT8BIT EQU $01 ; enable 8 bit transfers
0166 HEADLBA EQU $E0
0167 *
0168 * Status bit equates
0169 *
0170 BUSY EQU $80
0171 DRDY EQU $40
0172 DRQ EQU $08
0173 ERR EQU $01
0174 *
0175 ENDIF CF8OPT
0175 ENDIF CF8OPT
0176 *
0177 IFD IDEOPT
0178 *
0179 ***************************************************
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *
0181 ***************************************************
0182 *
0183 ** COMPACT FLASH SITS AT PORT 4
0184 *
0185 CF_BASE EQU MONIO+$0100
0186 CF_DATA EQU CF_BASE+0
0187 CF_ERROR EQU CF_BASE+2 ; read error
0188 CF_FEATURE EQU CF_BASE+2 ; write feature
0189 CF_SECCNT EQU CF_BASE+4
0190 CF_SECNUM EQU CF_BASE+6
0191 CF_CYLLO EQU CF_BASE+8
0192 CF_CYLHI EQU CF_BASE+10
0193 CF_HEAD EQU CF_BASE+12
0194 CF_STATUS EQU CF_BASE+14 ; read status
0195 CF_COMAND EQU CF_BASE+14 ; write command
0196 CF_AUX EQU CF_BASE+30
0197 *
0198 * Command Equates
0199 *
0200 CMDREAD EQU $20 ; Read Single sector
0201 CMDWRITE EQU $30 ; Write Single sector
0202 AUXRESET EQU $06 ; Reset IDE
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked
0204 HEADLBA EQU $E0
0205 *
0206 * Status bit equates
0207 *
0208 BUSY EQU $80
0209 DRDY EQU $40
0210 DRQ EQU $08
0211 ERR EQU $01
0212 *
0213 ENDIF CF8OPT
0213 ENDIF CF8OPT
0214 *
0215 IFD RTCOPT
0216 *
0217 **************************************************
0218 * MM58167A REAL TIME CLOCK MEMORY MAP:
0219 **************************************************
0220 *
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0222 *
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0224 *
0225 * COUNTER AND COMPARITOR REGISTERS:
0226 *
0227 * Both the Clock Counter and Clock Comparitor
0228 * consist of 8 registers for holding the time.
0229 * The register offsets from the Counter and
0230 * Comparitor registers are listed above.
0231 *
0232 COUNTR EQU CLOCK+0
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0234 *
0235 * CLOCK REGISTER OFFSETS:
0236 * These register offsets are used for the CLOCK
0237 * and comparitor ram CMPRAM.
0238 *
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0241 SECOND EQU 2
0242 MINUIT EQU 3
0243 HOUR EQU 4
0244 WKDAY EQU 5
0245 MTHDAY EQU 6
0246 MONTH EQU 7
0247 *
0248 * INTERRUPT OUTPUT REGISTERS:
0249 *
0250 * An interrupt output may be generated at the
0251 * following rates by setting the appropriate bit
0252 * in the Interrupt Control Register (CINTCR).
0253 * The Interrupt Status Register (CINTSR) must be
0254 * read to clear the interrupt and will return
0255 * the source of the interrupt.
0256 *
0257 * 1/Month Bit 7
0258 * 1/Week Bit 6
0259 * 1/Day Bit 5
0260 * 1/Hour Bit 4
0261 * 1/Minuite Bit 3
0262 * 1/Second Bit 2
0263 * 10/Second Bit 1
0264 * Comparitor Bit 0
0265 *
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0268 *
0269 * COUNTER AND RAM RESETS; GO COMMAND.
0270 *
0271 * The counter and comparitor may be reset
0272 * by writing $FF into CTRRES and CMPRES
0273 * respectivly.
0274 * A write to the Go command register (GOCMND)
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths
0276 * of a second counter.
0277 *
0278 CTRRES EQU CLOCK+18 COUNTER RESET
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0280 GOCMND EQU CLOCK+21 GO COMMAND
0281 *
0282 * CLOCK STATUS REGISTER.
0283 *
0284 * The counter takes 61 usec. to rollover for
0285 * every 1KHz clock pulse. If the Status bit is
0286 * set after reading the counter, the counter
0287 * should be re-read to ensure the time is correct.
0288 *
0289 CLKSTA EQU CLOCK+20 STATUS BIT
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0292 ENDIF RTCOPT
0292 ENDIF RTCOPT
0293 *
0294 IFD TRAOPT
0295 *
0296 **************************************************
0297 * PIA INTERRUPT TIMER
0298 **************************************************
0299 *
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7
0301 *
0302 ** PIA TIMER FOR SINGLE STEP / TRACE
0303 *
0304 * TADATA = Output = Timer preset register
0305 * TACTRL - CA1 = input = rising edge = NMI
0306 * - CA2 = Output = Timer Reset (Active High)
0307 * TBDATA = Input = Timer read back register
0308 * TBCTRL - CB1 = input = rising edge = FIRQ
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0310 *
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0312 * CRA1 = 1 CA1 Rising edge IRQ
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0315 * CRA4 = 1 ] CA2 = Set/Reset output
0316 * CRA5 = 1 ]
0317 * CRA6 = X CA2 Input Interrupt Flag
0318 * CRA7 = X CA1 Interrupt Flag
0319 *
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0321 * CRB1 = 1 CB1 Rising edge IRQ
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0324 * CRB4 = 1 ] CB2 = Set/Reset output
0325 * CRB5 = 1 ]
0326 * CRB6 = X CB2 Input Interrupt Flag
0327 * CRB7 = X CB1 Interrupt Flag
0328 *
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0331 *
0332 TADATA EQU MONIO+$70 Timer preset port
0333 TACTRL EQU MONIO+$71
0334 TBDATA EQU MONIO+$72 Timer read back port
0335 TBCTRL EQU MONIO+$73
0336 *
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0338 *
0339 ENDIF TRAOPT
0339 ENDIF TRAOPT
0340 IFD ADSOPT
0341 *
0342 ***************************************************
0343 * SERIAL PORT FOR DG640 *
0344 ***************************************************
0345 *
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0348 *
0349 E400 ACIAS EQU MONIO+$400 CONTROL PORT
0350 *
0351 ENDIF ADSOPT
0352 IFD PRTOPT
0353 *
0354 ***************************************************
0355 * PRINTER INTERFACE *
0356 ***************************************************
0357 *
0358 E404 PADATA EQU MONIO+$404
0359 E405 PACTRL EQU MONIO+$405
0360 E406 PBDATA EQU MONIO+$406
0361 E407 PBCTRL EQU MONIO+$407
0362 *
0363 ** CB1 ACK. I/P
0364 ** CB2 STB. O/P
0365 ** PB0 - PB7 DATA 1 - 8 O/P
0366 ** PORT A BIT ASSIGNMENT
0367 *
0368 0080 PBUSY EQU $80 I/P
0369 0040 PEMPTY EQU $40 I/P
0370 0020 SELECT EQU $20 I/P
0371 0010 PERROR EQU $10 I/P
0372 0004 PRESET EQU %00000100 O/P PA3 = 0
0373 0008 AUTOFD EQU %00001000 O/P PA2 = 0
0374 000C DIRMSK EQU %00001100
0375 ENDIF PRTOPT
0376 IFD DG640OPT
0377 *
0378 ***************************************************
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0380 ***************************************************
0381 *
0382 ** VIDEO DISPLAY DEFINITIONS
0383 *
0384 E800 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0385 0040 LINLEN EQU 64 LENGTH OF A LINE
0386 0010 NUMLIN EQU 16 NUMBER OF LINES
0387 0400 SCNLEN EQU $400 LENGTH OF SCREEN
0388 ENDIF DG640OPT
0389 *
0390 IFD DMAFOPT
0391 *
0392 ***************************************************
0393 * DMAF2 8" DRIVE *
0394 ***************************************************
0395 *
0396 ADDREG EQU $F000 ADDRESS REGISTER
0397 CNTREG EQU $F002 COUNT REGISTER
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER
0400 AAAREG EQU $F015 ???
0401 BBBREG EQU $F016 ???
0402 COMREG EQU $F020 1791 COMMAND REGISTER
0403 SECREG EQU $F022 SECTOR REGISTER
0404 DRVREG EQU $F024 DRIVE SELECT LATCH
0405 CCCREG EQU $F040 ???
0406 ENDIF DMAFOPT
0406 ENDIF DMAFOPT
0407 IFD DATOPT
0408 **************************************************
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0410 **************************************************
0411 *
0412 IC11 EQU $FFF0 DAT RAM CHIP
0413 TSTPAT EQU $55AA TEST PATTERN
0414 ENDIF DATOPT
0414 ENDIF DATOPT
0415 *
0003 END
0000 INCLUDE "sys09bug.txt"
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR
0002 OPT l
 
sys09bug.txt page 2
0004 *
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007 *
0008 * ALLEN CLARK WALLACE WATSON
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
0011 * PH. 813-977-0347 PH. 813-985-1359
0012 *
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
0014 * 2561 NANTUCKET DR APT. E
0015 * ATLANTA, GA 30345
0016 * PH. 404-320-1043
0017 *
0018 * MODIFIED TO SYS09BUG VER 1.0
0019 * FOR: SYSTEM09 FPGA SYSTEM
0020 * BY: JOHN KENT
0021 * DATE: 21ST NOVEMBER 2006
0022 * REMOVED: DISK BOOTS
0023 * MEMORY TEST
0024 * ADDED: ADM3A VDU DRIVER
0025 *
0026 * MODIFIED TO SYS09BUG VER 1.1
0027 * FOR: SYSTEM09 FPGA SYSTEM
0028 * BY: JOHN KENT
0029 * DATE: 7TH JANUARY 2007
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0032 * AND REALTIME CLOCK
0033 *
0034 * MODIFIED TO SYS09BUG VER 1.2
0035 * FOR: SYSTEM09 FPGA SYSTEM
0036 * BY: JOHN KENT
0037 * DATE: 21ST MAY 2007
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * Modified to SYS09BUG VER 1.4
0049 * FOR: SYSTEM09 FPGA SYSTEM
0050 * BY: JOHN KENT
0051 * DATE: 3RD FEB 2008
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
0056 *
0057 * *** COMMANDS ***
0058 *
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0063 * CONTROL P = ALTER THE PROGRAM COUNTER
0064 * CONTROL U = ALTER USER STACK POINTER
0065 * CONTROL X = ALTER "X" INDEX REGISTER
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0068 * D = 5.25" MINIFLOPPY BOOT
0069 * E ssss-eeee = EXAMINE MEMORY
0070 * FROM STARTING ADDRESS ssss
0071 * TO ENDING ADDRESS eeee.
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0073 * L = LOAD TAPE
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0076 * R = DISPLAY REGISTER CONTENTS
0077 * S = DISPLAY STACK FROM ssss TO $DFC0
0078 * U = 8" DMAF2 FLOPPY BOOT
0079 * U = USER EXTENSION COMMANDS AT $F000
0080 * X = REMOVE ALL BREAKPOINTS
0081 *
0082 *
0083 ***************************************************
0084 * SYS09BUG VARIABLE SPACE
0085 ***************************************************
0086 *
0087 DFC0 ORG MONRAM
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK
0089 DFC0 NMI RMB 2 USER NMI VECTOR
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0097 IFD DATOPT
0098 LRARAM RMB 16 LRA ADDRESSES
0099 ENDIF DATOPT
0099 ENDIF DATOPT
0100 DFD0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0101 DFD2 ECHO RMB 1 ECHO FLAG
0102 DFD3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0103 IFD TRAOPT
0104 NMISAV RMB 2 NMI Jump Vector Backup
0105 TRACNT RMB 2 Trace Count
0106 ENDIF TRAOPT
0106 ENDIF TRAOPT
0107 IFD VDUOPT
0108 *
0109 **************************************************
0110 * VDU8 DISPLAY DRIVER VARIABLES *
0111 **************************************************
0112 *
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0114 COLADX RMB 1 CURSOR COLUMN
0115 ROWADX RMB 1 CURSOR ROW
0116 **************************************************
0117 *
0118 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0119 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0120 ENDIF VDUOPT
0120 ENDIF VDUOPT
0121 IFD DG640OPT
0122 *
0123 ***************************************************
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0125 ***************************************************
0126 *
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0128 DFEB COLADX RMB 1 CURSOR COLUMN
0129 DFEC ROWADX RMB 1 CURSOR ROW
0130 *************************************************
0131 DFED CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0132 DFEF NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0133 DFF0 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0134 ENDIF DG640OPT
0135 *
0136 *
0137 ***************************************************
0138 * START OF ROM *
0139 ***************************************************
0140 *
0141 F800 ORG MONROM
0142 F800 F8 22 FDB MONITOR
0143 F802 F8 56 FDB NEXTCMD
0144 F804 FC 66 FDB INCH
0145 F806 FC 60 FDB INCHE
0146 F808 FC 75 FDB INCHEK
0147 F80A FC 83 FDB OUTCH
0148 F80C FB 58 FDB PDATA
0149 F80E FA E7 FDB PCRLF
0150 F810 FA E3 FDB PSTRNG
0151 F812 FF 06 FDB LRA
0152 *
0153 IFD ADSOPT
0154 F814 FE 47 FDB PCHK CHECK FOR PRINTER INPUT
0155 F816 FE 09 FDB PINIZ INITIATE PRINTER
0156 F818 FE 33 FDB POUTCH OUTPUT CH. TO PRINTER
0157 F81A FC AB FDB VINIZ
0158 F81C FC C0 FDB VOUTCH
0159 F81E FC 98 FDB ACINIZ
0160 F820 FC 85 FDB AOUTCH
0161 ENDIF ADSOPT
0162 *
0163 * MONITOR
0164 *
0165 * VECTOR ADDRESS STRING IS.....
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0167 *
0168 F822 8E FE 81 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0169 F825 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0170 F829 C6 10 LDB #$10 BYTES TO MOVE = 16
0171 F82B A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0172 F82D A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0173 F82F 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0174 F830 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0175 *
0176 * CONTENTS FROM TO FUNCTION
0177 * $F8A1 $FE40 $DFC0 USER-V
0178 * $F8A1 $FE42 $DFC2 SWI3-V
0179 * $F8A1 $FE44 $DFC4 SWI2-V
0180 * $F8A1 $FE46 $DFC6 FIRQ-V
0181 * $F8A1 $FE48 $DFC8 IRQ-V
0182 * $FAB0 $FE4A $DFCA SWI-V
0183 * $FFFF $FE4C $DFCC SVC-VO
0184 * $FFFF $FE4E $DFCE SVC-VL
0185 *
0186 F832 8E E4 00 LDX #ACIAS
0187 F835 BF DF D0 STX CPORT STORE ADDR. IN RAM
0188 F838 17 01 42 LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0189 F83B C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0190 F83D 6F E2 CLRSTK CLR ,-S
0191 F83F 5A DECB
0192 F840 26 FB BNE CLRSTK
0193 F842 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0194 F845 AF 6A STX 10,S ON STACK
0195 F847 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0196 F849 A7 E4 STA ,S
0197 F84B 1F 43 TFR S,U
0198 F84D 17 04 46 LBSR IOINIZ INITIALIZE CONTROL PORT
0199 F850 8E FE 91 LDX #MSG1 POINT TO MONITOR MESSAGE
0200 F853 17 03 02 LBSR PDATA PRINT MSG
0201 *
0202 IFD DATOPT
0203 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0204 CLRA START TOTAL AT ZERO
0205 LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0206 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0207 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0208 ADDA #4 ELSE ADD 4K TO TOTAL
0209 DAA ADJ. TOTAL FOR DECIMAL
0210 RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0211 BPL FNDREL PRINT TOTAL OF RAM
0212 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0213 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0214 LBSR PDATA PRINT MSG
0215 ENDIF DATOPT
0215 ENDIF DATOPT
0216 *
0217 IFD TRAOPT
0218 LBSR TRAINZ
0219 ENDIF TRAOPT
0219 ENDIF TRAOPT
0220 *
0221 ***** NEXTCMD *****
0222 *
0223 F856 8E FE BA NEXTCMD LDX #MSG3 POINT TO MSG ">"
0224 F859 17 02 87 LBSR PSTRNG PRINT MSG
0225 F85C 17 04 07 LBSR INCH GET ONE CHAR. FROM TERMINAL
0226 F85F 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0227 F861 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0228 F863 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0229 F865 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0230 F867 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0231 F869 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0232 F86B 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0233 F86D 17 04 13 LBSR OUTCH PRINT "^"
0234 F870 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0235 F872 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0236 F874 17 04 0C PRTCMD LBSR OUTCH PRNT CMD CHAR
0237 F877 17 04 07 LBSR OUT1S PRNT SPACE
0238 F87A C1 60 CMPB #$60
0239 F87C 2F 02 BLE NXTCH0
0240 F87E C0 20 SUBB #$20
0241 *
0242 ***** DO TABLE LOOKUP *****
0243 * FOR COMMAND FUNCTIONS
0244 *
0245 F880 8E FE 4B NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0246 F883 E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0247 F885 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0248 F887 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0249 F889 8C FE 81 CMPX #TABEND REACHED END OF TABLE YET ?
0250 F88C 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0251 F88E 8E FE BC LDX #MSG4 POINT TO MSG "WHAT?"
0252 F891 17 02 C4 LBSR PDATA PRINT MSG
0253 F894 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0254 F896 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0255 F898 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0256 *
0257 * "G" GO OR CONTINUE
0258 *
0259 F89A 1F 34 GO TFR U,S
0260 F89C 3B RTI RTI
0261 *
0262 ***** "M" MEMORY EXAMINE AND CHANGE *****
0263 *
0264 F89D 17 03 3F MEMCHG LBSR IN1ADR INPUT ADDRESS
0265 F8A0 29 2D BVS CHRTN IF NOT HEX, RETURN
0266 F8A2 1F 12 TFR X,Y SAVE ADDR IN "Y"
0267 F8A4 8E FE C2 MEMC2 LDX #MSG5 POINT TO MSG " - "
0268 F8A7 17 02 39 LBSR PSTRNG PRINT MSG
0269 F8AA 1F 21 TFR Y,X FETCH ADDRESS
0270 F8AC 17 03 79 LBSR OUT4H PRINT ADDR IN HEX
0271 F8AF 17 03 CF LBSR OUT1S OUTPUT SPACE
0272 F8B2 A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0273 F8B4 17 03 79 LBSR OUT2H OUTPUT CONTENTS IN ASCII
0274 F8B7 17 03 C7 LBSR OUT1S OUTPUT SPACE
0275 F8BA 17 03 32 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0276 F8BD 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0277 F8BF 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0278 F8C1 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0279 F8C3 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0280 F8C5 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0281 F8C7 81 5E CMPA #'^ IS IT AN UP ARROW?
0282 F8C9 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0283 F8CB 81 0D CMPA #$D IS IT A CR?
0284 F8CD 26 0F BNE FORWRD DISPLAY NEXT BYTE
0285 F8CF 39 CHRTN RTS EXIT ROUTINE
0286 *
0287 *
0288 F8D0 A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0289 F8D2 A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0290 F8D4 27 08 BEQ FORWRD $F972
0291 F8D6 17 03 A8 LBSR OUT1S OUTPUT SPACE
0292 F8D9 86 3F LDA #'? LOAD QUESTION MARK
0293 F8DB 17 03 A5 LBSR OUTCH PRINT IT
0294 F8DE 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0295 F8E0 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0296 F8E2 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0297 F8E4 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0298 *
0299 * "S" DISPLAY STACK
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0302 *
0303 F8E6 17 02 76 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0304 F8E9 1F 32 TFR U,Y
0305 F8EB 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0306 F8EE 30 1F LEAX -1,X POINT TO CURRENT STACK
0307 F8F0 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0308 *
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0311 * UPPER ADDRESS IN X-REG.
0312 * IF HEX ADDRESSES ARE INVALID (V)=1.
0313 *
0314 F8F2 17 02 DF MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0315 F8F5 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0316 F8F7 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0317 F8F9 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0318 F8FB 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0319 F8FD 39 EDPRTN RTS ;
0320 *
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0322 * TO EVEN 16 BYTE BOUNDRIES.
0323 *
0324 * IF LOWER ADDR = $4532
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0326 *
0327 * IF UPPER ADDR = $4567
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0329 *
0330 * ENTER WITH LOWER ADDRESS IN X-REG.
0331 * -UPPER ADDRESS ON TOP OF STACK.
0332 *
0333 F8FE 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0334 F900 C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0335 F903 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0336 F905 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0337 F907 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0338 F909 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0339 F90B 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0340 F90D AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0341 F90F 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0342 F911 17 03 61 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0343 F914 27 03 BEQ EDUMP
0344 F916 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0345 F918 39 RTS ;
0346 *
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0349 *
0350 F919 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0351 F91B 8E FE C2 LDX #MSG5 POINT TO MSG " - "
0352 F91E 17 01 C2 LBSR PSTRNG PRINT MSG
0353 F921 AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0354 F923 17 03 02 LBSR OUT4H PRINT THE ADDRESS
0355 F926 17 03 56 LBSR OUT2S 2 SPACES
0356 F929 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0357 F92B A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0358 F92D 17 03 00 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0359 F930 17 03 4E LBSR OUT1S OUTPUT SPACE
0360 F933 5A DECB $F9D1 DECREMENT BYTE COUNT
0361 F934 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0362 *
0363 * PRINT 16 ASCII CHARACTERS
0364 * IF NOT PRINTABLE OR NOT VALID
0365 * ASCII PRINT A PERIOD (.)
0366 F936 17 03 46 LBSR OUT2S 2 SPACES
0367 F939 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0368 F93B C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0369 F93D A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0370 F93F 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0371 F941 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0372 F943 81 7E CMPA #$7E IS IT VALID ASCII?
0373 F945 23 02 BLS PRASC IF SO PRINT IT
0374 F947 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0375 F949 17 03 37 PRASC LBSR OUTCH PRINT ASCII CHARACTER
0376 F94C 5A DECB DECREMENT COUNT
0377 F94D 26 EE BNE EDPASC
0378 F94F 20 BC BRA NXTLIN
0379 *
0380 ***** "B" SET BREAKPOINT *****
0381 *
0382 F951 17 02 8B BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0383 F954 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0384 F956 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0385 F959 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0386 F95B 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0387 F95D 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0388 F960 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0389 F962 35 10 PULS X POP BP ADDRESS FROM STACK
0390 F964 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0391 F966 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0392 F968 81 3F CMPA #$3F IS IT A SWI?
0393 F96A 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0394 F96C A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0395 F96E AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0396 F970 86 3F LDA #$3F LOAD A SWI ($3F)
0397 F972 A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0398 F974 39 EXITBP RTS ;
0399 *
0400 * INDICATE ERROR SETTING BREAKPOINT
0401 *
0402 F975 17 03 09 BPERR LBSR OUT1S OUTPUT SPACE
0403 F978 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0404 F97A 16 03 06 LBRA OUTCH PRINT "?"
0405 *
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0407 *
0408 F97D 10 8E DF D3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0409 F981 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0410 F983 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0411 F985 5A DECB $FAAC DECREMENT BP COUNTER
0412 F986 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0413 F988 39 RTS
0414 *
0415 ***** SWI ENTRY POINT *****
0416 *
0417 F989 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0418 F98B AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0419 F98D 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0420 F98F 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0421 F991 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0422 F993 AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0423 F995 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0424 F997 17 02 1C REGPR LBSR REGSTR GO PRINT REGISTERS
0425 *
0426 IFD TRAOPT
0427 LDX #0
0428 STX TRACNT
0429 ENDIF TRAOPT
0429 ENDIF TRAOPT
0430 *
0431 F99A 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0432 *
0433 F99D AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0434 F99F 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0435 F9A2 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0436 F9A4 A6 84 LDA ,X GET DATA FROM BP ADDRESS
0437 F9A6 81 3F CMPA #$3F IS IT SWI?
0438 F9A8 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0439 F9AA A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0440 F9AC A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0441 F9AE 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0442 F9B0 A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0443 F9B2 A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0444 F9B4 A7 A0 STA ,Y+
0445 F9B6 39 RTS
0446 *
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0448 *
0449 F9B7 10 8E DF D3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0450 F9BB C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0451 F9BD A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0452 F9BF AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0453 F9C1 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0454 F9C3 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0455 F9C4 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0456 F9C6 39 RTS ;
0457 *
0458 *
0459 F9C7 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0460 F9C9 39 RTS
0461 *
0462 IFD TRAOPT
0463 *
0464 ** TRACE from address AAAA BB bytes
0465 *
0466 TRACE LBSR ALTPC1 SET UP NEW PC
0467 BVS TREXIT ADDRESS ERROR, EXIT
0468 LBSR OUT1S
0469 LBSR IN1ADR Fetch Byte Count
0470 BVS TREXIT Byte Count error, EXIT
0471 STX TRACNT
0472 *
0473 LDX NMI Save NMI Vector
0474 STX NMISAV
0475 LDX #NMIE Set up NMI for Tracing
0476 STX NMI
0477 LBSR TRAINZ Initialise Hardware
0478 BRA TRACEG Start Trace
0479 TREXIT RTS
0480 *
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0482 * CRA1 = 1 CA1 Rising edge IRQ
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0485 * CRA4 = 1 ] CA2 = Set/Reset output
0486 * CRA5 = 1 ]
0487 * CRA6 = X CA2 Input Interrupt Flag
0488 * CRA7 = X CA1 Interrupt Flag
0489 *
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0491 * CRB1 = 1 CB1 Rising edge IRQ
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0494 * CRB4 = 1 ] CB2 = Set/Reset output
0495 * CRB5 = 1 ]
0496 * CRB6 = X CB2 Input Interrupt Flag
0497 * CRB7 = X CB1 Interrupt Flag
0498 *
0499 *
0500 ** TRACE NMI ENTRY POINT
0501 *
0502 NMIE TFR S,U
0503 LDA #$36 Disable Interrupt, CA2 Low
0504 STA TACTRL
0505 LDA TADATA Clear Interrupt flag by reading data port
0506 *
0507 LBSR REGSTR DUMP REGISTERS
0508 *
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0510 LDA ,X
0511 CMPA #$3F
0512 BEQ TRACEX EXIT ON SWI
0513 *
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR
0516 LEAX -1,X DECREMENT TRACE COUNT
0517 STX TRACNT
0518 *
0519 ** TRACE GO (RESUME SINGLE STEP)
0520 *
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0523 STA TADATA
0524 LDA #$36 LOAD STROBE LOW
0525 STA TACTRL
0526 LDA TADATA CLEAR INTERRUPT
0527 LDA #$36 RELEASE RESET
0528 STA TBCTRL
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0530 STA TACTRL
0531 RTI GO EXECUTE INSTRUCTION
0532 *
0533 TRACEX LDX NMISAV Restore NMI vector
0534 STX NMI
0535 LBRA NEXTCMD Jump back to the command loop.
0536 *
0537 ** TRACE HARDWARE INITIALISATION
0538 *
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0540 STA TACTRL
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0542 STA TBCTRL
0543 LDA #$FF PORTA = OUTPUT
0544 STA TADATA
0545 LDA #$00 PORTB = INPUT
0546 STA TBDATA
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0548 STA TACTRL
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0550 STA TBCTRL
0551 RTS
0552 *
0553 ENDIF TRAOPT
0553 ENDIF TRAOPT
0554 IFD MFDCOPT
0555 *
0556 ** "U" MINI DISK BOOT
0557 *
0558 F9CA 7D E0 18 MINBOOT TST CMDFDC
0559 F9CD 7F E0 14 CLR DRVFDC
0560 F9D0 8E 00 00 LDX #$0000
0561 F9D3 30 01 LOOP LEAX $01,X
0562 F9D5 8C 00 00 CMPX #$0000
0563 F9D8 26 F9 BNE LOOP
0564 F9DA 86 0F LDA #$0F
0565 F9DC B7 E0 18 STA CMDFDC
0566 F9DF 8D 37 BSR DELAY
0567 F9E1 F6 E0 18 LOOP1 LDB CMDFDC
0568 F9E4 C5 01 BITB #$01
0569 F9E6 26 F9 BNE LOOP1
0570 F9E8 86 01 LDA #$01
0571 F9EA B7 E0 1A STA SECFDC
0572 F9ED 8D 29 BSR DELAY
0573 F9EF 86 8C LDA #$8C
0574 F9F1 B7 E0 18 STA CMDFDC
0575 F9F4 8D 22 BSR DELAY
0576 F9F6 8E C0 00 LDX #$C000
0577 F9F9 20 09 BRA LOOP3
0578 F9FB C5 02 LOOP2 BITB #$02
0579 F9FD 27 05 BEQ LOOP3
0580 F9FF B6 E0 1B LDA DATFDC
0581 FA02 A7 80 STA ,X+
0582 FA04 F6 E0 18 LOOP3 LDB CMDFDC
0583 FA07 C5 01 BITB #$01
0584 FA09 26 F0 BNE LOOP2
0585 FA0B C5 2C BITB #$2C
0586 FA0D 27 01 BEQ LOOP4
0587 FA0F 39 RTS
0588 *
0589 FA10 8E C0 00 LOOP4 LDX #$C000
0590 FA13 AF 4A STX $0A,U
0591 FA15 1F 34 TFR U,S
0592 FA17 3B RTI
0593 *
0594 FA18 C6 04 DELAY LDB #$04
0595 FA1A 5A LOOP5 DECB
0596 FA1B 26 FD BNE LOOP5
0597 FA1D 39 RTS
0598 ENDIF MFDCOPT
0599 *
0600 IFD DMAFOPT
0601 *
0602 *** "D" DISK BOOT FOR DMAF2 ***
0603 *
0604 DBOOT LDA #$DE
0605 STA DRVREG
0606 LDA #$FF
0607 STA PRIREG $FAF8
0608 STA CCREG
0609 STA AAAREG
0610 STA BBBREG
0611 TST CCREG
0612 LDA #$D8
0613 STA COMREG
0614 LBSR DLY
0615 DBOOT0 LDA COMREG
0616 BMI DBOOT0
0617 LDA #$09
0618 STA COMREG
0619 LBSR DLY
0620 *
0621 DISKWT LDA COMREG FETCH DRIVE STATUS
0622 BITA #1 TEST BUSY BIT
0623 BNE DISKWT LOOP UNTIL NOT BUSY
0624 *
0625 BITA #$10
0626 BNE DBOOT
0627 *
0628 LDX #$C000 LOGICAL ADDR. = $C000
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0630 ORA #$10
0631 STA CCCREG
0632 TFR X,D
0633 COMA ;
0634 COMB ;
0635 STD ADDREG
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100
0637 STX CNTREG STORE IN COUNT REGISTER
0638 LDA #$FF LOAD THE CHANNEL REGISTER
0639 STA CCREG
0640 LDA #$FE SET CHANNEL 0
0641 STA PRIREG
0642 LDA #1 SET SECTOR TO "1"
0643 STA SECREG ISSUE COMMAND
0644 LDA #$8C SET SINGLE SECTOR READ
0645 STA COMREG ISSUE COMMAND
0646 BSR DLY
0647 *
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0652 * IS STILL A ONE THE BOOT OPERATION WILL
0653 * BE STARTED OVER FROM THE BEGINING.
0654 *
0655 CLRB ;
0656 DBOOT1 PSHS B $FB55
0657 CLRB ;
0658 DBOOT2 TST CCREG
0659 BPL DBOOT3
0660 DECB ;
0661 BNE DBOOT2
0662 PULS B
0663 DECB
0664 BNE DBOOT1
0665 BRA DBOOT
0666 DBOOT3 PULS B
0667 LDA COMREG
0668 BITA #$1C
0669 BEQ DBOOT4
0670 RTS ;
0671 *
0672 *
0673 DBOOT4 LDB #$DE
0674 STB DRVREG
0675 LDX #$C000
0676 STX 10,U
0677 TFR U,S $FB7B
0678 RTI ;
0679 ENDIF DMAFOPT
0679 ENDIF DMAFOPT
0680 *
0681 IFD CF8OPT
0682 *
0683 * COMPACT FLASH BOOT
0684 *
0685 CFBOOT BSR WAITRDY
0686 LDA #HEADLBA
0687 STA CF_HEAD
0688 BSR WAITRDY
0689 LDA #FEAT8BIT
0690 STA CF_FEATURE
0691 LDA #CMDFEATURE
0692 STA CF_COMAND
0693 BSR WAITRDY
0694 *
0695 * READ SECTORS FROM CF
0696 *
0697 CFREAD LDA #$01
0698 STA CF_SECCNT
0699 CLRA
0700 STA CF_SECNUM
0701 STA CF_CYLLO
0702 STA CF_CYLHI
0703 *
0704 LDA #CMDREAD ; IDE READ MULTIPLE
0705 STA CF_COMAND
0706 BSR WAITRDY
0707 LDX #$C000
0708 *
0709 * READ LOOP
0710 *
0711 RDLOOP BSR WAITDRQ
0712 LDA CF_DATA
0713 STA ,X+
0714 CMPX #$C200
0715 BNE RDLOOP
0716 *
0717 LDX #$C000
0718 STX $0A,U
0719 TFR U,S
0720 RTI
0721 *
0722 * WAIT UNTIL READY
0723 *
0724 WAITRDY LDA CF_STATUS
0725 BITA #BUSY
0726 BNE WAITRDY
0727 LDA CF_STATUS
0728 BITA #DRDY
0729 BEQ WAITRDY
0730 RTS
0731 *
0732 * WAIT FOR DATA REQUEST
0733 *
0734 WAITDRQ LDA CF_STATUS
0735 BITA #DRQ
0736 BEQ WAITDRQ
0737 RTS
0738 ENDIF CF8OPT
0738 ENDIF CF8OPT
0739 *
0740 IFD IDEOPT
0741 *
0742 * XESS 16 BIT IDE BOOT
0743 *
0744 IDEBOOT LDD #AUXRESET
0745 STD CF_AUX
0746 LDD #AUXRSTREL
0747 STD CF_AUX
0748 LDD #HEADLBA
0749 STD CF_HEAD
0750 BSR WAITRDY
0751 *
0752 * READ SECTORS FROM CF
0753 *
0754 LDD #$01
0755 STD CF_SECCNT
0756 CLRB
0757 STD CF_SECNUM
0758 STD CF_CYLLO
0759 STD CF_CYLHI
0760 *
0761 LDB #CMDREAD ; IDE READ MULTIPLE
0762 STD CF_COMAND
0763 BSR WAITRDY
0764 LDX #$C000
0765 *
0766 * READ LOOP
0767 *
0768 RDLOOP BSR WAITDRQ
0769 LDD CF_DATA
0770 STB ,X+
0771 CMPX #$C100
0772 BNE RDLOOP
0773 *
0774 LDX #$C000
0775 STX $0A,U
0776 TFR U,S
0777 RTI
0778 *
0779 * WAIT UNTIL READY
0780 *
0781 WAITRDY LDD CF_STATUS
0782 BITB #BUSY
0783 BNE WAITRDY
0784 LDD CF_STATUS
0785 BITB #DRDY
0786 BEQ WAITRDY
0787 RTS
0788 *
0789 * WAIT FOR DATA REQUEST
0790 *
0791 WAITDRQ LDD CF_STATUS
0792 BITB #DRQ
0793 BEQ WAITDRQ
0794 RTS
0795 ENDIF IDEOPT
0795 ENDIF IDEOPT
0796 *
0797 IFD RTCOPT
0798 *
0799 * CLOCK INTER FACE UTILITY
0800 *
0801 * TIME <Hours> <Minuits> <Seconds>
0802 * If no argument is specified, the current time
0803 * will be displayed.
0804 *
0805 * READ A REGISTER FROM THE COUNTER.
0806 * The X Index rgister points to the register
0807 * to be read. The Status Register is checked
0808 * before and after the register is read before
0809 * returning a value in accumulator A
0810 *
0811 RDCLK TST CLKSTA
0812 BNE RDCLK
0813 RDCLK1 LDA 0,X
0814 TST CLKSTA
0815 BNE RDCLK1
0816 RTS
0817 *
0818 * MAIN PROGRAM:
0819 *
0820 TIMSET LDX #COUNTR POINT TO TIMER
0821 LBSR BYTE READ HOURS
0822 BVS SHOWTM NO ARG, DISP TIME
0823 STA HOUR,X
0824 LBSR OUT1S
0825 LBSR BYTE READ MINUITES
0826 BVS SHOWTM
0827 STA MINUIT,X
0828 LBSR OUT1S
0829 LBSR BYTE SECONDS.
0830 BVS SHOWTM
0831 STA SECOND,X
0832 *
0833 * DISPLAY CURRENT TIME
0834 *
0835 SHOWTM LBSR PCRLF
0836 LDX #COUNTR+HOUR
0837 LDB #3
0838 SHOWLP BSR RDCLK
0839 LBSR OUT2H
0840 LDA #':
0841 LBSR OUTCH
0842 LEAX -1,X
0843 DECB
0844 BNE SHOWLP
0845 RTS
0846 *
0847 * INITIATE CLOCK.
0848 * MASK INTERRUPTS.
0849 *
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
0851 TST CINTSR CLEAR ANY INTERRUPTS
0852 RTS
0853 ENDIF RTCOPT
0853 ENDIF RTCOPT
0854 IFD DATOPT
0855 *
0856 ***** LRA LOAD REAL ADDRESS *****
0857 *
0858 * THE FOLLOWING CODE LOADS THE 20-BIT
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE
0860 * INTO THE "A" AND "X" REGISTERS. THIS
0861 * ROUTINE IS ENTERED WITH THE LOGICAL
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0863 * REGISTER. EXIT IS MADE WITH THE HIGH-
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0865 * ADDRESS IN THE "A" REGISTER, AND THE
0866 * LOW-ORDER 16-BITS OF THE 20-BIT
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0868 * ALL OTHER REGISTERS ARE PRESERVED.
0869 * THIS ROUTINE IS REQUIRED SINCE THE
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0871 * PRESENT PHYSICAL ADDRESSES ON THE
0872 * SYSTEM BUS.
0873 *
0874 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
0875 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
0876 LSRA ;
0877 LSRA ADJ FOR INDEXED INTO
0878 LSRA CORRESPONDING LOCATION
0879 LSRA IN LRA TABLE
0880 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
0881 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
0882 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
0883 LSRB PHYSICAL ADDRESS.
0884 LSRB EXTENDED MS 4-BITS ARE RETURNED
0885 LSRB IN THE "A" ACCUMULATOR
0886 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
0887 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
0888 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0889 ASLB ADJ DATA FOR RELOCATION IN X REG
0890 ASLB ;
0891 ASLB $FB97
0892 ASLB ;
0893 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
0894 ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
0895 STA 2,S SAVE IT IN X REG ON STACK
0896 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
0897 *
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0899 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
0900 * ON STACK
0901 PULS A,B,X,Y,PC POP REGS. FROM STACK
0902 ENDIF DATOPT
0902 ENDIF DATOPT
0903 *
0904 * DELAY LOOP
0905 *
0906 FA1E 34 04 DLY PSHS B SAVE CONTENTS OF "B"
0907 FA20 C6 20 LDB #$20 GET LOOP DELAY VALUE
0908 FA22 5A SUB1 DECB SUBTRACT ONE FROM VALUE
0909 FA23 26 FD BNE SUB1 LOOP UNTIL ZERO
0910 FA25 35 84 PULS B,PC RESTORE CONTENTS OF "B"
0911 * RTS ;
0912 *
0913 ***** "L" LOAD MIKBUG TAPE *****
0914 *
0915 FA27 BD FC 98 LOAD JSR ACINIZ
0916 FA2A 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
0917 FA2C 17 02 54 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
0918 FA2F 7F DF D2 CLR ECHO TURN OFF ECHO FLAG
0919 FA32 17 02 26 LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
0920 FA35 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
0921 FA37 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
0922 FA39 17 02 1F LBSR ECHON
0923 FA3C 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
0924 FA3E 27 3D BEQ LOAD21 IF SO, EXIT LOAD
0925 FA40 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
0926 FA42 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
0927 FA44 17 01 A8 LBSR BYTE INPUT BYTE COUNT
0928 FA47 34 02 PSHS A PUSH COUNT ON STACK
0929 FA49 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
0930 FA4B 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
0931 FA4E 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
0932 FA50 34 10 PSHS X PUSH ADDR ON STACK
0933 FA52 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
0934 FA54 EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
0935 FA56 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
0936 FA58 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
0937 FA5A 6A E4 DEC ,S ADDRESS BYTES.
0938 FA5C 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
0939 FA5E 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
0940 FA61 35 04 PULS B POP CHECKSUM FROM STACK
0941 FA63 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
0942 FA65 34 02 PSHS A PUSH DATA BYTE ON STACK
0943 FA67 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
0944 FA69 6A E4 DEC ,S DECREMENT BYTE COUNT 1
0945 FA6B 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
0946 FA6D A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
0947 FA6F 20 EB BRA LOAD10 GET NEXT DATA BYTE
0948 FA71 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
0949 FA72 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
0950 FA74 C1 FF CMPB #$FF CHECKSUM OK?
0951 FA76 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
0952 FA78 86 3F LDA #'? LOAD (?) ERROR INDICATOR
0953 FA7A 17 02 06 LBSR OUTCH OUTPUT IT TO TERMINAL
0954 FA7D 73 DF D2 LOAD21 COM ECHO TURN ECHO ON
0955 FA80 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
0956 FA82 16 01 FE LBRA OUTCH OUTPUT IT
0957 *
0958 ***** "P" PUNCH MIKBUG TAPE *****
0959 *
0960 FA85 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
0961 FA87 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
0962 FA8A 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
0963 FA8C 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
0964 FA8E AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
0965 FA90 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
0966 FA92 30 01 LEAX 1,X INCREMENT END ADDRESS
0967 FA94 AF E4 STX ,S STORE END ADDR ON STACK
0968 FA96 BD FC 98 JSR ACINIZ
0969 FA99 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
0970 FA9B 17 01 E5 LBSR OUTCH OUTPUT IT TO TERMINAL
0971 FA9E EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
0972 FAA0 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
0973 FAA2 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
0974 FAA4 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
0975 FAA8 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
0976 FAAA C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
0977 FAAC E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
0978 FAAE 8E FF 03 LDX #MSG20 POINT TO MSG "S1"
0979 FAB1 17 00 2F LBSR PSTRNG PRINT MSG
0980 FAB4 CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
0981 FAB6 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
0982 FAB8 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
0983 FABB AE 62 LDX 2,S LOAD BEGIN ADDRESS
0984 FABD 17 01 68 LBSR OUT4H PUNCH ADDRESS
0985 FAC0 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
0986 FAC2 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
0987 FAC4 EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
0988 FAC6 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
0989 FAC8 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
0990 FACB 6A 64 DEC 4,S DECREMENT BYTE COUNT
0991 FACD 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
0992 FACF 53 COMB 1's COMPLIMENT CHECKSUM BYTE
0993 FAD0 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
0994 FAD2 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
0995 FAD5 AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
0996 FAD7 AC E4 CMPX ,S COMPARE IT TO END ADDR
0997 FAD9 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
0998 FADB 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
0999 FADD 17 01 A3 LBSR OUTCH OUTPUT IT
1000 FAE0 32 65 LEAS 5,S READJUST STACK POINTER
1001 FAE2 39 RTS ;
1002 *
1003 * PRINT STRING PRECEEDED BY A CR & LF.
1004 *
1005 FAE3 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1006 FAE5 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1007 *
1008 * PCRLF
1009 *
1010 FAE7 34 10 PCRLF PSHS X SAVE IX
1011 FAE9 8E FE B4 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1012 FAEC 17 00 69 LBSR PDATA PRINT MSG
1013 FAEF 35 90 PULS X,PC RESTORE IX & RETURN
1014 *
1015 * LONG BRANCHES TO COMMON ROUTINES
1016 *
1017 FAF1 16 01 8D JOUT1S LBRA OUT1S
1018 FAF4 16 00 F8 JBYTE LBRA BYTE
1019 FAF7 16 00 E5 JIN1ADR LBRA IN1ADR
1020 *
1021 * ALTER "PC" PROGRAM COUNTER
1022 *
1023 FAFA 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1024 FAFD 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1025 FAFF 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1026 FB01 29 02 BVS ALTPCD EXIT IF INVALID HEX
1027 FB03 AF 4A STX 10,U POKE IN NEW CONTENTS
1028 FB05 39 ALTPCD RTS ;
1029 *
1030 * ALTER "U" USER STACK POINTER
1031 *
1032 FB06 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1033 FB08 8D E7 BSR JOUT1S OUTPUT SPACE
1034 FB0A 8D EB BSR JIN1ADR
1035 FB0C 29 02 BVS ALTUD
1036 FB0E AF 48 STX 8,U
1037 FB10 39 ALTUD RTS ;
1038 *
1039 * ALTER "Y" INDEX REGISTER
1040 *
1041 FB11 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1042 FB13 8D DC BSR JOUT1S OUTPUT SPACE
1043 FB15 8D E0 BSR JIN1ADR
1044 FB17 29 02 BVS ALTYD
1045 FB19 AF 46 STX 6,U $F8F0
1046 FB1B 39 ALTYD RTS ;
1047 *
1048 * ALTER "X" INDEX REGISTER
1049 *
1050 FB1C 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1051 FB1E 8D D1 BSR JOUT1S OUTPUT SPACE
1052 FB20 8D D5 BSR JIN1ADR
1053 FB22 29 02 BVS ALTXD
1054 FB24 AF 44 STX 4,U
1055 FB26 39 ALTXD RTS ;
1056 *
1057 * ALTER "DP" DIRECT PAGE REGISTER
1058 *
1059 FB27 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1060 FB29 8D C6 BSR JOUT1S OUTPUT SPACE
1061 FB2B 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1062 FB2D 29 02 BVS ALTDPD
1063 FB2F A7 43 STA 3,U
1064 FB31 39 ALTDPD RTS ;
1065 *
1066 * ALTER "B" ACCUMULATOR
1067 *
1068 FB32 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1069 FB34 8D BB BSR JOUT1S OUTPUT SPACE
1070 FB36 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1071 FB38 29 02 BVS ALTBD
1072 FB3A A7 42 STA 2,U
1073 FB3C 39 ALTBD RTS $F91C
1074 *
1075 * ALTER "A" ACCUMULATOR
1076 *
1077 FB3D 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1078 FB3F 8D B0 BSR JOUT1S OUTPUT SPACE
1079 FB41 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1080 FB43 29 02 BVS ALTAD
1081 FB45 A7 41 STA 1,U
1082 FB47 39 ALTAD RTS ;
1083 *
1084 * ALTER "CC" REGISTER
1085 *
1086 FB48 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1087 FB4A 8D A5 BSR JOUT1S OUTPUT SPACE
1088 FB4C 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1089 FB4E 29 04 BVS ALTCCD
1090 FB50 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1091 FB52 A7 C4 STA ,U
1092 FB54 39 ALTCCD RTS ;
1093 *
1094 * PDATA
1095 *
1096 FB55 17 01 2B PRINT LBSR OUTCH
1097 FB58 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1098 FB5A 81 04 CMPA #4 IS IT EOT?
1099 FB5C 26 F7 BNE PRINT IF NOT EOT PRINT IT
1100 FB5E 39 RTS ;
1101 *
1102 * PRINT REGISTERS
1103 *
1104 FB5F 8E FE C6 PRTSP LDX #MSG10 POINT TO MSG "SP="
1105 FB62 8D F4 BSR PDATA PRINT MSG
1106 FB64 1F 31 TFR U,X
1107 FB66 16 00 BF JOUT4H LBRA OUT4H
1108 *
1109 FB69 8E FE D2 PRTUS LDX #MSG12 POINT TO MSG "US="
1110 FB6C 8D EA BSR PDATA PRINT MSG
1111 FB6E AE 48 LDX 8,U
1112 FB70 20 F4 BRA JOUT4H
1113 *
1114 FB72 8E FE E4 PRTDP LDX #MSG15 POINT TO MSG "DP="
1115 FB75 8D E1 BSR PDATA PRINT MSG
1116 FB77 A6 43 LDA 3,U
1117 FB79 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1118 *
1119 FB7C 8E FE DE PRTIX LDX #MSG14 POINT TO MSG "IX="
1120 FB7F 8D D7 BSR PDATA PRINT MSG
1121 FB81 AE 44 LDX 4,U $FCE6
1122 FB83 20 E1 BRA JOUT4H
1123 *
1124 FB85 8E FE D8 PRTIY LDX #MSG13 POINT TO MSG "IY="
1125 FB88 8D CE BSR PDATA PRINT MSG
1126 FB8A AE 46 LDX 6,U
1127 FB8C 20 D8 BRA JOUT4H
1128 *
1129 FB8E 8E FE CC PRTPC LDX #MSG11 POINT TO MSG "PC="
1130 FB91 8D C5 BSR PDATA PRINT MSG
1131 FB93 AE 4A LDX 10,U
1132 FB95 20 CF BRA JOUT4H
1133 *
1134 FB97 8E FE EA PRTA LDX #MSG16 POINT TO MSG "A="
1135 FB9A 8D BC BSR PDATA PRINT MSG
1136 FB9C A6 41 LDA 1,U
1137 FB9E 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1138 *
1139 FBA0 8E FE EF PRTB LDX #MSG17 POINT TO MSG "B="
1140 FBA3 8D B3 BSR PDATA PRINT MSG
1141 FBA5 A6 42 LDA 2,U
1142 FBA7 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1143 *
1144 FBA9 8E FE F4 PRTCC LDX #MSG18 POINT TO MSG "CC:"
1145 FBAC 8D AA BSR PDATA PRINT MSG
1146 FBAE A6 C4 LDA ,U
1147 FBB0 8E FE FB LDX #MSG19 POINT TO MSG "EFHINZVC"
1148 FBB3 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1149 *
1150 * "R" DISPLAY REGISTERS
1151 *
1152 FBB6 8E FE C2 REGSTR LDX #MSG5 POINT TO MSG " - "
1153 FBB9 17 FF 27 LBSR PSTRNG PRINT MSG
1154 FBBC 8D A1 BSR PRTSP $FCBF
1155 FBBE 8D A9 BSR PRTUS $FCCA
1156 FBC0 8D B0 BSR PRTDP $FCD5
1157 FBC2 8D B8 BSR PRTIX $FCE0
1158 FBC4 8D BF BSR PRTIY $FCEB
1159 FBC6 8E FE C2 LDX #MSG5 POINT TO MSG " - "
1160 FBC9 17 FF 17 LBSR PSTRNG PRINT MSG
1161 FBCC 8D C0 BSR PRTPC $FCF5
1162 FBCE 8D C7 BSR PRTA $FCFF
1163 FBD0 8D CE BSR PRTB $FD09
1164 FBD2 20 D5 BRA PRTCC $FD13
1165 *
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1171 * ADDRESS IS INPUT.
1172 *
1173 FBD4 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1174 FBD6 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1175 FBD8 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1176 FBDA 86 2D LDA #'-
1177 FBDC 17 00 A4 LBSR OUTCH PRINT " - "
1178 *
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1182 *
1183 FBDF 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1184 FBE1 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1185 FBE3 1F 01 TFR D,X
1186 FBE5 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1187 FBE7 29 3C BVS NOTHEX
1188 FBE9 34 10 PSHS X
1189 FBEB A7 61 STA 1,S
1190 FBED 35 90 PULS X,PC
1191 *
1192 ***** INPUT BYTE (2 HEX CHAR.) *****
1193 *
1194 FBEF 8D 11 BYTE BSR INHEX GET HEX LEFT
1195 FBF1 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1196 FBF3 48 ASLA ;
1197 FBF4 48 ASLA ;
1198 FBF5 48 ASLA ; SHIFT INTO LEFT NIBBLE
1199 FBF6 48 ASLA ;
1200 FBF7 1F 89 TFR A,B PUT HEXL IN "B"
1201 FBF9 8D 07 BSR INHEX GET HEX RIGHT
1202 FBFB 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1203 FBFD 34 04 PSHS B PUSH HEXL ON STACK
1204 FBFF AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1205 FC01 39 RTS RETURN WITH HEX L&R IN "A"
1206 *
1207 *
1208 FC02 8D 57 INHEX BSR ECHON INPUT ASCII CHAR.
1209 FC04 81 30 CMPA #'0 IS IT > OR = "0" ?
1210 FC06 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1211 FC08 81 39 CMPA #'9 IS IT < OR = "9" ?
1212 FC0A 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1213 FC0C 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1214 FC0E 39 RTS ;
1215 *
1216 *
1217 FC0F 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1218 FC11 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1219 FC13 81 46 CMPA #'F IS IT < OR = "F" ?
1220 FC15 22 03 BHI INHEXL IF > IT AIN'T HEX
1221 FC17 80 37 SUBA #$37 ASCII ADJ. ALPHA
1222 FC19 39 RTS ;
1223 *
1224 FC1A 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1225 FC1C 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1226 FC1E 81 66 CMPA #'f IS IT < "f"
1227 FC20 22 03 BHI NOTHEX IF > IT AIN'T HEX
1228 FC22 80 57 SUBA #$57 ADJUST TO LOWER CASE
1229 FC24 39 RTS ;
1230 *
1231 *
1232 FC25 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1233 FC27 39 RTS ;
1234 *
1235 *
1236 FC28 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1237 FC2A 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1238 FC2C 8D 02 BSR OUTHL OUTPUT HEX LEFT
1239 FC2E 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1240 FC30 OUTHL EQU *
1241 FC30 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1242 FC32 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1243 FC33 44 LSRA ;
1244 FC34 44 LSRA ;
1245 FC35 44 LSRA ;
1246 FC36 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1247 FC38 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1248 FC3A 84 0F ANDA #$0F STRIP LEFT NIBBLE
1249 FC3C 8B 30 XASCII ADDA #$30 ASCII ADJ
1250 FC3E 81 39 CMPA #$39 IS IT < OR = "9" ?
1251 FC40 2F 02 BLE OUTC IF LESS, OUTPUT IT
1252 FC42 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1253 FC44 20 3D OUTC BRA OUTCH OUTPUT CHAR
1254 *
1255 * BINARY / ASCII --- THIS ROUTINE
1256 * OUTPUTS A BYTE IN ENHANCED
1257 * BINARY FORMAT. THE ENHANCEMENT
1258 * IS DONE BY SUBSTITUTING ASCII
1259 * LETTERS FOR THE ONES IN THE BYTE.
1260 * THE ASCII ENHANCEMENT LETTERS
1261 * ARE OBTAINED FROM THE STRING
1262 * POINTED TO BY THE INDEX REG. "X".
1263 *
1264 FC46 34 02 BIASCI PSHS A SAVE "A" ON STACK
1265 FC48 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1266 FC4A A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1267 FC4C 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1268 FC4E 25 02 BCS PRTBA IF ONE PRINT LETTER
1269 FC50 86 2D LDA #'- IF ZERO PRINT "-"
1270 FC52 8D 2F PRTBA BSR OUTCH PRINT IT
1271 FC54 8D 2B BSR OUT1S PRINT SPACE
1272 FC56 5A DECB SUB 1 FROM #BITS YET TO PRINT
1273 FC57 26 F1 BNE OUTBA
1274 FC59 35 82 PULS A,PC
1275 *
1276 IFD EXTOPT
1277 *
1278 * EXTENDED USER COMMANDS
1279 *
1280 USRCMD JMP [MONEXT+EXTCMD]
1281 ENDIF EXTOPT
1281 ENDIF EXTOPT
1282 *
1283 *
1284 FC5B 7D DF D2 ECHON TST ECHO IS ECHO REQUIRED ?
1285 FC5E 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1286 *
1287 * INCHE
1288 *
1289 * ---GETS CHARACTER FROM TERMINAL AND
1290 * ECHOS SAME. THE CHARACTER IS RETURNED
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY
1292 * BIT MASKED OFF. ALL OTHER REGISTERS
1293 * ARE PRESERVED.
1294 *
1295 FC60 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1296 FC62 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1297 FC64 20 1D BRA OUTCH ECHO CHAR TO TERMINAL
1298 *
1299 * INCH
1300 *
1301 * GET CHARACTER FROM TERMINAL. RETURN
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1304 * IS 8 BITS AND IS NOT ECHOED.
1305 *
1306 *
1307 FC66 34 10 INCH PSHS X SAVE IX
1308 FC68 BE DF D0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1309 FC6B A6 84 LDA ,X FETCH PORT STATUS
1310 FC6D 85 01 BITA #1 TEST READY BIT, RDRF ?
1311 IFD PS2OPT
1312 BNE GETST1
1313 LDX #PS2KBD
1314 LDA ,X
1315 BITA #1
1316 ENDIF PS2OPT
1316 ENDIF PS2OPT
1317 FC6F 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1318 FC71 A6 01 GETST1 LDA 1,X FETCH CHAR
1319 FC73 35 90 PULS X,PC RESTORE IX
1320 *
1321 * INCHEK
1322 *
1323 * CHECK FOR A CHARACTER AVAILABLE FROM
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1325 * FOR READ READY. ALL REGISTERS ARE
1326 * PRESERVED, AND THE "Z" BIT WILL BE
1327 * CLEAR IF A CHARACTER CAN BE READ.
1328 *
1329 *
1330 FC75 34 02 INCHEK PSHS A SAVE A ACCUM.
1331 FC77 A6 9F DF D0 LDA [CPORT] FETCH PORT STATUS
1332 FC7B 85 01 BITA #1 TEST READY BIT, RDRF ?
1333 IFD PS2OPT
1334 BNE INCHEK1
1335 LDA PS2KBD
1336 BITA #1 TEST READY BIT< RDRF ?
1337 ENDIF PS2OPT
1337 ENDIF PS2OPT
1338 FC7D 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1339 *
1340 FC7F 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1341 FC81 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1342 *
1343 *
1344 * OUTCH
1345 *
1346 * OUTPUT CHARACTER TO TERMINAL.
1347 * THE CHAR. TO BE OUTPUT IS
1348 * PASSED IN THE A REGISTER.
1349 * ALL REGISTERS ARE PRESERVED.
1350 *
1351 OUTCH IFD VDUOPT
1352 BSR VOUTCH
1353 ENDIF VDUOPT
1353 ENDIF VDUOPT
1354 IFD DG640OPT
1355 FC83 8D 3B BSR VOUTCH
1356 ENDIF DG640OPT
1357 FC85 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1358 FC87 BE DF D0 LDX CPORT GET ADDR. OF TERMINAL
1359 FC8A A6 84 FETSTA LDA ,X FETCH PORT STATUS
1360 FC8C 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1361 FC8E 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1362 FC90 35 02 PULS A GET CHAR. FOR XMIT
1363 FC92 A7 01 STA 1,X XMIT CHAR.
1364 FC94 35 90 PULS X,PC RESTORE IX
1365 *
1366 * IO INITIALIZATION
1367 *
1368 FC96 IOINIZ EQU *
1369 IFD VDUOPT
1370 BSR VINIZ
1371 ENDIF VDUOPT
1371 ENDIF VDUOPT
1372 IFD DG640OPT
1373 FC96 8D 13 BSR VINIZ
1374 ENDIF DG640OPT
1375 FC98 BE DF D0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1376 FC9B 86 03 LDA #3 RESET ACIA PORT CODE
1377 FC9D A7 84 STA ,X STORE IN CONTROL REGISTER
1378 FC9F 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1379 FCA1 A7 84 STA ,X STORE IN CONTROL REGISTER
1380 FCA3 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1381 FCA5 86 FF LDA #$FF TURN ON ECHO FLAG
1382 FCA7 B7 DF D2 STA ECHO
1383 FCAA 39 RTS
1384 *
1385 IFD VDUOPT
1386 *
1387 ***************************************************
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1389 * *
1390 * 80 x 25 Characters
1391 *
1392 ***************************************************
1393 *
1394 ***************************************************
1395 * INITIALIZE EMULATOR *
1396 ***************************************************
1397 *
1398 VINIZ LDX #VDU
1399 LDD #0
1400 STD COLADX AND ROWADX
1401 STA VDUCOL,X
1402 STB VDUROW,X
1403 STB VDUOFF,X
1404 STD NEWROW AND ESCFLG
1405 LDB #$02
1406 STB VDUATT,X
1407 CLR ESCFLG
1408 LDA #$1B SEND ESCAPE
1409 BSR VOUTCH
1410 LDA #'Y CLEAR TO END OF SCREEN
1411 *
1412 ** VIDEO OUTPUT ROUTINE
1413 *
1414 VOUTCH PSHS A,B,X SAVE REGISTERS
1415 LDX #VDU POINT TO VDU REGISTERS
1416 *
1417 ** CHECK FOR ESCAPE SEQUENCE
1418 *
1419 TST ESCFLG ESCAPE ACTIVE?
1420 BEQ SOROU1 BRANCH IF NOT
1421 BSR ESCAPE ELSE DO ESCAPE
1422 BRA RETURN AND RETURN
1423 *
1424 ** CHECK FOR CONTROL CHARACTERS
1425 *
1426 SOROU1 CMPA #$20 CONTROL CODES?
1427 BHS SOROU2
1428 BSR CONTRL BRANCH IF SO
1429 BRA RETURN
1430 *
1431 ** OUTPUT TEXT CHARACTER
1432 *
1433 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1434 LBSR NEWCOL UPDATE COLUMN
1435 *
1436 ** DISPLAY CURSOR AND RETURN
1437 *
1438 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1439 *
1440 ***************************************************
1441 * CONTROL CODE HANDLERS *
1442 ***************************************************
1443 *
1444 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1445 LBEQ BACKSP
1446 CMPA #$1B ESCAPE SEQUENCE?
1447 LBEQ SETESC
1448 CMPA #$1A CTRL Z - Clear Screen
1449 LBEQ CLRSCR
1450 CMPA #$16 CTRL ^ - Home
1451 LBEQ HOME
1452 CMPA #$D CTRL M - RETURN?
1453 LBEQ CRETN
1454 CMPA #$0C CTRL L - CHAR RIGHT
1455 LBEQ CHRIGHT
1456 CMPA #$0B CTRL K - MOVE UP ONE LINE
1457 LBEQ LINEUP
1458 CMPA #$0A CTRL J - LINE FEED
1459 BNE RETESC NONE OF THESE, RETURN
1460 *
1461 ***************************************** LINE FEED
1462 *
1463 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1464 INCB BUMP ROW
1465 CMPB #NUMLIN SCROLL TIME?
1466 LBNE NEWCUR POSITION CURSOR IF NOT
1467 LBRA SCROLL ELSE SCROLL IT
1468 *
1469 ***************************************** LINE FEED
1470 *
1471 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1472 TSTB AT TOP OF SCREEN ?
1473 LBEQ RETESC Yes, Ignore
1474 DECB No, Decrement ROW
1475 LBRA NEWCUR POSITION CURSOR
1476 *
1477 *********************************** BACK SPACE
1478 *
1479 BACKSP LDA COLADX
1480 BEQ RETESC RETURN
1481 DECA
1482 LBRA POSCOL POSITION CURSOR
1483 *
1484 *********************************** CURSOR RIGHT
1485 *
1486 CHRIGHT LDA COLADX
1487 INCA
1488 CMPA #LINLEN
1489 LBEQ RETESC
1490 LBRA POSCOL
1491 *
1492 *********************************** CURSOR RIGHT
1493 *
1494 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1495 LBRA NEWCUR
1496 *
1497 ***************************************************
1498 * ESCAPE HANDLERS *
1499 ***************************************************
1500 *
1501 ESCAPE LDAB ESCFLG GET FLAG
1502 CMPB #'= SETTING CURSOR?
1503 BEQ ESCCUR BRANCH IF SO
1504 CMPA #'Y CLEAR TO END OF SCREEN?
1505 LBEQ ESCCLS
1506 CMPA #'T CLEAR TO END OF LINE?
1507 BEQ ESCCLL
1508 CMPA #'= STARTING CURSOR SET?
1509 BNE CLRESC BRANCH IF NOT
1510 *
1511 ***************************** START ESCAPE SEQUENCE
1512 *
1513 SETESC STAA ESCFLG ELSE START CURSORING
1514 RTS AND RETURN
1515 *
1516 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1517 RETESC RTS SO RETURN
1518 *
1519 ********************************* SET SCREEN CURSOR
1520 *
1521 ESCCUR TST NEWROW ROW SET?
1522 BNE ESCCU1 BRANCH IF SO
1523 STAA NEWROW ELSE SET NEW ROW
1524 RTS AND RETURN
1525 *
1526 ESCCU1 CLR ESCFLG
1527 SUBA #$20 ADJUST COLUMN ADDRESS
1528 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1529 BHI RETESC NOT OK, DO NOTHING
1530 *
1531 ESCCU2 LDAB NEWROW
1532 CLR NEWROW
1533 SUBB #$20 ADJUST TO ROW ADDRESS
1534 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1535 BHI RETESC ELSE RETURN DOING NOTHING
1536 BRA NEWCUR GO SET NEW CURSOR IF SO
1537 *
1538 ****************** CLEAR FROM CURSOR TO END OF LINE
1539 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1540 BSR NEWCUR
1541 ESCCLL LDA COLADX
1542 LDB #$20 AND CLEAR CHAR
1543 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1544 INCA
1545 STA VDUCOL,X
1546 CMPA #LINLEN UNTIL END OF LINE
1547 BNE ESCCL1
1548 CLR ESCFLG
1549 RTS
1550 *
1551 *********************************** CARRIAGE RETURN
1552 *
1553 CRETN CLRA SET COLUMN ZERO
1554 POSCOL LDB ROWADX GET CURRENT ROW
1555 *
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN
1557 *
1558 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1559 STA VDUCOL,X SET NEW COLUMN
1560 STB VDUROW,X SET NEW ROW
1561 RTS AND RETURN
1562 *
1563 ********************* UPDATE CURRENT COLUMN AND ROW
1564 *
1565 NEWCOL LDD COLADX GET ROW AND COLUMN
1566 INCA BUMP COLUMN
1567 CMPA #LINLEN ROLL?
1568 BNE NEWCUR BRANCH IF NOT
1569 CLRA ELSE RESET TO ZERO
1570 INCB AND BUMP ROW
1571 CMPB #NUMLIN
1572 BNE NEWCUR
1573 DECB BOTTOM ROW
1574 BSR NEWCUR
1575 *
1576 ********************************* SCROLL THE SCREEN
1577 *
1578 SCROLL LDB VDUOFF,X
1579 INCB
1580 CMPB #NUMLIN
1581 BLO SCROL1
1582 CLRB
1583 SCROL1 STB VDUOFF,X
1584 *
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN
1586 *
1587 ESCCLS LDB COLADX GET CURSOR
1588 LDA #$20 GET A SPACE
1589 ESCCLS1 STB COLADX
1590 STB VDUCOL,X
1591 STA VDUCHR,X
1592 INCB
1593 CMPB #LINLEN
1594 BNE ESCCLS1
1595 *
1596 LDB ROWADX
1597 INCB
1598 CMPB #NUMLIN
1599 BEQ ESCCLS2
1600 STB ROWADX
1601 STB VDUROW,X
1602 CLRB
1603 BRA ESCCLS1
1604 *
1605 ESCCLS2 CLRB
1606 STB COLADX
1607 STB VDUCOL,X
1608 STB ESCFLG
1609 RTS
1610 ENDIF VDUOPT
1610 ENDIF VDUOPT
1611 *
1612 IFD DG640OPT
1613 ***************************************************
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1615 * *
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1619 * 16x64 BOARD). *
1620 ***************************************************
1621
1622 ***************************************************
1623 * INITIALIZE EMULATOR *
1624 ***************************************************
1625
1626 FCAB 8E 00 00 VINIZ LDX #0
1627 FCAE BF DF EB STX COLADX AND ROWADX
1628 FCB1 BF DF EF STX NEWROW AND ESCFLG
1629 FCB4 8E E8 00 LDX #SCREEN POINT TO SCREEN
1630 FCB7 BF DF ED STX CURSOR SET PROGRAM CURSOR
1631 FCBA 86 1B LDA #$1B SEND ESCAPE
1632 FCBC 8D 02 BSR VOUTCH
1633 FCBE 86 59 LDA #'Y CLEAR TO END OF SCREEN
1634 *
1635 ** VIDEO OUTPUT ROUTINE
1636 *
1637 FCC0 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS
1638 *
1639 ** CLEAR CURSOR
1640 FCC2 BE DF ED LDX CURSOR
1641 FCC5 E6 84 LDB 0,X
1642 FCC7 C4 7F ANDB #$7F
1643 FCC9 E7 84 STB 0,X
1644 *
1645 ** CHECK FOR ESCAPE SEQUENCE
1646 FCCB 7D DF F0 TST ESCFLG ESCAPE ACTIVE?
1647 FCCE 27 04 BEQ SOROU1 BRANCH IF NOT
1648 FCD0 8D 5E BSR ESCAPE ELSE DO ESCAPE
1649 FCD2 20 10 BRA RETURN AND RETURN
1650 *
1651 ** CHECK FOR CONTROL CHARACTERS
1652 FCD4 81 20 SOROU1 CMPA #$20 CONTROL CODES?
1653 FCD6 24 04 BHS SOROU2
1654 FCD8 8D 15 BSR CONTRL BRANCH IF SO
1655 FCDA 20 08 BRA RETURN
1656 *
1657 ** OUTPUT TEXT CHARACTER
1658 FCDC BE DF ED SOROU2 LDX CURSOR ELSE GET CURSOR
1659 FCDF A7 84 STAA 0,X DISPLAY CHARACTER
1660 FCE1 17 00 E9 LBSR NEWCOL UPDATE COLUMN
1661 *
1662 ** DISPLAY CURSOR AND RETURN
1663 FCE4 BE DF ED RETURN LDX CURSOR AND DISPLAY IT
1664 FCE7 E6 84 LDB ,X
1665 FCE9 CA 80 ORAB #$80 WITH REVID
1666 FCEB E7 84 STB ,X
1667 FCED 35 96 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1668
1669 ***************************************************
1670 * CONTROL CODE HANDLERS *
1671 ***************************************************
1672
1673 FCEF 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1674 FCF1 10 27 00 27 LBEQ BACKSP
1675 FCF5 81 1B CMPA #$1B ESCAPE SEQUENCE?
1676 FCF7 10 27 00 52 LBEQ SETESC
1677 FCFB 81 0D CMPA #$D CTRL M - RETURN?
1678 FCFD 10 27 00 B4 LBEQ CRETN
1679 FD01 81 0A CMPA #$0A CTRL J - LINE FEED
1680 FD03 26 4F BNE RETESC NONE OF THESE, RETURN
1681
1682 ***************************************** LINE FEED
1683
1684 FD05 FC DF EB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1685 FD08 5C INCB BUMP ROW
1686 FD09 C1 10 CMPB #NUMLIN SCROLL TIME?
1687 FD0B 10 26 00 AA LBNE NEWCUR POSITION CURSOR IF NOT
1688 FD0F 16 00 CC LBRA SCROLL ELSE SCROLL IT
1689
1690 ***************************************** LINE FEED
1691
1692 FD12 FC DF EB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1693 FD15 5D TSTB AT TOP OF SCREEN ?
1694 FD16 27 3C BEQ RETESC Yes, Ignore
1695 FD18 5A DECB No, Decrement ROW
1696 FD19 16 00 9D LBRA NEWCUR POSITION CURSOR
1697
1698
1699 *********************************** BACK SPACE
1700
1701 FD1C B6 DF EB BACKSP LDA COLADX
1702 FD1F 27 33 BEQ RETESC RETURN
1703 FD21 4A DECA
1704 FD22 16 00 91 LBRA POSCOL POSITION CURSOR
1705
1706 *********************************** CURSOR RIGHT
1707
1708 FD25 B6 DF EB CHRIGHT LDA COLADX
1709 FD28 4C INCA
1710 FD29 81 40 CMPA #LINLEN
1711 FD2B 27 27 BEQ RETESC
1712 FD2D 16 00 86 LBRA POSCOL
1713
1714 ***************************************************
1715 * ESCAPE HANDLERS *
1716 ***************************************************
1717
1718 FD30 F6 DF F0 ESCAPE LDAB ESCFLG GET FLAG
1719 FD33 C1 3D CMPB #'= SETTING CURSOR?
1720 FD35 27 1E BEQ ESCCUR BRANCH IF SO
1721 FD37 81 59 CMPA #'Y CLEAR TO END OF SCREEN?
1722 FD39 10 27 00 B8 LBEQ ESCCLS
1723 FD3D 81 54 CMPA #'T CLEAR TO END OF LINE?
1724 FD3F 27 5D BEQ ESCCLL
1725 FD41 81 45 CMPA #'E INSERT LINE?
1726 FD43 27 3B BEQ ESCINL
1727 FD45 81 52 CMPA #'R DELETE LINE?
1728 FD47 27 2C BEQ ESCDLL
1729 FD49 81 3D CMPA #'= STARTING CURSOR SET?
1730 FD4B 26 04 BNE CLRESC BRANCH IF NOT
1731
1732 ***************************** START ESCAPE SEQUENCE
1733
1734 FD4D B7 DF F0 SETESC STAA ESCFLG ELSE START CURSORING
1735 FD50 39 RTS AND RETURN
1736
1737 FD51 7F DF F0 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1738 FD54 39 RETESC RTS SO RETURN
1739
1740 ********************************* SET SCREEN CURSOR
1741
1742 FD55 7D DF EF ESCCUR TST NEWROW ROW SET?
1743 FD58 26 04 BNE ESCCU1 BRANCH IF SO
1744 FD5A B7 DF EF STAA NEWROW ELSE SET NEW ROW
1745 FD5D 39 RTS AND RETURN
1746
1747 FD5E 7F DF F0 ESCCU1 CLR ESCFLG
1748 FD61 80 20 SUBA #$20 ADJUST COLUMN ADDRESS
1749 FD63 81 3F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1750 FD65 22 ED BHI RETESC NOT OK, DO NOTHING
1751
1752 FD67 F6 DF EF ESCCU2 LDAB NEWROW
1753 FD6A 7F DF EF CLR NEWROW
1754 FD6D C0 20 SUBB #$20 ADJUST TO ROW ADDRESS
1755 FD6F C1 0F CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1756 FD71 22 E1 BHI RETESC ELSE RETURN DOING NOTHING
1757 FD73 20 44 BRA NEWCUR GO SET NEW CURSOR IF SO
1758 *
1759 *************************** DELETE LINE FROM SCREEN
1760
1761 FD75 8D 3E ESCDLL BSR CRETN GO COL. ZERO
1762 FD77 F6 DF EC LDB ROWADX
1763 FD7A C1 0F CMPB #NUMLIN-1
1764 FD7C 27 7A BEQ SCROL3
1765 FD7E 20 61 BRA SCROL1 AND DELETE THIS LINE
1766
1767 *************************** INSERT LINE INTO SCREEN
1768
1769 FD80 8D 33 ESCINL BSR CRETN GO TO COL. ZERO
1770 FD82 F6 DF EC LDAB ROWADX
1771 FD85 C1 0F CMPB #NUMLIN-1
1772 FD87 27 15 BEQ ESCCLL
1773 *
1774 ** SCROLL SCREEN DOWN FROM CURSOR
1775 *
1776 FD89 8E EB C0 LDX #SCREEN+SCNLEN-LINLEN
1777 FD8C A6 82 ESCIN0 LDAA 0,-X
1778 FD8E A7 88 40 STAA LINLEN,X
1779 FD91 A6 89 04 00 LDA SCNLEN,X
1780 FD95 A7 89 04 40 STA SCNLEN+LINLEN,X
1781 FD99 BC DF ED CPX CURSOR
1782 FD9C 26 EE BNE ESCIN0
1783
1784 ****************** CLEAR FROM CURSOR TO END OF LINE
1785
1786 FD9E B6 DF EB ESCCLL LDA COLADX GET CURRENT COLUMN
1787 FDA1 BE DF ED LDX CURSOR GET CURSOR
1788 FDA4 C6 20 LDB #$20 AND CLEAR CHAR
1789 FDA6 E7 89 04 00 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
1790 FDAA E7 80 STB ,X+ CLEAR TEXT
1791 FDAC 4C INCA
1792 FDAD 81 40 CMPA #LINLEN UNTIL END OF LINE
1793 FDAF 26 F5 BNE ESCLL1
1794 FDB1 7F DF F0 CLR ESCFLG
1795 FDB4 39 RTS
1796
1797 *********************************** CARRIAGE RETURN
1798
1799 FDB5 4F CRETN CLRA SET COLUMN ZERO
1800 FDB6 F6 DF EC POSCOL LDB ROWADX GET CURRENT ROW
1801
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN
1803
1804 FDB9 FD DF EB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1805 FDBC 86 40 LDA #LINLEN ELSE ADD A LINE
1806 FDBE 3D MUL LINLEN * ROWADX
1807 FDBF FB DF EB ADDB COLADX
1808 FDC2 89 00 ADCA #0
1809 FDC4 C3 E8 00 ADDD #SCREEN ADD SCREEN BASE.
1810 FDC7 FD DF ED STD CURSOR SAVE NEW CURSOR
1811 FDCA 1F 01 TFR D,X GET CURSOR IN X
1812 FDCC 39 RTS AND RETURN
1813
1814 ********************* UPDATE CURRENT COLUMN AND ROW
1815
1816 FDCD FC DF EB NEWCOL LDD COLADX GET ROW AND COLUMN
1817 FDD0 4C INCA BUMP COLUMN
1818 FDD1 81 40 CMPA #LINLEN ROLL?
1819 FDD3 26 E4 BNE NEWCUR BRANCH IF NOT
1820 FDD5 4F CLRA ELSE RESET TO ZERO
1821 FDD6 5C INCB AND BUMP ROW
1822 FDD7 C1 10 CMPB #NUMLIN
1823 FDD9 26 DE BNE NEWCUR
1824 FDDB 5A DECB BOTTOM ROW
1825 FDDC 8D DB BSR NEWCUR
1826
1827 ********************************* SCROLL THE SCREEN
1828
1829 FDDE 8E E8 00 SCROLL LDX #SCREEN POINT TO SCREEN
1830 FDE1 A6 89 04 40 SCROL1 LDA SCNLEN+LINLEN,X
1831 FDE5 A7 89 04 00 STA SCNLEN,X
1832 FDE9 A6 88 40 LDAA LINLEN,X MOVE TWO BYTES
1833 FDEC A7 80 STAA 0,X+ UP ONE LINE
1834 FDEE 8C EB C0 CMPX #SCREEN+SCNLEN-LINLEN
1835 FDF1 26 EE BNE SCROL1 LOOP UNTIL DONE
1836 FDF3 20 03 BRA SCROL3
1837
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN
1839
1840 FDF5 BE DF ED ESCCLS LDX CURSOR GET CURSOR
1841 FDF8 86 20 SCROL3 LDAA #$20 GET A SPACE
1842 FDFA A7 89 04 00 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
1843 FDFE A7 80 STA ,X+ AND TEXT
1844 FE00 8C EC 00 CMPX #SCREEN+SCNLEN
1845 FE03 26 F5 BNE SCROL2 UNTIL DONE
1846 FE05 7F DF F0 CLR ESCFLG
1847 FE08 39 RTS
1848 ENDIF DG640OPT
1849 *
1850 IFD PRTOPT
1851 *************************************
1852 *
1853 ** PRINTER DRIVER ROUTINES
1854 *
1855 *************************************
1856 *
1857 ** PINIZ - INITIATE PRINTER PORT
1858 *
1859 FE09 34 04 PINIZ PSHS B
1860 FE0B CC 0C 04 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
1861 FE0E FD E4 04 STD PADATA SET DDR AND SELECT DATA
1862 *
1863 ** RESET PRINTER
1864 FE11 C6 04 LDB #PRESET
1865 FE13 F7 E4 04 STAB PADATA
1866 FE16 5C RESTLP INCB DELAY FOR RESET
1867 FE17 26 FD BNE RESTLP
1868 FE19 B7 E4 04 STAA PADATA ACCA=DIRMSK
1869 *
1870 ** INITALIZE PORT B (DATA PORT)
1871 FE1C 86 2A LDAA #$2A
1872 FE1E B7 E4 07 STAA PBCTRL
1873 FE21 CC FF 2E LDD #$FF2E ACCA=$FF ACCB =%00101110
1874 FE24 FD E4 06 STD PBDATA PBDREG PBCTRL
1875 *
1876 ** SELECT 66 LINES/PAGE
1877 FE27 86 1B LDAA #$1B
1878 FE29 8D 08 BSR POUTCH
1879 FE2B 86 43 LDAA #'C
1880 FE2D 8D 04 BSR POUTCH
1881 FE2F 86 42 LDAA #66
1882 FE31 35 04 PULS B
1883 *************************************
1884 *
1885 ** OUTPUT A CHARACTER TO THE PRINTER
1886 *
1887 *************************************
1888 FE33 34 04 POUTCH PSHS B
1889 FE35 F6 E4 06 LDAB PBDATA CLEAR INTERRUPT BIT
1890 *
1891 ** WAIT TILL NOT BUSY
1892 FE38 F6 E4 04 BUSYLP LDAB PADATA
1893 FE3B C5 10 BITB #PERROR
1894 FE3D 27 06 BEQ PEXIT
1895 FE3F 5D TSTB
1896 FE40 2B F6 BMI BUSYLP
1897 *
1898 ** NOW OUTPUT CHARACTER
1899 FE42 B7 E4 06 STAA PBDATA
1900 FE45 35 84 PEXIT PULS B,PC
1901 *************************************
1902 *
1903 ** PCHK TEST IFD PRINTER READY
1904 *
1905 *************************************
1906 FE47 7D E4 07 PCHK TST PBCTRL TEST STATE OF CRB7
1907 FE4A 39 RTS SET ON ACKNOWLEDGE
1908 ENDIF PRTOPT
1909 *************************************
1910 *
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE
1912 *
1913 *************************************
1914 *
1915 FE4B JMPTAB EQU *
1916 FE4B 01 FCB 1 " ^A "
1917 FE4C FB 3D FDB ALTRA
1918 FE4E 02 FCB 2 " ^B "
1919 FE4F FB 32 FDB ALTRB
1920 FE51 03 FCB 3 " ^C "
1921 FE52 FB 48 FDB ALTRCC
1922 FE54 04 FCB 4 " ^D "
1923 FE55 FB 27 FDB ALTRDP
1924 FE57 10 FCB $10 " ^P "
1925 FE58 FA FA FDB ALTRPC
1926 FE5A 15 FCB $15 " ^U "
1927 FE5B FB 06 FDB ALTRU
1928 FE5D 18 FCB $18 " ^X "
1929 FE5E FB 1C FDB ALTRX
1930 FE60 19 FCB $19 " ^Y "
1931 FE61 FB 11 FDB ALTRY
1932 *
1933 FE63 42 FCC 'B'
1934 FE64 F9 51 FDB BRKPNT
1935 FE66 45 FCC 'E'
1936 FE67 F8 F2 FDB MEMDUMP
1937 FE69 47 FCC 'G'
1938 FE6A F8 9A FDB GO
1939 FE6C 4C FCC 'L'
1940 FE6D FA 27 FDB LOAD
1941 FE6F 50 FCC 'P'
1942 FE70 FA 85 FDB PUNCH
1943 FE72 4D FCC 'M'
1944 FE73 F8 9D FDB MEMCHG
1945 FE75 52 FCC 'R'
1946 FE76 FB B6 FDB REGSTR
1947 FE78 53 FCC 'S'
1948 FE79 F8 E6 FDB DISSTK
1949 FE7B 58 FCC 'X'
1950 FE7C F9 7D FDB XBKPNT
1951 IFD MFDCOPT
1952 FE7E 44 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
1953 FE7F F9 CA FDB MINBOOT
1954 ENDIF MFDCOPT
1955 IFD CF8OPT
1956 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
1957 FDB CFBOOT
1958 ENDIF CF8OPT
1958 ENDIF CF8OPT
1959 IFD IDEOPT
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
1961 FDB IDEBOOT
1962 ENDIF IDEOPT
1962 ENDIF IDEOPT
1963 IFD DMAFOPT
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
1965 FDB DBOOT
1966 ENDIF DMAFOPT
1966 ENDIF DMAFOPT
1967 IFD EXTOPT
1968 FCC 'U' *** IF FPGA, 'U' IS FOR USER
1969 FDB USRCMD
1970 ENDIF EXTOPT
1970 ENDIF EXTOPT
1971 IFD RTCOPT
1972 FCC 'T'
1973 FDB TIMSET
1974 ENDIF RTCOPT
1974 ENDIF RTCOPT
1975 IFD TRAOPT
1976 FCC "T"
1977 FDB TRACE
1978 ENDIF TRAOPT
1978 ENDIF TRAOPT
1979 *
1980 FE81 TABEND EQU *
1981 *
1982 * ** 6809 VECTOR ADDRESSES **
1983 *
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
1988 * HIS OWN ROUTINES IF HE SO DESIRES.
1989 *
1990 *
1991 FE81 F9 89 RAMVEC FDB SWIE USER-V
1992 FE83 F8 9C FDB RTI SWI3-V
1993 FE85 F8 9C FDB RTI SWI2-V
1994 FE87 F8 9C FDB RTI FIRQ-V
1995 FE89 F8 9C FDB RTI IRQ-V
1996 FE8B F9 89 FDB SWIE SWI-V
1997 FE8D FF FF FDB $FFFF SVC-VO
1998 FE8F FF FF FDB $FFFF SVC-VL
1999 *
2000 * PRINTABLE MESSAGE STRINGS
2001 *
2002 FE91 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2003 FE96 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR '
55 47 20 31 2E 34
20 46 4F 52 20
2004 IFD S3EOPT
2005 FCC 'S3E '
2006 ENDIF S3EOPT
2006 ENDIF S3EOPT
2007 IFD B5XOPT
2008 FCC 'B5-X300 '
2009 ENDIF B5XOPT
2009 ENDIF B5XOPT
2010 IFD S3SOPT
2011 FCC 'S3STARTER '
2012 ENDIF S3SOPT
2012 ENDIF S3SOPT
2013 IFD ADSOPT
2014 FEA7 41 44 53 36 38 30 FCC 'ADS6809 '
39 20
2015 ENDIF ADSOPT
2016 IFD SWTOPT`
2017 FCC 'SWTPC '
2018 ENDIF SWTOPT
2018 ENDIF SWTOPT
2019 IFD XESOPT`
2020 FCC 'XESS '
2021 ENDIF XESOPT
2021 ENDIF XESOPT
2022 FEAF 20 2D 20 FCC ' - '
2023 FEB2 04 FCB 4
2024 FEB3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2025 FEBA 3E MSG3 FCC '>'
2026 FEBB 04 FCB 4
2027 FEBC 57 48 41 54 3F MSG4 FCC 'WHAT?'
2028 FEC1 04 FCB 4
2029 FEC2 20 2D 20 MSG5 FCC ' - '
2030 FEC5 04 FCB 4'
2031 FEC6 20 20 53 50 3D MSG10 FCC ' SP='
2032 FECB 04 FCB 4
2033 FECC 20 20 50 43 3D MSG11 FCC ' PC='
2034 FED1 04 FCB 4
2035 FED2 20 20 55 53 3D MSG12 FCC ' US='
2036 FED7 04 FCB 4
2037 FED8 20 20 49 59 3D MSG13 FCC ' IY='
2038 FEDD 04 FCB 4
2039 FEDE 20 20 49 58 3D MSG14 FCC ' IX='
2040 FEE3 04 FCB 4
2041 FEE4 20 20 44 50 3D MSG15 FCC ' DP='
2042 FEE9 04 FCB 4
2043 FEEA 20 20 41 3D MSG16 FCC ' A='
2044 FEEE 04 FCB 4
2045 FEEF 20 20 42 3D MSG17 FCC ' B='
2046 FEF3 04 FCB 4
2047 FEF4 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2048 FEFA 04 FCB 4
2049 FEFB 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2050 FF03 53 31 MSG20 FCC 'S1'
2051 FF05 04 FCB 4
2052 IFD DATOPT
2053 *
2054 * POWER UP/ RESET/ NMI ENTRY POINT
2055 *
2056 ORG $FF00
2057 *
2058 *
2059 START LDX #IC11 POINT TO DAT RAM IC11
2060 LDA #$F GET COMPLIMENT OF ZERO
2061 *
2062 *
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2067 * STORED IN IT.
2068 *
2069 *
2070 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2071 DECA GET COMP. VALUE FOR NEXT LOCATION
2072 BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2073 *
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2076 * PHYSICAL ADDRESSES.
2077 *
2078 LDA #$F0
2079 STA ,X STORE $F0 AT $FFFF
2080 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2081 LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2082 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2083 STY ,X STORE TEST PATTERN AT $D0A0
2084 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2085 BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2086 LEAX -$1000,X ELSE POINT 4K LOWER
2087 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2088 BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2089 BRA START ELSE START ALL OVER AGAIN
2090 *
2091 *
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2096 * IS STORED IN RAM IN THE LOCATION THAT IS
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2102 * "7" IN THE $70A0 WILL BE STORED IN
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2111 * OF RAM RESPONDS.
2112 *
2113 *
2114 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2115 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2116 COMA COMPLEMENT MSB OF THAT ADDRESS
2117 LSRA PUT MS 4 BITS OF ADDRESS IN
2118 LSRA LOCATION D0-D3 TO ALLOW STORING
2119 LSRA IT IN THE DYNAMIC ADDRESS
2120 LSRA TRANSLATION RAM.
2121 STA $FFFD STORE XLATION FACTOR IN DAT "D"
2122 *
2123 LDS #STACK INITIALIZE STACK POINTER
2124 *
2125 *
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2133 *
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2136 *
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2139 *
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2142 *
2143 *
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2151 * MEMORY ADDRESSED AS FOLLOWS....
2152 *
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2155 *
2156 *
2157 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2158 STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2159 CLR 14,Y CLEAR $DFDE
2160 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2161 STA 15,Y STORE AT $DFDF
2162 LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2163 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2164 DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2165 BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2166 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2167 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2168 BEQ FINTAB SKIP IF FINISHED
2169 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2170 LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2171 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2172 CMPY ,X VERIFY RAM AT TEST LOCATION
2173 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2174 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2175 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2176 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2177 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2178 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2179 LSRA
2180 LSRA
2181 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2182 EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2183 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2184 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2185 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2186 LDY #LRARAM POINT TO LRARAM TABLE
2187 STA 14,Y STORE $F1 AT $DFCE
2188 *
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2193 *
2194 *
2195 LDA #$0C PRESET NUMBER HEX "C"
2196 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2197 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2198 DECA ELSE POINT 4K LOWER
2199 BPL FINDC GO TRY AGAIN
2200 BRA XFERTF
2201 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2202 STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2203 *
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2207 * ADDRESSES FROM $0000 AND UP....
2208 *
2209 CLRA START AT ZERO
2210 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2211 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2212 BEQ PNTNXT IF IT'S ZER0 SKIP
2213 CLR A,Y ELSE ERASE FROM TABLE
2214 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2215 PNTNXT INCA GET OFFSET TO NEXT ENTRY
2216 CMPA #$0C LAST ENTRY YET ?
2217 BLT COMPRS
2218 *
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2221 * THE MP-09 CPU CARD.
2222 *
2223 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2224 LDB #$10 GET NO. OF BYTES TO MOVE
2225 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2226 STA ,X+ POKE XLATION FACTOR IN IC11
2227 DECB SUB 1 FROM BYTES TO MOVE
2228 BNE FETCH CONTINUE UNTIL 16 MOVED
2229 *
2230 ELSE
2231 FF06 39 LRA RTS
2232 FF07 10 CE DF C0 START LDS #STACK INITIALIZE STACK POINTER
2233 FF0B 5F CLRB
2234 ENDIF DATOPT
2235 *
2236 FF0C 53 COMB SET "B" NON-ZERO
2237 FF0D F7 DF D2 STB ECHO TURN ON ECHO FLAG
2238 FF10 16 F9 0F LBRA MONITOR INITIALIZATION IS COMPLETE
2239 *
2240 ** INTERRUPT JUMP VECTORS
2241 *
2242 FF13 6E 9F DF C0 V1 JMP [STACK]
2243 FF17 6E 9F DF C4 V2 JMP [SWI2]
2244 FF1B 6E 9F DF C6 V3 JMP [FIRQ]
2245 FF1F 6E 9F DF C8 V4 JMP [IRQ]
2246 FF23 6E 9F DF CA V5 JMP [SWI]
2247 *
2248 * SWI3 ENTRY POINT
2249 *
2250 FF27 1F 43 SWI3E TFR S,U
2251 FF29 AE 4A LDX 10,U *$FFC8
2252 FF2B E6 80 LDB ,X+
2253 FF2D AF 4A STX 10,U
2254 FF2F 4F CLRA
2255 FF30 58 ASLB
2256 FF31 49 ROLA
2257 FF32 BE DF CC LDX SVCVO
2258 FF35 8C FF FF CMPX #$FFFF
2259 FF38 27 0F BEQ SWI3Z
2260 FF3A 30 8B LEAX D,X
2261 FF3C BC DF CE CMPX SVCVL
2262 FF3F 22 08 BHI SWI3Z
2263 FF41 34 10 PSHS X
2264 FF43 EC C4 LDD ,U
2265 FF45 AE 44 LDX 4,U
2266 FF47 6E F1 JMP [,S++]
2267 FF49 37 1F SWI3Z PULU A,B,X,CC,DP
2268 FF4B EE 42 LDU 2,U
2269 FF4D 6E 9F DF C2 JMP [SWI3]
2270 *
2271 * 6809 VECTORS
2272 *
2273 FFF0 ORG $FFF0
2274 FFF0 FF 13 FDB V1 USER-V
2275 FFF2 FF 27 FDB SWI3E SWI3-V
2276 FFF4 FF 17 FDB V2 SWI2-V
2277 FFF6 FF 1B FDB V3 FIRQ-V
2278 FFF8 FF 1F FDB V4 IRQ-V
2279 FFFA FF 23 FDB V5 SWI-V
2280 FFFC FF 13 FDB V1 NMI-V
2281 FFFE FF 07 FDB START RESTART-V
0004 END START
0005 END
Program + Init Data = 1889 bytes
Error count = 0
/sys09xes.sh
0,0 → 1,3
../../Tools/as09/as09.exe sys09xes.txt -l > sys09xes.lst
../../Tools/epedit/epedit.exe sys09xes.aux
 
/SYS09B5X.S19
0,0 → 1,66
S123F800F814F861FC9DFC97FCB5FCCAFB8FFB1EFB1AFA2E8EFE6D108EDFC0C610A680A723
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2
S123F840049B8EFE7D1703478EDFD04FC60D6D8527038B04195A2AF617040C8EFE9F170392
S123F8602E8EFEA61702B3170433847F810D27F11F8981202C09865E17044F1F988B4017FC
S123F8800448170443C1602F02C0208EFE37E180270F30028CFE6D26F58EFEA81702F0208D
S123F8A0C0AD9420BC1F343B17036B292D1F128EFEAE1702651F211703A517040BA6A4178F
S123F8C003A517040317035E2811810827E1811827DD815E2717810D260F39A7A4A1A427AF
S123F8E0081703E4863F1703E1312120C2313F20BE1702A21F328EDFC0301F200517030BEA
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE4270517039627DF
S123F9200332623934108EFEAE1701EEAEE417032E170392C610A68017032C17038A5A2683
S123F940F5170382AEE1C610A68081202504817E2302862E1703735A26EE20BC1702B72915
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2
S123F980170345863F160342108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4ADD
S123F9A08D0617024816FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A717
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D398D4086E0B7E0468D398601AA
S123F9E0B7E04186EFB7E0478D2D8601B7E0424FB7E043B7E044B7E0458620B7E0478D17B6
S123FA008EC0008D21B6E040A7808CC20026F48EC000AF4A1F343BB6E047858026F9B6E015
S123FA2047854027F239B6E047850827F9393436A66244444444108EDFD0E6A654545454F6
S123FA40E7E4E6A65358585858A662840FA762EA62E76235B63404C6205A26FD3584BDFC67
S123FA60DF86111702647FDFE2170226815326F917021F8139273D813126F11701A8340208
S123FA80292617019129213410E6E0EBE0EBE46AE46AE4340417018E3504290C3402EBE093
S123FAA06AE42705A78020EB5F3502C1FF27BA863F17021673DFE2861316020E6FE217010F
S123FAC04A3430294DAC6225493001AFE4BDFCDF86121701F5ECE4A36227061083002023A9
S123FAE002C620E7648EFEEF17002FCB031F98170175AE62170168EB62EB63EB84A6801725
S123FB0001656A6426F5531F9817015BAF62ACE426C386141701B33265398D0220713410F2
S123FB208EFEA0170069359016019D1600F81600E51700918DF28DF62902AF4A398D618D11
S123FB40E78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18DD52902AF44398D49E1
S123FB608DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB08DB12902A741398D7C
S123FB805F8DA58DA629048A80A7C43917013BA680810426F7398EFEB28DF41F311600BF8A
S123FBA08EFEBE8DEAAE4820F48EFED08DE1A6431600B48EFECA8DD7AE4420E18EFEC48D6F
S123FBC0CEAE4620D88EFEB88DC5AE4A20CF8EFED68DBCA64120D98EFEDB8DB3A64220D0E0
S123FBE08EFEE08DAAA6C48EFEE71600908EFEAE17FF278DA18DA98DB08DB88DBF8EFEAEF8
S123FC0017FF178DC08DC78DCE20D58D09294D1F12862D1700B48D0E29421F018D08293CE7
S123FC203410A76135908D112932484848481F898D0729283404ABE0398D578130251D81B5
S123FC40392203803039814125128146220380373981612507816622038057391A023934D1
S123FC601035028D0235023402444444448D043502840F8B3081392F028B07204D3402C631
S123FC8008A68068E42502862D8D3F8D3B5A26F135827DDFE227068D04847F202D3410BE02
S123FCA0DFE0A684850126098EE020A684850127EEA60135903402A69FDFE085012605B642
S123FCC0E020850135828D0086208D453412BEDFE0A684850227FA3502A70135908D13BE47
S123FCE0DFE08603A7848611A7846D0186FFB7DFE2398EE030CC0000FDDFFBA702E703E76C
S123FD0004FDDFFDC602E7017FDFFE861B8D02865934168EE0307DDFFE27048D74200D81CB
S123FD202024048D092005A7841700C53596810810270041811B1027006C811A1027008E4A
S123FD40811610270045810D10270099810C1027002C810B10270011810A2651FCDFFB5C36
S123FD60C11910260083160099FCDFFB5D1027003C5A160074B6DFFB27334A160068B6DF6C
S123FD80FB4C81501027002516005BCC0000160058F6DFFEC13D271681591027006E8154DE
S123FDA02731813D2604B7DFFE397FDFFE397DDFFD2604B7DFFD397FDFFE8020814F22ED73
S123FDC0F6DFFD7FDFFDC020C11822E1201BCC00008D16B6DFFBC620E7844CA702815026BF
S123FDE0F77FDFFE394FF6DFFCFDDFFBA702E70339FCDFFB4C815026F04F5CC11926EA5AB8
S123FE008DE7E6045CC11925015FE704F6DFFB8620F7DFFBE702A7845CC15026F4F6DFFC27
S123FE205CC1192708F7DFFCE7035F20E45FF7DFFBE702F7DFFE3901FB7402FB6903FB7FC1
S123FE4004FB5E10FB3115FB3D18FB5319FB4842F95C45F8FD47F8A54CFA5E50FABC4DF852
S123FE60A852FBED53F8F158F98844F9D5F994F8A7F8A7F8A7F8A7F994FFFFFFFF0D0A00CC
S123FE800000535953303942554720312E3420464F522042352D5833303020202D20044BD3
S123FEA00D0A000000043E04574841543F04202D2004202053503D04202050433D04202081
S123FEC055533D04202049593D04202049583D04202044503D042020413D042020423D0456
S115FEE0202043433A2004454648494E5A564353310403
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB
S9030000FC
/sys09s3s.lst
0,0 → 1,2771
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 NAM SYS09BUG FOR SPARTAN 3 STARTER
0000 INCLUDE "opt_s3s.txt"
0001 *
0002 ***************************************************
0003 * OPTION SWITCHES
0004 ***************************************************
0005 *
0006 *
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0009 ** FOR LOADING AND SAVING S1 RECORDS
0010 *
0011 *S3EOPT EQU $FF SPARTAN3E STARTER
0012 00FF S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0017 *
0002 END
0000 INCLUDE "sys09equ.txt"
0001 *
0002 ***************************************************
0003 * MEMORY MAP EQUATES *
0004 ***************************************************
0005 E000 MONIO EQU $E000 I/O SPACE
0006 IFD S3EOPT
0007 MONRAM EQU $7FC0
0008 ELSE
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE
0010 ENDIF S3EOPT
0011 F800 MONROM EQU $F800 START OF ROM
0012 IFD S3SOPT
0013 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0014 0000 EXTCMD EQU $00 EXTENDED OFFSET
0015 ENDIF S3SOPT
0016 IFD XESOPT
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0018 EXTCMD EQU $00 EXTENDED OFFSET
0019 ENDIF XESOPT
0019 ENDIF XESOPT
0020 ***************************************************
0021
0022 IFD S3EOPT
0023 *
0024 * DIGILENT SPARTAN 3E STARTER
0025 *
0026 ACIAOPT EQU $FF ACIA AT PORT 0
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0028 VDUOPT EQU $FF VDU AT $E030
0029 TRAOPT EQU $FF PIA TRACE TIMER
0030 ENDIF S3EOPT
0030 ENDIF S3EOPT
0031 *
0032 IFD S3SOPT
0033 *
0034 * DIGILENT SPARTAN 3 STARTER
0035 *
0036 00FF ACIAOPT EQU $FF ACIA AT PORT 0
0037 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0038 00FF VDUOPT EQU $FF VDU AT $E030
0039 00FF CF8OPT EQU $FF COMPACT FLASH AT $E040
0040 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0041 00FF EXTOPT EQU $FF EXTENDED COMMANDS
0042 ENDIF S3SOPT
0043 *
0044 IFD B5XOPT
0045 *
0046 * BURCHED B5-X300
0047 *
0048 ACIAOPT EQU $FF ACIA AT PORT 0
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0050 VDUOPT EQU $FF VDU AT $E030
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0053 ENDIF B5XOPT
0053 ENDIF B5XOPT
0054 *
0055 IFD XESOPT
0056 *
0057 * XESS XSA-3S1000 & XST-3.0
0058 *
0059 ACIAOPT EQU $FF ACIA AT PORT 0
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0061 VDUOPT EQU $FF VDU AT $E030
0062 IDEOPT EQU $FF XESS IDE AT $E100
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0064 EXTOPT EQU $FF EXTENDED COMMANDS
0065 ENDIF XESOPT
0065 ENDIF XESOPT
0066 *
0067 IFD ADSOPT
0068 *
0069 * ACKERMAN DIGITAL ADS6809
0070 *
0071 DG640OPT EQU $FF DG640 VDU AT $E800
0072 *RTCOPT EQU $FF REAL TIME CLOCK
0073 PRTOPT EQU $FF PRINTER DRIVERS
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0075 ENDIF ADSOPT
0075 ENDIF ADSOPT
0076 *
0077 IFD SWTOPT
0078 *
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER
0080 *
0081 ACIAOPT EQU $FF ACIA AT PORT 0
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0085 ENDIF
0085 ENDIF
0086 *
0087 IFD ACIAOPT
0088 *
0089 ***************************************************
0090 * SERIAL PORT *
0091 ***************************************************
0092 *
0093 ** ACIA SITS ON PORT 0
0094 *
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0096 *
0097 ENDIF ACIAOPT
0098 IFD MFDCOPT
0099 *
0100 ***************************************************
0101 * MINIFLOPPY DRIVE *
0102 ***************************************************
0103 *
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0105 *
0106 DRVFDC EQU MONIO+$14
0107 CMDFDC EQU MONIO+$18
0108 SECFDC EQU MONIO+$1A
0109 DATFDC EQU MONIO+$1B
0110 ENDIF MFDCOPT
0110 ENDIF MFDCOPT
0111 IFD PS2OPT
0112 *
0113 ***************************************************
0114 * VDU8 PS/2 KEYBOARD PORT *
0115 ***************************************************
0116 *
0117 ** KEYBOARD SITS ON PORT 2
0118 *
0119 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0120 ENDIF PS2OPT
0121 IFD VDUOPT
0122 *
0123 ***************************************************
0124 * VDU8 DISPLAY DRIVER EQUATES *
0125 ***************************************************
0126 *
0127 ** VDU8 DISPLAY SITS ON PORT 3
0128 *
0129 E030 VDU EQU MONIO+$30
0130 0000 VDUCHR EQU 0 CHARACTER REGISTER
0131 0001 VDUATT EQU 1 ATTRIBUTE REGISTER
0132 0002 VDUCOL EQU 2 CURSOR COLUMN
0133 0003 VDUROW EQU 3 CURSOR ROW
0134 0004 VDUOFF EQU 4 ROW OFFSET
0135 *
0136 0050 LINLEN EQU 80 LENGTH OF A LINE
0137 0019 NUMLIN EQU 25 NUMBER OF LINES
0138 ENDIF VDUOPT
0139 *
0140 IFD CF8OPT
0141 *
0142 ***************************************************
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER *
0144 ***************************************************
0145 *
0146 ** COMPACT FLASH SITS AT PORT 4
0147 *
0148 E040 CF_BASE EQU MONIO+$40
0149 E040 CF_DATA EQU CF_BASE+0
0150 E041 CF_ERROR EQU CF_BASE+1 ; read error
0151 E041 CF_FEATURE EQU CF_BASE+1 ; write feature
0152 E042 CF_SECCNT EQU CF_BASE+2
0153 E043 CF_SECNUM EQU CF_BASE+3
0154 E044 CF_CYLLO EQU CF_BASE+4
0155 E045 CF_CYLHI EQU CF_BASE+5
0156 E046 CF_HEAD EQU CF_BASE+6
0157 E047 CF_STATUS EQU CF_BASE+7 ; read status
0158 E047 CF_COMAND EQU CF_BASE+7 ; write command
0159 *
0160 * Command Equates
0161 *
0162 0020 CMDREAD EQU $20 ; Read Single sector
0163 0030 CMDWRITE EQU $30 ; Write Single sector
0164 00EF CMDFEATURE EQU $EF
0165 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers
0166 00E0 HEADLBA EQU $E0
0167 *
0168 * Status bit equates
0169 *
0170 0080 BUSY EQU $80
0171 0040 DRDY EQU $40
0172 0008 DRQ EQU $08
0173 0001 ERR EQU $01
0174 *
0175 ENDIF CF8OPT
0176 *
0177 IFD IDEOPT
0178 *
0179 ***************************************************
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *
0181 ***************************************************
0182 *
0183 ** COMPACT FLASH SITS AT PORT 4
0184 *
0185 CF_BASE EQU MONIO+$0100
0186 CF_DATA EQU CF_BASE+0
0187 CF_ERROR EQU CF_BASE+2 ; read error
0188 CF_FEATURE EQU CF_BASE+2 ; write feature
0189 CF_SECCNT EQU CF_BASE+4
0190 CF_SECNUM EQU CF_BASE+6
0191 CF_CYLLO EQU CF_BASE+8
0192 CF_CYLHI EQU CF_BASE+10
0193 CF_HEAD EQU CF_BASE+12
0194 CF_STATUS EQU CF_BASE+14 ; read status
0195 CF_COMAND EQU CF_BASE+14 ; write command
0196 CF_AUX EQU CF_BASE+30
0197 *
0198 * Command Equates
0199 *
0200 CMDREAD EQU $20 ; Read Single sector
0201 CMDWRITE EQU $30 ; Write Single sector
0202 AUXRESET EQU $06 ; Reset IDE
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked
0204 HEADLBA EQU $E0
0205 *
0206 * Status bit equates
0207 *
0208 BUSY EQU $80
0209 DRDY EQU $40
0210 DRQ EQU $08
0211 ERR EQU $01
0212 *
0213 ENDIF CF8OPT
0213 ENDIF CF8OPT
0214 *
0215 IFD RTCOPT
0216 *
0217 **************************************************
0218 * MM58167A REAL TIME CLOCK MEMORY MAP:
0219 **************************************************
0220 *
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0222 *
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0224 *
0225 * COUNTER AND COMPARITOR REGISTERS:
0226 *
0227 * Both the Clock Counter and Clock Comparitor
0228 * consist of 8 registers for holding the time.
0229 * The register offsets from the Counter and
0230 * Comparitor registers are listed above.
0231 *
0232 COUNTR EQU CLOCK+0
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0234 *
0235 * CLOCK REGISTER OFFSETS:
0236 * These register offsets are used for the CLOCK
0237 * and comparitor ram CMPRAM.
0238 *
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0241 SECOND EQU 2
0242 MINUIT EQU 3
0243 HOUR EQU 4
0244 WKDAY EQU 5
0245 MTHDAY EQU 6
0246 MONTH EQU 7
0247 *
0248 * INTERRUPT OUTPUT REGISTERS:
0249 *
0250 * An interrupt output may be generated at the
0251 * following rates by setting the appropriate bit
0252 * in the Interrupt Control Register (CINTCR).
0253 * The Interrupt Status Register (CINTSR) must be
0254 * read to clear the interrupt and will return
0255 * the source of the interrupt.
0256 *
0257 * 1/Month Bit 7
0258 * 1/Week Bit 6
0259 * 1/Day Bit 5
0260 * 1/Hour Bit 4
0261 * 1/Minuite Bit 3
0262 * 1/Second Bit 2
0263 * 10/Second Bit 1
0264 * Comparitor Bit 0
0265 *
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0268 *
0269 * COUNTER AND RAM RESETS; GO COMMAND.
0270 *
0271 * The counter and comparitor may be reset
0272 * by writing $FF into CTRRES and CMPRES
0273 * respectivly.
0274 * A write to the Go command register (GOCMND)
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths
0276 * of a second counter.
0277 *
0278 CTRRES EQU CLOCK+18 COUNTER RESET
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0280 GOCMND EQU CLOCK+21 GO COMMAND
0281 *
0282 * CLOCK STATUS REGISTER.
0283 *
0284 * The counter takes 61 usec. to rollover for
0285 * every 1KHz clock pulse. If the Status bit is
0286 * set after reading the counter, the counter
0287 * should be re-read to ensure the time is correct.
0288 *
0289 CLKSTA EQU CLOCK+20 STATUS BIT
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0292 ENDIF RTCOPT
0292 ENDIF RTCOPT
0293 *
0294 IFD TRAOPT
0295 *
0296 **************************************************
0297 * PIA INTERRUPT TIMER
0298 **************************************************
0299 *
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7
0301 *
0302 ** PIA TIMER FOR SINGLE STEP / TRACE
0303 *
0304 * TADATA = Output = Timer preset register
0305 * TACTRL - CA1 = input = rising edge = NMI
0306 * - CA2 = Output = Timer Reset (Active High)
0307 * TBDATA = Input = Timer read back register
0308 * TBCTRL - CB1 = input = rising edge = FIRQ
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0310 *
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0312 * CRA1 = 1 CA1 Rising edge IRQ
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0315 * CRA4 = 1 ] CA2 = Set/Reset output
0316 * CRA5 = 1 ]
0317 * CRA6 = X CA2 Input Interrupt Flag
0318 * CRA7 = X CA1 Interrupt Flag
0319 *
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0321 * CRB1 = 1 CB1 Rising edge IRQ
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0324 * CRB4 = 1 ] CB2 = Set/Reset output
0325 * CRB5 = 1 ]
0326 * CRB6 = X CB2 Input Interrupt Flag
0327 * CRB7 = X CB1 Interrupt Flag
0328 *
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0331 *
0332 TADATA EQU MONIO+$70 Timer preset port
0333 TACTRL EQU MONIO+$71
0334 TBDATA EQU MONIO+$72 Timer read back port
0335 TBCTRL EQU MONIO+$73
0336 *
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0338 *
0339 ENDIF TRAOPT
0339 ENDIF TRAOPT
0340 IFD ADSOPT
0341 *
0342 ***************************************************
0343 * SERIAL PORT FOR DG640 *
0344 ***************************************************
0345 *
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0348 *
0349 ACIAS EQU MONIO+$400 CONTROL PORT
0350 *
0351 ENDIF ADSOPT
0351 ENDIF ADSOPT
0352 IFD PRTOPT
0353 *
0354 ***************************************************
0355 * PRINTER INTERFACE *
0356 ***************************************************
0357 *
0358 PADATA EQU MONIO+$404
0359 PACTRL EQU MONIO+$405
0360 PBDATA EQU MONIO+$406
0361 PBCTRL EQU MONIO+$407
0362 *
0363 ** CB1 ACK. I/P
0364 ** CB2 STB. O/P
0365 ** PB0 - PB7 DATA 1 - 8 O/P
0366 ** PORT A BIT ASSIGNMENT
0367 *
0368 PBUSY EQU $80 I/P
0369 PEMPTY EQU $40 I/P
0370 SELECT EQU $20 I/P
0371 PERROR EQU $10 I/P
0372 PRESET EQU %00000100 O/P PA3 = 0
0373 AUTOFD EQU %00001000 O/P PA2 = 0
0374 DIRMSK EQU %00001100
0375 ENDIF PRTOPT
0375 ENDIF PRTOPT
0376 IFD DG640OPT
0377 *
0378 ***************************************************
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0380 ***************************************************
0381 *
0382 ** VIDEO DISPLAY DEFINITIONS
0383 *
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0385 LINLEN EQU 64 LENGTH OF A LINE
0386 NUMLIN EQU 16 NUMBER OF LINES
0387 SCNLEN EQU $400 LENGTH OF SCREEN
0388 ENDIF DG640OPT
0388 ENDIF DG640OPT
0389 *
0390 IFD DMAFOPT
0391 *
0392 ***************************************************
0393 * DMAF2 8" DRIVE *
0394 ***************************************************
0395 *
0396 ADDREG EQU $F000 ADDRESS REGISTER
0397 CNTREG EQU $F002 COUNT REGISTER
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER
0400 AAAREG EQU $F015 ???
0401 BBBREG EQU $F016 ???
0402 COMREG EQU $F020 1791 COMMAND REGISTER
0403 SECREG EQU $F022 SECTOR REGISTER
0404 DRVREG EQU $F024 DRIVE SELECT LATCH
0405 CCCREG EQU $F040 ???
0406 ENDIF DMAFOPT
0406 ENDIF DMAFOPT
0407 IFD DATOPT
0408 **************************************************
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0410 **************************************************
0411 *
0412 FFF0 IC11 EQU $FFF0 DAT RAM CHIP
0413 55AA TSTPAT EQU $55AA TEST PATTERN
0414 ENDIF DATOPT
0415 *
0003 END
0000 INCLUDE "sys09bug.txt"
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR
0002 OPT l
 
sys09bug.txt page 2
0004 *
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007 *
0008 * ALLEN CLARK WALLACE WATSON
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
0011 * PH. 813-977-0347 PH. 813-985-1359
0012 *
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
0014 * 2561 NANTUCKET DR APT. E
0015 * ATLANTA, GA 30345
0016 * PH. 404-320-1043
0017 *
0018 * MODIFIED TO SYS09BUG VER 1.0
0019 * FOR: SYSTEM09 FPGA SYSTEM
0020 * BY: JOHN KENT
0021 * DATE: 21ST NOVEMBER 2006
0022 * REMOVED: DISK BOOTS
0023 * MEMORY TEST
0024 * ADDED: ADM3A VDU DRIVER
0025 *
0026 * MODIFIED TO SYS09BUG VER 1.1
0027 * FOR: SYSTEM09 FPGA SYSTEM
0028 * BY: JOHN KENT
0029 * DATE: 7TH JANUARY 2007
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0032 * AND REALTIME CLOCK
0033 *
0034 * MODIFIED TO SYS09BUG VER 1.2
0035 * FOR: SYSTEM09 FPGA SYSTEM
0036 * BY: JOHN KENT
0037 * DATE: 21ST MAY 2007
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * Modified to SYS09BUG VER 1.4
0049 * FOR: SYSTEM09 FPGA SYSTEM
0050 * BY: JOHN KENT
0051 * DATE: 3RD FEB 2008
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
0056 *
0057 * *** COMMANDS ***
0058 *
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0063 * CONTROL P = ALTER THE PROGRAM COUNTER
0064 * CONTROL U = ALTER USER STACK POINTER
0065 * CONTROL X = ALTER "X" INDEX REGISTER
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0068 * D = 5.25" MINIFLOPPY BOOT
0069 * E ssss-eeee = EXAMINE MEMORY
0070 * FROM STARTING ADDRESS ssss
0071 * TO ENDING ADDRESS eeee.
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0073 * L = LOAD TAPE
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0076 * R = DISPLAY REGISTER CONTENTS
0077 * S = DISPLAY STACK FROM ssss TO $DFC0
0078 * U = 8" DMAF2 FLOPPY BOOT
0079 * U = USER EXTENSION COMMANDS AT $F000
0080 * X = REMOVE ALL BREAKPOINTS
0081 *
0082 *
0083 ***************************************************
0084 * SYS09BUG VARIABLE SPACE
0085 ***************************************************
0086 *
0087 DFC0 ORG MONRAM
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK
0089 DFC0 NMI RMB 2 USER NMI VECTOR
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0097 IFD DATOPT
0098 DFD0 LRARAM RMB 16 LRA ADDRESSES
0099 ENDIF DATOPT
0100 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0101 DFE2 ECHO RMB 1 ECHO FLAG
0102 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0103 IFD TRAOPT
0104 NMISAV RMB 2 NMI Jump Vector Backup
0105 TRACNT RMB 2 Trace Count
0106 ENDIF TRAOPT
0106 ENDIF TRAOPT
0107 IFD VDUOPT
0108 *
0109 **************************************************
0110 * VDU8 DISPLAY DRIVER VARIABLES *
0111 **************************************************
0112 *
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0114 DFFB COLADX RMB 1 CURSOR COLUMN
0115 DFFC ROWADX RMB 1 CURSOR ROW
0116 **************************************************
0117 *
0118 DFFD NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0119 DFFE ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0120 ENDIF VDUOPT
0121 IFD DG640OPT
0122 *
0123 ***************************************************
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0125 ***************************************************
0126 *
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0128 COLADX RMB 1 CURSOR COLUMN
0129 ROWADX RMB 1 CURSOR ROW
0130 *************************************************
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0134 ENDIF DG640OPT
0134 ENDIF DG640OPT
0135 *
0136 *
0137 ***************************************************
0138 * START OF ROM *
0139 ***************************************************
0140 *
0141 F800 ORG MONROM
0142 F800 F8 14 FDB MONITOR
0143 F802 F8 61 FDB NEXTCMD
0144 F804 FC A1 FDB INCH
0145 F806 FC 9B FDB INCHE
0146 F808 FC B9 FDB INCHEK
0147 F80A FC CE FDB OUTCH
0148 F80C FB 8F FDB PDATA
0149 F80E FB 1E FDB PCRLF
0150 F810 FB 1A FDB PSTRNG
0151 F812 FA 2E FDB LRA
0152 *
0153 IFD ADSOPT
0154 FDB PCHK CHECK FOR PRINTER INPUT
0155 FDB PINIZ INITIATE PRINTER
0156 FDB POUTCH OUTPUT CH. TO PRINTER
0157 FDB VINIZ
0158 FDB VOUTCH
0159 FDB ACINIZ
0160 FDB AOUTCH
0161 ENDIF ADSOPT
0161 ENDIF ADSOPT
0162 *
0163 * MONITOR
0164 *
0165 * VECTOR ADDRESS STRING IS.....
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0167 *
0168 F814 8E FE 74 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0169 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0175 *
0176 * CONTENTS FROM TO FUNCTION
0177 * $F8A1 $FE40 $DFC0 USER-V
0178 * $F8A1 $FE42 $DFC2 SWI3-V
0179 * $F8A1 $FE44 $DFC4 SWI2-V
0180 * $F8A1 $FE46 $DFC6 FIRQ-V
0181 * $F8A1 $FE48 $DFC8 IRQ-V
0182 * $FAB0 $FE4A $DFCA SWI-V
0183 * $FFFF $FE4C $DFCC SVC-VO
0184 * $FFFF $FE4E $DFCE SVC-VL
0185 *
0186 F824 8E E0 00 LDX #ACIAS
0187 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM
0188 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0190 F82F 6F E2 CLRSTK CLR ,-S
0191 F831 5A DECB
0192 F832 26 FB BNE CLRSTK
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0194 F837 AF 6A STX 10,S ON STACK
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0196 F83B A7 E4 STA ,S
0197 F83D 1F 43 TFR S,U
0198 F83F 17 04 9F LBSR IOINIZ INITIALIZE CONTROL PORT
0199 F842 8E FE 84 LDX #MSG1 POINT TO MONITOR MESSAGE
0200 F845 17 03 47 LBSR PDATA PRINT MSG
0201 *
0202 IFD DATOPT
0203 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0204 F84B 4F CLRA START TOTAL AT ZERO
0205 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0206 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0207 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0208 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL
0209 F854 19 DAA ADJ. TOTAL FOR DECIMAL
0210 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0211 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM
0212 F858 17 04 0C LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0213 F85B 8E FE A8 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0214 F85E 17 03 2E LBSR PDATA PRINT MSG
0215 ENDIF DATOPT
0216 *
0217 IFD TRAOPT
0218 LBSR TRAINZ
0219 ENDIF TRAOPT
0219 ENDIF TRAOPT
0220 *
0221 ***** NEXTCMD *****
0222 *
0223 F861 8E FE AF NEXTCMD LDX #MSG3 POINT TO MSG ">"
0224 F864 17 02 B3 LBSR PSTRNG PRINT MSG
0225 F867 17 04 37 LBSR INCH GET ONE CHAR. FROM TERMINAL
0226 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0227 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0228 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0229 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0230 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0231 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0232 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0233 F878 17 04 53 LBSR OUTCH PRINT "^"
0234 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0235 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0236 F87F 17 04 4C PRTCMD LBSR OUTCH PRNT CMD CHAR
0237 F882 17 04 47 LBSR OUT1S PRNT SPACE
0238 F885 C1 60 CMPB #$60
0239 F887 2F 02 BLE NXTCH0
0240 F889 C0 20 SUBB #$20
0241 *
0242 ***** DO TABLE LOOKUP *****
0243 * FOR COMMAND FUNCTIONS
0244 *
0245 F88B 8E FE 3B NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0246 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0247 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0248 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0249 F894 8C FE 74 CMPX #TABEND REACHED END OF TABLE YET ?
0250 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0251 F899 8E FE B1 LDX #MSG4 POINT TO MSG "WHAT?"
0252 F89C 17 02 F0 LBSR PDATA PRINT MSG
0253 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0254 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0255 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0256 *
0257 * "G" GO OR CONTINUE
0258 *
0259 F8A5 1F 34 GO TFR U,S
0260 F8A7 3B RTI RTI
0261 *
0262 ***** "M" MEMORY EXAMINE AND CHANGE *****
0263 *
0264 F8A8 17 03 6B MEMCHG LBSR IN1ADR INPUT ADDRESS
0265 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN
0266 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y"
0267 F8AF 8E FE B7 MEMC2 LDX #MSG5 POINT TO MSG " - "
0268 F8B2 17 02 65 LBSR PSTRNG PRINT MSG
0269 F8B5 1F 21 TFR Y,X FETCH ADDRESS
0270 F8B7 17 03 A5 LBSR OUT4H PRINT ADDR IN HEX
0271 F8BA 17 04 0F LBSR OUT1S OUTPUT SPACE
0272 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0273 F8BF 17 03 A5 LBSR OUT2H OUTPUT CONTENTS IN ASCII
0274 F8C2 17 04 07 LBSR OUT1S OUTPUT SPACE
0275 F8C5 17 03 5E LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0276 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0277 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0278 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0279 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0280 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0281 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW?
0282 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0283 F8D6 81 0D CMPA #$D IS IT A CR?
0284 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE
0285 F8DA 39 CHRTN RTS EXIT ROUTINE
0286 *
0287 *
0288 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0289 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0290 F8DF 27 08 BEQ FORWRD $F972
0291 F8E1 17 03 E8 LBSR OUT1S OUTPUT SPACE
0292 F8E4 86 3F LDA #'? LOAD QUESTION MARK
0293 F8E6 17 03 E5 LBSR OUTCH PRINT IT
0294 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0295 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0296 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0297 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0298 *
0299 * "S" DISPLAY STACK
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0302 *
0303 F8F1 17 02 A2 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0304 F8F4 1F 32 TFR U,Y
0305 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0306 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK
0307 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0308 *
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0311 * UPPER ADDRESS IN X-REG.
0312 * IF HEX ADDRESSES ARE INVALID (V)=1.
0313 *
0314 F8FD 17 03 0B MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0315 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0316 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0317 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0318 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0319 F908 39 EDPRTN RTS ;
0320 *
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0322 * TO EVEN 16 BYTE BOUNDRIES.
0323 *
0324 * IF LOWER ADDR = $4532
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0326 *
0327 * IF UPPER ADDR = $4567
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0329 *
0330 * ENTER WITH LOWER ADDRESS IN X-REG.
0331 * -UPPER ADDRESS ON TOP OF STACK.
0332 *
0333 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0334 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0335 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0336 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0337 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0338 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0339 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0340 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0341 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0342 F91C 17 03 9A LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0343 F91F 27 03 BEQ EDUMP
0344 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0345 F923 39 RTS ;
0346 *
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0349 *
0350 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0351 F926 8E FE B7 LDX #MSG5 POINT TO MSG " - "
0352 F929 17 01 EE LBSR PSTRNG PRINT MSG
0353 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0354 F92E 17 03 2E LBSR OUT4H PRINT THE ADDRESS
0355 F931 17 03 96 LBSR OUT2S 2 SPACES
0356 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0357 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0358 F938 17 03 2C LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0359 F93B 17 03 8E LBSR OUT1S OUTPUT SPACE
0360 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT
0361 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0362 *
0363 * PRINT 16 ASCII CHARACTERS
0364 * IF NOT PRINTABLE OR NOT VALID
0365 * ASCII PRINT A PERIOD (.)
0366 F941 17 03 86 LBSR OUT2S 2 SPACES
0367 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0368 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0369 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0370 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0371 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0372 F94E 81 7E CMPA #$7E IS IT VALID ASCII?
0373 F950 23 02 BLS PRASC IF SO PRINT IT
0374 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0375 F954 17 03 77 PRASC LBSR OUTCH PRINT ASCII CHARACTER
0376 F957 5A DECB DECREMENT COUNT
0377 F958 26 EE BNE EDPASC
0378 F95A 20 BC BRA NXTLIN
0379 *
0380 ***** "B" SET BREAKPOINT *****
0381 *
0382 F95C 17 02 B7 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0383 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0384 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0385 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0386 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0387 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0388 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0389 F96D 35 10 PULS X POP BP ADDRESS FROM STACK
0390 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0391 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0392 F973 81 3F CMPA #$3F IS IT A SWI?
0393 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0394 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0395 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0396 F97B 86 3F LDA #$3F LOAD A SWI ($3F)
0397 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0398 F97F 39 EXITBP RTS ;
0399 *
0400 * INDICATE ERROR SETTING BREAKPOINT
0401 *
0402 F980 17 03 49 BPERR LBSR OUT1S OUTPUT SPACE
0403 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0404 F985 16 03 46 LBRA OUTCH PRINT "?"
0405 *
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0407 *
0408 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0409 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0410 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0411 F990 5A DECB $FAAC DECREMENT BP COUNTER
0412 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0413 F993 39 RTS
0414 *
0415 ***** SWI ENTRY POINT *****
0416 *
0417 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0418 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0419 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0420 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0421 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0422 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0423 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0424 F9A2 17 02 48 REGPR LBSR REGSTR GO PRINT REGISTERS
0425 *
0426 IFD TRAOPT
0427 LDX #0
0428 STX TRACNT
0429 ENDIF TRAOPT
0429 ENDIF TRAOPT
0430 *
0431 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0432 *
0433 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0434 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0435 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0436 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS
0437 F9B1 81 3F CMPA #$3F IS IT SWI?
0438 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0439 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0440 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0441 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0442 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0443 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0444 F9BF A7 A0 STA ,Y+
0445 F9C1 39 RTS
0446 *
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0448 *
0449 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0450 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0451 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0452 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0453 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0454 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0455 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0456 F9D1 39 RTS ;
0457 *
0458 *
0459 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0460 F9D4 39 RTS
0461 *
0462 IFD TRAOPT
0463 *
0464 ** TRACE from address AAAA BB bytes
0465 *
0466 TRACE LBSR ALTPC1 SET UP NEW PC
0467 BVS TREXIT ADDRESS ERROR, EXIT
0468 LBSR OUT1S
0469 LBSR IN1ADR Fetch Byte Count
0470 BVS TREXIT Byte Count error, EXIT
0471 STX TRACNT
0472 *
0473 LDX NMI Save NMI Vector
0474 STX NMISAV
0475 LDX #NMIE Set up NMI for Tracing
0476 STX NMI
0477 LBSR TRAINZ Initialise Hardware
0478 BRA TRACEG Start Trace
0479 TREXIT RTS
0480 *
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0482 * CRA1 = 1 CA1 Rising edge IRQ
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0485 * CRA4 = 1 ] CA2 = Set/Reset output
0486 * CRA5 = 1 ]
0487 * CRA6 = X CA2 Input Interrupt Flag
0488 * CRA7 = X CA1 Interrupt Flag
0489 *
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0491 * CRB1 = 1 CB1 Rising edge IRQ
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0494 * CRB4 = 1 ] CB2 = Set/Reset output
0495 * CRB5 = 1 ]
0496 * CRB6 = X CB2 Input Interrupt Flag
0497 * CRB7 = X CB1 Interrupt Flag
0498 *
0499 *
0500 ** TRACE NMI ENTRY POINT
0501 *
0502 NMIE TFR S,U
0503 LDA #$36 Disable Interrupt, CA2 Low
0504 STA TACTRL
0505 LDA TADATA Clear Interrupt flag by reading data port
0506 *
0507 LBSR REGSTR DUMP REGISTERS
0508 *
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0510 LDA ,X
0511 CMPA #$3F
0512 BEQ TRACEX EXIT ON SWI
0513 *
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR
0516 LEAX -1,X DECREMENT TRACE COUNT
0517 STX TRACNT
0518 *
0519 ** TRACE GO (RESUME SINGLE STEP)
0520 *
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0523 STA TADATA
0524 LDA #$36 LOAD STROBE LOW
0525 STA TACTRL
0526 LDA TADATA CLEAR INTERRUPT
0527 LDA #$36 RELEASE RESET
0528 STA TBCTRL
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0530 STA TACTRL
0531 RTI GO EXECUTE INSTRUCTION
0532 *
0533 TRACEX LDX NMISAV Restore NMI vector
0534 STX NMI
0535 LBRA NEXTCMD Jump back to the command loop.
0536 *
0537 ** TRACE HARDWARE INITIALISATION
0538 *
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0540 STA TACTRL
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0542 STA TBCTRL
0543 LDA #$FF PORTA = OUTPUT
0544 STA TADATA
0545 LDA #$00 PORTB = INPUT
0546 STA TBDATA
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0548 STA TACTRL
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0550 STA TBCTRL
0551 RTS
0552 *
0553 ENDIF TRAOPT
0553 ENDIF TRAOPT
0554 IFD MFDCOPT
0555 *
0556 ** "U" MINI DISK BOOT
0557 *
0558 MINBOOT TST CMDFDC
0559 CLR DRVFDC
0560 LDX #$0000
0561 LOOP LEAX $01,X
0562 CMPX #$0000
0563 BNE LOOP
0564 LDA #$0F
0565 STA CMDFDC
0566 BSR DELAY
0567 LOOP1 LDB CMDFDC
0568 BITB #$01
0569 BNE LOOP1
0570 LDA #$01
0571 STA SECFDC
0572 BSR DELAY
0573 LDA #$8C
0574 STA CMDFDC
0575 BSR DELAY
0576 LDX #$C000
0577 BRA LOOP3
0578 LOOP2 BITB #$02
0579 BEQ LOOP3
0580 LDA DATFDC
0581 STA ,X+
0582 LOOP3 LDB CMDFDC
0583 BITB #$01
0584 BNE LOOP2
0585 BITB #$2C
0586 BEQ LOOP4
0587 RTS
0588 *
0589 LOOP4 LDX #$C000
0590 STX $0A,U
0591 TFR U,S
0592 RTI
0593 *
0594 DELAY LDB #$04
0595 LOOP5 DECB
0596 BNE LOOP5
0597 RTS
0598 ENDIF MFDCOPT
0598 ENDIF MFDCOPT
0599 *
0600 IFD DMAFOPT
0601 *
0602 *** "D" DISK BOOT FOR DMAF2 ***
0603 *
0604 DBOOT LDA #$DE
0605 STA DRVREG
0606 LDA #$FF
0607 STA PRIREG $FAF8
0608 STA CCREG
0609 STA AAAREG
0610 STA BBBREG
0611 TST CCREG
0612 LDA #$D8
0613 STA COMREG
0614 LBSR DLY
0615 DBOOT0 LDA COMREG
0616 BMI DBOOT0
0617 LDA #$09
0618 STA COMREG
0619 LBSR DLY
0620 *
0621 DISKWT LDA COMREG FETCH DRIVE STATUS
0622 BITA #1 TEST BUSY BIT
0623 BNE DISKWT LOOP UNTIL NOT BUSY
0624 *
0625 BITA #$10
0626 BNE DBOOT
0627 *
0628 LDX #$C000 LOGICAL ADDR. = $C000
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0630 ORA #$10
0631 STA CCCREG
0632 TFR X,D
0633 COMA ;
0634 COMB ;
0635 STD ADDREG
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100
0637 STX CNTREG STORE IN COUNT REGISTER
0638 LDA #$FF LOAD THE CHANNEL REGISTER
0639 STA CCREG
0640 LDA #$FE SET CHANNEL 0
0641 STA PRIREG
0642 LDA #1 SET SECTOR TO "1"
0643 STA SECREG ISSUE COMMAND
0644 LDA #$8C SET SINGLE SECTOR READ
0645 STA COMREG ISSUE COMMAND
0646 BSR DLY
0647 *
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0652 * IS STILL A ONE THE BOOT OPERATION WILL
0653 * BE STARTED OVER FROM THE BEGINING.
0654 *
0655 CLRB ;
0656 DBOOT1 PSHS B $FB55
0657 CLRB ;
0658 DBOOT2 TST CCREG
0659 BPL DBOOT3
0660 DECB ;
0661 BNE DBOOT2
0662 PULS B
0663 DECB
0664 BNE DBOOT1
0665 BRA DBOOT
0666 DBOOT3 PULS B
0667 LDA COMREG
0668 BITA #$1C
0669 BEQ DBOOT4
0670 RTS ;
0671 *
0672 *
0673 DBOOT4 LDB #$DE
0674 STB DRVREG
0675 LDX #$C000
0676 STX 10,U
0677 TFR U,S $FB7B
0678 RTI ;
0679 ENDIF DMAFOPT
0679 ENDIF DMAFOPT
0680 *
0681 IFD CF8OPT
0682 *
0683 * COMPACT FLASH BOOT
0684 *
0685 F9D5 8D 40 CFBOOT BSR WAITRDY
0686 F9D7 86 E0 LDA #HEADLBA
0687 F9D9 B7 E0 46 STA CF_HEAD
0688 F9DC 8D 39 BSR WAITRDY
0689 F9DE 86 01 LDA #FEAT8BIT
0690 F9E0 B7 E0 41 STA CF_FEATURE
0691 F9E3 86 EF LDA #CMDFEATURE
0692 F9E5 B7 E0 47 STA CF_COMAND
0693 F9E8 8D 2D BSR WAITRDY
0694 *
0695 * READ SECTORS FROM CF
0696 *
0697 F9EA 86 01 CFREAD LDA #$01
0698 F9EC B7 E0 42 STA CF_SECCNT
0699 F9EF 4F CLRA
0700 F9F0 B7 E0 43 STA CF_SECNUM
0701 F9F3 B7 E0 44 STA CF_CYLLO
0702 F9F6 B7 E0 45 STA CF_CYLHI
0703 *
0704 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE
0705 F9FB B7 E0 47 STA CF_COMAND
0706 F9FE 8D 17 BSR WAITRDY
0707 FA00 8E C0 00 LDX #$C000
0708 *
0709 * READ LOOP
0710 *
0711 FA03 8D 21 RDLOOP BSR WAITDRQ
0712 FA05 B6 E0 40 LDA CF_DATA
0713 FA08 A7 80 STA ,X+
0714 FA0A 8C C2 00 CMPX #$C200
0715 FA0D 26 F4 BNE RDLOOP
0716 *
0717 FA0F 8E C0 00 LDX #$C000
0718 FA12 AF 4A STX $0A,U
0719 FA14 1F 34 TFR U,S
0720 FA16 3B RTI
0721 *
0722 * WAIT UNTIL READY
0723 *
0724 FA17 B6 E0 47 WAITRDY LDA CF_STATUS
0725 FA1A 85 80 BITA #BUSY
0726 FA1C 26 F9 BNE WAITRDY
0727 FA1E B6 E0 47 LDA CF_STATUS
0728 FA21 85 40 BITA #DRDY
0729 FA23 27 F2 BEQ WAITRDY
0730 FA25 39 RTS
0731 *
0732 * WAIT FOR DATA REQUEST
0733 *
0734 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS
0735 FA29 85 08 BITA #DRQ
0736 FA2B 27 F9 BEQ WAITDRQ
0737 FA2D 39 RTS
0738 ENDIF CF8OPT
0739 *
0740 IFD IDEOPT
0741 *
0742 * XESS 16 BIT IDE BOOT
0743 *
0744 IDEBOOT LDD #AUXRESET
0745 STD CF_AUX
0746 LDD #AUXRSTREL
0747 STD CF_AUX
0748 LDD #HEADLBA
0749 STD CF_HEAD
0750 BSR WAITRDY
0751 *
0752 * READ SECTORS FROM CF
0753 *
0754 LDD #$01
0755 STD CF_SECCNT
0756 CLRB
0757 STD CF_SECNUM
0758 STD CF_CYLLO
0759 STD CF_CYLHI
0760 *
0761 LDB #CMDREAD ; IDE READ MULTIPLE
0762 STD CF_COMAND
0763 BSR WAITRDY
0764 LDX #$C000
0765 *
0766 * READ LOOP
0767 *
0768 RDLOOP BSR WAITDRQ
0769 LDD CF_DATA
0770 STB ,X+
0771 CMPX #$C100
0772 BNE RDLOOP
0773 *
0774 LDX #$C000
0775 STX $0A,U
0776 TFR U,S
0777 RTI
0778 *
0779 * WAIT UNTIL READY
0780 *
0781 WAITRDY LDD CF_STATUS
0782 BITB #BUSY
0783 BNE WAITRDY
0784 LDD CF_STATUS
0785 BITB #DRDY
0786 BEQ WAITRDY
0787 RTS
0788 *
0789 * WAIT FOR DATA REQUEST
0790 *
0791 WAITDRQ LDD CF_STATUS
0792 BITB #DRQ
0793 BEQ WAITDRQ
0794 RTS
0795 ENDIF IDEOPT
0795 ENDIF IDEOPT
0796 *
0797 IFD RTCOPT
0798 *
0799 * CLOCK INTER FACE UTILITY
0800 *
0801 * TIME <Hours> <Minuits> <Seconds>
0802 * If no argument is specified, the current time
0803 * will be displayed.
0804 *
0805 * READ A REGISTER FROM THE COUNTER.
0806 * The X Index rgister points to the register
0807 * to be read. The Status Register is checked
0808 * before and after the register is read before
0809 * returning a value in accumulator A
0810 *
0811 RDCLK TST CLKSTA
0812 BNE RDCLK
0813 RDCLK1 LDA 0,X
0814 TST CLKSTA
0815 BNE RDCLK1
0816 RTS
0817 *
0818 * MAIN PROGRAM:
0819 *
0820 TIMSET LDX #COUNTR POINT TO TIMER
0821 LBSR BYTE READ HOURS
0822 BVS SHOWTM NO ARG, DISP TIME
0823 STA HOUR,X
0824 LBSR OUT1S
0825 LBSR BYTE READ MINUITES
0826 BVS SHOWTM
0827 STA MINUIT,X
0828 LBSR OUT1S
0829 LBSR BYTE SECONDS.
0830 BVS SHOWTM
0831 STA SECOND,X
0832 *
0833 * DISPLAY CURRENT TIME
0834 *
0835 SHOWTM LBSR PCRLF
0836 LDX #COUNTR+HOUR
0837 LDB #3
0838 SHOWLP BSR RDCLK
0839 LBSR OUT2H
0840 LDA #':
0841 LBSR OUTCH
0842 LEAX -1,X
0843 DECB
0844 BNE SHOWLP
0845 RTS
0846 *
0847 * INITIATE CLOCK.
0848 * MASK INTERRUPTS.
0849 *
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
0851 TST CINTSR CLEAR ANY INTERRUPTS
0852 RTS
0853 ENDIF RTCOPT
0853 ENDIF RTCOPT
0854 IFD DATOPT
0855 *
0856 ***** LRA LOAD REAL ADDRESS *****
0857 *
0858 * THE FOLLOWING CODE LOADS THE 20-BIT
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE
0860 * INTO THE "A" AND "X" REGISTERS. THIS
0861 * ROUTINE IS ENTERED WITH THE LOGICAL
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0863 * REGISTER. EXIT IS MADE WITH THE HIGH-
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0865 * ADDRESS IN THE "A" REGISTER, AND THE
0866 * LOW-ORDER 16-BITS OF THE 20-BIT
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0868 * ALL OTHER REGISTERS ARE PRESERVED.
0869 * THIS ROUTINE IS REQUIRED SINCE THE
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0871 * PRESENT PHYSICAL ADDRESSES ON THE
0872 * SYSTEM BUS.
0873 *
0874 FA2E 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
0875 FA30 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
0876 FA32 44 LSRA ;
0877 FA33 44 LSRA ADJ FOR INDEXED INTO
0878 FA34 44 LSRA CORRESPONDING LOCATION
0879 FA35 44 LSRA IN LRA TABLE
0880 FA36 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
0881 FA3A E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
0882 FA3C 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
0883 FA3D 54 LSRB PHYSICAL ADDRESS.
0884 FA3E 54 LSRB EXTENDED MS 4-BITS ARE RETURNED
0885 FA3F 54 LSRB IN THE "A" ACCUMULATOR
0886 FA40 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
0887 FA42 E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
0888 FA44 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0889 FA45 58 ASLB ADJ DATA FOR RELOCATION IN X REG
0890 FA46 58 ASLB ;
0891 FA47 58 ASLB $FB97
0892 FA48 58 ASLB ;
0893 FA49 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
0894 FA4B 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
0895 FA4D A7 62 STA 2,S SAVE IT IN X REG ON STACK
0896 FA4F EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
0897 *
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0899 FA51 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
0900 * ON STACK
0901 FA53 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK
0902 ENDIF DATOPT
0903 *
0904 * DELAY LOOP
0905 *
0906 FA55 34 04 DLY PSHS B SAVE CONTENTS OF "B"
0907 FA57 C6 20 LDB #$20 GET LOOP DELAY VALUE
0908 FA59 5A SUB1 DECB SUBTRACT ONE FROM VALUE
0909 FA5A 26 FD BNE SUB1 LOOP UNTIL ZERO
0910 FA5C 35 84 PULS B,PC RESTORE CONTENTS OF "B"
0911 * RTS ;
0912 *
0913 ***** "L" LOAD MIKBUG TAPE *****
0914 *
0915 FA5E BD FC E3 LOAD JSR ACINIZ
0916 FA61 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
0917 FA63 17 02 68 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
0918 FA66 7F DF E2 CLR ECHO TURN OFF ECHO FLAG
0919 FA69 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
0920 FA6C 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
0921 FA6E 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
0922 FA70 17 02 23 LBSR ECHON
0923 FA73 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
0924 FA75 27 3D BEQ LOAD21 IF SO, EXIT LOAD
0925 FA77 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
0926 FA79 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
0927 FA7B 17 01 A8 LBSR BYTE INPUT BYTE COUNT
0928 FA7E 34 02 PSHS A PUSH COUNT ON STACK
0929 FA80 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
0930 FA82 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
0931 FA85 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
0932 FA87 34 10 PSHS X PUSH ADDR ON STACK
0933 FA89 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
0934 FA8B EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
0935 FA8D EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
0936 FA8F 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
0937 FA91 6A E4 DEC ,S ADDRESS BYTES.
0938 FA93 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
0939 FA95 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
0940 FA98 35 04 PULS B POP CHECKSUM FROM STACK
0941 FA9A 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
0942 FA9C 34 02 PSHS A PUSH DATA BYTE ON STACK
0943 FA9E EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
0944 FAA0 6A E4 DEC ,S DECREMENT BYTE COUNT 1
0945 FAA2 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
0946 FAA4 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
0947 FAA6 20 EB BRA LOAD10 GET NEXT DATA BYTE
0948 FAA8 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
0949 FAA9 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
0950 FAAB C1 FF CMPB #$FF CHECKSUM OK?
0951 FAAD 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
0952 FAAF 86 3F LDA #'? LOAD (?) ERROR INDICATOR
0953 FAB1 17 02 1A LBSR OUTCH OUTPUT IT TO TERMINAL
0954 FAB4 73 DF E2 LOAD21 COM ECHO TURN ECHO ON
0955 FAB7 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
0956 FAB9 16 02 12 LBRA OUTCH OUTPUT IT
0957 *
0958 ***** "P" PUNCH MIKBUG TAPE *****
0959 *
0960 FABC 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
0961 FABE 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
0962 FAC1 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
0963 FAC3 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
0964 FAC5 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
0965 FAC7 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
0966 FAC9 30 01 LEAX 1,X INCREMENT END ADDRESS
0967 FACB AF E4 STX ,S STORE END ADDR ON STACK
0968 FACD BD FC E3 JSR ACINIZ
0969 FAD0 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
0970 FAD2 17 01 F9 LBSR OUTCH OUTPUT IT TO TERMINAL
0971 FAD5 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
0972 FAD7 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
0973 FAD9 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
0974 FADB 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
0975 FADF 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
0976 FAE1 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
0977 FAE3 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
0978 FAE5 8E FE F8 LDX #MSG20 POINT TO MSG "S1"
0979 FAE8 17 00 2F LBSR PSTRNG PRINT MSG
0980 FAEB CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
0981 FAED 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
0982 FAEF 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
0983 FAF2 AE 62 LDX 2,S LOAD BEGIN ADDRESS
0984 FAF4 17 01 68 LBSR OUT4H PUNCH ADDRESS
0985 FAF7 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
0986 FAF9 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
0987 FAFB EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
0988 FAFD A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
0989 FAFF 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
0990 FB02 6A 64 DEC 4,S DECREMENT BYTE COUNT
0991 FB04 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
0992 FB06 53 COMB 1's COMPLIMENT CHECKSUM BYTE
0993 FB07 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
0994 FB09 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
0995 FB0C AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
0996 FB0E AC E4 CMPX ,S COMPARE IT TO END ADDR
0997 FB10 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
0998 FB12 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
0999 FB14 17 01 B7 LBSR OUTCH OUTPUT IT
1000 FB17 32 65 LEAS 5,S READJUST STACK POINTER
1001 FB19 39 RTS ;
1002 *
1003 * PRINT STRING PRECEEDED BY A CR & LF.
1004 *
1005 FB1A 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1006 FB1C 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1007 *
1008 * PCRLF
1009 *
1010 FB1E 34 10 PCRLF PSHS X SAVE IX
1011 FB20 8E FE A9 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1012 FB23 17 00 69 LBSR PDATA PRINT MSG
1013 FB26 35 90 PULS X,PC RESTORE IX & RETURN
1014 *
1015 * LONG BRANCHES TO COMMON ROUTINES
1016 *
1017 FB28 16 01 A1 JOUT1S LBRA OUT1S
1018 FB2B 16 00 F8 JBYTE LBRA BYTE
1019 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR
1020 *
1021 * ALTER "PC" PROGRAM COUNTER
1022 *
1023 FB31 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1024 FB34 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1025 FB36 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1026 FB38 29 02 BVS ALTPCD EXIT IF INVALID HEX
1027 FB3A AF 4A STX 10,U POKE IN NEW CONTENTS
1028 FB3C 39 ALTPCD RTS ;
1029 *
1030 * ALTER "U" USER STACK POINTER
1031 *
1032 FB3D 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1033 FB3F 8D E7 BSR JOUT1S OUTPUT SPACE
1034 FB41 8D EB BSR JIN1ADR
1035 FB43 29 02 BVS ALTUD
1036 FB45 AF 48 STX 8,U
1037 FB47 39 ALTUD RTS ;
1038 *
1039 * ALTER "Y" INDEX REGISTER
1040 *
1041 FB48 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1042 FB4A 8D DC BSR JOUT1S OUTPUT SPACE
1043 FB4C 8D E0 BSR JIN1ADR
1044 FB4E 29 02 BVS ALTYD
1045 FB50 AF 46 STX 6,U $F8F0
1046 FB52 39 ALTYD RTS ;
1047 *
1048 * ALTER "X" INDEX REGISTER
1049 *
1050 FB53 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1051 FB55 8D D1 BSR JOUT1S OUTPUT SPACE
1052 FB57 8D D5 BSR JIN1ADR
1053 FB59 29 02 BVS ALTXD
1054 FB5B AF 44 STX 4,U
1055 FB5D 39 ALTXD RTS ;
1056 *
1057 * ALTER "DP" DIRECT PAGE REGISTER
1058 *
1059 FB5E 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1060 FB60 8D C6 BSR JOUT1S OUTPUT SPACE
1061 FB62 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1062 FB64 29 02 BVS ALTDPD
1063 FB66 A7 43 STA 3,U
1064 FB68 39 ALTDPD RTS ;
1065 *
1066 * ALTER "B" ACCUMULATOR
1067 *
1068 FB69 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1069 FB6B 8D BB BSR JOUT1S OUTPUT SPACE
1070 FB6D 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1071 FB6F 29 02 BVS ALTBD
1072 FB71 A7 42 STA 2,U
1073 FB73 39 ALTBD RTS $F91C
1074 *
1075 * ALTER "A" ACCUMULATOR
1076 *
1077 FB74 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1078 FB76 8D B0 BSR JOUT1S OUTPUT SPACE
1079 FB78 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1080 FB7A 29 02 BVS ALTAD
1081 FB7C A7 41 STA 1,U
1082 FB7E 39 ALTAD RTS ;
1083 *
1084 * ALTER "CC" REGISTER
1085 *
1086 FB7F 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1087 FB81 8D A5 BSR JOUT1S OUTPUT SPACE
1088 FB83 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1089 FB85 29 04 BVS ALTCCD
1090 FB87 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1091 FB89 A7 C4 STA ,U
1092 FB8B 39 ALTCCD RTS ;
1093 *
1094 * PDATA
1095 *
1096 FB8C 17 01 3F PRINT LBSR OUTCH
1097 FB8F A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1098 FB91 81 04 CMPA #4 IS IT EOT?
1099 FB93 26 F7 BNE PRINT IF NOT EOT PRINT IT
1100 FB95 39 RTS ;
1101 *
1102 * PRINT REGISTERS
1103 *
1104 FB96 8E FE BB PRTSP LDX #MSG10 POINT TO MSG "SP="
1105 FB99 8D F4 BSR PDATA PRINT MSG
1106 FB9B 1F 31 TFR U,X
1107 FB9D 16 00 BF JOUT4H LBRA OUT4H
1108 *
1109 FBA0 8E FE C7 PRTUS LDX #MSG12 POINT TO MSG "US="
1110 FBA3 8D EA BSR PDATA PRINT MSG
1111 FBA5 AE 48 LDX 8,U
1112 FBA7 20 F4 BRA JOUT4H
1113 *
1114 FBA9 8E FE D9 PRTDP LDX #MSG15 POINT TO MSG "DP="
1115 FBAC 8D E1 BSR PDATA PRINT MSG
1116 FBAE A6 43 LDA 3,U
1117 FBB0 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1118 *
1119 FBB3 8E FE D3 PRTIX LDX #MSG14 POINT TO MSG "IX="
1120 FBB6 8D D7 BSR PDATA PRINT MSG
1121 FBB8 AE 44 LDX 4,U $FCE6
1122 FBBA 20 E1 BRA JOUT4H
1123 *
1124 FBBC 8E FE CD PRTIY LDX #MSG13 POINT TO MSG "IY="
1125 FBBF 8D CE BSR PDATA PRINT MSG
1126 FBC1 AE 46 LDX 6,U
1127 FBC3 20 D8 BRA JOUT4H
1128 *
1129 FBC5 8E FE C1 PRTPC LDX #MSG11 POINT TO MSG "PC="
1130 FBC8 8D C5 BSR PDATA PRINT MSG
1131 FBCA AE 4A LDX 10,U
1132 FBCC 20 CF BRA JOUT4H
1133 *
1134 FBCE 8E FE DF PRTA LDX #MSG16 POINT TO MSG "A="
1135 FBD1 8D BC BSR PDATA PRINT MSG
1136 FBD3 A6 41 LDA 1,U
1137 FBD5 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1138 *
1139 FBD7 8E FE E4 PRTB LDX #MSG17 POINT TO MSG "B="
1140 FBDA 8D B3 BSR PDATA PRINT MSG
1141 FBDC A6 42 LDA 2,U
1142 FBDE 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1143 *
1144 FBE0 8E FE E9 PRTCC LDX #MSG18 POINT TO MSG "CC:"
1145 FBE3 8D AA BSR PDATA PRINT MSG
1146 FBE5 A6 C4 LDA ,U
1147 FBE7 8E FE F0 LDX #MSG19 POINT TO MSG "EFHINZVC"
1148 FBEA 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1149 *
1150 * "R" DISPLAY REGISTERS
1151 *
1152 FBED 8E FE B7 REGSTR LDX #MSG5 POINT TO MSG " - "
1153 FBF0 17 FF 27 LBSR PSTRNG PRINT MSG
1154 FBF3 8D A1 BSR PRTSP $FCBF
1155 FBF5 8D A9 BSR PRTUS $FCCA
1156 FBF7 8D B0 BSR PRTDP $FCD5
1157 FBF9 8D B8 BSR PRTIX $FCE0
1158 FBFB 8D BF BSR PRTIY $FCEB
1159 FBFD 8E FE B7 LDX #MSG5 POINT TO MSG " - "
1160 FC00 17 FF 17 LBSR PSTRNG PRINT MSG
1161 FC03 8D C0 BSR PRTPC $FCF5
1162 FC05 8D C7 BSR PRTA $FCFF
1163 FC07 8D CE BSR PRTB $FD09
1164 FC09 20 D5 BRA PRTCC $FD13
1165 *
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1171 * ADDRESS IS INPUT.
1172 *
1173 FC0B 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1174 FC0D 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1175 FC0F 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1176 FC11 86 2D LDA #'-
1177 FC13 17 00 B8 LBSR OUTCH PRINT " - "
1178 *
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1182 *
1183 FC16 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1184 FC18 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1185 FC1A 1F 01 TFR D,X
1186 FC1C 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1187 FC1E 29 3C BVS NOTHEX
1188 FC20 34 10 PSHS X
1189 FC22 A7 61 STA 1,S
1190 FC24 35 90 PULS X,PC
1191 *
1192 ***** INPUT BYTE (2 HEX CHAR.) *****
1193 *
1194 FC26 8D 11 BYTE BSR INHEX GET HEX LEFT
1195 FC28 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1196 FC2A 48 ASLA ;
1197 FC2B 48 ASLA ;
1198 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE
1199 FC2D 48 ASLA ;
1200 FC2E 1F 89 TFR A,B PUT HEXL IN "B"
1201 FC30 8D 07 BSR INHEX GET HEX RIGHT
1202 FC32 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1203 FC34 34 04 PSHS B PUSH HEXL ON STACK
1204 FC36 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1205 FC38 39 RTS RETURN WITH HEX L&R IN "A"
1206 *
1207 *
1208 FC39 8D 5B INHEX BSR ECHON INPUT ASCII CHAR.
1209 FC3B 81 30 CMPA #'0 IS IT > OR = "0" ?
1210 FC3D 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1211 FC3F 81 39 CMPA #'9 IS IT < OR = "9" ?
1212 FC41 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1213 FC43 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1214 FC45 39 RTS ;
1215 *
1216 *
1217 FC46 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1218 FC48 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1219 FC4A 81 46 CMPA #'F IS IT < OR = "F" ?
1220 FC4C 22 03 BHI INHEXL IF > IT AIN'T HEX
1221 FC4E 80 37 SUBA #$37 ASCII ADJ. ALPHA
1222 FC50 39 RTS ;
1223 *
1224 FC51 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1225 FC53 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1226 FC55 81 66 CMPA #'f IS IT < "f"
1227 FC57 22 03 BHI NOTHEX IF > IT AIN'T HEX
1228 FC59 80 57 SUBA #$57 ADJUST TO LOWER CASE
1229 FC5B 39 RTS ;
1230 *
1231 *
1232 FC5C 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1233 FC5E 39 RTS ;
1234 *
1235 *
1236 FC5F 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1237 FC61 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1238 FC63 8D 02 BSR OUTHL OUTPUT HEX LEFT
1239 FC65 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1240 FC67 OUTHL EQU *
1241 FC67 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1242 FC69 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1243 FC6A 44 LSRA ;
1244 FC6B 44 LSRA ;
1245 FC6C 44 LSRA ;
1246 FC6D 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1247 FC6F 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1248 FC71 84 0F ANDA #$0F STRIP LEFT NIBBLE
1249 FC73 8B 30 XASCII ADDA #$30 ASCII ADJ
1250 FC75 81 39 CMPA #$39 IS IT < OR = "9" ?
1251 FC77 2F 02 BLE OUTC IF LESS, OUTPUT IT
1252 FC79 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1253 FC7B 20 51 OUTC BRA OUTCH OUTPUT CHAR
1254 *
1255 * BINARY / ASCII --- THIS ROUTINE
1256 * OUTPUTS A BYTE IN ENHANCED
1257 * BINARY FORMAT. THE ENHANCEMENT
1258 * IS DONE BY SUBSTITUTING ASCII
1259 * LETTERS FOR THE ONES IN THE BYTE.
1260 * THE ASCII ENHANCEMENT LETTERS
1261 * ARE OBTAINED FROM THE STRING
1262 * POINTED TO BY THE INDEX REG. "X".
1263 *
1264 FC7D 34 02 BIASCI PSHS A SAVE "A" ON STACK
1265 FC7F C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1266 FC81 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1267 FC83 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1268 FC85 25 02 BCS PRTBA IF ONE PRINT LETTER
1269 FC87 86 2D LDA #'- IF ZERO PRINT "-"
1270 FC89 8D 43 PRTBA BSR OUTCH PRINT IT
1271 FC8B 8D 3F BSR OUT1S PRINT SPACE
1272 FC8D 5A DECB SUB 1 FROM #BITS YET TO PRINT
1273 FC8E 26 F1 BNE OUTBA
1274 FC90 35 82 PULS A,PC
1275 *
1276 IFD EXTOPT
1277 *
1278 * EXTENDED USER COMMANDS
1279 *
1280 FC92 6E 9F F0 00 USRCMD JMP [MONEXT+EXTCMD]
1281 ENDIF EXTOPT
1282 *
1283 *
1284 FC96 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ?
1285 FC99 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1286 *
1287 * INCHE
1288 *
1289 * ---GETS CHARACTER FROM TERMINAL AND
1290 * ECHOS SAME. THE CHARACTER IS RETURNED
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY
1292 * BIT MASKED OFF. ALL OTHER REGISTERS
1293 * ARE PRESERVED.
1294 *
1295 FC9B 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1296 FC9D 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1297 FC9F 20 2D BRA OUTCH ECHO CHAR TO TERMINAL
1298 *
1299 * INCH
1300 *
1301 * GET CHARACTER FROM TERMINAL. RETURN
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1304 * IS 8 BITS AND IS NOT ECHOED.
1305 *
1306 *
1307 FCA1 34 10 INCH PSHS X SAVE IX
1308 FCA3 BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1309 FCA6 A6 84 LDA ,X FETCH PORT STATUS
1310 FCA8 85 01 BITA #1 TEST READY BIT, RDRF ?
1311 IFD PS2OPT
1312 FCAA 26 09 BNE GETST1
1313 FCAC 8E E0 20 LDX #PS2KBD
1314 FCAF A6 84 LDA ,X
1315 FCB1 85 01 BITA #1
1316 ENDIF PS2OPT
1317 FCB3 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1318 FCB5 A6 01 GETST1 LDA 1,X FETCH CHAR
1319 FCB7 35 90 PULS X,PC RESTORE IX
1320 *
1321 * INCHEK
1322 *
1323 * CHECK FOR A CHARACTER AVAILABLE FROM
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1325 * FOR READ READY. ALL REGISTERS ARE
1326 * PRESERVED, AND THE "Z" BIT WILL BE
1327 * CLEAR IF A CHARACTER CAN BE READ.
1328 *
1329 *
1330 FCB9 34 02 INCHEK PSHS A SAVE A ACCUM.
1331 FCBB A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS
1332 FCBF 85 01 BITA #1 TEST READY BIT, RDRF ?
1333 IFD PS2OPT
1334 FCC1 26 05 BNE INCHEK1
1335 FCC3 B6 E0 20 LDA PS2KBD
1336 FCC6 85 01 BITA #1 TEST READY BIT< RDRF ?
1337 ENDIF PS2OPT
1338 FCC8 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1339 *
1340 FCCA 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1341 FCCC 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1342 *
1343 *
1344 * OUTCH
1345 *
1346 * OUTPUT CHARACTER TO TERMINAL.
1347 * THE CHAR. TO BE OUTPUT IS
1348 * PASSED IN THE A REGISTER.
1349 * ALL REGISTERS ARE PRESERVED.
1350 *
1351 OUTCH IFD VDUOPT
1352 FCCE 8D 45 BSR VOUTCH
1353 ENDIF VDUOPT
1354 IFD DG640OPT
1355 BSR VOUTCH
1356 ENDIF DG640OPT
1356 ENDIF DG640OPT
1357 FCD0 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1358 FCD2 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL
1359 FCD5 A6 84 FETSTA LDA ,X FETCH PORT STATUS
1360 FCD7 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1361 FCD9 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1362 FCDB 35 02 PULS A GET CHAR. FOR XMIT
1363 FCDD A7 01 STA 1,X XMIT CHAR.
1364 FCDF 35 90 PULS X,PC RESTORE IX
1365 *
1366 * IO INITIALIZATION
1367 *
1368 FCE1 IOINIZ EQU *
1369 IFD VDUOPT
1370 FCE1 8D 13 BSR VINIZ
1371 ENDIF VDUOPT
1372 IFD DG640OPT
1373 BSR VINIZ
1374 ENDIF DG640OPT
1374 ENDIF DG640OPT
1375 FCE3 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1376 FCE6 86 03 LDA #3 RESET ACIA PORT CODE
1377 FCE8 A7 84 STA ,X STORE IN CONTROL REGISTER
1378 FCEA 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1379 FCEC A7 84 STA ,X STORE IN CONTROL REGISTER
1380 FCEE 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1381 FCF0 86 FF LDA #$FF TURN ON ECHO FLAG
1382 FCF2 B7 DF E2 STA ECHO
1383 FCF5 39 RTS
1384 *
1385 IFD VDUOPT
1386 *
1387 ***************************************************
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1389 * *
1390 * 80 x 25 Characters
1391 *
1392 ***************************************************
1393 *
1394 ***************************************************
1395 * INITIALIZE EMULATOR *
1396 ***************************************************
1397 *
1398 FCF6 8E E0 30 VINIZ LDX #VDU
1399 FCF9 CC 00 00 LDD #0
1400 FCFC FD DF FB STD COLADX AND ROWADX
1401 FCFF A7 02 STA VDUCOL,X
1402 FD01 E7 03 STB VDUROW,X
1403 FD03 E7 04 STB VDUOFF,X
1404 FD05 FD DF FD STD NEWROW AND ESCFLG
1405 FD08 C6 02 LDB #$02
1406 FD0A E7 01 STB VDUATT,X
1407 FD0C 7F DF FE CLR ESCFLG
1408 FD0F 86 1B LDA #$1B SEND ESCAPE
1409 FD11 8D 02 BSR VOUTCH
1410 FD13 86 59 LDA #'Y CLEAR TO END OF SCREEN
1411 *
1412 ** VIDEO OUTPUT ROUTINE
1413 *
1414 FD15 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS
1415 FD17 8E E0 30 LDX #VDU POINT TO VDU REGISTERS
1416 *
1417 ** CHECK FOR ESCAPE SEQUENCE
1418 *
1419 FD1A 7D DF FE TST ESCFLG ESCAPE ACTIVE?
1420 FD1D 27 04 BEQ SOROU1 BRANCH IF NOT
1421 FD1F 8D 74 BSR ESCAPE ELSE DO ESCAPE
1422 FD21 20 0D BRA RETURN AND RETURN
1423 *
1424 ** CHECK FOR CONTROL CHARACTERS
1425 *
1426 FD23 81 20 SOROU1 CMPA #$20 CONTROL CODES?
1427 FD25 24 04 BHS SOROU2
1428 FD27 8D 09 BSR CONTRL BRANCH IF SO
1429 FD29 20 05 BRA RETURN
1430 *
1431 ** OUTPUT TEXT CHARACTER
1432 *
1433 FD2B A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1434 FD2D 17 00 C5 LBSR NEWCOL UPDATE COLUMN
1435 *
1436 ** DISPLAY CURSOR AND RETURN
1437 *
1438 FD30 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1439 *
1440 ***************************************************
1441 * CONTROL CODE HANDLERS *
1442 ***************************************************
1443 *
1444 FD32 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1445 FD34 10 27 00 41 LBEQ BACKSP
1446 FD38 81 1B CMPA #$1B ESCAPE SEQUENCE?
1447 FD3A 10 27 00 6C LBEQ SETESC
1448 FD3E 81 1A CMPA #$1A CTRL Z - Clear Screen
1449 FD40 10 27 00 8E LBEQ CLRSCR
1450 FD44 81 16 CMPA #$16 CTRL ^ - Home
1451 FD46 10 27 00 45 LBEQ HOME
1452 FD4A 81 0D CMPA #$D CTRL M - RETURN?
1453 FD4C 10 27 00 99 LBEQ CRETN
1454 FD50 81 0C CMPA #$0C CTRL L - CHAR RIGHT
1455 FD52 10 27 00 2C LBEQ CHRIGHT
1456 FD56 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE
1457 FD58 10 27 00 11 LBEQ LINEUP
1458 FD5C 81 0A CMPA #$0A CTRL J - LINE FEED
1459 FD5E 26 51 BNE RETESC NONE OF THESE, RETURN
1460 *
1461 ***************************************** LINE FEED
1462 *
1463 FD60 FC DF FB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1464 FD63 5C INCB BUMP ROW
1465 FD64 C1 19 CMPB #NUMLIN SCROLL TIME?
1466 FD66 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT
1467 FD6A 16 00 99 LBRA SCROLL ELSE SCROLL IT
1468 *
1469 ***************************************** LINE FEED
1470 *
1471 FD6D FC DF FB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1472 FD70 5D TSTB AT TOP OF SCREEN ?
1473 FD71 10 27 00 3C LBEQ RETESC Yes, Ignore
1474 FD75 5A DECB No, Decrement ROW
1475 FD76 16 00 74 LBRA NEWCUR POSITION CURSOR
1476 *
1477 *********************************** BACK SPACE
1478 *
1479 FD79 B6 DF FB BACKSP LDA COLADX
1480 FD7C 27 33 BEQ RETESC RETURN
1481 FD7E 4A DECA
1482 FD7F 16 00 68 LBRA POSCOL POSITION CURSOR
1483 *
1484 *********************************** CURSOR RIGHT
1485 *
1486 FD82 B6 DF FB CHRIGHT LDA COLADX
1487 FD85 4C INCA
1488 FD86 81 50 CMPA #LINLEN
1489 FD88 10 27 00 25 LBEQ RETESC
1490 FD8C 16 00 5B LBRA POSCOL
1491 *
1492 *********************************** CURSOR RIGHT
1493 *
1494 FD8F CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1495 FD92 16 00 58 LBRA NEWCUR
1496 *
1497 ***************************************************
1498 * ESCAPE HANDLERS *
1499 ***************************************************
1500 *
1501 FD95 F6 DF FE ESCAPE LDAB ESCFLG GET FLAG
1502 FD98 C1 3D CMPB #'= SETTING CURSOR?
1503 FD9A 27 16 BEQ ESCCUR BRANCH IF SO
1504 FD9C 81 59 CMPA #'Y CLEAR TO END OF SCREEN?
1505 FD9E 10 27 00 6E LBEQ ESCCLS
1506 FDA2 81 54 CMPA #'T CLEAR TO END OF LINE?
1507 FDA4 27 31 BEQ ESCCLL
1508 FDA6 81 3D CMPA #'= STARTING CURSOR SET?
1509 FDA8 26 04 BNE CLRESC BRANCH IF NOT
1510 *
1511 ***************************** START ESCAPE SEQUENCE
1512 *
1513 FDAA B7 DF FE SETESC STAA ESCFLG ELSE START CURSORING
1514 FDAD 39 RTS AND RETURN
1515 *
1516 FDAE 7F DF FE CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1517 FDB1 39 RETESC RTS SO RETURN
1518 *
1519 ********************************* SET SCREEN CURSOR
1520 *
1521 FDB2 7D DF FD ESCCUR TST NEWROW ROW SET?
1522 FDB5 26 04 BNE ESCCU1 BRANCH IF SO
1523 FDB7 B7 DF FD STAA NEWROW ELSE SET NEW ROW
1524 FDBA 39 RTS AND RETURN
1525 *
1526 FDBB 7F DF FE ESCCU1 CLR ESCFLG
1527 FDBE 80 20 SUBA #$20 ADJUST COLUMN ADDRESS
1528 FDC0 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1529 FDC2 22 ED BHI RETESC NOT OK, DO NOTHING
1530 *
1531 FDC4 F6 DF FD ESCCU2 LDAB NEWROW
1532 FDC7 7F DF FD CLR NEWROW
1533 FDCA C0 20 SUBB #$20 ADJUST TO ROW ADDRESS
1534 FDCC C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1535 FDCE 22 E1 BHI RETESC ELSE RETURN DOING NOTHING
1536 FDD0 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO
1537 *
1538 ****************** CLEAR FROM CURSOR TO END OF LINE
1539 FDD2 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1540 FDD5 8D 16 BSR NEWCUR
1541 FDD7 B6 DF FB ESCCLL LDA COLADX
1542 FDDA C6 20 LDB #$20 AND CLEAR CHAR
1543 FDDC E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1544 FDDE 4C INCA
1545 FDDF A7 02 STA VDUCOL,X
1546 FDE1 81 50 CMPA #LINLEN UNTIL END OF LINE
1547 FDE3 26 F7 BNE ESCCL1
1548 FDE5 7F DF FE CLR ESCFLG
1549 FDE8 39 RTS
1550 *
1551 *********************************** CARRIAGE RETURN
1552 *
1553 FDE9 4F CRETN CLRA SET COLUMN ZERO
1554 FDEA F6 DF FC POSCOL LDB ROWADX GET CURRENT ROW
1555 *
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN
1557 *
1558 FDED FD DF FB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1559 FDF0 A7 02 STA VDUCOL,X SET NEW COLUMN
1560 FDF2 E7 03 STB VDUROW,X SET NEW ROW
1561 FDF4 39 RTS AND RETURN
1562 *
1563 ********************* UPDATE CURRENT COLUMN AND ROW
1564 *
1565 FDF5 FC DF FB NEWCOL LDD COLADX GET ROW AND COLUMN
1566 FDF8 4C INCA BUMP COLUMN
1567 FDF9 81 50 CMPA #LINLEN ROLL?
1568 FDFB 26 F0 BNE NEWCUR BRANCH IF NOT
1569 FDFD 4F CLRA ELSE RESET TO ZERO
1570 FDFE 5C INCB AND BUMP ROW
1571 FDFF C1 19 CMPB #NUMLIN
1572 FE01 26 EA BNE NEWCUR
1573 FE03 5A DECB BOTTOM ROW
1574 FE04 8D E7 BSR NEWCUR
1575 *
1576 ********************************* SCROLL THE SCREEN
1577 *
1578 FE06 E6 04 SCROLL LDB VDUOFF,X
1579 FE08 5C INCB
1580 FE09 C1 19 CMPB #NUMLIN
1581 FE0B 25 01 BLO SCROL1
1582 FE0D 5F CLRB
1583 FE0E E7 04 SCROL1 STB VDUOFF,X
1584 *
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN
1586 *
1587 FE10 F6 DF FB ESCCLS LDB COLADX GET CURSOR
1588 FE13 86 20 LDA #$20 GET A SPACE
1589 FE15 F7 DF FB ESCCLS1 STB COLADX
1590 FE18 E7 02 STB VDUCOL,X
1591 FE1A A7 84 STA VDUCHR,X
1592 FE1C 5C INCB
1593 FE1D C1 50 CMPB #LINLEN
1594 FE1F 26 F4 BNE ESCCLS1
1595 *
1596 FE21 F6 DF FC LDB ROWADX
1597 FE24 5C INCB
1598 FE25 C1 19 CMPB #NUMLIN
1599 FE27 27 08 BEQ ESCCLS2
1600 FE29 F7 DF FC STB ROWADX
1601 FE2C E7 03 STB VDUROW,X
1602 FE2E 5F CLRB
1603 FE2F 20 E4 BRA ESCCLS1
1604 *
1605 FE31 5F ESCCLS2 CLRB
1606 FE32 F7 DF FB STB COLADX
1607 FE35 E7 02 STB VDUCOL,X
1608 FE37 F7 DF FE STB ESCFLG
1609 FE3A 39 RTS
1610 ENDIF VDUOPT
1611 *
1612 IFD DG640OPT
1613 ***************************************************
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1615 * *
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1619 * 16x64 BOARD). *
1620 ***************************************************
1621
1622 ***************************************************
1623 * INITIALIZE EMULATOR *
1624 ***************************************************
1625
1626 VINIZ LDX #0
1627 STX COLADX AND ROWADX
1628 STX NEWROW AND ESCFLG
1629 LDX #SCREEN POINT TO SCREEN
1630 STX CURSOR SET PROGRAM CURSOR
1631 LDA #$1B SEND ESCAPE
1632 BSR VOUTCH
1633 LDA #'Y CLEAR TO END OF SCREEN
1634 *
1635 ** VIDEO OUTPUT ROUTINE
1636 *
1637 VOUTCH PSHS A,B,X SAVE REGISTERS
1638 *
1639 ** CLEAR CURSOR
1640 LDX CURSOR
1641 LDB 0,X
1642 ANDB #$7F
1643 STB 0,X
1644 *
1645 ** CHECK FOR ESCAPE SEQUENCE
1646 TST ESCFLG ESCAPE ACTIVE?
1647 BEQ SOROU1 BRANCH IF NOT
1648 BSR ESCAPE ELSE DO ESCAPE
1649 BRA RETURN AND RETURN
1650 *
1651 ** CHECK FOR CONTROL CHARACTERS
1652 SOROU1 CMPA #$20 CONTROL CODES?
1653 BHS SOROU2
1654 BSR CONTRL BRANCH IF SO
1655 BRA RETURN
1656 *
1657 ** OUTPUT TEXT CHARACTER
1658 SOROU2 LDX CURSOR ELSE GET CURSOR
1659 STAA 0,X DISPLAY CHARACTER
1660 LBSR NEWCOL UPDATE COLUMN
1661 *
1662 ** DISPLAY CURSOR AND RETURN
1663 RETURN LDX CURSOR AND DISPLAY IT
1664 LDB ,X
1665 ORAB #$80 WITH REVID
1666 STB ,X
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1668
1669 ***************************************************
1670 * CONTROL CODE HANDLERS *
1671 ***************************************************
1672
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1674 LBEQ BACKSP
1675 CMPA #$1B ESCAPE SEQUENCE?
1676 LBEQ SETESC
1677 CMPA #$D CTRL M - RETURN?
1678 LBEQ CRETN
1679 CMPA #$0A CTRL J - LINE FEED
1680 BNE RETESC NONE OF THESE, RETURN
1681
1682 ***************************************** LINE FEED
1683
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1685 INCB BUMP ROW
1686 CMPB #NUMLIN SCROLL TIME?
1687 LBNE NEWCUR POSITION CURSOR IF NOT
1688 LBRA SCROLL ELSE SCROLL IT
1689
1690 ***************************************** LINE FEED
1691
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1693 TSTB AT TOP OF SCREEN ?
1694 BEQ RETESC Yes, Ignore
1695 DECB No, Decrement ROW
1696 LBRA NEWCUR POSITION CURSOR
1697
1698
1699 *********************************** BACK SPACE
1700
1701 BACKSP LDA COLADX
1702 BEQ RETESC RETURN
1703 DECA
1704 LBRA POSCOL POSITION CURSOR
1705
1706 *********************************** CURSOR RIGHT
1707
1708 CHRIGHT LDA COLADX
1709 INCA
1710 CMPA #LINLEN
1711 BEQ RETESC
1712 LBRA POSCOL
1713
1714 ***************************************************
1715 * ESCAPE HANDLERS *
1716 ***************************************************
1717
1718 ESCAPE LDAB ESCFLG GET FLAG
1719 CMPB #'= SETTING CURSOR?
1720 BEQ ESCCUR BRANCH IF SO
1721 CMPA #'Y CLEAR TO END OF SCREEN?
1722 LBEQ ESCCLS
1723 CMPA #'T CLEAR TO END OF LINE?
1724 BEQ ESCCLL
1725 CMPA #'E INSERT LINE?
1726 BEQ ESCINL
1727 CMPA #'R DELETE LINE?
1728 BEQ ESCDLL
1729 CMPA #'= STARTING CURSOR SET?
1730 BNE CLRESC BRANCH IF NOT
1731
1732 ***************************** START ESCAPE SEQUENCE
1733
1734 SETESC STAA ESCFLG ELSE START CURSORING
1735 RTS AND RETURN
1736
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1738 RETESC RTS SO RETURN
1739
1740 ********************************* SET SCREEN CURSOR
1741
1742 ESCCUR TST NEWROW ROW SET?
1743 BNE ESCCU1 BRANCH IF SO
1744 STAA NEWROW ELSE SET NEW ROW
1745 RTS AND RETURN
1746
1747 ESCCU1 CLR ESCFLG
1748 SUBA #$20 ADJUST COLUMN ADDRESS
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1750 BHI RETESC NOT OK, DO NOTHING
1751
1752 ESCCU2 LDAB NEWROW
1753 CLR NEWROW
1754 SUBB #$20 ADJUST TO ROW ADDRESS
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1756 BHI RETESC ELSE RETURN DOING NOTHING
1757 BRA NEWCUR GO SET NEW CURSOR IF SO
1758 *
1759 *************************** DELETE LINE FROM SCREEN
1760
1761 ESCDLL BSR CRETN GO COL. ZERO
1762 LDB ROWADX
1763 CMPB #NUMLIN-1
1764 BEQ SCROL3
1765 BRA SCROL1 AND DELETE THIS LINE
1766
1767 *************************** INSERT LINE INTO SCREEN
1768
1769 ESCINL BSR CRETN GO TO COL. ZERO
1770 LDAB ROWADX
1771 CMPB #NUMLIN-1
1772 BEQ ESCCLL
1773 *
1774 ** SCROLL SCREEN DOWN FROM CURSOR
1775 *
1776 LDX #SCREEN+SCNLEN-LINLEN
1777 ESCIN0 LDAA 0,-X
1778 STAA LINLEN,X
1779 LDA SCNLEN,X
1780 STA SCNLEN+LINLEN,X
1781 CPX CURSOR
1782 BNE ESCIN0
1783
1784 ****************** CLEAR FROM CURSOR TO END OF LINE
1785
1786 ESCCLL LDA COLADX GET CURRENT COLUMN
1787 LDX CURSOR GET CURSOR
1788 LDB #$20 AND CLEAR CHAR
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
1790 STB ,X+ CLEAR TEXT
1791 INCA
1792 CMPA #LINLEN UNTIL END OF LINE
1793 BNE ESCLL1
1794 CLR ESCFLG
1795 RTS
1796
1797 *********************************** CARRIAGE RETURN
1798
1799 CRETN CLRA SET COLUMN ZERO
1800 POSCOL LDB ROWADX GET CURRENT ROW
1801
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN
1803
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1805 LDA #LINLEN ELSE ADD A LINE
1806 MUL LINLEN * ROWADX
1807 ADDB COLADX
1808 ADCA #0
1809 ADDD #SCREEN ADD SCREEN BASE.
1810 STD CURSOR SAVE NEW CURSOR
1811 TFR D,X GET CURSOR IN X
1812 RTS AND RETURN
1813
1814 ********************* UPDATE CURRENT COLUMN AND ROW
1815
1816 NEWCOL LDD COLADX GET ROW AND COLUMN
1817 INCA BUMP COLUMN
1818 CMPA #LINLEN ROLL?
1819 BNE NEWCUR BRANCH IF NOT
1820 CLRA ELSE RESET TO ZERO
1821 INCB AND BUMP ROW
1822 CMPB #NUMLIN
1823 BNE NEWCUR
1824 DECB BOTTOM ROW
1825 BSR NEWCUR
1826
1827 ********************************* SCROLL THE SCREEN
1828
1829 SCROLL LDX #SCREEN POINT TO SCREEN
1830 SCROL1 LDA SCNLEN+LINLEN,X
1831 STA SCNLEN,X
1832 LDAA LINLEN,X MOVE TWO BYTES
1833 STAA 0,X+ UP ONE LINE
1834 CMPX #SCREEN+SCNLEN-LINLEN
1835 BNE SCROL1 LOOP UNTIL DONE
1836 BRA SCROL3
1837
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN
1839
1840 ESCCLS LDX CURSOR GET CURSOR
1841 SCROL3 LDAA #$20 GET A SPACE
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
1843 STA ,X+ AND TEXT
1844 CMPX #SCREEN+SCNLEN
1845 BNE SCROL2 UNTIL DONE
1846 CLR ESCFLG
1847 RTS
1848 ENDIF DG640OPT
1848 ENDIF DG640OPT
1849 *
1850 IFD PRTOPT
1851 *************************************
1852 *
1853 ** PRINTER DRIVER ROUTINES
1854 *
1855 *************************************
1856 *
1857 ** PINIZ - INITIATE PRINTER PORT
1858 *
1859 PINIZ PSHS B
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
1861 STD PADATA SET DDR AND SELECT DATA
1862 *
1863 ** RESET PRINTER
1864 LDB #PRESET
1865 STAB PADATA
1866 RESTLP INCB DELAY FOR RESET
1867 BNE RESTLP
1868 STAA PADATA ACCA=DIRMSK
1869 *
1870 ** INITALIZE PORT B (DATA PORT)
1871 LDAA #$2A
1872 STAA PBCTRL
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110
1874 STD PBDATA PBDREG PBCTRL
1875 *
1876 ** SELECT 66 LINES/PAGE
1877 LDAA #$1B
1878 BSR POUTCH
1879 LDAA #'C
1880 BSR POUTCH
1881 LDAA #66
1882 PULS B
1883 *************************************
1884 *
1885 ** OUTPUT A CHARACTER TO THE PRINTER
1886 *
1887 *************************************
1888 POUTCH PSHS B
1889 LDAB PBDATA CLEAR INTERRUPT BIT
1890 *
1891 ** WAIT TILL NOT BUSY
1892 BUSYLP LDAB PADATA
1893 BITB #PERROR
1894 BEQ PEXIT
1895 TSTB
1896 BMI BUSYLP
1897 *
1898 ** NOW OUTPUT CHARACTER
1899 STAA PBDATA
1900 PEXIT PULS B,PC
1901 *************************************
1902 *
1903 ** PCHK TEST IFD PRINTER READY
1904 *
1905 *************************************
1906 PCHK TST PBCTRL TEST STATE OF CRB7
1907 RTS SET ON ACKNOWLEDGE
1908 ENDIF PRTOPT
1908 ENDIF PRTOPT
1909 *************************************
1910 *
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE
1912 *
1913 *************************************
1914 *
1915 FE3B JMPTAB EQU *
1916 FE3B 01 FCB 1 " ^A "
1917 FE3C FB 74 FDB ALTRA
1918 FE3E 02 FCB 2 " ^B "
1919 FE3F FB 69 FDB ALTRB
1920 FE41 03 FCB 3 " ^C "
1921 FE42 FB 7F FDB ALTRCC
1922 FE44 04 FCB 4 " ^D "
1923 FE45 FB 5E FDB ALTRDP
1924 FE47 10 FCB $10 " ^P "
1925 FE48 FB 31 FDB ALTRPC
1926 FE4A 15 FCB $15 " ^U "
1927 FE4B FB 3D FDB ALTRU
1928 FE4D 18 FCB $18 " ^X "
1929 FE4E FB 53 FDB ALTRX
1930 FE50 19 FCB $19 " ^Y "
1931 FE51 FB 48 FDB ALTRY
1932 *
1933 FE53 42 FCC 'B'
1934 FE54 F9 5C FDB BRKPNT
1935 FE56 45 FCC 'E'
1936 FE57 F8 FD FDB MEMDUMP
1937 FE59 47 FCC 'G'
1938 FE5A F8 A5 FDB GO
1939 FE5C 4C FCC 'L'
1940 FE5D FA 5E FDB LOAD
1941 FE5F 50 FCC 'P'
1942 FE60 FA BC FDB PUNCH
1943 FE62 4D FCC 'M'
1944 FE63 F8 A8 FDB MEMCHG
1945 FE65 52 FCC 'R'
1946 FE66 FB ED FDB REGSTR
1947 FE68 53 FCC 'S'
1948 FE69 F8 F1 FDB DISSTK
1949 FE6B 58 FCC 'X'
1950 FE6C F9 88 FDB XBKPNT
1951 IFD MFDCOPT
1952 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
1953 FDB MINBOOT
1954 ENDIF MFDCOPT
1954 ENDIF MFDCOPT
1955 IFD CF8OPT
1956 FE6E 44 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
1957 FE6F F9 D5 FDB CFBOOT
1958 ENDIF CF8OPT
1959 IFD IDEOPT
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
1961 FDB IDEBOOT
1962 ENDIF IDEOPT
1962 ENDIF IDEOPT
1963 IFD DMAFOPT
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
1965 FDB DBOOT
1966 ENDIF DMAFOPT
1966 ENDIF DMAFOPT
1967 IFD EXTOPT
1968 FE71 55 FCC 'U' *** IF FPGA, 'U' IS FOR USER
1969 FE72 FC 92 FDB USRCMD
1970 ENDIF EXTOPT
1971 IFD RTCOPT
1972 FCC 'T'
1973 FDB TIMSET
1974 ENDIF RTCOPT
1974 ENDIF RTCOPT
1975 IFD TRAOPT
1976 FCC "T"
1977 FDB TRACE
1978 ENDIF TRAOPT
1978 ENDIF TRAOPT
1979 *
1980 FE74 TABEND EQU *
1981 *
1982 * ** 6809 VECTOR ADDRESSES **
1983 *
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
1988 * HIS OWN ROUTINES IF HE SO DESIRES.
1989 *
1990 *
1991 FE74 F9 94 RAMVEC FDB SWIE USER-V
1992 FE76 F8 A7 FDB RTI SWI3-V
1993 FE78 F8 A7 FDB RTI SWI2-V
1994 FE7A F8 A7 FDB RTI FIRQ-V
1995 FE7C F8 A7 FDB RTI IRQ-V
1996 FE7E F9 94 FDB SWIE SWI-V
1997 FE80 FF FF FDB $FFFF SVC-VO
1998 FE82 FF FF FDB $FFFF SVC-VL
1999 *
2000 * PRINTABLE MESSAGE STRINGS
2001 *
2002 FE84 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2003 FE89 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR '
55 47 20 31 2E 34
20 46 4F 52 20
2004 IFD S3EOPT
2005 FCC 'S3E '
2006 ENDIF S3EOPT
2006 ENDIF S3EOPT
2007 IFD B5XOPT
2008 FCC 'B5-X300 '
2009 ENDIF B5XOPT
2009 ENDIF B5XOPT
2010 IFD S3SOPT
2011 FE9A 53 33 53 54 41 52 FCC 'S3STARTER '
54 45 52 20
2012 ENDIF S3SOPT
2013 IFD ADSOPT
2014 FCC 'ADS6809 '
2015 ENDIF ADSOPT
2015 ENDIF ADSOPT
2016 IFD SWTOPT`
2017 FCC 'SWTPC '
2018 ENDIF SWTOPT
2018 ENDIF SWTOPT
2019 IFD XESOPT`
2020 FCC 'XESS '
2021 ENDIF XESOPT
2021 ENDIF XESOPT
2022 FEA4 20 2D 20 FCC ' - '
2023 FEA7 04 FCB 4
2024 FEA8 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2025 FEAF 3E MSG3 FCC '>'
2026 FEB0 04 FCB 4
2027 FEB1 57 48 41 54 3F MSG4 FCC 'WHAT?'
2028 FEB6 04 FCB 4
2029 FEB7 20 2D 20 MSG5 FCC ' - '
2030 FEBA 04 FCB 4'
2031 FEBB 20 20 53 50 3D MSG10 FCC ' SP='
2032 FEC0 04 FCB 4
2033 FEC1 20 20 50 43 3D MSG11 FCC ' PC='
2034 FEC6 04 FCB 4
2035 FEC7 20 20 55 53 3D MSG12 FCC ' US='
2036 FECC 04 FCB 4
2037 FECD 20 20 49 59 3D MSG13 FCC ' IY='
2038 FED2 04 FCB 4
2039 FED3 20 20 49 58 3D MSG14 FCC ' IX='
2040 FED8 04 FCB 4
2041 FED9 20 20 44 50 3D MSG15 FCC ' DP='
2042 FEDE 04 FCB 4
2043 FEDF 20 20 41 3D MSG16 FCC ' A='
2044 FEE3 04 FCB 4
2045 FEE4 20 20 42 3D MSG17 FCC ' B='
2046 FEE8 04 FCB 4
2047 FEE9 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2048 FEEF 04 FCB 4
2049 FEF0 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2050 FEF8 53 31 MSG20 FCC 'S1'
2051 FEFA 04 FCB 4
2052 IFD DATOPT
2053 *
2054 * POWER UP/ RESET/ NMI ENTRY POINT
2055 *
2056 FF00 ORG $FF00
2057 *
2058 *
2059 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11
2060 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO
2061 *
2062 *
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2067 * STORED IN IT.
2068 *
2069 *
2070 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2071 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION
2072 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2073 *
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2076 * PHYSICAL ADDRESSES.
2077 *
2078 FF0A 86 F0 LDA #$F0
2079 FF0C A7 84 STA ,X STORE $F0 AT $FFFF
2080 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2081 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2082 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2083 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0
2084 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2085 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2086 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER
2087 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2088 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2089 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN
2090 *
2091 *
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2096 * IS STORED IN RAM IN THE LOCATION THAT IS
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2102 * "7" IN THE $70A0 WILL BE STORED IN
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2111 * OF RAM RESPONDS.
2112 *
2113 *
2114 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2115 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2116 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS
2117 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN
2118 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING
2119 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS
2120 FF32 44 LSRA TRANSLATION RAM.
2121 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D"
2122 *
2123 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER
2124 *
2125 *
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2133 *
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2136 *
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2139 *
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2142 *
2143 *
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2151 * MEMORY ADDRESSED AS FOLLOWS....
2152 *
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2155 *
2156 *
2157 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2158 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2159 FF40 6F 2E CLR 14,Y CLEAR $DFDE
2160 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2161 FF44 A7 2F STA 15,Y STORE AT $DFDF
2162 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2163 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2164 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2165 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2166 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2167 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2168 FF54 27 22 BEQ FINTAB SKIP IF FINISHED
2169 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2170 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2171 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2172 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION
2173 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2174 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2175 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2176 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2177 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2178 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2179 FF6E 44 LSRA
2180 FF6F 44 LSRA
2181 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2182 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2183 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2184 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2185 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2186 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE
2187 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE
2188 *
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2193 *
2194 *
2195 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C"
2196 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2197 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2198 FF86 4A DECA ELSE POINT 4K LOWER
2199 FF87 2A F9 BPL FINDC GO TRY AGAIN
2200 FF89 20 14 BRA XFERTF
2201 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2202 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2203 *
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2207 * ADDRESSES FROM $0000 AND UP....
2208 *
2209 FF8F 4F CLRA START AT ZERO
2210 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2211 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2212 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP
2213 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE
2214 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2215 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY
2216 FF9B 81 0C CMPA #$0C LAST ENTRY YET ?
2217 FF9D 2D F3 BLT COMPRS
2218 *
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2221 * THE MP-09 CPU CARD.
2222 *
2223 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2224 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE
2225 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2226 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11
2227 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE
2228 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED
2229 *
2230 ELSE
2231 LRA RTS
2232 START LDS #STACK INITIALIZE STACK POINTER
2233 CLRB
2234 ENDIF DATOPT
2234 ENDIF DATOPT
2235 *
2236 FFAB 53 COMB SET "B" NON-ZERO
2237 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG
2238 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE
2239 *
2240 ** INTERRUPT JUMP VECTORS
2241 *
2242 FFB2 6E 9F DF C0 V1 JMP [STACK]
2243 FFB6 6E 9F DF C4 V2 JMP [SWI2]
2244 FFBA 6E 9F DF C6 V3 JMP [FIRQ]
2245 FFBE 6E 9F DF C8 V4 JMP [IRQ]
2246 FFC2 6E 9F DF CA V5 JMP [SWI]
2247 *
2248 * SWI3 ENTRY POINT
2249 *
2250 FFC6 1F 43 SWI3E TFR S,U
2251 FFC8 AE 4A LDX 10,U *$FFC8
2252 FFCA E6 80 LDB ,X+
2253 FFCC AF 4A STX 10,U
2254 FFCE 4F CLRA
2255 FFCF 58 ASLB
2256 FFD0 49 ROLA
2257 FFD1 BE DF CC LDX SVCVO
2258 FFD4 8C FF FF CMPX #$FFFF
2259 FFD7 27 0F BEQ SWI3Z
2260 FFD9 30 8B LEAX D,X
2261 FFDB BC DF CE CMPX SVCVL
2262 FFDE 22 08 BHI SWI3Z
2263 FFE0 34 10 PSHS X
2264 FFE2 EC C4 LDD ,U
2265 FFE4 AE 44 LDX 4,U
2266 FFE6 6E F1 JMP [,S++]
2267 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP
2268 FFEA EE 42 LDU 2,U
2269 FFEC 6E 9F DF C2 JMP [SWI3]
2270 *
2271 * 6809 VECTORS
2272 *
2273 FFF0 ORG $FFF0
2274 FFF0 FF B2 FDB V1 USER-V
2275 FFF2 FF C6 FDB SWI3E SWI3-V
2276 FFF4 FF B6 FDB V2 SWI2-V
2277 FFF6 FF BA FDB V3 FIRQ-V
2278 FFF8 FF BE FDB V4 IRQ-V
2279 FFFA FF C2 FDB V5 SWI-V
2280 FFFC FF B2 FDB V1 NMI-V
2281 FFFE FF 00 FDB START RESTART-V
0004 END START
0005 END
Program + Init Data = 2043 bytes
Error count = 0
/sys09swt.lst
0,0 → 1,2778
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 NAM SYS09BUG FOR SWTPc
0000 INCLUDE "opt_swt.txt"
0001 *
0002 ***************************************************
0003 * OPTION SWITCHES
0004 ***************************************************
0005 *
0006 *
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0009 ** FOR LOADING AND SAVING S1 RECORDS
0010 *
0011 *S3EOPT EQU $FF SPARTAN3E STARTER
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0016 00FF SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0017 *
0002 END
0000 INCLUDE "sys09equ.txt"
0001 *
0002 ***************************************************
0003 * MEMORY MAP EQUATES *
0004 ***************************************************
0005 E000 MONIO EQU $E000 I/O SPACE
0006 IFD S3EOPT
0007 MONRAM EQU $7FC0
0008 ELSE
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE
0010 ENDIF S3EOPT
0011 F800 MONROM EQU $F800 START OF ROM
0012 IFD S3SOPT
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0014 EXTCMD EQU $00 EXTENDED OFFSET
0015 ENDIF S3SOPT
0015 ENDIF S3SOPT
0016 IFD XESOPT
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0018 EXTCMD EQU $00 EXTENDED OFFSET
0019 ENDIF XESOPT
0019 ENDIF XESOPT
0020 ***************************************************
0021
0022 IFD S3EOPT
0023 *
0024 * DIGILENT SPARTAN 3E STARTER
0025 *
0026 ACIAOPT EQU $FF ACIA AT PORT 0
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0028 VDUOPT EQU $FF VDU AT $E030
0029 TRAOPT EQU $FF PIA TRACE TIMER
0030 ENDIF S3EOPT
0030 ENDIF S3EOPT
0031 *
0032 IFD S3SOPT
0033 *
0034 * DIGILENT SPARTAN 3 STARTER
0035 *
0036 ACIAOPT EQU $FF ACIA AT PORT 0
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0038 VDUOPT EQU $FF VDU AT $E030
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0041 EXTOPT EQU $FF EXTENDED COMMANDS
0042 ENDIF S3SOPT
0042 ENDIF S3SOPT
0043 *
0044 IFD B5XOPT
0045 *
0046 * BURCHED B5-X300
0047 *
0048 ACIAOPT EQU $FF ACIA AT PORT 0
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0050 VDUOPT EQU $FF VDU AT $E030
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0053 ENDIF B5XOPT
0053 ENDIF B5XOPT
0054 *
0055 IFD XESOPT
0056 *
0057 * XESS XSA-3S1000 & XST-3.0
0058 *
0059 ACIAOPT EQU $FF ACIA AT PORT 0
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0061 VDUOPT EQU $FF VDU AT $E030
0062 IDEOPT EQU $FF XESS IDE AT $E100
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0064 EXTOPT EQU $FF EXTENDED COMMANDS
0065 ENDIF XESOPT
0065 ENDIF XESOPT
0066 *
0067 IFD ADSOPT
0068 *
0069 * ACKERMAN DIGITAL ADS6809
0070 *
0071 DG640OPT EQU $FF DG640 VDU AT $E800
0072 *RTCOPT EQU $FF REAL TIME CLOCK
0073 PRTOPT EQU $FF PRINTER DRIVERS
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0075 ENDIF ADSOPT
0075 ENDIF ADSOPT
0076 *
0077 IFD SWTOPT
0078 *
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER
0080 *
0081 00FF ACIAOPT EQU $FF ACIA AT PORT 0
0082 00FF DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0083 00FF MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0084 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0085 ENDIF
0086 *
0087 IFD ACIAOPT
0088 *
0089 ***************************************************
0090 * SERIAL PORT *
0091 ***************************************************
0092 *
0093 ** ACIA SITS ON PORT 0
0094 *
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0096 *
0097 ENDIF ACIAOPT
0098 IFD MFDCOPT
0099 *
0100 ***************************************************
0101 * MINIFLOPPY DRIVE *
0102 ***************************************************
0103 *
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0105 *
0106 E014 DRVFDC EQU MONIO+$14
0107 E018 CMDFDC EQU MONIO+$18
0108 E01A SECFDC EQU MONIO+$1A
0109 E01B DATFDC EQU MONIO+$1B
0110 ENDIF MFDCOPT
0111 IFD PS2OPT
0112 *
0113 ***************************************************
0114 * VDU8 PS/2 KEYBOARD PORT *
0115 ***************************************************
0116 *
0117 ** KEYBOARD SITS ON PORT 2
0118 *
0119 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0120 ENDIF PS2OPT
0120 ENDIF PS2OPT
0121 IFD VDUOPT
0122 *
0123 ***************************************************
0124 * VDU8 DISPLAY DRIVER EQUATES *
0125 ***************************************************
0126 *
0127 ** VDU8 DISPLAY SITS ON PORT 3
0128 *
0129 VDU EQU MONIO+$30
0130 VDUCHR EQU 0 CHARACTER REGISTER
0131 VDUATT EQU 1 ATTRIBUTE REGISTER
0132 VDUCOL EQU 2 CURSOR COLUMN
0133 VDUROW EQU 3 CURSOR ROW
0134 VDUOFF EQU 4 ROW OFFSET
0135 *
0136 LINLEN EQU 80 LENGTH OF A LINE
0137 NUMLIN EQU 25 NUMBER OF LINES
0138 ENDIF VDUOPT
0138 ENDIF VDUOPT
0139 *
0140 IFD CF8OPT
0141 *
0142 ***************************************************
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER *
0144 ***************************************************
0145 *
0146 ** COMPACT FLASH SITS AT PORT 4
0147 *
0148 CF_BASE EQU MONIO+$40
0149 CF_DATA EQU CF_BASE+0
0150 CF_ERROR EQU CF_BASE+1 ; read error
0151 CF_FEATURE EQU CF_BASE+1 ; write feature
0152 CF_SECCNT EQU CF_BASE+2
0153 CF_SECNUM EQU CF_BASE+3
0154 CF_CYLLO EQU CF_BASE+4
0155 CF_CYLHI EQU CF_BASE+5
0156 CF_HEAD EQU CF_BASE+6
0157 CF_STATUS EQU CF_BASE+7 ; read status
0158 CF_COMAND EQU CF_BASE+7 ; write command
0159 *
0160 * Command Equates
0161 *
0162 CMDREAD EQU $20 ; Read Single sector
0163 CMDWRITE EQU $30 ; Write Single sector
0164 CMDFEATURE EQU $EF
0165 FEAT8BIT EQU $01 ; enable 8 bit transfers
0166 HEADLBA EQU $E0
0167 *
0168 * Status bit equates
0169 *
0170 BUSY EQU $80
0171 DRDY EQU $40
0172 DRQ EQU $08
0173 ERR EQU $01
0174 *
0175 ENDIF CF8OPT
0175 ENDIF CF8OPT
0176 *
0177 IFD IDEOPT
0178 *
0179 ***************************************************
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *
0181 ***************************************************
0182 *
0183 ** COMPACT FLASH SITS AT PORT 4
0184 *
0185 CF_BASE EQU MONIO+$0100
0186 CF_DATA EQU CF_BASE+0
0187 CF_ERROR EQU CF_BASE+2 ; read error
0188 CF_FEATURE EQU CF_BASE+2 ; write feature
0189 CF_SECCNT EQU CF_BASE+4
0190 CF_SECNUM EQU CF_BASE+6
0191 CF_CYLLO EQU CF_BASE+8
0192 CF_CYLHI EQU CF_BASE+10
0193 CF_HEAD EQU CF_BASE+12
0194 CF_STATUS EQU CF_BASE+14 ; read status
0195 CF_COMAND EQU CF_BASE+14 ; write command
0196 CF_AUX EQU CF_BASE+30
0197 *
0198 * Command Equates
0199 *
0200 CMDREAD EQU $20 ; Read Single sector
0201 CMDWRITE EQU $30 ; Write Single sector
0202 AUXRESET EQU $06 ; Reset IDE
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked
0204 HEADLBA EQU $E0
0205 *
0206 * Status bit equates
0207 *
0208 BUSY EQU $80
0209 DRDY EQU $40
0210 DRQ EQU $08
0211 ERR EQU $01
0212 *
0213 ENDIF CF8OPT
0213 ENDIF CF8OPT
0214 *
0215 IFD RTCOPT
0216 *
0217 **************************************************
0218 * MM58167A REAL TIME CLOCK MEMORY MAP:
0219 **************************************************
0220 *
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0222 *
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0224 *
0225 * COUNTER AND COMPARITOR REGISTERS:
0226 *
0227 * Both the Clock Counter and Clock Comparitor
0228 * consist of 8 registers for holding the time.
0229 * The register offsets from the Counter and
0230 * Comparitor registers are listed above.
0231 *
0232 COUNTR EQU CLOCK+0
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0234 *
0235 * CLOCK REGISTER OFFSETS:
0236 * These register offsets are used for the CLOCK
0237 * and comparitor ram CMPRAM.
0238 *
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0241 SECOND EQU 2
0242 MINUIT EQU 3
0243 HOUR EQU 4
0244 WKDAY EQU 5
0245 MTHDAY EQU 6
0246 MONTH EQU 7
0247 *
0248 * INTERRUPT OUTPUT REGISTERS:
0249 *
0250 * An interrupt output may be generated at the
0251 * following rates by setting the appropriate bit
0252 * in the Interrupt Control Register (CINTCR).
0253 * The Interrupt Status Register (CINTSR) must be
0254 * read to clear the interrupt and will return
0255 * the source of the interrupt.
0256 *
0257 * 1/Month Bit 7
0258 * 1/Week Bit 6
0259 * 1/Day Bit 5
0260 * 1/Hour Bit 4
0261 * 1/Minuite Bit 3
0262 * 1/Second Bit 2
0263 * 10/Second Bit 1
0264 * Comparitor Bit 0
0265 *
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0268 *
0269 * COUNTER AND RAM RESETS; GO COMMAND.
0270 *
0271 * The counter and comparitor may be reset
0272 * by writing $FF into CTRRES and CMPRES
0273 * respectivly.
0274 * A write to the Go command register (GOCMND)
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths
0276 * of a second counter.
0277 *
0278 CTRRES EQU CLOCK+18 COUNTER RESET
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0280 GOCMND EQU CLOCK+21 GO COMMAND
0281 *
0282 * CLOCK STATUS REGISTER.
0283 *
0284 * The counter takes 61 usec. to rollover for
0285 * every 1KHz clock pulse. If the Status bit is
0286 * set after reading the counter, the counter
0287 * should be re-read to ensure the time is correct.
0288 *
0289 CLKSTA EQU CLOCK+20 STATUS BIT
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0292 ENDIF RTCOPT
0292 ENDIF RTCOPT
0293 *
0294 IFD TRAOPT
0295 *
0296 **************************************************
0297 * PIA INTERRUPT TIMER
0298 **************************************************
0299 *
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7
0301 *
0302 ** PIA TIMER FOR SINGLE STEP / TRACE
0303 *
0304 * TADATA = Output = Timer preset register
0305 * TACTRL - CA1 = input = rising edge = NMI
0306 * - CA2 = Output = Timer Reset (Active High)
0307 * TBDATA = Input = Timer read back register
0308 * TBCTRL - CB1 = input = rising edge = FIRQ
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0310 *
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0312 * CRA1 = 1 CA1 Rising edge IRQ
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0315 * CRA4 = 1 ] CA2 = Set/Reset output
0316 * CRA5 = 1 ]
0317 * CRA6 = X CA2 Input Interrupt Flag
0318 * CRA7 = X CA1 Interrupt Flag
0319 *
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0321 * CRB1 = 1 CB1 Rising edge IRQ
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0324 * CRB4 = 1 ] CB2 = Set/Reset output
0325 * CRB5 = 1 ]
0326 * CRB6 = X CB2 Input Interrupt Flag
0327 * CRB7 = X CB1 Interrupt Flag
0328 *
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0331 *
0332 TADATA EQU MONIO+$70 Timer preset port
0333 TACTRL EQU MONIO+$71
0334 TBDATA EQU MONIO+$72 Timer read back port
0335 TBCTRL EQU MONIO+$73
0336 *
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0338 *
0339 ENDIF TRAOPT
0339 ENDIF TRAOPT
0340 IFD ADSOPT
0341 *
0342 ***************************************************
0343 * SERIAL PORT FOR DG640 *
0344 ***************************************************
0345 *
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0348 *
0349 ACIAS EQU MONIO+$400 CONTROL PORT
0350 *
0351 ENDIF ADSOPT
0351 ENDIF ADSOPT
0352 IFD PRTOPT
0353 *
0354 ***************************************************
0355 * PRINTER INTERFACE *
0356 ***************************************************
0357 *
0358 PADATA EQU MONIO+$404
0359 PACTRL EQU MONIO+$405
0360 PBDATA EQU MONIO+$406
0361 PBCTRL EQU MONIO+$407
0362 *
0363 ** CB1 ACK. I/P
0364 ** CB2 STB. O/P
0365 ** PB0 - PB7 DATA 1 - 8 O/P
0366 ** PORT A BIT ASSIGNMENT
0367 *
0368 PBUSY EQU $80 I/P
0369 PEMPTY EQU $40 I/P
0370 SELECT EQU $20 I/P
0371 PERROR EQU $10 I/P
0372 PRESET EQU %00000100 O/P PA3 = 0
0373 AUTOFD EQU %00001000 O/P PA2 = 0
0374 DIRMSK EQU %00001100
0375 ENDIF PRTOPT
0375 ENDIF PRTOPT
0376 IFD DG640OPT
0377 *
0378 ***************************************************
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0380 ***************************************************
0381 *
0382 ** VIDEO DISPLAY DEFINITIONS
0383 *
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0385 LINLEN EQU 64 LENGTH OF A LINE
0386 NUMLIN EQU 16 NUMBER OF LINES
0387 SCNLEN EQU $400 LENGTH OF SCREEN
0388 ENDIF DG640OPT
0388 ENDIF DG640OPT
0389 *
0390 IFD DMAFOPT
0391 *
0392 ***************************************************
0393 * DMAF2 8" DRIVE *
0394 ***************************************************
0395 *
0396 F000 ADDREG EQU $F000 ADDRESS REGISTER
0397 F002 CNTREG EQU $F002 COUNT REGISTER
0398 F010 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0399 F014 PRIREG EQU $F014 DMA PRIORITY REGISTER
0400 F015 AAAREG EQU $F015 ???
0401 F016 BBBREG EQU $F016 ???
0402 F020 COMREG EQU $F020 1791 COMMAND REGISTER
0403 F022 SECREG EQU $F022 SECTOR REGISTER
0404 F024 DRVREG EQU $F024 DRIVE SELECT LATCH
0405 F040 CCCREG EQU $F040 ???
0406 ENDIF DMAFOPT
0407 IFD DATOPT
0408 **************************************************
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0410 **************************************************
0411 *
0412 FFF0 IC11 EQU $FFF0 DAT RAM CHIP
0413 55AA TSTPAT EQU $55AA TEST PATTERN
0414 ENDIF DATOPT
0415 *
0003 END
0000 INCLUDE "sys09bug.txt"
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR
0002 OPT l
 
sys09bug.txt page 2
0004 *
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007 *
0008 * ALLEN CLARK WALLACE WATSON
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
0011 * PH. 813-977-0347 PH. 813-985-1359
0012 *
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
0014 * 2561 NANTUCKET DR APT. E
0015 * ATLANTA, GA 30345
0016 * PH. 404-320-1043
0017 *
0018 * MODIFIED TO SYS09BUG VER 1.0
0019 * FOR: SYSTEM09 FPGA SYSTEM
0020 * BY: JOHN KENT
0021 * DATE: 21ST NOVEMBER 2006
0022 * REMOVED: DISK BOOTS
0023 * MEMORY TEST
0024 * ADDED: ADM3A VDU DRIVER
0025 *
0026 * MODIFIED TO SYS09BUG VER 1.1
0027 * FOR: SYSTEM09 FPGA SYSTEM
0028 * BY: JOHN KENT
0029 * DATE: 7TH JANUARY 2007
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0032 * AND REALTIME CLOCK
0033 *
0034 * MODIFIED TO SYS09BUG VER 1.2
0035 * FOR: SYSTEM09 FPGA SYSTEM
0036 * BY: JOHN KENT
0037 * DATE: 21ST MAY 2007
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * Modified to SYS09BUG VER 1.4
0049 * FOR: SYSTEM09 FPGA SYSTEM
0050 * BY: JOHN KENT
0051 * DATE: 3RD FEB 2008
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
0056 *
0057 * *** COMMANDS ***
0058 *
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0063 * CONTROL P = ALTER THE PROGRAM COUNTER
0064 * CONTROL U = ALTER USER STACK POINTER
0065 * CONTROL X = ALTER "X" INDEX REGISTER
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0068 * D = 5.25" MINIFLOPPY BOOT
0069 * E ssss-eeee = EXAMINE MEMORY
0070 * FROM STARTING ADDRESS ssss
0071 * TO ENDING ADDRESS eeee.
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0073 * L = LOAD TAPE
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0076 * R = DISPLAY REGISTER CONTENTS
0077 * S = DISPLAY STACK FROM ssss TO $DFC0
0078 * U = 8" DMAF2 FLOPPY BOOT
0079 * U = USER EXTENSION COMMANDS AT $F000
0080 * X = REMOVE ALL BREAKPOINTS
0081 *
0082 *
0083 ***************************************************
0084 * SYS09BUG VARIABLE SPACE
0085 ***************************************************
0086 *
0087 DFC0 ORG MONRAM
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK
0089 DFC0 NMI RMB 2 USER NMI VECTOR
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0097 IFD DATOPT
0098 DFD0 LRARAM RMB 16 LRA ADDRESSES
0099 ENDIF DATOPT
0100 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0101 DFE2 ECHO RMB 1 ECHO FLAG
0102 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0103 IFD TRAOPT
0104 NMISAV RMB 2 NMI Jump Vector Backup
0105 TRACNT RMB 2 Trace Count
0106 ENDIF TRAOPT
0106 ENDIF TRAOPT
0107 IFD VDUOPT
0108 *
0109 **************************************************
0110 * VDU8 DISPLAY DRIVER VARIABLES *
0111 **************************************************
0112 *
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0114 COLADX RMB 1 CURSOR COLUMN
0115 ROWADX RMB 1 CURSOR ROW
0116 **************************************************
0117 *
0118 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0119 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0120 ENDIF VDUOPT
0120 ENDIF VDUOPT
0121 IFD DG640OPT
0122 *
0123 ***************************************************
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0125 ***************************************************
0126 *
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0128 COLADX RMB 1 CURSOR COLUMN
0129 ROWADX RMB 1 CURSOR ROW
0130 *************************************************
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0134 ENDIF DG640OPT
0134 ENDIF DG640OPT
0135 *
0136 *
0137 ***************************************************
0138 * START OF ROM *
0139 ***************************************************
0140 *
0141 F800 ORG MONROM
0142 F800 F8 14 FDB MONITOR
0143 F802 F8 61 FDB NEXTCMD
0144 F804 FD 25 FDB INCH
0145 F806 FD 1F FDB INCHE
0146 F808 FD 34 FDB INCHEK
0147 F80A FD 42 FDB OUTCH
0148 F80C FC 17 FDB PDATA
0149 F80E FB A6 FDB PCRLF
0150 F810 FB A2 FDB PSTRNG
0151 F812 FA B6 FDB LRA
0152 *
0153 IFD ADSOPT
0154 FDB PCHK CHECK FOR PRINTER INPUT
0155 FDB PINIZ INITIATE PRINTER
0156 FDB POUTCH OUTPUT CH. TO PRINTER
0157 FDB VINIZ
0158 FDB VOUTCH
0159 FDB ACINIZ
0160 FDB AOUTCH
0161 ENDIF ADSOPT
0161 ENDIF ADSOPT
0162 *
0163 * MONITOR
0164 *
0165 * VECTOR ADDRESS STRING IS.....
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0167 *
0168 F814 8E FD 9F MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0169 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0175 *
0176 * CONTENTS FROM TO FUNCTION
0177 * $F8A1 $FE40 $DFC0 USER-V
0178 * $F8A1 $FE42 $DFC2 SWI3-V
0179 * $F8A1 $FE44 $DFC4 SWI2-V
0180 * $F8A1 $FE46 $DFC6 FIRQ-V
0181 * $F8A1 $FE48 $DFC8 IRQ-V
0182 * $FAB0 $FE4A $DFCA SWI-V
0183 * $FFFF $FE4C $DFCC SVC-VO
0184 * $FFFF $FE4E $DFCE SVC-VL
0185 *
0186 F824 8E E0 00 LDX #ACIAS
0187 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM
0188 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0190 F82F 6F E2 CLRSTK CLR ,-S
0191 F831 5A DECB
0192 F832 26 FB BNE CLRSTK
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0194 F837 AF 6A STX 10,S ON STACK
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0196 F83B A7 E4 STA ,S
0197 F83D 1F 43 TFR S,U
0198 F83F 17 05 11 LBSR IOINIZ INITIALIZE CONTROL PORT
0199 F842 8E FD AF LDX #MSG1 POINT TO MONITOR MESSAGE
0200 F845 17 03 CF LBSR PDATA PRINT MSG
0201 *
0202 IFD DATOPT
0203 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0204 F84B 4F CLRA START TOTAL AT ZERO
0205 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0206 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0207 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0208 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL
0209 F854 19 DAA ADJ. TOTAL FOR DECIMAL
0210 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0211 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM
0212 F858 17 04 94 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0213 F85B 8E FD CF LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0214 F85E 17 03 B6 LBSR PDATA PRINT MSG
0215 ENDIF DATOPT
0216 *
0217 IFD TRAOPT
0218 LBSR TRAINZ
0219 ENDIF TRAOPT
0219 ENDIF TRAOPT
0220 *
0221 ***** NEXTCMD *****
0222 *
0223 F861 8E FD D6 NEXTCMD LDX #MSG3 POINT TO MSG ">"
0224 F864 17 03 3B LBSR PSTRNG PRINT MSG
0225 F867 17 04 BB LBSR INCH GET ONE CHAR. FROM TERMINAL
0226 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0227 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0228 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0229 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0230 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0231 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0232 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0233 F878 17 04 C7 LBSR OUTCH PRINT "^"
0234 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0235 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0236 F87F 17 04 C0 PRTCMD LBSR OUTCH PRNT CMD CHAR
0237 F882 17 04 BB LBSR OUT1S PRNT SPACE
0238 F885 C1 60 CMPB #$60
0239 F887 2F 02 BLE NXTCH0
0240 F889 C0 20 SUBB #$20
0241 *
0242 ***** DO TABLE LOOKUP *****
0243 * FOR COMMAND FUNCTIONS
0244 *
0245 F88B 8E FD 66 NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0246 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0247 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0248 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0249 F894 8C FD 9F CMPX #TABEND REACHED END OF TABLE YET ?
0250 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0251 F899 8E FD D8 LDX #MSG4 POINT TO MSG "WHAT?"
0252 F89C 17 03 78 LBSR PDATA PRINT MSG
0253 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0254 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0255 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0256 *
0257 * "G" GO OR CONTINUE
0258 *
0259 F8A5 1F 34 GO TFR U,S
0260 F8A7 3B RTI RTI
0261 *
0262 ***** "M" MEMORY EXAMINE AND CHANGE *****
0263 *
0264 F8A8 17 03 F3 MEMCHG LBSR IN1ADR INPUT ADDRESS
0265 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN
0266 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y"
0267 F8AF 8E FD DE MEMC2 LDX #MSG5 POINT TO MSG " - "
0268 F8B2 17 02 ED LBSR PSTRNG PRINT MSG
0269 F8B5 1F 21 TFR Y,X FETCH ADDRESS
0270 F8B7 17 04 2D LBSR OUT4H PRINT ADDR IN HEX
0271 F8BA 17 04 83 LBSR OUT1S OUTPUT SPACE
0272 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0273 F8BF 17 04 2D LBSR OUT2H OUTPUT CONTENTS IN ASCII
0274 F8C2 17 04 7B LBSR OUT1S OUTPUT SPACE
0275 F8C5 17 03 E6 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0276 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0277 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0278 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0279 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0280 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0281 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW?
0282 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0283 F8D6 81 0D CMPA #$D IS IT A CR?
0284 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE
0285 F8DA 39 CHRTN RTS EXIT ROUTINE
0286 *
0287 *
0288 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0289 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0290 F8DF 27 08 BEQ FORWRD $F972
0291 F8E1 17 04 5C LBSR OUT1S OUTPUT SPACE
0292 F8E4 86 3F LDA #'? LOAD QUESTION MARK
0293 F8E6 17 04 59 LBSR OUTCH PRINT IT
0294 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0295 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0296 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0297 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0298 *
0299 * "S" DISPLAY STACK
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0302 *
0303 F8F1 17 03 2A DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0304 F8F4 1F 32 TFR U,Y
0305 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0306 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK
0307 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0308 *
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0311 * UPPER ADDRESS IN X-REG.
0312 * IF HEX ADDRESSES ARE INVALID (V)=1.
0313 *
0314 F8FD 17 03 93 MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0315 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0316 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0317 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0318 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0319 F908 39 EDPRTN RTS ;
0320 *
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0322 * TO EVEN 16 BYTE BOUNDRIES.
0323 *
0324 * IF LOWER ADDR = $4532
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0326 *
0327 * IF UPPER ADDR = $4567
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0329 *
0330 * ENTER WITH LOWER ADDRESS IN X-REG.
0331 * -UPPER ADDRESS ON TOP OF STACK.
0332 *
0333 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0334 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0335 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0336 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0337 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0338 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0339 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0340 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0341 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0342 F91C 17 04 15 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0343 F91F 27 03 BEQ EDUMP
0344 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0345 F923 39 RTS ;
0346 *
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0349 *
0350 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0351 F926 8E FD DE LDX #MSG5 POINT TO MSG " - "
0352 F929 17 02 76 LBSR PSTRNG PRINT MSG
0353 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0354 F92E 17 03 B6 LBSR OUT4H PRINT THE ADDRESS
0355 F931 17 04 0A LBSR OUT2S 2 SPACES
0356 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0357 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0358 F938 17 03 B4 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0359 F93B 17 04 02 LBSR OUT1S OUTPUT SPACE
0360 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT
0361 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0362 *
0363 * PRINT 16 ASCII CHARACTERS
0364 * IF NOT PRINTABLE OR NOT VALID
0365 * ASCII PRINT A PERIOD (.)
0366 F941 17 03 FA LBSR OUT2S 2 SPACES
0367 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0368 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0369 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0370 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0371 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0372 F94E 81 7E CMPA #$7E IS IT VALID ASCII?
0373 F950 23 02 BLS PRASC IF SO PRINT IT
0374 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0375 F954 17 03 EB PRASC LBSR OUTCH PRINT ASCII CHARACTER
0376 F957 5A DECB DECREMENT COUNT
0377 F958 26 EE BNE EDPASC
0378 F95A 20 BC BRA NXTLIN
0379 *
0380 ***** "B" SET BREAKPOINT *****
0381 *
0382 F95C 17 03 3F BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0383 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0384 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0385 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0386 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0387 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0388 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0389 F96D 35 10 PULS X POP BP ADDRESS FROM STACK
0390 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0391 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0392 F973 81 3F CMPA #$3F IS IT A SWI?
0393 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0394 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0395 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0396 F97B 86 3F LDA #$3F LOAD A SWI ($3F)
0397 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0398 F97F 39 EXITBP RTS ;
0399 *
0400 * INDICATE ERROR SETTING BREAKPOINT
0401 *
0402 F980 17 03 BD BPERR LBSR OUT1S OUTPUT SPACE
0403 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0404 F985 16 03 BA LBRA OUTCH PRINT "?"
0405 *
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0407 *
0408 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0409 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0410 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0411 F990 5A DECB $FAAC DECREMENT BP COUNTER
0412 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0413 F993 39 RTS
0414 *
0415 ***** SWI ENTRY POINT *****
0416 *
0417 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0418 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0419 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0420 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0421 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0422 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0423 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0424 F9A2 17 02 D0 REGPR LBSR REGSTR GO PRINT REGISTERS
0425 *
0426 IFD TRAOPT
0427 LDX #0
0428 STX TRACNT
0429 ENDIF TRAOPT
0429 ENDIF TRAOPT
0430 *
0431 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0432 *
0433 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0434 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0435 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0436 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS
0437 F9B1 81 3F CMPA #$3F IS IT SWI?
0438 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0439 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0440 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0441 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0442 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0443 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0444 F9BF A7 A0 STA ,Y+
0445 F9C1 39 RTS
0446 *
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0448 *
0449 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0450 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0451 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0452 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0453 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0454 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0455 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0456 F9D1 39 RTS ;
0457 *
0458 *
0459 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0460 F9D4 39 RTS
0461 *
0462 IFD TRAOPT
0463 *
0464 ** TRACE from address AAAA BB bytes
0465 *
0466 TRACE LBSR ALTPC1 SET UP NEW PC
0467 BVS TREXIT ADDRESS ERROR, EXIT
0468 LBSR OUT1S
0469 LBSR IN1ADR Fetch Byte Count
0470 BVS TREXIT Byte Count error, EXIT
0471 STX TRACNT
0472 *
0473 LDX NMI Save NMI Vector
0474 STX NMISAV
0475 LDX #NMIE Set up NMI for Tracing
0476 STX NMI
0477 LBSR TRAINZ Initialise Hardware
0478 BRA TRACEG Start Trace
0479 TREXIT RTS
0480 *
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0482 * CRA1 = 1 CA1 Rising edge IRQ
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0485 * CRA4 = 1 ] CA2 = Set/Reset output
0486 * CRA5 = 1 ]
0487 * CRA6 = X CA2 Input Interrupt Flag
0488 * CRA7 = X CA1 Interrupt Flag
0489 *
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0491 * CRB1 = 1 CB1 Rising edge IRQ
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0494 * CRB4 = 1 ] CB2 = Set/Reset output
0495 * CRB5 = 1 ]
0496 * CRB6 = X CB2 Input Interrupt Flag
0497 * CRB7 = X CB1 Interrupt Flag
0498 *
0499 *
0500 ** TRACE NMI ENTRY POINT
0501 *
0502 NMIE TFR S,U
0503 LDA #$36 Disable Interrupt, CA2 Low
0504 STA TACTRL
0505 LDA TADATA Clear Interrupt flag by reading data port
0506 *
0507 LBSR REGSTR DUMP REGISTERS
0508 *
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0510 LDA ,X
0511 CMPA #$3F
0512 BEQ TRACEX EXIT ON SWI
0513 *
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR
0516 LEAX -1,X DECREMENT TRACE COUNT
0517 STX TRACNT
0518 *
0519 ** TRACE GO (RESUME SINGLE STEP)
0520 *
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0523 STA TADATA
0524 LDA #$36 LOAD STROBE LOW
0525 STA TACTRL
0526 LDA TADATA CLEAR INTERRUPT
0527 LDA #$36 RELEASE RESET
0528 STA TBCTRL
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0530 STA TACTRL
0531 RTI GO EXECUTE INSTRUCTION
0532 *
0533 TRACEX LDX NMISAV Restore NMI vector
0534 STX NMI
0535 LBRA NEXTCMD Jump back to the command loop.
0536 *
0537 ** TRACE HARDWARE INITIALISATION
0538 *
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0540 STA TACTRL
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0542 STA TBCTRL
0543 LDA #$FF PORTA = OUTPUT
0544 STA TADATA
0545 LDA #$00 PORTB = INPUT
0546 STA TBDATA
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0548 STA TACTRL
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0550 STA TBCTRL
0551 RTS
0552 *
0553 ENDIF TRAOPT
0553 ENDIF TRAOPT
0554 IFD MFDCOPT
0555 *
0556 ** "U" MINI DISK BOOT
0557 *
0558 F9D5 7D E0 18 MINBOOT TST CMDFDC
0559 F9D8 7F E0 14 CLR DRVFDC
0560 F9DB 8E 00 00 LDX #$0000
0561 F9DE 30 01 LOOP LEAX $01,X
0562 F9E0 8C 00 00 CMPX #$0000
0563 F9E3 26 F9 BNE LOOP
0564 F9E5 86 0F LDA #$0F
0565 F9E7 B7 E0 18 STA CMDFDC
0566 F9EA 8D 37 BSR DELAY
0567 F9EC F6 E0 18 LOOP1 LDB CMDFDC
0568 F9EF C5 01 BITB #$01
0569 F9F1 26 F9 BNE LOOP1
0570 F9F3 86 01 LDA #$01
0571 F9F5 B7 E0 1A STA SECFDC
0572 F9F8 8D 29 BSR DELAY
0573 F9FA 86 8C LDA #$8C
0574 F9FC B7 E0 18 STA CMDFDC
0575 F9FF 8D 22 BSR DELAY
0576 FA01 8E C0 00 LDX #$C000
0577 FA04 20 09 BRA LOOP3
0578 FA06 C5 02 LOOP2 BITB #$02
0579 FA08 27 05 BEQ LOOP3
0580 FA0A B6 E0 1B LDA DATFDC
0581 FA0D A7 80 STA ,X+
0582 FA0F F6 E0 18 LOOP3 LDB CMDFDC
0583 FA12 C5 01 BITB #$01
0584 FA14 26 F0 BNE LOOP2
0585 FA16 C5 2C BITB #$2C
0586 FA18 27 01 BEQ LOOP4
0587 FA1A 39 RTS
0588 *
0589 FA1B 8E C0 00 LOOP4 LDX #$C000
0590 FA1E AF 4A STX $0A,U
0591 FA20 1F 34 TFR U,S
0592 FA22 3B RTI
0593 *
0594 FA23 C6 04 DELAY LDB #$04
0595 FA25 5A LOOP5 DECB
0596 FA26 26 FD BNE LOOP5
0597 FA28 39 RTS
0598 ENDIF MFDCOPT
0599 *
0600 IFD DMAFOPT
0601 *
0602 *** "D" DISK BOOT FOR DMAF2 ***
0603 *
0604 FA29 86 DE DBOOT LDA #$DE
0605 FA2B B7 F0 24 STA DRVREG
0606 FA2E 86 FF LDA #$FF
0607 FA30 B7 F0 14 STA PRIREG $FAF8
0608 FA33 B7 F0 10 STA CCREG
0609 FA36 B7 F0 15 STA AAAREG
0610 FA39 B7 F0 16 STA BBBREG
0611 FA3C 7D F0 10 TST CCREG
0612 FA3F 86 D8 LDA #$D8
0613 FA41 B7 F0 20 STA COMREG
0614 FA44 17 00 96 LBSR DLY
0615 FA47 B6 F0 20 DBOOT0 LDA COMREG
0616 FA4A 2B FB BMI DBOOT0
0617 FA4C 86 09 LDA #$09
0618 FA4E B7 F0 20 STA COMREG
0619 FA51 17 00 89 LBSR DLY
0620 *
0621 FA54 B6 F0 20 DISKWT LDA COMREG FETCH DRIVE STATUS
0622 FA57 85 01 BITA #1 TEST BUSY BIT
0623 FA59 26 F9 BNE DISKWT LOOP UNTIL NOT BUSY
0624 *
0625 FA5B 85 10 BITA #$10
0626 FA5D 26 CA BNE DBOOT
0627 *
0628 FA5F 8E C0 00 LDX #$C000 LOGICAL ADDR. = $C000
0629 FA62 8D 52 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0630 FA64 8A 10 ORA #$10
0631 FA66 B7 F0 40 STA CCCREG
0632 FA69 1F 10 TFR X,D
0633 FA6B 43 COMA ;
0634 FA6C 53 COMB ;
0635 FA6D FD F0 00 STD ADDREG
0636 FA70 8E FE FF LDX #$FEFF LOAD DMA BYTE COUNT = $100
0637 FA73 BF F0 02 STX CNTREG STORE IN COUNT REGISTER
0638 FA76 86 FF LDA #$FF LOAD THE CHANNEL REGISTER
0639 FA78 B7 F0 10 STA CCREG
0640 FA7B 86 FE LDA #$FE SET CHANNEL 0
0641 FA7D B7 F0 14 STA PRIREG
0642 FA80 86 01 LDA #1 SET SECTOR TO "1"
0643 FA82 B7 F0 22 STA SECREG ISSUE COMMAND
0644 FA85 86 8C LDA #$8C SET SINGLE SECTOR READ
0645 FA87 B7 F0 20 STA COMREG ISSUE COMMAND
0646 FA8A 8D 51 BSR DLY
0647 *
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0652 * IS STILL A ONE THE BOOT OPERATION WILL
0653 * BE STARTED OVER FROM THE BEGINING.
0654 *
0655 FA8C 5F CLRB ;
0656 FA8D 34 04 DBOOT1 PSHS B $FB55
0657 FA8F 5F CLRB ;
0658 FA90 7D F0 10 DBOOT2 TST CCREG
0659 FA93 2A 0A BPL DBOOT3
0660 FA95 5A DECB ;
0661 FA96 26 F8 BNE DBOOT2
0662 FA98 35 04 PULS B
0663 FA9A 5A DECB
0664 FA9B 26 F0 BNE DBOOT1
0665 FA9D 20 8A BRA DBOOT
0666 FA9F 35 04 DBOOT3 PULS B
0667 FAA1 B6 F0 20 LDA COMREG
0668 FAA4 85 1C BITA #$1C
0669 FAA6 27 01 BEQ DBOOT4
0670 FAA8 39 RTS ;
0671 *
0672 *
0673 FAA9 C6 DE DBOOT4 LDB #$DE
0674 FAAB F7 F0 24 STB DRVREG
0675 FAAE 8E C0 00 LDX #$C000
0676 FAB1 AF 4A STX 10,U
0677 FAB3 1F 34 TFR U,S $FB7B
0678 FAB5 3B RTI ;
0679 ENDIF DMAFOPT
0680 *
0681 IFD CF8OPT
0682 *
0683 * COMPACT FLASH BOOT
0684 *
0685 CFBOOT BSR WAITRDY
0686 LDA #HEADLBA
0687 STA CF_HEAD
0688 BSR WAITRDY
0689 LDA #FEAT8BIT
0690 STA CF_FEATURE
0691 LDA #CMDFEATURE
0692 STA CF_COMAND
0693 BSR WAITRDY
0694 *
0695 * READ SECTORS FROM CF
0696 *
0697 CFREAD LDA #$01
0698 STA CF_SECCNT
0699 CLRA
0700 STA CF_SECNUM
0701 STA CF_CYLLO
0702 STA CF_CYLHI
0703 *
0704 LDA #CMDREAD ; IDE READ MULTIPLE
0705 STA CF_COMAND
0706 BSR WAITRDY
0707 LDX #$C000
0708 *
0709 * READ LOOP
0710 *
0711 RDLOOP BSR WAITDRQ
0712 LDA CF_DATA
0713 STA ,X+
0714 CMPX #$C200
0715 BNE RDLOOP
0716 *
0717 LDX #$C000
0718 STX $0A,U
0719 TFR U,S
0720 RTI
0721 *
0722 * WAIT UNTIL READY
0723 *
0724 WAITRDY LDA CF_STATUS
0725 BITA #BUSY
0726 BNE WAITRDY
0727 LDA CF_STATUS
0728 BITA #DRDY
0729 BEQ WAITRDY
0730 RTS
0731 *
0732 * WAIT FOR DATA REQUEST
0733 *
0734 WAITDRQ LDA CF_STATUS
0735 BITA #DRQ
0736 BEQ WAITDRQ
0737 RTS
0738 ENDIF CF8OPT
0738 ENDIF CF8OPT
0739 *
0740 IFD IDEOPT
0741 *
0742 * XESS 16 BIT IDE BOOT
0743 *
0744 IDEBOOT LDD #AUXRESET
0745 STD CF_AUX
0746 LDD #AUXRSTREL
0747 STD CF_AUX
0748 LDD #HEADLBA
0749 STD CF_HEAD
0750 BSR WAITRDY
0751 *
0752 * READ SECTORS FROM CF
0753 *
0754 LDD #$01
0755 STD CF_SECCNT
0756 CLRB
0757 STD CF_SECNUM
0758 STD CF_CYLLO
0759 STD CF_CYLHI
0760 *
0761 LDB #CMDREAD ; IDE READ MULTIPLE
0762 STD CF_COMAND
0763 BSR WAITRDY
0764 LDX #$C000
0765 *
0766 * READ LOOP
0767 *
0768 RDLOOP BSR WAITDRQ
0769 LDD CF_DATA
0770 STB ,X+
0771 CMPX #$C100
0772 BNE RDLOOP
0773 *
0774 LDX #$C000
0775 STX $0A,U
0776 TFR U,S
0777 RTI
0778 *
0779 * WAIT UNTIL READY
0780 *
0781 WAITRDY LDD CF_STATUS
0782 BITB #BUSY
0783 BNE WAITRDY
0784 LDD CF_STATUS
0785 BITB #DRDY
0786 BEQ WAITRDY
0787 RTS
0788 *
0789 * WAIT FOR DATA REQUEST
0790 *
0791 WAITDRQ LDD CF_STATUS
0792 BITB #DRQ
0793 BEQ WAITDRQ
0794 RTS
0795 ENDIF IDEOPT
0795 ENDIF IDEOPT
0796 *
0797 IFD RTCOPT
0798 *
0799 * CLOCK INTER FACE UTILITY
0800 *
0801 * TIME <Hours> <Minuits> <Seconds>
0802 * If no argument is specified, the current time
0803 * will be displayed.
0804 *
0805 * READ A REGISTER FROM THE COUNTER.
0806 * The X Index rgister points to the register
0807 * to be read. The Status Register is checked
0808 * before and after the register is read before
0809 * returning a value in accumulator A
0810 *
0811 RDCLK TST CLKSTA
0812 BNE RDCLK
0813 RDCLK1 LDA 0,X
0814 TST CLKSTA
0815 BNE RDCLK1
0816 RTS
0817 *
0818 * MAIN PROGRAM:
0819 *
0820 TIMSET LDX #COUNTR POINT TO TIMER
0821 LBSR BYTE READ HOURS
0822 BVS SHOWTM NO ARG, DISP TIME
0823 STA HOUR,X
0824 LBSR OUT1S
0825 LBSR BYTE READ MINUITES
0826 BVS SHOWTM
0827 STA MINUIT,X
0828 LBSR OUT1S
0829 LBSR BYTE SECONDS.
0830 BVS SHOWTM
0831 STA SECOND,X
0832 *
0833 * DISPLAY CURRENT TIME
0834 *
0835 SHOWTM LBSR PCRLF
0836 LDX #COUNTR+HOUR
0837 LDB #3
0838 SHOWLP BSR RDCLK
0839 LBSR OUT2H
0840 LDA #':
0841 LBSR OUTCH
0842 LEAX -1,X
0843 DECB
0844 BNE SHOWLP
0845 RTS
0846 *
0847 * INITIATE CLOCK.
0848 * MASK INTERRUPTS.
0849 *
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
0851 TST CINTSR CLEAR ANY INTERRUPTS
0852 RTS
0853 ENDIF RTCOPT
0853 ENDIF RTCOPT
0854 IFD DATOPT
0855 *
0856 ***** LRA LOAD REAL ADDRESS *****
0857 *
0858 * THE FOLLOWING CODE LOADS THE 20-BIT
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE
0860 * INTO THE "A" AND "X" REGISTERS. THIS
0861 * ROUTINE IS ENTERED WITH THE LOGICAL
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0863 * REGISTER. EXIT IS MADE WITH THE HIGH-
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0865 * ADDRESS IN THE "A" REGISTER, AND THE
0866 * LOW-ORDER 16-BITS OF THE 20-BIT
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0868 * ALL OTHER REGISTERS ARE PRESERVED.
0869 * THIS ROUTINE IS REQUIRED SINCE THE
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0871 * PRESENT PHYSICAL ADDRESSES ON THE
0872 * SYSTEM BUS.
0873 *
0874 FAB6 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
0875 FAB8 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
0876 FABA 44 LSRA ;
0877 FABB 44 LSRA ADJ FOR INDEXED INTO
0878 FABC 44 LSRA CORRESPONDING LOCATION
0879 FABD 44 LSRA IN LRA TABLE
0880 FABE 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
0881 FAC2 E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
0882 FAC4 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
0883 FAC5 54 LSRB PHYSICAL ADDRESS.
0884 FAC6 54 LSRB EXTENDED MS 4-BITS ARE RETURNED
0885 FAC7 54 LSRB IN THE "A" ACCUMULATOR
0886 FAC8 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
0887 FACA E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
0888 FACC 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0889 FACD 58 ASLB ADJ DATA FOR RELOCATION IN X REG
0890 FACE 58 ASLB ;
0891 FACF 58 ASLB $FB97
0892 FAD0 58 ASLB ;
0893 FAD1 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
0894 FAD3 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
0895 FAD5 A7 62 STA 2,S SAVE IT IN X REG ON STACK
0896 FAD7 EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
0897 *
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0899 FAD9 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
0900 * ON STACK
0901 FADB 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK
0902 ENDIF DATOPT
0903 *
0904 * DELAY LOOP
0905 *
0906 FADD 34 04 DLY PSHS B SAVE CONTENTS OF "B"
0907 FADF C6 20 LDB #$20 GET LOOP DELAY VALUE
0908 FAE1 5A SUB1 DECB SUBTRACT ONE FROM VALUE
0909 FAE2 26 FD BNE SUB1 LOOP UNTIL ZERO
0910 FAE4 35 84 PULS B,PC RESTORE CONTENTS OF "B"
0911 * RTS ;
0912 *
0913 ***** "L" LOAD MIKBUG TAPE *****
0914 *
0915 FAE6 BD FD 53 LOAD JSR ACINIZ
0916 FAE9 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
0917 FAEB 17 02 54 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
0918 FAEE 7F DF E2 CLR ECHO TURN OFF ECHO FLAG
0919 FAF1 17 02 26 LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
0920 FAF4 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
0921 FAF6 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
0922 FAF8 17 02 1F LBSR ECHON
0923 FAFB 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
0924 FAFD 27 3D BEQ LOAD21 IF SO, EXIT LOAD
0925 FAFF 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
0926 FB01 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
0927 FB03 17 01 A8 LBSR BYTE INPUT BYTE COUNT
0928 FB06 34 02 PSHS A PUSH COUNT ON STACK
0929 FB08 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
0930 FB0A 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
0931 FB0D 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
0932 FB0F 34 10 PSHS X PUSH ADDR ON STACK
0933 FB11 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
0934 FB13 EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
0935 FB15 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
0936 FB17 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
0937 FB19 6A E4 DEC ,S ADDRESS BYTES.
0938 FB1B 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
0939 FB1D 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
0940 FB20 35 04 PULS B POP CHECKSUM FROM STACK
0941 FB22 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
0942 FB24 34 02 PSHS A PUSH DATA BYTE ON STACK
0943 FB26 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
0944 FB28 6A E4 DEC ,S DECREMENT BYTE COUNT 1
0945 FB2A 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
0946 FB2C A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
0947 FB2E 20 EB BRA LOAD10 GET NEXT DATA BYTE
0948 FB30 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
0949 FB31 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
0950 FB33 C1 FF CMPB #$FF CHECKSUM OK?
0951 FB35 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
0952 FB37 86 3F LDA #'? LOAD (?) ERROR INDICATOR
0953 FB39 17 02 06 LBSR OUTCH OUTPUT IT TO TERMINAL
0954 FB3C 73 DF E2 LOAD21 COM ECHO TURN ECHO ON
0955 FB3F 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
0956 FB41 16 01 FE LBRA OUTCH OUTPUT IT
0957 *
0958 ***** "P" PUNCH MIKBUG TAPE *****
0959 *
0960 FB44 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
0961 FB46 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
0962 FB49 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
0963 FB4B 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
0964 FB4D AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
0965 FB4F 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
0966 FB51 30 01 LEAX 1,X INCREMENT END ADDRESS
0967 FB53 AF E4 STX ,S STORE END ADDR ON STACK
0968 FB55 BD FD 53 JSR ACINIZ
0969 FB58 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
0970 FB5A 17 01 E5 LBSR OUTCH OUTPUT IT TO TERMINAL
0971 FB5D EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
0972 FB5F A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
0973 FB61 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
0974 FB63 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
0975 FB67 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
0976 FB69 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
0977 FB6B E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
0978 FB6D 8E FE 1F LDX #MSG20 POINT TO MSG "S1"
0979 FB70 17 00 2F LBSR PSTRNG PRINT MSG
0980 FB73 CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
0981 FB75 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
0982 FB77 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
0983 FB7A AE 62 LDX 2,S LOAD BEGIN ADDRESS
0984 FB7C 17 01 68 LBSR OUT4H PUNCH ADDRESS
0985 FB7F EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
0986 FB81 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
0987 FB83 EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
0988 FB85 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
0989 FB87 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
0990 FB8A 6A 64 DEC 4,S DECREMENT BYTE COUNT
0991 FB8C 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
0992 FB8E 53 COMB 1's COMPLIMENT CHECKSUM BYTE
0993 FB8F 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
0994 FB91 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
0995 FB94 AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
0996 FB96 AC E4 CMPX ,S COMPARE IT TO END ADDR
0997 FB98 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
0998 FB9A 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
0999 FB9C 17 01 A3 LBSR OUTCH OUTPUT IT
1000 FB9F 32 65 LEAS 5,S READJUST STACK POINTER
1001 FBA1 39 RTS ;
1002 *
1003 * PRINT STRING PRECEEDED BY A CR & LF.
1004 *
1005 FBA2 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1006 FBA4 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1007 *
1008 * PCRLF
1009 *
1010 FBA6 34 10 PCRLF PSHS X SAVE IX
1011 FBA8 8E FD D0 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1012 FBAB 17 00 69 LBSR PDATA PRINT MSG
1013 FBAE 35 90 PULS X,PC RESTORE IX & RETURN
1014 *
1015 * LONG BRANCHES TO COMMON ROUTINES
1016 *
1017 FBB0 16 01 8D JOUT1S LBRA OUT1S
1018 FBB3 16 00 F8 JBYTE LBRA BYTE
1019 FBB6 16 00 E5 JIN1ADR LBRA IN1ADR
1020 *
1021 * ALTER "PC" PROGRAM COUNTER
1022 *
1023 FBB9 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1024 FBBC 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1025 FBBE 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1026 FBC0 29 02 BVS ALTPCD EXIT IF INVALID HEX
1027 FBC2 AF 4A STX 10,U POKE IN NEW CONTENTS
1028 FBC4 39 ALTPCD RTS ;
1029 *
1030 * ALTER "U" USER STACK POINTER
1031 *
1032 FBC5 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1033 FBC7 8D E7 BSR JOUT1S OUTPUT SPACE
1034 FBC9 8D EB BSR JIN1ADR
1035 FBCB 29 02 BVS ALTUD
1036 FBCD AF 48 STX 8,U
1037 FBCF 39 ALTUD RTS ;
1038 *
1039 * ALTER "Y" INDEX REGISTER
1040 *
1041 FBD0 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1042 FBD2 8D DC BSR JOUT1S OUTPUT SPACE
1043 FBD4 8D E0 BSR JIN1ADR
1044 FBD6 29 02 BVS ALTYD
1045 FBD8 AF 46 STX 6,U $F8F0
1046 FBDA 39 ALTYD RTS ;
1047 *
1048 * ALTER "X" INDEX REGISTER
1049 *
1050 FBDB 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1051 FBDD 8D D1 BSR JOUT1S OUTPUT SPACE
1052 FBDF 8D D5 BSR JIN1ADR
1053 FBE1 29 02 BVS ALTXD
1054 FBE3 AF 44 STX 4,U
1055 FBE5 39 ALTXD RTS ;
1056 *
1057 * ALTER "DP" DIRECT PAGE REGISTER
1058 *
1059 FBE6 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1060 FBE8 8D C6 BSR JOUT1S OUTPUT SPACE
1061 FBEA 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1062 FBEC 29 02 BVS ALTDPD
1063 FBEE A7 43 STA 3,U
1064 FBF0 39 ALTDPD RTS ;
1065 *
1066 * ALTER "B" ACCUMULATOR
1067 *
1068 FBF1 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1069 FBF3 8D BB BSR JOUT1S OUTPUT SPACE
1070 FBF5 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1071 FBF7 29 02 BVS ALTBD
1072 FBF9 A7 42 STA 2,U
1073 FBFB 39 ALTBD RTS $F91C
1074 *
1075 * ALTER "A" ACCUMULATOR
1076 *
1077 FBFC 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1078 FBFE 8D B0 BSR JOUT1S OUTPUT SPACE
1079 FC00 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1080 FC02 29 02 BVS ALTAD
1081 FC04 A7 41 STA 1,U
1082 FC06 39 ALTAD RTS ;
1083 *
1084 * ALTER "CC" REGISTER
1085 *
1086 FC07 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1087 FC09 8D A5 BSR JOUT1S OUTPUT SPACE
1088 FC0B 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1089 FC0D 29 04 BVS ALTCCD
1090 FC0F 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1091 FC11 A7 C4 STA ,U
1092 FC13 39 ALTCCD RTS ;
1093 *
1094 * PDATA
1095 *
1096 FC14 17 01 2B PRINT LBSR OUTCH
1097 FC17 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1098 FC19 81 04 CMPA #4 IS IT EOT?
1099 FC1B 26 F7 BNE PRINT IF NOT EOT PRINT IT
1100 FC1D 39 RTS ;
1101 *
1102 * PRINT REGISTERS
1103 *
1104 FC1E 8E FD E2 PRTSP LDX #MSG10 POINT TO MSG "SP="
1105 FC21 8D F4 BSR PDATA PRINT MSG
1106 FC23 1F 31 TFR U,X
1107 FC25 16 00 BF JOUT4H LBRA OUT4H
1108 *
1109 FC28 8E FD EE PRTUS LDX #MSG12 POINT TO MSG "US="
1110 FC2B 8D EA BSR PDATA PRINT MSG
1111 FC2D AE 48 LDX 8,U
1112 FC2F 20 F4 BRA JOUT4H
1113 *
1114 FC31 8E FE 00 PRTDP LDX #MSG15 POINT TO MSG "DP="
1115 FC34 8D E1 BSR PDATA PRINT MSG
1116 FC36 A6 43 LDA 3,U
1117 FC38 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1118 *
1119 FC3B 8E FD FA PRTIX LDX #MSG14 POINT TO MSG "IX="
1120 FC3E 8D D7 BSR PDATA PRINT MSG
1121 FC40 AE 44 LDX 4,U $FCE6
1122 FC42 20 E1 BRA JOUT4H
1123 *
1124 FC44 8E FD F4 PRTIY LDX #MSG13 POINT TO MSG "IY="
1125 FC47 8D CE BSR PDATA PRINT MSG
1126 FC49 AE 46 LDX 6,U
1127 FC4B 20 D8 BRA JOUT4H
1128 *
1129 FC4D 8E FD E8 PRTPC LDX #MSG11 POINT TO MSG "PC="
1130 FC50 8D C5 BSR PDATA PRINT MSG
1131 FC52 AE 4A LDX 10,U
1132 FC54 20 CF BRA JOUT4H
1133 *
1134 FC56 8E FE 06 PRTA LDX #MSG16 POINT TO MSG "A="
1135 FC59 8D BC BSR PDATA PRINT MSG
1136 FC5B A6 41 LDA 1,U
1137 FC5D 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1138 *
1139 FC5F 8E FE 0B PRTB LDX #MSG17 POINT TO MSG "B="
1140 FC62 8D B3 BSR PDATA PRINT MSG
1141 FC64 A6 42 LDA 2,U
1142 FC66 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1143 *
1144 FC68 8E FE 10 PRTCC LDX #MSG18 POINT TO MSG "CC:"
1145 FC6B 8D AA BSR PDATA PRINT MSG
1146 FC6D A6 C4 LDA ,U
1147 FC6F 8E FE 17 LDX #MSG19 POINT TO MSG "EFHINZVC"
1148 FC72 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1149 *
1150 * "R" DISPLAY REGISTERS
1151 *
1152 FC75 8E FD DE REGSTR LDX #MSG5 POINT TO MSG " - "
1153 FC78 17 FF 27 LBSR PSTRNG PRINT MSG
1154 FC7B 8D A1 BSR PRTSP $FCBF
1155 FC7D 8D A9 BSR PRTUS $FCCA
1156 FC7F 8D B0 BSR PRTDP $FCD5
1157 FC81 8D B8 BSR PRTIX $FCE0
1158 FC83 8D BF BSR PRTIY $FCEB
1159 FC85 8E FD DE LDX #MSG5 POINT TO MSG " - "
1160 FC88 17 FF 17 LBSR PSTRNG PRINT MSG
1161 FC8B 8D C0 BSR PRTPC $FCF5
1162 FC8D 8D C7 BSR PRTA $FCFF
1163 FC8F 8D CE BSR PRTB $FD09
1164 FC91 20 D5 BRA PRTCC $FD13
1165 *
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1171 * ADDRESS IS INPUT.
1172 *
1173 FC93 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1174 FC95 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1175 FC97 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1176 FC99 86 2D LDA #'-
1177 FC9B 17 00 A4 LBSR OUTCH PRINT " - "
1178 *
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1182 *
1183 FC9E 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1184 FCA0 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1185 FCA2 1F 01 TFR D,X
1186 FCA4 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1187 FCA6 29 3C BVS NOTHEX
1188 FCA8 34 10 PSHS X
1189 FCAA A7 61 STA 1,S
1190 FCAC 35 90 PULS X,PC
1191 *
1192 ***** INPUT BYTE (2 HEX CHAR.) *****
1193 *
1194 FCAE 8D 11 BYTE BSR INHEX GET HEX LEFT
1195 FCB0 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1196 FCB2 48 ASLA ;
1197 FCB3 48 ASLA ;
1198 FCB4 48 ASLA ; SHIFT INTO LEFT NIBBLE
1199 FCB5 48 ASLA ;
1200 FCB6 1F 89 TFR A,B PUT HEXL IN "B"
1201 FCB8 8D 07 BSR INHEX GET HEX RIGHT
1202 FCBA 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1203 FCBC 34 04 PSHS B PUSH HEXL ON STACK
1204 FCBE AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1205 FCC0 39 RTS RETURN WITH HEX L&R IN "A"
1206 *
1207 *
1208 FCC1 8D 57 INHEX BSR ECHON INPUT ASCII CHAR.
1209 FCC3 81 30 CMPA #'0 IS IT > OR = "0" ?
1210 FCC5 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1211 FCC7 81 39 CMPA #'9 IS IT < OR = "9" ?
1212 FCC9 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1213 FCCB 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1214 FCCD 39 RTS ;
1215 *
1216 *
1217 FCCE 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1218 FCD0 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1219 FCD2 81 46 CMPA #'F IS IT < OR = "F" ?
1220 FCD4 22 03 BHI INHEXL IF > IT AIN'T HEX
1221 FCD6 80 37 SUBA #$37 ASCII ADJ. ALPHA
1222 FCD8 39 RTS ;
1223 *
1224 FCD9 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1225 FCDB 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1226 FCDD 81 66 CMPA #'f IS IT < "f"
1227 FCDF 22 03 BHI NOTHEX IF > IT AIN'T HEX
1228 FCE1 80 57 SUBA #$57 ADJUST TO LOWER CASE
1229 FCE3 39 RTS ;
1230 *
1231 *
1232 FCE4 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1233 FCE6 39 RTS ;
1234 *
1235 *
1236 FCE7 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1237 FCE9 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1238 FCEB 8D 02 BSR OUTHL OUTPUT HEX LEFT
1239 FCED 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1240 FCEF OUTHL EQU *
1241 FCEF 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1242 FCF1 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1243 FCF2 44 LSRA ;
1244 FCF3 44 LSRA ;
1245 FCF4 44 LSRA ;
1246 FCF5 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1247 FCF7 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1248 FCF9 84 0F ANDA #$0F STRIP LEFT NIBBLE
1249 FCFB 8B 30 XASCII ADDA #$30 ASCII ADJ
1250 FCFD 81 39 CMPA #$39 IS IT < OR = "9" ?
1251 FCFF 2F 02 BLE OUTC IF LESS, OUTPUT IT
1252 FD01 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1253 FD03 20 3D OUTC BRA OUTCH OUTPUT CHAR
1254 *
1255 * BINARY / ASCII --- THIS ROUTINE
1256 * OUTPUTS A BYTE IN ENHANCED
1257 * BINARY FORMAT. THE ENHANCEMENT
1258 * IS DONE BY SUBSTITUTING ASCII
1259 * LETTERS FOR THE ONES IN THE BYTE.
1260 * THE ASCII ENHANCEMENT LETTERS
1261 * ARE OBTAINED FROM THE STRING
1262 * POINTED TO BY THE INDEX REG. "X".
1263 *
1264 FD05 34 02 BIASCI PSHS A SAVE "A" ON STACK
1265 FD07 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1266 FD09 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1267 FD0B 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1268 FD0D 25 02 BCS PRTBA IF ONE PRINT LETTER
1269 FD0F 86 2D LDA #'- IF ZERO PRINT "-"
1270 FD11 8D 2F PRTBA BSR OUTCH PRINT IT
1271 FD13 8D 2B BSR OUT1S PRINT SPACE
1272 FD15 5A DECB SUB 1 FROM #BITS YET TO PRINT
1273 FD16 26 F1 BNE OUTBA
1274 FD18 35 82 PULS A,PC
1275 *
1276 IFD EXTOPT
1277 *
1278 * EXTENDED USER COMMANDS
1279 *
1280 USRCMD JMP [MONEXT+EXTCMD]
1281 ENDIF EXTOPT
1281 ENDIF EXTOPT
1282 *
1283 *
1284 FD1A 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ?
1285 FD1D 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1286 *
1287 * INCHE
1288 *
1289 * ---GETS CHARACTER FROM TERMINAL AND
1290 * ECHOS SAME. THE CHARACTER IS RETURNED
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY
1292 * BIT MASKED OFF. ALL OTHER REGISTERS
1293 * ARE PRESERVED.
1294 *
1295 FD1F 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1296 FD21 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1297 FD23 20 1D BRA OUTCH ECHO CHAR TO TERMINAL
1298 *
1299 * INCH
1300 *
1301 * GET CHARACTER FROM TERMINAL. RETURN
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1304 * IS 8 BITS AND IS NOT ECHOED.
1305 *
1306 *
1307 FD25 34 10 INCH PSHS X SAVE IX
1308 FD27 BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1309 FD2A A6 84 LDA ,X FETCH PORT STATUS
1310 FD2C 85 01 BITA #1 TEST READY BIT, RDRF ?
1311 IFD PS2OPT
1312 BNE GETST1
1313 LDX #PS2KBD
1314 LDA ,X
1315 BITA #1
1316 ENDIF PS2OPT
1316 ENDIF PS2OPT
1317 FD2E 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1318 FD30 A6 01 GETST1 LDA 1,X FETCH CHAR
1319 FD32 35 90 PULS X,PC RESTORE IX
1320 *
1321 * INCHEK
1322 *
1323 * CHECK FOR A CHARACTER AVAILABLE FROM
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1325 * FOR READ READY. ALL REGISTERS ARE
1326 * PRESERVED, AND THE "Z" BIT WILL BE
1327 * CLEAR IF A CHARACTER CAN BE READ.
1328 *
1329 *
1330 FD34 34 02 INCHEK PSHS A SAVE A ACCUM.
1331 FD36 A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS
1332 FD3A 85 01 BITA #1 TEST READY BIT, RDRF ?
1333 IFD PS2OPT
1334 BNE INCHEK1
1335 LDA PS2KBD
1336 BITA #1 TEST READY BIT< RDRF ?
1337 ENDIF PS2OPT
1337 ENDIF PS2OPT
1338 FD3C 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1339 *
1340 FD3E 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1341 FD40 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1342 *
1343 *
1344 * OUTCH
1345 *
1346 * OUTPUT CHARACTER TO TERMINAL.
1347 * THE CHAR. TO BE OUTPUT IS
1348 * PASSED IN THE A REGISTER.
1349 * ALL REGISTERS ARE PRESERVED.
1350 *
1351 OUTCH IFD VDUOPT
1352 BSR VOUTCH
1353 ENDIF VDUOPT
1353 ENDIF VDUOPT
1354 IFD DG640OPT
1355 BSR VOUTCH
1356 ENDIF DG640OPT
1356 ENDIF DG640OPT
1357 FD42 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1358 FD44 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL
1359 FD47 A6 84 FETSTA LDA ,X FETCH PORT STATUS
1360 FD49 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1361 FD4B 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1362 FD4D 35 02 PULS A GET CHAR. FOR XMIT
1363 FD4F A7 01 STA 1,X XMIT CHAR.
1364 FD51 35 90 PULS X,PC RESTORE IX
1365 *
1366 * IO INITIALIZATION
1367 *
1368 FD53 IOINIZ EQU *
1369 IFD VDUOPT
1370 BSR VINIZ
1371 ENDIF VDUOPT
1371 ENDIF VDUOPT
1372 IFD DG640OPT
1373 BSR VINIZ
1374 ENDIF DG640OPT
1374 ENDIF DG640OPT
1375 FD53 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1376 FD56 86 03 LDA #3 RESET ACIA PORT CODE
1377 FD58 A7 84 STA ,X STORE IN CONTROL REGISTER
1378 FD5A 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1379 FD5C A7 84 STA ,X STORE IN CONTROL REGISTER
1380 FD5E 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1381 FD60 86 FF LDA #$FF TURN ON ECHO FLAG
1382 FD62 B7 DF E2 STA ECHO
1383 FD65 39 RTS
1384 *
1385 IFD VDUOPT
1386 *
1387 ***************************************************
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1389 * *
1390 * 80 x 25 Characters
1391 *
1392 ***************************************************
1393 *
1394 ***************************************************
1395 * INITIALIZE EMULATOR *
1396 ***************************************************
1397 *
1398 VINIZ LDX #VDU
1399 LDD #0
1400 STD COLADX AND ROWADX
1401 STA VDUCOL,X
1402 STB VDUROW,X
1403 STB VDUOFF,X
1404 STD NEWROW AND ESCFLG
1405 LDB #$02
1406 STB VDUATT,X
1407 CLR ESCFLG
1408 LDA #$1B SEND ESCAPE
1409 BSR VOUTCH
1410 LDA #'Y CLEAR TO END OF SCREEN
1411 *
1412 ** VIDEO OUTPUT ROUTINE
1413 *
1414 VOUTCH PSHS A,B,X SAVE REGISTERS
1415 LDX #VDU POINT TO VDU REGISTERS
1416 *
1417 ** CHECK FOR ESCAPE SEQUENCE
1418 *
1419 TST ESCFLG ESCAPE ACTIVE?
1420 BEQ SOROU1 BRANCH IF NOT
1421 BSR ESCAPE ELSE DO ESCAPE
1422 BRA RETURN AND RETURN
1423 *
1424 ** CHECK FOR CONTROL CHARACTERS
1425 *
1426 SOROU1 CMPA #$20 CONTROL CODES?
1427 BHS SOROU2
1428 BSR CONTRL BRANCH IF SO
1429 BRA RETURN
1430 *
1431 ** OUTPUT TEXT CHARACTER
1432 *
1433 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1434 LBSR NEWCOL UPDATE COLUMN
1435 *
1436 ** DISPLAY CURSOR AND RETURN
1437 *
1438 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1439 *
1440 ***************************************************
1441 * CONTROL CODE HANDLERS *
1442 ***************************************************
1443 *
1444 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1445 LBEQ BACKSP
1446 CMPA #$1B ESCAPE SEQUENCE?
1447 LBEQ SETESC
1448 CMPA #$1A CTRL Z - Clear Screen
1449 LBEQ CLRSCR
1450 CMPA #$16 CTRL ^ - Home
1451 LBEQ HOME
1452 CMPA #$D CTRL M - RETURN?
1453 LBEQ CRETN
1454 CMPA #$0C CTRL L - CHAR RIGHT
1455 LBEQ CHRIGHT
1456 CMPA #$0B CTRL K - MOVE UP ONE LINE
1457 LBEQ LINEUP
1458 CMPA #$0A CTRL J - LINE FEED
1459 BNE RETESC NONE OF THESE, RETURN
1460 *
1461 ***************************************** LINE FEED
1462 *
1463 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1464 INCB BUMP ROW
1465 CMPB #NUMLIN SCROLL TIME?
1466 LBNE NEWCUR POSITION CURSOR IF NOT
1467 LBRA SCROLL ELSE SCROLL IT
1468 *
1469 ***************************************** LINE FEED
1470 *
1471 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1472 TSTB AT TOP OF SCREEN ?
1473 LBEQ RETESC Yes, Ignore
1474 DECB No, Decrement ROW
1475 LBRA NEWCUR POSITION CURSOR
1476 *
1477 *********************************** BACK SPACE
1478 *
1479 BACKSP LDA COLADX
1480 BEQ RETESC RETURN
1481 DECA
1482 LBRA POSCOL POSITION CURSOR
1483 *
1484 *********************************** CURSOR RIGHT
1485 *
1486 CHRIGHT LDA COLADX
1487 INCA
1488 CMPA #LINLEN
1489 LBEQ RETESC
1490 LBRA POSCOL
1491 *
1492 *********************************** CURSOR RIGHT
1493 *
1494 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1495 LBRA NEWCUR
1496 *
1497 ***************************************************
1498 * ESCAPE HANDLERS *
1499 ***************************************************
1500 *
1501 ESCAPE LDAB ESCFLG GET FLAG
1502 CMPB #'= SETTING CURSOR?
1503 BEQ ESCCUR BRANCH IF SO
1504 CMPA #'Y CLEAR TO END OF SCREEN?
1505 LBEQ ESCCLS
1506 CMPA #'T CLEAR TO END OF LINE?
1507 BEQ ESCCLL
1508 CMPA #'= STARTING CURSOR SET?
1509 BNE CLRESC BRANCH IF NOT
1510 *
1511 ***************************** START ESCAPE SEQUENCE
1512 *
1513 SETESC STAA ESCFLG ELSE START CURSORING
1514 RTS AND RETURN
1515 *
1516 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1517 RETESC RTS SO RETURN
1518 *
1519 ********************************* SET SCREEN CURSOR
1520 *
1521 ESCCUR TST NEWROW ROW SET?
1522 BNE ESCCU1 BRANCH IF SO
1523 STAA NEWROW ELSE SET NEW ROW
1524 RTS AND RETURN
1525 *
1526 ESCCU1 CLR ESCFLG
1527 SUBA #$20 ADJUST COLUMN ADDRESS
1528 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1529 BHI RETESC NOT OK, DO NOTHING
1530 *
1531 ESCCU2 LDAB NEWROW
1532 CLR NEWROW
1533 SUBB #$20 ADJUST TO ROW ADDRESS
1534 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1535 BHI RETESC ELSE RETURN DOING NOTHING
1536 BRA NEWCUR GO SET NEW CURSOR IF SO
1537 *
1538 ****************** CLEAR FROM CURSOR TO END OF LINE
1539 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1540 BSR NEWCUR
1541 ESCCLL LDA COLADX
1542 LDB #$20 AND CLEAR CHAR
1543 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1544 INCA
1545 STA VDUCOL,X
1546 CMPA #LINLEN UNTIL END OF LINE
1547 BNE ESCCL1
1548 CLR ESCFLG
1549 RTS
1550 *
1551 *********************************** CARRIAGE RETURN
1552 *
1553 CRETN CLRA SET COLUMN ZERO
1554 POSCOL LDB ROWADX GET CURRENT ROW
1555 *
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN
1557 *
1558 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1559 STA VDUCOL,X SET NEW COLUMN
1560 STB VDUROW,X SET NEW ROW
1561 RTS AND RETURN
1562 *
1563 ********************* UPDATE CURRENT COLUMN AND ROW
1564 *
1565 NEWCOL LDD COLADX GET ROW AND COLUMN
1566 INCA BUMP COLUMN
1567 CMPA #LINLEN ROLL?
1568 BNE NEWCUR BRANCH IF NOT
1569 CLRA ELSE RESET TO ZERO
1570 INCB AND BUMP ROW
1571 CMPB #NUMLIN
1572 BNE NEWCUR
1573 DECB BOTTOM ROW
1574 BSR NEWCUR
1575 *
1576 ********************************* SCROLL THE SCREEN
1577 *
1578 SCROLL LDB VDUOFF,X
1579 INCB
1580 CMPB #NUMLIN
1581 BLO SCROL1
1582 CLRB
1583 SCROL1 STB VDUOFF,X
1584 *
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN
1586 *
1587 ESCCLS LDB COLADX GET CURSOR
1588 LDA #$20 GET A SPACE
1589 ESCCLS1 STB COLADX
1590 STB VDUCOL,X
1591 STA VDUCHR,X
1592 INCB
1593 CMPB #LINLEN
1594 BNE ESCCLS1
1595 *
1596 LDB ROWADX
1597 INCB
1598 CMPB #NUMLIN
1599 BEQ ESCCLS2
1600 STB ROWADX
1601 STB VDUROW,X
1602 CLRB
1603 BRA ESCCLS1
1604 *
1605 ESCCLS2 CLRB
1606 STB COLADX
1607 STB VDUCOL,X
1608 STB ESCFLG
1609 RTS
1610 ENDIF VDUOPT
1610 ENDIF VDUOPT
1611 *
1612 IFD DG640OPT
1613 ***************************************************
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1615 * *
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1619 * 16x64 BOARD). *
1620 ***************************************************
1621
1622 ***************************************************
1623 * INITIALIZE EMULATOR *
1624 ***************************************************
1625
1626 VINIZ LDX #0
1627 STX COLADX AND ROWADX
1628 STX NEWROW AND ESCFLG
1629 LDX #SCREEN POINT TO SCREEN
1630 STX CURSOR SET PROGRAM CURSOR
1631 LDA #$1B SEND ESCAPE
1632 BSR VOUTCH
1633 LDA #'Y CLEAR TO END OF SCREEN
1634 *
1635 ** VIDEO OUTPUT ROUTINE
1636 *
1637 VOUTCH PSHS A,B,X SAVE REGISTERS
1638 *
1639 ** CLEAR CURSOR
1640 LDX CURSOR
1641 LDB 0,X
1642 ANDB #$7F
1643 STB 0,X
1644 *
1645 ** CHECK FOR ESCAPE SEQUENCE
1646 TST ESCFLG ESCAPE ACTIVE?
1647 BEQ SOROU1 BRANCH IF NOT
1648 BSR ESCAPE ELSE DO ESCAPE
1649 BRA RETURN AND RETURN
1650 *
1651 ** CHECK FOR CONTROL CHARACTERS
1652 SOROU1 CMPA #$20 CONTROL CODES?
1653 BHS SOROU2
1654 BSR CONTRL BRANCH IF SO
1655 BRA RETURN
1656 *
1657 ** OUTPUT TEXT CHARACTER
1658 SOROU2 LDX CURSOR ELSE GET CURSOR
1659 STAA 0,X DISPLAY CHARACTER
1660 LBSR NEWCOL UPDATE COLUMN
1661 *
1662 ** DISPLAY CURSOR AND RETURN
1663 RETURN LDX CURSOR AND DISPLAY IT
1664 LDB ,X
1665 ORAB #$80 WITH REVID
1666 STB ,X
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1668
1669 ***************************************************
1670 * CONTROL CODE HANDLERS *
1671 ***************************************************
1672
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1674 LBEQ BACKSP
1675 CMPA #$1B ESCAPE SEQUENCE?
1676 LBEQ SETESC
1677 CMPA #$D CTRL M - RETURN?
1678 LBEQ CRETN
1679 CMPA #$0A CTRL J - LINE FEED
1680 BNE RETESC NONE OF THESE, RETURN
1681
1682 ***************************************** LINE FEED
1683
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1685 INCB BUMP ROW
1686 CMPB #NUMLIN SCROLL TIME?
1687 LBNE NEWCUR POSITION CURSOR IF NOT
1688 LBRA SCROLL ELSE SCROLL IT
1689
1690 ***************************************** LINE FEED
1691
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1693 TSTB AT TOP OF SCREEN ?
1694 BEQ RETESC Yes, Ignore
1695 DECB No, Decrement ROW
1696 LBRA NEWCUR POSITION CURSOR
1697
1698
1699 *********************************** BACK SPACE
1700
1701 BACKSP LDA COLADX
1702 BEQ RETESC RETURN
1703 DECA
1704 LBRA POSCOL POSITION CURSOR
1705
1706 *********************************** CURSOR RIGHT
1707
1708 CHRIGHT LDA COLADX
1709 INCA
1710 CMPA #LINLEN
1711 BEQ RETESC
1712 LBRA POSCOL
1713
1714 ***************************************************
1715 * ESCAPE HANDLERS *
1716 ***************************************************
1717
1718 ESCAPE LDAB ESCFLG GET FLAG
1719 CMPB #'= SETTING CURSOR?
1720 BEQ ESCCUR BRANCH IF SO
1721 CMPA #'Y CLEAR TO END OF SCREEN?
1722 LBEQ ESCCLS
1723 CMPA #'T CLEAR TO END OF LINE?
1724 BEQ ESCCLL
1725 CMPA #'E INSERT LINE?
1726 BEQ ESCINL
1727 CMPA #'R DELETE LINE?
1728 BEQ ESCDLL
1729 CMPA #'= STARTING CURSOR SET?
1730 BNE CLRESC BRANCH IF NOT
1731
1732 ***************************** START ESCAPE SEQUENCE
1733
1734 SETESC STAA ESCFLG ELSE START CURSORING
1735 RTS AND RETURN
1736
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1738 RETESC RTS SO RETURN
1739
1740 ********************************* SET SCREEN CURSOR
1741
1742 ESCCUR TST NEWROW ROW SET?
1743 BNE ESCCU1 BRANCH IF SO
1744 STAA NEWROW ELSE SET NEW ROW
1745 RTS AND RETURN
1746
1747 ESCCU1 CLR ESCFLG
1748 SUBA #$20 ADJUST COLUMN ADDRESS
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1750 BHI RETESC NOT OK, DO NOTHING
1751
1752 ESCCU2 LDAB NEWROW
1753 CLR NEWROW
1754 SUBB #$20 ADJUST TO ROW ADDRESS
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1756 BHI RETESC ELSE RETURN DOING NOTHING
1757 BRA NEWCUR GO SET NEW CURSOR IF SO
1758 *
1759 *************************** DELETE LINE FROM SCREEN
1760
1761 ESCDLL BSR CRETN GO COL. ZERO
1762 LDB ROWADX
1763 CMPB #NUMLIN-1
1764 BEQ SCROL3
1765 BRA SCROL1 AND DELETE THIS LINE
1766
1767 *************************** INSERT LINE INTO SCREEN
1768
1769 ESCINL BSR CRETN GO TO COL. ZERO
1770 LDAB ROWADX
1771 CMPB #NUMLIN-1
1772 BEQ ESCCLL
1773 *
1774 ** SCROLL SCREEN DOWN FROM CURSOR
1775 *
1776 LDX #SCREEN+SCNLEN-LINLEN
1777 ESCIN0 LDAA 0,-X
1778 STAA LINLEN,X
1779 LDA SCNLEN,X
1780 STA SCNLEN+LINLEN,X
1781 CPX CURSOR
1782 BNE ESCIN0
1783
1784 ****************** CLEAR FROM CURSOR TO END OF LINE
1785
1786 ESCCLL LDA COLADX GET CURRENT COLUMN
1787 LDX CURSOR GET CURSOR
1788 LDB #$20 AND CLEAR CHAR
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
1790 STB ,X+ CLEAR TEXT
1791 INCA
1792 CMPA #LINLEN UNTIL END OF LINE
1793 BNE ESCLL1
1794 CLR ESCFLG
1795 RTS
1796
1797 *********************************** CARRIAGE RETURN
1798
1799 CRETN CLRA SET COLUMN ZERO
1800 POSCOL LDB ROWADX GET CURRENT ROW
1801
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN
1803
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1805 LDA #LINLEN ELSE ADD A LINE
1806 MUL LINLEN * ROWADX
1807 ADDB COLADX
1808 ADCA #0
1809 ADDD #SCREEN ADD SCREEN BASE.
1810 STD CURSOR SAVE NEW CURSOR
1811 TFR D,X GET CURSOR IN X
1812 RTS AND RETURN
1813
1814 ********************* UPDATE CURRENT COLUMN AND ROW
1815
1816 NEWCOL LDD COLADX GET ROW AND COLUMN
1817 INCA BUMP COLUMN
1818 CMPA #LINLEN ROLL?
1819 BNE NEWCUR BRANCH IF NOT
1820 CLRA ELSE RESET TO ZERO
1821 INCB AND BUMP ROW
1822 CMPB #NUMLIN
1823 BNE NEWCUR
1824 DECB BOTTOM ROW
1825 BSR NEWCUR
1826
1827 ********************************* SCROLL THE SCREEN
1828
1829 SCROLL LDX #SCREEN POINT TO SCREEN
1830 SCROL1 LDA SCNLEN+LINLEN,X
1831 STA SCNLEN,X
1832 LDAA LINLEN,X MOVE TWO BYTES
1833 STAA 0,X+ UP ONE LINE
1834 CMPX #SCREEN+SCNLEN-LINLEN
1835 BNE SCROL1 LOOP UNTIL DONE
1836 BRA SCROL3
1837
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN
1839
1840 ESCCLS LDX CURSOR GET CURSOR
1841 SCROL3 LDAA #$20 GET A SPACE
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
1843 STA ,X+ AND TEXT
1844 CMPX #SCREEN+SCNLEN
1845 BNE SCROL2 UNTIL DONE
1846 CLR ESCFLG
1847 RTS
1848 ENDIF DG640OPT
1848 ENDIF DG640OPT
1849 *
1850 IFD PRTOPT
1851 *************************************
1852 *
1853 ** PRINTER DRIVER ROUTINES
1854 *
1855 *************************************
1856 *
1857 ** PINIZ - INITIATE PRINTER PORT
1858 *
1859 PINIZ PSHS B
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
1861 STD PADATA SET DDR AND SELECT DATA
1862 *
1863 ** RESET PRINTER
1864 LDB #PRESET
1865 STAB PADATA
1866 RESTLP INCB DELAY FOR RESET
1867 BNE RESTLP
1868 STAA PADATA ACCA=DIRMSK
1869 *
1870 ** INITALIZE PORT B (DATA PORT)
1871 LDAA #$2A
1872 STAA PBCTRL
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110
1874 STD PBDATA PBDREG PBCTRL
1875 *
1876 ** SELECT 66 LINES/PAGE
1877 LDAA #$1B
1878 BSR POUTCH
1879 LDAA #'C
1880 BSR POUTCH
1881 LDAA #66
1882 PULS B
1883 *************************************
1884 *
1885 ** OUTPUT A CHARACTER TO THE PRINTER
1886 *
1887 *************************************
1888 POUTCH PSHS B
1889 LDAB PBDATA CLEAR INTERRUPT BIT
1890 *
1891 ** WAIT TILL NOT BUSY
1892 BUSYLP LDAB PADATA
1893 BITB #PERROR
1894 BEQ PEXIT
1895 TSTB
1896 BMI BUSYLP
1897 *
1898 ** NOW OUTPUT CHARACTER
1899 STAA PBDATA
1900 PEXIT PULS B,PC
1901 *************************************
1902 *
1903 ** PCHK TEST IFD PRINTER READY
1904 *
1905 *************************************
1906 PCHK TST PBCTRL TEST STATE OF CRB7
1907 RTS SET ON ACKNOWLEDGE
1908 ENDIF PRTOPT
1908 ENDIF PRTOPT
1909 *************************************
1910 *
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE
1912 *
1913 *************************************
1914 *
1915 FD66 JMPTAB EQU *
1916 FD66 01 FCB 1 " ^A "
1917 FD67 FB FC FDB ALTRA
1918 FD69 02 FCB 2 " ^B "
1919 FD6A FB F1 FDB ALTRB
1920 FD6C 03 FCB 3 " ^C "
1921 FD6D FC 07 FDB ALTRCC
1922 FD6F 04 FCB 4 " ^D "
1923 FD70 FB E6 FDB ALTRDP
1924 FD72 10 FCB $10 " ^P "
1925 FD73 FB B9 FDB ALTRPC
1926 FD75 15 FCB $15 " ^U "
1927 FD76 FB C5 FDB ALTRU
1928 FD78 18 FCB $18 " ^X "
1929 FD79 FB DB FDB ALTRX
1930 FD7B 19 FCB $19 " ^Y "
1931 FD7C FB D0 FDB ALTRY
1932 *
1933 FD7E 42 FCC 'B'
1934 FD7F F9 5C FDB BRKPNT
1935 FD81 45 FCC 'E'
1936 FD82 F8 FD FDB MEMDUMP
1937 FD84 47 FCC 'G'
1938 FD85 F8 A5 FDB GO
1939 FD87 4C FCC 'L'
1940 FD88 FA E6 FDB LOAD
1941 FD8A 50 FCC 'P'
1942 FD8B FB 44 FDB PUNCH
1943 FD8D 4D FCC 'M'
1944 FD8E F8 A8 FDB MEMCHG
1945 FD90 52 FCC 'R'
1946 FD91 FC 75 FDB REGSTR
1947 FD93 53 FCC 'S'
1948 FD94 F8 F1 FDB DISSTK
1949 FD96 58 FCC 'X'
1950 FD97 F9 88 FDB XBKPNT
1951 IFD MFDCOPT
1952 FD99 44 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
1953 FD9A F9 D5 FDB MINBOOT
1954 ENDIF MFDCOPT
1955 IFD CF8OPT
1956 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
1957 FDB CFBOOT
1958 ENDIF CF8OPT
1958 ENDIF CF8OPT
1959 IFD IDEOPT
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
1961 FDB IDEBOOT
1962 ENDIF IDEOPT
1962 ENDIF IDEOPT
1963 IFD DMAFOPT
1964 FD9C 55 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
1965 FD9D FA 29 FDB DBOOT
1966 ENDIF DMAFOPT
1967 IFD EXTOPT
1968 FCC 'U' *** IF FPGA, 'U' IS FOR USER
1969 FDB USRCMD
1970 ENDIF EXTOPT
1970 ENDIF EXTOPT
1971 IFD RTCOPT
1972 FCC 'T'
1973 FDB TIMSET
1974 ENDIF RTCOPT
1974 ENDIF RTCOPT
1975 IFD TRAOPT
1976 FCC "T"
1977 FDB TRACE
1978 ENDIF TRAOPT
1978 ENDIF TRAOPT
1979 *
1980 FD9F TABEND EQU *
1981 *
1982 * ** 6809 VECTOR ADDRESSES **
1983 *
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
1988 * HIS OWN ROUTINES IF HE SO DESIRES.
1989 *
1990 *
1991 FD9F F9 94 RAMVEC FDB SWIE USER-V
1992 FDA1 F8 A7 FDB RTI SWI3-V
1993 FDA3 F8 A7 FDB RTI SWI2-V
1994 FDA5 F8 A7 FDB RTI FIRQ-V
1995 FDA7 F8 A7 FDB RTI IRQ-V
1996 FDA9 F9 94 FDB SWIE SWI-V
1997 FDAB FF FF FDB $FFFF SVC-VO
1998 FDAD FF FF FDB $FFFF SVC-VL
1999 *
2000 * PRINTABLE MESSAGE STRINGS
2001 *
2002 FDAF 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2003 FDB4 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR '
55 47 20 31 2E 34
20 46 4F 52 20
2004 IFD S3EOPT
2005 FCC 'S3E '
2006 ENDIF S3EOPT
2006 ENDIF S3EOPT
2007 IFD B5XOPT
2008 FCC 'B5-X300 '
2009 ENDIF B5XOPT
2009 ENDIF B5XOPT
2010 IFD S3SOPT
2011 FCC 'S3STARTER '
2012 ENDIF S3SOPT
2012 ENDIF S3SOPT
2013 IFD ADSOPT
2014 FCC 'ADS6809 '
2015 ENDIF ADSOPT
2015 ENDIF ADSOPT
2016 IFD SWTOPT`
2017 FDC5 53 57 54 50 43 20 FCC 'SWTPC '
2018 ENDIF SWTOPT
2019 IFD XESOPT`
2020 FCC 'XESS '
2021 ENDIF XESOPT
2021 ENDIF XESOPT
2022 FDCB 20 2D 20 FCC ' - '
2023 FDCE 04 FCB 4
2024 FDCF 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2025 FDD6 3E MSG3 FCC '>'
2026 FDD7 04 FCB 4
2027 FDD8 57 48 41 54 3F MSG4 FCC 'WHAT?'
2028 FDDD 04 FCB 4
2029 FDDE 20 2D 20 MSG5 FCC ' - '
2030 FDE1 04 FCB 4'
2031 FDE2 20 20 53 50 3D MSG10 FCC ' SP='
2032 FDE7 04 FCB 4
2033 FDE8 20 20 50 43 3D MSG11 FCC ' PC='
2034 FDED 04 FCB 4
2035 FDEE 20 20 55 53 3D MSG12 FCC ' US='
2036 FDF3 04 FCB 4
2037 FDF4 20 20 49 59 3D MSG13 FCC ' IY='
2038 FDF9 04 FCB 4
2039 FDFA 20 20 49 58 3D MSG14 FCC ' IX='
2040 FDFF 04 FCB 4
2041 FE00 20 20 44 50 3D MSG15 FCC ' DP='
2042 FE05 04 FCB 4
2043 FE06 20 20 41 3D MSG16 FCC ' A='
2044 FE0A 04 FCB 4
2045 FE0B 20 20 42 3D MSG17 FCC ' B='
2046 FE0F 04 FCB 4
2047 FE10 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2048 FE16 04 FCB 4
2049 FE17 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2050 FE1F 53 31 MSG20 FCC 'S1'
2051 FE21 04 FCB 4
2052 IFD DATOPT
2053 *
2054 * POWER UP/ RESET/ NMI ENTRY POINT
2055 *
2056 FF00 ORG $FF00
2057 *
2058 *
2059 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11
2060 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO
2061 *
2062 *
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2067 * STORED IN IT.
2068 *
2069 *
2070 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2071 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION
2072 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2073 *
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2076 * PHYSICAL ADDRESSES.
2077 *
2078 FF0A 86 F0 LDA #$F0
2079 FF0C A7 84 STA ,X STORE $F0 AT $FFFF
2080 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2081 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2082 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2083 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0
2084 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2085 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2086 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER
2087 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2088 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2089 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN
2090 *
2091 *
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2096 * IS STORED IN RAM IN THE LOCATION THAT IS
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2102 * "7" IN THE $70A0 WILL BE STORED IN
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2111 * OF RAM RESPONDS.
2112 *
2113 *
2114 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2115 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2116 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS
2117 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN
2118 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING
2119 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS
2120 FF32 44 LSRA TRANSLATION RAM.
2121 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D"
2122 *
2123 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER
2124 *
2125 *
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2133 *
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2136 *
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2139 *
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2142 *
2143 *
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2151 * MEMORY ADDRESSED AS FOLLOWS....
2152 *
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2155 *
2156 *
2157 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2158 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2159 FF40 6F 2E CLR 14,Y CLEAR $DFDE
2160 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2161 FF44 A7 2F STA 15,Y STORE AT $DFDF
2162 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2163 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2164 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2165 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2166 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2167 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2168 FF54 27 22 BEQ FINTAB SKIP IF FINISHED
2169 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2170 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2171 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2172 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION
2173 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2174 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2175 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2176 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2177 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2178 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2179 FF6E 44 LSRA
2180 FF6F 44 LSRA
2181 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2182 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2183 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2184 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2185 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2186 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE
2187 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE
2188 *
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2193 *
2194 *
2195 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C"
2196 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2197 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2198 FF86 4A DECA ELSE POINT 4K LOWER
2199 FF87 2A F9 BPL FINDC GO TRY AGAIN
2200 FF89 20 14 BRA XFERTF
2201 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2202 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2203 *
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2207 * ADDRESSES FROM $0000 AND UP....
2208 *
2209 FF8F 4F CLRA START AT ZERO
2210 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2211 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2212 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP
2213 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE
2214 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2215 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY
2216 FF9B 81 0C CMPA #$0C LAST ENTRY YET ?
2217 FF9D 2D F3 BLT COMPRS
2218 *
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2221 * THE MP-09 CPU CARD.
2222 *
2223 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2224 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE
2225 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2226 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11
2227 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE
2228 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED
2229 *
2230 ELSE
2231 LRA RTS
2232 START LDS #STACK INITIALIZE STACK POINTER
2233 CLRB
2234 ENDIF DATOPT
2234 ENDIF DATOPT
2235 *
2236 FFAB 53 COMB SET "B" NON-ZERO
2237 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG
2238 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE
2239 *
2240 ** INTERRUPT JUMP VECTORS
2241 *
2242 FFB2 6E 9F DF C0 V1 JMP [STACK]
2243 FFB6 6E 9F DF C4 V2 JMP [SWI2]
2244 FFBA 6E 9F DF C6 V3 JMP [FIRQ]
2245 FFBE 6E 9F DF C8 V4 JMP [IRQ]
2246 FFC2 6E 9F DF CA V5 JMP [SWI]
2247 *
2248 * SWI3 ENTRY POINT
2249 *
2250 FFC6 1F 43 SWI3E TFR S,U
2251 FFC8 AE 4A LDX 10,U *$FFC8
2252 FFCA E6 80 LDB ,X+
2253 FFCC AF 4A STX 10,U
2254 FFCE 4F CLRA
2255 FFCF 58 ASLB
2256 FFD0 49 ROLA
2257 FFD1 BE DF CC LDX SVCVO
2258 FFD4 8C FF FF CMPX #$FFFF
2259 FFD7 27 0F BEQ SWI3Z
2260 FFD9 30 8B LEAX D,X
2261 FFDB BC DF CE CMPX SVCVL
2262 FFDE 22 08 BHI SWI3Z
2263 FFE0 34 10 PSHS X
2264 FFE2 EC C4 LDD ,U
2265 FFE4 AE 44 LDX 4,U
2266 FFE6 6E F1 JMP [,S++]
2267 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP
2268 FFEA EE 42 LDU 2,U
2269 FFEC 6E 9F DF C2 JMP [SWI3]
2270 *
2271 * 6809 VECTORS
2272 *
2273 FFF0 ORG $FFF0
2274 FFF0 FF B2 FDB V1 USER-V
2275 FFF2 FF C6 FDB SWI3E SWI3-V
2276 FFF4 FF B6 FDB V2 SWI2-V
2277 FFF6 FF BA FDB V3 FIRQ-V
2278 FFF8 FF BE FDB V4 IRQ-V
2279 FFFA FF C2 FDB V5 SWI-V
2280 FFFC FF B2 FDB V1 NMI-V
2281 FFFE FF 00 FDB START RESTART-V
0004 END START
0005 END
Program + Init Data = 1826 bytes
Error count = 0
/sys09ads.sh
0,0 → 1,2
../../Tools/as09/as09.exe sys09ads.txt -l > sys09ads.lst
 
/sys09b5x_b4_0.vhd
0,0 → 1,16
INIT_00 => x"A780A610C6C0DF8E106DFE8E2EFA1AFB1EFB8FFBCAFCB5FC97FC9DFC61F814F8",
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC65B0117E0DFBF00E08EF9265AA0",
INIT_02 => x"03179FFE8E0C0417F62A5A19048B0327856D0DC64FD0DF8E4703177DFE8E9B04",
INIT_03 => x"17408B981F4F04175E86092C2081891FF1270D817F84330417B30217A6FE8E2E",
INIT_04 => x"20F00217A8FE8EF5266DFE8C02300F2780E137FE8E20C0022F60C14304174804",
INIT_05 => x"17A4A60B0417A50317211F650217AEFE8E121F2D296B03173B341FBC2094ADC0",
INIT_06 => x"27A4A1A4A7390F260D8117275E81DD271881E127088111285E0317030417A503",
INIT_07 => x"0B031705201F30C0DF8E321FA20217BE203F31C2202131E103173F86E4031708",
INIT_08 => x"279603170527E4AC011FF0C4201F0634F0C41000C3101F390124E1AC20340629",
INIT_09 => x"265A8A03172C031780A610C69203172E0317E4AEEE0117AEFE8E103439623203",
INIT_0a => x"29B70217BC20EE265A7303172E8602237E810425208180A610C6E1AE820317F5",
INIT_0b => x"3984A73F86A4AFA0A709273F8184A60F271035558DFFFF8E10341A24C0DF8C1E",
INIT_0c => x"4AAF0427268D1F304AAE431F39FB265A188D08C6E3DF8E104203163F86450317",
INIT_0d => x"A7A0A7A0A7FF8684A7A4A604263F8184A60A24C0DF8C21AEB9FE16480217068D",
INIT_0e => x"0186398D46E0B7E086408D393D3139F7265A0427A1ACA0A608C6E3DF8E1039A0",
INIT_0f => x"178D47E0B7208645E0B744E0B743E0B74F42E0B701862D8D47E0B7EF8641E0B7"
/opt_s3e.txt
0,0 → 1,18
*
***************************************************
* OPTION SWITCHES
***************************************************
*
*
** THE CONTROL PORT CAN ONLY BE ONE OF THESE
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
** FOR LOADING AND SAVING S1 RECORDS
*
S3EOPT EQU $FF SPARTAN3E STARTER
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
*
END
/sys09b5x_b4_1.vhd
0,0 → 1,16
INIT_00 => x"E0B6F926808547E0B63B341F4AAF00C08EF42600C28C80A740E0B6218D00C08E",
INIT_01 => x"54545454A6E6D0DF8E104444444462A6363439F927088547E0B639F227408547",
INIT_02 => x"FCBD8435FD265A20C60434B63562E762EA62A70F8462A65858585853A6E6E4E7",
INIT_03 => x"0234A80117F12631813D2739811F0217F9265381260217E2DF7F6402171186DF",
INIT_04 => x"E0EB02340C2904358E01170434E46AE46AE4EBE0EBE0E6103421299101172629",
INIT_05 => x"0117E26F0E02161386E2DF731602173F86BA27FFC102355FEB2080A70527E46A",
INIT_06 => x"2320008310062762A3E4ECF501171286DFFCBDE4AF0130492562AC4D2930344A",
INIT_07 => x"1780A684EB63EB62EB68011762AE750117981F03CB2F0017EFFE8E64E720C602",
INIT_08 => x"10347120028D396532B301171486C326E4AC62AF5B0117981F53F526646A6501",
INIT_09 => x"8D618D394AAF0229F68DF28D910017E50016F800169D01169035690017A0FE8E",
INIT_0a => x"498D3944AF0229D58DD18D5E8D3946AF0229E08DDC8D728D3948AF0229EB8DE7",
INIT_0b => x"8D3941A70229B18DB08D588D3942A70229BC8DBB8D6C8D3943A70229C78DC68D",
INIT_0c => x"BF0016311FF48DB2FE8E39F726048180A63B011739C4A7808A0429A68DA58D5F",
INIT_0d => x"8DC4FE8EE12044AED78DCAFE8EB4001643A6E18DD0FE8EF42048AEEA8DBEFE8E",
INIT_0e => x"D02042A6B38DDBFE8ED92041A6BC8DD6FE8ECF204AAEC58DB8FE8ED82046AECE",
INIT_0f => x"AEFE8EBF8DB88DB08DA98DA18D27FF17AEFE8E900016E7FE8EC4A6AA8DE0FE8E"
/SYS09S3S.S19
0,0 → 1,66
S123F800F814F861FCA1FC9BFCB9FCCEFB8FFB1EFB1AFA2E8EFE74108EDFC0C610A680A70C
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2
S123F840049F8EFE841703478EDFD04FC60D6D8527038B04195A2AF617040C8EFEA817037E
S123F8602E8EFEAF1702B3170437847F810D27F11F8981202C09865E1704531F988B4017EB
S123F880044C170447C1602F02C0208EFE3BE180270F30028CFE7426F58EFEB11702F02071
S123F8A0C0AD9420BC1F343B17036B292D1F128EFEB71702651F211703A517040FA6A41782
S123F8C003A517040717035E2811810827E1811827DD815E2717810D260F39A7A4A1A427AB
S123F8E0081703E8863F1703E5312120C2313F20BE1702A21F328EDFC0301F200517030BE2
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE4270517039A27DB
S123F9200332623934108EFEB71701EEAEE417032E170396C610A68017032C17038E5A2672
S123F940F5170386AEE1C610A68081202504817E2302862E1703775A26EE20BC1702B7290D
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2
S123F980170349863F160346108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4AD5
S123F9A08D0617024816FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A717
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D398D4086E0B7E0468D398601AA
S123F9E0B7E04186EFB7E0478D2D8601B7E0424FB7E043B7E044B7E0458620B7E0478D17B6
S123FA008EC0008D21B6E040A7808CC20026F48EC000AF4A1F343BB6E047858026F9B6E015
S123FA2047854027F239B6E047850827F9393436A66244444444108EDFD0E6A654545454F6
S123FA40E7E4E6A65358585858A662840FA762EA62E76235B63404C6205A26FD3584BDFC67
S123FA60E386111702687FDFE217022A815326F91702238139273D813126F11701A83402F8
S123FA80292617019129213410E6E0EBE0EBE46AE46AE4340417018E3504290C3402EBE093
S123FAA06AE42705A78020EB5F3502C1FF27BA863F17021A73DFE286131602126FE2170107
S123FAC04A3430294DAC6225493001AFE4BDFCE386121701F9ECE4A36227061083002023A1
S123FAE002C620E7648EFEF817002FCB031F98170175AE62170168EB62EB63EB84A680171C
S123FB0001656A6426F5531F9817015BAF62ACE426C386141701B73265398D0220713410EE
S123FB208EFEA917006935901601A11600F81600E51700918DF28DF62902AF4A398D618D04
S123FB40E78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18DD52902AF44398D49E1
S123FB608DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB08DB12902A741398D7C
S123FB805F8DA58DA629048A80A7C43917013FA680810426F7398EFEBB8DF41F311600BF7D
S123FBA08EFEC78DEAAE4820F48EFED98DE1A6431600B48EFED38DD7AE4420E18EFECD8D4B
S123FBC0CEAE4620D88EFEC18DC5AE4A20CF8EFEDF8DBCA64120D98EFEE48DB3A64220D0C5
S123FBE08EFEE98DAAA6C48EFEF01600908EFEB717FF278DA18DA98DB08DB88DBF8EFEB7D4
S123FC0017FF178DC08DC78DCE20D58D09294D1F12862D1700B88D0E29421F018D08293CE3
S123FC203410A76135908D112932484848481F898D0729283404ABE0398D5B8130251D81B1
S123FC40392203803039814125128146220380373981612507816622038057391A023934D1
S123FC601035028D0235023402444444448D043502840F8B3081392F028B0720513402C62D
S123FC8008A68068E42502862D8D438D3F5A26F135826E9FF0007DDFE227068D04847F202C
S123FCA02D3410BEDFE0A684850126098EE020A684850127EEA60135903402A69FDFE085F5
S123FCC0012605B6E020850135828D0086208D453412BEDFE0A684850227FA3502A7013553
S123FCE0908D13BEDFE08603A7848611A7846D0186FFB7DFE2398EE030CC0000FDDFFBA751
S123FD0002E703E704FDDFFDC602E7017FDFFE861B8D02865934168EE0307DDFFE27048D1A
S123FD2074200D812024048D092005A7841700C53596810810270041811B1027006C811AED
S123FD401027008E811610270045810D10270099810C1027002C810B10270011810A2651A3
S123FD60FCDFFB5CC11910260083160099FCDFFB5D1027003C5A160074B6DFFB27334A1637
S123FD800068B6DFFB4C81501027002516005BCC0000160058F6DFFEC13D27168159102724
S123FDA0006E81542731813D2604B7DFFE397FDFFE397DDFFD2604B7DFFD397FDFFE80200F
S123FDC0814F22EDF6DFFD7FDFFDC020C11822E1201BCC00008D16B6DFFBC620E7844CA7D9
S123FDE002815026F77FDFFE394FF6DFFCFDDFFBA702E70339FCDFFB4C815026F04F5CC142
S123FE001926EA5A8DE7E6045CC11925015FE704F6DFFB8620F7DFFBE702A7845CC1502669
S123FE20F4F6DFFC5CC1192708F7DFFCE7035F20E45FF7DFFBE702F7DFFE3901FB7402FBE2
S123FE406903FB7F04FB5E10FB3115FB3D18FB5319FB4842F95C45F8FD47F8A54CFA5E5067
S123FE60FABC4DF8A852FBED53F8F158F98844F9D555FC92F994F8A7F8A7F8A7F8A7F99401
S123FE80FFFFFFFF0D0A000000535953303942554720312E3420464F52205333535441526B
S123FEA054455220202D20044B0D0A000000043E04574841543F04202D2004202053503D12
S123FEC004202050433D04202055533D04202049593D04202049583D04202044503D042063
S11EFEE020413D042020423D04202043433A2004454648494E5A564353310495
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB
S9030000FC
/sys09b5x_b4_2.vhd
0,0 → 1,16
INIT_00 => x"3C29088D011F42290E8DB400172D86121F4D29098DD520CE8DC78DC08D17FF17",
INIT_01 => x"811D253081578D39E0AB04342829078D891F484848483229118D903561A71034",
INIT_02 => x"3439021A39578003226681072561813937800322468112254181393080032239",
INIT_03 => x"C602344D20078B022F3981308B0F840235048D4444444402340235028D023510",
INIT_04 => x"BE10342D207F84048D0627E2DF7D8235F1265A3B8D3F8D2D860225E46880A608",
INIT_05 => x"B605260185E0DF9FA60234903501A6EE27018584A620E08E0926018584A6E0DF",
INIT_06 => x"BE138D903501A70235FA27028584A6E0DFBE1234458D2086008D8235018520E0",
INIT_07 => x"E703E702A7FBDFFD0000CC30E08E39E2DFB7FF86016D84A7118684A70386E0DF",
INIT_08 => x"810D20748D0427FEDF7D30E08E16345986028D1B86FEDF7F01E702C6FDDFFD04",
INIT_09 => x"8E0027101A816C0027101B814100271008819635C5001784A70520098D042420",
INIT_0a => x"5CFBDFFC51260A81110027100B812C0027100C81990027100D81450027101681",
INIT_0b => x"DFB66800164A3327FBDFB67400165A3C0027105DFBDFFC9900168300261019C1",
INIT_0c => x"54816E002710598116273DC1FEDFF65800160000CC5B00162500271050814CFB",
INIT_0d => x"ED224F812080FEDF7F39FDDFB70426FDDF7D39FEDF7F39FEDFB704263D813127",
INIT_0e => x"26508102A74C84E720C6FBDFB6168D0000CC1B20E12218C120C0FDDF7FFDDFF6",
INIT_0f => x"5AEA2619C15C4FF02650814CFBDFFC3903E702A7FBDFFDFCDFF64F39FEDF7FF7"
/sys09b5x_b4_3.vhd
0,0 → 1,16
INIT_00 => x"FCDFF6F42650C15C84A702E7FBDFF72086FBDFF604E75F012519C15C04E6E78D",
INIT_01 => x"7FFB0369FB0274FB0139FEDFF702E7FBDFF75FE4205F03E7FCDFF7082719C15C",
INIT_02 => x"F84DBCFA505EFA4CA5F847FDF8455CF94248FB1953FB183DFB1531FB105EFB04",
INIT_03 => x"000A0DFFFFFFFF94F9A7F8A7F8A7F8A7F894F9D5F94488F958F1F853EDFB52A8",
INIT_04 => x"4B04202D2020303033582D354220524F4620342E312047554239305359530000",
INIT_05 => x"2020043D43502020043D5053202004202D20043F54414857043E040000000A0D",
INIT_06 => x"043D422020043D412020043D50442020043D58492020043D59492020043D5355",
INIT_07 => x"000000000000000000000000000004315343565A4E4948464504203A43432020",
INIT_08 => x"300B2784AC1084AF1084EEAA558E10A0D08E84A7F086FB264A80A70F86F0FF8E",
INIT_09 => x"2DA7D0DF8E10C0DFCE10FDFFB74444444443101F84EFD620ED26A0F08C00F089",
INIT_0a => x"1084AF10AA558E1084EE2227A0F08C00F08930FB2A4AA66F0C862FA7F0862E6F",
INIT_0b => x"2EA7D0DF8E10F186D520A5A70F88891F44444444101FD0DF8E1084EFE92684AC",
INIT_0c => x"8EF32D0C814C80E7A66F0427A6E6211F4F2CE7A66F1420F92A4A0526A6E60C86",
INIT_0d => x"9F6EC6DF9F6EC4DF9F6EC0DF9F6E62F816E2DFF753F9265A80A7A0A610C6F0FF",
INIT_0e => x"0822CEDFBC8B300F27FFFF8CCCDFBE49584F4AAF80E64AAE431FCADF9F6EC8DF",
INIT_0f => x"00FFB2FFC2FFBEFFBAFFB6FFC6FFB2FFC2DF9F6E42EE1F37F16E44AEC4EC1034"
/opt_b5x.txt
0,0 → 1,18
*
***************************************************
* OPTION SWITCHES
***************************************************
*
*
** THE CONTROL PORT CAN ONLY BE ONE OF THESE
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
** FOR LOADING AND SAVING S1 RECORDS
*
*S3EOPT EQU $FF SPARTAN3E STARTER
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
*
END
/sys09swt.sh
0,0 → 1,18
../../Tools/as09/as09.exe sys09swt.txt -l > sys09swt.lst
/opt_xes.txt
0,0 → 1,18
*
***************************************************
* OPTION SWITCHES
***************************************************
*
*
** THE CONTROL PORT CAN ONLY BE ONE OF THESE
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
** FOR LOADING AND SAVING S1 RECORDS
*
*S3EOPT EQU $FF SPARTAN3E STARTER
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
*
END
/sys09bug.txt
0,0 → 1,2282
* NAM SYS09BUG12 SYSTEM09 MONITOR
OPT l
PAGE
*
* MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
* PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
*
* ALLEN CLARK WALLACE WATSON
* 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
* LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
* PH. 813-977-0347 PH. 813-985-1359
*
* MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
* 2561 NANTUCKET DR APT. E
* ATLANTA, GA 30345
* PH. 404-320-1043
*
* MODIFIED TO SYS09BUG VER 1.0
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 21ST NOVEMBER 2006
* REMOVED: DISK BOOTS
* MEMORY TEST
* ADDED: ADM3A VDU DRIVER
*
* MODIFIED TO SYS09BUG VER 1.1
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 7TH JANUARY 2007
* ADDED: 'U' USER EXTENTION COMMANDS AT $F000
* CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
* AND REALTIME CLOCK
*
* MODIFIED TO SYS09BUG VER 1.2
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 21ST MAY 2007
* ADDED: COMPACT FLASH BOOT TO FPGA VERSION
* REMOVED PORT REDIRECTION ON PUNCH & LOAD
*
* Modified to SYS09BUG VER 1.3
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 8TH JAN 2008
* ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
* WITH ONLY 32K OF RAM
*
* Modified to SYS09BUG VER 1.4
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 3RD FEB 2008
* ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
* SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
* 16 BIT IDE DISK BOOT STRAP ROUTINE
* CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
*
* *** COMMANDS ***
*
* CONTROL A = ALTER THE "A" ACCUMULATOR
* CONTROL B = ALTER THE "B" ACCUMULATOR
* CONTROL C = ALTER THE CONDITION CODE REGISTER
* CONTROL D = ALTER THE DIRECT PAGE REGISTER
* CONTROL P = ALTER THE PROGRAM COUNTER
* CONTROL U = ALTER USER STACK POINTER
* CONTROL X = ALTER "X" INDEX REGISTER
* CONTROL Y = ALTER "Y" INDEX REGISTER
* B hhhh = SET BREAKPOINT AT LOCATION $hhhh
* D = 5.25" MINIFLOPPY BOOT
* E ssss-eeee = EXAMINE MEMORY
* FROM STARTING ADDRESS ssss
* TO ENDING ADDRESS eeee.
* G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
* L = LOAD TAPE
* M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
* P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
* R = DISPLAY REGISTER CONTENTS
* S = DISPLAY STACK FROM ssss TO $DFC0
* U = 8" DMAF2 FLOPPY BOOT
* U = USER EXTENSION COMMANDS AT $F000
* X = REMOVE ALL BREAKPOINTS
*
*
***************************************************
* SYS09BUG VARIABLE SPACE
***************************************************
*
ORG MONRAM
STACK EQU * TOP OF INTERNAL STACK
NMI RMB 2 USER NMI VECTOR
SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
FIRQ RMB 2 FAST INTERRUPT VECTOR
IRQ RMB 2 INTERRUPT VECTOR
SWI RMB 2 SOFTWARE INTERRUPT VECTOR
SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
IFD DATOPT
LRARAM RMB 16 LRA ADDRESSES
ENDIF DATOPT
CPORT RMB 2 RE-VECTORABLE CONTROL PORT
ECHO RMB 1 ECHO FLAG
BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
IFD TRAOPT
NMISAV RMB 2 NMI Jump Vector Backup
TRACNT RMB 2 Trace Count
ENDIF TRAOPT
IFD VDUOPT
*
**************************************************
* VDU8 DISPLAY DRIVER VARIABLES *
**************************************************
*
**** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
COLADX RMB 1 CURSOR COLUMN
ROWADX RMB 1 CURSOR ROW
**************************************************
*
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
ENDIF VDUOPT
IFD DG640OPT
*
***************************************************
* DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
***************************************************
*
***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
COLADX RMB 1 CURSOR COLUMN
ROWADX RMB 1 CURSOR ROW
*************************************************
CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
ENDIF DG640OPT
*
*
***************************************************
* START OF ROM *
***************************************************
*
ORG MONROM
FDB MONITOR
FDB NEXTCMD
FDB INCH
FDB INCHE
FDB INCHEK
FDB OUTCH
FDB PDATA
FDB PCRLF
FDB PSTRNG
FDB LRA
*
IFD ADSOPT
FDB PCHK CHECK FOR PRINTER INPUT
FDB PINIZ INITIATE PRINTER
FDB POUTCH OUTPUT CH. TO PRINTER
FDB VINIZ
FDB VOUTCH
FDB ACINIZ
FDB AOUTCH
ENDIF ADSOPT
*
* MONITOR
*
* VECTOR ADDRESS STRING IS.....
* $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
*
MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
LDY #STACK POINT TO RAM VECTOR LOCATION
LDB #$10 BYTES TO MOVE = 16
LOOPA LDA ,X+ GET VECTOR BYTE
STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
*
* CONTENTS FROM TO FUNCTION
* $F8A1 $FE40 $DFC0 USER-V
* $F8A1 $FE42 $DFC2 SWI3-V
* $F8A1 $FE44 $DFC4 SWI2-V
* $F8A1 $FE46 $DFC6 FIRQ-V
* $F8A1 $FE48 $DFC8 IRQ-V
* $FAB0 $FE4A $DFCA SWI-V
* $FFFF $FE4C $DFCC SVC-VO
* $FFFF $FE4E $DFCE SVC-VL
*
LDX #ACIAS
STX CPORT STORE ADDR. IN RAM
LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
LDB #12 CLEAR 12 BYTES ON STACK
CLRSTK CLR ,-S
DECB
BNE CLRSTK
LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
STX 10,S ON STACK
LDA #$D0 PRESET CONDITION CODES ON STACK
STA ,S
TFR S,U
LBSR IOINIZ INITIALIZE CONTROL PORT
LDX #MSG1 POINT TO MONITOR MESSAGE
LBSR PDATA PRINT MSG
*
IFD DATOPT
LDX #LRARAM POINT TO LRA RAM STORAGE AREA
CLRA START TOTAL AT ZERO
LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
BEQ RELPAS IF NO RAM GO TO NEXT LOC.
ADDA #4 ELSE ADD 4K TO TOTAL
DAA ADJ. TOTAL FOR DECIMAL
RELPAS DECB SUB. 1 FROM LOCS. TO TEST
BPL FNDREL PRINT TOTAL OF RAM
LBSR OUT2H OUTPUT HEX BYTE AS ASCII
LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
LBSR PDATA PRINT MSG
ENDIF DATOPT
*
IFD TRAOPT
LBSR TRAINZ
ENDIF TRAOPT
*
***** NEXTCMD *****
*
NEXTCMD LDX #MSG3 POINT TO MSG ">"
LBSR PSTRNG PRINT MSG
LBSR INCH GET ONE CHAR. FROM TERMINAL
ANDA #$7F STRIP PARITY FROM CHAR.
CMPA #$0D IS IT CARRIAGE RETURN ?
BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
TFR A,B PUT CHAR. IN "B" ACCUM.
CMPA #$20 IS IT CONTROL OR DATA CHAR ?
BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
LDA #'^ ELSE CNTRL CHAR CMD SO...
LBSR OUTCH PRINT "^"
TFR B,A RECALL CNTRL CMD CHAR
ADDA #$40 CONVERT IT TO ASCII LETTER
PRTCMD LBSR OUTCH PRNT CMD CHAR
LBSR OUT1S PRNT SPACE
CMPB #$60
BLE NXTCH0
SUBB #$20
*
***** DO TABLE LOOKUP *****
* FOR COMMAND FUNCTIONS
*
NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
BEQ JMPCMD BRANCH IF MATCH FOUND
LEAX 2,X POINT TO NEXT ENTRY IN TABLE
CMPX #TABEND REACHED END OF TABLE YET ?
BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
LDX #MSG4 POINT TO MSG "WHAT?"
LBSR PDATA PRINT MSG
BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
BRA NEXTCMD PROMPT FOR NEW COMMAND
*
* "G" GO OR CONTINUE
*
GO TFR U,S
RTI RTI
*
***** "M" MEMORY EXAMINE AND CHANGE *****
*
MEMCHG LBSR IN1ADR INPUT ADDRESS
BVS CHRTN IF NOT HEX, RETURN
TFR X,Y SAVE ADDR IN "Y"
MEMC2 LDX #MSG5 POINT TO MSG " - "
LBSR PSTRNG PRINT MSG
TFR Y,X FETCH ADDRESS
LBSR OUT4H PRINT ADDR IN HEX
LBSR OUT1S OUTPUT SPACE
LDA ,Y GET CONTENTS OF CURRENT ADDR.
LBSR OUT2H OUTPUT CONTENTS IN ASCII
LBSR OUT1S OUTPUT SPACE
LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
CMPA #8 IS IT A BACKSPACE (CNTRL H)?
BEQ MEMC2 PROMPT OPERATOR AGAIN
CMPA #$18 IS IT A CANCEL (CNTRL X)?
BEQ MEMC2 PROMPT OPERATOR AGAIN
CMPA #'^ IS IT AN UP ARROW?
BEQ BACK DISPLAY PREVIOUS BYTE
CMPA #$D IS IT A CR?
BNE FORWRD DISPLAY NEXT BYTE
CHRTN RTS EXIT ROUTINE
*
*
CHANGE STA ,Y CHANGE BYTE IN MEMORY
CMPA ,Y DID MEMORY BYTE CHANGE?
BEQ FORWRD $F972
LBSR OUT1S OUTPUT SPACE
LDA #'? LOAD QUESTION MARK
LBSR OUTCH PRINT IT
FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
BRA MEMC2 PRINT LOCATION & CONTENTS
BACK LEAY -1,Y POINT TO LAST MEM LOCATION
BRA MEMC2 PRINT LOCATION & CONTENTS
*
* "S" DISPLAY STACK
* HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
*
DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
TFR U,Y
LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
LEAX -1,X POINT TO CURRENT STACK
BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
*
* "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
* AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
* UPPER ADDRESS IN X-REG.
* IF HEX ADDRESSES ARE INVALID (V)=1.
*
MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
BCC AJDUMP IF NOT, DUMP HEX AND ASCII
EDPRTN RTS ;
*
* ADJUST LOWER AND UPPER ADDRESS LIMITS
* TO EVEN 16 BYTE BOUNDRIES.
*
* IF LOWER ADDR = $4532
* LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
*
* IF UPPER ADDR = $4567
* UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
*
* ENTER WITH LOWER ADDRESS IN X-REG.
* -UPPER ADDRESS ON TOP OF STACK.
*
AJDUMP TFR X,D GET UPPER ADDR IN D-REG
ADDD #$10 ADD 16 TO UPPER ADDRESS
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
BEQ EDUMP
SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
RTS ;
*
* PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
* FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
*
EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
LDX #MSG5 POINT TO MSG " - "
LBSR PSTRNG PRINT MSG
LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
LBSR OUT4H PRINT THE ADDRESS
LBSR OUT2S 2 SPACES
LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
LBSR OUT2H OUTPUT HEX BYTE AS ASCII
LBSR OUT1S OUTPUT SPACE
DECB $F9D1 DECREMENT BYTE COUNT
BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
*
* PRINT 16 ASCII CHARACTERS
* IF NOT PRINTABLE OR NOT VALID
* ASCII PRINT A PERIOD (.)
LBSR OUT2S 2 SPACES
LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
LDB #$10 SET ASCII CHAR TO PRINT = 16
EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
BCS PERIOD IF SO, PRINT PERIOD INSTEAD
CMPA #$7E IS IT VALID ASCII?
BLS PRASC IF SO PRINT IT
PERIOD LDA #'. LOAD A PERIOD (.)
PRASC LBSR OUTCH PRINT ASCII CHARACTER
DECB DECREMENT COUNT
BNE EDPASC
BRA NXTLIN
*
***** "B" SET BREAKPOINT *****
*
BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
BVS EXITBP EXIT IF INVALID HEX ADDR.
CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
BCC BPERR IF ERROR PRINT (?), EXIT
PSHS X $FA82 PUSH BP ADDRESS ON STACK
LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
BSR BPTEST TEST BP TABLE FOR FREE SPACE
PULS X POP BP ADDRESS FROM STACK
BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
LDA ,X GET DATA AT BREAKPOINT ADDRESS
CMPA #$3F IS IT A SWI?
BEQ BPERR IF SWI ALREADY, INDICATE ERROR
STA ,Y+ SAVE DATA BYTE IN BP TABLE
STX ,Y SAVE BP ADDRESS IN BP TABLE
LDA #$3F LOAD A SWI ($3F)
STA ,X SAVE SWI AT BREAKPOINT ADDRESS
EXITBP RTS ;
*
* INDICATE ERROR SETTING BREAKPOINT
*
BPERR LBSR OUT1S OUTPUT SPACE
LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
LBRA OUTCH PRINT "?"
*
*** "X" CLEAR OUTSTANDING BREAKPOINTS ***
*
XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
LDB #8 LOAD BREAKPOINT COUNTER
XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
DECB $FAAC DECREMENT BP COUNTER
BNE XBPLP END OF BREAKPOINT TABLE?
RTS
*
***** SWI ENTRY POINT *****
*
SWIE TFR S,U TRANSFER STACK TO USER POINTER
LDX 10,U LOAD PC FROM STACK INTO X-REG
LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
BSR BPTEST FIND BREAKPOINT IN BP TABLE
BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
STX 10,U SAVE BREAKPOINT ADDR IN STACK
BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
REGPR LBSR REGSTR GO PRINT REGISTERS
*
IFD TRAOPT
LDX #0
STX TRACNT
ENDIF TRAOPT
*
LBRA NEXTCMD GET NEXT COMMAND
*
RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
LDA ,X GET DATA FROM BP ADDRESS
CMPA #$3F IS IT SWI?
BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
LDA ,Y GET ORIGINAL DATA FROM BP TABLE
STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
FFSTBL LDA #$FF LOAD $FF IN A-ACC
STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
STA ,Y+
RTS
*
** SEARCH BREAKPOINT TABLE FOR MATCH **
*
BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
LDB #8 LOAD BREAKPOINT COUNTER
FNDBP LDA ,Y+ LOAD DATA BYTE
CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
DECB IF NOT, DECREMENT BREAKPOINT COUNTER
BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
RTS ;
*
*
BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
RTS
*
IFD TRAOPT
*
** TRACE from address AAAA BB bytes
*
TRACE LBSR ALTPC1 SET UP NEW PC
BVS TREXIT ADDRESS ERROR, EXIT
LBSR OUT1S
LBSR IN1ADR Fetch Byte Count
BVS TREXIT Byte Count error, EXIT
STX TRACNT
*
LDX NMI Save NMI Vector
STX NMISAV
LDX #NMIE Set up NMI for Tracing
STX NMI
LBSR TRAINZ Initialise Hardware
BRA TRACEG Start Trace
TREXIT RTS
*
* CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
* CRA1 = 1 CA1 Rising edge IRQ
* CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
* CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
* CRA4 = 1 ] CA2 = Set/Reset output
* CRA5 = 1 ]
* CRA6 = X CA2 Input Interrupt Flag
* CRA7 = X CA1 Interrupt Flag
*
* CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
* CRB1 = 1 CB1 Rising edge IRQ
* CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
* CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
* CRB4 = 1 ] CB2 = Set/Reset output
* CRB5 = 1 ]
* CRB6 = X CB2 Input Interrupt Flag
* CRB7 = X CB1 Interrupt Flag
*
*
** TRACE NMI ENTRY POINT
*
NMIE TFR S,U
LDA #$36 Disable Interrupt, CA2 Low
STA TACTRL
LDA TADATA Clear Interrupt flag by reading data port
*
LBSR REGSTR DUMP REGISTERS
*
LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
LDA ,X
CMPA #$3F
BEQ TRACEX EXIT ON SWI
*
LDX TRACNT CHECK IF TRACE COUNT EXPIRED
BEQ TRACEX YES, GO BACK TO THE MONITOR
LEAX -1,X DECREMENT TRACE COUNT
STX TRACNT
*
** TRACE GO (RESUME SINGLE STEP)
*
TRACEG TFR U,S SET UP PROGRAM STACK POINTER
LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
STA TADATA
LDA #$36 LOAD STROBE LOW
STA TACTRL
LDA TADATA CLEAR INTERRUPT
LDA #$36 RELEASE RESET
STA TBCTRL
LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
STA TACTRL
RTI GO EXECUTE INSTRUCTION
*
TRACEX LDX NMISAV Restore NMI vector
STX NMI
LBRA NEXTCMD Jump back to the command loop.
*
** TRACE HARDWARE INITIALISATION
*
TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
STA TACTRL
LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
STA TBCTRL
LDA #$FF PORTA = OUTPUT
STA TADATA
LDA #$00 PORTB = INPUT
STA TBDATA
LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
STA TACTRL
LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
STA TBCTRL
RTS
*
ENDIF TRAOPT
IFD MFDCOPT
*
** "U" MINI DISK BOOT
*
MINBOOT TST CMDFDC
CLR DRVFDC
LDX #$0000
LOOP LEAX $01,X
CMPX #$0000
BNE LOOP
LDA #$0F
STA CMDFDC
BSR DELAY
LOOP1 LDB CMDFDC
BITB #$01
BNE LOOP1
LDA #$01
STA SECFDC
BSR DELAY
LDA #$8C
STA CMDFDC
BSR DELAY
LDX #$C000
BRA LOOP3
LOOP2 BITB #$02
BEQ LOOP3
LDA DATFDC
STA ,X+
LOOP3 LDB CMDFDC
BITB #$01
BNE LOOP2
BITB #$2C
BEQ LOOP4
RTS
*
LOOP4 LDX #$C000
STX $0A,U
TFR U,S
RTI
*
DELAY LDB #$04
LOOP5 DECB
BNE LOOP5
RTS
ENDIF MFDCOPT
*
IFD DMAFOPT
*
*** "D" DISK BOOT FOR DMAF2 ***
*
DBOOT LDA #$DE
STA DRVREG
LDA #$FF
STA PRIREG $FAF8
STA CCREG
STA AAAREG
STA BBBREG
TST CCREG
LDA #$D8
STA COMREG
LBSR DLY
DBOOT0 LDA COMREG
BMI DBOOT0
LDA #$09
STA COMREG
LBSR DLY
*
DISKWT LDA COMREG FETCH DRIVE STATUS
BITA #1 TEST BUSY BIT
BNE DISKWT LOOP UNTIL NOT BUSY
*
BITA #$10
BNE DBOOT
*
LDX #$C000 LOGICAL ADDR. = $C000
BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
ORA #$10
STA CCCREG
TFR X,D
COMA ;
COMB ;
STD ADDREG
LDX #$FEFF LOAD DMA BYTE COUNT = $100
STX CNTREG STORE IN COUNT REGISTER
LDA #$FF LOAD THE CHANNEL REGISTER
STA CCREG
LDA #$FE SET CHANNEL 0
STA PRIREG
LDA #1 SET SECTOR TO "1"
STA SECREG ISSUE COMMAND
LDA #$8C SET SINGLE SECTOR READ
STA COMREG ISSUE COMMAND
BSR DLY
*
* THE FOLLOWING CODE TESTS THE STATUS OF THE
* CHANNEL CONTROL REGISTER. IF "D7" IS NOT
* ZERO THEN IT WILL LOOP WAITING FOR "D7"
* TO GO TO ZERO. IF AFTER 65,536 TRIES IT
* IS STILL A ONE THE BOOT OPERATION WILL
* BE STARTED OVER FROM THE BEGINING.
*
CLRB ;
DBOOT1 PSHS B $FB55
CLRB ;
DBOOT2 TST CCREG
BPL DBOOT3
DECB ;
BNE DBOOT2
PULS B
DECB
BNE DBOOT1
BRA DBOOT
DBOOT3 PULS B
LDA COMREG
BITA #$1C
BEQ DBOOT4
RTS ;
*
*
DBOOT4 LDB #$DE
STB DRVREG
LDX #$C000
STX 10,U
TFR U,S $FB7B
RTI ;
ENDIF DMAFOPT
*
IFD CF8OPT
*
* COMPACT FLASH BOOT
*
CFBOOT BSR WAITRDY
LDA #HEADLBA
STA CF_HEAD
BSR WAITRDY
LDA #FEAT8BIT
STA CF_FEATURE
LDA #CMDFEATURE
STA CF_COMAND
BSR WAITRDY
*
* READ SECTORS FROM CF
*
CFREAD LDA #$01
STA CF_SECCNT
CLRA
STA CF_SECNUM
STA CF_CYLLO
STA CF_CYLHI
*
LDA #CMDREAD ; IDE READ MULTIPLE
STA CF_COMAND
BSR WAITRDY
LDX #$C000
*
* READ LOOP
*
RDLOOP BSR WAITDRQ
LDA CF_DATA
STA ,X+
CMPX #$C200
BNE RDLOOP
*
LDX #$C000
STX $0A,U
TFR U,S
RTI
*
* WAIT UNTIL READY
*
WAITRDY LDA CF_STATUS
BITA #BUSY
BNE WAITRDY
LDA CF_STATUS
BITA #DRDY
BEQ WAITRDY
RTS
*
* WAIT FOR DATA REQUEST
*
WAITDRQ LDA CF_STATUS
BITA #DRQ
BEQ WAITDRQ
RTS
ENDIF CF8OPT
*
IFD IDEOPT
*
* XESS 16 BIT IDE BOOT
*
IDEBOOT LDD #AUXRESET
STD CF_AUX
LDD #AUXRSTREL
STD CF_AUX
LDD #HEADLBA
STD CF_HEAD
BSR WAITRDY
*
* READ SECTORS FROM CF
*
LDD #$01
STD CF_SECCNT
CLRB
STD CF_SECNUM
STD CF_CYLLO
STD CF_CYLHI
*
LDB #CMDREAD ; IDE READ MULTIPLE
STD CF_COMAND
BSR WAITRDY
LDX #$C000
*
* READ LOOP
*
RDLOOP BSR WAITDRQ
LDD CF_DATA
STB ,X+
CMPX #$C100
BNE RDLOOP
*
LDX #$C000
STX $0A,U
TFR U,S
RTI
*
* WAIT UNTIL READY
*
WAITRDY LDD CF_STATUS
BITB #BUSY
BNE WAITRDY
LDD CF_STATUS
BITB #DRDY
BEQ WAITRDY
RTS
*
* WAIT FOR DATA REQUEST
*
WAITDRQ LDD CF_STATUS
BITB #DRQ
BEQ WAITDRQ
RTS
ENDIF IDEOPT
*
IFD RTCOPT
*
* CLOCK INTER FACE UTILITY
*
* TIME <Hours> <Minuits> <Seconds>
* If no argument is specified, the current time
* will be displayed.
*
* READ A REGISTER FROM THE COUNTER.
* The X Index rgister points to the register
* to be read. The Status Register is checked
* before and after the register is read before
* returning a value in accumulator A
*
RDCLK TST CLKSTA
BNE RDCLK
RDCLK1 LDA 0,X
TST CLKSTA
BNE RDCLK1
RTS
*
* MAIN PROGRAM:
*
TIMSET LDX #COUNTR POINT TO TIMER
LBSR BYTE READ HOURS
BVS SHOWTM NO ARG, DISP TIME
STA HOUR,X
LBSR OUT1S
LBSR BYTE READ MINUITES
BVS SHOWTM
STA MINUIT,X
LBSR OUT1S
LBSR BYTE SECONDS.
BVS SHOWTM
STA SECOND,X
*
* DISPLAY CURRENT TIME
*
SHOWTM LBSR PCRLF
LDX #COUNTR+HOUR
LDB #3
SHOWLP BSR RDCLK
LBSR OUT2H
LDA #':
LBSR OUTCH
LEAX -1,X
DECB
BNE SHOWLP
RTS
*
* INITIATE CLOCK.
* MASK INTERRUPTS.
*
CLKINZ CLR CINTCR MASK ALL INTERRUPTS
TST CINTSR CLEAR ANY INTERRUPTS
RTS
ENDIF RTCOPT
IFD DATOPT
*
***** LRA LOAD REAL ADDRESS *****
*
* THE FOLLOWING CODE LOADS THE 20-BIT
* PHYSICAL ADDRESS OF A MEMORY BYTE
* INTO THE "A" AND "X" REGISTERS. THIS
* ROUTINE IS ENTERED WITH THE LOGICAL
* ADDRESS OF A MEMORY BYTE IN THE "IX"
* REGISTER. EXIT IS MADE WITH THE HIGH-
* ORDER FOUR BITS OF THE 20-BIT PHYSICAL
* ADDRESS IN THE "A" REGISTER, AND THE
* LOW-ORDER 16-BITS OF THE 20-BIT
* PHYSICAL ADDRESS IN THE "IX" REGISTER.
* ALL OTHER REGISTERS ARE PRESERVED.
* THIS ROUTINE IS REQUIRED SINCE THE
* DMAF1 AND DMAF2 DISK CONTROLLERS MUST
* PRESENT PHYSICAL ADDRESSES ON THE
* SYSTEM BUS.
*
LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
LSRA ;
LSRA ADJ FOR INDEXED INTO
LSRA CORRESPONDING LOCATION
LSRA IN LRA TABLE
LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
LSRB PHYSICAL ADDRESS.
LSRB EXTENDED MS 4-BITS ARE RETURNED
LSRB IN THE "A" ACCUMULATOR
STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
ASLB ADJ DATA FOR RELOCATION IN X REG
ASLB ;
ASLB $FB97
ASLB ;
LDA 2,S GET MS BYTE OF LOGICAL ADDR.
ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
STA 2,S SAVE IT IN X REG ON STACK
ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
*
* PLUS LS NIBBLE OF LOGICAL ADDRESS
STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
* ON STACK
PULS A,B,X,Y,PC POP REGS. FROM STACK
ENDIF DATOPT
*
* DELAY LOOP
*
DLY PSHS B SAVE CONTENTS OF "B"
LDB #$20 GET LOOP DELAY VALUE
SUB1 DECB SUBTRACT ONE FROM VALUE
BNE SUB1 LOOP UNTIL ZERO
PULS B,PC RESTORE CONTENTS OF "B"
* RTS ;
*
***** "L" LOAD MIKBUG TAPE *****
*
LOAD JSR ACINIZ
LDA #$11 LOAD 'DC1' CASS. READ ON CODE
LBSR OUTCH OUTPUT IT TO TERMINAL PORT
CLR ECHO TURN OFF ECHO FLAG
LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
LBSR ECHON
CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
BEQ LOAD21 IF SO, EXIT LOAD
CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
BNE LOAD2 IF NOT, LOOK FOR START CHAR.
LBSR BYTE INPUT BYTE COUNT
PSHS A PUSH COUNT ON STACK
BVS LODERR (V) C-CODE SET, ILLEGAL HEX
LBSR IN1ADR INPUT LOAD ADDRESS
BVS LODERR (V) C-CODE SET, ADDR NOT HEX
PSHS X PUSH ADDR ON STACK
LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
DEC ,S ADDRESS BYTES.
LOAD10 PSHS B PUSH CHECKSUM ON STACK
LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
PULS B POP CHECKSUM FROM STACK
BVS LODERR (V) SET, DATA BYTE NOT HEX
PSHS A PUSH DATA BYTE ON STACK
ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
DEC ,S DECREMENT BYTE COUNT 1
BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
STA ,X+ SAVE DATA BYTE IN MEMORY
BRA LOAD10 GET NEXT DATA BYTE
LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
CMPB #$FF CHECKSUM OK?
BEQ LOAD1 IF SO, LOAD NEXT LINE
LDA #'? LOAD (?) ERROR INDICATOR
LBSR OUTCH OUTPUT IT TO TERMINAL
LOAD21 COM ECHO TURN ECHO ON
LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
LBRA OUTCH OUTPUT IT
*
***** "P" PUNCH MIKBUG TAPE *****
*
PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
LBSR IN2ADR GET BEGIN AND END ADDRESS
PSHS X,Y SAVE ADDRESSES ON STACK
BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
CMPX 2,S COMPARE BEGIN TO END ADDR
BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
LEAX 1,X INCREMENT END ADDRESS
STX ,S STORE END ADDR ON STACK
JSR ACINIZ
LDA #$12 LOAD 'DC2' PUNCH ON CODE
LBSR OUTCH OUTPUT IT TO TERMINAL
PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
SUBD 2,S SUBTRACT BEGIN FROM END
BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
CMPD #$20 LESS THAN 32 BYTES?
BLS PUNCH4 PUNCH THAT MANY BYTES
PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
LDX #MSG20 POINT TO MSG "S1"
LBSR PSTRNG PRINT MSG
ADDB #3 ADD 3 BYTES TO BYTE COUNT
TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
LBSR OUT2H OUTPUT BYTE COUNT
LDX 2,S LOAD BEGIN ADDRESS
LBSR OUT4H PUNCH ADDRESS
ADDB 2,S ADD ADDR MSB TO CHECKSUM
ADDB 3,S ADD ADDR LSB TO CHECKSUM
PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
LDA ,X+ LOAD DATA BYTE TO PUNCH
LBSR OUT2H OUTPUT DATA BYTE
DEC 4,S DECREMENT BYTE COUNT
BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
COMB 1's COMPLIMENT CHECKSUM BYTE
TFR B,A GET IT IN A-ACC TO PUNCH
LBSR OUT2H OUTPUT CHECKSUM BYTE
STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
CMPX ,S COMPARE IT TO END ADDR
BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
LBSR OUTCH OUTPUT IT
LEAS 5,S READJUST STACK POINTER
RTS ;
*
* PRINT STRING PRECEEDED BY A CR & LF.
*
PSTRNG BSR PCRLF PRINT CR/LF
BRA PDATA PRINT STRING POINTED TO BY IX
*
* PCRLF
*
PCRLF PSHS X SAVE IX
LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
LBSR PDATA PRINT MSG
PULS X,PC RESTORE IX & RETURN
*
* LONG BRANCHES TO COMMON ROUTINES
*
JOUT1S LBRA OUT1S
JBYTE LBRA BYTE
JIN1ADR LBRA IN1ADR
*
* ALTER "PC" PROGRAM COUNTER
*
ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
ALTPC1 BSR JOUT1S OUTPUT SPACE
BSR JIN1ADR GET NEW CONTENTS FOR "PC"
BVS ALTPCD EXIT IF INVALID HEX
STX 10,U POKE IN NEW CONTENTS
ALTPCD RTS ;
*
* ALTER "U" USER STACK POINTER
*
ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
BSR JOUT1S OUTPUT SPACE
BSR JIN1ADR
BVS ALTUD
STX 8,U
ALTUD RTS ;
*
* ALTER "Y" INDEX REGISTER
*
ALTRY BSR PRTIY PRINT MSG " IY = "
BSR JOUT1S OUTPUT SPACE
BSR JIN1ADR
BVS ALTYD
STX 6,U $F8F0
ALTYD RTS ;
*
* ALTER "X" INDEX REGISTER
*
ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
BSR JOUT1S OUTPUT SPACE
BSR JIN1ADR
BVS ALTXD
STX 4,U
ALTXD RTS ;
*
* ALTER "DP" DIRECT PAGE REGISTER
*
ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
BSR JOUT1S OUTPUT SPACE
BSR JBYTE INPUT BYTE (2 HEX CHAR)
BVS ALTDPD
STA 3,U
ALTDPD RTS ;
*
* ALTER "B" ACCUMULATOR
*
ALTRB BSR PRTB $FD09 PRINT MSG " B = "
BSR JOUT1S OUTPUT SPACE
BSR JBYTE INPUT BYTE (2 HEX CHAR)
BVS ALTBD
STA 2,U
ALTBD RTS $F91C
*
* ALTER "A" ACCUMULATOR
*
ALTRA BSR PRTA $FCFF RINT MSG " A = "
BSR JOUT1S OUTPUT SPACE
BSR JBYTE INPUT BYTE (2 HEX CHAR)
BVS ALTAD
STA 1,U
ALTAD RTS ;
*
* ALTER "CC" REGISTER
*
ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
BSR JOUT1S OUTPUT SPACE
BSR JBYTE INPUT BYTE (2 HEX CHAR)
BVS ALTCCD
ORA #$80 SETS "E" FLAG IN PRINT LIST
STA ,U
ALTCCD RTS ;
*
* PDATA
*
PRINT LBSR OUTCH
PDATA LDA ,X+ GET 1st CHAR. TO PRINT
CMPA #4 IS IT EOT?
BNE PRINT IF NOT EOT PRINT IT
RTS ;
*
* PRINT REGISTERS
*
PRTSP LDX #MSG10 POINT TO MSG "SP="
BSR PDATA PRINT MSG
TFR U,X
JOUT4H LBRA OUT4H
*
PRTUS LDX #MSG12 POINT TO MSG "US="
BSR PDATA PRINT MSG
LDX 8,U
BRA JOUT4H
*
PRTDP LDX #MSG15 POINT TO MSG "DP="
BSR PDATA PRINT MSG
LDA 3,U
JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
*
PRTIX LDX #MSG14 POINT TO MSG "IX="
BSR PDATA PRINT MSG
LDX 4,U $FCE6
BRA JOUT4H
*
PRTIY LDX #MSG13 POINT TO MSG "IY="
BSR PDATA PRINT MSG
LDX 6,U
BRA JOUT4H
*
PRTPC LDX #MSG11 POINT TO MSG "PC="
BSR PDATA PRINT MSG
LDX 10,U
BRA JOUT4H
*
PRTA LDX #MSG16 POINT TO MSG "A="
BSR PDATA PRINT MSG
LDA 1,U
BRA JOUT2H OUTPUT HEX BYTE AS ASCII
*
PRTB LDX #MSG17 POINT TO MSG "B="
BSR PDATA PRINT MSG
LDA 2,U
BRA JOUT2H OUTPUT HEX BYTE AS ASCII
*
PRTCC LDX #MSG18 POINT TO MSG "CC:"
BSR PDATA PRINT MSG
LDA ,U
LDX #MSG19 POINT TO MSG "EFHINZVC"
LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
*
* "R" DISPLAY REGISTERS
*
REGSTR LDX #MSG5 POINT TO MSG " - "
LBSR PSTRNG PRINT MSG
BSR PRTSP $FCBF
BSR PRTUS $FCCA
BSR PRTDP $FCD5
BSR PRTIX $FCE0
BSR PRTIY $FCEB
LDX #MSG5 POINT TO MSG " - "
LBSR PSTRNG PRINT MSG
BSR PRTPC $FCF5
BSR PRTA $FCFF
BSR PRTB $FD09
BRA PRTCC $FD13
*
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
* OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
* THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
* THE SECOND IS RETURNED IN "IX". THE "V" BIT
* IN THE C-CODE REG. IS SET IF AN INVALID HEX
* ADDRESS IS INPUT.
*
IN2ADR BSR IN1ADR GET FIRST ADDRESS
BVS NOTHEX EXIT IF NOT VALID HEX
TFR X,Y SAVE FIRST ADDR. IN "IY"
LDA #'-
LBSR OUTCH PRINT " - "
*
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
* OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
* ADDRESS IS RETURNED IN THE "X" REGISTER.
*
IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
BVS NOTHEX EXIT IF NOT VALID HEX
TFR D,X
BSR BYTE INPUT BYTE (2 HEX CHAR)
BVS NOTHEX
PSHS X
STA 1,S
PULS X,PC
*
***** INPUT BYTE (2 HEX CHAR.) *****
*
BYTE BSR INHEX GET HEX LEFT
BVS NOTHEX EXIT IF NOT VALID HEX
ASLA ;
ASLA ;
ASLA ; SHIFT INTO LEFT NIBBLE
ASLA ;
TFR A,B PUT HEXL IN "B"
BSR INHEX GET HEX RIGHT
BVS NOTHEX EXIT IF NOT VALID HEX
PSHS B PUSH HEXL ON STACK
ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
RTS RETURN WITH HEX L&R IN "A"
*
*
INHEX BSR ECHON INPUT ASCII CHAR.
CMPA #'0 IS IT > OR = "0" ?
BCS NOTHEX IF LESS IT AIN'T HEX
CMPA #'9 IS IT < OR = "9" ?
BHI INHEXA IF > MAYBE IT'S ALPHA
SUBA #$30 ASCII ADJ. NUMERIC
RTS ;
*
*
INHEXA CMPA #'A IS IT > OR = "A"
BCS NOTHEX IF LESS IT AIN'T HEX
CMPA #'F IS IT < OR = "F" ?
BHI INHEXL IF > IT AIN'T HEX
SUBA #$37 ASCII ADJ. ALPHA
RTS ;
*
INHEXL CMPA #'a IS IT > OR = "a"
BCS NOTHEX IF LESS IT AIN'T HEX
CMPA #'f IS IT < "f"
BHI NOTHEX IF > IT AIN'T HEX
SUBA #$57 ADJUST TO LOWER CASE
RTS ;
*
*
NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
RTS ;
*
*
OUT4H PSHS X PUSH X-REG. ON THE STACK
PULS A POP MS BYTE OF X-REG INTO A-ACC.
BSR OUTHL OUTPUT HEX LEFT
PULS A POP LS BYTE OF X-REG INTO A-ACC.
OUTHL EQU *
OUT2H PSHS A SAVE IT BACK ON STACK
LSRA CONVERT UPPER HEX NIBBLE TO ASCII
LSRA ;
LSRA ;
LSRA ;
BSR XASCII PRINT HEX NIBBLE AS ASCII
OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
ANDA #$0F STRIP LEFT NIBBLE
XASCII ADDA #$30 ASCII ADJ
CMPA #$39 IS IT < OR = "9" ?
BLE OUTC IF LESS, OUTPUT IT
ADDA #7 IF > MAKE ASCII LETTER
OUTC BRA OUTCH OUTPUT CHAR
*
* BINARY / ASCII --- THIS ROUTINE
* OUTPUTS A BYTE IN ENHANCED
* BINARY FORMAT. THE ENHANCEMENT
* IS DONE BY SUBSTITUTING ASCII
* LETTERS FOR THE ONES IN THE BYTE.
* THE ASCII ENHANCEMENT LETTERS
* ARE OBTAINED FROM THE STRING
* POINTED TO BY THE INDEX REG. "X".
*
BIASCI PSHS A SAVE "A" ON STACK
LDB #8 PRESET LOOP# TO BITS PER BYTE
OUTBA LDA ,X+ GET LETTER FROM STRING
ASL ,S TEST BYTE FOR "1" IN B7
BCS PRTBA IF ONE PRINT LETTER
LDA #'- IF ZERO PRINT "-"
PRTBA BSR OUTCH PRINT IT
BSR OUT1S PRINT SPACE
DECB SUB 1 FROM #BITS YET TO PRINT
BNE OUTBA
PULS A,PC
*
IFD EXTOPT
*
* EXTENDED USER COMMANDS
*
USRCMD JMP [MONEXT+EXTCMD]
ENDIF EXTOPT
*
*
ECHON TST ECHO IS ECHO REQUIRED ?
BEQ INCH ECHO NOT REQ. IF CLEAR
*
* INCHE
*
* ---GETS CHARACTER FROM TERMINAL AND
* ECHOS SAME. THE CHARACTER IS RETURNED
* IN THE "A" ACCUMULATOR WITH THE PARITY
* BIT MASKED OFF. ALL OTHER REGISTERS
* ARE PRESERVED.
*
INCHE BSR INCH GET CHAR FROM TERMINAL
ANDA #$7F STRIP PARITY FROM CHAR.
BRA OUTCH ECHO CHAR TO TERMINAL
*
* INCH
*
* GET CHARACTER FROM TERMINAL. RETURN
* CHARACTER IN "A" ACCUMULATOR AND PRESERVE
* ALL OTHER REGISTERS. THE INPUT CHARACTER
* IS 8 BITS AND IS NOT ECHOED.
*
*
INCH PSHS X SAVE IX
GETSTA LDX CPORT POINT TO TERMINAL PORT
LDA ,X FETCH PORT STATUS
BITA #1 TEST READY BIT, RDRF ?
IFD PS2OPT
BNE GETST1
LDX #PS2KBD
LDA ,X
BITA #1
ENDIF PS2OPT
BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
GETST1 LDA 1,X FETCH CHAR
PULS X,PC RESTORE IX
*
* INCHEK
*
* CHECK FOR A CHARACTER AVAILABLE FROM
* THE TERMINAL. THE SERIAL PORT IS CHECKED
* FOR READ READY. ALL REGISTERS ARE
* PRESERVED, AND THE "Z" BIT WILL BE
* CLEAR IF A CHARACTER CAN BE READ.
*
*
INCHEK PSHS A SAVE A ACCUM.
LDA [CPORT] FETCH PORT STATUS
BITA #1 TEST READY BIT, RDRF ?
IFD PS2OPT
BNE INCHEK1
LDA PS2KBD
BITA #1 TEST READY BIT< RDRF ?
ENDIF PS2OPT
INCHEK1 PULS A,PC RESTORE A ACCUM.
*
OUT2S BSR OUT1S OUTPUT 2 SPACES
OUT1S LDA #$20 OUTPUT 1 SPACE
*
*
* OUTCH
*
* OUTPUT CHARACTER TO TERMINAL.
* THE CHAR. TO BE OUTPUT IS
* PASSED IN THE A REGISTER.
* ALL REGISTERS ARE PRESERVED.
*
OUTCH IFD VDUOPT
BSR VOUTCH
ENDIF VDUOPT
IFD DG640OPT
BSR VOUTCH
ENDIF DG640OPT
AOUTCH PSHS A,X SAVE A ACCUM AND IX
LDX CPORT GET ADDR. OF TERMINAL
FETSTA LDA ,X FETCH PORT STATUS
BITA #2 TEST TDRE, OK TO XMIT ?
BEQ FETSTA IF NOT LOOP UNTIL RDY
PULS A GET CHAR. FOR XMIT
STA 1,X XMIT CHAR.
PULS X,PC RESTORE IX
*
* IO INITIALIZATION
*
IOINIZ EQU *
IFD VDUOPT
BSR VINIZ
ENDIF VDUOPT
IFD DG640OPT
BSR VINIZ
ENDIF DG640OPT
ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
LDA #3 RESET ACIA PORT CODE
STA ,X STORE IN CONTROL REGISTER
LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
STA ,X STORE IN CONTROL REGISTER
TST 1,X ANYTHING IN DATA REGISTER?
LDA #$FF TURN ON ECHO FLAG
STA ECHO
RTS
*
IFD VDUOPT
*
***************************************************
* VDU8 ADM3A REGISTER-MAPPED EMULATOR *
* *
* 80 x 25 Characters
*
***************************************************
*
***************************************************
* INITIALIZE EMULATOR *
***************************************************
*
VINIZ LDX #VDU
LDD #0
STD COLADX AND ROWADX
STA VDUCOL,X
STB VDUROW,X
STB VDUOFF,X
STD NEWROW AND ESCFLG
LDB #$02
STB VDUATT,X
CLR ESCFLG
LDA #$1B SEND ESCAPE
BSR VOUTCH
LDA #'Y CLEAR TO END OF SCREEN
*
** VIDEO OUTPUT ROUTINE
*
VOUTCH PSHS A,B,X SAVE REGISTERS
LDX #VDU POINT TO VDU REGISTERS
*
** CHECK FOR ESCAPE SEQUENCE
*
TST ESCFLG ESCAPE ACTIVE?
BEQ SOROU1 BRANCH IF NOT
BSR ESCAPE ELSE DO ESCAPE
BRA RETURN AND RETURN
*
** CHECK FOR CONTROL CHARACTERS
*
SOROU1 CMPA #$20 CONTROL CODES?
BHS SOROU2
BSR CONTRL BRANCH IF SO
BRA RETURN
*
** OUTPUT TEXT CHARACTER
*
SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
LBSR NEWCOL UPDATE COLUMN
*
** DISPLAY CURSOR AND RETURN
*
RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
*
***************************************************
* CONTROL CODE HANDLERS *
***************************************************
*
CONTRL CMPA #$08 CTRL H - BACKSPACE ?
LBEQ BACKSP
CMPA #$1B ESCAPE SEQUENCE?
LBEQ SETESC
CMPA #$1A CTRL Z - Clear Screen
LBEQ CLRSCR
CMPA #$16 CTRL ^ - Home
LBEQ HOME
CMPA #$D CTRL M - RETURN?
LBEQ CRETN
CMPA #$0C CTRL L - CHAR RIGHT
LBEQ CHRIGHT
CMPA #$0B CTRL K - MOVE UP ONE LINE
LBEQ LINEUP
CMPA #$0A CTRL J - LINE FEED
BNE RETESC NONE OF THESE, RETURN
*
***************************************** LINE FEED
*
LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
INCB BUMP ROW
CMPB #NUMLIN SCROLL TIME?
LBNE NEWCUR POSITION CURSOR IF NOT
LBRA SCROLL ELSE SCROLL IT
*
***************************************** LINE FEED
*
LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
TSTB AT TOP OF SCREEN ?
LBEQ RETESC Yes, Ignore
DECB No, Decrement ROW
LBRA NEWCUR POSITION CURSOR
*
*********************************** BACK SPACE
*
BACKSP LDA COLADX
BEQ RETESC RETURN
DECA
LBRA POSCOL POSITION CURSOR
*
*********************************** CURSOR RIGHT
*
CHRIGHT LDA COLADX
INCA
CMPA #LINLEN
LBEQ RETESC
LBRA POSCOL
*
*********************************** CURSOR RIGHT
*
HOME LDD #0 HOME - POSITION TOP OF SCREEN
LBRA NEWCUR
*
***************************************************
* ESCAPE HANDLERS *
***************************************************
*
ESCAPE LDAB ESCFLG GET FLAG
CMPB #'= SETTING CURSOR?
BEQ ESCCUR BRANCH IF SO
CMPA #'Y CLEAR TO END OF SCREEN?
LBEQ ESCCLS
CMPA #'T CLEAR TO END OF LINE?
BEQ ESCCLL
CMPA #'= STARTING CURSOR SET?
BNE CLRESC BRANCH IF NOT
*
***************************** START ESCAPE SEQUENCE
*
SETESC STAA ESCFLG ELSE START CURSORING
RTS AND RETURN
*
CLRESC CLR ESCFLG NO OTHERS SUPPORTED
RETESC RTS SO RETURN
*
********************************* SET SCREEN CURSOR
*
ESCCUR TST NEWROW ROW SET?
BNE ESCCU1 BRANCH IF SO
STAA NEWROW ELSE SET NEW ROW
RTS AND RETURN
*
ESCCU1 CLR ESCFLG
SUBA #$20 ADJUST COLUMN ADDRESS
CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
BHI RETESC NOT OK, DO NOTHING
*
ESCCU2 LDAB NEWROW
CLR NEWROW
SUBB #$20 ADJUST TO ROW ADDRESS
CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
BHI RETESC ELSE RETURN DOING NOTHING
BRA NEWCUR GO SET NEW CURSOR IF SO
*
****************** CLEAR FROM CURSOR TO END OF LINE
CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
BSR NEWCUR
ESCCLL LDA COLADX
LDB #$20 AND CLEAR CHAR
ESCCL1 STB VDUCHR,X DISPLAY TEXT
INCA
STA VDUCOL,X
CMPA #LINLEN UNTIL END OF LINE
BNE ESCCL1
CLR ESCFLG
RTS
*
*********************************** CARRIAGE RETURN
*
CRETN CLRA SET COLUMN ZERO
POSCOL LDB ROWADX GET CURRENT ROW
*
*********** GENERATE NEW CURSOR POSITION AND RETURN
*
NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
STA VDUCOL,X SET NEW COLUMN
STB VDUROW,X SET NEW ROW
RTS AND RETURN
*
********************* UPDATE CURRENT COLUMN AND ROW
*
NEWCOL LDD COLADX GET ROW AND COLUMN
INCA BUMP COLUMN
CMPA #LINLEN ROLL?
BNE NEWCUR BRANCH IF NOT
CLRA ELSE RESET TO ZERO
INCB AND BUMP ROW
CMPB #NUMLIN
BNE NEWCUR
DECB BOTTOM ROW
BSR NEWCUR
*
********************************* SCROLL THE SCREEN
*
SCROLL LDB VDUOFF,X
INCB
CMPB #NUMLIN
BLO SCROL1
CLRB
SCROL1 STB VDUOFF,X
*
**************** CLEAR FROM CURSOR TO END OF SCREEN
*
ESCCLS LDB COLADX GET CURSOR
LDA #$20 GET A SPACE
ESCCLS1 STB COLADX
STB VDUCOL,X
STA VDUCHR,X
INCB
CMPB #LINLEN
BNE ESCCLS1
*
LDB ROWADX
INCB
CMPB #NUMLIN
BEQ ESCCLS2
STB ROWADX
STB VDUROW,X
CLRB
BRA ESCCLS1
*
ESCCLS2 CLRB
STB COLADX
STB VDUCOL,X
STB ESCFLG
RTS
ENDIF VDUOPT
*
IFD DG640OPT
***************************************************
* TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
* *
* FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
* HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
* CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
* 16x64 BOARD). *
***************************************************
 
***************************************************
* INITIALIZE EMULATOR *
***************************************************
 
VINIZ LDX #0
STX COLADX AND ROWADX
STX NEWROW AND ESCFLG
LDX #SCREEN POINT TO SCREEN
STX CURSOR SET PROGRAM CURSOR
LDA #$1B SEND ESCAPE
BSR VOUTCH
LDA #'Y CLEAR TO END OF SCREEN
*
** VIDEO OUTPUT ROUTINE
*
VOUTCH PSHS A,B,X SAVE REGISTERS
*
** CLEAR CURSOR
LDX CURSOR
LDB 0,X
ANDB #$7F
STB 0,X
*
** CHECK FOR ESCAPE SEQUENCE
TST ESCFLG ESCAPE ACTIVE?
BEQ SOROU1 BRANCH IF NOT
BSR ESCAPE ELSE DO ESCAPE
BRA RETURN AND RETURN
*
** CHECK FOR CONTROL CHARACTERS
SOROU1 CMPA #$20 CONTROL CODES?
BHS SOROU2
BSR CONTRL BRANCH IF SO
BRA RETURN
*
** OUTPUT TEXT CHARACTER
SOROU2 LDX CURSOR ELSE GET CURSOR
STAA 0,X DISPLAY CHARACTER
LBSR NEWCOL UPDATE COLUMN
*
** DISPLAY CURSOR AND RETURN
RETURN LDX CURSOR AND DISPLAY IT
LDB ,X
ORAB #$80 WITH REVID
STB ,X
PULS A,B,X,PC RESTORE REGISTERS AND RETURN
 
***************************************************
* CONTROL CODE HANDLERS *
***************************************************
 
CONTRL CMPA #$08 CTRL H - BACKSPACE ?
LBEQ BACKSP
CMPA #$1B ESCAPE SEQUENCE?
LBEQ SETESC
CMPA #$D CTRL M - RETURN?
LBEQ CRETN
CMPA #$0A CTRL J - LINE FEED
BNE RETESC NONE OF THESE, RETURN
 
***************************************** LINE FEED
 
LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
INCB BUMP ROW
CMPB #NUMLIN SCROLL TIME?
LBNE NEWCUR POSITION CURSOR IF NOT
LBRA SCROLL ELSE SCROLL IT
 
***************************************** LINE FEED
 
LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
TSTB AT TOP OF SCREEN ?
BEQ RETESC Yes, Ignore
DECB No, Decrement ROW
LBRA NEWCUR POSITION CURSOR
 
 
*********************************** BACK SPACE
 
BACKSP LDA COLADX
BEQ RETESC RETURN
DECA
LBRA POSCOL POSITION CURSOR
 
*********************************** CURSOR RIGHT
 
CHRIGHT LDA COLADX
INCA
CMPA #LINLEN
BEQ RETESC
LBRA POSCOL
 
***************************************************
* ESCAPE HANDLERS *
***************************************************
 
ESCAPE LDAB ESCFLG GET FLAG
CMPB #'= SETTING CURSOR?
BEQ ESCCUR BRANCH IF SO
CMPA #'Y CLEAR TO END OF SCREEN?
LBEQ ESCCLS
CMPA #'T CLEAR TO END OF LINE?
BEQ ESCCLL
CMPA #'E INSERT LINE?
BEQ ESCINL
CMPA #'R DELETE LINE?
BEQ ESCDLL
CMPA #'= STARTING CURSOR SET?
BNE CLRESC BRANCH IF NOT
 
***************************** START ESCAPE SEQUENCE
 
SETESC STAA ESCFLG ELSE START CURSORING
RTS AND RETURN
 
CLRESC CLR ESCFLG NO OTHERS SUPPORTED
RETESC RTS SO RETURN
 
********************************* SET SCREEN CURSOR
 
ESCCUR TST NEWROW ROW SET?
BNE ESCCU1 BRANCH IF SO
STAA NEWROW ELSE SET NEW ROW
RTS AND RETURN
 
ESCCU1 CLR ESCFLG
SUBA #$20 ADJUST COLUMN ADDRESS
CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
BHI RETESC NOT OK, DO NOTHING
 
ESCCU2 LDAB NEWROW
CLR NEWROW
SUBB #$20 ADJUST TO ROW ADDRESS
CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
BHI RETESC ELSE RETURN DOING NOTHING
BRA NEWCUR GO SET NEW CURSOR IF SO
*
*************************** DELETE LINE FROM SCREEN
 
ESCDLL BSR CRETN GO COL. ZERO
LDB ROWADX
CMPB #NUMLIN-1
BEQ SCROL3
BRA SCROL1 AND DELETE THIS LINE
 
*************************** INSERT LINE INTO SCREEN
 
ESCINL BSR CRETN GO TO COL. ZERO
LDAB ROWADX
CMPB #NUMLIN-1
BEQ ESCCLL
*
** SCROLL SCREEN DOWN FROM CURSOR
*
LDX #SCREEN+SCNLEN-LINLEN
ESCIN0 LDAA 0,-X
STAA LINLEN,X
LDA SCNLEN,X
STA SCNLEN+LINLEN,X
CPX CURSOR
BNE ESCIN0
 
****************** CLEAR FROM CURSOR TO END OF LINE
 
ESCCLL LDA COLADX GET CURRENT COLUMN
LDX CURSOR GET CURSOR
LDB #$20 AND CLEAR CHAR
ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
STB ,X+ CLEAR TEXT
INCA
CMPA #LINLEN UNTIL END OF LINE
BNE ESCLL1
CLR ESCFLG
RTS
 
*********************************** CARRIAGE RETURN
 
CRETN CLRA SET COLUMN ZERO
POSCOL LDB ROWADX GET CURRENT ROW
 
*********** GENERATE NEW CURSOR POSITION AND RETURN
 
NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
LDA #LINLEN ELSE ADD A LINE
MUL LINLEN * ROWADX
ADDB COLADX
ADCA #0
ADDD #SCREEN ADD SCREEN BASE.
STD CURSOR SAVE NEW CURSOR
TFR D,X GET CURSOR IN X
RTS AND RETURN
 
********************* UPDATE CURRENT COLUMN AND ROW
 
NEWCOL LDD COLADX GET ROW AND COLUMN
INCA BUMP COLUMN
CMPA #LINLEN ROLL?
BNE NEWCUR BRANCH IF NOT
CLRA ELSE RESET TO ZERO
INCB AND BUMP ROW
CMPB #NUMLIN
BNE NEWCUR
DECB BOTTOM ROW
BSR NEWCUR
 
********************************* SCROLL THE SCREEN
 
SCROLL LDX #SCREEN POINT TO SCREEN
SCROL1 LDA SCNLEN+LINLEN,X
STA SCNLEN,X
LDAA LINLEN,X MOVE TWO BYTES
STAA 0,X+ UP ONE LINE
CMPX #SCREEN+SCNLEN-LINLEN
BNE SCROL1 LOOP UNTIL DONE
BRA SCROL3
 
**************** CLEAR FROM CURSOR TO END OF SCREEN
 
ESCCLS LDX CURSOR GET CURSOR
SCROL3 LDAA #$20 GET A SPACE
SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
STA ,X+ AND TEXT
CMPX #SCREEN+SCNLEN
BNE SCROL2 UNTIL DONE
CLR ESCFLG
RTS
ENDIF DG640OPT
*
IFD PRTOPT
*************************************
*
** PRINTER DRIVER ROUTINES
*
*************************************
*
** PINIZ - INITIATE PRINTER PORT
*
PINIZ PSHS B
LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
STD PADATA SET DDR AND SELECT DATA
*
** RESET PRINTER
LDB #PRESET
STAB PADATA
RESTLP INCB DELAY FOR RESET
BNE RESTLP
STAA PADATA ACCA=DIRMSK
*
** INITALIZE PORT B (DATA PORT)
LDAA #$2A
STAA PBCTRL
LDD #$FF2E ACCA=$FF ACCB =%00101110
STD PBDATA PBDREG PBCTRL
*
** SELECT 66 LINES/PAGE
LDAA #$1B
BSR POUTCH
LDAA #'C
BSR POUTCH
LDAA #66
PULS B
*************************************
*
** OUTPUT A CHARACTER TO THE PRINTER
*
*************************************
POUTCH PSHS B
LDAB PBDATA CLEAR INTERRUPT BIT
*
** WAIT TILL NOT BUSY
BUSYLP LDAB PADATA
BITB #PERROR
BEQ PEXIT
TSTB
BMI BUSYLP
*
** NOW OUTPUT CHARACTER
STAA PBDATA
PEXIT PULS B,PC
*************************************
*
** PCHK TEST IFD PRINTER READY
*
*************************************
PCHK TST PBCTRL TEST STATE OF CRB7
RTS SET ON ACKNOWLEDGE
ENDIF PRTOPT
*************************************
*
* MONITOR KEYBOARD COMMAND JUMP TABLE
*
*************************************
*
JMPTAB EQU *
FCB 1 " ^A "
FDB ALTRA
FCB 2 " ^B "
FDB ALTRB
FCB 3 " ^C "
FDB ALTRCC
FCB 4 " ^D "
FDB ALTRDP
FCB $10 " ^P "
FDB ALTRPC
FCB $15 " ^U "
FDB ALTRU
FCB $18 " ^X "
FDB ALTRX
FCB $19 " ^Y "
FDB ALTRY
*
FCC 'B'
FDB BRKPNT
FCC 'E'
FDB MEMDUMP
FCC 'G'
FDB GO
FCC 'L'
FDB LOAD
FCC 'P'
FDB PUNCH
FCC 'M'
FDB MEMCHG
FCC 'R'
FDB REGSTR
FCC 'S'
FDB DISSTK
FCC 'X'
FDB XBKPNT
IFD MFDCOPT
FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
FDB MINBOOT
ENDIF MFDCOPT
IFD CF8OPT
FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
FDB CFBOOT
ENDIF CF8OPT
IFD IDEOPT
FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
FDB IDEBOOT
ENDIF IDEOPT
IFD DMAFOPT
FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
FDB DBOOT
ENDIF DMAFOPT
IFD EXTOPT
FCC 'U' *** IF FPGA, 'U' IS FOR USER
FDB USRCMD
ENDIF EXTOPT
IFD RTCOPT
FCC 'T'
FDB TIMSET
ENDIF RTCOPT
IFD TRAOPT
FCC "T"
FDB TRACE
ENDIF TRAOPT
*
TABEND EQU *
*
* ** 6809 VECTOR ADDRESSES **
*
* FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
* FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
* ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
* RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
* HIS OWN ROUTINES IF HE SO DESIRES.
*
*
RAMVEC FDB SWIE USER-V
FDB RTI SWI3-V
FDB RTI SWI2-V
FDB RTI FIRQ-V
FDB RTI IRQ-V
FDB SWIE SWI-V
FDB $FFFF SVC-VO
FDB $FFFF SVC-VL
*
* PRINTABLE MESSAGE STRINGS
*
MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
FCC 'SYS09BUG 1.4 FOR '
IFD S3EOPT
FCC 'S3E '
ENDIF S3EOPT
IFD B5XOPT
FCC 'B5-X300 '
ENDIF B5XOPT
IFD S3SOPT
FCC 'S3STARTER '
ENDIF S3SOPT
IFD ADSOPT
FCC 'ADS6809 '
ENDIF ADSOPT
IFD SWTOPT`
FCC 'SWTPC '
ENDIF SWTOPT
IFD XESOPT`
FCC 'XESS '
ENDIF XESOPT
FCC ' - '
FCB 4
MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
MSG3 FCC '>'
FCB 4
MSG4 FCC 'WHAT?'
FCB 4
MSG5 FCC ' - '
FCB 4'
MSG10 FCC ' SP='
FCB 4
MSG11 FCC ' PC='
FCB 4
MSG12 FCC ' US='
FCB 4
MSG13 FCC ' IY='
FCB 4
MSG14 FCC ' IX='
FCB 4
MSG15 FCC ' DP='
FCB 4
MSG16 FCC ' A='
FCB 4
MSG17 FCC ' B='
FCB 4
MSG18 FCC ' CC: '
FCB 4
MSG19 FCC 'EFHINZVC'
MSG20 FCC 'S1'
FCB 4
IFD DATOPT
*
* POWER UP/ RESET/ NMI ENTRY POINT
*
ORG $FF00
*
*
START LDX #IC11 POINT TO DAT RAM IC11
LDA #$F GET COMPLIMENT OF ZERO
*
*
* INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
* OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
* IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
* OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
* STORED IN IT.
*
*
DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
DECA GET COMP. VALUE FOR NEXT LOCATION
BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
*
* NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
* ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
* PHYSICAL ADDRESSES.
*
LDA #$F0
STA ,X STORE $F0 AT $FFFF
LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
STY ,X STORE TEST PATTERN AT $D0A0
CMPY ,X IS THERE RAM AT THIS LOCATION ?
BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
LEAX -$1000,X ELSE POINT 4K LOWER
CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
BRA START ELSE START ALL OVER AGAIN
*
*
* THE FOLLOWING CODE STORES THE COMPLEMENT OF
* THE MS CHARACTER OF THE FOUR CHARACTER HEX
* ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
* BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
* IS STORED IN RAM IN THE LOCATION THAT IS
* ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
* THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
* WHEN TESTING LOCATION $70A0, MEANING THERE
* IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
* $8000-$DFFF, THEN THE COMPLEMENT OF THE
* "7" IN THE $70A0 WILL BE STORED IN
* THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
* AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
* BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
* 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
* RAM THAT IS PHYSICALLY ADDRESSED AT $7---
* WILL RESPOND AND APPEAR TO THE 6809 THAT IT
* IS AT $D--- SINCE THAT IS THE ADDRESS THE
* 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
* OF RAM RESPONDS.
*
*
CNVADR STU ,X RESTORE DATA AT TEST LOCATION
TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
COMA COMPLEMENT MSB OF THAT ADDRESS
LSRA PUT MS 4 BITS OF ADDRESS IN
LSRA LOCATION D0-D3 TO ALLOW STORING
LSRA IT IN THE DYNAMIC ADDRESS
LSRA TRANSLATION RAM.
STA $FFFD STORE XLATION FACTOR IN DAT "D"
*
LDS #STACK INITIALIZE STACK POINTER
*
*
* THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
* OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
* OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
* IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
* TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
* THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
* RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
*
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
* 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
*
* ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
* CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
*
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
* 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
*
*
* HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
* HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
* ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
* PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
* IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
* WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
* RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
* MEMORY ADDRESSED AS FOLLOWS....
*
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
* 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
*
*
LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
CLR 14,Y CLEAR $DFDE
LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
STA 15,Y STORE AT $DFDF
LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
DECA SUB. 1 FROM BYTES LEFT TO CLEAR
BPL CLRLRT CONTINUE IF NOT DONE CLEARING
FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
BEQ FINTAB SKIP IF FINISHED
LDU ,X SAVE DATA AT CURRENT TEST LOCATION
LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
STY ,X STORE TEST PATT. INTO RAM TEST LOC.
CMPY ,X VERIFY RAM AT TEST LOCATION
BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
STU ,X ELSE RESTORE DATA TO TEST LOCATION
LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
LSRA TO ALLOW STORING IT IN THE DAT RAM.
LSRA
LSRA
TFR A,B SAVE OFFSET INTO LRARAM TABLE
EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
LDY #LRARAM POINT TO LRARAM TABLE
STA 14,Y STORE $F1 AT $DFCE
*
* THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
* RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
* THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
* LOGICALLY RESPONDS TO THE ADDRESS $C---.
*
*
LDA #$0C PRESET NUMBER HEX "C"
FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
DECA ELSE POINT 4K LOWER
BPL FINDC GO TRY AGAIN
BRA XFERTF
FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
*
* THE FOLLOWING CODE ADJUSTS THE TRANSLATION
* FACTORS SUCH THAT ALL REMAINING RAM WILL
* RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
* ADDRESSES FROM $0000 AND UP....
*
CLRA START AT ZERO
TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
BEQ PNTNXT IF IT'S ZER0 SKIP
CLR A,Y ELSE ERASE FROM TABLE
STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
PNTNXT INCA GET OFFSET TO NEXT ENTRY
CMPA #$0C LAST ENTRY YET ?
BLT COMPRS
*
* THE FOLLOWING CODE TRANSFER THE TRANSLATION
* FACTORS FROM THE LRARAM TABLE TO IC11 ON
* THE MP-09 CPU CARD.
*
XFERTF LDX #IC11 POINT TO DAT RAM IC11
LDB #$10 GET NO. OF BYTES TO MOVE
FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
STA ,X+ POKE XLATION FACTOR IN IC11
DECB SUB 1 FROM BYTES TO MOVE
BNE FETCH CONTINUE UNTIL 16 MOVED
*
ELSE
LRA RTS
START LDS #STACK INITIALIZE STACK POINTER
CLRB
ENDIF DATOPT
*
COMB SET "B" NON-ZERO
STB ECHO TURN ON ECHO FLAG
LBRA MONITOR INITIALIZATION IS COMPLETE
*
** INTERRUPT JUMP VECTORS
*
V1 JMP [STACK]
V2 JMP [SWI2]
V3 JMP [FIRQ]
V4 JMP [IRQ]
V5 JMP [SWI]
*
* SWI3 ENTRY POINT
*
SWI3E TFR S,U
LDX 10,U *$FFC8
LDB ,X+
STX 10,U
CLRA
ASLB
ROLA
LDX SVCVO
CMPX #$FFFF
BEQ SWI3Z
LEAX D,X
CMPX SVCVL
BHI SWI3Z
PSHS X
LDD ,U
LDX 4,U
JMP [,S++]
SWI3Z PULU A,B,X,CC,DP
LDU 2,U
JMP [SWI3]
*
* 6809 VECTORS
*
ORG $FFF0
FDB V1 USER-V
FDB SWI3E SWI3-V
FDB V2 SWI2-V
FDB V3 FIRQ-V
FDB V4 IRQ-V
FDB V5 SWI-V
FDB V1 NMI-V
FDB START RESTART-V
END START
/opt_ads.txt
0,0 → 1,18
*
***************************************************
* OPTION SWITCHES
***************************************************
*
*
** THE CONTROL PORT CAN ONLY BE ONE OF THESE
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
** FOR LOADING AND SAVING S1 RECORDS
*
*S3EOPT EQU $FF SPARTAN3E STARTER
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
*
END
/opt_s3s.txt
0,0 → 1,18
*
***************************************************
* OPTION SWITCHES
***************************************************
*
*
** THE CONTROL PORT CAN ONLY BE ONE OF THESE
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
** FOR LOADING AND SAVING S1 RECORDS
*
*S3EOPT EQU $FF SPARTAN3E STARTER
S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
*
END
/sys09s3e.sh
0,0 → 1,2
../../Tools/as09/as09.exe sys09s3e.txt -l > sys09s3e.lst
../../Tools/epedit/epedit.exe sys09s3e.aux
/opt_swt.txt
0,0 → 1,18
*
***************************************************
* OPTION SWITCHES
***************************************************
*
*
** THE CONTROL PORT CAN ONLY BE ONE OF THESE
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
** FOR LOADING AND SAVING S1 RECORDS
*
*S3EOPT EQU $FF SPARTAN3E STARTER
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
*
END
/sys09xes_b16_0.vhd
0,0 → 1,64
INIT_00 => x"8C02300D2780E12CF08E20C0022F60C10AF89FAD2086891F7F8406F89FAD02F0",
INIT_01 => x"CD8E040D0A3F2054414857BCF258EAF0463EF042946E29021635F08EF52635F0",
INIT_02 => x"B6B035EE261F30F6263F310A254700E0B6E2048E10E8038E30343B341F4AAF00",
INIT_03 => x"0235ED261F30F5263F310C25474700E0B6E2048E10E8038E02343034B03501E0",
INIT_04 => x"2E2E2E6B7369642045444920676E6974616D726F460D0AB03501E0B70235B035",
INIT_05 => x"6E20657669726420454449040D0A043F207265626D754E2065766972440D0A20",
INIT_06 => x"6574656C706D6F432074616D726F460D0A04202164657461636F6C6C6120746F",
INIT_07 => x"002510308169FF17FB2450FF1753F2BD89F08EBDF4BD04204B53494445444904",
INIT_08 => x"017FFB265A80A75F4F00028E3AF5BDFD008E0001F7891F3080E90022103381EF",
INIT_09 => x"F60101B601A70186846C042600814C0201B684A70101B600028E0201B7018601",
INIT_0a => x"028EC82600810101B601017C0201B70186D72600810201B602017C15F5BD0201",
INIT_0b => x"8EF1F4BDFFC64F00028E15F5BDFFC6FF86016F846F00028EF1F4BDFFC6FF8600",
INIT_0c => x"8E102034016F846F00028EF1F4BD03C64F00028E15F5BDFFC64F016F846F0002",
INIT_0d => x"FFC6FF861D88ED0101CC1B88ED0001F64F2035F72618C15C85A7A0A610C6E1F0",
INIT_0e => x"F5BD03C64F2588A707862488A707862388A701862188ED01FECC2688ED1F88ED",
INIT_0f => x"E0B7038639018500E0B653F27ECFF08E2503170201F70101B701C64F00F78E15",
INIT_10 => x"20DD8D0A2778850826018500E0B60A017F09017F0801B710863900E0B7118600",
INIT_11 => x"8500E0B6023439021A4FDC2608017AE12609017AE6260A017A39FD1C01E0B6E6",
INIT_12 => x"646F6D580A0D39F826048180A6E78D3901E0B70235F120B38DF5277885082602",
INIT_13 => x"706D6F432064616F6C70550A0D0464616F6C7055206B73694420454449206D65",
INIT_14 => x"626D754E2065766972440A0D04726F7272452064616F6C70550A0D046574656C",
INIT_15 => x"175AF28E04294E2F5928203F206572755320756F59206572410A0D043A207265",
INIT_16 => x"01B730802801221033812E01251030816AFF17FB293CFF178BFF1794F28E91FF",
INIT_17 => x"815F843DFF17FB290FFF175EFF17A5F28E4BFF17308B0001B66CFF1794F28E00",
INIT_18 => x"0101B701C64F00028E0401B701860601FF2DF4CEB10117B3265981FF0027104E",
INIT_19 => x"D501170201F60101B600028ED6002510E00017870117E0002510EA00170201F7",
INIT_1a => x"B00017570117B0002510BA00170201F70101B75C0201F60101B600028E710117",
INIT_1b => x"0101B75C0201F60101B600028E410117A501170201F60101B600028EA6002510",
INIT_1c => x"88E60B01B74C2688A600028E76002510800017270117800025108A00170201F7",
INIT_1d => x"01F70101B700028E5C0201F60101B60301176701170201F60101B60C01F75C27",
INIT_1e => x"00173701170201F60101B600028E38002510420017E90017420025104C001702",
INIT_1f => x"01F70101B701C64F00F78EC3260B01B14C01C6CB260C01F15C0201F60101B6D3",
INIT_20 => x"CE1BFE1715860A28EFFD170601FE403443FE1685F28E53F27E73F28E11011702",
INIT_21 => x"FAFD1706860826048139FA1C4DF4CE06260181C0350601FFED26C4ADF1202DF4",
INIT_22 => x"2DF4CEDDFD17158639FA1C63F4CE06260401B139FA1C39051A0326188139051A",
INIT_23 => x"350301B70301BB023439FA1C77F4CE0501B7808603017FEF260401B14339FA1C",
INIT_24 => x"043439041AFE1C2DF4CE04017C0B260301B139FA1C80A78EF4CE032605017A02",
INIT_25 => x"0600CC82357FFD170686023439FA1C2DF4CE8CFD1715860435011F80C45A101F",
INIT_26 => x"E4E606E1FD5A4F023401C64F668DD602160CE1FDE000CC1EE1FD0200CC1EE1FD",
INIT_27 => x"8E102034AC02170EE1FD2000CCE48D82355F04E1FD01C60AE1FD0001F608E1FD",
INIT_28 => x"8802170EE1FD3000CCC08D395F9502172035F4263F3180E700E1FCB202170001",
INIT_29 => x"0123038103A6395F7002172035F4263F3100E1FD80E68D02174F00018E102034",
INIT_2a => x"00000000000000000000000000000000000000000000395F03A6395F0001B74F",
INIT_2b => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_2c => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_2d => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_2e => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_2f => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_30 => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_31 => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_32 => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_33 => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_34 => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_35 => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_36 => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_37 => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_38 => x"270281358D00C48E1000C3FDF18CECFFC0CE1000000000C00000000000000B20",
INIT_39 => x"5D891F158DD08CA71A8DD48CA71F8DEA20DA8CA7268DDE8CA72B8DF626168110",
INIT_3a => x"8D0B2784EC00C38E0F2600C48C10C920F5265A80A71435098D1434C58CAED927",
INIT_3b => x"C60AE1FD908CE608E1FDE4E606E1FD5A4F02349B9C6E39A0A604C38E109D2626",
INIT_3c => x"3F3180E700E1FC1E8D00018E102034178D0EE1FD2000CCE48D82355F04E1FD01",
INIT_3d => x"0039F92708C50EE1FC39F22740C50EE1FCF92680C50EE1FC395F028D2035F526",
INIT_3e => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3f => x"0000000000000000000000000000000000000000000000000000000000000000"
/sys09xes_b16_1.vhd
0,0 → 1,64
INIT_00 => x"A780A610C6C0DF8E1074FE8E2EFA1AFB1EFB8FFBCEFCB9FC9BFCA1FC61F814F8",
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC65B0117E0DFBF00E08EF9265AA0",
INIT_02 => x"0317A3FE8E0C0417F62A5A19048B0327856D0DC64FD0DF8E47031784FE8E9F04",
INIT_03 => x"17408B981F5304175E86092C2081891FF1270D817F84370417B30217AAFE8E2E",
INIT_04 => x"20F00217ACFE8EF52674FE8C02300F2780E13BFE8E20C0022F60C14704174C04",
INIT_05 => x"17A4A60F0417A50317211F650217B2FE8E121F2D296B03173B341FBC2094ADC0",
INIT_06 => x"27A4A1A4A7390F260D8117275E81DD271881E127088111285E0317070417A503",
INIT_07 => x"0B031705201F30C0DF8E321FA20217BE203F31C2202131E503173F86E8031708",
INIT_08 => x"279A03170527E4AC011FF0C4201F0634F0C41000C3101F390124E1AC20340629",
INIT_09 => x"265A8E03172C031780A610C69603172E0317E4AEEE0117B2FE8E103439623203",
INIT_0a => x"29B70217BC20EE265A7703172E8602237E810425208180A610C6E1AE860317F5",
INIT_0b => x"3984A73F86A4AFA0A709273F8184A60F271035558DFFFF8E10341A24C0DF8C1E",
INIT_0c => x"4AAF0427268D1F304AAE431F39FB265A188D08C6E3DF8E104603163F86490317",
INIT_0d => x"A7A0A7A0A7FF8684A7A4A604263F8184A60A24C0DF8C21AEB9FE16480217068D",
INIT_0e => x"E1FD0200CC1EE1FD0600CC393D3139F7265A0427A1ACA0A608C6E3DF8E1039A0",
INIT_0f => x"178D0EE1FD20C60AE1FD08E1FD06E1FD5F04E1FD0100CC2E8D0CE1FDE000CC1E",
INIT_10 => x"E1FCF92680C50EE1FC3B341F4AAF00C08EF42600C18C80E700E1FC218D00C08E",
INIT_11 => x"54545454A6E6D0DF8E104444444462A6363439F92708C50EE1FC39F22740C50E",
INIT_12 => x"FCBD8435FD265A20C60434B63562E762EA62A70F8462A65858585853A6E6E4E7",
INIT_13 => x"0234A80117F12631813D273981230217F92653812A0217E2DF7F6802171186E3",
INIT_14 => x"E0EB02340C2904358E01170434E46AE46AE4EBE0EBE0E6103421299101172629",
INIT_15 => x"0117E26F1202161386E2DF731A02173F86BA27FFC102355FEB2080A70527E46A",
INIT_16 => x"2320008310062762A3E4ECF901171286E3FCBDE4AF0130492562AC4D2930344A",
INIT_17 => x"1780A684EB63EB62EB68011762AE750117981F03CB2F0017F3FE8E64E720C602",
INIT_18 => x"10347120028D396532B701171486C326E4AC62AF5B0117981F53F526646A6501",
INIT_19 => x"8D618D394AAF0229F68DF28D910017E50016F80016A101169035690017A4FE8E",
INIT_1a => x"498D3944AF0229D58DD18D5E8D3946AF0229E08DDC8D728D3948AF0229EB8DE7",
INIT_1b => x"8D3941A70229B18DB08D588D3942A70229BC8DBB8D6C8D3943A70229C78DC68D",
INIT_1c => x"BF0016311FF48DB6FE8E39F726048180A63F011739C4A7808A0429A68DA58D5F",
INIT_1d => x"8DC8FE8EE12044AED78DCEFE8EB4001643A6E18DD4FE8EF42048AEEA8DC2FE8E",
INIT_1e => x"D02042A6B38DDFFE8ED92041A6BC8DDAFE8ECF204AAEC58DBCFE8ED82046AECE",
INIT_1f => x"B2FE8EBF8DB88DB08DA98DA18D27FF17B2FE8E900016EBFE8EC4A6AA8DE4FE8E",
INIT_20 => x"3C29088D011F42290E8DB800172D86121F4D29098DD520CE8DC78DC08D17FF17",
INIT_21 => x"811D2530815B8D39E0AB04342829078D891F484848483229118D903561A71034",
INIT_22 => x"3439021A39578003226681072561813937800322468112254181393080032239",
INIT_23 => x"C602345120078B022F3981308B0F840235048D4444444402340235028D023510",
INIT_24 => x"207F84048D0627E2DF7D00F09F6E8235F1265A3F8D438D2D860225E46880A608",
INIT_25 => x"85E0DF9FA60234903501A6EE27018584A620E08E0926018584A6E0DFBE10342D",
INIT_26 => x"3501A70235FA27028584A6E0DFBE1234458D2086008D8235018520E0B6052601",
INIT_27 => x"A7FBDFFD0000CC30E08E39E2DFB7FF86016D84A7118684A70386E0DFBE138D90",
INIT_28 => x"8D0427FEDF7D30E08E16345986028D1B86FEDF7F01E702C6FDDFFD04E703E702",
INIT_29 => x"1A816C0027101B814100271008819635C5001784A70520098D042420810D2074",
INIT_2a => x"51260A81110027100B812C0027100C81990027100D814500271016818E002710",
INIT_2b => x"164A3327FBDFB67400165A3C0027105DFBDFFC9900168300261019C15CFBDFFC",
INIT_2c => x"2710598116273DC1FEDFF65800160000CC5B00162500271050814CFBDFB66800",
INIT_2d => x"2080FEDF7F39FDDFB70426FDDF7D39FEDF7F39FEDFB704263D81312754816E00",
INIT_2e => x"A74C84E720C6FBDFB6168D0000CC1B20E12218C120C0FDDF7FFDDFF6ED224F81",
INIT_2f => x"C15C4FF02650814CFBDFFC3903E702A7FBDFFDFCDFF64F39FEDF7FF726508102",
INIT_30 => x"2650C15C84A702E7FBDFF72086FBDFF604E75F012519C15C04E6E78D5AEA2619",
INIT_31 => x"FB0274FB0139FEDFF702E7FBDFF75FE4205F03E7FCDFF7082719C15CFCDFF6F4",
INIT_32 => x"505EFA4CA5F847FDF8455CF94248FB1953FB183DFB1531FB105EFB047FFB0369",
INIT_33 => x"94F9A7F8A7F8A7F8A7F894F992FC55D5F94488F958F1F853EDFB52A8F84DBCFA",
INIT_34 => x"20205353455820524F4620342E312047554239305359530000000A0DFFFFFFFF",
INIT_35 => x"43502020043D5053202004202D20043F54414857043E040000000A0D4B04202D",
INIT_36 => x"20043D412020043D50442020043D58492020043D59492020043D53552020043D",
INIT_37 => x"0000000000000000000004315343565A4E4948464504203A43432020043D4220",
INIT_38 => x"300B2784AC1084AF1084EEAA558E10A0D08E84A7F086FB264A80A70F86F0FF8E",
INIT_39 => x"2DA7D0DF8E10C0DFCE10FDFFB74444444443101F84EFD620ED26A0F08C00F089",
INIT_3a => x"1084AF10AA558E1084EE2227A0F08C00F08930FB2A4AA66F0C862FA7F0862E6F",
INIT_3b => x"2EA7D0DF8E10F186D520A5A70F88891F44444444101FD0DF8E1084EFE92684AC",
INIT_3c => x"8EF32D0C814C80E7A66F0427A6E6211F4F2CE7A66F1420F92A4A0526A6E60C86",
INIT_3d => x"9F6EC6DF9F6EC4DF9F6EC0DF9F6E62F816E2DFF753F9265A80A7A0A610C6F0FF",
INIT_3e => x"0822CEDFBC8B300F27FFFF8CCCDFBE49584F4AAF80E64AAE431FCADF9F6EC8DF",
INIT_3f => x"00FFB2FFC2FFBEFFBAFFB6FFC6FFB2FFC2DF9F6E42EE1F37F16E44AEC4EC1034"
/sys09b5x.sh
0,0 → 1,2
../../Tools/as09/as09.exe sys09b5x.txt -l > sys09b5x.lst
../../Tools/epedit/epedit.exe sys09b5x.aux
/sys09equ.txt
0,0 → 1,416
*
***************************************************
* MEMORY MAP EQUATES *
***************************************************
MONIO EQU $E000 I/O SPACE
IFD S3EOPT
MONRAM EQU $7FC0
ELSE
MONRAM EQU $DFC0 STACK SPACE
ENDIF S3EOPT
MONROM EQU $F800 START OF ROM
IFD S3SOPT
MONEXT EQU $F000 START OF EXTENDED COMMANDS
EXTCMD EQU $00 EXTENDED OFFSET
ENDIF S3SOPT
IFD XESOPT
MONEXT EQU $F000 START OF EXTENDED COMMANDS
EXTCMD EQU $00 EXTENDED OFFSET
ENDIF XESOPT
***************************************************
 
IFD S3EOPT
*
* DIGILENT SPARTAN 3E STARTER
*
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
VDUOPT EQU $FF VDU AT $E030
TRAOPT EQU $FF PIA TRACE TIMER
ENDIF S3EOPT
*
IFD S3SOPT
*
* DIGILENT SPARTAN 3 STARTER
*
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
VDUOPT EQU $FF VDU AT $E030
CF8OPT EQU $FF COMPACT FLASH AT $E040
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
EXTOPT EQU $FF EXTENDED COMMANDS
ENDIF S3SOPT
*
IFD B5XOPT
*
* BURCHED B5-X300
*
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
VDUOPT EQU $FF VDU AT $E030
CF8OPT EQU $FF COMPACT FLASH AT $E040
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
ENDIF B5XOPT
*
IFD XESOPT
*
* XESS XSA-3S1000 & XST-3.0
*
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
VDUOPT EQU $FF VDU AT $E030
IDEOPT EQU $FF XESS IDE AT $E100
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
EXTOPT EQU $FF EXTENDED COMMANDS
ENDIF XESOPT
*
IFD ADSOPT
*
* ACKERMAN DIGITAL ADS6809
*
DG640OPT EQU $FF DG640 VDU AT $E800
*RTCOPT EQU $FF REAL TIME CLOCK
PRTOPT EQU $FF PRINTER DRIVERS
MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
ENDIF ADSOPT
*
IFD SWTOPT
*
* SOUTH WEST TECHNICAL PRODUCTS COMPUTER
*
ACIAOPT EQU $FF ACIA AT PORT 0
DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
ENDIF
*
IFD ACIAOPT
*
***************************************************
* SERIAL PORT *
***************************************************
*
** ACIA SITS ON PORT 0
*
ACIAS EQU MONIO+$00 CONTROL PORT
*
ENDIF ACIAOPT
IFD MFDCOPT
*
***************************************************
* MINIFLOPPY DRIVE *
***************************************************
*
** FLOPPY DISK CONTROLLER SITS ON PORT 1
*
DRVFDC EQU MONIO+$14
CMDFDC EQU MONIO+$18
SECFDC EQU MONIO+$1A
DATFDC EQU MONIO+$1B
ENDIF MFDCOPT
IFD PS2OPT
*
***************************************************
* VDU8 PS/2 KEYBOARD PORT *
***************************************************
*
** KEYBOARD SITS ON PORT 2
*
PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
ENDIF PS2OPT
IFD VDUOPT
*
***************************************************
* VDU8 DISPLAY DRIVER EQUATES *
***************************************************
*
** VDU8 DISPLAY SITS ON PORT 3
*
VDU EQU MONIO+$30
VDUCHR EQU 0 CHARACTER REGISTER
VDUATT EQU 1 ATTRIBUTE REGISTER
VDUCOL EQU 2 CURSOR COLUMN
VDUROW EQU 3 CURSOR ROW
VDUOFF EQU 4 ROW OFFSET
*
LINLEN EQU 80 LENGTH OF A LINE
NUMLIN EQU 25 NUMBER OF LINES
ENDIF VDUOPT
*
IFD CF8OPT
*
***************************************************
* COMPACT FLASH EQUATES 8 BIT TRANSFER *
***************************************************
*
** COMPACT FLASH SITS AT PORT 4
*
CF_BASE EQU MONIO+$40
CF_DATA EQU CF_BASE+0
CF_ERROR EQU CF_BASE+1 ; read error
CF_FEATURE EQU CF_BASE+1 ; write feature
CF_SECCNT EQU CF_BASE+2
CF_SECNUM EQU CF_BASE+3
CF_CYLLO EQU CF_BASE+4
CF_CYLHI EQU CF_BASE+5
CF_HEAD EQU CF_BASE+6
CF_STATUS EQU CF_BASE+7 ; read status
CF_COMAND EQU CF_BASE+7 ; write command
*
* Command Equates
*
CMDREAD EQU $20 ; Read Single sector
CMDWRITE EQU $30 ; Write Single sector
CMDFEATURE EQU $EF
FEAT8BIT EQU $01 ; enable 8 bit transfers
HEADLBA EQU $E0
*
* Status bit equates
*
BUSY EQU $80
DRDY EQU $40
DRQ EQU $08
ERR EQU $01
*
ENDIF CF8OPT
*
IFD IDEOPT
*
***************************************************
* COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *
***************************************************
*
** COMPACT FLASH SITS AT PORT 4
*
CF_BASE EQU MONIO+$0100
CF_DATA EQU CF_BASE+0
CF_ERROR EQU CF_BASE+2 ; read error
CF_FEATURE EQU CF_BASE+2 ; write feature
CF_SECCNT EQU CF_BASE+4
CF_SECNUM EQU CF_BASE+6
CF_CYLLO EQU CF_BASE+8
CF_CYLHI EQU CF_BASE+10
CF_HEAD EQU CF_BASE+12
CF_STATUS EQU CF_BASE+14 ; read status
CF_COMAND EQU CF_BASE+14 ; write command
CF_AUX EQU CF_BASE+30
*
* Command Equates
*
CMDREAD EQU $20 ; Read Single sector
CMDWRITE EQU $30 ; Write Single sector
AUXRESET EQU $06 ; Reset IDE
AUXRSTREL EQU $02 ; Reset release IRQ masked
HEADLBA EQU $E0
*
* Status bit equates
*
BUSY EQU $80
DRDY EQU $40
DRQ EQU $08
ERR EQU $01
*
ENDIF CF8OPT
*
IFD RTCOPT
*
**************************************************
* MM58167A REAL TIME CLOCK MEMORY MAP:
**************************************************
*
** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
*
CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
*
* COUNTER AND COMPARITOR REGISTERS:
*
* Both the Clock Counter and Clock Comparitor
* consist of 8 registers for holding the time.
* The register offsets from the Counter and
* Comparitor registers are listed above.
*
COUNTR EQU CLOCK+0
CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
*
* CLOCK REGISTER OFFSETS:
* These register offsets are used for the CLOCK
* and comparitor ram CMPRAM.
*
S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
SECOND EQU 2
MINUIT EQU 3
HOUR EQU 4
WKDAY EQU 5
MTHDAY EQU 6
MONTH EQU 7
*
* INTERRUPT OUTPUT REGISTERS:
*
* An interrupt output may be generated at the
* following rates by setting the appropriate bit
* in the Interrupt Control Register (CINTCR).
* The Interrupt Status Register (CINTSR) must be
* read to clear the interrupt and will return
* the source of the interrupt.
*
* 1/Month Bit 7
* 1/Week Bit 6
* 1/Day Bit 5
* 1/Hour Bit 4
* 1/Minuite Bit 3
* 1/Second Bit 2
* 10/Second Bit 1
* Comparitor Bit 0
*
CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
*
* COUNTER AND RAM RESETS; GO COMMAND.
*
* The counter and comparitor may be reset
* by writing $FF into CTRRES and CMPRES
* respectivly.
* A write to the Go command register (GOCMND)
* will reset the 1/1000ths, 1/100ths and 1/10ths
* of a second counter.
*
CTRRES EQU CLOCK+18 COUNTER RESET
CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
GOCMND EQU CLOCK+21 GO COMMAND
*
* CLOCK STATUS REGISTER.
*
* The counter takes 61 usec. to rollover for
* every 1KHz clock pulse. If the Status bit is
* set after reading the counter, the counter
* should be re-read to ensure the time is correct.
*
CLKSTA EQU CLOCK+20 STATUS BIT
SBYINT EQU CLOCK+22 STANDBY INTERRUPT
TSTMOD EQU CLOCK+31 TEST MODE REGISTER
ENDIF RTCOPT
*
IFD TRAOPT
*
**************************************************
* PIA INTERRUPT TIMER
**************************************************
*
** PIA INTERRUPT TIMER SITS ON PORT 7
*
** PIA TIMER FOR SINGLE STEP / TRACE
*
* TADATA = Output = Timer preset register
* TACTRL - CA1 = input = rising edge = NMI
* - CA2 = Output = Timer Reset (Active High)
* TBDATA = Input = Timer read back register
* TBCTRL - CB1 = input = rising edge = FIRQ
* - CB2 = output = strobe low on write to TBDATA = Timer Preset
*
* CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
* CRA1 = 1 CA1 Rising edge IRQ
* CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
* CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
* CRA4 = 1 ] CA2 = Set/Reset output
* CRA5 = 1 ]
* CRA6 = X CA2 Input Interrupt Flag
* CRA7 = X CA1 Interrupt Flag
*
* CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
* CRB1 = 1 CB1 Rising edge IRQ
* CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
* CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
* CRB4 = 1 ] CB2 = Set/Reset output
* CRB5 = 1 ]
* CRB6 = X CB2 Input Interrupt Flag
* CRB7 = X CB1 Interrupt Flag
*
* DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
* DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
*
TADATA EQU MONIO+$70 Timer preset port
TACTRL EQU MONIO+$71
TBDATA EQU MONIO+$72 Timer read back port
TBCTRL EQU MONIO+$73
*
TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
*
ENDIF TRAOPT
IFD ADSOPT
*
***************************************************
* SERIAL PORT FOR DG640 *
***************************************************
*
** SET UP FOR ACKERMAN DIGITAL ADS6809
** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
*
ACIAS EQU MONIO+$400 CONTROL PORT
*
ENDIF ADSOPT
IFD PRTOPT
*
***************************************************
* PRINTER INTERFACE *
***************************************************
*
PADATA EQU MONIO+$404
PACTRL EQU MONIO+$405
PBDATA EQU MONIO+$406
PBCTRL EQU MONIO+$407
*
** CB1 ACK. I/P
** CB2 STB. O/P
** PB0 - PB7 DATA 1 - 8 O/P
** PORT A BIT ASSIGNMENT
*
PBUSY EQU $80 I/P
PEMPTY EQU $40 I/P
SELECT EQU $20 I/P
PERROR EQU $10 I/P
PRESET EQU %00000100 O/P PA3 = 0
AUTOFD EQU %00001000 O/P PA2 = 0
DIRMSK EQU %00001100
ENDIF PRTOPT
IFD DG640OPT
*
***************************************************
* DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
***************************************************
*
** VIDEO DISPLAY DEFINITIONS
*
SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
LINLEN EQU 64 LENGTH OF A LINE
NUMLIN EQU 16 NUMBER OF LINES
SCNLEN EQU $400 LENGTH OF SCREEN
ENDIF DG640OPT
*
IFD DMAFOPT
*
***************************************************
* DMAF2 8" DRIVE *
***************************************************
*
ADDREG EQU $F000 ADDRESS REGISTER
CNTREG EQU $F002 COUNT REGISTER
CCREG EQU $F010 CHANNEL CONTROL REGISTER
PRIREG EQU $F014 DMA PRIORITY REGISTER
AAAREG EQU $F015 ???
BBBREG EQU $F016 ???
COMREG EQU $F020 1791 COMMAND REGISTER
SECREG EQU $F022 SECTOR REGISTER
DRVREG EQU $F024 DRIVE SELECT LATCH
CCCREG EQU $F040 ???
ENDIF DMAFOPT
IFD DATOPT
**************************************************
* DYNAMIC ADDRESS TRANSLATION REGISTERS *
**************************************************
*
IC11 EQU $FFF0 DAT RAM CHIP
TSTPAT EQU $55AA TEST PATTERN
ENDIF DATOPT
*
END
/sys09s3e.txt
0,0 → 1,5
NAM SYS09BUG FOR SPARTAN 3E STARTER
INCLUDE "opt_s3e.txt"
INCLUDE "sys09equ.txt"
INCLUDE "sys09bug.txt"
END
/SYS09XES.S19
0,0 → 1,115
S123F000F002AD9FF806847F1F898620AD9FF80AC1602F02C0208EF02CE180270D30028CE2
S123F020F03526F58EF0351602296E9442F03E46F0EA58F2BC57484154203F0A0D048ECDF7
S123F04000AF4A1F343B34308E03E8108E04E2B6E00047250A313F26F6301F26EE35B0B62E
S123F060E00135B0343034028E03E8108E04E2B6E0004747250C313F26F5301F26ED3502B6
S123F08035B03502B7E00135B00A0D466F726D6174696E6720494445206469736B2E2E2ECE
S123F0A0200A0D4472697665204E756D626572203F040A0D04494445206472697665206E7A
S123F0C06F7420616C6C6F63617465642120040A0D466F726D617420436F6D706C65746562
S123F0E0044944454449534B2004BDF4BD8EF089BDF25317FF5024FB17FF69813010250086
S123F100EF8133102200E980301F89F701008E00FDBDF53A8E02004F5FA7805A26FB7F0106
S123F120018601B701028E0200B60101A784B601024C810026046C848601A701B60101F699
S123F1400102BDF5157C0102B60102810026D78601B701027C0101B60101810026C88E02B5
S123F1600086FFC6FFBDF4F18E02006F846F0186FFC6FFBDF5158E02004FC6FFBDF4F18EC7
S123F18002006F846F014FC6FFBDF5158E02004FC603BDF4F18E02006F846F013420108EFC
S123F1A0F0E1C610A6A0A7855CC11826F735204FF60100ED881BCC0101ED881D86FFC6FF0B
S123F1C0ED881FED8826CCFE01ED88218601A788238607A788248607A788254FC603BDF537
S123F1E0158EF7004FC601B70101F701021703258EF0CF7EF253B6E0008501398603B7E0E4
S123F200008611B7E000398610B701087F01097F010AB6E000850126088578270A8DDD2018
S123F220E6B6E0011CFD397A010A26E67A010926E17A010826DC4F1A02393402B6E0008565
S123F240022608857827F58DB320F13502B7E001398DE7A680810426F8390D0A586D6F64E3
S123F260656D20494445204469736B2055706C6F6164040D0A55706C6F616420436F6D7067
S123F2806C657465040D0A55706C6F6164204572726F72040D0A4472697665204E756D624F
S123F2A06572203A040D0A41726520596F752053757265203F2028592F4E29048EF25A172F
S123F2C0FF918EF29417FF8B17FF3C29FB17FF6A81301025012E8133102201288030B70163
S123F2E0008EF29417FF6CB601008B3017FF4B8EF2A517FF5E17FF0F29FB17FF3D845F8108
S123F3004E102700FF815926B31701B1CEF42DFF01068601B701048E02004FC601B7010152
S123F320F701021700EA102500E01701871700E0102500D68E0200B60101F601021701D5EA
S123F3401701718E0200B60101F601025CB70101F701021700BA102500B01701571700B0E4
S123F360102500A68E0200B60101F601021701A51701418E0200B60101F601025CB7010101
S123F380F7010217008A10250080170127170080102500768E0200A688264CB7010BE68837
S123F3A0275CF7010CB60101F60102170167170103B60101F601025C8E0200B70101F70129
S123F3C00217004C102500421700E9170042102500388E0200B60101F601021701371700E0
S123F3E0D3B60101F601025CF1010C26CBC6014CB1010B26C38EF7004FC601B70101F70135
S123F400021701118EF2737EF2538EF28516FE433440FE010617FDEF280A861517FE1BCE64
S123F420F42D20F1ADC426EDFF010635C081012606CEF44D1CFA3981042608860617FDFABE
S123F4401A0539811826031A05391CFA39B101042606CEF4631CFA39861517FDDDCEF42D16
S123F4601CFA3943B1010426EF7F01038680B70105CEF4771CFA393402BB0103B701033578
S123F480027A01052603CEF48EA7801CFA39B10103260B7C0104CEF42D1CFE1A04393404F8
S123F4A01F105AC4801F013504861517FD8CCEF42D1CFA393402860617FD7F3582CC0006CB
S123F4C0FDE11ECC0002FDE11ECC00E0FDE10C1602D68D664FC60134024F5AFDE106E6E448
S123F4E0FDE108F60100FDE10AC601FDE1045F35828DE4CC0020FDE10E1702AC3420108E84
S123F50001001702B2FCE100E780313F26F435201702955F398DC0CC0030FDE10E170288DC
S123F5203420108E01004F17028DE680FDE100313F26F435201702705F39A603810323014A
S10DF5404FB701005F39A6035F39DD
S123F700200B000000000000C00000000010CEC0FFEC8CF1FDC300108EC4008D3581022766
S123F72010811626F68D2BA78CDE8D26A78CDA20EA8D1FA78CD48D1AA78CD08D151F895D6B
S123F74027D9AE8CC534148D093514A7805A26F520C9108CC400260F8EC300EC84270B8DE5
S123F76026269D108EC304A6A0396E9C9B34024F5AFDE106E6E4FDE108E68C90FDE10AC6F0
S123F78001FDE1045F35828DE4CC0020FDE10E8D173420108E01008D1EFCE100E780313F2D
S122F7A026F535208D025F39FCE10EC58026F9FCE10EC54027F239FCE10EC50827F9390D
S123F800F814F861FCA1FC9BFCB9FCCEFB8FFB1EFB1AFA2E8EFE74108EDFC0C610A680A70C
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2
S123F840049F8EFE841703478EDFD04FC60D6D8527038B04195A2AF617040C8EFEA3170383
S123F8602E8EFEAA1702B3170437847F810D27F11F8981202C09865E1704531F988B4017F0
S123F880044C170447C1602F02C0208EFE3BE180270F30028CFE7426F58EFEAC1702F02076
S123F8A0C0AD9420BC1F343B17036B292D1F128EFEB21702651F211703A517040FA6A41787
S123F8C003A517040717035E2811810827E1811827DD815E2717810D260F39A7A4A1A427AB
S123F8E0081703E8863F1703E5312120C2313F20BE1702A21F328EDFC0301F200517030BE2
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE4270517039A27DB
S123F9200332623934108EFEB21701EEAEE417032E170396C610A68017032C17038E5A2677
S123F940F5170386AEE1C610A68081202504817E2302862E1703775A26EE20BC1702B7290D
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2
S123F980170349863F160346108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4AD5
S123F9A08D0617024816FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A717
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D39CC0006FDE11ECC0002FDE18D
S123F9E01ECC00E0FDE10C8D2ECC0001FDE1045FFDE106FDE108FDE10AC620FDE10E8D175E
S123FA008EC0008D21FCE100E7808CC10026F48EC000AF4A1F343BFCE10EC58026F9FCE13A
S123FA200EC54027F239FCE10EC50827F9393436A66244444444108EDFD0E6A654545454A1
S123FA40E7E4E6A65358585858A662840FA762EA62E76235B63404C6205A26FD3584BDFC67
S123FA60E386111702687FDFE217022A815326F91702238139273D813126F11701A83402F8
S123FA80292617019129213410E6E0EBE0EBE46AE46AE4340417018E3504290C3402EBE093
S123FAA06AE42705A78020EB5F3502C1FF27BA863F17021A73DFE286131602126FE2170107
S123FAC04A3430294DAC6225493001AFE4BDFCE386121701F9ECE4A36227061083002023A1
S123FAE002C620E7648EFEF317002FCB031F98170175AE62170168EB62EB63EB84A6801721
S123FB0001656A6426F5531F9817015BAF62ACE426C386141701B73265398D0220713410EE
S123FB208EFEA417006935901601A11600F81600E51700918DF28DF62902AF4A398D618D09
S123FB40E78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18DD52902AF44398D49E1
S123FB608DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB08DB12902A741398D7C
S123FB805F8DA58DA629048A80A7C43917013FA680810426F7398EFEB68DF41F311600BF82
S123FBA08EFEC28DEAAE4820F48EFED48DE1A6431600B48EFECE8DD7AE4420E18EFEC88D5F
S123FBC0CEAE4620D88EFEBC8DC5AE4A20CF8EFEDA8DBCA64120D98EFEDF8DB3A64220D0D4
S123FBE08EFEE48DAAA6C48EFEEB1600908EFEB217FF278DA18DA98DB08DB88DBF8EFEB2E8
S123FC0017FF178DC08DC78DCE20D58D09294D1F12862D1700B88D0E29421F018D08293CE3
S123FC203410A76135908D112932484848481F898D0729283404ABE0398D5B8130251D81B1
S123FC40392203803039814125128146220380373981612507816622038057391A023934D1
S123FC601035028D0235023402444444448D043502840F8B3081392F028B0720513402C62D
S123FC8008A68068E42502862D8D438D3F5A26F135826E9FF0007DDFE227068D04847F202C
S123FCA02D3410BEDFE0A684850126098EE020A684850127EEA60135903402A69FDFE085F5
S123FCC0012605B6E020850135828D0086208D453412BEDFE0A684850227FA3502A7013553
S123FCE0908D13BEDFE08603A7848611A7846D0186FFB7DFE2398EE030CC0000FDDFFBA751
S123FD0002E703E704FDDFFDC602E7017FDFFE861B8D02865934168EE0307DDFFE27048D1A
S123FD2074200D812024048D092005A7841700C53596810810270041811B1027006C811AED
S123FD401027008E811610270045810D10270099810C1027002C810B10270011810A2651A3
S123FD60FCDFFB5CC11910260083160099FCDFFB5D1027003C5A160074B6DFFB27334A1637
S123FD800068B6DFFB4C81501027002516005BCC0000160058F6DFFEC13D27168159102724
S123FDA0006E81542731813D2604B7DFFE397FDFFE397DDFFD2604B7DFFD397FDFFE80200F
S123FDC0814F22EDF6DFFD7FDFFDC020C11822E1201BCC00008D16B6DFFBC620E7844CA7D9
S123FDE002815026F77FDFFE394FF6DFFCFDDFFBA702E70339FCDFFB4C815026F04F5CC142
S123FE001926EA5A8DE7E6045CC11925015FE704F6DFFB8620F7DFFBE702A7845CC1502669
S123FE20F4F6DFFC5CC1192708F7DFFCE7035F20E45FF7DFFBE702F7DFFE3901FB7402FBE2
S123FE406903FB7F04FB5E10FB3115FB3D18FB5319FB4842F95C45F8FD47F8A54CFA5E5067
S123FE60FABC4DF8A852FBED53F8F158F98844F9D555FC92F994F8A7F8A7F8A7F8A7F99401
S123FE80FFFFFFFF0D0A000000535953303942554720312E3420464F5220584553532020A8
S123FEA02D20044B0D0A000000043E04574841543F04202D2004202053503D042020504366
S123FEC03D04202055533D04202049593D04202049583D04202044503D042020413D042078
S119FEE020423D04202043433A2004454648494E5A56435331045C
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB
S9030000FC
/sys09b5x.txt
0,0 → 1,5
NAM SYS09BUG FOR THE B5-X300
INCLUDE "opt_b5x.txt"
INCLUDE "sys09equ.txt"
INCLUDE "sys09bug.txt"
END
/sys09xes.txt
0,0 → 1,6
NAM SYS09BUG FOR XESS
INCLUDE "opt_xes.txt"
INCLUDE "sys09equ.txt"
INCLUDE "sys09ide.txt"
INCLUDE "sys09bug.txt"
END
/sys09ide.txt
0,0 → 1,986
*
** SYS09BUG MONITOR EXTENSIONS
*
* FOR SYS09BUG ON THE XESS XSA-3S100 / XST-3.0
* WITH I/O MAPPED AT $XE000
* 16 BIT IDE MAPPED AT $E100
* AND ROM MAPPED AT $XF000
*
*
PAGE
*
***************************************************
* Serial PROM register
***************************************************
*
** CONFIGURATION PROM DEFINITIONS
*
PROMREG EQU MONIO+$C0
PCLKHI EQU $01 Toggle PROM Clock High
PCLKLO EQU $00 Toggle PROM Clock Low
PRSTHI EQU $02 Toggle PROM Reset High
PRSTLO EQU $00 Toggle PROM Reset Low
SYNCHI EQU $AA55 Synch Pattern High Word
SYNCLO EQU $FF00 Synch Pattern Low Word
*
*
***************************************************
* START OF ROM *
***************************************************
*
MONITV EQU MONROM+0 FDB MONITOR
NXTCMV EQU MONROM+2 FDB NEXTCMD
INCHV EQU MONROM+4 FDB INCH
INCHEV EQU MONROM+6 FDB INCHE
INCHKV EQU MONROM+8 FDB INCHEK
OUTCHV EQU MONROM+10 FDB OUTCH
PDATAV EQU MONROM+12 FDB PDATA
PCRLFV EQU MONROM+14 FDB PCRLF
PSTRGV EQU MONROM+16 FDB PSTRNG
LRAV EQU MONROM+18 FDB LRA
*
* Condition code flags
*
CFLAG EQU $01 CARRY FLAG
VFLAG EQU $02 OVERFLOW FLAG
ZFLAG EQU $04 ZERO FLAG
NFLAG EQU $08 NEGATIVE FLAG
IFLAG EQU $10 IRQ MASK CC
HFLAG EQU $20 HALF CARRY
FFLAG EQU $40 FIRQ MASK CC
EFLAG EQU $80 ENTIRE FLAG
*
* Serial Port
*
ACIAC1 EQU ACIAS
ACIAD1 EQU ACIAS+1
DELCON EQU 1250 Delay (Processor clock in MHz * 50)
*
* XMODEM Control characters
*
SOH EQU $01
EOT EQU $04
ACK EQU $06
NAK EQU $15
CAN EQU $18
*
* Some Disk Constants
*
RMAXTRK EQU 256
RMAXSEC EQU 255
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
*
* RAM SPACE
*
* PUT THIS DOWN THE BOTTOM OF MEMORY
*
ORG $0100
DRVNUM RMB 1
TRACK RMB 1
SECTOR RMB 1
CHKSUM RMB 1
BLKNUM RMB 1 Xmodem block number
BYTCNT RMB 1 Xmodem byte count
XSTATE RMB 2 Xmodem State Vector
DELCNT RMB 3 $00,$00,$00 Xmodem Poll timer
MAXTRK RMB 1
MAXSEC RMB 1
ORG $0200
*
* SECTOR BUFFER
*
BUFFER RMB 256
*
****************************************
*
* START OF EXTENSION COMMANDS
*
****************************************
*
ORG MONEXT
FDB NEXTEXT Jump to next extended command
*
***** NEXTCMD *****
*
NEXTEXT JSR [INCHEV] GET ONE CHAR. FROM TERMINAL
ANDA #$7F STRIP PARITY FROM CHAR.
TFR A,B
LDA #$20
JSR [OUTCHV] PRNT SPACE
CMPB #$60
BLE NXTEX0
SUBB #$20
*
***** DO TABLE LOOKUP *****
* FOR COMMAND FUNCTIONS
*
NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE
NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
BEQ JMPEXT BRANCH IF MATCH FOUND
LEAX 2,X POINT TO NEXT ENTRY IN TABLE
CMPX #EXTEND REACHED END OF TABLE YET ?
BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY
LDX #MSGWHAT POINT TO MSG "WHAT?"
LBRA PDATA1 PRINT MSG AND RETURN
JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE
*
* EXTENDED COMMAND JUMP TABLE
*
EXTTAB EQU *
FCC 'B' BOOT FLEX
FDB UBSUB
FCC 'F' FORMAT IDE DISK
FDB UFSUB
FCC 'X' XMODEM ROM DISK UPLOAD
FDB UXSUB
*
EXTEND EQU *
*
MSGWHAT FCC "WHAT ?"
FCB $0A,$0D,$04
*
* GO TO FLEX RESIDENT IN MEMORY
*
UBSUB LDX #$CD00
STX 10,U
TFR U,S
RTI
*
* recieve char from remote drive.
* timeout if no response for approx 1s.
* Entry: no parameters
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
*
RCHAR PSHS X,Y
*
LDX #1000 1000x inner loop
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
RCHAR2 LDA ACIAC1 test for recieved char
ASRA
BCS RCHAR3 get character
LEAY -1,Y else, continue to count delay
BNE RCHAR2
LEAX -1,X
BNE RCHAR1
PULS X,Y,PC return with error if timed out
*
RCHAR3 LDA ACIAD1 return data (carry bit still set)
PULS X,Y,PC
*
*
* transmit char to remote drive.
* timeout if no response for approx 1s. (allows for use of hardware flow control)
* Entry: (A) = char to transmit
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
*
SCHAR PSHS X,Y
PSHS A
*
LDX #1000 1000x inner loop
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
SCHAR2 LDA ACIAC1 test for space in transmit FIFO
ASRA
ASRA
BCS SCHAR3 send character
LEAY -1,Y else, continue to count delay
BNE SCHAR2
LEAX -1,X
BNE SCHAR1
PULS A
PULS X,Y,PC return with error if timed out
*
SCHAR3 PULS A
STA ACIAD1 send data (carry bit still set)
PULS X,Y,PC
*
** 'UF' Format IDE Drive to FLEX standard.
*
DISFOS FCB $0A,$0D
FCC 'Formating IDE disk... '
FCB $0A,$0D
FCC 'Drive Number ?'
FCB 4
MESS6 FCB $0A,$0D,4
FCC 'IDE drive not allocated! '
FCB 4
UFMSG1 FCB $0A,$0D
FCC 'Format Complete'
FCB 4
VOLMSG FCC 'IDEDISK '
FCB 4
*
UFSUB JSR INITDR
LDX #DISFOS
JSR PDATA1
UFSUB1 LBSR RCHAR
BCC UFSUB1
LBSR SCHAR
CMPA #'0'
LBLO UFEXIT
CMPA #'3'
LBHI UFEXIT
SUBA #'0'
TFR A,B
STB DRVNUM
LDX #DRVNUM-3
JSR DRVSEL
*
* set up free chain
*
LDX #BUFFER clear out buffer
CLRA
CLRB
DFL1 STA 0,X+
DECB
BNE DFL1
*
CLR TRACK
LDA #1
STA SECTOR
DFL2 LDX #BUFFER
LDA TRACK
STA 0,X
LDA SECTOR
INCA
CMPA #RMAXSEC+1 last sector on track?
BNE DFL3
INC 0,X
LDA #1
DFL3 STA 1,X
LDA TRACK
LDB SECTOR
JSR WRITSC
INC SECTOR
LDA SECTOR
CMPA #RMAXSEC+1
BNE DFL2
LDA #1
STA SECTOR
INC TRACK
LDA TRACK
CMPA #RMAXTRK
BNE DFL2
* break free chain at last track/sector
LDX #BUFFER
LDA #RMAXTRK-1
LDB #RMAXSEC
JSR READSC
LDX #BUFFER
CLR 0,X
CLR 1,X
LDA #RMAXTRK-1
LDB #RMAXSEC
JSR WRITSC
* set up sector structure, SIR, directory etc
LDX #BUFFER
CLRA
LDB #RMAXSEC
JSR READSC
LDX #BUFFER
CLR 0,X break end of directory chain
CLR 1,X
CLRA
LDB #RMAXSEC
JSR WRITSC
*
LDX #BUFFER
CLRA
LDB #3 set up SIR
JSR READSC
LDX #BUFFER
CLR 0,X break forward link
CLR 1,X
*
PSHS Y
LDY #VOLMSG
LDB #16
DFL4 LDA ,Y+
STA B,X
INCB
CMPB #24
BNE DFL4
PULS Y
*
CLRA
LDB DRVNUM volume number
STD 27,X
*
LDD #$0101 first trk/sec 01-01
STD 29,X
LDA #RMAXTRK-1
LDB #RMAXSEC
STD 31,X
STD 38,X
LDD #RTOTSEC total DATA sectors (2912-14)
STD 33,X
*
LDA #01 month set default creation date (SYS09's birthday!)
STA 35,X
LDA #07 day
STA 36,X
LDA #07 year
STA 37,X
*
RF3 CLRA
LDB #3
JSR WRITSC
*
* Not sure what this is about
* put bootstrap on track 0 sector 1
*
* LDX #BUFFER
* CLRA
* LDB #1
* JSR READSC
* LDX #BUFFER
* LDA #$AA set the init flag
* STA 0,X
* LDA #$55
* STA 1,X
* CLRA
* LDB #1
* JSR WRITSC
*
* Write Boot sector
*
LDX #BOOT
CLRA TRACK 0
LDB #$01 SECTOR 1
STA TRACK
STB SECTOR
LBSR WRITSC
*
UFEXIT LDX #UFMSG1
JMP PDATA1
*
* ACIA INPUT TEST
*
INTEST LDA ACIAC1
BITA #$01
RTS
*
* RESET ACIA
*
ACIRST LDA #$03 master reset
STA ACIAC1
LDA #$11
STA ACIAC1
RTS
*
* ACIA INPUT
*
INTER LDA #16
STA DELCNT+0
CLR DELCNT+1
CLR DELCNT+2
INTER0 LDA ACIAC1
BITA #$01
BNE INTER1
BITA #$78
BEQ INTER2
BSR ACIRST
BRA INTER
*
INTER1 LDA ACIAD1
ANDCC #$FF-VFLAG
RTS
*
INTER2 DEC DELCNT+2
BNE INTER0
DEC DELCNT+1
BNE INTER0
DEC DELCNT+0
BNE INTER0
CLRA
ORCC #VFLAG
RTS
*
* ACIA OUTPUT
*
OUTTER PSHS A
*
OUTTE1 LDA ACIAC1
BITA #$02
BNE OUTTE2
BITA #$78
BEQ OUTTE1
BSR ACIRST
BRA OUTTE1
*
OUTTE2 PULS A
STA ACIAD1
RTS
*
* Print Data
*
PDATA0 BSR OUTTER
PDATA1 LDA ,X+
CMPA #$04
BNE PDATA0
RTS
*
*
** 'UX' Xmodem IDE Disk upload
*
UXMES0 FCB $0D,$0A
FCC 'Xmodem IDE Disk Upload'
FCB 4
UXMES1 FCB $0D,$0A
FCC 'Upload Complete'
FCB 4
UXMES2 FCB $0D,$0A
FCC 'Upload Error'
FCB 4
UXMSG3 FCB $0D,$0A
FCC 'Drive Number :'
FCB 4
UXMSG4 FCB $0D,$0A
FCC 'Are You Sure ? (Y/N)'
FCB 4
*
* Print Banner
*
UXSUB LDX #UXMES0
LBSR PDATA1
*
* Prompt for Disk drive number (0 to 3)
*
LDX #UXMSG3
LBSR PDATA1
UXSUB1 LBSR INTER
BVS UXSUB1
LBSR OUTTER
CMPA #'0
LBLO UXEXIT
CMPA #'3
LBHI UXEXIT
SUBA #'0
STA DRVNUM
*
* Report selected drive
*
LDX #UXMSG3
LBSR PDATA1
LDA DRVNUM
ADDA #'0
LBSR OUTTER
*
* Ask for confirmation (Y/N)
*
LDX #UXMSG4
LBSR PDATA1
UXSUB2 LBSR INTER
BVS UXSUB2
LBSR OUTTER
ANDA #$5F
CMPA #'N
LBEQ UXEXIT
CMPA #'Y
BNE UXSUB
*
* We have confirmation ... now load the disk image
*
LBSR INITDR
LDU #XSTST
STU XSTATE
LDA #1
STA BLKNUM
*
* Sector1
*
LDX #BUFFER
*
CLRA TRACK 0
LDB #$01 SECTOR 1
STA TRACK
STB SECTOR
*
LBSR XREAD
LBCS UXERR
LBSR XACK
LBSR XREAD
LBCS UXERR
*
LDX #BUFFER
LDA TRACK
LDB SECTOR
LBSR WRITSC
LBSR XACK
*
* Sector 2
*
LDX #BUFFER
*
LDA TRACK
LDB SECTOR
INCB
STA TRACK
STB SECTOR
*
LBSR XREAD
LBCS UXERR
LBSR XACK
LBSR XREAD
LBCS UXERR
*
LDX #BUFFER
LDA TRACK
LDB SECTOR
LBSR WRITSC
*
LBSR XACK
*
* Sector 3 - SIR
*
LDX #BUFFER
*
LDA TRACK
LDB SECTOR
INCB
STA TRACK
STB SECTOR
*
LBSR XREAD
LBCS UXERR
LBSR XACK
LBSR XREAD
LBCS UXERR
*
LDX #BUFFER
LDA 38,X
INCA
STA MAXTRK
LDB 39,X
INCB
STB MAXSEC
LDA TRACK
LDB SECTOR
LBSR WRITSC
*
LBSR XACK
*
* Sector 4 to Last Track & Sector
*
*
LDA TRACK
LDB SECTOR
INCB
*
UXLOOP LDX #BUFFER
STA TRACK
STB SECTOR
*
LBSR XREAD
LBCS UXERR
LBSR XACK
LBSR XREAD
LBCS UXERR
*
LDX #BUFFER
LDA TRACK
LDB SECTOR
LBSR WRITSC
LBSR XACK
*
LDA TRACK
LDB SECTOR
INCB
CMPB MAXSEC
BNE UXLOOP
LDB #1
INCA
CMPA MAXTRK
BNE UXLOOP
*
*
* Write Boot sector
*
LDX #BOOT
CLRA TRACK 0
LDB #$01 SECTOR 1
STA TRACK
STB SECTOR
LBSR WRITSC
*
UXEXIT LDX #UXMES1
JMP PDATA1
*
UXERR LDX #UXMES2
LBRA PDATA1
*
* Get a Byte using XModem protocol
* Carry clear => no errors
* Carry set => errors
*
XREAD PSHS U
LDU XSTATE
*
XBYTE0 LBSR INTER
BVC XBYTE1
LDA #NAK
LBSR OUTTER
LDU #XSTST
BRA XBYTE0
*
XBYTE1 JSR ,U
BNE XBYTE0
STU XSTATE
PULS U,PC
*
* START - LOOK FOR SOH (START OF HEADER) = $01
*
XSTST CMPA #SOH
BNE XSTST1
LDU #XSTBL
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
RTS
*
XSTST1 CMPA #EOT
BNE XSTST2
LDA #ACK
LBSR OUTTER
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
RTS
*
XSTST2 CMPA #CAN
BNE XSTST3
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
RTS
*
XSTST3 ANDCC #$FF-CFLAG-ZFLAG
RTS
*
* Got SOH
* Now get block number
*
XSTBL CMPA BLKNUM
BNE XSTBLE
LDU #XSTCOM
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
RTS
*
* Error in block number
*
XSTBLE LDA #NAK
LBSR OUTTER
LDU #XSTST
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
RTS
*
* Get complement of block number
*
XSTCOM COMA
CMPA BLKNUM
BNE XSTBLE
CLR CHKSUM
LDA #128
STA BYTCNT
LDU #XSTDA
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
RTS
*
* Get data bytes
*
XSTDA PSHS A
ADDA CHKSUM
STA CHKSUM
PULS A
DEC BYTCNT
BNE XSTDA1
LDU #XSTCK
XSTDA1 STA ,X+
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
RTS
*
* Byte count reached zero
* Check checksum byte
*
XSTCK CMPA CHKSUM
BNE XSTCK1 retry if wrong checksum
*
* Checksum OK ...
* increment block number
* Don't send ACK until data written to CF
*
INC BLKNUM
LDU #XSTST
ANDCC #$FF-CFLAG No abort
ORCC #ZFLAG Valid data (exit)
RTS
*
* Checksum Error detected ...
* Reset Sector counter in ACCB to last 128 byte boundary
* and send NAK
*
XSTCK1 PSHS B
TFR X,D
DECB
ANDB #128
TFR D,X
PULS B
LDA #NAK
XSTCK2 LBSR OUTTER
LDU #XSTST
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
RTS
*
* Acknowledge Data Received
*
XACK PSHS A
LDA #ACK
LBSR OUTTER
PULS A,PC
*
*
** FLEX 9 IDE DISK DRIVERS
*
* FOR SYS09BUG 1.2 ON THE XSA-3S1000
* WITH I/O MAPPED AT $XE000
* AND ROM MAPPED AT $XF000
*
*
* INITIALIZE CF CARD FOR 8 BIT LBA MODE
*
INITDR LDD #AUXRESET
STD CF_AUX
LDD #AUXRSTREL
STD CF_AUX
LDD #HEADLBA
STD CF_HEAD
LBRA WTRDY
*
* RESTORE DISK DRIVER (SEEK TRACK 00)
*
RESTR1 BSR DRVSEL
CLRA ; Track 0
LDB #$01 ; Sector 1
*
* Seek track and sector
* A holds track number (0 - ??)
* B holds sector number (1 - ??)
* Sector numbers starts from 1
* subtract 1 to start from sector 0 on CF
*
SEEKTS PSHS A
CLRA
DECB
STD CF_SECNUM
LDB ,S
STD CF_CYLLO
LDB DRVNUM
STD CF_CYLHI
LDB #$01
STD CF_SECCNT
CLRB
PULS A,PC
*
* READ SECTORS FROM CF
*
*
READSC BSR SEEKTS
LDD #CMDREAD ; IDE READ MULTIPLE
STD CF_COMAND
LBSR WTRDY
*
* READ LOOP
*
PSHS Y
LDY #256
RDLP1 LBSR WTDRQ
LDD CF_DATA
STB ,X+
LEAY -1,Y
BNE RDLP1
PULS Y
*
LBSR WTRDY
CLRB
RTS
*
* WRITE SECTOR TO CF
*
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
LDD #CMDWRITE ; IDE WRITE MULTIPLE
STD CF_COMAND
LBSR WTRDY
*
* WRITE LOOP
*
PSHS Y
LDY #256
CLRA
WRTLP1 LBSR WTDRQ
LDB ,X+
STD CF_DATA
LEAY -1,Y
BNE WRTLP1
PULS Y
*
LBSR WTRDY
CLRB
RTS
*
* DRIVE SELECT DISK DRIVER
*
DRVSEL LDA 3,X GET DRIVE # FROM FCB
CMPA #3
BLS DRVS2 IF > 3, SET IT TO 0
CLRA
DRVS2 STA DRVNUM
CLRB ; SET Z, CLEAR C
RTS
*
* CHECK DRIVE READY DISK DRIVER
*
CHKDRV LDA 3,X
CLRB ; CLEAR C, SET Z
RTS
*******************************************************
*
* Bootstrap FLEX Loader
*
* SBUG1.8 loads the bootstap loader at $C000
* however the Flex adaption manual has the
* bootstrap loader residing at $C100
* Bootstrap Loader is position independent code
*
******************************************************
*
* Equates
*
BSSTACK EQU $C0FF
SCTBUF EQU $C300
*
* Start of Utility
*
ORG MONEXT+$0700
BOOT BRA BLOAD0
FCB 0,0,0
TRK FCB 0 File start track
SCT FCB 0 File start sector
DNS FCB 0 Density Flag (not used)
TADR FDB $C000 Transfer address
LADR FDB 0 Load Address
DRNUM FCB 0 Drive number 0
*
BLOAD0 LDS #BSSTACK Set up Bootstrap stack
LDD TRK,PCR Set up start track and sector
STD SCTBUF
LDY #SCTBUF+256
*
* Perform actual file load
*
BLOAD1 BSR GETCH Get acharcater
CMPA #$02 Data record hearder ?
BEQ BLOAD2 Skip, is so
CMPA #$16 Xfr address hearder ?
BNE BLOAD1 Loop if neither
*
* Get transfer address
*
BSR GETCH
STA TADR,PCR
BSR GETCH
STA TADR+1,PCR
BRA BLOAD1
*
* Load data record
*
BLOAD2 BSR GETCH Get load address
STA LADR,PCR
BSR GETCH
STA LADR+1,PCR
BSR GETCH Get Bytes count
TFR A,B
TSTB
BEQ BLOAD1 Loop if count = 0
LDX LADR,PCR Get load address
BLOAD3 PSHS B,X
BSR GETCH Get data character
PULS B,X
STA ,X+ Store at load address
DECB
BNE BLOAD3 Loop until count = 0
BRA BLOAD1
*
* Get Character routine
* Reads a sector if needed
*
GETCH CMPY #SCTBUF+256 out of data ?
BNE GETCH4 Go read Character if not
GETCH2 LDX #SCTBUF Point to buffer
LDD 0,X Get forward Link
BEQ GOFLEX if zero, file is loaded
BSR READ Read next sector
BNE BOOT start over if error
LDY #SCTBUF+4 Point past link
GETCH4 LDA ,Y+ Else, get a character
RTS
*
* File is loaded, Jump to it
*
GOFLEX JMP [TADR,PCR] Jump to transfer address
 
*
** FLEX 9 IDE DISK DRIVERS
*
* Seek track and sector
* A holds track number (0 - ??)
* B holds sector number (1 - ??)
* Sector numbers starts from 1
* subtract 1 to start from sector 0 on CF
*
SEEK PSHS A
CLRA
DECB
STD CF_SECNUM
LDB ,S
STD CF_CYLLO
LDB DRNUM,PCR
STD CF_CYLHI
LDB #$01
STD CF_SECCNT
CLRB
PULS A,PC
*
* READ SECTORS FROM CF
*
*
READ BSR SEEK
LDD #CMDREAD ; IDE READ MULTIPLE
STD CF_COMAND
BSR WTRDY
*
* READ LOOP
*
PSHS Y
LDY #256
READ1 BSR WTDRQ
LDD CF_DATA
STB ,X+
LEAY -1,Y
BNE READ1
PULS Y
*
BSR WTRDY
CLRB
RTS
*
* WAIT UNTIL READY
*
WTRDY LDD CF_STATUS
BITB #BUSY
BNE WTRDY
LDD CF_STATUS
BITB #DRDY
BEQ WTRDY
RTS
*
* WAIT FOR DATA REQUEST
*
WTDRQ LDD CF_STATUS
BITB #DRQ
BEQ WTDRQ
RTS
*
END
/sys09s3s.sh
0,0 → 1,2
../../Tools/as09/as09.exe sys09s3s.txt -l > sys09s3s.lst
../../Tools/epedit/epedit.exe sys09s3s.aux
/SYS09ADS.S19
0,0 → 1,61
S123F800F822F856FC66FC60FC75FC83FB58FAE7FAE3FF06FE47FE09FE33FCABFCC0FC9844
S123F820FC858EFE81108EDFC0C610A680A7A05A26F98EE400BFDFD0170142C60C6FE25A86
S123F84026FB308CDDAF6A86D0A7E41F431704468EFE911703028EFEBA1702871704078468
S123F8607F810D27F11F8981202C09865E1704131F988B4017040C170407C1602F02C020D2
S123F8808EFE4BE180270F30028CFE8126F58EFEBC1702C420C0AD9420BC1F343B17033F95
S123F8A0292D1F128EFEC21702391F211703791703CFA6A41703791703C71703322811819D
S123F8C00827E1811827DD815E2717810D260F39A7A4A1A427081703A8863F1703A5312107
S123F8E020C2313F20BE1702761F328EDFC0301F20051702DF29063420ACE12401391F10BE
S123F900C30010C4F034061F20C4F01F01ACE42705170361270332623934108EFEC2170137
S123F920C2AEE4170302170356C610A68017030017034E5A26F5170346AEE1C610A6808184
S123F940202504817E2302862E1703375A26EE20BC17028B291E8CDFC0241A34108EFFFFC3
S123F9608D553510270FA684813F2709A7A0AFA4863FA78439170309863F160306108EDFC5
S123F980D3C6088D185A26FB391F43AE4A301F8D262704AF4A8D0617021C16FEB9AE218CF9
S123F9A0DFC0240AA684813F2604A6A4A78486FFA7A0A7A0A7A039108EDFD3C608A6A0AC4A
S123F9C0A127045A26F739313D397DE0187FE0148E000030018C000026F9860FB7E0188DDD
S123F9E037F6E018C50126F98601B7E01A8D29868CB7E0188D228EC0002009C5022705B67B
S123FA00E01BA780F6E018C50126F0C52C2701398EC000AF4A1F343BC6045A26FD39340417
S123FA20C6205A26FD3584BDFC9886111702547FDFD2170226815326F917021F8139273D99
S123FA40813126F11701A83402292617019129213410E6E0EBE0EBE46AE46AE43404170111
S123FA608E3504290C3402EBE06AE42705A78020EB5F3502C1FF27BA863F17020673DFD29A
S123FA8086131601FE6FE217014A3430294DAC6225493001AFE4BDFC9886121701E5ECE431
S123FAA0A3622706108300202302C620E7648EFF0317002FCB031F98170175AE621701688F
S123FAC0EB62EB63EB84A6801701656A6426F5531F9817015BAF62ACE426C386141701A330
S123FAE03265398D02207134108EFEB4170069359016018D1600F81600E51700918DF28DE8
S123FB00F62902AF4A398D618DE78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD1E2
S123FB208DD52902AF44398D498DC68DC72902A743398D6C8DBB8DBC2902A742398D588DF4
S123FB40B08DB12902A741398D5F8DA58DA629048A80A7C43917012BA680810426F7398E69
S123FB60FEC68DF41F311600BF8EFED28DEAAE4820F48EFEE48DE1A6431600B48EFEDE8DB0
S123FB80D7AE4420E18EFED88DCEAE4620D88EFECC8DC5AE4A20CF8EFEEA8DBCA64120D9BC
S123FBA08EFEEF8DB3A64220D08EFEF48DAAA6C48EFEFB1600908EFEC217FF278DA18DA971
S123FBC08DB08DB88DBF8EFEC217FF178DC08DC78DCE20D58D09294D1F12862D1700A48DAF
S123FBE00E29421F018D08293C3410A76135908D112932484848481F898D0729283404ABD4
S123FC00E0398D578130251D8139220380303981412512814622038037398161250781665E
S123FC2022038057391A0239341035028D0235023402444444448D043502840F8B308139DF
S123FC402F028B07203D3402C608A68068E42502862D8D2F8D2B5A26F135827DDFD2270639
S123FC608D04847F201D3410BEDFD0A684850127F7A60135903402A69FDFD0850135828DD0
S123FC800086208D3B3412BEDFD0A684850227FA3502A70135908D13BEDFD08603A7848682
S123FCA011A7846D0186FFB7DFD2398E0000BFDFEBBFDFEF8EE800BFDFED861B8D028659BC
S123FCC03416BEDFEDE684C47FE7847DDFF027048D5E2010812024048D152008BEDFEDA7DE
S123FCE0841700E9BEDFEDE684CA80E7843596810810270027811B10270052810D10270037
S123FD00B4810A264FFCDFEB5CC110102600AA1600CCFCDFEB5D273C5A16009DB6DFEB273C
S123FD20334A160091B6DFEB4C81402727160086F6DFF0C13D271E8159102700B881542757
S123FD405D8145273B8152272C813D2604B7DFF0397FDFF0397DDFEF2604B7DFEF397FDF35
S123FD60F08020813F22EDF6DFEF7FDFEFC020C10F22E120448D3EF6DFECC10F277A20617A
S123FD808D33F6DFECC10F27158EEBC0A682A78840A6890400A7890440BCDFED26EEB6DF2A
S123FDA0EBBEDFEDC620E7890400E7804C814026F57FDFF0394FF6DFECFDDFEB86403DFB85
S123FDC0DFEB8900C3E800FDDFED1F0139FCDFEB4C814026E44F5CC11026DE5A8DDB8EE86A
S123FDE000A6890440A7890400A68840A7808CEBC026EE2003BEDFED8620A7890400A780CA
S123FE008CEC0026F57FDFF0393404CC0C04FDE404C604F7E4045C26FDB7E404862AB7E4B9
S123FE2007CCFF2EFDE406861B8D0886438D04864235043404F6E406F6E404C51027065DF1
S123FE402BF6B7E40635847DE4073901FB3D02FB3203FB4804FB2710FAFA15FB0618FB1C65
S123FE6019FB1142F95145F8F247F89A4CFA2750FA854DF89D52FBB653F8E658F97D44F968
S123FE80CAF989F89CF89CF89CF89CF989FFFFFFFF0D0A0000005359533039425547203196
S123FEA02E3420464F52204144533638303920202D20044B0D0A000000043E045748415499
S123FEC03F04202D2004202053503D04202050433D04202055533D04202049593D042020A6
S123FEE049583D04202044503D042020413D042020423D04202043433A2004454648494EF4
S123FF005A56435331043910CEDFC05F53F7DFD216F90F6E9FDFC06E9FDFC46E9FDFC66EB8
S123FF209FDFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE22A9
S114FF40083410ECC4AE446EF1371FEE426E9FDFC22B
S113FFF0FF13FF27FF17FF1BFF1FFF23FF13FF073D
S9030000FC
/sys09s3e_b16.vhd
0,0 → 1,64
INIT_00 => x"A780A610C6C07F8E1060FE8EE1FE0DFB11FB82FBBDFCA8FC8AFC90FC4BF814F8",
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC6450117D07FBF00E08EF9265AA0",
INIT_02 => x"092C2081891FF1270D817F843C0417BC021795FE8EDE01173A031770FE8E8E04",
INIT_03 => x"FE8C02300F2780E12AFE8E20C0022F60C14C0417510417408B981F5804175E86",
INIT_04 => x"1F6E02179DFE8E121F2D297403173B341FBC2094ADC020F9021797FE8EF52660",
INIT_05 => x"17275E81DD271881E127088111286703170C0417AE0317A4A6140417AE031721",
INIT_06 => x"321FAB0217BE203F31C2202131EA03173F86ED03170827A4A1A4A7390F260D81",
INIT_07 => x"F0C4201F0634F0C41000C3101F390124E1AC2034062914031705201F30C07F8E",
INIT_08 => x"10C69B0317370317E4AEF701179DFE8E103439623203279F03170527E4AC011F",
INIT_09 => x"03172E8602237E810425208180A610C6E1AE8B0317F5265A93031735031780A6",
INIT_0a => x"273F8184A60F2710355B8DFFFF8E10341A24C07F8C1E29C00217BC20EE265A7C",
INIT_0b => x"431F39FB265A1E8D08C6D37F8E104B03163F864E03173984A73F86A4AFA0A709",
INIT_0c => x"A60A24C07F8C21AEB3FE16ED7FBF00008E5102170C8D4AAF04272C8D1F304AAE",
INIT_0d => x"265A0427A1ACA0A608C6D37F8E1039A0A7A0A7A0A7FF8684A7A4A604263F8184",
INIT_0e => x"7FBFE7F98EEB7FBFC07FBEED7FBF1429390217EE02171C295F0117393D3139F7",
INIT_0f => x"27ED7FBE24273F8184A64AAEEC011770E0B671E0B73686431F392020450017C0",
INIT_10 => x"3B71E0B73F8673E0B7368670E0B671E0B7368670E0B70D86341FED7FBF1F301F",
INIT_11 => x"B7368672E0B7008670E0B7FF8673E0B73A8671E0B7328622FE16C07FBFEB7FBE",
INIT_12 => x"81260217D27F7F6402171186D2FCBD8435FD265A20C604343973E0B73E8671E0",
INIT_13 => x"E0EBE0E61034212991011726290234A80117F12631813D2739811F0217F92653",
INIT_14 => x"FFC102355FEB2080A70527E46AE0EB02340C2904358E01170434E46AE46AE4EB",
INIT_15 => x"E4AF0130492562AC4D2930344A0117E26F0E02161386D27F731602173F86BA27",
INIT_16 => x"03CB2F0017DEFE8E64E720C6022320008310062762A3E4ECF501171286D2FCBD",
INIT_17 => x"AF5B0117981F53F526646A65011780A684EB63EB62EB68011762AE750117981F",
INIT_18 => x"00169D011690356900178FFE8E10347120028D396532B301171486C326E4AC62",
INIT_19 => x"8DDC8D728D3948AF0229EB8DE78D618D394AAF0229F68DF28D910017E50016F8",
INIT_1a => x"BB8D6C8D3943A70229C78DC68D498D3944AF0229D58DD18D5E8D3946AF0229E0",
INIT_1b => x"1739C4A7808A0429A68DA58D5F8D3941A70229B18DB08D588D3942A70229BC8D",
INIT_1c => x"8DBFFE8EF42048AEEA8DADFE8EBF0016311FF48DA1FE8E39F726048180A63B01",
INIT_1d => x"204AAEC58DA7FE8ED82046AECE8DB3FE8EE12044AED78DB9FE8EB4001643A6E1",
INIT_1e => x"900016D6FE8EC4A6AA8DCFFE8ED02042A6B38DCAFE8ED92041A6BC8DC5FE8ECF",
INIT_1f => x"098DD520CE8DC78DC08D17FF179DFE8EBF8DB88DB08DA98DA18D27FF179DFE8E",
INIT_20 => x"4848483229118D903561A710343C29088D011F42290E8DB400172D86121F4D29",
INIT_21 => x"22468112254181393080032239811D253081578D39E0AB04342829078D891F48",
INIT_22 => x"4444444402340235028D0235103439021A395780032266810725618139378003",
INIT_23 => x"3B8D3F8D2D860225E46880A608C602344D20078B022F3981308B0F840235048D",
INIT_24 => x"84A620E08E0926018584A6D07FBE10342D207F84048D0627D27F7D8235F1265A",
INIT_25 => x"34458D2086008D8235018520E0B605260185D07F9FA60234903501A6EE270185",
INIT_26 => x"86016D84A7118684A70386D07FBE138D903501A70235FA27028584A6D07FBE12",
INIT_27 => x"1B86F27F7F01E702C6F17FFD04E703E702A7EF7FFD0000CC30E08E39D27FB7FF",
INIT_28 => x"35C5001784A70520098D042420810D20748D0427F27F7D30E08E16345986028D",
INIT_29 => x"81990027100D814500271016818E0027101A816C0027101B8141002710088196",
INIT_2a => x"5DEF7FFC9900168300261019C15CEF7FFC51260A81110027100B812C0027100C",
INIT_2b => x"00CC5B00162500271050814CEF7FB66800164A3327EF7FB67400165A3C002710",
INIT_2c => x"F27F7F39F27FB704263D81312754816E002710598116273DC1F27FF658001600",
INIT_2d => x"20E12218C120C0F17F7FF17FF6ED224F812080F27F7F39F17FB70426F17F7D39",
INIT_2e => x"A7EF7FFDF07FF64F39F27F7FF726508102A74C84E720C6EF7FB6168D0000CC1B",
INIT_2f => x"F604E75F012519C15C04E6E78D5AEA2619C15C4FF02650814CEF7FFC3903E702",
INIT_30 => x"E4205F03E7F07FF7082719C15CF07FF6F42650C15C84A702E7EF7FF72086EF7F",
INIT_31 => x"1946FB1830FB1524FB1051FB0472FB035CFB0267FB0139F27FF702E7EF7FF75F",
INIT_32 => x"C5F95472F958DBF853E0FB5292F84DAFFA5051FA4C8FF847E7F84546F9423BFB",
INIT_33 => x"2E312047554239305359530000000A0DFFFFFFFF7EF991F891F891F891F87EF9",
INIT_34 => x"202D20043F54414857043E040000000A0D4B04202D202045335320524F462034",
INIT_35 => x"20043D58492020043D59492020043D53552020043D43502020043D5053202004",
INIT_36 => x"315343565A4E4948464504203A43432020043D422020043D412020043D504420",
INIT_37 => x"9F6EC87F9F6EC67F9F6EC47F9F6EC07F9F6E26F916D27FF7535FC07FCE103904",
INIT_38 => x"C4EC10340822CE7FBC8B300F27FFFF8CCC7FBE49584F4AAF80E64AAE431FCA7F",
INIT_39 => x"0000000000000000000000000000000000000000C27F9F6E42EE1F37F16E44AE",
INIT_3a => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3b => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3c => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3d => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3e => x"0000000000000000000000000000000000000000000000000000000000000000",
INIT_3f => x"E2FEEEFEFEFEFAFEF6FEF2FE02FFEEFE00000000000000000000000000000000"
/sys09ads.txt
0,0 → 1,5
NAM SYS09BUG FOR ADS6809
INCLUDE "opt_ads.txt"
INCLUDE "sys09equ.txt"
INCLUDE "sys09bug.txt"
END
/sys09s3e.aux
0,0 → 1,6
t m
l SYS09S3E.S19
t h
s sys09s3e_b16.vhd f800 ffff
q
 
/sys09s3s.txt
0,0 → 1,5
NAM SYS09BUG FOR SPARTAN 3 STARTER
INCLUDE "opt_s3s.txt"
INCLUDE "sys09equ.txt"
INCLUDE "sys09bug.txt"
END
/SYS09SWT.S19
0,0 → 1,60
S123F800F814F861FD25FD1FFD34FD42FC17FBA6FBA2FAB68EFD9F108EDFC0C610A680A7C6
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2
S123F84005118EFDAF1703CF8EDFD04FC60D6D8527038B04195A2AF61704948EFDCF1703AB
S123F860B68EFDD617033B1704BB847F810D27F11F8981202C09865E1704C71F988B4017BC
S123F88004C01704BBC1602F02C0208EFD66E180270F30028CFD9F26F58EFDD81703782086
S123F8A0C0AD9420BC1F343B1703F3292D1F128EFDDE1702ED1F2117042D170483A6A4174F
S123F8C0042D17047B1703E62811810827E1811827DD815E2717810D260F39A7A4A1A42726
S123F8E00817045C863F170459312120C2313F20BE17032A1F328EDFC0301F2005170393E7
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE42705170415275F
S123F9200332623934108EFDDE170276AEE41703B617040AC610A6801703B41704025A26C9
S123F940F51703FAAEE1C610A68081202504817E2302862E1703EB5A26EE20BC17033F299C
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2
S123F9801703BD863F1603BA108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4AED
S123F9A08D061702D016FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A78F
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D397DE0187FE0148E0000300160
S123F9E08C000026F9860FB7E0188D37F6E018C50126F98601B7E01A8D29868CB7E0188D41
S123FA00228EC0002009C5022705B6E01BA780F6E018C50126F0C52C2701398EC000AF4A1B
S123FA201F343BC6045A26FD3986DEB7F02486FFB7F014B7F010B7F015B7F0167DF0108612
S123FA40D8B7F020170096B6F0202BFB8609B7F020170089B6F020850126F9851026CA8EF6
S123FA60C0008D528A10B7F0401F104353FDF0008EFEFFBFF00286FFB7F01086FEB7F014F9
S123FA808601B7F022868CB7F0208D515F34045F7DF0102A0A5A26F835045A26F0208A35B4
S123FAA004B6F020851C270139C6DEF7F0248EC000AF4A1F343B3436A66244444444108ED2
S123FAC0DFD0E6A654545454E7E4E6A65358585858A662840FA762EA62E76235B63404C66B
S123FAE0205A26FD3584BDFD5386111702547FDFE2170226815326F917021F8139273D8152
S123FB003126F11701A83402292617019129213410E6E0EBE0EBE46AE46AE4340417018E43
S123FB203504290C3402EBE06AE42705A78020EB5F3502C1FF27BA863F17020673DFE286D1
S123FB40131601FE6FE217014A3430294DAC6225493001AFE4BDFD5386121701E5ECE4A397
S123FB60622706108300202302C620E7648EFE1F17002FCB031F98170175AE62170168EB6B
S123FB8062EB63EB84A6801701656A6426F5531F9817015BAF62ACE426C386141701A33228
S123FBA065398D02207134108EFDD0170069359016018D1600F81600E51700918DF28DF648
S123FBC02902AF4A398D618DE78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18D8B
S123FBE0D52902AF44398D498DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB011
S123FC008DB12902A741398D5F8DA58DA629048A80A7C43917012BA680810426F7398EFD5B
S123FC20E28DF41F311600BF8EFDEE8DEAAE4820F48EFE008DE1A6431600B48EFDFA8DD7A8
S123FC40AE4420E18EFDF48DCEAE4620D88EFDE88DC5AE4A20CF8EFE068DBCA64120D98EF2
S123FC60FE0B8DB3A64220D08EFE108DAAA6C48EFE171600908EFDDE17FF278DA18DA98D42
S123FC80B08DB88DBF8EFDDE17FF178DC08DC78DCE20D58D09294D1F12862D1700A48D0E52
S123FCA029421F018D08293C3410A76135908D112932484848481F898D0729283404ABE041
S123FCC0398D578130251D813922038030398141251281462203803739816125078166225C
S123FCE0038057391A0239341035028D0235023402444444448D043502840F8B3081392F12
S123FD00028B07203D3402C608A68068E42502862D8D2F8D2B5A26F135827DDFE227068D0A
S123FD2004847F201D3410BEDFE0A684850127F7A60135903402A69FDFE0850135828D007C
S123FD4086203412BEDFE0A684850227FA3502A7013590BEDFE08603A7848611A7846D015F
S123FD6086FFB7DFE23901FBFC02FBF103FC0704FBE610FBB915FBC518FBDB19FBD042F9D2
S123FD805C45F8FD47F8A54CFAE650FB444DF8A852FC7553F8F158F98844F9D555FA29F9E2
S123FDA094F8A7F8A7F8A7F8A7F994FFFFFFFF0D0A000000535953303942554720312E3496
S123FDC020464F5220535754504320202D20044B0D0A000000043E04574841543F04202D6A
S123FDE02004202053503D04202050433D04202055533D04202049593D04202049583D0435
S123FE00202044503D042020413D042020423D04202043433A2004454648494E5A56435370
S105FE203104A7
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB
S9030000FC
/sys09b5x.aux
0,0 → 1,9
t m
l SYS09B5X.S19
t h
s sys09b5x_b4_0.vhd f800 f9ff
s sys09b5x_b4_1.vhd fa00 fbff
s sys09b5x_b4_2.vhd fc00 fdff
s sys09b5x_b4_3.vhd fe00 ffff
q
 
/sys09s3e.lst
0,0 → 1,2774
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 NAM SYS09BUG FOR SPARTAN 3E STARTER
0000 INCLUDE "opt_s3e.txt"
0001 *
0002 ***************************************************
0003 * OPTION SWITCHES
0004 ***************************************************
0005 *
0006 *
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0009 ** FOR LOADING AND SAVING S1 RECORDS
0010 *
0011 00FF S3EOPT EQU $FF SPARTAN3E STARTER
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0017 *
0002 END
0000 INCLUDE "sys09equ.txt"
0001 *
0002 ***************************************************
0003 * MEMORY MAP EQUATES *
0004 ***************************************************
0005 E000 MONIO EQU $E000 I/O SPACE
0006 IFD S3EOPT
0007 7FC0 MONRAM EQU $7FC0
0008 ELSE
0009 MONRAM EQU $DFC0 STACK SPACE
0010 ENDIF S3EOPT
0010 ENDIF S3EOPT
0011 F800 MONROM EQU $F800 START OF ROM
0012 IFD S3SOPT
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0014 EXTCMD EQU $00 EXTENDED OFFSET
0015 ENDIF S3SOPT
0015 ENDIF S3SOPT
0016 IFD XESOPT
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0018 EXTCMD EQU $00 EXTENDED OFFSET
0019 ENDIF XESOPT
0019 ENDIF XESOPT
0020 ***************************************************
0021
0022 IFD S3EOPT
0023 *
0024 * DIGILENT SPARTAN 3E STARTER
0025 *
0026 00FF ACIAOPT EQU $FF ACIA AT PORT 0
0027 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0028 00FF VDUOPT EQU $FF VDU AT $E030
0029 00FF TRAOPT EQU $FF PIA TRACE TIMER
0030 ENDIF S3EOPT
0031 *
0032 IFD S3SOPT
0033 *
0034 * DIGILENT SPARTAN 3 STARTER
0035 *
0036 ACIAOPT EQU $FF ACIA AT PORT 0
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0038 VDUOPT EQU $FF VDU AT $E030
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0041 EXTOPT EQU $FF EXTENDED COMMANDS
0042 ENDIF S3SOPT
0042 ENDIF S3SOPT
0043 *
0044 IFD B5XOPT
0045 *
0046 * BURCHED B5-X300
0047 *
0048 ACIAOPT EQU $FF ACIA AT PORT 0
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0050 VDUOPT EQU $FF VDU AT $E030
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0053 ENDIF B5XOPT
0053 ENDIF B5XOPT
0054 *
0055 IFD XESOPT
0056 *
0057 * XESS XSA-3S1000 & XST-3.0
0058 *
0059 ACIAOPT EQU $FF ACIA AT PORT 0
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0061 VDUOPT EQU $FF VDU AT $E030
0062 IDEOPT EQU $FF XESS IDE AT $E100
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0064 EXTOPT EQU $FF EXTENDED COMMANDS
0065 ENDIF XESOPT
0065 ENDIF XESOPT
0066 *
0067 IFD ADSOPT
0068 *
0069 * ACKERMAN DIGITAL ADS6809
0070 *
0071 DG640OPT EQU $FF DG640 VDU AT $E800
0072 *RTCOPT EQU $FF REAL TIME CLOCK
0073 PRTOPT EQU $FF PRINTER DRIVERS
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0075 ENDIF ADSOPT
0075 ENDIF ADSOPT
0076 *
0077 IFD SWTOPT
0078 *
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER
0080 *
0081 ACIAOPT EQU $FF ACIA AT PORT 0
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0085 ENDIF
0085 ENDIF
0086 *
0087 IFD ACIAOPT
0088 *
0089 ***************************************************
0090 * SERIAL PORT *
0091 ***************************************************
0092 *
0093 ** ACIA SITS ON PORT 0
0094 *
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0096 *
0097 ENDIF ACIAOPT
0098 IFD MFDCOPT
0099 *
0100 ***************************************************
0101 * MINIFLOPPY DRIVE *
0102 ***************************************************
0103 *
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0105 *
0106 DRVFDC EQU MONIO+$14
0107 CMDFDC EQU MONIO+$18
0108 SECFDC EQU MONIO+$1A
0109 DATFDC EQU MONIO+$1B
0110 ENDIF MFDCOPT
0110 ENDIF MFDCOPT
0111 IFD PS2OPT
0112 *
0113 ***************************************************
0114 * VDU8 PS/2 KEYBOARD PORT *
0115 ***************************************************
0116 *
0117 ** KEYBOARD SITS ON PORT 2
0118 *
0119 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0120 ENDIF PS2OPT
0121 IFD VDUOPT
0122 *
0123 ***************************************************
0124 * VDU8 DISPLAY DRIVER EQUATES *
0125 ***************************************************
0126 *
0127 ** VDU8 DISPLAY SITS ON PORT 3
0128 *
0129 E030 VDU EQU MONIO+$30
0130 0000 VDUCHR EQU 0 CHARACTER REGISTER
0131 0001 VDUATT EQU 1 ATTRIBUTE REGISTER
0132 0002 VDUCOL EQU 2 CURSOR COLUMN
0133 0003 VDUROW EQU 3 CURSOR ROW
0134 0004 VDUOFF EQU 4 ROW OFFSET
0135 *
0136 0050 LINLEN EQU 80 LENGTH OF A LINE
0137 0019 NUMLIN EQU 25 NUMBER OF LINES
0138 ENDIF VDUOPT
0139 *
0140 IFD CF8OPT
0141 *
0142 ***************************************************
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER *
0144 ***************************************************
0145 *
0146 ** COMPACT FLASH SITS AT PORT 4
0147 *
0148 CF_BASE EQU MONIO+$40
0149 CF_DATA EQU CF_BASE+0
0150 CF_ERROR EQU CF_BASE+1 ; read error
0151 CF_FEATURE EQU CF_BASE+1 ; write feature
0152 CF_SECCNT EQU CF_BASE+2
0153 CF_SECNUM EQU CF_BASE+3
0154 CF_CYLLO EQU CF_BASE+4
0155 CF_CYLHI EQU CF_BASE+5
0156 CF_HEAD EQU CF_BASE+6
0157 CF_STATUS EQU CF_BASE+7 ; read status
0158 CF_COMAND EQU CF_BASE+7 ; write command
0159 *
0160 * Command Equates
0161 *
0162 CMDREAD EQU $20 ; Read Single sector
0163 CMDWRITE EQU $30 ; Write Single sector
0164 CMDFEATURE EQU $EF
0165 FEAT8BIT EQU $01 ; enable 8 bit transfers
0166 HEADLBA EQU $E0
0167 *
0168 * Status bit equates
0169 *
0170 BUSY EQU $80
0171 DRDY EQU $40
0172 DRQ EQU $08
0173 ERR EQU $01
0174 *
0175 ENDIF CF8OPT
0175 ENDIF CF8OPT
0176 *
0177 IFD IDEOPT
0178 *
0179 ***************************************************
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *
0181 ***************************************************
0182 *
0183 ** COMPACT FLASH SITS AT PORT 4
0184 *
0185 CF_BASE EQU MONIO+$0100
0186 CF_DATA EQU CF_BASE+0
0187 CF_ERROR EQU CF_BASE+2 ; read error
0188 CF_FEATURE EQU CF_BASE+2 ; write feature
0189 CF_SECCNT EQU CF_BASE+4
0190 CF_SECNUM EQU CF_BASE+6
0191 CF_CYLLO EQU CF_BASE+8
0192 CF_CYLHI EQU CF_BASE+10
0193 CF_HEAD EQU CF_BASE+12
0194 CF_STATUS EQU CF_BASE+14 ; read status
0195 CF_COMAND EQU CF_BASE+14 ; write command
0196 CF_AUX EQU CF_BASE+30
0197 *
0198 * Command Equates
0199 *
0200 CMDREAD EQU $20 ; Read Single sector
0201 CMDWRITE EQU $30 ; Write Single sector
0202 AUXRESET EQU $06 ; Reset IDE
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked
0204 HEADLBA EQU $E0
0205 *
0206 * Status bit equates
0207 *
0208 BUSY EQU $80
0209 DRDY EQU $40
0210 DRQ EQU $08
0211 ERR EQU $01
0212 *
0213 ENDIF CF8OPT
0213 ENDIF CF8OPT
0214 *
0215 IFD RTCOPT
0216 *
0217 **************************************************
0218 * MM58167A REAL TIME CLOCK MEMORY MAP:
0219 **************************************************
0220 *
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0222 *
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0224 *
0225 * COUNTER AND COMPARITOR REGISTERS:
0226 *
0227 * Both the Clock Counter and Clock Comparitor
0228 * consist of 8 registers for holding the time.
0229 * The register offsets from the Counter and
0230 * Comparitor registers are listed above.
0231 *
0232 COUNTR EQU CLOCK+0
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0234 *
0235 * CLOCK REGISTER OFFSETS:
0236 * These register offsets are used for the CLOCK
0237 * and comparitor ram CMPRAM.
0238 *
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0241 SECOND EQU 2
0242 MINUIT EQU 3
0243 HOUR EQU 4
0244 WKDAY EQU 5
0245 MTHDAY EQU 6
0246 MONTH EQU 7
0247 *
0248 * INTERRUPT OUTPUT REGISTERS:
0249 *
0250 * An interrupt output may be generated at the
0251 * following rates by setting the appropriate bit
0252 * in the Interrupt Control Register (CINTCR).
0253 * The Interrupt Status Register (CINTSR) must be
0254 * read to clear the interrupt and will return
0255 * the source of the interrupt.
0256 *
0257 * 1/Month Bit 7
0258 * 1/Week Bit 6
0259 * 1/Day Bit 5
0260 * 1/Hour Bit 4
0261 * 1/Minuite Bit 3
0262 * 1/Second Bit 2
0263 * 10/Second Bit 1
0264 * Comparitor Bit 0
0265 *
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0268 *
0269 * COUNTER AND RAM RESETS; GO COMMAND.
0270 *
0271 * The counter and comparitor may be reset
0272 * by writing $FF into CTRRES and CMPRES
0273 * respectivly.
0274 * A write to the Go command register (GOCMND)
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths
0276 * of a second counter.
0277 *
0278 CTRRES EQU CLOCK+18 COUNTER RESET
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0280 GOCMND EQU CLOCK+21 GO COMMAND
0281 *
0282 * CLOCK STATUS REGISTER.
0283 *
0284 * The counter takes 61 usec. to rollover for
0285 * every 1KHz clock pulse. If the Status bit is
0286 * set after reading the counter, the counter
0287 * should be re-read to ensure the time is correct.
0288 *
0289 CLKSTA EQU CLOCK+20 STATUS BIT
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0292 ENDIF RTCOPT
0292 ENDIF RTCOPT
0293 *
0294 IFD TRAOPT
0295 *
0296 **************************************************
0297 * PIA INTERRUPT TIMER
0298 **************************************************
0299 *
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7
0301 *
0302 ** PIA TIMER FOR SINGLE STEP / TRACE
0303 *
0304 * TADATA = Output = Timer preset register
0305 * TACTRL - CA1 = input = rising edge = NMI
0306 * - CA2 = Output = Timer Reset (Active High)
0307 * TBDATA = Input = Timer read back register
0308 * TBCTRL - CB1 = input = rising edge = FIRQ
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0310 *
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0312 * CRA1 = 1 CA1 Rising edge IRQ
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0315 * CRA4 = 1 ] CA2 = Set/Reset output
0316 * CRA5 = 1 ]
0317 * CRA6 = X CA2 Input Interrupt Flag
0318 * CRA7 = X CA1 Interrupt Flag
0319 *
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0321 * CRB1 = 1 CB1 Rising edge IRQ
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0324 * CRB4 = 1 ] CB2 = Set/Reset output
0325 * CRB5 = 1 ]
0326 * CRB6 = X CB2 Input Interrupt Flag
0327 * CRB7 = X CB1 Interrupt Flag
0328 *
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0331 *
0332 E070 TADATA EQU MONIO+$70 Timer preset port
0333 E071 TACTRL EQU MONIO+$71
0334 E072 TBDATA EQU MONIO+$72 Timer read back port
0335 E073 TBCTRL EQU MONIO+$73
0336 *
0337 000D TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0338 *
0339 ENDIF TRAOPT
0340 IFD ADSOPT
0341 *
0342 ***************************************************
0343 * SERIAL PORT FOR DG640 *
0344 ***************************************************
0345 *
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0348 *
0349 ACIAS EQU MONIO+$400 CONTROL PORT
0350 *
0351 ENDIF ADSOPT
0351 ENDIF ADSOPT
0352 IFD PRTOPT
0353 *
0354 ***************************************************
0355 * PRINTER INTERFACE *
0356 ***************************************************
0357 *
0358 PADATA EQU MONIO+$404
0359 PACTRL EQU MONIO+$405
0360 PBDATA EQU MONIO+$406
0361 PBCTRL EQU MONIO+$407
0362 *
0363 ** CB1 ACK. I/P
0364 ** CB2 STB. O/P
0365 ** PB0 - PB7 DATA 1 - 8 O/P
0366 ** PORT A BIT ASSIGNMENT
0367 *
0368 PBUSY EQU $80 I/P
0369 PEMPTY EQU $40 I/P
0370 SELECT EQU $20 I/P
0371 PERROR EQU $10 I/P
0372 PRESET EQU %00000100 O/P PA3 = 0
0373 AUTOFD EQU %00001000 O/P PA2 = 0
0374 DIRMSK EQU %00001100
0375 ENDIF PRTOPT
0375 ENDIF PRTOPT
0376 IFD DG640OPT
0377 *
0378 ***************************************************
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0380 ***************************************************
0381 *
0382 ** VIDEO DISPLAY DEFINITIONS
0383 *
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0385 LINLEN EQU 64 LENGTH OF A LINE
0386 NUMLIN EQU 16 NUMBER OF LINES
0387 SCNLEN EQU $400 LENGTH OF SCREEN
0388 ENDIF DG640OPT
0388 ENDIF DG640OPT
0389 *
0390 IFD DMAFOPT
0391 *
0392 ***************************************************
0393 * DMAF2 8" DRIVE *
0394 ***************************************************
0395 *
0396 ADDREG EQU $F000 ADDRESS REGISTER
0397 CNTREG EQU $F002 COUNT REGISTER
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER
0400 AAAREG EQU $F015 ???
0401 BBBREG EQU $F016 ???
0402 COMREG EQU $F020 1791 COMMAND REGISTER
0403 SECREG EQU $F022 SECTOR REGISTER
0404 DRVREG EQU $F024 DRIVE SELECT LATCH
0405 CCCREG EQU $F040 ???
0406 ENDIF DMAFOPT
0406 ENDIF DMAFOPT
0407 IFD DATOPT
0408 **************************************************
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0410 **************************************************
0411 *
0412 IC11 EQU $FFF0 DAT RAM CHIP
0413 TSTPAT EQU $55AA TEST PATTERN
0414 ENDIF DATOPT
0414 ENDIF DATOPT
0415 *
0003 END
0000 INCLUDE "sys09bug.txt"
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR
0002 OPT l
 
sys09bug.txt page 2
0004 *
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007 *
0008 * ALLEN CLARK WALLACE WATSON
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
0011 * PH. 813-977-0347 PH. 813-985-1359
0012 *
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
0014 * 2561 NANTUCKET DR APT. E
0015 * ATLANTA, GA 30345
0016 * PH. 404-320-1043
0017 *
0018 * MODIFIED TO SYS09BUG VER 1.0
0019 * FOR: SYSTEM09 FPGA SYSTEM
0020 * BY: JOHN KENT
0021 * DATE: 21ST NOVEMBER 2006
0022 * REMOVED: DISK BOOTS
0023 * MEMORY TEST
0024 * ADDED: ADM3A VDU DRIVER
0025 *
0026 * MODIFIED TO SYS09BUG VER 1.1
0027 * FOR: SYSTEM09 FPGA SYSTEM
0028 * BY: JOHN KENT
0029 * DATE: 7TH JANUARY 2007
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0032 * AND REALTIME CLOCK
0033 *
0034 * MODIFIED TO SYS09BUG VER 1.2
0035 * FOR: SYSTEM09 FPGA SYSTEM
0036 * BY: JOHN KENT
0037 * DATE: 21ST MAY 2007
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * Modified to SYS09BUG VER 1.4
0049 * FOR: SYSTEM09 FPGA SYSTEM
0050 * BY: JOHN KENT
0051 * DATE: 3RD FEB 2008
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
0056 *
0057 * *** COMMANDS ***
0058 *
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0063 * CONTROL P = ALTER THE PROGRAM COUNTER
0064 * CONTROL U = ALTER USER STACK POINTER
0065 * CONTROL X = ALTER "X" INDEX REGISTER
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0068 * D = 5.25" MINIFLOPPY BOOT
0069 * E ssss-eeee = EXAMINE MEMORY
0070 * FROM STARTING ADDRESS ssss
0071 * TO ENDING ADDRESS eeee.
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0073 * L = LOAD TAPE
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0076 * R = DISPLAY REGISTER CONTENTS
0077 * S = DISPLAY STACK FROM ssss TO $DFC0
0078 * U = 8" DMAF2 FLOPPY BOOT
0079 * U = USER EXTENSION COMMANDS AT $F000
0080 * X = REMOVE ALL BREAKPOINTS
0081 *
0082 *
0083 ***************************************************
0084 * SYS09BUG VARIABLE SPACE
0085 ***************************************************
0086 *
0087 7FC0 ORG MONRAM
0088 7FC0 STACK EQU * TOP OF INTERNAL STACK
0089 7FC0 NMI RMB 2 USER NMI VECTOR
0090 7FC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0091 7FC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0092 7FC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0093 7FC8 IRQ RMB 2 INTERRUPT VECTOR
0094 7FCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0095 7FCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0096 7FCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0097 IFD DATOPT
0098 LRARAM RMB 16 LRA ADDRESSES
0099 ENDIF DATOPT
0099 ENDIF DATOPT
0100 7FD0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0101 7FD2 ECHO RMB 1 ECHO FLAG
0102 7FD3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0103 IFD TRAOPT
0104 7FEB NMISAV RMB 2 NMI Jump Vector Backup
0105 7FED TRACNT RMB 2 Trace Count
0106 ENDIF TRAOPT
0107 IFD VDUOPT
0108 *
0109 **************************************************
0110 * VDU8 DISPLAY DRIVER VARIABLES *
0111 **************************************************
0112 *
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0114 7FEF COLADX RMB 1 CURSOR COLUMN
0115 7FF0 ROWADX RMB 1 CURSOR ROW
0116 **************************************************
0117 *
0118 7FF1 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0119 7FF2 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0120 ENDIF VDUOPT
0121 IFD DG640OPT
0122 *
0123 ***************************************************
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0125 ***************************************************
0126 *
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0128 COLADX RMB 1 CURSOR COLUMN
0129 ROWADX RMB 1 CURSOR ROW
0130 *************************************************
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0134 ENDIF DG640OPT
0134 ENDIF DG640OPT
0135 *
0136 *
0137 ***************************************************
0138 * START OF ROM *
0139 ***************************************************
0140 *
0141 F800 ORG MONROM
0142 F800 F8 14 FDB MONITOR
0143 F802 F8 4B FDB NEXTCMD
0144 F804 FC 90 FDB INCH
0145 F806 FC 8A FDB INCHE
0146 F808 FC A8 FDB INCHEK
0147 F80A FC BD FDB OUTCH
0148 F80C FB 82 FDB PDATA
0149 F80E FB 11 FDB PCRLF
0150 F810 FB 0D FDB PSTRNG
0151 F812 FE E1 FDB LRA
0152 *
0153 IFD ADSOPT
0154 FDB PCHK CHECK FOR PRINTER INPUT
0155 FDB PINIZ INITIATE PRINTER
0156 FDB POUTCH OUTPUT CH. TO PRINTER
0157 FDB VINIZ
0158 FDB VOUTCH
0159 FDB ACINIZ
0160 FDB AOUTCH
0161 ENDIF ADSOPT
0161 ENDIF ADSOPT
0162 *
0163 * MONITOR
0164 *
0165 * VECTOR ADDRESS STRING IS.....
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0167 *
0168 F814 8E FE 60 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0169 F817 10 8E 7F C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0175 *
0176 * CONTENTS FROM TO FUNCTION
0177 * $F8A1 $FE40 $DFC0 USER-V
0178 * $F8A1 $FE42 $DFC2 SWI3-V
0179 * $F8A1 $FE44 $DFC4 SWI2-V
0180 * $F8A1 $FE46 $DFC6 FIRQ-V
0181 * $F8A1 $FE48 $DFC8 IRQ-V
0182 * $FAB0 $FE4A $DFCA SWI-V
0183 * $FFFF $FE4C $DFCC SVC-VO
0184 * $FFFF $FE4E $DFCE SVC-VL
0185 *
0186 F824 8E E0 00 LDX #ACIAS
0187 F827 BF 7F D0 STX CPORT STORE ADDR. IN RAM
0188 F82A 17 01 45 LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0190 F82F 6F E2 CLRSTK CLR ,-S
0191 F831 5A DECB
0192 F832 26 FB BNE CLRSTK
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0194 F837 AF 6A STX 10,S ON STACK
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0196 F83B A7 E4 STA ,S
0197 F83D 1F 43 TFR S,U
0198 F83F 17 04 8E LBSR IOINIZ INITIALIZE CONTROL PORT
0199 F842 8E FE 70 LDX #MSG1 POINT TO MONITOR MESSAGE
0200 F845 17 03 3A LBSR PDATA PRINT MSG
0201 *
0202 IFD DATOPT
0203 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0204 CLRA START TOTAL AT ZERO
0205 LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0206 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0207 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0208 ADDA #4 ELSE ADD 4K TO TOTAL
0209 DAA ADJ. TOTAL FOR DECIMAL
0210 RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0211 BPL FNDREL PRINT TOTAL OF RAM
0212 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0213 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0214 LBSR PDATA PRINT MSG
0215 ENDIF DATOPT
0215 ENDIF DATOPT
0216 *
0217 IFD TRAOPT
0218 F848 17 01 DE LBSR TRAINZ
0219 ENDIF TRAOPT
0220 *
0221 ***** NEXTCMD *****
0222 *
0223 F84B 8E FE 95 NEXTCMD LDX #MSG3 POINT TO MSG ">"
0224 F84E 17 02 BC LBSR PSTRNG PRINT MSG
0225 F851 17 04 3C LBSR INCH GET ONE CHAR. FROM TERMINAL
0226 F854 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0227 F856 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0228 F858 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0229 F85A 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0230 F85C 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0231 F85E 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0232 F860 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0233 F862 17 04 58 LBSR OUTCH PRINT "^"
0234 F865 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0235 F867 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0236 F869 17 04 51 PRTCMD LBSR OUTCH PRNT CMD CHAR
0237 F86C 17 04 4C LBSR OUT1S PRNT SPACE
0238 F86F C1 60 CMPB #$60
0239 F871 2F 02 BLE NXTCH0
0240 F873 C0 20 SUBB #$20
0241 *
0242 ***** DO TABLE LOOKUP *****
0243 * FOR COMMAND FUNCTIONS
0244 *
0245 F875 8E FE 2A NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0246 F878 E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0247 F87A 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0248 F87C 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0249 F87E 8C FE 60 CMPX #TABEND REACHED END OF TABLE YET ?
0250 F881 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0251 F883 8E FE 97 LDX #MSG4 POINT TO MSG "WHAT?"
0252 F886 17 02 F9 LBSR PDATA PRINT MSG
0253 F889 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0254 F88B AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0255 F88D 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0256 *
0257 * "G" GO OR CONTINUE
0258 *
0259 F88F 1F 34 GO TFR U,S
0260 F891 3B RTI RTI
0261 *
0262 ***** "M" MEMORY EXAMINE AND CHANGE *****
0263 *
0264 F892 17 03 74 MEMCHG LBSR IN1ADR INPUT ADDRESS
0265 F895 29 2D BVS CHRTN IF NOT HEX, RETURN
0266 F897 1F 12 TFR X,Y SAVE ADDR IN "Y"
0267 F899 8E FE 9D MEMC2 LDX #MSG5 POINT TO MSG " - "
0268 F89C 17 02 6E LBSR PSTRNG PRINT MSG
0269 F89F 1F 21 TFR Y,X FETCH ADDRESS
0270 F8A1 17 03 AE LBSR OUT4H PRINT ADDR IN HEX
0271 F8A4 17 04 14 LBSR OUT1S OUTPUT SPACE
0272 F8A7 A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0273 F8A9 17 03 AE LBSR OUT2H OUTPUT CONTENTS IN ASCII
0274 F8AC 17 04 0C LBSR OUT1S OUTPUT SPACE
0275 F8AF 17 03 67 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0276 F8B2 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0277 F8B4 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0278 F8B6 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0279 F8B8 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0280 F8BA 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0281 F8BC 81 5E CMPA #'^ IS IT AN UP ARROW?
0282 F8BE 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0283 F8C0 81 0D CMPA #$D IS IT A CR?
0284 F8C2 26 0F BNE FORWRD DISPLAY NEXT BYTE
0285 F8C4 39 CHRTN RTS EXIT ROUTINE
0286 *
0287 *
0288 F8C5 A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0289 F8C7 A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0290 F8C9 27 08 BEQ FORWRD $F972
0291 F8CB 17 03 ED LBSR OUT1S OUTPUT SPACE
0292 F8CE 86 3F LDA #'? LOAD QUESTION MARK
0293 F8D0 17 03 EA LBSR OUTCH PRINT IT
0294 F8D3 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0295 F8D5 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0296 F8D7 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0297 F8D9 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0298 *
0299 * "S" DISPLAY STACK
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0302 *
0303 F8DB 17 02 AB DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0304 F8DE 1F 32 TFR U,Y
0305 F8E0 8E 7F C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0306 F8E3 30 1F LEAX -1,X POINT TO CURRENT STACK
0307 F8E5 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0308 *
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0311 * UPPER ADDRESS IN X-REG.
0312 * IF HEX ADDRESSES ARE INVALID (V)=1.
0313 *
0314 F8E7 17 03 14 MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0315 F8EA 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0316 F8EC 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0317 F8EE AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0318 F8F0 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0319 F8F2 39 EDPRTN RTS ;
0320 *
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0322 * TO EVEN 16 BYTE BOUNDRIES.
0323 *
0324 * IF LOWER ADDR = $4532
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0326 *
0327 * IF UPPER ADDR = $4567
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0329 *
0330 * ENTER WITH LOWER ADDRESS IN X-REG.
0331 * -UPPER ADDRESS ON TOP OF STACK.
0332 *
0333 F8F3 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0334 F8F5 C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0335 F8F8 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0336 F8FA 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0337 F8FC 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0338 F8FE C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0339 F900 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0340 F902 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0341 F904 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0342 F906 17 03 9F LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0343 F909 27 03 BEQ EDUMP
0344 F90B 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0345 F90D 39 RTS ;
0346 *
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0349 *
0350 F90E 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0351 F910 8E FE 9D LDX #MSG5 POINT TO MSG " - "
0352 F913 17 01 F7 LBSR PSTRNG PRINT MSG
0353 F916 AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0354 F918 17 03 37 LBSR OUT4H PRINT THE ADDRESS
0355 F91B 17 03 9B LBSR OUT2S 2 SPACES
0356 F91E C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0357 F920 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0358 F922 17 03 35 LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0359 F925 17 03 93 LBSR OUT1S OUTPUT SPACE
0360 F928 5A DECB $F9D1 DECREMENT BYTE COUNT
0361 F929 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0362 *
0363 * PRINT 16 ASCII CHARACTERS
0364 * IF NOT PRINTABLE OR NOT VALID
0365 * ASCII PRINT A PERIOD (.)
0366 F92B 17 03 8B LBSR OUT2S 2 SPACES
0367 F92E AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0368 F930 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0369 F932 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0370 F934 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0371 F936 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0372 F938 81 7E CMPA #$7E IS IT VALID ASCII?
0373 F93A 23 02 BLS PRASC IF SO PRINT IT
0374 F93C 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0375 F93E 17 03 7C PRASC LBSR OUTCH PRINT ASCII CHARACTER
0376 F941 5A DECB DECREMENT COUNT
0377 F942 26 EE BNE EDPASC
0378 F944 20 BC BRA NXTLIN
0379 *
0380 ***** "B" SET BREAKPOINT *****
0381 *
0382 F946 17 02 C0 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0383 F949 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0384 F94B 8C 7F C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0385 F94E 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0386 F950 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0387 F952 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0388 F955 8D 5B BSR BPTEST TEST BP TABLE FOR FREE SPACE
0389 F957 35 10 PULS X POP BP ADDRESS FROM STACK
0390 F959 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0391 F95B A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0392 F95D 81 3F CMPA #$3F IS IT A SWI?
0393 F95F 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0394 F961 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0395 F963 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0396 F965 86 3F LDA #$3F LOAD A SWI ($3F)
0397 F967 A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0398 F969 39 EXITBP RTS ;
0399 *
0400 * INDICATE ERROR SETTING BREAKPOINT
0401 *
0402 F96A 17 03 4E BPERR LBSR OUT1S OUTPUT SPACE
0403 F96D 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0404 F96F 16 03 4B LBRA OUTCH PRINT "?"
0405 *
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0407 *
0408 F972 10 8E 7F D3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0409 F976 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0410 F978 8D 1E XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0411 F97A 5A DECB $FAAC DECREMENT BP COUNTER
0412 F97B 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0413 F97D 39 RTS
0414 *
0415 ***** SWI ENTRY POINT *****
0416 *
0417 F97E 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0418 F980 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0419 F982 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0420 F984 8D 2C BSR BPTEST FIND BREAKPOINT IN BP TABLE
0421 F986 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0422 F988 AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0423 F98A 8D 0C BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0424 F98C 17 02 51 REGPR LBSR REGSTR GO PRINT REGISTERS
0425 *
0426 IFD TRAOPT
0427 F98F 8E 00 00 LDX #0
0428 F992 BF 7F ED STX TRACNT
0429 ENDIF TRAOPT
0430 *
0431 F995 16 FE B3 LBRA NEXTCMD GET NEXT COMMAND
0432 *
0433 F998 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0434 F99A 8C 7F C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0435 F99D 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0436 F99F A6 84 LDA ,X GET DATA FROM BP ADDRESS
0437 F9A1 81 3F CMPA #$3F IS IT SWI?
0438 F9A3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0439 F9A5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0440 F9A7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0441 F9A9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0442 F9AB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0443 F9AD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0444 F9AF A7 A0 STA ,Y+
0445 F9B1 39 RTS
0446 *
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0448 *
0449 F9B2 10 8E 7F D3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0450 F9B6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0451 F9B8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0452 F9BA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0453 F9BC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0454 F9BE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0455 F9BF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0456 F9C1 39 RTS ;
0457 *
0458 *
0459 F9C2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0460 F9C4 39 RTS
0461 *
0462 IFD TRAOPT
0463 *
0464 ** TRACE from address AAAA BB bytes
0465 *
0466 F9C5 17 01 5F TRACE LBSR ALTPC1 SET UP NEW PC
0467 F9C8 29 1C BVS TREXIT ADDRESS ERROR, EXIT
0468 F9CA 17 02 EE LBSR OUT1S
0469 F9CD 17 02 39 LBSR IN1ADR Fetch Byte Count
0470 F9D0 29 14 BVS TREXIT Byte Count error, EXIT
0471 F9D2 BF 7F ED STX TRACNT
0472 *
0473 F9D5 BE 7F C0 LDX NMI Save NMI Vector
0474 F9D8 BF 7F EB STX NMISAV
0475 F9DB 8E F9 E7 LDX #NMIE Set up NMI for Tracing
0476 F9DE BF 7F C0 STX NMI
0477 F9E1 17 00 45 LBSR TRAINZ Initialise Hardware
0478 F9E4 20 20 BRA TRACEG Start Trace
0479 F9E6 39 TREXIT RTS
0480 *
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0482 * CRA1 = 1 CA1 Rising edge IRQ
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0485 * CRA4 = 1 ] CA2 = Set/Reset output
0486 * CRA5 = 1 ]
0487 * CRA6 = X CA2 Input Interrupt Flag
0488 * CRA7 = X CA1 Interrupt Flag
0489 *
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0491 * CRB1 = 1 CB1 Rising edge IRQ
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0494 * CRB4 = 1 ] CB2 = Set/Reset output
0495 * CRB5 = 1 ]
0496 * CRB6 = X CB2 Input Interrupt Flag
0497 * CRB7 = X CB1 Interrupt Flag
0498 *
0499 *
0500 ** TRACE NMI ENTRY POINT
0501 *
0502 F9E7 1F 43 NMIE TFR S,U
0503 F9E9 86 36 LDA #$36 Disable Interrupt, CA2 Low
0504 F9EB B7 E0 71 STA TACTRL
0505 F9EE B6 E0 70 LDA TADATA Clear Interrupt flag by reading data port
0506 *
0507 F9F1 17 01 EC LBSR REGSTR DUMP REGISTERS
0508 *
0509 F9F4 AE 4A LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0510 F9F6 A6 84 LDA ,X
0511 F9F8 81 3F CMPA #$3F
0512 F9FA 27 24 BEQ TRACEX EXIT ON SWI
0513 *
0514 F9FC BE 7F ED LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0515 F9FF 27 1F BEQ TRACEX YES, GO BACK TO THE MONITOR
0516 FA01 30 1F LEAX -1,X DECREMENT TRACE COUNT
0517 FA03 BF 7F ED STX TRACNT
0518 *
0519 ** TRACE GO (RESUME SINGLE STEP)
0520 *
0521 FA06 1F 34 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0522 FA08 86 0D LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0523 FA0A B7 E0 70 STA TADATA
0524 FA0D 86 36 LDA #$36 LOAD STROBE LOW
0525 FA0F B7 E0 71 STA TACTRL
0526 FA12 B6 E0 70 LDA TADATA CLEAR INTERRUPT
0527 FA15 86 36 LDA #$36 RELEASE RESET
0528 FA17 B7 E0 73 STA TBCTRL
0529 FA1A 86 3F LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0530 FA1C B7 E0 71 STA TACTRL
0531 FA1F 3B RTI GO EXECUTE INSTRUCTION
0532 *
0533 FA20 BE 7F EB TRACEX LDX NMISAV Restore NMI vector
0534 FA23 BF 7F C0 STX NMI
0535 FA26 16 FE 22 LBRA NEXTCMD Jump back to the command loop.
0536 *
0537 ** TRACE HARDWARE INITIALISATION
0538 *
0539 FA29 86 32 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0540 FA2B B7 E0 71 STA TACTRL
0541 FA2E 86 3A LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0542 FA30 B7 E0 73 STA TBCTRL
0543 FA33 86 FF LDA #$FF PORTA = OUTPUT
0544 FA35 B7 E0 70 STA TADATA
0545 FA38 86 00 LDA #$00 PORTB = INPUT
0546 FA3A B7 E0 72 STA TBDATA
0547 FA3D 86 36 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0548 FA3F B7 E0 71 STA TACTRL
0549 FA42 86 3E LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0550 FA44 B7 E0 73 STA TBCTRL
0551 FA47 39 RTS
0552 *
0553 ENDIF TRAOPT
0554 IFD MFDCOPT
0555 *
0556 ** "U" MINI DISK BOOT
0557 *
0558 MINBOOT TST CMDFDC
0559 CLR DRVFDC
0560 LDX #$0000
0561 LOOP LEAX $01,X
0562 CMPX #$0000
0563 BNE LOOP
0564 LDA #$0F
0565 STA CMDFDC
0566 BSR DELAY
0567 LOOP1 LDB CMDFDC
0568 BITB #$01
0569 BNE LOOP1
0570 LDA #$01
0571 STA SECFDC
0572 BSR DELAY
0573 LDA #$8C
0574 STA CMDFDC
0575 BSR DELAY
0576 LDX #$C000
0577 BRA LOOP3
0578 LOOP2 BITB #$02
0579 BEQ LOOP3
0580 LDA DATFDC
0581 STA ,X+
0582 LOOP3 LDB CMDFDC
0583 BITB #$01
0584 BNE LOOP2
0585 BITB #$2C
0586 BEQ LOOP4
0587 RTS
0588 *
0589 LOOP4 LDX #$C000
0590 STX $0A,U
0591 TFR U,S
0592 RTI
0593 *
0594 DELAY LDB #$04
0595 LOOP5 DECB
0596 BNE LOOP5
0597 RTS
0598 ENDIF MFDCOPT
0598 ENDIF MFDCOPT
0599 *
0600 IFD DMAFOPT
0601 *
0602 *** "D" DISK BOOT FOR DMAF2 ***
0603 *
0604 DBOOT LDA #$DE
0605 STA DRVREG
0606 LDA #$FF
0607 STA PRIREG $FAF8
0608 STA CCREG
0609 STA AAAREG
0610 STA BBBREG
0611 TST CCREG
0612 LDA #$D8
0613 STA COMREG
0614 LBSR DLY
0615 DBOOT0 LDA COMREG
0616 BMI DBOOT0
0617 LDA #$09
0618 STA COMREG
0619 LBSR DLY
0620 *
0621 DISKWT LDA COMREG FETCH DRIVE STATUS
0622 BITA #1 TEST BUSY BIT
0623 BNE DISKWT LOOP UNTIL NOT BUSY
0624 *
0625 BITA #$10
0626 BNE DBOOT
0627 *
0628 LDX #$C000 LOGICAL ADDR. = $C000
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0630 ORA #$10
0631 STA CCCREG
0632 TFR X,D
0633 COMA ;
0634 COMB ;
0635 STD ADDREG
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100
0637 STX CNTREG STORE IN COUNT REGISTER
0638 LDA #$FF LOAD THE CHANNEL REGISTER
0639 STA CCREG
0640 LDA #$FE SET CHANNEL 0
0641 STA PRIREG
0642 LDA #1 SET SECTOR TO "1"
0643 STA SECREG ISSUE COMMAND
0644 LDA #$8C SET SINGLE SECTOR READ
0645 STA COMREG ISSUE COMMAND
0646 BSR DLY
0647 *
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0652 * IS STILL A ONE THE BOOT OPERATION WILL
0653 * BE STARTED OVER FROM THE BEGINING.
0654 *
0655 CLRB ;
0656 DBOOT1 PSHS B $FB55
0657 CLRB ;
0658 DBOOT2 TST CCREG
0659 BPL DBOOT3
0660 DECB ;
0661 BNE DBOOT2
0662 PULS B
0663 DECB
0664 BNE DBOOT1
0665 BRA DBOOT
0666 DBOOT3 PULS B
0667 LDA COMREG
0668 BITA #$1C
0669 BEQ DBOOT4
0670 RTS ;
0671 *
0672 *
0673 DBOOT4 LDB #$DE
0674 STB DRVREG
0675 LDX #$C000
0676 STX 10,U
0677 TFR U,S $FB7B
0678 RTI ;
0679 ENDIF DMAFOPT
0679 ENDIF DMAFOPT
0680 *
0681 IFD CF8OPT
0682 *
0683 * COMPACT FLASH BOOT
0684 *
0685 CFBOOT BSR WAITRDY
0686 LDA #HEADLBA
0687 STA CF_HEAD
0688 BSR WAITRDY
0689 LDA #FEAT8BIT
0690 STA CF_FEATURE
0691 LDA #CMDFEATURE
0692 STA CF_COMAND
0693 BSR WAITRDY
0694 *
0695 * READ SECTORS FROM CF
0696 *
0697 CFREAD LDA #$01
0698 STA CF_SECCNT
0699 CLRA
0700 STA CF_SECNUM
0701 STA CF_CYLLO
0702 STA CF_CYLHI
0703 *
0704 LDA #CMDREAD ; IDE READ MULTIPLE
0705 STA CF_COMAND
0706 BSR WAITRDY
0707 LDX #$C000
0708 *
0709 * READ LOOP
0710 *
0711 RDLOOP BSR WAITDRQ
0712 LDA CF_DATA
0713 STA ,X+
0714 CMPX #$C200
0715 BNE RDLOOP
0716 *
0717 LDX #$C000
0718 STX $0A,U
0719 TFR U,S
0720 RTI
0721 *
0722 * WAIT UNTIL READY
0723 *
0724 WAITRDY LDA CF_STATUS
0725 BITA #BUSY
0726 BNE WAITRDY
0727 LDA CF_STATUS
0728 BITA #DRDY
0729 BEQ WAITRDY
0730 RTS
0731 *
0732 * WAIT FOR DATA REQUEST
0733 *
0734 WAITDRQ LDA CF_STATUS
0735 BITA #DRQ
0736 BEQ WAITDRQ
0737 RTS
0738 ENDIF CF8OPT
0738 ENDIF CF8OPT
0739 *
0740 IFD IDEOPT
0741 *
0742 * XESS 16 BIT IDE BOOT
0743 *
0744 IDEBOOT LDD #AUXRESET
0745 STD CF_AUX
0746 LDD #AUXRSTREL
0747 STD CF_AUX
0748 LDD #HEADLBA
0749 STD CF_HEAD
0750 BSR WAITRDY
0751 *
0752 * READ SECTORS FROM CF
0753 *
0754 LDD #$01
0755 STD CF_SECCNT
0756 CLRB
0757 STD CF_SECNUM
0758 STD CF_CYLLO
0759 STD CF_CYLHI
0760 *
0761 LDB #CMDREAD ; IDE READ MULTIPLE
0762 STD CF_COMAND
0763 BSR WAITRDY
0764 LDX #$C000
0765 *
0766 * READ LOOP
0767 *
0768 RDLOOP BSR WAITDRQ
0769 LDD CF_DATA
0770 STB ,X+
0771 CMPX #$C100
0772 BNE RDLOOP
0773 *
0774 LDX #$C000
0775 STX $0A,U
0776 TFR U,S
0777 RTI
0778 *
0779 * WAIT UNTIL READY
0780 *
0781 WAITRDY LDD CF_STATUS
0782 BITB #BUSY
0783 BNE WAITRDY
0784 LDD CF_STATUS
0785 BITB #DRDY
0786 BEQ WAITRDY
0787 RTS
0788 *
0789 * WAIT FOR DATA REQUEST
0790 *
0791 WAITDRQ LDD CF_STATUS
0792 BITB #DRQ
0793 BEQ WAITDRQ
0794 RTS
0795 ENDIF IDEOPT
0795 ENDIF IDEOPT
0796 *
0797 IFD RTCOPT
0798 *
0799 * CLOCK INTER FACE UTILITY
0800 *
0801 * TIME <Hours> <Minuits> <Seconds>
0802 * If no argument is specified, the current time
0803 * will be displayed.
0804 *
0805 * READ A REGISTER FROM THE COUNTER.
0806 * The X Index rgister points to the register
0807 * to be read. The Status Register is checked
0808 * before and after the register is read before
0809 * returning a value in accumulator A
0810 *
0811 RDCLK TST CLKSTA
0812 BNE RDCLK
0813 RDCLK1 LDA 0,X
0814 TST CLKSTA
0815 BNE RDCLK1
0816 RTS
0817 *
0818 * MAIN PROGRAM:
0819 *
0820 TIMSET LDX #COUNTR POINT TO TIMER
0821 LBSR BYTE READ HOURS
0822 BVS SHOWTM NO ARG, DISP TIME
0823 STA HOUR,X
0824 LBSR OUT1S
0825 LBSR BYTE READ MINUITES
0826 BVS SHOWTM
0827 STA MINUIT,X
0828 LBSR OUT1S
0829 LBSR BYTE SECONDS.
0830 BVS SHOWTM
0831 STA SECOND,X
0832 *
0833 * DISPLAY CURRENT TIME
0834 *
0835 SHOWTM LBSR PCRLF
0836 LDX #COUNTR+HOUR
0837 LDB #3
0838 SHOWLP BSR RDCLK
0839 LBSR OUT2H
0840 LDA #':
0841 LBSR OUTCH
0842 LEAX -1,X
0843 DECB
0844 BNE SHOWLP
0845 RTS
0846 *
0847 * INITIATE CLOCK.
0848 * MASK INTERRUPTS.
0849 *
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
0851 TST CINTSR CLEAR ANY INTERRUPTS
0852 RTS
0853 ENDIF RTCOPT
0853 ENDIF RTCOPT
0854 IFD DATOPT
0855 *
0856 ***** LRA LOAD REAL ADDRESS *****
0857 *
0858 * THE FOLLOWING CODE LOADS THE 20-BIT
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE
0860 * INTO THE "A" AND "X" REGISTERS. THIS
0861 * ROUTINE IS ENTERED WITH THE LOGICAL
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0863 * REGISTER. EXIT IS MADE WITH THE HIGH-
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0865 * ADDRESS IN THE "A" REGISTER, AND THE
0866 * LOW-ORDER 16-BITS OF THE 20-BIT
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0868 * ALL OTHER REGISTERS ARE PRESERVED.
0869 * THIS ROUTINE IS REQUIRED SINCE THE
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0871 * PRESENT PHYSICAL ADDRESSES ON THE
0872 * SYSTEM BUS.
0873 *
0874 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
0875 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
0876 LSRA ;
0877 LSRA ADJ FOR INDEXED INTO
0878 LSRA CORRESPONDING LOCATION
0879 LSRA IN LRA TABLE
0880 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
0881 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
0882 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
0883 LSRB PHYSICAL ADDRESS.
0884 LSRB EXTENDED MS 4-BITS ARE RETURNED
0885 LSRB IN THE "A" ACCUMULATOR
0886 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
0887 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
0888 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0889 ASLB ADJ DATA FOR RELOCATION IN X REG
0890 ASLB ;
0891 ASLB $FB97
0892 ASLB ;
0893 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
0894 ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
0895 STA 2,S SAVE IT IN X REG ON STACK
0896 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
0897 *
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0899 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
0900 * ON STACK
0901 PULS A,B,X,Y,PC POP REGS. FROM STACK
0902 ENDIF DATOPT
0902 ENDIF DATOPT
0903 *
0904 * DELAY LOOP
0905 *
0906 FA48 34 04 DLY PSHS B SAVE CONTENTS OF "B"
0907 FA4A C6 20 LDB #$20 GET LOOP DELAY VALUE
0908 FA4C 5A SUB1 DECB SUBTRACT ONE FROM VALUE
0909 FA4D 26 FD BNE SUB1 LOOP UNTIL ZERO
0910 FA4F 35 84 PULS B,PC RESTORE CONTENTS OF "B"
0911 * RTS ;
0912 *
0913 ***** "L" LOAD MIKBUG TAPE *****
0914 *
0915 FA51 BD FC D2 LOAD JSR ACINIZ
0916 FA54 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
0917 FA56 17 02 64 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
0918 FA59 7F 7F D2 CLR ECHO TURN OFF ECHO FLAG
0919 FA5C 17 02 26 LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
0920 FA5F 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
0921 FA61 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
0922 FA63 17 02 1F LBSR ECHON
0923 FA66 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
0924 FA68 27 3D BEQ LOAD21 IF SO, EXIT LOAD
0925 FA6A 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
0926 FA6C 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
0927 FA6E 17 01 A8 LBSR BYTE INPUT BYTE COUNT
0928 FA71 34 02 PSHS A PUSH COUNT ON STACK
0929 FA73 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
0930 FA75 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
0931 FA78 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
0932 FA7A 34 10 PSHS X PUSH ADDR ON STACK
0933 FA7C E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
0934 FA7E EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
0935 FA80 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
0936 FA82 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
0937 FA84 6A E4 DEC ,S ADDRESS BYTES.
0938 FA86 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
0939 FA88 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
0940 FA8B 35 04 PULS B POP CHECKSUM FROM STACK
0941 FA8D 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
0942 FA8F 34 02 PSHS A PUSH DATA BYTE ON STACK
0943 FA91 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
0944 FA93 6A E4 DEC ,S DECREMENT BYTE COUNT 1
0945 FA95 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
0946 FA97 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
0947 FA99 20 EB BRA LOAD10 GET NEXT DATA BYTE
0948 FA9B 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
0949 FA9C 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
0950 FA9E C1 FF CMPB #$FF CHECKSUM OK?
0951 FAA0 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
0952 FAA2 86 3F LDA #'? LOAD (?) ERROR INDICATOR
0953 FAA4 17 02 16 LBSR OUTCH OUTPUT IT TO TERMINAL
0954 FAA7 73 7F D2 LOAD21 COM ECHO TURN ECHO ON
0955 FAAA 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
0956 FAAC 16 02 0E LBRA OUTCH OUTPUT IT
0957 *
0958 ***** "P" PUNCH MIKBUG TAPE *****
0959 *
0960 FAAF 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
0961 FAB1 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
0962 FAB4 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
0963 FAB6 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
0964 FAB8 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
0965 FABA 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
0966 FABC 30 01 LEAX 1,X INCREMENT END ADDRESS
0967 FABE AF E4 STX ,S STORE END ADDR ON STACK
0968 FAC0 BD FC D2 JSR ACINIZ
0969 FAC3 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
0970 FAC5 17 01 F5 LBSR OUTCH OUTPUT IT TO TERMINAL
0971 FAC8 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
0972 FACA A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
0973 FACC 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
0974 FACE 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
0975 FAD2 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
0976 FAD4 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
0977 FAD6 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
0978 FAD8 8E FE DE LDX #MSG20 POINT TO MSG "S1"
0979 FADB 17 00 2F LBSR PSTRNG PRINT MSG
0980 FADE CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
0981 FAE0 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
0982 FAE2 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
0983 FAE5 AE 62 LDX 2,S LOAD BEGIN ADDRESS
0984 FAE7 17 01 68 LBSR OUT4H PUNCH ADDRESS
0985 FAEA EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
0986 FAEC EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
0987 FAEE EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
0988 FAF0 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
0989 FAF2 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
0990 FAF5 6A 64 DEC 4,S DECREMENT BYTE COUNT
0991 FAF7 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
0992 FAF9 53 COMB 1's COMPLIMENT CHECKSUM BYTE
0993 FAFA 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
0994 FAFC 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
0995 FAFF AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
0996 FB01 AC E4 CMPX ,S COMPARE IT TO END ADDR
0997 FB03 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
0998 FB05 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
0999 FB07 17 01 B3 LBSR OUTCH OUTPUT IT
1000 FB0A 32 65 LEAS 5,S READJUST STACK POINTER
1001 FB0C 39 RTS ;
1002 *
1003 * PRINT STRING PRECEEDED BY A CR & LF.
1004 *
1005 FB0D 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1006 FB0F 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1007 *
1008 * PCRLF
1009 *
1010 FB11 34 10 PCRLF PSHS X SAVE IX
1011 FB13 8E FE 8F LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1012 FB16 17 00 69 LBSR PDATA PRINT MSG
1013 FB19 35 90 PULS X,PC RESTORE IX & RETURN
1014 *
1015 * LONG BRANCHES TO COMMON ROUTINES
1016 *
1017 FB1B 16 01 9D JOUT1S LBRA OUT1S
1018 FB1E 16 00 F8 JBYTE LBRA BYTE
1019 FB21 16 00 E5 JIN1ADR LBRA IN1ADR
1020 *
1021 * ALTER "PC" PROGRAM COUNTER
1022 *
1023 FB24 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1024 FB27 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1025 FB29 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1026 FB2B 29 02 BVS ALTPCD EXIT IF INVALID HEX
1027 FB2D AF 4A STX 10,U POKE IN NEW CONTENTS
1028 FB2F 39 ALTPCD RTS ;
1029 *
1030 * ALTER "U" USER STACK POINTER
1031 *
1032 FB30 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1033 FB32 8D E7 BSR JOUT1S OUTPUT SPACE
1034 FB34 8D EB BSR JIN1ADR
1035 FB36 29 02 BVS ALTUD
1036 FB38 AF 48 STX 8,U
1037 FB3A 39 ALTUD RTS ;
1038 *
1039 * ALTER "Y" INDEX REGISTER
1040 *
1041 FB3B 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1042 FB3D 8D DC BSR JOUT1S OUTPUT SPACE
1043 FB3F 8D E0 BSR JIN1ADR
1044 FB41 29 02 BVS ALTYD
1045 FB43 AF 46 STX 6,U $F8F0
1046 FB45 39 ALTYD RTS ;
1047 *
1048 * ALTER "X" INDEX REGISTER
1049 *
1050 FB46 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1051 FB48 8D D1 BSR JOUT1S OUTPUT SPACE
1052 FB4A 8D D5 BSR JIN1ADR
1053 FB4C 29 02 BVS ALTXD
1054 FB4E AF 44 STX 4,U
1055 FB50 39 ALTXD RTS ;
1056 *
1057 * ALTER "DP" DIRECT PAGE REGISTER
1058 *
1059 FB51 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1060 FB53 8D C6 BSR JOUT1S OUTPUT SPACE
1061 FB55 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1062 FB57 29 02 BVS ALTDPD
1063 FB59 A7 43 STA 3,U
1064 FB5B 39 ALTDPD RTS ;
1065 *
1066 * ALTER "B" ACCUMULATOR
1067 *
1068 FB5C 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1069 FB5E 8D BB BSR JOUT1S OUTPUT SPACE
1070 FB60 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1071 FB62 29 02 BVS ALTBD
1072 FB64 A7 42 STA 2,U
1073 FB66 39 ALTBD RTS $F91C
1074 *
1075 * ALTER "A" ACCUMULATOR
1076 *
1077 FB67 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1078 FB69 8D B0 BSR JOUT1S OUTPUT SPACE
1079 FB6B 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1080 FB6D 29 02 BVS ALTAD
1081 FB6F A7 41 STA 1,U
1082 FB71 39 ALTAD RTS ;
1083 *
1084 * ALTER "CC" REGISTER
1085 *
1086 FB72 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1087 FB74 8D A5 BSR JOUT1S OUTPUT SPACE
1088 FB76 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1089 FB78 29 04 BVS ALTCCD
1090 FB7A 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1091 FB7C A7 C4 STA ,U
1092 FB7E 39 ALTCCD RTS ;
1093 *
1094 * PDATA
1095 *
1096 FB7F 17 01 3B PRINT LBSR OUTCH
1097 FB82 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1098 FB84 81 04 CMPA #4 IS IT EOT?
1099 FB86 26 F7 BNE PRINT IF NOT EOT PRINT IT
1100 FB88 39 RTS ;
1101 *
1102 * PRINT REGISTERS
1103 *
1104 FB89 8E FE A1 PRTSP LDX #MSG10 POINT TO MSG "SP="
1105 FB8C 8D F4 BSR PDATA PRINT MSG
1106 FB8E 1F 31 TFR U,X
1107 FB90 16 00 BF JOUT4H LBRA OUT4H
1108 *
1109 FB93 8E FE AD PRTUS LDX #MSG12 POINT TO MSG "US="
1110 FB96 8D EA BSR PDATA PRINT MSG
1111 FB98 AE 48 LDX 8,U
1112 FB9A 20 F4 BRA JOUT4H
1113 *
1114 FB9C 8E FE BF PRTDP LDX #MSG15 POINT TO MSG "DP="
1115 FB9F 8D E1 BSR PDATA PRINT MSG
1116 FBA1 A6 43 LDA 3,U
1117 FBA3 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1118 *
1119 FBA6 8E FE B9 PRTIX LDX #MSG14 POINT TO MSG "IX="
1120 FBA9 8D D7 BSR PDATA PRINT MSG
1121 FBAB AE 44 LDX 4,U $FCE6
1122 FBAD 20 E1 BRA JOUT4H
1123 *
1124 FBAF 8E FE B3 PRTIY LDX #MSG13 POINT TO MSG "IY="
1125 FBB2 8D CE BSR PDATA PRINT MSG
1126 FBB4 AE 46 LDX 6,U
1127 FBB6 20 D8 BRA JOUT4H
1128 *
1129 FBB8 8E FE A7 PRTPC LDX #MSG11 POINT TO MSG "PC="
1130 FBBB 8D C5 BSR PDATA PRINT MSG
1131 FBBD AE 4A LDX 10,U
1132 FBBF 20 CF BRA JOUT4H
1133 *
1134 FBC1 8E FE C5 PRTA LDX #MSG16 POINT TO MSG "A="
1135 FBC4 8D BC BSR PDATA PRINT MSG
1136 FBC6 A6 41 LDA 1,U
1137 FBC8 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1138 *
1139 FBCA 8E FE CA PRTB LDX #MSG17 POINT TO MSG "B="
1140 FBCD 8D B3 BSR PDATA PRINT MSG
1141 FBCF A6 42 LDA 2,U
1142 FBD1 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1143 *
1144 FBD3 8E FE CF PRTCC LDX #MSG18 POINT TO MSG "CC:"
1145 FBD6 8D AA BSR PDATA PRINT MSG
1146 FBD8 A6 C4 LDA ,U
1147 FBDA 8E FE D6 LDX #MSG19 POINT TO MSG "EFHINZVC"
1148 FBDD 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1149 *
1150 * "R" DISPLAY REGISTERS
1151 *
1152 FBE0 8E FE 9D REGSTR LDX #MSG5 POINT TO MSG " - "
1153 FBE3 17 FF 27 LBSR PSTRNG PRINT MSG
1154 FBE6 8D A1 BSR PRTSP $FCBF
1155 FBE8 8D A9 BSR PRTUS $FCCA
1156 FBEA 8D B0 BSR PRTDP $FCD5
1157 FBEC 8D B8 BSR PRTIX $FCE0
1158 FBEE 8D BF BSR PRTIY $FCEB
1159 FBF0 8E FE 9D LDX #MSG5 POINT TO MSG " - "
1160 FBF3 17 FF 17 LBSR PSTRNG PRINT MSG
1161 FBF6 8D C0 BSR PRTPC $FCF5
1162 FBF8 8D C7 BSR PRTA $FCFF
1163 FBFA 8D CE BSR PRTB $FD09
1164 FBFC 20 D5 BRA PRTCC $FD13
1165 *
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1171 * ADDRESS IS INPUT.
1172 *
1173 FBFE 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1174 FC00 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1175 FC02 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1176 FC04 86 2D LDA #'-
1177 FC06 17 00 B4 LBSR OUTCH PRINT " - "
1178 *
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1182 *
1183 FC09 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1184 FC0B 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1185 FC0D 1F 01 TFR D,X
1186 FC0F 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1187 FC11 29 3C BVS NOTHEX
1188 FC13 34 10 PSHS X
1189 FC15 A7 61 STA 1,S
1190 FC17 35 90 PULS X,PC
1191 *
1192 ***** INPUT BYTE (2 HEX CHAR.) *****
1193 *
1194 FC19 8D 11 BYTE BSR INHEX GET HEX LEFT
1195 FC1B 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1196 FC1D 48 ASLA ;
1197 FC1E 48 ASLA ;
1198 FC1F 48 ASLA ; SHIFT INTO LEFT NIBBLE
1199 FC20 48 ASLA ;
1200 FC21 1F 89 TFR A,B PUT HEXL IN "B"
1201 FC23 8D 07 BSR INHEX GET HEX RIGHT
1202 FC25 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1203 FC27 34 04 PSHS B PUSH HEXL ON STACK
1204 FC29 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1205 FC2B 39 RTS RETURN WITH HEX L&R IN "A"
1206 *
1207 *
1208 FC2C 8D 57 INHEX BSR ECHON INPUT ASCII CHAR.
1209 FC2E 81 30 CMPA #'0 IS IT > OR = "0" ?
1210 FC30 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1211 FC32 81 39 CMPA #'9 IS IT < OR = "9" ?
1212 FC34 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1213 FC36 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1214 FC38 39 RTS ;
1215 *
1216 *
1217 FC39 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1218 FC3B 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1219 FC3D 81 46 CMPA #'F IS IT < OR = "F" ?
1220 FC3F 22 03 BHI INHEXL IF > IT AIN'T HEX
1221 FC41 80 37 SUBA #$37 ASCII ADJ. ALPHA
1222 FC43 39 RTS ;
1223 *
1224 FC44 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1225 FC46 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1226 FC48 81 66 CMPA #'f IS IT < "f"
1227 FC4A 22 03 BHI NOTHEX IF > IT AIN'T HEX
1228 FC4C 80 57 SUBA #$57 ADJUST TO LOWER CASE
1229 FC4E 39 RTS ;
1230 *
1231 *
1232 FC4F 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1233 FC51 39 RTS ;
1234 *
1235 *
1236 FC52 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1237 FC54 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1238 FC56 8D 02 BSR OUTHL OUTPUT HEX LEFT
1239 FC58 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1240 FC5A OUTHL EQU *
1241 FC5A 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1242 FC5C 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1243 FC5D 44 LSRA ;
1244 FC5E 44 LSRA ;
1245 FC5F 44 LSRA ;
1246 FC60 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1247 FC62 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1248 FC64 84 0F ANDA #$0F STRIP LEFT NIBBLE
1249 FC66 8B 30 XASCII ADDA #$30 ASCII ADJ
1250 FC68 81 39 CMPA #$39 IS IT < OR = "9" ?
1251 FC6A 2F 02 BLE OUTC IF LESS, OUTPUT IT
1252 FC6C 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1253 FC6E 20 4D OUTC BRA OUTCH OUTPUT CHAR
1254 *
1255 * BINARY / ASCII --- THIS ROUTINE
1256 * OUTPUTS A BYTE IN ENHANCED
1257 * BINARY FORMAT. THE ENHANCEMENT
1258 * IS DONE BY SUBSTITUTING ASCII
1259 * LETTERS FOR THE ONES IN THE BYTE.
1260 * THE ASCII ENHANCEMENT LETTERS
1261 * ARE OBTAINED FROM THE STRING
1262 * POINTED TO BY THE INDEX REG. "X".
1263 *
1264 FC70 34 02 BIASCI PSHS A SAVE "A" ON STACK
1265 FC72 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1266 FC74 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1267 FC76 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1268 FC78 25 02 BCS PRTBA IF ONE PRINT LETTER
1269 FC7A 86 2D LDA #'- IF ZERO PRINT "-"
1270 FC7C 8D 3F PRTBA BSR OUTCH PRINT IT
1271 FC7E 8D 3B BSR OUT1S PRINT SPACE
1272 FC80 5A DECB SUB 1 FROM #BITS YET TO PRINT
1273 FC81 26 F1 BNE OUTBA
1274 FC83 35 82 PULS A,PC
1275 *
1276 IFD EXTOPT
1277 *
1278 * EXTENDED USER COMMANDS
1279 *
1280 USRCMD JMP [MONEXT+EXTCMD]
1281 ENDIF EXTOPT
1281 ENDIF EXTOPT
1282 *
1283 *
1284 FC85 7D 7F D2 ECHON TST ECHO IS ECHO REQUIRED ?
1285 FC88 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1286 *
1287 * INCHE
1288 *
1289 * ---GETS CHARACTER FROM TERMINAL AND
1290 * ECHOS SAME. THE CHARACTER IS RETURNED
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY
1292 * BIT MASKED OFF. ALL OTHER REGISTERS
1293 * ARE PRESERVED.
1294 *
1295 FC8A 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1296 FC8C 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1297 FC8E 20 2D BRA OUTCH ECHO CHAR TO TERMINAL
1298 *
1299 * INCH
1300 *
1301 * GET CHARACTER FROM TERMINAL. RETURN
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1304 * IS 8 BITS AND IS NOT ECHOED.
1305 *
1306 *
1307 FC90 34 10 INCH PSHS X SAVE IX
1308 FC92 BE 7F D0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1309 FC95 A6 84 LDA ,X FETCH PORT STATUS
1310 FC97 85 01 BITA #1 TEST READY BIT, RDRF ?
1311 IFD PS2OPT
1312 FC99 26 09 BNE GETST1
1313 FC9B 8E E0 20 LDX #PS2KBD
1314 FC9E A6 84 LDA ,X
1315 FCA0 85 01 BITA #1
1316 ENDIF PS2OPT
1317 FCA2 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1318 FCA4 A6 01 GETST1 LDA 1,X FETCH CHAR
1319 FCA6 35 90 PULS X,PC RESTORE IX
1320 *
1321 * INCHEK
1322 *
1323 * CHECK FOR A CHARACTER AVAILABLE FROM
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1325 * FOR READ READY. ALL REGISTERS ARE
1326 * PRESERVED, AND THE "Z" BIT WILL BE
1327 * CLEAR IF A CHARACTER CAN BE READ.
1328 *
1329 *
1330 FCA8 34 02 INCHEK PSHS A SAVE A ACCUM.
1331 FCAA A6 9F 7F D0 LDA [CPORT] FETCH PORT STATUS
1332 FCAE 85 01 BITA #1 TEST READY BIT, RDRF ?
1333 IFD PS2OPT
1334 FCB0 26 05 BNE INCHEK1
1335 FCB2 B6 E0 20 LDA PS2KBD
1336 FCB5 85 01 BITA #1 TEST READY BIT< RDRF ?
1337 ENDIF PS2OPT
1338 FCB7 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1339 *
1340 FCB9 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1341 FCBB 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1342 *
1343 *
1344 * OUTCH
1345 *
1346 * OUTPUT CHARACTER TO TERMINAL.
1347 * THE CHAR. TO BE OUTPUT IS
1348 * PASSED IN THE A REGISTER.
1349 * ALL REGISTERS ARE PRESERVED.
1350 *
1351 OUTCH IFD VDUOPT
1352 FCBD 8D 45 BSR VOUTCH
1353 ENDIF VDUOPT
1354 IFD DG640OPT
1355 BSR VOUTCH
1356 ENDIF DG640OPT
1356 ENDIF DG640OPT
1357 FCBF 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1358 FCC1 BE 7F D0 LDX CPORT GET ADDR. OF TERMINAL
1359 FCC4 A6 84 FETSTA LDA ,X FETCH PORT STATUS
1360 FCC6 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1361 FCC8 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1362 FCCA 35 02 PULS A GET CHAR. FOR XMIT
1363 FCCC A7 01 STA 1,X XMIT CHAR.
1364 FCCE 35 90 PULS X,PC RESTORE IX
1365 *
1366 * IO INITIALIZATION
1367 *
1368 FCD0 IOINIZ EQU *
1369 IFD VDUOPT
1370 FCD0 8D 13 BSR VINIZ
1371 ENDIF VDUOPT
1372 IFD DG640OPT
1373 BSR VINIZ
1374 ENDIF DG640OPT
1374 ENDIF DG640OPT
1375 FCD2 BE 7F D0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1376 FCD5 86 03 LDA #3 RESET ACIA PORT CODE
1377 FCD7 A7 84 STA ,X STORE IN CONTROL REGISTER
1378 FCD9 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1379 FCDB A7 84 STA ,X STORE IN CONTROL REGISTER
1380 FCDD 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1381 FCDF 86 FF LDA #$FF TURN ON ECHO FLAG
1382 FCE1 B7 7F D2 STA ECHO
1383 FCE4 39 RTS
1384 *
1385 IFD VDUOPT
1386 *
1387 ***************************************************
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1389 * *
1390 * 80 x 25 Characters
1391 *
1392 ***************************************************
1393 *
1394 ***************************************************
1395 * INITIALIZE EMULATOR *
1396 ***************************************************
1397 *
1398 FCE5 8E E0 30 VINIZ LDX #VDU
1399 FCE8 CC 00 00 LDD #0
1400 FCEB FD 7F EF STD COLADX AND ROWADX
1401 FCEE A7 02 STA VDUCOL,X
1402 FCF0 E7 03 STB VDUROW,X
1403 FCF2 E7 04 STB VDUOFF,X
1404 FCF4 FD 7F F1 STD NEWROW AND ESCFLG
1405 FCF7 C6 02 LDB #$02
1406 FCF9 E7 01 STB VDUATT,X
1407 FCFB 7F 7F F2 CLR ESCFLG
1408 FCFE 86 1B LDA #$1B SEND ESCAPE
1409 FD00 8D 02 BSR VOUTCH
1410 FD02 86 59 LDA #'Y CLEAR TO END OF SCREEN
1411 *
1412 ** VIDEO OUTPUT ROUTINE
1413 *
1414 FD04 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS
1415 FD06 8E E0 30 LDX #VDU POINT TO VDU REGISTERS
1416 *
1417 ** CHECK FOR ESCAPE SEQUENCE
1418 *
1419 FD09 7D 7F F2 TST ESCFLG ESCAPE ACTIVE?
1420 FD0C 27 04 BEQ SOROU1 BRANCH IF NOT
1421 FD0E 8D 74 BSR ESCAPE ELSE DO ESCAPE
1422 FD10 20 0D BRA RETURN AND RETURN
1423 *
1424 ** CHECK FOR CONTROL CHARACTERS
1425 *
1426 FD12 81 20 SOROU1 CMPA #$20 CONTROL CODES?
1427 FD14 24 04 BHS SOROU2
1428 FD16 8D 09 BSR CONTRL BRANCH IF SO
1429 FD18 20 05 BRA RETURN
1430 *
1431 ** OUTPUT TEXT CHARACTER
1432 *
1433 FD1A A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1434 FD1C 17 00 C5 LBSR NEWCOL UPDATE COLUMN
1435 *
1436 ** DISPLAY CURSOR AND RETURN
1437 *
1438 FD1F 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1439 *
1440 ***************************************************
1441 * CONTROL CODE HANDLERS *
1442 ***************************************************
1443 *
1444 FD21 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1445 FD23 10 27 00 41 LBEQ BACKSP
1446 FD27 81 1B CMPA #$1B ESCAPE SEQUENCE?
1447 FD29 10 27 00 6C LBEQ SETESC
1448 FD2D 81 1A CMPA #$1A CTRL Z - Clear Screen
1449 FD2F 10 27 00 8E LBEQ CLRSCR
1450 FD33 81 16 CMPA #$16 CTRL ^ - Home
1451 FD35 10 27 00 45 LBEQ HOME
1452 FD39 81 0D CMPA #$D CTRL M - RETURN?
1453 FD3B 10 27 00 99 LBEQ CRETN
1454 FD3F 81 0C CMPA #$0C CTRL L - CHAR RIGHT
1455 FD41 10 27 00 2C LBEQ CHRIGHT
1456 FD45 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE
1457 FD47 10 27 00 11 LBEQ LINEUP
1458 FD4B 81 0A CMPA #$0A CTRL J - LINE FEED
1459 FD4D 26 51 BNE RETESC NONE OF THESE, RETURN
1460 *
1461 ***************************************** LINE FEED
1462 *
1463 FD4F FC 7F EF LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1464 FD52 5C INCB BUMP ROW
1465 FD53 C1 19 CMPB #NUMLIN SCROLL TIME?
1466 FD55 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT
1467 FD59 16 00 99 LBRA SCROLL ELSE SCROLL IT
1468 *
1469 ***************************************** LINE FEED
1470 *
1471 FD5C FC 7F EF LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1472 FD5F 5D TSTB AT TOP OF SCREEN ?
1473 FD60 10 27 00 3C LBEQ RETESC Yes, Ignore
1474 FD64 5A DECB No, Decrement ROW
1475 FD65 16 00 74 LBRA NEWCUR POSITION CURSOR
1476 *
1477 *********************************** BACK SPACE
1478 *
1479 FD68 B6 7F EF BACKSP LDA COLADX
1480 FD6B 27 33 BEQ RETESC RETURN
1481 FD6D 4A DECA
1482 FD6E 16 00 68 LBRA POSCOL POSITION CURSOR
1483 *
1484 *********************************** CURSOR RIGHT
1485 *
1486 FD71 B6 7F EF CHRIGHT LDA COLADX
1487 FD74 4C INCA
1488 FD75 81 50 CMPA #LINLEN
1489 FD77 10 27 00 25 LBEQ RETESC
1490 FD7B 16 00 5B LBRA POSCOL
1491 *
1492 *********************************** CURSOR RIGHT
1493 *
1494 FD7E CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1495 FD81 16 00 58 LBRA NEWCUR
1496 *
1497 ***************************************************
1498 * ESCAPE HANDLERS *
1499 ***************************************************
1500 *
1501 FD84 F6 7F F2 ESCAPE LDAB ESCFLG GET FLAG
1502 FD87 C1 3D CMPB #'= SETTING CURSOR?
1503 FD89 27 16 BEQ ESCCUR BRANCH IF SO
1504 FD8B 81 59 CMPA #'Y CLEAR TO END OF SCREEN?
1505 FD8D 10 27 00 6E LBEQ ESCCLS
1506 FD91 81 54 CMPA #'T CLEAR TO END OF LINE?
1507 FD93 27 31 BEQ ESCCLL
1508 FD95 81 3D CMPA #'= STARTING CURSOR SET?
1509 FD97 26 04 BNE CLRESC BRANCH IF NOT
1510 *
1511 ***************************** START ESCAPE SEQUENCE
1512 *
1513 FD99 B7 7F F2 SETESC STAA ESCFLG ELSE START CURSORING
1514 FD9C 39 RTS AND RETURN
1515 *
1516 FD9D 7F 7F F2 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1517 FDA0 39 RETESC RTS SO RETURN
1518 *
1519 ********************************* SET SCREEN CURSOR
1520 *
1521 FDA1 7D 7F F1 ESCCUR TST NEWROW ROW SET?
1522 FDA4 26 04 BNE ESCCU1 BRANCH IF SO
1523 FDA6 B7 7F F1 STAA NEWROW ELSE SET NEW ROW
1524 FDA9 39 RTS AND RETURN
1525 *
1526 FDAA 7F 7F F2 ESCCU1 CLR ESCFLG
1527 FDAD 80 20 SUBA #$20 ADJUST COLUMN ADDRESS
1528 FDAF 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1529 FDB1 22 ED BHI RETESC NOT OK, DO NOTHING
1530 *
1531 FDB3 F6 7F F1 ESCCU2 LDAB NEWROW
1532 FDB6 7F 7F F1 CLR NEWROW
1533 FDB9 C0 20 SUBB #$20 ADJUST TO ROW ADDRESS
1534 FDBB C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1535 FDBD 22 E1 BHI RETESC ELSE RETURN DOING NOTHING
1536 FDBF 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO
1537 *
1538 ****************** CLEAR FROM CURSOR TO END OF LINE
1539 FDC1 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1540 FDC4 8D 16 BSR NEWCUR
1541 FDC6 B6 7F EF ESCCLL LDA COLADX
1542 FDC9 C6 20 LDB #$20 AND CLEAR CHAR
1543 FDCB E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1544 FDCD 4C INCA
1545 FDCE A7 02 STA VDUCOL,X
1546 FDD0 81 50 CMPA #LINLEN UNTIL END OF LINE
1547 FDD2 26 F7 BNE ESCCL1
1548 FDD4 7F 7F F2 CLR ESCFLG
1549 FDD7 39 RTS
1550 *
1551 *********************************** CARRIAGE RETURN
1552 *
1553 FDD8 4F CRETN CLRA SET COLUMN ZERO
1554 FDD9 F6 7F F0 POSCOL LDB ROWADX GET CURRENT ROW
1555 *
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN
1557 *
1558 FDDC FD 7F EF NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1559 FDDF A7 02 STA VDUCOL,X SET NEW COLUMN
1560 FDE1 E7 03 STB VDUROW,X SET NEW ROW
1561 FDE3 39 RTS AND RETURN
1562 *
1563 ********************* UPDATE CURRENT COLUMN AND ROW
1564 *
1565 FDE4 FC 7F EF NEWCOL LDD COLADX GET ROW AND COLUMN
1566 FDE7 4C INCA BUMP COLUMN
1567 FDE8 81 50 CMPA #LINLEN ROLL?
1568 FDEA 26 F0 BNE NEWCUR BRANCH IF NOT
1569 FDEC 4F CLRA ELSE RESET TO ZERO
1570 FDED 5C INCB AND BUMP ROW
1571 FDEE C1 19 CMPB #NUMLIN
1572 FDF0 26 EA BNE NEWCUR
1573 FDF2 5A DECB BOTTOM ROW
1574 FDF3 8D E7 BSR NEWCUR
1575 *
1576 ********************************* SCROLL THE SCREEN
1577 *
1578 FDF5 E6 04 SCROLL LDB VDUOFF,X
1579 FDF7 5C INCB
1580 FDF8 C1 19 CMPB #NUMLIN
1581 FDFA 25 01 BLO SCROL1
1582 FDFC 5F CLRB
1583 FDFD E7 04 SCROL1 STB VDUOFF,X
1584 *
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN
1586 *
1587 FDFF F6 7F EF ESCCLS LDB COLADX GET CURSOR
1588 FE02 86 20 LDA #$20 GET A SPACE
1589 FE04 F7 7F EF ESCCLS1 STB COLADX
1590 FE07 E7 02 STB VDUCOL,X
1591 FE09 A7 84 STA VDUCHR,X
1592 FE0B 5C INCB
1593 FE0C C1 50 CMPB #LINLEN
1594 FE0E 26 F4 BNE ESCCLS1
1595 *
1596 FE10 F6 7F F0 LDB ROWADX
1597 FE13 5C INCB
1598 FE14 C1 19 CMPB #NUMLIN
1599 FE16 27 08 BEQ ESCCLS2
1600 FE18 F7 7F F0 STB ROWADX
1601 FE1B E7 03 STB VDUROW,X
1602 FE1D 5F CLRB
1603 FE1E 20 E4 BRA ESCCLS1
1604 *
1605 FE20 5F ESCCLS2 CLRB
1606 FE21 F7 7F EF STB COLADX
1607 FE24 E7 02 STB VDUCOL,X
1608 FE26 F7 7F F2 STB ESCFLG
1609 FE29 39 RTS
1610 ENDIF VDUOPT
1611 *
1612 IFD DG640OPT
1613 ***************************************************
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1615 * *
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1619 * 16x64 BOARD). *
1620 ***************************************************
1621
1622 ***************************************************
1623 * INITIALIZE EMULATOR *
1624 ***************************************************
1625
1626 VINIZ LDX #0
1627 STX COLADX AND ROWADX
1628 STX NEWROW AND ESCFLG
1629 LDX #SCREEN POINT TO SCREEN
1630 STX CURSOR SET PROGRAM CURSOR
1631 LDA #$1B SEND ESCAPE
1632 BSR VOUTCH
1633 LDA #'Y CLEAR TO END OF SCREEN
1634 *
1635 ** VIDEO OUTPUT ROUTINE
1636 *
1637 VOUTCH PSHS A,B,X SAVE REGISTERS
1638 *
1639 ** CLEAR CURSOR
1640 LDX CURSOR
1641 LDB 0,X
1642 ANDB #$7F
1643 STB 0,X
1644 *
1645 ** CHECK FOR ESCAPE SEQUENCE
1646 TST ESCFLG ESCAPE ACTIVE?
1647 BEQ SOROU1 BRANCH IF NOT
1648 BSR ESCAPE ELSE DO ESCAPE
1649 BRA RETURN AND RETURN
1650 *
1651 ** CHECK FOR CONTROL CHARACTERS
1652 SOROU1 CMPA #$20 CONTROL CODES?
1653 BHS SOROU2
1654 BSR CONTRL BRANCH IF SO
1655 BRA RETURN
1656 *
1657 ** OUTPUT TEXT CHARACTER
1658 SOROU2 LDX CURSOR ELSE GET CURSOR
1659 STAA 0,X DISPLAY CHARACTER
1660 LBSR NEWCOL UPDATE COLUMN
1661 *
1662 ** DISPLAY CURSOR AND RETURN
1663 RETURN LDX CURSOR AND DISPLAY IT
1664 LDB ,X
1665 ORAB #$80 WITH REVID
1666 STB ,X
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1668
1669 ***************************************************
1670 * CONTROL CODE HANDLERS *
1671 ***************************************************
1672
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1674 LBEQ BACKSP
1675 CMPA #$1B ESCAPE SEQUENCE?
1676 LBEQ SETESC
1677 CMPA #$D CTRL M - RETURN?
1678 LBEQ CRETN
1679 CMPA #$0A CTRL J - LINE FEED
1680 BNE RETESC NONE OF THESE, RETURN
1681
1682 ***************************************** LINE FEED
1683
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1685 INCB BUMP ROW
1686 CMPB #NUMLIN SCROLL TIME?
1687 LBNE NEWCUR POSITION CURSOR IF NOT
1688 LBRA SCROLL ELSE SCROLL IT
1689
1690 ***************************************** LINE FEED
1691
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1693 TSTB AT TOP OF SCREEN ?
1694 BEQ RETESC Yes, Ignore
1695 DECB No, Decrement ROW
1696 LBRA NEWCUR POSITION CURSOR
1697
1698
1699 *********************************** BACK SPACE
1700
1701 BACKSP LDA COLADX
1702 BEQ RETESC RETURN
1703 DECA
1704 LBRA POSCOL POSITION CURSOR
1705
1706 *********************************** CURSOR RIGHT
1707
1708 CHRIGHT LDA COLADX
1709 INCA
1710 CMPA #LINLEN
1711 BEQ RETESC
1712 LBRA POSCOL
1713
1714 ***************************************************
1715 * ESCAPE HANDLERS *
1716 ***************************************************
1717
1718 ESCAPE LDAB ESCFLG GET FLAG
1719 CMPB #'= SETTING CURSOR?
1720 BEQ ESCCUR BRANCH IF SO
1721 CMPA #'Y CLEAR TO END OF SCREEN?
1722 LBEQ ESCCLS
1723 CMPA #'T CLEAR TO END OF LINE?
1724 BEQ ESCCLL
1725 CMPA #'E INSERT LINE?
1726 BEQ ESCINL
1727 CMPA #'R DELETE LINE?
1728 BEQ ESCDLL
1729 CMPA #'= STARTING CURSOR SET?
1730 BNE CLRESC BRANCH IF NOT
1731
1732 ***************************** START ESCAPE SEQUENCE
1733
1734 SETESC STAA ESCFLG ELSE START CURSORING
1735 RTS AND RETURN
1736
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1738 RETESC RTS SO RETURN
1739
1740 ********************************* SET SCREEN CURSOR
1741
1742 ESCCUR TST NEWROW ROW SET?
1743 BNE ESCCU1 BRANCH IF SO
1744 STAA NEWROW ELSE SET NEW ROW
1745 RTS AND RETURN
1746
1747 ESCCU1 CLR ESCFLG
1748 SUBA #$20 ADJUST COLUMN ADDRESS
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1750 BHI RETESC NOT OK, DO NOTHING
1751
1752 ESCCU2 LDAB NEWROW
1753 CLR NEWROW
1754 SUBB #$20 ADJUST TO ROW ADDRESS
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1756 BHI RETESC ELSE RETURN DOING NOTHING
1757 BRA NEWCUR GO SET NEW CURSOR IF SO
1758 *
1759 *************************** DELETE LINE FROM SCREEN
1760
1761 ESCDLL BSR CRETN GO COL. ZERO
1762 LDB ROWADX
1763 CMPB #NUMLIN-1
1764 BEQ SCROL3
1765 BRA SCROL1 AND DELETE THIS LINE
1766
1767 *************************** INSERT LINE INTO SCREEN
1768
1769 ESCINL BSR CRETN GO TO COL. ZERO
1770 LDAB ROWADX
1771 CMPB #NUMLIN-1
1772 BEQ ESCCLL
1773 *
1774 ** SCROLL SCREEN DOWN FROM CURSOR
1775 *
1776 LDX #SCREEN+SCNLEN-LINLEN
1777 ESCIN0 LDAA 0,-X
1778 STAA LINLEN,X
1779 LDA SCNLEN,X
1780 STA SCNLEN+LINLEN,X
1781 CPX CURSOR
1782 BNE ESCIN0
1783
1784 ****************** CLEAR FROM CURSOR TO END OF LINE
1785
1786 ESCCLL LDA COLADX GET CURRENT COLUMN
1787 LDX CURSOR GET CURSOR
1788 LDB #$20 AND CLEAR CHAR
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
1790 STB ,X+ CLEAR TEXT
1791 INCA
1792 CMPA #LINLEN UNTIL END OF LINE
1793 BNE ESCLL1
1794 CLR ESCFLG
1795 RTS
1796
1797 *********************************** CARRIAGE RETURN
1798
1799 CRETN CLRA SET COLUMN ZERO
1800 POSCOL LDB ROWADX GET CURRENT ROW
1801
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN
1803
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1805 LDA #LINLEN ELSE ADD A LINE
1806 MUL LINLEN * ROWADX
1807 ADDB COLADX
1808 ADCA #0
1809 ADDD #SCREEN ADD SCREEN BASE.
1810 STD CURSOR SAVE NEW CURSOR
1811 TFR D,X GET CURSOR IN X
1812 RTS AND RETURN
1813
1814 ********************* UPDATE CURRENT COLUMN AND ROW
1815
1816 NEWCOL LDD COLADX GET ROW AND COLUMN
1817 INCA BUMP COLUMN
1818 CMPA #LINLEN ROLL?
1819 BNE NEWCUR BRANCH IF NOT
1820 CLRA ELSE RESET TO ZERO
1821 INCB AND BUMP ROW
1822 CMPB #NUMLIN
1823 BNE NEWCUR
1824 DECB BOTTOM ROW
1825 BSR NEWCUR
1826
1827 ********************************* SCROLL THE SCREEN
1828
1829 SCROLL LDX #SCREEN POINT TO SCREEN
1830 SCROL1 LDA SCNLEN+LINLEN,X
1831 STA SCNLEN,X
1832 LDAA LINLEN,X MOVE TWO BYTES
1833 STAA 0,X+ UP ONE LINE
1834 CMPX #SCREEN+SCNLEN-LINLEN
1835 BNE SCROL1 LOOP UNTIL DONE
1836 BRA SCROL3
1837
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN
1839
1840 ESCCLS LDX CURSOR GET CURSOR
1841 SCROL3 LDAA #$20 GET A SPACE
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
1843 STA ,X+ AND TEXT
1844 CMPX #SCREEN+SCNLEN
1845 BNE SCROL2 UNTIL DONE
1846 CLR ESCFLG
1847 RTS
1848 ENDIF DG640OPT
1848 ENDIF DG640OPT
1849 *
1850 IFD PRTOPT
1851 *************************************
1852 *
1853 ** PRINTER DRIVER ROUTINES
1854 *
1855 *************************************
1856 *
1857 ** PINIZ - INITIATE PRINTER PORT
1858 *
1859 PINIZ PSHS B
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
1861 STD PADATA SET DDR AND SELECT DATA
1862 *
1863 ** RESET PRINTER
1864 LDB #PRESET
1865 STAB PADATA
1866 RESTLP INCB DELAY FOR RESET
1867 BNE RESTLP
1868 STAA PADATA ACCA=DIRMSK
1869 *
1870 ** INITALIZE PORT B (DATA PORT)
1871 LDAA #$2A
1872 STAA PBCTRL
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110
1874 STD PBDATA PBDREG PBCTRL
1875 *
1876 ** SELECT 66 LINES/PAGE
1877 LDAA #$1B
1878 BSR POUTCH
1879 LDAA #'C
1880 BSR POUTCH
1881 LDAA #66
1882 PULS B
1883 *************************************
1884 *
1885 ** OUTPUT A CHARACTER TO THE PRINTER
1886 *
1887 *************************************
1888 POUTCH PSHS B
1889 LDAB PBDATA CLEAR INTERRUPT BIT
1890 *
1891 ** WAIT TILL NOT BUSY
1892 BUSYLP LDAB PADATA
1893 BITB #PERROR
1894 BEQ PEXIT
1895 TSTB
1896 BMI BUSYLP
1897 *
1898 ** NOW OUTPUT CHARACTER
1899 STAA PBDATA
1900 PEXIT PULS B,PC
1901 *************************************
1902 *
1903 ** PCHK TEST IFD PRINTER READY
1904 *
1905 *************************************
1906 PCHK TST PBCTRL TEST STATE OF CRB7
1907 RTS SET ON ACKNOWLEDGE
1908 ENDIF PRTOPT
1908 ENDIF PRTOPT
1909 *************************************
1910 *
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE
1912 *
1913 *************************************
1914 *
1915 FE2A JMPTAB EQU *
1916 FE2A 01 FCB 1 " ^A "
1917 FE2B FB 67 FDB ALTRA
1918 FE2D 02 FCB 2 " ^B "
1919 FE2E FB 5C FDB ALTRB
1920 FE30 03 FCB 3 " ^C "
1921 FE31 FB 72 FDB ALTRCC
1922 FE33 04 FCB 4 " ^D "
1923 FE34 FB 51 FDB ALTRDP
1924 FE36 10 FCB $10 " ^P "
1925 FE37 FB 24 FDB ALTRPC
1926 FE39 15 FCB $15 " ^U "
1927 FE3A FB 30 FDB ALTRU
1928 FE3C 18 FCB $18 " ^X "
1929 FE3D FB 46 FDB ALTRX
1930 FE3F 19 FCB $19 " ^Y "
1931 FE40 FB 3B FDB ALTRY
1932 *
1933 FE42 42 FCC 'B'
1934 FE43 F9 46 FDB BRKPNT
1935 FE45 45 FCC 'E'
1936 FE46 F8 E7 FDB MEMDUMP
1937 FE48 47 FCC 'G'
1938 FE49 F8 8F FDB GO
1939 FE4B 4C FCC 'L'
1940 FE4C FA 51 FDB LOAD
1941 FE4E 50 FCC 'P'
1942 FE4F FA AF FDB PUNCH
1943 FE51 4D FCC 'M'
1944 FE52 F8 92 FDB MEMCHG
1945 FE54 52 FCC 'R'
1946 FE55 FB E0 FDB REGSTR
1947 FE57 53 FCC 'S'
1948 FE58 F8 DB FDB DISSTK
1949 FE5A 58 FCC 'X'
1950 FE5B F9 72 FDB XBKPNT
1951 IFD MFDCOPT
1952 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
1953 FDB MINBOOT
1954 ENDIF MFDCOPT
1954 ENDIF MFDCOPT
1955 IFD CF8OPT
1956 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
1957 FDB CFBOOT
1958 ENDIF CF8OPT
1958 ENDIF CF8OPT
1959 IFD IDEOPT
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
1961 FDB IDEBOOT
1962 ENDIF IDEOPT
1962 ENDIF IDEOPT
1963 IFD DMAFOPT
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
1965 FDB DBOOT
1966 ENDIF DMAFOPT
1966 ENDIF DMAFOPT
1967 IFD EXTOPT
1968 FCC 'U' *** IF FPGA, 'U' IS FOR USER
1969 FDB USRCMD
1970 ENDIF EXTOPT
1970 ENDIF EXTOPT
1971 IFD RTCOPT
1972 FCC 'T'
1973 FDB TIMSET
1974 ENDIF RTCOPT
1974 ENDIF RTCOPT
1975 IFD TRAOPT
1976 FE5D 54 FCC "T"
1977 FE5E F9 C5 FDB TRACE
1978 ENDIF TRAOPT
1979 *
1980 FE60 TABEND EQU *
1981 *
1982 * ** 6809 VECTOR ADDRESSES **
1983 *
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
1988 * HIS OWN ROUTINES IF HE SO DESIRES.
1989 *
1990 *
1991 FE60 F9 7E RAMVEC FDB SWIE USER-V
1992 FE62 F8 91 FDB RTI SWI3-V
1993 FE64 F8 91 FDB RTI SWI2-V
1994 FE66 F8 91 FDB RTI FIRQ-V
1995 FE68 F8 91 FDB RTI IRQ-V
1996 FE6A F9 7E FDB SWIE SWI-V
1997 FE6C FF FF FDB $FFFF SVC-VO
1998 FE6E FF FF FDB $FFFF SVC-VL
1999 *
2000 * PRINTABLE MESSAGE STRINGS
2001 *
2002 FE70 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2003 FE75 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR '
55 47 20 31 2E 34
20 46 4F 52 20
2004 IFD S3EOPT
2005 FE86 53 33 45 20 FCC 'S3E '
2006 ENDIF S3EOPT
2007 IFD B5XOPT
2008 FCC 'B5-X300 '
2009 ENDIF B5XOPT
2009 ENDIF B5XOPT
2010 IFD S3SOPT
2011 FCC 'S3STARTER '
2012 ENDIF S3SOPT
2012 ENDIF S3SOPT
2013 IFD ADSOPT
2014 FCC 'ADS6809 '
2015 ENDIF ADSOPT
2015 ENDIF ADSOPT
2016 IFD SWTOPT`
2017 FCC 'SWTPC '
2018 ENDIF SWTOPT
2018 ENDIF SWTOPT
2019 IFD XESOPT`
2020 FCC 'XESS '
2021 ENDIF XESOPT
2021 ENDIF XESOPT
2022 FE8A 20 2D 20 FCC ' - '
2023 FE8D 04 FCB 4
2024 FE8E 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2025 FE95 3E MSG3 FCC '>'
2026 FE96 04 FCB 4
2027 FE97 57 48 41 54 3F MSG4 FCC 'WHAT?'
2028 FE9C 04 FCB 4
2029 FE9D 20 2D 20 MSG5 FCC ' - '
2030 FEA0 04 FCB 4'
2031 FEA1 20 20 53 50 3D MSG10 FCC ' SP='
2032 FEA6 04 FCB 4
2033 FEA7 20 20 50 43 3D MSG11 FCC ' PC='
2034 FEAC 04 FCB 4
2035 FEAD 20 20 55 53 3D MSG12 FCC ' US='
2036 FEB2 04 FCB 4
2037 FEB3 20 20 49 59 3D MSG13 FCC ' IY='
2038 FEB8 04 FCB 4
2039 FEB9 20 20 49 58 3D MSG14 FCC ' IX='
2040 FEBE 04 FCB 4
2041 FEBF 20 20 44 50 3D MSG15 FCC ' DP='
2042 FEC4 04 FCB 4
2043 FEC5 20 20 41 3D MSG16 FCC ' A='
2044 FEC9 04 FCB 4
2045 FECA 20 20 42 3D MSG17 FCC ' B='
2046 FECE 04 FCB 4
2047 FECF 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2048 FED5 04 FCB 4
2049 FED6 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2050 FEDE 53 31 MSG20 FCC 'S1'
2051 FEE0 04 FCB 4
2052 IFD DATOPT
2053 *
2054 * POWER UP/ RESET/ NMI ENTRY POINT
2055 *
2056 ORG $FF00
2057 *
2058 *
2059 START LDX #IC11 POINT TO DAT RAM IC11
2060 LDA #$F GET COMPLIMENT OF ZERO
2061 *
2062 *
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2067 * STORED IN IT.
2068 *
2069 *
2070 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2071 DECA GET COMP. VALUE FOR NEXT LOCATION
2072 BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2073 *
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2076 * PHYSICAL ADDRESSES.
2077 *
2078 LDA #$F0
2079 STA ,X STORE $F0 AT $FFFF
2080 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2081 LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2082 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2083 STY ,X STORE TEST PATTERN AT $D0A0
2084 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2085 BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2086 LEAX -$1000,X ELSE POINT 4K LOWER
2087 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2088 BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2089 BRA START ELSE START ALL OVER AGAIN
2090 *
2091 *
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2096 * IS STORED IN RAM IN THE LOCATION THAT IS
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2102 * "7" IN THE $70A0 WILL BE STORED IN
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2111 * OF RAM RESPONDS.
2112 *
2113 *
2114 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2115 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2116 COMA COMPLEMENT MSB OF THAT ADDRESS
2117 LSRA PUT MS 4 BITS OF ADDRESS IN
2118 LSRA LOCATION D0-D3 TO ALLOW STORING
2119 LSRA IT IN THE DYNAMIC ADDRESS
2120 LSRA TRANSLATION RAM.
2121 STA $FFFD STORE XLATION FACTOR IN DAT "D"
2122 *
2123 LDS #STACK INITIALIZE STACK POINTER
2124 *
2125 *
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2133 *
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2136 *
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2139 *
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2142 *
2143 *
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2151 * MEMORY ADDRESSED AS FOLLOWS....
2152 *
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2155 *
2156 *
2157 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2158 STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2159 CLR 14,Y CLEAR $DFDE
2160 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2161 STA 15,Y STORE AT $DFDF
2162 LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2163 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2164 DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2165 BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2166 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2167 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2168 BEQ FINTAB SKIP IF FINISHED
2169 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2170 LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2171 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2172 CMPY ,X VERIFY RAM AT TEST LOCATION
2173 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2174 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2175 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2176 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2177 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2178 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2179 LSRA
2180 LSRA
2181 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2182 EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2183 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2184 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2185 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2186 LDY #LRARAM POINT TO LRARAM TABLE
2187 STA 14,Y STORE $F1 AT $DFCE
2188 *
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2193 *
2194 *
2195 LDA #$0C PRESET NUMBER HEX "C"
2196 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2197 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2198 DECA ELSE POINT 4K LOWER
2199 BPL FINDC GO TRY AGAIN
2200 BRA XFERTF
2201 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2202 STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2203 *
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2207 * ADDRESSES FROM $0000 AND UP....
2208 *
2209 CLRA START AT ZERO
2210 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2211 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2212 BEQ PNTNXT IF IT'S ZER0 SKIP
2213 CLR A,Y ELSE ERASE FROM TABLE
2214 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2215 PNTNXT INCA GET OFFSET TO NEXT ENTRY
2216 CMPA #$0C LAST ENTRY YET ?
2217 BLT COMPRS
2218 *
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2221 * THE MP-09 CPU CARD.
2222 *
2223 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2224 LDB #$10 GET NO. OF BYTES TO MOVE
2225 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2226 STA ,X+ POKE XLATION FACTOR IN IC11
2227 DECB SUB 1 FROM BYTES TO MOVE
2228 BNE FETCH CONTINUE UNTIL 16 MOVED
2229 *
2230 ELSE
2231 FEE1 39 LRA RTS
2232 FEE2 10 CE 7F C0 START LDS #STACK INITIALIZE STACK POINTER
2233 FEE6 5F CLRB
2234 ENDIF DATOPT
2235 *
2236 FEE7 53 COMB SET "B" NON-ZERO
2237 FEE8 F7 7F D2 STB ECHO TURN ON ECHO FLAG
2238 FEEB 16 F9 26 LBRA MONITOR INITIALIZATION IS COMPLETE
2239 *
2240 ** INTERRUPT JUMP VECTORS
2241 *
2242 FEEE 6E 9F 7F C0 V1 JMP [STACK]
2243 FEF2 6E 9F 7F C4 V2 JMP [SWI2]
2244 FEF6 6E 9F 7F C6 V3 JMP [FIRQ]
2245 FEFA 6E 9F 7F C8 V4 JMP [IRQ]
2246 FEFE 6E 9F 7F CA V5 JMP [SWI]
2247 *
2248 * SWI3 ENTRY POINT
2249 *
2250 FF02 1F 43 SWI3E TFR S,U
2251 FF04 AE 4A LDX 10,U *$FFC8
2252 FF06 E6 80 LDB ,X+
2253 FF08 AF 4A STX 10,U
2254 FF0A 4F CLRA
2255 FF0B 58 ASLB
2256 FF0C 49 ROLA
2257 FF0D BE 7F CC LDX SVCVO
2258 FF10 8C FF FF CMPX #$FFFF
2259 FF13 27 0F BEQ SWI3Z
2260 FF15 30 8B LEAX D,X
2261 FF17 BC 7F CE CMPX SVCVL
2262 FF1A 22 08 BHI SWI3Z
2263 FF1C 34 10 PSHS X
2264 FF1E EC C4 LDD ,U
2265 FF20 AE 44 LDX 4,U
2266 FF22 6E F1 JMP [,S++]
2267 FF24 37 1F SWI3Z PULU A,B,X,CC,DP
2268 FF26 EE 42 LDU 2,U
2269 FF28 6E 9F 7F C2 JMP [SWI3]
2270 *
2271 * 6809 VECTORS
2272 *
2273 FFF0 ORG $FFF0
2274 FFF0 FE EE FDB V1 USER-V
2275 FFF2 FF 02 FDB SWI3E SWI3-V
2276 FFF4 FE F2 FDB V2 SWI2-V
2277 FFF6 FE F6 FDB V3 FIRQ-V
2278 FFF8 FE FA FDB V4 IRQ-V
2279 FFFA FE FE FDB V5 SWI-V
2280 FFFC FE EE FDB V1 NMI-V
2281 FFFE FE E2 FDB START RESTART-V
0004 END START
0005 END
Program + Init Data = 1852 bytes
Error count = 0
/sys09swt.txt
0,0 → 1,5
NAM SYS09BUG FOR SWTPc
INCLUDE "opt_swt.txt"
INCLUDE "sys09equ.txt"
INCLUDE "sys09bug.txt"
END
/sys09xes.aux
0,0 → 1,7
t m
l SYS09XES.S19
t h
s sys09xes_b16_0.vhd f000 f7ff
s sys09xes_b16_1.vhd f800 ffff
q
 
/sys09b5x.lst
0,0 → 1,2774
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 NAM SYS09BUG FOR THE B5-X300
0000 INCLUDE "opt_b5x.txt"
0001 *
0002 ***************************************************
0003 * OPTION SWITCHES
0004 ***************************************************
0005 *
0006 *
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0009 ** FOR LOADING AND SAVING S1 RECORDS
0010 *
0011 *S3EOPT EQU $FF SPARTAN3E STARTER
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
0013 00FF B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0017 *
0002 END
0000 INCLUDE "sys09equ.txt"
0001 *
0002 ***************************************************
0003 * MEMORY MAP EQUATES *
0004 ***************************************************
0005 E000 MONIO EQU $E000 I/O SPACE
0006 IFD S3EOPT
0007 MONRAM EQU $7FC0
0008 ELSE
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE
0010 ENDIF S3EOPT
0011 F800 MONROM EQU $F800 START OF ROM
0012 IFD S3SOPT
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0014 EXTCMD EQU $00 EXTENDED OFFSET
0015 ENDIF S3SOPT
0015 ENDIF S3SOPT
0016 IFD XESOPT
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0018 EXTCMD EQU $00 EXTENDED OFFSET
0019 ENDIF XESOPT
0019 ENDIF XESOPT
0020 ***************************************************
0021
0022 IFD S3EOPT
0023 *
0024 * DIGILENT SPARTAN 3E STARTER
0025 *
0026 ACIAOPT EQU $FF ACIA AT PORT 0
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0028 VDUOPT EQU $FF VDU AT $E030
0029 TRAOPT EQU $FF PIA TRACE TIMER
0030 ENDIF S3EOPT
0030 ENDIF S3EOPT
0031 *
0032 IFD S3SOPT
0033 *
0034 * DIGILENT SPARTAN 3 STARTER
0035 *
0036 ACIAOPT EQU $FF ACIA AT PORT 0
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0038 VDUOPT EQU $FF VDU AT $E030
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0041 EXTOPT EQU $FF EXTENDED COMMANDS
0042 ENDIF S3SOPT
0042 ENDIF S3SOPT
0043 *
0044 IFD B5XOPT
0045 *
0046 * BURCHED B5-X300
0047 *
0048 00FF ACIAOPT EQU $FF ACIA AT PORT 0
0049 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0050 00FF VDUOPT EQU $FF VDU AT $E030
0051 00FF CF8OPT EQU $FF COMPACT FLASH AT $E040
0052 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0053 ENDIF B5XOPT
0054 *
0055 IFD XESOPT
0056 *
0057 * XESS XSA-3S1000 & XST-3.0
0058 *
0059 ACIAOPT EQU $FF ACIA AT PORT 0
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0061 VDUOPT EQU $FF VDU AT $E030
0062 IDEOPT EQU $FF XESS IDE AT $E100
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0064 EXTOPT EQU $FF EXTENDED COMMANDS
0065 ENDIF XESOPT
0065 ENDIF XESOPT
0066 *
0067 IFD ADSOPT
0068 *
0069 * ACKERMAN DIGITAL ADS6809
0070 *
0071 DG640OPT EQU $FF DG640 VDU AT $E800
0072 *RTCOPT EQU $FF REAL TIME CLOCK
0073 PRTOPT EQU $FF PRINTER DRIVERS
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0075 ENDIF ADSOPT
0075 ENDIF ADSOPT
0076 *
0077 IFD SWTOPT
0078 *
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER
0080 *
0081 ACIAOPT EQU $FF ACIA AT PORT 0
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0085 ENDIF
0085 ENDIF
0086 *
0087 IFD ACIAOPT
0088 *
0089 ***************************************************
0090 * SERIAL PORT *
0091 ***************************************************
0092 *
0093 ** ACIA SITS ON PORT 0
0094 *
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0096 *
0097 ENDIF ACIAOPT
0098 IFD MFDCOPT
0099 *
0100 ***************************************************
0101 * MINIFLOPPY DRIVE *
0102 ***************************************************
0103 *
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0105 *
0106 DRVFDC EQU MONIO+$14
0107 CMDFDC EQU MONIO+$18
0108 SECFDC EQU MONIO+$1A
0109 DATFDC EQU MONIO+$1B
0110 ENDIF MFDCOPT
0110 ENDIF MFDCOPT
0111 IFD PS2OPT
0112 *
0113 ***************************************************
0114 * VDU8 PS/2 KEYBOARD PORT *
0115 ***************************************************
0116 *
0117 ** KEYBOARD SITS ON PORT 2
0118 *
0119 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0120 ENDIF PS2OPT
0121 IFD VDUOPT
0122 *
0123 ***************************************************
0124 * VDU8 DISPLAY DRIVER EQUATES *
0125 ***************************************************
0126 *
0127 ** VDU8 DISPLAY SITS ON PORT 3
0128 *
0129 E030 VDU EQU MONIO+$30
0130 0000 VDUCHR EQU 0 CHARACTER REGISTER
0131 0001 VDUATT EQU 1 ATTRIBUTE REGISTER
0132 0002 VDUCOL EQU 2 CURSOR COLUMN
0133 0003 VDUROW EQU 3 CURSOR ROW
0134 0004 VDUOFF EQU 4 ROW OFFSET
0135 *
0136 0050 LINLEN EQU 80 LENGTH OF A LINE
0137 0019 NUMLIN EQU 25 NUMBER OF LINES
0138 ENDIF VDUOPT
0139 *
0140 IFD CF8OPT
0141 *
0142 ***************************************************
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER *
0144 ***************************************************
0145 *
0146 ** COMPACT FLASH SITS AT PORT 4
0147 *
0148 E040 CF_BASE EQU MONIO+$40
0149 E040 CF_DATA EQU CF_BASE+0
0150 E041 CF_ERROR EQU CF_BASE+1 ; read error
0151 E041 CF_FEATURE EQU CF_BASE+1 ; write feature
0152 E042 CF_SECCNT EQU CF_BASE+2
0153 E043 CF_SECNUM EQU CF_BASE+3
0154 E044 CF_CYLLO EQU CF_BASE+4
0155 E045 CF_CYLHI EQU CF_BASE+5
0156 E046 CF_HEAD EQU CF_BASE+6
0157 E047 CF_STATUS EQU CF_BASE+7 ; read status
0158 E047 CF_COMAND EQU CF_BASE+7 ; write command
0159 *
0160 * Command Equates
0161 *
0162 0020 CMDREAD EQU $20 ; Read Single sector
0163 0030 CMDWRITE EQU $30 ; Write Single sector
0164 00EF CMDFEATURE EQU $EF
0165 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers
0166 00E0 HEADLBA EQU $E0
0167 *
0168 * Status bit equates
0169 *
0170 0080 BUSY EQU $80
0171 0040 DRDY EQU $40
0172 0008 DRQ EQU $08
0173 0001 ERR EQU $01
0174 *
0175 ENDIF CF8OPT
0176 *
0177 IFD IDEOPT
0178 *
0179 ***************************************************
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *
0181 ***************************************************
0182 *
0183 ** COMPACT FLASH SITS AT PORT 4
0184 *
0185 CF_BASE EQU MONIO+$0100
0186 CF_DATA EQU CF_BASE+0
0187 CF_ERROR EQU CF_BASE+2 ; read error
0188 CF_FEATURE EQU CF_BASE+2 ; write feature
0189 CF_SECCNT EQU CF_BASE+4
0190 CF_SECNUM EQU CF_BASE+6
0191 CF_CYLLO EQU CF_BASE+8
0192 CF_CYLHI EQU CF_BASE+10
0193 CF_HEAD EQU CF_BASE+12
0194 CF_STATUS EQU CF_BASE+14 ; read status
0195 CF_COMAND EQU CF_BASE+14 ; write command
0196 CF_AUX EQU CF_BASE+30
0197 *
0198 * Command Equates
0199 *
0200 CMDREAD EQU $20 ; Read Single sector
0201 CMDWRITE EQU $30 ; Write Single sector
0202 AUXRESET EQU $06 ; Reset IDE
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked
0204 HEADLBA EQU $E0
0205 *
0206 * Status bit equates
0207 *
0208 BUSY EQU $80
0209 DRDY EQU $40
0210 DRQ EQU $08
0211 ERR EQU $01
0212 *
0213 ENDIF CF8OPT
0213 ENDIF CF8OPT
0214 *
0215 IFD RTCOPT
0216 *
0217 **************************************************
0218 * MM58167A REAL TIME CLOCK MEMORY MAP:
0219 **************************************************
0220 *
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0222 *
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0224 *
0225 * COUNTER AND COMPARITOR REGISTERS:
0226 *
0227 * Both the Clock Counter and Clock Comparitor
0228 * consist of 8 registers for holding the time.
0229 * The register offsets from the Counter and
0230 * Comparitor registers are listed above.
0231 *
0232 COUNTR EQU CLOCK+0
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0234 *
0235 * CLOCK REGISTER OFFSETS:
0236 * These register offsets are used for the CLOCK
0237 * and comparitor ram CMPRAM.
0238 *
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0241 SECOND EQU 2
0242 MINUIT EQU 3
0243 HOUR EQU 4
0244 WKDAY EQU 5
0245 MTHDAY EQU 6
0246 MONTH EQU 7
0247 *
0248 * INTERRUPT OUTPUT REGISTERS:
0249 *
0250 * An interrupt output may be generated at the
0251 * following rates by setting the appropriate bit
0252 * in the Interrupt Control Register (CINTCR).
0253 * The Interrupt Status Register (CINTSR) must be
0254 * read to clear the interrupt and will return
0255 * the source of the interrupt.
0256 *
0257 * 1/Month Bit 7
0258 * 1/Week Bit 6
0259 * 1/Day Bit 5
0260 * 1/Hour Bit 4
0261 * 1/Minuite Bit 3
0262 * 1/Second Bit 2
0263 * 10/Second Bit 1
0264 * Comparitor Bit 0
0265 *
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0268 *
0269 * COUNTER AND RAM RESETS; GO COMMAND.
0270 *
0271 * The counter and comparitor may be reset
0272 * by writing $FF into CTRRES and CMPRES
0273 * respectivly.
0274 * A write to the Go command register (GOCMND)
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths
0276 * of a second counter.
0277 *
0278 CTRRES EQU CLOCK+18 COUNTER RESET
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0280 GOCMND EQU CLOCK+21 GO COMMAND
0281 *
0282 * CLOCK STATUS REGISTER.
0283 *
0284 * The counter takes 61 usec. to rollover for
0285 * every 1KHz clock pulse. If the Status bit is
0286 * set after reading the counter, the counter
0287 * should be re-read to ensure the time is correct.
0288 *
0289 CLKSTA EQU CLOCK+20 STATUS BIT
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0292 ENDIF RTCOPT
0292 ENDIF RTCOPT
0293 *
0294 IFD TRAOPT
0295 *
0296 **************************************************
0297 * PIA INTERRUPT TIMER
0298 **************************************************
0299 *
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7
0301 *
0302 ** PIA TIMER FOR SINGLE STEP / TRACE
0303 *
0304 * TADATA = Output = Timer preset register
0305 * TACTRL - CA1 = input = rising edge = NMI
0306 * - CA2 = Output = Timer Reset (Active High)
0307 * TBDATA = Input = Timer read back register
0308 * TBCTRL - CB1 = input = rising edge = FIRQ
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0310 *
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0312 * CRA1 = 1 CA1 Rising edge IRQ
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0315 * CRA4 = 1 ] CA2 = Set/Reset output
0316 * CRA5 = 1 ]
0317 * CRA6 = X CA2 Input Interrupt Flag
0318 * CRA7 = X CA1 Interrupt Flag
0319 *
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0321 * CRB1 = 1 CB1 Rising edge IRQ
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0324 * CRB4 = 1 ] CB2 = Set/Reset output
0325 * CRB5 = 1 ]
0326 * CRB6 = X CB2 Input Interrupt Flag
0327 * CRB7 = X CB1 Interrupt Flag
0328 *
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0331 *
0332 TADATA EQU MONIO+$70 Timer preset port
0333 TACTRL EQU MONIO+$71
0334 TBDATA EQU MONIO+$72 Timer read back port
0335 TBCTRL EQU MONIO+$73
0336 *
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0338 *
0339 ENDIF TRAOPT
0339 ENDIF TRAOPT
0340 IFD ADSOPT
0341 *
0342 ***************************************************
0343 * SERIAL PORT FOR DG640 *
0344 ***************************************************
0345 *
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0348 *
0349 ACIAS EQU MONIO+$400 CONTROL PORT
0350 *
0351 ENDIF ADSOPT
0351 ENDIF ADSOPT
0352 IFD PRTOPT
0353 *
0354 ***************************************************
0355 * PRINTER INTERFACE *
0356 ***************************************************
0357 *
0358 PADATA EQU MONIO+$404
0359 PACTRL EQU MONIO+$405
0360 PBDATA EQU MONIO+$406
0361 PBCTRL EQU MONIO+$407
0362 *
0363 ** CB1 ACK. I/P
0364 ** CB2 STB. O/P
0365 ** PB0 - PB7 DATA 1 - 8 O/P
0366 ** PORT A BIT ASSIGNMENT
0367 *
0368 PBUSY EQU $80 I/P
0369 PEMPTY EQU $40 I/P
0370 SELECT EQU $20 I/P
0371 PERROR EQU $10 I/P
0372 PRESET EQU %00000100 O/P PA3 = 0
0373 AUTOFD EQU %00001000 O/P PA2 = 0
0374 DIRMSK EQU %00001100
0375 ENDIF PRTOPT
0375 ENDIF PRTOPT
0376 IFD DG640OPT
0377 *
0378 ***************************************************
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0380 ***************************************************
0381 *
0382 ** VIDEO DISPLAY DEFINITIONS
0383 *
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0385 LINLEN EQU 64 LENGTH OF A LINE
0386 NUMLIN EQU 16 NUMBER OF LINES
0387 SCNLEN EQU $400 LENGTH OF SCREEN
0388 ENDIF DG640OPT
0388 ENDIF DG640OPT
0389 *
0390 IFD DMAFOPT
0391 *
0392 ***************************************************
0393 * DMAF2 8" DRIVE *
0394 ***************************************************
0395 *
0396 ADDREG EQU $F000 ADDRESS REGISTER
0397 CNTREG EQU $F002 COUNT REGISTER
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER
0400 AAAREG EQU $F015 ???
0401 BBBREG EQU $F016 ???
0402 COMREG EQU $F020 1791 COMMAND REGISTER
0403 SECREG EQU $F022 SECTOR REGISTER
0404 DRVREG EQU $F024 DRIVE SELECT LATCH
0405 CCCREG EQU $F040 ???
0406 ENDIF DMAFOPT
0406 ENDIF DMAFOPT
0407 IFD DATOPT
0408 **************************************************
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0410 **************************************************
0411 *
0412 FFF0 IC11 EQU $FFF0 DAT RAM CHIP
0413 55AA TSTPAT EQU $55AA TEST PATTERN
0414 ENDIF DATOPT
0415 *
0003 END
0000 INCLUDE "sys09bug.txt"
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR
0002 OPT l
 
sys09bug.txt page 2
0004 *
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007 *
0008 * ALLEN CLARK WALLACE WATSON
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
0011 * PH. 813-977-0347 PH. 813-985-1359
0012 *
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
0014 * 2561 NANTUCKET DR APT. E
0015 * ATLANTA, GA 30345
0016 * PH. 404-320-1043
0017 *
0018 * MODIFIED TO SYS09BUG VER 1.0
0019 * FOR: SYSTEM09 FPGA SYSTEM
0020 * BY: JOHN KENT
0021 * DATE: 21ST NOVEMBER 2006
0022 * REMOVED: DISK BOOTS
0023 * MEMORY TEST
0024 * ADDED: ADM3A VDU DRIVER
0025 *
0026 * MODIFIED TO SYS09BUG VER 1.1
0027 * FOR: SYSTEM09 FPGA SYSTEM
0028 * BY: JOHN KENT
0029 * DATE: 7TH JANUARY 2007
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0032 * AND REALTIME CLOCK
0033 *
0034 * MODIFIED TO SYS09BUG VER 1.2
0035 * FOR: SYSTEM09 FPGA SYSTEM
0036 * BY: JOHN KENT
0037 * DATE: 21ST MAY 2007
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * Modified to SYS09BUG VER 1.4
0049 * FOR: SYSTEM09 FPGA SYSTEM
0050 * BY: JOHN KENT
0051 * DATE: 3RD FEB 2008
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
0056 *
0057 * *** COMMANDS ***
0058 *
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0063 * CONTROL P = ALTER THE PROGRAM COUNTER
0064 * CONTROL U = ALTER USER STACK POINTER
0065 * CONTROL X = ALTER "X" INDEX REGISTER
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0068 * D = 5.25" MINIFLOPPY BOOT
0069 * E ssss-eeee = EXAMINE MEMORY
0070 * FROM STARTING ADDRESS ssss
0071 * TO ENDING ADDRESS eeee.
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0073 * L = LOAD TAPE
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0076 * R = DISPLAY REGISTER CONTENTS
0077 * S = DISPLAY STACK FROM ssss TO $DFC0
0078 * U = 8" DMAF2 FLOPPY BOOT
0079 * U = USER EXTENSION COMMANDS AT $F000
0080 * X = REMOVE ALL BREAKPOINTS
0081 *
0082 *
0083 ***************************************************
0084 * SYS09BUG VARIABLE SPACE
0085 ***************************************************
0086 *
0087 DFC0 ORG MONRAM
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK
0089 DFC0 NMI RMB 2 USER NMI VECTOR
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0097 IFD DATOPT
0098 DFD0 LRARAM RMB 16 LRA ADDRESSES
0099 ENDIF DATOPT
0100 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0101 DFE2 ECHO RMB 1 ECHO FLAG
0102 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0103 IFD TRAOPT
0104 NMISAV RMB 2 NMI Jump Vector Backup
0105 TRACNT RMB 2 Trace Count
0106 ENDIF TRAOPT
0106 ENDIF TRAOPT
0107 IFD VDUOPT
0108 *
0109 **************************************************
0110 * VDU8 DISPLAY DRIVER VARIABLES *
0111 **************************************************
0112 *
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0114 DFFB COLADX RMB 1 CURSOR COLUMN
0115 DFFC ROWADX RMB 1 CURSOR ROW
0116 **************************************************
0117 *
0118 DFFD NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0119 DFFE ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0120 ENDIF VDUOPT
0121 IFD DG640OPT
0122 *
0123 ***************************************************
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0125 ***************************************************
0126 *
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0128 COLADX RMB 1 CURSOR COLUMN
0129 ROWADX RMB 1 CURSOR ROW
0130 *************************************************
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0134 ENDIF DG640OPT
0134 ENDIF DG640OPT
0135 *
0136 *
0137 ***************************************************
0138 * START OF ROM *
0139 ***************************************************
0140 *
0141 F800 ORG MONROM
0142 F800 F8 14 FDB MONITOR
0143 F802 F8 61 FDB NEXTCMD
0144 F804 FC 9D FDB INCH
0145 F806 FC 97 FDB INCHE
0146 F808 FC B5 FDB INCHEK
0147 F80A FC CA FDB OUTCH
0148 F80C FB 8F FDB PDATA
0149 F80E FB 1E FDB PCRLF
0150 F810 FB 1A FDB PSTRNG
0151 F812 FA 2E FDB LRA
0152 *
0153 IFD ADSOPT
0154 FDB PCHK CHECK FOR PRINTER INPUT
0155 FDB PINIZ INITIATE PRINTER
0156 FDB POUTCH OUTPUT CH. TO PRINTER
0157 FDB VINIZ
0158 FDB VOUTCH
0159 FDB ACINIZ
0160 FDB AOUTCH
0161 ENDIF ADSOPT
0161 ENDIF ADSOPT
0162 *
0163 * MONITOR
0164 *
0165 * VECTOR ADDRESS STRING IS.....
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0167 *
0168 F814 8E FE 6D MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0169 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0175 *
0176 * CONTENTS FROM TO FUNCTION
0177 * $F8A1 $FE40 $DFC0 USER-V
0178 * $F8A1 $FE42 $DFC2 SWI3-V
0179 * $F8A1 $FE44 $DFC4 SWI2-V
0180 * $F8A1 $FE46 $DFC6 FIRQ-V
0181 * $F8A1 $FE48 $DFC8 IRQ-V
0182 * $FAB0 $FE4A $DFCA SWI-V
0183 * $FFFF $FE4C $DFCC SVC-VO
0184 * $FFFF $FE4E $DFCE SVC-VL
0185 *
0186 F824 8E E0 00 LDX #ACIAS
0187 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM
0188 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0190 F82F 6F E2 CLRSTK CLR ,-S
0191 F831 5A DECB
0192 F832 26 FB BNE CLRSTK
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0194 F837 AF 6A STX 10,S ON STACK
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0196 F83B A7 E4 STA ,S
0197 F83D 1F 43 TFR S,U
0198 F83F 17 04 9B LBSR IOINIZ INITIALIZE CONTROL PORT
0199 F842 8E FE 7D LDX #MSG1 POINT TO MONITOR MESSAGE
0200 F845 17 03 47 LBSR PDATA PRINT MSG
0201 *
0202 IFD DATOPT
0203 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0204 F84B 4F CLRA START TOTAL AT ZERO
0205 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0206 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0207 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0208 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL
0209 F854 19 DAA ADJ. TOTAL FOR DECIMAL
0210 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0211 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM
0212 F858 17 04 0C LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0213 F85B 8E FE 9F LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0214 F85E 17 03 2E LBSR PDATA PRINT MSG
0215 ENDIF DATOPT
0216 *
0217 IFD TRAOPT
0218 LBSR TRAINZ
0219 ENDIF TRAOPT
0219 ENDIF TRAOPT
0220 *
0221 ***** NEXTCMD *****
0222 *
0223 F861 8E FE A6 NEXTCMD LDX #MSG3 POINT TO MSG ">"
0224 F864 17 02 B3 LBSR PSTRNG PRINT MSG
0225 F867 17 04 33 LBSR INCH GET ONE CHAR. FROM TERMINAL
0226 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0227 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0228 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0229 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0230 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0231 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0232 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0233 F878 17 04 4F LBSR OUTCH PRINT "^"
0234 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0235 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0236 F87F 17 04 48 PRTCMD LBSR OUTCH PRNT CMD CHAR
0237 F882 17 04 43 LBSR OUT1S PRNT SPACE
0238 F885 C1 60 CMPB #$60
0239 F887 2F 02 BLE NXTCH0
0240 F889 C0 20 SUBB #$20
0241 *
0242 ***** DO TABLE LOOKUP *****
0243 * FOR COMMAND FUNCTIONS
0244 *
0245 F88B 8E FE 37 NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0246 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0247 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0248 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0249 F894 8C FE 6D CMPX #TABEND REACHED END OF TABLE YET ?
0250 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0251 F899 8E FE A8 LDX #MSG4 POINT TO MSG "WHAT?"
0252 F89C 17 02 F0 LBSR PDATA PRINT MSG
0253 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0254 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0255 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0256 *
0257 * "G" GO OR CONTINUE
0258 *
0259 F8A5 1F 34 GO TFR U,S
0260 F8A7 3B RTI RTI
0261 *
0262 ***** "M" MEMORY EXAMINE AND CHANGE *****
0263 *
0264 F8A8 17 03 6B MEMCHG LBSR IN1ADR INPUT ADDRESS
0265 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN
0266 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y"
0267 F8AF 8E FE AE MEMC2 LDX #MSG5 POINT TO MSG " - "
0268 F8B2 17 02 65 LBSR PSTRNG PRINT MSG
0269 F8B5 1F 21 TFR Y,X FETCH ADDRESS
0270 F8B7 17 03 A5 LBSR OUT4H PRINT ADDR IN HEX
0271 F8BA 17 04 0B LBSR OUT1S OUTPUT SPACE
0272 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0273 F8BF 17 03 A5 LBSR OUT2H OUTPUT CONTENTS IN ASCII
0274 F8C2 17 04 03 LBSR OUT1S OUTPUT SPACE
0275 F8C5 17 03 5E LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0276 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0277 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0278 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0279 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0280 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0281 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW?
0282 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0283 F8D6 81 0D CMPA #$D IS IT A CR?
0284 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE
0285 F8DA 39 CHRTN RTS EXIT ROUTINE
0286 *
0287 *
0288 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0289 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0290 F8DF 27 08 BEQ FORWRD $F972
0291 F8E1 17 03 E4 LBSR OUT1S OUTPUT SPACE
0292 F8E4 86 3F LDA #'? LOAD QUESTION MARK
0293 F8E6 17 03 E1 LBSR OUTCH PRINT IT
0294 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0295 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0296 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0297 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0298 *
0299 * "S" DISPLAY STACK
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0302 *
0303 F8F1 17 02 A2 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0304 F8F4 1F 32 TFR U,Y
0305 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0306 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK
0307 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0308 *
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0311 * UPPER ADDRESS IN X-REG.
0312 * IF HEX ADDRESSES ARE INVALID (V)=1.
0313 *
0314 F8FD 17 03 0B MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0315 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0316 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0317 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0318 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0319 F908 39 EDPRTN RTS ;
0320 *
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0322 * TO EVEN 16 BYTE BOUNDRIES.
0323 *
0324 * IF LOWER ADDR = $4532
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0326 *
0327 * IF UPPER ADDR = $4567
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0329 *
0330 * ENTER WITH LOWER ADDRESS IN X-REG.
0331 * -UPPER ADDRESS ON TOP OF STACK.
0332 *
0333 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0334 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0335 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0336 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0337 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0338 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0339 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0340 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0341 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0342 F91C 17 03 96 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0343 F91F 27 03 BEQ EDUMP
0344 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0345 F923 39 RTS ;
0346 *
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0349 *
0350 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0351 F926 8E FE AE LDX #MSG5 POINT TO MSG " - "
0352 F929 17 01 EE LBSR PSTRNG PRINT MSG
0353 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0354 F92E 17 03 2E LBSR OUT4H PRINT THE ADDRESS
0355 F931 17 03 92 LBSR OUT2S 2 SPACES
0356 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0357 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0358 F938 17 03 2C LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0359 F93B 17 03 8A LBSR OUT1S OUTPUT SPACE
0360 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT
0361 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0362 *
0363 * PRINT 16 ASCII CHARACTERS
0364 * IF NOT PRINTABLE OR NOT VALID
0365 * ASCII PRINT A PERIOD (.)
0366 F941 17 03 82 LBSR OUT2S 2 SPACES
0367 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0368 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0369 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0370 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0371 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0372 F94E 81 7E CMPA #$7E IS IT VALID ASCII?
0373 F950 23 02 BLS PRASC IF SO PRINT IT
0374 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0375 F954 17 03 73 PRASC LBSR OUTCH PRINT ASCII CHARACTER
0376 F957 5A DECB DECREMENT COUNT
0377 F958 26 EE BNE EDPASC
0378 F95A 20 BC BRA NXTLIN
0379 *
0380 ***** "B" SET BREAKPOINT *****
0381 *
0382 F95C 17 02 B7 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0383 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0384 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0385 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0386 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0387 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0388 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0389 F96D 35 10 PULS X POP BP ADDRESS FROM STACK
0390 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0391 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0392 F973 81 3F CMPA #$3F IS IT A SWI?
0393 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0394 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0395 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0396 F97B 86 3F LDA #$3F LOAD A SWI ($3F)
0397 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0398 F97F 39 EXITBP RTS ;
0399 *
0400 * INDICATE ERROR SETTING BREAKPOINT
0401 *
0402 F980 17 03 45 BPERR LBSR OUT1S OUTPUT SPACE
0403 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0404 F985 16 03 42 LBRA OUTCH PRINT "?"
0405 *
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0407 *
0408 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0409 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0410 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0411 F990 5A DECB $FAAC DECREMENT BP COUNTER
0412 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0413 F993 39 RTS
0414 *
0415 ***** SWI ENTRY POINT *****
0416 *
0417 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0418 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0419 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0420 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0421 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0422 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0423 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0424 F9A2 17 02 48 REGPR LBSR REGSTR GO PRINT REGISTERS
0425 *
0426 IFD TRAOPT
0427 LDX #0
0428 STX TRACNT
0429 ENDIF TRAOPT
0429 ENDIF TRAOPT
0430 *
0431 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0432 *
0433 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0434 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0435 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0436 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS
0437 F9B1 81 3F CMPA #$3F IS IT SWI?
0438 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0439 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0440 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0441 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0442 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0443 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0444 F9BF A7 A0 STA ,Y+
0445 F9C1 39 RTS
0446 *
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0448 *
0449 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0450 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0451 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0452 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0453 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0454 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0455 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0456 F9D1 39 RTS ;
0457 *
0458 *
0459 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0460 F9D4 39 RTS
0461 *
0462 IFD TRAOPT
0463 *
0464 ** TRACE from address AAAA BB bytes
0465 *
0466 TRACE LBSR ALTPC1 SET UP NEW PC
0467 BVS TREXIT ADDRESS ERROR, EXIT
0468 LBSR OUT1S
0469 LBSR IN1ADR Fetch Byte Count
0470 BVS TREXIT Byte Count error, EXIT
0471 STX TRACNT
0472 *
0473 LDX NMI Save NMI Vector
0474 STX NMISAV
0475 LDX #NMIE Set up NMI for Tracing
0476 STX NMI
0477 LBSR TRAINZ Initialise Hardware
0478 BRA TRACEG Start Trace
0479 TREXIT RTS
0480 *
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0482 * CRA1 = 1 CA1 Rising edge IRQ
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0485 * CRA4 = 1 ] CA2 = Set/Reset output
0486 * CRA5 = 1 ]
0487 * CRA6 = X CA2 Input Interrupt Flag
0488 * CRA7 = X CA1 Interrupt Flag
0489 *
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0491 * CRB1 = 1 CB1 Rising edge IRQ
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0494 * CRB4 = 1 ] CB2 = Set/Reset output
0495 * CRB5 = 1 ]
0496 * CRB6 = X CB2 Input Interrupt Flag
0497 * CRB7 = X CB1 Interrupt Flag
0498 *
0499 *
0500 ** TRACE NMI ENTRY POINT
0501 *
0502 NMIE TFR S,U
0503 LDA #$36 Disable Interrupt, CA2 Low
0504 STA TACTRL
0505 LDA TADATA Clear Interrupt flag by reading data port
0506 *
0507 LBSR REGSTR DUMP REGISTERS
0508 *
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0510 LDA ,X
0511 CMPA #$3F
0512 BEQ TRACEX EXIT ON SWI
0513 *
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR
0516 LEAX -1,X DECREMENT TRACE COUNT
0517 STX TRACNT
0518 *
0519 ** TRACE GO (RESUME SINGLE STEP)
0520 *
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0523 STA TADATA
0524 LDA #$36 LOAD STROBE LOW
0525 STA TACTRL
0526 LDA TADATA CLEAR INTERRUPT
0527 LDA #$36 RELEASE RESET
0528 STA TBCTRL
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0530 STA TACTRL
0531 RTI GO EXECUTE INSTRUCTION
0532 *
0533 TRACEX LDX NMISAV Restore NMI vector
0534 STX NMI
0535 LBRA NEXTCMD Jump back to the command loop.
0536 *
0537 ** TRACE HARDWARE INITIALISATION
0538 *
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0540 STA TACTRL
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0542 STA TBCTRL
0543 LDA #$FF PORTA = OUTPUT
0544 STA TADATA
0545 LDA #$00 PORTB = INPUT
0546 STA TBDATA
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0548 STA TACTRL
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0550 STA TBCTRL
0551 RTS
0552 *
0553 ENDIF TRAOPT
0553 ENDIF TRAOPT
0554 IFD MFDCOPT
0555 *
0556 ** "U" MINI DISK BOOT
0557 *
0558 MINBOOT TST CMDFDC
0559 CLR DRVFDC
0560 LDX #$0000
0561 LOOP LEAX $01,X
0562 CMPX #$0000
0563 BNE LOOP
0564 LDA #$0F
0565 STA CMDFDC
0566 BSR DELAY
0567 LOOP1 LDB CMDFDC
0568 BITB #$01
0569 BNE LOOP1
0570 LDA #$01
0571 STA SECFDC
0572 BSR DELAY
0573 LDA #$8C
0574 STA CMDFDC
0575 BSR DELAY
0576 LDX #$C000
0577 BRA LOOP3
0578 LOOP2 BITB #$02
0579 BEQ LOOP3
0580 LDA DATFDC
0581 STA ,X+
0582 LOOP3 LDB CMDFDC
0583 BITB #$01
0584 BNE LOOP2
0585 BITB #$2C
0586 BEQ LOOP4
0587 RTS
0588 *
0589 LOOP4 LDX #$C000
0590 STX $0A,U
0591 TFR U,S
0592 RTI
0593 *
0594 DELAY LDB #$04
0595 LOOP5 DECB
0596 BNE LOOP5
0597 RTS
0598 ENDIF MFDCOPT
0598 ENDIF MFDCOPT
0599 *
0600 IFD DMAFOPT
0601 *
0602 *** "D" DISK BOOT FOR DMAF2 ***
0603 *
0604 DBOOT LDA #$DE
0605 STA DRVREG
0606 LDA #$FF
0607 STA PRIREG $FAF8
0608 STA CCREG
0609 STA AAAREG
0610 STA BBBREG
0611 TST CCREG
0612 LDA #$D8
0613 STA COMREG
0614 LBSR DLY
0615 DBOOT0 LDA COMREG
0616 BMI DBOOT0
0617 LDA #$09
0618 STA COMREG
0619 LBSR DLY
0620 *
0621 DISKWT LDA COMREG FETCH DRIVE STATUS
0622 BITA #1 TEST BUSY BIT
0623 BNE DISKWT LOOP UNTIL NOT BUSY
0624 *
0625 BITA #$10
0626 BNE DBOOT
0627 *
0628 LDX #$C000 LOGICAL ADDR. = $C000
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0630 ORA #$10
0631 STA CCCREG
0632 TFR X,D
0633 COMA ;
0634 COMB ;
0635 STD ADDREG
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100
0637 STX CNTREG STORE IN COUNT REGISTER
0638 LDA #$FF LOAD THE CHANNEL REGISTER
0639 STA CCREG
0640 LDA #$FE SET CHANNEL 0
0641 STA PRIREG
0642 LDA #1 SET SECTOR TO "1"
0643 STA SECREG ISSUE COMMAND
0644 LDA #$8C SET SINGLE SECTOR READ
0645 STA COMREG ISSUE COMMAND
0646 BSR DLY
0647 *
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0652 * IS STILL A ONE THE BOOT OPERATION WILL
0653 * BE STARTED OVER FROM THE BEGINING.
0654 *
0655 CLRB ;
0656 DBOOT1 PSHS B $FB55
0657 CLRB ;
0658 DBOOT2 TST CCREG
0659 BPL DBOOT3
0660 DECB ;
0661 BNE DBOOT2
0662 PULS B
0663 DECB
0664 BNE DBOOT1
0665 BRA DBOOT
0666 DBOOT3 PULS B
0667 LDA COMREG
0668 BITA #$1C
0669 BEQ DBOOT4
0670 RTS ;
0671 *
0672 *
0673 DBOOT4 LDB #$DE
0674 STB DRVREG
0675 LDX #$C000
0676 STX 10,U
0677 TFR U,S $FB7B
0678 RTI ;
0679 ENDIF DMAFOPT
0679 ENDIF DMAFOPT
0680 *
0681 IFD CF8OPT
0682 *
0683 * COMPACT FLASH BOOT
0684 *
0685 F9D5 8D 40 CFBOOT BSR WAITRDY
0686 F9D7 86 E0 LDA #HEADLBA
0687 F9D9 B7 E0 46 STA CF_HEAD
0688 F9DC 8D 39 BSR WAITRDY
0689 F9DE 86 01 LDA #FEAT8BIT
0690 F9E0 B7 E0 41 STA CF_FEATURE
0691 F9E3 86 EF LDA #CMDFEATURE
0692 F9E5 B7 E0 47 STA CF_COMAND
0693 F9E8 8D 2D BSR WAITRDY
0694 *
0695 * READ SECTORS FROM CF
0696 *
0697 F9EA 86 01 CFREAD LDA #$01
0698 F9EC B7 E0 42 STA CF_SECCNT
0699 F9EF 4F CLRA
0700 F9F0 B7 E0 43 STA CF_SECNUM
0701 F9F3 B7 E0 44 STA CF_CYLLO
0702 F9F6 B7 E0 45 STA CF_CYLHI
0703 *
0704 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE
0705 F9FB B7 E0 47 STA CF_COMAND
0706 F9FE 8D 17 BSR WAITRDY
0707 FA00 8E C0 00 LDX #$C000
0708 *
0709 * READ LOOP
0710 *
0711 FA03 8D 21 RDLOOP BSR WAITDRQ
0712 FA05 B6 E0 40 LDA CF_DATA
0713 FA08 A7 80 STA ,X+
0714 FA0A 8C C2 00 CMPX #$C200
0715 FA0D 26 F4 BNE RDLOOP
0716 *
0717 FA0F 8E C0 00 LDX #$C000
0718 FA12 AF 4A STX $0A,U
0719 FA14 1F 34 TFR U,S
0720 FA16 3B RTI
0721 *
0722 * WAIT UNTIL READY
0723 *
0724 FA17 B6 E0 47 WAITRDY LDA CF_STATUS
0725 FA1A 85 80 BITA #BUSY
0726 FA1C 26 F9 BNE WAITRDY
0727 FA1E B6 E0 47 LDA CF_STATUS
0728 FA21 85 40 BITA #DRDY
0729 FA23 27 F2 BEQ WAITRDY
0730 FA25 39 RTS
0731 *
0732 * WAIT FOR DATA REQUEST
0733 *
0734 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS
0735 FA29 85 08 BITA #DRQ
0736 FA2B 27 F9 BEQ WAITDRQ
0737 FA2D 39 RTS
0738 ENDIF CF8OPT
0739 *
0740 IFD IDEOPT
0741 *
0742 * XESS 16 BIT IDE BOOT
0743 *
0744 IDEBOOT LDD #AUXRESET
0745 STD CF_AUX
0746 LDD #AUXRSTREL
0747 STD CF_AUX
0748 LDD #HEADLBA
0749 STD CF_HEAD
0750 BSR WAITRDY
0751 *
0752 * READ SECTORS FROM CF
0753 *
0754 LDD #$01
0755 STD CF_SECCNT
0756 CLRB
0757 STD CF_SECNUM
0758 STD CF_CYLLO
0759 STD CF_CYLHI
0760 *
0761 LDB #CMDREAD ; IDE READ MULTIPLE
0762 STD CF_COMAND
0763 BSR WAITRDY
0764 LDX #$C000
0765 *
0766 * READ LOOP
0767 *
0768 RDLOOP BSR WAITDRQ
0769 LDD CF_DATA
0770 STB ,X+
0771 CMPX #$C100
0772 BNE RDLOOP
0773 *
0774 LDX #$C000
0775 STX $0A,U
0776 TFR U,S
0777 RTI
0778 *
0779 * WAIT UNTIL READY
0780 *
0781 WAITRDY LDD CF_STATUS
0782 BITB #BUSY
0783 BNE WAITRDY
0784 LDD CF_STATUS
0785 BITB #DRDY
0786 BEQ WAITRDY
0787 RTS
0788 *
0789 * WAIT FOR DATA REQUEST
0790 *
0791 WAITDRQ LDD CF_STATUS
0792 BITB #DRQ
0793 BEQ WAITDRQ
0794 RTS
0795 ENDIF IDEOPT
0795 ENDIF IDEOPT
0796 *
0797 IFD RTCOPT
0798 *
0799 * CLOCK INTER FACE UTILITY
0800 *
0801 * TIME <Hours> <Minuits> <Seconds>
0802 * If no argument is specified, the current time
0803 * will be displayed.
0804 *
0805 * READ A REGISTER FROM THE COUNTER.
0806 * The X Index rgister points to the register
0807 * to be read. The Status Register is checked
0808 * before and after the register is read before
0809 * returning a value in accumulator A
0810 *
0811 RDCLK TST CLKSTA
0812 BNE RDCLK
0813 RDCLK1 LDA 0,X
0814 TST CLKSTA
0815 BNE RDCLK1
0816 RTS
0817 *
0818 * MAIN PROGRAM:
0819 *
0820 TIMSET LDX #COUNTR POINT TO TIMER
0821 LBSR BYTE READ HOURS
0822 BVS SHOWTM NO ARG, DISP TIME
0823 STA HOUR,X
0824 LBSR OUT1S
0825 LBSR BYTE READ MINUITES
0826 BVS SHOWTM
0827 STA MINUIT,X
0828 LBSR OUT1S
0829 LBSR BYTE SECONDS.
0830 BVS SHOWTM
0831 STA SECOND,X
0832 *
0833 * DISPLAY CURRENT TIME
0834 *
0835 SHOWTM LBSR PCRLF
0836 LDX #COUNTR+HOUR
0837 LDB #3
0838 SHOWLP BSR RDCLK
0839 LBSR OUT2H
0840 LDA #':
0841 LBSR OUTCH
0842 LEAX -1,X
0843 DECB
0844 BNE SHOWLP
0845 RTS
0846 *
0847 * INITIATE CLOCK.
0848 * MASK INTERRUPTS.
0849 *
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
0851 TST CINTSR CLEAR ANY INTERRUPTS
0852 RTS
0853 ENDIF RTCOPT
0853 ENDIF RTCOPT
0854 IFD DATOPT
0855 *
0856 ***** LRA LOAD REAL ADDRESS *****
0857 *
0858 * THE FOLLOWING CODE LOADS THE 20-BIT
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE
0860 * INTO THE "A" AND "X" REGISTERS. THIS
0861 * ROUTINE IS ENTERED WITH THE LOGICAL
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0863 * REGISTER. EXIT IS MADE WITH THE HIGH-
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0865 * ADDRESS IN THE "A" REGISTER, AND THE
0866 * LOW-ORDER 16-BITS OF THE 20-BIT
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0868 * ALL OTHER REGISTERS ARE PRESERVED.
0869 * THIS ROUTINE IS REQUIRED SINCE THE
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0871 * PRESENT PHYSICAL ADDRESSES ON THE
0872 * SYSTEM BUS.
0873 *
0874 FA2E 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
0875 FA30 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
0876 FA32 44 LSRA ;
0877 FA33 44 LSRA ADJ FOR INDEXED INTO
0878 FA34 44 LSRA CORRESPONDING LOCATION
0879 FA35 44 LSRA IN LRA TABLE
0880 FA36 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
0881 FA3A E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
0882 FA3C 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
0883 FA3D 54 LSRB PHYSICAL ADDRESS.
0884 FA3E 54 LSRB EXTENDED MS 4-BITS ARE RETURNED
0885 FA3F 54 LSRB IN THE "A" ACCUMULATOR
0886 FA40 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
0887 FA42 E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
0888 FA44 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0889 FA45 58 ASLB ADJ DATA FOR RELOCATION IN X REG
0890 FA46 58 ASLB ;
0891 FA47 58 ASLB $FB97
0892 FA48 58 ASLB ;
0893 FA49 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
0894 FA4B 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
0895 FA4D A7 62 STA 2,S SAVE IT IN X REG ON STACK
0896 FA4F EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
0897 *
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0899 FA51 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
0900 * ON STACK
0901 FA53 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK
0902 ENDIF DATOPT
0903 *
0904 * DELAY LOOP
0905 *
0906 FA55 34 04 DLY PSHS B SAVE CONTENTS OF "B"
0907 FA57 C6 20 LDB #$20 GET LOOP DELAY VALUE
0908 FA59 5A SUB1 DECB SUBTRACT ONE FROM VALUE
0909 FA5A 26 FD BNE SUB1 LOOP UNTIL ZERO
0910 FA5C 35 84 PULS B,PC RESTORE CONTENTS OF "B"
0911 * RTS ;
0912 *
0913 ***** "L" LOAD MIKBUG TAPE *****
0914 *
0915 FA5E BD FC DF LOAD JSR ACINIZ
0916 FA61 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
0917 FA63 17 02 64 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
0918 FA66 7F DF E2 CLR ECHO TURN OFF ECHO FLAG
0919 FA69 17 02 26 LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
0920 FA6C 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
0921 FA6E 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
0922 FA70 17 02 1F LBSR ECHON
0923 FA73 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
0924 FA75 27 3D BEQ LOAD21 IF SO, EXIT LOAD
0925 FA77 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
0926 FA79 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
0927 FA7B 17 01 A8 LBSR BYTE INPUT BYTE COUNT
0928 FA7E 34 02 PSHS A PUSH COUNT ON STACK
0929 FA80 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
0930 FA82 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
0931 FA85 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
0932 FA87 34 10 PSHS X PUSH ADDR ON STACK
0933 FA89 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
0934 FA8B EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
0935 FA8D EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
0936 FA8F 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
0937 FA91 6A E4 DEC ,S ADDRESS BYTES.
0938 FA93 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
0939 FA95 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
0940 FA98 35 04 PULS B POP CHECKSUM FROM STACK
0941 FA9A 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
0942 FA9C 34 02 PSHS A PUSH DATA BYTE ON STACK
0943 FA9E EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
0944 FAA0 6A E4 DEC ,S DECREMENT BYTE COUNT 1
0945 FAA2 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
0946 FAA4 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
0947 FAA6 20 EB BRA LOAD10 GET NEXT DATA BYTE
0948 FAA8 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
0949 FAA9 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
0950 FAAB C1 FF CMPB #$FF CHECKSUM OK?
0951 FAAD 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
0952 FAAF 86 3F LDA #'? LOAD (?) ERROR INDICATOR
0953 FAB1 17 02 16 LBSR OUTCH OUTPUT IT TO TERMINAL
0954 FAB4 73 DF E2 LOAD21 COM ECHO TURN ECHO ON
0955 FAB7 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
0956 FAB9 16 02 0E LBRA OUTCH OUTPUT IT
0957 *
0958 ***** "P" PUNCH MIKBUG TAPE *****
0959 *
0960 FABC 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
0961 FABE 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
0962 FAC1 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
0963 FAC3 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
0964 FAC5 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
0965 FAC7 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
0966 FAC9 30 01 LEAX 1,X INCREMENT END ADDRESS
0967 FACB AF E4 STX ,S STORE END ADDR ON STACK
0968 FACD BD FC DF JSR ACINIZ
0969 FAD0 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
0970 FAD2 17 01 F5 LBSR OUTCH OUTPUT IT TO TERMINAL
0971 FAD5 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
0972 FAD7 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
0973 FAD9 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
0974 FADB 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
0975 FADF 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
0976 FAE1 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
0977 FAE3 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
0978 FAE5 8E FE EF LDX #MSG20 POINT TO MSG "S1"
0979 FAE8 17 00 2F LBSR PSTRNG PRINT MSG
0980 FAEB CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
0981 FAED 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
0982 FAEF 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
0983 FAF2 AE 62 LDX 2,S LOAD BEGIN ADDRESS
0984 FAF4 17 01 68 LBSR OUT4H PUNCH ADDRESS
0985 FAF7 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
0986 FAF9 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
0987 FAFB EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
0988 FAFD A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
0989 FAFF 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
0990 FB02 6A 64 DEC 4,S DECREMENT BYTE COUNT
0991 FB04 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
0992 FB06 53 COMB 1's COMPLIMENT CHECKSUM BYTE
0993 FB07 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
0994 FB09 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
0995 FB0C AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
0996 FB0E AC E4 CMPX ,S COMPARE IT TO END ADDR
0997 FB10 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
0998 FB12 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
0999 FB14 17 01 B3 LBSR OUTCH OUTPUT IT
1000 FB17 32 65 LEAS 5,S READJUST STACK POINTER
1001 FB19 39 RTS ;
1002 *
1003 * PRINT STRING PRECEEDED BY A CR & LF.
1004 *
1005 FB1A 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1006 FB1C 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1007 *
1008 * PCRLF
1009 *
1010 FB1E 34 10 PCRLF PSHS X SAVE IX
1011 FB20 8E FE A0 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1012 FB23 17 00 69 LBSR PDATA PRINT MSG
1013 FB26 35 90 PULS X,PC RESTORE IX & RETURN
1014 *
1015 * LONG BRANCHES TO COMMON ROUTINES
1016 *
1017 FB28 16 01 9D JOUT1S LBRA OUT1S
1018 FB2B 16 00 F8 JBYTE LBRA BYTE
1019 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR
1020 *
1021 * ALTER "PC" PROGRAM COUNTER
1022 *
1023 FB31 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1024 FB34 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1025 FB36 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1026 FB38 29 02 BVS ALTPCD EXIT IF INVALID HEX
1027 FB3A AF 4A STX 10,U POKE IN NEW CONTENTS
1028 FB3C 39 ALTPCD RTS ;
1029 *
1030 * ALTER "U" USER STACK POINTER
1031 *
1032 FB3D 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1033 FB3F 8D E7 BSR JOUT1S OUTPUT SPACE
1034 FB41 8D EB BSR JIN1ADR
1035 FB43 29 02 BVS ALTUD
1036 FB45 AF 48 STX 8,U
1037 FB47 39 ALTUD RTS ;
1038 *
1039 * ALTER "Y" INDEX REGISTER
1040 *
1041 FB48 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1042 FB4A 8D DC BSR JOUT1S OUTPUT SPACE
1043 FB4C 8D E0 BSR JIN1ADR
1044 FB4E 29 02 BVS ALTYD
1045 FB50 AF 46 STX 6,U $F8F0
1046 FB52 39 ALTYD RTS ;
1047 *
1048 * ALTER "X" INDEX REGISTER
1049 *
1050 FB53 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1051 FB55 8D D1 BSR JOUT1S OUTPUT SPACE
1052 FB57 8D D5 BSR JIN1ADR
1053 FB59 29 02 BVS ALTXD
1054 FB5B AF 44 STX 4,U
1055 FB5D 39 ALTXD RTS ;
1056 *
1057 * ALTER "DP" DIRECT PAGE REGISTER
1058 *
1059 FB5E 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1060 FB60 8D C6 BSR JOUT1S OUTPUT SPACE
1061 FB62 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1062 FB64 29 02 BVS ALTDPD
1063 FB66 A7 43 STA 3,U
1064 FB68 39 ALTDPD RTS ;
1065 *
1066 * ALTER "B" ACCUMULATOR
1067 *
1068 FB69 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1069 FB6B 8D BB BSR JOUT1S OUTPUT SPACE
1070 FB6D 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1071 FB6F 29 02 BVS ALTBD
1072 FB71 A7 42 STA 2,U
1073 FB73 39 ALTBD RTS $F91C
1074 *
1075 * ALTER "A" ACCUMULATOR
1076 *
1077 FB74 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1078 FB76 8D B0 BSR JOUT1S OUTPUT SPACE
1079 FB78 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1080 FB7A 29 02 BVS ALTAD
1081 FB7C A7 41 STA 1,U
1082 FB7E 39 ALTAD RTS ;
1083 *
1084 * ALTER "CC" REGISTER
1085 *
1086 FB7F 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1087 FB81 8D A5 BSR JOUT1S OUTPUT SPACE
1088 FB83 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1089 FB85 29 04 BVS ALTCCD
1090 FB87 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1091 FB89 A7 C4 STA ,U
1092 FB8B 39 ALTCCD RTS ;
1093 *
1094 * PDATA
1095 *
1096 FB8C 17 01 3B PRINT LBSR OUTCH
1097 FB8F A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1098 FB91 81 04 CMPA #4 IS IT EOT?
1099 FB93 26 F7 BNE PRINT IF NOT EOT PRINT IT
1100 FB95 39 RTS ;
1101 *
1102 * PRINT REGISTERS
1103 *
1104 FB96 8E FE B2 PRTSP LDX #MSG10 POINT TO MSG "SP="
1105 FB99 8D F4 BSR PDATA PRINT MSG
1106 FB9B 1F 31 TFR U,X
1107 FB9D 16 00 BF JOUT4H LBRA OUT4H
1108 *
1109 FBA0 8E FE BE PRTUS LDX #MSG12 POINT TO MSG "US="
1110 FBA3 8D EA BSR PDATA PRINT MSG
1111 FBA5 AE 48 LDX 8,U
1112 FBA7 20 F4 BRA JOUT4H
1113 *
1114 FBA9 8E FE D0 PRTDP LDX #MSG15 POINT TO MSG "DP="
1115 FBAC 8D E1 BSR PDATA PRINT MSG
1116 FBAE A6 43 LDA 3,U
1117 FBB0 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1118 *
1119 FBB3 8E FE CA PRTIX LDX #MSG14 POINT TO MSG "IX="
1120 FBB6 8D D7 BSR PDATA PRINT MSG
1121 FBB8 AE 44 LDX 4,U $FCE6
1122 FBBA 20 E1 BRA JOUT4H
1123 *
1124 FBBC 8E FE C4 PRTIY LDX #MSG13 POINT TO MSG "IY="
1125 FBBF 8D CE BSR PDATA PRINT MSG
1126 FBC1 AE 46 LDX 6,U
1127 FBC3 20 D8 BRA JOUT4H
1128 *
1129 FBC5 8E FE B8 PRTPC LDX #MSG11 POINT TO MSG "PC="
1130 FBC8 8D C5 BSR PDATA PRINT MSG
1131 FBCA AE 4A LDX 10,U
1132 FBCC 20 CF BRA JOUT4H
1133 *
1134 FBCE 8E FE D6 PRTA LDX #MSG16 POINT TO MSG "A="
1135 FBD1 8D BC BSR PDATA PRINT MSG
1136 FBD3 A6 41 LDA 1,U
1137 FBD5 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1138 *
1139 FBD7 8E FE DB PRTB LDX #MSG17 POINT TO MSG "B="
1140 FBDA 8D B3 BSR PDATA PRINT MSG
1141 FBDC A6 42 LDA 2,U
1142 FBDE 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1143 *
1144 FBE0 8E FE E0 PRTCC LDX #MSG18 POINT TO MSG "CC:"
1145 FBE3 8D AA BSR PDATA PRINT MSG
1146 FBE5 A6 C4 LDA ,U
1147 FBE7 8E FE E7 LDX #MSG19 POINT TO MSG "EFHINZVC"
1148 FBEA 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1149 *
1150 * "R" DISPLAY REGISTERS
1151 *
1152 FBED 8E FE AE REGSTR LDX #MSG5 POINT TO MSG " - "
1153 FBF0 17 FF 27 LBSR PSTRNG PRINT MSG
1154 FBF3 8D A1 BSR PRTSP $FCBF
1155 FBF5 8D A9 BSR PRTUS $FCCA
1156 FBF7 8D B0 BSR PRTDP $FCD5
1157 FBF9 8D B8 BSR PRTIX $FCE0
1158 FBFB 8D BF BSR PRTIY $FCEB
1159 FBFD 8E FE AE LDX #MSG5 POINT TO MSG " - "
1160 FC00 17 FF 17 LBSR PSTRNG PRINT MSG
1161 FC03 8D C0 BSR PRTPC $FCF5
1162 FC05 8D C7 BSR PRTA $FCFF
1163 FC07 8D CE BSR PRTB $FD09
1164 FC09 20 D5 BRA PRTCC $FD13
1165 *
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1171 * ADDRESS IS INPUT.
1172 *
1173 FC0B 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1174 FC0D 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1175 FC0F 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1176 FC11 86 2D LDA #'-
1177 FC13 17 00 B4 LBSR OUTCH PRINT " - "
1178 *
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1182 *
1183 FC16 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1184 FC18 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1185 FC1A 1F 01 TFR D,X
1186 FC1C 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1187 FC1E 29 3C BVS NOTHEX
1188 FC20 34 10 PSHS X
1189 FC22 A7 61 STA 1,S
1190 FC24 35 90 PULS X,PC
1191 *
1192 ***** INPUT BYTE (2 HEX CHAR.) *****
1193 *
1194 FC26 8D 11 BYTE BSR INHEX GET HEX LEFT
1195 FC28 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1196 FC2A 48 ASLA ;
1197 FC2B 48 ASLA ;
1198 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE
1199 FC2D 48 ASLA ;
1200 FC2E 1F 89 TFR A,B PUT HEXL IN "B"
1201 FC30 8D 07 BSR INHEX GET HEX RIGHT
1202 FC32 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1203 FC34 34 04 PSHS B PUSH HEXL ON STACK
1204 FC36 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1205 FC38 39 RTS RETURN WITH HEX L&R IN "A"
1206 *
1207 *
1208 FC39 8D 57 INHEX BSR ECHON INPUT ASCII CHAR.
1209 FC3B 81 30 CMPA #'0 IS IT > OR = "0" ?
1210 FC3D 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1211 FC3F 81 39 CMPA #'9 IS IT < OR = "9" ?
1212 FC41 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1213 FC43 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1214 FC45 39 RTS ;
1215 *
1216 *
1217 FC46 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1218 FC48 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1219 FC4A 81 46 CMPA #'F IS IT < OR = "F" ?
1220 FC4C 22 03 BHI INHEXL IF > IT AIN'T HEX
1221 FC4E 80 37 SUBA #$37 ASCII ADJ. ALPHA
1222 FC50 39 RTS ;
1223 *
1224 FC51 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1225 FC53 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1226 FC55 81 66 CMPA #'f IS IT < "f"
1227 FC57 22 03 BHI NOTHEX IF > IT AIN'T HEX
1228 FC59 80 57 SUBA #$57 ADJUST TO LOWER CASE
1229 FC5B 39 RTS ;
1230 *
1231 *
1232 FC5C 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1233 FC5E 39 RTS ;
1234 *
1235 *
1236 FC5F 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1237 FC61 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1238 FC63 8D 02 BSR OUTHL OUTPUT HEX LEFT
1239 FC65 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1240 FC67 OUTHL EQU *
1241 FC67 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1242 FC69 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1243 FC6A 44 LSRA ;
1244 FC6B 44 LSRA ;
1245 FC6C 44 LSRA ;
1246 FC6D 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1247 FC6F 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1248 FC71 84 0F ANDA #$0F STRIP LEFT NIBBLE
1249 FC73 8B 30 XASCII ADDA #$30 ASCII ADJ
1250 FC75 81 39 CMPA #$39 IS IT < OR = "9" ?
1251 FC77 2F 02 BLE OUTC IF LESS, OUTPUT IT
1252 FC79 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1253 FC7B 20 4D OUTC BRA OUTCH OUTPUT CHAR
1254 *
1255 * BINARY / ASCII --- THIS ROUTINE
1256 * OUTPUTS A BYTE IN ENHANCED
1257 * BINARY FORMAT. THE ENHANCEMENT
1258 * IS DONE BY SUBSTITUTING ASCII
1259 * LETTERS FOR THE ONES IN THE BYTE.
1260 * THE ASCII ENHANCEMENT LETTERS
1261 * ARE OBTAINED FROM THE STRING
1262 * POINTED TO BY THE INDEX REG. "X".
1263 *
1264 FC7D 34 02 BIASCI PSHS A SAVE "A" ON STACK
1265 FC7F C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1266 FC81 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1267 FC83 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1268 FC85 25 02 BCS PRTBA IF ONE PRINT LETTER
1269 FC87 86 2D LDA #'- IF ZERO PRINT "-"
1270 FC89 8D 3F PRTBA BSR OUTCH PRINT IT
1271 FC8B 8D 3B BSR OUT1S PRINT SPACE
1272 FC8D 5A DECB SUB 1 FROM #BITS YET TO PRINT
1273 FC8E 26 F1 BNE OUTBA
1274 FC90 35 82 PULS A,PC
1275 *
1276 IFD EXTOPT
1277 *
1278 * EXTENDED USER COMMANDS
1279 *
1280 USRCMD JMP [MONEXT+EXTCMD]
1281 ENDIF EXTOPT
1281 ENDIF EXTOPT
1282 *
1283 *
1284 FC92 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ?
1285 FC95 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1286 *
1287 * INCHE
1288 *
1289 * ---GETS CHARACTER FROM TERMINAL AND
1290 * ECHOS SAME. THE CHARACTER IS RETURNED
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY
1292 * BIT MASKED OFF. ALL OTHER REGISTERS
1293 * ARE PRESERVED.
1294 *
1295 FC97 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1296 FC99 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1297 FC9B 20 2D BRA OUTCH ECHO CHAR TO TERMINAL
1298 *
1299 * INCH
1300 *
1301 * GET CHARACTER FROM TERMINAL. RETURN
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1304 * IS 8 BITS AND IS NOT ECHOED.
1305 *
1306 *
1307 FC9D 34 10 INCH PSHS X SAVE IX
1308 FC9F BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1309 FCA2 A6 84 LDA ,X FETCH PORT STATUS
1310 FCA4 85 01 BITA #1 TEST READY BIT, RDRF ?
1311 IFD PS2OPT
1312 FCA6 26 09 BNE GETST1
1313 FCA8 8E E0 20 LDX #PS2KBD
1314 FCAB A6 84 LDA ,X
1315 FCAD 85 01 BITA #1
1316 ENDIF PS2OPT
1317 FCAF 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1318 FCB1 A6 01 GETST1 LDA 1,X FETCH CHAR
1319 FCB3 35 90 PULS X,PC RESTORE IX
1320 *
1321 * INCHEK
1322 *
1323 * CHECK FOR A CHARACTER AVAILABLE FROM
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1325 * FOR READ READY. ALL REGISTERS ARE
1326 * PRESERVED, AND THE "Z" BIT WILL BE
1327 * CLEAR IF A CHARACTER CAN BE READ.
1328 *
1329 *
1330 FCB5 34 02 INCHEK PSHS A SAVE A ACCUM.
1331 FCB7 A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS
1332 FCBB 85 01 BITA #1 TEST READY BIT, RDRF ?
1333 IFD PS2OPT
1334 FCBD 26 05 BNE INCHEK1
1335 FCBF B6 E0 20 LDA PS2KBD
1336 FCC2 85 01 BITA #1 TEST READY BIT< RDRF ?
1337 ENDIF PS2OPT
1338 FCC4 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1339 *
1340 FCC6 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1341 FCC8 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1342 *
1343 *
1344 * OUTCH
1345 *
1346 * OUTPUT CHARACTER TO TERMINAL.
1347 * THE CHAR. TO BE OUTPUT IS
1348 * PASSED IN THE A REGISTER.
1349 * ALL REGISTERS ARE PRESERVED.
1350 *
1351 OUTCH IFD VDUOPT
1352 FCCA 8D 45 BSR VOUTCH
1353 ENDIF VDUOPT
1354 IFD DG640OPT
1355 BSR VOUTCH
1356 ENDIF DG640OPT
1356 ENDIF DG640OPT
1357 FCCC 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1358 FCCE BE DF E0 LDX CPORT GET ADDR. OF TERMINAL
1359 FCD1 A6 84 FETSTA LDA ,X FETCH PORT STATUS
1360 FCD3 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1361 FCD5 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1362 FCD7 35 02 PULS A GET CHAR. FOR XMIT
1363 FCD9 A7 01 STA 1,X XMIT CHAR.
1364 FCDB 35 90 PULS X,PC RESTORE IX
1365 *
1366 * IO INITIALIZATION
1367 *
1368 FCDD IOINIZ EQU *
1369 IFD VDUOPT
1370 FCDD 8D 13 BSR VINIZ
1371 ENDIF VDUOPT
1372 IFD DG640OPT
1373 BSR VINIZ
1374 ENDIF DG640OPT
1374 ENDIF DG640OPT
1375 FCDF BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1376 FCE2 86 03 LDA #3 RESET ACIA PORT CODE
1377 FCE4 A7 84 STA ,X STORE IN CONTROL REGISTER
1378 FCE6 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1379 FCE8 A7 84 STA ,X STORE IN CONTROL REGISTER
1380 FCEA 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1381 FCEC 86 FF LDA #$FF TURN ON ECHO FLAG
1382 FCEE B7 DF E2 STA ECHO
1383 FCF1 39 RTS
1384 *
1385 IFD VDUOPT
1386 *
1387 ***************************************************
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1389 * *
1390 * 80 x 25 Characters
1391 *
1392 ***************************************************
1393 *
1394 ***************************************************
1395 * INITIALIZE EMULATOR *
1396 ***************************************************
1397 *
1398 FCF2 8E E0 30 VINIZ LDX #VDU
1399 FCF5 CC 00 00 LDD #0
1400 FCF8 FD DF FB STD COLADX AND ROWADX
1401 FCFB A7 02 STA VDUCOL,X
1402 FCFD E7 03 STB VDUROW,X
1403 FCFF E7 04 STB VDUOFF,X
1404 FD01 FD DF FD STD NEWROW AND ESCFLG
1405 FD04 C6 02 LDB #$02
1406 FD06 E7 01 STB VDUATT,X
1407 FD08 7F DF FE CLR ESCFLG
1408 FD0B 86 1B LDA #$1B SEND ESCAPE
1409 FD0D 8D 02 BSR VOUTCH
1410 FD0F 86 59 LDA #'Y CLEAR TO END OF SCREEN
1411 *
1412 ** VIDEO OUTPUT ROUTINE
1413 *
1414 FD11 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS
1415 FD13 8E E0 30 LDX #VDU POINT TO VDU REGISTERS
1416 *
1417 ** CHECK FOR ESCAPE SEQUENCE
1418 *
1419 FD16 7D DF FE TST ESCFLG ESCAPE ACTIVE?
1420 FD19 27 04 BEQ SOROU1 BRANCH IF NOT
1421 FD1B 8D 74 BSR ESCAPE ELSE DO ESCAPE
1422 FD1D 20 0D BRA RETURN AND RETURN
1423 *
1424 ** CHECK FOR CONTROL CHARACTERS
1425 *
1426 FD1F 81 20 SOROU1 CMPA #$20 CONTROL CODES?
1427 FD21 24 04 BHS SOROU2
1428 FD23 8D 09 BSR CONTRL BRANCH IF SO
1429 FD25 20 05 BRA RETURN
1430 *
1431 ** OUTPUT TEXT CHARACTER
1432 *
1433 FD27 A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1434 FD29 17 00 C5 LBSR NEWCOL UPDATE COLUMN
1435 *
1436 ** DISPLAY CURSOR AND RETURN
1437 *
1438 FD2C 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1439 *
1440 ***************************************************
1441 * CONTROL CODE HANDLERS *
1442 ***************************************************
1443 *
1444 FD2E 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1445 FD30 10 27 00 41 LBEQ BACKSP
1446 FD34 81 1B CMPA #$1B ESCAPE SEQUENCE?
1447 FD36 10 27 00 6C LBEQ SETESC
1448 FD3A 81 1A CMPA #$1A CTRL Z - Clear Screen
1449 FD3C 10 27 00 8E LBEQ CLRSCR
1450 FD40 81 16 CMPA #$16 CTRL ^ - Home
1451 FD42 10 27 00 45 LBEQ HOME
1452 FD46 81 0D CMPA #$D CTRL M - RETURN?
1453 FD48 10 27 00 99 LBEQ CRETN
1454 FD4C 81 0C CMPA #$0C CTRL L - CHAR RIGHT
1455 FD4E 10 27 00 2C LBEQ CHRIGHT
1456 FD52 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE
1457 FD54 10 27 00 11 LBEQ LINEUP
1458 FD58 81 0A CMPA #$0A CTRL J - LINE FEED
1459 FD5A 26 51 BNE RETESC NONE OF THESE, RETURN
1460 *
1461 ***************************************** LINE FEED
1462 *
1463 FD5C FC DF FB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1464 FD5F 5C INCB BUMP ROW
1465 FD60 C1 19 CMPB #NUMLIN SCROLL TIME?
1466 FD62 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT
1467 FD66 16 00 99 LBRA SCROLL ELSE SCROLL IT
1468 *
1469 ***************************************** LINE FEED
1470 *
1471 FD69 FC DF FB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1472 FD6C 5D TSTB AT TOP OF SCREEN ?
1473 FD6D 10 27 00 3C LBEQ RETESC Yes, Ignore
1474 FD71 5A DECB No, Decrement ROW
1475 FD72 16 00 74 LBRA NEWCUR POSITION CURSOR
1476 *
1477 *********************************** BACK SPACE
1478 *
1479 FD75 B6 DF FB BACKSP LDA COLADX
1480 FD78 27 33 BEQ RETESC RETURN
1481 FD7A 4A DECA
1482 FD7B 16 00 68 LBRA POSCOL POSITION CURSOR
1483 *
1484 *********************************** CURSOR RIGHT
1485 *
1486 FD7E B6 DF FB CHRIGHT LDA COLADX
1487 FD81 4C INCA
1488 FD82 81 50 CMPA #LINLEN
1489 FD84 10 27 00 25 LBEQ RETESC
1490 FD88 16 00 5B LBRA POSCOL
1491 *
1492 *********************************** CURSOR RIGHT
1493 *
1494 FD8B CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1495 FD8E 16 00 58 LBRA NEWCUR
1496 *
1497 ***************************************************
1498 * ESCAPE HANDLERS *
1499 ***************************************************
1500 *
1501 FD91 F6 DF FE ESCAPE LDAB ESCFLG GET FLAG
1502 FD94 C1 3D CMPB #'= SETTING CURSOR?
1503 FD96 27 16 BEQ ESCCUR BRANCH IF SO
1504 FD98 81 59 CMPA #'Y CLEAR TO END OF SCREEN?
1505 FD9A 10 27 00 6E LBEQ ESCCLS
1506 FD9E 81 54 CMPA #'T CLEAR TO END OF LINE?
1507 FDA0 27 31 BEQ ESCCLL
1508 FDA2 81 3D CMPA #'= STARTING CURSOR SET?
1509 FDA4 26 04 BNE CLRESC BRANCH IF NOT
1510 *
1511 ***************************** START ESCAPE SEQUENCE
1512 *
1513 FDA6 B7 DF FE SETESC STAA ESCFLG ELSE START CURSORING
1514 FDA9 39 RTS AND RETURN
1515 *
1516 FDAA 7F DF FE CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1517 FDAD 39 RETESC RTS SO RETURN
1518 *
1519 ********************************* SET SCREEN CURSOR
1520 *
1521 FDAE 7D DF FD ESCCUR TST NEWROW ROW SET?
1522 FDB1 26 04 BNE ESCCU1 BRANCH IF SO
1523 FDB3 B7 DF FD STAA NEWROW ELSE SET NEW ROW
1524 FDB6 39 RTS AND RETURN
1525 *
1526 FDB7 7F DF FE ESCCU1 CLR ESCFLG
1527 FDBA 80 20 SUBA #$20 ADJUST COLUMN ADDRESS
1528 FDBC 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1529 FDBE 22 ED BHI RETESC NOT OK, DO NOTHING
1530 *
1531 FDC0 F6 DF FD ESCCU2 LDAB NEWROW
1532 FDC3 7F DF FD CLR NEWROW
1533 FDC6 C0 20 SUBB #$20 ADJUST TO ROW ADDRESS
1534 FDC8 C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1535 FDCA 22 E1 BHI RETESC ELSE RETURN DOING NOTHING
1536 FDCC 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO
1537 *
1538 ****************** CLEAR FROM CURSOR TO END OF LINE
1539 FDCE CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1540 FDD1 8D 16 BSR NEWCUR
1541 FDD3 B6 DF FB ESCCLL LDA COLADX
1542 FDD6 C6 20 LDB #$20 AND CLEAR CHAR
1543 FDD8 E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1544 FDDA 4C INCA
1545 FDDB A7 02 STA VDUCOL,X
1546 FDDD 81 50 CMPA #LINLEN UNTIL END OF LINE
1547 FDDF 26 F7 BNE ESCCL1
1548 FDE1 7F DF FE CLR ESCFLG
1549 FDE4 39 RTS
1550 *
1551 *********************************** CARRIAGE RETURN
1552 *
1553 FDE5 4F CRETN CLRA SET COLUMN ZERO
1554 FDE6 F6 DF FC POSCOL LDB ROWADX GET CURRENT ROW
1555 *
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN
1557 *
1558 FDE9 FD DF FB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1559 FDEC A7 02 STA VDUCOL,X SET NEW COLUMN
1560 FDEE E7 03 STB VDUROW,X SET NEW ROW
1561 FDF0 39 RTS AND RETURN
1562 *
1563 ********************* UPDATE CURRENT COLUMN AND ROW
1564 *
1565 FDF1 FC DF FB NEWCOL LDD COLADX GET ROW AND COLUMN
1566 FDF4 4C INCA BUMP COLUMN
1567 FDF5 81 50 CMPA #LINLEN ROLL?
1568 FDF7 26 F0 BNE NEWCUR BRANCH IF NOT
1569 FDF9 4F CLRA ELSE RESET TO ZERO
1570 FDFA 5C INCB AND BUMP ROW
1571 FDFB C1 19 CMPB #NUMLIN
1572 FDFD 26 EA BNE NEWCUR
1573 FDFF 5A DECB BOTTOM ROW
1574 FE00 8D E7 BSR NEWCUR
1575 *
1576 ********************************* SCROLL THE SCREEN
1577 *
1578 FE02 E6 04 SCROLL LDB VDUOFF,X
1579 FE04 5C INCB
1580 FE05 C1 19 CMPB #NUMLIN
1581 FE07 25 01 BLO SCROL1
1582 FE09 5F CLRB
1583 FE0A E7 04 SCROL1 STB VDUOFF,X
1584 *
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN
1586 *
1587 FE0C F6 DF FB ESCCLS LDB COLADX GET CURSOR
1588 FE0F 86 20 LDA #$20 GET A SPACE
1589 FE11 F7 DF FB ESCCLS1 STB COLADX
1590 FE14 E7 02 STB VDUCOL,X
1591 FE16 A7 84 STA VDUCHR,X
1592 FE18 5C INCB
1593 FE19 C1 50 CMPB #LINLEN
1594 FE1B 26 F4 BNE ESCCLS1
1595 *
1596 FE1D F6 DF FC LDB ROWADX
1597 FE20 5C INCB
1598 FE21 C1 19 CMPB #NUMLIN
1599 FE23 27 08 BEQ ESCCLS2
1600 FE25 F7 DF FC STB ROWADX
1601 FE28 E7 03 STB VDUROW,X
1602 FE2A 5F CLRB
1603 FE2B 20 E4 BRA ESCCLS1
1604 *
1605 FE2D 5F ESCCLS2 CLRB
1606 FE2E F7 DF FB STB COLADX
1607 FE31 E7 02 STB VDUCOL,X
1608 FE33 F7 DF FE STB ESCFLG
1609 FE36 39 RTS
1610 ENDIF VDUOPT
1611 *
1612 IFD DG640OPT
1613 ***************************************************
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1615 * *
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1619 * 16x64 BOARD). *
1620 ***************************************************
1621
1622 ***************************************************
1623 * INITIALIZE EMULATOR *
1624 ***************************************************
1625
1626 VINIZ LDX #0
1627 STX COLADX AND ROWADX
1628 STX NEWROW AND ESCFLG
1629 LDX #SCREEN POINT TO SCREEN
1630 STX CURSOR SET PROGRAM CURSOR
1631 LDA #$1B SEND ESCAPE
1632 BSR VOUTCH
1633 LDA #'Y CLEAR TO END OF SCREEN
1634 *
1635 ** VIDEO OUTPUT ROUTINE
1636 *
1637 VOUTCH PSHS A,B,X SAVE REGISTERS
1638 *
1639 ** CLEAR CURSOR
1640 LDX CURSOR
1641 LDB 0,X
1642 ANDB #$7F
1643 STB 0,X
1644 *
1645 ** CHECK FOR ESCAPE SEQUENCE
1646 TST ESCFLG ESCAPE ACTIVE?
1647 BEQ SOROU1 BRANCH IF NOT
1648 BSR ESCAPE ELSE DO ESCAPE
1649 BRA RETURN AND RETURN
1650 *
1651 ** CHECK FOR CONTROL CHARACTERS
1652 SOROU1 CMPA #$20 CONTROL CODES?
1653 BHS SOROU2
1654 BSR CONTRL BRANCH IF SO
1655 BRA RETURN
1656 *
1657 ** OUTPUT TEXT CHARACTER
1658 SOROU2 LDX CURSOR ELSE GET CURSOR
1659 STAA 0,X DISPLAY CHARACTER
1660 LBSR NEWCOL UPDATE COLUMN
1661 *
1662 ** DISPLAY CURSOR AND RETURN
1663 RETURN LDX CURSOR AND DISPLAY IT
1664 LDB ,X
1665 ORAB #$80 WITH REVID
1666 STB ,X
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1668
1669 ***************************************************
1670 * CONTROL CODE HANDLERS *
1671 ***************************************************
1672
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1674 LBEQ BACKSP
1675 CMPA #$1B ESCAPE SEQUENCE?
1676 LBEQ SETESC
1677 CMPA #$D CTRL M - RETURN?
1678 LBEQ CRETN
1679 CMPA #$0A CTRL J - LINE FEED
1680 BNE RETESC NONE OF THESE, RETURN
1681
1682 ***************************************** LINE FEED
1683
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1685 INCB BUMP ROW
1686 CMPB #NUMLIN SCROLL TIME?
1687 LBNE NEWCUR POSITION CURSOR IF NOT
1688 LBRA SCROLL ELSE SCROLL IT
1689
1690 ***************************************** LINE FEED
1691
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1693 TSTB AT TOP OF SCREEN ?
1694 BEQ RETESC Yes, Ignore
1695 DECB No, Decrement ROW
1696 LBRA NEWCUR POSITION CURSOR
1697
1698
1699 *********************************** BACK SPACE
1700
1701 BACKSP LDA COLADX
1702 BEQ RETESC RETURN
1703 DECA
1704 LBRA POSCOL POSITION CURSOR
1705
1706 *********************************** CURSOR RIGHT
1707
1708 CHRIGHT LDA COLADX
1709 INCA
1710 CMPA #LINLEN
1711 BEQ RETESC
1712 LBRA POSCOL
1713
1714 ***************************************************
1715 * ESCAPE HANDLERS *
1716 ***************************************************
1717
1718 ESCAPE LDAB ESCFLG GET FLAG
1719 CMPB #'= SETTING CURSOR?
1720 BEQ ESCCUR BRANCH IF SO
1721 CMPA #'Y CLEAR TO END OF SCREEN?
1722 LBEQ ESCCLS
1723 CMPA #'T CLEAR TO END OF LINE?
1724 BEQ ESCCLL
1725 CMPA #'E INSERT LINE?
1726 BEQ ESCINL
1727 CMPA #'R DELETE LINE?
1728 BEQ ESCDLL
1729 CMPA #'= STARTING CURSOR SET?
1730 BNE CLRESC BRANCH IF NOT
1731
1732 ***************************** START ESCAPE SEQUENCE
1733
1734 SETESC STAA ESCFLG ELSE START CURSORING
1735 RTS AND RETURN
1736
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1738 RETESC RTS SO RETURN
1739
1740 ********************************* SET SCREEN CURSOR
1741
1742 ESCCUR TST NEWROW ROW SET?
1743 BNE ESCCU1 BRANCH IF SO
1744 STAA NEWROW ELSE SET NEW ROW
1745 RTS AND RETURN
1746
1747 ESCCU1 CLR ESCFLG
1748 SUBA #$20 ADJUST COLUMN ADDRESS
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1750 BHI RETESC NOT OK, DO NOTHING
1751
1752 ESCCU2 LDAB NEWROW
1753 CLR NEWROW
1754 SUBB #$20 ADJUST TO ROW ADDRESS
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1756 BHI RETESC ELSE RETURN DOING NOTHING
1757 BRA NEWCUR GO SET NEW CURSOR IF SO
1758 *
1759 *************************** DELETE LINE FROM SCREEN
1760
1761 ESCDLL BSR CRETN GO COL. ZERO
1762 LDB ROWADX
1763 CMPB #NUMLIN-1
1764 BEQ SCROL3
1765 BRA SCROL1 AND DELETE THIS LINE
1766
1767 *************************** INSERT LINE INTO SCREEN
1768
1769 ESCINL BSR CRETN GO TO COL. ZERO
1770 LDAB ROWADX
1771 CMPB #NUMLIN-1
1772 BEQ ESCCLL
1773 *
1774 ** SCROLL SCREEN DOWN FROM CURSOR
1775 *
1776 LDX #SCREEN+SCNLEN-LINLEN
1777 ESCIN0 LDAA 0,-X
1778 STAA LINLEN,X
1779 LDA SCNLEN,X
1780 STA SCNLEN+LINLEN,X
1781 CPX CURSOR
1782 BNE ESCIN0
1783
1784 ****************** CLEAR FROM CURSOR TO END OF LINE
1785
1786 ESCCLL LDA COLADX GET CURRENT COLUMN
1787 LDX CURSOR GET CURSOR
1788 LDB #$20 AND CLEAR CHAR
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
1790 STB ,X+ CLEAR TEXT
1791 INCA
1792 CMPA #LINLEN UNTIL END OF LINE
1793 BNE ESCLL1
1794 CLR ESCFLG
1795 RTS
1796
1797 *********************************** CARRIAGE RETURN
1798
1799 CRETN CLRA SET COLUMN ZERO
1800 POSCOL LDB ROWADX GET CURRENT ROW
1801
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN
1803
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1805 LDA #LINLEN ELSE ADD A LINE
1806 MUL LINLEN * ROWADX
1807 ADDB COLADX
1808 ADCA #0
1809 ADDD #SCREEN ADD SCREEN BASE.
1810 STD CURSOR SAVE NEW CURSOR
1811 TFR D,X GET CURSOR IN X
1812 RTS AND RETURN
1813
1814 ********************* UPDATE CURRENT COLUMN AND ROW
1815
1816 NEWCOL LDD COLADX GET ROW AND COLUMN
1817 INCA BUMP COLUMN
1818 CMPA #LINLEN ROLL?
1819 BNE NEWCUR BRANCH IF NOT
1820 CLRA ELSE RESET TO ZERO
1821 INCB AND BUMP ROW
1822 CMPB #NUMLIN
1823 BNE NEWCUR
1824 DECB BOTTOM ROW
1825 BSR NEWCUR
1826
1827 ********************************* SCROLL THE SCREEN
1828
1829 SCROLL LDX #SCREEN POINT TO SCREEN
1830 SCROL1 LDA SCNLEN+LINLEN,X
1831 STA SCNLEN,X
1832 LDAA LINLEN,X MOVE TWO BYTES
1833 STAA 0,X+ UP ONE LINE
1834 CMPX #SCREEN+SCNLEN-LINLEN
1835 BNE SCROL1 LOOP UNTIL DONE
1836 BRA SCROL3
1837
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN
1839
1840 ESCCLS LDX CURSOR GET CURSOR
1841 SCROL3 LDAA #$20 GET A SPACE
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
1843 STA ,X+ AND TEXT
1844 CMPX #SCREEN+SCNLEN
1845 BNE SCROL2 UNTIL DONE
1846 CLR ESCFLG
1847 RTS
1848 ENDIF DG640OPT
1848 ENDIF DG640OPT
1849 *
1850 IFD PRTOPT
1851 *************************************
1852 *
1853 ** PRINTER DRIVER ROUTINES
1854 *
1855 *************************************
1856 *
1857 ** PINIZ - INITIATE PRINTER PORT
1858 *
1859 PINIZ PSHS B
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
1861 STD PADATA SET DDR AND SELECT DATA
1862 *
1863 ** RESET PRINTER
1864 LDB #PRESET
1865 STAB PADATA
1866 RESTLP INCB DELAY FOR RESET
1867 BNE RESTLP
1868 STAA PADATA ACCA=DIRMSK
1869 *
1870 ** INITALIZE PORT B (DATA PORT)
1871 LDAA #$2A
1872 STAA PBCTRL
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110
1874 STD PBDATA PBDREG PBCTRL
1875 *
1876 ** SELECT 66 LINES/PAGE
1877 LDAA #$1B
1878 BSR POUTCH
1879 LDAA #'C
1880 BSR POUTCH
1881 LDAA #66
1882 PULS B
1883 *************************************
1884 *
1885 ** OUTPUT A CHARACTER TO THE PRINTER
1886 *
1887 *************************************
1888 POUTCH PSHS B
1889 LDAB PBDATA CLEAR INTERRUPT BIT
1890 *
1891 ** WAIT TILL NOT BUSY
1892 BUSYLP LDAB PADATA
1893 BITB #PERROR
1894 BEQ PEXIT
1895 TSTB
1896 BMI BUSYLP
1897 *
1898 ** NOW OUTPUT CHARACTER
1899 STAA PBDATA
1900 PEXIT PULS B,PC
1901 *************************************
1902 *
1903 ** PCHK TEST IFD PRINTER READY
1904 *
1905 *************************************
1906 PCHK TST PBCTRL TEST STATE OF CRB7
1907 RTS SET ON ACKNOWLEDGE
1908 ENDIF PRTOPT
1908 ENDIF PRTOPT
1909 *************************************
1910 *
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE
1912 *
1913 *************************************
1914 *
1915 FE37 JMPTAB EQU *
1916 FE37 01 FCB 1 " ^A "
1917 FE38 FB 74 FDB ALTRA
1918 FE3A 02 FCB 2 " ^B "
1919 FE3B FB 69 FDB ALTRB
1920 FE3D 03 FCB 3 " ^C "
1921 FE3E FB 7F FDB ALTRCC
1922 FE40 04 FCB 4 " ^D "
1923 FE41 FB 5E FDB ALTRDP
1924 FE43 10 FCB $10 " ^P "
1925 FE44 FB 31 FDB ALTRPC
1926 FE46 15 FCB $15 " ^U "
1927 FE47 FB 3D FDB ALTRU
1928 FE49 18 FCB $18 " ^X "
1929 FE4A FB 53 FDB ALTRX
1930 FE4C 19 FCB $19 " ^Y "
1931 FE4D FB 48 FDB ALTRY
1932 *
1933 FE4F 42 FCC 'B'
1934 FE50 F9 5C FDB BRKPNT
1935 FE52 45 FCC 'E'
1936 FE53 F8 FD FDB MEMDUMP
1937 FE55 47 FCC 'G'
1938 FE56 F8 A5 FDB GO
1939 FE58 4C FCC 'L'
1940 FE59 FA 5E FDB LOAD
1941 FE5B 50 FCC 'P'
1942 FE5C FA BC FDB PUNCH
1943 FE5E 4D FCC 'M'
1944 FE5F F8 A8 FDB MEMCHG
1945 FE61 52 FCC 'R'
1946 FE62 FB ED FDB REGSTR
1947 FE64 53 FCC 'S'
1948 FE65 F8 F1 FDB DISSTK
1949 FE67 58 FCC 'X'
1950 FE68 F9 88 FDB XBKPNT
1951 IFD MFDCOPT
1952 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
1953 FDB MINBOOT
1954 ENDIF MFDCOPT
1954 ENDIF MFDCOPT
1955 IFD CF8OPT
1956 FE6A 44 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
1957 FE6B F9 D5 FDB CFBOOT
1958 ENDIF CF8OPT
1959 IFD IDEOPT
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
1961 FDB IDEBOOT
1962 ENDIF IDEOPT
1962 ENDIF IDEOPT
1963 IFD DMAFOPT
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
1965 FDB DBOOT
1966 ENDIF DMAFOPT
1966 ENDIF DMAFOPT
1967 IFD EXTOPT
1968 FCC 'U' *** IF FPGA, 'U' IS FOR USER
1969 FDB USRCMD
1970 ENDIF EXTOPT
1970 ENDIF EXTOPT
1971 IFD RTCOPT
1972 FCC 'T'
1973 FDB TIMSET
1974 ENDIF RTCOPT
1974 ENDIF RTCOPT
1975 IFD TRAOPT
1976 FCC "T"
1977 FDB TRACE
1978 ENDIF TRAOPT
1978 ENDIF TRAOPT
1979 *
1980 FE6D TABEND EQU *
1981 *
1982 * ** 6809 VECTOR ADDRESSES **
1983 *
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
1988 * HIS OWN ROUTINES IF HE SO DESIRES.
1989 *
1990 *
1991 FE6D F9 94 RAMVEC FDB SWIE USER-V
1992 FE6F F8 A7 FDB RTI SWI3-V
1993 FE71 F8 A7 FDB RTI SWI2-V
1994 FE73 F8 A7 FDB RTI FIRQ-V
1995 FE75 F8 A7 FDB RTI IRQ-V
1996 FE77 F9 94 FDB SWIE SWI-V
1997 FE79 FF FF FDB $FFFF SVC-VO
1998 FE7B FF FF FDB $FFFF SVC-VL
1999 *
2000 * PRINTABLE MESSAGE STRINGS
2001 *
2002 FE7D 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2003 FE82 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR '
55 47 20 31 2E 34
20 46 4F 52 20
2004 IFD S3EOPT
2005 FCC 'S3E '
2006 ENDIF S3EOPT
2006 ENDIF S3EOPT
2007 IFD B5XOPT
2008 FE93 42 35 2D 58 33 30 FCC 'B5-X300 '
30 20
2009 ENDIF B5XOPT
2010 IFD S3SOPT
2011 FCC 'S3STARTER '
2012 ENDIF S3SOPT
2012 ENDIF S3SOPT
2013 IFD ADSOPT
2014 FCC 'ADS6809 '
2015 ENDIF ADSOPT
2015 ENDIF ADSOPT
2016 IFD SWTOPT`
2017 FCC 'SWTPC '
2018 ENDIF SWTOPT
2018 ENDIF SWTOPT
2019 IFD XESOPT`
2020 FCC 'XESS '
2021 ENDIF XESOPT
2021 ENDIF XESOPT
2022 FE9B 20 2D 20 FCC ' - '
2023 FE9E 04 FCB 4
2024 FE9F 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2025 FEA6 3E MSG3 FCC '>'
2026 FEA7 04 FCB 4
2027 FEA8 57 48 41 54 3F MSG4 FCC 'WHAT?'
2028 FEAD 04 FCB 4
2029 FEAE 20 2D 20 MSG5 FCC ' - '
2030 FEB1 04 FCB 4'
2031 FEB2 20 20 53 50 3D MSG10 FCC ' SP='
2032 FEB7 04 FCB 4
2033 FEB8 20 20 50 43 3D MSG11 FCC ' PC='
2034 FEBD 04 FCB 4
2035 FEBE 20 20 55 53 3D MSG12 FCC ' US='
2036 FEC3 04 FCB 4
2037 FEC4 20 20 49 59 3D MSG13 FCC ' IY='
2038 FEC9 04 FCB 4
2039 FECA 20 20 49 58 3D MSG14 FCC ' IX='
2040 FECF 04 FCB 4
2041 FED0 20 20 44 50 3D MSG15 FCC ' DP='
2042 FED5 04 FCB 4
2043 FED6 20 20 41 3D MSG16 FCC ' A='
2044 FEDA 04 FCB 4
2045 FEDB 20 20 42 3D MSG17 FCC ' B='
2046 FEDF 04 FCB 4
2047 FEE0 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2048 FEE6 04 FCB 4
2049 FEE7 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2050 FEEF 53 31 MSG20 FCC 'S1'
2051 FEF1 04 FCB 4
2052 IFD DATOPT
2053 *
2054 * POWER UP/ RESET/ NMI ENTRY POINT
2055 *
2056 FF00 ORG $FF00
2057 *
2058 *
2059 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11
2060 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO
2061 *
2062 *
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2067 * STORED IN IT.
2068 *
2069 *
2070 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2071 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION
2072 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2073 *
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2076 * PHYSICAL ADDRESSES.
2077 *
2078 FF0A 86 F0 LDA #$F0
2079 FF0C A7 84 STA ,X STORE $F0 AT $FFFF
2080 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2081 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2082 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2083 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0
2084 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2085 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2086 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER
2087 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2088 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2089 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN
2090 *
2091 *
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2096 * IS STORED IN RAM IN THE LOCATION THAT IS
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2102 * "7" IN THE $70A0 WILL BE STORED IN
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2111 * OF RAM RESPONDS.
2112 *
2113 *
2114 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2115 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2116 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS
2117 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN
2118 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING
2119 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS
2120 FF32 44 LSRA TRANSLATION RAM.
2121 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D"
2122 *
2123 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER
2124 *
2125 *
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2133 *
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2136 *
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2139 *
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2142 *
2143 *
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2151 * MEMORY ADDRESSED AS FOLLOWS....
2152 *
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2155 *
2156 *
2157 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2158 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2159 FF40 6F 2E CLR 14,Y CLEAR $DFDE
2160 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2161 FF44 A7 2F STA 15,Y STORE AT $DFDF
2162 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2163 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2164 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2165 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2166 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2167 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2168 FF54 27 22 BEQ FINTAB SKIP IF FINISHED
2169 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2170 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2171 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2172 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION
2173 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2174 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2175 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2176 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2177 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2178 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2179 FF6E 44 LSRA
2180 FF6F 44 LSRA
2181 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2182 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2183 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2184 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2185 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2186 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE
2187 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE
2188 *
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2193 *
2194 *
2195 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C"
2196 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2197 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2198 FF86 4A DECA ELSE POINT 4K LOWER
2199 FF87 2A F9 BPL FINDC GO TRY AGAIN
2200 FF89 20 14 BRA XFERTF
2201 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2202 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2203 *
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2207 * ADDRESSES FROM $0000 AND UP....
2208 *
2209 FF8F 4F CLRA START AT ZERO
2210 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2211 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2212 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP
2213 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE
2214 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2215 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY
2216 FF9B 81 0C CMPA #$0C LAST ENTRY YET ?
2217 FF9D 2D F3 BLT COMPRS
2218 *
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2221 * THE MP-09 CPU CARD.
2222 *
2223 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2224 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE
2225 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2226 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11
2227 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE
2228 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED
2229 *
2230 ELSE
2231 LRA RTS
2232 START LDS #STACK INITIALIZE STACK POINTER
2233 CLRB
2234 ENDIF DATOPT
2234 ENDIF DATOPT
2235 *
2236 FFAB 53 COMB SET "B" NON-ZERO
2237 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG
2238 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE
2239 *
2240 ** INTERRUPT JUMP VECTORS
2241 *
2242 FFB2 6E 9F DF C0 V1 JMP [STACK]
2243 FFB6 6E 9F DF C4 V2 JMP [SWI2]
2244 FFBA 6E 9F DF C6 V3 JMP [FIRQ]
2245 FFBE 6E 9F DF C8 V4 JMP [IRQ]
2246 FFC2 6E 9F DF CA V5 JMP [SWI]
2247 *
2248 * SWI3 ENTRY POINT
2249 *
2250 FFC6 1F 43 SWI3E TFR S,U
2251 FFC8 AE 4A LDX 10,U *$FFC8
2252 FFCA E6 80 LDB ,X+
2253 FFCC AF 4A STX 10,U
2254 FFCE 4F CLRA
2255 FFCF 58 ASLB
2256 FFD0 49 ROLA
2257 FFD1 BE DF CC LDX SVCVO
2258 FFD4 8C FF FF CMPX #$FFFF
2259 FFD7 27 0F BEQ SWI3Z
2260 FFD9 30 8B LEAX D,X
2261 FFDB BC DF CE CMPX SVCVL
2262 FFDE 22 08 BHI SWI3Z
2263 FFE0 34 10 PSHS X
2264 FFE2 EC C4 LDD ,U
2265 FFE4 AE 44 LDX 4,U
2266 FFE6 6E F1 JMP [,S++]
2267 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP
2268 FFEA EE 42 LDU 2,U
2269 FFEC 6E 9F DF C2 JMP [SWI3]
2270 *
2271 * 6809 VECTORS
2272 *
2273 FFF0 ORG $FFF0
2274 FFF0 FF B2 FDB V1 USER-V
2275 FFF2 FF C6 FDB SWI3E SWI3-V
2276 FFF4 FF B6 FDB V2 SWI2-V
2277 FFF6 FF BA FDB V3 FIRQ-V
2278 FFF8 FF BE FDB V4 IRQ-V
2279 FFFA FF C2 FDB V5 SWI-V
2280 FFFC FF B2 FDB V1 NMI-V
2281 FFFE FF 00 FDB START RESTART-V
0004 END START
0005 END
Program + Init Data = 2034 bytes
Error count = 0
/sys09s3s_b16.vhd
0,0 → 1,64
INIT_00 => x"A780A610C6C0DF8E1074FE8E2EFA1AFB1EFB8FFBCEFCB9FC9BFCA1FC61F814F8",
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC65B0117E0DFBF00E08EF9265AA0",
INIT_02 => x"0317A8FE8E0C0417F62A5A19048B0327856D0DC64FD0DF8E47031784FE8E9F04",
INIT_03 => x"17408B981F5304175E86092C2081891FF1270D817F84370417B30217AFFE8E2E",
INIT_04 => x"20F00217B1FE8EF52674FE8C02300F2780E13BFE8E20C0022F60C14704174C04",
INIT_05 => x"17A4A60F0417A50317211F650217B7FE8E121F2D296B03173B341FBC2094ADC0",
INIT_06 => x"27A4A1A4A7390F260D8117275E81DD271881E127088111285E0317070417A503",
INIT_07 => x"0B031705201F30C0DF8E321FA20217BE203F31C2202131E503173F86E8031708",
INIT_08 => x"279A03170527E4AC011FF0C4201F0634F0C41000C3101F390124E1AC20340629",
INIT_09 => x"265A8E03172C031780A610C69603172E0317E4AEEE0117B7FE8E103439623203",
INIT_0a => x"29B70217BC20EE265A7703172E8602237E810425208180A610C6E1AE860317F5",
INIT_0b => x"3984A73F86A4AFA0A709273F8184A60F271035558DFFFF8E10341A24C0DF8C1E",
INIT_0c => x"4AAF0427268D1F304AAE431F39FB265A188D08C6E3DF8E104603163F86490317",
INIT_0d => x"A7A0A7A0A7FF8684A7A4A604263F8184A60A24C0DF8C21AEB9FE16480217068D",
INIT_0e => x"0186398D46E0B7E086408D393D3139F7265A0427A1ACA0A608C6E3DF8E1039A0",
INIT_0f => x"178D47E0B7208645E0B744E0B743E0B74F42E0B701862D8D47E0B7EF8641E0B7",
INIT_10 => x"E0B6F926808547E0B63B341F4AAF00C08EF42600C28C80A740E0B6218D00C08E",
INIT_11 => x"54545454A6E6D0DF8E104444444462A6363439F927088547E0B639F227408547",
INIT_12 => x"FCBD8435FD265A20C60434B63562E762EA62A70F8462A65858585853A6E6E4E7",
INIT_13 => x"0234A80117F12631813D273981230217F92653812A0217E2DF7F6802171186E3",
INIT_14 => x"E0EB02340C2904358E01170434E46AE46AE4EBE0EBE0E6103421299101172629",
INIT_15 => x"0117E26F1202161386E2DF731A02173F86BA27FFC102355FEB2080A70527E46A",
INIT_16 => x"2320008310062762A3E4ECF901171286E3FCBDE4AF0130492562AC4D2930344A",
INIT_17 => x"1780A684EB63EB62EB68011762AE750117981F03CB2F0017F8FE8E64E720C602",
INIT_18 => x"10347120028D396532B701171486C326E4AC62AF5B0117981F53F526646A6501",
INIT_19 => x"8D618D394AAF0229F68DF28D910017E50016F80016A101169035690017A9FE8E",
INIT_1a => x"498D3944AF0229D58DD18D5E8D3946AF0229E08DDC8D728D3948AF0229EB8DE7",
INIT_1b => x"8D3941A70229B18DB08D588D3942A70229BC8DBB8D6C8D3943A70229C78DC68D",
INIT_1c => x"BF0016311FF48DBBFE8E39F726048180A63F011739C4A7808A0429A68DA58D5F",
INIT_1d => x"8DCDFE8EE12044AED78DD3FE8EB4001643A6E18DD9FE8EF42048AEEA8DC7FE8E",
INIT_1e => x"D02042A6B38DE4FE8ED92041A6BC8DDFFE8ECF204AAEC58DC1FE8ED82046AECE",
INIT_1f => x"B7FE8EBF8DB88DB08DA98DA18D27FF17B7FE8E900016F0FE8EC4A6AA8DE9FE8E",
INIT_20 => x"3C29088D011F42290E8DB800172D86121F4D29098DD520CE8DC78DC08D17FF17",
INIT_21 => x"811D2530815B8D39E0AB04342829078D891F484848483229118D903561A71034",
INIT_22 => x"3439021A39578003226681072561813937800322468112254181393080032239",
INIT_23 => x"C602345120078B022F3981308B0F840235048D4444444402340235028D023510",
INIT_24 => x"207F84048D0627E2DF7D00F09F6E8235F1265A3F8D438D2D860225E46880A608",
INIT_25 => x"85E0DF9FA60234903501A6EE27018584A620E08E0926018584A6E0DFBE10342D",
INIT_26 => x"3501A70235FA27028584A6E0DFBE1234458D2086008D8235018520E0B6052601",
INIT_27 => x"A7FBDFFD0000CC30E08E39E2DFB7FF86016D84A7118684A70386E0DFBE138D90",
INIT_28 => x"8D0427FEDF7D30E08E16345986028D1B86FEDF7F01E702C6FDDFFD04E703E702",
INIT_29 => x"1A816C0027101B814100271008819635C5001784A70520098D042420810D2074",
INIT_2a => x"51260A81110027100B812C0027100C81990027100D814500271016818E002710",
INIT_2b => x"164A3327FBDFB67400165A3C0027105DFBDFFC9900168300261019C15CFBDFFC",
INIT_2c => x"2710598116273DC1FEDFF65800160000CC5B00162500271050814CFBDFB66800",
INIT_2d => x"2080FEDF7F39FDDFB70426FDDF7D39FEDF7F39FEDFB704263D81312754816E00",
INIT_2e => x"A74C84E720C6FBDFB6168D0000CC1B20E12218C120C0FDDF7FFDDFF6ED224F81",
INIT_2f => x"C15C4FF02650814CFBDFFC3903E702A7FBDFFDFCDFF64F39FEDF7FF726508102",
INIT_30 => x"2650C15C84A702E7FBDFF72086FBDFF604E75F012519C15C04E6E78D5AEA2619",
INIT_31 => x"FB0274FB0139FEDFF702E7FBDFF75FE4205F03E7FCDFF7082719C15CFCDFF6F4",
INIT_32 => x"505EFA4CA5F847FDF8455CF94248FB1953FB183DFB1531FB105EFB047FFB0369",
INIT_33 => x"94F9A7F8A7F8A7F8A7F894F992FC55D5F94488F958F1F853EDFB52A8F84DBCFA",
INIT_34 => x"52415453335320524F4620342E312047554239305359530000000A0DFFFFFFFF",
INIT_35 => x"3D5053202004202D20043F54414857043E040000000A0D4B04202D2020524554",
INIT_36 => x"20043D50442020043D58492020043D59492020043D53552020043D4350202004",
INIT_37 => x"000000000004315343565A4E4948464504203A43432020043D422020043D4120",
INIT_38 => x"300B2784AC1084AF1084EEAA558E10A0D08E84A7F086FB264A80A70F86F0FF8E",
INIT_39 => x"2DA7D0DF8E10C0DFCE10FDFFB74444444443101F84EFD620ED26A0F08C00F089",
INIT_3a => x"1084AF10AA558E1084EE2227A0F08C00F08930FB2A4AA66F0C862FA7F0862E6F",
INIT_3b => x"2EA7D0DF8E10F186D520A5A70F88891F44444444101FD0DF8E1084EFE92684AC",
INIT_3c => x"8EF32D0C814C80E7A66F0427A6E6211F4F2CE7A66F1420F92A4A0526A6E60C86",
INIT_3d => x"9F6EC6DF9F6EC4DF9F6EC0DF9F6E62F816E2DFF753F9265A80A7A0A610C6F0FF",
INIT_3e => x"0822CEDFBC8B300F27FFFF8CCCDFBE49584F4AAF80E64AAE431FCADF9F6EC8DF",
INIT_3f => x"00FFB2FFC2FFBEFFBAFFB6FFC6FFB2FFC2DF9F6E42EE1F37F16E44AEC4EC1034"
/sys09xes.lst
0,0 → 1,3782
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 NAM SYS09BUG FOR XESS
0000 INCLUDE "opt_xes.txt"
0001 *
0002 ***************************************************
0003 * OPTION SWITCHES
0004 ***************************************************
0005 *
0006 *
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0009 ** FOR LOADING AND SAVING S1 RECORDS
0010 *
0011 *S3EOPT EQU $FF SPARTAN3E STARTER
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
0014 00FF XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0017 *
0002 END
0000 INCLUDE "sys09equ.txt"
0001 *
0002 ***************************************************
0003 * MEMORY MAP EQUATES *
0004 ***************************************************
0005 E000 MONIO EQU $E000 I/O SPACE
0006 IFD S3EOPT
0007 MONRAM EQU $7FC0
0008 ELSE
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE
0010 ENDIF S3EOPT
0011 F800 MONROM EQU $F800 START OF ROM
0012 IFD S3SOPT
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0014 EXTCMD EQU $00 EXTENDED OFFSET
0015 ENDIF S3SOPT
0015 ENDIF S3SOPT
0016 IFD XESOPT
0017 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0018 0000 EXTCMD EQU $00 EXTENDED OFFSET
0019 ENDIF XESOPT
0020 ***************************************************
0021
0022 IFD S3EOPT
0023 *
0024 * DIGILENT SPARTAN 3E STARTER
0025 *
0026 ACIAOPT EQU $FF ACIA AT PORT 0
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0028 VDUOPT EQU $FF VDU AT $E030
0029 TRAOPT EQU $FF PIA TRACE TIMER
0030 ENDIF S3EOPT
0030 ENDIF S3EOPT
0031 *
0032 IFD S3SOPT
0033 *
0034 * DIGILENT SPARTAN 3 STARTER
0035 *
0036 ACIAOPT EQU $FF ACIA AT PORT 0
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0038 VDUOPT EQU $FF VDU AT $E030
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0041 EXTOPT EQU $FF EXTENDED COMMANDS
0042 ENDIF S3SOPT
0042 ENDIF S3SOPT
0043 *
0044 IFD B5XOPT
0045 *
0046 * BURCHED B5-X300
0047 *
0048 ACIAOPT EQU $FF ACIA AT PORT 0
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0050 VDUOPT EQU $FF VDU AT $E030
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0053 ENDIF B5XOPT
0053 ENDIF B5XOPT
0054 *
0055 IFD XESOPT
0056 *
0057 * XESS XSA-3S1000 & XST-3.0
0058 *
0059 00FF ACIAOPT EQU $FF ACIA AT PORT 0
0060 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0061 00FF VDUOPT EQU $FF VDU AT $E030
0062 00FF IDEOPT EQU $FF XESS IDE AT $E100
0063 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0064 00FF EXTOPT EQU $FF EXTENDED COMMANDS
0065 ENDIF XESOPT
0066 *
0067 IFD ADSOPT
0068 *
0069 * ACKERMAN DIGITAL ADS6809
0070 *
0071 DG640OPT EQU $FF DG640 VDU AT $E800
0072 *RTCOPT EQU $FF REAL TIME CLOCK
0073 PRTOPT EQU $FF PRINTER DRIVERS
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0075 ENDIF ADSOPT
0075 ENDIF ADSOPT
0076 *
0077 IFD SWTOPT
0078 *
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER
0080 *
0081 ACIAOPT EQU $FF ACIA AT PORT 0
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0085 ENDIF
0085 ENDIF
0086 *
0087 IFD ACIAOPT
0088 *
0089 ***************************************************
0090 * SERIAL PORT *
0091 ***************************************************
0092 *
0093 ** ACIA SITS ON PORT 0
0094 *
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0096 *
0097 ENDIF ACIAOPT
0098 IFD MFDCOPT
0099 *
0100 ***************************************************
0101 * MINIFLOPPY DRIVE *
0102 ***************************************************
0103 *
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0105 *
0106 DRVFDC EQU MONIO+$14
0107 CMDFDC EQU MONIO+$18
0108 SECFDC EQU MONIO+$1A
0109 DATFDC EQU MONIO+$1B
0110 ENDIF MFDCOPT
0110 ENDIF MFDCOPT
0111 IFD PS2OPT
0112 *
0113 ***************************************************
0114 * VDU8 PS/2 KEYBOARD PORT *
0115 ***************************************************
0116 *
0117 ** KEYBOARD SITS ON PORT 2
0118 *
0119 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0120 ENDIF PS2OPT
0121 IFD VDUOPT
0122 *
0123 ***************************************************
0124 * VDU8 DISPLAY DRIVER EQUATES *
0125 ***************************************************
0126 *
0127 ** VDU8 DISPLAY SITS ON PORT 3
0128 *
0129 E030 VDU EQU MONIO+$30
0130 0000 VDUCHR EQU 0 CHARACTER REGISTER
0131 0001 VDUATT EQU 1 ATTRIBUTE REGISTER
0132 0002 VDUCOL EQU 2 CURSOR COLUMN
0133 0003 VDUROW EQU 3 CURSOR ROW
0134 0004 VDUOFF EQU 4 ROW OFFSET
0135 *
0136 0050 LINLEN EQU 80 LENGTH OF A LINE
0137 0019 NUMLIN EQU 25 NUMBER OF LINES
0138 ENDIF VDUOPT
0139 *
0140 IFD CF8OPT
0141 *
0142 ***************************************************
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER *
0144 ***************************************************
0145 *
0146 ** COMPACT FLASH SITS AT PORT 4
0147 *
0148 CF_BASE EQU MONIO+$40
0149 CF_DATA EQU CF_BASE+0
0150 CF_ERROR EQU CF_BASE+1 ; read error
0151 CF_FEATURE EQU CF_BASE+1 ; write feature
0152 CF_SECCNT EQU CF_BASE+2
0153 CF_SECNUM EQU CF_BASE+3
0154 CF_CYLLO EQU CF_BASE+4
0155 CF_CYLHI EQU CF_BASE+5
0156 CF_HEAD EQU CF_BASE+6
0157 CF_STATUS EQU CF_BASE+7 ; read status
0158 CF_COMAND EQU CF_BASE+7 ; write command
0159 *
0160 * Command Equates
0161 *
0162 CMDREAD EQU $20 ; Read Single sector
0163 CMDWRITE EQU $30 ; Write Single sector
0164 CMDFEATURE EQU $EF
0165 FEAT8BIT EQU $01 ; enable 8 bit transfers
0166 HEADLBA EQU $E0
0167 *
0168 * Status bit equates
0169 *
0170 BUSY EQU $80
0171 DRDY EQU $40
0172 DRQ EQU $08
0173 ERR EQU $01
0174 *
0175 ENDIF CF8OPT
0175 ENDIF CF8OPT
0176 *
0177 IFD IDEOPT
0178 *
0179 ***************************************************
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *
0181 ***************************************************
0182 *
0183 ** COMPACT FLASH SITS AT PORT 4
0184 *
0185 E100 CF_BASE EQU MONIO+$0100
0186 E100 CF_DATA EQU CF_BASE+0
0187 E102 CF_ERROR EQU CF_BASE+2 ; read error
0188 E102 CF_FEATURE EQU CF_BASE+2 ; write feature
0189 E104 CF_SECCNT EQU CF_BASE+4
0190 E106 CF_SECNUM EQU CF_BASE+6
0191 E108 CF_CYLLO EQU CF_BASE+8
0192 E10A CF_CYLHI EQU CF_BASE+10
0193 E10C CF_HEAD EQU CF_BASE+12
0194 E10E CF_STATUS EQU CF_BASE+14 ; read status
0195 E10E CF_COMAND EQU CF_BASE+14 ; write command
0196 E11E CF_AUX EQU CF_BASE+30
0197 *
0198 * Command Equates
0199 *
0200 0020 CMDREAD EQU $20 ; Read Single sector
0201 0030 CMDWRITE EQU $30 ; Write Single sector
0202 0006 AUXRESET EQU $06 ; Reset IDE
0203 0002 AUXRSTREL EQU $02 ; Reset release IRQ masked
0204 00E0 HEADLBA EQU $E0
0205 *
0206 * Status bit equates
0207 *
0208 0080 BUSY EQU $80
0209 0040 DRDY EQU $40
0210 0008 DRQ EQU $08
0211 0001 ERR EQU $01
0212 *
0213 ENDIF CF8OPT
0214 *
0215 IFD RTCOPT
0216 *
0217 **************************************************
0218 * MM58167A REAL TIME CLOCK MEMORY MAP:
0219 **************************************************
0220 *
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0222 *
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0224 *
0225 * COUNTER AND COMPARITOR REGISTERS:
0226 *
0227 * Both the Clock Counter and Clock Comparitor
0228 * consist of 8 registers for holding the time.
0229 * The register offsets from the Counter and
0230 * Comparitor registers are listed above.
0231 *
0232 COUNTR EQU CLOCK+0
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0234 *
0235 * CLOCK REGISTER OFFSETS:
0236 * These register offsets are used for the CLOCK
0237 * and comparitor ram CMPRAM.
0238 *
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0241 SECOND EQU 2
0242 MINUIT EQU 3
0243 HOUR EQU 4
0244 WKDAY EQU 5
0245 MTHDAY EQU 6
0246 MONTH EQU 7
0247 *
0248 * INTERRUPT OUTPUT REGISTERS:
0249 *
0250 * An interrupt output may be generated at the
0251 * following rates by setting the appropriate bit
0252 * in the Interrupt Control Register (CINTCR).
0253 * The Interrupt Status Register (CINTSR) must be
0254 * read to clear the interrupt and will return
0255 * the source of the interrupt.
0256 *
0257 * 1/Month Bit 7
0258 * 1/Week Bit 6
0259 * 1/Day Bit 5
0260 * 1/Hour Bit 4
0261 * 1/Minuite Bit 3
0262 * 1/Second Bit 2
0263 * 10/Second Bit 1
0264 * Comparitor Bit 0
0265 *
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0268 *
0269 * COUNTER AND RAM RESETS; GO COMMAND.
0270 *
0271 * The counter and comparitor may be reset
0272 * by writing $FF into CTRRES and CMPRES
0273 * respectivly.
0274 * A write to the Go command register (GOCMND)
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths
0276 * of a second counter.
0277 *
0278 CTRRES EQU CLOCK+18 COUNTER RESET
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0280 GOCMND EQU CLOCK+21 GO COMMAND
0281 *
0282 * CLOCK STATUS REGISTER.
0283 *
0284 * The counter takes 61 usec. to rollover for
0285 * every 1KHz clock pulse. If the Status bit is
0286 * set after reading the counter, the counter
0287 * should be re-read to ensure the time is correct.
0288 *
0289 CLKSTA EQU CLOCK+20 STATUS BIT
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0292 ENDIF RTCOPT
0292 ENDIF RTCOPT
0293 *
0294 IFD TRAOPT
0295 *
0296 **************************************************
0297 * PIA INTERRUPT TIMER
0298 **************************************************
0299 *
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7
0301 *
0302 ** PIA TIMER FOR SINGLE STEP / TRACE
0303 *
0304 * TADATA = Output = Timer preset register
0305 * TACTRL - CA1 = input = rising edge = NMI
0306 * - CA2 = Output = Timer Reset (Active High)
0307 * TBDATA = Input = Timer read back register
0308 * TBCTRL - CB1 = input = rising edge = FIRQ
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0310 *
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0312 * CRA1 = 1 CA1 Rising edge IRQ
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0315 * CRA4 = 1 ] CA2 = Set/Reset output
0316 * CRA5 = 1 ]
0317 * CRA6 = X CA2 Input Interrupt Flag
0318 * CRA7 = X CA1 Interrupt Flag
0319 *
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0321 * CRB1 = 1 CB1 Rising edge IRQ
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0324 * CRB4 = 1 ] CB2 = Set/Reset output
0325 * CRB5 = 1 ]
0326 * CRB6 = X CB2 Input Interrupt Flag
0327 * CRB7 = X CB1 Interrupt Flag
0328 *
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0331 *
0332 TADATA EQU MONIO+$70 Timer preset port
0333 TACTRL EQU MONIO+$71
0334 TBDATA EQU MONIO+$72 Timer read back port
0335 TBCTRL EQU MONIO+$73
0336 *
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0338 *
0339 ENDIF TRAOPT
0339 ENDIF TRAOPT
0340 IFD ADSOPT
0341 *
0342 ***************************************************
0343 * SERIAL PORT FOR DG640 *
0344 ***************************************************
0345 *
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0348 *
0349 ACIAS EQU MONIO+$400 CONTROL PORT
0350 *
0351 ENDIF ADSOPT
0351 ENDIF ADSOPT
0352 IFD PRTOPT
0353 *
0354 ***************************************************
0355 * PRINTER INTERFACE *
0356 ***************************************************
0357 *
0358 PADATA EQU MONIO+$404
0359 PACTRL EQU MONIO+$405
0360 PBDATA EQU MONIO+$406
0361 PBCTRL EQU MONIO+$407
0362 *
0363 ** CB1 ACK. I/P
0364 ** CB2 STB. O/P
0365 ** PB0 - PB7 DATA 1 - 8 O/P
0366 ** PORT A BIT ASSIGNMENT
0367 *
0368 PBUSY EQU $80 I/P
0369 PEMPTY EQU $40 I/P
0370 SELECT EQU $20 I/P
0371 PERROR EQU $10 I/P
0372 PRESET EQU %00000100 O/P PA3 = 0
0373 AUTOFD EQU %00001000 O/P PA2 = 0
0374 DIRMSK EQU %00001100
0375 ENDIF PRTOPT
0375 ENDIF PRTOPT
0376 IFD DG640OPT
0377 *
0378 ***************************************************
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0380 ***************************************************
0381 *
0382 ** VIDEO DISPLAY DEFINITIONS
0383 *
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0385 LINLEN EQU 64 LENGTH OF A LINE
0386 NUMLIN EQU 16 NUMBER OF LINES
0387 SCNLEN EQU $400 LENGTH OF SCREEN
0388 ENDIF DG640OPT
0388 ENDIF DG640OPT
0389 *
0390 IFD DMAFOPT
0391 *
0392 ***************************************************
0393 * DMAF2 8" DRIVE *
0394 ***************************************************
0395 *
0396 ADDREG EQU $F000 ADDRESS REGISTER
0397 CNTREG EQU $F002 COUNT REGISTER
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER
0400 AAAREG EQU $F015 ???
0401 BBBREG EQU $F016 ???
0402 COMREG EQU $F020 1791 COMMAND REGISTER
0403 SECREG EQU $F022 SECTOR REGISTER
0404 DRVREG EQU $F024 DRIVE SELECT LATCH
0405 CCCREG EQU $F040 ???
0406 ENDIF DMAFOPT
0406 ENDIF DMAFOPT
0407 IFD DATOPT
0408 **************************************************
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0410 **************************************************
0411 *
0412 FFF0 IC11 EQU $FFF0 DAT RAM CHIP
0413 55AA TSTPAT EQU $55AA TEST PATTERN
0414 ENDIF DATOPT
0415 *
0003 END
0000 INCLUDE "sys09ide.txt"
0001 *
0002 ** SYS09BUG MONITOR EXTENSIONS
0003 *
0004 * FOR SYS09BUG ON THE XESS XSA-3S100 / XST-3.0
0005 * WITH I/O MAPPED AT $XE000
0006 * 16 BIT IDE MAPPED AT $E100
0007 * AND ROM MAPPED AT $XF000
0008 *
0009 *
 
sys09ide.txt page 2
0011 *
0012 ***************************************************
0013 * Serial PROM register
0014 ***************************************************
0015 *
0016 ** CONFIGURATION PROM DEFINITIONS
0017 *
0018 E0C0 PROMREG EQU MONIO+$C0
0019 0001 PCLKHI EQU $01 Toggle PROM Clock High
0020 0000 PCLKLO EQU $00 Toggle PROM Clock Low
0021 0002 PRSTHI EQU $02 Toggle PROM Reset High
0022 0000 PRSTLO EQU $00 Toggle PROM Reset Low
0023 AA55 SYNCHI EQU $AA55 Synch Pattern High Word
0024 FF00 SYNCLO EQU $FF00 Synch Pattern Low Word
0025 *
0026 *
0027 ***************************************************
0028 * START OF ROM *
0029 ***************************************************
0030 *
0031 F800 MONITV EQU MONROM+0 FDB MONITOR
0032 F802 NXTCMV EQU MONROM+2 FDB NEXTCMD
0033 F804 INCHV EQU MONROM+4 FDB INCH
0034 F806 INCHEV EQU MONROM+6 FDB INCHE
0035 F808 INCHKV EQU MONROM+8 FDB INCHEK
0036 F80A OUTCHV EQU MONROM+10 FDB OUTCH
0037 F80C PDATAV EQU MONROM+12 FDB PDATA
0038 F80E PCRLFV EQU MONROM+14 FDB PCRLF
0039 F810 PSTRGV EQU MONROM+16 FDB PSTRNG
0040 F812 LRAV EQU MONROM+18 FDB LRA
0041 *
0042 * Condition code flags
0043 *
0044 0001 CFLAG EQU $01 CARRY FLAG
0045 0002 VFLAG EQU $02 OVERFLOW FLAG
0046 0004 ZFLAG EQU $04 ZERO FLAG
0047 0008 NFLAG EQU $08 NEGATIVE FLAG
0048 0010 IFLAG EQU $10 IRQ MASK CC
0049 0020 HFLAG EQU $20 HALF CARRY
0050 0040 FFLAG EQU $40 FIRQ MASK CC
0051 0080 EFLAG EQU $80 ENTIRE FLAG
0052 *
0053 * Serial Port
0054 *
0055 E000 ACIAC1 EQU ACIAS
0056 E001 ACIAD1 EQU ACIAS+1
0057 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50)
0058 *
0059 * XMODEM Control characters
0060 *
0061 0001 SOH EQU $01
0062 0004 EOT EQU $04
0063 0006 ACK EQU $06
0064 0015 NAK EQU $15
0065 0018 CAN EQU $18
0066 *
0067 * Some Disk Constants
0068 *
0069 0100 RMAXTRK EQU 256
0070 00FF RMAXSEC EQU 255
0071 FE01 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
0072 *
0073 * RAM SPACE
0074 *
0075 * PUT THIS DOWN THE BOTTOM OF MEMORY
0076 *
0077 0100 ORG $0100
0078 0100 DRVNUM RMB 1
0079 0101 TRACK RMB 1
0080 0102 SECTOR RMB 1
0081 0103 CHKSUM RMB 1
0082 0104 BLKNUM RMB 1 Xmodem block number
0083 0105 BYTCNT RMB 1 Xmodem byte count
0084 0106 XSTATE RMB 2 Xmodem State Vector
0085 0108 DELCNT RMB 3 $00,$00,$00 Xmodem Poll timer
0086 010B MAXTRK RMB 1
0087 010C MAXSEC RMB 1
0088 0200 ORG $0200
0089 *
0090 * SECTOR BUFFER
0091 *
0092 0200 BUFFER RMB 256
0093 *
0094 ****************************************
0095 *
0096 * START OF EXTENSION COMMANDS
0097 *
0098 ****************************************
0099 *
0100 F000 ORG MONEXT
0101 F000 F0 02 FDB NEXTEXT Jump to next extended command
0102 *
0103 ***** NEXTCMD *****
0104 *
0105 F002 AD 9F F8 06 NEXTEXT JSR [INCHEV] GET ONE CHAR. FROM TERMINAL
0106 F006 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0107 F008 1F 89 TFR A,B
0108 F00A 86 20 LDA #$20
0109 F00C AD 9F F8 0A JSR [OUTCHV] PRNT SPACE
0110 F010 C1 60 CMPB #$60
0111 F012 2F 02 BLE NXTEX0
0112 F014 C0 20 SUBB #$20
0113 *
0114 ***** DO TABLE LOOKUP *****
0115 * FOR COMMAND FUNCTIONS
0116 *
0117 F016 8E F0 2C NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE
0118 F019 E1 80 NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0119 F01B 27 0D BEQ JMPEXT BRANCH IF MATCH FOUND
0120 F01D 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0121 F01F 8C F0 35 CMPX #EXTEND REACHED END OF TABLE YET ?
0122 F022 26 F5 BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY
0123 F024 8E F0 35 LDX #MSGWHAT POINT TO MSG "WHAT?"
0124 F027 16 02 29 LBRA PDATA1 PRINT MSG AND RETURN
0125 F02A 6E 94 JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE
0126 *
0127 * EXTENDED COMMAND JUMP TABLE
0128 *
0129 F02C EXTTAB EQU *
0130 F02C 42 FCC 'B' BOOT FLEX
0131 F02D F0 3E FDB UBSUB
0132 F02F 46 FCC 'F' FORMAT IDE DISK
0133 F030 F0 EA FDB UFSUB
0134 F032 58 FCC 'X' XMODEM ROM DISK UPLOAD
0135 F033 F2 BC FDB UXSUB
0136 *
0137 F035 EXTEND EQU *
0138 *
0139 F035 57 48 41 54 20 3F MSGWHAT FCC "WHAT ?"
0140 F03B 0A 0D 04 FCB $0A,$0D,$04
0141 *
0142 * GO TO FLEX RESIDENT IN MEMORY
0143 *
0144 F03E 8E CD 00 UBSUB LDX #$CD00
0145 F041 AF 4A STX 10,U
0146 F043 1F 34 TFR U,S
0147 F045 3B RTI
0148 *
0149 * recieve char from remote drive.
0150 * timeout if no response for approx 1s.
0151 * Entry: no parameters
0152 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
0153 *
0154 F046 34 30 RCHAR PSHS X,Y
0155 *
0156 F048 8E 03 E8 LDX #1000 1000x inner loop
0157 F04B 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
0158 F04F B6 E0 00 RCHAR2 LDA ACIAC1 test for recieved char
0159 F052 47 ASRA
0160 F053 25 0A BCS RCHAR3 get character
0161 F055 31 3F LEAY -1,Y else, continue to count delay
0162 F057 26 F6 BNE RCHAR2
0163 F059 30 1F LEAX -1,X
0164 F05B 26 EE BNE RCHAR1
0165 F05D 35 B0 PULS X,Y,PC return with error if timed out
0166 *
0167 F05F B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set)
0168 F062 35 B0 PULS X,Y,PC
0169 *
0170 *
0171 * transmit char to remote drive.
0172 * timeout if no response for approx 1s. (allows for use of hardware flow control)
0173 * Entry: (A) = char to transmit
0174 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
0175 *
0176 F064 34 30 SCHAR PSHS X,Y
0177 F066 34 02 PSHS A
0178 *
0179 F068 8E 03 E8 LDX #1000 1000x inner loop
0180 F06B 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
0181 F06F B6 E0 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO
0182 F072 47 ASRA
0183 F073 47 ASRA
0184 F074 25 0C BCS SCHAR3 send character
0185 F076 31 3F LEAY -1,Y else, continue to count delay
0186 F078 26 F5 BNE SCHAR2
0187 F07A 30 1F LEAX -1,X
0188 F07C 26 ED BNE SCHAR1
0189 F07E 35 02 PULS A
0190 F080 35 B0 PULS X,Y,PC return with error if timed out
0191 *
0192 F082 35 02 SCHAR3 PULS A
0193 F084 B7 E0 01 STA ACIAD1 send data (carry bit still set)
0194 F087 35 B0 PULS X,Y,PC
0195 *
0196 ** 'UF' Format IDE Drive to FLEX standard.
0197 *
0198 F089 0A 0D DISFOS FCB $0A,$0D
0199 F08B 46 6F 72 6D 61 74 FCC 'Formating IDE disk... '
69 6E 67 20 49 44
45 20 64 69 73 6B
2E 2E 2E 20
0200 F0A1 0A 0D FCB $0A,$0D
0201 F0A3 44 72 69 76 65 20 FCC 'Drive Number ?'
4E 75 6D 62 65 72
20 3F
0202 F0B1 04 FCB 4
0203 F0B2 0A 0D 04 MESS6 FCB $0A,$0D,4
0204 F0B5 49 44 45 20 64 72 FCC 'IDE drive not allocated! '
69 76 65 20 6E 6F
74 20 61 6C 6C 6F
63 61 74 65 64 21
20
0205 F0CE 04 FCB 4
0206 F0CF 0A 0D UFMSG1 FCB $0A,$0D
0207 F0D1 46 6F 72 6D 61 74 FCC 'Format Complete'
20 43 6F 6D 70 6C
65 74 65
0208 F0E0 04 FCB 4
0209 F0E1 49 44 45 44 49 53 VOLMSG FCC 'IDEDISK '
4B 20
0210 F0E9 04 FCB 4
0211 *
0212 F0EA BD F4 BD UFSUB JSR INITDR
0213 F0ED 8E F0 89 LDX #DISFOS
0214 F0F0 BD F2 53 JSR PDATA1
0215 F0F3 17 FF 50 UFSUB1 LBSR RCHAR
0216 F0F6 24 FB BCC UFSUB1
0217 F0F8 17 FF 69 LBSR SCHAR
0218 F0FB 81 30 CMPA #'0'
0219 F0FD 10 25 00 EF LBLO UFEXIT
0220 F101 81 33 CMPA #'3'
0221 F103 10 22 00 E9 LBHI UFEXIT
0222 F107 80 30 SUBA #'0'
0223 F109 1F 89 TFR A,B
0224 F10B F7 01 00 STB DRVNUM
0225 F10E 8E 00 FD LDX #DRVNUM-3
0226 F111 BD F5 3A JSR DRVSEL
0227 *
0228 * set up free chain
0229 *
0230 F114 8E 02 00 LDX #BUFFER clear out buffer
0231 F117 4F CLRA
0232 F118 5F CLRB
0233 F119 A7 80 DFL1 STA 0,X+
0234 F11B 5A DECB
0235 F11C 26 FB BNE DFL1
0236 *
0237 F11E 7F 01 01 CLR TRACK
0238 F121 86 01 LDA #1
0239 F123 B7 01 02 STA SECTOR
0240 F126 8E 02 00 DFL2 LDX #BUFFER
0241 F129 B6 01 01 LDA TRACK
0242 F12C A7 84 STA 0,X
0243 F12E B6 01 02 LDA SECTOR
0244 F131 4C INCA
0245 F132 81 00 CMPA #RMAXSEC+1 last sector on track?
0246 F134 26 04 BNE DFL3
0247 F136 6C 84 INC 0,X
0248 F138 86 01 LDA #1
0249 F13A A7 01 DFL3 STA 1,X
0250 F13C B6 01 01 LDA TRACK
0251 F13F F6 01 02 LDB SECTOR
0252 F142 BD F5 15 JSR WRITSC
0253 F145 7C 01 02 INC SECTOR
0254 F148 B6 01 02 LDA SECTOR
0255 F14B 81 00 CMPA #RMAXSEC+1
0256 F14D 26 D7 BNE DFL2
0257 F14F 86 01 LDA #1
0258 F151 B7 01 02 STA SECTOR
0259 F154 7C 01 01 INC TRACK
0260 F157 B6 01 01 LDA TRACK
0261 F15A 81 00 CMPA #RMAXTRK
0262 F15C 26 C8 BNE DFL2
0263 * break free chain at last track/sector
0264 F15E 8E 02 00 LDX #BUFFER
0265 F161 86 FF LDA #RMAXTRK-1
0266 F163 C6 FF LDB #RMAXSEC
0267 F165 BD F4 F1 JSR READSC
0268 F168 8E 02 00 LDX #BUFFER
0269 F16B 6F 84 CLR 0,X
0270 F16D 6F 01 CLR 1,X
0271 F16F 86 FF LDA #RMAXTRK-1
0272 F171 C6 FF LDB #RMAXSEC
0273 F173 BD F5 15 JSR WRITSC
0274 * set up sector structure, SIR, directory etc
0275 F176 8E 02 00 LDX #BUFFER
0276 F179 4F CLRA
0277 F17A C6 FF LDB #RMAXSEC
0278 F17C BD F4 F1 JSR READSC
0279 F17F 8E 02 00 LDX #BUFFER
0280 F182 6F 84 CLR 0,X break end of directory chain
0281 F184 6F 01 CLR 1,X
0282 F186 4F CLRA
0283 F187 C6 FF LDB #RMAXSEC
0284 F189 BD F5 15 JSR WRITSC
0285 *
0286 F18C 8E 02 00 LDX #BUFFER
0287 F18F 4F CLRA
0288 F190 C6 03 LDB #3 set up SIR
0289 F192 BD F4 F1 JSR READSC
0290 F195 8E 02 00 LDX #BUFFER
0291 F198 6F 84 CLR 0,X break forward link
0292 F19A 6F 01 CLR 1,X
0293 *
0294 F19C 34 20 PSHS Y
0295 F19E 10 8E F0 E1 LDY #VOLMSG
0296 F1A2 C6 10 LDB #16
0297 F1A4 A6 A0 DFL4 LDA ,Y+
0298 F1A6 A7 85 STA B,X
0299 F1A8 5C INCB
0300 F1A9 C1 18 CMPB #24
0301 F1AB 26 F7 BNE DFL4
0302 F1AD 35 20 PULS Y
0303 *
0304 F1AF 4F CLRA
0305 F1B0 F6 01 00 LDB DRVNUM volume number
0306 F1B3 ED 88 1B STD 27,X
0307 *
0308 F1B6 CC 01 01 LDD #$0101 first trk/sec 01-01
0309 F1B9 ED 88 1D STD 29,X
0310 F1BC 86 FF LDA #RMAXTRK-1
0311 F1BE C6 FF LDB #RMAXSEC
0312 F1C0 ED 88 1F STD 31,X
0313 F1C3 ED 88 26 STD 38,X
0314 F1C6 CC FE 01 LDD #RTOTSEC total DATA sectors (2912-14)
0315 F1C9 ED 88 21 STD 33,X
0316 *
0317 F1CC 86 01 LDA #01 month set default creation date (SYS09's birthday!)
0318 F1CE A7 88 23 STA 35,X
0319 F1D1 86 07 LDA #07 day
0320 F1D3 A7 88 24 STA 36,X
0321 F1D6 86 07 LDA #07 year
0322 F1D8 A7 88 25 STA 37,X
0323 *
0324 F1DB 4F RF3 CLRA
0325 F1DC C6 03 LDB #3
0326 F1DE BD F5 15 JSR WRITSC
0327 *
0328 * Not sure what this is about
0329 * put bootstrap on track 0 sector 1
0330 *
0331 * LDX #BUFFER
0332 * CLRA
0333 * LDB #1
0334 * JSR READSC
0335 * LDX #BUFFER
0336 * LDA #$AA set the init flag
0337 * STA 0,X
0338 * LDA #$55
0339 * STA 1,X
0340 * CLRA
0341 * LDB #1
0342 * JSR WRITSC
0343 *
0344 * Write Boot sector
0345 *
0346 F1E1 8E F7 00 LDX #BOOT
0347 F1E4 4F CLRA TRACK 0
0348 F1E5 C6 01 LDB #$01 SECTOR 1
0349 F1E7 B7 01 01 STA TRACK
0350 F1EA F7 01 02 STB SECTOR
0351 F1ED 17 03 25 LBSR WRITSC
0352 *
0353 F1F0 8E F0 CF UFEXIT LDX #UFMSG1
0354 F1F3 7E F2 53 JMP PDATA1
0355 *
0356 * ACIA INPUT TEST
0357 *
0358 F1F6 B6 E0 00 INTEST LDA ACIAC1
0359 F1F9 85 01 BITA #$01
0360 F1FB 39 RTS
0361 *
0362 * RESET ACIA
0363 *
0364 F1FC 86 03 ACIRST LDA #$03 master reset
0365 F1FE B7 E0 00 STA ACIAC1
0366 F201 86 11 LDA #$11
0367 F203 B7 E0 00 STA ACIAC1
0368 F206 39 RTS
0369 *
0370 * ACIA INPUT
0371 *
0372 F207 86 10 INTER LDA #16
0373 F209 B7 01 08 STA DELCNT+0
0374 F20C 7F 01 09 CLR DELCNT+1
0375 F20F 7F 01 0A CLR DELCNT+2
0376 F212 B6 E0 00 INTER0 LDA ACIAC1
0377 F215 85 01 BITA #$01
0378 F217 26 08 BNE INTER1
0379 F219 85 78 BITA #$78
0380 F21B 27 0A BEQ INTER2
0381 F21D 8D DD BSR ACIRST
0382 F21F 20 E6 BRA INTER
0383 *
0384 F221 B6 E0 01 INTER1 LDA ACIAD1
0385 F224 1C FD ANDCC #$FF-VFLAG
0386 F226 39 RTS
0387 *
0388 F227 7A 01 0A INTER2 DEC DELCNT+2
0389 F22A 26 E6 BNE INTER0
0390 F22C 7A 01 09 DEC DELCNT+1
0391 F22F 26 E1 BNE INTER0
0392 F231 7A 01 08 DEC DELCNT+0
0393 F234 26 DC BNE INTER0
0394 F236 4F CLRA
0395 F237 1A 02 ORCC #VFLAG
0396 F239 39 RTS
0397 *
0398 * ACIA OUTPUT
0399 *
0400 F23A 34 02 OUTTER PSHS A
0401 *
0402 F23C B6 E0 00 OUTTE1 LDA ACIAC1
0403 F23F 85 02 BITA #$02
0404 F241 26 08 BNE OUTTE2
0405 F243 85 78 BITA #$78
0406 F245 27 F5 BEQ OUTTE1
0407 F247 8D B3 BSR ACIRST
0408 F249 20 F1 BRA OUTTE1
0409 *
0410 F24B 35 02 OUTTE2 PULS A
0411 F24D B7 E0 01 STA ACIAD1
0412 F250 39 RTS
0413 *
0414 * Print Data
0415 *
0416 F251 8D E7 PDATA0 BSR OUTTER
0417 F253 A6 80 PDATA1 LDA ,X+
0418 F255 81 04 CMPA #$04
0419 F257 26 F8 BNE PDATA0
0420 F259 39 RTS
0421 *
0422 *
0423 ** 'UX' Xmodem IDE Disk upload
0424 *
0425 F25A 0D 0A UXMES0 FCB $0D,$0A
0426 F25C 58 6D 6F 64 65 6D FCC 'Xmodem IDE Disk Upload'
20 49 44 45 20 44
69 73 6B 20 55 70
6C 6F 61 64
0427 F272 04 FCB 4
0428 F273 0D 0A UXMES1 FCB $0D,$0A
0429 F275 55 70 6C 6F 61 64 FCC 'Upload Complete'
20 43 6F 6D 70 6C
65 74 65
0430 F284 04 FCB 4
0431 F285 0D 0A UXMES2 FCB $0D,$0A
0432 F287 55 70 6C 6F 61 64 FCC 'Upload Error'
20 45 72 72 6F 72
0433 F293 04 FCB 4
0434 F294 0D 0A UXMSG3 FCB $0D,$0A
0435 F296 44 72 69 76 65 20 FCC 'Drive Number :'
4E 75 6D 62 65 72
20 3A
0436 F2A4 04 FCB 4
0437 F2A5 0D 0A UXMSG4 FCB $0D,$0A
0438 F2A7 41 72 65 20 59 6F FCC 'Are You Sure ? (Y/N)'
75 20 53 75 72 65
20 3F 20 28 59 2F
4E 29
0439 F2BB 04 FCB 4
0440 *
0441 * Print Banner
0442 *
0443 F2BC 8E F2 5A UXSUB LDX #UXMES0
0444 F2BF 17 FF 91 LBSR PDATA1
0445 *
0446 * Prompt for Disk drive number (0 to 3)
0447 *
0448 F2C2 8E F2 94 LDX #UXMSG3
0449 F2C5 17 FF 8B LBSR PDATA1
0450 F2C8 17 FF 3C UXSUB1 LBSR INTER
0451 F2CB 29 FB BVS UXSUB1
0452 F2CD 17 FF 6A LBSR OUTTER
0453 F2D0 81 30 CMPA #'0
0454 F2D2 10 25 01 2E LBLO UXEXIT
0455 F2D6 81 33 CMPA #'3
0456 F2D8 10 22 01 28 LBHI UXEXIT
0457 F2DC 80 30 SUBA #'0
0458 F2DE B7 01 00 STA DRVNUM
0459 *
0460 * Report selected drive
0461 *
0462 F2E1 8E F2 94 LDX #UXMSG3
0463 F2E4 17 FF 6C LBSR PDATA1
0464 F2E7 B6 01 00 LDA DRVNUM
0465 F2EA 8B 30 ADDA #'0
0466 F2EC 17 FF 4B LBSR OUTTER
0467 *
0468 * Ask for confirmation (Y/N)
0469 *
0470 F2EF 8E F2 A5 LDX #UXMSG4
0471 F2F2 17 FF 5E LBSR PDATA1
0472 F2F5 17 FF 0F UXSUB2 LBSR INTER
0473 F2F8 29 FB BVS UXSUB2
0474 F2FA 17 FF 3D LBSR OUTTER
0475 F2FD 84 5F ANDA #$5F
0476 F2FF 81 4E CMPA #'N
0477 F301 10 27 00 FF LBEQ UXEXIT
0478 F305 81 59 CMPA #'Y
0479 F307 26 B3 BNE UXSUB
0480 *
0481 * We have confirmation ... now load the disk image
0482 *
0483 F309 17 01 B1 LBSR INITDR
0484 F30C CE F4 2D LDU #XSTST
0485 F30F FF 01 06 STU XSTATE
0486 F312 86 01 LDA #1
0487 F314 B7 01 04 STA BLKNUM
0488 *
0489 * Sector1
0490 *
0491 F317 8E 02 00 LDX #BUFFER
0492 *
0493 F31A 4F CLRA TRACK 0
0494 F31B C6 01 LDB #$01 SECTOR 1
0495 F31D B7 01 01 STA TRACK
0496 F320 F7 01 02 STB SECTOR
0497 *
0498 F323 17 00 EA LBSR XREAD
0499 F326 10 25 00 E0 LBCS UXERR
0500 F32A 17 01 87 LBSR XACK
0501 F32D 17 00 E0 LBSR XREAD
0502 F330 10 25 00 D6 LBCS UXERR
0503 *
0504 F334 8E 02 00 LDX #BUFFER
0505 F337 B6 01 01 LDA TRACK
0506 F33A F6 01 02 LDB SECTOR
0507 F33D 17 01 D5 LBSR WRITSC
0508 F340 17 01 71 LBSR XACK
0509 *
0510 * Sector 2
0511 *
0512 F343 8E 02 00 LDX #BUFFER
0513 *
0514 F346 B6 01 01 LDA TRACK
0515 F349 F6 01 02 LDB SECTOR
0516 F34C 5C INCB
0517 F34D B7 01 01 STA TRACK
0518 F350 F7 01 02 STB SECTOR
0519 *
0520 F353 17 00 BA LBSR XREAD
0521 F356 10 25 00 B0 LBCS UXERR
0522 F35A 17 01 57 LBSR XACK
0523 F35D 17 00 B0 LBSR XREAD
0524 F360 10 25 00 A6 LBCS UXERR
0525 *
0526 F364 8E 02 00 LDX #BUFFER
0527 F367 B6 01 01 LDA TRACK
0528 F36A F6 01 02 LDB SECTOR
0529 F36D 17 01 A5 LBSR WRITSC
0530 *
0531 F370 17 01 41 LBSR XACK
0532 *
0533 * Sector 3 - SIR
0534 *
0535 F373 8E 02 00 LDX #BUFFER
0536 *
0537 F376 B6 01 01 LDA TRACK
0538 F379 F6 01 02 LDB SECTOR
0539 F37C 5C INCB
0540 F37D B7 01 01 STA TRACK
0541 F380 F7 01 02 STB SECTOR
0542 *
0543 F383 17 00 8A LBSR XREAD
0544 F386 10 25 00 80 LBCS UXERR
0545 F38A 17 01 27 LBSR XACK
0546 F38D 17 00 80 LBSR XREAD
0547 F390 10 25 00 76 LBCS UXERR
0548 *
0549 F394 8E 02 00 LDX #BUFFER
0550 F397 A6 88 26 LDA 38,X
0551 F39A 4C INCA
0552 F39B B7 01 0B STA MAXTRK
0553 F39E E6 88 27 LDB 39,X
0554 F3A1 5C INCB
0555 F3A2 F7 01 0C STB MAXSEC
0556 F3A5 B6 01 01 LDA TRACK
0557 F3A8 F6 01 02 LDB SECTOR
0558 F3AB 17 01 67 LBSR WRITSC
0559 *
0560 F3AE 17 01 03 LBSR XACK
0561 *
0562 * Sector 4 to Last Track & Sector
0563 *
0564 *
0565 F3B1 B6 01 01 LDA TRACK
0566 F3B4 F6 01 02 LDB SECTOR
0567 F3B7 5C INCB
0568 *
0569 F3B8 8E 02 00 UXLOOP LDX #BUFFER
0570 F3BB B7 01 01 STA TRACK
0571 F3BE F7 01 02 STB SECTOR
0572 *
0573 F3C1 17 00 4C LBSR XREAD
0574 F3C4 10 25 00 42 LBCS UXERR
0575 F3C8 17 00 E9 LBSR XACK
0576 F3CB 17 00 42 LBSR XREAD
0577 F3CE 10 25 00 38 LBCS UXERR
0578 *
0579 F3D2 8E 02 00 LDX #BUFFER
0580 F3D5 B6 01 01 LDA TRACK
0581 F3D8 F6 01 02 LDB SECTOR
0582 F3DB 17 01 37 LBSR WRITSC
0583 F3DE 17 00 D3 LBSR XACK
0584 *
0585 F3E1 B6 01 01 LDA TRACK
0586 F3E4 F6 01 02 LDB SECTOR
0587 F3E7 5C INCB
0588 F3E8 F1 01 0C CMPB MAXSEC
0589 F3EB 26 CB BNE UXLOOP
0590 F3ED C6 01 LDB #1
0591 F3EF 4C INCA
0592 F3F0 B1 01 0B CMPA MAXTRK
0593 F3F3 26 C3 BNE UXLOOP
0594 *
0595 *
0596 * Write Boot sector
0597 *
0598 F3F5 8E F7 00 LDX #BOOT
0599 F3F8 4F CLRA TRACK 0
0600 F3F9 C6 01 LDB #$01 SECTOR 1
0601 F3FB B7 01 01 STA TRACK
0602 F3FE F7 01 02 STB SECTOR
0603 F401 17 01 11 LBSR WRITSC
0604 *
0605 F404 8E F2 73 UXEXIT LDX #UXMES1
0606 F407 7E F2 53 JMP PDATA1
0607 *
0608 F40A 8E F2 85 UXERR LDX #UXMES2
0609 F40D 16 FE 43 LBRA PDATA1
0610 *
0611 * Get a Byte using XModem protocol
0612 * Carry clear => no errors
0613 * Carry set => errors
0614 *
0615 F410 34 40 XREAD PSHS U
0616 F412 FE 01 06 LDU XSTATE
0617 *
0618 F415 17 FD EF XBYTE0 LBSR INTER
0619 F418 28 0A BVC XBYTE1
0620 F41A 86 15 LDA #NAK
0621 F41C 17 FE 1B LBSR OUTTER
0622 F41F CE F4 2D LDU #XSTST
0623 F422 20 F1 BRA XBYTE0
0624 *
0625 F424 AD C4 XBYTE1 JSR ,U
0626 F426 26 ED BNE XBYTE0
0627 F428 FF 01 06 STU XSTATE
0628 F42B 35 C0 PULS U,PC
0629 *
0630 * START - LOOK FOR SOH (START OF HEADER) = $01
0631 *
0632 F42D 81 01 XSTST CMPA #SOH
0633 F42F 26 06 BNE XSTST1
0634 F431 CE F4 4D LDU #XSTBL
0635 F434 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
0636 F436 39 RTS
0637 *
0638 F437 81 04 XSTST1 CMPA #EOT
0639 F439 26 08 BNE XSTST2
0640 F43B 86 06 LDA #ACK
0641 F43D 17 FD FA LBSR OUTTER
0642 F440 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
0643 F442 39 RTS
0644 *
0645 F443 81 18 XSTST2 CMPA #CAN
0646 F445 26 03 BNE XSTST3
0647 F447 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
0648 F449 39 RTS
0649 *
0650 F44A 1C FA XSTST3 ANDCC #$FF-CFLAG-ZFLAG
0651 F44C 39 RTS
0652 *
0653 * Got SOH
0654 * Now get block number
0655 *
0656 F44D B1 01 04 XSTBL CMPA BLKNUM
0657 F450 26 06 BNE XSTBLE
0658 F452 CE F4 63 LDU #XSTCOM
0659 F455 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
0660 F457 39 RTS
0661 *
0662 * Error in block number
0663 *
0664 F458 86 15 XSTBLE LDA #NAK
0665 F45A 17 FD DD LBSR OUTTER
0666 F45D CE F4 2D LDU #XSTST
0667 F460 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
0668 F462 39 RTS
0669 *
0670 * Get complement of block number
0671 *
0672 F463 43 XSTCOM COMA
0673 F464 B1 01 04 CMPA BLKNUM
0674 F467 26 EF BNE XSTBLE
0675 F469 7F 01 03 CLR CHKSUM
0676 F46C 86 80 LDA #128
0677 F46E B7 01 05 STA BYTCNT
0678 F471 CE F4 77 LDU #XSTDA
0679 F474 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
0680 F476 39 RTS
0681 *
0682 * Get data bytes
0683 *
0684 F477 34 02 XSTDA PSHS A
0685 F479 BB 01 03 ADDA CHKSUM
0686 F47C B7 01 03 STA CHKSUM
0687 F47F 35 02 PULS A
0688 F481 7A 01 05 DEC BYTCNT
0689 F484 26 03 BNE XSTDA1
0690 F486 CE F4 8E LDU #XSTCK
0691 F489 A7 80 XSTDA1 STA ,X+
0692 F48B 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
0693 F48D 39 RTS
0694 *
0695 * Byte count reached zero
0696 * Check checksum byte
0697 *
0698 F48E B1 01 03 XSTCK CMPA CHKSUM
0699 F491 26 0B BNE XSTCK1 retry if wrong checksum
0700 *
0701 * Checksum OK ...
0702 * increment block number
0703 * Don't send ACK until data written to CF
0704 *
0705 F493 7C 01 04 INC BLKNUM
0706 F496 CE F4 2D LDU #XSTST
0707 F499 1C FE ANDCC #$FF-CFLAG No abort
0708 F49B 1A 04 ORCC #ZFLAG Valid data (exit)
0709 F49D 39 RTS
0710 *
0711 * Checksum Error detected ...
0712 * Reset Sector counter in ACCB to last 128 byte boundary
0713 * and send NAK
0714 *
0715 F49E 34 04 XSTCK1 PSHS B
0716 F4A0 1F 10 TFR X,D
0717 F4A2 5A DECB
0718 F4A3 C4 80 ANDB #128
0719 F4A5 1F 01 TFR D,X
0720 F4A7 35 04 PULS B
0721 F4A9 86 15 LDA #NAK
0722 F4AB 17 FD 8C XSTCK2 LBSR OUTTER
0723 F4AE CE F4 2D LDU #XSTST
0724 F4B1 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
0725 F4B3 39 RTS
0726 *
0727 * Acknowledge Data Received
0728 *
0729 F4B4 34 02 XACK PSHS A
0730 F4B6 86 06 LDA #ACK
0731 F4B8 17 FD 7F LBSR OUTTER
0732 F4BB 35 82 PULS A,PC
0733 *
0734 *
0735 ** FLEX 9 IDE DISK DRIVERS
0736 *
0737 * FOR SYS09BUG 1.2 ON THE XSA-3S1000
0738 * WITH I/O MAPPED AT $XE000
0739 * AND ROM MAPPED AT $XF000
0740 *
0741 *
0742 * INITIALIZE CF CARD FOR 8 BIT LBA MODE
0743 *
0744 F4BD CC 00 06 INITDR LDD #AUXRESET
0745 F4C0 FD E1 1E STD CF_AUX
0746 F4C3 CC 00 02 LDD #AUXRSTREL
0747 F4C6 FD E1 1E STD CF_AUX
0748 F4C9 CC 00 E0 LDD #HEADLBA
0749 F4CC FD E1 0C STD CF_HEAD
0750 F4CF 16 02 D6 LBRA WTRDY
0751 *
0752 * RESTORE DISK DRIVER (SEEK TRACK 00)
0753 *
0754 F4D2 8D 66 RESTR1 BSR DRVSEL
0755 F4D4 4F CLRA ; Track 0
0756 F4D5 C6 01 LDB #$01 ; Sector 1
0757 *
0758 * Seek track and sector
0759 * A holds track number (0 - ??)
0760 * B holds sector number (1 - ??)
0761 * Sector numbers starts from 1
0762 * subtract 1 to start from sector 0 on CF
0763 *
0764 F4D7 34 02 SEEKTS PSHS A
0765 F4D9 4F CLRA
0766 F4DA 5A DECB
0767 F4DB FD E1 06 STD CF_SECNUM
0768 F4DE E6 E4 LDB ,S
0769 F4E0 FD E1 08 STD CF_CYLLO
0770 F4E3 F6 01 00 LDB DRVNUM
0771 F4E6 FD E1 0A STD CF_CYLHI
0772 F4E9 C6 01 LDB #$01
0773 F4EB FD E1 04 STD CF_SECCNT
0774 F4EE 5F CLRB
0775 F4EF 35 82 PULS A,PC
0776 *
0777 * READ SECTORS FROM CF
0778 *
0779 *
0780 F4F1 8D E4 READSC BSR SEEKTS
0781 F4F3 CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE
0782 F4F6 FD E1 0E STD CF_COMAND
0783 F4F9 17 02 AC LBSR WTRDY
0784 *
0785 * READ LOOP
0786 *
0787 F4FC 34 20 PSHS Y
0788 F4FE 10 8E 01 00 LDY #256
0789 F502 17 02 B2 RDLP1 LBSR WTDRQ
0790 F505 FC E1 00 LDD CF_DATA
0791 F508 E7 80 STB ,X+
0792 F50A 31 3F LEAY -1,Y
0793 F50C 26 F4 BNE RDLP1
0794 F50E 35 20 PULS Y
0795 *
0796 F510 17 02 95 LBSR WTRDY
0797 F513 5F CLRB
0798 F514 39 RTS
0799 *
0800 * WRITE SECTOR TO CF
0801 *
0802 F515 8D C0 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR
0803 F517 CC 00 30 LDD #CMDWRITE ; IDE WRITE MULTIPLE
0804 F51A FD E1 0E STD CF_COMAND
0805 F51D 17 02 88 LBSR WTRDY
0806 *
0807 * WRITE LOOP
0808 *
0809 F520 34 20 PSHS Y
0810 F522 10 8E 01 00 LDY #256
0811 F526 4F CLRA
0812 F527 17 02 8D WRTLP1 LBSR WTDRQ
0813 F52A E6 80 LDB ,X+
0814 F52C FD E1 00 STD CF_DATA
0815 F52F 31 3F LEAY -1,Y
0816 F531 26 F4 BNE WRTLP1
0817 F533 35 20 PULS Y
0818 *
0819 F535 17 02 70 LBSR WTRDY
0820 F538 5F CLRB
0821 F539 39 RTS
0822 *
0823 * DRIVE SELECT DISK DRIVER
0824 *
0825 F53A A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB
0826 F53C 81 03 CMPA #3
0827 F53E 23 01 BLS DRVS2 IF > 3, SET IT TO 0
0828 F540 4F CLRA
0829 F541 B7 01 00 DRVS2 STA DRVNUM
0830 F544 5F CLRB ; SET Z, CLEAR C
0831 F545 39 RTS
0832 *
0833 * CHECK DRIVE READY DISK DRIVER
0834 *
0835 F546 A6 03 CHKDRV LDA 3,X
0836 F548 5F CLRB ; CLEAR C, SET Z
0837 F549 39 RTS
0838 *******************************************************
0839 *
0840 * Bootstrap FLEX Loader
0841 *
0842 * SBUG1.8 loads the bootstap loader at $C000
0843 * however the Flex adaption manual has the
0844 * bootstrap loader residing at $C100
0845 * Bootstrap Loader is position independent code
0846 *
0847 ******************************************************
0848 *
0849 * Equates
0850 *
0851 C0FF BSSTACK EQU $C0FF
0852 C300 SCTBUF EQU $C300
0853 *
0854 * Start of Utility
0855 *
0856 F700 ORG MONEXT+$0700
0857 F700 20 0B BOOT BRA BLOAD0
0858 F702 00 00 00 FCB 0,0,0
0859 F705 00 TRK FCB 0 File start track
0860 F706 00 SCT FCB 0 File start sector
0861 F707 00 DNS FCB 0 Density Flag (not used)
0862 F708 C0 00 TADR FDB $C000 Transfer address
0863 F70A 00 00 LADR FDB 0 Load Address
0864 F70C 00 DRNUM FCB 0 Drive number 0
0865 *
0866 F70D 10 CE C0 FF BLOAD0 LDS #BSSTACK Set up Bootstrap stack
0867 F711 EC 8C F1 LDD TRK,PCR Set up start track and sector
0868 F714 FD C3 00 STD SCTBUF
0869 F717 10 8E C4 00 LDY #SCTBUF+256
0870 *
0871 * Perform actual file load
0872 *
0873 F71B 8D 35 BLOAD1 BSR GETCH Get acharcater
0874 F71D 81 02 CMPA #$02 Data record hearder ?
0875 F71F 27 10 BEQ BLOAD2 Skip, is so
0876 F721 81 16 CMPA #$16 Xfr address hearder ?
0877 F723 26 F6 BNE BLOAD1 Loop if neither
0878 *
0879 * Get transfer address
0880 *
0881 F725 8D 2B BSR GETCH
0882 F727 A7 8C DE STA TADR,PCR
0883 F72A 8D 26 BSR GETCH
0884 F72C A7 8C DA STA TADR+1,PCR
0885 F72F 20 EA BRA BLOAD1
0886 *
0887 * Load data record
0888 *
0889 F731 8D 1F BLOAD2 BSR GETCH Get load address
0890 F733 A7 8C D4 STA LADR,PCR
0891 F736 8D 1A BSR GETCH
0892 F738 A7 8C D0 STA LADR+1,PCR
0893 F73B 8D 15 BSR GETCH Get Bytes count
0894 F73D 1F 89 TFR A,B
0895 F73F 5D TSTB
0896 F740 27 D9 BEQ BLOAD1 Loop if count = 0
0897 F742 AE 8C C5 LDX LADR,PCR Get load address
0898 F745 34 14 BLOAD3 PSHS B,X
0899 F747 8D 09 BSR GETCH Get data character
0900 F749 35 14 PULS B,X
0901 F74B A7 80 STA ,X+ Store at load address
0902 F74D 5A DECB
0903 F74E 26 F5 BNE BLOAD3 Loop until count = 0
0904 F750 20 C9 BRA BLOAD1
0905 *
0906 * Get Character routine
0907 * Reads a sector if needed
0908 *
0909 F752 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ?
0910 F756 26 0F BNE GETCH4 Go read Character if not
0911 F758 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer
0912 F75B EC 84 LDD 0,X Get forward Link
0913 F75D 27 0B BEQ GOFLEX if zero, file is loaded
0914 F75F 8D 26 BSR READ Read next sector
0915 F761 26 9D BNE BOOT start over if error
0916 F763 10 8E C3 04 LDY #SCTBUF+4 Point past link
0917 F767 A6 A0 GETCH4 LDA ,Y+ Else, get a character
0918 F769 39 RTS
0919 *
0920 * File is loaded, Jump to it
0921 *
0922 F76A 6E 9C 9B GOFLEX JMP [TADR,PCR] Jump to transfer address
0923
0924 *
0925 ** FLEX 9 IDE DISK DRIVERS
0926 *
0927 * Seek track and sector
0928 * A holds track number (0 - ??)
0929 * B holds sector number (1 - ??)
0930 * Sector numbers starts from 1
0931 * subtract 1 to start from sector 0 on CF
0932 *
0933 F76D 34 02 SEEK PSHS A
0934 F76F 4F CLRA
0935 F770 5A DECB
0936 F771 FD E1 06 STD CF_SECNUM
0937 F774 E6 E4 LDB ,S
0938 F776 FD E1 08 STD CF_CYLLO
0939 F779 E6 8C 90 LDB DRNUM,PCR
0940 F77C FD E1 0A STD CF_CYLHI
0941 F77F C6 01 LDB #$01
0942 F781 FD E1 04 STD CF_SECCNT
0943 F784 5F CLRB
0944 F785 35 82 PULS A,PC
0945 *
0946 * READ SECTORS FROM CF
0947 *
0948 *
0949 F787 8D E4 READ BSR SEEK
0950 F789 CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE
0951 F78C FD E1 0E STD CF_COMAND
0952 F78F 8D 17 BSR WTRDY
0953 *
0954 * READ LOOP
0955 *
0956 F791 34 20 PSHS Y
0957 F793 10 8E 01 00 LDY #256
0958 F797 8D 1E READ1 BSR WTDRQ
0959 F799 FC E1 00 LDD CF_DATA
0960 F79C E7 80 STB ,X+
0961 F79E 31 3F LEAY -1,Y
0962 F7A0 26 F5 BNE READ1
0963 F7A2 35 20 PULS Y
0964 *
0965 F7A4 8D 02 BSR WTRDY
0966 F7A6 5F CLRB
0967 F7A7 39 RTS
0968 *
0969 * WAIT UNTIL READY
0970 *
0971 F7A8 FC E1 0E WTRDY LDD CF_STATUS
0972 F7AB C5 80 BITB #BUSY
0973 F7AD 26 F9 BNE WTRDY
0974 F7AF FC E1 0E LDD CF_STATUS
0975 F7B2 C5 40 BITB #DRDY
0976 F7B4 27 F2 BEQ WTRDY
0977 F7B6 39 RTS
0978 *
0979 * WAIT FOR DATA REQUEST
0980 *
0981 F7B7 FC E1 0E WTDRQ LDD CF_STATUS
0982 F7BA C5 08 BITB #DRQ
0983 F7BC 27 F9 BEQ WTDRQ
0984 F7BE 39 RTS
0985 *
0004 END
0000 INCLUDE "sys09bug.txt"
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR
0002 OPT l
 
sys09bug.txt page 3
0004 *
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007 *
0008 * ALLEN CLARK WALLACE WATSON
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
0011 * PH. 813-977-0347 PH. 813-985-1359
0012 *
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
0014 * 2561 NANTUCKET DR APT. E
0015 * ATLANTA, GA 30345
0016 * PH. 404-320-1043
0017 *
0018 * MODIFIED TO SYS09BUG VER 1.0
0019 * FOR: SYSTEM09 FPGA SYSTEM
0020 * BY: JOHN KENT
0021 * DATE: 21ST NOVEMBER 2006
0022 * REMOVED: DISK BOOTS
0023 * MEMORY TEST
0024 * ADDED: ADM3A VDU DRIVER
0025 *
0026 * MODIFIED TO SYS09BUG VER 1.1
0027 * FOR: SYSTEM09 FPGA SYSTEM
0028 * BY: JOHN KENT
0029 * DATE: 7TH JANUARY 2007
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0032 * AND REALTIME CLOCK
0033 *
0034 * MODIFIED TO SYS09BUG VER 1.2
0035 * FOR: SYSTEM09 FPGA SYSTEM
0036 * BY: JOHN KENT
0037 * DATE: 21ST MAY 2007
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0040 *
0041 * Modified to SYS09BUG VER 1.3
0042 * FOR: SYSTEM09 FPGA SYSTEM
0043 * BY: JOHN KENT
0044 * DATE: 8TH JAN 2008
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0046 * WITH ONLY 32K OF RAM
0047 *
0048 * Modified to SYS09BUG VER 1.4
0049 * FOR: SYSTEM09 FPGA SYSTEM
0050 * BY: JOHN KENT
0051 * DATE: 3RD FEB 2008
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
0056 *
0057 * *** COMMANDS ***
0058 *
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0063 * CONTROL P = ALTER THE PROGRAM COUNTER
0064 * CONTROL U = ALTER USER STACK POINTER
0065 * CONTROL X = ALTER "X" INDEX REGISTER
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0068 * D = 5.25" MINIFLOPPY BOOT
0069 * E ssss-eeee = EXAMINE MEMORY
0070 * FROM STARTING ADDRESS ssss
0071 * TO ENDING ADDRESS eeee.
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0073 * L = LOAD TAPE
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0076 * R = DISPLAY REGISTER CONTENTS
0077 * S = DISPLAY STACK FROM ssss TO $DFC0
0078 * U = 8" DMAF2 FLOPPY BOOT
0079 * U = USER EXTENSION COMMANDS AT $F000
0080 * X = REMOVE ALL BREAKPOINTS
0081 *
0082 *
0083 ***************************************************
0084 * SYS09BUG VARIABLE SPACE
0085 ***************************************************
0086 *
0087 DFC0 ORG MONRAM
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK
0089 DFC0 NMI RMB 2 USER NMI VECTOR
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
0097 IFD DATOPT
0098 DFD0 LRARAM RMB 16 LRA ADDRESSES
0099 ENDIF DATOPT
0100 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT
0101 DFE2 ECHO RMB 1 ECHO FLAG
0102 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
0103 IFD TRAOPT
0104 NMISAV RMB 2 NMI Jump Vector Backup
0105 TRACNT RMB 2 Trace Count
0106 ENDIF TRAOPT
0106 ENDIF TRAOPT
0107 IFD VDUOPT
0108 *
0109 **************************************************
0110 * VDU8 DISPLAY DRIVER VARIABLES *
0111 **************************************************
0112 *
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0114 DFFB COLADX RMB 1 CURSOR COLUMN
0115 DFFC ROWADX RMB 1 CURSOR ROW
0116 **************************************************
0117 *
0118 DFFD NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0119 DFFE ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0120 ENDIF VDUOPT
0121 IFD DG640OPT
0122 *
0123 ***************************************************
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0125 ***************************************************
0126 *
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0128 COLADX RMB 1 CURSOR COLUMN
0129 ROWADX RMB 1 CURSOR ROW
0130 *************************************************
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
0134 ENDIF DG640OPT
0134 ENDIF DG640OPT
0135 *
0136 *
0137 ***************************************************
0138 * START OF ROM *
0139 ***************************************************
0140 *
0141 F800 ORG MONROM
0142 F800 F8 14 FDB MONITOR
0143 F802 F8 61 FDB NEXTCMD
0144 F804 FC A1 FDB INCH
0145 F806 FC 9B FDB INCHE
0146 F808 FC B9 FDB INCHEK
0147 F80A FC CE FDB OUTCH
0148 F80C FB 8F FDB PDATA
0149 F80E FB 1E FDB PCRLF
0150 F810 FB 1A FDB PSTRNG
0151 F812 FA 2E FDB LRA
0152 *
0153 IFD ADSOPT
0154 FDB PCHK CHECK FOR PRINTER INPUT
0155 FDB PINIZ INITIATE PRINTER
0156 FDB POUTCH OUTPUT CH. TO PRINTER
0157 FDB VINIZ
0158 FDB VOUTCH
0159 FDB ACINIZ
0160 FDB AOUTCH
0161 ENDIF ADSOPT
0161 ENDIF ADSOPT
0162 *
0163 * MONITOR
0164 *
0165 * VECTOR ADDRESS STRING IS.....
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0167 *
0168 F814 8E FE 74 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
0169 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
0175 *
0176 * CONTENTS FROM TO FUNCTION
0177 * $F8A1 $FE40 $DFC0 USER-V
0178 * $F8A1 $FE42 $DFC2 SWI3-V
0179 * $F8A1 $FE44 $DFC4 SWI2-V
0180 * $F8A1 $FE46 $DFC6 FIRQ-V
0181 * $F8A1 $FE48 $DFC8 IRQ-V
0182 * $FAB0 $FE4A $DFCA SWI-V
0183 * $FFFF $FE4C $DFCC SVC-VO
0184 * $FFFF $FE4E $DFCE SVC-VL
0185 *
0186 F824 8E E0 00 LDX #ACIAS
0187 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM
0188 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK
0190 F82F 6F E2 CLRSTK CLR ,-S
0191 F831 5A DECB
0192 F832 26 FB BNE CLRSTK
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
0194 F837 AF 6A STX 10,S ON STACK
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK
0196 F83B A7 E4 STA ,S
0197 F83D 1F 43 TFR S,U
0198 F83F 17 04 9F LBSR IOINIZ INITIALIZE CONTROL PORT
0199 F842 8E FE 84 LDX #MSG1 POINT TO MONITOR MESSAGE
0200 F845 17 03 47 LBSR PDATA PRINT MSG
0201 *
0202 IFD DATOPT
0203 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA
0204 F84B 4F CLRA START TOTAL AT ZERO
0205 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
0206 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
0207 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC.
0208 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL
0209 F854 19 DAA ADJ. TOTAL FOR DECIMAL
0210 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST
0211 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM
0212 F858 17 04 0C LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0213 F85B 8E FE A3 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
0214 F85E 17 03 2E LBSR PDATA PRINT MSG
0215 ENDIF DATOPT
0216 *
0217 IFD TRAOPT
0218 LBSR TRAINZ
0219 ENDIF TRAOPT
0219 ENDIF TRAOPT
0220 *
0221 ***** NEXTCMD *****
0222 *
0223 F861 8E FE AA NEXTCMD LDX #MSG3 POINT TO MSG ">"
0224 F864 17 02 B3 LBSR PSTRNG PRINT MSG
0225 F867 17 04 37 LBSR INCH GET ONE CHAR. FROM TERMINAL
0226 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
0227 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ?
0228 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
0229 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM.
0230 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ?
0231 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
0232 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO...
0233 F878 17 04 53 LBSR OUTCH PRINT "^"
0234 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR
0235 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER
0236 F87F 17 04 4C PRTCMD LBSR OUTCH PRNT CMD CHAR
0237 F882 17 04 47 LBSR OUT1S PRNT SPACE
0238 F885 C1 60 CMPB #$60
0239 F887 2F 02 BLE NXTCH0
0240 F889 C0 20 SUBB #$20
0241 *
0242 ***** DO TABLE LOOKUP *****
0243 * FOR COMMAND FUNCTIONS
0244 *
0245 F88B 8E FE 3B NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
0246 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
0247 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND
0248 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
0249 F894 8C FE 74 CMPX #TABEND REACHED END OF TABLE YET ?
0250 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
0251 F899 8E FE AC LDX #MSG4 POINT TO MSG "WHAT?"
0252 F89C 17 02 F0 LBSR PDATA PRINT MSG
0253 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
0254 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
0255 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND
0256 *
0257 * "G" GO OR CONTINUE
0258 *
0259 F8A5 1F 34 GO TFR U,S
0260 F8A7 3B RTI RTI
0261 *
0262 ***** "M" MEMORY EXAMINE AND CHANGE *****
0263 *
0264 F8A8 17 03 6B MEMCHG LBSR IN1ADR INPUT ADDRESS
0265 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN
0266 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y"
0267 F8AF 8E FE B2 MEMC2 LDX #MSG5 POINT TO MSG " - "
0268 F8B2 17 02 65 LBSR PSTRNG PRINT MSG
0269 F8B5 1F 21 TFR Y,X FETCH ADDRESS
0270 F8B7 17 03 A5 LBSR OUT4H PRINT ADDR IN HEX
0271 F8BA 17 04 0F LBSR OUT1S OUTPUT SPACE
0272 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR.
0273 F8BF 17 03 A5 LBSR OUT2H OUTPUT CONTENTS IN ASCII
0274 F8C2 17 04 07 LBSR OUT1S OUTPUT SPACE
0275 F8C5 17 03 5E LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
0276 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
0277 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)?
0278 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN
0279 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)?
0280 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN
0281 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW?
0282 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE
0283 F8D6 81 0D CMPA #$D IS IT A CR?
0284 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE
0285 F8DA 39 CHRTN RTS EXIT ROUTINE
0286 *
0287 *
0288 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY
0289 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE?
0290 F8DF 27 08 BEQ FORWRD $F972
0291 F8E1 17 03 E8 LBSR OUT1S OUTPUT SPACE
0292 F8E4 86 3F LDA #'? LOAD QUESTION MARK
0293 F8E6 17 03 E5 LBSR OUTCH PRINT IT
0294 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
0295 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS
0296 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION
0297 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS
0298 *
0299 * "S" DISPLAY STACK
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0302 *
0303 F8F1 17 02 A2 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
0304 F8F4 1F 32 TFR U,Y
0305 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
0306 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK
0307 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
0308 *
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0311 * UPPER ADDRESS IN X-REG.
0312 * IF HEX ADDRESSES ARE INVALID (V)=1.
0313 *
0314 F8FD 17 03 0B MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
0315 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
0316 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
0317 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
0318 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII
0319 F908 39 EDPRTN RTS ;
0320 *
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0322 * TO EVEN 16 BYTE BOUNDRIES.
0323 *
0324 * IF LOWER ADDR = $4532
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0326 *
0327 * IF UPPER ADDR = $4567
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0329 *
0330 * ENTER WITH LOWER ADDRESS IN X-REG.
0331 * -UPPER ADDRESS ON TOP OF STACK.
0332 *
0333 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG
0334 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS
0335 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0336 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
0337 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
0338 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
0339 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
0340 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
0341 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
0342 F91C 17 03 9A LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
0343 F91F 27 03 BEQ EDUMP
0344 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
0345 F923 39 RTS ;
0346 *
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0349 *
0350 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
0351 F926 8E FE B2 LDX #MSG5 POINT TO MSG " - "
0352 F929 17 01 EE LBSR PSTRNG PRINT MSG
0353 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
0354 F92E 17 03 2E LBSR OUT4H PRINT THE ADDRESS
0355 F931 17 03 96 LBSR OUT2S 2 SPACES
0356 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
0357 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
0358 F938 17 03 2C LBSR OUT2H OUTPUT HEX BYTE AS ASCII
0359 F93B 17 03 8E LBSR OUT1S OUTPUT SPACE
0360 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT
0361 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
0362 *
0363 * PRINT 16 ASCII CHARACTERS
0364 * IF NOT PRINTABLE OR NOT VALID
0365 * ASCII PRINT A PERIOD (.)
0366 F941 17 03 86 LBSR OUT2S 2 SPACES
0367 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
0368 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16
0369 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
0370 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
0371 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD
0372 F94E 81 7E CMPA #$7E IS IT VALID ASCII?
0373 F950 23 02 BLS PRASC IF SO PRINT IT
0374 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.)
0375 F954 17 03 77 PRASC LBSR OUTCH PRINT ASCII CHARACTER
0376 F957 5A DECB DECREMENT COUNT
0377 F958 26 EE BNE EDPASC
0378 F95A 20 BC BRA NXTLIN
0379 *
0380 ***** "B" SET BREAKPOINT *****
0381 *
0382 F95C 17 02 B7 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
0383 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR.
0384 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
0385 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT
0386 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK
0387 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
0388 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE
0389 F96D 35 10 PULS X POP BP ADDRESS FROM STACK
0390 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
0391 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS
0392 F973 81 3F CMPA #$3F IS IT A SWI?
0393 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR
0394 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE
0395 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE
0396 F97B 86 3F LDA #$3F LOAD A SWI ($3F)
0397 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS
0398 F97F 39 EXITBP RTS ;
0399 *
0400 * INDICATE ERROR SETTING BREAKPOINT
0401 *
0402 F980 17 03 49 BPERR LBSR OUT1S OUTPUT SPACE
0403 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
0404 F985 16 03 46 LBRA OUTCH PRINT "?"
0405 *
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0407 *
0408 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
0409 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0410 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
0411 F990 5A DECB $FAAC DECREMENT BP COUNTER
0412 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE?
0413 F993 39 RTS
0414 *
0415 ***** SWI ENTRY POINT *****
0416 *
0417 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER
0418 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG
0419 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
0420 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE
0421 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
0422 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK
0423 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
0424 F9A2 17 02 48 REGPR LBSR REGSTR GO PRINT REGISTERS
0425 *
0426 IFD TRAOPT
0427 LDX #0
0428 STX TRACNT
0429 ENDIF TRAOPT
0429 ENDIF TRAOPT
0430 *
0431 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND
0432 *
0433 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
0434 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
0435 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
0436 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS
0437 F9B1 81 3F CMPA #$3F IS IT SWI?
0438 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
0439 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE
0440 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
0441 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC
0442 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
0443 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
0444 F9BF A7 A0 STA ,Y+
0445 F9C1 39 RTS
0446 *
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0448 *
0449 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
0450 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER
0451 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE
0452 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
0453 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
0454 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER
0455 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
0456 F9D1 39 RTS ;
0457 *
0458 *
0459 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
0460 F9D4 39 RTS
0461 *
0462 IFD TRAOPT
0463 *
0464 ** TRACE from address AAAA BB bytes
0465 *
0466 TRACE LBSR ALTPC1 SET UP NEW PC
0467 BVS TREXIT ADDRESS ERROR, EXIT
0468 LBSR OUT1S
0469 LBSR IN1ADR Fetch Byte Count
0470 BVS TREXIT Byte Count error, EXIT
0471 STX TRACNT
0472 *
0473 LDX NMI Save NMI Vector
0474 STX NMISAV
0475 LDX #NMIE Set up NMI for Tracing
0476 STX NMI
0477 LBSR TRAINZ Initialise Hardware
0478 BRA TRACEG Start Trace
0479 TREXIT RTS
0480 *
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0482 * CRA1 = 1 CA1 Rising edge IRQ
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0485 * CRA4 = 1 ] CA2 = Set/Reset output
0486 * CRA5 = 1 ]
0487 * CRA6 = X CA2 Input Interrupt Flag
0488 * CRA7 = X CA1 Interrupt Flag
0489 *
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0491 * CRB1 = 1 CB1 Rising edge IRQ
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0494 * CRB4 = 1 ] CB2 = Set/Reset output
0495 * CRB5 = 1 ]
0496 * CRB6 = X CB2 Input Interrupt Flag
0497 * CRB7 = X CB1 Interrupt Flag
0498 *
0499 *
0500 ** TRACE NMI ENTRY POINT
0501 *
0502 NMIE TFR S,U
0503 LDA #$36 Disable Interrupt, CA2 Low
0504 STA TACTRL
0505 LDA TADATA Clear Interrupt flag by reading data port
0506 *
0507 LBSR REGSTR DUMP REGISTERS
0508 *
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
0510 LDA ,X
0511 CMPA #$3F
0512 BEQ TRACEX EXIT ON SWI
0513 *
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR
0516 LEAX -1,X DECREMENT TRACE COUNT
0517 STX TRACNT
0518 *
0519 ** TRACE GO (RESUME SINGLE STEP)
0520 *
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0523 STA TADATA
0524 LDA #$36 LOAD STROBE LOW
0525 STA TACTRL
0526 LDA TADATA CLEAR INTERRUPT
0527 LDA #$36 RELEASE RESET
0528 STA TBCTRL
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0530 STA TACTRL
0531 RTI GO EXECUTE INSTRUCTION
0532 *
0533 TRACEX LDX NMISAV Restore NMI vector
0534 STX NMI
0535 LBRA NEXTCMD Jump back to the command loop.
0536 *
0537 ** TRACE HARDWARE INITIALISATION
0538 *
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
0540 STA TACTRL
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0542 STA TBCTRL
0543 LDA #$FF PORTA = OUTPUT
0544 STA TADATA
0545 LDA #$00 PORTB = INPUT
0546 STA TBDATA
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
0548 STA TACTRL
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
0550 STA TBCTRL
0551 RTS
0552 *
0553 ENDIF TRAOPT
0553 ENDIF TRAOPT
0554 IFD MFDCOPT
0555 *
0556 ** "U" MINI DISK BOOT
0557 *
0558 MINBOOT TST CMDFDC
0559 CLR DRVFDC
0560 LDX #$0000
0561 LOOP LEAX $01,X
0562 CMPX #$0000
0563 BNE LOOP
0564 LDA #$0F
0565 STA CMDFDC
0566 BSR DELAY
0567 LOOP1 LDB CMDFDC
0568 BITB #$01
0569 BNE LOOP1
0570 LDA #$01
0571 STA SECFDC
0572 BSR DELAY
0573 LDA #$8C
0574 STA CMDFDC
0575 BSR DELAY
0576 LDX #$C000
0577 BRA LOOP3
0578 LOOP2 BITB #$02
0579 BEQ LOOP3
0580 LDA DATFDC
0581 STA ,X+
0582 LOOP3 LDB CMDFDC
0583 BITB #$01
0584 BNE LOOP2
0585 BITB #$2C
0586 BEQ LOOP4
0587 RTS
0588 *
0589 LOOP4 LDX #$C000
0590 STX $0A,U
0591 TFR U,S
0592 RTI
0593 *
0594 DELAY LDB #$04
0595 LOOP5 DECB
0596 BNE LOOP5
0597 RTS
0598 ENDIF MFDCOPT
0598 ENDIF MFDCOPT
0599 *
0600 IFD DMAFOPT
0601 *
0602 *** "D" DISK BOOT FOR DMAF2 ***
0603 *
0604 DBOOT LDA #$DE
0605 STA DRVREG
0606 LDA #$FF
0607 STA PRIREG $FAF8
0608 STA CCREG
0609 STA AAAREG
0610 STA BBBREG
0611 TST CCREG
0612 LDA #$D8
0613 STA COMREG
0614 LBSR DLY
0615 DBOOT0 LDA COMREG
0616 BMI DBOOT0
0617 LDA #$09
0618 STA COMREG
0619 LBSR DLY
0620 *
0621 DISKWT LDA COMREG FETCH DRIVE STATUS
0622 BITA #1 TEST BUSY BIT
0623 BNE DISKWT LOOP UNTIL NOT BUSY
0624 *
0625 BITA #$10
0626 BNE DBOOT
0627 *
0628 LDX #$C000 LOGICAL ADDR. = $C000
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0630 ORA #$10
0631 STA CCCREG
0632 TFR X,D
0633 COMA ;
0634 COMB ;
0635 STD ADDREG
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100
0637 STX CNTREG STORE IN COUNT REGISTER
0638 LDA #$FF LOAD THE CHANNEL REGISTER
0639 STA CCREG
0640 LDA #$FE SET CHANNEL 0
0641 STA PRIREG
0642 LDA #1 SET SECTOR TO "1"
0643 STA SECREG ISSUE COMMAND
0644 LDA #$8C SET SINGLE SECTOR READ
0645 STA COMREG ISSUE COMMAND
0646 BSR DLY
0647 *
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0652 * IS STILL A ONE THE BOOT OPERATION WILL
0653 * BE STARTED OVER FROM THE BEGINING.
0654 *
0655 CLRB ;
0656 DBOOT1 PSHS B $FB55
0657 CLRB ;
0658 DBOOT2 TST CCREG
0659 BPL DBOOT3
0660 DECB ;
0661 BNE DBOOT2
0662 PULS B
0663 DECB
0664 BNE DBOOT1
0665 BRA DBOOT
0666 DBOOT3 PULS B
0667 LDA COMREG
0668 BITA #$1C
0669 BEQ DBOOT4
0670 RTS ;
0671 *
0672 *
0673 DBOOT4 LDB #$DE
0674 STB DRVREG
0675 LDX #$C000
0676 STX 10,U
0677 TFR U,S $FB7B
0678 RTI ;
0679 ENDIF DMAFOPT
0679 ENDIF DMAFOPT
0680 *
0681 IFD CF8OPT
0682 *
0683 * COMPACT FLASH BOOT
0684 *
0685 CFBOOT BSR WAITRDY
0686 LDA #HEADLBA
0687 STA CF_HEAD
0688 BSR WAITRDY
0689 LDA #FEAT8BIT
0690 STA CF_FEATURE
0691 LDA #CMDFEATURE
0692 STA CF_COMAND
0693 BSR WAITRDY
0694 *
0695 * READ SECTORS FROM CF
0696 *
0697 CFREAD LDA #$01
0698 STA CF_SECCNT
0699 CLRA
0700 STA CF_SECNUM
0701 STA CF_CYLLO
0702 STA CF_CYLHI
0703 *
0704 LDA #CMDREAD ; IDE READ MULTIPLE
0705 STA CF_COMAND
0706 BSR WAITRDY
0707 LDX #$C000
0708 *
0709 * READ LOOP
0710 *
0711 RDLOOP BSR WAITDRQ
0712 LDA CF_DATA
0713 STA ,X+
0714 CMPX #$C200
0715 BNE RDLOOP
0716 *
0717 LDX #$C000
0718 STX $0A,U
0719 TFR U,S
0720 RTI
0721 *
0722 * WAIT UNTIL READY
0723 *
0724 WAITRDY LDA CF_STATUS
0725 BITA #BUSY
0726 BNE WAITRDY
0727 LDA CF_STATUS
0728 BITA #DRDY
0729 BEQ WAITRDY
0730 RTS
0731 *
0732 * WAIT FOR DATA REQUEST
0733 *
0734 WAITDRQ LDA CF_STATUS
0735 BITA #DRQ
0736 BEQ WAITDRQ
0737 RTS
0738 ENDIF CF8OPT
0738 ENDIF CF8OPT
0739 *
0740 IFD IDEOPT
0741 *
0742 * XESS 16 BIT IDE BOOT
0743 *
0744 F9D5 CC 00 06 IDEBOOT LDD #AUXRESET
0745 F9D8 FD E1 1E STD CF_AUX
0746 F9DB CC 00 02 LDD #AUXRSTREL
0747 F9DE FD E1 1E STD CF_AUX
0748 F9E1 CC 00 E0 LDD #HEADLBA
0749 F9E4 FD E1 0C STD CF_HEAD
0750 F9E7 8D 2E BSR WAITRDY
0751 *
0752 * READ SECTORS FROM CF
0753 *
0754 F9E9 CC 00 01 LDD #$01
0755 F9EC FD E1 04 STD CF_SECCNT
0756 F9EF 5F CLRB
0757 F9F0 FD E1 06 STD CF_SECNUM
0758 F9F3 FD E1 08 STD CF_CYLLO
0759 F9F6 FD E1 0A STD CF_CYLHI
0760 *
0761 F9F9 C6 20 LDB #CMDREAD ; IDE READ MULTIPLE
0762 F9FB FD E1 0E STD CF_COMAND
0763 F9FE 8D 17 BSR WAITRDY
0764 FA00 8E C0 00 LDX #$C000
0765 *
0766 * READ LOOP
0767 *
0768 FA03 8D 21 RDLOOP BSR WAITDRQ
0769 FA05 FC E1 00 LDD CF_DATA
0770 FA08 E7 80 STB ,X+
0771 FA0A 8C C1 00 CMPX #$C100
0772 FA0D 26 F4 BNE RDLOOP
0773 *
0774 FA0F 8E C0 00 LDX #$C000
0775 FA12 AF 4A STX $0A,U
0776 FA14 1F 34 TFR U,S
0777 FA16 3B RTI
0778 *
0779 * WAIT UNTIL READY
0780 *
0781 FA17 FC E1 0E WAITRDY LDD CF_STATUS
0782 FA1A C5 80 BITB #BUSY
0783 FA1C 26 F9 BNE WAITRDY
0784 FA1E FC E1 0E LDD CF_STATUS
0785 FA21 C5 40 BITB #DRDY
0786 FA23 27 F2 BEQ WAITRDY
0787 FA25 39 RTS
0788 *
0789 * WAIT FOR DATA REQUEST
0790 *
0791 FA26 FC E1 0E WAITDRQ LDD CF_STATUS
0792 FA29 C5 08 BITB #DRQ
0793 FA2B 27 F9 BEQ WAITDRQ
0794 FA2D 39 RTS
0795 ENDIF IDEOPT
0796 *
0797 IFD RTCOPT
0798 *
0799 * CLOCK INTER FACE UTILITY
0800 *
0801 * TIME <Hours> <Minuits> <Seconds>
0802 * If no argument is specified, the current time
0803 * will be displayed.
0804 *
0805 * READ A REGISTER FROM THE COUNTER.
0806 * The X Index rgister points to the register
0807 * to be read. The Status Register is checked
0808 * before and after the register is read before
0809 * returning a value in accumulator A
0810 *
0811 RDCLK TST CLKSTA
0812 BNE RDCLK
0813 RDCLK1 LDA 0,X
0814 TST CLKSTA
0815 BNE RDCLK1
0816 RTS
0817 *
0818 * MAIN PROGRAM:
0819 *
0820 TIMSET LDX #COUNTR POINT TO TIMER
0821 LBSR BYTE READ HOURS
0822 BVS SHOWTM NO ARG, DISP TIME
0823 STA HOUR,X
0824 LBSR OUT1S
0825 LBSR BYTE READ MINUITES
0826 BVS SHOWTM
0827 STA MINUIT,X
0828 LBSR OUT1S
0829 LBSR BYTE SECONDS.
0830 BVS SHOWTM
0831 STA SECOND,X
0832 *
0833 * DISPLAY CURRENT TIME
0834 *
0835 SHOWTM LBSR PCRLF
0836 LDX #COUNTR+HOUR
0837 LDB #3
0838 SHOWLP BSR RDCLK
0839 LBSR OUT2H
0840 LDA #':
0841 LBSR OUTCH
0842 LEAX -1,X
0843 DECB
0844 BNE SHOWLP
0845 RTS
0846 *
0847 * INITIATE CLOCK.
0848 * MASK INTERRUPTS.
0849 *
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS
0851 TST CINTSR CLEAR ANY INTERRUPTS
0852 RTS
0853 ENDIF RTCOPT
0853 ENDIF RTCOPT
0854 IFD DATOPT
0855 *
0856 ***** LRA LOAD REAL ADDRESS *****
0857 *
0858 * THE FOLLOWING CODE LOADS THE 20-BIT
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE
0860 * INTO THE "A" AND "X" REGISTERS. THIS
0861 * ROUTINE IS ENTERED WITH THE LOGICAL
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0863 * REGISTER. EXIT IS MADE WITH THE HIGH-
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0865 * ADDRESS IN THE "A" REGISTER, AND THE
0866 * LOW-ORDER 16-BITS OF THE 20-BIT
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0868 * ALL OTHER REGISTERS ARE PRESERVED.
0869 * THIS ROUTINE IS REQUIRED SINCE THE
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0871 * PRESENT PHYSICAL ADDRESSES ON THE
0872 * SYSTEM BUS.
0873 *
0874 FA2E 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
0875 FA30 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
0876 FA32 44 LSRA ;
0877 FA33 44 LSRA ADJ FOR INDEXED INTO
0878 FA34 44 LSRA CORRESPONDING LOCATION
0879 FA35 44 LSRA IN LRA TABLE
0880 FA36 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
0881 FA3A E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
0882 FA3C 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
0883 FA3D 54 LSRB PHYSICAL ADDRESS.
0884 FA3E 54 LSRB EXTENDED MS 4-BITS ARE RETURNED
0885 FA3F 54 LSRB IN THE "A" ACCUMULATOR
0886 FA40 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
0887 FA42 E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
0888 FA44 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0889 FA45 58 ASLB ADJ DATA FOR RELOCATION IN X REG
0890 FA46 58 ASLB ;
0891 FA47 58 ASLB $FB97
0892 FA48 58 ASLB ;
0893 FA49 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR.
0894 FA4B 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
0895 FA4D A7 62 STA 2,S SAVE IT IN X REG ON STACK
0896 FA4F EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
0897 *
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0899 FA51 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
0900 * ON STACK
0901 FA53 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK
0902 ENDIF DATOPT
0903 *
0904 * DELAY LOOP
0905 *
0906 FA55 34 04 DLY PSHS B SAVE CONTENTS OF "B"
0907 FA57 C6 20 LDB #$20 GET LOOP DELAY VALUE
0908 FA59 5A SUB1 DECB SUBTRACT ONE FROM VALUE
0909 FA5A 26 FD BNE SUB1 LOOP UNTIL ZERO
0910 FA5C 35 84 PULS B,PC RESTORE CONTENTS OF "B"
0911 * RTS ;
0912 *
0913 ***** "L" LOAD MIKBUG TAPE *****
0914 *
0915 FA5E BD FC E3 LOAD JSR ACINIZ
0916 FA61 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE
0917 FA63 17 02 68 LBSR OUTCH OUTPUT IT TO TERMINAL PORT
0918 FA66 7F DF E2 CLR ECHO TURN OFF ECHO FLAG
0919 FA69 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
0920 FA6C 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
0921 FA6E 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
0922 FA70 17 02 23 LBSR ECHON
0923 FA73 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
0924 FA75 27 3D BEQ LOAD21 IF SO, EXIT LOAD
0925 FA77 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
0926 FA79 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR.
0927 FA7B 17 01 A8 LBSR BYTE INPUT BYTE COUNT
0928 FA7E 34 02 PSHS A PUSH COUNT ON STACK
0929 FA80 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX
0930 FA82 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS
0931 FA85 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX
0932 FA87 34 10 PSHS X PUSH ADDR ON STACK
0933 FA89 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
0934 FA8B EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
0935 FA8D EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
0936 FA8F 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
0937 FA91 6A E4 DEC ,S ADDRESS BYTES.
0938 FA93 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK
0939 FA95 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
0940 FA98 35 04 PULS B POP CHECKSUM FROM STACK
0941 FA9A 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX
0942 FA9C 34 02 PSHS A PUSH DATA BYTE ON STACK
0943 FA9E EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
0944 FAA0 6A E4 DEC ,S DECREMENT BYTE COUNT 1
0945 FAA2 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
0946 FAA4 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY
0947 FAA6 20 EB BRA LOAD10 GET NEXT DATA BYTE
0948 FAA8 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
0949 FAA9 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
0950 FAAB C1 FF CMPB #$FF CHECKSUM OK?
0951 FAAD 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE
0952 FAAF 86 3F LDA #'? LOAD (?) ERROR INDICATOR
0953 FAB1 17 02 1A LBSR OUTCH OUTPUT IT TO TERMINAL
0954 FAB4 73 DF E2 LOAD21 COM ECHO TURN ECHO ON
0955 FAB7 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
0956 FAB9 16 02 12 LBRA OUTCH OUTPUT IT
0957 *
0958 ***** "P" PUNCH MIKBUG TAPE *****
0959 *
0960 FABC 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
0961 FABE 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS
0962 FAC1 34 30 PSHS X,Y SAVE ADDRESSES ON STACK
0963 FAC3 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
0964 FAC5 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR
0965 FAC7 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
0966 FAC9 30 01 LEAX 1,X INCREMENT END ADDRESS
0967 FACB AF E4 STX ,S STORE END ADDR ON STACK
0968 FACD BD FC E3 JSR ACINIZ
0969 FAD0 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE
0970 FAD2 17 01 F9 LBSR OUTCH OUTPUT IT TO TERMINAL
0971 FAD5 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
0972 FAD7 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END
0973 FAD9 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
0974 FADB 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES?
0975 FADF 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES
0976 FAE1 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
0977 FAE3 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
0978 FAE5 8E FE F3 LDX #MSG20 POINT TO MSG "S1"
0979 FAE8 17 00 2F LBSR PSTRNG PRINT MSG
0980 FAEB CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT
0981 FAED 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
0982 FAEF 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT
0983 FAF2 AE 62 LDX 2,S LOAD BEGIN ADDRESS
0984 FAF4 17 01 68 LBSR OUT4H PUNCH ADDRESS
0985 FAF7 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM
0986 FAF9 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM
0987 FAFB EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
0988 FAFD A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH
0989 FAFF 17 01 65 LBSR OUT2H OUTPUT DATA BYTE
0990 FB02 6A 64 DEC 4,S DECREMENT BYTE COUNT
0991 FB04 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
0992 FB06 53 COMB 1's COMPLIMENT CHECKSUM BYTE
0993 FB07 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH
0994 FB09 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE
0995 FB0C AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
0996 FB0E AC E4 CMPX ,S COMPARE IT TO END ADDR
0997 FB10 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
0998 FB12 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
0999 FB14 17 01 B7 LBSR OUTCH OUTPUT IT
1000 FB17 32 65 LEAS 5,S READJUST STACK POINTER
1001 FB19 39 RTS ;
1002 *
1003 * PRINT STRING PRECEEDED BY A CR & LF.
1004 *
1005 FB1A 8D 02 PSTRNG BSR PCRLF PRINT CR/LF
1006 FB1C 20 71 BRA PDATA PRINT STRING POINTED TO BY IX
1007 *
1008 * PCRLF
1009 *
1010 FB1E 34 10 PCRLF PSHS X SAVE IX
1011 FB20 8E FE A4 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
1012 FB23 17 00 69 LBSR PDATA PRINT MSG
1013 FB26 35 90 PULS X,PC RESTORE IX & RETURN
1014 *
1015 * LONG BRANCHES TO COMMON ROUTINES
1016 *
1017 FB28 16 01 A1 JOUT1S LBRA OUT1S
1018 FB2B 16 00 F8 JBYTE LBRA BYTE
1019 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR
1020 *
1021 * ALTER "PC" PROGRAM COUNTER
1022 *
1023 FB31 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
1024 FB34 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE
1025 FB36 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC"
1026 FB38 29 02 BVS ALTPCD EXIT IF INVALID HEX
1027 FB3A AF 4A STX 10,U POKE IN NEW CONTENTS
1028 FB3C 39 ALTPCD RTS ;
1029 *
1030 * ALTER "U" USER STACK POINTER
1031 *
1032 FB3D 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
1033 FB3F 8D E7 BSR JOUT1S OUTPUT SPACE
1034 FB41 8D EB BSR JIN1ADR
1035 FB43 29 02 BVS ALTUD
1036 FB45 AF 48 STX 8,U
1037 FB47 39 ALTUD RTS ;
1038 *
1039 * ALTER "Y" INDEX REGISTER
1040 *
1041 FB48 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = "
1042 FB4A 8D DC BSR JOUT1S OUTPUT SPACE
1043 FB4C 8D E0 BSR JIN1ADR
1044 FB4E 29 02 BVS ALTYD
1045 FB50 AF 46 STX 6,U $F8F0
1046 FB52 39 ALTYD RTS ;
1047 *
1048 * ALTER "X" INDEX REGISTER
1049 *
1050 FB53 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
1051 FB55 8D D1 BSR JOUT1S OUTPUT SPACE
1052 FB57 8D D5 BSR JIN1ADR
1053 FB59 29 02 BVS ALTXD
1054 FB5B AF 44 STX 4,U
1055 FB5D 39 ALTXD RTS ;
1056 *
1057 * ALTER "DP" DIRECT PAGE REGISTER
1058 *
1059 FB5E 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
1060 FB60 8D C6 BSR JOUT1S OUTPUT SPACE
1061 FB62 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1062 FB64 29 02 BVS ALTDPD
1063 FB66 A7 43 STA 3,U
1064 FB68 39 ALTDPD RTS ;
1065 *
1066 * ALTER "B" ACCUMULATOR
1067 *
1068 FB69 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = "
1069 FB6B 8D BB BSR JOUT1S OUTPUT SPACE
1070 FB6D 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR)
1071 FB6F 29 02 BVS ALTBD
1072 FB71 A7 42 STA 2,U
1073 FB73 39 ALTBD RTS $F91C
1074 *
1075 * ALTER "A" ACCUMULATOR
1076 *
1077 FB74 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = "
1078 FB76 8D B0 BSR JOUT1S OUTPUT SPACE
1079 FB78 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1080 FB7A 29 02 BVS ALTAD
1081 FB7C A7 41 STA 1,U
1082 FB7E 39 ALTAD RTS ;
1083 *
1084 * ALTER "CC" REGISTER
1085 *
1086 FB7F 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
1087 FB81 8D A5 BSR JOUT1S OUTPUT SPACE
1088 FB83 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR)
1089 FB85 29 04 BVS ALTCCD
1090 FB87 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST
1091 FB89 A7 C4 STA ,U
1092 FB8B 39 ALTCCD RTS ;
1093 *
1094 * PDATA
1095 *
1096 FB8C 17 01 3F PRINT LBSR OUTCH
1097 FB8F A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT
1098 FB91 81 04 CMPA #4 IS IT EOT?
1099 FB93 26 F7 BNE PRINT IF NOT EOT PRINT IT
1100 FB95 39 RTS ;
1101 *
1102 * PRINT REGISTERS
1103 *
1104 FB96 8E FE B6 PRTSP LDX #MSG10 POINT TO MSG "SP="
1105 FB99 8D F4 BSR PDATA PRINT MSG
1106 FB9B 1F 31 TFR U,X
1107 FB9D 16 00 BF JOUT4H LBRA OUT4H
1108 *
1109 FBA0 8E FE C2 PRTUS LDX #MSG12 POINT TO MSG "US="
1110 FBA3 8D EA BSR PDATA PRINT MSG
1111 FBA5 AE 48 LDX 8,U
1112 FBA7 20 F4 BRA JOUT4H
1113 *
1114 FBA9 8E FE D4 PRTDP LDX #MSG15 POINT TO MSG "DP="
1115 FBAC 8D E1 BSR PDATA PRINT MSG
1116 FBAE A6 43 LDA 3,U
1117 FBB0 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
1118 *
1119 FBB3 8E FE CE PRTIX LDX #MSG14 POINT TO MSG "IX="
1120 FBB6 8D D7 BSR PDATA PRINT MSG
1121 FBB8 AE 44 LDX 4,U $FCE6
1122 FBBA 20 E1 BRA JOUT4H
1123 *
1124 FBBC 8E FE C8 PRTIY LDX #MSG13 POINT TO MSG "IY="
1125 FBBF 8D CE BSR PDATA PRINT MSG
1126 FBC1 AE 46 LDX 6,U
1127 FBC3 20 D8 BRA JOUT4H
1128 *
1129 FBC5 8E FE BC PRTPC LDX #MSG11 POINT TO MSG "PC="
1130 FBC8 8D C5 BSR PDATA PRINT MSG
1131 FBCA AE 4A LDX 10,U
1132 FBCC 20 CF BRA JOUT4H
1133 *
1134 FBCE 8E FE DA PRTA LDX #MSG16 POINT TO MSG "A="
1135 FBD1 8D BC BSR PDATA PRINT MSG
1136 FBD3 A6 41 LDA 1,U
1137 FBD5 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1138 *
1139 FBD7 8E FE DF PRTB LDX #MSG17 POINT TO MSG "B="
1140 FBDA 8D B3 BSR PDATA PRINT MSG
1141 FBDC A6 42 LDA 2,U
1142 FBDE 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII
1143 *
1144 FBE0 8E FE E4 PRTCC LDX #MSG18 POINT TO MSG "CC:"
1145 FBE3 8D AA BSR PDATA PRINT MSG
1146 FBE5 A6 C4 LDA ,U
1147 FBE7 8E FE EB LDX #MSG19 POINT TO MSG "EFHINZVC"
1148 FBEA 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
1149 *
1150 * "R" DISPLAY REGISTERS
1151 *
1152 FBED 8E FE B2 REGSTR LDX #MSG5 POINT TO MSG " - "
1153 FBF0 17 FF 27 LBSR PSTRNG PRINT MSG
1154 FBF3 8D A1 BSR PRTSP $FCBF
1155 FBF5 8D A9 BSR PRTUS $FCCA
1156 FBF7 8D B0 BSR PRTDP $FCD5
1157 FBF9 8D B8 BSR PRTIX $FCE0
1158 FBFB 8D BF BSR PRTIY $FCEB
1159 FBFD 8E FE B2 LDX #MSG5 POINT TO MSG " - "
1160 FC00 17 FF 17 LBSR PSTRNG PRINT MSG
1161 FC03 8D C0 BSR PRTPC $FCF5
1162 FC05 8D C7 BSR PRTA $FCFF
1163 FC07 8D CE BSR PRTB $FD09
1164 FC09 20 D5 BRA PRTCC $FD13
1165 *
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1171 * ADDRESS IS INPUT.
1172 *
1173 FC0B 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS
1174 FC0D 29 4D BVS NOTHEX EXIT IF NOT VALID HEX
1175 FC0F 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY"
1176 FC11 86 2D LDA #'-
1177 FC13 17 00 B8 LBSR OUTCH PRINT " - "
1178 *
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1182 *
1183 FC16 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
1184 FC18 29 42 BVS NOTHEX EXIT IF NOT VALID HEX
1185 FC1A 1F 01 TFR D,X
1186 FC1C 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR)
1187 FC1E 29 3C BVS NOTHEX
1188 FC20 34 10 PSHS X
1189 FC22 A7 61 STA 1,S
1190 FC24 35 90 PULS X,PC
1191 *
1192 ***** INPUT BYTE (2 HEX CHAR.) *****
1193 *
1194 FC26 8D 11 BYTE BSR INHEX GET HEX LEFT
1195 FC28 29 32 BVS NOTHEX EXIT IF NOT VALID HEX
1196 FC2A 48 ASLA ;
1197 FC2B 48 ASLA ;
1198 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE
1199 FC2D 48 ASLA ;
1200 FC2E 1F 89 TFR A,B PUT HEXL IN "B"
1201 FC30 8D 07 BSR INHEX GET HEX RIGHT
1202 FC32 29 28 BVS NOTHEX EXIT IF NOT VALID HEX
1203 FC34 34 04 PSHS B PUSH HEXL ON STACK
1204 FC36 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
1205 FC38 39 RTS RETURN WITH HEX L&R IN "A"
1206 *
1207 *
1208 FC39 8D 5B INHEX BSR ECHON INPUT ASCII CHAR.
1209 FC3B 81 30 CMPA #'0 IS IT > OR = "0" ?
1210 FC3D 25 1D BCS NOTHEX IF LESS IT AIN'T HEX
1211 FC3F 81 39 CMPA #'9 IS IT < OR = "9" ?
1212 FC41 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA
1213 FC43 80 30 SUBA #$30 ASCII ADJ. NUMERIC
1214 FC45 39 RTS ;
1215 *
1216 *
1217 FC46 81 41 INHEXA CMPA #'A IS IT > OR = "A"
1218 FC48 25 12 BCS NOTHEX IF LESS IT AIN'T HEX
1219 FC4A 81 46 CMPA #'F IS IT < OR = "F" ?
1220 FC4C 22 03 BHI INHEXL IF > IT AIN'T HEX
1221 FC4E 80 37 SUBA #$37 ASCII ADJ. ALPHA
1222 FC50 39 RTS ;
1223 *
1224 FC51 81 61 INHEXL CMPA #'a IS IT > OR = "a"
1225 FC53 25 07 BCS NOTHEX IF LESS IT AIN'T HEX
1226 FC55 81 66 CMPA #'f IS IT < "f"
1227 FC57 22 03 BHI NOTHEX IF > IT AIN'T HEX
1228 FC59 80 57 SUBA #$57 ADJUST TO LOWER CASE
1229 FC5B 39 RTS ;
1230 *
1231 *
1232 FC5C 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
1233 FC5E 39 RTS ;
1234 *
1235 *
1236 FC5F 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK
1237 FC61 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC.
1238 FC63 8D 02 BSR OUTHL OUTPUT HEX LEFT
1239 FC65 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC.
1240 FC67 OUTHL EQU *
1241 FC67 34 02 OUT2H PSHS A SAVE IT BACK ON STACK
1242 FC69 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII
1243 FC6A 44 LSRA ;
1244 FC6B 44 LSRA ;
1245 FC6C 44 LSRA ;
1246 FC6D 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII
1247 FC6F 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
1248 FC71 84 0F ANDA #$0F STRIP LEFT NIBBLE
1249 FC73 8B 30 XASCII ADDA #$30 ASCII ADJ
1250 FC75 81 39 CMPA #$39 IS IT < OR = "9" ?
1251 FC77 2F 02 BLE OUTC IF LESS, OUTPUT IT
1252 FC79 8B 07 ADDA #7 IF > MAKE ASCII LETTER
1253 FC7B 20 51 OUTC BRA OUTCH OUTPUT CHAR
1254 *
1255 * BINARY / ASCII --- THIS ROUTINE
1256 * OUTPUTS A BYTE IN ENHANCED
1257 * BINARY FORMAT. THE ENHANCEMENT
1258 * IS DONE BY SUBSTITUTING ASCII
1259 * LETTERS FOR THE ONES IN THE BYTE.
1260 * THE ASCII ENHANCEMENT LETTERS
1261 * ARE OBTAINED FROM THE STRING
1262 * POINTED TO BY THE INDEX REG. "X".
1263 *
1264 FC7D 34 02 BIASCI PSHS A SAVE "A" ON STACK
1265 FC7F C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE
1266 FC81 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING
1267 FC83 68 E4 ASL ,S TEST BYTE FOR "1" IN B7
1268 FC85 25 02 BCS PRTBA IF ONE PRINT LETTER
1269 FC87 86 2D LDA #'- IF ZERO PRINT "-"
1270 FC89 8D 43 PRTBA BSR OUTCH PRINT IT
1271 FC8B 8D 3F BSR OUT1S PRINT SPACE
1272 FC8D 5A DECB SUB 1 FROM #BITS YET TO PRINT
1273 FC8E 26 F1 BNE OUTBA
1274 FC90 35 82 PULS A,PC
1275 *
1276 IFD EXTOPT
1277 *
1278 * EXTENDED USER COMMANDS
1279 *
1280 FC92 6E 9F F0 00 USRCMD JMP [MONEXT+EXTCMD]
1281 ENDIF EXTOPT
1282 *
1283 *
1284 FC96 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ?
1285 FC99 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR
1286 *
1287 * INCHE
1288 *
1289 * ---GETS CHARACTER FROM TERMINAL AND
1290 * ECHOS SAME. THE CHARACTER IS RETURNED
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY
1292 * BIT MASKED OFF. ALL OTHER REGISTERS
1293 * ARE PRESERVED.
1294 *
1295 FC9B 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL
1296 FC9D 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1297 FC9F 20 2D BRA OUTCH ECHO CHAR TO TERMINAL
1298 *
1299 * INCH
1300 *
1301 * GET CHARACTER FROM TERMINAL. RETURN
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1304 * IS 8 BITS AND IS NOT ECHOED.
1305 *
1306 *
1307 FCA1 34 10 INCH PSHS X SAVE IX
1308 FCA3 BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT
1309 FCA6 A6 84 LDA ,X FETCH PORT STATUS
1310 FCA8 85 01 BITA #1 TEST READY BIT, RDRF ?
1311 IFD PS2OPT
1312 FCAA 26 09 BNE GETST1
1313 FCAC 8E E0 20 LDX #PS2KBD
1314 FCAF A6 84 LDA ,X
1315 FCB1 85 01 BITA #1
1316 ENDIF PS2OPT
1317 FCB3 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
1318 FCB5 A6 01 GETST1 LDA 1,X FETCH CHAR
1319 FCB7 35 90 PULS X,PC RESTORE IX
1320 *
1321 * INCHEK
1322 *
1323 * CHECK FOR A CHARACTER AVAILABLE FROM
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1325 * FOR READ READY. ALL REGISTERS ARE
1326 * PRESERVED, AND THE "Z" BIT WILL BE
1327 * CLEAR IF A CHARACTER CAN BE READ.
1328 *
1329 *
1330 FCB9 34 02 INCHEK PSHS A SAVE A ACCUM.
1331 FCBB A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS
1332 FCBF 85 01 BITA #1 TEST READY BIT, RDRF ?
1333 IFD PS2OPT
1334 FCC1 26 05 BNE INCHEK1
1335 FCC3 B6 E0 20 LDA PS2KBD
1336 FCC6 85 01 BITA #1 TEST READY BIT< RDRF ?
1337 ENDIF PS2OPT
1338 FCC8 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM.
1339 *
1340 FCCA 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES
1341 FCCC 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE
1342 *
1343 *
1344 * OUTCH
1345 *
1346 * OUTPUT CHARACTER TO TERMINAL.
1347 * THE CHAR. TO BE OUTPUT IS
1348 * PASSED IN THE A REGISTER.
1349 * ALL REGISTERS ARE PRESERVED.
1350 *
1351 OUTCH IFD VDUOPT
1352 FCCE 8D 45 BSR VOUTCH
1353 ENDIF VDUOPT
1354 IFD DG640OPT
1355 BSR VOUTCH
1356 ENDIF DG640OPT
1356 ENDIF DG640OPT
1357 FCD0 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX
1358 FCD2 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL
1359 FCD5 A6 84 FETSTA LDA ,X FETCH PORT STATUS
1360 FCD7 85 02 BITA #2 TEST TDRE, OK TO XMIT ?
1361 FCD9 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY
1362 FCDB 35 02 PULS A GET CHAR. FOR XMIT
1363 FCDD A7 01 STA 1,X XMIT CHAR.
1364 FCDF 35 90 PULS X,PC RESTORE IX
1365 *
1366 * IO INITIALIZATION
1367 *
1368 FCE1 IOINIZ EQU *
1369 IFD VDUOPT
1370 FCE1 8D 13 BSR VINIZ
1371 ENDIF VDUOPT
1372 IFD DG640OPT
1373 BSR VINIZ
1374 ENDIF DG640OPT
1374 ENDIF DG640OPT
1375 FCE3 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
1376 FCE6 86 03 LDA #3 RESET ACIA PORT CODE
1377 FCE8 A7 84 STA ,X STORE IN CONTROL REGISTER
1378 FCEA 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
1379 FCEC A7 84 STA ,X STORE IN CONTROL REGISTER
1380 FCEE 6D 01 TST 1,X ANYTHING IN DATA REGISTER?
1381 FCF0 86 FF LDA #$FF TURN ON ECHO FLAG
1382 FCF2 B7 DF E2 STA ECHO
1383 FCF5 39 RTS
1384 *
1385 IFD VDUOPT
1386 *
1387 ***************************************************
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1389 * *
1390 * 80 x 25 Characters
1391 *
1392 ***************************************************
1393 *
1394 ***************************************************
1395 * INITIALIZE EMULATOR *
1396 ***************************************************
1397 *
1398 FCF6 8E E0 30 VINIZ LDX #VDU
1399 FCF9 CC 00 00 LDD #0
1400 FCFC FD DF FB STD COLADX AND ROWADX
1401 FCFF A7 02 STA VDUCOL,X
1402 FD01 E7 03 STB VDUROW,X
1403 FD03 E7 04 STB VDUOFF,X
1404 FD05 FD DF FD STD NEWROW AND ESCFLG
1405 FD08 C6 02 LDB #$02
1406 FD0A E7 01 STB VDUATT,X
1407 FD0C 7F DF FE CLR ESCFLG
1408 FD0F 86 1B LDA #$1B SEND ESCAPE
1409 FD11 8D 02 BSR VOUTCH
1410 FD13 86 59 LDA #'Y CLEAR TO END OF SCREEN
1411 *
1412 ** VIDEO OUTPUT ROUTINE
1413 *
1414 FD15 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS
1415 FD17 8E E0 30 LDX #VDU POINT TO VDU REGISTERS
1416 *
1417 ** CHECK FOR ESCAPE SEQUENCE
1418 *
1419 FD1A 7D DF FE TST ESCFLG ESCAPE ACTIVE?
1420 FD1D 27 04 BEQ SOROU1 BRANCH IF NOT
1421 FD1F 8D 74 BSR ESCAPE ELSE DO ESCAPE
1422 FD21 20 0D BRA RETURN AND RETURN
1423 *
1424 ** CHECK FOR CONTROL CHARACTERS
1425 *
1426 FD23 81 20 SOROU1 CMPA #$20 CONTROL CODES?
1427 FD25 24 04 BHS SOROU2
1428 FD27 8D 09 BSR CONTRL BRANCH IF SO
1429 FD29 20 05 BRA RETURN
1430 *
1431 ** OUTPUT TEXT CHARACTER
1432 *
1433 FD2B A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
1434 FD2D 17 00 C5 LBSR NEWCOL UPDATE COLUMN
1435 *
1436 ** DISPLAY CURSOR AND RETURN
1437 *
1438 FD30 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1439 *
1440 ***************************************************
1441 * CONTROL CODE HANDLERS *
1442 ***************************************************
1443 *
1444 FD32 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1445 FD34 10 27 00 41 LBEQ BACKSP
1446 FD38 81 1B CMPA #$1B ESCAPE SEQUENCE?
1447 FD3A 10 27 00 6C LBEQ SETESC
1448 FD3E 81 1A CMPA #$1A CTRL Z - Clear Screen
1449 FD40 10 27 00 8E LBEQ CLRSCR
1450 FD44 81 16 CMPA #$16 CTRL ^ - Home
1451 FD46 10 27 00 45 LBEQ HOME
1452 FD4A 81 0D CMPA #$D CTRL M - RETURN?
1453 FD4C 10 27 00 99 LBEQ CRETN
1454 FD50 81 0C CMPA #$0C CTRL L - CHAR RIGHT
1455 FD52 10 27 00 2C LBEQ CHRIGHT
1456 FD56 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE
1457 FD58 10 27 00 11 LBEQ LINEUP
1458 FD5C 81 0A CMPA #$0A CTRL J - LINE FEED
1459 FD5E 26 51 BNE RETESC NONE OF THESE, RETURN
1460 *
1461 ***************************************** LINE FEED
1462 *
1463 FD60 FC DF FB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1464 FD63 5C INCB BUMP ROW
1465 FD64 C1 19 CMPB #NUMLIN SCROLL TIME?
1466 FD66 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT
1467 FD6A 16 00 99 LBRA SCROLL ELSE SCROLL IT
1468 *
1469 ***************************************** LINE FEED
1470 *
1471 FD6D FC DF FB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1472 FD70 5D TSTB AT TOP OF SCREEN ?
1473 FD71 10 27 00 3C LBEQ RETESC Yes, Ignore
1474 FD75 5A DECB No, Decrement ROW
1475 FD76 16 00 74 LBRA NEWCUR POSITION CURSOR
1476 *
1477 *********************************** BACK SPACE
1478 *
1479 FD79 B6 DF FB BACKSP LDA COLADX
1480 FD7C 27 33 BEQ RETESC RETURN
1481 FD7E 4A DECA
1482 FD7F 16 00 68 LBRA POSCOL POSITION CURSOR
1483 *
1484 *********************************** CURSOR RIGHT
1485 *
1486 FD82 B6 DF FB CHRIGHT LDA COLADX
1487 FD85 4C INCA
1488 FD86 81 50 CMPA #LINLEN
1489 FD88 10 27 00 25 LBEQ RETESC
1490 FD8C 16 00 5B LBRA POSCOL
1491 *
1492 *********************************** CURSOR RIGHT
1493 *
1494 FD8F CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN
1495 FD92 16 00 58 LBRA NEWCUR
1496 *
1497 ***************************************************
1498 * ESCAPE HANDLERS *
1499 ***************************************************
1500 *
1501 FD95 F6 DF FE ESCAPE LDAB ESCFLG GET FLAG
1502 FD98 C1 3D CMPB #'= SETTING CURSOR?
1503 FD9A 27 16 BEQ ESCCUR BRANCH IF SO
1504 FD9C 81 59 CMPA #'Y CLEAR TO END OF SCREEN?
1505 FD9E 10 27 00 6E LBEQ ESCCLS
1506 FDA2 81 54 CMPA #'T CLEAR TO END OF LINE?
1507 FDA4 27 31 BEQ ESCCLL
1508 FDA6 81 3D CMPA #'= STARTING CURSOR SET?
1509 FDA8 26 04 BNE CLRESC BRANCH IF NOT
1510 *
1511 ***************************** START ESCAPE SEQUENCE
1512 *
1513 FDAA B7 DF FE SETESC STAA ESCFLG ELSE START CURSORING
1514 FDAD 39 RTS AND RETURN
1515 *
1516 FDAE 7F DF FE CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1517 FDB1 39 RETESC RTS SO RETURN
1518 *
1519 ********************************* SET SCREEN CURSOR
1520 *
1521 FDB2 7D DF FD ESCCUR TST NEWROW ROW SET?
1522 FDB5 26 04 BNE ESCCU1 BRANCH IF SO
1523 FDB7 B7 DF FD STAA NEWROW ELSE SET NEW ROW
1524 FDBA 39 RTS AND RETURN
1525 *
1526 FDBB 7F DF FE ESCCU1 CLR ESCFLG
1527 FDBE 80 20 SUBA #$20 ADJUST COLUMN ADDRESS
1528 FDC0 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1529 FDC2 22 ED BHI RETESC NOT OK, DO NOTHING
1530 *
1531 FDC4 F6 DF FD ESCCU2 LDAB NEWROW
1532 FDC7 7F DF FD CLR NEWROW
1533 FDCA C0 20 SUBB #$20 ADJUST TO ROW ADDRESS
1534 FDCC C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1535 FDCE 22 E1 BHI RETESC ELSE RETURN DOING NOTHING
1536 FDD0 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO
1537 *
1538 ****************** CLEAR FROM CURSOR TO END OF LINE
1539 FDD2 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
1540 FDD5 8D 16 BSR NEWCUR
1541 FDD7 B6 DF FB ESCCLL LDA COLADX
1542 FDDA C6 20 LDB #$20 AND CLEAR CHAR
1543 FDDC E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT
1544 FDDE 4C INCA
1545 FDDF A7 02 STA VDUCOL,X
1546 FDE1 81 50 CMPA #LINLEN UNTIL END OF LINE
1547 FDE3 26 F7 BNE ESCCL1
1548 FDE5 7F DF FE CLR ESCFLG
1549 FDE8 39 RTS
1550 *
1551 *********************************** CARRIAGE RETURN
1552 *
1553 FDE9 4F CRETN CLRA SET COLUMN ZERO
1554 FDEA F6 DF FC POSCOL LDB ROWADX GET CURRENT ROW
1555 *
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN
1557 *
1558 FDED FD DF FB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1559 FDF0 A7 02 STA VDUCOL,X SET NEW COLUMN
1560 FDF2 E7 03 STB VDUROW,X SET NEW ROW
1561 FDF4 39 RTS AND RETURN
1562 *
1563 ********************* UPDATE CURRENT COLUMN AND ROW
1564 *
1565 FDF5 FC DF FB NEWCOL LDD COLADX GET ROW AND COLUMN
1566 FDF8 4C INCA BUMP COLUMN
1567 FDF9 81 50 CMPA #LINLEN ROLL?
1568 FDFB 26 F0 BNE NEWCUR BRANCH IF NOT
1569 FDFD 4F CLRA ELSE RESET TO ZERO
1570 FDFE 5C INCB AND BUMP ROW
1571 FDFF C1 19 CMPB #NUMLIN
1572 FE01 26 EA BNE NEWCUR
1573 FE03 5A DECB BOTTOM ROW
1574 FE04 8D E7 BSR NEWCUR
1575 *
1576 ********************************* SCROLL THE SCREEN
1577 *
1578 FE06 E6 04 SCROLL LDB VDUOFF,X
1579 FE08 5C INCB
1580 FE09 C1 19 CMPB #NUMLIN
1581 FE0B 25 01 BLO SCROL1
1582 FE0D 5F CLRB
1583 FE0E E7 04 SCROL1 STB VDUOFF,X
1584 *
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN
1586 *
1587 FE10 F6 DF FB ESCCLS LDB COLADX GET CURSOR
1588 FE13 86 20 LDA #$20 GET A SPACE
1589 FE15 F7 DF FB ESCCLS1 STB COLADX
1590 FE18 E7 02 STB VDUCOL,X
1591 FE1A A7 84 STA VDUCHR,X
1592 FE1C 5C INCB
1593 FE1D C1 50 CMPB #LINLEN
1594 FE1F 26 F4 BNE ESCCLS1
1595 *
1596 FE21 F6 DF FC LDB ROWADX
1597 FE24 5C INCB
1598 FE25 C1 19 CMPB #NUMLIN
1599 FE27 27 08 BEQ ESCCLS2
1600 FE29 F7 DF FC STB ROWADX
1601 FE2C E7 03 STB VDUROW,X
1602 FE2E 5F CLRB
1603 FE2F 20 E4 BRA ESCCLS1
1604 *
1605 FE31 5F ESCCLS2 CLRB
1606 FE32 F7 DF FB STB COLADX
1607 FE35 E7 02 STB VDUCOL,X
1608 FE37 F7 DF FE STB ESCFLG
1609 FE3A 39 RTS
1610 ENDIF VDUOPT
1611 *
1612 IFD DG640OPT
1613 ***************************************************
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1615 * *
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1619 * 16x64 BOARD). *
1620 ***************************************************
1621
1622 ***************************************************
1623 * INITIALIZE EMULATOR *
1624 ***************************************************
1625
1626 VINIZ LDX #0
1627 STX COLADX AND ROWADX
1628 STX NEWROW AND ESCFLG
1629 LDX #SCREEN POINT TO SCREEN
1630 STX CURSOR SET PROGRAM CURSOR
1631 LDA #$1B SEND ESCAPE
1632 BSR VOUTCH
1633 LDA #'Y CLEAR TO END OF SCREEN
1634 *
1635 ** VIDEO OUTPUT ROUTINE
1636 *
1637 VOUTCH PSHS A,B,X SAVE REGISTERS
1638 *
1639 ** CLEAR CURSOR
1640 LDX CURSOR
1641 LDB 0,X
1642 ANDB #$7F
1643 STB 0,X
1644 *
1645 ** CHECK FOR ESCAPE SEQUENCE
1646 TST ESCFLG ESCAPE ACTIVE?
1647 BEQ SOROU1 BRANCH IF NOT
1648 BSR ESCAPE ELSE DO ESCAPE
1649 BRA RETURN AND RETURN
1650 *
1651 ** CHECK FOR CONTROL CHARACTERS
1652 SOROU1 CMPA #$20 CONTROL CODES?
1653 BHS SOROU2
1654 BSR CONTRL BRANCH IF SO
1655 BRA RETURN
1656 *
1657 ** OUTPUT TEXT CHARACTER
1658 SOROU2 LDX CURSOR ELSE GET CURSOR
1659 STAA 0,X DISPLAY CHARACTER
1660 LBSR NEWCOL UPDATE COLUMN
1661 *
1662 ** DISPLAY CURSOR AND RETURN
1663 RETURN LDX CURSOR AND DISPLAY IT
1664 LDB ,X
1665 ORAB #$80 WITH REVID
1666 STB ,X
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN
1668
1669 ***************************************************
1670 * CONTROL CODE HANDLERS *
1671 ***************************************************
1672
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ?
1674 LBEQ BACKSP
1675 CMPA #$1B ESCAPE SEQUENCE?
1676 LBEQ SETESC
1677 CMPA #$D CTRL M - RETURN?
1678 LBEQ CRETN
1679 CMPA #$0A CTRL J - LINE FEED
1680 BNE RETESC NONE OF THESE, RETURN
1681
1682 ***************************************** LINE FEED
1683
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
1685 INCB BUMP ROW
1686 CMPB #NUMLIN SCROLL TIME?
1687 LBNE NEWCUR POSITION CURSOR IF NOT
1688 LBRA SCROLL ELSE SCROLL IT
1689
1690 ***************************************** LINE FEED
1691
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
1693 TSTB AT TOP OF SCREEN ?
1694 BEQ RETESC Yes, Ignore
1695 DECB No, Decrement ROW
1696 LBRA NEWCUR POSITION CURSOR
1697
1698
1699 *********************************** BACK SPACE
1700
1701 BACKSP LDA COLADX
1702 BEQ RETESC RETURN
1703 DECA
1704 LBRA POSCOL POSITION CURSOR
1705
1706 *********************************** CURSOR RIGHT
1707
1708 CHRIGHT LDA COLADX
1709 INCA
1710 CMPA #LINLEN
1711 BEQ RETESC
1712 LBRA POSCOL
1713
1714 ***************************************************
1715 * ESCAPE HANDLERS *
1716 ***************************************************
1717
1718 ESCAPE LDAB ESCFLG GET FLAG
1719 CMPB #'= SETTING CURSOR?
1720 BEQ ESCCUR BRANCH IF SO
1721 CMPA #'Y CLEAR TO END OF SCREEN?
1722 LBEQ ESCCLS
1723 CMPA #'T CLEAR TO END OF LINE?
1724 BEQ ESCCLL
1725 CMPA #'E INSERT LINE?
1726 BEQ ESCINL
1727 CMPA #'R DELETE LINE?
1728 BEQ ESCDLL
1729 CMPA #'= STARTING CURSOR SET?
1730 BNE CLRESC BRANCH IF NOT
1731
1732 ***************************** START ESCAPE SEQUENCE
1733
1734 SETESC STAA ESCFLG ELSE START CURSORING
1735 RTS AND RETURN
1736
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED
1738 RETESC RTS SO RETURN
1739
1740 ********************************* SET SCREEN CURSOR
1741
1742 ESCCUR TST NEWROW ROW SET?
1743 BNE ESCCU1 BRANCH IF SO
1744 STAA NEWROW ELSE SET NEW ROW
1745 RTS AND RETURN
1746
1747 ESCCU1 CLR ESCFLG
1748 SUBA #$20 ADJUST COLUMN ADDRESS
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
1750 BHI RETESC NOT OK, DO NOTHING
1751
1752 ESCCU2 LDAB NEWROW
1753 CLR NEWROW
1754 SUBB #$20 ADJUST TO ROW ADDRESS
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
1756 BHI RETESC ELSE RETURN DOING NOTHING
1757 BRA NEWCUR GO SET NEW CURSOR IF SO
1758 *
1759 *************************** DELETE LINE FROM SCREEN
1760
1761 ESCDLL BSR CRETN GO COL. ZERO
1762 LDB ROWADX
1763 CMPB #NUMLIN-1
1764 BEQ SCROL3
1765 BRA SCROL1 AND DELETE THIS LINE
1766
1767 *************************** INSERT LINE INTO SCREEN
1768
1769 ESCINL BSR CRETN GO TO COL. ZERO
1770 LDAB ROWADX
1771 CMPB #NUMLIN-1
1772 BEQ ESCCLL
1773 *
1774 ** SCROLL SCREEN DOWN FROM CURSOR
1775 *
1776 LDX #SCREEN+SCNLEN-LINLEN
1777 ESCIN0 LDAA 0,-X
1778 STAA LINLEN,X
1779 LDA SCNLEN,X
1780 STA SCNLEN+LINLEN,X
1781 CPX CURSOR
1782 BNE ESCIN0
1783
1784 ****************** CLEAR FROM CURSOR TO END OF LINE
1785
1786 ESCCLL LDA COLADX GET CURRENT COLUMN
1787 LDX CURSOR GET CURSOR
1788 LDB #$20 AND CLEAR CHAR
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
1790 STB ,X+ CLEAR TEXT
1791 INCA
1792 CMPA #LINLEN UNTIL END OF LINE
1793 BNE ESCLL1
1794 CLR ESCFLG
1795 RTS
1796
1797 *********************************** CARRIAGE RETURN
1798
1799 CRETN CLRA SET COLUMN ZERO
1800 POSCOL LDB ROWADX GET CURRENT ROW
1801
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN
1803
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
1805 LDA #LINLEN ELSE ADD A LINE
1806 MUL LINLEN * ROWADX
1807 ADDB COLADX
1808 ADCA #0
1809 ADDD #SCREEN ADD SCREEN BASE.
1810 STD CURSOR SAVE NEW CURSOR
1811 TFR D,X GET CURSOR IN X
1812 RTS AND RETURN
1813
1814 ********************* UPDATE CURRENT COLUMN AND ROW
1815
1816 NEWCOL LDD COLADX GET ROW AND COLUMN
1817 INCA BUMP COLUMN
1818 CMPA #LINLEN ROLL?
1819 BNE NEWCUR BRANCH IF NOT
1820 CLRA ELSE RESET TO ZERO
1821 INCB AND BUMP ROW
1822 CMPB #NUMLIN
1823 BNE NEWCUR
1824 DECB BOTTOM ROW
1825 BSR NEWCUR
1826
1827 ********************************* SCROLL THE SCREEN
1828
1829 SCROLL LDX #SCREEN POINT TO SCREEN
1830 SCROL1 LDA SCNLEN+LINLEN,X
1831 STA SCNLEN,X
1832 LDAA LINLEN,X MOVE TWO BYTES
1833 STAA 0,X+ UP ONE LINE
1834 CMPX #SCREEN+SCNLEN-LINLEN
1835 BNE SCROL1 LOOP UNTIL DONE
1836 BRA SCROL3
1837
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN
1839
1840 ESCCLS LDX CURSOR GET CURSOR
1841 SCROL3 LDAA #$20 GET A SPACE
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
1843 STA ,X+ AND TEXT
1844 CMPX #SCREEN+SCNLEN
1845 BNE SCROL2 UNTIL DONE
1846 CLR ESCFLG
1847 RTS
1848 ENDIF DG640OPT
1848 ENDIF DG640OPT
1849 *
1850 IFD PRTOPT
1851 *************************************
1852 *
1853 ** PRINTER DRIVER ROUTINES
1854 *
1855 *************************************
1856 *
1857 ** PINIZ - INITIATE PRINTER PORT
1858 *
1859 PINIZ PSHS B
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
1861 STD PADATA SET DDR AND SELECT DATA
1862 *
1863 ** RESET PRINTER
1864 LDB #PRESET
1865 STAB PADATA
1866 RESTLP INCB DELAY FOR RESET
1867 BNE RESTLP
1868 STAA PADATA ACCA=DIRMSK
1869 *
1870 ** INITALIZE PORT B (DATA PORT)
1871 LDAA #$2A
1872 STAA PBCTRL
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110
1874 STD PBDATA PBDREG PBCTRL
1875 *
1876 ** SELECT 66 LINES/PAGE
1877 LDAA #$1B
1878 BSR POUTCH
1879 LDAA #'C
1880 BSR POUTCH
1881 LDAA #66
1882 PULS B
1883 *************************************
1884 *
1885 ** OUTPUT A CHARACTER TO THE PRINTER
1886 *
1887 *************************************
1888 POUTCH PSHS B
1889 LDAB PBDATA CLEAR INTERRUPT BIT
1890 *
1891 ** WAIT TILL NOT BUSY
1892 BUSYLP LDAB PADATA
1893 BITB #PERROR
1894 BEQ PEXIT
1895 TSTB
1896 BMI BUSYLP
1897 *
1898 ** NOW OUTPUT CHARACTER
1899 STAA PBDATA
1900 PEXIT PULS B,PC
1901 *************************************
1902 *
1903 ** PCHK TEST IFD PRINTER READY
1904 *
1905 *************************************
1906 PCHK TST PBCTRL TEST STATE OF CRB7
1907 RTS SET ON ACKNOWLEDGE
1908 ENDIF PRTOPT
1908 ENDIF PRTOPT
1909 *************************************
1910 *
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE
1912 *
1913 *************************************
1914 *
1915 FE3B JMPTAB EQU *
1916 FE3B 01 FCB 1 " ^A "
1917 FE3C FB 74 FDB ALTRA
1918 FE3E 02 FCB 2 " ^B "
1919 FE3F FB 69 FDB ALTRB
1920 FE41 03 FCB 3 " ^C "
1921 FE42 FB 7F FDB ALTRCC
1922 FE44 04 FCB 4 " ^D "
1923 FE45 FB 5E FDB ALTRDP
1924 FE47 10 FCB $10 " ^P "
1925 FE48 FB 31 FDB ALTRPC
1926 FE4A 15 FCB $15 " ^U "
1927 FE4B FB 3D FDB ALTRU
1928 FE4D 18 FCB $18 " ^X "
1929 FE4E FB 53 FDB ALTRX
1930 FE50 19 FCB $19 " ^Y "
1931 FE51 FB 48 FDB ALTRY
1932 *
1933 FE53 42 FCC 'B'
1934 FE54 F9 5C FDB BRKPNT
1935 FE56 45 FCC 'E'
1936 FE57 F8 FD FDB MEMDUMP
1937 FE59 47 FCC 'G'
1938 FE5A F8 A5 FDB GO
1939 FE5C 4C FCC 'L'
1940 FE5D FA 5E FDB LOAD
1941 FE5F 50 FCC 'P'
1942 FE60 FA BC FDB PUNCH
1943 FE62 4D FCC 'M'
1944 FE63 F8 A8 FDB MEMCHG
1945 FE65 52 FCC 'R'
1946 FE66 FB ED FDB REGSTR
1947 FE68 53 FCC 'S'
1948 FE69 F8 F1 FDB DISSTK
1949 FE6B 58 FCC 'X'
1950 FE6C F9 88 FDB XBKPNT
1951 IFD MFDCOPT
1952 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
1953 FDB MINBOOT
1954 ENDIF MFDCOPT
1954 ENDIF MFDCOPT
1955 IFD CF8OPT
1956 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
1957 FDB CFBOOT
1958 ENDIF CF8OPT
1958 ENDIF CF8OPT
1959 IFD IDEOPT
1960 FE6E 44 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
1961 FE6F F9 D5 FDB IDEBOOT
1962 ENDIF IDEOPT
1963 IFD DMAFOPT
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
1965 FDB DBOOT
1966 ENDIF DMAFOPT
1966 ENDIF DMAFOPT
1967 IFD EXTOPT
1968 FE71 55 FCC 'U' *** IF FPGA, 'U' IS FOR USER
1969 FE72 FC 92 FDB USRCMD
1970 ENDIF EXTOPT
1971 IFD RTCOPT
1972 FCC 'T'
1973 FDB TIMSET
1974 ENDIF RTCOPT
1974 ENDIF RTCOPT
1975 IFD TRAOPT
1976 FCC "T"
1977 FDB TRACE
1978 ENDIF TRAOPT
1978 ENDIF TRAOPT
1979 *
1980 FE74 TABEND EQU *
1981 *
1982 * ** 6809 VECTOR ADDRESSES **
1983 *
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
1988 * HIS OWN ROUTINES IF HE SO DESIRES.
1989 *
1990 *
1991 FE74 F9 94 RAMVEC FDB SWIE USER-V
1992 FE76 F8 A7 FDB RTI SWI3-V
1993 FE78 F8 A7 FDB RTI SWI2-V
1994 FE7A F8 A7 FDB RTI FIRQ-V
1995 FE7C F8 A7 FDB RTI IRQ-V
1996 FE7E F9 94 FDB SWIE SWI-V
1997 FE80 FF FF FDB $FFFF SVC-VO
1998 FE82 FF FF FDB $FFFF SVC-VL
1999 *
2000 * PRINTABLE MESSAGE STRINGS
2001 *
2002 FE84 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2003 FE89 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR '
55 47 20 31 2E 34
20 46 4F 52 20
2004 IFD S3EOPT
2005 FCC 'S3E '
2006 ENDIF S3EOPT
2006 ENDIF S3EOPT
2007 IFD B5XOPT
2008 FCC 'B5-X300 '
2009 ENDIF B5XOPT
2009 ENDIF B5XOPT
2010 IFD S3SOPT
2011 FCC 'S3STARTER '
2012 ENDIF S3SOPT
2012 ENDIF S3SOPT
2013 IFD ADSOPT
2014 FCC 'ADS6809 '
2015 ENDIF ADSOPT
2015 ENDIF ADSOPT
2016 IFD SWTOPT`
2017 FCC 'SWTPC '
2018 ENDIF SWTOPT
2018 ENDIF SWTOPT
2019 IFD XESOPT`
2020 FE9A 58 45 53 53 20 FCC 'XESS '
2021 ENDIF XESOPT
2022 FE9F 20 2D 20 FCC ' - '
2023 FEA2 04 FCB 4
2024 FEA3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
04
2025 FEAA 3E MSG3 FCC '>'
2026 FEAB 04 FCB 4
2027 FEAC 57 48 41 54 3F MSG4 FCC 'WHAT?'
2028 FEB1 04 FCB 4
2029 FEB2 20 2D 20 MSG5 FCC ' - '
2030 FEB5 04 FCB 4'
2031 FEB6 20 20 53 50 3D MSG10 FCC ' SP='
2032 FEBB 04 FCB 4
2033 FEBC 20 20 50 43 3D MSG11 FCC ' PC='
2034 FEC1 04 FCB 4
2035 FEC2 20 20 55 53 3D MSG12 FCC ' US='
2036 FEC7 04 FCB 4
2037 FEC8 20 20 49 59 3D MSG13 FCC ' IY='
2038 FECD 04 FCB 4
2039 FECE 20 20 49 58 3D MSG14 FCC ' IX='
2040 FED3 04 FCB 4
2041 FED4 20 20 44 50 3D MSG15 FCC ' DP='
2042 FED9 04 FCB 4
2043 FEDA 20 20 41 3D MSG16 FCC ' A='
2044 FEDE 04 FCB 4
2045 FEDF 20 20 42 3D MSG17 FCC ' B='
2046 FEE3 04 FCB 4
2047 FEE4 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2048 FEEA 04 FCB 4
2049 FEEB 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2050 FEF3 53 31 MSG20 FCC 'S1'
2051 FEF5 04 FCB 4
2052 IFD DATOPT
2053 *
2054 * POWER UP/ RESET/ NMI ENTRY POINT
2055 *
2056 FF00 ORG $FF00
2057 *
2058 *
2059 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11
2060 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO
2061 *
2062 *
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2067 * STORED IN IT.
2068 *
2069 *
2070 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
2071 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION
2072 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
2073 *
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2076 * PHYSICAL ADDRESSES.
2077 *
2078 FF0A 86 F0 LDA #$F0
2079 FF0C A7 84 STA ,X STORE $F0 AT $FFFF
2080 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
2081 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
2082 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
2083 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0
2084 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ?
2085 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
2086 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER
2087 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
2088 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
2089 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN
2090 *
2091 *
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2096 * IS STORED IN RAM IN THE LOCATION THAT IS
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2102 * "7" IN THE $70A0 WILL BE STORED IN
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2111 * OF RAM RESPONDS.
2112 *
2113 *
2114 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION
2115 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2116 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS
2117 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN
2118 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING
2119 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS
2120 FF32 44 LSRA TRANSLATION RAM.
2121 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D"
2122 *
2123 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER
2124 *
2125 *
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2133 *
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2136 *
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2139 *
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2142 *
2143 *
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2151 * MEMORY ADDRESSED AS FOLLOWS....
2152 *
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2155 *
2156 *
2157 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2158 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
2159 FF40 6F 2E CLR 14,Y CLEAR $DFDE
2160 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
2161 FF44 A7 2F STA 15,Y STORE AT $DFDF
2162 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
2163 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
2164 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR
2165 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING
2166 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
2167 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
2168 FF54 27 22 BEQ FINTAB SKIP IF FINISHED
2169 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION
2170 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
2171 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC.
2172 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION
2173 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
2174 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION
2175 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
2176 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
2177 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2178 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM.
2179 FF6E 44 LSRA
2180 FF6F 44 LSRA
2181 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE
2182 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
2183 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
2184 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
2185 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
2186 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE
2187 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE
2188 *
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2193 *
2194 *
2195 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C"
2196 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
2197 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
2198 FF86 4A DECA ELSE POINT 4K LOWER
2199 FF87 2A F9 BPL FINDC GO TRY AGAIN
2200 FF89 20 14 BRA XFERTF
2201 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
2202 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
2203 *
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2207 * ADDRESSES FROM $0000 AND UP....
2208 *
2209 FF8F 4F CLRA START AT ZERO
2210 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
2211 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
2212 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP
2213 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE
2214 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
2215 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY
2216 FF9B 81 0C CMPA #$0C LAST ENTRY YET ?
2217 FF9D 2D F3 BLT COMPRS
2218 *
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2221 * THE MP-09 CPU CARD.
2222 *
2223 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11
2224 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE
2225 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
2226 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11
2227 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE
2228 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED
2229 *
2230 ELSE
2231 LRA RTS
2232 START LDS #STACK INITIALIZE STACK POINTER
2233 CLRB
2234 ENDIF DATOPT
2234 ENDIF DATOPT
2235 *
2236 FFAB 53 COMB SET "B" NON-ZERO
2237 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG
2238 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE
2239 *
2240 ** INTERRUPT JUMP VECTORS
2241 *
2242 FFB2 6E 9F DF C0 V1 JMP [STACK]
2243 FFB6 6E 9F DF C4 V2 JMP [SWI2]
2244 FFBA 6E 9F DF C6 V3 JMP [FIRQ]
2245 FFBE 6E 9F DF C8 V4 JMP [IRQ]
2246 FFC2 6E 9F DF CA V5 JMP [SWI]
2247 *
2248 * SWI3 ENTRY POINT
2249 *
2250 FFC6 1F 43 SWI3E TFR S,U
2251 FFC8 AE 4A LDX 10,U *$FFC8
2252 FFCA E6 80 LDB ,X+
2253 FFCC AF 4A STX 10,U
2254 FFCE 4F CLRA
2255 FFCF 58 ASLB
2256 FFD0 49 ROLA
2257 FFD1 BE DF CC LDX SVCVO
2258 FFD4 8C FF FF CMPX #$FFFF
2259 FFD7 27 0F BEQ SWI3Z
2260 FFD9 30 8B LEAX D,X
2261 FFDB BC DF CE CMPX SVCVL
2262 FFDE 22 08 BHI SWI3Z
2263 FFE0 34 10 PSHS X
2264 FFE2 EC C4 LDD ,U
2265 FFE4 AE 44 LDX 4,U
2266 FFE6 6E F1 JMP [,S++]
2267 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP
2268 FFEA EE 42 LDU 2,U
2269 FFEC 6E 9F DF C2 JMP [SWI3]
2270 *
2271 * 6809 VECTORS
2272 *
2273 FFF0 ORG $FFF0
2274 FFF0 FF B2 FDB V1 USER-V
2275 FFF2 FF C6 FDB SWI3E SWI3-V
2276 FFF4 FF B6 FDB V2 SWI2-V
2277 FFF6 FF BA FDB V3 FIRQ-V
2278 FFF8 FF BE FDB V4 IRQ-V
2279 FFFA FF C2 FDB V5 SWI-V
2280 FFFC FF B2 FDB V1 NMI-V
2281 FFFE FF 00 FDB START RESTART-V
0005 END START
0006 END
Program + Init Data = 3583 bytes
Error count = 0
/readme.txt
0,0 → 1,122
System09 Monitor Program
========================
John Kent
3rd February 2008
 
1. Introduction.
 
System09 is FPGA SOC (System On a Chip) that uses a 6809 instruction compatible FPGA core.
The system is based around the old SWTPc (South West Technical Product Computer),
the difference being the FPGA version runs witha 25 MHz E Clock where as the SWTPc
ran with a 1MHz to 2MHz E clock.
 
2. Disk Operating Systems
 
The SWTPc ran the FLEX9, OS9 and Uniflex operating systems.
 
2.1 Flex9
 
Flex is a single user operating system developed by TSC (Technical Systems Consultants).
It was to the Motorola 8 bit microprocessor family what CP/M was to the 8080 and Z80 family.
Flex9 typically used SBUG1.8 as the monitor program for providing the terminal drivers
and primative debug functions.
 
2.2 UniFlex
 
UniFlex was TSC's multi tasking version of their Flex operating system.
I don't know much about it, other that the fact that much of the code is available on the
internet. UniFlex made use of the extended memory, and used thw SWTPc DMAF-2 Floppy
Disk Controller.
 
2.3 OS9
 
OS9 is a realtime multitasking operating system. It used to come in a basic 64K version
called Level 1 and an extended memory version that used the DAT (Dynamic Address Translation)
to map in up to 1 MByte of memory and was called level 2.
 
The SWTPc emulator from Evensons Consulting Services uses just the ACIA serial port
at $E000, a SWTPc MP-T timer module at $E040 for interrupts and a Western Digital
FD1771 or FD179X Floppy disk controller to run OS9 level 1.
 
OS9 had two special 2KByte boot ROMs at resided at $F000 and $F800.
These contain the start up code to load OS9 from the disk drive and run it.
 
3. Monitor Features
 
System09 is based on SBUG1.8, which was typically used for the Flex9 operating system
however I have had to strip out some of the functionality to fit video display and
PS/2 keyboard drivers. The VDU and PS/2 keyboard operate in parallel with the serial
port so that commands may be entered either locally on the FPGA system remotely by
the serial port on say a PC running a terminal program such as hyperterm.
 
3.1 Mass storage
 
SBUG1.8 had two disk boots, one was for a the DC-1 or compatible floppy disk controller
that was mapped at $E01X and the other was for the DMAF2 which used the 6844 DMA controller
and was mapped at $F000 just below the SBUG1.8 monitor program.
 
In system09 there is no Western Digital Compatible Floppy disk Controller. (At least not yet.)
Instead provisons have been made for booting from either a Compact Flash card or an IDE hard drive.
 
The method for interfaceing to an IDE drive or CF card varies from FPGA board to FPGA board.
Some FPGA boards such as the Spartan 3 and Spartan 3E starter boards do not have provision
for a Compact Flash card or IDE card, although they do have expansion ports that could be
used for CF or IDE interfaces.
 
Some FPGA boards, such as the BurchED B5-X300 have a dedicated CF add on module, which allows
you to map the CF card in any way you like. The XESS XST-3S1000 and XST-3.0 carrier board on the
other hand provides a 16 bit peripheral bus that can be used to access the IDE drive connector,
ethernet controller or two expansion connectors. The Trenz TE0141 and TE0140 boards have the
CF card mapped into the memory address and data bus, but have done so in such a fashion that it
can only be used in 8 bit transfer mode.
 
CF cards can be programmed to run in 8 bit mode or 16 bit mode. 8 Bit mode is handier for
interfaceing to 8 bit micros sych as system09, however this mode is not necessarily supported
by IDE disk drives.
 
4. FPGA Cards
 
4.1 BurchEd B5-X300
 
The B5-X300 version of Sys09bug is covered by the "FPGAOPT" options flag.
It provides text VDU drivers and PS/2 keyboard interface, ACIA serial port,
and Compact Flash Bootstrap. The B5-X300 uses a 300Kgate Spartan 2E FPGA which
means the Block RAM used to hold the monitor ROMs is only 4Kbits.
four Block RAMs are required to implement a 2KByte monitor program.
 
4.2 Digilent / Xilinx Spartan 3 Starter Board
 
The Xilinx spartan 3 starter board was designed by Digilent. It uses the Spartan 3 FPGA
and intially came in a 200K gate version although a 1000KGate version is also available.
The Spartan 3 starterboard is fitted wit 256K x 32 bits of RAM, which is mapped as 1M x 8 bits.
 
The Spartan 3 starter board does not have any mass storage interfaces, although it does have
expansion sockets that may be used to add external CF or IDE interfaces. The SRAM on the
otherhand can be used as a RAM disk, and data can be downloaded via serial link.
 
David Rumball designed his version of system09 called the Microbox 2000 which was based on
the spartan 3 starter board. He was able to use a configuration flash loader to load
a ROM disk into RAM. He also implemented a RAM disk and a virtual disk that was hosted on
a PC using the FLEXNET software.
 
I borrowed some of his work to extend sys09bug on the spartan 3 starter but have yet to get
it working.
 
4.3 Digilent / Xilinx Spartan 3E starter board
 
Digilent produced a Spartan 3e starter board for Xilinx. The big difference between the
Spartan 3 board and the spartan 3E board is that the latter uses SDRAM rather than SRAM
and is consequently harder to use. The spartan 3E starter was used to verify the operation
of the 6809 core, however because of the difficulty implementing the SDRAM controller
I used Block RAM instead. The design implemented a PIA interrupt timer that sys09bug could
use to single step through instructions one at a time. The S3E version of System09 implements
a Trace command that performs a register dump after each instruction is executed.
This allowed comparison of the FPGA 6809 core with a reference design using the original chip.
 
Because RAM was limitted in the S3E, System09 also does not implement the DAT so the monitor
start up code at the top of memory to test for memory is not implemented in the S3E version.
 
4.4 XESS XSA-3S1000 / XST-3.0
 
 
 
/sys09s3s.aux
0,0 → 1,6
t m
l SYS09S3S.S19
t h
s sys09s3s_b16.vhd f800 ffff
q
 
/SYS09S3E.S19
0,0 → 1,60
S123F800F814F84BFC90FC8AFCA8FCBDFB82FB11FB0DFEE18EFE60108E7FC0C610A680A74A
S123F820A05A26F98EE000BF7FD0170145C60C6FE25A26FB308CDDAF6A86D0A7E41F431728
S123F840048E8EFE7017033A1701DE8EFE951702BC17043C847F810D27F11F8981202C0958
S123F860865E1704581F988B4017045117044CC1602F02C0208EFE2AE180270F30028CFE9D
S123F8806026F58EFE971702F920C0AD9420BC1F343B170374292D1F128EFE9D17026E1F45
S123F8A0211703AE170414A6A41703AE17040C1703672811810827E1811827DD815E2717EE
S123F8C0810D260F39A7A4A1A427081703ED863F1703EA312120C2313F20BE1702AB1F3202
S123F8E08E7FC0301F200517031429063420ACE12401391F10C30010C4F034061F20C4F044
S123F9001F01ACE4270517039F270332623934108EFE9D1701F7AEE417033717039BC6106D
S123F920A6801703351703935A26F517038BAEE1C610A68081202504817E2302862E170340
S123F9407C5A26EE20BC1702C0291E8C7FC0241A34108EFFFF8D5B3510270FA684813F2770
S123F96009A7A0AFA4863FA7843917034E863F16034B108E7FD3C6088D1E5A26FB391F43A7
S123F980AE4A301F8D2C2704AF4A8D0C1702518E0000BF7FED16FEB3AE218C7FC0240AA64E
S123F9A084813F2604A6A4A78486FFA7A0A7A0A7A039108E7FD3C608A6A0ACA127045A26D1
S123F9C0F739313D3917015F291C1702EE1702392914BF7FEDBE7FC0BF7FEB8EF9E7BF7FFD
S123F9E0C01700452020391F438636B7E071B6E0701701ECAE4AA684813F2724BE7FED27C0
S123FA001F301FBF7FED1F34860DB7E0708636B7E071B6E0708636B7E073863FB7E0713BC4
S123FA20BE7FEBBF7FC016FE228632B7E071863AB7E07386FFB7E0708600B7E0728636B74E
S123FA40E071863EB7E073393404C6205A26FD3584BDFCD286111702647F7FD217022681C7
S123FA605326F917021F8139273D813126F11701A83402292617019129213410E6E0EBE0E4
S123FA80EBE46AE46AE4340417018E3504290C3402EBE06AE42705A78020EB5F3502C1FFA8
S123FAA027BA863F170216737FD2861316020E6FE217014A3430294DAC6225493001AFE41D
S123FAC0BDFCD286121701F5ECE4A3622706108300202302C620E7648EFEDE17002FCB0369
S123FAE01F98170175AE62170168EB62EB63EB84A6801701656A6426F5531F9817015BAF6C
S123FB0062ACE426C386141701B33265398D02207134108EFE8F170069359016019D160043
S123FB20F81600E51700918DF28DF62902AF4A398D618DE78DEB2902AF48398D728DDC8D9D
S123FB40E02902AF46398D5E8DD18DD52902AF44398D498DC68DC72902A743398D6C8DBB5A
S123FB608DBC2902A742398D588DB08DB12902A741398D5F8DA58DA629048A80A7C43917FC
S123FB80013BA680810426F7398EFEA18DF41F311600BF8EFEAD8DEAAE4820F48EFEBF8DBF
S123FBA0E1A6431600B48EFEB98DD7AE4420E18EFEB38DCEAE4620D88EFEA78DC5AE4A20EE
S123FBC0CF8EFEC58DBCA64120D98EFECA8DB3A64220D08EFECF8DAAA6C48EFED616009066
S123FBE08EFE9D17FF278DA18DA98DB08DB88DBF8EFE9D17FF178DC08DC78DCE20D58D098C
S123FC00294D1F12862D1700B48D0E29421F018D08293C3410A76135908D112932484848B9
S123FC20481F898D0729283404ABE0398D578130251D81392203803039814125128146226E
S123FC400380373981612507816622038057391A0239341035028D023502340244444444A7
S123FC608D043502840F8B3081392F028B07204D3402C608A68068E42502862D8D3F8D3B9C
S123FC805A26F135827D7FD227068D04847F202D3410BE7FD0A684850126098EE020A68474
S123FCA0850127EEA60135903402A69F7FD085012605B6E020850135828D0086208D453492
S123FCC012BE7FD0A684850227FA3502A70135908D13BE7FD08603A7848611A7846D018674
S123FCE0FFB77FD2398EE030CC0000FD7FEFA702E703E704FD7FF1C602E7017F7FF2861BBF
S123FD008D02865934168EE0307D7FF227048D74200D812024048D092005A7841700C53582
S123FD2096810810270041811B1027006C811A1027008E811610270045810D102700998197
S123FD400C1027002C810B10270011810A2651FC7FEF5CC11910260083160099FC7FEF5D8B
S123FD601027003C5A160074B67FEF27334A160068B67FEF4C81501027002516005BCC0008
S123FD8000160058F67FF2C13D271681591027006E81542731813D2604B77FF2397F7FF26A
S123FDA0397D7FF12604B77FF1397F7FF28020814F22EDF67FF17F7FF1C020C11822E120EF
S123FDC01BCC00008D16B67FEFC620E7844CA702815026F77F7FF2394FF67FF0FD7FEFA74E
S123FDE002E70339FC7FEF4C815026F04F5CC11926EA5A8DE7E6045CC11925015FE704F654
S123FE007FEF8620F77FEFE702A7845CC15026F4F67FF05CC1192708F77FF0E7035F20E44D
S123FE205FF77FEFE702F77FF23901FB6702FB5C03FB7204FB5110FB2415FB3018FB461913
S123FE40FB3B42F94645F8E747F88F4CFA5150FAAF4DF89252FBE053F8DB58F97254F9C566
S123FE60F97EF891F891F891F891F97EFFFFFFFF0D0A000000535953303942554720312E94
S123FE803420464F522053334520202D20044B0D0A000000043E04574841543F04202D201B
S123FEA004202053503D04202050433D04202055533D04202049593D04202049583D042074
S123FEC02044503D042020413D042020423D04202043433A2004454648494E5A564353319F
S123FEE0043910CE7FC05F53F77FD216F9266E9F7FC06E9F7FC46E9F7FC66E9F7FC86E9F26
S123FF007FCA1F43AE4AE680AF4A4F5849BE7FCC8CFFFF270F308BBC7FCE22083410ECC440
S10FFF20AE446EF1371FEE426E9F7FC2AC
S113FFF0FEEEFF02FEF2FEF6FEFAFEFEFEEEFEE26C
S9030000FC

powered by: WebSVN 2.1.0

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