URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
Compare Revisions
- This comparison shows the changes necessary to convert path
/System09/trunk/src/sys09bug
- from Rev 99 to Rev 120
- ↔ Reverse comparison
Rev 99 → Rev 120
/sys09270.lst
0,0 → 1,2861
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 NAM SYS09BUG FOR TERASIC CYCLONE II DE2-70 |
0000 INCLUDE "opt_270.asm" |
0001 |
0002 * |
0003 *************************************************** |
0004 * OPTION SWITCHES |
0005 *************************************************** |
0006 * |
0007 * |
0008 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
0009 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
0010 ** FOR LOADING AND SAVING S1 RECORDS |
0011 * |
0012 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
0013 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
0014 *B3SOPT EQU $FF B3-SPARTAN2 FPGA VIDEO & PS2 KEYBOARD |
0015 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
0016 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
0017 *S3EOPT EQU $FF SPARTAN3E STARTER |
0018 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
0019 00FF DE270OPT EQU $FF CYCLONE II DE2-70 |
0020 * |
0002 END |
0000 INCLUDE "sys09equ.asm" |
0001 * |
0002 *************************************************** |
0003 * MEMORY MAP EQUATES * |
0004 *************************************************** |
0005 E000 MONIO EQU $E000 I/O SPACE |
0006 IFD B3SOPT |
0007 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0008 EXTCMD EQU $00 EXTENDED OFFSET |
0009 ENDIF B3SOPT |
0009 ENDIF B3SOPT |
0010 IFD S3EOPT |
0011 MONRAM EQU $7FC0 |
0012 ELSE |
0013 DFC0 MONRAM EQU $DFC0 STACK SPACE |
0014 ENDIF S3EOPT |
0015 F800 MONROM EQU $F800 START OF ROM |
0016 IFD S3SOPT |
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0018 EXTCMD EQU $00 EXTENDED OFFSET |
0019 ENDIF S3SOPT |
0019 ENDIF S3SOPT |
0020 IFD XESOPT |
0021 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0022 EXTCMD EQU $00 EXTENDED OFFSET |
0023 ENDIF XESOPT |
0023 ENDIF XESOPT |
0024 IFD DE270OPT |
0025 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0026 0000 EXTCMD EQU $00 EXTENDED OFFSET |
0027 ENDIF DE270OPT |
0028 ************************************************** |
0029 ************************************************** |
0030 |
0031 IFD SWTOPT |
0032 * |
0033 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER |
0034 * |
0035 ACIAOPT EQU $FF ACIA AT PORT 0 |
0036 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT |
0037 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0038 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0039 ENDIF |
0039 ENDIF |
0040 * |
0041 IFD ADSOPT |
0042 * |
0043 * ACKERMAN DIGITAL ADS6809 |
0044 * |
0045 DG640OPT EQU $FF DG640 VDU AT $E800 |
0046 *RTCOPT EQU $FF REAL TIME CLOCK |
0047 PRTOPT EQU $FF PRINTER DRIVERS |
0048 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0049 ENDIF ADSOPT |
0049 ENDIF ADSOPT |
0050 * |
0051 IFD B3SOPT |
0052 * |
0053 * BURCHED SPARTAN 2 B3+ |
0054 * |
0055 ACIAOPT EQU $FF ACIA AT PORT 0 |
0056 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0057 VDUOPT EQU $FF VDU AT $E030 |
0058 IDEOPT EQU $FF IDE AT $E100 |
0059 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0060 HFCOPT EQU $FF HARDWARE FLOW CONTROL |
0061 ENDIF B3SOPT |
0061 ENDIF B3SOPT |
0062 * |
0063 IFD B5XOPT |
0064 * |
0065 * BURCHED SPARTAN 2 B5-X300 |
0066 * |
0067 ACIAOPT EQU $FF ACIA AT PORT 0 |
0068 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0069 VDUOPT EQU $FF VDU AT $E030 |
0070 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0071 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0072 HFCOPT EQU $FF HARDWARE FLOW CONTROL |
0073 ENDIF B5XOPT |
0073 ENDIF B5XOPT |
0074 * |
0075 IFD S3SOPT |
0076 * |
0077 * DIGILENT SPARTAN 3 STARTER |
0078 * |
0079 ACIAOPT EQU $FF ACIA AT PORT 0 |
0080 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0081 VDUOPT EQU $FF VDU AT $E030 |
0082 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0083 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0084 EXTOPT EQU $FF EXTENDED COMMANDS |
0085 ENDIF S3SOPT |
0085 ENDIF S3SOPT |
0086 * |
0087 IFD S3EOPT |
0088 * |
0089 * DIGILENT SPARTAN 3E STARTER |
0090 * |
0091 ACIAOPT EQU $FF ACIA AT PORT 0 |
0092 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0093 VDUOPT EQU $FF VDU AT $E030 |
0094 TRAOPT EQU $FF PIA TRACE TIMER |
0095 ENDIF S3EOPT |
0095 ENDIF S3EOPT |
0096 * |
0097 IFD XESOPT |
0098 * |
0099 * XESS SPARTAN 3 XSA-3S1000 & XST-3.0 |
0100 * |
0101 ACIAOPT EQU $FF ACIA AT PORT 0 |
0102 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0103 VDUOPT EQU $FF VDU AT $E030 |
0104 IDEOPT EQU $FF IDE AT $E100 |
0105 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0106 HFCOPT EQU $FF HARDWARE FLOW CONTROL |
0107 EXTOPT EQU $FF EXTENDED COMMANDS |
0108 ENDIF XESOPT |
0108 ENDIF XESOPT |
0109 * |
0110 IFD DE270OPT |
0111 * |
0112 * TERASIC CYCLONE 2 DE2-70 |
0113 * |
0114 00FF ACIAOPT EQU $FF ACIA AT PORT 0 |
0115 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0116 00FF VDUOPT EQU $FF VDU AT $E030 |
0117 00FF CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0118 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0119 00FF EXTOPT EQU $FF EXTENDED COMMANDS |
0120 ENDIF DE270OPT |
0121 * |
0122 * |
0123 IFD ACIAOPT |
0124 * |
0125 *************************************************** |
0126 * SERIAL PORT * |
0127 *************************************************** |
0128 * |
0129 ** ACIA SITS ON PORT 0 |
0130 * |
0131 E000 ACIAS EQU MONIO+$00 CONTROL PORT |
0132 * |
0133 ENDIF ACIAOPT |
0134 IFD MFDCOPT |
0135 * |
0136 *************************************************** |
0137 * MINIFLOPPY DRIVE * |
0138 *************************************************** |
0139 * |
0140 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 |
0141 * |
0142 DRVFDC EQU MONIO+$14 |
0143 CMDFDC EQU MONIO+$18 |
0144 SECFDC EQU MONIO+$1A |
0145 DATFDC EQU MONIO+$1B |
0146 ENDIF MFDCOPT |
0146 ENDIF MFDCOPT |
0147 IFD PS2OPT |
0148 * |
0149 *************************************************** |
0150 * VDU8 PS/2 KEYBOARD PORT * |
0151 *************************************************** |
0152 * |
0153 ** KEYBOARD SITS ON PORT 2 |
0154 * |
0155 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT |
0156 ENDIF PS2OPT |
0157 IFD VDUOPT |
0158 * |
0159 *************************************************** |
0160 * VDU8 DISPLAY DRIVER EQUATES * |
0161 *************************************************** |
0162 * |
0163 ** VDU8 DISPLAY SITS ON PORT 3 |
0164 * |
0165 E030 VDU EQU MONIO+$30 |
0166 0000 VDUCHR EQU 0 CHARACTER REGISTER |
0167 0001 VDUATT EQU 1 ATTRIBUTE REGISTER |
0168 0002 VDUCOL EQU 2 CURSOR COLUMN |
0169 0003 VDUROW EQU 3 CURSOR ROW |
0170 0004 VDUOFF EQU 4 ROW OFFSET |
0171 * |
0172 0050 LINLEN EQU 80 LENGTH OF A LINE |
0173 0019 NUMLIN EQU 25 NUMBER OF LINES |
0174 ENDIF VDUOPT |
0175 * |
0176 IFD CF8OPT |
0177 * |
0178 *************************************************** |
0179 * COMPACT FLASH EQUATES 8 BIT TRANSFER * |
0180 *************************************************** |
0181 * |
0182 ** COMPACT FLASH SITS AT PORT 4 |
0183 * |
0184 E040 CF_BASE EQU MONIO+$40 |
0185 E040 CF_DATA EQU CF_BASE+0 |
0186 E041 CF_ERROR EQU CF_BASE+1 ; read error |
0187 E041 CF_FEATURE EQU CF_BASE+1 ; write feature |
0188 E042 CF_SECCNT EQU CF_BASE+2 |
0189 E043 CF_SECNUM EQU CF_BASE+3 |
0190 E044 CF_CYLLO EQU CF_BASE+4 |
0191 E045 CF_CYLHI EQU CF_BASE+5 |
0192 E046 CF_HEAD EQU CF_BASE+6 |
0193 E047 CF_STATUS EQU CF_BASE+7 ; read status |
0194 E047 CF_COMAND EQU CF_BASE+7 ; write command |
0195 * |
0196 * Command Equates |
0197 * |
0198 0020 CMDREAD EQU $20 ; Read Single sector |
0199 0030 CMDWRITE EQU $30 ; Write Single sector |
0200 00EF CMDFEATURE EQU $EF |
0201 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0202 00E0 HEADLBA EQU $E0 |
0203 * |
0204 * Status bit equates |
0205 * |
0206 0080 BUSY EQU $80 |
0207 0040 DRDY EQU $40 |
0208 0008 DRQ EQU $08 |
0209 0001 ERR EQU $01 |
0210 * |
0211 ENDIF CF8OPT |
0212 * |
0213 IFD IDEOPT |
0214 * |
0215 *************************************************** |
0216 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) * |
0217 *************************************************** |
0218 * |
0219 ** COMPACT FLASH SITS AT PORT 4 |
0220 * |
0221 CF_BASE EQU MONIO+$0100 |
0222 CF_DATA EQU CF_BASE+0 |
0223 CF_ERROR EQU CF_BASE+2 ; read error |
0224 CF_FEATURE EQU CF_BASE+2 ; write feature |
0225 CF_SECCNT EQU CF_BASE+4 |
0226 CF_SECNUM EQU CF_BASE+6 |
0227 CF_CYLLO EQU CF_BASE+8 |
0228 CF_CYLHI EQU CF_BASE+10 |
0229 CF_HEAD EQU CF_BASE+12 |
0230 CF_STATUS EQU CF_BASE+14 ; read status |
0231 CF_COMAND EQU CF_BASE+14 ; write command |
0232 CF_AUX EQU CF_BASE+30 |
0233 * |
0234 * Command Equates |
0235 * |
0236 CMDREAD EQU $20 ; Read Single sector |
0237 CMDWRITE EQU $30 ; Write Single sector |
0238 AUXRESET EQU $06 ; Reset IDE |
0239 AUXRSTREL EQU $02 ; Reset release IRQ masked |
0240 HEADLBA EQU $E0 |
0241 * |
0242 * Status bit equates |
0243 * |
0244 BUSY EQU $80 |
0245 DRDY EQU $40 |
0246 DRQ EQU $08 |
0247 ERR EQU $01 |
0248 * |
0249 ENDIF CF8OPT |
0249 ENDIF CF8OPT |
0250 * |
0251 IFD RTCOPT |
0252 * |
0253 ************************************************** |
0254 * MM58167A REAL TIME CLOCK MEMORY MAP: |
0255 ************************************************** |
0256 * |
0257 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 |
0258 * |
0259 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS |
0260 * |
0261 * COUNTER AND COMPARITOR REGISTERS: |
0262 * |
0263 * Both the Clock Counter and Clock Comparitor |
0264 * consist of 8 registers for holding the time. |
0265 * The register offsets from the Counter and |
0266 * Comparitor registers are listed above. |
0267 * |
0268 COUNTR EQU CLOCK+0 |
0269 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS |
0270 * |
0271 * CLOCK REGISTER OFFSETS: |
0272 * These register offsets are used for the CLOCK |
0273 * and comparitor ram CMPRAM. |
0274 * |
0275 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS |
0276 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS |
0277 SECOND EQU 2 |
0278 MINUIT EQU 3 |
0279 HOUR EQU 4 |
0280 WKDAY EQU 5 |
0281 MTHDAY EQU 6 |
0282 MONTH EQU 7 |
0283 * |
0284 * INTERRUPT OUTPUT REGISTERS: |
0285 * |
0286 * An interrupt output may be generated at the |
0287 * following rates by setting the appropriate bit |
0288 * in the Interrupt Control Register (CINTCR). |
0289 * The Interrupt Status Register (CINTSR) must be |
0290 * read to clear the interrupt and will return |
0291 * the source of the interrupt. |
0292 * |
0293 * 1/Month Bit 7 |
0294 * 1/Week Bit 6 |
0295 * 1/Day Bit 5 |
0296 * 1/Hour Bit 4 |
0297 * 1/Minuite Bit 3 |
0298 * 1/Second Bit 2 |
0299 * 10/Second Bit 1 |
0300 * Comparitor Bit 0 |
0301 * |
0302 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER |
0303 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER |
0304 * |
0305 * COUNTER AND RAM RESETS; GO COMMAND. |
0306 * |
0307 * The counter and comparitor may be reset |
0308 * by writing $FF into CTRRES and CMPRES |
0309 * respectivly. |
0310 * A write to the Go command register (GOCMND) |
0311 * will reset the 1/1000ths, 1/100ths and 1/10ths |
0312 * of a second counter. |
0313 * |
0314 CTRRES EQU CLOCK+18 COUNTER RESET |
0315 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET |
0316 GOCMND EQU CLOCK+21 GO COMMAND |
0317 * |
0318 * CLOCK STATUS REGISTER. |
0319 * |
0320 * The counter takes 61 usec. to rollover for |
0321 * every 1KHz clock pulse. If the Status bit is |
0322 * set after reading the counter, the counter |
0323 * should be re-read to ensure the time is correct. |
0324 * |
0325 CLKSTA EQU CLOCK+20 STATUS BIT |
0326 SBYINT EQU CLOCK+22 STANDBY INTERRUPT |
0327 TSTMOD EQU CLOCK+31 TEST MODE REGISTER |
0328 ENDIF RTCOPT |
0328 ENDIF RTCOPT |
0329 * |
0330 IFD TRAOPT |
0331 * |
0332 ************************************************** |
0333 * PIA INTERRUPT TIMER |
0334 ************************************************** |
0335 * |
0336 ** PIA INTERRUPT TIMER SITS ON PORT 7 |
0337 * |
0338 ** PIA TIMER FOR SINGLE STEP / TRACE |
0339 * |
0340 * TADATA = Output = Timer preset register |
0341 * TACTRL - CA1 = input = rising edge = NMI |
0342 * - CA2 = Output = Timer Reset (Active High) |
0343 * TBDATA = Input = Timer read back register |
0344 * TBCTRL - CB1 = input = rising edge = FIRQ |
0345 * - CB2 = output = strobe low on write to TBDATA = Timer Preset |
0346 * |
0347 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0348 * CRA1 = 1 CA1 Rising edge IRQ |
0349 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0350 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0351 * CRA4 = 1 ] CA2 = Set/Reset output |
0352 * CRA5 = 1 ] |
0353 * CRA6 = X CA2 Input Interrupt Flag |
0354 * CRA7 = X CA1 Interrupt Flag |
0355 * |
0356 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0357 * CRB1 = 1 CB1 Rising edge IRQ |
0358 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0359 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0360 * CRB4 = 1 ] CB2 = Set/Reset output |
0361 * CRB5 = 1 ] |
0362 * CRB6 = X CB2 Input Interrupt Flag |
0363 * CRB7 = X CB1 Interrupt Flag |
0364 * |
0365 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output |
0366 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output |
0367 * |
0368 TADATA EQU MONIO+$70 Timer preset port |
0369 TACTRL EQU MONIO+$71 |
0370 TBDATA EQU MONIO+$72 Timer read back port |
0371 TBCTRL EQU MONIO+$73 |
0372 * |
0373 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) |
0374 * |
0375 ENDIF TRAOPT |
0375 ENDIF TRAOPT |
0376 IFD ADSOPT |
0377 * |
0378 *************************************************** |
0379 * SERIAL PORT FOR DG640 * |
0380 *************************************************** |
0381 * |
0382 ** SET UP FOR ACKERMAN DIGITAL ADS6809 |
0383 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA |
0384 * |
0385 ACIAS EQU MONIO+$400 CONTROL PORT |
0386 * |
0387 ENDIF ADSOPT |
0387 ENDIF ADSOPT |
0388 IFD PRTOPT |
0389 * |
0390 *************************************************** |
0391 * PRINTER INTERFACE * |
0392 *************************************************** |
0393 * |
0394 PADATA EQU MONIO+$404 |
0395 PACTRL EQU MONIO+$405 |
0396 PBDATA EQU MONIO+$406 |
0397 PBCTRL EQU MONIO+$407 |
0398 * |
0399 ** CB1 ACK. I/P |
0400 ** CB2 STB. O/P |
0401 ** PB0 - PB7 DATA 1 - 8 O/P |
0402 ** PORT A BIT ASSIGNMENT |
0403 * |
0404 PBUSY EQU $80 I/P |
0405 PEMPTY EQU $40 I/P |
0406 SELECT EQU $20 I/P |
0407 PERROR EQU $10 I/P |
0408 PRESET EQU %00000100 O/P PA3 = 0 |
0409 AUTOFD EQU %00001000 O/P PA2 = 0 |
0410 DIRMSK EQU %00001100 |
0411 ENDIF PRTOPT |
0411 ENDIF PRTOPT |
0412 IFD DG640OPT |
0413 * |
0414 *************************************************** |
0415 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0416 *************************************************** |
0417 * |
0418 ** VIDEO DISPLAY DEFINITIONS |
0419 * |
0420 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY |
0421 LINLEN EQU 64 LENGTH OF A LINE |
0422 NUMLIN EQU 16 NUMBER OF LINES |
0423 SCNLEN EQU $400 LENGTH OF SCREEN |
0424 ENDIF DG640OPT |
0424 ENDIF DG640OPT |
0425 * |
0426 IFD DMAFOPT |
0427 * |
0428 *************************************************** |
0429 * DMAF2 8" DRIVE * |
0430 *************************************************** |
0431 * |
0432 ADDREG EQU $F000 ADDRESS REGISTER |
0433 CNTREG EQU $F002 COUNT REGISTER |
0434 CCREG EQU $F010 CHANNEL CONTROL REGISTER |
0435 PRIREG EQU $F014 DMA PRIORITY REGISTER |
0436 AAAREG EQU $F015 ??? |
0437 BBBREG EQU $F016 ??? |
0438 COMREG EQU $F020 1791 COMMAND REGISTER |
0439 SECREG EQU $F022 SECTOR REGISTER |
0440 DRVREG EQU $F024 DRIVE SELECT LATCH |
0441 CCCREG EQU $F040 ??? |
0442 ENDIF DMAFOPT |
0442 ENDIF DMAFOPT |
0443 IFD DATOPT |
0444 ************************************************** |
0445 * DYNAMIC ADDRESS TRANSLATION REGISTERS * |
0446 ************************************************** |
0447 * |
0448 FFF0 IC11 EQU $FFF0 DAT RAM CHIP |
0449 55AA TSTPAT EQU $55AA TEST PATTERN |
0450 ENDIF DATOPT |
0451 * |
0003 END |
0000 INCLUDE "sys09bug.asm" |
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR |
0002 OPT l |
|
|
sys09bug.asm 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 * BY: JOHN KENT |
0028 * DATE: 7TH JANUARY 2007 |
0029 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000 |
0030 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS |
0031 * AND REALTIME CLOCK |
0032 * |
0033 * MODIFIED TO SYS09BUG VER 1.2 |
0034 * BY: JOHN KENT |
0035 * DATE: 21ST MAY 2007 |
0036 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION |
0037 * REMOVED PORT REDIRECTION ON PUNCH & LOAD |
0038 * |
0039 * Modified to SYS09BUG VER 1.3 |
0040 * BY: JOHN KENT |
0041 * DATE: 8TH JAN 2008 |
0042 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD |
0043 * WITH ONLY 32K OF RAM |
0044 * |
0045 * Modified to SYS09BUG VER 1.4 |
0046 * BY: JOHN KENT |
0047 * DATE: 3RD FEB 2008 |
0048 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE |
0049 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300 |
0050 * 16 BIT IDE DISK BOOT STRAP ROUTINE |
0051 * |
0052 * Modified to SYS09BUG VER 1.5 |
0053 * BY: JOHN KENT |
0054 * DATE: 7TH SEP 2008 |
0055 * ADDED: ADDED "B3-S2+" STRING |
0056 * |
0057 * Modified to SYS09BUG VER 1.6 |
0058 * BY: JOHN KENT |
0059 * DATE: 2ND DEC 2008 |
0060 * ADDED: ADDED HARDWARE FLOW CONTROL |
0061 * |
0062 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
0063 * |
0064 * Modified to SYS09BUG VER 1.7 |
0065 * BY: JOHN KENT |
0066 * DATE: 16TH OCT 2010 |
0067 * ADDED: "DE2-70" STRING |
0068 * |
0069 * *** COMMANDS *** |
0070 * |
0071 * CONTROL A = ALTER THE "A" ACCUMULATOR |
0072 * CONTROL B = ALTER THE "B" ACCUMULATOR |
0073 * CONTROL C = ALTER THE CONDITION CODE REGISTER |
0074 * CONTROL D = ALTER THE DIRECT PAGE REGISTER |
0075 * CONTROL P = ALTER THE PROGRAM COUNTER |
0076 * CONTROL U = ALTER USER STACK POINTER |
0077 * CONTROL X = ALTER "X" INDEX REGISTER |
0078 * CONTROL Y = ALTER "Y" INDEX REGISTER |
0079 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh |
0080 * D = 5.25" MINIFLOPPY BOOT |
0081 * E ssss-eeee = EXAMINE MEMORY |
0082 * FROM STARTING ADDRESS ssss |
0083 * TO ENDING ADDRESS eeee. |
0084 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI |
0085 * L = LOAD TAPE |
0086 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh |
0087 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. |
0088 * R = DISPLAY REGISTER CONTENTS |
0089 * S = DISPLAY STACK FROM ssss TO $DFC0 |
0090 * U = 8" DMAF2 FLOPPY BOOT |
0091 * U = USER EXTENSION COMMANDS AT $F000 |
0092 * X = REMOVE ALL BREAKPOINTS |
0093 * |
0094 * |
0095 *************************************************** |
0096 * SYS09BUG VARIABLE SPACE |
0097 *************************************************** |
0098 * |
0099 DFC0 ORG MONRAM |
0100 DFC0 STACK EQU * ; TOP OF INTERNAL STACK |
0101 DFC0 NMI RMB 2 ; USER NMI VECTOR |
0102 DFC2 SWI3 RMB 2 ; SOFTWARE INTERRUPT VECTOR #3 |
0103 DFC4 SWI2 RMB 2 ; SOFTWARE INTERRUPT VECTOR #2 |
0104 DFC6 FIRQ RMB 2 ; FAST INTERRUPT VECTOR |
0105 DFC8 IRQ RMB 2 ; INTERRUPT VECTOR |
0106 DFCA SWI RMB 2 ; SOFTWARE INTERRUPT VECTOR |
0107 DFCC SVCVO RMB 2 ; SUPERVISOR CALL VECTOR ORGIN |
0108 DFCE SVCVL RMB 2 ; SUPERVISOR CALL VECTOR LIMIT |
0109 IFD DATOPT |
0110 DFD0 LRARAM RMB 16 ; LRA ADDRESSES |
0111 ENDIF DATOPT |
0112 DFE0 CPORT RMB 2 ; RE-VECTORABLE CONTROL PORT |
0113 DFE2 ECHO RMB 1 ; ECHO FLAG |
0114 DFE3 BPTBL RMB 24 ; BREAKPOINT TABLE BASE ADDR |
0115 IFD TRAOPT |
0116 NMISAV RMB 2 ; NMI Jump Vector Backup |
0117 TRACNT RMB 2 ; Trace Count |
0118 ENDIF TRAOPT |
0118 ENDIF TRAOPT |
0119 IFD VDUOPT |
0120 * |
0121 ************************************************** |
0122 * VDU8 DISPLAY DRIVER VARIABLES * |
0123 ************************************************** |
0124 * |
0125 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** |
0126 DFFB COLADX RMB 1 ; CURSOR COLUMN |
0127 DFFC ROWADX RMB 1 ; CURSOR ROW |
0128 ************************************************** |
0129 * |
0130 DFFD NEWROW RMB 1 ; NEW ROW TEMP FOR ESCAPE |
0131 DFFE ESCFLG RMB 1 ; ESCAPE SEQUENCE ACTIVE |
0132 ENDIF VDUOPT |
0133 IFD DG640OPT |
0134 * |
0135 *************************************************** |
0136 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0137 *************************************************** |
0138 * |
0139 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** |
0140 COLADX RMB 1 ; CURSOR COLUMN |
0141 ROWADX RMB 1 ; CURSOR ROW |
0142 ************************************************* |
0143 CURSOR RMB 2 ; ABSOLUTE SCREEN ADDRESS |
0144 NEWROW RMB 1 ; NEW ROW TEMP FOR ESCAPE |
0145 ESCFLG RMB 1 ; ESCAPE SEQUENCE ACTIVE |
0146 ENDIF DG640OPT |
0146 ENDIF DG640OPT |
0147 * |
0148 * |
0149 *************************************************** |
0150 * START OF ROM * |
0151 *************************************************** |
0152 * |
0153 F800 ORG MONROM |
0154 F800 F8 14 FDB MONITOR |
0155 F802 F8 61 FDB NEXTCMD |
0156 F804 FC A1 FDB INCH |
0157 F806 FC 9B FDB INCHE |
0158 F808 FC B9 FDB INCHEK |
0159 F80A FC CE FDB OUTCH |
0160 F80C FB 8F FDB PDATA |
0161 F80E FB 1E FDB PCRLF |
0162 F810 FB 1A FDB PSTRNG |
0163 F812 FA 2E FDB LRA |
0164 * |
0165 IFD ADSOPT |
0166 FDB PCHK ; CHECK FOR PRINTER INPUT |
0167 FDB PINIZ ; INITIATE PRINTER |
0168 FDB POUTCH ; OUTPUT CH. TO PRINTER |
0169 FDB VINIZ |
0170 FDB VOUTCH |
0171 FDB ACINIZ |
0172 FDB AOUTCH |
0173 ENDIF ADSOPT |
0173 ENDIF ADSOPT |
0174 * |
0175 * MONITOR |
0176 * |
0177 * VECTOR ADDRESS STRING IS..... |
0178 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF |
0179 * |
0180 F814 8E FE 62 MONITOR LDX #RAMVEC ; POINT TO VECTOR ADDR. STRING |
0181 F817 10 8E DF C0 LDY #STACK ; POINT TO RAM VECTOR LOCATION |
0182 F81B C6 10 LDB #$10 ; BYTES TO MOVE = 16 |
0183 F81D A6 80 LOOPA LDA ,X+ ; GET VECTOR BYTE |
0184 F81F A7 A0 STA ,Y+ ; PUT VECTORS IN RAM / $DFC0-$DFCF |
0185 F821 5A DECB ; SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE |
0186 F822 26 F9 BNE LOOPA ; CONTINUE UNTIL ALL VECTORS MOVED |
0187 * |
0188 * CONTENTS FROM TO FUNCTION |
0189 * $F8A1 $FE40 $DFC0 USER-V |
0190 * $F8A1 $FE42 $DFC2 SWI3-V |
0191 * $F8A1 $FE44 $DFC4 SWI2-V |
0192 * $F8A1 $FE46 $DFC6 FIRQ-V |
0193 * $F8A1 $FE48 $DFC8 IRQ-V |
0194 * $FAB0 $FE4A $DFCA SWI-V |
0195 * $FFFF $FE4C $DFCC SVC-VO |
0196 * $FFFF $FE4E $DFCE SVC-VL |
0197 * |
0198 F824 8E E0 00 LDX #ACIAS |
0199 F827 BF DF E0 STX CPORT ; STORE ADDR. IN RAM |
0200 F82A 17 01 5B LBSR XBKPNT ; CLEAR OUTSTANDING BREAKPOINTS |
0201 F82D C6 0C LDB #12 ; CLEAR 12 BYTES ON STACK |
0202 F82F 6F E2 CLRSTK CLR ,-S |
0203 F831 5A DECB |
0204 F832 26 FB BNE CLRSTK |
0205 F834 30 8C DD LEAX MONITOR,PCR ; SET PC TO SBUG-E ENTRY |
0206 F837 AF 6A STX 10,S ; ON STACK |
0207 F839 86 D0 LDA #$D0 ; PRESET CONDITION CODES ON STACK |
0208 F83B A7 E4 STA ,S |
0209 F83D 1F 43 TFR S,U |
0210 F83F 17 04 A3 LBSR IOINIZ ; INITIALIZE CONTROL PORT |
0211 F842 8E FE 72 LDX #MSG1 ; POINT TO MONITOR MESSAGE |
0212 F845 17 03 47 LBSR PDATA ; PRINT MSG |
0213 * |
0214 IFD DATOPT |
0215 F848 8E DF D0 LDX #LRARAM ; POINT TO LRA RAM STORAGE AREA |
0216 F84B 4F CLRA START ; TOTAL AT ZERO |
0217 F84C C6 0D LDB #13 ; TOTAL UP ALL ACTIVE RAM MEMORY |
0218 F84E 6D 85 FNDREL TST B,X ; TEST FOR RAM AT NEXT LOC. |
0219 F850 27 03 BEQ RELPAS ; IF NO RAM GO TO NEXT LOC. |
0220 F852 8B 04 ADDA #4 ; ELSE ADD 4K TO TOTAL |
0221 F854 19 DAA ; ADJ. TOTAL FOR DECIMAL |
0222 F855 5A RELPAS DECB ; SUB. 1 FROM LOCS. TO TEST |
0223 F856 2A F6 BPL FNDREL ; PRINT TOTAL OF RAM |
0224 F858 17 04 0C LBSR OUT2H ; OUTPUT HEX BYTE AS ASCII |
0225 F85B 8E FE 92 LDX #MSG2 ; POINT TO MSG 'K' CR/LF + 3 NULS |
0226 F85E 17 03 2E LBSR PDATA ; PRINT MSG |
0227 ENDIF DATOPT |
0228 * |
0229 IFD TRAOPT |
0230 LBSR TRAINZ |
0231 ENDIF TRAOPT |
0231 ENDIF TRAOPT |
0232 * |
0233 ***** NEXTCMD ***** |
0234 * |
0235 F861 8E FE 99 NEXTCMD LDX #MSG3 ; POINT TO MSG ">" |
0236 F864 17 02 B3 LBSR PSTRNG ; PRINT MSG |
0237 F867 17 04 37 LBSR INCH ; GET ONE CHAR. FROM TERMINAL |
0238 F86A 84 7F ANDA #$7F ; STRIP PARITY FROM CHAR. |
0239 F86C 81 0D CMPA #$0D ; IS IT CARRIAGE RETURN ? |
0240 F86E 27 F1 BEQ NEXTCMD ; IF CR THEN GET ANOTHER CHAR. |
0241 F870 1F 89 TFR A,B ; PUT CHAR. IN "B" ACCUM. |
0242 F872 81 20 CMPA #$20 ; IS IT CONTROL OR DATA CHAR ? |
0243 F874 2C 09 BGE PRTCMD ; IF CMD CHAR IS DATA, PRNT IT |
0244 F876 86 5E LDA #'^ ; ELSE CNTRL CHAR CMD SO... |
0245 F878 17 04 53 LBSR OUTCH ; PRINT "^" |
0246 F87B 1F 98 TFR B,A ; RECALL CNTRL CMD CHAR |
0247 F87D 8B 40 ADDA #$40 ; CONVERT IT TO ASCII LETTER |
0248 F87F 17 04 4C PRTCMD LBSR OUTCH ; PRNT CMD CHAR |
0249 F882 17 04 47 LBSR OUT1S ; PRNT SPACE |
0250 F885 C1 60 CMPB #$60 |
0251 F887 2F 02 BLE NXTCH0 |
0252 F889 C0 20 SUBB #$20 |
0253 * |
0254 ***** DO TABLE LOOKUP ***** |
0255 * FOR COMMAND FUNCTIONS |
0256 * |
0257 F88B 8E FE 29 NXTCH0 LDX #JMPTAB ; POINT TO JUMP TABLE |
0258 F88E E1 80 NXTCHR CMPB ,X+ ; DOES COMMAND MATCH TABLE ENTRY ? |
0259 F890 27 0F BEQ JMPCMD ; BRANCH IF MATCH FOUND |
0260 F892 30 02 LEAX 2,X ; POINT TO NEXT ENTRY IN TABLE |
0261 F894 8C FE 62 CMPX #TABEND ; REACHED END OF TABLE YET ? |
0262 F897 26 F5 BNE NXTCHR ; IF NOT END, CHECK NEXT ENTRY |
0263 F899 8E FE 9B LDX #MSG4 ; POINT TO MSG "WHAT?" |
0264 F89C 17 02 F0 LBSR PDATA ; PRINT MSG |
0265 F89F 20 C0 BRA NEXTCMD ; IF NO MATCH, PRMPT FOR NEW CMD |
0266 F8A1 AD 94 JMPCMD JSR [,X] ; JUMP TO COMMAND ROUTINE |
0267 F8A3 20 BC BRA NEXTCMD ; PROMPT FOR NEW COMMAND |
0268 * |
0269 * "G" GO OR CONTINUE |
0270 * |
0271 F8A5 1F 34 GO TFR U,S |
0272 F8A7 3B RTI RTI |
0273 * |
0274 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0275 * |
0276 F8A8 17 03 6B MEMCHG LBSR IN1ADR ; INPUT ADDRESS |
0277 F8AB 29 2D BVS CHRTN ; IF NOT HEX, RETURN |
0278 F8AD 1F 12 TFR X,Y ; SAVE ADDR IN "Y" |
0279 F8AF 8E FE A1 MEMC2 LDX #MSG5 ; POINT TO MSG " - " |
0280 F8B2 17 02 65 LBSR PSTRNG ; PRINT MSG |
0281 F8B5 1F 21 TFR Y,X ; FETCH ADDRESS |
0282 F8B7 17 03 A5 LBSR OUT4H ; PRINT ADDR IN HEX |
0283 F8BA 17 04 0F LBSR OUT1S ; OUTPUT SPACE |
0284 F8BD A6 A4 LDA ,Y ; GET CONTENTS OF CURRENT ADDR. |
0285 F8BF 17 03 A5 LBSR OUT2H ; OUTPUT CONTENTS IN ASCII |
0286 F8C2 17 04 07 LBSR OUT1S ; OUTPUT SPACE |
0287 F8C5 17 03 5E LBSR BYTE ; LOOP WAITING FOR OPERATOR INPUT |
0288 F8C8 28 11 BVC CHANGE ; IF VALID HEX GO CHANGE MEM. LOC. |
0289 F8CA 81 08 CMPA #8 ; IS IT A BACKSPACE (CNTRL H)? |
0290 F8CC 27 E1 BEQ MEMC2 ; PROMPT OPERATOR AGAIN |
0291 F8CE 81 18 CMPA #$18 ; IS IT A CANCEL (CNTRL X)? |
0292 F8D0 27 DD BEQ MEMC2 ; PROMPT OPERATOR AGAIN |
0293 F8D2 81 5E CMPA #'^ ; IS IT AN UP ARROW? |
0294 F8D4 27 17 BEQ BACK ; DISPLAY PREVIOUS BYTE |
0295 F8D6 81 0D CMPA #$D ; IS IT A CR? |
0296 F8D8 26 0F BNE FORWRD ; DISPLAY NEXT BYTE |
0297 F8DA 39 CHRTN RTS ; EXIT ROUTINE |
0298 * |
0299 * |
0300 F8DB A7 A4 CHANGE STA ,Y ; CHANGE BYTE IN MEMORY |
0301 F8DD A1 A4 CMPA ,Y ; DID MEMORY BYTE CHANGE? |
0302 F8DF 27 08 BEQ FORWRD ; $F972 |
0303 F8E1 17 03 E8 LBSR OUT1S ; OUTPUT SPACE |
0304 F8E4 86 3F LDA #'? ; LOAD QUESTION MARK |
0305 F8E6 17 03 E5 LBSR OUTCH ; PRINT IT |
0306 F8E9 31 21 FORWRD LEAY 1,Y ; POINT TO NEXT HIGHER MEM LOCATION |
0307 F8EB 20 C2 BRA MEMC2 ; PRINT LOCATION & CONTENTS |
0308 F8ED 31 3F BACK LEAY -1,Y ; POINT TO LAST MEM LOCATION |
0309 F8EF 20 BE BRA MEMC2 ; PRINT LOCATION & CONTENTS |
0310 * |
0311 * "S" DISPLAY STACK |
0312 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM |
0313 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. |
0314 * |
0315 F8F1 17 02 A2 DISSTK LBSR PRTSP ; PRINT CURRENT STACK POINTER |
0316 F8F4 1F 32 TFR U,Y |
0317 F8F6 8E DF C0 LDX #STACK ; LOAD INTERNAL STACK AS UPPER LIMIT |
0318 F8F9 30 1F LEAX -1,X ; POINT TO CURRENT STACK |
0319 F8FB 20 05 BRA MDUMP1 ; ENTER MEMORY DUMP OF STACK CONTENTS |
0320 * |
0321 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII |
0322 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. |
0323 * UPPER ADDRESS IN X-REG. |
0324 * IF HEX ADDRESSES ARE INVALID (V)=1. |
0325 * |
0326 F8FD 17 03 0B MEMDUMP LBSR IN2ADR ; INPUT ADDRESS BOUNDRIES |
0327 F900 29 06 BVS EDPRTN ; NEW COMMAND IF ILLEGAL HEX |
0328 F902 34 20 MDUMP1 PSHS Y ; COMPARE LOWER TO UPPER BOUNDS |
0329 F904 AC E1 CMPX ,S++ ; LOWER BOUNDS > UPPER BOUNDS? |
0330 F906 24 01 BCC AJDUMP ; IF NOT, DUMP HEX AND ASCII |
0331 F908 39 EDPRTN RTS ; |
0332 * |
0333 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0334 * TO EVEN 16 BYTE BOUNDRIES. |
0335 * |
0336 * IF LOWER ADDR = $4532 |
0337 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0338 * |
0339 * IF UPPER ADDR = $4567 |
0340 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0341 * |
0342 * ENTER WITH LOWER ADDRESS IN X-REG. |
0343 * -UPPER ADDRESS ON TOP OF STACK. |
0344 * |
0345 F909 1F 10 AJDUMP TFR X,D ; GET UPPER ADDR IN D-REG |
0346 F90B C3 00 10 ADDD #$10 ; ADD 16 TO UPPER ADDRESS |
0347 F90E C4 F0 ANDB #$F0 ; MASK TO EVEN 16 BYTE BOUNDRY |
0348 F910 34 06 PSHS A,B ; SAVE ON STACK AS UPPER DUMP LIMIT |
0349 F912 1F 20 TFR Y,D ; $F9A5 GET LOWER ADDRESS IN D-REG |
0350 F914 C4 F0 ANDB #$F0 ; MASK TO EVEN 16 BYTE BOUNDRY |
0351 F916 1F 01 TFR D,X ; PUT IN X-REG AS LOWER DUMP LIMIT |
0352 F918 AC E4 NXTLIN CMPX ,S ; COMPARE LOWER TO UPPER LIMIT |
0353 F91A 27 05 BEQ SKPDMP ; IF EQUAL SKIP HEX-ASCII DUMP |
0354 F91C 17 03 9A LBSR INCHEK ; CHECK FOR INPUT FROM KEYBOARD |
0355 F91F 27 03 BEQ EDUMP |
0356 F921 32 62 SKPDMP LEAS 2,S ; READJUST STACK IF NOT DUMPING |
0357 F923 39 RTS ; |
0358 * |
0359 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0360 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0361 * |
0362 F924 34 10 EDUMP PSHS X ; PUSH LOWER ADDR LIMIT ON STACK |
0363 F926 8E FE A1 LDX #MSG5 ; POINT TO MSG " - " |
0364 F929 17 01 EE LBSR PSTRNG ; PRINT MSG |
0365 F92C AE E4 LDX ,S ; LOAD LOWER ADDR FROM TOP OF STACK |
0366 F92E 17 03 2E LBSR OUT4H ; PRINT THE ADDRESS |
0367 F931 17 03 96 LBSR OUT2S ; 2 SPACES |
0368 F934 C6 10 LDB #$10 ; LOAD COUNT OF 16 BYTES TO DUMP |
0369 F936 A6 80 ELOOP LDA ,X+ ; GET FROM MEMORY HEX BYTE TO PRINT |
0370 F938 17 03 2C LBSR OUT2H ; OUTPUT HEX BYTE AS ASCII |
0371 F93B 17 03 8E LBSR OUT1S ; OUTPUT SPACE |
0372 F93E 5A DECB ; $F9D1 DECREMENT BYTE COUNT |
0373 F93F 26 F5 BNE ELOOP ; CONTINUE TIL 16 HEX BYTES PRINTED |
0374 * |
0375 * PRINT 16 ASCII CHARACTERS |
0376 * IF NOT PRINTABLE OR NOT VALID |
0377 * ASCII PRINT A PERIOD (.) |
0378 F941 17 03 86 LBSR OUT2S ; 2 SPACES |
0379 F944 AE E1 LDX ,S++ ; GET LOW LIMIT FRM STACK - ADJ STACK |
0380 F946 C6 10 LDB #$10 ; SET ASCII CHAR TO PRINT = 16 |
0381 F948 A6 80 EDPASC LDA ,X+ ; GET CHARACTER FROM MEMORY |
0382 F94A 81 20 CMPA #$20 ; IF LESS THAN $20, NON-PRINTABLE? |
0383 F94C 25 04 BCS PERIOD ; IF SO, PRINT PERIOD INSTEAD |
0384 F94E 81 7E CMPA #$7E ; IS IT VALID ASCII? |
0385 F950 23 02 BLS PRASC ; IF SO PRINT IT |
0386 F952 86 2E PERIOD LDA #'. ; LOAD A PERIOD (.) |
0387 F954 17 03 77 PRASC LBSR OUTCH ; PRINT ASCII CHARACTER |
0388 F957 5A DECB ; DECREMENT COUNT |
0389 F958 26 EE BNE EDPASC |
0390 F95A 20 BC BRA NXTLIN |
0391 * |
0392 ***** "B" SET BREAKPOINT ***** |
0393 * |
0394 F95C 17 02 B7 BRKPNT LBSR IN1ADR ; GET BREAKPOINT ADDRESS |
0395 F95F 29 1E BVS EXITBP ; EXIT IF INVALID HEX ADDR. |
0396 F961 8C DF C0 CMPX #STACK ; ADDRESS ILLEGAL IF >=$DFC0 |
0397 F964 24 1A BCC BPERR ; IF ERROR PRINT (?), EXIT |
0398 F966 34 10 PSHS X ; $FA82 PUSH BP ADDRESS ON STACK |
0399 F968 8E FF FF LDX #$FFFF ; LOAD DUMMY ADDR TO TEST BP TABLE |
0400 F96B 8D 55 BSR BPTEST ; TEST BP TABLE FOR FREE SPACE |
0401 F96D 35 10 PULS X ; POP BP ADDRESS FROM STACK |
0402 F96F 27 0F BEQ BPERR ; (Z) SET, OUT OF BP TABLE SPACE |
0403 F971 A6 84 LDA ,X ; GET DATA AT BREAKPOINT ADDRESS |
0404 F973 81 3F CMPA #$3F ; IS IT A SWI? |
0405 F975 27 09 BEQ BPERR ; IF SWI ALREADY, INDICATE ERROR |
0406 F977 A7 A0 STA ,Y+ ; SAVE DATA BYTE IN BP TABLE |
0407 F979 AF A4 STX ,Y ; SAVE BP ADDRESS IN BP TABLE |
0408 F97B 86 3F LDA #$3F ; LOAD A SWI ($3F) |
0409 F97D A7 84 STA ,X ; SAVE SWI AT BREAKPOINT ADDRESS |
0410 F97F 39 EXITBP RTS ; |
0411 * |
0412 * INDICATE ERROR SETTING BREAKPOINT |
0413 * |
0414 F980 17 03 49 BPERR LBSR OUT1S ; OUTPUT SPACE |
0415 F983 86 3F LDA #'? ; LOAD (?), INDICATE BREAKPOINT ERROR |
0416 F985 16 03 46 LBRA OUTCH ; PRINT "?" |
0417 * |
0418 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** |
0419 * |
0420 F988 10 8E DF E3 XBKPNT LDY #BPTBL ; POINT TO BREAKPOINT TABLE |
0421 F98C C6 08 LDB #8 ; LOAD BREAKPOINT COUNTER |
0422 F98E 8D 18 XBPLP BSR RPLSWI ; REMOVE USED ENTRY IN BP TABLE |
0423 F990 5A DECB $FAAC ; DECREMENT BP COUNTER |
0424 F991 26 FB BNE XBPLP ; END OF BREAKPOINT TABLE? |
0425 F993 39 RTS |
0426 * |
0427 ***** SWI ENTRY POINT ***** |
0428 * |
0429 F994 1F 43 SWIE TFR S,U ; TRANSFER STACK TO USER POINTER |
0430 F996 AE 4A LDX 10,U ; LOAD PC FROM STACK INTO X-REG |
0431 F998 30 1F LEAX -1,X ; ADJUST ADDR DOWN 1 BYTE. |
0432 F99A 8D 26 BSR BPTEST ; FIND BREAKPOINT IN BP TABLE |
0433 F99C 27 04 BEQ REGPR ; IF FOUND, REPLACE DATA AT BP ADDR |
0434 F99E AF 4A STX 10,U ; SAVE BREAKPOINT ADDR IN STACK |
0435 F9A0 8D 06 BSR RPLSWI ; GO REPLACE SWI WITH ORIGINAL DATA |
0436 F9A2 17 02 48 REGPR LBSR REGSTR ; GO PRINT REGISTERS |
0437 * |
0438 IFD TRAOPT |
0439 LDX #0 |
0440 STX TRACNT |
0441 ENDIF TRAOPT |
0441 ENDIF TRAOPT |
0442 * |
0443 F9A5 16 FE B9 LBRA NEXTCMD ; GET NEXT COMMAND |
0444 * |
0445 F9A8 AE 21 RPLSWI LDX 1,Y ; LOAD BP ADDRESS FROM BP TABLE |
0446 F9AA 8C DF C0 CMPX #STACK ; COMPARE TO TOP AVAILABLE USER MEMORY |
0447 F9AD 24 0A BCC FFSTBL ; GO RESET TABLE ENTRY TO $FF'S |
0448 F9AF A6 84 LDA ,X ; GET DATA FROM BP ADDRESS |
0449 F9B1 81 3F CMPA #$3F ; IS IT SWI? |
0450 F9B3 26 04 BNE FFSTBL ; IF NOT, RESET TABLE ENTRY TO $FF'S |
0451 F9B5 A6 A4 LDA ,Y ; GET ORIGINAL DATA FROM BP TABLE |
0452 F9B7 A7 84 STA ,X ; $FAD3 RESTORE DATA AT BP ADDRESS |
0453 F9B9 86 FF FFSTBL LDA #$FF ; LOAD $FF IN A-ACC |
0454 F9BB A7 A0 STA ,Y+ ; RESET BREAKPOINT TABLE DATA TO $FF'S |
0455 F9BD A7 A0 STA ,Y+ ; RESET BREAKPOINT TABLE ADDR TO $FF'S |
0456 F9BF A7 A0 STA ,Y+ |
0457 F9C1 39 RTS |
0458 * |
0459 ** SEARCH BREAKPOINT TABLE FOR MATCH ** |
0460 * |
0461 F9C2 10 8E DF E3 BPTEST LDY #BPTBL ; POINT TO BREAKPOINT TABLE |
0462 F9C6 C6 08 LDB #8 ; LOAD BREAKPOINT COUNTER |
0463 F9C8 A6 A0 FNDBP LDA ,Y+ ; LOAD DATA BYTE |
0464 F9CA AC A1 CMPX ,Y++ ; COMPARE ADDRESS, IS IT SAME? |
0465 F9CC 27 04 BEQ BPADJ ; IF SO, ADJUST POINTER FOR TABLE ENTRY |
0466 F9CE 5A DECB ; IF NOT, DECREMENT BREAKPOINT COUNTER |
0467 F9CF 26 F7 BNE FNDBP ; AND LOOK FOR NEXT POSSIBLE MATCH |
0468 F9D1 39 RTS ; |
0469 * |
0470 * |
0471 F9D2 31 3D BPADJ LEAY -3,Y ; MOVE POINTER TO BEGIN OF BP ENTRY |
0472 F9D4 39 RTS |
0473 * |
0474 IFD TRAOPT |
0475 * |
0476 ** TRACE from address AAAA BB bytes |
0477 * |
0478 TRACE LBSR ALTPC1 ; SET UP NEW PC |
0479 BVS TREXIT ; ADDRESS ERROR, EXIT |
0480 LBSR OUT1S |
0481 LBSR IN1ADR ; Fetch Byte Count |
0482 BVS TREXIT ; Byte Count error, EXIT |
0483 STX TRACNT |
0484 * |
0485 LDX NMI ; Save NMI Vector |
0486 STX NMISAV |
0487 LDX #NMIE ; Set up NMI for Tracing |
0488 STX NMI |
0489 LBSR TRAINZ ; Initialise Hardware |
0490 BRA TRACEG ; Start Trace |
0491 TREXIT RTS |
0492 * |
0493 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0494 * CRA1 = 1 CA1 Rising edge IRQ |
0495 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0496 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0497 * CRA4 = 1 ] CA2 = Set/Reset output |
0498 * CRA5 = 1 ] |
0499 * CRA6 = X CA2 Input Interrupt Flag |
0500 * CRA7 = X CA1 Interrupt Flag |
0501 * |
0502 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0503 * CRB1 = 1 CB1 Rising edge IRQ |
0504 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0505 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0506 * CRB4 = 1 ] CB2 = Set/Reset output |
0507 * CRB5 = 1 ] |
0508 * CRB6 = X CB2 Input Interrupt Flag |
0509 * CRB7 = X CB1 Interrupt Flag |
0510 * |
0511 * |
0512 ** TRACE NMI ENTRY POINT |
0513 * |
0514 NMIE TFR S,U |
0515 LDA #$36 ; Disable Interrupt, CA2 Low |
0516 STA TACTRL |
0517 LDA TADATA ; Clear Interrupt flag by reading data port |
0518 * |
0519 LBSR REGSTR ; DUMP REGISTERS |
0520 * |
0521 LDX 10,U ; TEST IF NEXT INSTRUCTION IS A SWI |
0522 LDA ,X |
0523 CMPA #$3F |
0524 BEQ TRACEX ; EXIT ON SWI |
0525 * |
0526 LDX TRACNT ; CHECK IF TRACE COUNT EXPIRED |
0527 BEQ TRACEX ; YES, GO BACK TO THE MONITOR |
0528 LEAX -1,X ; ECREMENT TRACE COUNT |
0529 STX TRACNT |
0530 * |
0531 ** TRACE GO (RESUME SINGLE STEP) |
0532 * |
0533 TRACEG TFR U,S ; SET UP PROGRAM STACK POINTER |
0534 LDA #TRADEL ; SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) |
0535 STA TADATA |
0536 LDA #$36 ; LOAD STROBE LOW |
0537 STA TACTRL |
0538 LDA TADATA ; CLEAR INTERRUPT |
0539 LDA #$36 ; RELEASE RESET |
0540 STA TBCTRL |
0541 LDA #$3F ; RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE |
0542 STA TACTRL |
0543 RTI ; GO EXECUTE INSTRUCTION |
0544 * |
0545 TRACEX LDX NMISAV ; Restore NMI vector |
0546 STX NMI |
0547 LBRA NEXTCMD ; Jump back to the command loop. |
0548 * |
0549 ** TRACE HARDWARE INITIALISATION |
0550 * |
0551 TRAINZ LDA #$32 ; SELECT DDRA, CA2 LOW, NMI DISABLED |
0552 STA TACTRL |
0553 LDA #$3A ; SELECT DDRB, CB2 HIGH, FIRQ DISABLED |
0554 STA TBCTRL |
0555 LDA #$FF ; PORTA = OUTPUT |
0556 STA TADATA |
0557 LDA #$00 ; PORTB = INPUT |
0558 STA TBDATA |
0559 LDA #$36 ; SELECT OUTPUT REGISTER A, CA2 LOW |
0560 STA TACTRL |
0561 LDA #$3E ; SELECT OUTPUT REGISTER B, CB2 HIGH |
0562 STA TBCTRL |
0563 RTS |
0564 * |
0565 ENDIF TRAOPT |
0565 ENDIF TRAOPT |
0566 IFD MFDCOPT |
0567 * |
0568 ** "U" MINI DISK BOOT |
0569 * |
0570 MINBOOT TST CMDFDC |
0571 CLR DRVFDC |
0572 LDX #$0000 |
0573 LOOP LEAX $01,X |
0574 CMPX #$0000 |
0575 BNE LOOP |
0576 LDA #$0F |
0577 STA CMDFDC |
0578 BSR DELAY |
0579 LOOP1 LDB CMDFDC |
0580 BITB #$01 |
0581 BNE LOOP1 |
0582 LDA #$01 |
0583 STA SECFDC |
0584 BSR DELAY |
0585 LDA #$8C |
0586 STA CMDFDC |
0587 BSR DELAY |
0588 LDX #$C000 |
0589 BRA LOOP3 |
0590 LOOP2 BITB #$02 |
0591 BEQ LOOP3 |
0592 LDA DATFDC |
0593 STA ,X+ |
0594 LOOP3 LDB CMDFDC |
0595 BITB #$01 |
0596 BNE LOOP2 |
0597 BITB #$2C |
0598 BEQ LOOP4 |
0599 RTS |
0600 * |
0601 LOOP4 LDX #$C000 |
0602 STX $0A,U |
0603 TFR U,S |
0604 RTI |
0605 * |
0606 DELAY LDB #$04 |
0607 LOOP5 DECB |
0608 BNE LOOP5 |
0609 RTS |
0610 ENDIF MFDCOPT |
0610 ENDIF MFDCOPT |
0611 * |
0612 IFD DMAFOPT |
0613 * |
0614 *** "D" DISK BOOT FOR DMAF2 *** |
0615 * |
0616 DBOOT LDA #$DE |
0617 STA DRVREG |
0618 LDA #$FF |
0619 STA PRIREG ; $FAF8 |
0620 STA CCREG |
0621 STA AAAREG |
0622 STA BBBREG |
0623 TST CCREG |
0624 LDA #$D8 |
0625 STA COMREG |
0626 LBSR DLY |
0627 DBOOT0 LDA COMREG |
0628 BMI DBOOT0 |
0629 LDA #$09 |
0630 STA COMREG |
0631 LBSR DLY |
0632 * |
0633 DISKWT LDA COMREG ; FETCH DRIVE STATUS |
0634 BITA #1 ; TEST BUSY BIT |
0635 BNE DISKWT ; LOOP UNTIL NOT BUSY |
0636 * |
0637 BITA #$10 |
0638 BNE DBOOT |
0639 * |
0640 LDX #$C000 ; LOGICAL ADDR. = $C000 |
0641 BSR LRA ; GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. |
0642 ORA #$10 |
0643 STA CCCREG |
0644 TFR X,D |
0645 COMA ; |
0646 COMB ; |
0647 STD ADDREG |
0648 LDX #$FEFF ; LOAD DMA BYTE COUNT = $100 |
0649 STX CNTREG ; STORE IN COUNT REGISTER |
0650 LDA #$FF ; LOAD THE CHANNEL REGISTER |
0651 STA CCREG |
0652 LDA #$FE ; SET CHANNEL 0 |
0653 STA PRIREG |
0654 LDA #1 ; SET SECTOR TO "1" |
0655 STA SECREG ; ISSUE COMMAND |
0656 LDA #$8C ; SET SINGLE SECTOR READ |
0657 STA COMREG ; ISSUE COMMAND |
0658 BSR DLY |
0659 * |
0660 * THE FOLLOWING CODE TESTS THE STATUS OF THE |
0661 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT |
0662 * ZERO THEN IT WILL LOOP WAITING FOR "D7" |
0663 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT |
0664 * IS STILL A ONE THE BOOT OPERATION WILL |
0665 * BE STARTED OVER FROM THE BEGINING. |
0666 * |
0667 CLRB ; |
0668 DBOOT1 PSHS B ; $FB55 |
0669 CLRB ; |
0670 DBOOT2 TST CCREG |
0671 BPL DBOOT3 |
0672 DECB ; |
0673 BNE DBOOT2 |
0674 PULS B |
0675 DECB |
0676 BNE DBOOT1 |
0677 BRA DBOOT |
0678 DBOOT3 PULS B |
0679 LDA COMREG |
0680 BITA #$1C |
0681 BEQ DBOOT4 |
0682 RTS ; |
0683 * |
0684 * |
0685 DBOOT4 LDB #$DE |
0686 STB DRVREG |
0687 LDX #$C000 |
0688 STX 10,U |
0689 TFR U,S ; $FB7B |
0690 RTI ; |
0691 ENDIF DMAFOPT |
0691 ENDIF DMAFOPT |
0692 * |
0693 IFD CF8OPT |
0694 * |
0695 * COMPACT FLASH BOOT |
0696 * |
0697 F9D5 8D 40 CFBOOT BSR WAITRDY |
0698 F9D7 86 E0 LDA #HEADLBA |
0699 F9D9 B7 E0 46 STA CF_HEAD |
0700 F9DC 8D 39 BSR WAITRDY |
0701 F9DE 86 01 LDA #FEAT8BIT |
0702 F9E0 B7 E0 41 STA CF_FEATURE |
0703 F9E3 86 EF LDA #CMDFEATURE |
0704 F9E5 B7 E0 47 STA CF_COMAND |
0705 F9E8 8D 2D BSR WAITRDY |
0706 * |
0707 * READ SECTORS FROM CF |
0708 * |
0709 F9EA 86 01 CFREAD LDA #$01 |
0710 F9EC B7 E0 42 STA CF_SECCNT |
0711 F9EF 4F CLRA |
0712 F9F0 B7 E0 43 STA CF_SECNUM |
0713 F9F3 B7 E0 44 STA CF_CYLLO |
0714 F9F6 B7 E0 45 STA CF_CYLHI |
0715 * |
0716 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE |
0717 F9FB B7 E0 47 STA CF_COMAND |
0718 F9FE 8D 17 BSR WAITRDY |
0719 FA00 8E C0 00 LDX #$C000 |
0720 * |
0721 * READ LOOP |
0722 * |
0723 FA03 8D 21 RDLOOP BSR WAITDRQ |
0724 FA05 B6 E0 40 LDA CF_DATA |
0725 FA08 A7 80 STA ,X+ |
0726 FA0A 8C C2 00 CMPX #$C200 |
0727 FA0D 26 F4 BNE RDLOOP |
0728 * |
0729 FA0F 8E C0 00 LDX #$C000 |
0730 FA12 AF 4A STX $0A,U |
0731 FA14 1F 34 TFR U,S |
0732 FA16 3B RTI |
0733 * |
0734 * WAIT UNTIL READY |
0735 * |
0736 FA17 B6 E0 47 WAITRDY LDA CF_STATUS |
0737 FA1A 85 80 BITA #BUSY |
0738 FA1C 26 F9 BNE WAITRDY |
0739 FA1E B6 E0 47 LDA CF_STATUS |
0740 FA21 85 40 BITA #DRDY |
0741 FA23 27 F2 BEQ WAITRDY |
0742 FA25 39 RTS |
0743 * |
0744 * WAIT FOR DATA REQUEST |
0745 * |
0746 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS |
0747 FA29 85 08 BITA #DRQ |
0748 FA2B 27 F9 BEQ WAITDRQ |
0749 FA2D 39 RTS |
0750 ENDIF CF8OPT |
0751 * |
0752 IFD IDEOPT |
0753 * |
0754 * XESS 16 BIT IDE BOOT |
0755 * |
0756 IDEBOOT LDD #AUXRESET |
0757 STD CF_AUX |
0758 LDD #AUXRSTREL |
0759 STD CF_AUX |
0760 LDD #HEADLBA |
0761 STD CF_HEAD |
0762 BSR WAITRDY |
0763 * |
0764 * READ SECTORS FROM CF |
0765 * |
0766 LDD #$01 |
0767 STD CF_SECCNT |
0768 CLRB |
0769 STD CF_SECNUM |
0770 STD CF_CYLLO |
0771 STD CF_CYLHI |
0772 * |
0773 LDB #CMDREAD ; IDE READ MULTIPLE |
0774 STD CF_COMAND |
0775 BSR WAITRDY |
0776 LDX #$C000 |
0777 * |
0778 * READ LOOP |
0779 * |
0780 RDLOOP BSR WAITDRQ |
0781 LDD CF_DATA |
0782 STB ,X+ |
0783 CMPX #$C100 |
0784 BNE RDLOOP |
0785 * |
0786 LDX #$C000 |
0787 STX $0A,U |
0788 TFR U,S |
0789 RTI |
0790 * |
0791 * WAIT UNTIL READY |
0792 * |
0793 WAITRDY LDD CF_STATUS |
0794 BITB #BUSY |
0795 BNE WAITRDY |
0796 LDD CF_STATUS |
0797 BITB #DRDY |
0798 BEQ WAITRDY |
0799 RTS |
0800 * |
0801 * WAIT FOR DATA REQUEST |
0802 * |
0803 WAITDRQ LDD CF_STATUS |
0804 BITB #DRQ |
0805 BEQ WAITDRQ |
0806 RTS |
0807 ENDIF IDEOPT |
0807 ENDIF IDEOPT |
0808 * |
0809 IFD RTCOPT |
0810 * |
0811 * CLOCK INTER FACE UTILITY |
0812 * |
0813 * TIME <Hours> <Minuits> <Seconds> |
0814 * If no argument is specified, the current time |
0815 * will be displayed. |
0816 * |
0817 * READ A REGISTER FROM THE COUNTER. |
0818 * The X Index rgister points to the register |
0819 * to be read. The Status Register is checked |
0820 * before and after the register is read before |
0821 * returning a value in accumulator A |
0822 * |
0823 RDCLK TST CLKSTA |
0824 BNE RDCLK |
0825 RDCLK1 LDA 0,X |
0826 TST CLKSTA |
0827 BNE RDCLK1 |
0828 RTS |
0829 * |
0830 * MAIN PROGRAM: |
0831 * |
0832 TIMSET LDX #COUNTR ; POINT TO TIMER |
0833 LBSR BYTE ; READ HOURS |
0834 BVS SHOWTM ; NO ARG, DISP TIME |
0835 STA HOUR,X |
0836 LBSR OUT1S |
0837 LBSR BYTE ; READ MINUITES |
0838 BVS SHOWTM |
0839 STA MINUIT,X |
0840 LBSR OUT1S |
0841 LBSR BYTE ; SECONDS. |
0842 BVS SHOWTM |
0843 STA SECOND,X |
0844 * |
0845 * DISPLAY CURRENT TIME |
0846 * |
0847 SHOWTM LBSR PCRLF |
0848 LDX #COUNTR+HOUR |
0849 LDB #3 |
0850 SHOWLP BSR RDCLK |
0851 LBSR OUT2H |
0852 LDA #': |
0853 LBSR OUTCH |
0854 LEAX -1,X |
0855 DECB |
0856 BNE SHOWLP |
0857 RTS |
0858 * |
0859 * INITIATE CLOCK. |
0860 * MASK INTERRUPTS. |
0861 * |
0862 CLKINZ CLR CINTCR ; MASK ALL INTERRUPTS |
0863 TST CINTSR ; CLEAR ANY INTERRUPTS |
0864 RTS |
0865 ENDIF RTCOPT |
0865 ENDIF RTCOPT |
0866 IFD DATOPT |
0867 * |
0868 ***** LRA LOAD REAL ADDRESS ***** |
0869 * |
0870 * THE FOLLOWING CODE LOADS THE 20-BIT |
0871 * PHYSICAL ADDRESS OF A MEMORY BYTE |
0872 * INTO THE "A" AND "X" REGISTERS. THIS |
0873 * ROUTINE IS ENTERED WITH THE LOGICAL |
0874 * ADDRESS OF A MEMORY BYTE IN THE "IX" |
0875 * REGISTER. EXIT IS MADE WITH THE HIGH- |
0876 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL |
0877 * ADDRESS IN THE "A" REGISTER, AND THE |
0878 * LOW-ORDER 16-BITS OF THE 20-BIT |
0879 * PHYSICAL ADDRESS IN THE "IX" REGISTER. |
0880 * ALL OTHER REGISTERS ARE PRESERVED. |
0881 * THIS ROUTINE IS REQUIRED SINCE THE |
0882 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST |
0883 * PRESENT PHYSICAL ADDRESSES ON THE |
0884 * SYSTEM BUS. |
0885 * |
0886 FA2E 34 36 LRA PSHS A,B,X,Y ; PUSH REGISTERS ON STACK |
0887 FA30 A6 62 LDA 2,S ; GET MSB LOGICAL ADDR FRM X REG ON STACK |
0888 FA32 44 LSRA ; |
0889 FA33 44 LSRA ; ADJ FOR INDEXED INTO |
0890 FA34 44 LSRA ; CORRESPONDING LOCATION |
0891 FA35 44 LSRA ; IN LRA TABLE |
0892 FA36 10 8E DF D0 LDY #LRARAM ; LOAD LRA TABLE BASE ADDRESS |
0893 FA3A E6 A6 LDB A,Y ; GET PHYSICAL ADDR. DATA FROM LRA TABLE |
0894 FA3C 54 LSRB ; ADJ. REAL ADDR. TO REFLECT EXTENDED |
0895 FA3D 54 LSRB ; PHYSICAL ADDRESS. |
0896 FA3E 54 LSRB ; EXTENDED MS 4-BITS ARE RETURNED |
0897 FA3F 54 LSRB ; IN THE "A" ACCUMULATOR |
0898 FA40 E7 E4 STB ,S ; MS 4 BITS IN A ACCUM. STORED ON STACK |
0899 FA42 E6 A6 LDB A,Y ; LOAD REAL ADDRESS DATA FROM LRA TABLE |
0900 FA44 53 COMB ; COMP TO ADJ FOR PHYSICAL ADDR. IN X REG |
0901 FA45 58 ASLB ; ADJ DATA FOR RELOCATION IN X REG |
0902 FA46 58 ASLB ; |
0903 FA47 58 ASLB ; $FB97 |
0904 FA48 58 ASLB ; |
0905 FA49 A6 62 LDA 2,S ; GET MS BYTE OF LOGICAL ADDR. |
0906 FA4B 84 0F ANDA #$0F ; MASK MS NIBBLE OF LOGICAL ADDRESS |
0907 FA4D A7 62 STA 2,S ; SAVE IT IN X REG ON STACK |
0908 FA4F EA 62 ORB 2,S ; SET MS BYTE IN X REG TO ADJ PHY ADDR. |
0909 * |
0910 * PLUS LS NIBBLE OF LOGICAL ADDRESS |
0911 * |
0912 FA51 E7 62 STB 2,S ; SAVE AS LS 16 BITS OF PHY ADDR IN X REG ON STACK |
0913 FA53 35 B6 PULS A,B,X,Y,PC ; POP REGS. FROM STACK |
0914 ENDIF DATOPT |
0915 * |
0916 * DELAY LOOP |
0917 * |
0918 FA55 34 04 DLY PSHS B ; SAVE CONTENTS OF "B" |
0919 FA57 C6 20 LDB #$20 ; GET LOOP DELAY VALUE |
0920 FA59 5A SUB1 DECB ; SUBTRACT ONE FROM VALUE |
0921 FA5A 26 FD BNE SUB1 ; LOOP UNTIL ZERO |
0922 FA5C 35 84 PULS B,PC ; RESTORE CONTENTS OF "B" |
0923 * RTS ; |
0924 * |
0925 ***** "L" LOAD MIKBUG TAPE ***** |
0926 * |
0927 FA5E BD FC E7 LOAD JSR ACINIZ |
0928 FA61 86 11 LDA #$11 ; LOAD 'DC1' CASS. READ ON CODE |
0929 FA63 17 02 68 LBSR OUTCH ; OUTPUT IT TO TERMINAL PORT |
0930 FA66 7F DF E2 CLR ECHO ; TURN OFF ECHO FLAG |
0931 FA69 17 02 2A LOAD1 LBSR ECHON ; INPUT 8 BIT BYTE WITH NO ECHO |
0932 FA6C 81 53 LOAD2 CMPA #'S ; IS IT AN "S", START CHARACTER ? |
0933 FA6E 26 F9 BNE LOAD1 ; IF NOT, DISCARD AND GET NEXT CHAR. |
0934 FA70 17 02 23 LBSR ECHON |
0935 FA73 81 39 CMPA #'9 ; IS IT A "9" , END OF FILE CHAR ? |
0936 FA75 27 3D BEQ LOAD21 ; IF SO, EXIT LOAD |
0937 FA77 81 31 CMPA #'1 ; IS IT A "1" , FILE LOAD CHAR ? |
0938 FA79 26 F1 BNE LOAD2 ; IF NOT, LOOK FOR START CHAR. |
0939 FA7B 17 01 A8 LBSR BYTE ; INPUT BYTE COUNT |
0940 FA7E 34 02 PSHS A ; PUSH COUNT ON STACK |
0941 FA80 29 26 BVS LODERR ; (V) C-CODE SET, ILLEGAL HEX |
0942 FA82 17 01 91 LBSR IN1ADR ; INPUT LOAD ADDRESS |
0943 FA85 29 21 BVS LODERR ; (V) C-CODE SET, ADDR NOT HEX |
0944 FA87 34 10 PSHS X ; PUSH ADDR ON STACK |
0945 FA89 E6 E0 LDB ,S+ ; LOAD MSB OF ADDR AS CHECKSUM BYTE |
0946 FA8B EB E0 ADDB ,S+ ; ADD LSB OF ADDR TO CHECKSUM |
0947 FA8D EB E4 ADDB ,S ; ADD BYTE COUNT BYTE TO CHECKSUM |
0948 FA8F 6A E4 DEC ,S ; $FC37 DECREMENT BYTE COUNT 2 TO BYPASS |
0949 FA91 6A E4 DEC ,S ; ADDRESS BYTES. |
0950 FA93 34 04 LOAD10 PSHS B ; PUSH CHECKSUM ON STACK |
0951 FA95 17 01 8E LBSR BYTE ; INPUT DATA BYTE (2 HEX CHAR) |
0952 FA98 35 04 PULS B ; POP CHECKSUM FROM STACK |
0953 FA9A 29 0C BVS LODERR ; (V) SET, DATA BYTE NOT HEX |
0954 FA9C 34 02 PSHS A ; PUSH DATA BYTE ON STACK |
0955 FA9E EB E0 ADDB ,S+ ; ADD DATA TO CHECKSUM, AUTO INC STACK |
0956 FAA0 6A E4 DEC ,S ; DECREMENT BYTE COUNT 1 |
0957 FAA2 27 05 BEQ LOAD16 ; IF BYTE COUNT ZERO, TEST CHECKSUM |
0958 FAA4 A7 80 STA ,X+ ; SAVE DATA BYTE IN MEMORY |
0959 FAA6 20 EB BRA LOAD10 ; GET NEXT DATA BYTE |
0960 FAA8 5F LODERR CLRB ; ERROR CONDITION, ZERO CHECKSUM ; |
0961 FAA9 35 02 LOAD16 PULS A ; ADJUST STACK (REMOVE BYTE COUNT) |
0962 FAAB C1 FF CMPB #$FF ; CHECKSUM OK? |
0963 FAAD 27 BA BEQ LOAD1 ; IF SO, LOAD NEXT LINE |
0964 FAAF 86 3F LDA #'? ; LOAD (?) ERROR INDICATOR |
0965 FAB1 17 02 1A LBSR OUTCH ; OUTPUT IT TO TERMINAL |
0966 FAB4 73 DF E2 LOAD21 COM ECHO ; TURN ECHO ON |
0967 FAB7 86 13 LDA #$13 ; $FC5F LOAD 'DC3' CASS. READ OFF CODE |
0968 FAB9 16 02 12 LBRA OUTCH ; OUTPUT IT |
0969 * |
0970 ***** "P" PUNCH MIKBUG TAPE ***** |
0971 * |
0972 FABC 6F E2 PUNCH CLR ,-S ; CLEAR RESERVED BYTE ON STACK |
0973 FABE 17 01 4A LBSR IN2ADR ; GET BEGIN AND END ADDRESS |
0974 FAC1 34 30 PSHS X,Y ; SAVE ADDRESSES ON STACK |
0975 FAC3 29 4D BVS PUNEXT ; (V) C-CODE SET, EXIT PUNCH |
0976 FAC5 AC 62 CMPX 2,S ; COMPARE BEGIN TO END ADDR |
0977 FAC7 25 49 BCS PUNEXT ; IF BEGIN GREATER THAN END, EXIT PUNCH |
0978 FAC9 30 01 LEAX 1,X ; INCREMENT END ADDRESS |
0979 FACB AF E4 STX ,S ; STORE END ADDR ON STACK |
0980 FACD BD FC E7 JSR ACINIZ |
0981 FAD0 86 12 LDA #$12 ; LOAD 'DC2' PUNCH ON CODE |
0982 FAD2 17 01 F9 LBSR OUTCH ; OUTPUT IT TO TERMINAL |
0983 FAD5 EC E4 PUNCH2 LDD ,S ; LOAD END ADDR IN D-ACC |
0984 FAD7 A3 62 SUBD 2,S ; SUBTRACT BEGIN FROM END |
0985 FAD9 27 06 BEQ PUNCH3 ; SAME, PUNCH 32 BYTES DEFAULT |
0986 FADB 10 83 00 20 CMPD #$20 ; LESS THAN 32 BYTES? |
0987 FADF 23 02 BLS PUNCH4 ; PUNCH THAT MANY BYTES |
0988 FAE1 C6 20 PUNCH3 LDB #$20 ; LOAD BYTE COUNT OF 32. |
0989 FAE3 E7 64 PUNCH4 STB 4,S ; STORE ON STACK AS BYTE COUNT |
0990 FAE5 8E FE E2 LDX #MSG20 ; POINT TO MSG "S1" |
0991 FAE8 17 00 2F LBSR PSTRNG ; PRINT MSG |
0992 FAEB CB 03 ADDB #3 ; ADD 3 BYTES TO BYTE COUNT |
0993 FAED 1F 98 TFR B,A ; GET BYTE COUNT IN A-ACC TO PUNCH |
0994 FAEF 17 01 75 LBSR OUT2H ; OUTPUT BYTE COUNT |
0995 FAF2 AE 62 LDX 2,S ; LOAD BEGIN ADDRESS |
0996 FAF4 17 01 68 LBSR OUT4H ; PUNCH ADDRESS |
0997 FAF7 EB 62 ADDB 2,S ; ADD ADDR MSB TO CHECKSUM |
0998 FAF9 EB 63 ADDB 3,S ; ADD ADDR LSB TO CHECKSUM |
0999 FAFB EB 84 PUNCHL ADDB ,X ; ADD DATA BYTE TO CHECKSUM |
1000 FAFD A6 80 LDA ,X+ ; LOAD DATA BYTE TO PUNCH |
1001 FAFF 17 01 65 LBSR OUT2H ; OUTPUT DATA BYTE |
1002 FB02 6A 64 DEC 4,S ; DECREMENT BYTE COUNT |
1003 FB04 26 F5 BNE PUNCHL ; NOT DONE, PUNCH NEXT BYTE |
1004 FB06 53 COMB 1's ; COMPLIMENT CHECKSUM BYTE |
1005 FB07 1F 98 TFR B,A ; GET IT IN A-ACC TO PUNCH |
1006 FB09 17 01 5B LBSR OUT2H ; OUTPUT CHECKSUM BYTE |
1007 FB0C AF 62 STX 2,S ; SAVE X-REG IN STACK AS NEW PUNCH ADDR |
1008 FB0E AC E4 CMPX ,S ; COMPARE IT TO END ADDR |
1009 FB10 26 C3 BNE PUNCH2 ; $FCB5 PUNCH NOT DONE, CONT. |
1010 FB12 86 14 PUNEXT LDA #$14 ; LOAD 'DC4' PUNCH OFF CODE |
1011 FB14 17 01 B7 LBSR OUTCH ; OUTPUT IT |
1012 FB17 32 65 LEAS 5,S ; READJUST STACK POINTER |
1013 FB19 39 RTS ; |
1014 * |
1015 * PRINT STRING PRECEEDED BY A CR & LF. |
1016 * |
1017 FB1A 8D 02 PSTRNG BSR PCRLF ; PRINT CR/LF |
1018 FB1C 20 71 BRA PDATA ; PRINT STRING POINTED TO BY IX |
1019 * |
1020 * PCRLF |
1021 * |
1022 FB1E 34 10 PCRLF PSHS X ; SAVE IX |
1023 FB20 8E FE 93 LDX #MSG2+1 ; POINT TO MSG CR/LF + 3 NULS |
1024 FB23 17 00 69 LBSR PDATA ; PRINT MSG |
1025 FB26 35 90 PULS X,PC ; RESTORE IX & RETURN |
1026 * |
1027 * LONG BRANCHES TO COMMON ROUTINES |
1028 * |
1029 FB28 16 01 A1 JOUT1S LBRA OUT1S |
1030 FB2B 16 00 F8 JBYTE LBRA BYTE |
1031 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR |
1032 * |
1033 * ALTER "PC" PROGRAM COUNTER |
1034 * |
1035 FB31 17 00 91 ALTRPC LBSR PRTPC ; $FCF5 PRINT MSG " PC = " |
1036 FB34 8D F2 ALTPC1 BSR JOUT1S ; OUTPUT SPACE |
1037 FB36 8D F6 BSR JIN1ADR ; GET NEW CONTENTS FOR "PC" |
1038 FB38 29 02 BVS ALTPCD ; EXIT IF INVALID HEX |
1039 FB3A AF 4A STX 10,U ; POKE IN NEW CONTENTS |
1040 FB3C 39 ALTPCD RTS ; |
1041 * |
1042 * ALTER "U" USER STACK POINTER |
1043 * |
1044 FB3D 8D 61 ALTRU BSR PRTUS ; $FCCA PRINT MSG " US = " |
1045 FB3F 8D E7 BSR JOUT1S ; OUTPUT SPACE |
1046 FB41 8D EB BSR JIN1ADR ; GET NEW CONTENTS FOR "US" |
1047 FB43 29 02 BVS ALTUD ; EXIT IF INVALID HEX |
1048 FB45 AF 48 STX 8,U ; POKE IN NEW CONTENTS |
1049 FB47 39 ALTUD RTS ; |
1050 * |
1051 * ALTER "Y" INDEX REGISTER |
1052 * |
1053 FB48 8D 72 ALTRY BSR PRTIY ; PRINT MSG " IY = " |
1054 FB4A 8D DC BSR JOUT1S ; OUTPUT SPACE |
1055 FB4C 8D E0 BSR JIN1ADR ; GET NEW CONTENTS FOR "IY" |
1056 FB4E 29 02 BVS ALTYD ; EXIT IF INVALID HEX |
1057 FB50 AF 46 STX 6,U ; $F8F0 POKE IN NEW CONTENTS |
1058 FB52 39 ALTYD RTS ; |
1059 * |
1060 * ALTER "X" INDEX REGISTER |
1061 * |
1062 FB53 8D 5E ALTRX BSR PRTIX ; $FCE0 PRINT MSG " IX = " |
1063 FB55 8D D1 BSR JOUT1S ; OUTPUT SPACE |
1064 FB57 8D D5 BSR JIN1ADR |
1065 FB59 29 02 BVS ALTXD |
1066 FB5B AF 44 STX 4,U |
1067 FB5D 39 ALTXD RTS ; |
1068 * |
1069 * ALTER "DP" DIRECT PAGE REGISTER |
1070 * |
1071 FB5E 8D 49 ALTRDP BSR PRTDP ; $FCD5 PRINT MSG " DP = " |
1072 FB60 8D C6 BSR JOUT1S ; OUTPUT SPACE |
1073 FB62 8D C7 BSR JBYTE ; INPUT BYTE (2 HEX CHAR) |
1074 FB64 29 02 BVS ALTDPD |
1075 FB66 A7 43 STA 3,U |
1076 FB68 39 ALTDPD RTS ; |
1077 * |
1078 * ALTER "B" ACCUMULATOR |
1079 * |
1080 FB69 8D 6C ALTRB BSR PRTB ; $FD09 PRINT MSG " B = " |
1081 FB6B 8D BB BSR JOUT1S ; OUTPUT SPACE |
1082 FB6D 8D BC BSR JBYTE ; INPUT BYTE (2 HEX CHAR) |
1083 FB6F 29 02 BVS ALTBD |
1084 FB71 A7 42 STA 2,U |
1085 FB73 39 ALTBD RTS ; $F91C |
1086 * |
1087 * ALTER "A" ACCUMULATOR |
1088 * |
1089 FB74 8D 58 ALTRA BSR PRTA ; $FCFF RINT MSG " A = " |
1090 FB76 8D B0 BSR JOUT1S ; OUTPUT SPACE |
1091 FB78 8D B1 BSR JBYTE ; INPUT BYTE (2 HEX CHAR) |
1092 FB7A 29 02 BVS ALTAD |
1093 FB7C A7 41 STA 1,U |
1094 FB7E 39 ALTAD RTS ; |
1095 * |
1096 * ALTER "CC" REGISTER |
1097 * |
1098 FB7F 8D 5F ALTRCC BSR PRTCC ; $FD13 PRINT MSG " CC: " |
1099 FB81 8D A5 BSR JOUT1S ; OUTPUT SPACE |
1100 FB83 8D A6 BSR JBYTE ; INPUT BYTE (2 HEX CHAR) |
1101 FB85 29 04 BVS ALTCCD |
1102 FB87 8A 80 ORA #$80 ; SETS "E" FLAG IN PRINT LIST |
1103 FB89 A7 C4 STA ,U |
1104 FB8B 39 ALTCCD RTS ; |
1105 * |
1106 * PDATA |
1107 * |
1108 FB8C 17 01 3F PRINT LBSR OUTCH |
1109 FB8F A6 80 PDATA LDA ,X+ ; GET 1st CHAR. TO PRINT |
1110 FB91 81 04 CMPA #4 ; IS IT EOT? |
1111 FB93 26 F7 BNE PRINT ; IF NOT EOT PRINT IT |
1112 FB95 39 RTS ; |
1113 * |
1114 * PRINT REGISTERS |
1115 * |
1116 FB96 8E FE A5 PRTSP LDX #MSG10 ; POINT TO MSG "SP=" |
1117 FB99 8D F4 BSR PDATA ; PRINT MSG |
1118 FB9B 1F 31 TFR U,X |
1119 FB9D 16 00 BF JOUT4H LBRA OUT4H |
1120 * |
1121 FBA0 8E FE B1 PRTUS LDX #MSG12 ; POINT TO MSG "US=" |
1122 FBA3 8D EA BSR PDATA ; PRINT MSG |
1123 FBA5 AE 48 LDX 8,U |
1124 FBA7 20 F4 BRA JOUT4H |
1125 * |
1126 FBA9 8E FE C3 PRTDP LDX #MSG15 ; POINT TO MSG "DP=" |
1127 FBAC 8D E1 BSR PDATA ; PRINT MSG |
1128 FBAE A6 43 LDA 3,U |
1129 FBB0 16 00 B4 JOUT2H LBRA OUT2H ; OUTPUT HEX BYTE AS ASCII |
1130 * |
1131 FBB3 8E FE BD PRTIX LDX #MSG14 ; POINT TO MSG "IX=" |
1132 FBB6 8D D7 BSR PDATA ; PRINT MSG |
1133 FBB8 AE 44 LDX 4,U ; $FCE6 |
1134 FBBA 20 E1 BRA JOUT4H |
1135 * |
1136 FBBC 8E FE B7 PRTIY LDX #MSG13 ; POINT TO MSG "IY=" |
1137 FBBF 8D CE BSR PDATA ; PRINT MSG |
1138 FBC1 AE 46 LDX 6,U |
1139 FBC3 20 D8 BRA JOUT4H |
1140 * |
1141 FBC5 8E FE AB PRTPC LDX #MSG11 ; POINT TO MSG "PC=" |
1142 FBC8 8D C5 BSR PDATA ; PRINT MSG |
1143 FBCA AE 4A LDX 10,U |
1144 FBCC 20 CF BRA JOUT4H |
1145 * |
1146 FBCE 8E FE C9 PRTA LDX #MSG16 ; POINT TO MSG "A=" |
1147 FBD1 8D BC BSR PDATA ; PRINT MSG |
1148 FBD3 A6 41 LDA 1,U |
1149 FBD5 20 D9 BRA JOUT2H ; OUTPUT HEX BYTE AS ASCII |
1150 * |
1151 FBD7 8E FE CE PRTB LDX #MSG17 ; POINT TO MSG "B=" |
1152 FBDA 8D B3 BSR PDATA ; PRINT MSG |
1153 FBDC A6 42 LDA 2,U |
1154 FBDE 20 D0 BRA JOUT2H ; OUTPUT HEX BYTE AS ASCII |
1155 * |
1156 FBE0 8E FE D3 PRTCC LDX #MSG18 ; POINT TO MSG "CC:" |
1157 FBE3 8D AA BSR PDATA ; PRINT MSG |
1158 FBE5 A6 C4 LDA ,U |
1159 FBE7 8E FE DA LDX #MSG19 ; POINT TO MSG "EFHINZVC" |
1160 FBEA 16 00 90 LBRA BIASCI ; OUTPUT IN BINARY/ASCII FORMAT |
1161 * |
1162 * "R" DISPLAY REGISTERS |
1163 * |
1164 FBED 8E FE A1 REGSTR LDX #MSG5 ; POINT TO MSG " - " |
1165 FBF0 17 FF 27 LBSR PSTRNG ; PRINT MSG |
1166 FBF3 8D A1 BSR PRTSP ; $FCBF |
1167 FBF5 8D A9 BSR PRTUS ; $FCCA |
1168 FBF7 8D B0 BSR PRTDP ; $FCD5 |
1169 FBF9 8D B8 BSR PRTIX ; $FCE0 |
1170 FBFB 8D BF BSR PRTIY ; $FCEB |
1171 FBFD 8E FE A1 LDX #MSG5 ; POINT TO MSG " - " |
1172 FC00 17 FF 17 LBSR PSTRNG ; PRINT MSG |
1173 FC03 8D C0 BSR PRTPC ; $FCF5 |
1174 FC05 8D C7 BSR PRTA ; $FCFF |
1175 FC07 8D CE BSR PRTB ; $FD09 |
1176 FC09 20 D5 BRA PRTCC ; $FD13 |
1177 * |
1178 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1179 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. |
1180 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". |
1181 * THE SECOND IS RETURNED IN "IX". THE "V" BIT |
1182 * IN THE C-CODE REG. IS SET IF AN INVALID HEX |
1183 * ADDRESS IS INPUT. |
1184 * |
1185 FC0B 8D 09 IN2ADR BSR IN1ADR ; GET FIRST ADDRESS |
1186 FC0D 29 4D BVS NOTHEX ; EXIT IF NOT VALID HEX |
1187 FC0F 1F 12 TFR X,Y ; SAVE FIRST ADDR. IN "IY" |
1188 FC11 86 2D LDA #'- |
1189 FC13 17 00 B8 LBSR OUTCH ; PRINT " - " |
1190 * |
1191 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1192 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
1193 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
1194 * |
1195 FC16 8D 0E IN1ADR BSR BYTE ; INPUT BYTE (2 HEX CHAR) |
1196 FC18 29 42 BVS NOTHEX ; EXIT IF NOT VALID HEX |
1197 FC1A 1F 01 TFR D,X |
1198 FC1C 8D 08 BSR BYTE ; INPUT BYTE (2 HEX CHAR) |
1199 FC1E 29 3C BVS NOTHEX |
1200 FC20 34 10 PSHS X |
1201 FC22 A7 61 STA 1,S |
1202 FC24 35 90 PULS X,PC |
1203 * |
1204 ***** INPUT BYTE (2 HEX CHAR.) ***** |
1205 * |
1206 FC26 8D 11 BYTE BSR INHEX ; GET HEX LEFT |
1207 FC28 29 32 BVS NOTHEX ; EXIT IF NOT VALID HEX |
1208 FC2A 48 ASLA ; |
1209 FC2B 48 ASLA ; |
1210 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE |
1211 FC2D 48 ASLA ; |
1212 FC2E 1F 89 TFR A,B ; PUT HEXL IN "B" |
1213 FC30 8D 07 BSR INHEX ; GET HEX RIGHT |
1214 FC32 29 28 BVS NOTHEX ; EXIT IF NOT VALID HEX |
1215 FC34 34 04 PSHS B ; PUSH HEXL ON STACK |
1216 FC36 AB E0 ADDA ,S+ ; ADD HEXL TO HEXR AND ADJ. STK |
1217 FC38 39 RTS ; RETURN WITH HEX L&R IN "A" |
1218 * |
1219 * |
1220 FC39 8D 5B INHEX BSR ECHON ; INPUT ASCII CHAR. |
1221 FC3B 81 30 CMPA #'0 ; IS IT > OR = "0" ? |
1222 FC3D 25 1D BCS NOTHEX ; IF LESS IT AIN'T HEX |
1223 FC3F 81 39 CMPA #'9 ; IS IT < OR = "9" ? |
1224 FC41 22 03 BHI INHEXA ; IF > MAYBE IT'S ALPHA |
1225 FC43 80 30 SUBA #$30 ; ASCII ADJ. NUMERIC |
1226 FC45 39 RTS ; |
1227 * |
1228 * |
1229 FC46 81 41 INHEXA CMPA #'A ; IS IT > OR = "A" |
1230 FC48 25 12 BCS NOTHEX ; IF LESS IT AIN'T HEX |
1231 FC4A 81 46 CMPA #'F ; IS IT < OR = "F" ? |
1232 FC4C 22 03 BHI INHEXL ; IF > IT AIN'T HEX |
1233 FC4E 80 37 SUBA #'A-10 ; ($37) ASCII ADJ. ALPHA |
1234 FC50 39 RTS ; |
1235 * |
1236 FC51 81 61 INHEXL CMPA #'a ; IS IT > OR = "a" |
1237 FC53 25 07 BCS NOTHEX ; IF LESS IT AIN'T HEX |
1238 FC55 81 66 CMPA #'f ; IS IT < "f" |
1239 FC57 22 03 BHI NOTHEX ; IF > IT AIN'T HEX |
1240 FC59 80 57 SUBA #'a-10 ; ($57) ADJUST TO LOWER CASE |
1241 FC5B 39 RTS ; |
1242 * |
1243 * |
1244 FC5C 1A 02 NOTHEX ORCC #2 ; SET (V) FLAG IN C-CODES REGISTER |
1245 FC5E 39 RTS ; |
1246 * |
1247 * |
1248 FC5F 34 10 OUT4H PSHS X ; PUSH X-REG. ON THE STACK |
1249 FC61 35 02 PULS A ; POP MS BYTE OF X-REG INTO A-ACC. |
1250 FC63 8D 02 BSR OUTHL ; OUTPUT HEX LEFT |
1251 FC65 35 02 PULS A ; POP LS BYTE OF X-REG INTO A-ACC. |
1252 FC67 OUTHL EQU * |
1253 FC67 34 02 OUT2H PSHS A ; SAVE IT BACK ON STACK |
1254 FC69 44 LSRA ; CONVERT UPPER HEX NIBBLE TO ASCII |
1255 FC6A 44 LSRA ; |
1256 FC6B 44 LSRA ; |
1257 FC6C 44 LSRA ; |
1258 FC6D 8D 04 BSR XASCII ; PRINT HEX NIBBLE AS ASCII |
1259 FC6F 35 02 OUTHR PULS A ; CONVERT LOWER HEX NIBBLE TO ASCII |
1260 FC71 84 0F ANDA #$0F ; STRIP LEFT NIBBLE |
1261 FC73 8B 30 XASCII ADDA #$30 ; ASCII ADJ |
1262 FC75 81 39 CMPA #$39 ; IS IT < OR = "9" ? |
1263 FC77 2F 02 BLE OUTC ; IF LESS, OUTPUT IT |
1264 FC79 8B 07 ADDA #7 ; IF > MAKE ASCII LETTER |
1265 FC7B 20 51 OUTC BRA OUTCH ; OUTPUT CHAR |
1266 * |
1267 * BINARY / ASCII --- THIS ROUTINE |
1268 * OUTPUTS A BYTE IN ENHANCED |
1269 * BINARY FORMAT. THE ENHANCEMENT |
1270 * IS DONE BY SUBSTITUTING ASCII |
1271 * LETTERS FOR THE ONES IN THE BYTE. |
1272 * THE ASCII ENHANCEMENT LETTERS |
1273 * ARE OBTAINED FROM THE STRING |
1274 * POINTED TO BY THE INDEX REG. "X". |
1275 * |
1276 FC7D 34 02 BIASCI PSHS A ; SAVE "A" ON STACK |
1277 FC7F C6 08 LDB #8 ; PRESET LOOP# TO BITS PER BYTE |
1278 FC81 A6 80 OUTBA LDA ,X+ ; GET LETTER FROM STRING |
1279 FC83 68 E4 ASL ,S ; TEST BYTE FOR "1" IN B7 |
1280 FC85 25 02 BCS PRTBA ; IF ONE PRINT LETTER |
1281 FC87 86 2D LDA #'- ; IF ZERO PRINT "-" |
1282 FC89 8D 43 PRTBA BSR OUTCH ; PRINT IT |
1283 FC8B 8D 3F BSR OUT1S ; PRINT SPACE |
1284 FC8D 5A DECB ; SUB 1 FROM #BITS YET TO PRINT |
1285 FC8E 26 F1 BNE OUTBA |
1286 FC90 35 82 PULS A,PC |
1287 * |
1288 IFD EXTOPT |
1289 * |
1290 * EXTENDED USER COMMANDS |
1291 * |
1292 FC92 6E 9F F0 00 USRCMD JMP [MONEXT+EXTCMD] |
1293 ENDIF EXTOPT |
1294 * |
1295 * |
1296 FC96 7D DF E2 ECHON TST ECHO ; IS ECHO REQUIRED ? |
1297 FC99 27 06 BEQ INCH ; ECHO NOT REQ. IF CLEAR |
1298 * |
1299 * INCHE |
1300 * |
1301 * GETS CHARACTER FROM TERMINAL AND |
1302 * ECHOS SAME. THE CHARACTER IS RETURNED |
1303 * IN THE "A" ACCUMULATOR WITH THE PARITY |
1304 * BIT MASKED OFF. ALL OTHER REGISTERS |
1305 * ARE PRESERVED. |
1306 * |
1307 FC9B 8D 04 INCHE BSR INCH ; GET CHAR FROM TERMINAL |
1308 FC9D 84 7F ANDA #$7F ; STRIP PARITY FROM CHAR. |
1309 FC9F 20 2D BRA OUTCH ; ECHO CHAR TO TERMINAL |
1310 * |
1311 * INCH |
1312 * |
1313 * GET CHARACTER FROM TERMINAL. RETURN |
1314 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
1315 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
1316 * IS 8 BITS AND IS NOT ECHOED. |
1317 * |
1318 * |
1319 FCA1 34 10 INCH PSHS X ; SAVE IX |
1320 IFD HFCOPT |
1321 LDA #$11 ; SET RTS* LOW, REQUEST FAR END TO TX |
1322 STA [CPORT] |
1323 ENDIF HFCOPT |
1323 ENDIF HFCOPT |
1324 FCA3 BE DF E0 GETSTA LDX CPORT ; POINT TO TERMINAL PORT |
1325 FCA6 A6 84 LDA ,X ; FETCH PORT STATUS |
1326 FCA8 85 01 BITA #1 ; TEST READY BIT, RDRF ? |
1327 IFD PS2OPT |
1328 FCAA 26 09 BNE GETST1 |
1329 FCAC 8E E0 20 LDX #PS2KBD |
1330 FCAF A6 84 LDA ,X |
1331 FCB1 85 01 BITA #1 |
1332 ENDIF PS2OPT |
1333 FCB3 27 EE BEQ GETSTA ; IF NOT RDY, THEN TRY AGAIN |
1334 FCB5 GETST1 EQU * |
1335 IFD HFCOPT |
1336 LDA #$51 ; SET RTS* HIGH, STOP FAR END FROM TXING, UNTIL NEXT INPUT |
1337 STA [CPORT] |
1338 ENDIF HFCOPT |
1338 ENDIF HFCOPT |
1339 FCB5 A6 01 LDA 1,X ; FETCH CHAR |
1340 FCB7 35 90 PULS X,PC ; RESTORE IX |
1341 * |
1342 * INCHEK |
1343 * |
1344 * CHECK FOR A CHARACTER AVAILABLE FROM |
1345 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
1346 * FOR READ READY. ALL REGISTERS ARE |
1347 * PRESERVED, AND THE "Z" BIT WILL BE |
1348 * CLEAR IF A CHARACTER CAN BE READ. |
1349 * |
1350 * |
1351 FCB9 34 02 INCHEK PSHS A ; SAVE A ACCUM |
1352 IFD HFCOPT |
1353 LDA #$11 ; SET RTS* LOW, REQUEST FAR END TO TX |
1354 STA [CPORT] |
1355 ENDIF HFCOPT |
1355 ENDIF HFCOPT |
1356 FCBB A6 9F DF E0 LDA [CPORT] ; FETCH PORT STATUS |
1357 FCBF 85 01 BITA #1 ; TEST READY BIT, RDRF ? |
1358 IFD PS2OPT |
1359 FCC1 26 05 BNE INCHEK1 |
1360 FCC3 B6 E0 20 LDA PS2KBD |
1361 FCC6 85 01 BITA #1 ; TEST READY BIT< RDRF ? |
1362 ENDIF PS2OPT |
1363 FCC8 35 82 INCHEK1 PULS A,PC ; RESTORE A ACCUM. |
1364 * |
1365 FCCA 8D 00 OUT2S BSR OUT1S ; OUTPUT 2 SPACES |
1366 FCCC 86 20 OUT1S LDA #$20 ; OUTPUT 1 SPACE |
1367 * |
1368 * |
1369 * OUTCH |
1370 * |
1371 * OUTPUT CHARACTER TO TERMINAL. |
1372 * THE CHAR. TO BE OUTPUT IS |
1373 * PASSED IN THE A REGISTER. |
1374 * ALL REGISTERS ARE PRESERVED. |
1375 * |
1376 OUTCH IFD VDUOPT |
1377 FCCE 8D 49 BSR VOUTCH |
1378 ENDIF VDUOPT |
1379 IFD DG640OPT |
1380 BSR VOUTCH |
1381 ENDIF DG640OPT |
1381 ENDIF DG640OPT |
1382 FCD0 34 12 AOUTCH PSHS A,X ; SAVE A ACCUM AND IX |
1383 FCD2 BE DF E0 LDX CPORT ; GET ADDR. OF TERMINAL |
1384 FCD5 A6 84 FETSTA LDA ,X ; FETCH PORT STATUS |
1385 FCD7 85 02 BITA #2 ; TEST TDRE, OK TO XMIT ? |
1386 FCD9 27 FA BEQ FETSTA ; IF NOT LOOP UNTIL RDY |
1387 FCDB 85 08 BITA #8 ; CLEAR TO SEND ? |
1388 FCDD 26 F6 BNE FETSTA ; NO, LOOP UNTIL CLEAR |
1389 FCDF 35 02 PULS A ; GET CHAR. FOR XMIT |
1390 FCE1 A7 01 STA 1,X ; XMIT CHAR. |
1391 FCE3 35 90 PULS X,PC ; RESTORE IX |
1392 * |
1393 * IO INITIALIZATION |
1394 * |
1395 FCE5 IOINIZ EQU * |
1396 IFD VDUOPT |
1397 FCE5 8D 13 BSR VINIZ |
1398 ENDIF VDUOPT |
1399 IFD DG640OPT |
1400 BSR VINIZ |
1401 ENDIF DG640OPT |
1401 ENDIF DG640OPT |
1402 FCE7 BE DF E0 ACINIZ LDX CPORT ; POINT TO CONTROL PORT ADDRESS |
1403 FCEA 86 03 LDA #3 ; RESET ACIA PORT CODE |
1404 FCEC A7 84 STA ,X ; STORE IN CONTROL REGISTER |
1405 FCEE 86 51 LDA #$51 ; SET 8 DATA, 2 STOP AN 0 PARITY RTS* HIGH |
1406 FCF0 A7 84 STA ,X ; STORE IN CONTROL REGISTER |
1407 FCF2 6D 01 TST 1,X ; ANYTHING IN DATA REGISTER? |
1408 FCF4 86 FF LDA #$FF ; TURN ON ECHO FLAG |
1409 FCF6 B7 DF E2 STA ECHO |
1410 FCF9 39 RTS |
1411 * |
1412 IFD VDUOPT |
1413 * |
1414 *************************************************** |
1415 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * |
1416 * * |
1417 * 80 x 25 Characters |
1418 * |
1419 *************************************************** |
1420 * |
1421 *************************************************** |
1422 * INITIALIZE EMULATOR * |
1423 *************************************************** |
1424 * |
1425 FCFA 8E E0 30 VINIZ LDX #VDU |
1426 FCFD CC 00 00 LDD #0 |
1427 FD00 FD DF FB STD COLADX ; AND ROWADX |
1428 FD03 A7 02 STA VDUCOL,X |
1429 FD05 E7 03 STB VDUROW,X |
1430 FD07 E7 04 STB VDUOFF,X |
1431 FD09 FD DF FD STD NEWROW ; AND ESCFLG |
1432 FD0C C6 02 LDB #$02 |
1433 FD0E E7 01 STB VDUATT,X |
1434 FD10 7F DF FE CLR ESCFLG |
1435 FD13 86 1B LDA #$1B ; SEND ESCAPE |
1436 FD15 8D 02 BSR VOUTCH |
1437 FD17 86 59 LDA #'Y ; CLEAR TO END OF SCREEN |
1438 * |
1439 ** VIDEO OUTPUT ROUTINE |
1440 * |
1441 FD19 34 16 VOUTCH PSHS A,B,X ; SAVE REGISTERS |
1442 FD1B 8E E0 30 LDX #VDU ; POINT TO VDU REGISTERS |
1443 * |
1444 ** CHECK FOR ESCAPE SEQUENCE |
1445 * |
1446 FD1E 7D DF FE TST ESCFLG ; ESCAPE ACTIVE? |
1447 FD21 27 04 BEQ SOROU1 ; BRANCH IF NOT |
1448 FD23 8D 60 BSR ESCAPE ; ELSE DO ESCAPE |
1449 FD25 20 0D BRA RETURN ; AND RETURN |
1450 * |
1451 ** CHECK FOR CONTROL CHARACTERS |
1452 * |
1453 FD27 81 20 SOROU1 CMPA #$20 ; CONTROL CODES? |
1454 FD29 24 04 BHS SOROU2 |
1455 FD2B 8D 09 BSR CONTRL ; BRANCH IF SO |
1456 FD2D 20 05 BRA RETURN |
1457 * |
1458 ** OUTPUT TEXT CHARACTER |
1459 * |
1460 FD2F A7 84 SOROU2 STA VDUCHR,X ; DISPLAY CHARACTER |
1461 FD31 17 00 AF LBSR NEWCOL ; UPDATE COLUMN |
1462 * |
1463 ** DISPLAY CURSOR AND RETURN |
1464 * |
1465 FD34 35 96 RETURN PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN |
1466 * |
1467 *************************************************** |
1468 * CONTROL CODE HANDLERS * |
1469 *************************************************** |
1470 * |
1471 FD36 81 08 CONTRL CMPA #$08 ; CTRL H - BACKSPACE ? |
1472 FD38 27 34 BEQ BACKSP |
1473 FD3A 81 1B CMPA #$1B ; ESCAPE SEQUENCE? |
1474 FD3C 27 5A BEQ SETESC |
1475 FD3E 81 1A CMPA #$1A ; CTRL Z - Clear Screen |
1476 FD40 10 27 00 7C LBEQ CLRSCR |
1477 FD44 81 16 CMPA #$16 ; CTRL ^ - Home |
1478 FD46 27 38 BEQ HOME |
1479 FD48 81 0D CMPA #$0D ; CTRL M - RETURN? |
1480 FD4A 10 27 00 89 LBEQ CRETN |
1481 FD4E 81 0C CMPA #$0C ; CTRL L - CHAR RIGHT |
1482 FD50 27 24 BEQ CHRIGHT |
1483 FD52 81 0B CMPA #$0B ; CTRL K - MOVE UP ONE LINE |
1484 FD54 27 0F BEQ LINEUP |
1485 FD56 81 0A CMPA #$0A ; CTRL J - LINE FEED |
1486 FD58 26 45 BNE RETESC ; NONE OF THESE, RETURN |
1487 * |
1488 ***************************************** LINE FEED |
1489 * |
1490 FD5A FC DF FB LINEFD LDD COLADX ; GET CURRENT COLUMN AND ROW |
1491 FD5D 5C INCB ; BUMP ROW |
1492 FD5E C1 19 CMPB #NUMLIN ; SCROLL TIME? |
1493 FD60 26 79 BNE NEWCUR ; POSITION CURSOR IF NOT |
1494 FD62 16 00 8F LBRA SCROLL ; ELSE SCROLL IT |
1495 * |
1496 ***************************************** LINE FEED |
1497 * |
1498 FD65 FC DF FB LINEUP LDD COLADX ; GET CURRENT COLUMN AND ROW |
1499 FD68 5D TSTB ; AT TOP OF SCREEN ? |
1500 FD69 27 34 BEQ RETESC ; Yes, Ignore |
1501 FD6B 5A DECB ; No, Decrement ROW |
1502 FD6C 20 6D BRA NEWCUR ; POSITION CURSOR |
1503 * |
1504 *********************************** BACK SPACE |
1505 * |
1506 FD6E B6 DF FB BACKSP LDA COLADX |
1507 FD71 27 2C BEQ RETESC ; RETURN |
1508 FD73 4A DECA |
1509 FD74 20 62 BRA POSCOL ; POSITION CURSOR |
1510 * |
1511 *********************************** CURSOR RIGHT |
1512 * |
1513 FD76 B6 DF FB CHRIGHT LDA COLADX |
1514 FD79 4C INCA |
1515 FD7A 81 50 CMPA #LINLEN |
1516 FD7C 27 21 BEQ RETESC |
1517 FD7E 20 58 BRA POSCOL |
1518 * |
1519 *********************************** CURSOR RIGHT |
1520 * |
1521 FD80 CC 00 00 HOME LDD #0 ; HOME - POSITION TOP OF SCREEN |
1522 FD83 20 56 BRA NEWCUR |
1523 * |
1524 *************************************************** |
1525 * ESCAPE HANDLERS * |
1526 *************************************************** |
1527 * |
1528 FD85 F6 DF FE ESCAPE LDB ESCFLG ; GET FLAG |
1529 FD88 C1 3D CMPB #'= ; SETTING CURSOR? |
1530 FD8A 27 14 BEQ ESCCUR ; BRANCH IF SO |
1531 FD8C 81 59 CMPA #'Y ; CLEAR TO END OF SCREEN? |
1532 FD8E 27 6E BEQ ESCCLS |
1533 FD90 81 54 CMPA #'T ; CLEAR TO END OF LINE? |
1534 FD92 27 31 BEQ ESCCLL |
1535 FD94 81 3D CMPA #'= ; STARTING CURSOR SET? |
1536 FD96 26 04 BNE CLRESC ; BRANCH IF NOT |
1537 * |
1538 ***************************** START ESCAPE SEQUENCE |
1539 * |
1540 FD98 B7 DF FE SETESC STA ESCFLG ; ELSE START CURSORING |
1541 FD9B 39 RTS ; AND RETURN |
1542 * |
1543 FD9C 7F DF FE CLRESC CLR ESCFLG ; NO OTHERS SUPPORTED |
1544 FD9F 39 RETESC RTS ; SO RETURN |
1545 * |
1546 ********************************* SET SCREEN CURSOR |
1547 * |
1548 FDA0 7D DF FD ESCCUR TST NEWROW ; ROW SET? |
1549 FDA3 26 04 BNE ESCCU1 ; BRANCH IF SO |
1550 FDA5 B7 DF FD STA NEWROW ; ELSE SET NEW ROW |
1551 FDA8 39 RTS ; AND RETURN |
1552 * |
1553 FDA9 7F DF FE ESCCU1 CLR ESCFLG |
1554 FDAC 80 20 SUBA #$20 ; ADJUST COLUMN ADDRESS |
1555 FDAE 81 4F CMPA #LINLEN-1 ;CHECK FOR ACCEPTABLE COLUM |
1556 FDB0 22 ED BHI RETESC ; NOT OK, DO NOTHING |
1557 * |
1558 FDB2 F6 DF FD ESCCU2 LDB NEWROW |
1559 FDB5 7F DF FD CLR NEWROW |
1560 FDB8 C0 20 SUBB #$20 ; ADJUST TO ROW ADDRESS |
1561 FDBA C1 18 CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW |
1562 FDBC 22 E1 BHI RETESC ; ELSE RETURN DOING NOTHING |
1563 FDBE 20 1B BRA NEWCUR ; GO SET NEW CURSOR IF SO |
1564 * |
1565 ****************** CLEAR FROM CURSOR TO END OF LINE |
1566 * |
1567 FDC0 CC 00 00 CLRSCR LDD #0 ; CLEAR FROM TOP OF SCREEN |
1568 FDC3 8D 16 BSR NEWCUR |
1569 FDC5 B6 DF FB ESCCLL LDA COLADX |
1570 FDC8 C6 20 LDB #$20 ; AND CLEAR CHAR |
1571 FDCA E7 84 ESCCL1 STB VDUCHR,X ; DISPLAY TEXT |
1572 FDCC 4C INCA |
1573 FDCD A7 02 STA VDUCOL,X |
1574 FDCF 81 50 CMPA #LINLEN ; UNTIL END OF LINE |
1575 FDD1 26 F7 BNE ESCCL1 |
1576 FDD3 7F DF FE CLR ESCFLG |
1577 FDD6 39 RTS |
1578 * |
1579 *********************************** CARRIAGE RETURN |
1580 * |
1581 FDD7 4F CRETN CLRA ; SET COLUMN ZERO |
1582 FDD8 F6 DF FC POSCOL LDB ROWADX ; GET CURRENT ROW |
1583 * |
1584 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1585 * |
1586 FDDB FD DF FB NEWCUR STD COLADX ; SAVE NEW ROW AND COLUMN |
1587 FDDE A7 02 STA VDUCOL,X ; SET NEW COLUMN |
1588 FDE0 E7 03 STB VDUROW,X ; SET NEW ROW |
1589 FDE2 39 RTS ; AND RETURN |
1590 * |
1591 ********************* UPDATE CURRENT COLUMN AND ROW |
1592 * |
1593 FDE3 FC DF FB NEWCOL LDD COLADX ; GET ROW AND COLUMN |
1594 FDE6 4C INCA ; BUMP COLUMN |
1595 FDE7 81 50 CMPA #LINLEN ; ROLL? |
1596 FDE9 26 F0 BNE NEWCUR ; BRANCH IF NOT |
1597 FDEB 4F CLRA ; ELSE RESET TO ZERO |
1598 FDEC 5C INCB ; AND BUMP ROW |
1599 FDED C1 19 CMPB #NUMLIN |
1600 FDEF 26 EA BNE NEWCUR |
1601 FDF1 5A DECB ; BOTTOM ROW |
1602 FDF2 8D E7 BSR NEWCUR |
1603 * |
1604 ********************************* SCROLL THE SCREEN |
1605 * |
1606 FDF4 E6 04 SCROLL LDB VDUOFF,X |
1607 FDF6 5C INCB |
1608 FDF7 C1 19 CMPB #NUMLIN |
1609 FDF9 25 01 BLO SCROL1 |
1610 FDFB 5F CLRB |
1611 FDFC E7 04 SCROL1 STB VDUOFF,X |
1612 * |
1613 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1614 * |
1615 FDFE F6 DF FB ESCCLS LDB COLADX ; GET CURSOR |
1616 FE01 86 20 LDA #$20 ; GET A SPACE |
1617 FE03 F7 DF FB ESCCLS1 STB COLADX |
1618 FE06 E7 02 STB VDUCOL,X |
1619 FE08 A7 84 STA VDUCHR,X |
1620 FE0A 5C INCB |
1621 FE0B C1 50 CMPB #LINLEN |
1622 FE0D 26 F4 BNE ESCCLS1 |
1623 * |
1624 FE0F F6 DF FC LDB ROWADX |
1625 FE12 5C INCB |
1626 FE13 C1 19 CMPB #NUMLIN |
1627 FE15 27 08 BEQ ESCCLS2 |
1628 FE17 F7 DF FC STB ROWADX |
1629 FE1A E7 03 STB VDUROW,X |
1630 FE1C 5F CLRB |
1631 FE1D 20 E4 BRA ESCCLS1 |
1632 * |
1633 FE1F 5F ESCCLS2 CLRB |
1634 FE20 F7 DF FB STB COLADX |
1635 FE23 E7 02 STB VDUCOL,X |
1636 FE25 F7 DF FE STB ESCFLG |
1637 FE28 39 RTS |
1638 ENDIF VDUOPT |
1639 * |
1640 IFD DG640OPT |
1641 *************************************************** |
1642 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * |
1643 * * |
1644 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * |
1645 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * |
1646 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * |
1647 * 16x64 BOARD). * |
1648 *************************************************** |
1649 * |
1650 *************************************************** |
1651 * INITIALIZE EMULATOR * |
1652 *************************************************** |
1653 * |
1654 VINIZ LDX #0 |
1655 STX COLADX ; AND ROWADX |
1656 STX NEWROW ; AND ESCFLG |
1657 LDX #SCREEN ; POINT TO SCREEN |
1658 STX CURSOR ; SET PROGRAM CURSOR |
1659 LDA #$1B ; SEND ESCAPE |
1660 BSR VOUTCH |
1661 LDA #'Y ; CLEAR TO END OF SCREEN |
1662 * |
1663 ** VIDEO OUTPUT ROUTINE |
1664 * |
1665 VOUTCH PSHS A,B,X ; SAVE REGISTERS |
1666 * |
1667 ** CLEAR CURSOR |
1668 * |
1669 LDX CURSOR |
1670 LDB 0,X |
1671 ANDB #$7F |
1672 STB 0,X |
1673 * |
1674 ** CHECK FOR ESCAPE SEQUENCE |
1675 * |
1676 TST ESCFLG ; ESCAPE ACTIVE? |
1677 BEQ SOROU1 ; BRANCH IF NOT |
1678 BSR ESCAPE ; ELSE DO ESCAPE |
1679 BRA RETURN ; AND RETURN |
1680 * |
1681 ** CHECK FOR CONTROL CHARACTERS |
1682 * |
1683 SOROU1 CMPA #$20 ; CONTROL CODES? |
1684 BHS SOROU2 |
1685 BSR CONTRL ; BRANCH IF SO |
1686 BRA RETURN |
1687 * |
1688 ** OUTPUT TEXT CHARACTER |
1689 * |
1690 SOROU2 LDX CURSOR ; ELSE GET CURSOR |
1691 STA 0,X ; DISPLAY CHARACTER |
1692 LBSR NEWCOL ; UPDATE COLUMN |
1693 * |
1694 ** DISPLAY CURSOR AND RETURN |
1695 * |
1696 RETURN LDX CURSOR ; AND DISPLAY IT |
1697 LDB ,X |
1698 ORB #$80 ; WITH REVID |
1699 STB ,X |
1700 PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN |
1701 * |
1702 *************************************************** |
1703 * CONTROL CODE HANDLERS * |
1704 *************************************************** |
1705 * |
1706 CONTRL CMPA #$08 ; CTRL H - BACKSPACE ? |
1707 LBEQ BACKSP |
1708 CMPA #$1B ; ESCAPE SEQUENCE? |
1709 LBEQ SETESC |
1710 CMPA #$D ; CTRL M - RETURN? |
1711 LBEQ CRETN |
1712 CMPA #$0A ; CTRL J - LINE FEED |
1713 BNE RETESC ; NONE OF THESE, RETURN |
1714 * |
1715 ***************************************** LINE FEED |
1716 * |
1717 LINEFD LDD COLADX ; GET CURRENT COLUMN AND ROW |
1718 INCB ; BUMP ROW |
1719 CMPB #NUMLIN ; SCROLL TIME? |
1720 LBNE NEWCUR ; POSITION CURSOR IF NOT |
1721 LBRA SCROLL ; ELSE SCROLL IT |
1722 * |
1723 ***************************************** LINE FEED |
1724 * |
1725 LINEUP LDD COLADX ; GET CURRENT COLUMN AND ROW |
1726 TSTB ; AT TOP OF SCREEN ? |
1727 BEQ RETESC ; YES, RETURN |
1728 DECB ; NO, DECREMENT ROW |
1729 LBRA NEWCUR ; POSITION CURSOR |
1730 * |
1731 *********************************** BACK SPACE |
1732 * |
1733 BACKSP LDA COLADX ; GET CURRENT COLUMN AND ROW |
1734 BEQ RETESC ; IF AT TOP LEFT CORNER RETURN |
1735 DECA ; OTHERWISE BACK STEP ONE CHARACTER |
1736 LBRA POSCOL ; POSITION CURSOR |
1737 * |
1738 *********************************** CURSOR RIGHT |
1739 * |
1740 CHRIGHT LDA COLADX ; GET CURRENT COLUMN AND ROW |
1741 INCA ; MOVE RIGHT ONE CHARACTER |
1742 CMPA #LINLEN ; ARE WE AT THE END OF THE LINE ? |
1743 BEQ RETESC ; YES, RETURN |
1744 LBRA POSCOL ; NO, POSITION CURSOR |
1745 * |
1746 *************************************************** |
1747 * ESCAPE HANDLERS * |
1748 *************************************************** |
1749 * |
1750 ESCAPE LDB ESCFLG ; ARE WE IN AN ESCAPE SEQUENCE ? |
1751 CMPB #'= ; ARE WE SETTING CURSOR? |
1752 BEQ ESCCUR ; YES BRANCH TO SET CURSOR |
1753 CMPA #'Y ; CLEAR TO END OF SCREEN? |
1754 LBEQ ESCCLS ; YES, CLEAR SCREEN |
1755 CMPA #'T ; CLEAR TO END OF LINE? |
1756 BEQ ESCCLL ; YES, CLEAR LINE |
1757 CMPA #'E ; INSERT LINE? |
1758 BEQ ESCINL |
1759 CMPA #'R ; DELETE LINE? |
1760 BEQ ESCDLL |
1761 CMPA #'= ; STARTING CURSOR SET? |
1762 BNE CLRESC ; BRANCH IF NOT |
1763 * |
1764 ***************************** START ESCAPE SEQUENCE |
1765 * |
1766 SETESC STA ESCFLG ; ELSE START CURSORING |
1767 RTS ; AND RETURN |
1768 * |
1769 CLRESC CLR ESCFLG ; NO OTHERS SUPPORTED |
1770 RETESC RTS ; SO RETURN |
1771 * |
1772 ********************************* SET SCREEN CURSOR |
1773 * |
1774 ESCCUR TST NEWROW ; ROW SET? |
1775 BNE ESCCU1 ; BRANCH IF SO |
1776 STA NEWROW ; ELSE SET NEW ROW |
1777 RTS ; AND RETURN |
1778 * |
1779 ESCCU1 CLR ESCFLG |
1780 SUBA #$20 ; ADJUST COLUMN ADDRESS |
1781 CMPA #LINLEN-1 ; CHECK FOR ACCEPTABLE COLUM |
1782 BHI RETESC ; NOT OK, DO NOTHING |
1783 * |
1784 ESCCU2 LDB NEWROW |
1785 CLR NEWROW |
1786 SUBB #$20 ; ADJUST TO ROW ADDRESS |
1787 CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW |
1788 BHI RETESC ; ELSE RETURN DOING NOTHING |
1789 BRA NEWCUR ; GO SET NEW CURSOR IF SO |
1790 * |
1791 *************************** DELETE LINE FROM SCREEN |
1792 * |
1793 ESCDLL BSR CRETN ; GO COL. ZERO |
1794 LDB ROWADX |
1795 CMPB #NUMLIN-1 |
1796 BEQ SCROL3 |
1797 BRA SCROL1 ; AND DELETE THIS LINE |
1798 * |
1799 *************************** INSERT LINE INTO SCREEN |
1800 * |
1801 ESCINL BSR CRETN ; GO TO COL. ZERO |
1802 LDB ROWADX |
1803 CMPB #NUMLIN-1 |
1804 BEQ ESCCLL |
1805 * |
1806 ** SCROLL SCREEN DOWN FROM CURSOR |
1807 * |
1808 LDX #SCREEN+SCNLEN-LINLEN |
1809 ESCIN0 LDA ,-X |
1810 STA LINLEN,X |
1811 LDA SCNLEN,X |
1812 STA SCNLEN+LINLEN,X |
1813 CMPX CURSOR |
1814 BNE ESCIN0 |
1815 * |
1816 ****************** CLEAR FROM CURSOR TO END OF LINE |
1817 * |
1818 ESCCLL LDA COLADX ; GET CURRENT COLUMN |
1819 LDX CURSOR ; GET CURSOR |
1820 LDB #$20 ; AND CLEAR CHAR |
1821 ESCLL1 STB SCNLEN,X ; CLEAR ATTRIBUTE |
1822 STB ,X+ ; CLEAR TEXT |
1823 INCA |
1824 CMPA #LINLEN ; UNTIL END OF LINE |
1825 BNE ESCLL1 |
1826 CLR ESCFLG |
1827 RTS |
1828 * |
1829 *********************************** CARRIAGE RETURN |
1830 * |
1831 CRETN CLRA ; SET COLUMN ZERO |
1832 POSCOL LDB ROWADX ; GET CURRENT ROW |
1833 * |
1834 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1835 * |
1836 NEWCUR STD COLADX ; SAVE NEW ROW AND COLUMN |
1837 LDA #LINLEN ; ELSE ADD A LINE |
1838 MUL ; LINLEN * ROWADX |
1839 ADDB COLADX |
1840 ADCA #0 |
1841 ADDD #SCREEN ; ADD SCREEN BASE. |
1842 STD CURSOR ; SAVE NEW CURSOR |
1843 TFR D,X ; GET CURSOR IN X |
1844 RTS ; AND RETURN |
1845 * |
1846 ********************* UPDATE CURRENT COLUMN AND ROW |
1847 * |
1848 NEWCOL LDD COLADX ; GET ROW AND COLUMN |
1849 INCA ; BUMP COLUMN |
1850 CMPA #LINLEN ; ROLL? |
1851 BNE NEWCUR ; BRANCH IF NOT |
1852 CLRA ; ELSE RESET TO ZERO |
1853 INCB ; AND BUMP ROW |
1854 CMPB #NUMLIN |
1855 BNE NEWCUR |
1856 DECB ; BOTTOM ROW |
1857 BSR NEWCUR |
1858 * |
1859 ********************************* SCROLL THE SCREEN |
1860 * |
1861 SCROLL LDX #SCREEN ; POINT TO SCREEN |
1862 SCROL1 LDA SCNLEN+LINLEN,X |
1863 STA SCNLEN,X |
1864 LDA LINLEN,X ; MOVE TWO BYTES |
1865 STA ,X+ ; UP ONE LINE |
1866 CMPX #SCREEN+SCNLEN-LINLEN |
1867 BNE SCROL1 ; LOOP UNTIL DONE |
1868 BRA SCROL3 |
1869 * |
1870 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1871 * |
1872 ESCCLS LDX CURSOR ; GET CURSOR |
1873 SCROL3 LDA #$20 ; GET A SPACE |
1874 SCROL2 STA SCNLEN,X ; CLEAR ATTRIBUTES |
1875 STA ,X+ ; AND TEXT |
1876 CMPX #SCREEN+SCNLEN |
1877 BNE SCROL2 ; UNTIL DONE |
1878 CLR ESCFLG |
1879 RTS |
1880 ENDIF DG640OPT |
1880 ENDIF DG640OPT |
1881 * |
1882 IFD PRTOPT |
1883 ************************************* |
1884 * |
1885 ** PRINTER DRIVER ROUTINES |
1886 * |
1887 ************************************* |
1888 * |
1889 ** PINIZ - INITIATE PRINTER PORT |
1890 * |
1891 PINIZ PSHS B |
1892 LDD #DIRMSK*256+$04 ; ACCA=DIRMSK ACCB=$04 |
1893 STD PADATA ; SET DDR AND SELECT DATA |
1894 * |
1895 ** RESET PRINTER |
1896 * |
1897 LDB #PRESET |
1898 STB PADATA |
1899 RESTLP INCB ; DELAY FOR RESET |
1900 BNE RESTLP |
1901 STA PADATA ; ACCA=DIRMSK |
1902 * |
1903 ** INITALIZE PORT B (DATA PORT) |
1904 * |
1905 LDA #$2A |
1906 STA PBCTRL |
1907 LDD #$FF2E ; ACCA=$FF ACCB =%00101110 |
1908 STD PBDATA ; PBDREG PBCTRL |
1909 * |
1910 ** SELECT 66 LINES/PAGE |
1911 * |
1912 LDA #$1B |
1913 BSR POUTCH |
1914 LDA #'C |
1915 BSR POUTCH |
1916 LDA #66 |
1917 PULS B |
1918 ************************************* |
1919 * |
1920 ** OUTPUT A CHARACTER TO THE PRINTER |
1921 * |
1922 ************************************* |
1923 POUTCH PSHS B |
1924 LDB PBDATA ; CLEAR INTERRUPT BIT |
1925 * |
1926 ** WAIT TILL NOT BUSY |
1927 * |
1928 BUSYLP LDB PADATA |
1929 BITB #PERROR |
1930 BEQ PEXIT |
1931 TSTB |
1932 BMI BUSYLP |
1933 * |
1934 ** NOW OUTPUT CHARACTER |
1935 * |
1936 STA PBDATA |
1937 PEXIT PULS B,PC |
1938 ************************************* |
1939 * |
1940 ** PCHK TEST IFD PRINTER READY |
1941 * |
1942 ************************************* |
1943 PCHK TST PBCTRL ; TEST STATE OF CRB7 |
1944 RTS ; SET ON ACKNOWLEDGE |
1945 ENDIF PRTOPT |
1945 ENDIF PRTOPT |
1946 ************************************* |
1947 * |
1948 * MONITOR KEYBOARD COMMAND JUMP TABLE |
1949 * |
1950 ************************************* |
1951 * |
1952 FE29 JMPTAB EQU * |
1953 FE29 01 FCB 1 " ^A " |
1954 FE2A FB 74 FDB ALTRA |
1955 FE2C 02 FCB 2 " ^B " |
1956 FE2D FB 69 FDB ALTRB |
1957 FE2F 03 FCB 3 " ^C " |
1958 FE30 FB 7F FDB ALTRCC |
1959 FE32 04 FCB 4 " ^D " |
1960 FE33 FB 5E FDB ALTRDP |
1961 FE35 10 FCB $10 " ^P " |
1962 FE36 FB 31 FDB ALTRPC |
1963 FE38 15 FCB $15 " ^U " |
1964 FE39 FB 3D FDB ALTRU |
1965 FE3B 18 FCB $18 " ^X " |
1966 FE3C FB 53 FDB ALTRX |
1967 FE3E 19 FCB $19 " ^Y " |
1968 FE3F FB 48 FDB ALTRY |
1969 * |
1970 FE41 42 FCC 'B' |
1971 FE42 F9 5C FDB BRKPNT |
1972 FE44 45 FCC 'E' |
1973 FE45 F8 FD FDB MEMDUMP |
1974 FE47 47 FCC 'G' |
1975 FE48 F8 A5 FDB GO |
1976 FE4A 4C FCC 'L' |
1977 FE4B FA 5E FDB LOAD |
1978 FE4D 50 FCC 'P' |
1979 FE4E FA BC FDB PUNCH |
1980 FE50 4D FCC 'M' |
1981 FE51 F8 A8 FDB MEMCHG |
1982 FE53 52 FCC 'R' |
1983 FE54 FB ED FDB REGSTR |
1984 FE56 53 FCC 'S' |
1985 FE57 F8 F1 FDB DISSTK |
1986 FE59 58 FCC 'X' |
1987 FE5A F9 88 FDB XBKPNT |
1988 IFD MFDCOPT |
1989 FCC 'D' ; *** SWTPC USES 'U' FOR MINIBOOT |
1990 FDB MINBOOT |
1991 ENDIF MFDCOPT |
1991 ENDIF MFDCOPT |
1992 IFD CF8OPT |
1993 FE5C 44 FCC 'D' ; *** FPGA 8 BIT USES 'D' FOR CFBOOT |
1994 FE5D F9 D5 FDB CFBOOT |
1995 ENDIF CF8OPT |
1996 IFD IDEOPT |
1997 FCC 'D' ; *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT |
1998 FDB IDEBOOT |
1999 ENDIF IDEOPT |
1999 ENDIF IDEOPT |
2000 IFD DMAFOPT |
2001 FCC 'U' ; *** SWTPC USES 'D' FOR DMAF2 BOOT |
2002 FDB DBOOT |
2003 ENDIF DMAFOPT |
2003 ENDIF DMAFOPT |
2004 IFD EXTOPT |
2005 FE5F 55 FCC 'U' ; *** IF FPGA, 'U' IS FOR USER |
2006 FE60 FC 92 FDB USRCMD |
2007 ENDIF EXTOPT |
2008 IFD RTCOPT |
2009 FCC 'T' |
2010 FDB TIMSET |
2011 ENDIF RTCOPT |
2011 ENDIF RTCOPT |
2012 IFD TRAOPT |
2013 FCC "T" |
2014 FDB TRACE |
2015 ENDIF TRAOPT |
2015 ENDIF TRAOPT |
2016 * |
2017 FE62 TABEND EQU * |
2018 * |
2019 * ** 6809 VECTOR ADDRESSES ** |
2020 * |
2021 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES |
2022 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY |
2023 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE |
2024 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO |
2025 * HIS OWN ROUTINES IF HE SO DESIRES. |
2026 * |
2027 * |
2028 FE62 F9 94 RAMVEC FDB SWIE ; USER-V |
2029 FE64 F8 A7 FDB RTI ; SWI3-V |
2030 FE66 F8 A7 FDB RTI ; SWI2-V |
2031 FE68 F8 A7 FDB RTI ; FIRQ-V |
2032 FE6A F8 A7 FDB RTI ; IRQ-V |
2033 FE6C F9 94 FDB SWIE ; SWI-V |
2034 FE6E FF FF FDB $FFFF ; SVC-VO |
2035 FE70 FF FF FDB $FFFF ; SVC-VL |
2036 * |
2037 * PRINTABLE MESSAGE STRINGS |
2038 * |
2039 FE72 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
2040 FE77 53 59 53 30 39 42 FCC 'SYS09BUG 1.7 FOR ' |
55 47 20 31 2E 37 |
20 46 4F 52 20 |
2041 IFD SWTOPT |
2042 FCC 'SWTPC' |
2043 ENDIF SWTOPT |
2043 ENDIF SWTOPT |
2044 IFD ADSOPT |
2045 FCC 'ADS6809' |
2046 ENDIF ADSOPT |
2046 ENDIF ADSOPT |
2047 IFD B3SOPT |
2048 FCC 'B3-S2+' |
2049 ENDIF B3SOPT |
2049 ENDIF B3SOPT |
2050 IFD B5XOPT |
2051 FCC 'B5-X300' |
2052 ENDIF B5XOPT |
2052 ENDIF B5XOPT |
2053 IFD S3SOPT |
2054 FCC 'S3STARTER' |
2055 ENDIF S3SOPT |
2055 ENDIF S3SOPT |
2056 IFD S3EOPT |
2057 FCC 'S3E' |
2058 ENDIF S3EOPT |
2058 ENDIF S3EOPT |
2059 IFD XESOPT |
2060 FCC 'XESS' |
2061 ENDIF XESOPT |
2061 ENDIF XESOPT |
2062 IFD DE270OPT |
2063 FE88 44 45 32 2D 37 30 FCC 'DE2-70' |
2064 ENDIF DE270OPT |
2065 FE8E 20 2D 20 FCC ' - ' |
2066 FE91 04 FCB 4 |
2067 FE92 4B 0D 0A 00 00 00 MSG2 FCB 'K,$0D,$0A,$00,$00,$00,$04 ; K,<CR>,<LF>,3 NULS,<EOT> |
04 |
2068 FE99 3E MSG3 FCC '>' |
2069 FE9A 04 FCB 4 |
2070 FE9B 57 48 41 54 3F MSG4 FCC 'WHAT?' |
2071 FEA0 04 FCB 4 |
2072 FEA1 20 2D 20 MSG5 FCC ' - ' |
2073 FEA4 04 FCB 4' |
2074 FEA5 20 20 53 50 3D MSG10 FCC ' SP=' |
2075 FEAA 04 FCB 4 |
2076 FEAB 20 20 50 43 3D MSG11 FCC ' PC=' |
2077 FEB0 04 FCB 4 |
2078 FEB1 20 20 55 53 3D MSG12 FCC ' US=' |
2079 FEB6 04 FCB 4 |
2080 FEB7 20 20 49 59 3D MSG13 FCC ' IY=' |
2081 FEBC 04 FCB 4 |
2082 FEBD 20 20 49 58 3D MSG14 FCC ' IX=' |
2083 FEC2 04 FCB 4 |
2084 FEC3 20 20 44 50 3D MSG15 FCC ' DP=' |
2085 FEC8 04 FCB 4 |
2086 FEC9 20 20 41 3D MSG16 FCC ' A=' |
2087 FECD 04 FCB 4 |
2088 FECE 20 20 42 3D MSG17 FCC ' B=' |
2089 FED2 04 FCB 4 |
2090 FED3 20 20 43 43 3A 20 MSG18 FCC ' CC: ' |
2091 FED9 04 FCB 4 |
2092 FEDA 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' |
56 43 |
2093 FEE2 53 31 MSG20 FCC 'S1' |
2094 FEE4 04 FCB 4 |
2095 IFD DATOPT |
2096 * |
2097 * POWER UP/ RESET/ NMI ENTRY POINT |
2098 * |
2099 FF00 ORG $FF00 |
2100 * |
2101 * |
2102 FF00 8E FF F0 START LDX #IC11 ; POINT TO DAT RAM IC11 |
2103 FF03 86 0F LDA #$0F ; GET COMPLIMENT OF ZERO |
2104 * |
2105 * |
2106 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F |
2107 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS |
2108 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE |
2109 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA |
2110 * STORED IN IT. |
2111 * |
2112 * |
2113 FF05 A7 80 DATLP STA ,X+ ; STORE & POINT TO NEXT RAM LOCATION |
2114 FF07 4A DECA ; GET COMP. VALUE FOR NEXT LOCATION |
2115 FF08 26 FB BNE DATLP ; ALL 16 LOCATIONS INITIALIZED ? |
2116 * |
2117 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER |
2118 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL |
2119 * PHYSICAL ADDRESSES. |
2120 * |
2121 FF0A 86 F0 LDA #$F0 |
2122 FF0C A7 84 STA ,X ; STORE $F0 AT $FFFF |
2123 FF0E 8E D0 A0 LDX #$D0A0 ; ASSUME RAM TO BE AT $D000-$DFFF |
2124 FF11 10 8E 55 AA LDY #TSTPAT ; LOAD TEST DATA PATTERN INTO "Y" |
2125 FF15 EE 84 TSTRAM LDU ,X ; SAVE DATA FROM TEST LOCATION |
2126 FF17 10 AF 84 STY ,X ; STORE TEST PATTERN AT $D0A0 |
2127 FF1A 10 AC 84 CMPY ,X ; IS THERE RAM AT THIS LOCATION ? |
2128 FF1D 27 0B BEQ CNVADR ; IF MATCH THERE'S RAM, SO SKIP |
2129 FF1F 30 89 F0 00 LEAX -$1000,X ; ELSE POINT 4K LOWER |
2130 FF23 8C F0 A0 CMPX #$F0A0 ; DECREMENTED PAST ZER0 YET ? |
2131 FF26 26 ED BNE TSTRAM ; IF NOT CONTINUE TESTING FOR RAM |
2132 FF28 20 D6 BRA START ; ELSE START ALL OVER AGAIN |
2133 * |
2134 * |
2135 * THE FOLLOWING CODE STORES THE COMPLEMENT OF |
2136 * THE MS CHARACTER OF THE FOUR CHARACTER HEX |
2137 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED |
2138 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT |
2139 * IS STORED IN RAM IN THE LOCATION THAT IS |
2140 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, |
2141 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND |
2142 * WHEN TESTING LOCATION $70A0, MEANING THERE |
2143 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE |
2144 * $8000-$DFFF, THEN THE COMPLEMENT OF THE |
2145 * "7" IN THE $70A0 WILL BE STORED IN |
2146 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS |
2147 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND |
2148 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE |
2149 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE |
2150 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- |
2151 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT |
2152 * IS AT $D--- SINCE THAT IS THE ADDRESS THE |
2153 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK |
2154 * OF RAM RESPONDS. |
2155 * |
2156 * |
2157 FF2A EF 84 CNVADR STU ,X ; RESTORE DATA AT TEST LOCATION |
2158 FF2C 1F 10 TFR X,D ; PUT ADDR. OF PRESENT 4K BLOCK IN D |
2159 FF2E 43 COMA ; COMPLEMENT MSB OF THAT ADDRESS |
2160 FF2F 44 LSRA ; PUT MS 4 BITS OF ADDRESS IN |
2161 FF30 44 LSRA ; LOCATION D0-D3 TO ALLOW STORING |
2162 FF31 44 LSRA ; IT IN THE DYNAMIC ADDRESS |
2163 FF32 44 LSRA ; TRANSLATION RAM. |
2164 FF33 B7 FF FD STA $FFFD ; STORE XLATION FACTOR IN DAT "D" |
2165 * |
2166 FF36 10 CE DF C0 LDS #STACK ; INITIALIZE STACK POINTER |
2167 * |
2168 * |
2169 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES |
2170 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK |
2171 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS |
2172 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION |
2173 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF |
2174 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO |
2175 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... |
2176 * |
2177 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2178 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- |
2179 * |
2180 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE |
2181 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... |
2182 * |
2183 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2184 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 |
2185 * |
2186 * |
2187 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF |
2188 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL |
2189 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK |
2190 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT |
2191 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 |
2192 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 |
2193 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE |
2194 * MEMORY ADDRESSED AS FOLLOWS.... |
2195 * |
2196 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2197 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- |
2198 * |
2199 * |
2200 FF3A 10 8E DF D0 LDY #LRARAM ; POINT TO LOGICAL/REAL ADDR. TABLE |
2201 FF3E A7 2D STA 13,Y ; STORE $D--- XLATION FACTOR AT $DFDD |
2202 FF40 6F 2E CLR 14,Y ; CLEAR $DFDE |
2203 FF42 86 F0 LDA #$F0 ; DESTINED FOR IC8 AN MEM EXPANSION ? |
2204 FF44 A7 2F STA 15,Y ; STORE AT $DFDF |
2205 FF46 86 0C LDA #$0C ; PRESET NUMBER OF BYTES TO CLEAR |
2206 FF48 6F A6 CLRLRT CLR A,Y ; CLEAR $DFDC THRU $DFD0 |
2207 FF4A 4A DECA ; SUB. 1 FROM BYTES LEFT TO CLEAR |
2208 FF4B 2A FB BPL CLRLRT ; CONTINUE IF NOT DONE CLEARING |
2209 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X ; POINT TO NEXT LOWER 4K OF RAM |
2210 FF51 8C F0 A0 CMPX #$F0A0 ; TEST FOR DECREMENT PAST ZERO |
2211 FF54 27 22 BEQ FINTAB ; SKIP IF FINISHED |
2212 FF56 EE 84 LDU ,X ; SAVE DATA AT CURRENT TEST LOCATION |
2213 FF58 10 8E 55 AA LDY #TSTPAT ; LOAD TEST DATA PATTERN INTO Y REG. |
2214 FF5C 10 AF 84 STY ,X ; STORE TEST PATT. INTO RAM TEST LOC. |
2215 FF5F 10 AC 84 CMPY ,X ; VERIFY RAM AT TEST LOCATION |
2216 FF62 26 E9 BNE FNDRAM ; IF NO RAM GO LOOK 4K LOWER |
2217 FF64 EF 84 STU ,X ; ELSE RESTORE DATA TO TEST LOCATION |
2218 FF66 10 8E DF D0 LDY #LRARAM ; POINT TO LOGICAL/REAL ADDR. TABLE |
2219 FF6A 1F 10 TFR X,D ; PUT ADDR. OF PRESENT 4K BLOCK IN D |
2220 FF6C 44 LSRA ; PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 |
2221 FF6D 44 LSRA ; TO ALLOW STORING IT IN THE DAT RAM. |
2222 FF6E 44 LSRA |
2223 FF6F 44 LSRA |
2224 FF70 1F 89 TFR A,B ; SAVE OFFSET INTO LRARAM TABLE |
2225 FF72 88 0F EORA #$0F ; INVERT MSB OF ADDR. OF CURRENT 4K BLK |
2226 FF74 A7 A5 STA B,Y ; SAVE TRANSLATION FACTOR IN LRARAM TABLE |
2227 FF76 20 D5 BRA FNDRAM ; GO TRANSLATE ADDR. OF NEXT 4K BLK |
2228 FF78 86 F1 FINTAB LDA #$F1 ; DESTINED FOR IC8 AND MEM EXPANSION ? |
2229 FF7A 10 8E DF D0 LDY #LRARAM ; POINT TO LRARAM TABLE |
2230 FF7E A7 2E STA 14,Y ; STORE $F1 AT $DFCE |
2231 * |
2232 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF |
2233 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES |
2234 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT |
2235 * LOGICALLY RESPONDS TO THE ADDRESS $C---. |
2236 * |
2237 * |
2238 FF80 86 0C LDA #$0C ; PRESET NUMBER HEX "C" |
2239 FF82 E6 A6 FINDC LDB A,Y ; GET ENTRY FROM LRARAM TABLE |
2240 FF84 26 05 BNE FOUNDC ; BRANCH IF RAM THIS PHYSICAL ADDR. |
2241 FF86 4A DECA ; ELSE POINT 4K LOWER |
2242 FF87 2A F9 BPL FINDC ; GO TRY AGAIN |
2243 FF89 20 14 BRA XFERTF |
2244 FF8B 6F A6 FOUNDC CLR A,Y ; CLR XLATION FACTOR OF 4K BLOCK FOUND |
2245 FF8D E7 2C STB $0C,Y ; GIVE IT XLATION FACTOR MOVING IT TO $C--- |
2246 * |
2247 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION |
2248 * FACTORS SUCH THAT ALL REMAINING RAM WILL |
2249 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL |
2250 * ADDRESSES FROM $0000 AND UP.... |
2251 * |
2252 FF8F 4F CLRA ; START AT ZERO |
2253 FF90 1F 21 TFR Y,X ; START POINTER "X" START OF "LRARAM" TABLE. |
2254 FF92 E6 A6 COMPRS LDB A,Y ; GET ENTRY FROM "LRARAM" TABLE |
2255 FF94 27 04 BEQ PNTNXT ; IF IT'S ZER0 SKIP |
2256 FF96 6F A6 CLR A,Y ; ELSE ERASE FROM TABLE |
2257 FF98 E7 80 STB ,X+ ; AND ENTER ABOVE LAST ENTRY- BUMP |
2258 FF9A 4C PNTNXT INCA ; GET OFFSET TO NEXT ENTRY |
2259 FF9B 81 0C CMPA #$0C ; LAST ENTRY YET ? |
2260 FF9D 2D F3 BLT COMPRS |
2261 * |
2262 * THE FOLLOWING CODE TRANSFER THE TRANSLATION |
2263 * FACTORS FROM THE LRARAM TABLE TO IC11 ON |
2264 * THE MP-09 CPU CARD. |
2265 * |
2266 FF9F 8E FF F0 XFERTF LDX #IC11 ; POINT TO DAT RAM IC11 |
2267 FFA2 C6 10 LDB #$10 ; GET NO. OF BYTES TO MOVE |
2268 FFA4 A6 A0 FETCH LDA ,Y+ ; GET BYTE AND POINT TO NEXT |
2269 FFA6 A7 80 STA ,X+ ; POKE XLATION FACTOR IN IC11 |
2270 FFA8 5A DECB ; SUB 1 FROM BYTES TO MOVE |
2271 FFA9 26 F9 BNE FETCH ; CONTINUE UNTIL 16 MOVED |
2272 * |
2273 ELSE |
2274 LRA RTS |
2275 START LDS #STACK ; INITIALIZE STACK POINTER |
2276 CLRB |
2277 ENDIF DATOPT |
2277 ENDIF DATOPT |
2278 * |
2279 FFAB 53 COMB ; SET "B" NON-ZERO |
2280 FFAC F7 DF E2 STB ECHO ; TURN ON ECHO FLAG |
2281 FFAF 16 F8 62 LBRA MONITOR ; INITIALIZATION IS COMPLETE |
2282 * |
2283 ** INTERRUPT JUMP VECTORS |
2284 * |
2285 FFB2 6E 9F DF C0 V1 JMP [STACK] |
2286 FFB6 6E 9F DF C4 V2 JMP [SWI2] |
2287 FFBA 6E 9F DF C6 V3 JMP [FIRQ] |
2288 FFBE 6E 9F DF C8 V4 JMP [IRQ] |
2289 FFC2 6E 9F DF CA V5 JMP [SWI] |
2290 * |
2291 * SWI3 ENTRY POINT |
2292 * |
2293 FFC6 1F 43 SWI3E TFR S,U |
2294 FFC8 AE 4A LDX 10,U *$FFC8 |
2295 FFCA E6 80 LDB ,X+ |
2296 FFCC AF 4A STX 10,U |
2297 FFCE 4F CLRA |
2298 FFCF 58 ASLB |
2299 FFD0 49 ROLA |
2300 FFD1 BE DF CC LDX SVCVO |
2301 FFD4 8C FF FF CMPX #$FFFF |
2302 FFD7 27 0F BEQ SWI3Z |
2303 FFD9 30 8B LEAX D,X |
2304 FFDB BC DF CE CMPX SVCVL |
2305 FFDE 22 08 BHI SWI3Z |
2306 FFE0 34 10 PSHS X |
2307 FFE2 EC C4 LDD ,U |
2308 FFE4 AE 44 LDX 4,U |
2309 FFE6 6E F1 JMP [,S++] |
2310 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP |
2311 FFEA EE 42 LDU 2,U |
2312 FFEC 6E 9F DF C2 JMP [SWI3] |
2313 * |
2314 * 6809 VECTORS |
2315 * |
2316 FFF0 ORG $FFF0 |
2317 FFF0 FF B2 FDB V1 USER-V |
2318 FFF2 FF C6 FDB SWI3E SWI3-V |
2319 FFF4 FF B6 FDB V2 SWI2-V |
2320 FFF6 FF BA FDB V3 FIRQ-V |
2321 FFF8 FF BE FDB V4 IRQ-V |
2322 FFFA FF C2 FDB V5 SWI-V |
2323 FFFC FF B2 FDB V1 NMI-V |
2324 FFFE FF 00 FDB START RESTART-V |
0004 END START |
0005 END |
Program + Init Data = 2021 bytes |
Error count = 0 |
/sys09270.s19
0,0 → 1,66
S123F800F814F861FCA1FC9BFCB9FCCEFB8FFB1EFB1AFA2E8EFE62108EDFC0C610A680A71E |
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2 |
S123F84004A38EFE721703478EDFD04FC60D6D8527038B04195A2AF617040C8EFE921703A2 |
S123F8602E8EFE991702B3170437847F810D27F11F8981202C09865E1704531F988B401701 |
S123F880044C170447C1602F02C0208EFE29E180270F30028CFE6226F58EFE9B1702F020AB |
S123F8A0C0AD9420BC1F343B17036B292D1F128EFEA11702651F211703A517040FA6A41798 |
S123F8C003A517040717035E2811810827E1811827DD815E2717810D260F39A7A4A1A427AB |
S123F8E0081703E8863F1703E5312120C2313F20BE1702A21F328EDFC0301F200517030BE2 |
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE4270517039A27DB |
S123F9200332623934108EFEA11701EEAEE417032E170396C610A68017032C17038E5A2688 |
S123F940F5170386AEE1C610A68081202504817E2302862E1703775A26EE20BC1702B7290D |
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2 |
S123F980170349863F160346108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4AD5 |
S123F9A08D0617024816FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A717 |
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D398D4086E0B7E0468D398601AA |
S123F9E0B7E04186EFB7E0478D2D8601B7E0424FB7E043B7E044B7E0458620B7E0478D17B6 |
S123FA008EC0008D21B6E040A7808CC20026F48EC000AF4A1F343BB6E047858026F9B6E015 |
S123FA2047854027F239B6E047850827F9393436A66244444444108EDFD0E6A654545454F6 |
S123FA40E7E4E6A65358585858A662840FA762EA62E76235B63404C6205A26FD3584BDFC67 |
S123FA60E786111702687FDFE217022A815326F91702238139273D813126F11701A83402F4 |
S123FA80292617019129213410E6E0EBE0EBE46AE46AE4340417018E3504290C3402EBE093 |
S123FAA06AE42705A78020EB5F3502C1FF27BA863F17021A73DFE286131602126FE2170107 |
S123FAC04A3430294DAC6225493001AFE4BDFCE786121701F9ECE4A362270610830020239D |
S123FAE002C620E7648EFEE217002FCB031F98170175AE62170168EB62EB63EB84A6801732 |
S123FB0001656A6426F5531F9817015BAF62ACE426C386141701B73265398D0220713410EE |
S123FB208EFE9317006935901601A11600F81600E51700918DF28DF62902AF4A398D618D1A |
S123FB40E78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18DD52902AF44398D49E1 |
S123FB608DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB08DB12902A741398D7C |
S123FB805F8DA58DA629048A80A7C43917013FA680810426F7398EFEA58DF41F311600BF93 |
S123FBA08EFEB18DEAAE4820F48EFEC38DE1A6431600B48EFEBD8DD7AE4420E18EFEB78DA3 |
S123FBC0CEAE4620D88EFEAB8DC5AE4A20CF8EFEC98DBCA64120D98EFECE8DB3A64220D007 |
S123FBE08EFED38DAAA6C48EFEDA1600908EFEA117FF278DA18DA98DB08DB88DBF8EFEA12C |
S123FC0017FF178DC08DC78DCE20D58D09294D1F12862D1700B88D0E29421F018D08293CE3 |
S123FC203410A76135908D112932484848481F898D0729283404ABE0398D5B8130251D81B1 |
S123FC40392203803039814125128146220380373981612507816622038057391A023934D1 |
S123FC601035028D0235023402444444448D043502840F8B3081392F028B0720513402C62D |
S123FC8008A68068E42502862D8D438D3F5A26F135826E9FF0007DDFE227068D04847F202C |
S123FCA02D3410BEDFE0A684850126098EE020A684850127EEA60135903402A69FDFE085F5 |
S123FCC0012605B6E020850135828D0086208D493412BEDFE0A684850227FA850826F63585 |
S123FCE002A70135908D13BEDFE08603A7848651A7846D0186FFB7DFE2398EE030CC0000B0 |
S123FD00FDDFFBA702E703E704FDDFFDC602E7017FDFFE861B8D02865934168EE0307DDF52 |
S123FD20FE27048D60200D812024048D092005A7841700AF359681082734811B275A811AA0 |
S123FD401027007C81162738810D10270089810C2724810B270F810A2645FCDFFB5CC1190C |
S123FD60267916008FFCDFFB5D27345A206DB6DFFB272C4A2062B6DFFB4C815027212058AA |
S123FD80CC00002056F6DFFEC13D27148159276E81542731813D2604B7DFFE397FDFFE392B |
S123FDA07DDFFD2604B7DFFD397FDFFE8020814F22EDF6DFFD7FDFFDC020C11822E1201BF1 |
S123FDC0CC00008D16B6DFFBC620E7844CA702815026F77FDFFE394FF6DFFCFDDFFBA702B7 |
S123FDE0E70339FCDFFB4C815026F04F5CC11926EA5A8DE7E6045CC11925015FE704F6DF0B |
S123FE00FB8620F7DFFBE702A7845CC15026F4F6DFFC5CC1192708F7DFFCE7035F20E45F1D |
S123FE20F7DFFBE702F7DFFE3901FB7402FB6903FB7F04FB5E10FB3115FB3D18FB5319FB44 |
S123FE404842F95C45F8FD47F8A54CFA5E50FABC4DF8A852FBED53F8F158F98844F9D55554 |
S123FE60FC92F994F8A7F8A7F8A7F8A7F994FFFFFFFF0D0A000000535953303942554720E1 |
S123FE80312E3720464F52204445322D3730202D20044B0D0A000000043E04574841543FC6 |
S123FEA004202D2004202053503D04202050433D04202055533D04202049593D04202049BC |
S123FEC0583D04202044503D042020413D042020423D04202043433A2004454648494E5A03 |
S108FEE05643533104F8 |
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6 |
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9 |
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E |
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26 |
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02 |
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC |
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0 |
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294 |
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB |
S9030000FC |
/sys09bug.asm
24,7 → 24,6
* 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 |
32,7 → 31,6
* 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 |
39,7 → 37,6
* 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 |
46,7 → 43,6
* 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 |
54,13 → 50,11
* 16 BIT IDE DISK BOOT STRAP ROUTINE |
* |
* Modified to SYS09BUG VER 1.5 |
* FOR: SYSTEM09 FPGA SYSTEM |
* BY: JOHN KENT |
* DATE: 7TH SEP 2008 |
* ADDED: ADDED "B3-S2+" STRING |
* |
* Modified to SYS09BUG VER 1.6 |
* FOR: SYSTEM09 FPGA SYSTEM |
* BY: JOHN KENT |
* DATE: 2ND DEC 2008 |
* ADDED: ADDED HARDWARE FLOW CONTROL |
67,6 → 61,11
* |
* CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
* |
* Modified to SYS09BUG VER 1.7 |
* BY: JOHN KENT |
* DATE: 16TH OCT 2010 |
* ADDED: "DE2-70" STRING |
* |
* *** COMMANDS *** |
* |
* CONTROL A = ALTER THE "A" ACCUMULATOR |
1263,7 → 1262,7
CMPA #$39 ; IS IT < OR = "9" ? |
BLE OUTC ; IF LESS, OUTPUT IT |
ADDA #7 ; IF > MAKE ASCII LETTER |
OUTC BRA OUTCH ; OUTPUT CHAR |
OUTC BRA OUTCH ; OUTPUT CHAR |
* |
* BINARY / ASCII --- THIS ROUTINE |
* OUTPUTS A BYTE IN ENHANCED |
2038,28 → 2037,31
* PRINTABLE MESSAGE STRINGS |
* |
MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
FCC 'SYS09BUG 1.6 FOR ' |
IFD SWTOPT` |
FCC 'SWTPC ' |
FCC 'SYS09BUG 1.7 FOR ' |
IFD SWTOPT |
FCC 'SWTPC' |
ENDIF SWTOPT |
IFD ADSOPT |
FCC 'ADS6809 ' |
FCC 'ADS6809' |
ENDIF ADSOPT |
IFD B3SOPT |
FCC 'B3-S2+ ' |
FCC 'B3-S2+' |
ENDIF B3SOPT |
IFD B5XOPT |
FCC 'B5-X300 ' |
FCC 'B5-X300' |
ENDIF B5XOPT |
IFD S3SOPT |
FCC 'S3STARTER ' |
FCC 'S3STARTER' |
ENDIF S3SOPT |
IFD S3EOPT |
FCC 'S3E ' |
FCC 'S3E' |
ENDIF S3EOPT |
IFD XESOPT` |
FCC 'XESS ' |
IFD XESOPT |
FCC 'XESS' |
ENDIF XESOPT |
IFD DE270OPT |
FCC 'DE2-70' |
ENDIF DE270OPT |
FCC ' - ' |
FCB 4 |
MSG2 FCB 'K,$0D,$0A,$00,$00,$00,$04 ; K,<CR>,<LF>,3 NULS,<EOT> |
/sys09equ.asm
21,7 → 21,12
MONEXT EQU $F000 START OF EXTENDED COMMANDS |
EXTCMD EQU $00 EXTENDED OFFSET |
ENDIF XESOPT |
*************************************************** |
IFD DE270OPT |
MONEXT EQU $F000 START OF EXTENDED COMMANDS |
EXTCMD EQU $00 EXTENDED OFFSET |
ENDIF DE270OPT |
************************************************** |
************************************************** |
|
IFD SWTOPT |
* |
45,7 → 50,7
* |
IFD B3SOPT |
* |
* BURCHED B3-SPARTAN2 |
* BURCHED SPARTAN 2 B3+ |
* |
ACIAOPT EQU $FF ACIA AT PORT 0 |
PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
57,7 → 62,7
* |
IFD B5XOPT |
* |
* BURCHED B5-X300 |
* BURCHED SPARTAN 2 B5-X300 |
* |
ACIAOPT EQU $FF ACIA AT PORT 0 |
PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
91,7 → 96,7
* |
IFD XESOPT |
* |
* XESS XSA-3S1000 & XST-3.0 |
* XESS SPARTAN 3 XSA-3S1000 & XST-3.0 |
* |
ACIAOPT EQU $FF ACIA AT PORT 0 |
PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
102,7 → 107,19
EXTOPT EQU $FF EXTENDED COMMANDS |
ENDIF XESOPT |
* |
IFD DE270OPT |
* |
* TERASIC CYCLONE 2 DE2-70 |
* |
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 DE270OPT |
* |
* |
IFD ACIAOPT |
* |
*************************************************** |
/sys09270.sh
0,0 → 1,2
../../Tools/as09/as09_dos.exe sys09270.asm -l > sys09270.lst |
../../Tools/epedit/epedit.exe sys09270.aux |
/sys09270.txt
0,0 → 1,5
NAM SYS09BUG FOR TERASIC CYCLONE II DE2-70 |
INCLUDE "opt_270.txt" |
INCLUDE "sys09equ.txt" |
INCLUDE "sys09bug.txt" |
END |
/sys09270.asm
0,0 → 1,5
NAM SYS09BUG FOR TERASIC CYCLONE II DE2-70 |
INCLUDE "opt_270.asm" |
INCLUDE "sys09equ.asm" |
INCLUDE "sys09bug.asm" |
END |
/sys09270.hex
0,0 → 1,129
:10000000F814F861FCA1FC9BFCC5FCE0FB8FFB1E17 |
:10001000FB1AFA2E8EFE74108EDFC0C610A680A7C3 |
:10002000A05A26F98EE000BFDFE017015BC60C6F17 |
:10003000E25A26FB308CDDAF6A86D0A7E41F431757 |
:1000400004B58EFE841703478EDFD04FC60D6D8535 |
:1000500027038B04195A2AF617040C8EFEA41703E3 |
:100060002E8EFEAB1702B3170437847F810D27F164 |
:100070001F8981202C09865E1704651F988B401705 |
:10008000045E170459C1602F02C0208EFE3BE18040 |
:10009000270F30028CFE7426F58EFEAD1702F0207D |
:1000A000C0AD9420BC1F343B17036B292D1F128E4B |
:1000B000FEB31702651F211703A5170421A6A41775 |
:1000C00003A517041917035E2811810827E1811879 |
:1000D00027DD815E2717810D260F39A7A4A1A4274C |
:1000E000081703FA863F1703F7312120C2313F205A |
:1000F000BE1702A21F328EDFC0301F200517030B70 |
:1001000029063420ACE12401391F10C30010C4F0CB |
:1001100034061F20C4F01F01ACE427051703A627EF |
:100120000332623934108EFEB31701EEAEE41703CA |
:100130002E1703A8C610A68017032C1703A05A2653 |
:10014000F5170398AEE1C610A68081202504817EB4 |
:100150002302862E1703895A26EE20BC1702B729E0 |
:100160001E8CDFC0241A34108EFFFF8D55351027EA |
:100170000FA684813F2709A7A0AFA4863FA7843993 |
:1001800017035B863F160358108EDFE3C6088D18F1 |
:100190005A26FB391F43AE4A301F8D262704AF4A2B |
:1001A0008D0617024816FEB9AE218CDFC0240AA6C0 |
:1001B00084813F2604A6A4A78486FFA7A0A7A0A7A2 |
:1001C000A039108EDFE3C608A6A0ACA127045A26EA |
:1001D000F739313D39CC0006FDE11ECC0002FDE1CE |
:1001E0001ECC00E0FDE10C8D2ECC0001FDE1045F92 |
:1001F000FDE106FDE108FDE10AC620FDE10E8D17D7 |
:100200008EC0008D21FCE100E7808CC10026F48EB9 |
:10021000C000AF4A1F343BFCE10EC58026F9FCE16B |
:100220000EC54027F239FCE10EC50827F9393436EE |
:10023000A66244444444108EDFD0E6A6545454547D |
:10024000E7E4E6A65358585858A662840FA762EA16 |
:1002500062E76235B63404C6205A26FD3584BDFCFB |
:10026000F9861117027A7FDFE217022A815326F9F5 |
:100270001702238139273D813126F11701A8340265 |
:10028000292617019129213410E6E0EBE0EBE46A1E |
:10029000E46AE4340417018E3504290C3402EBE0DF |
:1002A0006AE42705A78020EB5F3502C1FF27BA86E5 |
:1002B0003F17022C73DFE286131602246FE2170148 |
:1002C0004A3430294DAC6225493001AFE4BDFCF918 |
:1002D000861217020BECE4A362270610830020238A |
:1002E00002C620E7648EFEF417002FCB031F981779 |
:1002F0000175AE62170168EB62EB63EB84A68017B1 |
:1003000001656A6426F5531F9817015BAF62ACE480 |
:1003100026C386141701C93265398D022071341045 |
:100320008EFEA517006935901601B31600F8160069 |
:10033000E51700918DF28DF62902AF4A398D618D56 |
:10034000E78DEB2902AF48398D728DDC8DE02902F3 |
:10035000AF46398D5E8DD18DD52902AF44398D4997 |
:100360008DC68DC72902A743398D6C8DBB8DBC29E5 |
:1003700002A742398D588DB08DB12902A741398D20 |
:100380005F8DA58DA629048A80A7C439170151A6BF |
:1003900080810426F7398EFEB78DF41F311600BF19 |
:1003A0008EFEC38DEAAE4820F48EFED58DE1A643C5 |
:1003B0001600B48EFECF8DD7AE4420E18EFEC98DDF |
:1003C000CEAE4620D88EFEBD8DC5AE4A20CF8EFE65 |
:1003D000DB8DBCA64120D98EFEE08DB3A64220D095 |
:1003E0008EFEE58DAAA6C48EFEEC1600908EFEB39E |
:1003F00017FF278DA18DA98DB08DB88DBF8EFEB34F |
:1004000017FF178DC08DC78DCE20D58D09294D1FA3 |
:1004100012862D1700CA8D0E29421F018D08293C16 |
:100420003410A76135908D112932484848481F89FA |
:100430008D0729283404ABE0398D5B8130251D817F |
:1004400039220380303981412512814622038037C9 |
:100450003981612507816622038057391A023934B0 |
:100460001035028D0235023402444444448D043573 |
:1004700002840F8B3081392F028B0720633402C630 |
:1004800008A68068E42502862D8D558D515A26F1E7 |
:1004900035826E9FF0007DDFE227068D04847F2089 |
:1004A0003F34108611A79FDFE0BEDFE0A684850100 |
:1004B00026098EE020A684850127EE8651A79FDFBE |
:1004C000E0A601359034028611A79FDFE0A69FDFEA |
:1004D000E085012605B6E020850135828D00862065 |
:1004E0008D493412BEDFE0A684850227FA850826EE |
:1004F000F63502A70135908D13BEDFE08603A78491 |
:100500008651A7846D0186FFB7DFE2398EE030CCDB |
:100510000000FDDFFBA702E703E704FDDFFDC602E5 |
:10052000E7017FDFFE861B8D02865934168EE03090 |
:100530007DDFFE27048D60200D812024048D09209D |
:1005400005A7841700AF359681082734811B275AE9 |
:10055000811A1027007C81162738810D1027008909 |
:10056000810C2724810B270F810A2645FCDFFB5CC9 |
:10057000C119267916008FFCDFFB5D27345A206DE8 |
:10058000B6DFFB272C4A2062B6DFFB4C81502721C7 |
:100590002058CC00002056F6DFFEC13D27148159BB |
:1005A000276E81542731813D2604B7DFFE397FDF76 |
:1005B000FE397DDFFD2604B7DFFD397FDFFE8020B9 |
:1005C000814F22EDF6DFFD7FDFFDC020C11822E163 |
:1005D000201BCC00008D16B6DFFBC620E7844CA79D |
:1005E00002815026F77FDFFE394FF6DFFCFDDFFB8F |
:1005F000A702E70339FCDFFB4C815026F04F5CC1BA |
:100600001926EA5A8DE7E6045CC11925015FE70463 |
:10061000F6DFFB8620F7DFFBE702A7845CC15026EC |
:10062000F4F6DFFC5CC1192708F7DFFCE7035F2065 |
:10063000E45FF7DFFBE702F7DFFE3901FB7402FB43 |
:100640006903FB7F04FB5E10FB3115FB3D18FB5378 |
:1006500019FB4842F95C45F8FD47F8A54CFA5E5095 |
:10066000FABC4DF8A852FBED53F8F158F98844F95B |
:10067000D555FC92F994F8A7F8A7F8A7F8A7F9942C |
:10068000FFFFFFFF0D0A0000005359533039425558 |
:100690004720312E3720464F52204445322D3730E7 |
:1006A000202D20044B0D0A000000043E0457484151 |
:1006B000543F04202D2004202053503D042020507E |
:1006C000433D04202055533D04202049593D04203A |
:1006D0002049583D04202044503D042020413D0441 |
:1006E0002020423D04202043433A20044546484907 |
:1006F0004E5A564353310400000000000000000031 |
:100700008EFFF0860FA7804A26FB86F0A7848ED046 |
:10071000A0108E55AAEE8410AF8410AC84270B3045 |
:1007200089F0008CF0A026ED20D6EF841F10434402 |
:10073000444444B7FFFD10CEDFC0108EDFD0A72D9C |
:100740006F2E86F0A72F860C6FA64A2AFB3089F001 |
:10075000008CF0A02722EE84108E55AA10AF8410D2 |
:10076000AC8426E9EF84108EDFD01F10444444444B |
:100770001F89880FA7A520D586F1108EDFD0A72E60 |
:10078000860CE6A626054A2AF920146FA6E72C4F08 |
:100790001F21E6A627046FA6E7804C810C2DF38E5F |
:1007A000FFF0C610A6A0A7805A26F953F7DFE2167D |
:1007B000F8626E9FDFC06E9FDFC46E9FDFC66E9FC4 |
:1007C000DFC86E9FDFCA1F43AE4AE680AF4A4F586C |
:1007D00049BEDFCC8CFFFF270F308BBCDFCE220859 |
:1007E0003410ECC4AE446EF1371FEE426E9FDFC290 |
:1007F000FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00E7 |
:00000001FF |
/sys09270.aux
0,0 → 1,7
t m |
l SYS09270.S19 |
c f800 ffff 0 |
t i |
s sys09270.hex 0 800 |
q |
|