URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [tags/] [pre_mkfiles_rev1_merge/] [src/] [sys09bug/] [sys09ads.lst] - Rev 188
Go to most recent revision | Compare with Previous | Blame | View Log
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
Go to most recent revision | Compare with Previous | Blame | View Log