URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
Compare Revisions
- This comparison shows the changes necessary to convert path
/System09/tags/pre_mkfiles_rev1_merge/src/sys09bug
- from Rev 27 to Rev 66
- ↔ Reverse comparison
Rev 27 → Rev 66
/sys09ads.lst
0,0 → 1,2777
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 NAM SYS09BUG FOR ADS6809 |
0000 INCLUDE "opt_ads.txt" |
0001 * |
0002 *************************************************** |
0003 * OPTION SWITCHES |
0004 *************************************************** |
0005 * |
0006 * |
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
0009 ** FOR LOADING AND SAVING S1 RECORDS |
0010 * |
0011 *S3EOPT EQU $FF SPARTAN3E STARTER |
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
0015 00FF ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
0017 * |
0002 END |
0000 INCLUDE "sys09equ.txt" |
0001 * |
0002 *************************************************** |
0003 * MEMORY MAP EQUATES * |
0004 *************************************************** |
0005 E000 MONIO EQU $E000 I/O SPACE |
0006 IFD S3EOPT |
0007 MONRAM EQU $7FC0 |
0008 ELSE |
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE |
0010 ENDIF S3EOPT |
0011 F800 MONROM EQU $F800 START OF ROM |
0012 IFD S3SOPT |
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0014 EXTCMD EQU $00 EXTENDED OFFSET |
0015 ENDIF S3SOPT |
0015 ENDIF S3SOPT |
0016 IFD XESOPT |
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0018 EXTCMD EQU $00 EXTENDED OFFSET |
0019 ENDIF XESOPT |
0019 ENDIF XESOPT |
0020 *************************************************** |
0021 |
0022 IFD S3EOPT |
0023 * |
0024 * DIGILENT SPARTAN 3E STARTER |
0025 * |
0026 ACIAOPT EQU $FF ACIA AT PORT 0 |
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0028 VDUOPT EQU $FF VDU AT $E030 |
0029 TRAOPT EQU $FF PIA TRACE TIMER |
0030 ENDIF S3EOPT |
0030 ENDIF S3EOPT |
0031 * |
0032 IFD S3SOPT |
0033 * |
0034 * DIGILENT SPARTAN 3 STARTER |
0035 * |
0036 ACIAOPT EQU $FF ACIA AT PORT 0 |
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0038 VDUOPT EQU $FF VDU AT $E030 |
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0041 EXTOPT EQU $FF EXTENDED COMMANDS |
0042 ENDIF S3SOPT |
0042 ENDIF S3SOPT |
0043 * |
0044 IFD B5XOPT |
0045 * |
0046 * BURCHED B5-X300 |
0047 * |
0048 ACIAOPT EQU $FF ACIA AT PORT 0 |
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0050 VDUOPT EQU $FF VDU AT $E030 |
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0053 ENDIF B5XOPT |
0053 ENDIF B5XOPT |
0054 * |
0055 IFD XESOPT |
0056 * |
0057 * XESS XSA-3S1000 & XST-3.0 |
0058 * |
0059 ACIAOPT EQU $FF ACIA AT PORT 0 |
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0061 VDUOPT EQU $FF VDU AT $E030 |
0062 IDEOPT EQU $FF XESS IDE AT $E100 |
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0064 EXTOPT EQU $FF EXTENDED COMMANDS |
0065 ENDIF XESOPT |
0065 ENDIF XESOPT |
0066 * |
0067 IFD ADSOPT |
0068 * |
0069 * ACKERMAN DIGITAL ADS6809 |
0070 * |
0071 00FF DG640OPT EQU $FF DG640 VDU AT $E800 |
0072 *RTCOPT EQU $FF REAL TIME CLOCK |
0073 00FF PRTOPT EQU $FF PRINTER DRIVERS |
0074 00FF MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0075 ENDIF ADSOPT |
0076 * |
0077 IFD SWTOPT |
0078 * |
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER |
0080 * |
0081 ACIAOPT EQU $FF ACIA AT PORT 0 |
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT |
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0085 ENDIF |
0085 ENDIF |
0086 * |
0087 IFD ACIAOPT |
0088 * |
0089 *************************************************** |
0090 * SERIAL PORT * |
0091 *************************************************** |
0092 * |
0093 ** ACIA SITS ON PORT 0 |
0094 * |
0095 ACIAS EQU MONIO+$00 CONTROL PORT |
0096 * |
0097 ENDIF ACIAOPT |
0097 ENDIF ACIAOPT |
0098 IFD MFDCOPT |
0099 * |
0100 *************************************************** |
0101 * MINIFLOPPY DRIVE * |
0102 *************************************************** |
0103 * |
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 |
0105 * |
0106 E014 DRVFDC EQU MONIO+$14 |
0107 E018 CMDFDC EQU MONIO+$18 |
0108 E01A SECFDC EQU MONIO+$1A |
0109 E01B DATFDC EQU MONIO+$1B |
0110 ENDIF MFDCOPT |
0111 IFD PS2OPT |
0112 * |
0113 *************************************************** |
0114 * VDU8 PS/2 KEYBOARD PORT * |
0115 *************************************************** |
0116 * |
0117 ** KEYBOARD SITS ON PORT 2 |
0118 * |
0119 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT |
0120 ENDIF PS2OPT |
0120 ENDIF PS2OPT |
0121 IFD VDUOPT |
0122 * |
0123 *************************************************** |
0124 * VDU8 DISPLAY DRIVER EQUATES * |
0125 *************************************************** |
0126 * |
0127 ** VDU8 DISPLAY SITS ON PORT 3 |
0128 * |
0129 VDU EQU MONIO+$30 |
0130 VDUCHR EQU 0 CHARACTER REGISTER |
0131 VDUATT EQU 1 ATTRIBUTE REGISTER |
0132 VDUCOL EQU 2 CURSOR COLUMN |
0133 VDUROW EQU 3 CURSOR ROW |
0134 VDUOFF EQU 4 ROW OFFSET |
0135 * |
0136 LINLEN EQU 80 LENGTH OF A LINE |
0137 NUMLIN EQU 25 NUMBER OF LINES |
0138 ENDIF VDUOPT |
0138 ENDIF VDUOPT |
0139 * |
0140 IFD CF8OPT |
0141 * |
0142 *************************************************** |
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER * |
0144 *************************************************** |
0145 * |
0146 ** COMPACT FLASH SITS AT PORT 4 |
0147 * |
0148 CF_BASE EQU MONIO+$40 |
0149 CF_DATA EQU CF_BASE+0 |
0150 CF_ERROR EQU CF_BASE+1 ; read error |
0151 CF_FEATURE EQU CF_BASE+1 ; write feature |
0152 CF_SECCNT EQU CF_BASE+2 |
0153 CF_SECNUM EQU CF_BASE+3 |
0154 CF_CYLLO EQU CF_BASE+4 |
0155 CF_CYLHI EQU CF_BASE+5 |
0156 CF_HEAD EQU CF_BASE+6 |
0157 CF_STATUS EQU CF_BASE+7 ; read status |
0158 CF_COMAND EQU CF_BASE+7 ; write command |
0159 * |
0160 * Command Equates |
0161 * |
0162 CMDREAD EQU $20 ; Read Single sector |
0163 CMDWRITE EQU $30 ; Write Single sector |
0164 CMDFEATURE EQU $EF |
0165 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0166 HEADLBA EQU $E0 |
0167 * |
0168 * Status bit equates |
0169 * |
0170 BUSY EQU $80 |
0171 DRDY EQU $40 |
0172 DRQ EQU $08 |
0173 ERR EQU $01 |
0174 * |
0175 ENDIF CF8OPT |
0175 ENDIF CF8OPT |
0176 * |
0177 IFD IDEOPT |
0178 * |
0179 *************************************************** |
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) * |
0181 *************************************************** |
0182 * |
0183 ** COMPACT FLASH SITS AT PORT 4 |
0184 * |
0185 CF_BASE EQU MONIO+$0100 |
0186 CF_DATA EQU CF_BASE+0 |
0187 CF_ERROR EQU CF_BASE+2 ; read error |
0188 CF_FEATURE EQU CF_BASE+2 ; write feature |
0189 CF_SECCNT EQU CF_BASE+4 |
0190 CF_SECNUM EQU CF_BASE+6 |
0191 CF_CYLLO EQU CF_BASE+8 |
0192 CF_CYLHI EQU CF_BASE+10 |
0193 CF_HEAD EQU CF_BASE+12 |
0194 CF_STATUS EQU CF_BASE+14 ; read status |
0195 CF_COMAND EQU CF_BASE+14 ; write command |
0196 CF_AUX EQU CF_BASE+30 |
0197 * |
0198 * Command Equates |
0199 * |
0200 CMDREAD EQU $20 ; Read Single sector |
0201 CMDWRITE EQU $30 ; Write Single sector |
0202 AUXRESET EQU $06 ; Reset IDE |
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked |
0204 HEADLBA EQU $E0 |
0205 * |
0206 * Status bit equates |
0207 * |
0208 BUSY EQU $80 |
0209 DRDY EQU $40 |
0210 DRQ EQU $08 |
0211 ERR EQU $01 |
0212 * |
0213 ENDIF CF8OPT |
0213 ENDIF CF8OPT |
0214 * |
0215 IFD RTCOPT |
0216 * |
0217 ************************************************** |
0218 * MM58167A REAL TIME CLOCK MEMORY MAP: |
0219 ************************************************** |
0220 * |
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 |
0222 * |
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS |
0224 * |
0225 * COUNTER AND COMPARITOR REGISTERS: |
0226 * |
0227 * Both the Clock Counter and Clock Comparitor |
0228 * consist of 8 registers for holding the time. |
0229 * The register offsets from the Counter and |
0230 * Comparitor registers are listed above. |
0231 * |
0232 COUNTR EQU CLOCK+0 |
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS |
0234 * |
0235 * CLOCK REGISTER OFFSETS: |
0236 * These register offsets are used for the CLOCK |
0237 * and comparitor ram CMPRAM. |
0238 * |
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS |
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS |
0241 SECOND EQU 2 |
0242 MINUIT EQU 3 |
0243 HOUR EQU 4 |
0244 WKDAY EQU 5 |
0245 MTHDAY EQU 6 |
0246 MONTH EQU 7 |
0247 * |
0248 * INTERRUPT OUTPUT REGISTERS: |
0249 * |
0250 * An interrupt output may be generated at the |
0251 * following rates by setting the appropriate bit |
0252 * in the Interrupt Control Register (CINTCR). |
0253 * The Interrupt Status Register (CINTSR) must be |
0254 * read to clear the interrupt and will return |
0255 * the source of the interrupt. |
0256 * |
0257 * 1/Month Bit 7 |
0258 * 1/Week Bit 6 |
0259 * 1/Day Bit 5 |
0260 * 1/Hour Bit 4 |
0261 * 1/Minuite Bit 3 |
0262 * 1/Second Bit 2 |
0263 * 10/Second Bit 1 |
0264 * Comparitor Bit 0 |
0265 * |
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER |
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER |
0268 * |
0269 * COUNTER AND RAM RESETS; GO COMMAND. |
0270 * |
0271 * The counter and comparitor may be reset |
0272 * by writing $FF into CTRRES and CMPRES |
0273 * respectivly. |
0274 * A write to the Go command register (GOCMND) |
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths |
0276 * of a second counter. |
0277 * |
0278 CTRRES EQU CLOCK+18 COUNTER RESET |
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET |
0280 GOCMND EQU CLOCK+21 GO COMMAND |
0281 * |
0282 * CLOCK STATUS REGISTER. |
0283 * |
0284 * The counter takes 61 usec. to rollover for |
0285 * every 1KHz clock pulse. If the Status bit is |
0286 * set after reading the counter, the counter |
0287 * should be re-read to ensure the time is correct. |
0288 * |
0289 CLKSTA EQU CLOCK+20 STATUS BIT |
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT |
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER |
0292 ENDIF RTCOPT |
0292 ENDIF RTCOPT |
0293 * |
0294 IFD TRAOPT |
0295 * |
0296 ************************************************** |
0297 * PIA INTERRUPT TIMER |
0298 ************************************************** |
0299 * |
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7 |
0301 * |
0302 ** PIA TIMER FOR SINGLE STEP / TRACE |
0303 * |
0304 * TADATA = Output = Timer preset register |
0305 * TACTRL - CA1 = input = rising edge = NMI |
0306 * - CA2 = Output = Timer Reset (Active High) |
0307 * TBDATA = Input = Timer read back register |
0308 * TBCTRL - CB1 = input = rising edge = FIRQ |
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset |
0310 * |
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0312 * CRA1 = 1 CA1 Rising edge IRQ |
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0315 * CRA4 = 1 ] CA2 = Set/Reset output |
0316 * CRA5 = 1 ] |
0317 * CRA6 = X CA2 Input Interrupt Flag |
0318 * CRA7 = X CA1 Interrupt Flag |
0319 * |
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0321 * CRB1 = 1 CB1 Rising edge IRQ |
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0324 * CRB4 = 1 ] CB2 = Set/Reset output |
0325 * CRB5 = 1 ] |
0326 * CRB6 = X CB2 Input Interrupt Flag |
0327 * CRB7 = X CB1 Interrupt Flag |
0328 * |
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output |
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output |
0331 * |
0332 TADATA EQU MONIO+$70 Timer preset port |
0333 TACTRL EQU MONIO+$71 |
0334 TBDATA EQU MONIO+$72 Timer read back port |
0335 TBCTRL EQU MONIO+$73 |
0336 * |
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) |
0338 * |
0339 ENDIF TRAOPT |
0339 ENDIF TRAOPT |
0340 IFD ADSOPT |
0341 * |
0342 *************************************************** |
0343 * SERIAL PORT FOR DG640 * |
0344 *************************************************** |
0345 * |
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809 |
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA |
0348 * |
0349 E400 ACIAS EQU MONIO+$400 CONTROL PORT |
0350 * |
0351 ENDIF ADSOPT |
0352 IFD PRTOPT |
0353 * |
0354 *************************************************** |
0355 * PRINTER INTERFACE * |
0356 *************************************************** |
0357 * |
0358 E404 PADATA EQU MONIO+$404 |
0359 E405 PACTRL EQU MONIO+$405 |
0360 E406 PBDATA EQU MONIO+$406 |
0361 E407 PBCTRL EQU MONIO+$407 |
0362 * |
0363 ** CB1 ACK. I/P |
0364 ** CB2 STB. O/P |
0365 ** PB0 - PB7 DATA 1 - 8 O/P |
0366 ** PORT A BIT ASSIGNMENT |
0367 * |
0368 0080 PBUSY EQU $80 I/P |
0369 0040 PEMPTY EQU $40 I/P |
0370 0020 SELECT EQU $20 I/P |
0371 0010 PERROR EQU $10 I/P |
0372 0004 PRESET EQU %00000100 O/P PA3 = 0 |
0373 0008 AUTOFD EQU %00001000 O/P PA2 = 0 |
0374 000C DIRMSK EQU %00001100 |
0375 ENDIF PRTOPT |
0376 IFD DG640OPT |
0377 * |
0378 *************************************************** |
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0380 *************************************************** |
0381 * |
0382 ** VIDEO DISPLAY DEFINITIONS |
0383 * |
0384 E800 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY |
0385 0040 LINLEN EQU 64 LENGTH OF A LINE |
0386 0010 NUMLIN EQU 16 NUMBER OF LINES |
0387 0400 SCNLEN EQU $400 LENGTH OF SCREEN |
0388 ENDIF DG640OPT |
0389 * |
0390 IFD DMAFOPT |
0391 * |
0392 *************************************************** |
0393 * DMAF2 8" DRIVE * |
0394 *************************************************** |
0395 * |
0396 ADDREG EQU $F000 ADDRESS REGISTER |
0397 CNTREG EQU $F002 COUNT REGISTER |
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER |
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER |
0400 AAAREG EQU $F015 ??? |
0401 BBBREG EQU $F016 ??? |
0402 COMREG EQU $F020 1791 COMMAND REGISTER |
0403 SECREG EQU $F022 SECTOR REGISTER |
0404 DRVREG EQU $F024 DRIVE SELECT LATCH |
0405 CCCREG EQU $F040 ??? |
0406 ENDIF DMAFOPT |
0406 ENDIF DMAFOPT |
0407 IFD DATOPT |
0408 ************************************************** |
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS * |
0410 ************************************************** |
0411 * |
0412 IC11 EQU $FFF0 DAT RAM CHIP |
0413 TSTPAT EQU $55AA TEST PATTERN |
0414 ENDIF DATOPT |
0414 ENDIF DATOPT |
0415 * |
0003 END |
0000 INCLUDE "sys09bug.txt" |
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR |
0002 OPT l |
|
|
sys09bug.txt page 2 |
0004 * |
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL |
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY.... |
0007 * |
0008 * ALLEN CLARK WALLACE WATSON |
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE. |
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617 |
0011 * PH. 813-977-0347 PH. 813-985-1359 |
0012 * |
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT |
0014 * 2561 NANTUCKET DR APT. E |
0015 * ATLANTA, GA 30345 |
0016 * PH. 404-320-1043 |
0017 * |
0018 * MODIFIED TO SYS09BUG VER 1.0 |
0019 * FOR: SYSTEM09 FPGA SYSTEM |
0020 * BY: JOHN KENT |
0021 * DATE: 21ST NOVEMBER 2006 |
0022 * REMOVED: DISK BOOTS |
0023 * MEMORY TEST |
0024 * ADDED: ADM3A VDU DRIVER |
0025 * |
0026 * MODIFIED TO SYS09BUG VER 1.1 |
0027 * FOR: SYSTEM09 FPGA SYSTEM |
0028 * BY: JOHN KENT |
0029 * DATE: 7TH JANUARY 2007 |
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000 |
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS |
0032 * AND REALTIME CLOCK |
0033 * |
0034 * MODIFIED TO SYS09BUG VER 1.2 |
0035 * FOR: SYSTEM09 FPGA SYSTEM |
0036 * BY: JOHN KENT |
0037 * DATE: 21ST MAY 2007 |
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION |
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD |
0040 * |
0041 * Modified to SYS09BUG VER 1.3 |
0042 * FOR: SYSTEM09 FPGA SYSTEM |
0043 * BY: JOHN KENT |
0044 * DATE: 8TH JAN 2008 |
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD |
0046 * WITH ONLY 32K OF RAM |
0047 * |
0048 * Modified to SYS09BUG VER 1.4 |
0049 * FOR: SYSTEM09 FPGA SYSTEM |
0050 * BY: JOHN KENT |
0051 * DATE: 3RD FEB 2008 |
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE |
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300 |
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE |
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
0056 * |
0057 * *** COMMANDS *** |
0058 * |
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR |
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR |
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER |
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER |
0063 * CONTROL P = ALTER THE PROGRAM COUNTER |
0064 * CONTROL U = ALTER USER STACK POINTER |
0065 * CONTROL X = ALTER "X" INDEX REGISTER |
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER |
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh |
0068 * D = 5.25" MINIFLOPPY BOOT |
0069 * E ssss-eeee = EXAMINE MEMORY |
0070 * FROM STARTING ADDRESS ssss |
0071 * TO ENDING ADDRESS eeee. |
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI |
0073 * L = LOAD TAPE |
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh |
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. |
0076 * R = DISPLAY REGISTER CONTENTS |
0077 * S = DISPLAY STACK FROM ssss TO $DFC0 |
0078 * U = 8" DMAF2 FLOPPY BOOT |
0079 * U = USER EXTENSION COMMANDS AT $F000 |
0080 * X = REMOVE ALL BREAKPOINTS |
0081 * |
0082 * |
0083 *************************************************** |
0084 * SYS09BUG VARIABLE SPACE |
0085 *************************************************** |
0086 * |
0087 DFC0 ORG MONRAM |
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK |
0089 DFC0 NMI RMB 2 USER NMI VECTOR |
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 |
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 |
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR |
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR |
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR |
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN |
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT |
0097 IFD DATOPT |
0098 LRARAM RMB 16 LRA ADDRESSES |
0099 ENDIF DATOPT |
0099 ENDIF DATOPT |
0100 DFD0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT |
0101 DFD2 ECHO RMB 1 ECHO FLAG |
0102 DFD3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR |
0103 IFD TRAOPT |
0104 NMISAV RMB 2 NMI Jump Vector Backup |
0105 TRACNT RMB 2 Trace Count |
0106 ENDIF TRAOPT |
0106 ENDIF TRAOPT |
0107 IFD VDUOPT |
0108 * |
0109 ************************************************** |
0110 * VDU8 DISPLAY DRIVER VARIABLES * |
0111 ************************************************** |
0112 * |
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** |
0114 COLADX RMB 1 CURSOR COLUMN |
0115 ROWADX RMB 1 CURSOR ROW |
0116 ************************************************** |
0117 * |
0118 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0119 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0120 ENDIF VDUOPT |
0120 ENDIF VDUOPT |
0121 IFD DG640OPT |
0122 * |
0123 *************************************************** |
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0125 *************************************************** |
0126 * |
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** |
0128 DFEB COLADX RMB 1 CURSOR COLUMN |
0129 DFEC ROWADX RMB 1 CURSOR ROW |
0130 ************************************************* |
0131 DFED CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS |
0132 DFEF NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0133 DFF0 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0134 ENDIF DG640OPT |
0135 * |
0136 * |
0137 *************************************************** |
0138 * START OF ROM * |
0139 *************************************************** |
0140 * |
0141 F800 ORG MONROM |
0142 F800 F8 22 FDB MONITOR |
0143 F802 F8 56 FDB NEXTCMD |
0144 F804 FC 66 FDB INCH |
0145 F806 FC 60 FDB INCHE |
0146 F808 FC 75 FDB INCHEK |
0147 F80A FC 83 FDB OUTCH |
0148 F80C FB 58 FDB PDATA |
0149 F80E FA E7 FDB PCRLF |
0150 F810 FA E3 FDB PSTRNG |
0151 F812 FF 06 FDB LRA |
0152 * |
0153 IFD ADSOPT |
0154 F814 FE 47 FDB PCHK CHECK FOR PRINTER INPUT |
0155 F816 FE 09 FDB PINIZ INITIATE PRINTER |
0156 F818 FE 33 FDB POUTCH OUTPUT CH. TO PRINTER |
0157 F81A FC AB FDB VINIZ |
0158 F81C FC C0 FDB VOUTCH |
0159 F81E FC 98 FDB ACINIZ |
0160 F820 FC 85 FDB AOUTCH |
0161 ENDIF ADSOPT |
0162 * |
0163 * MONITOR |
0164 * |
0165 * VECTOR ADDRESS STRING IS..... |
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF |
0167 * |
0168 F822 8E FE 81 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING |
0169 F825 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION |
0170 F829 C6 10 LDB #$10 BYTES TO MOVE = 16 |
0171 F82B A6 80 LOOPA LDA ,X+ GET VECTOR BYTE |
0172 F82D A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF |
0173 F82F 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE |
0174 F830 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED |
0175 * |
0176 * CONTENTS FROM TO FUNCTION |
0177 * $F8A1 $FE40 $DFC0 USER-V |
0178 * $F8A1 $FE42 $DFC2 SWI3-V |
0179 * $F8A1 $FE44 $DFC4 SWI2-V |
0180 * $F8A1 $FE46 $DFC6 FIRQ-V |
0181 * $F8A1 $FE48 $DFC8 IRQ-V |
0182 * $FAB0 $FE4A $DFCA SWI-V |
0183 * $FFFF $FE4C $DFCC SVC-VO |
0184 * $FFFF $FE4E $DFCE SVC-VL |
0185 * |
0186 F832 8E E4 00 LDX #ACIAS |
0187 F835 BF DF D0 STX CPORT STORE ADDR. IN RAM |
0188 F838 17 01 42 LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS |
0189 F83B C6 0C LDB #12 CLEAR 12 BYTES ON STACK |
0190 F83D 6F E2 CLRSTK CLR ,-S |
0191 F83F 5A DECB |
0192 F840 26 FB BNE CLRSTK |
0193 F842 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY |
0194 F845 AF 6A STX 10,S ON STACK |
0195 F847 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK |
0196 F849 A7 E4 STA ,S |
0197 F84B 1F 43 TFR S,U |
0198 F84D 17 04 46 LBSR IOINIZ INITIALIZE CONTROL PORT |
0199 F850 8E FE 91 LDX #MSG1 POINT TO MONITOR MESSAGE |
0200 F853 17 03 02 LBSR PDATA PRINT MSG |
0201 * |
0202 IFD DATOPT |
0203 LDX #LRARAM POINT TO LRA RAM STORAGE AREA |
0204 CLRA START TOTAL AT ZERO |
0205 LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY |
0206 FNDREL TST B,X TEST FOR RAM AT NEXT LOC. |
0207 BEQ RELPAS IF NO RAM GO TO NEXT LOC. |
0208 ADDA #4 ELSE ADD 4K TO TOTAL |
0209 DAA ADJ. TOTAL FOR DECIMAL |
0210 RELPAS DECB SUB. 1 FROM LOCS. TO TEST |
0211 BPL FNDREL PRINT TOTAL OF RAM |
0212 LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0213 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS |
0214 LBSR PDATA PRINT MSG |
0215 ENDIF DATOPT |
0215 ENDIF DATOPT |
0216 * |
0217 IFD TRAOPT |
0218 LBSR TRAINZ |
0219 ENDIF TRAOPT |
0219 ENDIF TRAOPT |
0220 * |
0221 ***** NEXTCMD ***** |
0222 * |
0223 F856 8E FE BA NEXTCMD LDX #MSG3 POINT TO MSG ">" |
0224 F859 17 02 87 LBSR PSTRNG PRINT MSG |
0225 F85C 17 04 07 LBSR INCH GET ONE CHAR. FROM TERMINAL |
0226 F85F 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
0227 F861 81 0D CMPA #$0D IS IT CARRIAGE RETURN ? |
0228 F863 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. |
0229 F865 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM. |
0230 F867 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ? |
0231 F869 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT |
0232 F86B 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO... |
0233 F86D 17 04 13 LBSR OUTCH PRINT "^" |
0234 F870 1F 98 TFR B,A RECALL CNTRL CMD CHAR |
0235 F872 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER |
0236 F874 17 04 0C PRTCMD LBSR OUTCH PRNT CMD CHAR |
0237 F877 17 04 07 LBSR OUT1S PRNT SPACE |
0238 F87A C1 60 CMPB #$60 |
0239 F87C 2F 02 BLE NXTCH0 |
0240 F87E C0 20 SUBB #$20 |
0241 * |
0242 ***** DO TABLE LOOKUP ***** |
0243 * FOR COMMAND FUNCTIONS |
0244 * |
0245 F880 8E FE 4B NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE |
0246 F883 E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
0247 F885 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND |
0248 F887 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
0249 F889 8C FE 81 CMPX #TABEND REACHED END OF TABLE YET ? |
0250 F88C 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY |
0251 F88E 8E FE BC LDX #MSG4 POINT TO MSG "WHAT?" |
0252 F891 17 02 C4 LBSR PDATA PRINT MSG |
0253 F894 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD |
0254 F896 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE |
0255 F898 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND |
0256 * |
0257 * "G" GO OR CONTINUE |
0258 * |
0259 F89A 1F 34 GO TFR U,S |
0260 F89C 3B RTI RTI |
0261 * |
0262 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0263 * |
0264 F89D 17 03 3F MEMCHG LBSR IN1ADR INPUT ADDRESS |
0265 F8A0 29 2D BVS CHRTN IF NOT HEX, RETURN |
0266 F8A2 1F 12 TFR X,Y SAVE ADDR IN "Y" |
0267 F8A4 8E FE C2 MEMC2 LDX #MSG5 POINT TO MSG " - " |
0268 F8A7 17 02 39 LBSR PSTRNG PRINT MSG |
0269 F8AA 1F 21 TFR Y,X FETCH ADDRESS |
0270 F8AC 17 03 79 LBSR OUT4H PRINT ADDR IN HEX |
0271 F8AF 17 03 CF LBSR OUT1S OUTPUT SPACE |
0272 F8B2 A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR. |
0273 F8B4 17 03 79 LBSR OUT2H OUTPUT CONTENTS IN ASCII |
0274 F8B7 17 03 C7 LBSR OUT1S OUTPUT SPACE |
0275 F8BA 17 03 32 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
0276 F8BD 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
0277 F8BF 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
0278 F8C1 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN |
0279 F8C3 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? |
0280 F8C5 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN |
0281 F8C7 81 5E CMPA #'^ IS IT AN UP ARROW? |
0282 F8C9 27 17 BEQ BACK DISPLAY PREVIOUS BYTE |
0283 F8CB 81 0D CMPA #$D IS IT A CR? |
0284 F8CD 26 0F BNE FORWRD DISPLAY NEXT BYTE |
0285 F8CF 39 CHRTN RTS EXIT ROUTINE |
0286 * |
0287 * |
0288 F8D0 A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY |
0289 F8D2 A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE? |
0290 F8D4 27 08 BEQ FORWRD $F972 |
0291 F8D6 17 03 A8 LBSR OUT1S OUTPUT SPACE |
0292 F8D9 86 3F LDA #'? LOAD QUESTION MARK |
0293 F8DB 17 03 A5 LBSR OUTCH PRINT IT |
0294 F8DE 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
0295 F8E0 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS |
0296 F8E2 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION |
0297 F8E4 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS |
0298 * |
0299 * "S" DISPLAY STACK |
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM |
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. |
0302 * |
0303 F8E6 17 02 76 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER |
0304 F8E9 1F 32 TFR U,Y |
0305 F8EB 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT |
0306 F8EE 30 1F LEAX -1,X POINT TO CURRENT STACK |
0307 F8F0 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS |
0308 * |
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII |
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. |
0311 * UPPER ADDRESS IN X-REG. |
0312 * IF HEX ADDRESSES ARE INVALID (V)=1. |
0313 * |
0314 F8F2 17 02 DF MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES |
0315 F8F5 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX |
0316 F8F7 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS |
0317 F8F9 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? |
0318 F8FB 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII |
0319 F8FD 39 EDPRTN RTS ; |
0320 * |
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0322 * TO EVEN 16 BYTE BOUNDRIES. |
0323 * |
0324 * IF LOWER ADDR = $4532 |
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0326 * |
0327 * IF UPPER ADDR = $4567 |
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0329 * |
0330 * ENTER WITH LOWER ADDRESS IN X-REG. |
0331 * -UPPER ADDRESS ON TOP OF STACK. |
0332 * |
0333 F8FE 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
0334 F900 C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS |
0335 F903 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0336 F905 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
0337 F907 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
0338 F909 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0339 F90B 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
0340 F90D AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
0341 F90F 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
0342 F911 17 03 61 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
0343 F914 27 03 BEQ EDUMP |
0344 F916 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
0345 F918 39 RTS ; |
0346 * |
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0349 * |
0350 F919 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
0351 F91B 8E FE C2 LDX #MSG5 POINT TO MSG " - " |
0352 F91E 17 01 C2 LBSR PSTRNG PRINT MSG |
0353 F921 AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
0354 F923 17 03 02 LBSR OUT4H PRINT THE ADDRESS |
0355 F926 17 03 56 LBSR OUT2S 2 SPACES |
0356 F929 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
0357 F92B A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT |
0358 F92D 17 03 00 LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0359 F930 17 03 4E LBSR OUT1S OUTPUT SPACE |
0360 F933 5A DECB $F9D1 DECREMENT BYTE COUNT |
0361 F934 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
0362 * |
0363 * PRINT 16 ASCII CHARACTERS |
0364 * IF NOT PRINTABLE OR NOT VALID |
0365 * ASCII PRINT A PERIOD (.) |
0366 F936 17 03 46 LBSR OUT2S 2 SPACES |
0367 F939 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
0368 F93B C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 |
0369 F93D A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY |
0370 F93F 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
0371 F941 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
0372 F943 81 7E CMPA #$7E IS IT VALID ASCII? |
0373 F945 23 02 BLS PRASC IF SO PRINT IT |
0374 F947 86 2E PERIOD LDA #'. LOAD A PERIOD (.) |
0375 F949 17 03 37 PRASC LBSR OUTCH PRINT ASCII CHARACTER |
0376 F94C 5A DECB DECREMENT COUNT |
0377 F94D 26 EE BNE EDPASC |
0378 F94F 20 BC BRA NXTLIN |
0379 * |
0380 ***** "B" SET BREAKPOINT ***** |
0381 * |
0382 F951 17 02 8B BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS |
0383 F954 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR. |
0384 F956 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 |
0385 F959 24 1A BCC BPERR IF ERROR PRINT (?), EXIT |
0386 F95B 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK |
0387 F95D 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE |
0388 F960 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE |
0389 F962 35 10 PULS X POP BP ADDRESS FROM STACK |
0390 F964 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE |
0391 F966 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS |
0392 F968 81 3F CMPA #$3F IS IT A SWI? |
0393 F96A 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR |
0394 F96C A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE |
0395 F96E AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE |
0396 F970 86 3F LDA #$3F LOAD A SWI ($3F) |
0397 F972 A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS |
0398 F974 39 EXITBP RTS ; |
0399 * |
0400 * INDICATE ERROR SETTING BREAKPOINT |
0401 * |
0402 F975 17 03 09 BPERR LBSR OUT1S OUTPUT SPACE |
0403 F978 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR |
0404 F97A 16 03 06 LBRA OUTCH PRINT "?" |
0405 * |
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** |
0407 * |
0408 F97D 10 8E DF D3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE |
0409 F981 C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0410 F983 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE |
0411 F985 5A DECB $FAAC DECREMENT BP COUNTER |
0412 F986 26 FB BNE XBPLP END OF BREAKPOINT TABLE? |
0413 F988 39 RTS |
0414 * |
0415 ***** SWI ENTRY POINT ***** |
0416 * |
0417 F989 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER |
0418 F98B AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG |
0419 F98D 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE. |
0420 F98F 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE |
0421 F991 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR |
0422 F993 AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK |
0423 F995 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA |
0424 F997 17 02 1C REGPR LBSR REGSTR GO PRINT REGISTERS |
0425 * |
0426 IFD TRAOPT |
0427 LDX #0 |
0428 STX TRACNT |
0429 ENDIF TRAOPT |
0429 ENDIF TRAOPT |
0430 * |
0431 F99A 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND |
0432 * |
0433 F99D AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE |
0434 F99F 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY |
0435 F9A2 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S |
0436 F9A4 A6 84 LDA ,X GET DATA FROM BP ADDRESS |
0437 F9A6 81 3F CMPA #$3F IS IT SWI? |
0438 F9A8 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S |
0439 F9AA A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE |
0440 F9AC A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS |
0441 F9AE 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC |
0442 F9B0 A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S |
0443 F9B2 A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S |
0444 F9B4 A7 A0 STA ,Y+ |
0445 F9B6 39 RTS |
0446 * |
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH ** |
0448 * |
0449 F9B7 10 8E DF D3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE |
0450 F9BB C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0451 F9BD A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE |
0452 F9BF AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? |
0453 F9C1 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY |
0454 F9C3 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER |
0455 F9C4 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH |
0456 F9C6 39 RTS ; |
0457 * |
0458 * |
0459 F9C7 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY |
0460 F9C9 39 RTS |
0461 * |
0462 IFD TRAOPT |
0463 * |
0464 ** TRACE from address AAAA BB bytes |
0465 * |
0466 TRACE LBSR ALTPC1 SET UP NEW PC |
0467 BVS TREXIT ADDRESS ERROR, EXIT |
0468 LBSR OUT1S |
0469 LBSR IN1ADR Fetch Byte Count |
0470 BVS TREXIT Byte Count error, EXIT |
0471 STX TRACNT |
0472 * |
0473 LDX NMI Save NMI Vector |
0474 STX NMISAV |
0475 LDX #NMIE Set up NMI for Tracing |
0476 STX NMI |
0477 LBSR TRAINZ Initialise Hardware |
0478 BRA TRACEG Start Trace |
0479 TREXIT RTS |
0480 * |
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0482 * CRA1 = 1 CA1 Rising edge IRQ |
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0485 * CRA4 = 1 ] CA2 = Set/Reset output |
0486 * CRA5 = 1 ] |
0487 * CRA6 = X CA2 Input Interrupt Flag |
0488 * CRA7 = X CA1 Interrupt Flag |
0489 * |
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0491 * CRB1 = 1 CB1 Rising edge IRQ |
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0494 * CRB4 = 1 ] CB2 = Set/Reset output |
0495 * CRB5 = 1 ] |
0496 * CRB6 = X CB2 Input Interrupt Flag |
0497 * CRB7 = X CB1 Interrupt Flag |
0498 * |
0499 * |
0500 ** TRACE NMI ENTRY POINT |
0501 * |
0502 NMIE TFR S,U |
0503 LDA #$36 Disable Interrupt, CA2 Low |
0504 STA TACTRL |
0505 LDA TADATA Clear Interrupt flag by reading data port |
0506 * |
0507 LBSR REGSTR DUMP REGISTERS |
0508 * |
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI |
0510 LDA ,X |
0511 CMPA #$3F |
0512 BEQ TRACEX EXIT ON SWI |
0513 * |
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED |
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR |
0516 LEAX -1,X DECREMENT TRACE COUNT |
0517 STX TRACNT |
0518 * |
0519 ** TRACE GO (RESUME SINGLE STEP) |
0520 * |
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER |
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) |
0523 STA TADATA |
0524 LDA #$36 LOAD STROBE LOW |
0525 STA TACTRL |
0526 LDA TADATA CLEAR INTERRUPT |
0527 LDA #$36 RELEASE RESET |
0528 STA TBCTRL |
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE |
0530 STA TACTRL |
0531 RTI GO EXECUTE INSTRUCTION |
0532 * |
0533 TRACEX LDX NMISAV Restore NMI vector |
0534 STX NMI |
0535 LBRA NEXTCMD Jump back to the command loop. |
0536 * |
0537 ** TRACE HARDWARE INITIALISATION |
0538 * |
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED |
0540 STA TACTRL |
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED |
0542 STA TBCTRL |
0543 LDA #$FF PORTA = OUTPUT |
0544 STA TADATA |
0545 LDA #$00 PORTB = INPUT |
0546 STA TBDATA |
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW |
0548 STA TACTRL |
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH |
0550 STA TBCTRL |
0551 RTS |
0552 * |
0553 ENDIF TRAOPT |
0553 ENDIF TRAOPT |
0554 IFD MFDCOPT |
0555 * |
0556 ** "U" MINI DISK BOOT |
0557 * |
0558 F9CA 7D E0 18 MINBOOT TST CMDFDC |
0559 F9CD 7F E0 14 CLR DRVFDC |
0560 F9D0 8E 00 00 LDX #$0000 |
0561 F9D3 30 01 LOOP LEAX $01,X |
0562 F9D5 8C 00 00 CMPX #$0000 |
0563 F9D8 26 F9 BNE LOOP |
0564 F9DA 86 0F LDA #$0F |
0565 F9DC B7 E0 18 STA CMDFDC |
0566 F9DF 8D 37 BSR DELAY |
0567 F9E1 F6 E0 18 LOOP1 LDB CMDFDC |
0568 F9E4 C5 01 BITB #$01 |
0569 F9E6 26 F9 BNE LOOP1 |
0570 F9E8 86 01 LDA #$01 |
0571 F9EA B7 E0 1A STA SECFDC |
0572 F9ED 8D 29 BSR DELAY |
0573 F9EF 86 8C LDA #$8C |
0574 F9F1 B7 E0 18 STA CMDFDC |
0575 F9F4 8D 22 BSR DELAY |
0576 F9F6 8E C0 00 LDX #$C000 |
0577 F9F9 20 09 BRA LOOP3 |
0578 F9FB C5 02 LOOP2 BITB #$02 |
0579 F9FD 27 05 BEQ LOOP3 |
0580 F9FF B6 E0 1B LDA DATFDC |
0581 FA02 A7 80 STA ,X+ |
0582 FA04 F6 E0 18 LOOP3 LDB CMDFDC |
0583 FA07 C5 01 BITB #$01 |
0584 FA09 26 F0 BNE LOOP2 |
0585 FA0B C5 2C BITB #$2C |
0586 FA0D 27 01 BEQ LOOP4 |
0587 FA0F 39 RTS |
0588 * |
0589 FA10 8E C0 00 LOOP4 LDX #$C000 |
0590 FA13 AF 4A STX $0A,U |
0591 FA15 1F 34 TFR U,S |
0592 FA17 3B RTI |
0593 * |
0594 FA18 C6 04 DELAY LDB #$04 |
0595 FA1A 5A LOOP5 DECB |
0596 FA1B 26 FD BNE LOOP5 |
0597 FA1D 39 RTS |
0598 ENDIF MFDCOPT |
0599 * |
0600 IFD DMAFOPT |
0601 * |
0602 *** "D" DISK BOOT FOR DMAF2 *** |
0603 * |
0604 DBOOT LDA #$DE |
0605 STA DRVREG |
0606 LDA #$FF |
0607 STA PRIREG $FAF8 |
0608 STA CCREG |
0609 STA AAAREG |
0610 STA BBBREG |
0611 TST CCREG |
0612 LDA #$D8 |
0613 STA COMREG |
0614 LBSR DLY |
0615 DBOOT0 LDA COMREG |
0616 BMI DBOOT0 |
0617 LDA #$09 |
0618 STA COMREG |
0619 LBSR DLY |
0620 * |
0621 DISKWT LDA COMREG FETCH DRIVE STATUS |
0622 BITA #1 TEST BUSY BIT |
0623 BNE DISKWT LOOP UNTIL NOT BUSY |
0624 * |
0625 BITA #$10 |
0626 BNE DBOOT |
0627 * |
0628 LDX #$C000 LOGICAL ADDR. = $C000 |
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. |
0630 ORA #$10 |
0631 STA CCCREG |
0632 TFR X,D |
0633 COMA ; |
0634 COMB ; |
0635 STD ADDREG |
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100 |
0637 STX CNTREG STORE IN COUNT REGISTER |
0638 LDA #$FF LOAD THE CHANNEL REGISTER |
0639 STA CCREG |
0640 LDA #$FE SET CHANNEL 0 |
0641 STA PRIREG |
0642 LDA #1 SET SECTOR TO "1" |
0643 STA SECREG ISSUE COMMAND |
0644 LDA #$8C SET SINGLE SECTOR READ |
0645 STA COMREG ISSUE COMMAND |
0646 BSR DLY |
0647 * |
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE |
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT |
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7" |
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT |
0652 * IS STILL A ONE THE BOOT OPERATION WILL |
0653 * BE STARTED OVER FROM THE BEGINING. |
0654 * |
0655 CLRB ; |
0656 DBOOT1 PSHS B $FB55 |
0657 CLRB ; |
0658 DBOOT2 TST CCREG |
0659 BPL DBOOT3 |
0660 DECB ; |
0661 BNE DBOOT2 |
0662 PULS B |
0663 DECB |
0664 BNE DBOOT1 |
0665 BRA DBOOT |
0666 DBOOT3 PULS B |
0667 LDA COMREG |
0668 BITA #$1C |
0669 BEQ DBOOT4 |
0670 RTS ; |
0671 * |
0672 * |
0673 DBOOT4 LDB #$DE |
0674 STB DRVREG |
0675 LDX #$C000 |
0676 STX 10,U |
0677 TFR U,S $FB7B |
0678 RTI ; |
0679 ENDIF DMAFOPT |
0679 ENDIF DMAFOPT |
0680 * |
0681 IFD CF8OPT |
0682 * |
0683 * COMPACT FLASH BOOT |
0684 * |
0685 CFBOOT BSR WAITRDY |
0686 LDA #HEADLBA |
0687 STA CF_HEAD |
0688 BSR WAITRDY |
0689 LDA #FEAT8BIT |
0690 STA CF_FEATURE |
0691 LDA #CMDFEATURE |
0692 STA CF_COMAND |
0693 BSR WAITRDY |
0694 * |
0695 * READ SECTORS FROM CF |
0696 * |
0697 CFREAD LDA #$01 |
0698 STA CF_SECCNT |
0699 CLRA |
0700 STA CF_SECNUM |
0701 STA CF_CYLLO |
0702 STA CF_CYLHI |
0703 * |
0704 LDA #CMDREAD ; IDE READ MULTIPLE |
0705 STA CF_COMAND |
0706 BSR WAITRDY |
0707 LDX #$C000 |
0708 * |
0709 * READ LOOP |
0710 * |
0711 RDLOOP BSR WAITDRQ |
0712 LDA CF_DATA |
0713 STA ,X+ |
0714 CMPX #$C200 |
0715 BNE RDLOOP |
0716 * |
0717 LDX #$C000 |
0718 STX $0A,U |
0719 TFR U,S |
0720 RTI |
0721 * |
0722 * WAIT UNTIL READY |
0723 * |
0724 WAITRDY LDA CF_STATUS |
0725 BITA #BUSY |
0726 BNE WAITRDY |
0727 LDA CF_STATUS |
0728 BITA #DRDY |
0729 BEQ WAITRDY |
0730 RTS |
0731 * |
0732 * WAIT FOR DATA REQUEST |
0733 * |
0734 WAITDRQ LDA CF_STATUS |
0735 BITA #DRQ |
0736 BEQ WAITDRQ |
0737 RTS |
0738 ENDIF CF8OPT |
0738 ENDIF CF8OPT |
0739 * |
0740 IFD IDEOPT |
0741 * |
0742 * XESS 16 BIT IDE BOOT |
0743 * |
0744 IDEBOOT LDD #AUXRESET |
0745 STD CF_AUX |
0746 LDD #AUXRSTREL |
0747 STD CF_AUX |
0748 LDD #HEADLBA |
0749 STD CF_HEAD |
0750 BSR WAITRDY |
0751 * |
0752 * READ SECTORS FROM CF |
0753 * |
0754 LDD #$01 |
0755 STD CF_SECCNT |
0756 CLRB |
0757 STD CF_SECNUM |
0758 STD CF_CYLLO |
0759 STD CF_CYLHI |
0760 * |
0761 LDB #CMDREAD ; IDE READ MULTIPLE |
0762 STD CF_COMAND |
0763 BSR WAITRDY |
0764 LDX #$C000 |
0765 * |
0766 * READ LOOP |
0767 * |
0768 RDLOOP BSR WAITDRQ |
0769 LDD CF_DATA |
0770 STB ,X+ |
0771 CMPX #$C100 |
0772 BNE RDLOOP |
0773 * |
0774 LDX #$C000 |
0775 STX $0A,U |
0776 TFR U,S |
0777 RTI |
0778 * |
0779 * WAIT UNTIL READY |
0780 * |
0781 WAITRDY LDD CF_STATUS |
0782 BITB #BUSY |
0783 BNE WAITRDY |
0784 LDD CF_STATUS |
0785 BITB #DRDY |
0786 BEQ WAITRDY |
0787 RTS |
0788 * |
0789 * WAIT FOR DATA REQUEST |
0790 * |
0791 WAITDRQ LDD CF_STATUS |
0792 BITB #DRQ |
0793 BEQ WAITDRQ |
0794 RTS |
0795 ENDIF IDEOPT |
0795 ENDIF IDEOPT |
0796 * |
0797 IFD RTCOPT |
0798 * |
0799 * CLOCK INTER FACE UTILITY |
0800 * |
0801 * TIME <Hours> <Minuits> <Seconds> |
0802 * If no argument is specified, the current time |
0803 * will be displayed. |
0804 * |
0805 * READ A REGISTER FROM THE COUNTER. |
0806 * The X Index rgister points to the register |
0807 * to be read. The Status Register is checked |
0808 * before and after the register is read before |
0809 * returning a value in accumulator A |
0810 * |
0811 RDCLK TST CLKSTA |
0812 BNE RDCLK |
0813 RDCLK1 LDA 0,X |
0814 TST CLKSTA |
0815 BNE RDCLK1 |
0816 RTS |
0817 * |
0818 * MAIN PROGRAM: |
0819 * |
0820 TIMSET LDX #COUNTR POINT TO TIMER |
0821 LBSR BYTE READ HOURS |
0822 BVS SHOWTM NO ARG, DISP TIME |
0823 STA HOUR,X |
0824 LBSR OUT1S |
0825 LBSR BYTE READ MINUITES |
0826 BVS SHOWTM |
0827 STA MINUIT,X |
0828 LBSR OUT1S |
0829 LBSR BYTE SECONDS. |
0830 BVS SHOWTM |
0831 STA SECOND,X |
0832 * |
0833 * DISPLAY CURRENT TIME |
0834 * |
0835 SHOWTM LBSR PCRLF |
0836 LDX #COUNTR+HOUR |
0837 LDB #3 |
0838 SHOWLP BSR RDCLK |
0839 LBSR OUT2H |
0840 LDA #': |
0841 LBSR OUTCH |
0842 LEAX -1,X |
0843 DECB |
0844 BNE SHOWLP |
0845 RTS |
0846 * |
0847 * INITIATE CLOCK. |
0848 * MASK INTERRUPTS. |
0849 * |
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS |
0851 TST CINTSR CLEAR ANY INTERRUPTS |
0852 RTS |
0853 ENDIF RTCOPT |
0853 ENDIF RTCOPT |
0854 IFD DATOPT |
0855 * |
0856 ***** LRA LOAD REAL ADDRESS ***** |
0857 * |
0858 * THE FOLLOWING CODE LOADS THE 20-BIT |
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE |
0860 * INTO THE "A" AND "X" REGISTERS. THIS |
0861 * ROUTINE IS ENTERED WITH THE LOGICAL |
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX" |
0863 * REGISTER. EXIT IS MADE WITH THE HIGH- |
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL |
0865 * ADDRESS IN THE "A" REGISTER, AND THE |
0866 * LOW-ORDER 16-BITS OF THE 20-BIT |
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER. |
0868 * ALL OTHER REGISTERS ARE PRESERVED. |
0869 * THIS ROUTINE IS REQUIRED SINCE THE |
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST |
0871 * PRESENT PHYSICAL ADDRESSES ON THE |
0872 * SYSTEM BUS. |
0873 * |
0874 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK |
0875 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK |
0876 LSRA ; |
0877 LSRA ADJ FOR INDEXED INTO |
0878 LSRA CORRESPONDING LOCATION |
0879 LSRA IN LRA TABLE |
0880 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS |
0881 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE |
0882 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED |
0883 LSRB PHYSICAL ADDRESS. |
0884 LSRB EXTENDED MS 4-BITS ARE RETURNED |
0885 LSRB IN THE "A" ACCUMULATOR |
0886 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK |
0887 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE |
0888 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG |
0889 ASLB ADJ DATA FOR RELOCATION IN X REG |
0890 ASLB ; |
0891 ASLB $FB97 |
0892 ASLB ; |
0893 LDA 2,S GET MS BYTE OF LOGICAL ADDR. |
0894 ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS |
0895 STA 2,S SAVE IT IN X REG ON STACK |
0896 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. |
0897 * |
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS |
0899 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG |
0900 * ON STACK |
0901 PULS A,B,X,Y,PC POP REGS. FROM STACK |
0902 ENDIF DATOPT |
0902 ENDIF DATOPT |
0903 * |
0904 * DELAY LOOP |
0905 * |
0906 FA1E 34 04 DLY PSHS B SAVE CONTENTS OF "B" |
0907 FA20 C6 20 LDB #$20 GET LOOP DELAY VALUE |
0908 FA22 5A SUB1 DECB SUBTRACT ONE FROM VALUE |
0909 FA23 26 FD BNE SUB1 LOOP UNTIL ZERO |
0910 FA25 35 84 PULS B,PC RESTORE CONTENTS OF "B" |
0911 * RTS ; |
0912 * |
0913 ***** "L" LOAD MIKBUG TAPE ***** |
0914 * |
0915 FA27 BD FC 98 LOAD JSR ACINIZ |
0916 FA2A 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE |
0917 FA2C 17 02 54 LBSR OUTCH OUTPUT IT TO TERMINAL PORT |
0918 FA2F 7F DF D2 CLR ECHO TURN OFF ECHO FLAG |
0919 FA32 17 02 26 LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO |
0920 FA35 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? |
0921 FA37 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. |
0922 FA39 17 02 1F LBSR ECHON |
0923 FA3C 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ? |
0924 FA3E 27 3D BEQ LOAD21 IF SO, EXIT LOAD |
0925 FA40 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? |
0926 FA42 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR. |
0927 FA44 17 01 A8 LBSR BYTE INPUT BYTE COUNT |
0928 FA47 34 02 PSHS A PUSH COUNT ON STACK |
0929 FA49 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX |
0930 FA4B 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS |
0931 FA4E 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX |
0932 FA50 34 10 PSHS X PUSH ADDR ON STACK |
0933 FA52 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE |
0934 FA54 EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM |
0935 FA56 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM |
0936 FA58 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS |
0937 FA5A 6A E4 DEC ,S ADDRESS BYTES. |
0938 FA5C 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK |
0939 FA5E 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) |
0940 FA61 35 04 PULS B POP CHECKSUM FROM STACK |
0941 FA63 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX |
0942 FA65 34 02 PSHS A PUSH DATA BYTE ON STACK |
0943 FA67 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK |
0944 FA69 6A E4 DEC ,S DECREMENT BYTE COUNT 1 |
0945 FA6B 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM |
0946 FA6D A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY |
0947 FA6F 20 EB BRA LOAD10 GET NEXT DATA BYTE |
0948 FA71 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; |
0949 FA72 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) |
0950 FA74 C1 FF CMPB #$FF CHECKSUM OK? |
0951 FA76 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE |
0952 FA78 86 3F LDA #'? LOAD (?) ERROR INDICATOR |
0953 FA7A 17 02 06 LBSR OUTCH OUTPUT IT TO TERMINAL |
0954 FA7D 73 DF D2 LOAD21 COM ECHO TURN ECHO ON |
0955 FA80 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE |
0956 FA82 16 01 FE LBRA OUTCH OUTPUT IT |
0957 * |
0958 ***** "P" PUNCH MIKBUG TAPE ***** |
0959 * |
0960 FA85 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK |
0961 FA87 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS |
0962 FA8A 34 30 PSHS X,Y SAVE ADDRESSES ON STACK |
0963 FA8C 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH |
0964 FA8E AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR |
0965 FA90 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH |
0966 FA92 30 01 LEAX 1,X INCREMENT END ADDRESS |
0967 FA94 AF E4 STX ,S STORE END ADDR ON STACK |
0968 FA96 BD FC 98 JSR ACINIZ |
0969 FA99 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE |
0970 FA9B 17 01 E5 LBSR OUTCH OUTPUT IT TO TERMINAL |
0971 FA9E EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC |
0972 FAA0 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END |
0973 FAA2 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT |
0974 FAA4 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES? |
0975 FAA8 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES |
0976 FAAA C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. |
0977 FAAC E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT |
0978 FAAE 8E FF 03 LDX #MSG20 POINT TO MSG "S1" |
0979 FAB1 17 00 2F LBSR PSTRNG PRINT MSG |
0980 FAB4 CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT |
0981 FAB6 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH |
0982 FAB8 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT |
0983 FABB AE 62 LDX 2,S LOAD BEGIN ADDRESS |
0984 FABD 17 01 68 LBSR OUT4H PUNCH ADDRESS |
0985 FAC0 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM |
0986 FAC2 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM |
0987 FAC4 EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM |
0988 FAC6 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH |
0989 FAC8 17 01 65 LBSR OUT2H OUTPUT DATA BYTE |
0990 FACB 6A 64 DEC 4,S DECREMENT BYTE COUNT |
0991 FACD 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE |
0992 FACF 53 COMB 1's COMPLIMENT CHECKSUM BYTE |
0993 FAD0 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH |
0994 FAD2 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE |
0995 FAD5 AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR |
0996 FAD7 AC E4 CMPX ,S COMPARE IT TO END ADDR |
0997 FAD9 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. |
0998 FADB 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE |
0999 FADD 17 01 A3 LBSR OUTCH OUTPUT IT |
1000 FAE0 32 65 LEAS 5,S READJUST STACK POINTER |
1001 FAE2 39 RTS ; |
1002 * |
1003 * PRINT STRING PRECEEDED BY A CR & LF. |
1004 * |
1005 FAE3 8D 02 PSTRNG BSR PCRLF PRINT CR/LF |
1006 FAE5 20 71 BRA PDATA PRINT STRING POINTED TO BY IX |
1007 * |
1008 * PCRLF |
1009 * |
1010 FAE7 34 10 PCRLF PSHS X SAVE IX |
1011 FAE9 8E FE B4 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
1012 FAEC 17 00 69 LBSR PDATA PRINT MSG |
1013 FAEF 35 90 PULS X,PC RESTORE IX & RETURN |
1014 * |
1015 * LONG BRANCHES TO COMMON ROUTINES |
1016 * |
1017 FAF1 16 01 8D JOUT1S LBRA OUT1S |
1018 FAF4 16 00 F8 JBYTE LBRA BYTE |
1019 FAF7 16 00 E5 JIN1ADR LBRA IN1ADR |
1020 * |
1021 * ALTER "PC" PROGRAM COUNTER |
1022 * |
1023 FAFA 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " |
1024 FAFD 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE |
1025 FAFF 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC" |
1026 FB01 29 02 BVS ALTPCD EXIT IF INVALID HEX |
1027 FB03 AF 4A STX 10,U POKE IN NEW CONTENTS |
1028 FB05 39 ALTPCD RTS ; |
1029 * |
1030 * ALTER "U" USER STACK POINTER |
1031 * |
1032 FB06 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = " |
1033 FB08 8D E7 BSR JOUT1S OUTPUT SPACE |
1034 FB0A 8D EB BSR JIN1ADR |
1035 FB0C 29 02 BVS ALTUD |
1036 FB0E AF 48 STX 8,U |
1037 FB10 39 ALTUD RTS ; |
1038 * |
1039 * ALTER "Y" INDEX REGISTER |
1040 * |
1041 FB11 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = " |
1042 FB13 8D DC BSR JOUT1S OUTPUT SPACE |
1043 FB15 8D E0 BSR JIN1ADR |
1044 FB17 29 02 BVS ALTYD |
1045 FB19 AF 46 STX 6,U $F8F0 |
1046 FB1B 39 ALTYD RTS ; |
1047 * |
1048 * ALTER "X" INDEX REGISTER |
1049 * |
1050 FB1C 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " |
1051 FB1E 8D D1 BSR JOUT1S OUTPUT SPACE |
1052 FB20 8D D5 BSR JIN1ADR |
1053 FB22 29 02 BVS ALTXD |
1054 FB24 AF 44 STX 4,U |
1055 FB26 39 ALTXD RTS ; |
1056 * |
1057 * ALTER "DP" DIRECT PAGE REGISTER |
1058 * |
1059 FB27 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " |
1060 FB29 8D C6 BSR JOUT1S OUTPUT SPACE |
1061 FB2B 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1062 FB2D 29 02 BVS ALTDPD |
1063 FB2F A7 43 STA 3,U |
1064 FB31 39 ALTDPD RTS ; |
1065 * |
1066 * ALTER "B" ACCUMULATOR |
1067 * |
1068 FB32 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = " |
1069 FB34 8D BB BSR JOUT1S OUTPUT SPACE |
1070 FB36 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1071 FB38 29 02 BVS ALTBD |
1072 FB3A A7 42 STA 2,U |
1073 FB3C 39 ALTBD RTS $F91C |
1074 * |
1075 * ALTER "A" ACCUMULATOR |
1076 * |
1077 FB3D 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = " |
1078 FB3F 8D B0 BSR JOUT1S OUTPUT SPACE |
1079 FB41 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1080 FB43 29 02 BVS ALTAD |
1081 FB45 A7 41 STA 1,U |
1082 FB47 39 ALTAD RTS ; |
1083 * |
1084 * ALTER "CC" REGISTER |
1085 * |
1086 FB48 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " |
1087 FB4A 8D A5 BSR JOUT1S OUTPUT SPACE |
1088 FB4C 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1089 FB4E 29 04 BVS ALTCCD |
1090 FB50 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST |
1091 FB52 A7 C4 STA ,U |
1092 FB54 39 ALTCCD RTS ; |
1093 * |
1094 * PDATA |
1095 * |
1096 FB55 17 01 2B PRINT LBSR OUTCH |
1097 FB58 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
1098 FB5A 81 04 CMPA #4 IS IT EOT? |
1099 FB5C 26 F7 BNE PRINT IF NOT EOT PRINT IT |
1100 FB5E 39 RTS ; |
1101 * |
1102 * PRINT REGISTERS |
1103 * |
1104 FB5F 8E FE C6 PRTSP LDX #MSG10 POINT TO MSG "SP=" |
1105 FB62 8D F4 BSR PDATA PRINT MSG |
1106 FB64 1F 31 TFR U,X |
1107 FB66 16 00 BF JOUT4H LBRA OUT4H |
1108 * |
1109 FB69 8E FE D2 PRTUS LDX #MSG12 POINT TO MSG "US=" |
1110 FB6C 8D EA BSR PDATA PRINT MSG |
1111 FB6E AE 48 LDX 8,U |
1112 FB70 20 F4 BRA JOUT4H |
1113 * |
1114 FB72 8E FE E4 PRTDP LDX #MSG15 POINT TO MSG "DP=" |
1115 FB75 8D E1 BSR PDATA PRINT MSG |
1116 FB77 A6 43 LDA 3,U |
1117 FB79 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII |
1118 * |
1119 FB7C 8E FE DE PRTIX LDX #MSG14 POINT TO MSG "IX=" |
1120 FB7F 8D D7 BSR PDATA PRINT MSG |
1121 FB81 AE 44 LDX 4,U $FCE6 |
1122 FB83 20 E1 BRA JOUT4H |
1123 * |
1124 FB85 8E FE D8 PRTIY LDX #MSG13 POINT TO MSG "IY=" |
1125 FB88 8D CE BSR PDATA PRINT MSG |
1126 FB8A AE 46 LDX 6,U |
1127 FB8C 20 D8 BRA JOUT4H |
1128 * |
1129 FB8E 8E FE CC PRTPC LDX #MSG11 POINT TO MSG "PC=" |
1130 FB91 8D C5 BSR PDATA PRINT MSG |
1131 FB93 AE 4A LDX 10,U |
1132 FB95 20 CF BRA JOUT4H |
1133 * |
1134 FB97 8E FE EA PRTA LDX #MSG16 POINT TO MSG "A=" |
1135 FB9A 8D BC BSR PDATA PRINT MSG |
1136 FB9C A6 41 LDA 1,U |
1137 FB9E 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1138 * |
1139 FBA0 8E FE EF PRTB LDX #MSG17 POINT TO MSG "B=" |
1140 FBA3 8D B3 BSR PDATA PRINT MSG |
1141 FBA5 A6 42 LDA 2,U |
1142 FBA7 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1143 * |
1144 FBA9 8E FE F4 PRTCC LDX #MSG18 POINT TO MSG "CC:" |
1145 FBAC 8D AA BSR PDATA PRINT MSG |
1146 FBAE A6 C4 LDA ,U |
1147 FBB0 8E FE FB LDX #MSG19 POINT TO MSG "EFHINZVC" |
1148 FBB3 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT |
1149 * |
1150 * "R" DISPLAY REGISTERS |
1151 * |
1152 FBB6 8E FE C2 REGSTR LDX #MSG5 POINT TO MSG " - " |
1153 FBB9 17 FF 27 LBSR PSTRNG PRINT MSG |
1154 FBBC 8D A1 BSR PRTSP $FCBF |
1155 FBBE 8D A9 BSR PRTUS $FCCA |
1156 FBC0 8D B0 BSR PRTDP $FCD5 |
1157 FBC2 8D B8 BSR PRTIX $FCE0 |
1158 FBC4 8D BF BSR PRTIY $FCEB |
1159 FBC6 8E FE C2 LDX #MSG5 POINT TO MSG " - " |
1160 FBC9 17 FF 17 LBSR PSTRNG PRINT MSG |
1161 FBCC 8D C0 BSR PRTPC $FCF5 |
1162 FBCE 8D C7 BSR PRTA $FCFF |
1163 FBD0 8D CE BSR PRTB $FD09 |
1164 FBD2 20 D5 BRA PRTCC $FD13 |
1165 * |
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. |
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". |
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT |
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX |
1171 * ADDRESS IS INPUT. |
1172 * |
1173 FBD4 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS |
1174 FBD6 29 4D BVS NOTHEX EXIT IF NOT VALID HEX |
1175 FBD8 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY" |
1176 FBDA 86 2D LDA #'- |
1177 FBDC 17 00 A4 LBSR OUTCH PRINT " - " |
1178 * |
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
1182 * |
1183 FBDF 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) |
1184 FBE1 29 42 BVS NOTHEX EXIT IF NOT VALID HEX |
1185 FBE3 1F 01 TFR D,X |
1186 FBE5 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) |
1187 FBE7 29 3C BVS NOTHEX |
1188 FBE9 34 10 PSHS X |
1189 FBEB A7 61 STA 1,S |
1190 FBED 35 90 PULS X,PC |
1191 * |
1192 ***** INPUT BYTE (2 HEX CHAR.) ***** |
1193 * |
1194 FBEF 8D 11 BYTE BSR INHEX GET HEX LEFT |
1195 FBF1 29 32 BVS NOTHEX EXIT IF NOT VALID HEX |
1196 FBF3 48 ASLA ; |
1197 FBF4 48 ASLA ; |
1198 FBF5 48 ASLA ; SHIFT INTO LEFT NIBBLE |
1199 FBF6 48 ASLA ; |
1200 FBF7 1F 89 TFR A,B PUT HEXL IN "B" |
1201 FBF9 8D 07 BSR INHEX GET HEX RIGHT |
1202 FBFB 29 28 BVS NOTHEX EXIT IF NOT VALID HEX |
1203 FBFD 34 04 PSHS B PUSH HEXL ON STACK |
1204 FBFF AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
1205 FC01 39 RTS RETURN WITH HEX L&R IN "A" |
1206 * |
1207 * |
1208 FC02 8D 57 INHEX BSR ECHON INPUT ASCII CHAR. |
1209 FC04 81 30 CMPA #'0 IS IT > OR = "0" ? |
1210 FC06 25 1D BCS NOTHEX IF LESS IT AIN'T HEX |
1211 FC08 81 39 CMPA #'9 IS IT < OR = "9" ? |
1212 FC0A 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA |
1213 FC0C 80 30 SUBA #$30 ASCII ADJ. NUMERIC |
1214 FC0E 39 RTS ; |
1215 * |
1216 * |
1217 FC0F 81 41 INHEXA CMPA #'A IS IT > OR = "A" |
1218 FC11 25 12 BCS NOTHEX IF LESS IT AIN'T HEX |
1219 FC13 81 46 CMPA #'F IS IT < OR = "F" ? |
1220 FC15 22 03 BHI INHEXL IF > IT AIN'T HEX |
1221 FC17 80 37 SUBA #$37 ASCII ADJ. ALPHA |
1222 FC19 39 RTS ; |
1223 * |
1224 FC1A 81 61 INHEXL CMPA #'a IS IT > OR = "a" |
1225 FC1C 25 07 BCS NOTHEX IF LESS IT AIN'T HEX |
1226 FC1E 81 66 CMPA #'f IS IT < "f" |
1227 FC20 22 03 BHI NOTHEX IF > IT AIN'T HEX |
1228 FC22 80 57 SUBA #$57 ADJUST TO LOWER CASE |
1229 FC24 39 RTS ; |
1230 * |
1231 * |
1232 FC25 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
1233 FC27 39 RTS ; |
1234 * |
1235 * |
1236 FC28 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK |
1237 FC2A 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. |
1238 FC2C 8D 02 BSR OUTHL OUTPUT HEX LEFT |
1239 FC2E 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. |
1240 FC30 OUTHL EQU * |
1241 FC30 34 02 OUT2H PSHS A SAVE IT BACK ON STACK |
1242 FC32 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
1243 FC33 44 LSRA ; |
1244 FC34 44 LSRA ; |
1245 FC35 44 LSRA ; |
1246 FC36 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII |
1247 FC38 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
1248 FC3A 84 0F ANDA #$0F STRIP LEFT NIBBLE |
1249 FC3C 8B 30 XASCII ADDA #$30 ASCII ADJ |
1250 FC3E 81 39 CMPA #$39 IS IT < OR = "9" ? |
1251 FC40 2F 02 BLE OUTC IF LESS, OUTPUT IT |
1252 FC42 8B 07 ADDA #7 IF > MAKE ASCII LETTER |
1253 FC44 20 3D OUTC BRA OUTCH OUTPUT CHAR |
1254 * |
1255 * BINARY / ASCII --- THIS ROUTINE |
1256 * OUTPUTS A BYTE IN ENHANCED |
1257 * BINARY FORMAT. THE ENHANCEMENT |
1258 * IS DONE BY SUBSTITUTING ASCII |
1259 * LETTERS FOR THE ONES IN THE BYTE. |
1260 * THE ASCII ENHANCEMENT LETTERS |
1261 * ARE OBTAINED FROM THE STRING |
1262 * POINTED TO BY THE INDEX REG. "X". |
1263 * |
1264 FC46 34 02 BIASCI PSHS A SAVE "A" ON STACK |
1265 FC48 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE |
1266 FC4A A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING |
1267 FC4C 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 |
1268 FC4E 25 02 BCS PRTBA IF ONE PRINT LETTER |
1269 FC50 86 2D LDA #'- IF ZERO PRINT "-" |
1270 FC52 8D 2F PRTBA BSR OUTCH PRINT IT |
1271 FC54 8D 2B BSR OUT1S PRINT SPACE |
1272 FC56 5A DECB SUB 1 FROM #BITS YET TO PRINT |
1273 FC57 26 F1 BNE OUTBA |
1274 FC59 35 82 PULS A,PC |
1275 * |
1276 IFD EXTOPT |
1277 * |
1278 * EXTENDED USER COMMANDS |
1279 * |
1280 USRCMD JMP [MONEXT+EXTCMD] |
1281 ENDIF EXTOPT |
1281 ENDIF EXTOPT |
1282 * |
1283 * |
1284 FC5B 7D DF D2 ECHON TST ECHO IS ECHO REQUIRED ? |
1285 FC5E 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR |
1286 * |
1287 * INCHE |
1288 * |
1289 * ---GETS CHARACTER FROM TERMINAL AND |
1290 * ECHOS SAME. THE CHARACTER IS RETURNED |
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY |
1292 * BIT MASKED OFF. ALL OTHER REGISTERS |
1293 * ARE PRESERVED. |
1294 * |
1295 FC60 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL |
1296 FC62 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
1297 FC64 20 1D BRA OUTCH ECHO CHAR TO TERMINAL |
1298 * |
1299 * INCH |
1300 * |
1301 * GET CHARACTER FROM TERMINAL. RETURN |
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
1304 * IS 8 BITS AND IS NOT ECHOED. |
1305 * |
1306 * |
1307 FC66 34 10 INCH PSHS X SAVE IX |
1308 FC68 BE DF D0 GETSTA LDX CPORT POINT TO TERMINAL PORT |
1309 FC6B A6 84 LDA ,X FETCH PORT STATUS |
1310 FC6D 85 01 BITA #1 TEST READY BIT, RDRF ? |
1311 IFD PS2OPT |
1312 BNE GETST1 |
1313 LDX #PS2KBD |
1314 LDA ,X |
1315 BITA #1 |
1316 ENDIF PS2OPT |
1316 ENDIF PS2OPT |
1317 FC6F 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
1318 FC71 A6 01 GETST1 LDA 1,X FETCH CHAR |
1319 FC73 35 90 PULS X,PC RESTORE IX |
1320 * |
1321 * INCHEK |
1322 * |
1323 * CHECK FOR A CHARACTER AVAILABLE FROM |
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
1325 * FOR READ READY. ALL REGISTERS ARE |
1326 * PRESERVED, AND THE "Z" BIT WILL BE |
1327 * CLEAR IF A CHARACTER CAN BE READ. |
1328 * |
1329 * |
1330 FC75 34 02 INCHEK PSHS A SAVE A ACCUM. |
1331 FC77 A6 9F DF D0 LDA [CPORT] FETCH PORT STATUS |
1332 FC7B 85 01 BITA #1 TEST READY BIT, RDRF ? |
1333 IFD PS2OPT |
1334 BNE INCHEK1 |
1335 LDA PS2KBD |
1336 BITA #1 TEST READY BIT< RDRF ? |
1337 ENDIF PS2OPT |
1337 ENDIF PS2OPT |
1338 FC7D 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. |
1339 * |
1340 FC7F 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES |
1341 FC81 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE |
1342 * |
1343 * |
1344 * OUTCH |
1345 * |
1346 * OUTPUT CHARACTER TO TERMINAL. |
1347 * THE CHAR. TO BE OUTPUT IS |
1348 * PASSED IN THE A REGISTER. |
1349 * ALL REGISTERS ARE PRESERVED. |
1350 * |
1351 OUTCH IFD VDUOPT |
1352 BSR VOUTCH |
1353 ENDIF VDUOPT |
1353 ENDIF VDUOPT |
1354 IFD DG640OPT |
1355 FC83 8D 3B BSR VOUTCH |
1356 ENDIF DG640OPT |
1357 FC85 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX |
1358 FC87 BE DF D0 LDX CPORT GET ADDR. OF TERMINAL |
1359 FC8A A6 84 FETSTA LDA ,X FETCH PORT STATUS |
1360 FC8C 85 02 BITA #2 TEST TDRE, OK TO XMIT ? |
1361 FC8E 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY |
1362 FC90 35 02 PULS A GET CHAR. FOR XMIT |
1363 FC92 A7 01 STA 1,X XMIT CHAR. |
1364 FC94 35 90 PULS X,PC RESTORE IX |
1365 * |
1366 * IO INITIALIZATION |
1367 * |
1368 FC96 IOINIZ EQU * |
1369 IFD VDUOPT |
1370 BSR VINIZ |
1371 ENDIF VDUOPT |
1371 ENDIF VDUOPT |
1372 IFD DG640OPT |
1373 FC96 8D 13 BSR VINIZ |
1374 ENDIF DG640OPT |
1375 FC98 BE DF D0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
1376 FC9B 86 03 LDA #3 RESET ACIA PORT CODE |
1377 FC9D A7 84 STA ,X STORE IN CONTROL REGISTER |
1378 FC9F 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
1379 FCA1 A7 84 STA ,X STORE IN CONTROL REGISTER |
1380 FCA3 6D 01 TST 1,X ANYTHING IN DATA REGISTER? |
1381 FCA5 86 FF LDA #$FF TURN ON ECHO FLAG |
1382 FCA7 B7 DF D2 STA ECHO |
1383 FCAA 39 RTS |
1384 * |
1385 IFD VDUOPT |
1386 * |
1387 *************************************************** |
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * |
1389 * * |
1390 * 80 x 25 Characters |
1391 * |
1392 *************************************************** |
1393 * |
1394 *************************************************** |
1395 * INITIALIZE EMULATOR * |
1396 *************************************************** |
1397 * |
1398 VINIZ LDX #VDU |
1399 LDD #0 |
1400 STD COLADX AND ROWADX |
1401 STA VDUCOL,X |
1402 STB VDUROW,X |
1403 STB VDUOFF,X |
1404 STD NEWROW AND ESCFLG |
1405 LDB #$02 |
1406 STB VDUATT,X |
1407 CLR ESCFLG |
1408 LDA #$1B SEND ESCAPE |
1409 BSR VOUTCH |
1410 LDA #'Y CLEAR TO END OF SCREEN |
1411 * |
1412 ** VIDEO OUTPUT ROUTINE |
1413 * |
1414 VOUTCH PSHS A,B,X SAVE REGISTERS |
1415 LDX #VDU POINT TO VDU REGISTERS |
1416 * |
1417 ** CHECK FOR ESCAPE SEQUENCE |
1418 * |
1419 TST ESCFLG ESCAPE ACTIVE? |
1420 BEQ SOROU1 BRANCH IF NOT |
1421 BSR ESCAPE ELSE DO ESCAPE |
1422 BRA RETURN AND RETURN |
1423 * |
1424 ** CHECK FOR CONTROL CHARACTERS |
1425 * |
1426 SOROU1 CMPA #$20 CONTROL CODES? |
1427 BHS SOROU2 |
1428 BSR CONTRL BRANCH IF SO |
1429 BRA RETURN |
1430 * |
1431 ** OUTPUT TEXT CHARACTER |
1432 * |
1433 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER |
1434 LBSR NEWCOL UPDATE COLUMN |
1435 * |
1436 ** DISPLAY CURSOR AND RETURN |
1437 * |
1438 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1439 * |
1440 *************************************************** |
1441 * CONTROL CODE HANDLERS * |
1442 *************************************************** |
1443 * |
1444 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1445 LBEQ BACKSP |
1446 CMPA #$1B ESCAPE SEQUENCE? |
1447 LBEQ SETESC |
1448 CMPA #$1A CTRL Z - Clear Screen |
1449 LBEQ CLRSCR |
1450 CMPA #$16 CTRL ^ - Home |
1451 LBEQ HOME |
1452 CMPA #$D CTRL M - RETURN? |
1453 LBEQ CRETN |
1454 CMPA #$0C CTRL L - CHAR RIGHT |
1455 LBEQ CHRIGHT |
1456 CMPA #$0B CTRL K - MOVE UP ONE LINE |
1457 LBEQ LINEUP |
1458 CMPA #$0A CTRL J - LINE FEED |
1459 BNE RETESC NONE OF THESE, RETURN |
1460 * |
1461 ***************************************** LINE FEED |
1462 * |
1463 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1464 INCB BUMP ROW |
1465 CMPB #NUMLIN SCROLL TIME? |
1466 LBNE NEWCUR POSITION CURSOR IF NOT |
1467 LBRA SCROLL ELSE SCROLL IT |
1468 * |
1469 ***************************************** LINE FEED |
1470 * |
1471 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1472 TSTB AT TOP OF SCREEN ? |
1473 LBEQ RETESC Yes, Ignore |
1474 DECB No, Decrement ROW |
1475 LBRA NEWCUR POSITION CURSOR |
1476 * |
1477 *********************************** BACK SPACE |
1478 * |
1479 BACKSP LDA COLADX |
1480 BEQ RETESC RETURN |
1481 DECA |
1482 LBRA POSCOL POSITION CURSOR |
1483 * |
1484 *********************************** CURSOR RIGHT |
1485 * |
1486 CHRIGHT LDA COLADX |
1487 INCA |
1488 CMPA #LINLEN |
1489 LBEQ RETESC |
1490 LBRA POSCOL |
1491 * |
1492 *********************************** CURSOR RIGHT |
1493 * |
1494 HOME LDD #0 HOME - POSITION TOP OF SCREEN |
1495 LBRA NEWCUR |
1496 * |
1497 *************************************************** |
1498 * ESCAPE HANDLERS * |
1499 *************************************************** |
1500 * |
1501 ESCAPE LDAB ESCFLG GET FLAG |
1502 CMPB #'= SETTING CURSOR? |
1503 BEQ ESCCUR BRANCH IF SO |
1504 CMPA #'Y CLEAR TO END OF SCREEN? |
1505 LBEQ ESCCLS |
1506 CMPA #'T CLEAR TO END OF LINE? |
1507 BEQ ESCCLL |
1508 CMPA #'= STARTING CURSOR SET? |
1509 BNE CLRESC BRANCH IF NOT |
1510 * |
1511 ***************************** START ESCAPE SEQUENCE |
1512 * |
1513 SETESC STAA ESCFLG ELSE START CURSORING |
1514 RTS AND RETURN |
1515 * |
1516 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1517 RETESC RTS SO RETURN |
1518 * |
1519 ********************************* SET SCREEN CURSOR |
1520 * |
1521 ESCCUR TST NEWROW ROW SET? |
1522 BNE ESCCU1 BRANCH IF SO |
1523 STAA NEWROW ELSE SET NEW ROW |
1524 RTS AND RETURN |
1525 * |
1526 ESCCU1 CLR ESCFLG |
1527 SUBA #$20 ADJUST COLUMN ADDRESS |
1528 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1529 BHI RETESC NOT OK, DO NOTHING |
1530 * |
1531 ESCCU2 LDAB NEWROW |
1532 CLR NEWROW |
1533 SUBB #$20 ADJUST TO ROW ADDRESS |
1534 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1535 BHI RETESC ELSE RETURN DOING NOTHING |
1536 BRA NEWCUR GO SET NEW CURSOR IF SO |
1537 * |
1538 ****************** CLEAR FROM CURSOR TO END OF LINE |
1539 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN |
1540 BSR NEWCUR |
1541 ESCCLL LDA COLADX |
1542 LDB #$20 AND CLEAR CHAR |
1543 ESCCL1 STB VDUCHR,X DISPLAY TEXT |
1544 INCA |
1545 STA VDUCOL,X |
1546 CMPA #LINLEN UNTIL END OF LINE |
1547 BNE ESCCL1 |
1548 CLR ESCFLG |
1549 RTS |
1550 * |
1551 *********************************** CARRIAGE RETURN |
1552 * |
1553 CRETN CLRA SET COLUMN ZERO |
1554 POSCOL LDB ROWADX GET CURRENT ROW |
1555 * |
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1557 * |
1558 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1559 STA VDUCOL,X SET NEW COLUMN |
1560 STB VDUROW,X SET NEW ROW |
1561 RTS AND RETURN |
1562 * |
1563 ********************* UPDATE CURRENT COLUMN AND ROW |
1564 * |
1565 NEWCOL LDD COLADX GET ROW AND COLUMN |
1566 INCA BUMP COLUMN |
1567 CMPA #LINLEN ROLL? |
1568 BNE NEWCUR BRANCH IF NOT |
1569 CLRA ELSE RESET TO ZERO |
1570 INCB AND BUMP ROW |
1571 CMPB #NUMLIN |
1572 BNE NEWCUR |
1573 DECB BOTTOM ROW |
1574 BSR NEWCUR |
1575 * |
1576 ********************************* SCROLL THE SCREEN |
1577 * |
1578 SCROLL LDB VDUOFF,X |
1579 INCB |
1580 CMPB #NUMLIN |
1581 BLO SCROL1 |
1582 CLRB |
1583 SCROL1 STB VDUOFF,X |
1584 * |
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1586 * |
1587 ESCCLS LDB COLADX GET CURSOR |
1588 LDA #$20 GET A SPACE |
1589 ESCCLS1 STB COLADX |
1590 STB VDUCOL,X |
1591 STA VDUCHR,X |
1592 INCB |
1593 CMPB #LINLEN |
1594 BNE ESCCLS1 |
1595 * |
1596 LDB ROWADX |
1597 INCB |
1598 CMPB #NUMLIN |
1599 BEQ ESCCLS2 |
1600 STB ROWADX |
1601 STB VDUROW,X |
1602 CLRB |
1603 BRA ESCCLS1 |
1604 * |
1605 ESCCLS2 CLRB |
1606 STB COLADX |
1607 STB VDUCOL,X |
1608 STB ESCFLG |
1609 RTS |
1610 ENDIF VDUOPT |
1610 ENDIF VDUOPT |
1611 * |
1612 IFD DG640OPT |
1613 *************************************************** |
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * |
1615 * * |
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * |
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * |
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * |
1619 * 16x64 BOARD). * |
1620 *************************************************** |
1621 |
1622 *************************************************** |
1623 * INITIALIZE EMULATOR * |
1624 *************************************************** |
1625 |
1626 FCAB 8E 00 00 VINIZ LDX #0 |
1627 FCAE BF DF EB STX COLADX AND ROWADX |
1628 FCB1 BF DF EF STX NEWROW AND ESCFLG |
1629 FCB4 8E E8 00 LDX #SCREEN POINT TO SCREEN |
1630 FCB7 BF DF ED STX CURSOR SET PROGRAM CURSOR |
1631 FCBA 86 1B LDA #$1B SEND ESCAPE |
1632 FCBC 8D 02 BSR VOUTCH |
1633 FCBE 86 59 LDA #'Y CLEAR TO END OF SCREEN |
1634 * |
1635 ** VIDEO OUTPUT ROUTINE |
1636 * |
1637 FCC0 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS |
1638 * |
1639 ** CLEAR CURSOR |
1640 FCC2 BE DF ED LDX CURSOR |
1641 FCC5 E6 84 LDB 0,X |
1642 FCC7 C4 7F ANDB #$7F |
1643 FCC9 E7 84 STB 0,X |
1644 * |
1645 ** CHECK FOR ESCAPE SEQUENCE |
1646 FCCB 7D DF F0 TST ESCFLG ESCAPE ACTIVE? |
1647 FCCE 27 04 BEQ SOROU1 BRANCH IF NOT |
1648 FCD0 8D 5E BSR ESCAPE ELSE DO ESCAPE |
1649 FCD2 20 10 BRA RETURN AND RETURN |
1650 * |
1651 ** CHECK FOR CONTROL CHARACTERS |
1652 FCD4 81 20 SOROU1 CMPA #$20 CONTROL CODES? |
1653 FCD6 24 04 BHS SOROU2 |
1654 FCD8 8D 15 BSR CONTRL BRANCH IF SO |
1655 FCDA 20 08 BRA RETURN |
1656 * |
1657 ** OUTPUT TEXT CHARACTER |
1658 FCDC BE DF ED SOROU2 LDX CURSOR ELSE GET CURSOR |
1659 FCDF A7 84 STAA 0,X DISPLAY CHARACTER |
1660 FCE1 17 00 E9 LBSR NEWCOL UPDATE COLUMN |
1661 * |
1662 ** DISPLAY CURSOR AND RETURN |
1663 FCE4 BE DF ED RETURN LDX CURSOR AND DISPLAY IT |
1664 FCE7 E6 84 LDB ,X |
1665 FCE9 CA 80 ORAB #$80 WITH REVID |
1666 FCEB E7 84 STB ,X |
1667 FCED 35 96 PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1668 |
1669 *************************************************** |
1670 * CONTROL CODE HANDLERS * |
1671 *************************************************** |
1672 |
1673 FCEF 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1674 FCF1 10 27 00 27 LBEQ BACKSP |
1675 FCF5 81 1B CMPA #$1B ESCAPE SEQUENCE? |
1676 FCF7 10 27 00 52 LBEQ SETESC |
1677 FCFB 81 0D CMPA #$D CTRL M - RETURN? |
1678 FCFD 10 27 00 B4 LBEQ CRETN |
1679 FD01 81 0A CMPA #$0A CTRL J - LINE FEED |
1680 FD03 26 4F BNE RETESC NONE OF THESE, RETURN |
1681 |
1682 ***************************************** LINE FEED |
1683 |
1684 FD05 FC DF EB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1685 FD08 5C INCB BUMP ROW |
1686 FD09 C1 10 CMPB #NUMLIN SCROLL TIME? |
1687 FD0B 10 26 00 AA LBNE NEWCUR POSITION CURSOR IF NOT |
1688 FD0F 16 00 CC LBRA SCROLL ELSE SCROLL IT |
1689 |
1690 ***************************************** LINE FEED |
1691 |
1692 FD12 FC DF EB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1693 FD15 5D TSTB AT TOP OF SCREEN ? |
1694 FD16 27 3C BEQ RETESC Yes, Ignore |
1695 FD18 5A DECB No, Decrement ROW |
1696 FD19 16 00 9D LBRA NEWCUR POSITION CURSOR |
1697 |
1698 |
1699 *********************************** BACK SPACE |
1700 |
1701 FD1C B6 DF EB BACKSP LDA COLADX |
1702 FD1F 27 33 BEQ RETESC RETURN |
1703 FD21 4A DECA |
1704 FD22 16 00 91 LBRA POSCOL POSITION CURSOR |
1705 |
1706 *********************************** CURSOR RIGHT |
1707 |
1708 FD25 B6 DF EB CHRIGHT LDA COLADX |
1709 FD28 4C INCA |
1710 FD29 81 40 CMPA #LINLEN |
1711 FD2B 27 27 BEQ RETESC |
1712 FD2D 16 00 86 LBRA POSCOL |
1713 |
1714 *************************************************** |
1715 * ESCAPE HANDLERS * |
1716 *************************************************** |
1717 |
1718 FD30 F6 DF F0 ESCAPE LDAB ESCFLG GET FLAG |
1719 FD33 C1 3D CMPB #'= SETTING CURSOR? |
1720 FD35 27 1E BEQ ESCCUR BRANCH IF SO |
1721 FD37 81 59 CMPA #'Y CLEAR TO END OF SCREEN? |
1722 FD39 10 27 00 B8 LBEQ ESCCLS |
1723 FD3D 81 54 CMPA #'T CLEAR TO END OF LINE? |
1724 FD3F 27 5D BEQ ESCCLL |
1725 FD41 81 45 CMPA #'E INSERT LINE? |
1726 FD43 27 3B BEQ ESCINL |
1727 FD45 81 52 CMPA #'R DELETE LINE? |
1728 FD47 27 2C BEQ ESCDLL |
1729 FD49 81 3D CMPA #'= STARTING CURSOR SET? |
1730 FD4B 26 04 BNE CLRESC BRANCH IF NOT |
1731 |
1732 ***************************** START ESCAPE SEQUENCE |
1733 |
1734 FD4D B7 DF F0 SETESC STAA ESCFLG ELSE START CURSORING |
1735 FD50 39 RTS AND RETURN |
1736 |
1737 FD51 7F DF F0 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1738 FD54 39 RETESC RTS SO RETURN |
1739 |
1740 ********************************* SET SCREEN CURSOR |
1741 |
1742 FD55 7D DF EF ESCCUR TST NEWROW ROW SET? |
1743 FD58 26 04 BNE ESCCU1 BRANCH IF SO |
1744 FD5A B7 DF EF STAA NEWROW ELSE SET NEW ROW |
1745 FD5D 39 RTS AND RETURN |
1746 |
1747 FD5E 7F DF F0 ESCCU1 CLR ESCFLG |
1748 FD61 80 20 SUBA #$20 ADJUST COLUMN ADDRESS |
1749 FD63 81 3F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1750 FD65 22 ED BHI RETESC NOT OK, DO NOTHING |
1751 |
1752 FD67 F6 DF EF ESCCU2 LDAB NEWROW |
1753 FD6A 7F DF EF CLR NEWROW |
1754 FD6D C0 20 SUBB #$20 ADJUST TO ROW ADDRESS |
1755 FD6F C1 0F CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1756 FD71 22 E1 BHI RETESC ELSE RETURN DOING NOTHING |
1757 FD73 20 44 BRA NEWCUR GO SET NEW CURSOR IF SO |
1758 * |
1759 *************************** DELETE LINE FROM SCREEN |
1760 |
1761 FD75 8D 3E ESCDLL BSR CRETN GO COL. ZERO |
1762 FD77 F6 DF EC LDB ROWADX |
1763 FD7A C1 0F CMPB #NUMLIN-1 |
1764 FD7C 27 7A BEQ SCROL3 |
1765 FD7E 20 61 BRA SCROL1 AND DELETE THIS LINE |
1766 |
1767 *************************** INSERT LINE INTO SCREEN |
1768 |
1769 FD80 8D 33 ESCINL BSR CRETN GO TO COL. ZERO |
1770 FD82 F6 DF EC LDAB ROWADX |
1771 FD85 C1 0F CMPB #NUMLIN-1 |
1772 FD87 27 15 BEQ ESCCLL |
1773 * |
1774 ** SCROLL SCREEN DOWN FROM CURSOR |
1775 * |
1776 FD89 8E EB C0 LDX #SCREEN+SCNLEN-LINLEN |
1777 FD8C A6 82 ESCIN0 LDAA 0,-X |
1778 FD8E A7 88 40 STAA LINLEN,X |
1779 FD91 A6 89 04 00 LDA SCNLEN,X |
1780 FD95 A7 89 04 40 STA SCNLEN+LINLEN,X |
1781 FD99 BC DF ED CPX CURSOR |
1782 FD9C 26 EE BNE ESCIN0 |
1783 |
1784 ****************** CLEAR FROM CURSOR TO END OF LINE |
1785 |
1786 FD9E B6 DF EB ESCCLL LDA COLADX GET CURRENT COLUMN |
1787 FDA1 BE DF ED LDX CURSOR GET CURSOR |
1788 FDA4 C6 20 LDB #$20 AND CLEAR CHAR |
1789 FDA6 E7 89 04 00 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE |
1790 FDAA E7 80 STB ,X+ CLEAR TEXT |
1791 FDAC 4C INCA |
1792 FDAD 81 40 CMPA #LINLEN UNTIL END OF LINE |
1793 FDAF 26 F5 BNE ESCLL1 |
1794 FDB1 7F DF F0 CLR ESCFLG |
1795 FDB4 39 RTS |
1796 |
1797 *********************************** CARRIAGE RETURN |
1798 |
1799 FDB5 4F CRETN CLRA SET COLUMN ZERO |
1800 FDB6 F6 DF EC POSCOL LDB ROWADX GET CURRENT ROW |
1801 |
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1803 |
1804 FDB9 FD DF EB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1805 FDBC 86 40 LDA #LINLEN ELSE ADD A LINE |
1806 FDBE 3D MUL LINLEN * ROWADX |
1807 FDBF FB DF EB ADDB COLADX |
1808 FDC2 89 00 ADCA #0 |
1809 FDC4 C3 E8 00 ADDD #SCREEN ADD SCREEN BASE. |
1810 FDC7 FD DF ED STD CURSOR SAVE NEW CURSOR |
1811 FDCA 1F 01 TFR D,X GET CURSOR IN X |
1812 FDCC 39 RTS AND RETURN |
1813 |
1814 ********************* UPDATE CURRENT COLUMN AND ROW |
1815 |
1816 FDCD FC DF EB NEWCOL LDD COLADX GET ROW AND COLUMN |
1817 FDD0 4C INCA BUMP COLUMN |
1818 FDD1 81 40 CMPA #LINLEN ROLL? |
1819 FDD3 26 E4 BNE NEWCUR BRANCH IF NOT |
1820 FDD5 4F CLRA ELSE RESET TO ZERO |
1821 FDD6 5C INCB AND BUMP ROW |
1822 FDD7 C1 10 CMPB #NUMLIN |
1823 FDD9 26 DE BNE NEWCUR |
1824 FDDB 5A DECB BOTTOM ROW |
1825 FDDC 8D DB BSR NEWCUR |
1826 |
1827 ********************************* SCROLL THE SCREEN |
1828 |
1829 FDDE 8E E8 00 SCROLL LDX #SCREEN POINT TO SCREEN |
1830 FDE1 A6 89 04 40 SCROL1 LDA SCNLEN+LINLEN,X |
1831 FDE5 A7 89 04 00 STA SCNLEN,X |
1832 FDE9 A6 88 40 LDAA LINLEN,X MOVE TWO BYTES |
1833 FDEC A7 80 STAA 0,X+ UP ONE LINE |
1834 FDEE 8C EB C0 CMPX #SCREEN+SCNLEN-LINLEN |
1835 FDF1 26 EE BNE SCROL1 LOOP UNTIL DONE |
1836 FDF3 20 03 BRA SCROL3 |
1837 |
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1839 |
1840 FDF5 BE DF ED ESCCLS LDX CURSOR GET CURSOR |
1841 FDF8 86 20 SCROL3 LDAA #$20 GET A SPACE |
1842 FDFA A7 89 04 00 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES |
1843 FDFE A7 80 STA ,X+ AND TEXT |
1844 FE00 8C EC 00 CMPX #SCREEN+SCNLEN |
1845 FE03 26 F5 BNE SCROL2 UNTIL DONE |
1846 FE05 7F DF F0 CLR ESCFLG |
1847 FE08 39 RTS |
1848 ENDIF DG640OPT |
1849 * |
1850 IFD PRTOPT |
1851 ************************************* |
1852 * |
1853 ** PRINTER DRIVER ROUTINES |
1854 * |
1855 ************************************* |
1856 * |
1857 ** PINIZ - INITIATE PRINTER PORT |
1858 * |
1859 FE09 34 04 PINIZ PSHS B |
1860 FE0B CC 0C 04 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 |
1861 FE0E FD E4 04 STD PADATA SET DDR AND SELECT DATA |
1862 * |
1863 ** RESET PRINTER |
1864 FE11 C6 04 LDB #PRESET |
1865 FE13 F7 E4 04 STAB PADATA |
1866 FE16 5C RESTLP INCB DELAY FOR RESET |
1867 FE17 26 FD BNE RESTLP |
1868 FE19 B7 E4 04 STAA PADATA ACCA=DIRMSK |
1869 * |
1870 ** INITALIZE PORT B (DATA PORT) |
1871 FE1C 86 2A LDAA #$2A |
1872 FE1E B7 E4 07 STAA PBCTRL |
1873 FE21 CC FF 2E LDD #$FF2E ACCA=$FF ACCB =%00101110 |
1874 FE24 FD E4 06 STD PBDATA PBDREG PBCTRL |
1875 * |
1876 ** SELECT 66 LINES/PAGE |
1877 FE27 86 1B LDAA #$1B |
1878 FE29 8D 08 BSR POUTCH |
1879 FE2B 86 43 LDAA #'C |
1880 FE2D 8D 04 BSR POUTCH |
1881 FE2F 86 42 LDAA #66 |
1882 FE31 35 04 PULS B |
1883 ************************************* |
1884 * |
1885 ** OUTPUT A CHARACTER TO THE PRINTER |
1886 * |
1887 ************************************* |
1888 FE33 34 04 POUTCH PSHS B |
1889 FE35 F6 E4 06 LDAB PBDATA CLEAR INTERRUPT BIT |
1890 * |
1891 ** WAIT TILL NOT BUSY |
1892 FE38 F6 E4 04 BUSYLP LDAB PADATA |
1893 FE3B C5 10 BITB #PERROR |
1894 FE3D 27 06 BEQ PEXIT |
1895 FE3F 5D TSTB |
1896 FE40 2B F6 BMI BUSYLP |
1897 * |
1898 ** NOW OUTPUT CHARACTER |
1899 FE42 B7 E4 06 STAA PBDATA |
1900 FE45 35 84 PEXIT PULS B,PC |
1901 ************************************* |
1902 * |
1903 ** PCHK TEST IFD PRINTER READY |
1904 * |
1905 ************************************* |
1906 FE47 7D E4 07 PCHK TST PBCTRL TEST STATE OF CRB7 |
1907 FE4A 39 RTS SET ON ACKNOWLEDGE |
1908 ENDIF PRTOPT |
1909 ************************************* |
1910 * |
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE |
1912 * |
1913 ************************************* |
1914 * |
1915 FE4B JMPTAB EQU * |
1916 FE4B 01 FCB 1 " ^A " |
1917 FE4C FB 3D FDB ALTRA |
1918 FE4E 02 FCB 2 " ^B " |
1919 FE4F FB 32 FDB ALTRB |
1920 FE51 03 FCB 3 " ^C " |
1921 FE52 FB 48 FDB ALTRCC |
1922 FE54 04 FCB 4 " ^D " |
1923 FE55 FB 27 FDB ALTRDP |
1924 FE57 10 FCB $10 " ^P " |
1925 FE58 FA FA FDB ALTRPC |
1926 FE5A 15 FCB $15 " ^U " |
1927 FE5B FB 06 FDB ALTRU |
1928 FE5D 18 FCB $18 " ^X " |
1929 FE5E FB 1C FDB ALTRX |
1930 FE60 19 FCB $19 " ^Y " |
1931 FE61 FB 11 FDB ALTRY |
1932 * |
1933 FE63 42 FCC 'B' |
1934 FE64 F9 51 FDB BRKPNT |
1935 FE66 45 FCC 'E' |
1936 FE67 F8 F2 FDB MEMDUMP |
1937 FE69 47 FCC 'G' |
1938 FE6A F8 9A FDB GO |
1939 FE6C 4C FCC 'L' |
1940 FE6D FA 27 FDB LOAD |
1941 FE6F 50 FCC 'P' |
1942 FE70 FA 85 FDB PUNCH |
1943 FE72 4D FCC 'M' |
1944 FE73 F8 9D FDB MEMCHG |
1945 FE75 52 FCC 'R' |
1946 FE76 FB B6 FDB REGSTR |
1947 FE78 53 FCC 'S' |
1948 FE79 F8 E6 FDB DISSTK |
1949 FE7B 58 FCC 'X' |
1950 FE7C F9 7D FDB XBKPNT |
1951 IFD MFDCOPT |
1952 FE7E 44 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT |
1953 FE7F F9 CA FDB MINBOOT |
1954 ENDIF MFDCOPT |
1955 IFD CF8OPT |
1956 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT |
1957 FDB CFBOOT |
1958 ENDIF CF8OPT |
1958 ENDIF CF8OPT |
1959 IFD IDEOPT |
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT |
1961 FDB IDEBOOT |
1962 ENDIF IDEOPT |
1962 ENDIF IDEOPT |
1963 IFD DMAFOPT |
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT |
1965 FDB DBOOT |
1966 ENDIF DMAFOPT |
1966 ENDIF DMAFOPT |
1967 IFD EXTOPT |
1968 FCC 'U' *** IF FPGA, 'U' IS FOR USER |
1969 FDB USRCMD |
1970 ENDIF EXTOPT |
1970 ENDIF EXTOPT |
1971 IFD RTCOPT |
1972 FCC 'T' |
1973 FDB TIMSET |
1974 ENDIF RTCOPT |
1974 ENDIF RTCOPT |
1975 IFD TRAOPT |
1976 FCC "T" |
1977 FDB TRACE |
1978 ENDIF TRAOPT |
1978 ENDIF TRAOPT |
1979 * |
1980 FE81 TABEND EQU * |
1981 * |
1982 * ** 6809 VECTOR ADDRESSES ** |
1983 * |
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES |
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY |
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE |
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO |
1988 * HIS OWN ROUTINES IF HE SO DESIRES. |
1989 * |
1990 * |
1991 FE81 F9 89 RAMVEC FDB SWIE USER-V |
1992 FE83 F8 9C FDB RTI SWI3-V |
1993 FE85 F8 9C FDB RTI SWI2-V |
1994 FE87 F8 9C FDB RTI FIRQ-V |
1995 FE89 F8 9C FDB RTI IRQ-V |
1996 FE8B F9 89 FDB SWIE SWI-V |
1997 FE8D FF FF FDB $FFFF SVC-VO |
1998 FE8F FF FF FDB $FFFF SVC-VL |
1999 * |
2000 * PRINTABLE MESSAGE STRINGS |
2001 * |
2002 FE91 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
2003 FE96 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR ' |
55 47 20 31 2E 34 |
20 46 4F 52 20 |
2004 IFD S3EOPT |
2005 FCC 'S3E ' |
2006 ENDIF S3EOPT |
2006 ENDIF S3EOPT |
2007 IFD B5XOPT |
2008 FCC 'B5-X300 ' |
2009 ENDIF B5XOPT |
2009 ENDIF B5XOPT |
2010 IFD S3SOPT |
2011 FCC 'S3STARTER ' |
2012 ENDIF S3SOPT |
2012 ENDIF S3SOPT |
2013 IFD ADSOPT |
2014 FEA7 41 44 53 36 38 30 FCC 'ADS6809 ' |
39 20 |
2015 ENDIF ADSOPT |
2016 IFD SWTOPT` |
2017 FCC 'SWTPC ' |
2018 ENDIF SWTOPT |
2018 ENDIF SWTOPT |
2019 IFD XESOPT` |
2020 FCC 'XESS ' |
2021 ENDIF XESOPT |
2021 ENDIF XESOPT |
2022 FEAF 20 2D 20 FCC ' - ' |
2023 FEB2 04 FCB 4 |
2024 FEB3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS |
04 |
2025 FEBA 3E MSG3 FCC '>' |
2026 FEBB 04 FCB 4 |
2027 FEBC 57 48 41 54 3F MSG4 FCC 'WHAT?' |
2028 FEC1 04 FCB 4 |
2029 FEC2 20 2D 20 MSG5 FCC ' - ' |
2030 FEC5 04 FCB 4' |
2031 FEC6 20 20 53 50 3D MSG10 FCC ' SP=' |
2032 FECB 04 FCB 4 |
2033 FECC 20 20 50 43 3D MSG11 FCC ' PC=' |
2034 FED1 04 FCB 4 |
2035 FED2 20 20 55 53 3D MSG12 FCC ' US=' |
2036 FED7 04 FCB 4 |
2037 FED8 20 20 49 59 3D MSG13 FCC ' IY=' |
2038 FEDD 04 FCB 4 |
2039 FEDE 20 20 49 58 3D MSG14 FCC ' IX=' |
2040 FEE3 04 FCB 4 |
2041 FEE4 20 20 44 50 3D MSG15 FCC ' DP=' |
2042 FEE9 04 FCB 4 |
2043 FEEA 20 20 41 3D MSG16 FCC ' A=' |
2044 FEEE 04 FCB 4 |
2045 FEEF 20 20 42 3D MSG17 FCC ' B=' |
2046 FEF3 04 FCB 4 |
2047 FEF4 20 20 43 43 3A 20 MSG18 FCC ' CC: ' |
2048 FEFA 04 FCB 4 |
2049 FEFB 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' |
56 43 |
2050 FF03 53 31 MSG20 FCC 'S1' |
2051 FF05 04 FCB 4 |
2052 IFD DATOPT |
2053 * |
2054 * POWER UP/ RESET/ NMI ENTRY POINT |
2055 * |
2056 ORG $FF00 |
2057 * |
2058 * |
2059 START LDX #IC11 POINT TO DAT RAM IC11 |
2060 LDA #$F GET COMPLIMENT OF ZERO |
2061 * |
2062 * |
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F |
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS |
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE |
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA |
2067 * STORED IN IT. |
2068 * |
2069 * |
2070 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION |
2071 DECA GET COMP. VALUE FOR NEXT LOCATION |
2072 BNE DATLP ALL 16 LOCATIONS INITIALIZED ? |
2073 * |
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER |
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL |
2076 * PHYSICAL ADDRESSES. |
2077 * |
2078 LDA #$F0 |
2079 STA ,X STORE $F0 AT $FFFF |
2080 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF |
2081 LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" |
2082 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION |
2083 STY ,X STORE TEST PATTERN AT $D0A0 |
2084 CMPY ,X IS THERE RAM AT THIS LOCATION ? |
2085 BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP |
2086 LEAX -$1000,X ELSE POINT 4K LOWER |
2087 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? |
2088 BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM |
2089 BRA START ELSE START ALL OVER AGAIN |
2090 * |
2091 * |
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF |
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX |
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED |
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT |
2096 * IS STORED IN RAM IN THE LOCATION THAT IS |
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, |
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND |
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE |
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE |
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE |
2102 * "7" IN THE $70A0 WILL BE STORED IN |
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS |
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND |
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE |
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE |
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- |
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT |
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE |
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK |
2111 * OF RAM RESPONDS. |
2112 * |
2113 * |
2114 CNVADR STU ,X RESTORE DATA AT TEST LOCATION |
2115 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2116 COMA COMPLEMENT MSB OF THAT ADDRESS |
2117 LSRA PUT MS 4 BITS OF ADDRESS IN |
2118 LSRA LOCATION D0-D3 TO ALLOW STORING |
2119 LSRA IT IN THE DYNAMIC ADDRESS |
2120 LSRA TRANSLATION RAM. |
2121 STA $FFFD STORE XLATION FACTOR IN DAT "D" |
2122 * |
2123 LDS #STACK INITIALIZE STACK POINTER |
2124 * |
2125 * |
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES |
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK |
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS |
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION |
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF |
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO |
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... |
2133 * |
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- |
2136 * |
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE |
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... |
2139 * |
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 |
2142 * |
2143 * |
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF |
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL |
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK |
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT |
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 |
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 |
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE |
2151 * MEMORY ADDRESSED AS FOLLOWS.... |
2152 * |
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- |
2155 * |
2156 * |
2157 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2158 STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD |
2159 CLR 14,Y CLEAR $DFDE |
2160 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? |
2161 STA 15,Y STORE AT $DFDF |
2162 LDA #$0C PRESET NUMBER OF BYTES TO CLEAR |
2163 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 |
2164 DECA SUB. 1 FROM BYTES LEFT TO CLEAR |
2165 BPL CLRLRT CONTINUE IF NOT DONE CLEARING |
2166 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM |
2167 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO |
2168 BEQ FINTAB SKIP IF FINISHED |
2169 LDU ,X SAVE DATA AT CURRENT TEST LOCATION |
2170 LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. |
2171 STY ,X STORE TEST PATT. INTO RAM TEST LOC. |
2172 CMPY ,X VERIFY RAM AT TEST LOCATION |
2173 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER |
2174 STU ,X ELSE RESTORE DATA TO TEST LOCATION |
2175 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2176 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2177 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 |
2178 LSRA TO ALLOW STORING IT IN THE DAT RAM. |
2179 LSRA |
2180 LSRA |
2181 TFR A,B SAVE OFFSET INTO LRARAM TABLE |
2182 EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK |
2183 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE |
2184 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK |
2185 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? |
2186 LDY #LRARAM POINT TO LRARAM TABLE |
2187 STA 14,Y STORE $F1 AT $DFCE |
2188 * |
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF |
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES |
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT |
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---. |
2193 * |
2194 * |
2195 LDA #$0C PRESET NUMBER HEX "C" |
2196 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE |
2197 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. |
2198 DECA ELSE POINT 4K LOWER |
2199 BPL FINDC GO TRY AGAIN |
2200 BRA XFERTF |
2201 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND |
2202 STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- |
2203 * |
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION |
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL |
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL |
2207 * ADDRESSES FROM $0000 AND UP.... |
2208 * |
2209 CLRA START AT ZERO |
2210 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. |
2211 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE |
2212 BEQ PNTNXT IF IT'S ZER0 SKIP |
2213 CLR A,Y ELSE ERASE FROM TABLE |
2214 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP |
2215 PNTNXT INCA GET OFFSET TO NEXT ENTRY |
2216 CMPA #$0C LAST ENTRY YET ? |
2217 BLT COMPRS |
2218 * |
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION |
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON |
2221 * THE MP-09 CPU CARD. |
2222 * |
2223 XFERTF LDX #IC11 POINT TO DAT RAM IC11 |
2224 LDB #$10 GET NO. OF BYTES TO MOVE |
2225 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT |
2226 STA ,X+ POKE XLATION FACTOR IN IC11 |
2227 DECB SUB 1 FROM BYTES TO MOVE |
2228 BNE FETCH CONTINUE UNTIL 16 MOVED |
2229 * |
2230 ELSE |
2231 FF06 39 LRA RTS |
2232 FF07 10 CE DF C0 START LDS #STACK INITIALIZE STACK POINTER |
2233 FF0B 5F CLRB |
2234 ENDIF DATOPT |
2235 * |
2236 FF0C 53 COMB SET "B" NON-ZERO |
2237 FF0D F7 DF D2 STB ECHO TURN ON ECHO FLAG |
2238 FF10 16 F9 0F LBRA MONITOR INITIALIZATION IS COMPLETE |
2239 * |
2240 ** INTERRUPT JUMP VECTORS |
2241 * |
2242 FF13 6E 9F DF C0 V1 JMP [STACK] |
2243 FF17 6E 9F DF C4 V2 JMP [SWI2] |
2244 FF1B 6E 9F DF C6 V3 JMP [FIRQ] |
2245 FF1F 6E 9F DF C8 V4 JMP [IRQ] |
2246 FF23 6E 9F DF CA V5 JMP [SWI] |
2247 * |
2248 * SWI3 ENTRY POINT |
2249 * |
2250 FF27 1F 43 SWI3E TFR S,U |
2251 FF29 AE 4A LDX 10,U *$FFC8 |
2252 FF2B E6 80 LDB ,X+ |
2253 FF2D AF 4A STX 10,U |
2254 FF2F 4F CLRA |
2255 FF30 58 ASLB |
2256 FF31 49 ROLA |
2257 FF32 BE DF CC LDX SVCVO |
2258 FF35 8C FF FF CMPX #$FFFF |
2259 FF38 27 0F BEQ SWI3Z |
2260 FF3A 30 8B LEAX D,X |
2261 FF3C BC DF CE CMPX SVCVL |
2262 FF3F 22 08 BHI SWI3Z |
2263 FF41 34 10 PSHS X |
2264 FF43 EC C4 LDD ,U |
2265 FF45 AE 44 LDX 4,U |
2266 FF47 6E F1 JMP [,S++] |
2267 FF49 37 1F SWI3Z PULU A,B,X,CC,DP |
2268 FF4B EE 42 LDU 2,U |
2269 FF4D 6E 9F DF C2 JMP [SWI3] |
2270 * |
2271 * 6809 VECTORS |
2272 * |
2273 FFF0 ORG $FFF0 |
2274 FFF0 FF 13 FDB V1 USER-V |
2275 FFF2 FF 27 FDB SWI3E SWI3-V |
2276 FFF4 FF 17 FDB V2 SWI2-V |
2277 FFF6 FF 1B FDB V3 FIRQ-V |
2278 FFF8 FF 1F FDB V4 IRQ-V |
2279 FFFA FF 23 FDB V5 SWI-V |
2280 FFFC FF 13 FDB V1 NMI-V |
2281 FFFE FF 07 FDB START RESTART-V |
0004 END START |
0005 END |
Program + Init Data = 1889 bytes |
Error count = 0 |
/sys09xes.sh
0,0 → 1,3
../../Tools/as09/as09.exe sys09xes.txt -l > sys09xes.lst |
../../Tools/epedit/epedit.exe sys09xes.aux |
|
/SYS09B5X.S19
0,0 → 1,66
S123F800F814F861FC9DFC97FCB5FCCAFB8FFB1EFB1AFA2E8EFE6D108EDFC0C610A680A723 |
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2 |
S123F840049B8EFE7D1703478EDFD04FC60D6D8527038B04195A2AF617040C8EFE9F170392 |
S123F8602E8EFEA61702B3170433847F810D27F11F8981202C09865E17044F1F988B4017FC |
S123F8800448170443C1602F02C0208EFE37E180270F30028CFE6D26F58EFEA81702F0208D |
S123F8A0C0AD9420BC1F343B17036B292D1F128EFEAE1702651F211703A517040BA6A4178F |
S123F8C003A517040317035E2811810827E1811827DD815E2717810D260F39A7A4A1A427AF |
S123F8E0081703E4863F1703E1312120C2313F20BE1702A21F328EDFC0301F200517030BEA |
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE4270517039627DF |
S123F9200332623934108EFEAE1701EEAEE417032E170392C610A68017032C17038A5A2683 |
S123F940F5170382AEE1C610A68081202504817E2302862E1703735A26EE20BC1702B72915 |
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2 |
S123F980170345863F160342108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4ADD |
S123F9A08D0617024816FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A717 |
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D398D4086E0B7E0468D398601AA |
S123F9E0B7E04186EFB7E0478D2D8601B7E0424FB7E043B7E044B7E0458620B7E0478D17B6 |
S123FA008EC0008D21B6E040A7808CC20026F48EC000AF4A1F343BB6E047858026F9B6E015 |
S123FA2047854027F239B6E047850827F9393436A66244444444108EDFD0E6A654545454F6 |
S123FA40E7E4E6A65358585858A662840FA762EA62E76235B63404C6205A26FD3584BDFC67 |
S123FA60DF86111702647FDFE2170226815326F917021F8139273D813126F11701A8340208 |
S123FA80292617019129213410E6E0EBE0EBE46AE46AE4340417018E3504290C3402EBE093 |
S123FAA06AE42705A78020EB5F3502C1FF27BA863F17021673DFE2861316020E6FE217010F |
S123FAC04A3430294DAC6225493001AFE4BDFCDF86121701F5ECE4A36227061083002023A9 |
S123FAE002C620E7648EFEEF17002FCB031F98170175AE62170168EB62EB63EB84A6801725 |
S123FB0001656A6426F5531F9817015BAF62ACE426C386141701B33265398D0220713410F2 |
S123FB208EFEA0170069359016019D1600F81600E51700918DF28DF62902AF4A398D618D11 |
S123FB40E78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18DD52902AF44398D49E1 |
S123FB608DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB08DB12902A741398D7C |
S123FB805F8DA58DA629048A80A7C43917013BA680810426F7398EFEB28DF41F311600BF8A |
S123FBA08EFEBE8DEAAE4820F48EFED08DE1A6431600B48EFECA8DD7AE4420E18EFEC48D6F |
S123FBC0CEAE4620D88EFEB88DC5AE4A20CF8EFED68DBCA64120D98EFEDB8DB3A64220D0E0 |
S123FBE08EFEE08DAAA6C48EFEE71600908EFEAE17FF278DA18DA98DB08DB88DBF8EFEAEF8 |
S123FC0017FF178DC08DC78DCE20D58D09294D1F12862D1700B48D0E29421F018D08293CE7 |
S123FC203410A76135908D112932484848481F898D0729283404ABE0398D578130251D81B5 |
S123FC40392203803039814125128146220380373981612507816622038057391A023934D1 |
S123FC601035028D0235023402444444448D043502840F8B3081392F028B07204D3402C631 |
S123FC8008A68068E42502862D8D3F8D3B5A26F135827DDFE227068D04847F202D3410BE02 |
S123FCA0DFE0A684850126098EE020A684850127EEA60135903402A69FDFE085012605B642 |
S123FCC0E020850135828D0086208D453412BEDFE0A684850227FA3502A70135908D13BE47 |
S123FCE0DFE08603A7848611A7846D0186FFB7DFE2398EE030CC0000FDDFFBA702E703E76C |
S123FD0004FDDFFDC602E7017FDFFE861B8D02865934168EE0307DDFFE27048D74200D81CB |
S123FD202024048D092005A7841700C53596810810270041811B1027006C811A1027008E4A |
S123FD40811610270045810D10270099810C1027002C810B10270011810A2651FCDFFB5C36 |
S123FD60C11910260083160099FCDFFB5D1027003C5A160074B6DFFB27334A160068B6DF6C |
S123FD80FB4C81501027002516005BCC0000160058F6DFFEC13D271681591027006E8154DE |
S123FDA02731813D2604B7DFFE397FDFFE397DDFFD2604B7DFFD397FDFFE8020814F22ED73 |
S123FDC0F6DFFD7FDFFDC020C11822E1201BCC00008D16B6DFFBC620E7844CA702815026BF |
S123FDE0F77FDFFE394FF6DFFCFDDFFBA702E70339FCDFFB4C815026F04F5CC11926EA5AB8 |
S123FE008DE7E6045CC11925015FE704F6DFFB8620F7DFFBE702A7845CC15026F4F6DFFC27 |
S123FE205CC1192708F7DFFCE7035F20E45FF7DFFBE702F7DFFE3901FB7402FB6903FB7FC1 |
S123FE4004FB5E10FB3115FB3D18FB5319FB4842F95C45F8FD47F8A54CFA5E50FABC4DF852 |
S123FE60A852FBED53F8F158F98844F9D5F994F8A7F8A7F8A7F8A7F994FFFFFFFF0D0A00CC |
S123FE800000535953303942554720312E3420464F522042352D5833303020202D20044BD3 |
S123FEA00D0A000000043E04574841543F04202D2004202053503D04202050433D04202081 |
S123FEC055533D04202049593D04202049583D04202044503D042020413D042020423D0456 |
S115FEE0202043433A2004454648494E5A564353310403 |
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6 |
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9 |
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E |
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26 |
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02 |
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC |
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0 |
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294 |
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB |
S9030000FC |
/sys09s3s.lst
0,0 → 1,2771
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 NAM SYS09BUG FOR SPARTAN 3 STARTER |
0000 INCLUDE "opt_s3s.txt" |
0001 * |
0002 *************************************************** |
0003 * OPTION SWITCHES |
0004 *************************************************** |
0005 * |
0006 * |
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
0009 ** FOR LOADING AND SAVING S1 RECORDS |
0010 * |
0011 *S3EOPT EQU $FF SPARTAN3E STARTER |
0012 00FF S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
0017 * |
0002 END |
0000 INCLUDE "sys09equ.txt" |
0001 * |
0002 *************************************************** |
0003 * MEMORY MAP EQUATES * |
0004 *************************************************** |
0005 E000 MONIO EQU $E000 I/O SPACE |
0006 IFD S3EOPT |
0007 MONRAM EQU $7FC0 |
0008 ELSE |
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE |
0010 ENDIF S3EOPT |
0011 F800 MONROM EQU $F800 START OF ROM |
0012 IFD S3SOPT |
0013 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0014 0000 EXTCMD EQU $00 EXTENDED OFFSET |
0015 ENDIF S3SOPT |
0016 IFD XESOPT |
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0018 EXTCMD EQU $00 EXTENDED OFFSET |
0019 ENDIF XESOPT |
0019 ENDIF XESOPT |
0020 *************************************************** |
0021 |
0022 IFD S3EOPT |
0023 * |
0024 * DIGILENT SPARTAN 3E STARTER |
0025 * |
0026 ACIAOPT EQU $FF ACIA AT PORT 0 |
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0028 VDUOPT EQU $FF VDU AT $E030 |
0029 TRAOPT EQU $FF PIA TRACE TIMER |
0030 ENDIF S3EOPT |
0030 ENDIF S3EOPT |
0031 * |
0032 IFD S3SOPT |
0033 * |
0034 * DIGILENT SPARTAN 3 STARTER |
0035 * |
0036 00FF ACIAOPT EQU $FF ACIA AT PORT 0 |
0037 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0038 00FF VDUOPT EQU $FF VDU AT $E030 |
0039 00FF CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0040 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0041 00FF EXTOPT EQU $FF EXTENDED COMMANDS |
0042 ENDIF S3SOPT |
0043 * |
0044 IFD B5XOPT |
0045 * |
0046 * BURCHED B5-X300 |
0047 * |
0048 ACIAOPT EQU $FF ACIA AT PORT 0 |
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0050 VDUOPT EQU $FF VDU AT $E030 |
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0053 ENDIF B5XOPT |
0053 ENDIF B5XOPT |
0054 * |
0055 IFD XESOPT |
0056 * |
0057 * XESS XSA-3S1000 & XST-3.0 |
0058 * |
0059 ACIAOPT EQU $FF ACIA AT PORT 0 |
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0061 VDUOPT EQU $FF VDU AT $E030 |
0062 IDEOPT EQU $FF XESS IDE AT $E100 |
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0064 EXTOPT EQU $FF EXTENDED COMMANDS |
0065 ENDIF XESOPT |
0065 ENDIF XESOPT |
0066 * |
0067 IFD ADSOPT |
0068 * |
0069 * ACKERMAN DIGITAL ADS6809 |
0070 * |
0071 DG640OPT EQU $FF DG640 VDU AT $E800 |
0072 *RTCOPT EQU $FF REAL TIME CLOCK |
0073 PRTOPT EQU $FF PRINTER DRIVERS |
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0075 ENDIF ADSOPT |
0075 ENDIF ADSOPT |
0076 * |
0077 IFD SWTOPT |
0078 * |
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER |
0080 * |
0081 ACIAOPT EQU $FF ACIA AT PORT 0 |
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT |
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0085 ENDIF |
0085 ENDIF |
0086 * |
0087 IFD ACIAOPT |
0088 * |
0089 *************************************************** |
0090 * SERIAL PORT * |
0091 *************************************************** |
0092 * |
0093 ** ACIA SITS ON PORT 0 |
0094 * |
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT |
0096 * |
0097 ENDIF ACIAOPT |
0098 IFD MFDCOPT |
0099 * |
0100 *************************************************** |
0101 * MINIFLOPPY DRIVE * |
0102 *************************************************** |
0103 * |
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 |
0105 * |
0106 DRVFDC EQU MONIO+$14 |
0107 CMDFDC EQU MONIO+$18 |
0108 SECFDC EQU MONIO+$1A |
0109 DATFDC EQU MONIO+$1B |
0110 ENDIF MFDCOPT |
0110 ENDIF MFDCOPT |
0111 IFD PS2OPT |
0112 * |
0113 *************************************************** |
0114 * VDU8 PS/2 KEYBOARD PORT * |
0115 *************************************************** |
0116 * |
0117 ** KEYBOARD SITS ON PORT 2 |
0118 * |
0119 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT |
0120 ENDIF PS2OPT |
0121 IFD VDUOPT |
0122 * |
0123 *************************************************** |
0124 * VDU8 DISPLAY DRIVER EQUATES * |
0125 *************************************************** |
0126 * |
0127 ** VDU8 DISPLAY SITS ON PORT 3 |
0128 * |
0129 E030 VDU EQU MONIO+$30 |
0130 0000 VDUCHR EQU 0 CHARACTER REGISTER |
0131 0001 VDUATT EQU 1 ATTRIBUTE REGISTER |
0132 0002 VDUCOL EQU 2 CURSOR COLUMN |
0133 0003 VDUROW EQU 3 CURSOR ROW |
0134 0004 VDUOFF EQU 4 ROW OFFSET |
0135 * |
0136 0050 LINLEN EQU 80 LENGTH OF A LINE |
0137 0019 NUMLIN EQU 25 NUMBER OF LINES |
0138 ENDIF VDUOPT |
0139 * |
0140 IFD CF8OPT |
0141 * |
0142 *************************************************** |
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER * |
0144 *************************************************** |
0145 * |
0146 ** COMPACT FLASH SITS AT PORT 4 |
0147 * |
0148 E040 CF_BASE EQU MONIO+$40 |
0149 E040 CF_DATA EQU CF_BASE+0 |
0150 E041 CF_ERROR EQU CF_BASE+1 ; read error |
0151 E041 CF_FEATURE EQU CF_BASE+1 ; write feature |
0152 E042 CF_SECCNT EQU CF_BASE+2 |
0153 E043 CF_SECNUM EQU CF_BASE+3 |
0154 E044 CF_CYLLO EQU CF_BASE+4 |
0155 E045 CF_CYLHI EQU CF_BASE+5 |
0156 E046 CF_HEAD EQU CF_BASE+6 |
0157 E047 CF_STATUS EQU CF_BASE+7 ; read status |
0158 E047 CF_COMAND EQU CF_BASE+7 ; write command |
0159 * |
0160 * Command Equates |
0161 * |
0162 0020 CMDREAD EQU $20 ; Read Single sector |
0163 0030 CMDWRITE EQU $30 ; Write Single sector |
0164 00EF CMDFEATURE EQU $EF |
0165 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0166 00E0 HEADLBA EQU $E0 |
0167 * |
0168 * Status bit equates |
0169 * |
0170 0080 BUSY EQU $80 |
0171 0040 DRDY EQU $40 |
0172 0008 DRQ EQU $08 |
0173 0001 ERR EQU $01 |
0174 * |
0175 ENDIF CF8OPT |
0176 * |
0177 IFD IDEOPT |
0178 * |
0179 *************************************************** |
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) * |
0181 *************************************************** |
0182 * |
0183 ** COMPACT FLASH SITS AT PORT 4 |
0184 * |
0185 CF_BASE EQU MONIO+$0100 |
0186 CF_DATA EQU CF_BASE+0 |
0187 CF_ERROR EQU CF_BASE+2 ; read error |
0188 CF_FEATURE EQU CF_BASE+2 ; write feature |
0189 CF_SECCNT EQU CF_BASE+4 |
0190 CF_SECNUM EQU CF_BASE+6 |
0191 CF_CYLLO EQU CF_BASE+8 |
0192 CF_CYLHI EQU CF_BASE+10 |
0193 CF_HEAD EQU CF_BASE+12 |
0194 CF_STATUS EQU CF_BASE+14 ; read status |
0195 CF_COMAND EQU CF_BASE+14 ; write command |
0196 CF_AUX EQU CF_BASE+30 |
0197 * |
0198 * Command Equates |
0199 * |
0200 CMDREAD EQU $20 ; Read Single sector |
0201 CMDWRITE EQU $30 ; Write Single sector |
0202 AUXRESET EQU $06 ; Reset IDE |
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked |
0204 HEADLBA EQU $E0 |
0205 * |
0206 * Status bit equates |
0207 * |
0208 BUSY EQU $80 |
0209 DRDY EQU $40 |
0210 DRQ EQU $08 |
0211 ERR EQU $01 |
0212 * |
0213 ENDIF CF8OPT |
0213 ENDIF CF8OPT |
0214 * |
0215 IFD RTCOPT |
0216 * |
0217 ************************************************** |
0218 * MM58167A REAL TIME CLOCK MEMORY MAP: |
0219 ************************************************** |
0220 * |
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 |
0222 * |
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS |
0224 * |
0225 * COUNTER AND COMPARITOR REGISTERS: |
0226 * |
0227 * Both the Clock Counter and Clock Comparitor |
0228 * consist of 8 registers for holding the time. |
0229 * The register offsets from the Counter and |
0230 * Comparitor registers are listed above. |
0231 * |
0232 COUNTR EQU CLOCK+0 |
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS |
0234 * |
0235 * CLOCK REGISTER OFFSETS: |
0236 * These register offsets are used for the CLOCK |
0237 * and comparitor ram CMPRAM. |
0238 * |
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS |
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS |
0241 SECOND EQU 2 |
0242 MINUIT EQU 3 |
0243 HOUR EQU 4 |
0244 WKDAY EQU 5 |
0245 MTHDAY EQU 6 |
0246 MONTH EQU 7 |
0247 * |
0248 * INTERRUPT OUTPUT REGISTERS: |
0249 * |
0250 * An interrupt output may be generated at the |
0251 * following rates by setting the appropriate bit |
0252 * in the Interrupt Control Register (CINTCR). |
0253 * The Interrupt Status Register (CINTSR) must be |
0254 * read to clear the interrupt and will return |
0255 * the source of the interrupt. |
0256 * |
0257 * 1/Month Bit 7 |
0258 * 1/Week Bit 6 |
0259 * 1/Day Bit 5 |
0260 * 1/Hour Bit 4 |
0261 * 1/Minuite Bit 3 |
0262 * 1/Second Bit 2 |
0263 * 10/Second Bit 1 |
0264 * Comparitor Bit 0 |
0265 * |
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER |
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER |
0268 * |
0269 * COUNTER AND RAM RESETS; GO COMMAND. |
0270 * |
0271 * The counter and comparitor may be reset |
0272 * by writing $FF into CTRRES and CMPRES |
0273 * respectivly. |
0274 * A write to the Go command register (GOCMND) |
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths |
0276 * of a second counter. |
0277 * |
0278 CTRRES EQU CLOCK+18 COUNTER RESET |
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET |
0280 GOCMND EQU CLOCK+21 GO COMMAND |
0281 * |
0282 * CLOCK STATUS REGISTER. |
0283 * |
0284 * The counter takes 61 usec. to rollover for |
0285 * every 1KHz clock pulse. If the Status bit is |
0286 * set after reading the counter, the counter |
0287 * should be re-read to ensure the time is correct. |
0288 * |
0289 CLKSTA EQU CLOCK+20 STATUS BIT |
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT |
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER |
0292 ENDIF RTCOPT |
0292 ENDIF RTCOPT |
0293 * |
0294 IFD TRAOPT |
0295 * |
0296 ************************************************** |
0297 * PIA INTERRUPT TIMER |
0298 ************************************************** |
0299 * |
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7 |
0301 * |
0302 ** PIA TIMER FOR SINGLE STEP / TRACE |
0303 * |
0304 * TADATA = Output = Timer preset register |
0305 * TACTRL - CA1 = input = rising edge = NMI |
0306 * - CA2 = Output = Timer Reset (Active High) |
0307 * TBDATA = Input = Timer read back register |
0308 * TBCTRL - CB1 = input = rising edge = FIRQ |
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset |
0310 * |
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0312 * CRA1 = 1 CA1 Rising edge IRQ |
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0315 * CRA4 = 1 ] CA2 = Set/Reset output |
0316 * CRA5 = 1 ] |
0317 * CRA6 = X CA2 Input Interrupt Flag |
0318 * CRA7 = X CA1 Interrupt Flag |
0319 * |
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0321 * CRB1 = 1 CB1 Rising edge IRQ |
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0324 * CRB4 = 1 ] CB2 = Set/Reset output |
0325 * CRB5 = 1 ] |
0326 * CRB6 = X CB2 Input Interrupt Flag |
0327 * CRB7 = X CB1 Interrupt Flag |
0328 * |
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output |
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output |
0331 * |
0332 TADATA EQU MONIO+$70 Timer preset port |
0333 TACTRL EQU MONIO+$71 |
0334 TBDATA EQU MONIO+$72 Timer read back port |
0335 TBCTRL EQU MONIO+$73 |
0336 * |
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) |
0338 * |
0339 ENDIF TRAOPT |
0339 ENDIF TRAOPT |
0340 IFD ADSOPT |
0341 * |
0342 *************************************************** |
0343 * SERIAL PORT FOR DG640 * |
0344 *************************************************** |
0345 * |
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809 |
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA |
0348 * |
0349 ACIAS EQU MONIO+$400 CONTROL PORT |
0350 * |
0351 ENDIF ADSOPT |
0351 ENDIF ADSOPT |
0352 IFD PRTOPT |
0353 * |
0354 *************************************************** |
0355 * PRINTER INTERFACE * |
0356 *************************************************** |
0357 * |
0358 PADATA EQU MONIO+$404 |
0359 PACTRL EQU MONIO+$405 |
0360 PBDATA EQU MONIO+$406 |
0361 PBCTRL EQU MONIO+$407 |
0362 * |
0363 ** CB1 ACK. I/P |
0364 ** CB2 STB. O/P |
0365 ** PB0 - PB7 DATA 1 - 8 O/P |
0366 ** PORT A BIT ASSIGNMENT |
0367 * |
0368 PBUSY EQU $80 I/P |
0369 PEMPTY EQU $40 I/P |
0370 SELECT EQU $20 I/P |
0371 PERROR EQU $10 I/P |
0372 PRESET EQU %00000100 O/P PA3 = 0 |
0373 AUTOFD EQU %00001000 O/P PA2 = 0 |
0374 DIRMSK EQU %00001100 |
0375 ENDIF PRTOPT |
0375 ENDIF PRTOPT |
0376 IFD DG640OPT |
0377 * |
0378 *************************************************** |
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0380 *************************************************** |
0381 * |
0382 ** VIDEO DISPLAY DEFINITIONS |
0383 * |
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY |
0385 LINLEN EQU 64 LENGTH OF A LINE |
0386 NUMLIN EQU 16 NUMBER OF LINES |
0387 SCNLEN EQU $400 LENGTH OF SCREEN |
0388 ENDIF DG640OPT |
0388 ENDIF DG640OPT |
0389 * |
0390 IFD DMAFOPT |
0391 * |
0392 *************************************************** |
0393 * DMAF2 8" DRIVE * |
0394 *************************************************** |
0395 * |
0396 ADDREG EQU $F000 ADDRESS REGISTER |
0397 CNTREG EQU $F002 COUNT REGISTER |
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER |
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER |
0400 AAAREG EQU $F015 ??? |
0401 BBBREG EQU $F016 ??? |
0402 COMREG EQU $F020 1791 COMMAND REGISTER |
0403 SECREG EQU $F022 SECTOR REGISTER |
0404 DRVREG EQU $F024 DRIVE SELECT LATCH |
0405 CCCREG EQU $F040 ??? |
0406 ENDIF DMAFOPT |
0406 ENDIF DMAFOPT |
0407 IFD DATOPT |
0408 ************************************************** |
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS * |
0410 ************************************************** |
0411 * |
0412 FFF0 IC11 EQU $FFF0 DAT RAM CHIP |
0413 55AA TSTPAT EQU $55AA TEST PATTERN |
0414 ENDIF DATOPT |
0415 * |
0003 END |
0000 INCLUDE "sys09bug.txt" |
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR |
0002 OPT l |
|
|
sys09bug.txt page 2 |
0004 * |
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL |
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY.... |
0007 * |
0008 * ALLEN CLARK WALLACE WATSON |
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE. |
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617 |
0011 * PH. 813-977-0347 PH. 813-985-1359 |
0012 * |
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT |
0014 * 2561 NANTUCKET DR APT. E |
0015 * ATLANTA, GA 30345 |
0016 * PH. 404-320-1043 |
0017 * |
0018 * MODIFIED TO SYS09BUG VER 1.0 |
0019 * FOR: SYSTEM09 FPGA SYSTEM |
0020 * BY: JOHN KENT |
0021 * DATE: 21ST NOVEMBER 2006 |
0022 * REMOVED: DISK BOOTS |
0023 * MEMORY TEST |
0024 * ADDED: ADM3A VDU DRIVER |
0025 * |
0026 * MODIFIED TO SYS09BUG VER 1.1 |
0027 * FOR: SYSTEM09 FPGA SYSTEM |
0028 * BY: JOHN KENT |
0029 * DATE: 7TH JANUARY 2007 |
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000 |
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS |
0032 * AND REALTIME CLOCK |
0033 * |
0034 * MODIFIED TO SYS09BUG VER 1.2 |
0035 * FOR: SYSTEM09 FPGA SYSTEM |
0036 * BY: JOHN KENT |
0037 * DATE: 21ST MAY 2007 |
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION |
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD |
0040 * |
0041 * Modified to SYS09BUG VER 1.3 |
0042 * FOR: SYSTEM09 FPGA SYSTEM |
0043 * BY: JOHN KENT |
0044 * DATE: 8TH JAN 2008 |
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD |
0046 * WITH ONLY 32K OF RAM |
0047 * |
0048 * Modified to SYS09BUG VER 1.4 |
0049 * FOR: SYSTEM09 FPGA SYSTEM |
0050 * BY: JOHN KENT |
0051 * DATE: 3RD FEB 2008 |
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE |
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300 |
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE |
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
0056 * |
0057 * *** COMMANDS *** |
0058 * |
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR |
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR |
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER |
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER |
0063 * CONTROL P = ALTER THE PROGRAM COUNTER |
0064 * CONTROL U = ALTER USER STACK POINTER |
0065 * CONTROL X = ALTER "X" INDEX REGISTER |
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER |
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh |
0068 * D = 5.25" MINIFLOPPY BOOT |
0069 * E ssss-eeee = EXAMINE MEMORY |
0070 * FROM STARTING ADDRESS ssss |
0071 * TO ENDING ADDRESS eeee. |
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI |
0073 * L = LOAD TAPE |
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh |
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. |
0076 * R = DISPLAY REGISTER CONTENTS |
0077 * S = DISPLAY STACK FROM ssss TO $DFC0 |
0078 * U = 8" DMAF2 FLOPPY BOOT |
0079 * U = USER EXTENSION COMMANDS AT $F000 |
0080 * X = REMOVE ALL BREAKPOINTS |
0081 * |
0082 * |
0083 *************************************************** |
0084 * SYS09BUG VARIABLE SPACE |
0085 *************************************************** |
0086 * |
0087 DFC0 ORG MONRAM |
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK |
0089 DFC0 NMI RMB 2 USER NMI VECTOR |
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 |
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 |
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR |
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR |
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR |
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN |
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT |
0097 IFD DATOPT |
0098 DFD0 LRARAM RMB 16 LRA ADDRESSES |
0099 ENDIF DATOPT |
0100 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT |
0101 DFE2 ECHO RMB 1 ECHO FLAG |
0102 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR |
0103 IFD TRAOPT |
0104 NMISAV RMB 2 NMI Jump Vector Backup |
0105 TRACNT RMB 2 Trace Count |
0106 ENDIF TRAOPT |
0106 ENDIF TRAOPT |
0107 IFD VDUOPT |
0108 * |
0109 ************************************************** |
0110 * VDU8 DISPLAY DRIVER VARIABLES * |
0111 ************************************************** |
0112 * |
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** |
0114 DFFB COLADX RMB 1 CURSOR COLUMN |
0115 DFFC ROWADX RMB 1 CURSOR ROW |
0116 ************************************************** |
0117 * |
0118 DFFD NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0119 DFFE ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0120 ENDIF VDUOPT |
0121 IFD DG640OPT |
0122 * |
0123 *************************************************** |
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0125 *************************************************** |
0126 * |
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** |
0128 COLADX RMB 1 CURSOR COLUMN |
0129 ROWADX RMB 1 CURSOR ROW |
0130 ************************************************* |
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS |
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0134 ENDIF DG640OPT |
0134 ENDIF DG640OPT |
0135 * |
0136 * |
0137 *************************************************** |
0138 * START OF ROM * |
0139 *************************************************** |
0140 * |
0141 F800 ORG MONROM |
0142 F800 F8 14 FDB MONITOR |
0143 F802 F8 61 FDB NEXTCMD |
0144 F804 FC A1 FDB INCH |
0145 F806 FC 9B FDB INCHE |
0146 F808 FC B9 FDB INCHEK |
0147 F80A FC CE FDB OUTCH |
0148 F80C FB 8F FDB PDATA |
0149 F80E FB 1E FDB PCRLF |
0150 F810 FB 1A FDB PSTRNG |
0151 F812 FA 2E FDB LRA |
0152 * |
0153 IFD ADSOPT |
0154 FDB PCHK CHECK FOR PRINTER INPUT |
0155 FDB PINIZ INITIATE PRINTER |
0156 FDB POUTCH OUTPUT CH. TO PRINTER |
0157 FDB VINIZ |
0158 FDB VOUTCH |
0159 FDB ACINIZ |
0160 FDB AOUTCH |
0161 ENDIF ADSOPT |
0161 ENDIF ADSOPT |
0162 * |
0163 * MONITOR |
0164 * |
0165 * VECTOR ADDRESS STRING IS..... |
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF |
0167 * |
0168 F814 8E FE 74 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING |
0169 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION |
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16 |
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE |
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF |
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE |
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED |
0175 * |
0176 * CONTENTS FROM TO FUNCTION |
0177 * $F8A1 $FE40 $DFC0 USER-V |
0178 * $F8A1 $FE42 $DFC2 SWI3-V |
0179 * $F8A1 $FE44 $DFC4 SWI2-V |
0180 * $F8A1 $FE46 $DFC6 FIRQ-V |
0181 * $F8A1 $FE48 $DFC8 IRQ-V |
0182 * $FAB0 $FE4A $DFCA SWI-V |
0183 * $FFFF $FE4C $DFCC SVC-VO |
0184 * $FFFF $FE4E $DFCE SVC-VL |
0185 * |
0186 F824 8E E0 00 LDX #ACIAS |
0187 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM |
0188 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS |
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK |
0190 F82F 6F E2 CLRSTK CLR ,-S |
0191 F831 5A DECB |
0192 F832 26 FB BNE CLRSTK |
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY |
0194 F837 AF 6A STX 10,S ON STACK |
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK |
0196 F83B A7 E4 STA ,S |
0197 F83D 1F 43 TFR S,U |
0198 F83F 17 04 9F LBSR IOINIZ INITIALIZE CONTROL PORT |
0199 F842 8E FE 84 LDX #MSG1 POINT TO MONITOR MESSAGE |
0200 F845 17 03 47 LBSR PDATA PRINT MSG |
0201 * |
0202 IFD DATOPT |
0203 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA |
0204 F84B 4F CLRA START TOTAL AT ZERO |
0205 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY |
0206 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC. |
0207 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC. |
0208 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL |
0209 F854 19 DAA ADJ. TOTAL FOR DECIMAL |
0210 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST |
0211 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM |
0212 F858 17 04 0C LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0213 F85B 8E FE A8 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS |
0214 F85E 17 03 2E LBSR PDATA PRINT MSG |
0215 ENDIF DATOPT |
0216 * |
0217 IFD TRAOPT |
0218 LBSR TRAINZ |
0219 ENDIF TRAOPT |
0219 ENDIF TRAOPT |
0220 * |
0221 ***** NEXTCMD ***** |
0222 * |
0223 F861 8E FE AF NEXTCMD LDX #MSG3 POINT TO MSG ">" |
0224 F864 17 02 B3 LBSR PSTRNG PRINT MSG |
0225 F867 17 04 37 LBSR INCH GET ONE CHAR. FROM TERMINAL |
0226 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
0227 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ? |
0228 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. |
0229 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM. |
0230 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ? |
0231 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT |
0232 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO... |
0233 F878 17 04 53 LBSR OUTCH PRINT "^" |
0234 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR |
0235 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER |
0236 F87F 17 04 4C PRTCMD LBSR OUTCH PRNT CMD CHAR |
0237 F882 17 04 47 LBSR OUT1S PRNT SPACE |
0238 F885 C1 60 CMPB #$60 |
0239 F887 2F 02 BLE NXTCH0 |
0240 F889 C0 20 SUBB #$20 |
0241 * |
0242 ***** DO TABLE LOOKUP ***** |
0243 * FOR COMMAND FUNCTIONS |
0244 * |
0245 F88B 8E FE 3B NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE |
0246 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
0247 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND |
0248 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
0249 F894 8C FE 74 CMPX #TABEND REACHED END OF TABLE YET ? |
0250 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY |
0251 F899 8E FE B1 LDX #MSG4 POINT TO MSG "WHAT?" |
0252 F89C 17 02 F0 LBSR PDATA PRINT MSG |
0253 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD |
0254 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE |
0255 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND |
0256 * |
0257 * "G" GO OR CONTINUE |
0258 * |
0259 F8A5 1F 34 GO TFR U,S |
0260 F8A7 3B RTI RTI |
0261 * |
0262 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0263 * |
0264 F8A8 17 03 6B MEMCHG LBSR IN1ADR INPUT ADDRESS |
0265 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN |
0266 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y" |
0267 F8AF 8E FE B7 MEMC2 LDX #MSG5 POINT TO MSG " - " |
0268 F8B2 17 02 65 LBSR PSTRNG PRINT MSG |
0269 F8B5 1F 21 TFR Y,X FETCH ADDRESS |
0270 F8B7 17 03 A5 LBSR OUT4H PRINT ADDR IN HEX |
0271 F8BA 17 04 0F LBSR OUT1S OUTPUT SPACE |
0272 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR. |
0273 F8BF 17 03 A5 LBSR OUT2H OUTPUT CONTENTS IN ASCII |
0274 F8C2 17 04 07 LBSR OUT1S OUTPUT SPACE |
0275 F8C5 17 03 5E LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
0276 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
0277 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
0278 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN |
0279 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? |
0280 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN |
0281 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW? |
0282 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE |
0283 F8D6 81 0D CMPA #$D IS IT A CR? |
0284 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE |
0285 F8DA 39 CHRTN RTS EXIT ROUTINE |
0286 * |
0287 * |
0288 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY |
0289 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE? |
0290 F8DF 27 08 BEQ FORWRD $F972 |
0291 F8E1 17 03 E8 LBSR OUT1S OUTPUT SPACE |
0292 F8E4 86 3F LDA #'? LOAD QUESTION MARK |
0293 F8E6 17 03 E5 LBSR OUTCH PRINT IT |
0294 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
0295 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS |
0296 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION |
0297 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS |
0298 * |
0299 * "S" DISPLAY STACK |
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM |
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. |
0302 * |
0303 F8F1 17 02 A2 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER |
0304 F8F4 1F 32 TFR U,Y |
0305 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT |
0306 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK |
0307 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS |
0308 * |
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII |
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. |
0311 * UPPER ADDRESS IN X-REG. |
0312 * IF HEX ADDRESSES ARE INVALID (V)=1. |
0313 * |
0314 F8FD 17 03 0B MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES |
0315 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX |
0316 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS |
0317 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? |
0318 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII |
0319 F908 39 EDPRTN RTS ; |
0320 * |
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0322 * TO EVEN 16 BYTE BOUNDRIES. |
0323 * |
0324 * IF LOWER ADDR = $4532 |
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0326 * |
0327 * IF UPPER ADDR = $4567 |
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0329 * |
0330 * ENTER WITH LOWER ADDRESS IN X-REG. |
0331 * -UPPER ADDRESS ON TOP OF STACK. |
0332 * |
0333 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
0334 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS |
0335 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0336 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
0337 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
0338 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0339 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
0340 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
0341 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
0342 F91C 17 03 9A LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
0343 F91F 27 03 BEQ EDUMP |
0344 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
0345 F923 39 RTS ; |
0346 * |
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0349 * |
0350 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
0351 F926 8E FE B7 LDX #MSG5 POINT TO MSG " - " |
0352 F929 17 01 EE LBSR PSTRNG PRINT MSG |
0353 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
0354 F92E 17 03 2E LBSR OUT4H PRINT THE ADDRESS |
0355 F931 17 03 96 LBSR OUT2S 2 SPACES |
0356 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
0357 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT |
0358 F938 17 03 2C LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0359 F93B 17 03 8E LBSR OUT1S OUTPUT SPACE |
0360 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT |
0361 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
0362 * |
0363 * PRINT 16 ASCII CHARACTERS |
0364 * IF NOT PRINTABLE OR NOT VALID |
0365 * ASCII PRINT A PERIOD (.) |
0366 F941 17 03 86 LBSR OUT2S 2 SPACES |
0367 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
0368 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 |
0369 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY |
0370 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
0371 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
0372 F94E 81 7E CMPA #$7E IS IT VALID ASCII? |
0373 F950 23 02 BLS PRASC IF SO PRINT IT |
0374 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.) |
0375 F954 17 03 77 PRASC LBSR OUTCH PRINT ASCII CHARACTER |
0376 F957 5A DECB DECREMENT COUNT |
0377 F958 26 EE BNE EDPASC |
0378 F95A 20 BC BRA NXTLIN |
0379 * |
0380 ***** "B" SET BREAKPOINT ***** |
0381 * |
0382 F95C 17 02 B7 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS |
0383 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR. |
0384 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 |
0385 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT |
0386 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK |
0387 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE |
0388 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE |
0389 F96D 35 10 PULS X POP BP ADDRESS FROM STACK |
0390 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE |
0391 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS |
0392 F973 81 3F CMPA #$3F IS IT A SWI? |
0393 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR |
0394 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE |
0395 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE |
0396 F97B 86 3F LDA #$3F LOAD A SWI ($3F) |
0397 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS |
0398 F97F 39 EXITBP RTS ; |
0399 * |
0400 * INDICATE ERROR SETTING BREAKPOINT |
0401 * |
0402 F980 17 03 49 BPERR LBSR OUT1S OUTPUT SPACE |
0403 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR |
0404 F985 16 03 46 LBRA OUTCH PRINT "?" |
0405 * |
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** |
0407 * |
0408 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE |
0409 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0410 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE |
0411 F990 5A DECB $FAAC DECREMENT BP COUNTER |
0412 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE? |
0413 F993 39 RTS |
0414 * |
0415 ***** SWI ENTRY POINT ***** |
0416 * |
0417 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER |
0418 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG |
0419 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE. |
0420 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE |
0421 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR |
0422 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK |
0423 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA |
0424 F9A2 17 02 48 REGPR LBSR REGSTR GO PRINT REGISTERS |
0425 * |
0426 IFD TRAOPT |
0427 LDX #0 |
0428 STX TRACNT |
0429 ENDIF TRAOPT |
0429 ENDIF TRAOPT |
0430 * |
0431 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND |
0432 * |
0433 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE |
0434 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY |
0435 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S |
0436 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS |
0437 F9B1 81 3F CMPA #$3F IS IT SWI? |
0438 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S |
0439 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE |
0440 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS |
0441 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC |
0442 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S |
0443 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S |
0444 F9BF A7 A0 STA ,Y+ |
0445 F9C1 39 RTS |
0446 * |
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH ** |
0448 * |
0449 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE |
0450 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0451 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE |
0452 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? |
0453 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY |
0454 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER |
0455 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH |
0456 F9D1 39 RTS ; |
0457 * |
0458 * |
0459 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY |
0460 F9D4 39 RTS |
0461 * |
0462 IFD TRAOPT |
0463 * |
0464 ** TRACE from address AAAA BB bytes |
0465 * |
0466 TRACE LBSR ALTPC1 SET UP NEW PC |
0467 BVS TREXIT ADDRESS ERROR, EXIT |
0468 LBSR OUT1S |
0469 LBSR IN1ADR Fetch Byte Count |
0470 BVS TREXIT Byte Count error, EXIT |
0471 STX TRACNT |
0472 * |
0473 LDX NMI Save NMI Vector |
0474 STX NMISAV |
0475 LDX #NMIE Set up NMI for Tracing |
0476 STX NMI |
0477 LBSR TRAINZ Initialise Hardware |
0478 BRA TRACEG Start Trace |
0479 TREXIT RTS |
0480 * |
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0482 * CRA1 = 1 CA1 Rising edge IRQ |
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0485 * CRA4 = 1 ] CA2 = Set/Reset output |
0486 * CRA5 = 1 ] |
0487 * CRA6 = X CA2 Input Interrupt Flag |
0488 * CRA7 = X CA1 Interrupt Flag |
0489 * |
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0491 * CRB1 = 1 CB1 Rising edge IRQ |
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0494 * CRB4 = 1 ] CB2 = Set/Reset output |
0495 * CRB5 = 1 ] |
0496 * CRB6 = X CB2 Input Interrupt Flag |
0497 * CRB7 = X CB1 Interrupt Flag |
0498 * |
0499 * |
0500 ** TRACE NMI ENTRY POINT |
0501 * |
0502 NMIE TFR S,U |
0503 LDA #$36 Disable Interrupt, CA2 Low |
0504 STA TACTRL |
0505 LDA TADATA Clear Interrupt flag by reading data port |
0506 * |
0507 LBSR REGSTR DUMP REGISTERS |
0508 * |
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI |
0510 LDA ,X |
0511 CMPA #$3F |
0512 BEQ TRACEX EXIT ON SWI |
0513 * |
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED |
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR |
0516 LEAX -1,X DECREMENT TRACE COUNT |
0517 STX TRACNT |
0518 * |
0519 ** TRACE GO (RESUME SINGLE STEP) |
0520 * |
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER |
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) |
0523 STA TADATA |
0524 LDA #$36 LOAD STROBE LOW |
0525 STA TACTRL |
0526 LDA TADATA CLEAR INTERRUPT |
0527 LDA #$36 RELEASE RESET |
0528 STA TBCTRL |
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE |
0530 STA TACTRL |
0531 RTI GO EXECUTE INSTRUCTION |
0532 * |
0533 TRACEX LDX NMISAV Restore NMI vector |
0534 STX NMI |
0535 LBRA NEXTCMD Jump back to the command loop. |
0536 * |
0537 ** TRACE HARDWARE INITIALISATION |
0538 * |
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED |
0540 STA TACTRL |
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED |
0542 STA TBCTRL |
0543 LDA #$FF PORTA = OUTPUT |
0544 STA TADATA |
0545 LDA #$00 PORTB = INPUT |
0546 STA TBDATA |
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW |
0548 STA TACTRL |
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH |
0550 STA TBCTRL |
0551 RTS |
0552 * |
0553 ENDIF TRAOPT |
0553 ENDIF TRAOPT |
0554 IFD MFDCOPT |
0555 * |
0556 ** "U" MINI DISK BOOT |
0557 * |
0558 MINBOOT TST CMDFDC |
0559 CLR DRVFDC |
0560 LDX #$0000 |
0561 LOOP LEAX $01,X |
0562 CMPX #$0000 |
0563 BNE LOOP |
0564 LDA #$0F |
0565 STA CMDFDC |
0566 BSR DELAY |
0567 LOOP1 LDB CMDFDC |
0568 BITB #$01 |
0569 BNE LOOP1 |
0570 LDA #$01 |
0571 STA SECFDC |
0572 BSR DELAY |
0573 LDA #$8C |
0574 STA CMDFDC |
0575 BSR DELAY |
0576 LDX #$C000 |
0577 BRA LOOP3 |
0578 LOOP2 BITB #$02 |
0579 BEQ LOOP3 |
0580 LDA DATFDC |
0581 STA ,X+ |
0582 LOOP3 LDB CMDFDC |
0583 BITB #$01 |
0584 BNE LOOP2 |
0585 BITB #$2C |
0586 BEQ LOOP4 |
0587 RTS |
0588 * |
0589 LOOP4 LDX #$C000 |
0590 STX $0A,U |
0591 TFR U,S |
0592 RTI |
0593 * |
0594 DELAY LDB #$04 |
0595 LOOP5 DECB |
0596 BNE LOOP5 |
0597 RTS |
0598 ENDIF MFDCOPT |
0598 ENDIF MFDCOPT |
0599 * |
0600 IFD DMAFOPT |
0601 * |
0602 *** "D" DISK BOOT FOR DMAF2 *** |
0603 * |
0604 DBOOT LDA #$DE |
0605 STA DRVREG |
0606 LDA #$FF |
0607 STA PRIREG $FAF8 |
0608 STA CCREG |
0609 STA AAAREG |
0610 STA BBBREG |
0611 TST CCREG |
0612 LDA #$D8 |
0613 STA COMREG |
0614 LBSR DLY |
0615 DBOOT0 LDA COMREG |
0616 BMI DBOOT0 |
0617 LDA #$09 |
0618 STA COMREG |
0619 LBSR DLY |
0620 * |
0621 DISKWT LDA COMREG FETCH DRIVE STATUS |
0622 BITA #1 TEST BUSY BIT |
0623 BNE DISKWT LOOP UNTIL NOT BUSY |
0624 * |
0625 BITA #$10 |
0626 BNE DBOOT |
0627 * |
0628 LDX #$C000 LOGICAL ADDR. = $C000 |
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. |
0630 ORA #$10 |
0631 STA CCCREG |
0632 TFR X,D |
0633 COMA ; |
0634 COMB ; |
0635 STD ADDREG |
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100 |
0637 STX CNTREG STORE IN COUNT REGISTER |
0638 LDA #$FF LOAD THE CHANNEL REGISTER |
0639 STA CCREG |
0640 LDA #$FE SET CHANNEL 0 |
0641 STA PRIREG |
0642 LDA #1 SET SECTOR TO "1" |
0643 STA SECREG ISSUE COMMAND |
0644 LDA #$8C SET SINGLE SECTOR READ |
0645 STA COMREG ISSUE COMMAND |
0646 BSR DLY |
0647 * |
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE |
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT |
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7" |
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT |
0652 * IS STILL A ONE THE BOOT OPERATION WILL |
0653 * BE STARTED OVER FROM THE BEGINING. |
0654 * |
0655 CLRB ; |
0656 DBOOT1 PSHS B $FB55 |
0657 CLRB ; |
0658 DBOOT2 TST CCREG |
0659 BPL DBOOT3 |
0660 DECB ; |
0661 BNE DBOOT2 |
0662 PULS B |
0663 DECB |
0664 BNE DBOOT1 |
0665 BRA DBOOT |
0666 DBOOT3 PULS B |
0667 LDA COMREG |
0668 BITA #$1C |
0669 BEQ DBOOT4 |
0670 RTS ; |
0671 * |
0672 * |
0673 DBOOT4 LDB #$DE |
0674 STB DRVREG |
0675 LDX #$C000 |
0676 STX 10,U |
0677 TFR U,S $FB7B |
0678 RTI ; |
0679 ENDIF DMAFOPT |
0679 ENDIF DMAFOPT |
0680 * |
0681 IFD CF8OPT |
0682 * |
0683 * COMPACT FLASH BOOT |
0684 * |
0685 F9D5 8D 40 CFBOOT BSR WAITRDY |
0686 F9D7 86 E0 LDA #HEADLBA |
0687 F9D9 B7 E0 46 STA CF_HEAD |
0688 F9DC 8D 39 BSR WAITRDY |
0689 F9DE 86 01 LDA #FEAT8BIT |
0690 F9E0 B7 E0 41 STA CF_FEATURE |
0691 F9E3 86 EF LDA #CMDFEATURE |
0692 F9E5 B7 E0 47 STA CF_COMAND |
0693 F9E8 8D 2D BSR WAITRDY |
0694 * |
0695 * READ SECTORS FROM CF |
0696 * |
0697 F9EA 86 01 CFREAD LDA #$01 |
0698 F9EC B7 E0 42 STA CF_SECCNT |
0699 F9EF 4F CLRA |
0700 F9F0 B7 E0 43 STA CF_SECNUM |
0701 F9F3 B7 E0 44 STA CF_CYLLO |
0702 F9F6 B7 E0 45 STA CF_CYLHI |
0703 * |
0704 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE |
0705 F9FB B7 E0 47 STA CF_COMAND |
0706 F9FE 8D 17 BSR WAITRDY |
0707 FA00 8E C0 00 LDX #$C000 |
0708 * |
0709 * READ LOOP |
0710 * |
0711 FA03 8D 21 RDLOOP BSR WAITDRQ |
0712 FA05 B6 E0 40 LDA CF_DATA |
0713 FA08 A7 80 STA ,X+ |
0714 FA0A 8C C2 00 CMPX #$C200 |
0715 FA0D 26 F4 BNE RDLOOP |
0716 * |
0717 FA0F 8E C0 00 LDX #$C000 |
0718 FA12 AF 4A STX $0A,U |
0719 FA14 1F 34 TFR U,S |
0720 FA16 3B RTI |
0721 * |
0722 * WAIT UNTIL READY |
0723 * |
0724 FA17 B6 E0 47 WAITRDY LDA CF_STATUS |
0725 FA1A 85 80 BITA #BUSY |
0726 FA1C 26 F9 BNE WAITRDY |
0727 FA1E B6 E0 47 LDA CF_STATUS |
0728 FA21 85 40 BITA #DRDY |
0729 FA23 27 F2 BEQ WAITRDY |
0730 FA25 39 RTS |
0731 * |
0732 * WAIT FOR DATA REQUEST |
0733 * |
0734 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS |
0735 FA29 85 08 BITA #DRQ |
0736 FA2B 27 F9 BEQ WAITDRQ |
0737 FA2D 39 RTS |
0738 ENDIF CF8OPT |
0739 * |
0740 IFD IDEOPT |
0741 * |
0742 * XESS 16 BIT IDE BOOT |
0743 * |
0744 IDEBOOT LDD #AUXRESET |
0745 STD CF_AUX |
0746 LDD #AUXRSTREL |
0747 STD CF_AUX |
0748 LDD #HEADLBA |
0749 STD CF_HEAD |
0750 BSR WAITRDY |
0751 * |
0752 * READ SECTORS FROM CF |
0753 * |
0754 LDD #$01 |
0755 STD CF_SECCNT |
0756 CLRB |
0757 STD CF_SECNUM |
0758 STD CF_CYLLO |
0759 STD CF_CYLHI |
0760 * |
0761 LDB #CMDREAD ; IDE READ MULTIPLE |
0762 STD CF_COMAND |
0763 BSR WAITRDY |
0764 LDX #$C000 |
0765 * |
0766 * READ LOOP |
0767 * |
0768 RDLOOP BSR WAITDRQ |
0769 LDD CF_DATA |
0770 STB ,X+ |
0771 CMPX #$C100 |
0772 BNE RDLOOP |
0773 * |
0774 LDX #$C000 |
0775 STX $0A,U |
0776 TFR U,S |
0777 RTI |
0778 * |
0779 * WAIT UNTIL READY |
0780 * |
0781 WAITRDY LDD CF_STATUS |
0782 BITB #BUSY |
0783 BNE WAITRDY |
0784 LDD CF_STATUS |
0785 BITB #DRDY |
0786 BEQ WAITRDY |
0787 RTS |
0788 * |
0789 * WAIT FOR DATA REQUEST |
0790 * |
0791 WAITDRQ LDD CF_STATUS |
0792 BITB #DRQ |
0793 BEQ WAITDRQ |
0794 RTS |
0795 ENDIF IDEOPT |
0795 ENDIF IDEOPT |
0796 * |
0797 IFD RTCOPT |
0798 * |
0799 * CLOCK INTER FACE UTILITY |
0800 * |
0801 * TIME <Hours> <Minuits> <Seconds> |
0802 * If no argument is specified, the current time |
0803 * will be displayed. |
0804 * |
0805 * READ A REGISTER FROM THE COUNTER. |
0806 * The X Index rgister points to the register |
0807 * to be read. The Status Register is checked |
0808 * before and after the register is read before |
0809 * returning a value in accumulator A |
0810 * |
0811 RDCLK TST CLKSTA |
0812 BNE RDCLK |
0813 RDCLK1 LDA 0,X |
0814 TST CLKSTA |
0815 BNE RDCLK1 |
0816 RTS |
0817 * |
0818 * MAIN PROGRAM: |
0819 * |
0820 TIMSET LDX #COUNTR POINT TO TIMER |
0821 LBSR BYTE READ HOURS |
0822 BVS SHOWTM NO ARG, DISP TIME |
0823 STA HOUR,X |
0824 LBSR OUT1S |
0825 LBSR BYTE READ MINUITES |
0826 BVS SHOWTM |
0827 STA MINUIT,X |
0828 LBSR OUT1S |
0829 LBSR BYTE SECONDS. |
0830 BVS SHOWTM |
0831 STA SECOND,X |
0832 * |
0833 * DISPLAY CURRENT TIME |
0834 * |
0835 SHOWTM LBSR PCRLF |
0836 LDX #COUNTR+HOUR |
0837 LDB #3 |
0838 SHOWLP BSR RDCLK |
0839 LBSR OUT2H |
0840 LDA #': |
0841 LBSR OUTCH |
0842 LEAX -1,X |
0843 DECB |
0844 BNE SHOWLP |
0845 RTS |
0846 * |
0847 * INITIATE CLOCK. |
0848 * MASK INTERRUPTS. |
0849 * |
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS |
0851 TST CINTSR CLEAR ANY INTERRUPTS |
0852 RTS |
0853 ENDIF RTCOPT |
0853 ENDIF RTCOPT |
0854 IFD DATOPT |
0855 * |
0856 ***** LRA LOAD REAL ADDRESS ***** |
0857 * |
0858 * THE FOLLOWING CODE LOADS THE 20-BIT |
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE |
0860 * INTO THE "A" AND "X" REGISTERS. THIS |
0861 * ROUTINE IS ENTERED WITH THE LOGICAL |
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX" |
0863 * REGISTER. EXIT IS MADE WITH THE HIGH- |
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL |
0865 * ADDRESS IN THE "A" REGISTER, AND THE |
0866 * LOW-ORDER 16-BITS OF THE 20-BIT |
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER. |
0868 * ALL OTHER REGISTERS ARE PRESERVED. |
0869 * THIS ROUTINE IS REQUIRED SINCE THE |
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST |
0871 * PRESENT PHYSICAL ADDRESSES ON THE |
0872 * SYSTEM BUS. |
0873 * |
0874 FA2E 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK |
0875 FA30 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK |
0876 FA32 44 LSRA ; |
0877 FA33 44 LSRA ADJ FOR INDEXED INTO |
0878 FA34 44 LSRA CORRESPONDING LOCATION |
0879 FA35 44 LSRA IN LRA TABLE |
0880 FA36 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS |
0881 FA3A E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE |
0882 FA3C 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED |
0883 FA3D 54 LSRB PHYSICAL ADDRESS. |
0884 FA3E 54 LSRB EXTENDED MS 4-BITS ARE RETURNED |
0885 FA3F 54 LSRB IN THE "A" ACCUMULATOR |
0886 FA40 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK |
0887 FA42 E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE |
0888 FA44 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG |
0889 FA45 58 ASLB ADJ DATA FOR RELOCATION IN X REG |
0890 FA46 58 ASLB ; |
0891 FA47 58 ASLB $FB97 |
0892 FA48 58 ASLB ; |
0893 FA49 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR. |
0894 FA4B 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS |
0895 FA4D A7 62 STA 2,S SAVE IT IN X REG ON STACK |
0896 FA4F EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. |
0897 * |
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS |
0899 FA51 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG |
0900 * ON STACK |
0901 FA53 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK |
0902 ENDIF DATOPT |
0903 * |
0904 * DELAY LOOP |
0905 * |
0906 FA55 34 04 DLY PSHS B SAVE CONTENTS OF "B" |
0907 FA57 C6 20 LDB #$20 GET LOOP DELAY VALUE |
0908 FA59 5A SUB1 DECB SUBTRACT ONE FROM VALUE |
0909 FA5A 26 FD BNE SUB1 LOOP UNTIL ZERO |
0910 FA5C 35 84 PULS B,PC RESTORE CONTENTS OF "B" |
0911 * RTS ; |
0912 * |
0913 ***** "L" LOAD MIKBUG TAPE ***** |
0914 * |
0915 FA5E BD FC E3 LOAD JSR ACINIZ |
0916 FA61 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE |
0917 FA63 17 02 68 LBSR OUTCH OUTPUT IT TO TERMINAL PORT |
0918 FA66 7F DF E2 CLR ECHO TURN OFF ECHO FLAG |
0919 FA69 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO |
0920 FA6C 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? |
0921 FA6E 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. |
0922 FA70 17 02 23 LBSR ECHON |
0923 FA73 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ? |
0924 FA75 27 3D BEQ LOAD21 IF SO, EXIT LOAD |
0925 FA77 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? |
0926 FA79 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR. |
0927 FA7B 17 01 A8 LBSR BYTE INPUT BYTE COUNT |
0928 FA7E 34 02 PSHS A PUSH COUNT ON STACK |
0929 FA80 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX |
0930 FA82 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS |
0931 FA85 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX |
0932 FA87 34 10 PSHS X PUSH ADDR ON STACK |
0933 FA89 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE |
0934 FA8B EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM |
0935 FA8D EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM |
0936 FA8F 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS |
0937 FA91 6A E4 DEC ,S ADDRESS BYTES. |
0938 FA93 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK |
0939 FA95 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) |
0940 FA98 35 04 PULS B POP CHECKSUM FROM STACK |
0941 FA9A 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX |
0942 FA9C 34 02 PSHS A PUSH DATA BYTE ON STACK |
0943 FA9E EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK |
0944 FAA0 6A E4 DEC ,S DECREMENT BYTE COUNT 1 |
0945 FAA2 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM |
0946 FAA4 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY |
0947 FAA6 20 EB BRA LOAD10 GET NEXT DATA BYTE |
0948 FAA8 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; |
0949 FAA9 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) |
0950 FAAB C1 FF CMPB #$FF CHECKSUM OK? |
0951 FAAD 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE |
0952 FAAF 86 3F LDA #'? LOAD (?) ERROR INDICATOR |
0953 FAB1 17 02 1A LBSR OUTCH OUTPUT IT TO TERMINAL |
0954 FAB4 73 DF E2 LOAD21 COM ECHO TURN ECHO ON |
0955 FAB7 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE |
0956 FAB9 16 02 12 LBRA OUTCH OUTPUT IT |
0957 * |
0958 ***** "P" PUNCH MIKBUG TAPE ***** |
0959 * |
0960 FABC 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK |
0961 FABE 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS |
0962 FAC1 34 30 PSHS X,Y SAVE ADDRESSES ON STACK |
0963 FAC3 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH |
0964 FAC5 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR |
0965 FAC7 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH |
0966 FAC9 30 01 LEAX 1,X INCREMENT END ADDRESS |
0967 FACB AF E4 STX ,S STORE END ADDR ON STACK |
0968 FACD BD FC E3 JSR ACINIZ |
0969 FAD0 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE |
0970 FAD2 17 01 F9 LBSR OUTCH OUTPUT IT TO TERMINAL |
0971 FAD5 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC |
0972 FAD7 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END |
0973 FAD9 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT |
0974 FADB 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES? |
0975 FADF 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES |
0976 FAE1 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. |
0977 FAE3 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT |
0978 FAE5 8E FE F8 LDX #MSG20 POINT TO MSG "S1" |
0979 FAE8 17 00 2F LBSR PSTRNG PRINT MSG |
0980 FAEB CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT |
0981 FAED 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH |
0982 FAEF 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT |
0983 FAF2 AE 62 LDX 2,S LOAD BEGIN ADDRESS |
0984 FAF4 17 01 68 LBSR OUT4H PUNCH ADDRESS |
0985 FAF7 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM |
0986 FAF9 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM |
0987 FAFB EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM |
0988 FAFD A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH |
0989 FAFF 17 01 65 LBSR OUT2H OUTPUT DATA BYTE |
0990 FB02 6A 64 DEC 4,S DECREMENT BYTE COUNT |
0991 FB04 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE |
0992 FB06 53 COMB 1's COMPLIMENT CHECKSUM BYTE |
0993 FB07 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH |
0994 FB09 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE |
0995 FB0C AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR |
0996 FB0E AC E4 CMPX ,S COMPARE IT TO END ADDR |
0997 FB10 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. |
0998 FB12 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE |
0999 FB14 17 01 B7 LBSR OUTCH OUTPUT IT |
1000 FB17 32 65 LEAS 5,S READJUST STACK POINTER |
1001 FB19 39 RTS ; |
1002 * |
1003 * PRINT STRING PRECEEDED BY A CR & LF. |
1004 * |
1005 FB1A 8D 02 PSTRNG BSR PCRLF PRINT CR/LF |
1006 FB1C 20 71 BRA PDATA PRINT STRING POINTED TO BY IX |
1007 * |
1008 * PCRLF |
1009 * |
1010 FB1E 34 10 PCRLF PSHS X SAVE IX |
1011 FB20 8E FE A9 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
1012 FB23 17 00 69 LBSR PDATA PRINT MSG |
1013 FB26 35 90 PULS X,PC RESTORE IX & RETURN |
1014 * |
1015 * LONG BRANCHES TO COMMON ROUTINES |
1016 * |
1017 FB28 16 01 A1 JOUT1S LBRA OUT1S |
1018 FB2B 16 00 F8 JBYTE LBRA BYTE |
1019 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR |
1020 * |
1021 * ALTER "PC" PROGRAM COUNTER |
1022 * |
1023 FB31 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " |
1024 FB34 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE |
1025 FB36 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC" |
1026 FB38 29 02 BVS ALTPCD EXIT IF INVALID HEX |
1027 FB3A AF 4A STX 10,U POKE IN NEW CONTENTS |
1028 FB3C 39 ALTPCD RTS ; |
1029 * |
1030 * ALTER "U" USER STACK POINTER |
1031 * |
1032 FB3D 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = " |
1033 FB3F 8D E7 BSR JOUT1S OUTPUT SPACE |
1034 FB41 8D EB BSR JIN1ADR |
1035 FB43 29 02 BVS ALTUD |
1036 FB45 AF 48 STX 8,U |
1037 FB47 39 ALTUD RTS ; |
1038 * |
1039 * ALTER "Y" INDEX REGISTER |
1040 * |
1041 FB48 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = " |
1042 FB4A 8D DC BSR JOUT1S OUTPUT SPACE |
1043 FB4C 8D E0 BSR JIN1ADR |
1044 FB4E 29 02 BVS ALTYD |
1045 FB50 AF 46 STX 6,U $F8F0 |
1046 FB52 39 ALTYD RTS ; |
1047 * |
1048 * ALTER "X" INDEX REGISTER |
1049 * |
1050 FB53 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " |
1051 FB55 8D D1 BSR JOUT1S OUTPUT SPACE |
1052 FB57 8D D5 BSR JIN1ADR |
1053 FB59 29 02 BVS ALTXD |
1054 FB5B AF 44 STX 4,U |
1055 FB5D 39 ALTXD RTS ; |
1056 * |
1057 * ALTER "DP" DIRECT PAGE REGISTER |
1058 * |
1059 FB5E 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " |
1060 FB60 8D C6 BSR JOUT1S OUTPUT SPACE |
1061 FB62 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1062 FB64 29 02 BVS ALTDPD |
1063 FB66 A7 43 STA 3,U |
1064 FB68 39 ALTDPD RTS ; |
1065 * |
1066 * ALTER "B" ACCUMULATOR |
1067 * |
1068 FB69 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = " |
1069 FB6B 8D BB BSR JOUT1S OUTPUT SPACE |
1070 FB6D 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1071 FB6F 29 02 BVS ALTBD |
1072 FB71 A7 42 STA 2,U |
1073 FB73 39 ALTBD RTS $F91C |
1074 * |
1075 * ALTER "A" ACCUMULATOR |
1076 * |
1077 FB74 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = " |
1078 FB76 8D B0 BSR JOUT1S OUTPUT SPACE |
1079 FB78 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1080 FB7A 29 02 BVS ALTAD |
1081 FB7C A7 41 STA 1,U |
1082 FB7E 39 ALTAD RTS ; |
1083 * |
1084 * ALTER "CC" REGISTER |
1085 * |
1086 FB7F 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " |
1087 FB81 8D A5 BSR JOUT1S OUTPUT SPACE |
1088 FB83 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1089 FB85 29 04 BVS ALTCCD |
1090 FB87 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST |
1091 FB89 A7 C4 STA ,U |
1092 FB8B 39 ALTCCD RTS ; |
1093 * |
1094 * PDATA |
1095 * |
1096 FB8C 17 01 3F PRINT LBSR OUTCH |
1097 FB8F A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
1098 FB91 81 04 CMPA #4 IS IT EOT? |
1099 FB93 26 F7 BNE PRINT IF NOT EOT PRINT IT |
1100 FB95 39 RTS ; |
1101 * |
1102 * PRINT REGISTERS |
1103 * |
1104 FB96 8E FE BB PRTSP LDX #MSG10 POINT TO MSG "SP=" |
1105 FB99 8D F4 BSR PDATA PRINT MSG |
1106 FB9B 1F 31 TFR U,X |
1107 FB9D 16 00 BF JOUT4H LBRA OUT4H |
1108 * |
1109 FBA0 8E FE C7 PRTUS LDX #MSG12 POINT TO MSG "US=" |
1110 FBA3 8D EA BSR PDATA PRINT MSG |
1111 FBA5 AE 48 LDX 8,U |
1112 FBA7 20 F4 BRA JOUT4H |
1113 * |
1114 FBA9 8E FE D9 PRTDP LDX #MSG15 POINT TO MSG "DP=" |
1115 FBAC 8D E1 BSR PDATA PRINT MSG |
1116 FBAE A6 43 LDA 3,U |
1117 FBB0 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII |
1118 * |
1119 FBB3 8E FE D3 PRTIX LDX #MSG14 POINT TO MSG "IX=" |
1120 FBB6 8D D7 BSR PDATA PRINT MSG |
1121 FBB8 AE 44 LDX 4,U $FCE6 |
1122 FBBA 20 E1 BRA JOUT4H |
1123 * |
1124 FBBC 8E FE CD PRTIY LDX #MSG13 POINT TO MSG "IY=" |
1125 FBBF 8D CE BSR PDATA PRINT MSG |
1126 FBC1 AE 46 LDX 6,U |
1127 FBC3 20 D8 BRA JOUT4H |
1128 * |
1129 FBC5 8E FE C1 PRTPC LDX #MSG11 POINT TO MSG "PC=" |
1130 FBC8 8D C5 BSR PDATA PRINT MSG |
1131 FBCA AE 4A LDX 10,U |
1132 FBCC 20 CF BRA JOUT4H |
1133 * |
1134 FBCE 8E FE DF PRTA LDX #MSG16 POINT TO MSG "A=" |
1135 FBD1 8D BC BSR PDATA PRINT MSG |
1136 FBD3 A6 41 LDA 1,U |
1137 FBD5 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1138 * |
1139 FBD7 8E FE E4 PRTB LDX #MSG17 POINT TO MSG "B=" |
1140 FBDA 8D B3 BSR PDATA PRINT MSG |
1141 FBDC A6 42 LDA 2,U |
1142 FBDE 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1143 * |
1144 FBE0 8E FE E9 PRTCC LDX #MSG18 POINT TO MSG "CC:" |
1145 FBE3 8D AA BSR PDATA PRINT MSG |
1146 FBE5 A6 C4 LDA ,U |
1147 FBE7 8E FE F0 LDX #MSG19 POINT TO MSG "EFHINZVC" |
1148 FBEA 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT |
1149 * |
1150 * "R" DISPLAY REGISTERS |
1151 * |
1152 FBED 8E FE B7 REGSTR LDX #MSG5 POINT TO MSG " - " |
1153 FBF0 17 FF 27 LBSR PSTRNG PRINT MSG |
1154 FBF3 8D A1 BSR PRTSP $FCBF |
1155 FBF5 8D A9 BSR PRTUS $FCCA |
1156 FBF7 8D B0 BSR PRTDP $FCD5 |
1157 FBF9 8D B8 BSR PRTIX $FCE0 |
1158 FBFB 8D BF BSR PRTIY $FCEB |
1159 FBFD 8E FE B7 LDX #MSG5 POINT TO MSG " - " |
1160 FC00 17 FF 17 LBSR PSTRNG PRINT MSG |
1161 FC03 8D C0 BSR PRTPC $FCF5 |
1162 FC05 8D C7 BSR PRTA $FCFF |
1163 FC07 8D CE BSR PRTB $FD09 |
1164 FC09 20 D5 BRA PRTCC $FD13 |
1165 * |
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. |
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". |
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT |
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX |
1171 * ADDRESS IS INPUT. |
1172 * |
1173 FC0B 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS |
1174 FC0D 29 4D BVS NOTHEX EXIT IF NOT VALID HEX |
1175 FC0F 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY" |
1176 FC11 86 2D LDA #'- |
1177 FC13 17 00 B8 LBSR OUTCH PRINT " - " |
1178 * |
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
1182 * |
1183 FC16 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) |
1184 FC18 29 42 BVS NOTHEX EXIT IF NOT VALID HEX |
1185 FC1A 1F 01 TFR D,X |
1186 FC1C 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) |
1187 FC1E 29 3C BVS NOTHEX |
1188 FC20 34 10 PSHS X |
1189 FC22 A7 61 STA 1,S |
1190 FC24 35 90 PULS X,PC |
1191 * |
1192 ***** INPUT BYTE (2 HEX CHAR.) ***** |
1193 * |
1194 FC26 8D 11 BYTE BSR INHEX GET HEX LEFT |
1195 FC28 29 32 BVS NOTHEX EXIT IF NOT VALID HEX |
1196 FC2A 48 ASLA ; |
1197 FC2B 48 ASLA ; |
1198 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE |
1199 FC2D 48 ASLA ; |
1200 FC2E 1F 89 TFR A,B PUT HEXL IN "B" |
1201 FC30 8D 07 BSR INHEX GET HEX RIGHT |
1202 FC32 29 28 BVS NOTHEX EXIT IF NOT VALID HEX |
1203 FC34 34 04 PSHS B PUSH HEXL ON STACK |
1204 FC36 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
1205 FC38 39 RTS RETURN WITH HEX L&R IN "A" |
1206 * |
1207 * |
1208 FC39 8D 5B INHEX BSR ECHON INPUT ASCII CHAR. |
1209 FC3B 81 30 CMPA #'0 IS IT > OR = "0" ? |
1210 FC3D 25 1D BCS NOTHEX IF LESS IT AIN'T HEX |
1211 FC3F 81 39 CMPA #'9 IS IT < OR = "9" ? |
1212 FC41 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA |
1213 FC43 80 30 SUBA #$30 ASCII ADJ. NUMERIC |
1214 FC45 39 RTS ; |
1215 * |
1216 * |
1217 FC46 81 41 INHEXA CMPA #'A IS IT > OR = "A" |
1218 FC48 25 12 BCS NOTHEX IF LESS IT AIN'T HEX |
1219 FC4A 81 46 CMPA #'F IS IT < OR = "F" ? |
1220 FC4C 22 03 BHI INHEXL IF > IT AIN'T HEX |
1221 FC4E 80 37 SUBA #$37 ASCII ADJ. ALPHA |
1222 FC50 39 RTS ; |
1223 * |
1224 FC51 81 61 INHEXL CMPA #'a IS IT > OR = "a" |
1225 FC53 25 07 BCS NOTHEX IF LESS IT AIN'T HEX |
1226 FC55 81 66 CMPA #'f IS IT < "f" |
1227 FC57 22 03 BHI NOTHEX IF > IT AIN'T HEX |
1228 FC59 80 57 SUBA #$57 ADJUST TO LOWER CASE |
1229 FC5B 39 RTS ; |
1230 * |
1231 * |
1232 FC5C 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
1233 FC5E 39 RTS ; |
1234 * |
1235 * |
1236 FC5F 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK |
1237 FC61 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. |
1238 FC63 8D 02 BSR OUTHL OUTPUT HEX LEFT |
1239 FC65 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. |
1240 FC67 OUTHL EQU * |
1241 FC67 34 02 OUT2H PSHS A SAVE IT BACK ON STACK |
1242 FC69 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
1243 FC6A 44 LSRA ; |
1244 FC6B 44 LSRA ; |
1245 FC6C 44 LSRA ; |
1246 FC6D 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII |
1247 FC6F 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
1248 FC71 84 0F ANDA #$0F STRIP LEFT NIBBLE |
1249 FC73 8B 30 XASCII ADDA #$30 ASCII ADJ |
1250 FC75 81 39 CMPA #$39 IS IT < OR = "9" ? |
1251 FC77 2F 02 BLE OUTC IF LESS, OUTPUT IT |
1252 FC79 8B 07 ADDA #7 IF > MAKE ASCII LETTER |
1253 FC7B 20 51 OUTC BRA OUTCH OUTPUT CHAR |
1254 * |
1255 * BINARY / ASCII --- THIS ROUTINE |
1256 * OUTPUTS A BYTE IN ENHANCED |
1257 * BINARY FORMAT. THE ENHANCEMENT |
1258 * IS DONE BY SUBSTITUTING ASCII |
1259 * LETTERS FOR THE ONES IN THE BYTE. |
1260 * THE ASCII ENHANCEMENT LETTERS |
1261 * ARE OBTAINED FROM THE STRING |
1262 * POINTED TO BY THE INDEX REG. "X". |
1263 * |
1264 FC7D 34 02 BIASCI PSHS A SAVE "A" ON STACK |
1265 FC7F C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE |
1266 FC81 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING |
1267 FC83 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 |
1268 FC85 25 02 BCS PRTBA IF ONE PRINT LETTER |
1269 FC87 86 2D LDA #'- IF ZERO PRINT "-" |
1270 FC89 8D 43 PRTBA BSR OUTCH PRINT IT |
1271 FC8B 8D 3F BSR OUT1S PRINT SPACE |
1272 FC8D 5A DECB SUB 1 FROM #BITS YET TO PRINT |
1273 FC8E 26 F1 BNE OUTBA |
1274 FC90 35 82 PULS A,PC |
1275 * |
1276 IFD EXTOPT |
1277 * |
1278 * EXTENDED USER COMMANDS |
1279 * |
1280 FC92 6E 9F F0 00 USRCMD JMP [MONEXT+EXTCMD] |
1281 ENDIF EXTOPT |
1282 * |
1283 * |
1284 FC96 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ? |
1285 FC99 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR |
1286 * |
1287 * INCHE |
1288 * |
1289 * ---GETS CHARACTER FROM TERMINAL AND |
1290 * ECHOS SAME. THE CHARACTER IS RETURNED |
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY |
1292 * BIT MASKED OFF. ALL OTHER REGISTERS |
1293 * ARE PRESERVED. |
1294 * |
1295 FC9B 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL |
1296 FC9D 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
1297 FC9F 20 2D BRA OUTCH ECHO CHAR TO TERMINAL |
1298 * |
1299 * INCH |
1300 * |
1301 * GET CHARACTER FROM TERMINAL. RETURN |
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
1304 * IS 8 BITS AND IS NOT ECHOED. |
1305 * |
1306 * |
1307 FCA1 34 10 INCH PSHS X SAVE IX |
1308 FCA3 BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT |
1309 FCA6 A6 84 LDA ,X FETCH PORT STATUS |
1310 FCA8 85 01 BITA #1 TEST READY BIT, RDRF ? |
1311 IFD PS2OPT |
1312 FCAA 26 09 BNE GETST1 |
1313 FCAC 8E E0 20 LDX #PS2KBD |
1314 FCAF A6 84 LDA ,X |
1315 FCB1 85 01 BITA #1 |
1316 ENDIF PS2OPT |
1317 FCB3 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
1318 FCB5 A6 01 GETST1 LDA 1,X FETCH CHAR |
1319 FCB7 35 90 PULS X,PC RESTORE IX |
1320 * |
1321 * INCHEK |
1322 * |
1323 * CHECK FOR A CHARACTER AVAILABLE FROM |
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
1325 * FOR READ READY. ALL REGISTERS ARE |
1326 * PRESERVED, AND THE "Z" BIT WILL BE |
1327 * CLEAR IF A CHARACTER CAN BE READ. |
1328 * |
1329 * |
1330 FCB9 34 02 INCHEK PSHS A SAVE A ACCUM. |
1331 FCBB A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS |
1332 FCBF 85 01 BITA #1 TEST READY BIT, RDRF ? |
1333 IFD PS2OPT |
1334 FCC1 26 05 BNE INCHEK1 |
1335 FCC3 B6 E0 20 LDA PS2KBD |
1336 FCC6 85 01 BITA #1 TEST READY BIT< RDRF ? |
1337 ENDIF PS2OPT |
1338 FCC8 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. |
1339 * |
1340 FCCA 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES |
1341 FCCC 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE |
1342 * |
1343 * |
1344 * OUTCH |
1345 * |
1346 * OUTPUT CHARACTER TO TERMINAL. |
1347 * THE CHAR. TO BE OUTPUT IS |
1348 * PASSED IN THE A REGISTER. |
1349 * ALL REGISTERS ARE PRESERVED. |
1350 * |
1351 OUTCH IFD VDUOPT |
1352 FCCE 8D 45 BSR VOUTCH |
1353 ENDIF VDUOPT |
1354 IFD DG640OPT |
1355 BSR VOUTCH |
1356 ENDIF DG640OPT |
1356 ENDIF DG640OPT |
1357 FCD0 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX |
1358 FCD2 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL |
1359 FCD5 A6 84 FETSTA LDA ,X FETCH PORT STATUS |
1360 FCD7 85 02 BITA #2 TEST TDRE, OK TO XMIT ? |
1361 FCD9 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY |
1362 FCDB 35 02 PULS A GET CHAR. FOR XMIT |
1363 FCDD A7 01 STA 1,X XMIT CHAR. |
1364 FCDF 35 90 PULS X,PC RESTORE IX |
1365 * |
1366 * IO INITIALIZATION |
1367 * |
1368 FCE1 IOINIZ EQU * |
1369 IFD VDUOPT |
1370 FCE1 8D 13 BSR VINIZ |
1371 ENDIF VDUOPT |
1372 IFD DG640OPT |
1373 BSR VINIZ |
1374 ENDIF DG640OPT |
1374 ENDIF DG640OPT |
1375 FCE3 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
1376 FCE6 86 03 LDA #3 RESET ACIA PORT CODE |
1377 FCE8 A7 84 STA ,X STORE IN CONTROL REGISTER |
1378 FCEA 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
1379 FCEC A7 84 STA ,X STORE IN CONTROL REGISTER |
1380 FCEE 6D 01 TST 1,X ANYTHING IN DATA REGISTER? |
1381 FCF0 86 FF LDA #$FF TURN ON ECHO FLAG |
1382 FCF2 B7 DF E2 STA ECHO |
1383 FCF5 39 RTS |
1384 * |
1385 IFD VDUOPT |
1386 * |
1387 *************************************************** |
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * |
1389 * * |
1390 * 80 x 25 Characters |
1391 * |
1392 *************************************************** |
1393 * |
1394 *************************************************** |
1395 * INITIALIZE EMULATOR * |
1396 *************************************************** |
1397 * |
1398 FCF6 8E E0 30 VINIZ LDX #VDU |
1399 FCF9 CC 00 00 LDD #0 |
1400 FCFC FD DF FB STD COLADX AND ROWADX |
1401 FCFF A7 02 STA VDUCOL,X |
1402 FD01 E7 03 STB VDUROW,X |
1403 FD03 E7 04 STB VDUOFF,X |
1404 FD05 FD DF FD STD NEWROW AND ESCFLG |
1405 FD08 C6 02 LDB #$02 |
1406 FD0A E7 01 STB VDUATT,X |
1407 FD0C 7F DF FE CLR ESCFLG |
1408 FD0F 86 1B LDA #$1B SEND ESCAPE |
1409 FD11 8D 02 BSR VOUTCH |
1410 FD13 86 59 LDA #'Y CLEAR TO END OF SCREEN |
1411 * |
1412 ** VIDEO OUTPUT ROUTINE |
1413 * |
1414 FD15 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS |
1415 FD17 8E E0 30 LDX #VDU POINT TO VDU REGISTERS |
1416 * |
1417 ** CHECK FOR ESCAPE SEQUENCE |
1418 * |
1419 FD1A 7D DF FE TST ESCFLG ESCAPE ACTIVE? |
1420 FD1D 27 04 BEQ SOROU1 BRANCH IF NOT |
1421 FD1F 8D 74 BSR ESCAPE ELSE DO ESCAPE |
1422 FD21 20 0D BRA RETURN AND RETURN |
1423 * |
1424 ** CHECK FOR CONTROL CHARACTERS |
1425 * |
1426 FD23 81 20 SOROU1 CMPA #$20 CONTROL CODES? |
1427 FD25 24 04 BHS SOROU2 |
1428 FD27 8D 09 BSR CONTRL BRANCH IF SO |
1429 FD29 20 05 BRA RETURN |
1430 * |
1431 ** OUTPUT TEXT CHARACTER |
1432 * |
1433 FD2B A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER |
1434 FD2D 17 00 C5 LBSR NEWCOL UPDATE COLUMN |
1435 * |
1436 ** DISPLAY CURSOR AND RETURN |
1437 * |
1438 FD30 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1439 * |
1440 *************************************************** |
1441 * CONTROL CODE HANDLERS * |
1442 *************************************************** |
1443 * |
1444 FD32 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1445 FD34 10 27 00 41 LBEQ BACKSP |
1446 FD38 81 1B CMPA #$1B ESCAPE SEQUENCE? |
1447 FD3A 10 27 00 6C LBEQ SETESC |
1448 FD3E 81 1A CMPA #$1A CTRL Z - Clear Screen |
1449 FD40 10 27 00 8E LBEQ CLRSCR |
1450 FD44 81 16 CMPA #$16 CTRL ^ - Home |
1451 FD46 10 27 00 45 LBEQ HOME |
1452 FD4A 81 0D CMPA #$D CTRL M - RETURN? |
1453 FD4C 10 27 00 99 LBEQ CRETN |
1454 FD50 81 0C CMPA #$0C CTRL L - CHAR RIGHT |
1455 FD52 10 27 00 2C LBEQ CHRIGHT |
1456 FD56 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE |
1457 FD58 10 27 00 11 LBEQ LINEUP |
1458 FD5C 81 0A CMPA #$0A CTRL J - LINE FEED |
1459 FD5E 26 51 BNE RETESC NONE OF THESE, RETURN |
1460 * |
1461 ***************************************** LINE FEED |
1462 * |
1463 FD60 FC DF FB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1464 FD63 5C INCB BUMP ROW |
1465 FD64 C1 19 CMPB #NUMLIN SCROLL TIME? |
1466 FD66 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT |
1467 FD6A 16 00 99 LBRA SCROLL ELSE SCROLL IT |
1468 * |
1469 ***************************************** LINE FEED |
1470 * |
1471 FD6D FC DF FB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1472 FD70 5D TSTB AT TOP OF SCREEN ? |
1473 FD71 10 27 00 3C LBEQ RETESC Yes, Ignore |
1474 FD75 5A DECB No, Decrement ROW |
1475 FD76 16 00 74 LBRA NEWCUR POSITION CURSOR |
1476 * |
1477 *********************************** BACK SPACE |
1478 * |
1479 FD79 B6 DF FB BACKSP LDA COLADX |
1480 FD7C 27 33 BEQ RETESC RETURN |
1481 FD7E 4A DECA |
1482 FD7F 16 00 68 LBRA POSCOL POSITION CURSOR |
1483 * |
1484 *********************************** CURSOR RIGHT |
1485 * |
1486 FD82 B6 DF FB CHRIGHT LDA COLADX |
1487 FD85 4C INCA |
1488 FD86 81 50 CMPA #LINLEN |
1489 FD88 10 27 00 25 LBEQ RETESC |
1490 FD8C 16 00 5B LBRA POSCOL |
1491 * |
1492 *********************************** CURSOR RIGHT |
1493 * |
1494 FD8F CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN |
1495 FD92 16 00 58 LBRA NEWCUR |
1496 * |
1497 *************************************************** |
1498 * ESCAPE HANDLERS * |
1499 *************************************************** |
1500 * |
1501 FD95 F6 DF FE ESCAPE LDAB ESCFLG GET FLAG |
1502 FD98 C1 3D CMPB #'= SETTING CURSOR? |
1503 FD9A 27 16 BEQ ESCCUR BRANCH IF SO |
1504 FD9C 81 59 CMPA #'Y CLEAR TO END OF SCREEN? |
1505 FD9E 10 27 00 6E LBEQ ESCCLS |
1506 FDA2 81 54 CMPA #'T CLEAR TO END OF LINE? |
1507 FDA4 27 31 BEQ ESCCLL |
1508 FDA6 81 3D CMPA #'= STARTING CURSOR SET? |
1509 FDA8 26 04 BNE CLRESC BRANCH IF NOT |
1510 * |
1511 ***************************** START ESCAPE SEQUENCE |
1512 * |
1513 FDAA B7 DF FE SETESC STAA ESCFLG ELSE START CURSORING |
1514 FDAD 39 RTS AND RETURN |
1515 * |
1516 FDAE 7F DF FE CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1517 FDB1 39 RETESC RTS SO RETURN |
1518 * |
1519 ********************************* SET SCREEN CURSOR |
1520 * |
1521 FDB2 7D DF FD ESCCUR TST NEWROW ROW SET? |
1522 FDB5 26 04 BNE ESCCU1 BRANCH IF SO |
1523 FDB7 B7 DF FD STAA NEWROW ELSE SET NEW ROW |
1524 FDBA 39 RTS AND RETURN |
1525 * |
1526 FDBB 7F DF FE ESCCU1 CLR ESCFLG |
1527 FDBE 80 20 SUBA #$20 ADJUST COLUMN ADDRESS |
1528 FDC0 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1529 FDC2 22 ED BHI RETESC NOT OK, DO NOTHING |
1530 * |
1531 FDC4 F6 DF FD ESCCU2 LDAB NEWROW |
1532 FDC7 7F DF FD CLR NEWROW |
1533 FDCA C0 20 SUBB #$20 ADJUST TO ROW ADDRESS |
1534 FDCC C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1535 FDCE 22 E1 BHI RETESC ELSE RETURN DOING NOTHING |
1536 FDD0 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO |
1537 * |
1538 ****************** CLEAR FROM CURSOR TO END OF LINE |
1539 FDD2 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN |
1540 FDD5 8D 16 BSR NEWCUR |
1541 FDD7 B6 DF FB ESCCLL LDA COLADX |
1542 FDDA C6 20 LDB #$20 AND CLEAR CHAR |
1543 FDDC E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT |
1544 FDDE 4C INCA |
1545 FDDF A7 02 STA VDUCOL,X |
1546 FDE1 81 50 CMPA #LINLEN UNTIL END OF LINE |
1547 FDE3 26 F7 BNE ESCCL1 |
1548 FDE5 7F DF FE CLR ESCFLG |
1549 FDE8 39 RTS |
1550 * |
1551 *********************************** CARRIAGE RETURN |
1552 * |
1553 FDE9 4F CRETN CLRA SET COLUMN ZERO |
1554 FDEA F6 DF FC POSCOL LDB ROWADX GET CURRENT ROW |
1555 * |
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1557 * |
1558 FDED FD DF FB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1559 FDF0 A7 02 STA VDUCOL,X SET NEW COLUMN |
1560 FDF2 E7 03 STB VDUROW,X SET NEW ROW |
1561 FDF4 39 RTS AND RETURN |
1562 * |
1563 ********************* UPDATE CURRENT COLUMN AND ROW |
1564 * |
1565 FDF5 FC DF FB NEWCOL LDD COLADX GET ROW AND COLUMN |
1566 FDF8 4C INCA BUMP COLUMN |
1567 FDF9 81 50 CMPA #LINLEN ROLL? |
1568 FDFB 26 F0 BNE NEWCUR BRANCH IF NOT |
1569 FDFD 4F CLRA ELSE RESET TO ZERO |
1570 FDFE 5C INCB AND BUMP ROW |
1571 FDFF C1 19 CMPB #NUMLIN |
1572 FE01 26 EA BNE NEWCUR |
1573 FE03 5A DECB BOTTOM ROW |
1574 FE04 8D E7 BSR NEWCUR |
1575 * |
1576 ********************************* SCROLL THE SCREEN |
1577 * |
1578 FE06 E6 04 SCROLL LDB VDUOFF,X |
1579 FE08 5C INCB |
1580 FE09 C1 19 CMPB #NUMLIN |
1581 FE0B 25 01 BLO SCROL1 |
1582 FE0D 5F CLRB |
1583 FE0E E7 04 SCROL1 STB VDUOFF,X |
1584 * |
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1586 * |
1587 FE10 F6 DF FB ESCCLS LDB COLADX GET CURSOR |
1588 FE13 86 20 LDA #$20 GET A SPACE |
1589 FE15 F7 DF FB ESCCLS1 STB COLADX |
1590 FE18 E7 02 STB VDUCOL,X |
1591 FE1A A7 84 STA VDUCHR,X |
1592 FE1C 5C INCB |
1593 FE1D C1 50 CMPB #LINLEN |
1594 FE1F 26 F4 BNE ESCCLS1 |
1595 * |
1596 FE21 F6 DF FC LDB ROWADX |
1597 FE24 5C INCB |
1598 FE25 C1 19 CMPB #NUMLIN |
1599 FE27 27 08 BEQ ESCCLS2 |
1600 FE29 F7 DF FC STB ROWADX |
1601 FE2C E7 03 STB VDUROW,X |
1602 FE2E 5F CLRB |
1603 FE2F 20 E4 BRA ESCCLS1 |
1604 * |
1605 FE31 5F ESCCLS2 CLRB |
1606 FE32 F7 DF FB STB COLADX |
1607 FE35 E7 02 STB VDUCOL,X |
1608 FE37 F7 DF FE STB ESCFLG |
1609 FE3A 39 RTS |
1610 ENDIF VDUOPT |
1611 * |
1612 IFD DG640OPT |
1613 *************************************************** |
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * |
1615 * * |
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * |
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * |
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * |
1619 * 16x64 BOARD). * |
1620 *************************************************** |
1621 |
1622 *************************************************** |
1623 * INITIALIZE EMULATOR * |
1624 *************************************************** |
1625 |
1626 VINIZ LDX #0 |
1627 STX COLADX AND ROWADX |
1628 STX NEWROW AND ESCFLG |
1629 LDX #SCREEN POINT TO SCREEN |
1630 STX CURSOR SET PROGRAM CURSOR |
1631 LDA #$1B SEND ESCAPE |
1632 BSR VOUTCH |
1633 LDA #'Y CLEAR TO END OF SCREEN |
1634 * |
1635 ** VIDEO OUTPUT ROUTINE |
1636 * |
1637 VOUTCH PSHS A,B,X SAVE REGISTERS |
1638 * |
1639 ** CLEAR CURSOR |
1640 LDX CURSOR |
1641 LDB 0,X |
1642 ANDB #$7F |
1643 STB 0,X |
1644 * |
1645 ** CHECK FOR ESCAPE SEQUENCE |
1646 TST ESCFLG ESCAPE ACTIVE? |
1647 BEQ SOROU1 BRANCH IF NOT |
1648 BSR ESCAPE ELSE DO ESCAPE |
1649 BRA RETURN AND RETURN |
1650 * |
1651 ** CHECK FOR CONTROL CHARACTERS |
1652 SOROU1 CMPA #$20 CONTROL CODES? |
1653 BHS SOROU2 |
1654 BSR CONTRL BRANCH IF SO |
1655 BRA RETURN |
1656 * |
1657 ** OUTPUT TEXT CHARACTER |
1658 SOROU2 LDX CURSOR ELSE GET CURSOR |
1659 STAA 0,X DISPLAY CHARACTER |
1660 LBSR NEWCOL UPDATE COLUMN |
1661 * |
1662 ** DISPLAY CURSOR AND RETURN |
1663 RETURN LDX CURSOR AND DISPLAY IT |
1664 LDB ,X |
1665 ORAB #$80 WITH REVID |
1666 STB ,X |
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1668 |
1669 *************************************************** |
1670 * CONTROL CODE HANDLERS * |
1671 *************************************************** |
1672 |
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1674 LBEQ BACKSP |
1675 CMPA #$1B ESCAPE SEQUENCE? |
1676 LBEQ SETESC |
1677 CMPA #$D CTRL M - RETURN? |
1678 LBEQ CRETN |
1679 CMPA #$0A CTRL J - LINE FEED |
1680 BNE RETESC NONE OF THESE, RETURN |
1681 |
1682 ***************************************** LINE FEED |
1683 |
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1685 INCB BUMP ROW |
1686 CMPB #NUMLIN SCROLL TIME? |
1687 LBNE NEWCUR POSITION CURSOR IF NOT |
1688 LBRA SCROLL ELSE SCROLL IT |
1689 |
1690 ***************************************** LINE FEED |
1691 |
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1693 TSTB AT TOP OF SCREEN ? |
1694 BEQ RETESC Yes, Ignore |
1695 DECB No, Decrement ROW |
1696 LBRA NEWCUR POSITION CURSOR |
1697 |
1698 |
1699 *********************************** BACK SPACE |
1700 |
1701 BACKSP LDA COLADX |
1702 BEQ RETESC RETURN |
1703 DECA |
1704 LBRA POSCOL POSITION CURSOR |
1705 |
1706 *********************************** CURSOR RIGHT |
1707 |
1708 CHRIGHT LDA COLADX |
1709 INCA |
1710 CMPA #LINLEN |
1711 BEQ RETESC |
1712 LBRA POSCOL |
1713 |
1714 *************************************************** |
1715 * ESCAPE HANDLERS * |
1716 *************************************************** |
1717 |
1718 ESCAPE LDAB ESCFLG GET FLAG |
1719 CMPB #'= SETTING CURSOR? |
1720 BEQ ESCCUR BRANCH IF SO |
1721 CMPA #'Y CLEAR TO END OF SCREEN? |
1722 LBEQ ESCCLS |
1723 CMPA #'T CLEAR TO END OF LINE? |
1724 BEQ ESCCLL |
1725 CMPA #'E INSERT LINE? |
1726 BEQ ESCINL |
1727 CMPA #'R DELETE LINE? |
1728 BEQ ESCDLL |
1729 CMPA #'= STARTING CURSOR SET? |
1730 BNE CLRESC BRANCH IF NOT |
1731 |
1732 ***************************** START ESCAPE SEQUENCE |
1733 |
1734 SETESC STAA ESCFLG ELSE START CURSORING |
1735 RTS AND RETURN |
1736 |
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1738 RETESC RTS SO RETURN |
1739 |
1740 ********************************* SET SCREEN CURSOR |
1741 |
1742 ESCCUR TST NEWROW ROW SET? |
1743 BNE ESCCU1 BRANCH IF SO |
1744 STAA NEWROW ELSE SET NEW ROW |
1745 RTS AND RETURN |
1746 |
1747 ESCCU1 CLR ESCFLG |
1748 SUBA #$20 ADJUST COLUMN ADDRESS |
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1750 BHI RETESC NOT OK, DO NOTHING |
1751 |
1752 ESCCU2 LDAB NEWROW |
1753 CLR NEWROW |
1754 SUBB #$20 ADJUST TO ROW ADDRESS |
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1756 BHI RETESC ELSE RETURN DOING NOTHING |
1757 BRA NEWCUR GO SET NEW CURSOR IF SO |
1758 * |
1759 *************************** DELETE LINE FROM SCREEN |
1760 |
1761 ESCDLL BSR CRETN GO COL. ZERO |
1762 LDB ROWADX |
1763 CMPB #NUMLIN-1 |
1764 BEQ SCROL3 |
1765 BRA SCROL1 AND DELETE THIS LINE |
1766 |
1767 *************************** INSERT LINE INTO SCREEN |
1768 |
1769 ESCINL BSR CRETN GO TO COL. ZERO |
1770 LDAB ROWADX |
1771 CMPB #NUMLIN-1 |
1772 BEQ ESCCLL |
1773 * |
1774 ** SCROLL SCREEN DOWN FROM CURSOR |
1775 * |
1776 LDX #SCREEN+SCNLEN-LINLEN |
1777 ESCIN0 LDAA 0,-X |
1778 STAA LINLEN,X |
1779 LDA SCNLEN,X |
1780 STA SCNLEN+LINLEN,X |
1781 CPX CURSOR |
1782 BNE ESCIN0 |
1783 |
1784 ****************** CLEAR FROM CURSOR TO END OF LINE |
1785 |
1786 ESCCLL LDA COLADX GET CURRENT COLUMN |
1787 LDX CURSOR GET CURSOR |
1788 LDB #$20 AND CLEAR CHAR |
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE |
1790 STB ,X+ CLEAR TEXT |
1791 INCA |
1792 CMPA #LINLEN UNTIL END OF LINE |
1793 BNE ESCLL1 |
1794 CLR ESCFLG |
1795 RTS |
1796 |
1797 *********************************** CARRIAGE RETURN |
1798 |
1799 CRETN CLRA SET COLUMN ZERO |
1800 POSCOL LDB ROWADX GET CURRENT ROW |
1801 |
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1803 |
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1805 LDA #LINLEN ELSE ADD A LINE |
1806 MUL LINLEN * ROWADX |
1807 ADDB COLADX |
1808 ADCA #0 |
1809 ADDD #SCREEN ADD SCREEN BASE. |
1810 STD CURSOR SAVE NEW CURSOR |
1811 TFR D,X GET CURSOR IN X |
1812 RTS AND RETURN |
1813 |
1814 ********************* UPDATE CURRENT COLUMN AND ROW |
1815 |
1816 NEWCOL LDD COLADX GET ROW AND COLUMN |
1817 INCA BUMP COLUMN |
1818 CMPA #LINLEN ROLL? |
1819 BNE NEWCUR BRANCH IF NOT |
1820 CLRA ELSE RESET TO ZERO |
1821 INCB AND BUMP ROW |
1822 CMPB #NUMLIN |
1823 BNE NEWCUR |
1824 DECB BOTTOM ROW |
1825 BSR NEWCUR |
1826 |
1827 ********************************* SCROLL THE SCREEN |
1828 |
1829 SCROLL LDX #SCREEN POINT TO SCREEN |
1830 SCROL1 LDA SCNLEN+LINLEN,X |
1831 STA SCNLEN,X |
1832 LDAA LINLEN,X MOVE TWO BYTES |
1833 STAA 0,X+ UP ONE LINE |
1834 CMPX #SCREEN+SCNLEN-LINLEN |
1835 BNE SCROL1 LOOP UNTIL DONE |
1836 BRA SCROL3 |
1837 |
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1839 |
1840 ESCCLS LDX CURSOR GET CURSOR |
1841 SCROL3 LDAA #$20 GET A SPACE |
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES |
1843 STA ,X+ AND TEXT |
1844 CMPX #SCREEN+SCNLEN |
1845 BNE SCROL2 UNTIL DONE |
1846 CLR ESCFLG |
1847 RTS |
1848 ENDIF DG640OPT |
1848 ENDIF DG640OPT |
1849 * |
1850 IFD PRTOPT |
1851 ************************************* |
1852 * |
1853 ** PRINTER DRIVER ROUTINES |
1854 * |
1855 ************************************* |
1856 * |
1857 ** PINIZ - INITIATE PRINTER PORT |
1858 * |
1859 PINIZ PSHS B |
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 |
1861 STD PADATA SET DDR AND SELECT DATA |
1862 * |
1863 ** RESET PRINTER |
1864 LDB #PRESET |
1865 STAB PADATA |
1866 RESTLP INCB DELAY FOR RESET |
1867 BNE RESTLP |
1868 STAA PADATA ACCA=DIRMSK |
1869 * |
1870 ** INITALIZE PORT B (DATA PORT) |
1871 LDAA #$2A |
1872 STAA PBCTRL |
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110 |
1874 STD PBDATA PBDREG PBCTRL |
1875 * |
1876 ** SELECT 66 LINES/PAGE |
1877 LDAA #$1B |
1878 BSR POUTCH |
1879 LDAA #'C |
1880 BSR POUTCH |
1881 LDAA #66 |
1882 PULS B |
1883 ************************************* |
1884 * |
1885 ** OUTPUT A CHARACTER TO THE PRINTER |
1886 * |
1887 ************************************* |
1888 POUTCH PSHS B |
1889 LDAB PBDATA CLEAR INTERRUPT BIT |
1890 * |
1891 ** WAIT TILL NOT BUSY |
1892 BUSYLP LDAB PADATA |
1893 BITB #PERROR |
1894 BEQ PEXIT |
1895 TSTB |
1896 BMI BUSYLP |
1897 * |
1898 ** NOW OUTPUT CHARACTER |
1899 STAA PBDATA |
1900 PEXIT PULS B,PC |
1901 ************************************* |
1902 * |
1903 ** PCHK TEST IFD PRINTER READY |
1904 * |
1905 ************************************* |
1906 PCHK TST PBCTRL TEST STATE OF CRB7 |
1907 RTS SET ON ACKNOWLEDGE |
1908 ENDIF PRTOPT |
1908 ENDIF PRTOPT |
1909 ************************************* |
1910 * |
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE |
1912 * |
1913 ************************************* |
1914 * |
1915 FE3B JMPTAB EQU * |
1916 FE3B 01 FCB 1 " ^A " |
1917 FE3C FB 74 FDB ALTRA |
1918 FE3E 02 FCB 2 " ^B " |
1919 FE3F FB 69 FDB ALTRB |
1920 FE41 03 FCB 3 " ^C " |
1921 FE42 FB 7F FDB ALTRCC |
1922 FE44 04 FCB 4 " ^D " |
1923 FE45 FB 5E FDB ALTRDP |
1924 FE47 10 FCB $10 " ^P " |
1925 FE48 FB 31 FDB ALTRPC |
1926 FE4A 15 FCB $15 " ^U " |
1927 FE4B FB 3D FDB ALTRU |
1928 FE4D 18 FCB $18 " ^X " |
1929 FE4E FB 53 FDB ALTRX |
1930 FE50 19 FCB $19 " ^Y " |
1931 FE51 FB 48 FDB ALTRY |
1932 * |
1933 FE53 42 FCC 'B' |
1934 FE54 F9 5C FDB BRKPNT |
1935 FE56 45 FCC 'E' |
1936 FE57 F8 FD FDB MEMDUMP |
1937 FE59 47 FCC 'G' |
1938 FE5A F8 A5 FDB GO |
1939 FE5C 4C FCC 'L' |
1940 FE5D FA 5E FDB LOAD |
1941 FE5F 50 FCC 'P' |
1942 FE60 FA BC FDB PUNCH |
1943 FE62 4D FCC 'M' |
1944 FE63 F8 A8 FDB MEMCHG |
1945 FE65 52 FCC 'R' |
1946 FE66 FB ED FDB REGSTR |
1947 FE68 53 FCC 'S' |
1948 FE69 F8 F1 FDB DISSTK |
1949 FE6B 58 FCC 'X' |
1950 FE6C F9 88 FDB XBKPNT |
1951 IFD MFDCOPT |
1952 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT |
1953 FDB MINBOOT |
1954 ENDIF MFDCOPT |
1954 ENDIF MFDCOPT |
1955 IFD CF8OPT |
1956 FE6E 44 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT |
1957 FE6F F9 D5 FDB CFBOOT |
1958 ENDIF CF8OPT |
1959 IFD IDEOPT |
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT |
1961 FDB IDEBOOT |
1962 ENDIF IDEOPT |
1962 ENDIF IDEOPT |
1963 IFD DMAFOPT |
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT |
1965 FDB DBOOT |
1966 ENDIF DMAFOPT |
1966 ENDIF DMAFOPT |
1967 IFD EXTOPT |
1968 FE71 55 FCC 'U' *** IF FPGA, 'U' IS FOR USER |
1969 FE72 FC 92 FDB USRCMD |
1970 ENDIF EXTOPT |
1971 IFD RTCOPT |
1972 FCC 'T' |
1973 FDB TIMSET |
1974 ENDIF RTCOPT |
1974 ENDIF RTCOPT |
1975 IFD TRAOPT |
1976 FCC "T" |
1977 FDB TRACE |
1978 ENDIF TRAOPT |
1978 ENDIF TRAOPT |
1979 * |
1980 FE74 TABEND EQU * |
1981 * |
1982 * ** 6809 VECTOR ADDRESSES ** |
1983 * |
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES |
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY |
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE |
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO |
1988 * HIS OWN ROUTINES IF HE SO DESIRES. |
1989 * |
1990 * |
1991 FE74 F9 94 RAMVEC FDB SWIE USER-V |
1992 FE76 F8 A7 FDB RTI SWI3-V |
1993 FE78 F8 A7 FDB RTI SWI2-V |
1994 FE7A F8 A7 FDB RTI FIRQ-V |
1995 FE7C F8 A7 FDB RTI IRQ-V |
1996 FE7E F9 94 FDB SWIE SWI-V |
1997 FE80 FF FF FDB $FFFF SVC-VO |
1998 FE82 FF FF FDB $FFFF SVC-VL |
1999 * |
2000 * PRINTABLE MESSAGE STRINGS |
2001 * |
2002 FE84 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
2003 FE89 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR ' |
55 47 20 31 2E 34 |
20 46 4F 52 20 |
2004 IFD S3EOPT |
2005 FCC 'S3E ' |
2006 ENDIF S3EOPT |
2006 ENDIF S3EOPT |
2007 IFD B5XOPT |
2008 FCC 'B5-X300 ' |
2009 ENDIF B5XOPT |
2009 ENDIF B5XOPT |
2010 IFD S3SOPT |
2011 FE9A 53 33 53 54 41 52 FCC 'S3STARTER ' |
54 45 52 20 |
2012 ENDIF S3SOPT |
2013 IFD ADSOPT |
2014 FCC 'ADS6809 ' |
2015 ENDIF ADSOPT |
2015 ENDIF ADSOPT |
2016 IFD SWTOPT` |
2017 FCC 'SWTPC ' |
2018 ENDIF SWTOPT |
2018 ENDIF SWTOPT |
2019 IFD XESOPT` |
2020 FCC 'XESS ' |
2021 ENDIF XESOPT |
2021 ENDIF XESOPT |
2022 FEA4 20 2D 20 FCC ' - ' |
2023 FEA7 04 FCB 4 |
2024 FEA8 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS |
04 |
2025 FEAF 3E MSG3 FCC '>' |
2026 FEB0 04 FCB 4 |
2027 FEB1 57 48 41 54 3F MSG4 FCC 'WHAT?' |
2028 FEB6 04 FCB 4 |
2029 FEB7 20 2D 20 MSG5 FCC ' - ' |
2030 FEBA 04 FCB 4' |
2031 FEBB 20 20 53 50 3D MSG10 FCC ' SP=' |
2032 FEC0 04 FCB 4 |
2033 FEC1 20 20 50 43 3D MSG11 FCC ' PC=' |
2034 FEC6 04 FCB 4 |
2035 FEC7 20 20 55 53 3D MSG12 FCC ' US=' |
2036 FECC 04 FCB 4 |
2037 FECD 20 20 49 59 3D MSG13 FCC ' IY=' |
2038 FED2 04 FCB 4 |
2039 FED3 20 20 49 58 3D MSG14 FCC ' IX=' |
2040 FED8 04 FCB 4 |
2041 FED9 20 20 44 50 3D MSG15 FCC ' DP=' |
2042 FEDE 04 FCB 4 |
2043 FEDF 20 20 41 3D MSG16 FCC ' A=' |
2044 FEE3 04 FCB 4 |
2045 FEE4 20 20 42 3D MSG17 FCC ' B=' |
2046 FEE8 04 FCB 4 |
2047 FEE9 20 20 43 43 3A 20 MSG18 FCC ' CC: ' |
2048 FEEF 04 FCB 4 |
2049 FEF0 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' |
56 43 |
2050 FEF8 53 31 MSG20 FCC 'S1' |
2051 FEFA 04 FCB 4 |
2052 IFD DATOPT |
2053 * |
2054 * POWER UP/ RESET/ NMI ENTRY POINT |
2055 * |
2056 FF00 ORG $FF00 |
2057 * |
2058 * |
2059 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11 |
2060 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO |
2061 * |
2062 * |
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F |
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS |
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE |
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA |
2067 * STORED IN IT. |
2068 * |
2069 * |
2070 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION |
2071 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION |
2072 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ? |
2073 * |
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER |
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL |
2076 * PHYSICAL ADDRESSES. |
2077 * |
2078 FF0A 86 F0 LDA #$F0 |
2079 FF0C A7 84 STA ,X STORE $F0 AT $FFFF |
2080 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF |
2081 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" |
2082 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION |
2083 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0 |
2084 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ? |
2085 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP |
2086 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER |
2087 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? |
2088 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM |
2089 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN |
2090 * |
2091 * |
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF |
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX |
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED |
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT |
2096 * IS STORED IN RAM IN THE LOCATION THAT IS |
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, |
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND |
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE |
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE |
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE |
2102 * "7" IN THE $70A0 WILL BE STORED IN |
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS |
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND |
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE |
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE |
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- |
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT |
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE |
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK |
2111 * OF RAM RESPONDS. |
2112 * |
2113 * |
2114 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION |
2115 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2116 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS |
2117 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN |
2118 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING |
2119 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS |
2120 FF32 44 LSRA TRANSLATION RAM. |
2121 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D" |
2122 * |
2123 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER |
2124 * |
2125 * |
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES |
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK |
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS |
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION |
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF |
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO |
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... |
2133 * |
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- |
2136 * |
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE |
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... |
2139 * |
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 |
2142 * |
2143 * |
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF |
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL |
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK |
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT |
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 |
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 |
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE |
2151 * MEMORY ADDRESSED AS FOLLOWS.... |
2152 * |
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- |
2155 * |
2156 * |
2157 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2158 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD |
2159 FF40 6F 2E CLR 14,Y CLEAR $DFDE |
2160 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? |
2161 FF44 A7 2F STA 15,Y STORE AT $DFDF |
2162 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR |
2163 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 |
2164 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR |
2165 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING |
2166 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM |
2167 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO |
2168 FF54 27 22 BEQ FINTAB SKIP IF FINISHED |
2169 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION |
2170 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. |
2171 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC. |
2172 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION |
2173 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER |
2174 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION |
2175 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2176 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2177 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 |
2178 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM. |
2179 FF6E 44 LSRA |
2180 FF6F 44 LSRA |
2181 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE |
2182 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK |
2183 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE |
2184 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK |
2185 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? |
2186 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE |
2187 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE |
2188 * |
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF |
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES |
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT |
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---. |
2193 * |
2194 * |
2195 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C" |
2196 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE |
2197 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. |
2198 FF86 4A DECA ELSE POINT 4K LOWER |
2199 FF87 2A F9 BPL FINDC GO TRY AGAIN |
2200 FF89 20 14 BRA XFERTF |
2201 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND |
2202 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- |
2203 * |
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION |
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL |
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL |
2207 * ADDRESSES FROM $0000 AND UP.... |
2208 * |
2209 FF8F 4F CLRA START AT ZERO |
2210 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. |
2211 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE |
2212 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP |
2213 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE |
2214 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP |
2215 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY |
2216 FF9B 81 0C CMPA #$0C LAST ENTRY YET ? |
2217 FF9D 2D F3 BLT COMPRS |
2218 * |
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION |
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON |
2221 * THE MP-09 CPU CARD. |
2222 * |
2223 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11 |
2224 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE |
2225 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT |
2226 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11 |
2227 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE |
2228 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED |
2229 * |
2230 ELSE |
2231 LRA RTS |
2232 START LDS #STACK INITIALIZE STACK POINTER |
2233 CLRB |
2234 ENDIF DATOPT |
2234 ENDIF DATOPT |
2235 * |
2236 FFAB 53 COMB SET "B" NON-ZERO |
2237 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG |
2238 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE |
2239 * |
2240 ** INTERRUPT JUMP VECTORS |
2241 * |
2242 FFB2 6E 9F DF C0 V1 JMP [STACK] |
2243 FFB6 6E 9F DF C4 V2 JMP [SWI2] |
2244 FFBA 6E 9F DF C6 V3 JMP [FIRQ] |
2245 FFBE 6E 9F DF C8 V4 JMP [IRQ] |
2246 FFC2 6E 9F DF CA V5 JMP [SWI] |
2247 * |
2248 * SWI3 ENTRY POINT |
2249 * |
2250 FFC6 1F 43 SWI3E TFR S,U |
2251 FFC8 AE 4A LDX 10,U *$FFC8 |
2252 FFCA E6 80 LDB ,X+ |
2253 FFCC AF 4A STX 10,U |
2254 FFCE 4F CLRA |
2255 FFCF 58 ASLB |
2256 FFD0 49 ROLA |
2257 FFD1 BE DF CC LDX SVCVO |
2258 FFD4 8C FF FF CMPX #$FFFF |
2259 FFD7 27 0F BEQ SWI3Z |
2260 FFD9 30 8B LEAX D,X |
2261 FFDB BC DF CE CMPX SVCVL |
2262 FFDE 22 08 BHI SWI3Z |
2263 FFE0 34 10 PSHS X |
2264 FFE2 EC C4 LDD ,U |
2265 FFE4 AE 44 LDX 4,U |
2266 FFE6 6E F1 JMP [,S++] |
2267 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP |
2268 FFEA EE 42 LDU 2,U |
2269 FFEC 6E 9F DF C2 JMP [SWI3] |
2270 * |
2271 * 6809 VECTORS |
2272 * |
2273 FFF0 ORG $FFF0 |
2274 FFF0 FF B2 FDB V1 USER-V |
2275 FFF2 FF C6 FDB SWI3E SWI3-V |
2276 FFF4 FF B6 FDB V2 SWI2-V |
2277 FFF6 FF BA FDB V3 FIRQ-V |
2278 FFF8 FF BE FDB V4 IRQ-V |
2279 FFFA FF C2 FDB V5 SWI-V |
2280 FFFC FF B2 FDB V1 NMI-V |
2281 FFFE FF 00 FDB START RESTART-V |
0004 END START |
0005 END |
Program + Init Data = 2043 bytes |
Error count = 0 |
/sys09swt.lst
0,0 → 1,2778
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 NAM SYS09BUG FOR SWTPc |
0000 INCLUDE "opt_swt.txt" |
0001 * |
0002 *************************************************** |
0003 * OPTION SWITCHES |
0004 *************************************************** |
0005 * |
0006 * |
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
0009 ** FOR LOADING AND SAVING S1 RECORDS |
0010 * |
0011 *S3EOPT EQU $FF SPARTAN3E STARTER |
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
0016 00FF SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
0017 * |
0002 END |
0000 INCLUDE "sys09equ.txt" |
0001 * |
0002 *************************************************** |
0003 * MEMORY MAP EQUATES * |
0004 *************************************************** |
0005 E000 MONIO EQU $E000 I/O SPACE |
0006 IFD S3EOPT |
0007 MONRAM EQU $7FC0 |
0008 ELSE |
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE |
0010 ENDIF S3EOPT |
0011 F800 MONROM EQU $F800 START OF ROM |
0012 IFD S3SOPT |
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0014 EXTCMD EQU $00 EXTENDED OFFSET |
0015 ENDIF S3SOPT |
0015 ENDIF S3SOPT |
0016 IFD XESOPT |
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0018 EXTCMD EQU $00 EXTENDED OFFSET |
0019 ENDIF XESOPT |
0019 ENDIF XESOPT |
0020 *************************************************** |
0021 |
0022 IFD S3EOPT |
0023 * |
0024 * DIGILENT SPARTAN 3E STARTER |
0025 * |
0026 ACIAOPT EQU $FF ACIA AT PORT 0 |
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0028 VDUOPT EQU $FF VDU AT $E030 |
0029 TRAOPT EQU $FF PIA TRACE TIMER |
0030 ENDIF S3EOPT |
0030 ENDIF S3EOPT |
0031 * |
0032 IFD S3SOPT |
0033 * |
0034 * DIGILENT SPARTAN 3 STARTER |
0035 * |
0036 ACIAOPT EQU $FF ACIA AT PORT 0 |
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0038 VDUOPT EQU $FF VDU AT $E030 |
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0041 EXTOPT EQU $FF EXTENDED COMMANDS |
0042 ENDIF S3SOPT |
0042 ENDIF S3SOPT |
0043 * |
0044 IFD B5XOPT |
0045 * |
0046 * BURCHED B5-X300 |
0047 * |
0048 ACIAOPT EQU $FF ACIA AT PORT 0 |
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0050 VDUOPT EQU $FF VDU AT $E030 |
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0053 ENDIF B5XOPT |
0053 ENDIF B5XOPT |
0054 * |
0055 IFD XESOPT |
0056 * |
0057 * XESS XSA-3S1000 & XST-3.0 |
0058 * |
0059 ACIAOPT EQU $FF ACIA AT PORT 0 |
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0061 VDUOPT EQU $FF VDU AT $E030 |
0062 IDEOPT EQU $FF XESS IDE AT $E100 |
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0064 EXTOPT EQU $FF EXTENDED COMMANDS |
0065 ENDIF XESOPT |
0065 ENDIF XESOPT |
0066 * |
0067 IFD ADSOPT |
0068 * |
0069 * ACKERMAN DIGITAL ADS6809 |
0070 * |
0071 DG640OPT EQU $FF DG640 VDU AT $E800 |
0072 *RTCOPT EQU $FF REAL TIME CLOCK |
0073 PRTOPT EQU $FF PRINTER DRIVERS |
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0075 ENDIF ADSOPT |
0075 ENDIF ADSOPT |
0076 * |
0077 IFD SWTOPT |
0078 * |
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER |
0080 * |
0081 00FF ACIAOPT EQU $FF ACIA AT PORT 0 |
0082 00FF DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT |
0083 00FF MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0084 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0085 ENDIF |
0086 * |
0087 IFD ACIAOPT |
0088 * |
0089 *************************************************** |
0090 * SERIAL PORT * |
0091 *************************************************** |
0092 * |
0093 ** ACIA SITS ON PORT 0 |
0094 * |
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT |
0096 * |
0097 ENDIF ACIAOPT |
0098 IFD MFDCOPT |
0099 * |
0100 *************************************************** |
0101 * MINIFLOPPY DRIVE * |
0102 *************************************************** |
0103 * |
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 |
0105 * |
0106 E014 DRVFDC EQU MONIO+$14 |
0107 E018 CMDFDC EQU MONIO+$18 |
0108 E01A SECFDC EQU MONIO+$1A |
0109 E01B DATFDC EQU MONIO+$1B |
0110 ENDIF MFDCOPT |
0111 IFD PS2OPT |
0112 * |
0113 *************************************************** |
0114 * VDU8 PS/2 KEYBOARD PORT * |
0115 *************************************************** |
0116 * |
0117 ** KEYBOARD SITS ON PORT 2 |
0118 * |
0119 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT |
0120 ENDIF PS2OPT |
0120 ENDIF PS2OPT |
0121 IFD VDUOPT |
0122 * |
0123 *************************************************** |
0124 * VDU8 DISPLAY DRIVER EQUATES * |
0125 *************************************************** |
0126 * |
0127 ** VDU8 DISPLAY SITS ON PORT 3 |
0128 * |
0129 VDU EQU MONIO+$30 |
0130 VDUCHR EQU 0 CHARACTER REGISTER |
0131 VDUATT EQU 1 ATTRIBUTE REGISTER |
0132 VDUCOL EQU 2 CURSOR COLUMN |
0133 VDUROW EQU 3 CURSOR ROW |
0134 VDUOFF EQU 4 ROW OFFSET |
0135 * |
0136 LINLEN EQU 80 LENGTH OF A LINE |
0137 NUMLIN EQU 25 NUMBER OF LINES |
0138 ENDIF VDUOPT |
0138 ENDIF VDUOPT |
0139 * |
0140 IFD CF8OPT |
0141 * |
0142 *************************************************** |
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER * |
0144 *************************************************** |
0145 * |
0146 ** COMPACT FLASH SITS AT PORT 4 |
0147 * |
0148 CF_BASE EQU MONIO+$40 |
0149 CF_DATA EQU CF_BASE+0 |
0150 CF_ERROR EQU CF_BASE+1 ; read error |
0151 CF_FEATURE EQU CF_BASE+1 ; write feature |
0152 CF_SECCNT EQU CF_BASE+2 |
0153 CF_SECNUM EQU CF_BASE+3 |
0154 CF_CYLLO EQU CF_BASE+4 |
0155 CF_CYLHI EQU CF_BASE+5 |
0156 CF_HEAD EQU CF_BASE+6 |
0157 CF_STATUS EQU CF_BASE+7 ; read status |
0158 CF_COMAND EQU CF_BASE+7 ; write command |
0159 * |
0160 * Command Equates |
0161 * |
0162 CMDREAD EQU $20 ; Read Single sector |
0163 CMDWRITE EQU $30 ; Write Single sector |
0164 CMDFEATURE EQU $EF |
0165 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0166 HEADLBA EQU $E0 |
0167 * |
0168 * Status bit equates |
0169 * |
0170 BUSY EQU $80 |
0171 DRDY EQU $40 |
0172 DRQ EQU $08 |
0173 ERR EQU $01 |
0174 * |
0175 ENDIF CF8OPT |
0175 ENDIF CF8OPT |
0176 * |
0177 IFD IDEOPT |
0178 * |
0179 *************************************************** |
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) * |
0181 *************************************************** |
0182 * |
0183 ** COMPACT FLASH SITS AT PORT 4 |
0184 * |
0185 CF_BASE EQU MONIO+$0100 |
0186 CF_DATA EQU CF_BASE+0 |
0187 CF_ERROR EQU CF_BASE+2 ; read error |
0188 CF_FEATURE EQU CF_BASE+2 ; write feature |
0189 CF_SECCNT EQU CF_BASE+4 |
0190 CF_SECNUM EQU CF_BASE+6 |
0191 CF_CYLLO EQU CF_BASE+8 |
0192 CF_CYLHI EQU CF_BASE+10 |
0193 CF_HEAD EQU CF_BASE+12 |
0194 CF_STATUS EQU CF_BASE+14 ; read status |
0195 CF_COMAND EQU CF_BASE+14 ; write command |
0196 CF_AUX EQU CF_BASE+30 |
0197 * |
0198 * Command Equates |
0199 * |
0200 CMDREAD EQU $20 ; Read Single sector |
0201 CMDWRITE EQU $30 ; Write Single sector |
0202 AUXRESET EQU $06 ; Reset IDE |
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked |
0204 HEADLBA EQU $E0 |
0205 * |
0206 * Status bit equates |
0207 * |
0208 BUSY EQU $80 |
0209 DRDY EQU $40 |
0210 DRQ EQU $08 |
0211 ERR EQU $01 |
0212 * |
0213 ENDIF CF8OPT |
0213 ENDIF CF8OPT |
0214 * |
0215 IFD RTCOPT |
0216 * |
0217 ************************************************** |
0218 * MM58167A REAL TIME CLOCK MEMORY MAP: |
0219 ************************************************** |
0220 * |
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 |
0222 * |
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS |
0224 * |
0225 * COUNTER AND COMPARITOR REGISTERS: |
0226 * |
0227 * Both the Clock Counter and Clock Comparitor |
0228 * consist of 8 registers for holding the time. |
0229 * The register offsets from the Counter and |
0230 * Comparitor registers are listed above. |
0231 * |
0232 COUNTR EQU CLOCK+0 |
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS |
0234 * |
0235 * CLOCK REGISTER OFFSETS: |
0236 * These register offsets are used for the CLOCK |
0237 * and comparitor ram CMPRAM. |
0238 * |
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS |
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS |
0241 SECOND EQU 2 |
0242 MINUIT EQU 3 |
0243 HOUR EQU 4 |
0244 WKDAY EQU 5 |
0245 MTHDAY EQU 6 |
0246 MONTH EQU 7 |
0247 * |
0248 * INTERRUPT OUTPUT REGISTERS: |
0249 * |
0250 * An interrupt output may be generated at the |
0251 * following rates by setting the appropriate bit |
0252 * in the Interrupt Control Register (CINTCR). |
0253 * The Interrupt Status Register (CINTSR) must be |
0254 * read to clear the interrupt and will return |
0255 * the source of the interrupt. |
0256 * |
0257 * 1/Month Bit 7 |
0258 * 1/Week Bit 6 |
0259 * 1/Day Bit 5 |
0260 * 1/Hour Bit 4 |
0261 * 1/Minuite Bit 3 |
0262 * 1/Second Bit 2 |
0263 * 10/Second Bit 1 |
0264 * Comparitor Bit 0 |
0265 * |
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER |
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER |
0268 * |
0269 * COUNTER AND RAM RESETS; GO COMMAND. |
0270 * |
0271 * The counter and comparitor may be reset |
0272 * by writing $FF into CTRRES and CMPRES |
0273 * respectivly. |
0274 * A write to the Go command register (GOCMND) |
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths |
0276 * of a second counter. |
0277 * |
0278 CTRRES EQU CLOCK+18 COUNTER RESET |
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET |
0280 GOCMND EQU CLOCK+21 GO COMMAND |
0281 * |
0282 * CLOCK STATUS REGISTER. |
0283 * |
0284 * The counter takes 61 usec. to rollover for |
0285 * every 1KHz clock pulse. If the Status bit is |
0286 * set after reading the counter, the counter |
0287 * should be re-read to ensure the time is correct. |
0288 * |
0289 CLKSTA EQU CLOCK+20 STATUS BIT |
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT |
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER |
0292 ENDIF RTCOPT |
0292 ENDIF RTCOPT |
0293 * |
0294 IFD TRAOPT |
0295 * |
0296 ************************************************** |
0297 * PIA INTERRUPT TIMER |
0298 ************************************************** |
0299 * |
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7 |
0301 * |
0302 ** PIA TIMER FOR SINGLE STEP / TRACE |
0303 * |
0304 * TADATA = Output = Timer preset register |
0305 * TACTRL - CA1 = input = rising edge = NMI |
0306 * - CA2 = Output = Timer Reset (Active High) |
0307 * TBDATA = Input = Timer read back register |
0308 * TBCTRL - CB1 = input = rising edge = FIRQ |
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset |
0310 * |
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0312 * CRA1 = 1 CA1 Rising edge IRQ |
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0315 * CRA4 = 1 ] CA2 = Set/Reset output |
0316 * CRA5 = 1 ] |
0317 * CRA6 = X CA2 Input Interrupt Flag |
0318 * CRA7 = X CA1 Interrupt Flag |
0319 * |
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0321 * CRB1 = 1 CB1 Rising edge IRQ |
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0324 * CRB4 = 1 ] CB2 = Set/Reset output |
0325 * CRB5 = 1 ] |
0326 * CRB6 = X CB2 Input Interrupt Flag |
0327 * CRB7 = X CB1 Interrupt Flag |
0328 * |
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output |
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output |
0331 * |
0332 TADATA EQU MONIO+$70 Timer preset port |
0333 TACTRL EQU MONIO+$71 |
0334 TBDATA EQU MONIO+$72 Timer read back port |
0335 TBCTRL EQU MONIO+$73 |
0336 * |
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) |
0338 * |
0339 ENDIF TRAOPT |
0339 ENDIF TRAOPT |
0340 IFD ADSOPT |
0341 * |
0342 *************************************************** |
0343 * SERIAL PORT FOR DG640 * |
0344 *************************************************** |
0345 * |
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809 |
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA |
0348 * |
0349 ACIAS EQU MONIO+$400 CONTROL PORT |
0350 * |
0351 ENDIF ADSOPT |
0351 ENDIF ADSOPT |
0352 IFD PRTOPT |
0353 * |
0354 *************************************************** |
0355 * PRINTER INTERFACE * |
0356 *************************************************** |
0357 * |
0358 PADATA EQU MONIO+$404 |
0359 PACTRL EQU MONIO+$405 |
0360 PBDATA EQU MONIO+$406 |
0361 PBCTRL EQU MONIO+$407 |
0362 * |
0363 ** CB1 ACK. I/P |
0364 ** CB2 STB. O/P |
0365 ** PB0 - PB7 DATA 1 - 8 O/P |
0366 ** PORT A BIT ASSIGNMENT |
0367 * |
0368 PBUSY EQU $80 I/P |
0369 PEMPTY EQU $40 I/P |
0370 SELECT EQU $20 I/P |
0371 PERROR EQU $10 I/P |
0372 PRESET EQU %00000100 O/P PA3 = 0 |
0373 AUTOFD EQU %00001000 O/P PA2 = 0 |
0374 DIRMSK EQU %00001100 |
0375 ENDIF PRTOPT |
0375 ENDIF PRTOPT |
0376 IFD DG640OPT |
0377 * |
0378 *************************************************** |
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0380 *************************************************** |
0381 * |
0382 ** VIDEO DISPLAY DEFINITIONS |
0383 * |
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY |
0385 LINLEN EQU 64 LENGTH OF A LINE |
0386 NUMLIN EQU 16 NUMBER OF LINES |
0387 SCNLEN EQU $400 LENGTH OF SCREEN |
0388 ENDIF DG640OPT |
0388 ENDIF DG640OPT |
0389 * |
0390 IFD DMAFOPT |
0391 * |
0392 *************************************************** |
0393 * DMAF2 8" DRIVE * |
0394 *************************************************** |
0395 * |
0396 F000 ADDREG EQU $F000 ADDRESS REGISTER |
0397 F002 CNTREG EQU $F002 COUNT REGISTER |
0398 F010 CCREG EQU $F010 CHANNEL CONTROL REGISTER |
0399 F014 PRIREG EQU $F014 DMA PRIORITY REGISTER |
0400 F015 AAAREG EQU $F015 ??? |
0401 F016 BBBREG EQU $F016 ??? |
0402 F020 COMREG EQU $F020 1791 COMMAND REGISTER |
0403 F022 SECREG EQU $F022 SECTOR REGISTER |
0404 F024 DRVREG EQU $F024 DRIVE SELECT LATCH |
0405 F040 CCCREG EQU $F040 ??? |
0406 ENDIF DMAFOPT |
0407 IFD DATOPT |
0408 ************************************************** |
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS * |
0410 ************************************************** |
0411 * |
0412 FFF0 IC11 EQU $FFF0 DAT RAM CHIP |
0413 55AA TSTPAT EQU $55AA TEST PATTERN |
0414 ENDIF DATOPT |
0415 * |
0003 END |
0000 INCLUDE "sys09bug.txt" |
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR |
0002 OPT l |
|
|
sys09bug.txt page 2 |
0004 * |
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL |
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY.... |
0007 * |
0008 * ALLEN CLARK WALLACE WATSON |
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE. |
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617 |
0011 * PH. 813-977-0347 PH. 813-985-1359 |
0012 * |
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT |
0014 * 2561 NANTUCKET DR APT. E |
0015 * ATLANTA, GA 30345 |
0016 * PH. 404-320-1043 |
0017 * |
0018 * MODIFIED TO SYS09BUG VER 1.0 |
0019 * FOR: SYSTEM09 FPGA SYSTEM |
0020 * BY: JOHN KENT |
0021 * DATE: 21ST NOVEMBER 2006 |
0022 * REMOVED: DISK BOOTS |
0023 * MEMORY TEST |
0024 * ADDED: ADM3A VDU DRIVER |
0025 * |
0026 * MODIFIED TO SYS09BUG VER 1.1 |
0027 * FOR: SYSTEM09 FPGA SYSTEM |
0028 * BY: JOHN KENT |
0029 * DATE: 7TH JANUARY 2007 |
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000 |
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS |
0032 * AND REALTIME CLOCK |
0033 * |
0034 * MODIFIED TO SYS09BUG VER 1.2 |
0035 * FOR: SYSTEM09 FPGA SYSTEM |
0036 * BY: JOHN KENT |
0037 * DATE: 21ST MAY 2007 |
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION |
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD |
0040 * |
0041 * Modified to SYS09BUG VER 1.3 |
0042 * FOR: SYSTEM09 FPGA SYSTEM |
0043 * BY: JOHN KENT |
0044 * DATE: 8TH JAN 2008 |
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD |
0046 * WITH ONLY 32K OF RAM |
0047 * |
0048 * Modified to SYS09BUG VER 1.4 |
0049 * FOR: SYSTEM09 FPGA SYSTEM |
0050 * BY: JOHN KENT |
0051 * DATE: 3RD FEB 2008 |
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE |
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300 |
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE |
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
0056 * |
0057 * *** COMMANDS *** |
0058 * |
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR |
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR |
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER |
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER |
0063 * CONTROL P = ALTER THE PROGRAM COUNTER |
0064 * CONTROL U = ALTER USER STACK POINTER |
0065 * CONTROL X = ALTER "X" INDEX REGISTER |
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER |
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh |
0068 * D = 5.25" MINIFLOPPY BOOT |
0069 * E ssss-eeee = EXAMINE MEMORY |
0070 * FROM STARTING ADDRESS ssss |
0071 * TO ENDING ADDRESS eeee. |
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI |
0073 * L = LOAD TAPE |
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh |
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. |
0076 * R = DISPLAY REGISTER CONTENTS |
0077 * S = DISPLAY STACK FROM ssss TO $DFC0 |
0078 * U = 8" DMAF2 FLOPPY BOOT |
0079 * U = USER EXTENSION COMMANDS AT $F000 |
0080 * X = REMOVE ALL BREAKPOINTS |
0081 * |
0082 * |
0083 *************************************************** |
0084 * SYS09BUG VARIABLE SPACE |
0085 *************************************************** |
0086 * |
0087 DFC0 ORG MONRAM |
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK |
0089 DFC0 NMI RMB 2 USER NMI VECTOR |
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 |
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 |
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR |
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR |
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR |
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN |
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT |
0097 IFD DATOPT |
0098 DFD0 LRARAM RMB 16 LRA ADDRESSES |
0099 ENDIF DATOPT |
0100 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT |
0101 DFE2 ECHO RMB 1 ECHO FLAG |
0102 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR |
0103 IFD TRAOPT |
0104 NMISAV RMB 2 NMI Jump Vector Backup |
0105 TRACNT RMB 2 Trace Count |
0106 ENDIF TRAOPT |
0106 ENDIF TRAOPT |
0107 IFD VDUOPT |
0108 * |
0109 ************************************************** |
0110 * VDU8 DISPLAY DRIVER VARIABLES * |
0111 ************************************************** |
0112 * |
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** |
0114 COLADX RMB 1 CURSOR COLUMN |
0115 ROWADX RMB 1 CURSOR ROW |
0116 ************************************************** |
0117 * |
0118 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0119 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0120 ENDIF VDUOPT |
0120 ENDIF VDUOPT |
0121 IFD DG640OPT |
0122 * |
0123 *************************************************** |
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0125 *************************************************** |
0126 * |
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** |
0128 COLADX RMB 1 CURSOR COLUMN |
0129 ROWADX RMB 1 CURSOR ROW |
0130 ************************************************* |
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS |
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0134 ENDIF DG640OPT |
0134 ENDIF DG640OPT |
0135 * |
0136 * |
0137 *************************************************** |
0138 * START OF ROM * |
0139 *************************************************** |
0140 * |
0141 F800 ORG MONROM |
0142 F800 F8 14 FDB MONITOR |
0143 F802 F8 61 FDB NEXTCMD |
0144 F804 FD 25 FDB INCH |
0145 F806 FD 1F FDB INCHE |
0146 F808 FD 34 FDB INCHEK |
0147 F80A FD 42 FDB OUTCH |
0148 F80C FC 17 FDB PDATA |
0149 F80E FB A6 FDB PCRLF |
0150 F810 FB A2 FDB PSTRNG |
0151 F812 FA B6 FDB LRA |
0152 * |
0153 IFD ADSOPT |
0154 FDB PCHK CHECK FOR PRINTER INPUT |
0155 FDB PINIZ INITIATE PRINTER |
0156 FDB POUTCH OUTPUT CH. TO PRINTER |
0157 FDB VINIZ |
0158 FDB VOUTCH |
0159 FDB ACINIZ |
0160 FDB AOUTCH |
0161 ENDIF ADSOPT |
0161 ENDIF ADSOPT |
0162 * |
0163 * MONITOR |
0164 * |
0165 * VECTOR ADDRESS STRING IS..... |
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF |
0167 * |
0168 F814 8E FD 9F MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING |
0169 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION |
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16 |
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE |
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF |
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE |
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED |
0175 * |
0176 * CONTENTS FROM TO FUNCTION |
0177 * $F8A1 $FE40 $DFC0 USER-V |
0178 * $F8A1 $FE42 $DFC2 SWI3-V |
0179 * $F8A1 $FE44 $DFC4 SWI2-V |
0180 * $F8A1 $FE46 $DFC6 FIRQ-V |
0181 * $F8A1 $FE48 $DFC8 IRQ-V |
0182 * $FAB0 $FE4A $DFCA SWI-V |
0183 * $FFFF $FE4C $DFCC SVC-VO |
0184 * $FFFF $FE4E $DFCE SVC-VL |
0185 * |
0186 F824 8E E0 00 LDX #ACIAS |
0187 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM |
0188 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS |
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK |
0190 F82F 6F E2 CLRSTK CLR ,-S |
0191 F831 5A DECB |
0192 F832 26 FB BNE CLRSTK |
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY |
0194 F837 AF 6A STX 10,S ON STACK |
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK |
0196 F83B A7 E4 STA ,S |
0197 F83D 1F 43 TFR S,U |
0198 F83F 17 05 11 LBSR IOINIZ INITIALIZE CONTROL PORT |
0199 F842 8E FD AF LDX #MSG1 POINT TO MONITOR MESSAGE |
0200 F845 17 03 CF LBSR PDATA PRINT MSG |
0201 * |
0202 IFD DATOPT |
0203 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA |
0204 F84B 4F CLRA START TOTAL AT ZERO |
0205 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY |
0206 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC. |
0207 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC. |
0208 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL |
0209 F854 19 DAA ADJ. TOTAL FOR DECIMAL |
0210 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST |
0211 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM |
0212 F858 17 04 94 LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0213 F85B 8E FD CF LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS |
0214 F85E 17 03 B6 LBSR PDATA PRINT MSG |
0215 ENDIF DATOPT |
0216 * |
0217 IFD TRAOPT |
0218 LBSR TRAINZ |
0219 ENDIF TRAOPT |
0219 ENDIF TRAOPT |
0220 * |
0221 ***** NEXTCMD ***** |
0222 * |
0223 F861 8E FD D6 NEXTCMD LDX #MSG3 POINT TO MSG ">" |
0224 F864 17 03 3B LBSR PSTRNG PRINT MSG |
0225 F867 17 04 BB LBSR INCH GET ONE CHAR. FROM TERMINAL |
0226 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
0227 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ? |
0228 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. |
0229 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM. |
0230 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ? |
0231 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT |
0232 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO... |
0233 F878 17 04 C7 LBSR OUTCH PRINT "^" |
0234 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR |
0235 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER |
0236 F87F 17 04 C0 PRTCMD LBSR OUTCH PRNT CMD CHAR |
0237 F882 17 04 BB LBSR OUT1S PRNT SPACE |
0238 F885 C1 60 CMPB #$60 |
0239 F887 2F 02 BLE NXTCH0 |
0240 F889 C0 20 SUBB #$20 |
0241 * |
0242 ***** DO TABLE LOOKUP ***** |
0243 * FOR COMMAND FUNCTIONS |
0244 * |
0245 F88B 8E FD 66 NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE |
0246 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
0247 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND |
0248 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
0249 F894 8C FD 9F CMPX #TABEND REACHED END OF TABLE YET ? |
0250 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY |
0251 F899 8E FD D8 LDX #MSG4 POINT TO MSG "WHAT?" |
0252 F89C 17 03 78 LBSR PDATA PRINT MSG |
0253 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD |
0254 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE |
0255 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND |
0256 * |
0257 * "G" GO OR CONTINUE |
0258 * |
0259 F8A5 1F 34 GO TFR U,S |
0260 F8A7 3B RTI RTI |
0261 * |
0262 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0263 * |
0264 F8A8 17 03 F3 MEMCHG LBSR IN1ADR INPUT ADDRESS |
0265 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN |
0266 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y" |
0267 F8AF 8E FD DE MEMC2 LDX #MSG5 POINT TO MSG " - " |
0268 F8B2 17 02 ED LBSR PSTRNG PRINT MSG |
0269 F8B5 1F 21 TFR Y,X FETCH ADDRESS |
0270 F8B7 17 04 2D LBSR OUT4H PRINT ADDR IN HEX |
0271 F8BA 17 04 83 LBSR OUT1S OUTPUT SPACE |
0272 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR. |
0273 F8BF 17 04 2D LBSR OUT2H OUTPUT CONTENTS IN ASCII |
0274 F8C2 17 04 7B LBSR OUT1S OUTPUT SPACE |
0275 F8C5 17 03 E6 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
0276 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
0277 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
0278 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN |
0279 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? |
0280 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN |
0281 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW? |
0282 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE |
0283 F8D6 81 0D CMPA #$D IS IT A CR? |
0284 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE |
0285 F8DA 39 CHRTN RTS EXIT ROUTINE |
0286 * |
0287 * |
0288 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY |
0289 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE? |
0290 F8DF 27 08 BEQ FORWRD $F972 |
0291 F8E1 17 04 5C LBSR OUT1S OUTPUT SPACE |
0292 F8E4 86 3F LDA #'? LOAD QUESTION MARK |
0293 F8E6 17 04 59 LBSR OUTCH PRINT IT |
0294 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
0295 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS |
0296 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION |
0297 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS |
0298 * |
0299 * "S" DISPLAY STACK |
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM |
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. |
0302 * |
0303 F8F1 17 03 2A DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER |
0304 F8F4 1F 32 TFR U,Y |
0305 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT |
0306 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK |
0307 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS |
0308 * |
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII |
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. |
0311 * UPPER ADDRESS IN X-REG. |
0312 * IF HEX ADDRESSES ARE INVALID (V)=1. |
0313 * |
0314 F8FD 17 03 93 MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES |
0315 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX |
0316 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS |
0317 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? |
0318 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII |
0319 F908 39 EDPRTN RTS ; |
0320 * |
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0322 * TO EVEN 16 BYTE BOUNDRIES. |
0323 * |
0324 * IF LOWER ADDR = $4532 |
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0326 * |
0327 * IF UPPER ADDR = $4567 |
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0329 * |
0330 * ENTER WITH LOWER ADDRESS IN X-REG. |
0331 * -UPPER ADDRESS ON TOP OF STACK. |
0332 * |
0333 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
0334 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS |
0335 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0336 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
0337 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
0338 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0339 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
0340 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
0341 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
0342 F91C 17 04 15 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
0343 F91F 27 03 BEQ EDUMP |
0344 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
0345 F923 39 RTS ; |
0346 * |
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0349 * |
0350 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
0351 F926 8E FD DE LDX #MSG5 POINT TO MSG " - " |
0352 F929 17 02 76 LBSR PSTRNG PRINT MSG |
0353 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
0354 F92E 17 03 B6 LBSR OUT4H PRINT THE ADDRESS |
0355 F931 17 04 0A LBSR OUT2S 2 SPACES |
0356 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
0357 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT |
0358 F938 17 03 B4 LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0359 F93B 17 04 02 LBSR OUT1S OUTPUT SPACE |
0360 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT |
0361 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
0362 * |
0363 * PRINT 16 ASCII CHARACTERS |
0364 * IF NOT PRINTABLE OR NOT VALID |
0365 * ASCII PRINT A PERIOD (.) |
0366 F941 17 03 FA LBSR OUT2S 2 SPACES |
0367 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
0368 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 |
0369 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY |
0370 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
0371 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
0372 F94E 81 7E CMPA #$7E IS IT VALID ASCII? |
0373 F950 23 02 BLS PRASC IF SO PRINT IT |
0374 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.) |
0375 F954 17 03 EB PRASC LBSR OUTCH PRINT ASCII CHARACTER |
0376 F957 5A DECB DECREMENT COUNT |
0377 F958 26 EE BNE EDPASC |
0378 F95A 20 BC BRA NXTLIN |
0379 * |
0380 ***** "B" SET BREAKPOINT ***** |
0381 * |
0382 F95C 17 03 3F BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS |
0383 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR. |
0384 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 |
0385 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT |
0386 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK |
0387 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE |
0388 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE |
0389 F96D 35 10 PULS X POP BP ADDRESS FROM STACK |
0390 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE |
0391 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS |
0392 F973 81 3F CMPA #$3F IS IT A SWI? |
0393 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR |
0394 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE |
0395 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE |
0396 F97B 86 3F LDA #$3F LOAD A SWI ($3F) |
0397 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS |
0398 F97F 39 EXITBP RTS ; |
0399 * |
0400 * INDICATE ERROR SETTING BREAKPOINT |
0401 * |
0402 F980 17 03 BD BPERR LBSR OUT1S OUTPUT SPACE |
0403 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR |
0404 F985 16 03 BA LBRA OUTCH PRINT "?" |
0405 * |
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** |
0407 * |
0408 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE |
0409 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0410 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE |
0411 F990 5A DECB $FAAC DECREMENT BP COUNTER |
0412 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE? |
0413 F993 39 RTS |
0414 * |
0415 ***** SWI ENTRY POINT ***** |
0416 * |
0417 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER |
0418 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG |
0419 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE. |
0420 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE |
0421 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR |
0422 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK |
0423 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA |
0424 F9A2 17 02 D0 REGPR LBSR REGSTR GO PRINT REGISTERS |
0425 * |
0426 IFD TRAOPT |
0427 LDX #0 |
0428 STX TRACNT |
0429 ENDIF TRAOPT |
0429 ENDIF TRAOPT |
0430 * |
0431 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND |
0432 * |
0433 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE |
0434 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY |
0435 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S |
0436 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS |
0437 F9B1 81 3F CMPA #$3F IS IT SWI? |
0438 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S |
0439 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE |
0440 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS |
0441 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC |
0442 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S |
0443 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S |
0444 F9BF A7 A0 STA ,Y+ |
0445 F9C1 39 RTS |
0446 * |
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH ** |
0448 * |
0449 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE |
0450 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0451 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE |
0452 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? |
0453 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY |
0454 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER |
0455 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH |
0456 F9D1 39 RTS ; |
0457 * |
0458 * |
0459 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY |
0460 F9D4 39 RTS |
0461 * |
0462 IFD TRAOPT |
0463 * |
0464 ** TRACE from address AAAA BB bytes |
0465 * |
0466 TRACE LBSR ALTPC1 SET UP NEW PC |
0467 BVS TREXIT ADDRESS ERROR, EXIT |
0468 LBSR OUT1S |
0469 LBSR IN1ADR Fetch Byte Count |
0470 BVS TREXIT Byte Count error, EXIT |
0471 STX TRACNT |
0472 * |
0473 LDX NMI Save NMI Vector |
0474 STX NMISAV |
0475 LDX #NMIE Set up NMI for Tracing |
0476 STX NMI |
0477 LBSR TRAINZ Initialise Hardware |
0478 BRA TRACEG Start Trace |
0479 TREXIT RTS |
0480 * |
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0482 * CRA1 = 1 CA1 Rising edge IRQ |
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0485 * CRA4 = 1 ] CA2 = Set/Reset output |
0486 * CRA5 = 1 ] |
0487 * CRA6 = X CA2 Input Interrupt Flag |
0488 * CRA7 = X CA1 Interrupt Flag |
0489 * |
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0491 * CRB1 = 1 CB1 Rising edge IRQ |
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0494 * CRB4 = 1 ] CB2 = Set/Reset output |
0495 * CRB5 = 1 ] |
0496 * CRB6 = X CB2 Input Interrupt Flag |
0497 * CRB7 = X CB1 Interrupt Flag |
0498 * |
0499 * |
0500 ** TRACE NMI ENTRY POINT |
0501 * |
0502 NMIE TFR S,U |
0503 LDA #$36 Disable Interrupt, CA2 Low |
0504 STA TACTRL |
0505 LDA TADATA Clear Interrupt flag by reading data port |
0506 * |
0507 LBSR REGSTR DUMP REGISTERS |
0508 * |
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI |
0510 LDA ,X |
0511 CMPA #$3F |
0512 BEQ TRACEX EXIT ON SWI |
0513 * |
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED |
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR |
0516 LEAX -1,X DECREMENT TRACE COUNT |
0517 STX TRACNT |
0518 * |
0519 ** TRACE GO (RESUME SINGLE STEP) |
0520 * |
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER |
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) |
0523 STA TADATA |
0524 LDA #$36 LOAD STROBE LOW |
0525 STA TACTRL |
0526 LDA TADATA CLEAR INTERRUPT |
0527 LDA #$36 RELEASE RESET |
0528 STA TBCTRL |
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE |
0530 STA TACTRL |
0531 RTI GO EXECUTE INSTRUCTION |
0532 * |
0533 TRACEX LDX NMISAV Restore NMI vector |
0534 STX NMI |
0535 LBRA NEXTCMD Jump back to the command loop. |
0536 * |
0537 ** TRACE HARDWARE INITIALISATION |
0538 * |
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED |
0540 STA TACTRL |
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED |
0542 STA TBCTRL |
0543 LDA #$FF PORTA = OUTPUT |
0544 STA TADATA |
0545 LDA #$00 PORTB = INPUT |
0546 STA TBDATA |
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW |
0548 STA TACTRL |
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH |
0550 STA TBCTRL |
0551 RTS |
0552 * |
0553 ENDIF TRAOPT |
0553 ENDIF TRAOPT |
0554 IFD MFDCOPT |
0555 * |
0556 ** "U" MINI DISK BOOT |
0557 * |
0558 F9D5 7D E0 18 MINBOOT TST CMDFDC |
0559 F9D8 7F E0 14 CLR DRVFDC |
0560 F9DB 8E 00 00 LDX #$0000 |
0561 F9DE 30 01 LOOP LEAX $01,X |
0562 F9E0 8C 00 00 CMPX #$0000 |
0563 F9E3 26 F9 BNE LOOP |
0564 F9E5 86 0F LDA #$0F |
0565 F9E7 B7 E0 18 STA CMDFDC |
0566 F9EA 8D 37 BSR DELAY |
0567 F9EC F6 E0 18 LOOP1 LDB CMDFDC |
0568 F9EF C5 01 BITB #$01 |
0569 F9F1 26 F9 BNE LOOP1 |
0570 F9F3 86 01 LDA #$01 |
0571 F9F5 B7 E0 1A STA SECFDC |
0572 F9F8 8D 29 BSR DELAY |
0573 F9FA 86 8C LDA #$8C |
0574 F9FC B7 E0 18 STA CMDFDC |
0575 F9FF 8D 22 BSR DELAY |
0576 FA01 8E C0 00 LDX #$C000 |
0577 FA04 20 09 BRA LOOP3 |
0578 FA06 C5 02 LOOP2 BITB #$02 |
0579 FA08 27 05 BEQ LOOP3 |
0580 FA0A B6 E0 1B LDA DATFDC |
0581 FA0D A7 80 STA ,X+ |
0582 FA0F F6 E0 18 LOOP3 LDB CMDFDC |
0583 FA12 C5 01 BITB #$01 |
0584 FA14 26 F0 BNE LOOP2 |
0585 FA16 C5 2C BITB #$2C |
0586 FA18 27 01 BEQ LOOP4 |
0587 FA1A 39 RTS |
0588 * |
0589 FA1B 8E C0 00 LOOP4 LDX #$C000 |
0590 FA1E AF 4A STX $0A,U |
0591 FA20 1F 34 TFR U,S |
0592 FA22 3B RTI |
0593 * |
0594 FA23 C6 04 DELAY LDB #$04 |
0595 FA25 5A LOOP5 DECB |
0596 FA26 26 FD BNE LOOP5 |
0597 FA28 39 RTS |
0598 ENDIF MFDCOPT |
0599 * |
0600 IFD DMAFOPT |
0601 * |
0602 *** "D" DISK BOOT FOR DMAF2 *** |
0603 * |
0604 FA29 86 DE DBOOT LDA #$DE |
0605 FA2B B7 F0 24 STA DRVREG |
0606 FA2E 86 FF LDA #$FF |
0607 FA30 B7 F0 14 STA PRIREG $FAF8 |
0608 FA33 B7 F0 10 STA CCREG |
0609 FA36 B7 F0 15 STA AAAREG |
0610 FA39 B7 F0 16 STA BBBREG |
0611 FA3C 7D F0 10 TST CCREG |
0612 FA3F 86 D8 LDA #$D8 |
0613 FA41 B7 F0 20 STA COMREG |
0614 FA44 17 00 96 LBSR DLY |
0615 FA47 B6 F0 20 DBOOT0 LDA COMREG |
0616 FA4A 2B FB BMI DBOOT0 |
0617 FA4C 86 09 LDA #$09 |
0618 FA4E B7 F0 20 STA COMREG |
0619 FA51 17 00 89 LBSR DLY |
0620 * |
0621 FA54 B6 F0 20 DISKWT LDA COMREG FETCH DRIVE STATUS |
0622 FA57 85 01 BITA #1 TEST BUSY BIT |
0623 FA59 26 F9 BNE DISKWT LOOP UNTIL NOT BUSY |
0624 * |
0625 FA5B 85 10 BITA #$10 |
0626 FA5D 26 CA BNE DBOOT |
0627 * |
0628 FA5F 8E C0 00 LDX #$C000 LOGICAL ADDR. = $C000 |
0629 FA62 8D 52 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. |
0630 FA64 8A 10 ORA #$10 |
0631 FA66 B7 F0 40 STA CCCREG |
0632 FA69 1F 10 TFR X,D |
0633 FA6B 43 COMA ; |
0634 FA6C 53 COMB ; |
0635 FA6D FD F0 00 STD ADDREG |
0636 FA70 8E FE FF LDX #$FEFF LOAD DMA BYTE COUNT = $100 |
0637 FA73 BF F0 02 STX CNTREG STORE IN COUNT REGISTER |
0638 FA76 86 FF LDA #$FF LOAD THE CHANNEL REGISTER |
0639 FA78 B7 F0 10 STA CCREG |
0640 FA7B 86 FE LDA #$FE SET CHANNEL 0 |
0641 FA7D B7 F0 14 STA PRIREG |
0642 FA80 86 01 LDA #1 SET SECTOR TO "1" |
0643 FA82 B7 F0 22 STA SECREG ISSUE COMMAND |
0644 FA85 86 8C LDA #$8C SET SINGLE SECTOR READ |
0645 FA87 B7 F0 20 STA COMREG ISSUE COMMAND |
0646 FA8A 8D 51 BSR DLY |
0647 * |
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE |
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT |
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7" |
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT |
0652 * IS STILL A ONE THE BOOT OPERATION WILL |
0653 * BE STARTED OVER FROM THE BEGINING. |
0654 * |
0655 FA8C 5F CLRB ; |
0656 FA8D 34 04 DBOOT1 PSHS B $FB55 |
0657 FA8F 5F CLRB ; |
0658 FA90 7D F0 10 DBOOT2 TST CCREG |
0659 FA93 2A 0A BPL DBOOT3 |
0660 FA95 5A DECB ; |
0661 FA96 26 F8 BNE DBOOT2 |
0662 FA98 35 04 PULS B |
0663 FA9A 5A DECB |
0664 FA9B 26 F0 BNE DBOOT1 |
0665 FA9D 20 8A BRA DBOOT |
0666 FA9F 35 04 DBOOT3 PULS B |
0667 FAA1 B6 F0 20 LDA COMREG |
0668 FAA4 85 1C BITA #$1C |
0669 FAA6 27 01 BEQ DBOOT4 |
0670 FAA8 39 RTS ; |
0671 * |
0672 * |
0673 FAA9 C6 DE DBOOT4 LDB #$DE |
0674 FAAB F7 F0 24 STB DRVREG |
0675 FAAE 8E C0 00 LDX #$C000 |
0676 FAB1 AF 4A STX 10,U |
0677 FAB3 1F 34 TFR U,S $FB7B |
0678 FAB5 3B RTI ; |
0679 ENDIF DMAFOPT |
0680 * |
0681 IFD CF8OPT |
0682 * |
0683 * COMPACT FLASH BOOT |
0684 * |
0685 CFBOOT BSR WAITRDY |
0686 LDA #HEADLBA |
0687 STA CF_HEAD |
0688 BSR WAITRDY |
0689 LDA #FEAT8BIT |
0690 STA CF_FEATURE |
0691 LDA #CMDFEATURE |
0692 STA CF_COMAND |
0693 BSR WAITRDY |
0694 * |
0695 * READ SECTORS FROM CF |
0696 * |
0697 CFREAD LDA #$01 |
0698 STA CF_SECCNT |
0699 CLRA |
0700 STA CF_SECNUM |
0701 STA CF_CYLLO |
0702 STA CF_CYLHI |
0703 * |
0704 LDA #CMDREAD ; IDE READ MULTIPLE |
0705 STA CF_COMAND |
0706 BSR WAITRDY |
0707 LDX #$C000 |
0708 * |
0709 * READ LOOP |
0710 * |
0711 RDLOOP BSR WAITDRQ |
0712 LDA CF_DATA |
0713 STA ,X+ |
0714 CMPX #$C200 |
0715 BNE RDLOOP |
0716 * |
0717 LDX #$C000 |
0718 STX $0A,U |
0719 TFR U,S |
0720 RTI |
0721 * |
0722 * WAIT UNTIL READY |
0723 * |
0724 WAITRDY LDA CF_STATUS |
0725 BITA #BUSY |
0726 BNE WAITRDY |
0727 LDA CF_STATUS |
0728 BITA #DRDY |
0729 BEQ WAITRDY |
0730 RTS |
0731 * |
0732 * WAIT FOR DATA REQUEST |
0733 * |
0734 WAITDRQ LDA CF_STATUS |
0735 BITA #DRQ |
0736 BEQ WAITDRQ |
0737 RTS |
0738 ENDIF CF8OPT |
0738 ENDIF CF8OPT |
0739 * |
0740 IFD IDEOPT |
0741 * |
0742 * XESS 16 BIT IDE BOOT |
0743 * |
0744 IDEBOOT LDD #AUXRESET |
0745 STD CF_AUX |
0746 LDD #AUXRSTREL |
0747 STD CF_AUX |
0748 LDD #HEADLBA |
0749 STD CF_HEAD |
0750 BSR WAITRDY |
0751 * |
0752 * READ SECTORS FROM CF |
0753 * |
0754 LDD #$01 |
0755 STD CF_SECCNT |
0756 CLRB |
0757 STD CF_SECNUM |
0758 STD CF_CYLLO |
0759 STD CF_CYLHI |
0760 * |
0761 LDB #CMDREAD ; IDE READ MULTIPLE |
0762 STD CF_COMAND |
0763 BSR WAITRDY |
0764 LDX #$C000 |
0765 * |
0766 * READ LOOP |
0767 * |
0768 RDLOOP BSR WAITDRQ |
0769 LDD CF_DATA |
0770 STB ,X+ |
0771 CMPX #$C100 |
0772 BNE RDLOOP |
0773 * |
0774 LDX #$C000 |
0775 STX $0A,U |
0776 TFR U,S |
0777 RTI |
0778 * |
0779 * WAIT UNTIL READY |
0780 * |
0781 WAITRDY LDD CF_STATUS |
0782 BITB #BUSY |
0783 BNE WAITRDY |
0784 LDD CF_STATUS |
0785 BITB #DRDY |
0786 BEQ WAITRDY |
0787 RTS |
0788 * |
0789 * WAIT FOR DATA REQUEST |
0790 * |
0791 WAITDRQ LDD CF_STATUS |
0792 BITB #DRQ |
0793 BEQ WAITDRQ |
0794 RTS |
0795 ENDIF IDEOPT |
0795 ENDIF IDEOPT |
0796 * |
0797 IFD RTCOPT |
0798 * |
0799 * CLOCK INTER FACE UTILITY |
0800 * |
0801 * TIME <Hours> <Minuits> <Seconds> |
0802 * If no argument is specified, the current time |
0803 * will be displayed. |
0804 * |
0805 * READ A REGISTER FROM THE COUNTER. |
0806 * The X Index rgister points to the register |
0807 * to be read. The Status Register is checked |
0808 * before and after the register is read before |
0809 * returning a value in accumulator A |
0810 * |
0811 RDCLK TST CLKSTA |
0812 BNE RDCLK |
0813 RDCLK1 LDA 0,X |
0814 TST CLKSTA |
0815 BNE RDCLK1 |
0816 RTS |
0817 * |
0818 * MAIN PROGRAM: |
0819 * |
0820 TIMSET LDX #COUNTR POINT TO TIMER |
0821 LBSR BYTE READ HOURS |
0822 BVS SHOWTM NO ARG, DISP TIME |
0823 STA HOUR,X |
0824 LBSR OUT1S |
0825 LBSR BYTE READ MINUITES |
0826 BVS SHOWTM |
0827 STA MINUIT,X |
0828 LBSR OUT1S |
0829 LBSR BYTE SECONDS. |
0830 BVS SHOWTM |
0831 STA SECOND,X |
0832 * |
0833 * DISPLAY CURRENT TIME |
0834 * |
0835 SHOWTM LBSR PCRLF |
0836 LDX #COUNTR+HOUR |
0837 LDB #3 |
0838 SHOWLP BSR RDCLK |
0839 LBSR OUT2H |
0840 LDA #': |
0841 LBSR OUTCH |
0842 LEAX -1,X |
0843 DECB |
0844 BNE SHOWLP |
0845 RTS |
0846 * |
0847 * INITIATE CLOCK. |
0848 * MASK INTERRUPTS. |
0849 * |
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS |
0851 TST CINTSR CLEAR ANY INTERRUPTS |
0852 RTS |
0853 ENDIF RTCOPT |
0853 ENDIF RTCOPT |
0854 IFD DATOPT |
0855 * |
0856 ***** LRA LOAD REAL ADDRESS ***** |
0857 * |
0858 * THE FOLLOWING CODE LOADS THE 20-BIT |
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE |
0860 * INTO THE "A" AND "X" REGISTERS. THIS |
0861 * ROUTINE IS ENTERED WITH THE LOGICAL |
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX" |
0863 * REGISTER. EXIT IS MADE WITH THE HIGH- |
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL |
0865 * ADDRESS IN THE "A" REGISTER, AND THE |
0866 * LOW-ORDER 16-BITS OF THE 20-BIT |
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER. |
0868 * ALL OTHER REGISTERS ARE PRESERVED. |
0869 * THIS ROUTINE IS REQUIRED SINCE THE |
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST |
0871 * PRESENT PHYSICAL ADDRESSES ON THE |
0872 * SYSTEM BUS. |
0873 * |
0874 FAB6 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK |
0875 FAB8 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK |
0876 FABA 44 LSRA ; |
0877 FABB 44 LSRA ADJ FOR INDEXED INTO |
0878 FABC 44 LSRA CORRESPONDING LOCATION |
0879 FABD 44 LSRA IN LRA TABLE |
0880 FABE 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS |
0881 FAC2 E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE |
0882 FAC4 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED |
0883 FAC5 54 LSRB PHYSICAL ADDRESS. |
0884 FAC6 54 LSRB EXTENDED MS 4-BITS ARE RETURNED |
0885 FAC7 54 LSRB IN THE "A" ACCUMULATOR |
0886 FAC8 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK |
0887 FACA E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE |
0888 FACC 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG |
0889 FACD 58 ASLB ADJ DATA FOR RELOCATION IN X REG |
0890 FACE 58 ASLB ; |
0891 FACF 58 ASLB $FB97 |
0892 FAD0 58 ASLB ; |
0893 FAD1 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR. |
0894 FAD3 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS |
0895 FAD5 A7 62 STA 2,S SAVE IT IN X REG ON STACK |
0896 FAD7 EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. |
0897 * |
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS |
0899 FAD9 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG |
0900 * ON STACK |
0901 FADB 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK |
0902 ENDIF DATOPT |
0903 * |
0904 * DELAY LOOP |
0905 * |
0906 FADD 34 04 DLY PSHS B SAVE CONTENTS OF "B" |
0907 FADF C6 20 LDB #$20 GET LOOP DELAY VALUE |
0908 FAE1 5A SUB1 DECB SUBTRACT ONE FROM VALUE |
0909 FAE2 26 FD BNE SUB1 LOOP UNTIL ZERO |
0910 FAE4 35 84 PULS B,PC RESTORE CONTENTS OF "B" |
0911 * RTS ; |
0912 * |
0913 ***** "L" LOAD MIKBUG TAPE ***** |
0914 * |
0915 FAE6 BD FD 53 LOAD JSR ACINIZ |
0916 FAE9 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE |
0917 FAEB 17 02 54 LBSR OUTCH OUTPUT IT TO TERMINAL PORT |
0918 FAEE 7F DF E2 CLR ECHO TURN OFF ECHO FLAG |
0919 FAF1 17 02 26 LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO |
0920 FAF4 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? |
0921 FAF6 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. |
0922 FAF8 17 02 1F LBSR ECHON |
0923 FAFB 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ? |
0924 FAFD 27 3D BEQ LOAD21 IF SO, EXIT LOAD |
0925 FAFF 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? |
0926 FB01 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR. |
0927 FB03 17 01 A8 LBSR BYTE INPUT BYTE COUNT |
0928 FB06 34 02 PSHS A PUSH COUNT ON STACK |
0929 FB08 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX |
0930 FB0A 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS |
0931 FB0D 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX |
0932 FB0F 34 10 PSHS X PUSH ADDR ON STACK |
0933 FB11 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE |
0934 FB13 EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM |
0935 FB15 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM |
0936 FB17 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS |
0937 FB19 6A E4 DEC ,S ADDRESS BYTES. |
0938 FB1B 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK |
0939 FB1D 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) |
0940 FB20 35 04 PULS B POP CHECKSUM FROM STACK |
0941 FB22 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX |
0942 FB24 34 02 PSHS A PUSH DATA BYTE ON STACK |
0943 FB26 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK |
0944 FB28 6A E4 DEC ,S DECREMENT BYTE COUNT 1 |
0945 FB2A 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM |
0946 FB2C A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY |
0947 FB2E 20 EB BRA LOAD10 GET NEXT DATA BYTE |
0948 FB30 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; |
0949 FB31 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) |
0950 FB33 C1 FF CMPB #$FF CHECKSUM OK? |
0951 FB35 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE |
0952 FB37 86 3F LDA #'? LOAD (?) ERROR INDICATOR |
0953 FB39 17 02 06 LBSR OUTCH OUTPUT IT TO TERMINAL |
0954 FB3C 73 DF E2 LOAD21 COM ECHO TURN ECHO ON |
0955 FB3F 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE |
0956 FB41 16 01 FE LBRA OUTCH OUTPUT IT |
0957 * |
0958 ***** "P" PUNCH MIKBUG TAPE ***** |
0959 * |
0960 FB44 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK |
0961 FB46 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS |
0962 FB49 34 30 PSHS X,Y SAVE ADDRESSES ON STACK |
0963 FB4B 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH |
0964 FB4D AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR |
0965 FB4F 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH |
0966 FB51 30 01 LEAX 1,X INCREMENT END ADDRESS |
0967 FB53 AF E4 STX ,S STORE END ADDR ON STACK |
0968 FB55 BD FD 53 JSR ACINIZ |
0969 FB58 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE |
0970 FB5A 17 01 E5 LBSR OUTCH OUTPUT IT TO TERMINAL |
0971 FB5D EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC |
0972 FB5F A3 62 SUBD 2,S SUBTRACT BEGIN FROM END |
0973 FB61 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT |
0974 FB63 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES? |
0975 FB67 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES |
0976 FB69 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. |
0977 FB6B E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT |
0978 FB6D 8E FE 1F LDX #MSG20 POINT TO MSG "S1" |
0979 FB70 17 00 2F LBSR PSTRNG PRINT MSG |
0980 FB73 CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT |
0981 FB75 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH |
0982 FB77 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT |
0983 FB7A AE 62 LDX 2,S LOAD BEGIN ADDRESS |
0984 FB7C 17 01 68 LBSR OUT4H PUNCH ADDRESS |
0985 FB7F EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM |
0986 FB81 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM |
0987 FB83 EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM |
0988 FB85 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH |
0989 FB87 17 01 65 LBSR OUT2H OUTPUT DATA BYTE |
0990 FB8A 6A 64 DEC 4,S DECREMENT BYTE COUNT |
0991 FB8C 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE |
0992 FB8E 53 COMB 1's COMPLIMENT CHECKSUM BYTE |
0993 FB8F 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH |
0994 FB91 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE |
0995 FB94 AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR |
0996 FB96 AC E4 CMPX ,S COMPARE IT TO END ADDR |
0997 FB98 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. |
0998 FB9A 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE |
0999 FB9C 17 01 A3 LBSR OUTCH OUTPUT IT |
1000 FB9F 32 65 LEAS 5,S READJUST STACK POINTER |
1001 FBA1 39 RTS ; |
1002 * |
1003 * PRINT STRING PRECEEDED BY A CR & LF. |
1004 * |
1005 FBA2 8D 02 PSTRNG BSR PCRLF PRINT CR/LF |
1006 FBA4 20 71 BRA PDATA PRINT STRING POINTED TO BY IX |
1007 * |
1008 * PCRLF |
1009 * |
1010 FBA6 34 10 PCRLF PSHS X SAVE IX |
1011 FBA8 8E FD D0 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
1012 FBAB 17 00 69 LBSR PDATA PRINT MSG |
1013 FBAE 35 90 PULS X,PC RESTORE IX & RETURN |
1014 * |
1015 * LONG BRANCHES TO COMMON ROUTINES |
1016 * |
1017 FBB0 16 01 8D JOUT1S LBRA OUT1S |
1018 FBB3 16 00 F8 JBYTE LBRA BYTE |
1019 FBB6 16 00 E5 JIN1ADR LBRA IN1ADR |
1020 * |
1021 * ALTER "PC" PROGRAM COUNTER |
1022 * |
1023 FBB9 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " |
1024 FBBC 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE |
1025 FBBE 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC" |
1026 FBC0 29 02 BVS ALTPCD EXIT IF INVALID HEX |
1027 FBC2 AF 4A STX 10,U POKE IN NEW CONTENTS |
1028 FBC4 39 ALTPCD RTS ; |
1029 * |
1030 * ALTER "U" USER STACK POINTER |
1031 * |
1032 FBC5 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = " |
1033 FBC7 8D E7 BSR JOUT1S OUTPUT SPACE |
1034 FBC9 8D EB BSR JIN1ADR |
1035 FBCB 29 02 BVS ALTUD |
1036 FBCD AF 48 STX 8,U |
1037 FBCF 39 ALTUD RTS ; |
1038 * |
1039 * ALTER "Y" INDEX REGISTER |
1040 * |
1041 FBD0 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = " |
1042 FBD2 8D DC BSR JOUT1S OUTPUT SPACE |
1043 FBD4 8D E0 BSR JIN1ADR |
1044 FBD6 29 02 BVS ALTYD |
1045 FBD8 AF 46 STX 6,U $F8F0 |
1046 FBDA 39 ALTYD RTS ; |
1047 * |
1048 * ALTER "X" INDEX REGISTER |
1049 * |
1050 FBDB 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " |
1051 FBDD 8D D1 BSR JOUT1S OUTPUT SPACE |
1052 FBDF 8D D5 BSR JIN1ADR |
1053 FBE1 29 02 BVS ALTXD |
1054 FBE3 AF 44 STX 4,U |
1055 FBE5 39 ALTXD RTS ; |
1056 * |
1057 * ALTER "DP" DIRECT PAGE REGISTER |
1058 * |
1059 FBE6 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " |
1060 FBE8 8D C6 BSR JOUT1S OUTPUT SPACE |
1061 FBEA 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1062 FBEC 29 02 BVS ALTDPD |
1063 FBEE A7 43 STA 3,U |
1064 FBF0 39 ALTDPD RTS ; |
1065 * |
1066 * ALTER "B" ACCUMULATOR |
1067 * |
1068 FBF1 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = " |
1069 FBF3 8D BB BSR JOUT1S OUTPUT SPACE |
1070 FBF5 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1071 FBF7 29 02 BVS ALTBD |
1072 FBF9 A7 42 STA 2,U |
1073 FBFB 39 ALTBD RTS $F91C |
1074 * |
1075 * ALTER "A" ACCUMULATOR |
1076 * |
1077 FBFC 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = " |
1078 FBFE 8D B0 BSR JOUT1S OUTPUT SPACE |
1079 FC00 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1080 FC02 29 02 BVS ALTAD |
1081 FC04 A7 41 STA 1,U |
1082 FC06 39 ALTAD RTS ; |
1083 * |
1084 * ALTER "CC" REGISTER |
1085 * |
1086 FC07 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " |
1087 FC09 8D A5 BSR JOUT1S OUTPUT SPACE |
1088 FC0B 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1089 FC0D 29 04 BVS ALTCCD |
1090 FC0F 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST |
1091 FC11 A7 C4 STA ,U |
1092 FC13 39 ALTCCD RTS ; |
1093 * |
1094 * PDATA |
1095 * |
1096 FC14 17 01 2B PRINT LBSR OUTCH |
1097 FC17 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
1098 FC19 81 04 CMPA #4 IS IT EOT? |
1099 FC1B 26 F7 BNE PRINT IF NOT EOT PRINT IT |
1100 FC1D 39 RTS ; |
1101 * |
1102 * PRINT REGISTERS |
1103 * |
1104 FC1E 8E FD E2 PRTSP LDX #MSG10 POINT TO MSG "SP=" |
1105 FC21 8D F4 BSR PDATA PRINT MSG |
1106 FC23 1F 31 TFR U,X |
1107 FC25 16 00 BF JOUT4H LBRA OUT4H |
1108 * |
1109 FC28 8E FD EE PRTUS LDX #MSG12 POINT TO MSG "US=" |
1110 FC2B 8D EA BSR PDATA PRINT MSG |
1111 FC2D AE 48 LDX 8,U |
1112 FC2F 20 F4 BRA JOUT4H |
1113 * |
1114 FC31 8E FE 00 PRTDP LDX #MSG15 POINT TO MSG "DP=" |
1115 FC34 8D E1 BSR PDATA PRINT MSG |
1116 FC36 A6 43 LDA 3,U |
1117 FC38 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII |
1118 * |
1119 FC3B 8E FD FA PRTIX LDX #MSG14 POINT TO MSG "IX=" |
1120 FC3E 8D D7 BSR PDATA PRINT MSG |
1121 FC40 AE 44 LDX 4,U $FCE6 |
1122 FC42 20 E1 BRA JOUT4H |
1123 * |
1124 FC44 8E FD F4 PRTIY LDX #MSG13 POINT TO MSG "IY=" |
1125 FC47 8D CE BSR PDATA PRINT MSG |
1126 FC49 AE 46 LDX 6,U |
1127 FC4B 20 D8 BRA JOUT4H |
1128 * |
1129 FC4D 8E FD E8 PRTPC LDX #MSG11 POINT TO MSG "PC=" |
1130 FC50 8D C5 BSR PDATA PRINT MSG |
1131 FC52 AE 4A LDX 10,U |
1132 FC54 20 CF BRA JOUT4H |
1133 * |
1134 FC56 8E FE 06 PRTA LDX #MSG16 POINT TO MSG "A=" |
1135 FC59 8D BC BSR PDATA PRINT MSG |
1136 FC5B A6 41 LDA 1,U |
1137 FC5D 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1138 * |
1139 FC5F 8E FE 0B PRTB LDX #MSG17 POINT TO MSG "B=" |
1140 FC62 8D B3 BSR PDATA PRINT MSG |
1141 FC64 A6 42 LDA 2,U |
1142 FC66 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1143 * |
1144 FC68 8E FE 10 PRTCC LDX #MSG18 POINT TO MSG "CC:" |
1145 FC6B 8D AA BSR PDATA PRINT MSG |
1146 FC6D A6 C4 LDA ,U |
1147 FC6F 8E FE 17 LDX #MSG19 POINT TO MSG "EFHINZVC" |
1148 FC72 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT |
1149 * |
1150 * "R" DISPLAY REGISTERS |
1151 * |
1152 FC75 8E FD DE REGSTR LDX #MSG5 POINT TO MSG " - " |
1153 FC78 17 FF 27 LBSR PSTRNG PRINT MSG |
1154 FC7B 8D A1 BSR PRTSP $FCBF |
1155 FC7D 8D A9 BSR PRTUS $FCCA |
1156 FC7F 8D B0 BSR PRTDP $FCD5 |
1157 FC81 8D B8 BSR PRTIX $FCE0 |
1158 FC83 8D BF BSR PRTIY $FCEB |
1159 FC85 8E FD DE LDX #MSG5 POINT TO MSG " - " |
1160 FC88 17 FF 17 LBSR PSTRNG PRINT MSG |
1161 FC8B 8D C0 BSR PRTPC $FCF5 |
1162 FC8D 8D C7 BSR PRTA $FCFF |
1163 FC8F 8D CE BSR PRTB $FD09 |
1164 FC91 20 D5 BRA PRTCC $FD13 |
1165 * |
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. |
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". |
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT |
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX |
1171 * ADDRESS IS INPUT. |
1172 * |
1173 FC93 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS |
1174 FC95 29 4D BVS NOTHEX EXIT IF NOT VALID HEX |
1175 FC97 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY" |
1176 FC99 86 2D LDA #'- |
1177 FC9B 17 00 A4 LBSR OUTCH PRINT " - " |
1178 * |
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
1182 * |
1183 FC9E 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) |
1184 FCA0 29 42 BVS NOTHEX EXIT IF NOT VALID HEX |
1185 FCA2 1F 01 TFR D,X |
1186 FCA4 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) |
1187 FCA6 29 3C BVS NOTHEX |
1188 FCA8 34 10 PSHS X |
1189 FCAA A7 61 STA 1,S |
1190 FCAC 35 90 PULS X,PC |
1191 * |
1192 ***** INPUT BYTE (2 HEX CHAR.) ***** |
1193 * |
1194 FCAE 8D 11 BYTE BSR INHEX GET HEX LEFT |
1195 FCB0 29 32 BVS NOTHEX EXIT IF NOT VALID HEX |
1196 FCB2 48 ASLA ; |
1197 FCB3 48 ASLA ; |
1198 FCB4 48 ASLA ; SHIFT INTO LEFT NIBBLE |
1199 FCB5 48 ASLA ; |
1200 FCB6 1F 89 TFR A,B PUT HEXL IN "B" |
1201 FCB8 8D 07 BSR INHEX GET HEX RIGHT |
1202 FCBA 29 28 BVS NOTHEX EXIT IF NOT VALID HEX |
1203 FCBC 34 04 PSHS B PUSH HEXL ON STACK |
1204 FCBE AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
1205 FCC0 39 RTS RETURN WITH HEX L&R IN "A" |
1206 * |
1207 * |
1208 FCC1 8D 57 INHEX BSR ECHON INPUT ASCII CHAR. |
1209 FCC3 81 30 CMPA #'0 IS IT > OR = "0" ? |
1210 FCC5 25 1D BCS NOTHEX IF LESS IT AIN'T HEX |
1211 FCC7 81 39 CMPA #'9 IS IT < OR = "9" ? |
1212 FCC9 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA |
1213 FCCB 80 30 SUBA #$30 ASCII ADJ. NUMERIC |
1214 FCCD 39 RTS ; |
1215 * |
1216 * |
1217 FCCE 81 41 INHEXA CMPA #'A IS IT > OR = "A" |
1218 FCD0 25 12 BCS NOTHEX IF LESS IT AIN'T HEX |
1219 FCD2 81 46 CMPA #'F IS IT < OR = "F" ? |
1220 FCD4 22 03 BHI INHEXL IF > IT AIN'T HEX |
1221 FCD6 80 37 SUBA #$37 ASCII ADJ. ALPHA |
1222 FCD8 39 RTS ; |
1223 * |
1224 FCD9 81 61 INHEXL CMPA #'a IS IT > OR = "a" |
1225 FCDB 25 07 BCS NOTHEX IF LESS IT AIN'T HEX |
1226 FCDD 81 66 CMPA #'f IS IT < "f" |
1227 FCDF 22 03 BHI NOTHEX IF > IT AIN'T HEX |
1228 FCE1 80 57 SUBA #$57 ADJUST TO LOWER CASE |
1229 FCE3 39 RTS ; |
1230 * |
1231 * |
1232 FCE4 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
1233 FCE6 39 RTS ; |
1234 * |
1235 * |
1236 FCE7 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK |
1237 FCE9 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. |
1238 FCEB 8D 02 BSR OUTHL OUTPUT HEX LEFT |
1239 FCED 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. |
1240 FCEF OUTHL EQU * |
1241 FCEF 34 02 OUT2H PSHS A SAVE IT BACK ON STACK |
1242 FCF1 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
1243 FCF2 44 LSRA ; |
1244 FCF3 44 LSRA ; |
1245 FCF4 44 LSRA ; |
1246 FCF5 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII |
1247 FCF7 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
1248 FCF9 84 0F ANDA #$0F STRIP LEFT NIBBLE |
1249 FCFB 8B 30 XASCII ADDA #$30 ASCII ADJ |
1250 FCFD 81 39 CMPA #$39 IS IT < OR = "9" ? |
1251 FCFF 2F 02 BLE OUTC IF LESS, OUTPUT IT |
1252 FD01 8B 07 ADDA #7 IF > MAKE ASCII LETTER |
1253 FD03 20 3D OUTC BRA OUTCH OUTPUT CHAR |
1254 * |
1255 * BINARY / ASCII --- THIS ROUTINE |
1256 * OUTPUTS A BYTE IN ENHANCED |
1257 * BINARY FORMAT. THE ENHANCEMENT |
1258 * IS DONE BY SUBSTITUTING ASCII |
1259 * LETTERS FOR THE ONES IN THE BYTE. |
1260 * THE ASCII ENHANCEMENT LETTERS |
1261 * ARE OBTAINED FROM THE STRING |
1262 * POINTED TO BY THE INDEX REG. "X". |
1263 * |
1264 FD05 34 02 BIASCI PSHS A SAVE "A" ON STACK |
1265 FD07 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE |
1266 FD09 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING |
1267 FD0B 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 |
1268 FD0D 25 02 BCS PRTBA IF ONE PRINT LETTER |
1269 FD0F 86 2D LDA #'- IF ZERO PRINT "-" |
1270 FD11 8D 2F PRTBA BSR OUTCH PRINT IT |
1271 FD13 8D 2B BSR OUT1S PRINT SPACE |
1272 FD15 5A DECB SUB 1 FROM #BITS YET TO PRINT |
1273 FD16 26 F1 BNE OUTBA |
1274 FD18 35 82 PULS A,PC |
1275 * |
1276 IFD EXTOPT |
1277 * |
1278 * EXTENDED USER COMMANDS |
1279 * |
1280 USRCMD JMP [MONEXT+EXTCMD] |
1281 ENDIF EXTOPT |
1281 ENDIF EXTOPT |
1282 * |
1283 * |
1284 FD1A 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ? |
1285 FD1D 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR |
1286 * |
1287 * INCHE |
1288 * |
1289 * ---GETS CHARACTER FROM TERMINAL AND |
1290 * ECHOS SAME. THE CHARACTER IS RETURNED |
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY |
1292 * BIT MASKED OFF. ALL OTHER REGISTERS |
1293 * ARE PRESERVED. |
1294 * |
1295 FD1F 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL |
1296 FD21 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
1297 FD23 20 1D BRA OUTCH ECHO CHAR TO TERMINAL |
1298 * |
1299 * INCH |
1300 * |
1301 * GET CHARACTER FROM TERMINAL. RETURN |
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
1304 * IS 8 BITS AND IS NOT ECHOED. |
1305 * |
1306 * |
1307 FD25 34 10 INCH PSHS X SAVE IX |
1308 FD27 BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT |
1309 FD2A A6 84 LDA ,X FETCH PORT STATUS |
1310 FD2C 85 01 BITA #1 TEST READY BIT, RDRF ? |
1311 IFD PS2OPT |
1312 BNE GETST1 |
1313 LDX #PS2KBD |
1314 LDA ,X |
1315 BITA #1 |
1316 ENDIF PS2OPT |
1316 ENDIF PS2OPT |
1317 FD2E 27 F7 BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
1318 FD30 A6 01 GETST1 LDA 1,X FETCH CHAR |
1319 FD32 35 90 PULS X,PC RESTORE IX |
1320 * |
1321 * INCHEK |
1322 * |
1323 * CHECK FOR A CHARACTER AVAILABLE FROM |
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
1325 * FOR READ READY. ALL REGISTERS ARE |
1326 * PRESERVED, AND THE "Z" BIT WILL BE |
1327 * CLEAR IF A CHARACTER CAN BE READ. |
1328 * |
1329 * |
1330 FD34 34 02 INCHEK PSHS A SAVE A ACCUM. |
1331 FD36 A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS |
1332 FD3A 85 01 BITA #1 TEST READY BIT, RDRF ? |
1333 IFD PS2OPT |
1334 BNE INCHEK1 |
1335 LDA PS2KBD |
1336 BITA #1 TEST READY BIT< RDRF ? |
1337 ENDIF PS2OPT |
1337 ENDIF PS2OPT |
1338 FD3C 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. |
1339 * |
1340 FD3E 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES |
1341 FD40 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE |
1342 * |
1343 * |
1344 * OUTCH |
1345 * |
1346 * OUTPUT CHARACTER TO TERMINAL. |
1347 * THE CHAR. TO BE OUTPUT IS |
1348 * PASSED IN THE A REGISTER. |
1349 * ALL REGISTERS ARE PRESERVED. |
1350 * |
1351 OUTCH IFD VDUOPT |
1352 BSR VOUTCH |
1353 ENDIF VDUOPT |
1353 ENDIF VDUOPT |
1354 IFD DG640OPT |
1355 BSR VOUTCH |
1356 ENDIF DG640OPT |
1356 ENDIF DG640OPT |
1357 FD42 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX |
1358 FD44 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL |
1359 FD47 A6 84 FETSTA LDA ,X FETCH PORT STATUS |
1360 FD49 85 02 BITA #2 TEST TDRE, OK TO XMIT ? |
1361 FD4B 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY |
1362 FD4D 35 02 PULS A GET CHAR. FOR XMIT |
1363 FD4F A7 01 STA 1,X XMIT CHAR. |
1364 FD51 35 90 PULS X,PC RESTORE IX |
1365 * |
1366 * IO INITIALIZATION |
1367 * |
1368 FD53 IOINIZ EQU * |
1369 IFD VDUOPT |
1370 BSR VINIZ |
1371 ENDIF VDUOPT |
1371 ENDIF VDUOPT |
1372 IFD DG640OPT |
1373 BSR VINIZ |
1374 ENDIF DG640OPT |
1374 ENDIF DG640OPT |
1375 FD53 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
1376 FD56 86 03 LDA #3 RESET ACIA PORT CODE |
1377 FD58 A7 84 STA ,X STORE IN CONTROL REGISTER |
1378 FD5A 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
1379 FD5C A7 84 STA ,X STORE IN CONTROL REGISTER |
1380 FD5E 6D 01 TST 1,X ANYTHING IN DATA REGISTER? |
1381 FD60 86 FF LDA #$FF TURN ON ECHO FLAG |
1382 FD62 B7 DF E2 STA ECHO |
1383 FD65 39 RTS |
1384 * |
1385 IFD VDUOPT |
1386 * |
1387 *************************************************** |
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * |
1389 * * |
1390 * 80 x 25 Characters |
1391 * |
1392 *************************************************** |
1393 * |
1394 *************************************************** |
1395 * INITIALIZE EMULATOR * |
1396 *************************************************** |
1397 * |
1398 VINIZ LDX #VDU |
1399 LDD #0 |
1400 STD COLADX AND ROWADX |
1401 STA VDUCOL,X |
1402 STB VDUROW,X |
1403 STB VDUOFF,X |
1404 STD NEWROW AND ESCFLG |
1405 LDB #$02 |
1406 STB VDUATT,X |
1407 CLR ESCFLG |
1408 LDA #$1B SEND ESCAPE |
1409 BSR VOUTCH |
1410 LDA #'Y CLEAR TO END OF SCREEN |
1411 * |
1412 ** VIDEO OUTPUT ROUTINE |
1413 * |
1414 VOUTCH PSHS A,B,X SAVE REGISTERS |
1415 LDX #VDU POINT TO VDU REGISTERS |
1416 * |
1417 ** CHECK FOR ESCAPE SEQUENCE |
1418 * |
1419 TST ESCFLG ESCAPE ACTIVE? |
1420 BEQ SOROU1 BRANCH IF NOT |
1421 BSR ESCAPE ELSE DO ESCAPE |
1422 BRA RETURN AND RETURN |
1423 * |
1424 ** CHECK FOR CONTROL CHARACTERS |
1425 * |
1426 SOROU1 CMPA #$20 CONTROL CODES? |
1427 BHS SOROU2 |
1428 BSR CONTRL BRANCH IF SO |
1429 BRA RETURN |
1430 * |
1431 ** OUTPUT TEXT CHARACTER |
1432 * |
1433 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER |
1434 LBSR NEWCOL UPDATE COLUMN |
1435 * |
1436 ** DISPLAY CURSOR AND RETURN |
1437 * |
1438 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1439 * |
1440 *************************************************** |
1441 * CONTROL CODE HANDLERS * |
1442 *************************************************** |
1443 * |
1444 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1445 LBEQ BACKSP |
1446 CMPA #$1B ESCAPE SEQUENCE? |
1447 LBEQ SETESC |
1448 CMPA #$1A CTRL Z - Clear Screen |
1449 LBEQ CLRSCR |
1450 CMPA #$16 CTRL ^ - Home |
1451 LBEQ HOME |
1452 CMPA #$D CTRL M - RETURN? |
1453 LBEQ CRETN |
1454 CMPA #$0C CTRL L - CHAR RIGHT |
1455 LBEQ CHRIGHT |
1456 CMPA #$0B CTRL K - MOVE UP ONE LINE |
1457 LBEQ LINEUP |
1458 CMPA #$0A CTRL J - LINE FEED |
1459 BNE RETESC NONE OF THESE, RETURN |
1460 * |
1461 ***************************************** LINE FEED |
1462 * |
1463 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1464 INCB BUMP ROW |
1465 CMPB #NUMLIN SCROLL TIME? |
1466 LBNE NEWCUR POSITION CURSOR IF NOT |
1467 LBRA SCROLL ELSE SCROLL IT |
1468 * |
1469 ***************************************** LINE FEED |
1470 * |
1471 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1472 TSTB AT TOP OF SCREEN ? |
1473 LBEQ RETESC Yes, Ignore |
1474 DECB No, Decrement ROW |
1475 LBRA NEWCUR POSITION CURSOR |
1476 * |
1477 *********************************** BACK SPACE |
1478 * |
1479 BACKSP LDA COLADX |
1480 BEQ RETESC RETURN |
1481 DECA |
1482 LBRA POSCOL POSITION CURSOR |
1483 * |
1484 *********************************** CURSOR RIGHT |
1485 * |
1486 CHRIGHT LDA COLADX |
1487 INCA |
1488 CMPA #LINLEN |
1489 LBEQ RETESC |
1490 LBRA POSCOL |
1491 * |
1492 *********************************** CURSOR RIGHT |
1493 * |
1494 HOME LDD #0 HOME - POSITION TOP OF SCREEN |
1495 LBRA NEWCUR |
1496 * |
1497 *************************************************** |
1498 * ESCAPE HANDLERS * |
1499 *************************************************** |
1500 * |
1501 ESCAPE LDAB ESCFLG GET FLAG |
1502 CMPB #'= SETTING CURSOR? |
1503 BEQ ESCCUR BRANCH IF SO |
1504 CMPA #'Y CLEAR TO END OF SCREEN? |
1505 LBEQ ESCCLS |
1506 CMPA #'T CLEAR TO END OF LINE? |
1507 BEQ ESCCLL |
1508 CMPA #'= STARTING CURSOR SET? |
1509 BNE CLRESC BRANCH IF NOT |
1510 * |
1511 ***************************** START ESCAPE SEQUENCE |
1512 * |
1513 SETESC STAA ESCFLG ELSE START CURSORING |
1514 RTS AND RETURN |
1515 * |
1516 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1517 RETESC RTS SO RETURN |
1518 * |
1519 ********************************* SET SCREEN CURSOR |
1520 * |
1521 ESCCUR TST NEWROW ROW SET? |
1522 BNE ESCCU1 BRANCH IF SO |
1523 STAA NEWROW ELSE SET NEW ROW |
1524 RTS AND RETURN |
1525 * |
1526 ESCCU1 CLR ESCFLG |
1527 SUBA #$20 ADJUST COLUMN ADDRESS |
1528 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1529 BHI RETESC NOT OK, DO NOTHING |
1530 * |
1531 ESCCU2 LDAB NEWROW |
1532 CLR NEWROW |
1533 SUBB #$20 ADJUST TO ROW ADDRESS |
1534 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1535 BHI RETESC ELSE RETURN DOING NOTHING |
1536 BRA NEWCUR GO SET NEW CURSOR IF SO |
1537 * |
1538 ****************** CLEAR FROM CURSOR TO END OF LINE |
1539 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN |
1540 BSR NEWCUR |
1541 ESCCLL LDA COLADX |
1542 LDB #$20 AND CLEAR CHAR |
1543 ESCCL1 STB VDUCHR,X DISPLAY TEXT |
1544 INCA |
1545 STA VDUCOL,X |
1546 CMPA #LINLEN UNTIL END OF LINE |
1547 BNE ESCCL1 |
1548 CLR ESCFLG |
1549 RTS |
1550 * |
1551 *********************************** CARRIAGE RETURN |
1552 * |
1553 CRETN CLRA SET COLUMN ZERO |
1554 POSCOL LDB ROWADX GET CURRENT ROW |
1555 * |
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1557 * |
1558 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1559 STA VDUCOL,X SET NEW COLUMN |
1560 STB VDUROW,X SET NEW ROW |
1561 RTS AND RETURN |
1562 * |
1563 ********************* UPDATE CURRENT COLUMN AND ROW |
1564 * |
1565 NEWCOL LDD COLADX GET ROW AND COLUMN |
1566 INCA BUMP COLUMN |
1567 CMPA #LINLEN ROLL? |
1568 BNE NEWCUR BRANCH IF NOT |
1569 CLRA ELSE RESET TO ZERO |
1570 INCB AND BUMP ROW |
1571 CMPB #NUMLIN |
1572 BNE NEWCUR |
1573 DECB BOTTOM ROW |
1574 BSR NEWCUR |
1575 * |
1576 ********************************* SCROLL THE SCREEN |
1577 * |
1578 SCROLL LDB VDUOFF,X |
1579 INCB |
1580 CMPB #NUMLIN |
1581 BLO SCROL1 |
1582 CLRB |
1583 SCROL1 STB VDUOFF,X |
1584 * |
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1586 * |
1587 ESCCLS LDB COLADX GET CURSOR |
1588 LDA #$20 GET A SPACE |
1589 ESCCLS1 STB COLADX |
1590 STB VDUCOL,X |
1591 STA VDUCHR,X |
1592 INCB |
1593 CMPB #LINLEN |
1594 BNE ESCCLS1 |
1595 * |
1596 LDB ROWADX |
1597 INCB |
1598 CMPB #NUMLIN |
1599 BEQ ESCCLS2 |
1600 STB ROWADX |
1601 STB VDUROW,X |
1602 CLRB |
1603 BRA ESCCLS1 |
1604 * |
1605 ESCCLS2 CLRB |
1606 STB COLADX |
1607 STB VDUCOL,X |
1608 STB ESCFLG |
1609 RTS |
1610 ENDIF VDUOPT |
1610 ENDIF VDUOPT |
1611 * |
1612 IFD DG640OPT |
1613 *************************************************** |
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * |
1615 * * |
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * |
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * |
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * |
1619 * 16x64 BOARD). * |
1620 *************************************************** |
1621 |
1622 *************************************************** |
1623 * INITIALIZE EMULATOR * |
1624 *************************************************** |
1625 |
1626 VINIZ LDX #0 |
1627 STX COLADX AND ROWADX |
1628 STX NEWROW AND ESCFLG |
1629 LDX #SCREEN POINT TO SCREEN |
1630 STX CURSOR SET PROGRAM CURSOR |
1631 LDA #$1B SEND ESCAPE |
1632 BSR VOUTCH |
1633 LDA #'Y CLEAR TO END OF SCREEN |
1634 * |
1635 ** VIDEO OUTPUT ROUTINE |
1636 * |
1637 VOUTCH PSHS A,B,X SAVE REGISTERS |
1638 * |
1639 ** CLEAR CURSOR |
1640 LDX CURSOR |
1641 LDB 0,X |
1642 ANDB #$7F |
1643 STB 0,X |
1644 * |
1645 ** CHECK FOR ESCAPE SEQUENCE |
1646 TST ESCFLG ESCAPE ACTIVE? |
1647 BEQ SOROU1 BRANCH IF NOT |
1648 BSR ESCAPE ELSE DO ESCAPE |
1649 BRA RETURN AND RETURN |
1650 * |
1651 ** CHECK FOR CONTROL CHARACTERS |
1652 SOROU1 CMPA #$20 CONTROL CODES? |
1653 BHS SOROU2 |
1654 BSR CONTRL BRANCH IF SO |
1655 BRA RETURN |
1656 * |
1657 ** OUTPUT TEXT CHARACTER |
1658 SOROU2 LDX CURSOR ELSE GET CURSOR |
1659 STAA 0,X DISPLAY CHARACTER |
1660 LBSR NEWCOL UPDATE COLUMN |
1661 * |
1662 ** DISPLAY CURSOR AND RETURN |
1663 RETURN LDX CURSOR AND DISPLAY IT |
1664 LDB ,X |
1665 ORAB #$80 WITH REVID |
1666 STB ,X |
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1668 |
1669 *************************************************** |
1670 * CONTROL CODE HANDLERS * |
1671 *************************************************** |
1672 |
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1674 LBEQ BACKSP |
1675 CMPA #$1B ESCAPE SEQUENCE? |
1676 LBEQ SETESC |
1677 CMPA #$D CTRL M - RETURN? |
1678 LBEQ CRETN |
1679 CMPA #$0A CTRL J - LINE FEED |
1680 BNE RETESC NONE OF THESE, RETURN |
1681 |
1682 ***************************************** LINE FEED |
1683 |
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1685 INCB BUMP ROW |
1686 CMPB #NUMLIN SCROLL TIME? |
1687 LBNE NEWCUR POSITION CURSOR IF NOT |
1688 LBRA SCROLL ELSE SCROLL IT |
1689 |
1690 ***************************************** LINE FEED |
1691 |
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1693 TSTB AT TOP OF SCREEN ? |
1694 BEQ RETESC Yes, Ignore |
1695 DECB No, Decrement ROW |
1696 LBRA NEWCUR POSITION CURSOR |
1697 |
1698 |
1699 *********************************** BACK SPACE |
1700 |
1701 BACKSP LDA COLADX |
1702 BEQ RETESC RETURN |
1703 DECA |
1704 LBRA POSCOL POSITION CURSOR |
1705 |
1706 *********************************** CURSOR RIGHT |
1707 |
1708 CHRIGHT LDA COLADX |
1709 INCA |
1710 CMPA #LINLEN |
1711 BEQ RETESC |
1712 LBRA POSCOL |
1713 |
1714 *************************************************** |
1715 * ESCAPE HANDLERS * |
1716 *************************************************** |
1717 |
1718 ESCAPE LDAB ESCFLG GET FLAG |
1719 CMPB #'= SETTING CURSOR? |
1720 BEQ ESCCUR BRANCH IF SO |
1721 CMPA #'Y CLEAR TO END OF SCREEN? |
1722 LBEQ ESCCLS |
1723 CMPA #'T CLEAR TO END OF LINE? |
1724 BEQ ESCCLL |
1725 CMPA #'E INSERT LINE? |
1726 BEQ ESCINL |
1727 CMPA #'R DELETE LINE? |
1728 BEQ ESCDLL |
1729 CMPA #'= STARTING CURSOR SET? |
1730 BNE CLRESC BRANCH IF NOT |
1731 |
1732 ***************************** START ESCAPE SEQUENCE |
1733 |
1734 SETESC STAA ESCFLG ELSE START CURSORING |
1735 RTS AND RETURN |
1736 |
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1738 RETESC RTS SO RETURN |
1739 |
1740 ********************************* SET SCREEN CURSOR |
1741 |
1742 ESCCUR TST NEWROW ROW SET? |
1743 BNE ESCCU1 BRANCH IF SO |
1744 STAA NEWROW ELSE SET NEW ROW |
1745 RTS AND RETURN |
1746 |
1747 ESCCU1 CLR ESCFLG |
1748 SUBA #$20 ADJUST COLUMN ADDRESS |
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1750 BHI RETESC NOT OK, DO NOTHING |
1751 |
1752 ESCCU2 LDAB NEWROW |
1753 CLR NEWROW |
1754 SUBB #$20 ADJUST TO ROW ADDRESS |
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1756 BHI RETESC ELSE RETURN DOING NOTHING |
1757 BRA NEWCUR GO SET NEW CURSOR IF SO |
1758 * |
1759 *************************** DELETE LINE FROM SCREEN |
1760 |
1761 ESCDLL BSR CRETN GO COL. ZERO |
1762 LDB ROWADX |
1763 CMPB #NUMLIN-1 |
1764 BEQ SCROL3 |
1765 BRA SCROL1 AND DELETE THIS LINE |
1766 |
1767 *************************** INSERT LINE INTO SCREEN |
1768 |
1769 ESCINL BSR CRETN GO TO COL. ZERO |
1770 LDAB ROWADX |
1771 CMPB #NUMLIN-1 |
1772 BEQ ESCCLL |
1773 * |
1774 ** SCROLL SCREEN DOWN FROM CURSOR |
1775 * |
1776 LDX #SCREEN+SCNLEN-LINLEN |
1777 ESCIN0 LDAA 0,-X |
1778 STAA LINLEN,X |
1779 LDA SCNLEN,X |
1780 STA SCNLEN+LINLEN,X |
1781 CPX CURSOR |
1782 BNE ESCIN0 |
1783 |
1784 ****************** CLEAR FROM CURSOR TO END OF LINE |
1785 |
1786 ESCCLL LDA COLADX GET CURRENT COLUMN |
1787 LDX CURSOR GET CURSOR |
1788 LDB #$20 AND CLEAR CHAR |
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE |
1790 STB ,X+ CLEAR TEXT |
1791 INCA |
1792 CMPA #LINLEN UNTIL END OF LINE |
1793 BNE ESCLL1 |
1794 CLR ESCFLG |
1795 RTS |
1796 |
1797 *********************************** CARRIAGE RETURN |
1798 |
1799 CRETN CLRA SET COLUMN ZERO |
1800 POSCOL LDB ROWADX GET CURRENT ROW |
1801 |
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1803 |
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1805 LDA #LINLEN ELSE ADD A LINE |
1806 MUL LINLEN * ROWADX |
1807 ADDB COLADX |
1808 ADCA #0 |
1809 ADDD #SCREEN ADD SCREEN BASE. |
1810 STD CURSOR SAVE NEW CURSOR |
1811 TFR D,X GET CURSOR IN X |
1812 RTS AND RETURN |
1813 |
1814 ********************* UPDATE CURRENT COLUMN AND ROW |
1815 |
1816 NEWCOL LDD COLADX GET ROW AND COLUMN |
1817 INCA BUMP COLUMN |
1818 CMPA #LINLEN ROLL? |
1819 BNE NEWCUR BRANCH IF NOT |
1820 CLRA ELSE RESET TO ZERO |
1821 INCB AND BUMP ROW |
1822 CMPB #NUMLIN |
1823 BNE NEWCUR |
1824 DECB BOTTOM ROW |
1825 BSR NEWCUR |
1826 |
1827 ********************************* SCROLL THE SCREEN |
1828 |
1829 SCROLL LDX #SCREEN POINT TO SCREEN |
1830 SCROL1 LDA SCNLEN+LINLEN,X |
1831 STA SCNLEN,X |
1832 LDAA LINLEN,X MOVE TWO BYTES |
1833 STAA 0,X+ UP ONE LINE |
1834 CMPX #SCREEN+SCNLEN-LINLEN |
1835 BNE SCROL1 LOOP UNTIL DONE |
1836 BRA SCROL3 |
1837 |
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1839 |
1840 ESCCLS LDX CURSOR GET CURSOR |
1841 SCROL3 LDAA #$20 GET A SPACE |
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES |
1843 STA ,X+ AND TEXT |
1844 CMPX #SCREEN+SCNLEN |
1845 BNE SCROL2 UNTIL DONE |
1846 CLR ESCFLG |
1847 RTS |
1848 ENDIF DG640OPT |
1848 ENDIF DG640OPT |
1849 * |
1850 IFD PRTOPT |
1851 ************************************* |
1852 * |
1853 ** PRINTER DRIVER ROUTINES |
1854 * |
1855 ************************************* |
1856 * |
1857 ** PINIZ - INITIATE PRINTER PORT |
1858 * |
1859 PINIZ PSHS B |
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 |
1861 STD PADATA SET DDR AND SELECT DATA |
1862 * |
1863 ** RESET PRINTER |
1864 LDB #PRESET |
1865 STAB PADATA |
1866 RESTLP INCB DELAY FOR RESET |
1867 BNE RESTLP |
1868 STAA PADATA ACCA=DIRMSK |
1869 * |
1870 ** INITALIZE PORT B (DATA PORT) |
1871 LDAA #$2A |
1872 STAA PBCTRL |
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110 |
1874 STD PBDATA PBDREG PBCTRL |
1875 * |
1876 ** SELECT 66 LINES/PAGE |
1877 LDAA #$1B |
1878 BSR POUTCH |
1879 LDAA #'C |
1880 BSR POUTCH |
1881 LDAA #66 |
1882 PULS B |
1883 ************************************* |
1884 * |
1885 ** OUTPUT A CHARACTER TO THE PRINTER |
1886 * |
1887 ************************************* |
1888 POUTCH PSHS B |
1889 LDAB PBDATA CLEAR INTERRUPT BIT |
1890 * |
1891 ** WAIT TILL NOT BUSY |
1892 BUSYLP LDAB PADATA |
1893 BITB #PERROR |
1894 BEQ PEXIT |
1895 TSTB |
1896 BMI BUSYLP |
1897 * |
1898 ** NOW OUTPUT CHARACTER |
1899 STAA PBDATA |
1900 PEXIT PULS B,PC |
1901 ************************************* |
1902 * |
1903 ** PCHK TEST IFD PRINTER READY |
1904 * |
1905 ************************************* |
1906 PCHK TST PBCTRL TEST STATE OF CRB7 |
1907 RTS SET ON ACKNOWLEDGE |
1908 ENDIF PRTOPT |
1908 ENDIF PRTOPT |
1909 ************************************* |
1910 * |
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE |
1912 * |
1913 ************************************* |
1914 * |
1915 FD66 JMPTAB EQU * |
1916 FD66 01 FCB 1 " ^A " |
1917 FD67 FB FC FDB ALTRA |
1918 FD69 02 FCB 2 " ^B " |
1919 FD6A FB F1 FDB ALTRB |
1920 FD6C 03 FCB 3 " ^C " |
1921 FD6D FC 07 FDB ALTRCC |
1922 FD6F 04 FCB 4 " ^D " |
1923 FD70 FB E6 FDB ALTRDP |
1924 FD72 10 FCB $10 " ^P " |
1925 FD73 FB B9 FDB ALTRPC |
1926 FD75 15 FCB $15 " ^U " |
1927 FD76 FB C5 FDB ALTRU |
1928 FD78 18 FCB $18 " ^X " |
1929 FD79 FB DB FDB ALTRX |
1930 FD7B 19 FCB $19 " ^Y " |
1931 FD7C FB D0 FDB ALTRY |
1932 * |
1933 FD7E 42 FCC 'B' |
1934 FD7F F9 5C FDB BRKPNT |
1935 FD81 45 FCC 'E' |
1936 FD82 F8 FD FDB MEMDUMP |
1937 FD84 47 FCC 'G' |
1938 FD85 F8 A5 FDB GO |
1939 FD87 4C FCC 'L' |
1940 FD88 FA E6 FDB LOAD |
1941 FD8A 50 FCC 'P' |
1942 FD8B FB 44 FDB PUNCH |
1943 FD8D 4D FCC 'M' |
1944 FD8E F8 A8 FDB MEMCHG |
1945 FD90 52 FCC 'R' |
1946 FD91 FC 75 FDB REGSTR |
1947 FD93 53 FCC 'S' |
1948 FD94 F8 F1 FDB DISSTK |
1949 FD96 58 FCC 'X' |
1950 FD97 F9 88 FDB XBKPNT |
1951 IFD MFDCOPT |
1952 FD99 44 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT |
1953 FD9A F9 D5 FDB MINBOOT |
1954 ENDIF MFDCOPT |
1955 IFD CF8OPT |
1956 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT |
1957 FDB CFBOOT |
1958 ENDIF CF8OPT |
1958 ENDIF CF8OPT |
1959 IFD IDEOPT |
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT |
1961 FDB IDEBOOT |
1962 ENDIF IDEOPT |
1962 ENDIF IDEOPT |
1963 IFD DMAFOPT |
1964 FD9C 55 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT |
1965 FD9D FA 29 FDB DBOOT |
1966 ENDIF DMAFOPT |
1967 IFD EXTOPT |
1968 FCC 'U' *** IF FPGA, 'U' IS FOR USER |
1969 FDB USRCMD |
1970 ENDIF EXTOPT |
1970 ENDIF EXTOPT |
1971 IFD RTCOPT |
1972 FCC 'T' |
1973 FDB TIMSET |
1974 ENDIF RTCOPT |
1974 ENDIF RTCOPT |
1975 IFD TRAOPT |
1976 FCC "T" |
1977 FDB TRACE |
1978 ENDIF TRAOPT |
1978 ENDIF TRAOPT |
1979 * |
1980 FD9F TABEND EQU * |
1981 * |
1982 * ** 6809 VECTOR ADDRESSES ** |
1983 * |
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES |
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY |
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE |
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO |
1988 * HIS OWN ROUTINES IF HE SO DESIRES. |
1989 * |
1990 * |
1991 FD9F F9 94 RAMVEC FDB SWIE USER-V |
1992 FDA1 F8 A7 FDB RTI SWI3-V |
1993 FDA3 F8 A7 FDB RTI SWI2-V |
1994 FDA5 F8 A7 FDB RTI FIRQ-V |
1995 FDA7 F8 A7 FDB RTI IRQ-V |
1996 FDA9 F9 94 FDB SWIE SWI-V |
1997 FDAB FF FF FDB $FFFF SVC-VO |
1998 FDAD FF FF FDB $FFFF SVC-VL |
1999 * |
2000 * PRINTABLE MESSAGE STRINGS |
2001 * |
2002 FDAF 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
2003 FDB4 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR ' |
55 47 20 31 2E 34 |
20 46 4F 52 20 |
2004 IFD S3EOPT |
2005 FCC 'S3E ' |
2006 ENDIF S3EOPT |
2006 ENDIF S3EOPT |
2007 IFD B5XOPT |
2008 FCC 'B5-X300 ' |
2009 ENDIF B5XOPT |
2009 ENDIF B5XOPT |
2010 IFD S3SOPT |
2011 FCC 'S3STARTER ' |
2012 ENDIF S3SOPT |
2012 ENDIF S3SOPT |
2013 IFD ADSOPT |
2014 FCC 'ADS6809 ' |
2015 ENDIF ADSOPT |
2015 ENDIF ADSOPT |
2016 IFD SWTOPT` |
2017 FDC5 53 57 54 50 43 20 FCC 'SWTPC ' |
2018 ENDIF SWTOPT |
2019 IFD XESOPT` |
2020 FCC 'XESS ' |
2021 ENDIF XESOPT |
2021 ENDIF XESOPT |
2022 FDCB 20 2D 20 FCC ' - ' |
2023 FDCE 04 FCB 4 |
2024 FDCF 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS |
04 |
2025 FDD6 3E MSG3 FCC '>' |
2026 FDD7 04 FCB 4 |
2027 FDD8 57 48 41 54 3F MSG4 FCC 'WHAT?' |
2028 FDDD 04 FCB 4 |
2029 FDDE 20 2D 20 MSG5 FCC ' - ' |
2030 FDE1 04 FCB 4' |
2031 FDE2 20 20 53 50 3D MSG10 FCC ' SP=' |
2032 FDE7 04 FCB 4 |
2033 FDE8 20 20 50 43 3D MSG11 FCC ' PC=' |
2034 FDED 04 FCB 4 |
2035 FDEE 20 20 55 53 3D MSG12 FCC ' US=' |
2036 FDF3 04 FCB 4 |
2037 FDF4 20 20 49 59 3D MSG13 FCC ' IY=' |
2038 FDF9 04 FCB 4 |
2039 FDFA 20 20 49 58 3D MSG14 FCC ' IX=' |
2040 FDFF 04 FCB 4 |
2041 FE00 20 20 44 50 3D MSG15 FCC ' DP=' |
2042 FE05 04 FCB 4 |
2043 FE06 20 20 41 3D MSG16 FCC ' A=' |
2044 FE0A 04 FCB 4 |
2045 FE0B 20 20 42 3D MSG17 FCC ' B=' |
2046 FE0F 04 FCB 4 |
2047 FE10 20 20 43 43 3A 20 MSG18 FCC ' CC: ' |
2048 FE16 04 FCB 4 |
2049 FE17 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' |
56 43 |
2050 FE1F 53 31 MSG20 FCC 'S1' |
2051 FE21 04 FCB 4 |
2052 IFD DATOPT |
2053 * |
2054 * POWER UP/ RESET/ NMI ENTRY POINT |
2055 * |
2056 FF00 ORG $FF00 |
2057 * |
2058 * |
2059 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11 |
2060 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO |
2061 * |
2062 * |
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F |
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS |
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE |
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA |
2067 * STORED IN IT. |
2068 * |
2069 * |
2070 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION |
2071 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION |
2072 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ? |
2073 * |
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER |
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL |
2076 * PHYSICAL ADDRESSES. |
2077 * |
2078 FF0A 86 F0 LDA #$F0 |
2079 FF0C A7 84 STA ,X STORE $F0 AT $FFFF |
2080 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF |
2081 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" |
2082 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION |
2083 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0 |
2084 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ? |
2085 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP |
2086 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER |
2087 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? |
2088 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM |
2089 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN |
2090 * |
2091 * |
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF |
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX |
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED |
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT |
2096 * IS STORED IN RAM IN THE LOCATION THAT IS |
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, |
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND |
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE |
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE |
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE |
2102 * "7" IN THE $70A0 WILL BE STORED IN |
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS |
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND |
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE |
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE |
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- |
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT |
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE |
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK |
2111 * OF RAM RESPONDS. |
2112 * |
2113 * |
2114 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION |
2115 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2116 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS |
2117 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN |
2118 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING |
2119 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS |
2120 FF32 44 LSRA TRANSLATION RAM. |
2121 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D" |
2122 * |
2123 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER |
2124 * |
2125 * |
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES |
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK |
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS |
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION |
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF |
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO |
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... |
2133 * |
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- |
2136 * |
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE |
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... |
2139 * |
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 |
2142 * |
2143 * |
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF |
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL |
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK |
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT |
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 |
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 |
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE |
2151 * MEMORY ADDRESSED AS FOLLOWS.... |
2152 * |
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- |
2155 * |
2156 * |
2157 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2158 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD |
2159 FF40 6F 2E CLR 14,Y CLEAR $DFDE |
2160 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? |
2161 FF44 A7 2F STA 15,Y STORE AT $DFDF |
2162 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR |
2163 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 |
2164 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR |
2165 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING |
2166 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM |
2167 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO |
2168 FF54 27 22 BEQ FINTAB SKIP IF FINISHED |
2169 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION |
2170 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. |
2171 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC. |
2172 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION |
2173 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER |
2174 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION |
2175 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2176 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2177 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 |
2178 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM. |
2179 FF6E 44 LSRA |
2180 FF6F 44 LSRA |
2181 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE |
2182 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK |
2183 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE |
2184 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK |
2185 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? |
2186 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE |
2187 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE |
2188 * |
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF |
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES |
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT |
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---. |
2193 * |
2194 * |
2195 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C" |
2196 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE |
2197 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. |
2198 FF86 4A DECA ELSE POINT 4K LOWER |
2199 FF87 2A F9 BPL FINDC GO TRY AGAIN |
2200 FF89 20 14 BRA XFERTF |
2201 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND |
2202 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- |
2203 * |
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION |
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL |
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL |
2207 * ADDRESSES FROM $0000 AND UP.... |
2208 * |
2209 FF8F 4F CLRA START AT ZERO |
2210 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. |
2211 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE |
2212 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP |
2213 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE |
2214 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP |
2215 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY |
2216 FF9B 81 0C CMPA #$0C LAST ENTRY YET ? |
2217 FF9D 2D F3 BLT COMPRS |
2218 * |
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION |
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON |
2221 * THE MP-09 CPU CARD. |
2222 * |
2223 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11 |
2224 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE |
2225 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT |
2226 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11 |
2227 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE |
2228 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED |
2229 * |
2230 ELSE |
2231 LRA RTS |
2232 START LDS #STACK INITIALIZE STACK POINTER |
2233 CLRB |
2234 ENDIF DATOPT |
2234 ENDIF DATOPT |
2235 * |
2236 FFAB 53 COMB SET "B" NON-ZERO |
2237 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG |
2238 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE |
2239 * |
2240 ** INTERRUPT JUMP VECTORS |
2241 * |
2242 FFB2 6E 9F DF C0 V1 JMP [STACK] |
2243 FFB6 6E 9F DF C4 V2 JMP [SWI2] |
2244 FFBA 6E 9F DF C6 V3 JMP [FIRQ] |
2245 FFBE 6E 9F DF C8 V4 JMP [IRQ] |
2246 FFC2 6E 9F DF CA V5 JMP [SWI] |
2247 * |
2248 * SWI3 ENTRY POINT |
2249 * |
2250 FFC6 1F 43 SWI3E TFR S,U |
2251 FFC8 AE 4A LDX 10,U *$FFC8 |
2252 FFCA E6 80 LDB ,X+ |
2253 FFCC AF 4A STX 10,U |
2254 FFCE 4F CLRA |
2255 FFCF 58 ASLB |
2256 FFD0 49 ROLA |
2257 FFD1 BE DF CC LDX SVCVO |
2258 FFD4 8C FF FF CMPX #$FFFF |
2259 FFD7 27 0F BEQ SWI3Z |
2260 FFD9 30 8B LEAX D,X |
2261 FFDB BC DF CE CMPX SVCVL |
2262 FFDE 22 08 BHI SWI3Z |
2263 FFE0 34 10 PSHS X |
2264 FFE2 EC C4 LDD ,U |
2265 FFE4 AE 44 LDX 4,U |
2266 FFE6 6E F1 JMP [,S++] |
2267 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP |
2268 FFEA EE 42 LDU 2,U |
2269 FFEC 6E 9F DF C2 JMP [SWI3] |
2270 * |
2271 * 6809 VECTORS |
2272 * |
2273 FFF0 ORG $FFF0 |
2274 FFF0 FF B2 FDB V1 USER-V |
2275 FFF2 FF C6 FDB SWI3E SWI3-V |
2276 FFF4 FF B6 FDB V2 SWI2-V |
2277 FFF6 FF BA FDB V3 FIRQ-V |
2278 FFF8 FF BE FDB V4 IRQ-V |
2279 FFFA FF C2 FDB V5 SWI-V |
2280 FFFC FF B2 FDB V1 NMI-V |
2281 FFFE FF 00 FDB START RESTART-V |
0004 END START |
0005 END |
Program + Init Data = 1826 bytes |
Error count = 0 |
/sys09ads.sh
0,0 → 1,2
../../Tools/as09/as09.exe sys09ads.txt -l > sys09ads.lst |
|
/sys09b5x_b4_0.vhd
0,0 → 1,16
INIT_00 => x"A780A610C6C0DF8E106DFE8E2EFA1AFB1EFB8FFBCAFCB5FC97FC9DFC61F814F8", |
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC65B0117E0DFBF00E08EF9265AA0", |
INIT_02 => x"03179FFE8E0C0417F62A5A19048B0327856D0DC64FD0DF8E4703177DFE8E9B04", |
INIT_03 => x"17408B981F4F04175E86092C2081891FF1270D817F84330417B30217A6FE8E2E", |
INIT_04 => x"20F00217A8FE8EF5266DFE8C02300F2780E137FE8E20C0022F60C14304174804", |
INIT_05 => x"17A4A60B0417A50317211F650217AEFE8E121F2D296B03173B341FBC2094ADC0", |
INIT_06 => x"27A4A1A4A7390F260D8117275E81DD271881E127088111285E0317030417A503", |
INIT_07 => x"0B031705201F30C0DF8E321FA20217BE203F31C2202131E103173F86E4031708", |
INIT_08 => x"279603170527E4AC011FF0C4201F0634F0C41000C3101F390124E1AC20340629", |
INIT_09 => x"265A8A03172C031780A610C69203172E0317E4AEEE0117AEFE8E103439623203", |
INIT_0a => x"29B70217BC20EE265A7303172E8602237E810425208180A610C6E1AE820317F5", |
INIT_0b => x"3984A73F86A4AFA0A709273F8184A60F271035558DFFFF8E10341A24C0DF8C1E", |
INIT_0c => x"4AAF0427268D1F304AAE431F39FB265A188D08C6E3DF8E104203163F86450317", |
INIT_0d => x"A7A0A7A0A7FF8684A7A4A604263F8184A60A24C0DF8C21AEB9FE16480217068D", |
INIT_0e => x"0186398D46E0B7E086408D393D3139F7265A0427A1ACA0A608C6E3DF8E1039A0", |
INIT_0f => x"178D47E0B7208645E0B744E0B743E0B74F42E0B701862D8D47E0B7EF8641E0B7" |
/opt_s3e.txt
0,0 → 1,18
* |
*************************************************** |
* OPTION SWITCHES |
*************************************************** |
* |
* |
** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
** FOR LOADING AND SAVING S1 RECORDS |
* |
S3EOPT EQU $FF SPARTAN3E STARTER |
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
* |
END |
/sys09b5x_b4_1.vhd
0,0 → 1,16
INIT_00 => x"E0B6F926808547E0B63B341F4AAF00C08EF42600C28C80A740E0B6218D00C08E", |
INIT_01 => x"54545454A6E6D0DF8E104444444462A6363439F927088547E0B639F227408547", |
INIT_02 => x"FCBD8435FD265A20C60434B63562E762EA62A70F8462A65858585853A6E6E4E7", |
INIT_03 => x"0234A80117F12631813D2739811F0217F9265381260217E2DF7F6402171186DF", |
INIT_04 => x"E0EB02340C2904358E01170434E46AE46AE4EBE0EBE0E6103421299101172629", |
INIT_05 => x"0117E26F0E02161386E2DF731602173F86BA27FFC102355FEB2080A70527E46A", |
INIT_06 => x"2320008310062762A3E4ECF501171286DFFCBDE4AF0130492562AC4D2930344A", |
INIT_07 => x"1780A684EB63EB62EB68011762AE750117981F03CB2F0017EFFE8E64E720C602", |
INIT_08 => x"10347120028D396532B301171486C326E4AC62AF5B0117981F53F526646A6501", |
INIT_09 => x"8D618D394AAF0229F68DF28D910017E50016F800169D01169035690017A0FE8E", |
INIT_0a => x"498D3944AF0229D58DD18D5E8D3946AF0229E08DDC8D728D3948AF0229EB8DE7", |
INIT_0b => x"8D3941A70229B18DB08D588D3942A70229BC8DBB8D6C8D3943A70229C78DC68D", |
INIT_0c => x"BF0016311FF48DB2FE8E39F726048180A63B011739C4A7808A0429A68DA58D5F", |
INIT_0d => x"8DC4FE8EE12044AED78DCAFE8EB4001643A6E18DD0FE8EF42048AEEA8DBEFE8E", |
INIT_0e => x"D02042A6B38DDBFE8ED92041A6BC8DD6FE8ECF204AAEC58DB8FE8ED82046AECE", |
INIT_0f => x"AEFE8EBF8DB88DB08DA98DA18D27FF17AEFE8E900016E7FE8EC4A6AA8DE0FE8E" |
/SYS09S3S.S19
0,0 → 1,66
S123F800F814F861FCA1FC9BFCB9FCCEFB8FFB1EFB1AFA2E8EFE74108EDFC0C610A680A70C |
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2 |
S123F840049F8EFE841703478EDFD04FC60D6D8527038B04195A2AF617040C8EFEA817037E |
S123F8602E8EFEAF1702B3170437847F810D27F11F8981202C09865E1704531F988B4017EB |
S123F880044C170447C1602F02C0208EFE3BE180270F30028CFE7426F58EFEB11702F02071 |
S123F8A0C0AD9420BC1F343B17036B292D1F128EFEB71702651F211703A517040FA6A41782 |
S123F8C003A517040717035E2811810827E1811827DD815E2717810D260F39A7A4A1A427AB |
S123F8E0081703E8863F1703E5312120C2313F20BE1702A21F328EDFC0301F200517030BE2 |
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE4270517039A27DB |
S123F9200332623934108EFEB71701EEAEE417032E170396C610A68017032C17038E5A2672 |
S123F940F5170386AEE1C610A68081202504817E2302862E1703775A26EE20BC1702B7290D |
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2 |
S123F980170349863F160346108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4AD5 |
S123F9A08D0617024816FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A717 |
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D398D4086E0B7E0468D398601AA |
S123F9E0B7E04186EFB7E0478D2D8601B7E0424FB7E043B7E044B7E0458620B7E0478D17B6 |
S123FA008EC0008D21B6E040A7808CC20026F48EC000AF4A1F343BB6E047858026F9B6E015 |
S123FA2047854027F239B6E047850827F9393436A66244444444108EDFD0E6A654545454F6 |
S123FA40E7E4E6A65358585858A662840FA762EA62E76235B63404C6205A26FD3584BDFC67 |
S123FA60E386111702687FDFE217022A815326F91702238139273D813126F11701A83402F8 |
S123FA80292617019129213410E6E0EBE0EBE46AE46AE4340417018E3504290C3402EBE093 |
S123FAA06AE42705A78020EB5F3502C1FF27BA863F17021A73DFE286131602126FE2170107 |
S123FAC04A3430294DAC6225493001AFE4BDFCE386121701F9ECE4A36227061083002023A1 |
S123FAE002C620E7648EFEF817002FCB031F98170175AE62170168EB62EB63EB84A680171C |
S123FB0001656A6426F5531F9817015BAF62ACE426C386141701B73265398D0220713410EE |
S123FB208EFEA917006935901601A11600F81600E51700918DF28DF62902AF4A398D618D04 |
S123FB40E78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18DD52902AF44398D49E1 |
S123FB608DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB08DB12902A741398D7C |
S123FB805F8DA58DA629048A80A7C43917013FA680810426F7398EFEBB8DF41F311600BF7D |
S123FBA08EFEC78DEAAE4820F48EFED98DE1A6431600B48EFED38DD7AE4420E18EFECD8D4B |
S123FBC0CEAE4620D88EFEC18DC5AE4A20CF8EFEDF8DBCA64120D98EFEE48DB3A64220D0C5 |
S123FBE08EFEE98DAAA6C48EFEF01600908EFEB717FF278DA18DA98DB08DB88DBF8EFEB7D4 |
S123FC0017FF178DC08DC78DCE20D58D09294D1F12862D1700B88D0E29421F018D08293CE3 |
S123FC203410A76135908D112932484848481F898D0729283404ABE0398D5B8130251D81B1 |
S123FC40392203803039814125128146220380373981612507816622038057391A023934D1 |
S123FC601035028D0235023402444444448D043502840F8B3081392F028B0720513402C62D |
S123FC8008A68068E42502862D8D438D3F5A26F135826E9FF0007DDFE227068D04847F202C |
S123FCA02D3410BEDFE0A684850126098EE020A684850127EEA60135903402A69FDFE085F5 |
S123FCC0012605B6E020850135828D0086208D453412BEDFE0A684850227FA3502A7013553 |
S123FCE0908D13BEDFE08603A7848611A7846D0186FFB7DFE2398EE030CC0000FDDFFBA751 |
S123FD0002E703E704FDDFFDC602E7017FDFFE861B8D02865934168EE0307DDFFE27048D1A |
S123FD2074200D812024048D092005A7841700C53596810810270041811B1027006C811AED |
S123FD401027008E811610270045810D10270099810C1027002C810B10270011810A2651A3 |
S123FD60FCDFFB5CC11910260083160099FCDFFB5D1027003C5A160074B6DFFB27334A1637 |
S123FD800068B6DFFB4C81501027002516005BCC0000160058F6DFFEC13D27168159102724 |
S123FDA0006E81542731813D2604B7DFFE397FDFFE397DDFFD2604B7DFFD397FDFFE80200F |
S123FDC0814F22EDF6DFFD7FDFFDC020C11822E1201BCC00008D16B6DFFBC620E7844CA7D9 |
S123FDE002815026F77FDFFE394FF6DFFCFDDFFBA702E70339FCDFFB4C815026F04F5CC142 |
S123FE001926EA5A8DE7E6045CC11925015FE704F6DFFB8620F7DFFBE702A7845CC1502669 |
S123FE20F4F6DFFC5CC1192708F7DFFCE7035F20E45FF7DFFBE702F7DFFE3901FB7402FBE2 |
S123FE406903FB7F04FB5E10FB3115FB3D18FB5319FB4842F95C45F8FD47F8A54CFA5E5067 |
S123FE60FABC4DF8A852FBED53F8F158F98844F9D555FC92F994F8A7F8A7F8A7F8A7F99401 |
S123FE80FFFFFFFF0D0A000000535953303942554720312E3420464F52205333535441526B |
S123FEA054455220202D20044B0D0A000000043E04574841543F04202D2004202053503D12 |
S123FEC004202050433D04202055533D04202049593D04202049583D04202044503D042063 |
S11EFEE020413D042020423D04202043433A2004454648494E5A564353310495 |
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6 |
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9 |
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E |
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26 |
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02 |
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC |
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0 |
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294 |
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB |
S9030000FC |
/sys09b5x_b4_2.vhd
0,0 → 1,16
INIT_00 => x"3C29088D011F42290E8DB400172D86121F4D29098DD520CE8DC78DC08D17FF17", |
INIT_01 => x"811D253081578D39E0AB04342829078D891F484848483229118D903561A71034", |
INIT_02 => x"3439021A39578003226681072561813937800322468112254181393080032239", |
INIT_03 => x"C602344D20078B022F3981308B0F840235048D4444444402340235028D023510", |
INIT_04 => x"BE10342D207F84048D0627E2DF7D8235F1265A3B8D3F8D2D860225E46880A608", |
INIT_05 => x"B605260185E0DF9FA60234903501A6EE27018584A620E08E0926018584A6E0DF", |
INIT_06 => x"BE138D903501A70235FA27028584A6E0DFBE1234458D2086008D8235018520E0", |
INIT_07 => x"E703E702A7FBDFFD0000CC30E08E39E2DFB7FF86016D84A7118684A70386E0DF", |
INIT_08 => x"810D20748D0427FEDF7D30E08E16345986028D1B86FEDF7F01E702C6FDDFFD04", |
INIT_09 => x"8E0027101A816C0027101B814100271008819635C5001784A70520098D042420", |
INIT_0a => x"5CFBDFFC51260A81110027100B812C0027100C81990027100D81450027101681", |
INIT_0b => x"DFB66800164A3327FBDFB67400165A3C0027105DFBDFFC9900168300261019C1", |
INIT_0c => x"54816E002710598116273DC1FEDFF65800160000CC5B00162500271050814CFB", |
INIT_0d => x"ED224F812080FEDF7F39FDDFB70426FDDF7D39FEDF7F39FEDFB704263D813127", |
INIT_0e => x"26508102A74C84E720C6FBDFB6168D0000CC1B20E12218C120C0FDDF7FFDDFF6", |
INIT_0f => x"5AEA2619C15C4FF02650814CFBDFFC3903E702A7FBDFFDFCDFF64F39FEDF7FF7" |
/sys09b5x_b4_3.vhd
0,0 → 1,16
INIT_00 => x"FCDFF6F42650C15C84A702E7FBDFF72086FBDFF604E75F012519C15C04E6E78D", |
INIT_01 => x"7FFB0369FB0274FB0139FEDFF702E7FBDFF75FE4205F03E7FCDFF7082719C15C", |
INIT_02 => x"F84DBCFA505EFA4CA5F847FDF8455CF94248FB1953FB183DFB1531FB105EFB04", |
INIT_03 => x"000A0DFFFFFFFF94F9A7F8A7F8A7F8A7F894F9D5F94488F958F1F853EDFB52A8", |
INIT_04 => x"4B04202D2020303033582D354220524F4620342E312047554239305359530000", |
INIT_05 => x"2020043D43502020043D5053202004202D20043F54414857043E040000000A0D", |
INIT_06 => x"043D422020043D412020043D50442020043D58492020043D59492020043D5355", |
INIT_07 => x"000000000000000000000000000004315343565A4E4948464504203A43432020", |
INIT_08 => x"300B2784AC1084AF1084EEAA558E10A0D08E84A7F086FB264A80A70F86F0FF8E", |
INIT_09 => x"2DA7D0DF8E10C0DFCE10FDFFB74444444443101F84EFD620ED26A0F08C00F089", |
INIT_0a => x"1084AF10AA558E1084EE2227A0F08C00F08930FB2A4AA66F0C862FA7F0862E6F", |
INIT_0b => x"2EA7D0DF8E10F186D520A5A70F88891F44444444101FD0DF8E1084EFE92684AC", |
INIT_0c => x"8EF32D0C814C80E7A66F0427A6E6211F4F2CE7A66F1420F92A4A0526A6E60C86", |
INIT_0d => x"9F6EC6DF9F6EC4DF9F6EC0DF9F6E62F816E2DFF753F9265A80A7A0A610C6F0FF", |
INIT_0e => x"0822CEDFBC8B300F27FFFF8CCCDFBE49584F4AAF80E64AAE431FCADF9F6EC8DF", |
INIT_0f => x"00FFB2FFC2FFBEFFBAFFB6FFC6FFB2FFC2DF9F6E42EE1F37F16E44AEC4EC1034" |
/opt_b5x.txt
0,0 → 1,18
* |
*************************************************** |
* OPTION SWITCHES |
*************************************************** |
* |
* |
** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
** FOR LOADING AND SAVING S1 RECORDS |
* |
*S3EOPT EQU $FF SPARTAN3E STARTER |
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
* |
END |
/sys09swt.sh
0,0 → 1,18
../../Tools/as09/as09.exe sys09swt.txt -l > sys09swt.lst |
/opt_xes.txt
0,0 → 1,18
* |
*************************************************** |
* OPTION SWITCHES |
*************************************************** |
* |
* |
** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
** FOR LOADING AND SAVING S1 RECORDS |
* |
*S3EOPT EQU $FF SPARTAN3E STARTER |
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
* |
END |
/sys09bug.txt
0,0 → 1,2282
* NAM SYS09BUG12 SYSTEM09 MONITOR |
OPT l |
PAGE |
* |
* MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL |
* PRODUCTS MP-09 CPU BOARD AS COMMENTED BY.... |
* |
* ALLEN CLARK WALLACE WATSON |
* 2502 REGAL OAKS LANE 4815 EAST 97th AVE. |
* LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617 |
* PH. 813-977-0347 PH. 813-985-1359 |
* |
* MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT |
* 2561 NANTUCKET DR APT. E |
* ATLANTA, GA 30345 |
* PH. 404-320-1043 |
* |
* MODIFIED TO SYS09BUG VER 1.0 |
* FOR: SYSTEM09 FPGA SYSTEM |
* BY: JOHN KENT |
* DATE: 21ST NOVEMBER 2006 |
* REMOVED: DISK BOOTS |
* MEMORY TEST |
* ADDED: ADM3A VDU DRIVER |
* |
* MODIFIED TO SYS09BUG VER 1.1 |
* FOR: SYSTEM09 FPGA SYSTEM |
* BY: JOHN KENT |
* DATE: 7TH JANUARY 2007 |
* ADDED: 'U' USER EXTENTION COMMANDS AT $F000 |
* CONDITIONAL ASSEMBLY OF FLOPPY BOOTS |
* AND REALTIME CLOCK |
* |
* MODIFIED TO SYS09BUG VER 1.2 |
* FOR: SYSTEM09 FPGA SYSTEM |
* BY: JOHN KENT |
* DATE: 21ST MAY 2007 |
* ADDED: COMPACT FLASH BOOT TO FPGA VERSION |
* REMOVED PORT REDIRECTION ON PUNCH & LOAD |
* |
* Modified to SYS09BUG VER 1.3 |
* FOR: SYSTEM09 FPGA SYSTEM |
* BY: JOHN KENT |
* DATE: 8TH JAN 2008 |
* ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD |
* WITH ONLY 32K OF RAM |
* |
* Modified to SYS09BUG VER 1.4 |
* FOR: SYSTEM09 FPGA SYSTEM |
* BY: JOHN KENT |
* DATE: 3RD FEB 2008 |
* ADDED: CONDITIONALS FOR XESS BOARD WITH IDE |
* SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300 |
* 16 BIT IDE DISK BOOT STRAP ROUTINE |
* CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
* |
* *** COMMANDS *** |
* |
* CONTROL A = ALTER THE "A" ACCUMULATOR |
* CONTROL B = ALTER THE "B" ACCUMULATOR |
* CONTROL C = ALTER THE CONDITION CODE REGISTER |
* CONTROL D = ALTER THE DIRECT PAGE REGISTER |
* CONTROL P = ALTER THE PROGRAM COUNTER |
* CONTROL U = ALTER USER STACK POINTER |
* CONTROL X = ALTER "X" INDEX REGISTER |
* CONTROL Y = ALTER "Y" INDEX REGISTER |
* B hhhh = SET BREAKPOINT AT LOCATION $hhhh |
* D = 5.25" MINIFLOPPY BOOT |
* E ssss-eeee = EXAMINE MEMORY |
* FROM STARTING ADDRESS ssss |
* TO ENDING ADDRESS eeee. |
* G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI |
* L = LOAD TAPE |
* M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh |
* P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. |
* R = DISPLAY REGISTER CONTENTS |
* S = DISPLAY STACK FROM ssss TO $DFC0 |
* U = 8" DMAF2 FLOPPY BOOT |
* U = USER EXTENSION COMMANDS AT $F000 |
* X = REMOVE ALL BREAKPOINTS |
* |
* |
*************************************************** |
* SYS09BUG VARIABLE SPACE |
*************************************************** |
* |
ORG MONRAM |
STACK EQU * TOP OF INTERNAL STACK |
NMI RMB 2 USER NMI VECTOR |
SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 |
SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 |
FIRQ RMB 2 FAST INTERRUPT VECTOR |
IRQ RMB 2 INTERRUPT VECTOR |
SWI RMB 2 SOFTWARE INTERRUPT VECTOR |
SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN |
SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT |
IFD DATOPT |
LRARAM RMB 16 LRA ADDRESSES |
ENDIF DATOPT |
CPORT RMB 2 RE-VECTORABLE CONTROL PORT |
ECHO RMB 1 ECHO FLAG |
BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR |
IFD TRAOPT |
NMISAV RMB 2 NMI Jump Vector Backup |
TRACNT RMB 2 Trace Count |
ENDIF TRAOPT |
IFD VDUOPT |
* |
************************************************** |
* VDU8 DISPLAY DRIVER VARIABLES * |
************************************************** |
* |
**** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** |
COLADX RMB 1 CURSOR COLUMN |
ROWADX RMB 1 CURSOR ROW |
************************************************** |
* |
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
ENDIF VDUOPT |
IFD DG640OPT |
* |
*************************************************** |
* DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
*************************************************** |
* |
***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** |
COLADX RMB 1 CURSOR COLUMN |
ROWADX RMB 1 CURSOR ROW |
************************************************* |
CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS |
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
ENDIF DG640OPT |
* |
* |
*************************************************** |
* START OF ROM * |
*************************************************** |
* |
ORG MONROM |
FDB MONITOR |
FDB NEXTCMD |
FDB INCH |
FDB INCHE |
FDB INCHEK |
FDB OUTCH |
FDB PDATA |
FDB PCRLF |
FDB PSTRNG |
FDB LRA |
* |
IFD ADSOPT |
FDB PCHK CHECK FOR PRINTER INPUT |
FDB PINIZ INITIATE PRINTER |
FDB POUTCH OUTPUT CH. TO PRINTER |
FDB VINIZ |
FDB VOUTCH |
FDB ACINIZ |
FDB AOUTCH |
ENDIF ADSOPT |
* |
* MONITOR |
* |
* VECTOR ADDRESS STRING IS..... |
* $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF |
* |
MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING |
LDY #STACK POINT TO RAM VECTOR LOCATION |
LDB #$10 BYTES TO MOVE = 16 |
LOOPA LDA ,X+ GET VECTOR BYTE |
STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF |
DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE |
BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED |
* |
* CONTENTS FROM TO FUNCTION |
* $F8A1 $FE40 $DFC0 USER-V |
* $F8A1 $FE42 $DFC2 SWI3-V |
* $F8A1 $FE44 $DFC4 SWI2-V |
* $F8A1 $FE46 $DFC6 FIRQ-V |
* $F8A1 $FE48 $DFC8 IRQ-V |
* $FAB0 $FE4A $DFCA SWI-V |
* $FFFF $FE4C $DFCC SVC-VO |
* $FFFF $FE4E $DFCE SVC-VL |
* |
LDX #ACIAS |
STX CPORT STORE ADDR. IN RAM |
LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS |
LDB #12 CLEAR 12 BYTES ON STACK |
CLRSTK CLR ,-S |
DECB |
BNE CLRSTK |
LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY |
STX 10,S ON STACK |
LDA #$D0 PRESET CONDITION CODES ON STACK |
STA ,S |
TFR S,U |
LBSR IOINIZ INITIALIZE CONTROL PORT |
LDX #MSG1 POINT TO MONITOR MESSAGE |
LBSR PDATA PRINT MSG |
* |
IFD DATOPT |
LDX #LRARAM POINT TO LRA RAM STORAGE AREA |
CLRA START TOTAL AT ZERO |
LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY |
FNDREL TST B,X TEST FOR RAM AT NEXT LOC. |
BEQ RELPAS IF NO RAM GO TO NEXT LOC. |
ADDA #4 ELSE ADD 4K TO TOTAL |
DAA ADJ. TOTAL FOR DECIMAL |
RELPAS DECB SUB. 1 FROM LOCS. TO TEST |
BPL FNDREL PRINT TOTAL OF RAM |
LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS |
LBSR PDATA PRINT MSG |
ENDIF DATOPT |
* |
IFD TRAOPT |
LBSR TRAINZ |
ENDIF TRAOPT |
* |
***** NEXTCMD ***** |
* |
NEXTCMD LDX #MSG3 POINT TO MSG ">" |
LBSR PSTRNG PRINT MSG |
LBSR INCH GET ONE CHAR. FROM TERMINAL |
ANDA #$7F STRIP PARITY FROM CHAR. |
CMPA #$0D IS IT CARRIAGE RETURN ? |
BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. |
TFR A,B PUT CHAR. IN "B" ACCUM. |
CMPA #$20 IS IT CONTROL OR DATA CHAR ? |
BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT |
LDA #'^ ELSE CNTRL CHAR CMD SO... |
LBSR OUTCH PRINT "^" |
TFR B,A RECALL CNTRL CMD CHAR |
ADDA #$40 CONVERT IT TO ASCII LETTER |
PRTCMD LBSR OUTCH PRNT CMD CHAR |
LBSR OUT1S PRNT SPACE |
CMPB #$60 |
BLE NXTCH0 |
SUBB #$20 |
* |
***** DO TABLE LOOKUP ***** |
* FOR COMMAND FUNCTIONS |
* |
NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE |
NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
BEQ JMPCMD BRANCH IF MATCH FOUND |
LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
CMPX #TABEND REACHED END OF TABLE YET ? |
BNE NXTCHR IF NOT END, CHECK NEXT ENTRY |
LDX #MSG4 POINT TO MSG "WHAT?" |
LBSR PDATA PRINT MSG |
BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD |
JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE |
BRA NEXTCMD PROMPT FOR NEW COMMAND |
* |
* "G" GO OR CONTINUE |
* |
GO TFR U,S |
RTI RTI |
* |
***** "M" MEMORY EXAMINE AND CHANGE ***** |
* |
MEMCHG LBSR IN1ADR INPUT ADDRESS |
BVS CHRTN IF NOT HEX, RETURN |
TFR X,Y SAVE ADDR IN "Y" |
MEMC2 LDX #MSG5 POINT TO MSG " - " |
LBSR PSTRNG PRINT MSG |
TFR Y,X FETCH ADDRESS |
LBSR OUT4H PRINT ADDR IN HEX |
LBSR OUT1S OUTPUT SPACE |
LDA ,Y GET CONTENTS OF CURRENT ADDR. |
LBSR OUT2H OUTPUT CONTENTS IN ASCII |
LBSR OUT1S OUTPUT SPACE |
LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
BEQ MEMC2 PROMPT OPERATOR AGAIN |
CMPA #$18 IS IT A CANCEL (CNTRL X)? |
BEQ MEMC2 PROMPT OPERATOR AGAIN |
CMPA #'^ IS IT AN UP ARROW? |
BEQ BACK DISPLAY PREVIOUS BYTE |
CMPA #$D IS IT A CR? |
BNE FORWRD DISPLAY NEXT BYTE |
CHRTN RTS EXIT ROUTINE |
* |
* |
CHANGE STA ,Y CHANGE BYTE IN MEMORY |
CMPA ,Y DID MEMORY BYTE CHANGE? |
BEQ FORWRD $F972 |
LBSR OUT1S OUTPUT SPACE |
LDA #'? LOAD QUESTION MARK |
LBSR OUTCH PRINT IT |
FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
BRA MEMC2 PRINT LOCATION & CONTENTS |
BACK LEAY -1,Y POINT TO LAST MEM LOCATION |
BRA MEMC2 PRINT LOCATION & CONTENTS |
* |
* "S" DISPLAY STACK |
* HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM |
** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. |
* |
DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER |
TFR U,Y |
LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT |
LEAX -1,X POINT TO CURRENT STACK |
BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS |
* |
* "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII |
* AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. |
* UPPER ADDRESS IN X-REG. |
* IF HEX ADDRESSES ARE INVALID (V)=1. |
* |
MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES |
BVS EDPRTN NEW COMMAND IF ILLEGAL HEX |
MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS |
CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? |
BCC AJDUMP IF NOT, DUMP HEX AND ASCII |
EDPRTN RTS ; |
* |
* ADJUST LOWER AND UPPER ADDRESS LIMITS |
* TO EVEN 16 BYTE BOUNDRIES. |
* |
* IF LOWER ADDR = $4532 |
* LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
* |
* IF UPPER ADDR = $4567 |
* UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
* |
* ENTER WITH LOWER ADDRESS IN X-REG. |
* -UPPER ADDRESS ON TOP OF STACK. |
* |
AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
ADDD #$10 ADD 16 TO UPPER ADDRESS |
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
BEQ EDUMP |
SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
RTS ; |
* |
* PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
* FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
* |
EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
LDX #MSG5 POINT TO MSG " - " |
LBSR PSTRNG PRINT MSG |
LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
LBSR OUT4H PRINT THE ADDRESS |
LBSR OUT2S 2 SPACES |
LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT |
LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
LBSR OUT1S OUTPUT SPACE |
DECB $F9D1 DECREMENT BYTE COUNT |
BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
* |
* PRINT 16 ASCII CHARACTERS |
* IF NOT PRINTABLE OR NOT VALID |
* ASCII PRINT A PERIOD (.) |
LBSR OUT2S 2 SPACES |
LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
LDB #$10 SET ASCII CHAR TO PRINT = 16 |
EDPASC LDA ,X+ GET CHARACTER FROM MEMORY |
CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
CMPA #$7E IS IT VALID ASCII? |
BLS PRASC IF SO PRINT IT |
PERIOD LDA #'. LOAD A PERIOD (.) |
PRASC LBSR OUTCH PRINT ASCII CHARACTER |
DECB DECREMENT COUNT |
BNE EDPASC |
BRA NXTLIN |
* |
***** "B" SET BREAKPOINT ***** |
* |
BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS |
BVS EXITBP EXIT IF INVALID HEX ADDR. |
CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 |
BCC BPERR IF ERROR PRINT (?), EXIT |
PSHS X $FA82 PUSH BP ADDRESS ON STACK |
LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE |
BSR BPTEST TEST BP TABLE FOR FREE SPACE |
PULS X POP BP ADDRESS FROM STACK |
BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE |
LDA ,X GET DATA AT BREAKPOINT ADDRESS |
CMPA #$3F IS IT A SWI? |
BEQ BPERR IF SWI ALREADY, INDICATE ERROR |
STA ,Y+ SAVE DATA BYTE IN BP TABLE |
STX ,Y SAVE BP ADDRESS IN BP TABLE |
LDA #$3F LOAD A SWI ($3F) |
STA ,X SAVE SWI AT BREAKPOINT ADDRESS |
EXITBP RTS ; |
* |
* INDICATE ERROR SETTING BREAKPOINT |
* |
BPERR LBSR OUT1S OUTPUT SPACE |
LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR |
LBRA OUTCH PRINT "?" |
* |
*** "X" CLEAR OUTSTANDING BREAKPOINTS *** |
* |
XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE |
LDB #8 LOAD BREAKPOINT COUNTER |
XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE |
DECB $FAAC DECREMENT BP COUNTER |
BNE XBPLP END OF BREAKPOINT TABLE? |
RTS |
* |
***** SWI ENTRY POINT ***** |
* |
SWIE TFR S,U TRANSFER STACK TO USER POINTER |
LDX 10,U LOAD PC FROM STACK INTO X-REG |
LEAX -1,X ADJUST ADDR DOWN 1 BYTE. |
BSR BPTEST FIND BREAKPOINT IN BP TABLE |
BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR |
STX 10,U SAVE BREAKPOINT ADDR IN STACK |
BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA |
REGPR LBSR REGSTR GO PRINT REGISTERS |
* |
IFD TRAOPT |
LDX #0 |
STX TRACNT |
ENDIF TRAOPT |
* |
LBRA NEXTCMD GET NEXT COMMAND |
* |
RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE |
CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY |
BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S |
LDA ,X GET DATA FROM BP ADDRESS |
CMPA #$3F IS IT SWI? |
BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S |
LDA ,Y GET ORIGINAL DATA FROM BP TABLE |
STA ,X $FAD3 RESTORE DATA AT BP ADDRESS |
FFSTBL LDA #$FF LOAD $FF IN A-ACC |
STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S |
STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S |
STA ,Y+ |
RTS |
* |
** SEARCH BREAKPOINT TABLE FOR MATCH ** |
* |
BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE |
LDB #8 LOAD BREAKPOINT COUNTER |
FNDBP LDA ,Y+ LOAD DATA BYTE |
CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? |
BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY |
DECB IF NOT, DECREMENT BREAKPOINT COUNTER |
BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH |
RTS ; |
* |
* |
BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY |
RTS |
* |
IFD TRAOPT |
* |
** TRACE from address AAAA BB bytes |
* |
TRACE LBSR ALTPC1 SET UP NEW PC |
BVS TREXIT ADDRESS ERROR, EXIT |
LBSR OUT1S |
LBSR IN1ADR Fetch Byte Count |
BVS TREXIT Byte Count error, EXIT |
STX TRACNT |
* |
LDX NMI Save NMI Vector |
STX NMISAV |
LDX #NMIE Set up NMI for Tracing |
STX NMI |
LBSR TRAINZ Initialise Hardware |
BRA TRACEG Start Trace |
TREXIT RTS |
* |
* CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
* CRA1 = 1 CA1 Rising edge IRQ |
* CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
* CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
* CRA4 = 1 ] CA2 = Set/Reset output |
* CRA5 = 1 ] |
* CRA6 = X CA2 Input Interrupt Flag |
* CRA7 = X CA1 Interrupt Flag |
* |
* CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
* CRB1 = 1 CB1 Rising edge IRQ |
* CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
* CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
* CRB4 = 1 ] CB2 = Set/Reset output |
* CRB5 = 1 ] |
* CRB6 = X CB2 Input Interrupt Flag |
* CRB7 = X CB1 Interrupt Flag |
* |
* |
** TRACE NMI ENTRY POINT |
* |
NMIE TFR S,U |
LDA #$36 Disable Interrupt, CA2 Low |
STA TACTRL |
LDA TADATA Clear Interrupt flag by reading data port |
* |
LBSR REGSTR DUMP REGISTERS |
* |
LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI |
LDA ,X |
CMPA #$3F |
BEQ TRACEX EXIT ON SWI |
* |
LDX TRACNT CHECK IF TRACE COUNT EXPIRED |
BEQ TRACEX YES, GO BACK TO THE MONITOR |
LEAX -1,X DECREMENT TRACE COUNT |
STX TRACNT |
* |
** TRACE GO (RESUME SINGLE STEP) |
* |
TRACEG TFR U,S SET UP PROGRAM STACK POINTER |
LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) |
STA TADATA |
LDA #$36 LOAD STROBE LOW |
STA TACTRL |
LDA TADATA CLEAR INTERRUPT |
LDA #$36 RELEASE RESET |
STA TBCTRL |
LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE |
STA TACTRL |
RTI GO EXECUTE INSTRUCTION |
* |
TRACEX LDX NMISAV Restore NMI vector |
STX NMI |
LBRA NEXTCMD Jump back to the command loop. |
* |
** TRACE HARDWARE INITIALISATION |
* |
TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED |
STA TACTRL |
LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED |
STA TBCTRL |
LDA #$FF PORTA = OUTPUT |
STA TADATA |
LDA #$00 PORTB = INPUT |
STA TBDATA |
LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW |
STA TACTRL |
LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH |
STA TBCTRL |
RTS |
* |
ENDIF TRAOPT |
IFD MFDCOPT |
* |
** "U" MINI DISK BOOT |
* |
MINBOOT TST CMDFDC |
CLR DRVFDC |
LDX #$0000 |
LOOP LEAX $01,X |
CMPX #$0000 |
BNE LOOP |
LDA #$0F |
STA CMDFDC |
BSR DELAY |
LOOP1 LDB CMDFDC |
BITB #$01 |
BNE LOOP1 |
LDA #$01 |
STA SECFDC |
BSR DELAY |
LDA #$8C |
STA CMDFDC |
BSR DELAY |
LDX #$C000 |
BRA LOOP3 |
LOOP2 BITB #$02 |
BEQ LOOP3 |
LDA DATFDC |
STA ,X+ |
LOOP3 LDB CMDFDC |
BITB #$01 |
BNE LOOP2 |
BITB #$2C |
BEQ LOOP4 |
RTS |
* |
LOOP4 LDX #$C000 |
STX $0A,U |
TFR U,S |
RTI |
* |
DELAY LDB #$04 |
LOOP5 DECB |
BNE LOOP5 |
RTS |
ENDIF MFDCOPT |
* |
IFD DMAFOPT |
* |
*** "D" DISK BOOT FOR DMAF2 *** |
* |
DBOOT LDA #$DE |
STA DRVREG |
LDA #$FF |
STA PRIREG $FAF8 |
STA CCREG |
STA AAAREG |
STA BBBREG |
TST CCREG |
LDA #$D8 |
STA COMREG |
LBSR DLY |
DBOOT0 LDA COMREG |
BMI DBOOT0 |
LDA #$09 |
STA COMREG |
LBSR DLY |
* |
DISKWT LDA COMREG FETCH DRIVE STATUS |
BITA #1 TEST BUSY BIT |
BNE DISKWT LOOP UNTIL NOT BUSY |
* |
BITA #$10 |
BNE DBOOT |
* |
LDX #$C000 LOGICAL ADDR. = $C000 |
BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. |
ORA #$10 |
STA CCCREG |
TFR X,D |
COMA ; |
COMB ; |
STD ADDREG |
LDX #$FEFF LOAD DMA BYTE COUNT = $100 |
STX CNTREG STORE IN COUNT REGISTER |
LDA #$FF LOAD THE CHANNEL REGISTER |
STA CCREG |
LDA #$FE SET CHANNEL 0 |
STA PRIREG |
LDA #1 SET SECTOR TO "1" |
STA SECREG ISSUE COMMAND |
LDA #$8C SET SINGLE SECTOR READ |
STA COMREG ISSUE COMMAND |
BSR DLY |
* |
* THE FOLLOWING CODE TESTS THE STATUS OF THE |
* CHANNEL CONTROL REGISTER. IF "D7" IS NOT |
* ZERO THEN IT WILL LOOP WAITING FOR "D7" |
* TO GO TO ZERO. IF AFTER 65,536 TRIES IT |
* IS STILL A ONE THE BOOT OPERATION WILL |
* BE STARTED OVER FROM THE BEGINING. |
* |
CLRB ; |
DBOOT1 PSHS B $FB55 |
CLRB ; |
DBOOT2 TST CCREG |
BPL DBOOT3 |
DECB ; |
BNE DBOOT2 |
PULS B |
DECB |
BNE DBOOT1 |
BRA DBOOT |
DBOOT3 PULS B |
LDA COMREG |
BITA #$1C |
BEQ DBOOT4 |
RTS ; |
* |
* |
DBOOT4 LDB #$DE |
STB DRVREG |
LDX #$C000 |
STX 10,U |
TFR U,S $FB7B |
RTI ; |
ENDIF DMAFOPT |
* |
IFD CF8OPT |
* |
* COMPACT FLASH BOOT |
* |
CFBOOT BSR WAITRDY |
LDA #HEADLBA |
STA CF_HEAD |
BSR WAITRDY |
LDA #FEAT8BIT |
STA CF_FEATURE |
LDA #CMDFEATURE |
STA CF_COMAND |
BSR WAITRDY |
* |
* READ SECTORS FROM CF |
* |
CFREAD LDA #$01 |
STA CF_SECCNT |
CLRA |
STA CF_SECNUM |
STA CF_CYLLO |
STA CF_CYLHI |
* |
LDA #CMDREAD ; IDE READ MULTIPLE |
STA CF_COMAND |
BSR WAITRDY |
LDX #$C000 |
* |
* READ LOOP |
* |
RDLOOP BSR WAITDRQ |
LDA CF_DATA |
STA ,X+ |
CMPX #$C200 |
BNE RDLOOP |
* |
LDX #$C000 |
STX $0A,U |
TFR U,S |
RTI |
* |
* WAIT UNTIL READY |
* |
WAITRDY LDA CF_STATUS |
BITA #BUSY |
BNE WAITRDY |
LDA CF_STATUS |
BITA #DRDY |
BEQ WAITRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WAITDRQ LDA CF_STATUS |
BITA #DRQ |
BEQ WAITDRQ |
RTS |
ENDIF CF8OPT |
* |
IFD IDEOPT |
* |
* XESS 16 BIT IDE BOOT |
* |
IDEBOOT LDD #AUXRESET |
STD CF_AUX |
LDD #AUXRSTREL |
STD CF_AUX |
LDD #HEADLBA |
STD CF_HEAD |
BSR WAITRDY |
* |
* READ SECTORS FROM CF |
* |
LDD #$01 |
STD CF_SECCNT |
CLRB |
STD CF_SECNUM |
STD CF_CYLLO |
STD CF_CYLHI |
* |
LDB #CMDREAD ; IDE READ MULTIPLE |
STD CF_COMAND |
BSR WAITRDY |
LDX #$C000 |
* |
* READ LOOP |
* |
RDLOOP BSR WAITDRQ |
LDD CF_DATA |
STB ,X+ |
CMPX #$C100 |
BNE RDLOOP |
* |
LDX #$C000 |
STX $0A,U |
TFR U,S |
RTI |
* |
* WAIT UNTIL READY |
* |
WAITRDY LDD CF_STATUS |
BITB #BUSY |
BNE WAITRDY |
LDD CF_STATUS |
BITB #DRDY |
BEQ WAITRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WAITDRQ LDD CF_STATUS |
BITB #DRQ |
BEQ WAITDRQ |
RTS |
ENDIF IDEOPT |
* |
IFD RTCOPT |
* |
* CLOCK INTER FACE UTILITY |
* |
* TIME <Hours> <Minuits> <Seconds> |
* If no argument is specified, the current time |
* will be displayed. |
* |
* READ A REGISTER FROM THE COUNTER. |
* The X Index rgister points to the register |
* to be read. The Status Register is checked |
* before and after the register is read before |
* returning a value in accumulator A |
* |
RDCLK TST CLKSTA |
BNE RDCLK |
RDCLK1 LDA 0,X |
TST CLKSTA |
BNE RDCLK1 |
RTS |
* |
* MAIN PROGRAM: |
* |
TIMSET LDX #COUNTR POINT TO TIMER |
LBSR BYTE READ HOURS |
BVS SHOWTM NO ARG, DISP TIME |
STA HOUR,X |
LBSR OUT1S |
LBSR BYTE READ MINUITES |
BVS SHOWTM |
STA MINUIT,X |
LBSR OUT1S |
LBSR BYTE SECONDS. |
BVS SHOWTM |
STA SECOND,X |
* |
* DISPLAY CURRENT TIME |
* |
SHOWTM LBSR PCRLF |
LDX #COUNTR+HOUR |
LDB #3 |
SHOWLP BSR RDCLK |
LBSR OUT2H |
LDA #': |
LBSR OUTCH |
LEAX -1,X |
DECB |
BNE SHOWLP |
RTS |
* |
* INITIATE CLOCK. |
* MASK INTERRUPTS. |
* |
CLKINZ CLR CINTCR MASK ALL INTERRUPTS |
TST CINTSR CLEAR ANY INTERRUPTS |
RTS |
ENDIF RTCOPT |
IFD DATOPT |
* |
***** LRA LOAD REAL ADDRESS ***** |
* |
* THE FOLLOWING CODE LOADS THE 20-BIT |
* PHYSICAL ADDRESS OF A MEMORY BYTE |
* INTO THE "A" AND "X" REGISTERS. THIS |
* ROUTINE IS ENTERED WITH THE LOGICAL |
* ADDRESS OF A MEMORY BYTE IN THE "IX" |
* REGISTER. EXIT IS MADE WITH THE HIGH- |
* ORDER FOUR BITS OF THE 20-BIT PHYSICAL |
* ADDRESS IN THE "A" REGISTER, AND THE |
* LOW-ORDER 16-BITS OF THE 20-BIT |
* PHYSICAL ADDRESS IN THE "IX" REGISTER. |
* ALL OTHER REGISTERS ARE PRESERVED. |
* THIS ROUTINE IS REQUIRED SINCE THE |
* DMAF1 AND DMAF2 DISK CONTROLLERS MUST |
* PRESENT PHYSICAL ADDRESSES ON THE |
* SYSTEM BUS. |
* |
LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK |
LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK |
LSRA ; |
LSRA ADJ FOR INDEXED INTO |
LSRA CORRESPONDING LOCATION |
LSRA IN LRA TABLE |
LDY #LRARAM LOAD LRA TABLE BASE ADDRESS |
LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE |
LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED |
LSRB PHYSICAL ADDRESS. |
LSRB EXTENDED MS 4-BITS ARE RETURNED |
LSRB IN THE "A" ACCUMULATOR |
STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK |
LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE |
COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG |
ASLB ADJ DATA FOR RELOCATION IN X REG |
ASLB ; |
ASLB $FB97 |
ASLB ; |
LDA 2,S GET MS BYTE OF LOGICAL ADDR. |
ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS |
STA 2,S SAVE IT IN X REG ON STACK |
ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. |
* |
* PLUS LS NIBBLE OF LOGICAL ADDRESS |
STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG |
* ON STACK |
PULS A,B,X,Y,PC POP REGS. FROM STACK |
ENDIF DATOPT |
* |
* DELAY LOOP |
* |
DLY PSHS B SAVE CONTENTS OF "B" |
LDB #$20 GET LOOP DELAY VALUE |
SUB1 DECB SUBTRACT ONE FROM VALUE |
BNE SUB1 LOOP UNTIL ZERO |
PULS B,PC RESTORE CONTENTS OF "B" |
* RTS ; |
* |
***** "L" LOAD MIKBUG TAPE ***** |
* |
LOAD JSR ACINIZ |
LDA #$11 LOAD 'DC1' CASS. READ ON CODE |
LBSR OUTCH OUTPUT IT TO TERMINAL PORT |
CLR ECHO TURN OFF ECHO FLAG |
LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO |
LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? |
BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. |
LBSR ECHON |
CMPA #'9 IS IT A "9" , END OF FILE CHAR ? |
BEQ LOAD21 IF SO, EXIT LOAD |
CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? |
BNE LOAD2 IF NOT, LOOK FOR START CHAR. |
LBSR BYTE INPUT BYTE COUNT |
PSHS A PUSH COUNT ON STACK |
BVS LODERR (V) C-CODE SET, ILLEGAL HEX |
LBSR IN1ADR INPUT LOAD ADDRESS |
BVS LODERR (V) C-CODE SET, ADDR NOT HEX |
PSHS X PUSH ADDR ON STACK |
LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE |
ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM |
ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM |
DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS |
DEC ,S ADDRESS BYTES. |
LOAD10 PSHS B PUSH CHECKSUM ON STACK |
LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) |
PULS B POP CHECKSUM FROM STACK |
BVS LODERR (V) SET, DATA BYTE NOT HEX |
PSHS A PUSH DATA BYTE ON STACK |
ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK |
DEC ,S DECREMENT BYTE COUNT 1 |
BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM |
STA ,X+ SAVE DATA BYTE IN MEMORY |
BRA LOAD10 GET NEXT DATA BYTE |
LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; |
LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) |
CMPB #$FF CHECKSUM OK? |
BEQ LOAD1 IF SO, LOAD NEXT LINE |
LDA #'? LOAD (?) ERROR INDICATOR |
LBSR OUTCH OUTPUT IT TO TERMINAL |
LOAD21 COM ECHO TURN ECHO ON |
LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE |
LBRA OUTCH OUTPUT IT |
* |
***** "P" PUNCH MIKBUG TAPE ***** |
* |
PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK |
LBSR IN2ADR GET BEGIN AND END ADDRESS |
PSHS X,Y SAVE ADDRESSES ON STACK |
BVS PUNEXT (V) C-CODE SET, EXIT PUNCH |
CMPX 2,S COMPARE BEGIN TO END ADDR |
BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH |
LEAX 1,X INCREMENT END ADDRESS |
STX ,S STORE END ADDR ON STACK |
JSR ACINIZ |
LDA #$12 LOAD 'DC2' PUNCH ON CODE |
LBSR OUTCH OUTPUT IT TO TERMINAL |
PUNCH2 LDD ,S LOAD END ADDR IN D-ACC |
SUBD 2,S SUBTRACT BEGIN FROM END |
BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT |
CMPD #$20 LESS THAN 32 BYTES? |
BLS PUNCH4 PUNCH THAT MANY BYTES |
PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. |
PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT |
LDX #MSG20 POINT TO MSG "S1" |
LBSR PSTRNG PRINT MSG |
ADDB #3 ADD 3 BYTES TO BYTE COUNT |
TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH |
LBSR OUT2H OUTPUT BYTE COUNT |
LDX 2,S LOAD BEGIN ADDRESS |
LBSR OUT4H PUNCH ADDRESS |
ADDB 2,S ADD ADDR MSB TO CHECKSUM |
ADDB 3,S ADD ADDR LSB TO CHECKSUM |
PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM |
LDA ,X+ LOAD DATA BYTE TO PUNCH |
LBSR OUT2H OUTPUT DATA BYTE |
DEC 4,S DECREMENT BYTE COUNT |
BNE PUNCHL NOT DONE, PUNCH NEXT BYTE |
COMB 1's COMPLIMENT CHECKSUM BYTE |
TFR B,A GET IT IN A-ACC TO PUNCH |
LBSR OUT2H OUTPUT CHECKSUM BYTE |
STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR |
CMPX ,S COMPARE IT TO END ADDR |
BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. |
PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE |
LBSR OUTCH OUTPUT IT |
LEAS 5,S READJUST STACK POINTER |
RTS ; |
* |
* PRINT STRING PRECEEDED BY A CR & LF. |
* |
PSTRNG BSR PCRLF PRINT CR/LF |
BRA PDATA PRINT STRING POINTED TO BY IX |
* |
* PCRLF |
* |
PCRLF PSHS X SAVE IX |
LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
LBSR PDATA PRINT MSG |
PULS X,PC RESTORE IX & RETURN |
* |
* LONG BRANCHES TO COMMON ROUTINES |
* |
JOUT1S LBRA OUT1S |
JBYTE LBRA BYTE |
JIN1ADR LBRA IN1ADR |
* |
* ALTER "PC" PROGRAM COUNTER |
* |
ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " |
ALTPC1 BSR JOUT1S OUTPUT SPACE |
BSR JIN1ADR GET NEW CONTENTS FOR "PC" |
BVS ALTPCD EXIT IF INVALID HEX |
STX 10,U POKE IN NEW CONTENTS |
ALTPCD RTS ; |
* |
* ALTER "U" USER STACK POINTER |
* |
ALTRU BSR PRTUS $FCCA PRINT MSG " US = " |
BSR JOUT1S OUTPUT SPACE |
BSR JIN1ADR |
BVS ALTUD |
STX 8,U |
ALTUD RTS ; |
* |
* ALTER "Y" INDEX REGISTER |
* |
ALTRY BSR PRTIY PRINT MSG " IY = " |
BSR JOUT1S OUTPUT SPACE |
BSR JIN1ADR |
BVS ALTYD |
STX 6,U $F8F0 |
ALTYD RTS ; |
* |
* ALTER "X" INDEX REGISTER |
* |
ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " |
BSR JOUT1S OUTPUT SPACE |
BSR JIN1ADR |
BVS ALTXD |
STX 4,U |
ALTXD RTS ; |
* |
* ALTER "DP" DIRECT PAGE REGISTER |
* |
ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " |
BSR JOUT1S OUTPUT SPACE |
BSR JBYTE INPUT BYTE (2 HEX CHAR) |
BVS ALTDPD |
STA 3,U |
ALTDPD RTS ; |
* |
* ALTER "B" ACCUMULATOR |
* |
ALTRB BSR PRTB $FD09 PRINT MSG " B = " |
BSR JOUT1S OUTPUT SPACE |
BSR JBYTE INPUT BYTE (2 HEX CHAR) |
BVS ALTBD |
STA 2,U |
ALTBD RTS $F91C |
* |
* ALTER "A" ACCUMULATOR |
* |
ALTRA BSR PRTA $FCFF RINT MSG " A = " |
BSR JOUT1S OUTPUT SPACE |
BSR JBYTE INPUT BYTE (2 HEX CHAR) |
BVS ALTAD |
STA 1,U |
ALTAD RTS ; |
* |
* ALTER "CC" REGISTER |
* |
ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " |
BSR JOUT1S OUTPUT SPACE |
BSR JBYTE INPUT BYTE (2 HEX CHAR) |
BVS ALTCCD |
ORA #$80 SETS "E" FLAG IN PRINT LIST |
STA ,U |
ALTCCD RTS ; |
* |
* PDATA |
* |
PRINT LBSR OUTCH |
PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
CMPA #4 IS IT EOT? |
BNE PRINT IF NOT EOT PRINT IT |
RTS ; |
* |
* PRINT REGISTERS |
* |
PRTSP LDX #MSG10 POINT TO MSG "SP=" |
BSR PDATA PRINT MSG |
TFR U,X |
JOUT4H LBRA OUT4H |
* |
PRTUS LDX #MSG12 POINT TO MSG "US=" |
BSR PDATA PRINT MSG |
LDX 8,U |
BRA JOUT4H |
* |
PRTDP LDX #MSG15 POINT TO MSG "DP=" |
BSR PDATA PRINT MSG |
LDA 3,U |
JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII |
* |
PRTIX LDX #MSG14 POINT TO MSG "IX=" |
BSR PDATA PRINT MSG |
LDX 4,U $FCE6 |
BRA JOUT4H |
* |
PRTIY LDX #MSG13 POINT TO MSG "IY=" |
BSR PDATA PRINT MSG |
LDX 6,U |
BRA JOUT4H |
* |
PRTPC LDX #MSG11 POINT TO MSG "PC=" |
BSR PDATA PRINT MSG |
LDX 10,U |
BRA JOUT4H |
* |
PRTA LDX #MSG16 POINT TO MSG "A=" |
BSR PDATA PRINT MSG |
LDA 1,U |
BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
* |
PRTB LDX #MSG17 POINT TO MSG "B=" |
BSR PDATA PRINT MSG |
LDA 2,U |
BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
* |
PRTCC LDX #MSG18 POINT TO MSG "CC:" |
BSR PDATA PRINT MSG |
LDA ,U |
LDX #MSG19 POINT TO MSG "EFHINZVC" |
LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT |
* |
* "R" DISPLAY REGISTERS |
* |
REGSTR LDX #MSG5 POINT TO MSG " - " |
LBSR PSTRNG PRINT MSG |
BSR PRTSP $FCBF |
BSR PRTUS $FCCA |
BSR PRTDP $FCD5 |
BSR PRTIX $FCE0 |
BSR PRTIY $FCEB |
LDX #MSG5 POINT TO MSG " - " |
LBSR PSTRNG PRINT MSG |
BSR PRTPC $FCF5 |
BSR PRTA $FCFF |
BSR PRTB $FD09 |
BRA PRTCC $FD13 |
* |
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
* OPERATOR TO INPUT TWO VALID HEX ADDRESSES. |
* THE FIRST ADDRESS INPUT IS RETURNED IN "IY". |
* THE SECOND IS RETURNED IN "IX". THE "V" BIT |
* IN THE C-CODE REG. IS SET IF AN INVALID HEX |
* ADDRESS IS INPUT. |
* |
IN2ADR BSR IN1ADR GET FIRST ADDRESS |
BVS NOTHEX EXIT IF NOT VALID HEX |
TFR X,Y SAVE FIRST ADDR. IN "IY" |
LDA #'- |
LBSR OUTCH PRINT " - " |
* |
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
* OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
* ADDRESS IS RETURNED IN THE "X" REGISTER. |
* |
IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) |
BVS NOTHEX EXIT IF NOT VALID HEX |
TFR D,X |
BSR BYTE INPUT BYTE (2 HEX CHAR) |
BVS NOTHEX |
PSHS X |
STA 1,S |
PULS X,PC |
* |
***** INPUT BYTE (2 HEX CHAR.) ***** |
* |
BYTE BSR INHEX GET HEX LEFT |
BVS NOTHEX EXIT IF NOT VALID HEX |
ASLA ; |
ASLA ; |
ASLA ; SHIFT INTO LEFT NIBBLE |
ASLA ; |
TFR A,B PUT HEXL IN "B" |
BSR INHEX GET HEX RIGHT |
BVS NOTHEX EXIT IF NOT VALID HEX |
PSHS B PUSH HEXL ON STACK |
ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
RTS RETURN WITH HEX L&R IN "A" |
* |
* |
INHEX BSR ECHON INPUT ASCII CHAR. |
CMPA #'0 IS IT > OR = "0" ? |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'9 IS IT < OR = "9" ? |
BHI INHEXA IF > MAYBE IT'S ALPHA |
SUBA #$30 ASCII ADJ. NUMERIC |
RTS ; |
* |
* |
INHEXA CMPA #'A IS IT > OR = "A" |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'F IS IT < OR = "F" ? |
BHI INHEXL IF > IT AIN'T HEX |
SUBA #$37 ASCII ADJ. ALPHA |
RTS ; |
* |
INHEXL CMPA #'a IS IT > OR = "a" |
BCS NOTHEX IF LESS IT AIN'T HEX |
CMPA #'f IS IT < "f" |
BHI NOTHEX IF > IT AIN'T HEX |
SUBA #$57 ADJUST TO LOWER CASE |
RTS ; |
* |
* |
NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
RTS ; |
* |
* |
OUT4H PSHS X PUSH X-REG. ON THE STACK |
PULS A POP MS BYTE OF X-REG INTO A-ACC. |
BSR OUTHL OUTPUT HEX LEFT |
PULS A POP LS BYTE OF X-REG INTO A-ACC. |
OUTHL EQU * |
OUT2H PSHS A SAVE IT BACK ON STACK |
LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
LSRA ; |
LSRA ; |
LSRA ; |
BSR XASCII PRINT HEX NIBBLE AS ASCII |
OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
ANDA #$0F STRIP LEFT NIBBLE |
XASCII ADDA #$30 ASCII ADJ |
CMPA #$39 IS IT < OR = "9" ? |
BLE OUTC IF LESS, OUTPUT IT |
ADDA #7 IF > MAKE ASCII LETTER |
OUTC BRA OUTCH OUTPUT CHAR |
* |
* BINARY / ASCII --- THIS ROUTINE |
* OUTPUTS A BYTE IN ENHANCED |
* BINARY FORMAT. THE ENHANCEMENT |
* IS DONE BY SUBSTITUTING ASCII |
* LETTERS FOR THE ONES IN THE BYTE. |
* THE ASCII ENHANCEMENT LETTERS |
* ARE OBTAINED FROM THE STRING |
* POINTED TO BY THE INDEX REG. "X". |
* |
BIASCI PSHS A SAVE "A" ON STACK |
LDB #8 PRESET LOOP# TO BITS PER BYTE |
OUTBA LDA ,X+ GET LETTER FROM STRING |
ASL ,S TEST BYTE FOR "1" IN B7 |
BCS PRTBA IF ONE PRINT LETTER |
LDA #'- IF ZERO PRINT "-" |
PRTBA BSR OUTCH PRINT IT |
BSR OUT1S PRINT SPACE |
DECB SUB 1 FROM #BITS YET TO PRINT |
BNE OUTBA |
PULS A,PC |
* |
IFD EXTOPT |
* |
* EXTENDED USER COMMANDS |
* |
USRCMD JMP [MONEXT+EXTCMD] |
ENDIF EXTOPT |
* |
* |
ECHON TST ECHO IS ECHO REQUIRED ? |
BEQ INCH ECHO NOT REQ. IF CLEAR |
* |
* INCHE |
* |
* ---GETS CHARACTER FROM TERMINAL AND |
* ECHOS SAME. THE CHARACTER IS RETURNED |
* IN THE "A" ACCUMULATOR WITH THE PARITY |
* BIT MASKED OFF. ALL OTHER REGISTERS |
* ARE PRESERVED. |
* |
INCHE BSR INCH GET CHAR FROM TERMINAL |
ANDA #$7F STRIP PARITY FROM CHAR. |
BRA OUTCH ECHO CHAR TO TERMINAL |
* |
* INCH |
* |
* GET CHARACTER FROM TERMINAL. RETURN |
* CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
* ALL OTHER REGISTERS. THE INPUT CHARACTER |
* IS 8 BITS AND IS NOT ECHOED. |
* |
* |
INCH PSHS X SAVE IX |
GETSTA LDX CPORT POINT TO TERMINAL PORT |
LDA ,X FETCH PORT STATUS |
BITA #1 TEST READY BIT, RDRF ? |
IFD PS2OPT |
BNE GETST1 |
LDX #PS2KBD |
LDA ,X |
BITA #1 |
ENDIF PS2OPT |
BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
GETST1 LDA 1,X FETCH CHAR |
PULS X,PC RESTORE IX |
* |
* INCHEK |
* |
* CHECK FOR A CHARACTER AVAILABLE FROM |
* THE TERMINAL. THE SERIAL PORT IS CHECKED |
* FOR READ READY. ALL REGISTERS ARE |
* PRESERVED, AND THE "Z" BIT WILL BE |
* CLEAR IF A CHARACTER CAN BE READ. |
* |
* |
INCHEK PSHS A SAVE A ACCUM. |
LDA [CPORT] FETCH PORT STATUS |
BITA #1 TEST READY BIT, RDRF ? |
IFD PS2OPT |
BNE INCHEK1 |
LDA PS2KBD |
BITA #1 TEST READY BIT< RDRF ? |
ENDIF PS2OPT |
INCHEK1 PULS A,PC RESTORE A ACCUM. |
* |
OUT2S BSR OUT1S OUTPUT 2 SPACES |
OUT1S LDA #$20 OUTPUT 1 SPACE |
* |
* |
* OUTCH |
* |
* OUTPUT CHARACTER TO TERMINAL. |
* THE CHAR. TO BE OUTPUT IS |
* PASSED IN THE A REGISTER. |
* ALL REGISTERS ARE PRESERVED. |
* |
OUTCH IFD VDUOPT |
BSR VOUTCH |
ENDIF VDUOPT |
IFD DG640OPT |
BSR VOUTCH |
ENDIF DG640OPT |
AOUTCH PSHS A,X SAVE A ACCUM AND IX |
LDX CPORT GET ADDR. OF TERMINAL |
FETSTA LDA ,X FETCH PORT STATUS |
BITA #2 TEST TDRE, OK TO XMIT ? |
BEQ FETSTA IF NOT LOOP UNTIL RDY |
PULS A GET CHAR. FOR XMIT |
STA 1,X XMIT CHAR. |
PULS X,PC RESTORE IX |
* |
* IO INITIALIZATION |
* |
IOINIZ EQU * |
IFD VDUOPT |
BSR VINIZ |
ENDIF VDUOPT |
IFD DG640OPT |
BSR VINIZ |
ENDIF DG640OPT |
ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
LDA #3 RESET ACIA PORT CODE |
STA ,X STORE IN CONTROL REGISTER |
LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
STA ,X STORE IN CONTROL REGISTER |
TST 1,X ANYTHING IN DATA REGISTER? |
LDA #$FF TURN ON ECHO FLAG |
STA ECHO |
RTS |
* |
IFD VDUOPT |
* |
*************************************************** |
* VDU8 ADM3A REGISTER-MAPPED EMULATOR * |
* * |
* 80 x 25 Characters |
* |
*************************************************** |
* |
*************************************************** |
* INITIALIZE EMULATOR * |
*************************************************** |
* |
VINIZ LDX #VDU |
LDD #0 |
STD COLADX AND ROWADX |
STA VDUCOL,X |
STB VDUROW,X |
STB VDUOFF,X |
STD NEWROW AND ESCFLG |
LDB #$02 |
STB VDUATT,X |
CLR ESCFLG |
LDA #$1B SEND ESCAPE |
BSR VOUTCH |
LDA #'Y CLEAR TO END OF SCREEN |
* |
** VIDEO OUTPUT ROUTINE |
* |
VOUTCH PSHS A,B,X SAVE REGISTERS |
LDX #VDU POINT TO VDU REGISTERS |
* |
** CHECK FOR ESCAPE SEQUENCE |
* |
TST ESCFLG ESCAPE ACTIVE? |
BEQ SOROU1 BRANCH IF NOT |
BSR ESCAPE ELSE DO ESCAPE |
BRA RETURN AND RETURN |
* |
** CHECK FOR CONTROL CHARACTERS |
* |
SOROU1 CMPA #$20 CONTROL CODES? |
BHS SOROU2 |
BSR CONTRL BRANCH IF SO |
BRA RETURN |
* |
** OUTPUT TEXT CHARACTER |
* |
SOROU2 STAA VDUCHR,X DISPLAY CHARACTER |
LBSR NEWCOL UPDATE COLUMN |
* |
** DISPLAY CURSOR AND RETURN |
* |
RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
* |
*************************************************** |
* CONTROL CODE HANDLERS * |
*************************************************** |
* |
CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
LBEQ BACKSP |
CMPA #$1B ESCAPE SEQUENCE? |
LBEQ SETESC |
CMPA #$1A CTRL Z - Clear Screen |
LBEQ CLRSCR |
CMPA #$16 CTRL ^ - Home |
LBEQ HOME |
CMPA #$D CTRL M - RETURN? |
LBEQ CRETN |
CMPA #$0C CTRL L - CHAR RIGHT |
LBEQ CHRIGHT |
CMPA #$0B CTRL K - MOVE UP ONE LINE |
LBEQ LINEUP |
CMPA #$0A CTRL J - LINE FEED |
BNE RETESC NONE OF THESE, RETURN |
* |
***************************************** LINE FEED |
* |
LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
INCB BUMP ROW |
CMPB #NUMLIN SCROLL TIME? |
LBNE NEWCUR POSITION CURSOR IF NOT |
LBRA SCROLL ELSE SCROLL IT |
* |
***************************************** LINE FEED |
* |
LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
TSTB AT TOP OF SCREEN ? |
LBEQ RETESC Yes, Ignore |
DECB No, Decrement ROW |
LBRA NEWCUR POSITION CURSOR |
* |
*********************************** BACK SPACE |
* |
BACKSP LDA COLADX |
BEQ RETESC RETURN |
DECA |
LBRA POSCOL POSITION CURSOR |
* |
*********************************** CURSOR RIGHT |
* |
CHRIGHT LDA COLADX |
INCA |
CMPA #LINLEN |
LBEQ RETESC |
LBRA POSCOL |
* |
*********************************** CURSOR RIGHT |
* |
HOME LDD #0 HOME - POSITION TOP OF SCREEN |
LBRA NEWCUR |
* |
*************************************************** |
* ESCAPE HANDLERS * |
*************************************************** |
* |
ESCAPE LDAB ESCFLG GET FLAG |
CMPB #'= SETTING CURSOR? |
BEQ ESCCUR BRANCH IF SO |
CMPA #'Y CLEAR TO END OF SCREEN? |
LBEQ ESCCLS |
CMPA #'T CLEAR TO END OF LINE? |
BEQ ESCCLL |
CMPA #'= STARTING CURSOR SET? |
BNE CLRESC BRANCH IF NOT |
* |
***************************** START ESCAPE SEQUENCE |
* |
SETESC STAA ESCFLG ELSE START CURSORING |
RTS AND RETURN |
* |
CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
RETESC RTS SO RETURN |
* |
********************************* SET SCREEN CURSOR |
* |
ESCCUR TST NEWROW ROW SET? |
BNE ESCCU1 BRANCH IF SO |
STAA NEWROW ELSE SET NEW ROW |
RTS AND RETURN |
* |
ESCCU1 CLR ESCFLG |
SUBA #$20 ADJUST COLUMN ADDRESS |
CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
BHI RETESC NOT OK, DO NOTHING |
* |
ESCCU2 LDAB NEWROW |
CLR NEWROW |
SUBB #$20 ADJUST TO ROW ADDRESS |
CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
BHI RETESC ELSE RETURN DOING NOTHING |
BRA NEWCUR GO SET NEW CURSOR IF SO |
* |
****************** CLEAR FROM CURSOR TO END OF LINE |
CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN |
BSR NEWCUR |
ESCCLL LDA COLADX |
LDB #$20 AND CLEAR CHAR |
ESCCL1 STB VDUCHR,X DISPLAY TEXT |
INCA |
STA VDUCOL,X |
CMPA #LINLEN UNTIL END OF LINE |
BNE ESCCL1 |
CLR ESCFLG |
RTS |
* |
*********************************** CARRIAGE RETURN |
* |
CRETN CLRA SET COLUMN ZERO |
POSCOL LDB ROWADX GET CURRENT ROW |
* |
*********** GENERATE NEW CURSOR POSITION AND RETURN |
* |
NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
STA VDUCOL,X SET NEW COLUMN |
STB VDUROW,X SET NEW ROW |
RTS AND RETURN |
* |
********************* UPDATE CURRENT COLUMN AND ROW |
* |
NEWCOL LDD COLADX GET ROW AND COLUMN |
INCA BUMP COLUMN |
CMPA #LINLEN ROLL? |
BNE NEWCUR BRANCH IF NOT |
CLRA ELSE RESET TO ZERO |
INCB AND BUMP ROW |
CMPB #NUMLIN |
BNE NEWCUR |
DECB BOTTOM ROW |
BSR NEWCUR |
* |
********************************* SCROLL THE SCREEN |
* |
SCROLL LDB VDUOFF,X |
INCB |
CMPB #NUMLIN |
BLO SCROL1 |
CLRB |
SCROL1 STB VDUOFF,X |
* |
**************** CLEAR FROM CURSOR TO END OF SCREEN |
* |
ESCCLS LDB COLADX GET CURSOR |
LDA #$20 GET A SPACE |
ESCCLS1 STB COLADX |
STB VDUCOL,X |
STA VDUCHR,X |
INCB |
CMPB #LINLEN |
BNE ESCCLS1 |
* |
LDB ROWADX |
INCB |
CMPB #NUMLIN |
BEQ ESCCLS2 |
STB ROWADX |
STB VDUROW,X |
CLRB |
BRA ESCCLS1 |
* |
ESCCLS2 CLRB |
STB COLADX |
STB VDUCOL,X |
STB ESCFLG |
RTS |
ENDIF VDUOPT |
* |
IFD DG640OPT |
*************************************************** |
* TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * |
* * |
* FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * |
* HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * |
* CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * |
* 16x64 BOARD). * |
*************************************************** |
|
*************************************************** |
* INITIALIZE EMULATOR * |
*************************************************** |
|
VINIZ LDX #0 |
STX COLADX AND ROWADX |
STX NEWROW AND ESCFLG |
LDX #SCREEN POINT TO SCREEN |
STX CURSOR SET PROGRAM CURSOR |
LDA #$1B SEND ESCAPE |
BSR VOUTCH |
LDA #'Y CLEAR TO END OF SCREEN |
* |
** VIDEO OUTPUT ROUTINE |
* |
VOUTCH PSHS A,B,X SAVE REGISTERS |
* |
** CLEAR CURSOR |
LDX CURSOR |
LDB 0,X |
ANDB #$7F |
STB 0,X |
* |
** CHECK FOR ESCAPE SEQUENCE |
TST ESCFLG ESCAPE ACTIVE? |
BEQ SOROU1 BRANCH IF NOT |
BSR ESCAPE ELSE DO ESCAPE |
BRA RETURN AND RETURN |
* |
** CHECK FOR CONTROL CHARACTERS |
SOROU1 CMPA #$20 CONTROL CODES? |
BHS SOROU2 |
BSR CONTRL BRANCH IF SO |
BRA RETURN |
* |
** OUTPUT TEXT CHARACTER |
SOROU2 LDX CURSOR ELSE GET CURSOR |
STAA 0,X DISPLAY CHARACTER |
LBSR NEWCOL UPDATE COLUMN |
* |
** DISPLAY CURSOR AND RETURN |
RETURN LDX CURSOR AND DISPLAY IT |
LDB ,X |
ORAB #$80 WITH REVID |
STB ,X |
PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
|
*************************************************** |
* CONTROL CODE HANDLERS * |
*************************************************** |
|
CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
LBEQ BACKSP |
CMPA #$1B ESCAPE SEQUENCE? |
LBEQ SETESC |
CMPA #$D CTRL M - RETURN? |
LBEQ CRETN |
CMPA #$0A CTRL J - LINE FEED |
BNE RETESC NONE OF THESE, RETURN |
|
***************************************** LINE FEED |
|
LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
INCB BUMP ROW |
CMPB #NUMLIN SCROLL TIME? |
LBNE NEWCUR POSITION CURSOR IF NOT |
LBRA SCROLL ELSE SCROLL IT |
|
***************************************** LINE FEED |
|
LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
TSTB AT TOP OF SCREEN ? |
BEQ RETESC Yes, Ignore |
DECB No, Decrement ROW |
LBRA NEWCUR POSITION CURSOR |
|
|
*********************************** BACK SPACE |
|
BACKSP LDA COLADX |
BEQ RETESC RETURN |
DECA |
LBRA POSCOL POSITION CURSOR |
|
*********************************** CURSOR RIGHT |
|
CHRIGHT LDA COLADX |
INCA |
CMPA #LINLEN |
BEQ RETESC |
LBRA POSCOL |
|
*************************************************** |
* ESCAPE HANDLERS * |
*************************************************** |
|
ESCAPE LDAB ESCFLG GET FLAG |
CMPB #'= SETTING CURSOR? |
BEQ ESCCUR BRANCH IF SO |
CMPA #'Y CLEAR TO END OF SCREEN? |
LBEQ ESCCLS |
CMPA #'T CLEAR TO END OF LINE? |
BEQ ESCCLL |
CMPA #'E INSERT LINE? |
BEQ ESCINL |
CMPA #'R DELETE LINE? |
BEQ ESCDLL |
CMPA #'= STARTING CURSOR SET? |
BNE CLRESC BRANCH IF NOT |
|
***************************** START ESCAPE SEQUENCE |
|
SETESC STAA ESCFLG ELSE START CURSORING |
RTS AND RETURN |
|
CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
RETESC RTS SO RETURN |
|
********************************* SET SCREEN CURSOR |
|
ESCCUR TST NEWROW ROW SET? |
BNE ESCCU1 BRANCH IF SO |
STAA NEWROW ELSE SET NEW ROW |
RTS AND RETURN |
|
ESCCU1 CLR ESCFLG |
SUBA #$20 ADJUST COLUMN ADDRESS |
CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
BHI RETESC NOT OK, DO NOTHING |
|
ESCCU2 LDAB NEWROW |
CLR NEWROW |
SUBB #$20 ADJUST TO ROW ADDRESS |
CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
BHI RETESC ELSE RETURN DOING NOTHING |
BRA NEWCUR GO SET NEW CURSOR IF SO |
* |
*************************** DELETE LINE FROM SCREEN |
|
ESCDLL BSR CRETN GO COL. ZERO |
LDB ROWADX |
CMPB #NUMLIN-1 |
BEQ SCROL3 |
BRA SCROL1 AND DELETE THIS LINE |
|
*************************** INSERT LINE INTO SCREEN |
|
ESCINL BSR CRETN GO TO COL. ZERO |
LDAB ROWADX |
CMPB #NUMLIN-1 |
BEQ ESCCLL |
* |
** SCROLL SCREEN DOWN FROM CURSOR |
* |
LDX #SCREEN+SCNLEN-LINLEN |
ESCIN0 LDAA 0,-X |
STAA LINLEN,X |
LDA SCNLEN,X |
STA SCNLEN+LINLEN,X |
CPX CURSOR |
BNE ESCIN0 |
|
****************** CLEAR FROM CURSOR TO END OF LINE |
|
ESCCLL LDA COLADX GET CURRENT COLUMN |
LDX CURSOR GET CURSOR |
LDB #$20 AND CLEAR CHAR |
ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE |
STB ,X+ CLEAR TEXT |
INCA |
CMPA #LINLEN UNTIL END OF LINE |
BNE ESCLL1 |
CLR ESCFLG |
RTS |
|
*********************************** CARRIAGE RETURN |
|
CRETN CLRA SET COLUMN ZERO |
POSCOL LDB ROWADX GET CURRENT ROW |
|
*********** GENERATE NEW CURSOR POSITION AND RETURN |
|
NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
LDA #LINLEN ELSE ADD A LINE |
MUL LINLEN * ROWADX |
ADDB COLADX |
ADCA #0 |
ADDD #SCREEN ADD SCREEN BASE. |
STD CURSOR SAVE NEW CURSOR |
TFR D,X GET CURSOR IN X |
RTS AND RETURN |
|
********************* UPDATE CURRENT COLUMN AND ROW |
|
NEWCOL LDD COLADX GET ROW AND COLUMN |
INCA BUMP COLUMN |
CMPA #LINLEN ROLL? |
BNE NEWCUR BRANCH IF NOT |
CLRA ELSE RESET TO ZERO |
INCB AND BUMP ROW |
CMPB #NUMLIN |
BNE NEWCUR |
DECB BOTTOM ROW |
BSR NEWCUR |
|
********************************* SCROLL THE SCREEN |
|
SCROLL LDX #SCREEN POINT TO SCREEN |
SCROL1 LDA SCNLEN+LINLEN,X |
STA SCNLEN,X |
LDAA LINLEN,X MOVE TWO BYTES |
STAA 0,X+ UP ONE LINE |
CMPX #SCREEN+SCNLEN-LINLEN |
BNE SCROL1 LOOP UNTIL DONE |
BRA SCROL3 |
|
**************** CLEAR FROM CURSOR TO END OF SCREEN |
|
ESCCLS LDX CURSOR GET CURSOR |
SCROL3 LDAA #$20 GET A SPACE |
SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES |
STA ,X+ AND TEXT |
CMPX #SCREEN+SCNLEN |
BNE SCROL2 UNTIL DONE |
CLR ESCFLG |
RTS |
ENDIF DG640OPT |
* |
IFD PRTOPT |
************************************* |
* |
** PRINTER DRIVER ROUTINES |
* |
************************************* |
* |
** PINIZ - INITIATE PRINTER PORT |
* |
PINIZ PSHS B |
LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 |
STD PADATA SET DDR AND SELECT DATA |
* |
** RESET PRINTER |
LDB #PRESET |
STAB PADATA |
RESTLP INCB DELAY FOR RESET |
BNE RESTLP |
STAA PADATA ACCA=DIRMSK |
* |
** INITALIZE PORT B (DATA PORT) |
LDAA #$2A |
STAA PBCTRL |
LDD #$FF2E ACCA=$FF ACCB =%00101110 |
STD PBDATA PBDREG PBCTRL |
* |
** SELECT 66 LINES/PAGE |
LDAA #$1B |
BSR POUTCH |
LDAA #'C |
BSR POUTCH |
LDAA #66 |
PULS B |
************************************* |
* |
** OUTPUT A CHARACTER TO THE PRINTER |
* |
************************************* |
POUTCH PSHS B |
LDAB PBDATA CLEAR INTERRUPT BIT |
* |
** WAIT TILL NOT BUSY |
BUSYLP LDAB PADATA |
BITB #PERROR |
BEQ PEXIT |
TSTB |
BMI BUSYLP |
* |
** NOW OUTPUT CHARACTER |
STAA PBDATA |
PEXIT PULS B,PC |
************************************* |
* |
** PCHK TEST IFD PRINTER READY |
* |
************************************* |
PCHK TST PBCTRL TEST STATE OF CRB7 |
RTS SET ON ACKNOWLEDGE |
ENDIF PRTOPT |
************************************* |
* |
* MONITOR KEYBOARD COMMAND JUMP TABLE |
* |
************************************* |
* |
JMPTAB EQU * |
FCB 1 " ^A " |
FDB ALTRA |
FCB 2 " ^B " |
FDB ALTRB |
FCB 3 " ^C " |
FDB ALTRCC |
FCB 4 " ^D " |
FDB ALTRDP |
FCB $10 " ^P " |
FDB ALTRPC |
FCB $15 " ^U " |
FDB ALTRU |
FCB $18 " ^X " |
FDB ALTRX |
FCB $19 " ^Y " |
FDB ALTRY |
* |
FCC 'B' |
FDB BRKPNT |
FCC 'E' |
FDB MEMDUMP |
FCC 'G' |
FDB GO |
FCC 'L' |
FDB LOAD |
FCC 'P' |
FDB PUNCH |
FCC 'M' |
FDB MEMCHG |
FCC 'R' |
FDB REGSTR |
FCC 'S' |
FDB DISSTK |
FCC 'X' |
FDB XBKPNT |
IFD MFDCOPT |
FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT |
FDB MINBOOT |
ENDIF MFDCOPT |
IFD CF8OPT |
FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT |
FDB CFBOOT |
ENDIF CF8OPT |
IFD IDEOPT |
FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT |
FDB IDEBOOT |
ENDIF IDEOPT |
IFD DMAFOPT |
FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT |
FDB DBOOT |
ENDIF DMAFOPT |
IFD EXTOPT |
FCC 'U' *** IF FPGA, 'U' IS FOR USER |
FDB USRCMD |
ENDIF EXTOPT |
IFD RTCOPT |
FCC 'T' |
FDB TIMSET |
ENDIF RTCOPT |
IFD TRAOPT |
FCC "T" |
FDB TRACE |
ENDIF TRAOPT |
* |
TABEND EQU * |
* |
* ** 6809 VECTOR ADDRESSES ** |
* |
* FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES |
* FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY |
* ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE |
* RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO |
* HIS OWN ROUTINES IF HE SO DESIRES. |
* |
* |
RAMVEC FDB SWIE USER-V |
FDB RTI SWI3-V |
FDB RTI SWI2-V |
FDB RTI FIRQ-V |
FDB RTI IRQ-V |
FDB SWIE SWI-V |
FDB $FFFF SVC-VO |
FDB $FFFF SVC-VL |
* |
* PRINTABLE MESSAGE STRINGS |
* |
MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
FCC 'SYS09BUG 1.4 FOR ' |
IFD S3EOPT |
FCC 'S3E ' |
ENDIF S3EOPT |
IFD B5XOPT |
FCC 'B5-X300 ' |
ENDIF B5XOPT |
IFD S3SOPT |
FCC 'S3STARTER ' |
ENDIF S3SOPT |
IFD ADSOPT |
FCC 'ADS6809 ' |
ENDIF ADSOPT |
IFD SWTOPT` |
FCC 'SWTPC ' |
ENDIF SWTOPT |
IFD XESOPT` |
FCC 'XESS ' |
ENDIF XESOPT |
FCC ' - ' |
FCB 4 |
MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS |
MSG3 FCC '>' |
FCB 4 |
MSG4 FCC 'WHAT?' |
FCB 4 |
MSG5 FCC ' - ' |
FCB 4' |
MSG10 FCC ' SP=' |
FCB 4 |
MSG11 FCC ' PC=' |
FCB 4 |
MSG12 FCC ' US=' |
FCB 4 |
MSG13 FCC ' IY=' |
FCB 4 |
MSG14 FCC ' IX=' |
FCB 4 |
MSG15 FCC ' DP=' |
FCB 4 |
MSG16 FCC ' A=' |
FCB 4 |
MSG17 FCC ' B=' |
FCB 4 |
MSG18 FCC ' CC: ' |
FCB 4 |
MSG19 FCC 'EFHINZVC' |
MSG20 FCC 'S1' |
FCB 4 |
IFD DATOPT |
* |
* POWER UP/ RESET/ NMI ENTRY POINT |
* |
ORG $FF00 |
* |
* |
START LDX #IC11 POINT TO DAT RAM IC11 |
LDA #$F GET COMPLIMENT OF ZERO |
* |
* |
* INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F |
* OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS |
* IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE |
* OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA |
* STORED IN IT. |
* |
* |
DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION |
DECA GET COMP. VALUE FOR NEXT LOCATION |
BNE DATLP ALL 16 LOCATIONS INITIALIZED ? |
* |
* NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER |
* ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL |
* PHYSICAL ADDRESSES. |
* |
LDA #$F0 |
STA ,X STORE $F0 AT $FFFF |
LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF |
LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" |
TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION |
STY ,X STORE TEST PATTERN AT $D0A0 |
CMPY ,X IS THERE RAM AT THIS LOCATION ? |
BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP |
LEAX -$1000,X ELSE POINT 4K LOWER |
CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? |
BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM |
BRA START ELSE START ALL OVER AGAIN |
* |
* |
* THE FOLLOWING CODE STORES THE COMPLEMENT OF |
* THE MS CHARACTER OF THE FOUR CHARACTER HEX |
* ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED |
* BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT |
* IS STORED IN RAM IN THE LOCATION THAT IS |
* ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, |
* THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND |
* WHEN TESTING LOCATION $70A0, MEANING THERE |
* IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE |
* $8000-$DFFF, THEN THE COMPLEMENT OF THE |
* "7" IN THE $70A0 WILL BE STORED IN |
* THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS |
* AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND |
* BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE |
* 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE |
* RAM THAT IS PHYSICALLY ADDRESSED AT $7--- |
* WILL RESPOND AND APPEAR TO THE 6809 THAT IT |
* IS AT $D--- SINCE THAT IS THE ADDRESS THE |
* 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK |
* OF RAM RESPONDS. |
* |
* |
CNVADR STU ,X RESTORE DATA AT TEST LOCATION |
TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
COMA COMPLEMENT MSB OF THAT ADDRESS |
LSRA PUT MS 4 BITS OF ADDRESS IN |
LSRA LOCATION D0-D3 TO ALLOW STORING |
LSRA IT IN THE DYNAMIC ADDRESS |
LSRA TRANSLATION RAM. |
STA $FFFD STORE XLATION FACTOR IN DAT "D" |
* |
LDS #STACK INITIALIZE STACK POINTER |
* |
* |
* THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES |
* OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK |
* OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS |
* IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION |
* TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF |
* THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO |
* RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... |
* |
* 0 1 2 3 4 5 6 7 8 9 A B C D E F |
* 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- |
* |
* ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE |
* CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... |
* |
* 0 1 2 3 4 5 6 7 8 9 A B C D E F |
* 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 |
* |
* |
* HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF |
* HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL |
* ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK |
* PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT |
* IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 |
* WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 |
* RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE |
* MEMORY ADDRESSED AS FOLLOWS.... |
* |
* 0 1 2 3 4 5 6 7 8 9 A B C D E F |
* 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- |
* |
* |
LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD |
CLR 14,Y CLEAR $DFDE |
LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? |
STA 15,Y STORE AT $DFDF |
LDA #$0C PRESET NUMBER OF BYTES TO CLEAR |
CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 |
DECA SUB. 1 FROM BYTES LEFT TO CLEAR |
BPL CLRLRT CONTINUE IF NOT DONE CLEARING |
FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM |
CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO |
BEQ FINTAB SKIP IF FINISHED |
LDU ,X SAVE DATA AT CURRENT TEST LOCATION |
LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. |
STY ,X STORE TEST PATT. INTO RAM TEST LOC. |
CMPY ,X VERIFY RAM AT TEST LOCATION |
BNE FNDRAM IF NO RAM GO LOOK 4K LOWER |
STU ,X ELSE RESTORE DATA TO TEST LOCATION |
LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 |
LSRA TO ALLOW STORING IT IN THE DAT RAM. |
LSRA |
LSRA |
TFR A,B SAVE OFFSET INTO LRARAM TABLE |
EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK |
STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE |
BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK |
FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? |
LDY #LRARAM POINT TO LRARAM TABLE |
STA 14,Y STORE $F1 AT $DFCE |
* |
* THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF |
* RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES |
* THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT |
* LOGICALLY RESPONDS TO THE ADDRESS $C---. |
* |
* |
LDA #$0C PRESET NUMBER HEX "C" |
FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE |
BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. |
DECA ELSE POINT 4K LOWER |
BPL FINDC GO TRY AGAIN |
BRA XFERTF |
FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND |
STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- |
* |
* THE FOLLOWING CODE ADJUSTS THE TRANSLATION |
* FACTORS SUCH THAT ALL REMAINING RAM WILL |
* RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL |
* ADDRESSES FROM $0000 AND UP.... |
* |
CLRA START AT ZERO |
TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. |
COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE |
BEQ PNTNXT IF IT'S ZER0 SKIP |
CLR A,Y ELSE ERASE FROM TABLE |
STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP |
PNTNXT INCA GET OFFSET TO NEXT ENTRY |
CMPA #$0C LAST ENTRY YET ? |
BLT COMPRS |
* |
* THE FOLLOWING CODE TRANSFER THE TRANSLATION |
* FACTORS FROM THE LRARAM TABLE TO IC11 ON |
* THE MP-09 CPU CARD. |
* |
XFERTF LDX #IC11 POINT TO DAT RAM IC11 |
LDB #$10 GET NO. OF BYTES TO MOVE |
FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT |
STA ,X+ POKE XLATION FACTOR IN IC11 |
DECB SUB 1 FROM BYTES TO MOVE |
BNE FETCH CONTINUE UNTIL 16 MOVED |
* |
ELSE |
LRA RTS |
START LDS #STACK INITIALIZE STACK POINTER |
CLRB |
ENDIF DATOPT |
* |
COMB SET "B" NON-ZERO |
STB ECHO TURN ON ECHO FLAG |
LBRA MONITOR INITIALIZATION IS COMPLETE |
* |
** INTERRUPT JUMP VECTORS |
* |
V1 JMP [STACK] |
V2 JMP [SWI2] |
V3 JMP [FIRQ] |
V4 JMP [IRQ] |
V5 JMP [SWI] |
* |
* SWI3 ENTRY POINT |
* |
SWI3E TFR S,U |
LDX 10,U *$FFC8 |
LDB ,X+ |
STX 10,U |
CLRA |
ASLB |
ROLA |
LDX SVCVO |
CMPX #$FFFF |
BEQ SWI3Z |
LEAX D,X |
CMPX SVCVL |
BHI SWI3Z |
PSHS X |
LDD ,U |
LDX 4,U |
JMP [,S++] |
SWI3Z PULU A,B,X,CC,DP |
LDU 2,U |
JMP [SWI3] |
* |
* 6809 VECTORS |
* |
ORG $FFF0 |
FDB V1 USER-V |
FDB SWI3E SWI3-V |
FDB V2 SWI2-V |
FDB V3 FIRQ-V |
FDB V4 IRQ-V |
FDB V5 SWI-V |
FDB V1 NMI-V |
FDB START RESTART-V |
END START |
/opt_ads.txt
0,0 → 1,18
* |
*************************************************** |
* OPTION SWITCHES |
*************************************************** |
* |
* |
** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
** FOR LOADING AND SAVING S1 RECORDS |
* |
*S3EOPT EQU $FF SPARTAN3E STARTER |
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
* |
END |
/opt_s3s.txt
0,0 → 1,18
* |
*************************************************** |
* OPTION SWITCHES |
*************************************************** |
* |
* |
** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
** FOR LOADING AND SAVING S1 RECORDS |
* |
*S3EOPT EQU $FF SPARTAN3E STARTER |
S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
*SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
* |
END |
/sys09s3e.sh
0,0 → 1,2
../../Tools/as09/as09.exe sys09s3e.txt -l > sys09s3e.lst |
../../Tools/epedit/epedit.exe sys09s3e.aux |
/opt_swt.txt
0,0 → 1,18
* |
*************************************************** |
* OPTION SWITCHES |
*************************************************** |
* |
* |
** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
** FOR LOADING AND SAVING S1 RECORDS |
* |
*S3EOPT EQU $FF SPARTAN3E STARTER |
*S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
*B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
*XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
*ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
* |
END |
/sys09xes_b16_0.vhd
0,0 → 1,64
INIT_00 => x"8C02300D2780E12CF08E20C0022F60C10AF89FAD2086891F7F8406F89FAD02F0", |
INIT_01 => x"CD8E040D0A3F2054414857BCF258EAF0463EF042946E29021635F08EF52635F0", |
INIT_02 => x"B6B035EE261F30F6263F310A254700E0B6E2048E10E8038E30343B341F4AAF00", |
INIT_03 => x"0235ED261F30F5263F310C25474700E0B6E2048E10E8038E02343034B03501E0", |
INIT_04 => x"2E2E2E6B7369642045444920676E6974616D726F460D0AB03501E0B70235B035", |
INIT_05 => x"6E20657669726420454449040D0A043F207265626D754E2065766972440D0A20", |
INIT_06 => x"6574656C706D6F432074616D726F460D0A04202164657461636F6C6C6120746F", |
INIT_07 => x"002510308169FF17FB2450FF1753F2BD89F08EBDF4BD04204B53494445444904", |
INIT_08 => x"017FFB265A80A75F4F00028E3AF5BDFD008E0001F7891F3080E90022103381EF", |
INIT_09 => x"F60101B601A70186846C042600814C0201B684A70101B600028E0201B7018601", |
INIT_0a => x"028EC82600810101B601017C0201B70186D72600810201B602017C15F5BD0201", |
INIT_0b => x"8EF1F4BDFFC64F00028E15F5BDFFC6FF86016F846F00028EF1F4BDFFC6FF8600", |
INIT_0c => x"8E102034016F846F00028EF1F4BD03C64F00028E15F5BDFFC64F016F846F0002", |
INIT_0d => x"FFC6FF861D88ED0101CC1B88ED0001F64F2035F72618C15C85A7A0A610C6E1F0", |
INIT_0e => x"F5BD03C64F2588A707862488A707862388A701862188ED01FECC2688ED1F88ED", |
INIT_0f => x"E0B7038639018500E0B653F27ECFF08E2503170201F70101B701C64F00F78E15", |
INIT_10 => x"20DD8D0A2778850826018500E0B60A017F09017F0801B710863900E0B7118600", |
INIT_11 => x"8500E0B6023439021A4FDC2608017AE12609017AE6260A017A39FD1C01E0B6E6", |
INIT_12 => x"646F6D580A0D39F826048180A6E78D3901E0B70235F120B38DF5277885082602", |
INIT_13 => x"706D6F432064616F6C70550A0D0464616F6C7055206B73694420454449206D65", |
INIT_14 => x"626D754E2065766972440A0D04726F7272452064616F6C70550A0D046574656C", |
INIT_15 => x"175AF28E04294E2F5928203F206572755320756F59206572410A0D043A207265", |
INIT_16 => x"01B730802801221033812E01251030816AFF17FB293CFF178BFF1794F28E91FF", |
INIT_17 => x"815F843DFF17FB290FFF175EFF17A5F28E4BFF17308B0001B66CFF1794F28E00", |
INIT_18 => x"0101B701C64F00028E0401B701860601FF2DF4CEB10117B3265981FF0027104E", |
INIT_19 => x"D501170201F60101B600028ED6002510E00017870117E0002510EA00170201F7", |
INIT_1a => x"B00017570117B0002510BA00170201F70101B75C0201F60101B600028E710117", |
INIT_1b => x"0101B75C0201F60101B600028E410117A501170201F60101B600028EA6002510", |
INIT_1c => x"88E60B01B74C2688A600028E76002510800017270117800025108A00170201F7", |
INIT_1d => x"01F70101B700028E5C0201F60101B60301176701170201F60101B60C01F75C27", |
INIT_1e => x"00173701170201F60101B600028E38002510420017E90017420025104C001702", |
INIT_1f => x"01F70101B701C64F00F78EC3260B01B14C01C6CB260C01F15C0201F60101B6D3", |
INIT_20 => x"CE1BFE1715860A28EFFD170601FE403443FE1685F28E53F27E73F28E11011702", |
INIT_21 => x"FAFD1706860826048139FA1C4DF4CE06260181C0350601FFED26C4ADF1202DF4", |
INIT_22 => x"2DF4CEDDFD17158639FA1C63F4CE06260401B139FA1C39051A0326188139051A", |
INIT_23 => x"350301B70301BB023439FA1C77F4CE0501B7808603017FEF260401B14339FA1C", |
INIT_24 => x"043439041AFE1C2DF4CE04017C0B260301B139FA1C80A78EF4CE032605017A02", |
INIT_25 => x"0600CC82357FFD170686023439FA1C2DF4CE8CFD1715860435011F80C45A101F", |
INIT_26 => x"E4E606E1FD5A4F023401C64F668DD602160CE1FDE000CC1EE1FD0200CC1EE1FD", |
INIT_27 => x"8E102034AC02170EE1FD2000CCE48D82355F04E1FD01C60AE1FD0001F608E1FD", |
INIT_28 => x"8802170EE1FD3000CCC08D395F9502172035F4263F3180E700E1FCB202170001", |
INIT_29 => x"0123038103A6395F7002172035F4263F3100E1FD80E68D02174F00018E102034", |
INIT_2a => x"00000000000000000000000000000000000000000000395F03A6395F0001B74F", |
INIT_2b => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_2c => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_2d => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_2e => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_2f => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_30 => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_31 => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_32 => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_33 => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_34 => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_35 => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_36 => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_37 => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_38 => x"270281358D00C48E1000C3FDF18CECFFC0CE1000000000C00000000000000B20", |
INIT_39 => x"5D891F158DD08CA71A8DD48CA71F8DEA20DA8CA7268DDE8CA72B8DF626168110", |
INIT_3a => x"8D0B2784EC00C38E0F2600C48C10C920F5265A80A71435098D1434C58CAED927", |
INIT_3b => x"C60AE1FD908CE608E1FDE4E606E1FD5A4F02349B9C6E39A0A604C38E109D2626", |
INIT_3c => x"3F3180E700E1FC1E8D00018E102034178D0EE1FD2000CCE48D82355F04E1FD01", |
INIT_3d => x"0039F92708C50EE1FC39F22740C50EE1FCF92680C50EE1FC395F028D2035F526", |
INIT_3e => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_3f => x"0000000000000000000000000000000000000000000000000000000000000000" |
/sys09xes_b16_1.vhd
0,0 → 1,64
INIT_00 => x"A780A610C6C0DF8E1074FE8E2EFA1AFB1EFB8FFBCEFCB9FC9BFCA1FC61F814F8", |
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC65B0117E0DFBF00E08EF9265AA0", |
INIT_02 => x"0317A3FE8E0C0417F62A5A19048B0327856D0DC64FD0DF8E47031784FE8E9F04", |
INIT_03 => x"17408B981F5304175E86092C2081891FF1270D817F84370417B30217AAFE8E2E", |
INIT_04 => x"20F00217ACFE8EF52674FE8C02300F2780E13BFE8E20C0022F60C14704174C04", |
INIT_05 => x"17A4A60F0417A50317211F650217B2FE8E121F2D296B03173B341FBC2094ADC0", |
INIT_06 => x"27A4A1A4A7390F260D8117275E81DD271881E127088111285E0317070417A503", |
INIT_07 => x"0B031705201F30C0DF8E321FA20217BE203F31C2202131E503173F86E8031708", |
INIT_08 => x"279A03170527E4AC011FF0C4201F0634F0C41000C3101F390124E1AC20340629", |
INIT_09 => x"265A8E03172C031780A610C69603172E0317E4AEEE0117B2FE8E103439623203", |
INIT_0a => x"29B70217BC20EE265A7703172E8602237E810425208180A610C6E1AE860317F5", |
INIT_0b => x"3984A73F86A4AFA0A709273F8184A60F271035558DFFFF8E10341A24C0DF8C1E", |
INIT_0c => x"4AAF0427268D1F304AAE431F39FB265A188D08C6E3DF8E104603163F86490317", |
INIT_0d => x"A7A0A7A0A7FF8684A7A4A604263F8184A60A24C0DF8C21AEB9FE16480217068D", |
INIT_0e => x"E1FD0200CC1EE1FD0600CC393D3139F7265A0427A1ACA0A608C6E3DF8E1039A0", |
INIT_0f => x"178D0EE1FD20C60AE1FD08E1FD06E1FD5F04E1FD0100CC2E8D0CE1FDE000CC1E", |
INIT_10 => x"E1FCF92680C50EE1FC3B341F4AAF00C08EF42600C18C80E700E1FC218D00C08E", |
INIT_11 => x"54545454A6E6D0DF8E104444444462A6363439F92708C50EE1FC39F22740C50E", |
INIT_12 => x"FCBD8435FD265A20C60434B63562E762EA62A70F8462A65858585853A6E6E4E7", |
INIT_13 => x"0234A80117F12631813D273981230217F92653812A0217E2DF7F6802171186E3", |
INIT_14 => x"E0EB02340C2904358E01170434E46AE46AE4EBE0EBE0E6103421299101172629", |
INIT_15 => x"0117E26F1202161386E2DF731A02173F86BA27FFC102355FEB2080A70527E46A", |
INIT_16 => x"2320008310062762A3E4ECF901171286E3FCBDE4AF0130492562AC4D2930344A", |
INIT_17 => x"1780A684EB63EB62EB68011762AE750117981F03CB2F0017F3FE8E64E720C602", |
INIT_18 => x"10347120028D396532B701171486C326E4AC62AF5B0117981F53F526646A6501", |
INIT_19 => x"8D618D394AAF0229F68DF28D910017E50016F80016A101169035690017A4FE8E", |
INIT_1a => x"498D3944AF0229D58DD18D5E8D3946AF0229E08DDC8D728D3948AF0229EB8DE7", |
INIT_1b => x"8D3941A70229B18DB08D588D3942A70229BC8DBB8D6C8D3943A70229C78DC68D", |
INIT_1c => x"BF0016311FF48DB6FE8E39F726048180A63F011739C4A7808A0429A68DA58D5F", |
INIT_1d => x"8DC8FE8EE12044AED78DCEFE8EB4001643A6E18DD4FE8EF42048AEEA8DC2FE8E", |
INIT_1e => x"D02042A6B38DDFFE8ED92041A6BC8DDAFE8ECF204AAEC58DBCFE8ED82046AECE", |
INIT_1f => x"B2FE8EBF8DB88DB08DA98DA18D27FF17B2FE8E900016EBFE8EC4A6AA8DE4FE8E", |
INIT_20 => x"3C29088D011F42290E8DB800172D86121F4D29098DD520CE8DC78DC08D17FF17", |
INIT_21 => x"811D2530815B8D39E0AB04342829078D891F484848483229118D903561A71034", |
INIT_22 => x"3439021A39578003226681072561813937800322468112254181393080032239", |
INIT_23 => x"C602345120078B022F3981308B0F840235048D4444444402340235028D023510", |
INIT_24 => x"207F84048D0627E2DF7D00F09F6E8235F1265A3F8D438D2D860225E46880A608", |
INIT_25 => x"85E0DF9FA60234903501A6EE27018584A620E08E0926018584A6E0DFBE10342D", |
INIT_26 => x"3501A70235FA27028584A6E0DFBE1234458D2086008D8235018520E0B6052601", |
INIT_27 => x"A7FBDFFD0000CC30E08E39E2DFB7FF86016D84A7118684A70386E0DFBE138D90", |
INIT_28 => x"8D0427FEDF7D30E08E16345986028D1B86FEDF7F01E702C6FDDFFD04E703E702", |
INIT_29 => x"1A816C0027101B814100271008819635C5001784A70520098D042420810D2074", |
INIT_2a => x"51260A81110027100B812C0027100C81990027100D814500271016818E002710", |
INIT_2b => x"164A3327FBDFB67400165A3C0027105DFBDFFC9900168300261019C15CFBDFFC", |
INIT_2c => x"2710598116273DC1FEDFF65800160000CC5B00162500271050814CFBDFB66800", |
INIT_2d => x"2080FEDF7F39FDDFB70426FDDF7D39FEDF7F39FEDFB704263D81312754816E00", |
INIT_2e => x"A74C84E720C6FBDFB6168D0000CC1B20E12218C120C0FDDF7FFDDFF6ED224F81", |
INIT_2f => x"C15C4FF02650814CFBDFFC3903E702A7FBDFFDFCDFF64F39FEDF7FF726508102", |
INIT_30 => x"2650C15C84A702E7FBDFF72086FBDFF604E75F012519C15C04E6E78D5AEA2619", |
INIT_31 => x"FB0274FB0139FEDFF702E7FBDFF75FE4205F03E7FCDFF7082719C15CFCDFF6F4", |
INIT_32 => x"505EFA4CA5F847FDF8455CF94248FB1953FB183DFB1531FB105EFB047FFB0369", |
INIT_33 => x"94F9A7F8A7F8A7F8A7F894F992FC55D5F94488F958F1F853EDFB52A8F84DBCFA", |
INIT_34 => x"20205353455820524F4620342E312047554239305359530000000A0DFFFFFFFF", |
INIT_35 => x"43502020043D5053202004202D20043F54414857043E040000000A0D4B04202D", |
INIT_36 => x"20043D412020043D50442020043D58492020043D59492020043D53552020043D", |
INIT_37 => x"0000000000000000000004315343565A4E4948464504203A43432020043D4220", |
INIT_38 => x"300B2784AC1084AF1084EEAA558E10A0D08E84A7F086FB264A80A70F86F0FF8E", |
INIT_39 => x"2DA7D0DF8E10C0DFCE10FDFFB74444444443101F84EFD620ED26A0F08C00F089", |
INIT_3a => x"1084AF10AA558E1084EE2227A0F08C00F08930FB2A4AA66F0C862FA7F0862E6F", |
INIT_3b => x"2EA7D0DF8E10F186D520A5A70F88891F44444444101FD0DF8E1084EFE92684AC", |
INIT_3c => x"8EF32D0C814C80E7A66F0427A6E6211F4F2CE7A66F1420F92A4A0526A6E60C86", |
INIT_3d => x"9F6EC6DF9F6EC4DF9F6EC0DF9F6E62F816E2DFF753F9265A80A7A0A610C6F0FF", |
INIT_3e => x"0822CEDFBC8B300F27FFFF8CCCDFBE49584F4AAF80E64AAE431FCADF9F6EC8DF", |
INIT_3f => x"00FFB2FFC2FFBEFFBAFFB6FFC6FFB2FFC2DF9F6E42EE1F37F16E44AEC4EC1034" |
/sys09b5x.sh
0,0 → 1,2
../../Tools/as09/as09.exe sys09b5x.txt -l > sys09b5x.lst |
../../Tools/epedit/epedit.exe sys09b5x.aux |
/sys09equ.txt
0,0 → 1,416
* |
*************************************************** |
* MEMORY MAP EQUATES * |
*************************************************** |
MONIO EQU $E000 I/O SPACE |
IFD S3EOPT |
MONRAM EQU $7FC0 |
ELSE |
MONRAM EQU $DFC0 STACK SPACE |
ENDIF S3EOPT |
MONROM EQU $F800 START OF ROM |
IFD S3SOPT |
MONEXT EQU $F000 START OF EXTENDED COMMANDS |
EXTCMD EQU $00 EXTENDED OFFSET |
ENDIF S3SOPT |
IFD XESOPT |
MONEXT EQU $F000 START OF EXTENDED COMMANDS |
EXTCMD EQU $00 EXTENDED OFFSET |
ENDIF XESOPT |
*************************************************** |
|
IFD S3EOPT |
* |
* DIGILENT SPARTAN 3E STARTER |
* |
ACIAOPT EQU $FF ACIA AT PORT 0 |
PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
VDUOPT EQU $FF VDU AT $E030 |
TRAOPT EQU $FF PIA TRACE TIMER |
ENDIF S3EOPT |
* |
IFD S3SOPT |
* |
* DIGILENT SPARTAN 3 STARTER |
* |
ACIAOPT EQU $FF ACIA AT PORT 0 |
PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
VDUOPT EQU $FF VDU AT $E030 |
CF8OPT EQU $FF COMPACT FLASH AT $E040 |
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
EXTOPT EQU $FF EXTENDED COMMANDS |
ENDIF S3SOPT |
* |
IFD B5XOPT |
* |
* BURCHED B5-X300 |
* |
ACIAOPT EQU $FF ACIA AT PORT 0 |
PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
VDUOPT EQU $FF VDU AT $E030 |
CF8OPT EQU $FF COMPACT FLASH AT $E040 |
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
ENDIF B5XOPT |
* |
IFD XESOPT |
* |
* XESS XSA-3S1000 & XST-3.0 |
* |
ACIAOPT EQU $FF ACIA AT PORT 0 |
PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
VDUOPT EQU $FF VDU AT $E030 |
IDEOPT EQU $FF XESS IDE AT $E100 |
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
EXTOPT EQU $FF EXTENDED COMMANDS |
ENDIF XESOPT |
* |
IFD ADSOPT |
* |
* ACKERMAN DIGITAL ADS6809 |
* |
DG640OPT EQU $FF DG640 VDU AT $E800 |
*RTCOPT EQU $FF REAL TIME CLOCK |
PRTOPT EQU $FF PRINTER DRIVERS |
MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
ENDIF ADSOPT |
* |
IFD SWTOPT |
* |
* SOUTH WEST TECHNICAL PRODUCTS COMPUTER |
* |
ACIAOPT EQU $FF ACIA AT PORT 0 |
DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT |
MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
ENDIF |
* |
IFD ACIAOPT |
* |
*************************************************** |
* SERIAL PORT * |
*************************************************** |
* |
** ACIA SITS ON PORT 0 |
* |
ACIAS EQU MONIO+$00 CONTROL PORT |
* |
ENDIF ACIAOPT |
IFD MFDCOPT |
* |
*************************************************** |
* MINIFLOPPY DRIVE * |
*************************************************** |
* |
** FLOPPY DISK CONTROLLER SITS ON PORT 1 |
* |
DRVFDC EQU MONIO+$14 |
CMDFDC EQU MONIO+$18 |
SECFDC EQU MONIO+$1A |
DATFDC EQU MONIO+$1B |
ENDIF MFDCOPT |
IFD PS2OPT |
* |
*************************************************** |
* VDU8 PS/2 KEYBOARD PORT * |
*************************************************** |
* |
** KEYBOARD SITS ON PORT 2 |
* |
PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT |
ENDIF PS2OPT |
IFD VDUOPT |
* |
*************************************************** |
* VDU8 DISPLAY DRIVER EQUATES * |
*************************************************** |
* |
** VDU8 DISPLAY SITS ON PORT 3 |
* |
VDU EQU MONIO+$30 |
VDUCHR EQU 0 CHARACTER REGISTER |
VDUATT EQU 1 ATTRIBUTE REGISTER |
VDUCOL EQU 2 CURSOR COLUMN |
VDUROW EQU 3 CURSOR ROW |
VDUOFF EQU 4 ROW OFFSET |
* |
LINLEN EQU 80 LENGTH OF A LINE |
NUMLIN EQU 25 NUMBER OF LINES |
ENDIF VDUOPT |
* |
IFD CF8OPT |
* |
*************************************************** |
* COMPACT FLASH EQUATES 8 BIT TRANSFER * |
*************************************************** |
* |
** COMPACT FLASH SITS AT PORT 4 |
* |
CF_BASE EQU MONIO+$40 |
CF_DATA EQU CF_BASE+0 |
CF_ERROR EQU CF_BASE+1 ; read error |
CF_FEATURE EQU CF_BASE+1 ; write feature |
CF_SECCNT EQU CF_BASE+2 |
CF_SECNUM EQU CF_BASE+3 |
CF_CYLLO EQU CF_BASE+4 |
CF_CYLHI EQU CF_BASE+5 |
CF_HEAD EQU CF_BASE+6 |
CF_STATUS EQU CF_BASE+7 ; read status |
CF_COMAND EQU CF_BASE+7 ; write command |
* |
* Command Equates |
* |
CMDREAD EQU $20 ; Read Single sector |
CMDWRITE EQU $30 ; Write Single sector |
CMDFEATURE EQU $EF |
FEAT8BIT EQU $01 ; enable 8 bit transfers |
HEADLBA EQU $E0 |
* |
* Status bit equates |
* |
BUSY EQU $80 |
DRDY EQU $40 |
DRQ EQU $08 |
ERR EQU $01 |
* |
ENDIF CF8OPT |
* |
IFD IDEOPT |
* |
*************************************************** |
* COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) * |
*************************************************** |
* |
** COMPACT FLASH SITS AT PORT 4 |
* |
CF_BASE EQU MONIO+$0100 |
CF_DATA EQU CF_BASE+0 |
CF_ERROR EQU CF_BASE+2 ; read error |
CF_FEATURE EQU CF_BASE+2 ; write feature |
CF_SECCNT EQU CF_BASE+4 |
CF_SECNUM EQU CF_BASE+6 |
CF_CYLLO EQU CF_BASE+8 |
CF_CYLHI EQU CF_BASE+10 |
CF_HEAD EQU CF_BASE+12 |
CF_STATUS EQU CF_BASE+14 ; read status |
CF_COMAND EQU CF_BASE+14 ; write command |
CF_AUX EQU CF_BASE+30 |
* |
* Command Equates |
* |
CMDREAD EQU $20 ; Read Single sector |
CMDWRITE EQU $30 ; Write Single sector |
AUXRESET EQU $06 ; Reset IDE |
AUXRSTREL EQU $02 ; Reset release IRQ masked |
HEADLBA EQU $E0 |
* |
* Status bit equates |
* |
BUSY EQU $80 |
DRDY EQU $40 |
DRQ EQU $08 |
ERR EQU $01 |
* |
ENDIF CF8OPT |
* |
IFD RTCOPT |
* |
************************************************** |
* MM58167A REAL TIME CLOCK MEMORY MAP: |
************************************************** |
* |
** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 |
* |
CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS |
* |
* COUNTER AND COMPARITOR REGISTERS: |
* |
* Both the Clock Counter and Clock Comparitor |
* consist of 8 registers for holding the time. |
* The register offsets from the Counter and |
* Comparitor registers are listed above. |
* |
COUNTR EQU CLOCK+0 |
CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS |
* |
* CLOCK REGISTER OFFSETS: |
* These register offsets are used for the CLOCK |
* and comparitor ram CMPRAM. |
* |
S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS |
S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS |
SECOND EQU 2 |
MINUIT EQU 3 |
HOUR EQU 4 |
WKDAY EQU 5 |
MTHDAY EQU 6 |
MONTH EQU 7 |
* |
* INTERRUPT OUTPUT REGISTERS: |
* |
* An interrupt output may be generated at the |
* following rates by setting the appropriate bit |
* in the Interrupt Control Register (CINTCR). |
* The Interrupt Status Register (CINTSR) must be |
* read to clear the interrupt and will return |
* the source of the interrupt. |
* |
* 1/Month Bit 7 |
* 1/Week Bit 6 |
* 1/Day Bit 5 |
* 1/Hour Bit 4 |
* 1/Minuite Bit 3 |
* 1/Second Bit 2 |
* 10/Second Bit 1 |
* Comparitor Bit 0 |
* |
CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER |
CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER |
* |
* COUNTER AND RAM RESETS; GO COMMAND. |
* |
* The counter and comparitor may be reset |
* by writing $FF into CTRRES and CMPRES |
* respectivly. |
* A write to the Go command register (GOCMND) |
* will reset the 1/1000ths, 1/100ths and 1/10ths |
* of a second counter. |
* |
CTRRES EQU CLOCK+18 COUNTER RESET |
CMPRES EQU CLOCK+19 COMPARITOR RAM RESET |
GOCMND EQU CLOCK+21 GO COMMAND |
* |
* CLOCK STATUS REGISTER. |
* |
* The counter takes 61 usec. to rollover for |
* every 1KHz clock pulse. If the Status bit is |
* set after reading the counter, the counter |
* should be re-read to ensure the time is correct. |
* |
CLKSTA EQU CLOCK+20 STATUS BIT |
SBYINT EQU CLOCK+22 STANDBY INTERRUPT |
TSTMOD EQU CLOCK+31 TEST MODE REGISTER |
ENDIF RTCOPT |
* |
IFD TRAOPT |
* |
************************************************** |
* PIA INTERRUPT TIMER |
************************************************** |
* |
** PIA INTERRUPT TIMER SITS ON PORT 7 |
* |
** PIA TIMER FOR SINGLE STEP / TRACE |
* |
* TADATA = Output = Timer preset register |
* TACTRL - CA1 = input = rising edge = NMI |
* - CA2 = Output = Timer Reset (Active High) |
* TBDATA = Input = Timer read back register |
* TBCTRL - CB1 = input = rising edge = FIRQ |
* - CB2 = output = strobe low on write to TBDATA = Timer Preset |
* |
* CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
* CRA1 = 1 CA1 Rising edge IRQ |
* CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
* CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
* CRA4 = 1 ] CA2 = Set/Reset output |
* CRA5 = 1 ] |
* CRA6 = X CA2 Input Interrupt Flag |
* CRA7 = X CA1 Interrupt Flag |
* |
* CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
* CRB1 = 1 CB1 Rising edge IRQ |
* CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
* CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
* CRB4 = 1 ] CB2 = Set/Reset output |
* CRB5 = 1 ] |
* CRB6 = X CB2 Input Interrupt Flag |
* CRB7 = X CB1 Interrupt Flag |
* |
* DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output |
* DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output |
* |
TADATA EQU MONIO+$70 Timer preset port |
TACTRL EQU MONIO+$71 |
TBDATA EQU MONIO+$72 Timer read back port |
TBCTRL EQU MONIO+$73 |
* |
TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) |
* |
ENDIF TRAOPT |
IFD ADSOPT |
* |
*************************************************** |
* SERIAL PORT FOR DG640 * |
*************************************************** |
* |
** SET UP FOR ACKERMAN DIGITAL ADS6809 |
** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA |
* |
ACIAS EQU MONIO+$400 CONTROL PORT |
* |
ENDIF ADSOPT |
IFD PRTOPT |
* |
*************************************************** |
* PRINTER INTERFACE * |
*************************************************** |
* |
PADATA EQU MONIO+$404 |
PACTRL EQU MONIO+$405 |
PBDATA EQU MONIO+$406 |
PBCTRL EQU MONIO+$407 |
* |
** CB1 ACK. I/P |
** CB2 STB. O/P |
** PB0 - PB7 DATA 1 - 8 O/P |
** PORT A BIT ASSIGNMENT |
* |
PBUSY EQU $80 I/P |
PEMPTY EQU $40 I/P |
SELECT EQU $20 I/P |
PERROR EQU $10 I/P |
PRESET EQU %00000100 O/P PA3 = 0 |
AUTOFD EQU %00001000 O/P PA2 = 0 |
DIRMSK EQU %00001100 |
ENDIF PRTOPT |
IFD DG640OPT |
* |
*************************************************** |
* DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
*************************************************** |
* |
** VIDEO DISPLAY DEFINITIONS |
* |
SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY |
LINLEN EQU 64 LENGTH OF A LINE |
NUMLIN EQU 16 NUMBER OF LINES |
SCNLEN EQU $400 LENGTH OF SCREEN |
ENDIF DG640OPT |
* |
IFD DMAFOPT |
* |
*************************************************** |
* DMAF2 8" DRIVE * |
*************************************************** |
* |
ADDREG EQU $F000 ADDRESS REGISTER |
CNTREG EQU $F002 COUNT REGISTER |
CCREG EQU $F010 CHANNEL CONTROL REGISTER |
PRIREG EQU $F014 DMA PRIORITY REGISTER |
AAAREG EQU $F015 ??? |
BBBREG EQU $F016 ??? |
COMREG EQU $F020 1791 COMMAND REGISTER |
SECREG EQU $F022 SECTOR REGISTER |
DRVREG EQU $F024 DRIVE SELECT LATCH |
CCCREG EQU $F040 ??? |
ENDIF DMAFOPT |
IFD DATOPT |
************************************************** |
* DYNAMIC ADDRESS TRANSLATION REGISTERS * |
************************************************** |
* |
IC11 EQU $FFF0 DAT RAM CHIP |
TSTPAT EQU $55AA TEST PATTERN |
ENDIF DATOPT |
* |
END |
/sys09s3e.txt
0,0 → 1,5
NAM SYS09BUG FOR SPARTAN 3E STARTER |
INCLUDE "opt_s3e.txt" |
INCLUDE "sys09equ.txt" |
INCLUDE "sys09bug.txt" |
END |
/SYS09XES.S19
0,0 → 1,115
S123F000F002AD9FF806847F1F898620AD9FF80AC1602F02C0208EF02CE180270D30028CE2 |
S123F020F03526F58EF0351602296E9442F03E46F0EA58F2BC57484154203F0A0D048ECDF7 |
S123F04000AF4A1F343B34308E03E8108E04E2B6E00047250A313F26F6301F26EE35B0B62E |
S123F060E00135B0343034028E03E8108E04E2B6E0004747250C313F26F5301F26ED3502B6 |
S123F08035B03502B7E00135B00A0D466F726D6174696E6720494445206469736B2E2E2ECE |
S123F0A0200A0D4472697665204E756D626572203F040A0D04494445206472697665206E7A |
S123F0C06F7420616C6C6F63617465642120040A0D466F726D617420436F6D706C65746562 |
S123F0E0044944454449534B2004BDF4BD8EF089BDF25317FF5024FB17FF69813010250086 |
S123F100EF8133102200E980301F89F701008E00FDBDF53A8E02004F5FA7805A26FB7F0106 |
S123F120018601B701028E0200B60101A784B601024C810026046C848601A701B60101F699 |
S123F1400102BDF5157C0102B60102810026D78601B701027C0101B60101810026C88E02B5 |
S123F1600086FFC6FFBDF4F18E02006F846F0186FFC6FFBDF5158E02004FC6FFBDF4F18EC7 |
S123F18002006F846F014FC6FFBDF5158E02004FC603BDF4F18E02006F846F013420108EFC |
S123F1A0F0E1C610A6A0A7855CC11826F735204FF60100ED881BCC0101ED881D86FFC6FF0B |
S123F1C0ED881FED8826CCFE01ED88218601A788238607A788248607A788254FC603BDF537 |
S123F1E0158EF7004FC601B70101F701021703258EF0CF7EF253B6E0008501398603B7E0E4 |
S123F200008611B7E000398610B701087F01097F010AB6E000850126088578270A8DDD2018 |
S123F220E6B6E0011CFD397A010A26E67A010926E17A010826DC4F1A02393402B6E0008565 |
S123F240022608857827F58DB320F13502B7E001398DE7A680810426F8390D0A586D6F64E3 |
S123F260656D20494445204469736B2055706C6F6164040D0A55706C6F616420436F6D7067 |
S123F2806C657465040D0A55706C6F6164204572726F72040D0A4472697665204E756D624F |
S123F2A06572203A040D0A41726520596F752053757265203F2028592F4E29048EF25A172F |
S123F2C0FF918EF29417FF8B17FF3C29FB17FF6A81301025012E8133102201288030B70163 |
S123F2E0008EF29417FF6CB601008B3017FF4B8EF2A517FF5E17FF0F29FB17FF3D845F8108 |
S123F3004E102700FF815926B31701B1CEF42DFF01068601B701048E02004FC601B7010152 |
S123F320F701021700EA102500E01701871700E0102500D68E0200B60101F601021701D5EA |
S123F3401701718E0200B60101F601025CB70101F701021700BA102500B01701571700B0E4 |
S123F360102500A68E0200B60101F601021701A51701418E0200B60101F601025CB7010101 |
S123F380F7010217008A10250080170127170080102500768E0200A688264CB7010BE68837 |
S123F3A0275CF7010CB60101F60102170167170103B60101F601025C8E0200B70101F70129 |
S123F3C00217004C102500421700E9170042102500388E0200B60101F601021701371700E0 |
S123F3E0D3B60101F601025CF1010C26CBC6014CB1010B26C38EF7004FC601B70101F70135 |
S123F400021701118EF2737EF2538EF28516FE433440FE010617FDEF280A861517FE1BCE64 |
S123F420F42D20F1ADC426EDFF010635C081012606CEF44D1CFA3981042608860617FDFABE |
S123F4401A0539811826031A05391CFA39B101042606CEF4631CFA39861517FDDDCEF42D16 |
S123F4601CFA3943B1010426EF7F01038680B70105CEF4771CFA393402BB0103B701033578 |
S123F480027A01052603CEF48EA7801CFA39B10103260B7C0104CEF42D1CFE1A04393404F8 |
S123F4A01F105AC4801F013504861517FD8CCEF42D1CFA393402860617FD7F3582CC0006CB |
S123F4C0FDE11ECC0002FDE11ECC00E0FDE10C1602D68D664FC60134024F5AFDE106E6E448 |
S123F4E0FDE108F60100FDE10AC601FDE1045F35828DE4CC0020FDE10E1702AC3420108E84 |
S123F50001001702B2FCE100E780313F26F435201702955F398DC0CC0030FDE10E170288DC |
S123F5203420108E01004F17028DE680FDE100313F26F435201702705F39A603810323014A |
S10DF5404FB701005F39A6035F39DD |
S123F700200B000000000000C00000000010CEC0FFEC8CF1FDC300108EC4008D3581022766 |
S123F72010811626F68D2BA78CDE8D26A78CDA20EA8D1FA78CD48D1AA78CD08D151F895D6B |
S123F74027D9AE8CC534148D093514A7805A26F520C9108CC400260F8EC300EC84270B8DE5 |
S123F76026269D108EC304A6A0396E9C9B34024F5AFDE106E6E4FDE108E68C90FDE10AC6F0 |
S123F78001FDE1045F35828DE4CC0020FDE10E8D173420108E01008D1EFCE100E780313F2D |
S122F7A026F535208D025F39FCE10EC58026F9FCE10EC54027F239FCE10EC50827F9390D |
S123F800F814F861FCA1FC9BFCB9FCCEFB8FFB1EFB1AFA2E8EFE74108EDFC0C610A680A70C |
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2 |
S123F840049F8EFE841703478EDFD04FC60D6D8527038B04195A2AF617040C8EFEA3170383 |
S123F8602E8EFEAA1702B3170437847F810D27F11F8981202C09865E1704531F988B4017F0 |
S123F880044C170447C1602F02C0208EFE3BE180270F30028CFE7426F58EFEAC1702F02076 |
S123F8A0C0AD9420BC1F343B17036B292D1F128EFEB21702651F211703A517040FA6A41787 |
S123F8C003A517040717035E2811810827E1811827DD815E2717810D260F39A7A4A1A427AB |
S123F8E0081703E8863F1703E5312120C2313F20BE1702A21F328EDFC0301F200517030BE2 |
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE4270517039A27DB |
S123F9200332623934108EFEB21701EEAEE417032E170396C610A68017032C17038E5A2677 |
S123F940F5170386AEE1C610A68081202504817E2302862E1703775A26EE20BC1702B7290D |
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2 |
S123F980170349863F160346108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4AD5 |
S123F9A08D0617024816FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A717 |
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D39CC0006FDE11ECC0002FDE18D |
S123F9E01ECC00E0FDE10C8D2ECC0001FDE1045FFDE106FDE108FDE10AC620FDE10E8D175E |
S123FA008EC0008D21FCE100E7808CC10026F48EC000AF4A1F343BFCE10EC58026F9FCE13A |
S123FA200EC54027F239FCE10EC50827F9393436A66244444444108EDFD0E6A654545454A1 |
S123FA40E7E4E6A65358585858A662840FA762EA62E76235B63404C6205A26FD3584BDFC67 |
S123FA60E386111702687FDFE217022A815326F91702238139273D813126F11701A83402F8 |
S123FA80292617019129213410E6E0EBE0EBE46AE46AE4340417018E3504290C3402EBE093 |
S123FAA06AE42705A78020EB5F3502C1FF27BA863F17021A73DFE286131602126FE2170107 |
S123FAC04A3430294DAC6225493001AFE4BDFCE386121701F9ECE4A36227061083002023A1 |
S123FAE002C620E7648EFEF317002FCB031F98170175AE62170168EB62EB63EB84A6801721 |
S123FB0001656A6426F5531F9817015BAF62ACE426C386141701B73265398D0220713410EE |
S123FB208EFEA417006935901601A11600F81600E51700918DF28DF62902AF4A398D618D09 |
S123FB40E78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18DD52902AF44398D49E1 |
S123FB608DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB08DB12902A741398D7C |
S123FB805F8DA58DA629048A80A7C43917013FA680810426F7398EFEB68DF41F311600BF82 |
S123FBA08EFEC28DEAAE4820F48EFED48DE1A6431600B48EFECE8DD7AE4420E18EFEC88D5F |
S123FBC0CEAE4620D88EFEBC8DC5AE4A20CF8EFEDA8DBCA64120D98EFEDF8DB3A64220D0D4 |
S123FBE08EFEE48DAAA6C48EFEEB1600908EFEB217FF278DA18DA98DB08DB88DBF8EFEB2E8 |
S123FC0017FF178DC08DC78DCE20D58D09294D1F12862D1700B88D0E29421F018D08293CE3 |
S123FC203410A76135908D112932484848481F898D0729283404ABE0398D5B8130251D81B1 |
S123FC40392203803039814125128146220380373981612507816622038057391A023934D1 |
S123FC601035028D0235023402444444448D043502840F8B3081392F028B0720513402C62D |
S123FC8008A68068E42502862D8D438D3F5A26F135826E9FF0007DDFE227068D04847F202C |
S123FCA02D3410BEDFE0A684850126098EE020A684850127EEA60135903402A69FDFE085F5 |
S123FCC0012605B6E020850135828D0086208D453412BEDFE0A684850227FA3502A7013553 |
S123FCE0908D13BEDFE08603A7848611A7846D0186FFB7DFE2398EE030CC0000FDDFFBA751 |
S123FD0002E703E704FDDFFDC602E7017FDFFE861B8D02865934168EE0307DDFFE27048D1A |
S123FD2074200D812024048D092005A7841700C53596810810270041811B1027006C811AED |
S123FD401027008E811610270045810D10270099810C1027002C810B10270011810A2651A3 |
S123FD60FCDFFB5CC11910260083160099FCDFFB5D1027003C5A160074B6DFFB27334A1637 |
S123FD800068B6DFFB4C81501027002516005BCC0000160058F6DFFEC13D27168159102724 |
S123FDA0006E81542731813D2604B7DFFE397FDFFE397DDFFD2604B7DFFD397FDFFE80200F |
S123FDC0814F22EDF6DFFD7FDFFDC020C11822E1201BCC00008D16B6DFFBC620E7844CA7D9 |
S123FDE002815026F77FDFFE394FF6DFFCFDDFFBA702E70339FCDFFB4C815026F04F5CC142 |
S123FE001926EA5A8DE7E6045CC11925015FE704F6DFFB8620F7DFFBE702A7845CC1502669 |
S123FE20F4F6DFFC5CC1192708F7DFFCE7035F20E45FF7DFFBE702F7DFFE3901FB7402FBE2 |
S123FE406903FB7F04FB5E10FB3115FB3D18FB5319FB4842F95C45F8FD47F8A54CFA5E5067 |
S123FE60FABC4DF8A852FBED53F8F158F98844F9D555FC92F994F8A7F8A7F8A7F8A7F99401 |
S123FE80FFFFFFFF0D0A000000535953303942554720312E3420464F5220584553532020A8 |
S123FEA02D20044B0D0A000000043E04574841543F04202D2004202053503D042020504366 |
S123FEC03D04202055533D04202049593D04202049583D04202044503D042020413D042078 |
S119FEE020423D04202043433A2004454648494E5A56435331045C |
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6 |
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9 |
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E |
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26 |
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02 |
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC |
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0 |
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294 |
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB |
S9030000FC |
/sys09b5x.txt
0,0 → 1,5
NAM SYS09BUG FOR THE B5-X300 |
INCLUDE "opt_b5x.txt" |
INCLUDE "sys09equ.txt" |
INCLUDE "sys09bug.txt" |
END |
/sys09xes.txt
0,0 → 1,6
NAM SYS09BUG FOR XESS |
INCLUDE "opt_xes.txt" |
INCLUDE "sys09equ.txt" |
INCLUDE "sys09ide.txt" |
INCLUDE "sys09bug.txt" |
END |
/sys09ide.txt
0,0 → 1,986
* |
** SYS09BUG MONITOR EXTENSIONS |
* |
* FOR SYS09BUG ON THE XESS XSA-3S100 / XST-3.0 |
* WITH I/O MAPPED AT $XE000 |
* 16 BIT IDE MAPPED AT $E100 |
* AND ROM MAPPED AT $XF000 |
* |
* |
PAGE |
* |
*************************************************** |
* Serial PROM register |
*************************************************** |
* |
** CONFIGURATION PROM DEFINITIONS |
* |
PROMREG EQU MONIO+$C0 |
PCLKHI EQU $01 Toggle PROM Clock High |
PCLKLO EQU $00 Toggle PROM Clock Low |
PRSTHI EQU $02 Toggle PROM Reset High |
PRSTLO EQU $00 Toggle PROM Reset Low |
SYNCHI EQU $AA55 Synch Pattern High Word |
SYNCLO EQU $FF00 Synch Pattern Low Word |
* |
* |
*************************************************** |
* START OF ROM * |
*************************************************** |
* |
MONITV EQU MONROM+0 FDB MONITOR |
NXTCMV EQU MONROM+2 FDB NEXTCMD |
INCHV EQU MONROM+4 FDB INCH |
INCHEV EQU MONROM+6 FDB INCHE |
INCHKV EQU MONROM+8 FDB INCHEK |
OUTCHV EQU MONROM+10 FDB OUTCH |
PDATAV EQU MONROM+12 FDB PDATA |
PCRLFV EQU MONROM+14 FDB PCRLF |
PSTRGV EQU MONROM+16 FDB PSTRNG |
LRAV EQU MONROM+18 FDB LRA |
* |
* Condition code flags |
* |
CFLAG EQU $01 CARRY FLAG |
VFLAG EQU $02 OVERFLOW FLAG |
ZFLAG EQU $04 ZERO FLAG |
NFLAG EQU $08 NEGATIVE FLAG |
IFLAG EQU $10 IRQ MASK CC |
HFLAG EQU $20 HALF CARRY |
FFLAG EQU $40 FIRQ MASK CC |
EFLAG EQU $80 ENTIRE FLAG |
* |
* Serial Port |
* |
ACIAC1 EQU ACIAS |
ACIAD1 EQU ACIAS+1 |
DELCON EQU 1250 Delay (Processor clock in MHz * 50) |
* |
* XMODEM Control characters |
* |
SOH EQU $01 |
EOT EQU $04 |
ACK EQU $06 |
NAK EQU $15 |
CAN EQU $18 |
* |
* Some Disk Constants |
* |
RMAXTRK EQU 256 |
RMAXSEC EQU 255 |
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC |
* |
* RAM SPACE |
* |
* PUT THIS DOWN THE BOTTOM OF MEMORY |
* |
ORG $0100 |
DRVNUM RMB 1 |
TRACK RMB 1 |
SECTOR RMB 1 |
CHKSUM RMB 1 |
BLKNUM RMB 1 Xmodem block number |
BYTCNT RMB 1 Xmodem byte count |
XSTATE RMB 2 Xmodem State Vector |
DELCNT RMB 3 $00,$00,$00 Xmodem Poll timer |
MAXTRK RMB 1 |
MAXSEC RMB 1 |
ORG $0200 |
* |
* SECTOR BUFFER |
* |
BUFFER RMB 256 |
* |
**************************************** |
* |
* START OF EXTENSION COMMANDS |
* |
**************************************** |
* |
ORG MONEXT |
FDB NEXTEXT Jump to next extended command |
* |
***** NEXTCMD ***** |
* |
NEXTEXT JSR [INCHEV] GET ONE CHAR. FROM TERMINAL |
ANDA #$7F STRIP PARITY FROM CHAR. |
TFR A,B |
LDA #$20 |
JSR [OUTCHV] PRNT SPACE |
CMPB #$60 |
BLE NXTEX0 |
SUBB #$20 |
* |
***** DO TABLE LOOKUP ***** |
* FOR COMMAND FUNCTIONS |
* |
NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE |
NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
BEQ JMPEXT BRANCH IF MATCH FOUND |
LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
CMPX #EXTEND REACHED END OF TABLE YET ? |
BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY |
LDX #MSGWHAT POINT TO MSG "WHAT?" |
LBRA PDATA1 PRINT MSG AND RETURN |
JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE |
* |
* EXTENDED COMMAND JUMP TABLE |
* |
EXTTAB EQU * |
FCC 'B' BOOT FLEX |
FDB UBSUB |
FCC 'F' FORMAT IDE DISK |
FDB UFSUB |
FCC 'X' XMODEM ROM DISK UPLOAD |
FDB UXSUB |
* |
EXTEND EQU * |
* |
MSGWHAT FCC "WHAT ?" |
FCB $0A,$0D,$04 |
* |
* GO TO FLEX RESIDENT IN MEMORY |
* |
UBSUB LDX #$CD00 |
STX 10,U |
TFR U,S |
RTI |
* |
* recieve char from remote drive. |
* timeout if no response for approx 1s. |
* Entry: no parameters |
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
* |
RCHAR PSHS X,Y |
* |
LDX #1000 1000x inner loop |
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
RCHAR2 LDA ACIAC1 test for recieved char |
ASRA |
BCS RCHAR3 get character |
LEAY -1,Y else, continue to count delay |
BNE RCHAR2 |
LEAX -1,X |
BNE RCHAR1 |
PULS X,Y,PC return with error if timed out |
* |
RCHAR3 LDA ACIAD1 return data (carry bit still set) |
PULS X,Y,PC |
* |
* |
* transmit char to remote drive. |
* timeout if no response for approx 1s. (allows for use of hardware flow control) |
* Entry: (A) = char to transmit |
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
* |
SCHAR PSHS X,Y |
PSHS A |
* |
LDX #1000 1000x inner loop |
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
SCHAR2 LDA ACIAC1 test for space in transmit FIFO |
ASRA |
ASRA |
BCS SCHAR3 send character |
LEAY -1,Y else, continue to count delay |
BNE SCHAR2 |
LEAX -1,X |
BNE SCHAR1 |
PULS A |
PULS X,Y,PC return with error if timed out |
* |
SCHAR3 PULS A |
STA ACIAD1 send data (carry bit still set) |
PULS X,Y,PC |
* |
** 'UF' Format IDE Drive to FLEX standard. |
* |
DISFOS FCB $0A,$0D |
FCC 'Formating IDE disk... ' |
FCB $0A,$0D |
FCC 'Drive Number ?' |
FCB 4 |
MESS6 FCB $0A,$0D,4 |
FCC 'IDE drive not allocated! ' |
FCB 4 |
UFMSG1 FCB $0A,$0D |
FCC 'Format Complete' |
FCB 4 |
VOLMSG FCC 'IDEDISK ' |
FCB 4 |
* |
UFSUB JSR INITDR |
LDX #DISFOS |
JSR PDATA1 |
UFSUB1 LBSR RCHAR |
BCC UFSUB1 |
LBSR SCHAR |
CMPA #'0' |
LBLO UFEXIT |
CMPA #'3' |
LBHI UFEXIT |
SUBA #'0' |
TFR A,B |
STB DRVNUM |
LDX #DRVNUM-3 |
JSR DRVSEL |
* |
* set up free chain |
* |
LDX #BUFFER clear out buffer |
CLRA |
CLRB |
DFL1 STA 0,X+ |
DECB |
BNE DFL1 |
* |
CLR TRACK |
LDA #1 |
STA SECTOR |
DFL2 LDX #BUFFER |
LDA TRACK |
STA 0,X |
LDA SECTOR |
INCA |
CMPA #RMAXSEC+1 last sector on track? |
BNE DFL3 |
INC 0,X |
LDA #1 |
DFL3 STA 1,X |
LDA TRACK |
LDB SECTOR |
JSR WRITSC |
INC SECTOR |
LDA SECTOR |
CMPA #RMAXSEC+1 |
BNE DFL2 |
LDA #1 |
STA SECTOR |
INC TRACK |
LDA TRACK |
CMPA #RMAXTRK |
BNE DFL2 |
* break free chain at last track/sector |
LDX #BUFFER |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
JSR READSC |
LDX #BUFFER |
CLR 0,X |
CLR 1,X |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
JSR WRITSC |
* set up sector structure, SIR, directory etc |
LDX #BUFFER |
CLRA |
LDB #RMAXSEC |
JSR READSC |
LDX #BUFFER |
CLR 0,X break end of directory chain |
CLR 1,X |
CLRA |
LDB #RMAXSEC |
JSR WRITSC |
* |
LDX #BUFFER |
CLRA |
LDB #3 set up SIR |
JSR READSC |
LDX #BUFFER |
CLR 0,X break forward link |
CLR 1,X |
* |
PSHS Y |
LDY #VOLMSG |
LDB #16 |
DFL4 LDA ,Y+ |
STA B,X |
INCB |
CMPB #24 |
BNE DFL4 |
PULS Y |
* |
CLRA |
LDB DRVNUM volume number |
STD 27,X |
* |
LDD #$0101 first trk/sec 01-01 |
STD 29,X |
LDA #RMAXTRK-1 |
LDB #RMAXSEC |
STD 31,X |
STD 38,X |
LDD #RTOTSEC total DATA sectors (2912-14) |
STD 33,X |
* |
LDA #01 month set default creation date (SYS09's birthday!) |
STA 35,X |
LDA #07 day |
STA 36,X |
LDA #07 year |
STA 37,X |
* |
RF3 CLRA |
LDB #3 |
JSR WRITSC |
* |
* Not sure what this is about |
* put bootstrap on track 0 sector 1 |
* |
* LDX #BUFFER |
* CLRA |
* LDB #1 |
* JSR READSC |
* LDX #BUFFER |
* LDA #$AA set the init flag |
* STA 0,X |
* LDA #$55 |
* STA 1,X |
* CLRA |
* LDB #1 |
* JSR WRITSC |
* |
* Write Boot sector |
* |
LDX #BOOT |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
LBSR WRITSC |
* |
UFEXIT LDX #UFMSG1 |
JMP PDATA1 |
* |
* ACIA INPUT TEST |
* |
INTEST LDA ACIAC1 |
BITA #$01 |
RTS |
* |
* RESET ACIA |
* |
ACIRST LDA #$03 master reset |
STA ACIAC1 |
LDA #$11 |
STA ACIAC1 |
RTS |
* |
* ACIA INPUT |
* |
INTER LDA #16 |
STA DELCNT+0 |
CLR DELCNT+1 |
CLR DELCNT+2 |
INTER0 LDA ACIAC1 |
BITA #$01 |
BNE INTER1 |
BITA #$78 |
BEQ INTER2 |
BSR ACIRST |
BRA INTER |
* |
INTER1 LDA ACIAD1 |
ANDCC #$FF-VFLAG |
RTS |
* |
INTER2 DEC DELCNT+2 |
BNE INTER0 |
DEC DELCNT+1 |
BNE INTER0 |
DEC DELCNT+0 |
BNE INTER0 |
CLRA |
ORCC #VFLAG |
RTS |
* |
* ACIA OUTPUT |
* |
OUTTER PSHS A |
* |
OUTTE1 LDA ACIAC1 |
BITA #$02 |
BNE OUTTE2 |
BITA #$78 |
BEQ OUTTE1 |
BSR ACIRST |
BRA OUTTE1 |
* |
OUTTE2 PULS A |
STA ACIAD1 |
RTS |
* |
* Print Data |
* |
PDATA0 BSR OUTTER |
PDATA1 LDA ,X+ |
CMPA #$04 |
BNE PDATA0 |
RTS |
* |
* |
** 'UX' Xmodem IDE Disk upload |
* |
UXMES0 FCB $0D,$0A |
FCC 'Xmodem IDE Disk Upload' |
FCB 4 |
UXMES1 FCB $0D,$0A |
FCC 'Upload Complete' |
FCB 4 |
UXMES2 FCB $0D,$0A |
FCC 'Upload Error' |
FCB 4 |
UXMSG3 FCB $0D,$0A |
FCC 'Drive Number :' |
FCB 4 |
UXMSG4 FCB $0D,$0A |
FCC 'Are You Sure ? (Y/N)' |
FCB 4 |
* |
* Print Banner |
* |
UXSUB LDX #UXMES0 |
LBSR PDATA1 |
* |
* Prompt for Disk drive number (0 to 3) |
* |
LDX #UXMSG3 |
LBSR PDATA1 |
UXSUB1 LBSR INTER |
BVS UXSUB1 |
LBSR OUTTER |
CMPA #'0 |
LBLO UXEXIT |
CMPA #'3 |
LBHI UXEXIT |
SUBA #'0 |
STA DRVNUM |
* |
* Report selected drive |
* |
LDX #UXMSG3 |
LBSR PDATA1 |
LDA DRVNUM |
ADDA #'0 |
LBSR OUTTER |
* |
* Ask for confirmation (Y/N) |
* |
LDX #UXMSG4 |
LBSR PDATA1 |
UXSUB2 LBSR INTER |
BVS UXSUB2 |
LBSR OUTTER |
ANDA #$5F |
CMPA #'N |
LBEQ UXEXIT |
CMPA #'Y |
BNE UXSUB |
* |
* We have confirmation ... now load the disk image |
* |
LBSR INITDR |
LDU #XSTST |
STU XSTATE |
LDA #1 |
STA BLKNUM |
* |
* Sector1 |
* |
LDX #BUFFER |
* |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
LBSR XACK |
* |
* Sector 2 |
* |
LDX #BUFFER |
* |
LDA TRACK |
LDB SECTOR |
INCB |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
* |
LBSR XACK |
* |
* Sector 3 - SIR |
* |
LDX #BUFFER |
* |
LDA TRACK |
LDB SECTOR |
INCB |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA 38,X |
INCA |
STA MAXTRK |
LDB 39,X |
INCB |
STB MAXSEC |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
* |
LBSR XACK |
* |
* Sector 4 to Last Track & Sector |
* |
* |
LDA TRACK |
LDB SECTOR |
INCB |
* |
UXLOOP LDX #BUFFER |
STA TRACK |
STB SECTOR |
* |
LBSR XREAD |
LBCS UXERR |
LBSR XACK |
LBSR XREAD |
LBCS UXERR |
* |
LDX #BUFFER |
LDA TRACK |
LDB SECTOR |
LBSR WRITSC |
LBSR XACK |
* |
LDA TRACK |
LDB SECTOR |
INCB |
CMPB MAXSEC |
BNE UXLOOP |
LDB #1 |
INCA |
CMPA MAXTRK |
BNE UXLOOP |
* |
* |
* Write Boot sector |
* |
LDX #BOOT |
CLRA TRACK 0 |
LDB #$01 SECTOR 1 |
STA TRACK |
STB SECTOR |
LBSR WRITSC |
* |
UXEXIT LDX #UXMES1 |
JMP PDATA1 |
* |
UXERR LDX #UXMES2 |
LBRA PDATA1 |
* |
* Get a Byte using XModem protocol |
* Carry clear => no errors |
* Carry set => errors |
* |
XREAD PSHS U |
LDU XSTATE |
* |
XBYTE0 LBSR INTER |
BVC XBYTE1 |
LDA #NAK |
LBSR OUTTER |
LDU #XSTST |
BRA XBYTE0 |
* |
XBYTE1 JSR ,U |
BNE XBYTE0 |
STU XSTATE |
PULS U,PC |
* |
* START - LOOK FOR SOH (START OF HEADER) = $01 |
* |
XSTST CMPA #SOH |
BNE XSTST1 |
LDU #XSTBL |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
XSTST1 CMPA #EOT |
BNE XSTST2 |
LDA #ACK |
LBSR OUTTER |
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
RTS |
* |
XSTST2 CMPA #CAN |
BNE XSTST3 |
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
RTS |
* |
XSTST3 ANDCC #$FF-CFLAG-ZFLAG |
RTS |
* |
* Got SOH |
* Now get block number |
* |
XSTBL CMPA BLKNUM |
BNE XSTBLE |
LDU #XSTCOM |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Error in block number |
* |
XSTBLE LDA #NAK |
LBSR OUTTER |
LDU #XSTST |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Get complement of block number |
* |
XSTCOM COMA |
CMPA BLKNUM |
BNE XSTBLE |
CLR CHKSUM |
LDA #128 |
STA BYTCNT |
LDU #XSTDA |
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
RTS |
* |
* Get data bytes |
* |
XSTDA PSHS A |
ADDA CHKSUM |
STA CHKSUM |
PULS A |
DEC BYTCNT |
BNE XSTDA1 |
LDU #XSTCK |
XSTDA1 STA ,X+ |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
* Byte count reached zero |
* Check checksum byte |
* |
XSTCK CMPA CHKSUM |
BNE XSTCK1 retry if wrong checksum |
* |
* Checksum OK ... |
* increment block number |
* Don't send ACK until data written to CF |
* |
INC BLKNUM |
LDU #XSTST |
ANDCC #$FF-CFLAG No abort |
ORCC #ZFLAG Valid data (exit) |
RTS |
* |
* Checksum Error detected ... |
* Reset Sector counter in ACCB to last 128 byte boundary |
* and send NAK |
* |
XSTCK1 PSHS B |
TFR X,D |
DECB |
ANDB #128 |
TFR D,X |
PULS B |
LDA #NAK |
XSTCK2 LBSR OUTTER |
LDU #XSTST |
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
RTS |
* |
* Acknowledge Data Received |
* |
XACK PSHS A |
LDA #ACK |
LBSR OUTTER |
PULS A,PC |
* |
* |
** FLEX 9 IDE DISK DRIVERS |
* |
* FOR SYS09BUG 1.2 ON THE XSA-3S1000 |
* WITH I/O MAPPED AT $XE000 |
* AND ROM MAPPED AT $XF000 |
* |
* |
* INITIALIZE CF CARD FOR 8 BIT LBA MODE |
* |
INITDR LDD #AUXRESET |
STD CF_AUX |
LDD #AUXRSTREL |
STD CF_AUX |
LDD #HEADLBA |
STD CF_HEAD |
LBRA WTRDY |
* |
* RESTORE DISK DRIVER (SEEK TRACK 00) |
* |
RESTR1 BSR DRVSEL |
CLRA ; Track 0 |
LDB #$01 ; Sector 1 |
* |
* Seek track and sector |
* A holds track number (0 - ??) |
* B holds sector number (1 - ??) |
* Sector numbers starts from 1 |
* subtract 1 to start from sector 0 on CF |
* |
SEEKTS PSHS A |
CLRA |
DECB |
STD CF_SECNUM |
LDB ,S |
STD CF_CYLLO |
LDB DRVNUM |
STD CF_CYLHI |
LDB #$01 |
STD CF_SECCNT |
CLRB |
PULS A,PC |
* |
* READ SECTORS FROM CF |
* |
* |
READSC BSR SEEKTS |
LDD #CMDREAD ; IDE READ MULTIPLE |
STD CF_COMAND |
LBSR WTRDY |
* |
* READ LOOP |
* |
PSHS Y |
LDY #256 |
RDLP1 LBSR WTDRQ |
LDD CF_DATA |
STB ,X+ |
LEAY -1,Y |
BNE RDLP1 |
PULS Y |
* |
LBSR WTRDY |
CLRB |
RTS |
* |
* WRITE SECTOR TO CF |
* |
WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR |
LDD #CMDWRITE ; IDE WRITE MULTIPLE |
STD CF_COMAND |
LBSR WTRDY |
* |
* WRITE LOOP |
* |
PSHS Y |
LDY #256 |
CLRA |
WRTLP1 LBSR WTDRQ |
LDB ,X+ |
STD CF_DATA |
LEAY -1,Y |
BNE WRTLP1 |
PULS Y |
* |
LBSR WTRDY |
CLRB |
RTS |
* |
* DRIVE SELECT DISK DRIVER |
* |
DRVSEL LDA 3,X GET DRIVE # FROM FCB |
CMPA #3 |
BLS DRVS2 IF > 3, SET IT TO 0 |
CLRA |
DRVS2 STA DRVNUM |
CLRB ; SET Z, CLEAR C |
RTS |
* |
* CHECK DRIVE READY DISK DRIVER |
* |
CHKDRV LDA 3,X |
CLRB ; CLEAR C, SET Z |
RTS |
******************************************************* |
* |
* Bootstrap FLEX Loader |
* |
* SBUG1.8 loads the bootstap loader at $C000 |
* however the Flex adaption manual has the |
* bootstrap loader residing at $C100 |
* Bootstrap Loader is position independent code |
* |
****************************************************** |
* |
* Equates |
* |
BSSTACK EQU $C0FF |
SCTBUF EQU $C300 |
* |
* Start of Utility |
* |
ORG MONEXT+$0700 |
BOOT BRA BLOAD0 |
FCB 0,0,0 |
TRK FCB 0 File start track |
SCT FCB 0 File start sector |
DNS FCB 0 Density Flag (not used) |
TADR FDB $C000 Transfer address |
LADR FDB 0 Load Address |
DRNUM FCB 0 Drive number 0 |
* |
BLOAD0 LDS #BSSTACK Set up Bootstrap stack |
LDD TRK,PCR Set up start track and sector |
STD SCTBUF |
LDY #SCTBUF+256 |
* |
* Perform actual file load |
* |
BLOAD1 BSR GETCH Get acharcater |
CMPA #$02 Data record hearder ? |
BEQ BLOAD2 Skip, is so |
CMPA #$16 Xfr address hearder ? |
BNE BLOAD1 Loop if neither |
* |
* Get transfer address |
* |
BSR GETCH |
STA TADR,PCR |
BSR GETCH |
STA TADR+1,PCR |
BRA BLOAD1 |
* |
* Load data record |
* |
BLOAD2 BSR GETCH Get load address |
STA LADR,PCR |
BSR GETCH |
STA LADR+1,PCR |
BSR GETCH Get Bytes count |
TFR A,B |
TSTB |
BEQ BLOAD1 Loop if count = 0 |
LDX LADR,PCR Get load address |
BLOAD3 PSHS B,X |
BSR GETCH Get data character |
PULS B,X |
STA ,X+ Store at load address |
DECB |
BNE BLOAD3 Loop until count = 0 |
BRA BLOAD1 |
* |
* Get Character routine |
* Reads a sector if needed |
* |
GETCH CMPY #SCTBUF+256 out of data ? |
BNE GETCH4 Go read Character if not |
GETCH2 LDX #SCTBUF Point to buffer |
LDD 0,X Get forward Link |
BEQ GOFLEX if zero, file is loaded |
BSR READ Read next sector |
BNE BOOT start over if error |
LDY #SCTBUF+4 Point past link |
GETCH4 LDA ,Y+ Else, get a character |
RTS |
* |
* File is loaded, Jump to it |
* |
GOFLEX JMP [TADR,PCR] Jump to transfer address |
|
* |
** FLEX 9 IDE DISK DRIVERS |
* |
* Seek track and sector |
* A holds track number (0 - ??) |
* B holds sector number (1 - ??) |
* Sector numbers starts from 1 |
* subtract 1 to start from sector 0 on CF |
* |
SEEK PSHS A |
CLRA |
DECB |
STD CF_SECNUM |
LDB ,S |
STD CF_CYLLO |
LDB DRNUM,PCR |
STD CF_CYLHI |
LDB #$01 |
STD CF_SECCNT |
CLRB |
PULS A,PC |
* |
* READ SECTORS FROM CF |
* |
* |
READ BSR SEEK |
LDD #CMDREAD ; IDE READ MULTIPLE |
STD CF_COMAND |
BSR WTRDY |
* |
* READ LOOP |
* |
PSHS Y |
LDY #256 |
READ1 BSR WTDRQ |
LDD CF_DATA |
STB ,X+ |
LEAY -1,Y |
BNE READ1 |
PULS Y |
* |
BSR WTRDY |
CLRB |
RTS |
* |
* WAIT UNTIL READY |
* |
WTRDY LDD CF_STATUS |
BITB #BUSY |
BNE WTRDY |
LDD CF_STATUS |
BITB #DRDY |
BEQ WTRDY |
RTS |
* |
* WAIT FOR DATA REQUEST |
* |
WTDRQ LDD CF_STATUS |
BITB #DRQ |
BEQ WTDRQ |
RTS |
* |
END |
/sys09s3s.sh
0,0 → 1,2
../../Tools/as09/as09.exe sys09s3s.txt -l > sys09s3s.lst |
../../Tools/epedit/epedit.exe sys09s3s.aux |
/SYS09ADS.S19
0,0 → 1,61
S123F800F822F856FC66FC60FC75FC83FB58FAE7FAE3FF06FE47FE09FE33FCABFCC0FC9844 |
S123F820FC858EFE81108EDFC0C610A680A7A05A26F98EE400BFDFD0170142C60C6FE25A86 |
S123F84026FB308CDDAF6A86D0A7E41F431704468EFE911703028EFEBA1702871704078468 |
S123F8607F810D27F11F8981202C09865E1704131F988B4017040C170407C1602F02C020D2 |
S123F8808EFE4BE180270F30028CFE8126F58EFEBC1702C420C0AD9420BC1F343B17033F95 |
S123F8A0292D1F128EFEC21702391F211703791703CFA6A41703791703C71703322811819D |
S123F8C00827E1811827DD815E2717810D260F39A7A4A1A427081703A8863F1703A5312107 |
S123F8E020C2313F20BE1702761F328EDFC0301F20051702DF29063420ACE12401391F10BE |
S123F900C30010C4F034061F20C4F01F01ACE42705170361270332623934108EFEC2170137 |
S123F920C2AEE4170302170356C610A68017030017034E5A26F5170346AEE1C610A6808184 |
S123F940202504817E2302862E1703375A26EE20BC17028B291E8CDFC0241A34108EFFFFC3 |
S123F9608D553510270FA684813F2709A7A0AFA4863FA78439170309863F160306108EDFC5 |
S123F980D3C6088D185A26FB391F43AE4A301F8D262704AF4A8D0617021C16FEB9AE218CF9 |
S123F9A0DFC0240AA684813F2604A6A4A78486FFA7A0A7A0A7A039108EDFD3C608A6A0AC4A |
S123F9C0A127045A26F739313D397DE0187FE0148E000030018C000026F9860FB7E0188DDD |
S123F9E037F6E018C50126F98601B7E01A8D29868CB7E0188D228EC0002009C5022705B67B |
S123FA00E01BA780F6E018C50126F0C52C2701398EC000AF4A1F343BC6045A26FD39340417 |
S123FA20C6205A26FD3584BDFC9886111702547FDFD2170226815326F917021F8139273D99 |
S123FA40813126F11701A83402292617019129213410E6E0EBE0EBE46AE46AE43404170111 |
S123FA608E3504290C3402EBE06AE42705A78020EB5F3502C1FF27BA863F17020673DFD29A |
S123FA8086131601FE6FE217014A3430294DAC6225493001AFE4BDFC9886121701E5ECE431 |
S123FAA0A3622706108300202302C620E7648EFF0317002FCB031F98170175AE621701688F |
S123FAC0EB62EB63EB84A6801701656A6426F5531F9817015BAF62ACE426C386141701A330 |
S123FAE03265398D02207134108EFEB4170069359016018D1600F81600E51700918DF28DE8 |
S123FB00F62902AF4A398D618DE78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD1E2 |
S123FB208DD52902AF44398D498DC68DC72902A743398D6C8DBB8DBC2902A742398D588DF4 |
S123FB40B08DB12902A741398D5F8DA58DA629048A80A7C43917012BA680810426F7398E69 |
S123FB60FEC68DF41F311600BF8EFED28DEAAE4820F48EFEE48DE1A6431600B48EFEDE8DB0 |
S123FB80D7AE4420E18EFED88DCEAE4620D88EFECC8DC5AE4A20CF8EFEEA8DBCA64120D9BC |
S123FBA08EFEEF8DB3A64220D08EFEF48DAAA6C48EFEFB1600908EFEC217FF278DA18DA971 |
S123FBC08DB08DB88DBF8EFEC217FF178DC08DC78DCE20D58D09294D1F12862D1700A48DAF |
S123FBE00E29421F018D08293C3410A76135908D112932484848481F898D0729283404ABD4 |
S123FC00E0398D578130251D8139220380303981412512814622038037398161250781665E |
S123FC2022038057391A0239341035028D0235023402444444448D043502840F8B308139DF |
S123FC402F028B07203D3402C608A68068E42502862D8D2F8D2B5A26F135827DDFD2270639 |
S123FC608D04847F201D3410BEDFD0A684850127F7A60135903402A69FDFD0850135828DD0 |
S123FC800086208D3B3412BEDFD0A684850227FA3502A70135908D13BEDFD08603A7848682 |
S123FCA011A7846D0186FFB7DFD2398E0000BFDFEBBFDFEF8EE800BFDFED861B8D028659BC |
S123FCC03416BEDFEDE684C47FE7847DDFF027048D5E2010812024048D152008BEDFEDA7DE |
S123FCE0841700E9BEDFEDE684CA80E7843596810810270027811B10270052810D10270037 |
S123FD00B4810A264FFCDFEB5CC110102600AA1600CCFCDFEB5D273C5A16009DB6DFEB273C |
S123FD20334A160091B6DFEB4C81402727160086F6DFF0C13D271E8159102700B881542757 |
S123FD405D8145273B8152272C813D2604B7DFF0397FDFF0397DDFEF2604B7DFEF397FDF35 |
S123FD60F08020813F22EDF6DFEF7FDFEFC020C10F22E120448D3EF6DFECC10F277A20617A |
S123FD808D33F6DFECC10F27158EEBC0A682A78840A6890400A7890440BCDFED26EEB6DF2A |
S123FDA0EBBEDFEDC620E7890400E7804C814026F57FDFF0394FF6DFECFDDFEB86403DFB85 |
S123FDC0DFEB8900C3E800FDDFED1F0139FCDFEB4C814026E44F5CC11026DE5A8DDB8EE86A |
S123FDE000A6890440A7890400A68840A7808CEBC026EE2003BEDFED8620A7890400A780CA |
S123FE008CEC0026F57FDFF0393404CC0C04FDE404C604F7E4045C26FDB7E404862AB7E4B9 |
S123FE2007CCFF2EFDE406861B8D0886438D04864235043404F6E406F6E404C51027065DF1 |
S123FE402BF6B7E40635847DE4073901FB3D02FB3203FB4804FB2710FAFA15FB0618FB1C65 |
S123FE6019FB1142F95145F8F247F89A4CFA2750FA854DF89D52FBB653F8E658F97D44F968 |
S123FE80CAF989F89CF89CF89CF89CF989FFFFFFFF0D0A0000005359533039425547203196 |
S123FEA02E3420464F52204144533638303920202D20044B0D0A000000043E045748415499 |
S123FEC03F04202D2004202053503D04202050433D04202055533D04202049593D042020A6 |
S123FEE049583D04202044503D042020413D042020423D04202043433A2004454648494EF4 |
S123FF005A56435331043910CEDFC05F53F7DFD216F90F6E9FDFC06E9FDFC46E9FDFC66EB8 |
S123FF209FDFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE22A9 |
S114FF40083410ECC4AE446EF1371FEE426E9FDFC22B |
S113FFF0FF13FF27FF17FF1BFF1FFF23FF13FF073D |
S9030000FC |
/sys09s3e_b16.vhd
0,0 → 1,64
INIT_00 => x"A780A610C6C07F8E1060FE8EE1FE0DFB11FB82FBBDFCA8FC8AFC90FC4BF814F8", |
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC6450117D07FBF00E08EF9265AA0", |
INIT_02 => x"092C2081891FF1270D817F843C0417BC021795FE8EDE01173A031770FE8E8E04", |
INIT_03 => x"FE8C02300F2780E12AFE8E20C0022F60C14C0417510417408B981F5804175E86", |
INIT_04 => x"1F6E02179DFE8E121F2D297403173B341FBC2094ADC020F9021797FE8EF52660", |
INIT_05 => x"17275E81DD271881E127088111286703170C0417AE0317A4A6140417AE031721", |
INIT_06 => x"321FAB0217BE203F31C2202131EA03173F86ED03170827A4A1A4A7390F260D81", |
INIT_07 => x"F0C4201F0634F0C41000C3101F390124E1AC2034062914031705201F30C07F8E", |
INIT_08 => x"10C69B0317370317E4AEF701179DFE8E103439623203279F03170527E4AC011F", |
INIT_09 => x"03172E8602237E810425208180A610C6E1AE8B0317F5265A93031735031780A6", |
INIT_0a => x"273F8184A60F2710355B8DFFFF8E10341A24C07F8C1E29C00217BC20EE265A7C", |
INIT_0b => x"431F39FB265A1E8D08C6D37F8E104B03163F864E03173984A73F86A4AFA0A709", |
INIT_0c => x"A60A24C07F8C21AEB3FE16ED7FBF00008E5102170C8D4AAF04272C8D1F304AAE", |
INIT_0d => x"265A0427A1ACA0A608C6D37F8E1039A0A7A0A7A0A7FF8684A7A4A604263F8184", |
INIT_0e => x"7FBFE7F98EEB7FBFC07FBEED7FBF1429390217EE02171C295F0117393D3139F7", |
INIT_0f => x"27ED7FBE24273F8184A64AAEEC011770E0B671E0B73686431F392020450017C0", |
INIT_10 => x"3B71E0B73F8673E0B7368670E0B671E0B7368670E0B70D86341FED7FBF1F301F", |
INIT_11 => x"B7368672E0B7008670E0B7FF8673E0B73A8671E0B7328622FE16C07FBFEB7FBE", |
INIT_12 => x"81260217D27F7F6402171186D2FCBD8435FD265A20C604343973E0B73E8671E0", |
INIT_13 => x"E0EBE0E61034212991011726290234A80117F12631813D2739811F0217F92653", |
INIT_14 => x"FFC102355FEB2080A70527E46AE0EB02340C2904358E01170434E46AE46AE4EB", |
INIT_15 => x"E4AF0130492562AC4D2930344A0117E26F0E02161386D27F731602173F86BA27", |
INIT_16 => x"03CB2F0017DEFE8E64E720C6022320008310062762A3E4ECF501171286D2FCBD", |
INIT_17 => x"AF5B0117981F53F526646A65011780A684EB63EB62EB68011762AE750117981F", |
INIT_18 => x"00169D011690356900178FFE8E10347120028D396532B301171486C326E4AC62", |
INIT_19 => x"8DDC8D728D3948AF0229EB8DE78D618D394AAF0229F68DF28D910017E50016F8", |
INIT_1a => x"BB8D6C8D3943A70229C78DC68D498D3944AF0229D58DD18D5E8D3946AF0229E0", |
INIT_1b => x"1739C4A7808A0429A68DA58D5F8D3941A70229B18DB08D588D3942A70229BC8D", |
INIT_1c => x"8DBFFE8EF42048AEEA8DADFE8EBF0016311FF48DA1FE8E39F726048180A63B01", |
INIT_1d => x"204AAEC58DA7FE8ED82046AECE8DB3FE8EE12044AED78DB9FE8EB4001643A6E1", |
INIT_1e => x"900016D6FE8EC4A6AA8DCFFE8ED02042A6B38DCAFE8ED92041A6BC8DC5FE8ECF", |
INIT_1f => x"098DD520CE8DC78DC08D17FF179DFE8EBF8DB88DB08DA98DA18D27FF179DFE8E", |
INIT_20 => x"4848483229118D903561A710343C29088D011F42290E8DB400172D86121F4D29", |
INIT_21 => x"22468112254181393080032239811D253081578D39E0AB04342829078D891F48", |
INIT_22 => x"4444444402340235028D0235103439021A395780032266810725618139378003", |
INIT_23 => x"3B8D3F8D2D860225E46880A608C602344D20078B022F3981308B0F840235048D", |
INIT_24 => x"84A620E08E0926018584A6D07FBE10342D207F84048D0627D27F7D8235F1265A", |
INIT_25 => x"34458D2086008D8235018520E0B605260185D07F9FA60234903501A6EE270185", |
INIT_26 => x"86016D84A7118684A70386D07FBE138D903501A70235FA27028584A6D07FBE12", |
INIT_27 => x"1B86F27F7F01E702C6F17FFD04E703E702A7EF7FFD0000CC30E08E39D27FB7FF", |
INIT_28 => x"35C5001784A70520098D042420810D20748D0427F27F7D30E08E16345986028D", |
INIT_29 => x"81990027100D814500271016818E0027101A816C0027101B8141002710088196", |
INIT_2a => x"5DEF7FFC9900168300261019C15CEF7FFC51260A81110027100B812C0027100C", |
INIT_2b => x"00CC5B00162500271050814CEF7FB66800164A3327EF7FB67400165A3C002710", |
INIT_2c => x"F27F7F39F27FB704263D81312754816E002710598116273DC1F27FF658001600", |
INIT_2d => x"20E12218C120C0F17F7FF17FF6ED224F812080F27F7F39F17FB70426F17F7D39", |
INIT_2e => x"A7EF7FFDF07FF64F39F27F7FF726508102A74C84E720C6EF7FB6168D0000CC1B", |
INIT_2f => x"F604E75F012519C15C04E6E78D5AEA2619C15C4FF02650814CEF7FFC3903E702", |
INIT_30 => x"E4205F03E7F07FF7082719C15CF07FF6F42650C15C84A702E7EF7FF72086EF7F", |
INIT_31 => x"1946FB1830FB1524FB1051FB0472FB035CFB0267FB0139F27FF702E7EF7FF75F", |
INIT_32 => x"C5F95472F958DBF853E0FB5292F84DAFFA5051FA4C8FF847E7F84546F9423BFB", |
INIT_33 => x"2E312047554239305359530000000A0DFFFFFFFF7EF991F891F891F891F87EF9", |
INIT_34 => x"202D20043F54414857043E040000000A0D4B04202D202045335320524F462034", |
INIT_35 => x"20043D58492020043D59492020043D53552020043D43502020043D5053202004", |
INIT_36 => x"315343565A4E4948464504203A43432020043D422020043D412020043D504420", |
INIT_37 => x"9F6EC87F9F6EC67F9F6EC47F9F6EC07F9F6E26F916D27FF7535FC07FCE103904", |
INIT_38 => x"C4EC10340822CE7FBC8B300F27FFFF8CCC7FBE49584F4AAF80E64AAE431FCA7F", |
INIT_39 => x"0000000000000000000000000000000000000000C27F9F6E42EE1F37F16E44AE", |
INIT_3a => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_3b => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_3c => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_3d => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_3e => x"0000000000000000000000000000000000000000000000000000000000000000", |
INIT_3f => x"E2FEEEFEFEFEFAFEF6FEF2FE02FFEEFE00000000000000000000000000000000" |
/sys09ads.txt
0,0 → 1,5
NAM SYS09BUG FOR ADS6809 |
INCLUDE "opt_ads.txt" |
INCLUDE "sys09equ.txt" |
INCLUDE "sys09bug.txt" |
END |
/sys09s3e.aux
0,0 → 1,6
t m |
l SYS09S3E.S19 |
t h |
s sys09s3e_b16.vhd f800 ffff |
q |
|
/sys09s3s.txt
0,0 → 1,5
NAM SYS09BUG FOR SPARTAN 3 STARTER |
INCLUDE "opt_s3s.txt" |
INCLUDE "sys09equ.txt" |
INCLUDE "sys09bug.txt" |
END |
/SYS09SWT.S19
0,0 → 1,60
S123F800F814F861FD25FD1FFD34FD42FC17FBA6FBA2FAB68EFD9F108EDFC0C610A680A7C6 |
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2 |
S123F84005118EFDAF1703CF8EDFD04FC60D6D8527038B04195A2AF61704948EFDCF1703AB |
S123F860B68EFDD617033B1704BB847F810D27F11F8981202C09865E1704C71F988B4017BC |
S123F88004C01704BBC1602F02C0208EFD66E180270F30028CFD9F26F58EFDD81703782086 |
S123F8A0C0AD9420BC1F343B1703F3292D1F128EFDDE1702ED1F2117042D170483A6A4174F |
S123F8C0042D17047B1703E62811810827E1811827DD815E2717810D260F39A7A4A1A42726 |
S123F8E00817045C863F170459312120C2313F20BE17032A1F328EDFC0301F2005170393E7 |
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE42705170415275F |
S123F9200332623934108EFDDE170276AEE41703B617040AC610A6801703B41704025A26C9 |
S123F940F51703FAAEE1C610A68081202504817E2302862E1703EB5A26EE20BC17033F299C |
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2 |
S123F9801703BD863F1603BA108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4AED |
S123F9A08D061702D016FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A78F |
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D397DE0187FE0148E0000300160 |
S123F9E08C000026F9860FB7E0188D37F6E018C50126F98601B7E01A8D29868CB7E0188D41 |
S123FA00228EC0002009C5022705B6E01BA780F6E018C50126F0C52C2701398EC000AF4A1B |
S123FA201F343BC6045A26FD3986DEB7F02486FFB7F014B7F010B7F015B7F0167DF0108612 |
S123FA40D8B7F020170096B6F0202BFB8609B7F020170089B6F020850126F9851026CA8EF6 |
S123FA60C0008D528A10B7F0401F104353FDF0008EFEFFBFF00286FFB7F01086FEB7F014F9 |
S123FA808601B7F022868CB7F0208D515F34045F7DF0102A0A5A26F835045A26F0208A35B4 |
S123FAA004B6F020851C270139C6DEF7F0248EC000AF4A1F343B3436A66244444444108ED2 |
S123FAC0DFD0E6A654545454E7E4E6A65358585858A662840FA762EA62E76235B63404C66B |
S123FAE0205A26FD3584BDFD5386111702547FDFE2170226815326F917021F8139273D8152 |
S123FB003126F11701A83402292617019129213410E6E0EBE0EBE46AE46AE4340417018E43 |
S123FB203504290C3402EBE06AE42705A78020EB5F3502C1FF27BA863F17020673DFE286D1 |
S123FB40131601FE6FE217014A3430294DAC6225493001AFE4BDFD5386121701E5ECE4A397 |
S123FB60622706108300202302C620E7648EFE1F17002FCB031F98170175AE62170168EB6B |
S123FB8062EB63EB84A6801701656A6426F5531F9817015BAF62ACE426C386141701A33228 |
S123FBA065398D02207134108EFDD0170069359016018D1600F81600E51700918DF28DF648 |
S123FBC02902AF4A398D618DE78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18D8B |
S123FBE0D52902AF44398D498DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB011 |
S123FC008DB12902A741398D5F8DA58DA629048A80A7C43917012BA680810426F7398EFD5B |
S123FC20E28DF41F311600BF8EFDEE8DEAAE4820F48EFE008DE1A6431600B48EFDFA8DD7A8 |
S123FC40AE4420E18EFDF48DCEAE4620D88EFDE88DC5AE4A20CF8EFE068DBCA64120D98EF2 |
S123FC60FE0B8DB3A64220D08EFE108DAAA6C48EFE171600908EFDDE17FF278DA18DA98D42 |
S123FC80B08DB88DBF8EFDDE17FF178DC08DC78DCE20D58D09294D1F12862D1700A48D0E52 |
S123FCA029421F018D08293C3410A76135908D112932484848481F898D0729283404ABE041 |
S123FCC0398D578130251D813922038030398141251281462203803739816125078166225C |
S123FCE0038057391A0239341035028D0235023402444444448D043502840F8B3081392F12 |
S123FD00028B07203D3402C608A68068E42502862D8D2F8D2B5A26F135827DDFE227068D0A |
S123FD2004847F201D3410BEDFE0A684850127F7A60135903402A69FDFE0850135828D007C |
S123FD4086203412BEDFE0A684850227FA3502A7013590BEDFE08603A7848611A7846D015F |
S123FD6086FFB7DFE23901FBFC02FBF103FC0704FBE610FBB915FBC518FBDB19FBD042F9D2 |
S123FD805C45F8FD47F8A54CFAE650FB444DF8A852FC7553F8F158F98844F9D555FA29F9E2 |
S123FDA094F8A7F8A7F8A7F8A7F994FFFFFFFF0D0A000000535953303942554720312E3496 |
S123FDC020464F5220535754504320202D20044B0D0A000000043E04574841543F04202D6A |
S123FDE02004202053503D04202050433D04202055533D04202049593D04202049583D0435 |
S123FE00202044503D042020413D042020423D04202043433A2004454648494E5A56435370 |
S105FE203104A7 |
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6 |
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9 |
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E |
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26 |
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02 |
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC |
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0 |
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294 |
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB |
S9030000FC |
/sys09b5x.aux
0,0 → 1,9
t m |
l SYS09B5X.S19 |
t h |
s sys09b5x_b4_0.vhd f800 f9ff |
s sys09b5x_b4_1.vhd fa00 fbff |
s sys09b5x_b4_2.vhd fc00 fdff |
s sys09b5x_b4_3.vhd fe00 ffff |
q |
|
/sys09s3e.lst
0,0 → 1,2774
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 NAM SYS09BUG FOR SPARTAN 3E STARTER |
0000 INCLUDE "opt_s3e.txt" |
0001 * |
0002 *************************************************** |
0003 * OPTION SWITCHES |
0004 *************************************************** |
0005 * |
0006 * |
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
0009 ** FOR LOADING AND SAVING S1 RECORDS |
0010 * |
0011 00FF S3EOPT EQU $FF SPARTAN3E STARTER |
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
0017 * |
0002 END |
0000 INCLUDE "sys09equ.txt" |
0001 * |
0002 *************************************************** |
0003 * MEMORY MAP EQUATES * |
0004 *************************************************** |
0005 E000 MONIO EQU $E000 I/O SPACE |
0006 IFD S3EOPT |
0007 7FC0 MONRAM EQU $7FC0 |
0008 ELSE |
0009 MONRAM EQU $DFC0 STACK SPACE |
0010 ENDIF S3EOPT |
0010 ENDIF S3EOPT |
0011 F800 MONROM EQU $F800 START OF ROM |
0012 IFD S3SOPT |
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0014 EXTCMD EQU $00 EXTENDED OFFSET |
0015 ENDIF S3SOPT |
0015 ENDIF S3SOPT |
0016 IFD XESOPT |
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0018 EXTCMD EQU $00 EXTENDED OFFSET |
0019 ENDIF XESOPT |
0019 ENDIF XESOPT |
0020 *************************************************** |
0021 |
0022 IFD S3EOPT |
0023 * |
0024 * DIGILENT SPARTAN 3E STARTER |
0025 * |
0026 00FF ACIAOPT EQU $FF ACIA AT PORT 0 |
0027 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0028 00FF VDUOPT EQU $FF VDU AT $E030 |
0029 00FF TRAOPT EQU $FF PIA TRACE TIMER |
0030 ENDIF S3EOPT |
0031 * |
0032 IFD S3SOPT |
0033 * |
0034 * DIGILENT SPARTAN 3 STARTER |
0035 * |
0036 ACIAOPT EQU $FF ACIA AT PORT 0 |
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0038 VDUOPT EQU $FF VDU AT $E030 |
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0041 EXTOPT EQU $FF EXTENDED COMMANDS |
0042 ENDIF S3SOPT |
0042 ENDIF S3SOPT |
0043 * |
0044 IFD B5XOPT |
0045 * |
0046 * BURCHED B5-X300 |
0047 * |
0048 ACIAOPT EQU $FF ACIA AT PORT 0 |
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0050 VDUOPT EQU $FF VDU AT $E030 |
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0053 ENDIF B5XOPT |
0053 ENDIF B5XOPT |
0054 * |
0055 IFD XESOPT |
0056 * |
0057 * XESS XSA-3S1000 & XST-3.0 |
0058 * |
0059 ACIAOPT EQU $FF ACIA AT PORT 0 |
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0061 VDUOPT EQU $FF VDU AT $E030 |
0062 IDEOPT EQU $FF XESS IDE AT $E100 |
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0064 EXTOPT EQU $FF EXTENDED COMMANDS |
0065 ENDIF XESOPT |
0065 ENDIF XESOPT |
0066 * |
0067 IFD ADSOPT |
0068 * |
0069 * ACKERMAN DIGITAL ADS6809 |
0070 * |
0071 DG640OPT EQU $FF DG640 VDU AT $E800 |
0072 *RTCOPT EQU $FF REAL TIME CLOCK |
0073 PRTOPT EQU $FF PRINTER DRIVERS |
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0075 ENDIF ADSOPT |
0075 ENDIF ADSOPT |
0076 * |
0077 IFD SWTOPT |
0078 * |
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER |
0080 * |
0081 ACIAOPT EQU $FF ACIA AT PORT 0 |
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT |
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0085 ENDIF |
0085 ENDIF |
0086 * |
0087 IFD ACIAOPT |
0088 * |
0089 *************************************************** |
0090 * SERIAL PORT * |
0091 *************************************************** |
0092 * |
0093 ** ACIA SITS ON PORT 0 |
0094 * |
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT |
0096 * |
0097 ENDIF ACIAOPT |
0098 IFD MFDCOPT |
0099 * |
0100 *************************************************** |
0101 * MINIFLOPPY DRIVE * |
0102 *************************************************** |
0103 * |
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 |
0105 * |
0106 DRVFDC EQU MONIO+$14 |
0107 CMDFDC EQU MONIO+$18 |
0108 SECFDC EQU MONIO+$1A |
0109 DATFDC EQU MONIO+$1B |
0110 ENDIF MFDCOPT |
0110 ENDIF MFDCOPT |
0111 IFD PS2OPT |
0112 * |
0113 *************************************************** |
0114 * VDU8 PS/2 KEYBOARD PORT * |
0115 *************************************************** |
0116 * |
0117 ** KEYBOARD SITS ON PORT 2 |
0118 * |
0119 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT |
0120 ENDIF PS2OPT |
0121 IFD VDUOPT |
0122 * |
0123 *************************************************** |
0124 * VDU8 DISPLAY DRIVER EQUATES * |
0125 *************************************************** |
0126 * |
0127 ** VDU8 DISPLAY SITS ON PORT 3 |
0128 * |
0129 E030 VDU EQU MONIO+$30 |
0130 0000 VDUCHR EQU 0 CHARACTER REGISTER |
0131 0001 VDUATT EQU 1 ATTRIBUTE REGISTER |
0132 0002 VDUCOL EQU 2 CURSOR COLUMN |
0133 0003 VDUROW EQU 3 CURSOR ROW |
0134 0004 VDUOFF EQU 4 ROW OFFSET |
0135 * |
0136 0050 LINLEN EQU 80 LENGTH OF A LINE |
0137 0019 NUMLIN EQU 25 NUMBER OF LINES |
0138 ENDIF VDUOPT |
0139 * |
0140 IFD CF8OPT |
0141 * |
0142 *************************************************** |
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER * |
0144 *************************************************** |
0145 * |
0146 ** COMPACT FLASH SITS AT PORT 4 |
0147 * |
0148 CF_BASE EQU MONIO+$40 |
0149 CF_DATA EQU CF_BASE+0 |
0150 CF_ERROR EQU CF_BASE+1 ; read error |
0151 CF_FEATURE EQU CF_BASE+1 ; write feature |
0152 CF_SECCNT EQU CF_BASE+2 |
0153 CF_SECNUM EQU CF_BASE+3 |
0154 CF_CYLLO EQU CF_BASE+4 |
0155 CF_CYLHI EQU CF_BASE+5 |
0156 CF_HEAD EQU CF_BASE+6 |
0157 CF_STATUS EQU CF_BASE+7 ; read status |
0158 CF_COMAND EQU CF_BASE+7 ; write command |
0159 * |
0160 * Command Equates |
0161 * |
0162 CMDREAD EQU $20 ; Read Single sector |
0163 CMDWRITE EQU $30 ; Write Single sector |
0164 CMDFEATURE EQU $EF |
0165 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0166 HEADLBA EQU $E0 |
0167 * |
0168 * Status bit equates |
0169 * |
0170 BUSY EQU $80 |
0171 DRDY EQU $40 |
0172 DRQ EQU $08 |
0173 ERR EQU $01 |
0174 * |
0175 ENDIF CF8OPT |
0175 ENDIF CF8OPT |
0176 * |
0177 IFD IDEOPT |
0178 * |
0179 *************************************************** |
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) * |
0181 *************************************************** |
0182 * |
0183 ** COMPACT FLASH SITS AT PORT 4 |
0184 * |
0185 CF_BASE EQU MONIO+$0100 |
0186 CF_DATA EQU CF_BASE+0 |
0187 CF_ERROR EQU CF_BASE+2 ; read error |
0188 CF_FEATURE EQU CF_BASE+2 ; write feature |
0189 CF_SECCNT EQU CF_BASE+4 |
0190 CF_SECNUM EQU CF_BASE+6 |
0191 CF_CYLLO EQU CF_BASE+8 |
0192 CF_CYLHI EQU CF_BASE+10 |
0193 CF_HEAD EQU CF_BASE+12 |
0194 CF_STATUS EQU CF_BASE+14 ; read status |
0195 CF_COMAND EQU CF_BASE+14 ; write command |
0196 CF_AUX EQU CF_BASE+30 |
0197 * |
0198 * Command Equates |
0199 * |
0200 CMDREAD EQU $20 ; Read Single sector |
0201 CMDWRITE EQU $30 ; Write Single sector |
0202 AUXRESET EQU $06 ; Reset IDE |
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked |
0204 HEADLBA EQU $E0 |
0205 * |
0206 * Status bit equates |
0207 * |
0208 BUSY EQU $80 |
0209 DRDY EQU $40 |
0210 DRQ EQU $08 |
0211 ERR EQU $01 |
0212 * |
0213 ENDIF CF8OPT |
0213 ENDIF CF8OPT |
0214 * |
0215 IFD RTCOPT |
0216 * |
0217 ************************************************** |
0218 * MM58167A REAL TIME CLOCK MEMORY MAP: |
0219 ************************************************** |
0220 * |
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 |
0222 * |
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS |
0224 * |
0225 * COUNTER AND COMPARITOR REGISTERS: |
0226 * |
0227 * Both the Clock Counter and Clock Comparitor |
0228 * consist of 8 registers for holding the time. |
0229 * The register offsets from the Counter and |
0230 * Comparitor registers are listed above. |
0231 * |
0232 COUNTR EQU CLOCK+0 |
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS |
0234 * |
0235 * CLOCK REGISTER OFFSETS: |
0236 * These register offsets are used for the CLOCK |
0237 * and comparitor ram CMPRAM. |
0238 * |
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS |
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS |
0241 SECOND EQU 2 |
0242 MINUIT EQU 3 |
0243 HOUR EQU 4 |
0244 WKDAY EQU 5 |
0245 MTHDAY EQU 6 |
0246 MONTH EQU 7 |
0247 * |
0248 * INTERRUPT OUTPUT REGISTERS: |
0249 * |
0250 * An interrupt output may be generated at the |
0251 * following rates by setting the appropriate bit |
0252 * in the Interrupt Control Register (CINTCR). |
0253 * The Interrupt Status Register (CINTSR) must be |
0254 * read to clear the interrupt and will return |
0255 * the source of the interrupt. |
0256 * |
0257 * 1/Month Bit 7 |
0258 * 1/Week Bit 6 |
0259 * 1/Day Bit 5 |
0260 * 1/Hour Bit 4 |
0261 * 1/Minuite Bit 3 |
0262 * 1/Second Bit 2 |
0263 * 10/Second Bit 1 |
0264 * Comparitor Bit 0 |
0265 * |
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER |
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER |
0268 * |
0269 * COUNTER AND RAM RESETS; GO COMMAND. |
0270 * |
0271 * The counter and comparitor may be reset |
0272 * by writing $FF into CTRRES and CMPRES |
0273 * respectivly. |
0274 * A write to the Go command register (GOCMND) |
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths |
0276 * of a second counter. |
0277 * |
0278 CTRRES EQU CLOCK+18 COUNTER RESET |
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET |
0280 GOCMND EQU CLOCK+21 GO COMMAND |
0281 * |
0282 * CLOCK STATUS REGISTER. |
0283 * |
0284 * The counter takes 61 usec. to rollover for |
0285 * every 1KHz clock pulse. If the Status bit is |
0286 * set after reading the counter, the counter |
0287 * should be re-read to ensure the time is correct. |
0288 * |
0289 CLKSTA EQU CLOCK+20 STATUS BIT |
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT |
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER |
0292 ENDIF RTCOPT |
0292 ENDIF RTCOPT |
0293 * |
0294 IFD TRAOPT |
0295 * |
0296 ************************************************** |
0297 * PIA INTERRUPT TIMER |
0298 ************************************************** |
0299 * |
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7 |
0301 * |
0302 ** PIA TIMER FOR SINGLE STEP / TRACE |
0303 * |
0304 * TADATA = Output = Timer preset register |
0305 * TACTRL - CA1 = input = rising edge = NMI |
0306 * - CA2 = Output = Timer Reset (Active High) |
0307 * TBDATA = Input = Timer read back register |
0308 * TBCTRL - CB1 = input = rising edge = FIRQ |
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset |
0310 * |
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0312 * CRA1 = 1 CA1 Rising edge IRQ |
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0315 * CRA4 = 1 ] CA2 = Set/Reset output |
0316 * CRA5 = 1 ] |
0317 * CRA6 = X CA2 Input Interrupt Flag |
0318 * CRA7 = X CA1 Interrupt Flag |
0319 * |
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0321 * CRB1 = 1 CB1 Rising edge IRQ |
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0324 * CRB4 = 1 ] CB2 = Set/Reset output |
0325 * CRB5 = 1 ] |
0326 * CRB6 = X CB2 Input Interrupt Flag |
0327 * CRB7 = X CB1 Interrupt Flag |
0328 * |
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output |
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output |
0331 * |
0332 E070 TADATA EQU MONIO+$70 Timer preset port |
0333 E071 TACTRL EQU MONIO+$71 |
0334 E072 TBDATA EQU MONIO+$72 Timer read back port |
0335 E073 TBCTRL EQU MONIO+$73 |
0336 * |
0337 000D TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) |
0338 * |
0339 ENDIF TRAOPT |
0340 IFD ADSOPT |
0341 * |
0342 *************************************************** |
0343 * SERIAL PORT FOR DG640 * |
0344 *************************************************** |
0345 * |
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809 |
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA |
0348 * |
0349 ACIAS EQU MONIO+$400 CONTROL PORT |
0350 * |
0351 ENDIF ADSOPT |
0351 ENDIF ADSOPT |
0352 IFD PRTOPT |
0353 * |
0354 *************************************************** |
0355 * PRINTER INTERFACE * |
0356 *************************************************** |
0357 * |
0358 PADATA EQU MONIO+$404 |
0359 PACTRL EQU MONIO+$405 |
0360 PBDATA EQU MONIO+$406 |
0361 PBCTRL EQU MONIO+$407 |
0362 * |
0363 ** CB1 ACK. I/P |
0364 ** CB2 STB. O/P |
0365 ** PB0 - PB7 DATA 1 - 8 O/P |
0366 ** PORT A BIT ASSIGNMENT |
0367 * |
0368 PBUSY EQU $80 I/P |
0369 PEMPTY EQU $40 I/P |
0370 SELECT EQU $20 I/P |
0371 PERROR EQU $10 I/P |
0372 PRESET EQU %00000100 O/P PA3 = 0 |
0373 AUTOFD EQU %00001000 O/P PA2 = 0 |
0374 DIRMSK EQU %00001100 |
0375 ENDIF PRTOPT |
0375 ENDIF PRTOPT |
0376 IFD DG640OPT |
0377 * |
0378 *************************************************** |
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0380 *************************************************** |
0381 * |
0382 ** VIDEO DISPLAY DEFINITIONS |
0383 * |
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY |
0385 LINLEN EQU 64 LENGTH OF A LINE |
0386 NUMLIN EQU 16 NUMBER OF LINES |
0387 SCNLEN EQU $400 LENGTH OF SCREEN |
0388 ENDIF DG640OPT |
0388 ENDIF DG640OPT |
0389 * |
0390 IFD DMAFOPT |
0391 * |
0392 *************************************************** |
0393 * DMAF2 8" DRIVE * |
0394 *************************************************** |
0395 * |
0396 ADDREG EQU $F000 ADDRESS REGISTER |
0397 CNTREG EQU $F002 COUNT REGISTER |
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER |
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER |
0400 AAAREG EQU $F015 ??? |
0401 BBBREG EQU $F016 ??? |
0402 COMREG EQU $F020 1791 COMMAND REGISTER |
0403 SECREG EQU $F022 SECTOR REGISTER |
0404 DRVREG EQU $F024 DRIVE SELECT LATCH |
0405 CCCREG EQU $F040 ??? |
0406 ENDIF DMAFOPT |
0406 ENDIF DMAFOPT |
0407 IFD DATOPT |
0408 ************************************************** |
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS * |
0410 ************************************************** |
0411 * |
0412 IC11 EQU $FFF0 DAT RAM CHIP |
0413 TSTPAT EQU $55AA TEST PATTERN |
0414 ENDIF DATOPT |
0414 ENDIF DATOPT |
0415 * |
0003 END |
0000 INCLUDE "sys09bug.txt" |
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR |
0002 OPT l |
|
|
sys09bug.txt page 2 |
0004 * |
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL |
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY.... |
0007 * |
0008 * ALLEN CLARK WALLACE WATSON |
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE. |
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617 |
0011 * PH. 813-977-0347 PH. 813-985-1359 |
0012 * |
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT |
0014 * 2561 NANTUCKET DR APT. E |
0015 * ATLANTA, GA 30345 |
0016 * PH. 404-320-1043 |
0017 * |
0018 * MODIFIED TO SYS09BUG VER 1.0 |
0019 * FOR: SYSTEM09 FPGA SYSTEM |
0020 * BY: JOHN KENT |
0021 * DATE: 21ST NOVEMBER 2006 |
0022 * REMOVED: DISK BOOTS |
0023 * MEMORY TEST |
0024 * ADDED: ADM3A VDU DRIVER |
0025 * |
0026 * MODIFIED TO SYS09BUG VER 1.1 |
0027 * FOR: SYSTEM09 FPGA SYSTEM |
0028 * BY: JOHN KENT |
0029 * DATE: 7TH JANUARY 2007 |
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000 |
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS |
0032 * AND REALTIME CLOCK |
0033 * |
0034 * MODIFIED TO SYS09BUG VER 1.2 |
0035 * FOR: SYSTEM09 FPGA SYSTEM |
0036 * BY: JOHN KENT |
0037 * DATE: 21ST MAY 2007 |
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION |
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD |
0040 * |
0041 * Modified to SYS09BUG VER 1.3 |
0042 * FOR: SYSTEM09 FPGA SYSTEM |
0043 * BY: JOHN KENT |
0044 * DATE: 8TH JAN 2008 |
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD |
0046 * WITH ONLY 32K OF RAM |
0047 * |
0048 * Modified to SYS09BUG VER 1.4 |
0049 * FOR: SYSTEM09 FPGA SYSTEM |
0050 * BY: JOHN KENT |
0051 * DATE: 3RD FEB 2008 |
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE |
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300 |
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE |
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
0056 * |
0057 * *** COMMANDS *** |
0058 * |
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR |
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR |
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER |
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER |
0063 * CONTROL P = ALTER THE PROGRAM COUNTER |
0064 * CONTROL U = ALTER USER STACK POINTER |
0065 * CONTROL X = ALTER "X" INDEX REGISTER |
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER |
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh |
0068 * D = 5.25" MINIFLOPPY BOOT |
0069 * E ssss-eeee = EXAMINE MEMORY |
0070 * FROM STARTING ADDRESS ssss |
0071 * TO ENDING ADDRESS eeee. |
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI |
0073 * L = LOAD TAPE |
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh |
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. |
0076 * R = DISPLAY REGISTER CONTENTS |
0077 * S = DISPLAY STACK FROM ssss TO $DFC0 |
0078 * U = 8" DMAF2 FLOPPY BOOT |
0079 * U = USER EXTENSION COMMANDS AT $F000 |
0080 * X = REMOVE ALL BREAKPOINTS |
0081 * |
0082 * |
0083 *************************************************** |
0084 * SYS09BUG VARIABLE SPACE |
0085 *************************************************** |
0086 * |
0087 7FC0 ORG MONRAM |
0088 7FC0 STACK EQU * TOP OF INTERNAL STACK |
0089 7FC0 NMI RMB 2 USER NMI VECTOR |
0090 7FC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 |
0091 7FC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 |
0092 7FC6 FIRQ RMB 2 FAST INTERRUPT VECTOR |
0093 7FC8 IRQ RMB 2 INTERRUPT VECTOR |
0094 7FCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR |
0095 7FCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN |
0096 7FCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT |
0097 IFD DATOPT |
0098 LRARAM RMB 16 LRA ADDRESSES |
0099 ENDIF DATOPT |
0099 ENDIF DATOPT |
0100 7FD0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT |
0101 7FD2 ECHO RMB 1 ECHO FLAG |
0102 7FD3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR |
0103 IFD TRAOPT |
0104 7FEB NMISAV RMB 2 NMI Jump Vector Backup |
0105 7FED TRACNT RMB 2 Trace Count |
0106 ENDIF TRAOPT |
0107 IFD VDUOPT |
0108 * |
0109 ************************************************** |
0110 * VDU8 DISPLAY DRIVER VARIABLES * |
0111 ************************************************** |
0112 * |
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** |
0114 7FEF COLADX RMB 1 CURSOR COLUMN |
0115 7FF0 ROWADX RMB 1 CURSOR ROW |
0116 ************************************************** |
0117 * |
0118 7FF1 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0119 7FF2 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0120 ENDIF VDUOPT |
0121 IFD DG640OPT |
0122 * |
0123 *************************************************** |
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0125 *************************************************** |
0126 * |
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** |
0128 COLADX RMB 1 CURSOR COLUMN |
0129 ROWADX RMB 1 CURSOR ROW |
0130 ************************************************* |
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS |
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0134 ENDIF DG640OPT |
0134 ENDIF DG640OPT |
0135 * |
0136 * |
0137 *************************************************** |
0138 * START OF ROM * |
0139 *************************************************** |
0140 * |
0141 F800 ORG MONROM |
0142 F800 F8 14 FDB MONITOR |
0143 F802 F8 4B FDB NEXTCMD |
0144 F804 FC 90 FDB INCH |
0145 F806 FC 8A FDB INCHE |
0146 F808 FC A8 FDB INCHEK |
0147 F80A FC BD FDB OUTCH |
0148 F80C FB 82 FDB PDATA |
0149 F80E FB 11 FDB PCRLF |
0150 F810 FB 0D FDB PSTRNG |
0151 F812 FE E1 FDB LRA |
0152 * |
0153 IFD ADSOPT |
0154 FDB PCHK CHECK FOR PRINTER INPUT |
0155 FDB PINIZ INITIATE PRINTER |
0156 FDB POUTCH OUTPUT CH. TO PRINTER |
0157 FDB VINIZ |
0158 FDB VOUTCH |
0159 FDB ACINIZ |
0160 FDB AOUTCH |
0161 ENDIF ADSOPT |
0161 ENDIF ADSOPT |
0162 * |
0163 * MONITOR |
0164 * |
0165 * VECTOR ADDRESS STRING IS..... |
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF |
0167 * |
0168 F814 8E FE 60 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING |
0169 F817 10 8E 7F C0 LDY #STACK POINT TO RAM VECTOR LOCATION |
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16 |
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE |
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF |
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE |
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED |
0175 * |
0176 * CONTENTS FROM TO FUNCTION |
0177 * $F8A1 $FE40 $DFC0 USER-V |
0178 * $F8A1 $FE42 $DFC2 SWI3-V |
0179 * $F8A1 $FE44 $DFC4 SWI2-V |
0180 * $F8A1 $FE46 $DFC6 FIRQ-V |
0181 * $F8A1 $FE48 $DFC8 IRQ-V |
0182 * $FAB0 $FE4A $DFCA SWI-V |
0183 * $FFFF $FE4C $DFCC SVC-VO |
0184 * $FFFF $FE4E $DFCE SVC-VL |
0185 * |
0186 F824 8E E0 00 LDX #ACIAS |
0187 F827 BF 7F D0 STX CPORT STORE ADDR. IN RAM |
0188 F82A 17 01 45 LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS |
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK |
0190 F82F 6F E2 CLRSTK CLR ,-S |
0191 F831 5A DECB |
0192 F832 26 FB BNE CLRSTK |
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY |
0194 F837 AF 6A STX 10,S ON STACK |
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK |
0196 F83B A7 E4 STA ,S |
0197 F83D 1F 43 TFR S,U |
0198 F83F 17 04 8E LBSR IOINIZ INITIALIZE CONTROL PORT |
0199 F842 8E FE 70 LDX #MSG1 POINT TO MONITOR MESSAGE |
0200 F845 17 03 3A LBSR PDATA PRINT MSG |
0201 * |
0202 IFD DATOPT |
0203 LDX #LRARAM POINT TO LRA RAM STORAGE AREA |
0204 CLRA START TOTAL AT ZERO |
0205 LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY |
0206 FNDREL TST B,X TEST FOR RAM AT NEXT LOC. |
0207 BEQ RELPAS IF NO RAM GO TO NEXT LOC. |
0208 ADDA #4 ELSE ADD 4K TO TOTAL |
0209 DAA ADJ. TOTAL FOR DECIMAL |
0210 RELPAS DECB SUB. 1 FROM LOCS. TO TEST |
0211 BPL FNDREL PRINT TOTAL OF RAM |
0212 LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0213 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS |
0214 LBSR PDATA PRINT MSG |
0215 ENDIF DATOPT |
0215 ENDIF DATOPT |
0216 * |
0217 IFD TRAOPT |
0218 F848 17 01 DE LBSR TRAINZ |
0219 ENDIF TRAOPT |
0220 * |
0221 ***** NEXTCMD ***** |
0222 * |
0223 F84B 8E FE 95 NEXTCMD LDX #MSG3 POINT TO MSG ">" |
0224 F84E 17 02 BC LBSR PSTRNG PRINT MSG |
0225 F851 17 04 3C LBSR INCH GET ONE CHAR. FROM TERMINAL |
0226 F854 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
0227 F856 81 0D CMPA #$0D IS IT CARRIAGE RETURN ? |
0228 F858 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. |
0229 F85A 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM. |
0230 F85C 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ? |
0231 F85E 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT |
0232 F860 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO... |
0233 F862 17 04 58 LBSR OUTCH PRINT "^" |
0234 F865 1F 98 TFR B,A RECALL CNTRL CMD CHAR |
0235 F867 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER |
0236 F869 17 04 51 PRTCMD LBSR OUTCH PRNT CMD CHAR |
0237 F86C 17 04 4C LBSR OUT1S PRNT SPACE |
0238 F86F C1 60 CMPB #$60 |
0239 F871 2F 02 BLE NXTCH0 |
0240 F873 C0 20 SUBB #$20 |
0241 * |
0242 ***** DO TABLE LOOKUP ***** |
0243 * FOR COMMAND FUNCTIONS |
0244 * |
0245 F875 8E FE 2A NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE |
0246 F878 E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
0247 F87A 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND |
0248 F87C 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
0249 F87E 8C FE 60 CMPX #TABEND REACHED END OF TABLE YET ? |
0250 F881 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY |
0251 F883 8E FE 97 LDX #MSG4 POINT TO MSG "WHAT?" |
0252 F886 17 02 F9 LBSR PDATA PRINT MSG |
0253 F889 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD |
0254 F88B AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE |
0255 F88D 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND |
0256 * |
0257 * "G" GO OR CONTINUE |
0258 * |
0259 F88F 1F 34 GO TFR U,S |
0260 F891 3B RTI RTI |
0261 * |
0262 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0263 * |
0264 F892 17 03 74 MEMCHG LBSR IN1ADR INPUT ADDRESS |
0265 F895 29 2D BVS CHRTN IF NOT HEX, RETURN |
0266 F897 1F 12 TFR X,Y SAVE ADDR IN "Y" |
0267 F899 8E FE 9D MEMC2 LDX #MSG5 POINT TO MSG " - " |
0268 F89C 17 02 6E LBSR PSTRNG PRINT MSG |
0269 F89F 1F 21 TFR Y,X FETCH ADDRESS |
0270 F8A1 17 03 AE LBSR OUT4H PRINT ADDR IN HEX |
0271 F8A4 17 04 14 LBSR OUT1S OUTPUT SPACE |
0272 F8A7 A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR. |
0273 F8A9 17 03 AE LBSR OUT2H OUTPUT CONTENTS IN ASCII |
0274 F8AC 17 04 0C LBSR OUT1S OUTPUT SPACE |
0275 F8AF 17 03 67 LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
0276 F8B2 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
0277 F8B4 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
0278 F8B6 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN |
0279 F8B8 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? |
0280 F8BA 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN |
0281 F8BC 81 5E CMPA #'^ IS IT AN UP ARROW? |
0282 F8BE 27 17 BEQ BACK DISPLAY PREVIOUS BYTE |
0283 F8C0 81 0D CMPA #$D IS IT A CR? |
0284 F8C2 26 0F BNE FORWRD DISPLAY NEXT BYTE |
0285 F8C4 39 CHRTN RTS EXIT ROUTINE |
0286 * |
0287 * |
0288 F8C5 A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY |
0289 F8C7 A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE? |
0290 F8C9 27 08 BEQ FORWRD $F972 |
0291 F8CB 17 03 ED LBSR OUT1S OUTPUT SPACE |
0292 F8CE 86 3F LDA #'? LOAD QUESTION MARK |
0293 F8D0 17 03 EA LBSR OUTCH PRINT IT |
0294 F8D3 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
0295 F8D5 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS |
0296 F8D7 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION |
0297 F8D9 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS |
0298 * |
0299 * "S" DISPLAY STACK |
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM |
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. |
0302 * |
0303 F8DB 17 02 AB DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER |
0304 F8DE 1F 32 TFR U,Y |
0305 F8E0 8E 7F C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT |
0306 F8E3 30 1F LEAX -1,X POINT TO CURRENT STACK |
0307 F8E5 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS |
0308 * |
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII |
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. |
0311 * UPPER ADDRESS IN X-REG. |
0312 * IF HEX ADDRESSES ARE INVALID (V)=1. |
0313 * |
0314 F8E7 17 03 14 MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES |
0315 F8EA 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX |
0316 F8EC 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS |
0317 F8EE AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? |
0318 F8F0 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII |
0319 F8F2 39 EDPRTN RTS ; |
0320 * |
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0322 * TO EVEN 16 BYTE BOUNDRIES. |
0323 * |
0324 * IF LOWER ADDR = $4532 |
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0326 * |
0327 * IF UPPER ADDR = $4567 |
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0329 * |
0330 * ENTER WITH LOWER ADDRESS IN X-REG. |
0331 * -UPPER ADDRESS ON TOP OF STACK. |
0332 * |
0333 F8F3 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
0334 F8F5 C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS |
0335 F8F8 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0336 F8FA 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
0337 F8FC 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
0338 F8FE C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0339 F900 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
0340 F902 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
0341 F904 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
0342 F906 17 03 9F LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
0343 F909 27 03 BEQ EDUMP |
0344 F90B 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
0345 F90D 39 RTS ; |
0346 * |
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0349 * |
0350 F90E 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
0351 F910 8E FE 9D LDX #MSG5 POINT TO MSG " - " |
0352 F913 17 01 F7 LBSR PSTRNG PRINT MSG |
0353 F916 AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
0354 F918 17 03 37 LBSR OUT4H PRINT THE ADDRESS |
0355 F91B 17 03 9B LBSR OUT2S 2 SPACES |
0356 F91E C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
0357 F920 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT |
0358 F922 17 03 35 LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0359 F925 17 03 93 LBSR OUT1S OUTPUT SPACE |
0360 F928 5A DECB $F9D1 DECREMENT BYTE COUNT |
0361 F929 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
0362 * |
0363 * PRINT 16 ASCII CHARACTERS |
0364 * IF NOT PRINTABLE OR NOT VALID |
0365 * ASCII PRINT A PERIOD (.) |
0366 F92B 17 03 8B LBSR OUT2S 2 SPACES |
0367 F92E AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
0368 F930 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 |
0369 F932 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY |
0370 F934 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
0371 F936 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
0372 F938 81 7E CMPA #$7E IS IT VALID ASCII? |
0373 F93A 23 02 BLS PRASC IF SO PRINT IT |
0374 F93C 86 2E PERIOD LDA #'. LOAD A PERIOD (.) |
0375 F93E 17 03 7C PRASC LBSR OUTCH PRINT ASCII CHARACTER |
0376 F941 5A DECB DECREMENT COUNT |
0377 F942 26 EE BNE EDPASC |
0378 F944 20 BC BRA NXTLIN |
0379 * |
0380 ***** "B" SET BREAKPOINT ***** |
0381 * |
0382 F946 17 02 C0 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS |
0383 F949 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR. |
0384 F94B 8C 7F C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 |
0385 F94E 24 1A BCC BPERR IF ERROR PRINT (?), EXIT |
0386 F950 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK |
0387 F952 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE |
0388 F955 8D 5B BSR BPTEST TEST BP TABLE FOR FREE SPACE |
0389 F957 35 10 PULS X POP BP ADDRESS FROM STACK |
0390 F959 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE |
0391 F95B A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS |
0392 F95D 81 3F CMPA #$3F IS IT A SWI? |
0393 F95F 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR |
0394 F961 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE |
0395 F963 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE |
0396 F965 86 3F LDA #$3F LOAD A SWI ($3F) |
0397 F967 A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS |
0398 F969 39 EXITBP RTS ; |
0399 * |
0400 * INDICATE ERROR SETTING BREAKPOINT |
0401 * |
0402 F96A 17 03 4E BPERR LBSR OUT1S OUTPUT SPACE |
0403 F96D 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR |
0404 F96F 16 03 4B LBRA OUTCH PRINT "?" |
0405 * |
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** |
0407 * |
0408 F972 10 8E 7F D3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE |
0409 F976 C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0410 F978 8D 1E XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE |
0411 F97A 5A DECB $FAAC DECREMENT BP COUNTER |
0412 F97B 26 FB BNE XBPLP END OF BREAKPOINT TABLE? |
0413 F97D 39 RTS |
0414 * |
0415 ***** SWI ENTRY POINT ***** |
0416 * |
0417 F97E 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER |
0418 F980 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG |
0419 F982 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE. |
0420 F984 8D 2C BSR BPTEST FIND BREAKPOINT IN BP TABLE |
0421 F986 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR |
0422 F988 AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK |
0423 F98A 8D 0C BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA |
0424 F98C 17 02 51 REGPR LBSR REGSTR GO PRINT REGISTERS |
0425 * |
0426 IFD TRAOPT |
0427 F98F 8E 00 00 LDX #0 |
0428 F992 BF 7F ED STX TRACNT |
0429 ENDIF TRAOPT |
0430 * |
0431 F995 16 FE B3 LBRA NEXTCMD GET NEXT COMMAND |
0432 * |
0433 F998 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE |
0434 F99A 8C 7F C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY |
0435 F99D 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S |
0436 F99F A6 84 LDA ,X GET DATA FROM BP ADDRESS |
0437 F9A1 81 3F CMPA #$3F IS IT SWI? |
0438 F9A3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S |
0439 F9A5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE |
0440 F9A7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS |
0441 F9A9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC |
0442 F9AB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S |
0443 F9AD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S |
0444 F9AF A7 A0 STA ,Y+ |
0445 F9B1 39 RTS |
0446 * |
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH ** |
0448 * |
0449 F9B2 10 8E 7F D3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE |
0450 F9B6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0451 F9B8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE |
0452 F9BA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? |
0453 F9BC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY |
0454 F9BE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER |
0455 F9BF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH |
0456 F9C1 39 RTS ; |
0457 * |
0458 * |
0459 F9C2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY |
0460 F9C4 39 RTS |
0461 * |
0462 IFD TRAOPT |
0463 * |
0464 ** TRACE from address AAAA BB bytes |
0465 * |
0466 F9C5 17 01 5F TRACE LBSR ALTPC1 SET UP NEW PC |
0467 F9C8 29 1C BVS TREXIT ADDRESS ERROR, EXIT |
0468 F9CA 17 02 EE LBSR OUT1S |
0469 F9CD 17 02 39 LBSR IN1ADR Fetch Byte Count |
0470 F9D0 29 14 BVS TREXIT Byte Count error, EXIT |
0471 F9D2 BF 7F ED STX TRACNT |
0472 * |
0473 F9D5 BE 7F C0 LDX NMI Save NMI Vector |
0474 F9D8 BF 7F EB STX NMISAV |
0475 F9DB 8E F9 E7 LDX #NMIE Set up NMI for Tracing |
0476 F9DE BF 7F C0 STX NMI |
0477 F9E1 17 00 45 LBSR TRAINZ Initialise Hardware |
0478 F9E4 20 20 BRA TRACEG Start Trace |
0479 F9E6 39 TREXIT RTS |
0480 * |
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0482 * CRA1 = 1 CA1 Rising edge IRQ |
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0485 * CRA4 = 1 ] CA2 = Set/Reset output |
0486 * CRA5 = 1 ] |
0487 * CRA6 = X CA2 Input Interrupt Flag |
0488 * CRA7 = X CA1 Interrupt Flag |
0489 * |
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0491 * CRB1 = 1 CB1 Rising edge IRQ |
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0494 * CRB4 = 1 ] CB2 = Set/Reset output |
0495 * CRB5 = 1 ] |
0496 * CRB6 = X CB2 Input Interrupt Flag |
0497 * CRB7 = X CB1 Interrupt Flag |
0498 * |
0499 * |
0500 ** TRACE NMI ENTRY POINT |
0501 * |
0502 F9E7 1F 43 NMIE TFR S,U |
0503 F9E9 86 36 LDA #$36 Disable Interrupt, CA2 Low |
0504 F9EB B7 E0 71 STA TACTRL |
0505 F9EE B6 E0 70 LDA TADATA Clear Interrupt flag by reading data port |
0506 * |
0507 F9F1 17 01 EC LBSR REGSTR DUMP REGISTERS |
0508 * |
0509 F9F4 AE 4A LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI |
0510 F9F6 A6 84 LDA ,X |
0511 F9F8 81 3F CMPA #$3F |
0512 F9FA 27 24 BEQ TRACEX EXIT ON SWI |
0513 * |
0514 F9FC BE 7F ED LDX TRACNT CHECK IF TRACE COUNT EXPIRED |
0515 F9FF 27 1F BEQ TRACEX YES, GO BACK TO THE MONITOR |
0516 FA01 30 1F LEAX -1,X DECREMENT TRACE COUNT |
0517 FA03 BF 7F ED STX TRACNT |
0518 * |
0519 ** TRACE GO (RESUME SINGLE STEP) |
0520 * |
0521 FA06 1F 34 TRACEG TFR U,S SET UP PROGRAM STACK POINTER |
0522 FA08 86 0D LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) |
0523 FA0A B7 E0 70 STA TADATA |
0524 FA0D 86 36 LDA #$36 LOAD STROBE LOW |
0525 FA0F B7 E0 71 STA TACTRL |
0526 FA12 B6 E0 70 LDA TADATA CLEAR INTERRUPT |
0527 FA15 86 36 LDA #$36 RELEASE RESET |
0528 FA17 B7 E0 73 STA TBCTRL |
0529 FA1A 86 3F LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE |
0530 FA1C B7 E0 71 STA TACTRL |
0531 FA1F 3B RTI GO EXECUTE INSTRUCTION |
0532 * |
0533 FA20 BE 7F EB TRACEX LDX NMISAV Restore NMI vector |
0534 FA23 BF 7F C0 STX NMI |
0535 FA26 16 FE 22 LBRA NEXTCMD Jump back to the command loop. |
0536 * |
0537 ** TRACE HARDWARE INITIALISATION |
0538 * |
0539 FA29 86 32 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED |
0540 FA2B B7 E0 71 STA TACTRL |
0541 FA2E 86 3A LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED |
0542 FA30 B7 E0 73 STA TBCTRL |
0543 FA33 86 FF LDA #$FF PORTA = OUTPUT |
0544 FA35 B7 E0 70 STA TADATA |
0545 FA38 86 00 LDA #$00 PORTB = INPUT |
0546 FA3A B7 E0 72 STA TBDATA |
0547 FA3D 86 36 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW |
0548 FA3F B7 E0 71 STA TACTRL |
0549 FA42 86 3E LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH |
0550 FA44 B7 E0 73 STA TBCTRL |
0551 FA47 39 RTS |
0552 * |
0553 ENDIF TRAOPT |
0554 IFD MFDCOPT |
0555 * |
0556 ** "U" MINI DISK BOOT |
0557 * |
0558 MINBOOT TST CMDFDC |
0559 CLR DRVFDC |
0560 LDX #$0000 |
0561 LOOP LEAX $01,X |
0562 CMPX #$0000 |
0563 BNE LOOP |
0564 LDA #$0F |
0565 STA CMDFDC |
0566 BSR DELAY |
0567 LOOP1 LDB CMDFDC |
0568 BITB #$01 |
0569 BNE LOOP1 |
0570 LDA #$01 |
0571 STA SECFDC |
0572 BSR DELAY |
0573 LDA #$8C |
0574 STA CMDFDC |
0575 BSR DELAY |
0576 LDX #$C000 |
0577 BRA LOOP3 |
0578 LOOP2 BITB #$02 |
0579 BEQ LOOP3 |
0580 LDA DATFDC |
0581 STA ,X+ |
0582 LOOP3 LDB CMDFDC |
0583 BITB #$01 |
0584 BNE LOOP2 |
0585 BITB #$2C |
0586 BEQ LOOP4 |
0587 RTS |
0588 * |
0589 LOOP4 LDX #$C000 |
0590 STX $0A,U |
0591 TFR U,S |
0592 RTI |
0593 * |
0594 DELAY LDB #$04 |
0595 LOOP5 DECB |
0596 BNE LOOP5 |
0597 RTS |
0598 ENDIF MFDCOPT |
0598 ENDIF MFDCOPT |
0599 * |
0600 IFD DMAFOPT |
0601 * |
0602 *** "D" DISK BOOT FOR DMAF2 *** |
0603 * |
0604 DBOOT LDA #$DE |
0605 STA DRVREG |
0606 LDA #$FF |
0607 STA PRIREG $FAF8 |
0608 STA CCREG |
0609 STA AAAREG |
0610 STA BBBREG |
0611 TST CCREG |
0612 LDA #$D8 |
0613 STA COMREG |
0614 LBSR DLY |
0615 DBOOT0 LDA COMREG |
0616 BMI DBOOT0 |
0617 LDA #$09 |
0618 STA COMREG |
0619 LBSR DLY |
0620 * |
0621 DISKWT LDA COMREG FETCH DRIVE STATUS |
0622 BITA #1 TEST BUSY BIT |
0623 BNE DISKWT LOOP UNTIL NOT BUSY |
0624 * |
0625 BITA #$10 |
0626 BNE DBOOT |
0627 * |
0628 LDX #$C000 LOGICAL ADDR. = $C000 |
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. |
0630 ORA #$10 |
0631 STA CCCREG |
0632 TFR X,D |
0633 COMA ; |
0634 COMB ; |
0635 STD ADDREG |
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100 |
0637 STX CNTREG STORE IN COUNT REGISTER |
0638 LDA #$FF LOAD THE CHANNEL REGISTER |
0639 STA CCREG |
0640 LDA #$FE SET CHANNEL 0 |
0641 STA PRIREG |
0642 LDA #1 SET SECTOR TO "1" |
0643 STA SECREG ISSUE COMMAND |
0644 LDA #$8C SET SINGLE SECTOR READ |
0645 STA COMREG ISSUE COMMAND |
0646 BSR DLY |
0647 * |
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE |
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT |
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7" |
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT |
0652 * IS STILL A ONE THE BOOT OPERATION WILL |
0653 * BE STARTED OVER FROM THE BEGINING. |
0654 * |
0655 CLRB ; |
0656 DBOOT1 PSHS B $FB55 |
0657 CLRB ; |
0658 DBOOT2 TST CCREG |
0659 BPL DBOOT3 |
0660 DECB ; |
0661 BNE DBOOT2 |
0662 PULS B |
0663 DECB |
0664 BNE DBOOT1 |
0665 BRA DBOOT |
0666 DBOOT3 PULS B |
0667 LDA COMREG |
0668 BITA #$1C |
0669 BEQ DBOOT4 |
0670 RTS ; |
0671 * |
0672 * |
0673 DBOOT4 LDB #$DE |
0674 STB DRVREG |
0675 LDX #$C000 |
0676 STX 10,U |
0677 TFR U,S $FB7B |
0678 RTI ; |
0679 ENDIF DMAFOPT |
0679 ENDIF DMAFOPT |
0680 * |
0681 IFD CF8OPT |
0682 * |
0683 * COMPACT FLASH BOOT |
0684 * |
0685 CFBOOT BSR WAITRDY |
0686 LDA #HEADLBA |
0687 STA CF_HEAD |
0688 BSR WAITRDY |
0689 LDA #FEAT8BIT |
0690 STA CF_FEATURE |
0691 LDA #CMDFEATURE |
0692 STA CF_COMAND |
0693 BSR WAITRDY |
0694 * |
0695 * READ SECTORS FROM CF |
0696 * |
0697 CFREAD LDA #$01 |
0698 STA CF_SECCNT |
0699 CLRA |
0700 STA CF_SECNUM |
0701 STA CF_CYLLO |
0702 STA CF_CYLHI |
0703 * |
0704 LDA #CMDREAD ; IDE READ MULTIPLE |
0705 STA CF_COMAND |
0706 BSR WAITRDY |
0707 LDX #$C000 |
0708 * |
0709 * READ LOOP |
0710 * |
0711 RDLOOP BSR WAITDRQ |
0712 LDA CF_DATA |
0713 STA ,X+ |
0714 CMPX #$C200 |
0715 BNE RDLOOP |
0716 * |
0717 LDX #$C000 |
0718 STX $0A,U |
0719 TFR U,S |
0720 RTI |
0721 * |
0722 * WAIT UNTIL READY |
0723 * |
0724 WAITRDY LDA CF_STATUS |
0725 BITA #BUSY |
0726 BNE WAITRDY |
0727 LDA CF_STATUS |
0728 BITA #DRDY |
0729 BEQ WAITRDY |
0730 RTS |
0731 * |
0732 * WAIT FOR DATA REQUEST |
0733 * |
0734 WAITDRQ LDA CF_STATUS |
0735 BITA #DRQ |
0736 BEQ WAITDRQ |
0737 RTS |
0738 ENDIF CF8OPT |
0738 ENDIF CF8OPT |
0739 * |
0740 IFD IDEOPT |
0741 * |
0742 * XESS 16 BIT IDE BOOT |
0743 * |
0744 IDEBOOT LDD #AUXRESET |
0745 STD CF_AUX |
0746 LDD #AUXRSTREL |
0747 STD CF_AUX |
0748 LDD #HEADLBA |
0749 STD CF_HEAD |
0750 BSR WAITRDY |
0751 * |
0752 * READ SECTORS FROM CF |
0753 * |
0754 LDD #$01 |
0755 STD CF_SECCNT |
0756 CLRB |
0757 STD CF_SECNUM |
0758 STD CF_CYLLO |
0759 STD CF_CYLHI |
0760 * |
0761 LDB #CMDREAD ; IDE READ MULTIPLE |
0762 STD CF_COMAND |
0763 BSR WAITRDY |
0764 LDX #$C000 |
0765 * |
0766 * READ LOOP |
0767 * |
0768 RDLOOP BSR WAITDRQ |
0769 LDD CF_DATA |
0770 STB ,X+ |
0771 CMPX #$C100 |
0772 BNE RDLOOP |
0773 * |
0774 LDX #$C000 |
0775 STX $0A,U |
0776 TFR U,S |
0777 RTI |
0778 * |
0779 * WAIT UNTIL READY |
0780 * |
0781 WAITRDY LDD CF_STATUS |
0782 BITB #BUSY |
0783 BNE WAITRDY |
0784 LDD CF_STATUS |
0785 BITB #DRDY |
0786 BEQ WAITRDY |
0787 RTS |
0788 * |
0789 * WAIT FOR DATA REQUEST |
0790 * |
0791 WAITDRQ LDD CF_STATUS |
0792 BITB #DRQ |
0793 BEQ WAITDRQ |
0794 RTS |
0795 ENDIF IDEOPT |
0795 ENDIF IDEOPT |
0796 * |
0797 IFD RTCOPT |
0798 * |
0799 * CLOCK INTER FACE UTILITY |
0800 * |
0801 * TIME <Hours> <Minuits> <Seconds> |
0802 * If no argument is specified, the current time |
0803 * will be displayed. |
0804 * |
0805 * READ A REGISTER FROM THE COUNTER. |
0806 * The X Index rgister points to the register |
0807 * to be read. The Status Register is checked |
0808 * before and after the register is read before |
0809 * returning a value in accumulator A |
0810 * |
0811 RDCLK TST CLKSTA |
0812 BNE RDCLK |
0813 RDCLK1 LDA 0,X |
0814 TST CLKSTA |
0815 BNE RDCLK1 |
0816 RTS |
0817 * |
0818 * MAIN PROGRAM: |
0819 * |
0820 TIMSET LDX #COUNTR POINT TO TIMER |
0821 LBSR BYTE READ HOURS |
0822 BVS SHOWTM NO ARG, DISP TIME |
0823 STA HOUR,X |
0824 LBSR OUT1S |
0825 LBSR BYTE READ MINUITES |
0826 BVS SHOWTM |
0827 STA MINUIT,X |
0828 LBSR OUT1S |
0829 LBSR BYTE SECONDS. |
0830 BVS SHOWTM |
0831 STA SECOND,X |
0832 * |
0833 * DISPLAY CURRENT TIME |
0834 * |
0835 SHOWTM LBSR PCRLF |
0836 LDX #COUNTR+HOUR |
0837 LDB #3 |
0838 SHOWLP BSR RDCLK |
0839 LBSR OUT2H |
0840 LDA #': |
0841 LBSR OUTCH |
0842 LEAX -1,X |
0843 DECB |
0844 BNE SHOWLP |
0845 RTS |
0846 * |
0847 * INITIATE CLOCK. |
0848 * MASK INTERRUPTS. |
0849 * |
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS |
0851 TST CINTSR CLEAR ANY INTERRUPTS |
0852 RTS |
0853 ENDIF RTCOPT |
0853 ENDIF RTCOPT |
0854 IFD DATOPT |
0855 * |
0856 ***** LRA LOAD REAL ADDRESS ***** |
0857 * |
0858 * THE FOLLOWING CODE LOADS THE 20-BIT |
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE |
0860 * INTO THE "A" AND "X" REGISTERS. THIS |
0861 * ROUTINE IS ENTERED WITH THE LOGICAL |
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX" |
0863 * REGISTER. EXIT IS MADE WITH THE HIGH- |
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL |
0865 * ADDRESS IN THE "A" REGISTER, AND THE |
0866 * LOW-ORDER 16-BITS OF THE 20-BIT |
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER. |
0868 * ALL OTHER REGISTERS ARE PRESERVED. |
0869 * THIS ROUTINE IS REQUIRED SINCE THE |
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST |
0871 * PRESENT PHYSICAL ADDRESSES ON THE |
0872 * SYSTEM BUS. |
0873 * |
0874 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK |
0875 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK |
0876 LSRA ; |
0877 LSRA ADJ FOR INDEXED INTO |
0878 LSRA CORRESPONDING LOCATION |
0879 LSRA IN LRA TABLE |
0880 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS |
0881 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE |
0882 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED |
0883 LSRB PHYSICAL ADDRESS. |
0884 LSRB EXTENDED MS 4-BITS ARE RETURNED |
0885 LSRB IN THE "A" ACCUMULATOR |
0886 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK |
0887 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE |
0888 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG |
0889 ASLB ADJ DATA FOR RELOCATION IN X REG |
0890 ASLB ; |
0891 ASLB $FB97 |
0892 ASLB ; |
0893 LDA 2,S GET MS BYTE OF LOGICAL ADDR. |
0894 ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS |
0895 STA 2,S SAVE IT IN X REG ON STACK |
0896 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. |
0897 * |
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS |
0899 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG |
0900 * ON STACK |
0901 PULS A,B,X,Y,PC POP REGS. FROM STACK |
0902 ENDIF DATOPT |
0902 ENDIF DATOPT |
0903 * |
0904 * DELAY LOOP |
0905 * |
0906 FA48 34 04 DLY PSHS B SAVE CONTENTS OF "B" |
0907 FA4A C6 20 LDB #$20 GET LOOP DELAY VALUE |
0908 FA4C 5A SUB1 DECB SUBTRACT ONE FROM VALUE |
0909 FA4D 26 FD BNE SUB1 LOOP UNTIL ZERO |
0910 FA4F 35 84 PULS B,PC RESTORE CONTENTS OF "B" |
0911 * RTS ; |
0912 * |
0913 ***** "L" LOAD MIKBUG TAPE ***** |
0914 * |
0915 FA51 BD FC D2 LOAD JSR ACINIZ |
0916 FA54 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE |
0917 FA56 17 02 64 LBSR OUTCH OUTPUT IT TO TERMINAL PORT |
0918 FA59 7F 7F D2 CLR ECHO TURN OFF ECHO FLAG |
0919 FA5C 17 02 26 LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO |
0920 FA5F 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? |
0921 FA61 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. |
0922 FA63 17 02 1F LBSR ECHON |
0923 FA66 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ? |
0924 FA68 27 3D BEQ LOAD21 IF SO, EXIT LOAD |
0925 FA6A 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? |
0926 FA6C 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR. |
0927 FA6E 17 01 A8 LBSR BYTE INPUT BYTE COUNT |
0928 FA71 34 02 PSHS A PUSH COUNT ON STACK |
0929 FA73 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX |
0930 FA75 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS |
0931 FA78 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX |
0932 FA7A 34 10 PSHS X PUSH ADDR ON STACK |
0933 FA7C E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE |
0934 FA7E EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM |
0935 FA80 EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM |
0936 FA82 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS |
0937 FA84 6A E4 DEC ,S ADDRESS BYTES. |
0938 FA86 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK |
0939 FA88 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) |
0940 FA8B 35 04 PULS B POP CHECKSUM FROM STACK |
0941 FA8D 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX |
0942 FA8F 34 02 PSHS A PUSH DATA BYTE ON STACK |
0943 FA91 EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK |
0944 FA93 6A E4 DEC ,S DECREMENT BYTE COUNT 1 |
0945 FA95 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM |
0946 FA97 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY |
0947 FA99 20 EB BRA LOAD10 GET NEXT DATA BYTE |
0948 FA9B 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; |
0949 FA9C 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) |
0950 FA9E C1 FF CMPB #$FF CHECKSUM OK? |
0951 FAA0 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE |
0952 FAA2 86 3F LDA #'? LOAD (?) ERROR INDICATOR |
0953 FAA4 17 02 16 LBSR OUTCH OUTPUT IT TO TERMINAL |
0954 FAA7 73 7F D2 LOAD21 COM ECHO TURN ECHO ON |
0955 FAAA 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE |
0956 FAAC 16 02 0E LBRA OUTCH OUTPUT IT |
0957 * |
0958 ***** "P" PUNCH MIKBUG TAPE ***** |
0959 * |
0960 FAAF 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK |
0961 FAB1 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS |
0962 FAB4 34 30 PSHS X,Y SAVE ADDRESSES ON STACK |
0963 FAB6 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH |
0964 FAB8 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR |
0965 FABA 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH |
0966 FABC 30 01 LEAX 1,X INCREMENT END ADDRESS |
0967 FABE AF E4 STX ,S STORE END ADDR ON STACK |
0968 FAC0 BD FC D2 JSR ACINIZ |
0969 FAC3 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE |
0970 FAC5 17 01 F5 LBSR OUTCH OUTPUT IT TO TERMINAL |
0971 FAC8 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC |
0972 FACA A3 62 SUBD 2,S SUBTRACT BEGIN FROM END |
0973 FACC 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT |
0974 FACE 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES? |
0975 FAD2 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES |
0976 FAD4 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. |
0977 FAD6 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT |
0978 FAD8 8E FE DE LDX #MSG20 POINT TO MSG "S1" |
0979 FADB 17 00 2F LBSR PSTRNG PRINT MSG |
0980 FADE CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT |
0981 FAE0 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH |
0982 FAE2 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT |
0983 FAE5 AE 62 LDX 2,S LOAD BEGIN ADDRESS |
0984 FAE7 17 01 68 LBSR OUT4H PUNCH ADDRESS |
0985 FAEA EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM |
0986 FAEC EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM |
0987 FAEE EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM |
0988 FAF0 A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH |
0989 FAF2 17 01 65 LBSR OUT2H OUTPUT DATA BYTE |
0990 FAF5 6A 64 DEC 4,S DECREMENT BYTE COUNT |
0991 FAF7 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE |
0992 FAF9 53 COMB 1's COMPLIMENT CHECKSUM BYTE |
0993 FAFA 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH |
0994 FAFC 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE |
0995 FAFF AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR |
0996 FB01 AC E4 CMPX ,S COMPARE IT TO END ADDR |
0997 FB03 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. |
0998 FB05 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE |
0999 FB07 17 01 B3 LBSR OUTCH OUTPUT IT |
1000 FB0A 32 65 LEAS 5,S READJUST STACK POINTER |
1001 FB0C 39 RTS ; |
1002 * |
1003 * PRINT STRING PRECEEDED BY A CR & LF. |
1004 * |
1005 FB0D 8D 02 PSTRNG BSR PCRLF PRINT CR/LF |
1006 FB0F 20 71 BRA PDATA PRINT STRING POINTED TO BY IX |
1007 * |
1008 * PCRLF |
1009 * |
1010 FB11 34 10 PCRLF PSHS X SAVE IX |
1011 FB13 8E FE 8F LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
1012 FB16 17 00 69 LBSR PDATA PRINT MSG |
1013 FB19 35 90 PULS X,PC RESTORE IX & RETURN |
1014 * |
1015 * LONG BRANCHES TO COMMON ROUTINES |
1016 * |
1017 FB1B 16 01 9D JOUT1S LBRA OUT1S |
1018 FB1E 16 00 F8 JBYTE LBRA BYTE |
1019 FB21 16 00 E5 JIN1ADR LBRA IN1ADR |
1020 * |
1021 * ALTER "PC" PROGRAM COUNTER |
1022 * |
1023 FB24 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " |
1024 FB27 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE |
1025 FB29 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC" |
1026 FB2B 29 02 BVS ALTPCD EXIT IF INVALID HEX |
1027 FB2D AF 4A STX 10,U POKE IN NEW CONTENTS |
1028 FB2F 39 ALTPCD RTS ; |
1029 * |
1030 * ALTER "U" USER STACK POINTER |
1031 * |
1032 FB30 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = " |
1033 FB32 8D E7 BSR JOUT1S OUTPUT SPACE |
1034 FB34 8D EB BSR JIN1ADR |
1035 FB36 29 02 BVS ALTUD |
1036 FB38 AF 48 STX 8,U |
1037 FB3A 39 ALTUD RTS ; |
1038 * |
1039 * ALTER "Y" INDEX REGISTER |
1040 * |
1041 FB3B 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = " |
1042 FB3D 8D DC BSR JOUT1S OUTPUT SPACE |
1043 FB3F 8D E0 BSR JIN1ADR |
1044 FB41 29 02 BVS ALTYD |
1045 FB43 AF 46 STX 6,U $F8F0 |
1046 FB45 39 ALTYD RTS ; |
1047 * |
1048 * ALTER "X" INDEX REGISTER |
1049 * |
1050 FB46 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " |
1051 FB48 8D D1 BSR JOUT1S OUTPUT SPACE |
1052 FB4A 8D D5 BSR JIN1ADR |
1053 FB4C 29 02 BVS ALTXD |
1054 FB4E AF 44 STX 4,U |
1055 FB50 39 ALTXD RTS ; |
1056 * |
1057 * ALTER "DP" DIRECT PAGE REGISTER |
1058 * |
1059 FB51 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " |
1060 FB53 8D C6 BSR JOUT1S OUTPUT SPACE |
1061 FB55 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1062 FB57 29 02 BVS ALTDPD |
1063 FB59 A7 43 STA 3,U |
1064 FB5B 39 ALTDPD RTS ; |
1065 * |
1066 * ALTER "B" ACCUMULATOR |
1067 * |
1068 FB5C 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = " |
1069 FB5E 8D BB BSR JOUT1S OUTPUT SPACE |
1070 FB60 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1071 FB62 29 02 BVS ALTBD |
1072 FB64 A7 42 STA 2,U |
1073 FB66 39 ALTBD RTS $F91C |
1074 * |
1075 * ALTER "A" ACCUMULATOR |
1076 * |
1077 FB67 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = " |
1078 FB69 8D B0 BSR JOUT1S OUTPUT SPACE |
1079 FB6B 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1080 FB6D 29 02 BVS ALTAD |
1081 FB6F A7 41 STA 1,U |
1082 FB71 39 ALTAD RTS ; |
1083 * |
1084 * ALTER "CC" REGISTER |
1085 * |
1086 FB72 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " |
1087 FB74 8D A5 BSR JOUT1S OUTPUT SPACE |
1088 FB76 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1089 FB78 29 04 BVS ALTCCD |
1090 FB7A 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST |
1091 FB7C A7 C4 STA ,U |
1092 FB7E 39 ALTCCD RTS ; |
1093 * |
1094 * PDATA |
1095 * |
1096 FB7F 17 01 3B PRINT LBSR OUTCH |
1097 FB82 A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
1098 FB84 81 04 CMPA #4 IS IT EOT? |
1099 FB86 26 F7 BNE PRINT IF NOT EOT PRINT IT |
1100 FB88 39 RTS ; |
1101 * |
1102 * PRINT REGISTERS |
1103 * |
1104 FB89 8E FE A1 PRTSP LDX #MSG10 POINT TO MSG "SP=" |
1105 FB8C 8D F4 BSR PDATA PRINT MSG |
1106 FB8E 1F 31 TFR U,X |
1107 FB90 16 00 BF JOUT4H LBRA OUT4H |
1108 * |
1109 FB93 8E FE AD PRTUS LDX #MSG12 POINT TO MSG "US=" |
1110 FB96 8D EA BSR PDATA PRINT MSG |
1111 FB98 AE 48 LDX 8,U |
1112 FB9A 20 F4 BRA JOUT4H |
1113 * |
1114 FB9C 8E FE BF PRTDP LDX #MSG15 POINT TO MSG "DP=" |
1115 FB9F 8D E1 BSR PDATA PRINT MSG |
1116 FBA1 A6 43 LDA 3,U |
1117 FBA3 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII |
1118 * |
1119 FBA6 8E FE B9 PRTIX LDX #MSG14 POINT TO MSG "IX=" |
1120 FBA9 8D D7 BSR PDATA PRINT MSG |
1121 FBAB AE 44 LDX 4,U $FCE6 |
1122 FBAD 20 E1 BRA JOUT4H |
1123 * |
1124 FBAF 8E FE B3 PRTIY LDX #MSG13 POINT TO MSG "IY=" |
1125 FBB2 8D CE BSR PDATA PRINT MSG |
1126 FBB4 AE 46 LDX 6,U |
1127 FBB6 20 D8 BRA JOUT4H |
1128 * |
1129 FBB8 8E FE A7 PRTPC LDX #MSG11 POINT TO MSG "PC=" |
1130 FBBB 8D C5 BSR PDATA PRINT MSG |
1131 FBBD AE 4A LDX 10,U |
1132 FBBF 20 CF BRA JOUT4H |
1133 * |
1134 FBC1 8E FE C5 PRTA LDX #MSG16 POINT TO MSG "A=" |
1135 FBC4 8D BC BSR PDATA PRINT MSG |
1136 FBC6 A6 41 LDA 1,U |
1137 FBC8 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1138 * |
1139 FBCA 8E FE CA PRTB LDX #MSG17 POINT TO MSG "B=" |
1140 FBCD 8D B3 BSR PDATA PRINT MSG |
1141 FBCF A6 42 LDA 2,U |
1142 FBD1 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1143 * |
1144 FBD3 8E FE CF PRTCC LDX #MSG18 POINT TO MSG "CC:" |
1145 FBD6 8D AA BSR PDATA PRINT MSG |
1146 FBD8 A6 C4 LDA ,U |
1147 FBDA 8E FE D6 LDX #MSG19 POINT TO MSG "EFHINZVC" |
1148 FBDD 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT |
1149 * |
1150 * "R" DISPLAY REGISTERS |
1151 * |
1152 FBE0 8E FE 9D REGSTR LDX #MSG5 POINT TO MSG " - " |
1153 FBE3 17 FF 27 LBSR PSTRNG PRINT MSG |
1154 FBE6 8D A1 BSR PRTSP $FCBF |
1155 FBE8 8D A9 BSR PRTUS $FCCA |
1156 FBEA 8D B0 BSR PRTDP $FCD5 |
1157 FBEC 8D B8 BSR PRTIX $FCE0 |
1158 FBEE 8D BF BSR PRTIY $FCEB |
1159 FBF0 8E FE 9D LDX #MSG5 POINT TO MSG " - " |
1160 FBF3 17 FF 17 LBSR PSTRNG PRINT MSG |
1161 FBF6 8D C0 BSR PRTPC $FCF5 |
1162 FBF8 8D C7 BSR PRTA $FCFF |
1163 FBFA 8D CE BSR PRTB $FD09 |
1164 FBFC 20 D5 BRA PRTCC $FD13 |
1165 * |
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. |
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". |
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT |
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX |
1171 * ADDRESS IS INPUT. |
1172 * |
1173 FBFE 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS |
1174 FC00 29 4D BVS NOTHEX EXIT IF NOT VALID HEX |
1175 FC02 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY" |
1176 FC04 86 2D LDA #'- |
1177 FC06 17 00 B4 LBSR OUTCH PRINT " - " |
1178 * |
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
1182 * |
1183 FC09 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) |
1184 FC0B 29 42 BVS NOTHEX EXIT IF NOT VALID HEX |
1185 FC0D 1F 01 TFR D,X |
1186 FC0F 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) |
1187 FC11 29 3C BVS NOTHEX |
1188 FC13 34 10 PSHS X |
1189 FC15 A7 61 STA 1,S |
1190 FC17 35 90 PULS X,PC |
1191 * |
1192 ***** INPUT BYTE (2 HEX CHAR.) ***** |
1193 * |
1194 FC19 8D 11 BYTE BSR INHEX GET HEX LEFT |
1195 FC1B 29 32 BVS NOTHEX EXIT IF NOT VALID HEX |
1196 FC1D 48 ASLA ; |
1197 FC1E 48 ASLA ; |
1198 FC1F 48 ASLA ; SHIFT INTO LEFT NIBBLE |
1199 FC20 48 ASLA ; |
1200 FC21 1F 89 TFR A,B PUT HEXL IN "B" |
1201 FC23 8D 07 BSR INHEX GET HEX RIGHT |
1202 FC25 29 28 BVS NOTHEX EXIT IF NOT VALID HEX |
1203 FC27 34 04 PSHS B PUSH HEXL ON STACK |
1204 FC29 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
1205 FC2B 39 RTS RETURN WITH HEX L&R IN "A" |
1206 * |
1207 * |
1208 FC2C 8D 57 INHEX BSR ECHON INPUT ASCII CHAR. |
1209 FC2E 81 30 CMPA #'0 IS IT > OR = "0" ? |
1210 FC30 25 1D BCS NOTHEX IF LESS IT AIN'T HEX |
1211 FC32 81 39 CMPA #'9 IS IT < OR = "9" ? |
1212 FC34 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA |
1213 FC36 80 30 SUBA #$30 ASCII ADJ. NUMERIC |
1214 FC38 39 RTS ; |
1215 * |
1216 * |
1217 FC39 81 41 INHEXA CMPA #'A IS IT > OR = "A" |
1218 FC3B 25 12 BCS NOTHEX IF LESS IT AIN'T HEX |
1219 FC3D 81 46 CMPA #'F IS IT < OR = "F" ? |
1220 FC3F 22 03 BHI INHEXL IF > IT AIN'T HEX |
1221 FC41 80 37 SUBA #$37 ASCII ADJ. ALPHA |
1222 FC43 39 RTS ; |
1223 * |
1224 FC44 81 61 INHEXL CMPA #'a IS IT > OR = "a" |
1225 FC46 25 07 BCS NOTHEX IF LESS IT AIN'T HEX |
1226 FC48 81 66 CMPA #'f IS IT < "f" |
1227 FC4A 22 03 BHI NOTHEX IF > IT AIN'T HEX |
1228 FC4C 80 57 SUBA #$57 ADJUST TO LOWER CASE |
1229 FC4E 39 RTS ; |
1230 * |
1231 * |
1232 FC4F 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
1233 FC51 39 RTS ; |
1234 * |
1235 * |
1236 FC52 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK |
1237 FC54 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. |
1238 FC56 8D 02 BSR OUTHL OUTPUT HEX LEFT |
1239 FC58 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. |
1240 FC5A OUTHL EQU * |
1241 FC5A 34 02 OUT2H PSHS A SAVE IT BACK ON STACK |
1242 FC5C 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
1243 FC5D 44 LSRA ; |
1244 FC5E 44 LSRA ; |
1245 FC5F 44 LSRA ; |
1246 FC60 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII |
1247 FC62 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
1248 FC64 84 0F ANDA #$0F STRIP LEFT NIBBLE |
1249 FC66 8B 30 XASCII ADDA #$30 ASCII ADJ |
1250 FC68 81 39 CMPA #$39 IS IT < OR = "9" ? |
1251 FC6A 2F 02 BLE OUTC IF LESS, OUTPUT IT |
1252 FC6C 8B 07 ADDA #7 IF > MAKE ASCII LETTER |
1253 FC6E 20 4D OUTC BRA OUTCH OUTPUT CHAR |
1254 * |
1255 * BINARY / ASCII --- THIS ROUTINE |
1256 * OUTPUTS A BYTE IN ENHANCED |
1257 * BINARY FORMAT. THE ENHANCEMENT |
1258 * IS DONE BY SUBSTITUTING ASCII |
1259 * LETTERS FOR THE ONES IN THE BYTE. |
1260 * THE ASCII ENHANCEMENT LETTERS |
1261 * ARE OBTAINED FROM THE STRING |
1262 * POINTED TO BY THE INDEX REG. "X". |
1263 * |
1264 FC70 34 02 BIASCI PSHS A SAVE "A" ON STACK |
1265 FC72 C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE |
1266 FC74 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING |
1267 FC76 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 |
1268 FC78 25 02 BCS PRTBA IF ONE PRINT LETTER |
1269 FC7A 86 2D LDA #'- IF ZERO PRINT "-" |
1270 FC7C 8D 3F PRTBA BSR OUTCH PRINT IT |
1271 FC7E 8D 3B BSR OUT1S PRINT SPACE |
1272 FC80 5A DECB SUB 1 FROM #BITS YET TO PRINT |
1273 FC81 26 F1 BNE OUTBA |
1274 FC83 35 82 PULS A,PC |
1275 * |
1276 IFD EXTOPT |
1277 * |
1278 * EXTENDED USER COMMANDS |
1279 * |
1280 USRCMD JMP [MONEXT+EXTCMD] |
1281 ENDIF EXTOPT |
1281 ENDIF EXTOPT |
1282 * |
1283 * |
1284 FC85 7D 7F D2 ECHON TST ECHO IS ECHO REQUIRED ? |
1285 FC88 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR |
1286 * |
1287 * INCHE |
1288 * |
1289 * ---GETS CHARACTER FROM TERMINAL AND |
1290 * ECHOS SAME. THE CHARACTER IS RETURNED |
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY |
1292 * BIT MASKED OFF. ALL OTHER REGISTERS |
1293 * ARE PRESERVED. |
1294 * |
1295 FC8A 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL |
1296 FC8C 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
1297 FC8E 20 2D BRA OUTCH ECHO CHAR TO TERMINAL |
1298 * |
1299 * INCH |
1300 * |
1301 * GET CHARACTER FROM TERMINAL. RETURN |
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
1304 * IS 8 BITS AND IS NOT ECHOED. |
1305 * |
1306 * |
1307 FC90 34 10 INCH PSHS X SAVE IX |
1308 FC92 BE 7F D0 GETSTA LDX CPORT POINT TO TERMINAL PORT |
1309 FC95 A6 84 LDA ,X FETCH PORT STATUS |
1310 FC97 85 01 BITA #1 TEST READY BIT, RDRF ? |
1311 IFD PS2OPT |
1312 FC99 26 09 BNE GETST1 |
1313 FC9B 8E E0 20 LDX #PS2KBD |
1314 FC9E A6 84 LDA ,X |
1315 FCA0 85 01 BITA #1 |
1316 ENDIF PS2OPT |
1317 FCA2 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
1318 FCA4 A6 01 GETST1 LDA 1,X FETCH CHAR |
1319 FCA6 35 90 PULS X,PC RESTORE IX |
1320 * |
1321 * INCHEK |
1322 * |
1323 * CHECK FOR A CHARACTER AVAILABLE FROM |
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
1325 * FOR READ READY. ALL REGISTERS ARE |
1326 * PRESERVED, AND THE "Z" BIT WILL BE |
1327 * CLEAR IF A CHARACTER CAN BE READ. |
1328 * |
1329 * |
1330 FCA8 34 02 INCHEK PSHS A SAVE A ACCUM. |
1331 FCAA A6 9F 7F D0 LDA [CPORT] FETCH PORT STATUS |
1332 FCAE 85 01 BITA #1 TEST READY BIT, RDRF ? |
1333 IFD PS2OPT |
1334 FCB0 26 05 BNE INCHEK1 |
1335 FCB2 B6 E0 20 LDA PS2KBD |
1336 FCB5 85 01 BITA #1 TEST READY BIT< RDRF ? |
1337 ENDIF PS2OPT |
1338 FCB7 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. |
1339 * |
1340 FCB9 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES |
1341 FCBB 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE |
1342 * |
1343 * |
1344 * OUTCH |
1345 * |
1346 * OUTPUT CHARACTER TO TERMINAL. |
1347 * THE CHAR. TO BE OUTPUT IS |
1348 * PASSED IN THE A REGISTER. |
1349 * ALL REGISTERS ARE PRESERVED. |
1350 * |
1351 OUTCH IFD VDUOPT |
1352 FCBD 8D 45 BSR VOUTCH |
1353 ENDIF VDUOPT |
1354 IFD DG640OPT |
1355 BSR VOUTCH |
1356 ENDIF DG640OPT |
1356 ENDIF DG640OPT |
1357 FCBF 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX |
1358 FCC1 BE 7F D0 LDX CPORT GET ADDR. OF TERMINAL |
1359 FCC4 A6 84 FETSTA LDA ,X FETCH PORT STATUS |
1360 FCC6 85 02 BITA #2 TEST TDRE, OK TO XMIT ? |
1361 FCC8 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY |
1362 FCCA 35 02 PULS A GET CHAR. FOR XMIT |
1363 FCCC A7 01 STA 1,X XMIT CHAR. |
1364 FCCE 35 90 PULS X,PC RESTORE IX |
1365 * |
1366 * IO INITIALIZATION |
1367 * |
1368 FCD0 IOINIZ EQU * |
1369 IFD VDUOPT |
1370 FCD0 8D 13 BSR VINIZ |
1371 ENDIF VDUOPT |
1372 IFD DG640OPT |
1373 BSR VINIZ |
1374 ENDIF DG640OPT |
1374 ENDIF DG640OPT |
1375 FCD2 BE 7F D0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
1376 FCD5 86 03 LDA #3 RESET ACIA PORT CODE |
1377 FCD7 A7 84 STA ,X STORE IN CONTROL REGISTER |
1378 FCD9 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
1379 FCDB A7 84 STA ,X STORE IN CONTROL REGISTER |
1380 FCDD 6D 01 TST 1,X ANYTHING IN DATA REGISTER? |
1381 FCDF 86 FF LDA #$FF TURN ON ECHO FLAG |
1382 FCE1 B7 7F D2 STA ECHO |
1383 FCE4 39 RTS |
1384 * |
1385 IFD VDUOPT |
1386 * |
1387 *************************************************** |
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * |
1389 * * |
1390 * 80 x 25 Characters |
1391 * |
1392 *************************************************** |
1393 * |
1394 *************************************************** |
1395 * INITIALIZE EMULATOR * |
1396 *************************************************** |
1397 * |
1398 FCE5 8E E0 30 VINIZ LDX #VDU |
1399 FCE8 CC 00 00 LDD #0 |
1400 FCEB FD 7F EF STD COLADX AND ROWADX |
1401 FCEE A7 02 STA VDUCOL,X |
1402 FCF0 E7 03 STB VDUROW,X |
1403 FCF2 E7 04 STB VDUOFF,X |
1404 FCF4 FD 7F F1 STD NEWROW AND ESCFLG |
1405 FCF7 C6 02 LDB #$02 |
1406 FCF9 E7 01 STB VDUATT,X |
1407 FCFB 7F 7F F2 CLR ESCFLG |
1408 FCFE 86 1B LDA #$1B SEND ESCAPE |
1409 FD00 8D 02 BSR VOUTCH |
1410 FD02 86 59 LDA #'Y CLEAR TO END OF SCREEN |
1411 * |
1412 ** VIDEO OUTPUT ROUTINE |
1413 * |
1414 FD04 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS |
1415 FD06 8E E0 30 LDX #VDU POINT TO VDU REGISTERS |
1416 * |
1417 ** CHECK FOR ESCAPE SEQUENCE |
1418 * |
1419 FD09 7D 7F F2 TST ESCFLG ESCAPE ACTIVE? |
1420 FD0C 27 04 BEQ SOROU1 BRANCH IF NOT |
1421 FD0E 8D 74 BSR ESCAPE ELSE DO ESCAPE |
1422 FD10 20 0D BRA RETURN AND RETURN |
1423 * |
1424 ** CHECK FOR CONTROL CHARACTERS |
1425 * |
1426 FD12 81 20 SOROU1 CMPA #$20 CONTROL CODES? |
1427 FD14 24 04 BHS SOROU2 |
1428 FD16 8D 09 BSR CONTRL BRANCH IF SO |
1429 FD18 20 05 BRA RETURN |
1430 * |
1431 ** OUTPUT TEXT CHARACTER |
1432 * |
1433 FD1A A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER |
1434 FD1C 17 00 C5 LBSR NEWCOL UPDATE COLUMN |
1435 * |
1436 ** DISPLAY CURSOR AND RETURN |
1437 * |
1438 FD1F 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1439 * |
1440 *************************************************** |
1441 * CONTROL CODE HANDLERS * |
1442 *************************************************** |
1443 * |
1444 FD21 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1445 FD23 10 27 00 41 LBEQ BACKSP |
1446 FD27 81 1B CMPA #$1B ESCAPE SEQUENCE? |
1447 FD29 10 27 00 6C LBEQ SETESC |
1448 FD2D 81 1A CMPA #$1A CTRL Z - Clear Screen |
1449 FD2F 10 27 00 8E LBEQ CLRSCR |
1450 FD33 81 16 CMPA #$16 CTRL ^ - Home |
1451 FD35 10 27 00 45 LBEQ HOME |
1452 FD39 81 0D CMPA #$D CTRL M - RETURN? |
1453 FD3B 10 27 00 99 LBEQ CRETN |
1454 FD3F 81 0C CMPA #$0C CTRL L - CHAR RIGHT |
1455 FD41 10 27 00 2C LBEQ CHRIGHT |
1456 FD45 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE |
1457 FD47 10 27 00 11 LBEQ LINEUP |
1458 FD4B 81 0A CMPA #$0A CTRL J - LINE FEED |
1459 FD4D 26 51 BNE RETESC NONE OF THESE, RETURN |
1460 * |
1461 ***************************************** LINE FEED |
1462 * |
1463 FD4F FC 7F EF LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1464 FD52 5C INCB BUMP ROW |
1465 FD53 C1 19 CMPB #NUMLIN SCROLL TIME? |
1466 FD55 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT |
1467 FD59 16 00 99 LBRA SCROLL ELSE SCROLL IT |
1468 * |
1469 ***************************************** LINE FEED |
1470 * |
1471 FD5C FC 7F EF LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1472 FD5F 5D TSTB AT TOP OF SCREEN ? |
1473 FD60 10 27 00 3C LBEQ RETESC Yes, Ignore |
1474 FD64 5A DECB No, Decrement ROW |
1475 FD65 16 00 74 LBRA NEWCUR POSITION CURSOR |
1476 * |
1477 *********************************** BACK SPACE |
1478 * |
1479 FD68 B6 7F EF BACKSP LDA COLADX |
1480 FD6B 27 33 BEQ RETESC RETURN |
1481 FD6D 4A DECA |
1482 FD6E 16 00 68 LBRA POSCOL POSITION CURSOR |
1483 * |
1484 *********************************** CURSOR RIGHT |
1485 * |
1486 FD71 B6 7F EF CHRIGHT LDA COLADX |
1487 FD74 4C INCA |
1488 FD75 81 50 CMPA #LINLEN |
1489 FD77 10 27 00 25 LBEQ RETESC |
1490 FD7B 16 00 5B LBRA POSCOL |
1491 * |
1492 *********************************** CURSOR RIGHT |
1493 * |
1494 FD7E CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN |
1495 FD81 16 00 58 LBRA NEWCUR |
1496 * |
1497 *************************************************** |
1498 * ESCAPE HANDLERS * |
1499 *************************************************** |
1500 * |
1501 FD84 F6 7F F2 ESCAPE LDAB ESCFLG GET FLAG |
1502 FD87 C1 3D CMPB #'= SETTING CURSOR? |
1503 FD89 27 16 BEQ ESCCUR BRANCH IF SO |
1504 FD8B 81 59 CMPA #'Y CLEAR TO END OF SCREEN? |
1505 FD8D 10 27 00 6E LBEQ ESCCLS |
1506 FD91 81 54 CMPA #'T CLEAR TO END OF LINE? |
1507 FD93 27 31 BEQ ESCCLL |
1508 FD95 81 3D CMPA #'= STARTING CURSOR SET? |
1509 FD97 26 04 BNE CLRESC BRANCH IF NOT |
1510 * |
1511 ***************************** START ESCAPE SEQUENCE |
1512 * |
1513 FD99 B7 7F F2 SETESC STAA ESCFLG ELSE START CURSORING |
1514 FD9C 39 RTS AND RETURN |
1515 * |
1516 FD9D 7F 7F F2 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1517 FDA0 39 RETESC RTS SO RETURN |
1518 * |
1519 ********************************* SET SCREEN CURSOR |
1520 * |
1521 FDA1 7D 7F F1 ESCCUR TST NEWROW ROW SET? |
1522 FDA4 26 04 BNE ESCCU1 BRANCH IF SO |
1523 FDA6 B7 7F F1 STAA NEWROW ELSE SET NEW ROW |
1524 FDA9 39 RTS AND RETURN |
1525 * |
1526 FDAA 7F 7F F2 ESCCU1 CLR ESCFLG |
1527 FDAD 80 20 SUBA #$20 ADJUST COLUMN ADDRESS |
1528 FDAF 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1529 FDB1 22 ED BHI RETESC NOT OK, DO NOTHING |
1530 * |
1531 FDB3 F6 7F F1 ESCCU2 LDAB NEWROW |
1532 FDB6 7F 7F F1 CLR NEWROW |
1533 FDB9 C0 20 SUBB #$20 ADJUST TO ROW ADDRESS |
1534 FDBB C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1535 FDBD 22 E1 BHI RETESC ELSE RETURN DOING NOTHING |
1536 FDBF 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO |
1537 * |
1538 ****************** CLEAR FROM CURSOR TO END OF LINE |
1539 FDC1 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN |
1540 FDC4 8D 16 BSR NEWCUR |
1541 FDC6 B6 7F EF ESCCLL LDA COLADX |
1542 FDC9 C6 20 LDB #$20 AND CLEAR CHAR |
1543 FDCB E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT |
1544 FDCD 4C INCA |
1545 FDCE A7 02 STA VDUCOL,X |
1546 FDD0 81 50 CMPA #LINLEN UNTIL END OF LINE |
1547 FDD2 26 F7 BNE ESCCL1 |
1548 FDD4 7F 7F F2 CLR ESCFLG |
1549 FDD7 39 RTS |
1550 * |
1551 *********************************** CARRIAGE RETURN |
1552 * |
1553 FDD8 4F CRETN CLRA SET COLUMN ZERO |
1554 FDD9 F6 7F F0 POSCOL LDB ROWADX GET CURRENT ROW |
1555 * |
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1557 * |
1558 FDDC FD 7F EF NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1559 FDDF A7 02 STA VDUCOL,X SET NEW COLUMN |
1560 FDE1 E7 03 STB VDUROW,X SET NEW ROW |
1561 FDE3 39 RTS AND RETURN |
1562 * |
1563 ********************* UPDATE CURRENT COLUMN AND ROW |
1564 * |
1565 FDE4 FC 7F EF NEWCOL LDD COLADX GET ROW AND COLUMN |
1566 FDE7 4C INCA BUMP COLUMN |
1567 FDE8 81 50 CMPA #LINLEN ROLL? |
1568 FDEA 26 F0 BNE NEWCUR BRANCH IF NOT |
1569 FDEC 4F CLRA ELSE RESET TO ZERO |
1570 FDED 5C INCB AND BUMP ROW |
1571 FDEE C1 19 CMPB #NUMLIN |
1572 FDF0 26 EA BNE NEWCUR |
1573 FDF2 5A DECB BOTTOM ROW |
1574 FDF3 8D E7 BSR NEWCUR |
1575 * |
1576 ********************************* SCROLL THE SCREEN |
1577 * |
1578 FDF5 E6 04 SCROLL LDB VDUOFF,X |
1579 FDF7 5C INCB |
1580 FDF8 C1 19 CMPB #NUMLIN |
1581 FDFA 25 01 BLO SCROL1 |
1582 FDFC 5F CLRB |
1583 FDFD E7 04 SCROL1 STB VDUOFF,X |
1584 * |
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1586 * |
1587 FDFF F6 7F EF ESCCLS LDB COLADX GET CURSOR |
1588 FE02 86 20 LDA #$20 GET A SPACE |
1589 FE04 F7 7F EF ESCCLS1 STB COLADX |
1590 FE07 E7 02 STB VDUCOL,X |
1591 FE09 A7 84 STA VDUCHR,X |
1592 FE0B 5C INCB |
1593 FE0C C1 50 CMPB #LINLEN |
1594 FE0E 26 F4 BNE ESCCLS1 |
1595 * |
1596 FE10 F6 7F F0 LDB ROWADX |
1597 FE13 5C INCB |
1598 FE14 C1 19 CMPB #NUMLIN |
1599 FE16 27 08 BEQ ESCCLS2 |
1600 FE18 F7 7F F0 STB ROWADX |
1601 FE1B E7 03 STB VDUROW,X |
1602 FE1D 5F CLRB |
1603 FE1E 20 E4 BRA ESCCLS1 |
1604 * |
1605 FE20 5F ESCCLS2 CLRB |
1606 FE21 F7 7F EF STB COLADX |
1607 FE24 E7 02 STB VDUCOL,X |
1608 FE26 F7 7F F2 STB ESCFLG |
1609 FE29 39 RTS |
1610 ENDIF VDUOPT |
1611 * |
1612 IFD DG640OPT |
1613 *************************************************** |
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * |
1615 * * |
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * |
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * |
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * |
1619 * 16x64 BOARD). * |
1620 *************************************************** |
1621 |
1622 *************************************************** |
1623 * INITIALIZE EMULATOR * |
1624 *************************************************** |
1625 |
1626 VINIZ LDX #0 |
1627 STX COLADX AND ROWADX |
1628 STX NEWROW AND ESCFLG |
1629 LDX #SCREEN POINT TO SCREEN |
1630 STX CURSOR SET PROGRAM CURSOR |
1631 LDA #$1B SEND ESCAPE |
1632 BSR VOUTCH |
1633 LDA #'Y CLEAR TO END OF SCREEN |
1634 * |
1635 ** VIDEO OUTPUT ROUTINE |
1636 * |
1637 VOUTCH PSHS A,B,X SAVE REGISTERS |
1638 * |
1639 ** CLEAR CURSOR |
1640 LDX CURSOR |
1641 LDB 0,X |
1642 ANDB #$7F |
1643 STB 0,X |
1644 * |
1645 ** CHECK FOR ESCAPE SEQUENCE |
1646 TST ESCFLG ESCAPE ACTIVE? |
1647 BEQ SOROU1 BRANCH IF NOT |
1648 BSR ESCAPE ELSE DO ESCAPE |
1649 BRA RETURN AND RETURN |
1650 * |
1651 ** CHECK FOR CONTROL CHARACTERS |
1652 SOROU1 CMPA #$20 CONTROL CODES? |
1653 BHS SOROU2 |
1654 BSR CONTRL BRANCH IF SO |
1655 BRA RETURN |
1656 * |
1657 ** OUTPUT TEXT CHARACTER |
1658 SOROU2 LDX CURSOR ELSE GET CURSOR |
1659 STAA 0,X DISPLAY CHARACTER |
1660 LBSR NEWCOL UPDATE COLUMN |
1661 * |
1662 ** DISPLAY CURSOR AND RETURN |
1663 RETURN LDX CURSOR AND DISPLAY IT |
1664 LDB ,X |
1665 ORAB #$80 WITH REVID |
1666 STB ,X |
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1668 |
1669 *************************************************** |
1670 * CONTROL CODE HANDLERS * |
1671 *************************************************** |
1672 |
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1674 LBEQ BACKSP |
1675 CMPA #$1B ESCAPE SEQUENCE? |
1676 LBEQ SETESC |
1677 CMPA #$D CTRL M - RETURN? |
1678 LBEQ CRETN |
1679 CMPA #$0A CTRL J - LINE FEED |
1680 BNE RETESC NONE OF THESE, RETURN |
1681 |
1682 ***************************************** LINE FEED |
1683 |
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1685 INCB BUMP ROW |
1686 CMPB #NUMLIN SCROLL TIME? |
1687 LBNE NEWCUR POSITION CURSOR IF NOT |
1688 LBRA SCROLL ELSE SCROLL IT |
1689 |
1690 ***************************************** LINE FEED |
1691 |
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1693 TSTB AT TOP OF SCREEN ? |
1694 BEQ RETESC Yes, Ignore |
1695 DECB No, Decrement ROW |
1696 LBRA NEWCUR POSITION CURSOR |
1697 |
1698 |
1699 *********************************** BACK SPACE |
1700 |
1701 BACKSP LDA COLADX |
1702 BEQ RETESC RETURN |
1703 DECA |
1704 LBRA POSCOL POSITION CURSOR |
1705 |
1706 *********************************** CURSOR RIGHT |
1707 |
1708 CHRIGHT LDA COLADX |
1709 INCA |
1710 CMPA #LINLEN |
1711 BEQ RETESC |
1712 LBRA POSCOL |
1713 |
1714 *************************************************** |
1715 * ESCAPE HANDLERS * |
1716 *************************************************** |
1717 |
1718 ESCAPE LDAB ESCFLG GET FLAG |
1719 CMPB #'= SETTING CURSOR? |
1720 BEQ ESCCUR BRANCH IF SO |
1721 CMPA #'Y CLEAR TO END OF SCREEN? |
1722 LBEQ ESCCLS |
1723 CMPA #'T CLEAR TO END OF LINE? |
1724 BEQ ESCCLL |
1725 CMPA #'E INSERT LINE? |
1726 BEQ ESCINL |
1727 CMPA #'R DELETE LINE? |
1728 BEQ ESCDLL |
1729 CMPA #'= STARTING CURSOR SET? |
1730 BNE CLRESC BRANCH IF NOT |
1731 |
1732 ***************************** START ESCAPE SEQUENCE |
1733 |
1734 SETESC STAA ESCFLG ELSE START CURSORING |
1735 RTS AND RETURN |
1736 |
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1738 RETESC RTS SO RETURN |
1739 |
1740 ********************************* SET SCREEN CURSOR |
1741 |
1742 ESCCUR TST NEWROW ROW SET? |
1743 BNE ESCCU1 BRANCH IF SO |
1744 STAA NEWROW ELSE SET NEW ROW |
1745 RTS AND RETURN |
1746 |
1747 ESCCU1 CLR ESCFLG |
1748 SUBA #$20 ADJUST COLUMN ADDRESS |
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1750 BHI RETESC NOT OK, DO NOTHING |
1751 |
1752 ESCCU2 LDAB NEWROW |
1753 CLR NEWROW |
1754 SUBB #$20 ADJUST TO ROW ADDRESS |
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1756 BHI RETESC ELSE RETURN DOING NOTHING |
1757 BRA NEWCUR GO SET NEW CURSOR IF SO |
1758 * |
1759 *************************** DELETE LINE FROM SCREEN |
1760 |
1761 ESCDLL BSR CRETN GO COL. ZERO |
1762 LDB ROWADX |
1763 CMPB #NUMLIN-1 |
1764 BEQ SCROL3 |
1765 BRA SCROL1 AND DELETE THIS LINE |
1766 |
1767 *************************** INSERT LINE INTO SCREEN |
1768 |
1769 ESCINL BSR CRETN GO TO COL. ZERO |
1770 LDAB ROWADX |
1771 CMPB #NUMLIN-1 |
1772 BEQ ESCCLL |
1773 * |
1774 ** SCROLL SCREEN DOWN FROM CURSOR |
1775 * |
1776 LDX #SCREEN+SCNLEN-LINLEN |
1777 ESCIN0 LDAA 0,-X |
1778 STAA LINLEN,X |
1779 LDA SCNLEN,X |
1780 STA SCNLEN+LINLEN,X |
1781 CPX CURSOR |
1782 BNE ESCIN0 |
1783 |
1784 ****************** CLEAR FROM CURSOR TO END OF LINE |
1785 |
1786 ESCCLL LDA COLADX GET CURRENT COLUMN |
1787 LDX CURSOR GET CURSOR |
1788 LDB #$20 AND CLEAR CHAR |
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE |
1790 STB ,X+ CLEAR TEXT |
1791 INCA |
1792 CMPA #LINLEN UNTIL END OF LINE |
1793 BNE ESCLL1 |
1794 CLR ESCFLG |
1795 RTS |
1796 |
1797 *********************************** CARRIAGE RETURN |
1798 |
1799 CRETN CLRA SET COLUMN ZERO |
1800 POSCOL LDB ROWADX GET CURRENT ROW |
1801 |
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1803 |
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1805 LDA #LINLEN ELSE ADD A LINE |
1806 MUL LINLEN * ROWADX |
1807 ADDB COLADX |
1808 ADCA #0 |
1809 ADDD #SCREEN ADD SCREEN BASE. |
1810 STD CURSOR SAVE NEW CURSOR |
1811 TFR D,X GET CURSOR IN X |
1812 RTS AND RETURN |
1813 |
1814 ********************* UPDATE CURRENT COLUMN AND ROW |
1815 |
1816 NEWCOL LDD COLADX GET ROW AND COLUMN |
1817 INCA BUMP COLUMN |
1818 CMPA #LINLEN ROLL? |
1819 BNE NEWCUR BRANCH IF NOT |
1820 CLRA ELSE RESET TO ZERO |
1821 INCB AND BUMP ROW |
1822 CMPB #NUMLIN |
1823 BNE NEWCUR |
1824 DECB BOTTOM ROW |
1825 BSR NEWCUR |
1826 |
1827 ********************************* SCROLL THE SCREEN |
1828 |
1829 SCROLL LDX #SCREEN POINT TO SCREEN |
1830 SCROL1 LDA SCNLEN+LINLEN,X |
1831 STA SCNLEN,X |
1832 LDAA LINLEN,X MOVE TWO BYTES |
1833 STAA 0,X+ UP ONE LINE |
1834 CMPX #SCREEN+SCNLEN-LINLEN |
1835 BNE SCROL1 LOOP UNTIL DONE |
1836 BRA SCROL3 |
1837 |
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1839 |
1840 ESCCLS LDX CURSOR GET CURSOR |
1841 SCROL3 LDAA #$20 GET A SPACE |
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES |
1843 STA ,X+ AND TEXT |
1844 CMPX #SCREEN+SCNLEN |
1845 BNE SCROL2 UNTIL DONE |
1846 CLR ESCFLG |
1847 RTS |
1848 ENDIF DG640OPT |
1848 ENDIF DG640OPT |
1849 * |
1850 IFD PRTOPT |
1851 ************************************* |
1852 * |
1853 ** PRINTER DRIVER ROUTINES |
1854 * |
1855 ************************************* |
1856 * |
1857 ** PINIZ - INITIATE PRINTER PORT |
1858 * |
1859 PINIZ PSHS B |
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 |
1861 STD PADATA SET DDR AND SELECT DATA |
1862 * |
1863 ** RESET PRINTER |
1864 LDB #PRESET |
1865 STAB PADATA |
1866 RESTLP INCB DELAY FOR RESET |
1867 BNE RESTLP |
1868 STAA PADATA ACCA=DIRMSK |
1869 * |
1870 ** INITALIZE PORT B (DATA PORT) |
1871 LDAA #$2A |
1872 STAA PBCTRL |
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110 |
1874 STD PBDATA PBDREG PBCTRL |
1875 * |
1876 ** SELECT 66 LINES/PAGE |
1877 LDAA #$1B |
1878 BSR POUTCH |
1879 LDAA #'C |
1880 BSR POUTCH |
1881 LDAA #66 |
1882 PULS B |
1883 ************************************* |
1884 * |
1885 ** OUTPUT A CHARACTER TO THE PRINTER |
1886 * |
1887 ************************************* |
1888 POUTCH PSHS B |
1889 LDAB PBDATA CLEAR INTERRUPT BIT |
1890 * |
1891 ** WAIT TILL NOT BUSY |
1892 BUSYLP LDAB PADATA |
1893 BITB #PERROR |
1894 BEQ PEXIT |
1895 TSTB |
1896 BMI BUSYLP |
1897 * |
1898 ** NOW OUTPUT CHARACTER |
1899 STAA PBDATA |
1900 PEXIT PULS B,PC |
1901 ************************************* |
1902 * |
1903 ** PCHK TEST IFD PRINTER READY |
1904 * |
1905 ************************************* |
1906 PCHK TST PBCTRL TEST STATE OF CRB7 |
1907 RTS SET ON ACKNOWLEDGE |
1908 ENDIF PRTOPT |
1908 ENDIF PRTOPT |
1909 ************************************* |
1910 * |
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE |
1912 * |
1913 ************************************* |
1914 * |
1915 FE2A JMPTAB EQU * |
1916 FE2A 01 FCB 1 " ^A " |
1917 FE2B FB 67 FDB ALTRA |
1918 FE2D 02 FCB 2 " ^B " |
1919 FE2E FB 5C FDB ALTRB |
1920 FE30 03 FCB 3 " ^C " |
1921 FE31 FB 72 FDB ALTRCC |
1922 FE33 04 FCB 4 " ^D " |
1923 FE34 FB 51 FDB ALTRDP |
1924 FE36 10 FCB $10 " ^P " |
1925 FE37 FB 24 FDB ALTRPC |
1926 FE39 15 FCB $15 " ^U " |
1927 FE3A FB 30 FDB ALTRU |
1928 FE3C 18 FCB $18 " ^X " |
1929 FE3D FB 46 FDB ALTRX |
1930 FE3F 19 FCB $19 " ^Y " |
1931 FE40 FB 3B FDB ALTRY |
1932 * |
1933 FE42 42 FCC 'B' |
1934 FE43 F9 46 FDB BRKPNT |
1935 FE45 45 FCC 'E' |
1936 FE46 F8 E7 FDB MEMDUMP |
1937 FE48 47 FCC 'G' |
1938 FE49 F8 8F FDB GO |
1939 FE4B 4C FCC 'L' |
1940 FE4C FA 51 FDB LOAD |
1941 FE4E 50 FCC 'P' |
1942 FE4F FA AF FDB PUNCH |
1943 FE51 4D FCC 'M' |
1944 FE52 F8 92 FDB MEMCHG |
1945 FE54 52 FCC 'R' |
1946 FE55 FB E0 FDB REGSTR |
1947 FE57 53 FCC 'S' |
1948 FE58 F8 DB FDB DISSTK |
1949 FE5A 58 FCC 'X' |
1950 FE5B F9 72 FDB XBKPNT |
1951 IFD MFDCOPT |
1952 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT |
1953 FDB MINBOOT |
1954 ENDIF MFDCOPT |
1954 ENDIF MFDCOPT |
1955 IFD CF8OPT |
1956 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT |
1957 FDB CFBOOT |
1958 ENDIF CF8OPT |
1958 ENDIF CF8OPT |
1959 IFD IDEOPT |
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT |
1961 FDB IDEBOOT |
1962 ENDIF IDEOPT |
1962 ENDIF IDEOPT |
1963 IFD DMAFOPT |
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT |
1965 FDB DBOOT |
1966 ENDIF DMAFOPT |
1966 ENDIF DMAFOPT |
1967 IFD EXTOPT |
1968 FCC 'U' *** IF FPGA, 'U' IS FOR USER |
1969 FDB USRCMD |
1970 ENDIF EXTOPT |
1970 ENDIF EXTOPT |
1971 IFD RTCOPT |
1972 FCC 'T' |
1973 FDB TIMSET |
1974 ENDIF RTCOPT |
1974 ENDIF RTCOPT |
1975 IFD TRAOPT |
1976 FE5D 54 FCC "T" |
1977 FE5E F9 C5 FDB TRACE |
1978 ENDIF TRAOPT |
1979 * |
1980 FE60 TABEND EQU * |
1981 * |
1982 * ** 6809 VECTOR ADDRESSES ** |
1983 * |
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES |
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY |
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE |
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO |
1988 * HIS OWN ROUTINES IF HE SO DESIRES. |
1989 * |
1990 * |
1991 FE60 F9 7E RAMVEC FDB SWIE USER-V |
1992 FE62 F8 91 FDB RTI SWI3-V |
1993 FE64 F8 91 FDB RTI SWI2-V |
1994 FE66 F8 91 FDB RTI FIRQ-V |
1995 FE68 F8 91 FDB RTI IRQ-V |
1996 FE6A F9 7E FDB SWIE SWI-V |
1997 FE6C FF FF FDB $FFFF SVC-VO |
1998 FE6E FF FF FDB $FFFF SVC-VL |
1999 * |
2000 * PRINTABLE MESSAGE STRINGS |
2001 * |
2002 FE70 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
2003 FE75 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR ' |
55 47 20 31 2E 34 |
20 46 4F 52 20 |
2004 IFD S3EOPT |
2005 FE86 53 33 45 20 FCC 'S3E ' |
2006 ENDIF S3EOPT |
2007 IFD B5XOPT |
2008 FCC 'B5-X300 ' |
2009 ENDIF B5XOPT |
2009 ENDIF B5XOPT |
2010 IFD S3SOPT |
2011 FCC 'S3STARTER ' |
2012 ENDIF S3SOPT |
2012 ENDIF S3SOPT |
2013 IFD ADSOPT |
2014 FCC 'ADS6809 ' |
2015 ENDIF ADSOPT |
2015 ENDIF ADSOPT |
2016 IFD SWTOPT` |
2017 FCC 'SWTPC ' |
2018 ENDIF SWTOPT |
2018 ENDIF SWTOPT |
2019 IFD XESOPT` |
2020 FCC 'XESS ' |
2021 ENDIF XESOPT |
2021 ENDIF XESOPT |
2022 FE8A 20 2D 20 FCC ' - ' |
2023 FE8D 04 FCB 4 |
2024 FE8E 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS |
04 |
2025 FE95 3E MSG3 FCC '>' |
2026 FE96 04 FCB 4 |
2027 FE97 57 48 41 54 3F MSG4 FCC 'WHAT?' |
2028 FE9C 04 FCB 4 |
2029 FE9D 20 2D 20 MSG5 FCC ' - ' |
2030 FEA0 04 FCB 4' |
2031 FEA1 20 20 53 50 3D MSG10 FCC ' SP=' |
2032 FEA6 04 FCB 4 |
2033 FEA7 20 20 50 43 3D MSG11 FCC ' PC=' |
2034 FEAC 04 FCB 4 |
2035 FEAD 20 20 55 53 3D MSG12 FCC ' US=' |
2036 FEB2 04 FCB 4 |
2037 FEB3 20 20 49 59 3D MSG13 FCC ' IY=' |
2038 FEB8 04 FCB 4 |
2039 FEB9 20 20 49 58 3D MSG14 FCC ' IX=' |
2040 FEBE 04 FCB 4 |
2041 FEBF 20 20 44 50 3D MSG15 FCC ' DP=' |
2042 FEC4 04 FCB 4 |
2043 FEC5 20 20 41 3D MSG16 FCC ' A=' |
2044 FEC9 04 FCB 4 |
2045 FECA 20 20 42 3D MSG17 FCC ' B=' |
2046 FECE 04 FCB 4 |
2047 FECF 20 20 43 43 3A 20 MSG18 FCC ' CC: ' |
2048 FED5 04 FCB 4 |
2049 FED6 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' |
56 43 |
2050 FEDE 53 31 MSG20 FCC 'S1' |
2051 FEE0 04 FCB 4 |
2052 IFD DATOPT |
2053 * |
2054 * POWER UP/ RESET/ NMI ENTRY POINT |
2055 * |
2056 ORG $FF00 |
2057 * |
2058 * |
2059 START LDX #IC11 POINT TO DAT RAM IC11 |
2060 LDA #$F GET COMPLIMENT OF ZERO |
2061 * |
2062 * |
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F |
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS |
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE |
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA |
2067 * STORED IN IT. |
2068 * |
2069 * |
2070 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION |
2071 DECA GET COMP. VALUE FOR NEXT LOCATION |
2072 BNE DATLP ALL 16 LOCATIONS INITIALIZED ? |
2073 * |
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER |
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL |
2076 * PHYSICAL ADDRESSES. |
2077 * |
2078 LDA #$F0 |
2079 STA ,X STORE $F0 AT $FFFF |
2080 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF |
2081 LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" |
2082 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION |
2083 STY ,X STORE TEST PATTERN AT $D0A0 |
2084 CMPY ,X IS THERE RAM AT THIS LOCATION ? |
2085 BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP |
2086 LEAX -$1000,X ELSE POINT 4K LOWER |
2087 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? |
2088 BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM |
2089 BRA START ELSE START ALL OVER AGAIN |
2090 * |
2091 * |
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF |
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX |
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED |
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT |
2096 * IS STORED IN RAM IN THE LOCATION THAT IS |
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, |
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND |
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE |
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE |
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE |
2102 * "7" IN THE $70A0 WILL BE STORED IN |
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS |
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND |
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE |
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE |
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- |
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT |
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE |
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK |
2111 * OF RAM RESPONDS. |
2112 * |
2113 * |
2114 CNVADR STU ,X RESTORE DATA AT TEST LOCATION |
2115 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2116 COMA COMPLEMENT MSB OF THAT ADDRESS |
2117 LSRA PUT MS 4 BITS OF ADDRESS IN |
2118 LSRA LOCATION D0-D3 TO ALLOW STORING |
2119 LSRA IT IN THE DYNAMIC ADDRESS |
2120 LSRA TRANSLATION RAM. |
2121 STA $FFFD STORE XLATION FACTOR IN DAT "D" |
2122 * |
2123 LDS #STACK INITIALIZE STACK POINTER |
2124 * |
2125 * |
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES |
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK |
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS |
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION |
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF |
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO |
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... |
2133 * |
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- |
2136 * |
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE |
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... |
2139 * |
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 |
2142 * |
2143 * |
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF |
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL |
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK |
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT |
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 |
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 |
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE |
2151 * MEMORY ADDRESSED AS FOLLOWS.... |
2152 * |
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- |
2155 * |
2156 * |
2157 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2158 STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD |
2159 CLR 14,Y CLEAR $DFDE |
2160 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? |
2161 STA 15,Y STORE AT $DFDF |
2162 LDA #$0C PRESET NUMBER OF BYTES TO CLEAR |
2163 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 |
2164 DECA SUB. 1 FROM BYTES LEFT TO CLEAR |
2165 BPL CLRLRT CONTINUE IF NOT DONE CLEARING |
2166 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM |
2167 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO |
2168 BEQ FINTAB SKIP IF FINISHED |
2169 LDU ,X SAVE DATA AT CURRENT TEST LOCATION |
2170 LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. |
2171 STY ,X STORE TEST PATT. INTO RAM TEST LOC. |
2172 CMPY ,X VERIFY RAM AT TEST LOCATION |
2173 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER |
2174 STU ,X ELSE RESTORE DATA TO TEST LOCATION |
2175 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2176 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2177 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 |
2178 LSRA TO ALLOW STORING IT IN THE DAT RAM. |
2179 LSRA |
2180 LSRA |
2181 TFR A,B SAVE OFFSET INTO LRARAM TABLE |
2182 EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK |
2183 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE |
2184 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK |
2185 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? |
2186 LDY #LRARAM POINT TO LRARAM TABLE |
2187 STA 14,Y STORE $F1 AT $DFCE |
2188 * |
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF |
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES |
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT |
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---. |
2193 * |
2194 * |
2195 LDA #$0C PRESET NUMBER HEX "C" |
2196 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE |
2197 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. |
2198 DECA ELSE POINT 4K LOWER |
2199 BPL FINDC GO TRY AGAIN |
2200 BRA XFERTF |
2201 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND |
2202 STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- |
2203 * |
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION |
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL |
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL |
2207 * ADDRESSES FROM $0000 AND UP.... |
2208 * |
2209 CLRA START AT ZERO |
2210 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. |
2211 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE |
2212 BEQ PNTNXT IF IT'S ZER0 SKIP |
2213 CLR A,Y ELSE ERASE FROM TABLE |
2214 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP |
2215 PNTNXT INCA GET OFFSET TO NEXT ENTRY |
2216 CMPA #$0C LAST ENTRY YET ? |
2217 BLT COMPRS |
2218 * |
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION |
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON |
2221 * THE MP-09 CPU CARD. |
2222 * |
2223 XFERTF LDX #IC11 POINT TO DAT RAM IC11 |
2224 LDB #$10 GET NO. OF BYTES TO MOVE |
2225 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT |
2226 STA ,X+ POKE XLATION FACTOR IN IC11 |
2227 DECB SUB 1 FROM BYTES TO MOVE |
2228 BNE FETCH CONTINUE UNTIL 16 MOVED |
2229 * |
2230 ELSE |
2231 FEE1 39 LRA RTS |
2232 FEE2 10 CE 7F C0 START LDS #STACK INITIALIZE STACK POINTER |
2233 FEE6 5F CLRB |
2234 ENDIF DATOPT |
2235 * |
2236 FEE7 53 COMB SET "B" NON-ZERO |
2237 FEE8 F7 7F D2 STB ECHO TURN ON ECHO FLAG |
2238 FEEB 16 F9 26 LBRA MONITOR INITIALIZATION IS COMPLETE |
2239 * |
2240 ** INTERRUPT JUMP VECTORS |
2241 * |
2242 FEEE 6E 9F 7F C0 V1 JMP [STACK] |
2243 FEF2 6E 9F 7F C4 V2 JMP [SWI2] |
2244 FEF6 6E 9F 7F C6 V3 JMP [FIRQ] |
2245 FEFA 6E 9F 7F C8 V4 JMP [IRQ] |
2246 FEFE 6E 9F 7F CA V5 JMP [SWI] |
2247 * |
2248 * SWI3 ENTRY POINT |
2249 * |
2250 FF02 1F 43 SWI3E TFR S,U |
2251 FF04 AE 4A LDX 10,U *$FFC8 |
2252 FF06 E6 80 LDB ,X+ |
2253 FF08 AF 4A STX 10,U |
2254 FF0A 4F CLRA |
2255 FF0B 58 ASLB |
2256 FF0C 49 ROLA |
2257 FF0D BE 7F CC LDX SVCVO |
2258 FF10 8C FF FF CMPX #$FFFF |
2259 FF13 27 0F BEQ SWI3Z |
2260 FF15 30 8B LEAX D,X |
2261 FF17 BC 7F CE CMPX SVCVL |
2262 FF1A 22 08 BHI SWI3Z |
2263 FF1C 34 10 PSHS X |
2264 FF1E EC C4 LDD ,U |
2265 FF20 AE 44 LDX 4,U |
2266 FF22 6E F1 JMP [,S++] |
2267 FF24 37 1F SWI3Z PULU A,B,X,CC,DP |
2268 FF26 EE 42 LDU 2,U |
2269 FF28 6E 9F 7F C2 JMP [SWI3] |
2270 * |
2271 * 6809 VECTORS |
2272 * |
2273 FFF0 ORG $FFF0 |
2274 FFF0 FE EE FDB V1 USER-V |
2275 FFF2 FF 02 FDB SWI3E SWI3-V |
2276 FFF4 FE F2 FDB V2 SWI2-V |
2277 FFF6 FE F6 FDB V3 FIRQ-V |
2278 FFF8 FE FA FDB V4 IRQ-V |
2279 FFFA FE FE FDB V5 SWI-V |
2280 FFFC FE EE FDB V1 NMI-V |
2281 FFFE FE E2 FDB START RESTART-V |
0004 END START |
0005 END |
Program + Init Data = 1852 bytes |
Error count = 0 |
/sys09swt.txt
0,0 → 1,5
NAM SYS09BUG FOR SWTPc |
INCLUDE "opt_swt.txt" |
INCLUDE "sys09equ.txt" |
INCLUDE "sys09bug.txt" |
END |
/sys09xes.aux
0,0 → 1,7
t m |
l SYS09XES.S19 |
t h |
s sys09xes_b16_0.vhd f000 f7ff |
s sys09xes_b16_1.vhd f800 ffff |
q |
|
/sys09b5x.lst
0,0 → 1,2774
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 NAM SYS09BUG FOR THE B5-X300 |
0000 INCLUDE "opt_b5x.txt" |
0001 * |
0002 *************************************************** |
0003 * OPTION SWITCHES |
0004 *************************************************** |
0005 * |
0006 * |
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
0009 ** FOR LOADING AND SAVING S1 RECORDS |
0010 * |
0011 *S3EOPT EQU $FF SPARTAN3E STARTER |
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
0013 00FF B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
0014 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
0017 * |
0002 END |
0000 INCLUDE "sys09equ.txt" |
0001 * |
0002 *************************************************** |
0003 * MEMORY MAP EQUATES * |
0004 *************************************************** |
0005 E000 MONIO EQU $E000 I/O SPACE |
0006 IFD S3EOPT |
0007 MONRAM EQU $7FC0 |
0008 ELSE |
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE |
0010 ENDIF S3EOPT |
0011 F800 MONROM EQU $F800 START OF ROM |
0012 IFD S3SOPT |
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0014 EXTCMD EQU $00 EXTENDED OFFSET |
0015 ENDIF S3SOPT |
0015 ENDIF S3SOPT |
0016 IFD XESOPT |
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0018 EXTCMD EQU $00 EXTENDED OFFSET |
0019 ENDIF XESOPT |
0019 ENDIF XESOPT |
0020 *************************************************** |
0021 |
0022 IFD S3EOPT |
0023 * |
0024 * DIGILENT SPARTAN 3E STARTER |
0025 * |
0026 ACIAOPT EQU $FF ACIA AT PORT 0 |
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0028 VDUOPT EQU $FF VDU AT $E030 |
0029 TRAOPT EQU $FF PIA TRACE TIMER |
0030 ENDIF S3EOPT |
0030 ENDIF S3EOPT |
0031 * |
0032 IFD S3SOPT |
0033 * |
0034 * DIGILENT SPARTAN 3 STARTER |
0035 * |
0036 ACIAOPT EQU $FF ACIA AT PORT 0 |
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0038 VDUOPT EQU $FF VDU AT $E030 |
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0041 EXTOPT EQU $FF EXTENDED COMMANDS |
0042 ENDIF S3SOPT |
0042 ENDIF S3SOPT |
0043 * |
0044 IFD B5XOPT |
0045 * |
0046 * BURCHED B5-X300 |
0047 * |
0048 00FF ACIAOPT EQU $FF ACIA AT PORT 0 |
0049 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0050 00FF VDUOPT EQU $FF VDU AT $E030 |
0051 00FF CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0052 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0053 ENDIF B5XOPT |
0054 * |
0055 IFD XESOPT |
0056 * |
0057 * XESS XSA-3S1000 & XST-3.0 |
0058 * |
0059 ACIAOPT EQU $FF ACIA AT PORT 0 |
0060 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0061 VDUOPT EQU $FF VDU AT $E030 |
0062 IDEOPT EQU $FF XESS IDE AT $E100 |
0063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0064 EXTOPT EQU $FF EXTENDED COMMANDS |
0065 ENDIF XESOPT |
0065 ENDIF XESOPT |
0066 * |
0067 IFD ADSOPT |
0068 * |
0069 * ACKERMAN DIGITAL ADS6809 |
0070 * |
0071 DG640OPT EQU $FF DG640 VDU AT $E800 |
0072 *RTCOPT EQU $FF REAL TIME CLOCK |
0073 PRTOPT EQU $FF PRINTER DRIVERS |
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0075 ENDIF ADSOPT |
0075 ENDIF ADSOPT |
0076 * |
0077 IFD SWTOPT |
0078 * |
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER |
0080 * |
0081 ACIAOPT EQU $FF ACIA AT PORT 0 |
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT |
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0085 ENDIF |
0085 ENDIF |
0086 * |
0087 IFD ACIAOPT |
0088 * |
0089 *************************************************** |
0090 * SERIAL PORT * |
0091 *************************************************** |
0092 * |
0093 ** ACIA SITS ON PORT 0 |
0094 * |
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT |
0096 * |
0097 ENDIF ACIAOPT |
0098 IFD MFDCOPT |
0099 * |
0100 *************************************************** |
0101 * MINIFLOPPY DRIVE * |
0102 *************************************************** |
0103 * |
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 |
0105 * |
0106 DRVFDC EQU MONIO+$14 |
0107 CMDFDC EQU MONIO+$18 |
0108 SECFDC EQU MONIO+$1A |
0109 DATFDC EQU MONIO+$1B |
0110 ENDIF MFDCOPT |
0110 ENDIF MFDCOPT |
0111 IFD PS2OPT |
0112 * |
0113 *************************************************** |
0114 * VDU8 PS/2 KEYBOARD PORT * |
0115 *************************************************** |
0116 * |
0117 ** KEYBOARD SITS ON PORT 2 |
0118 * |
0119 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT |
0120 ENDIF PS2OPT |
0121 IFD VDUOPT |
0122 * |
0123 *************************************************** |
0124 * VDU8 DISPLAY DRIVER EQUATES * |
0125 *************************************************** |
0126 * |
0127 ** VDU8 DISPLAY SITS ON PORT 3 |
0128 * |
0129 E030 VDU EQU MONIO+$30 |
0130 0000 VDUCHR EQU 0 CHARACTER REGISTER |
0131 0001 VDUATT EQU 1 ATTRIBUTE REGISTER |
0132 0002 VDUCOL EQU 2 CURSOR COLUMN |
0133 0003 VDUROW EQU 3 CURSOR ROW |
0134 0004 VDUOFF EQU 4 ROW OFFSET |
0135 * |
0136 0050 LINLEN EQU 80 LENGTH OF A LINE |
0137 0019 NUMLIN EQU 25 NUMBER OF LINES |
0138 ENDIF VDUOPT |
0139 * |
0140 IFD CF8OPT |
0141 * |
0142 *************************************************** |
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER * |
0144 *************************************************** |
0145 * |
0146 ** COMPACT FLASH SITS AT PORT 4 |
0147 * |
0148 E040 CF_BASE EQU MONIO+$40 |
0149 E040 CF_DATA EQU CF_BASE+0 |
0150 E041 CF_ERROR EQU CF_BASE+1 ; read error |
0151 E041 CF_FEATURE EQU CF_BASE+1 ; write feature |
0152 E042 CF_SECCNT EQU CF_BASE+2 |
0153 E043 CF_SECNUM EQU CF_BASE+3 |
0154 E044 CF_CYLLO EQU CF_BASE+4 |
0155 E045 CF_CYLHI EQU CF_BASE+5 |
0156 E046 CF_HEAD EQU CF_BASE+6 |
0157 E047 CF_STATUS EQU CF_BASE+7 ; read status |
0158 E047 CF_COMAND EQU CF_BASE+7 ; write command |
0159 * |
0160 * Command Equates |
0161 * |
0162 0020 CMDREAD EQU $20 ; Read Single sector |
0163 0030 CMDWRITE EQU $30 ; Write Single sector |
0164 00EF CMDFEATURE EQU $EF |
0165 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0166 00E0 HEADLBA EQU $E0 |
0167 * |
0168 * Status bit equates |
0169 * |
0170 0080 BUSY EQU $80 |
0171 0040 DRDY EQU $40 |
0172 0008 DRQ EQU $08 |
0173 0001 ERR EQU $01 |
0174 * |
0175 ENDIF CF8OPT |
0176 * |
0177 IFD IDEOPT |
0178 * |
0179 *************************************************** |
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) * |
0181 *************************************************** |
0182 * |
0183 ** COMPACT FLASH SITS AT PORT 4 |
0184 * |
0185 CF_BASE EQU MONIO+$0100 |
0186 CF_DATA EQU CF_BASE+0 |
0187 CF_ERROR EQU CF_BASE+2 ; read error |
0188 CF_FEATURE EQU CF_BASE+2 ; write feature |
0189 CF_SECCNT EQU CF_BASE+4 |
0190 CF_SECNUM EQU CF_BASE+6 |
0191 CF_CYLLO EQU CF_BASE+8 |
0192 CF_CYLHI EQU CF_BASE+10 |
0193 CF_HEAD EQU CF_BASE+12 |
0194 CF_STATUS EQU CF_BASE+14 ; read status |
0195 CF_COMAND EQU CF_BASE+14 ; write command |
0196 CF_AUX EQU CF_BASE+30 |
0197 * |
0198 * Command Equates |
0199 * |
0200 CMDREAD EQU $20 ; Read Single sector |
0201 CMDWRITE EQU $30 ; Write Single sector |
0202 AUXRESET EQU $06 ; Reset IDE |
0203 AUXRSTREL EQU $02 ; Reset release IRQ masked |
0204 HEADLBA EQU $E0 |
0205 * |
0206 * Status bit equates |
0207 * |
0208 BUSY EQU $80 |
0209 DRDY EQU $40 |
0210 DRQ EQU $08 |
0211 ERR EQU $01 |
0212 * |
0213 ENDIF CF8OPT |
0213 ENDIF CF8OPT |
0214 * |
0215 IFD RTCOPT |
0216 * |
0217 ************************************************** |
0218 * MM58167A REAL TIME CLOCK MEMORY MAP: |
0219 ************************************************** |
0220 * |
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 |
0222 * |
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS |
0224 * |
0225 * COUNTER AND COMPARITOR REGISTERS: |
0226 * |
0227 * Both the Clock Counter and Clock Comparitor |
0228 * consist of 8 registers for holding the time. |
0229 * The register offsets from the Counter and |
0230 * Comparitor registers are listed above. |
0231 * |
0232 COUNTR EQU CLOCK+0 |
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS |
0234 * |
0235 * CLOCK REGISTER OFFSETS: |
0236 * These register offsets are used for the CLOCK |
0237 * and comparitor ram CMPRAM. |
0238 * |
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS |
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS |
0241 SECOND EQU 2 |
0242 MINUIT EQU 3 |
0243 HOUR EQU 4 |
0244 WKDAY EQU 5 |
0245 MTHDAY EQU 6 |
0246 MONTH EQU 7 |
0247 * |
0248 * INTERRUPT OUTPUT REGISTERS: |
0249 * |
0250 * An interrupt output may be generated at the |
0251 * following rates by setting the appropriate bit |
0252 * in the Interrupt Control Register (CINTCR). |
0253 * The Interrupt Status Register (CINTSR) must be |
0254 * read to clear the interrupt and will return |
0255 * the source of the interrupt. |
0256 * |
0257 * 1/Month Bit 7 |
0258 * 1/Week Bit 6 |
0259 * 1/Day Bit 5 |
0260 * 1/Hour Bit 4 |
0261 * 1/Minuite Bit 3 |
0262 * 1/Second Bit 2 |
0263 * 10/Second Bit 1 |
0264 * Comparitor Bit 0 |
0265 * |
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER |
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER |
0268 * |
0269 * COUNTER AND RAM RESETS; GO COMMAND. |
0270 * |
0271 * The counter and comparitor may be reset |
0272 * by writing $FF into CTRRES and CMPRES |
0273 * respectivly. |
0274 * A write to the Go command register (GOCMND) |
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths |
0276 * of a second counter. |
0277 * |
0278 CTRRES EQU CLOCK+18 COUNTER RESET |
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET |
0280 GOCMND EQU CLOCK+21 GO COMMAND |
0281 * |
0282 * CLOCK STATUS REGISTER. |
0283 * |
0284 * The counter takes 61 usec. to rollover for |
0285 * every 1KHz clock pulse. If the Status bit is |
0286 * set after reading the counter, the counter |
0287 * should be re-read to ensure the time is correct. |
0288 * |
0289 CLKSTA EQU CLOCK+20 STATUS BIT |
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT |
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER |
0292 ENDIF RTCOPT |
0292 ENDIF RTCOPT |
0293 * |
0294 IFD TRAOPT |
0295 * |
0296 ************************************************** |
0297 * PIA INTERRUPT TIMER |
0298 ************************************************** |
0299 * |
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7 |
0301 * |
0302 ** PIA TIMER FOR SINGLE STEP / TRACE |
0303 * |
0304 * TADATA = Output = Timer preset register |
0305 * TACTRL - CA1 = input = rising edge = NMI |
0306 * - CA2 = Output = Timer Reset (Active High) |
0307 * TBDATA = Input = Timer read back register |
0308 * TBCTRL - CB1 = input = rising edge = FIRQ |
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset |
0310 * |
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0312 * CRA1 = 1 CA1 Rising edge IRQ |
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0315 * CRA4 = 1 ] CA2 = Set/Reset output |
0316 * CRA5 = 1 ] |
0317 * CRA6 = X CA2 Input Interrupt Flag |
0318 * CRA7 = X CA1 Interrupt Flag |
0319 * |
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0321 * CRB1 = 1 CB1 Rising edge IRQ |
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0324 * CRB4 = 1 ] CB2 = Set/Reset output |
0325 * CRB5 = 1 ] |
0326 * CRB6 = X CB2 Input Interrupt Flag |
0327 * CRB7 = X CB1 Interrupt Flag |
0328 * |
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output |
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output |
0331 * |
0332 TADATA EQU MONIO+$70 Timer preset port |
0333 TACTRL EQU MONIO+$71 |
0334 TBDATA EQU MONIO+$72 Timer read back port |
0335 TBCTRL EQU MONIO+$73 |
0336 * |
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) |
0338 * |
0339 ENDIF TRAOPT |
0339 ENDIF TRAOPT |
0340 IFD ADSOPT |
0341 * |
0342 *************************************************** |
0343 * SERIAL PORT FOR DG640 * |
0344 *************************************************** |
0345 * |
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809 |
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA |
0348 * |
0349 ACIAS EQU MONIO+$400 CONTROL PORT |
0350 * |
0351 ENDIF ADSOPT |
0351 ENDIF ADSOPT |
0352 IFD PRTOPT |
0353 * |
0354 *************************************************** |
0355 * PRINTER INTERFACE * |
0356 *************************************************** |
0357 * |
0358 PADATA EQU MONIO+$404 |
0359 PACTRL EQU MONIO+$405 |
0360 PBDATA EQU MONIO+$406 |
0361 PBCTRL EQU MONIO+$407 |
0362 * |
0363 ** CB1 ACK. I/P |
0364 ** CB2 STB. O/P |
0365 ** PB0 - PB7 DATA 1 - 8 O/P |
0366 ** PORT A BIT ASSIGNMENT |
0367 * |
0368 PBUSY EQU $80 I/P |
0369 PEMPTY EQU $40 I/P |
0370 SELECT EQU $20 I/P |
0371 PERROR EQU $10 I/P |
0372 PRESET EQU %00000100 O/P PA3 = 0 |
0373 AUTOFD EQU %00001000 O/P PA2 = 0 |
0374 DIRMSK EQU %00001100 |
0375 ENDIF PRTOPT |
0375 ENDIF PRTOPT |
0376 IFD DG640OPT |
0377 * |
0378 *************************************************** |
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0380 *************************************************** |
0381 * |
0382 ** VIDEO DISPLAY DEFINITIONS |
0383 * |
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY |
0385 LINLEN EQU 64 LENGTH OF A LINE |
0386 NUMLIN EQU 16 NUMBER OF LINES |
0387 SCNLEN EQU $400 LENGTH OF SCREEN |
0388 ENDIF DG640OPT |
0388 ENDIF DG640OPT |
0389 * |
0390 IFD DMAFOPT |
0391 * |
0392 *************************************************** |
0393 * DMAF2 8" DRIVE * |
0394 *************************************************** |
0395 * |
0396 ADDREG EQU $F000 ADDRESS REGISTER |
0397 CNTREG EQU $F002 COUNT REGISTER |
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER |
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER |
0400 AAAREG EQU $F015 ??? |
0401 BBBREG EQU $F016 ??? |
0402 COMREG EQU $F020 1791 COMMAND REGISTER |
0403 SECREG EQU $F022 SECTOR REGISTER |
0404 DRVREG EQU $F024 DRIVE SELECT LATCH |
0405 CCCREG EQU $F040 ??? |
0406 ENDIF DMAFOPT |
0406 ENDIF DMAFOPT |
0407 IFD DATOPT |
0408 ************************************************** |
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS * |
0410 ************************************************** |
0411 * |
0412 FFF0 IC11 EQU $FFF0 DAT RAM CHIP |
0413 55AA TSTPAT EQU $55AA TEST PATTERN |
0414 ENDIF DATOPT |
0415 * |
0003 END |
0000 INCLUDE "sys09bug.txt" |
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR |
0002 OPT l |
|
|
sys09bug.txt page 2 |
0004 * |
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL |
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY.... |
0007 * |
0008 * ALLEN CLARK WALLACE WATSON |
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE. |
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617 |
0011 * PH. 813-977-0347 PH. 813-985-1359 |
0012 * |
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT |
0014 * 2561 NANTUCKET DR APT. E |
0015 * ATLANTA, GA 30345 |
0016 * PH. 404-320-1043 |
0017 * |
0018 * MODIFIED TO SYS09BUG VER 1.0 |
0019 * FOR: SYSTEM09 FPGA SYSTEM |
0020 * BY: JOHN KENT |
0021 * DATE: 21ST NOVEMBER 2006 |
0022 * REMOVED: DISK BOOTS |
0023 * MEMORY TEST |
0024 * ADDED: ADM3A VDU DRIVER |
0025 * |
0026 * MODIFIED TO SYS09BUG VER 1.1 |
0027 * FOR: SYSTEM09 FPGA SYSTEM |
0028 * BY: JOHN KENT |
0029 * DATE: 7TH JANUARY 2007 |
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000 |
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS |
0032 * AND REALTIME CLOCK |
0033 * |
0034 * MODIFIED TO SYS09BUG VER 1.2 |
0035 * FOR: SYSTEM09 FPGA SYSTEM |
0036 * BY: JOHN KENT |
0037 * DATE: 21ST MAY 2007 |
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION |
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD |
0040 * |
0041 * Modified to SYS09BUG VER 1.3 |
0042 * FOR: SYSTEM09 FPGA SYSTEM |
0043 * BY: JOHN KENT |
0044 * DATE: 8TH JAN 2008 |
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD |
0046 * WITH ONLY 32K OF RAM |
0047 * |
0048 * Modified to SYS09BUG VER 1.4 |
0049 * FOR: SYSTEM09 FPGA SYSTEM |
0050 * BY: JOHN KENT |
0051 * DATE: 3RD FEB 2008 |
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE |
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300 |
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE |
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
0056 * |
0057 * *** COMMANDS *** |
0058 * |
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR |
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR |
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER |
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER |
0063 * CONTROL P = ALTER THE PROGRAM COUNTER |
0064 * CONTROL U = ALTER USER STACK POINTER |
0065 * CONTROL X = ALTER "X" INDEX REGISTER |
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER |
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh |
0068 * D = 5.25" MINIFLOPPY BOOT |
0069 * E ssss-eeee = EXAMINE MEMORY |
0070 * FROM STARTING ADDRESS ssss |
0071 * TO ENDING ADDRESS eeee. |
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI |
0073 * L = LOAD TAPE |
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh |
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. |
0076 * R = DISPLAY REGISTER CONTENTS |
0077 * S = DISPLAY STACK FROM ssss TO $DFC0 |
0078 * U = 8" DMAF2 FLOPPY BOOT |
0079 * U = USER EXTENSION COMMANDS AT $F000 |
0080 * X = REMOVE ALL BREAKPOINTS |
0081 * |
0082 * |
0083 *************************************************** |
0084 * SYS09BUG VARIABLE SPACE |
0085 *************************************************** |
0086 * |
0087 DFC0 ORG MONRAM |
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK |
0089 DFC0 NMI RMB 2 USER NMI VECTOR |
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 |
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 |
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR |
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR |
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR |
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN |
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT |
0097 IFD DATOPT |
0098 DFD0 LRARAM RMB 16 LRA ADDRESSES |
0099 ENDIF DATOPT |
0100 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT |
0101 DFE2 ECHO RMB 1 ECHO FLAG |
0102 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR |
0103 IFD TRAOPT |
0104 NMISAV RMB 2 NMI Jump Vector Backup |
0105 TRACNT RMB 2 Trace Count |
0106 ENDIF TRAOPT |
0106 ENDIF TRAOPT |
0107 IFD VDUOPT |
0108 * |
0109 ************************************************** |
0110 * VDU8 DISPLAY DRIVER VARIABLES * |
0111 ************************************************** |
0112 * |
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** |
0114 DFFB COLADX RMB 1 CURSOR COLUMN |
0115 DFFC ROWADX RMB 1 CURSOR ROW |
0116 ************************************************** |
0117 * |
0118 DFFD NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0119 DFFE ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0120 ENDIF VDUOPT |
0121 IFD DG640OPT |
0122 * |
0123 *************************************************** |
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0125 *************************************************** |
0126 * |
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** |
0128 COLADX RMB 1 CURSOR COLUMN |
0129 ROWADX RMB 1 CURSOR ROW |
0130 ************************************************* |
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS |
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0134 ENDIF DG640OPT |
0134 ENDIF DG640OPT |
0135 * |
0136 * |
0137 *************************************************** |
0138 * START OF ROM * |
0139 *************************************************** |
0140 * |
0141 F800 ORG MONROM |
0142 F800 F8 14 FDB MONITOR |
0143 F802 F8 61 FDB NEXTCMD |
0144 F804 FC 9D FDB INCH |
0145 F806 FC 97 FDB INCHE |
0146 F808 FC B5 FDB INCHEK |
0147 F80A FC CA FDB OUTCH |
0148 F80C FB 8F FDB PDATA |
0149 F80E FB 1E FDB PCRLF |
0150 F810 FB 1A FDB PSTRNG |
0151 F812 FA 2E FDB LRA |
0152 * |
0153 IFD ADSOPT |
0154 FDB PCHK CHECK FOR PRINTER INPUT |
0155 FDB PINIZ INITIATE PRINTER |
0156 FDB POUTCH OUTPUT CH. TO PRINTER |
0157 FDB VINIZ |
0158 FDB VOUTCH |
0159 FDB ACINIZ |
0160 FDB AOUTCH |
0161 ENDIF ADSOPT |
0161 ENDIF ADSOPT |
0162 * |
0163 * MONITOR |
0164 * |
0165 * VECTOR ADDRESS STRING IS..... |
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF |
0167 * |
0168 F814 8E FE 6D MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING |
0169 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION |
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16 |
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE |
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF |
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE |
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED |
0175 * |
0176 * CONTENTS FROM TO FUNCTION |
0177 * $F8A1 $FE40 $DFC0 USER-V |
0178 * $F8A1 $FE42 $DFC2 SWI3-V |
0179 * $F8A1 $FE44 $DFC4 SWI2-V |
0180 * $F8A1 $FE46 $DFC6 FIRQ-V |
0181 * $F8A1 $FE48 $DFC8 IRQ-V |
0182 * $FAB0 $FE4A $DFCA SWI-V |
0183 * $FFFF $FE4C $DFCC SVC-VO |
0184 * $FFFF $FE4E $DFCE SVC-VL |
0185 * |
0186 F824 8E E0 00 LDX #ACIAS |
0187 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM |
0188 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS |
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK |
0190 F82F 6F E2 CLRSTK CLR ,-S |
0191 F831 5A DECB |
0192 F832 26 FB BNE CLRSTK |
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY |
0194 F837 AF 6A STX 10,S ON STACK |
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK |
0196 F83B A7 E4 STA ,S |
0197 F83D 1F 43 TFR S,U |
0198 F83F 17 04 9B LBSR IOINIZ INITIALIZE CONTROL PORT |
0199 F842 8E FE 7D LDX #MSG1 POINT TO MONITOR MESSAGE |
0200 F845 17 03 47 LBSR PDATA PRINT MSG |
0201 * |
0202 IFD DATOPT |
0203 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA |
0204 F84B 4F CLRA START TOTAL AT ZERO |
0205 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY |
0206 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC. |
0207 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC. |
0208 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL |
0209 F854 19 DAA ADJ. TOTAL FOR DECIMAL |
0210 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST |
0211 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM |
0212 F858 17 04 0C LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0213 F85B 8E FE 9F LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS |
0214 F85E 17 03 2E LBSR PDATA PRINT MSG |
0215 ENDIF DATOPT |
0216 * |
0217 IFD TRAOPT |
0218 LBSR TRAINZ |
0219 ENDIF TRAOPT |
0219 ENDIF TRAOPT |
0220 * |
0221 ***** NEXTCMD ***** |
0222 * |
0223 F861 8E FE A6 NEXTCMD LDX #MSG3 POINT TO MSG ">" |
0224 F864 17 02 B3 LBSR PSTRNG PRINT MSG |
0225 F867 17 04 33 LBSR INCH GET ONE CHAR. FROM TERMINAL |
0226 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
0227 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ? |
0228 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. |
0229 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM. |
0230 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ? |
0231 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT |
0232 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO... |
0233 F878 17 04 4F LBSR OUTCH PRINT "^" |
0234 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR |
0235 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER |
0236 F87F 17 04 48 PRTCMD LBSR OUTCH PRNT CMD CHAR |
0237 F882 17 04 43 LBSR OUT1S PRNT SPACE |
0238 F885 C1 60 CMPB #$60 |
0239 F887 2F 02 BLE NXTCH0 |
0240 F889 C0 20 SUBB #$20 |
0241 * |
0242 ***** DO TABLE LOOKUP ***** |
0243 * FOR COMMAND FUNCTIONS |
0244 * |
0245 F88B 8E FE 37 NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE |
0246 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
0247 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND |
0248 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
0249 F894 8C FE 6D CMPX #TABEND REACHED END OF TABLE YET ? |
0250 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY |
0251 F899 8E FE A8 LDX #MSG4 POINT TO MSG "WHAT?" |
0252 F89C 17 02 F0 LBSR PDATA PRINT MSG |
0253 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD |
0254 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE |
0255 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND |
0256 * |
0257 * "G" GO OR CONTINUE |
0258 * |
0259 F8A5 1F 34 GO TFR U,S |
0260 F8A7 3B RTI RTI |
0261 * |
0262 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0263 * |
0264 F8A8 17 03 6B MEMCHG LBSR IN1ADR INPUT ADDRESS |
0265 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN |
0266 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y" |
0267 F8AF 8E FE AE MEMC2 LDX #MSG5 POINT TO MSG " - " |
0268 F8B2 17 02 65 LBSR PSTRNG PRINT MSG |
0269 F8B5 1F 21 TFR Y,X FETCH ADDRESS |
0270 F8B7 17 03 A5 LBSR OUT4H PRINT ADDR IN HEX |
0271 F8BA 17 04 0B LBSR OUT1S OUTPUT SPACE |
0272 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR. |
0273 F8BF 17 03 A5 LBSR OUT2H OUTPUT CONTENTS IN ASCII |
0274 F8C2 17 04 03 LBSR OUT1S OUTPUT SPACE |
0275 F8C5 17 03 5E LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
0276 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
0277 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
0278 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN |
0279 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? |
0280 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN |
0281 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW? |
0282 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE |
0283 F8D6 81 0D CMPA #$D IS IT A CR? |
0284 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE |
0285 F8DA 39 CHRTN RTS EXIT ROUTINE |
0286 * |
0287 * |
0288 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY |
0289 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE? |
0290 F8DF 27 08 BEQ FORWRD $F972 |
0291 F8E1 17 03 E4 LBSR OUT1S OUTPUT SPACE |
0292 F8E4 86 3F LDA #'? LOAD QUESTION MARK |
0293 F8E6 17 03 E1 LBSR OUTCH PRINT IT |
0294 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
0295 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS |
0296 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION |
0297 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS |
0298 * |
0299 * "S" DISPLAY STACK |
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM |
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. |
0302 * |
0303 F8F1 17 02 A2 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER |
0304 F8F4 1F 32 TFR U,Y |
0305 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT |
0306 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK |
0307 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS |
0308 * |
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII |
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. |
0311 * UPPER ADDRESS IN X-REG. |
0312 * IF HEX ADDRESSES ARE INVALID (V)=1. |
0313 * |
0314 F8FD 17 03 0B MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES |
0315 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX |
0316 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS |
0317 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? |
0318 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII |
0319 F908 39 EDPRTN RTS ; |
0320 * |
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0322 * TO EVEN 16 BYTE BOUNDRIES. |
0323 * |
0324 * IF LOWER ADDR = $4532 |
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0326 * |
0327 * IF UPPER ADDR = $4567 |
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0329 * |
0330 * ENTER WITH LOWER ADDRESS IN X-REG. |
0331 * -UPPER ADDRESS ON TOP OF STACK. |
0332 * |
0333 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
0334 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS |
0335 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0336 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
0337 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
0338 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0339 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
0340 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
0341 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
0342 F91C 17 03 96 LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
0343 F91F 27 03 BEQ EDUMP |
0344 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
0345 F923 39 RTS ; |
0346 * |
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0349 * |
0350 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
0351 F926 8E FE AE LDX #MSG5 POINT TO MSG " - " |
0352 F929 17 01 EE LBSR PSTRNG PRINT MSG |
0353 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
0354 F92E 17 03 2E LBSR OUT4H PRINT THE ADDRESS |
0355 F931 17 03 92 LBSR OUT2S 2 SPACES |
0356 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
0357 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT |
0358 F938 17 03 2C LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0359 F93B 17 03 8A LBSR OUT1S OUTPUT SPACE |
0360 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT |
0361 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
0362 * |
0363 * PRINT 16 ASCII CHARACTERS |
0364 * IF NOT PRINTABLE OR NOT VALID |
0365 * ASCII PRINT A PERIOD (.) |
0366 F941 17 03 82 LBSR OUT2S 2 SPACES |
0367 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
0368 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 |
0369 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY |
0370 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
0371 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
0372 F94E 81 7E CMPA #$7E IS IT VALID ASCII? |
0373 F950 23 02 BLS PRASC IF SO PRINT IT |
0374 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.) |
0375 F954 17 03 73 PRASC LBSR OUTCH PRINT ASCII CHARACTER |
0376 F957 5A DECB DECREMENT COUNT |
0377 F958 26 EE BNE EDPASC |
0378 F95A 20 BC BRA NXTLIN |
0379 * |
0380 ***** "B" SET BREAKPOINT ***** |
0381 * |
0382 F95C 17 02 B7 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS |
0383 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR. |
0384 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 |
0385 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT |
0386 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK |
0387 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE |
0388 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE |
0389 F96D 35 10 PULS X POP BP ADDRESS FROM STACK |
0390 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE |
0391 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS |
0392 F973 81 3F CMPA #$3F IS IT A SWI? |
0393 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR |
0394 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE |
0395 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE |
0396 F97B 86 3F LDA #$3F LOAD A SWI ($3F) |
0397 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS |
0398 F97F 39 EXITBP RTS ; |
0399 * |
0400 * INDICATE ERROR SETTING BREAKPOINT |
0401 * |
0402 F980 17 03 45 BPERR LBSR OUT1S OUTPUT SPACE |
0403 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR |
0404 F985 16 03 42 LBRA OUTCH PRINT "?" |
0405 * |
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** |
0407 * |
0408 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE |
0409 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0410 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE |
0411 F990 5A DECB $FAAC DECREMENT BP COUNTER |
0412 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE? |
0413 F993 39 RTS |
0414 * |
0415 ***** SWI ENTRY POINT ***** |
0416 * |
0417 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER |
0418 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG |
0419 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE. |
0420 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE |
0421 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR |
0422 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK |
0423 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA |
0424 F9A2 17 02 48 REGPR LBSR REGSTR GO PRINT REGISTERS |
0425 * |
0426 IFD TRAOPT |
0427 LDX #0 |
0428 STX TRACNT |
0429 ENDIF TRAOPT |
0429 ENDIF TRAOPT |
0430 * |
0431 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND |
0432 * |
0433 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE |
0434 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY |
0435 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S |
0436 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS |
0437 F9B1 81 3F CMPA #$3F IS IT SWI? |
0438 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S |
0439 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE |
0440 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS |
0441 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC |
0442 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S |
0443 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S |
0444 F9BF A7 A0 STA ,Y+ |
0445 F9C1 39 RTS |
0446 * |
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH ** |
0448 * |
0449 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE |
0450 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0451 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE |
0452 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? |
0453 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY |
0454 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER |
0455 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH |
0456 F9D1 39 RTS ; |
0457 * |
0458 * |
0459 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY |
0460 F9D4 39 RTS |
0461 * |
0462 IFD TRAOPT |
0463 * |
0464 ** TRACE from address AAAA BB bytes |
0465 * |
0466 TRACE LBSR ALTPC1 SET UP NEW PC |
0467 BVS TREXIT ADDRESS ERROR, EXIT |
0468 LBSR OUT1S |
0469 LBSR IN1ADR Fetch Byte Count |
0470 BVS TREXIT Byte Count error, EXIT |
0471 STX TRACNT |
0472 * |
0473 LDX NMI Save NMI Vector |
0474 STX NMISAV |
0475 LDX #NMIE Set up NMI for Tracing |
0476 STX NMI |
0477 LBSR TRAINZ Initialise Hardware |
0478 BRA TRACEG Start Trace |
0479 TREXIT RTS |
0480 * |
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0482 * CRA1 = 1 CA1 Rising edge IRQ |
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0485 * CRA4 = 1 ] CA2 = Set/Reset output |
0486 * CRA5 = 1 ] |
0487 * CRA6 = X CA2 Input Interrupt Flag |
0488 * CRA7 = X CA1 Interrupt Flag |
0489 * |
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0491 * CRB1 = 1 CB1 Rising edge IRQ |
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0494 * CRB4 = 1 ] CB2 = Set/Reset output |
0495 * CRB5 = 1 ] |
0496 * CRB6 = X CB2 Input Interrupt Flag |
0497 * CRB7 = X CB1 Interrupt Flag |
0498 * |
0499 * |
0500 ** TRACE NMI ENTRY POINT |
0501 * |
0502 NMIE TFR S,U |
0503 LDA #$36 Disable Interrupt, CA2 Low |
0504 STA TACTRL |
0505 LDA TADATA Clear Interrupt flag by reading data port |
0506 * |
0507 LBSR REGSTR DUMP REGISTERS |
0508 * |
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI |
0510 LDA ,X |
0511 CMPA #$3F |
0512 BEQ TRACEX EXIT ON SWI |
0513 * |
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED |
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR |
0516 LEAX -1,X DECREMENT TRACE COUNT |
0517 STX TRACNT |
0518 * |
0519 ** TRACE GO (RESUME SINGLE STEP) |
0520 * |
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER |
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) |
0523 STA TADATA |
0524 LDA #$36 LOAD STROBE LOW |
0525 STA TACTRL |
0526 LDA TADATA CLEAR INTERRUPT |
0527 LDA #$36 RELEASE RESET |
0528 STA TBCTRL |
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE |
0530 STA TACTRL |
0531 RTI GO EXECUTE INSTRUCTION |
0532 * |
0533 TRACEX LDX NMISAV Restore NMI vector |
0534 STX NMI |
0535 LBRA NEXTCMD Jump back to the command loop. |
0536 * |
0537 ** TRACE HARDWARE INITIALISATION |
0538 * |
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED |
0540 STA TACTRL |
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED |
0542 STA TBCTRL |
0543 LDA #$FF PORTA = OUTPUT |
0544 STA TADATA |
0545 LDA #$00 PORTB = INPUT |
0546 STA TBDATA |
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW |
0548 STA TACTRL |
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH |
0550 STA TBCTRL |
0551 RTS |
0552 * |
0553 ENDIF TRAOPT |
0553 ENDIF TRAOPT |
0554 IFD MFDCOPT |
0555 * |
0556 ** "U" MINI DISK BOOT |
0557 * |
0558 MINBOOT TST CMDFDC |
0559 CLR DRVFDC |
0560 LDX #$0000 |
0561 LOOP LEAX $01,X |
0562 CMPX #$0000 |
0563 BNE LOOP |
0564 LDA #$0F |
0565 STA CMDFDC |
0566 BSR DELAY |
0567 LOOP1 LDB CMDFDC |
0568 BITB #$01 |
0569 BNE LOOP1 |
0570 LDA #$01 |
0571 STA SECFDC |
0572 BSR DELAY |
0573 LDA #$8C |
0574 STA CMDFDC |
0575 BSR DELAY |
0576 LDX #$C000 |
0577 BRA LOOP3 |
0578 LOOP2 BITB #$02 |
0579 BEQ LOOP3 |
0580 LDA DATFDC |
0581 STA ,X+ |
0582 LOOP3 LDB CMDFDC |
0583 BITB #$01 |
0584 BNE LOOP2 |
0585 BITB #$2C |
0586 BEQ LOOP4 |
0587 RTS |
0588 * |
0589 LOOP4 LDX #$C000 |
0590 STX $0A,U |
0591 TFR U,S |
0592 RTI |
0593 * |
0594 DELAY LDB #$04 |
0595 LOOP5 DECB |
0596 BNE LOOP5 |
0597 RTS |
0598 ENDIF MFDCOPT |
0598 ENDIF MFDCOPT |
0599 * |
0600 IFD DMAFOPT |
0601 * |
0602 *** "D" DISK BOOT FOR DMAF2 *** |
0603 * |
0604 DBOOT LDA #$DE |
0605 STA DRVREG |
0606 LDA #$FF |
0607 STA PRIREG $FAF8 |
0608 STA CCREG |
0609 STA AAAREG |
0610 STA BBBREG |
0611 TST CCREG |
0612 LDA #$D8 |
0613 STA COMREG |
0614 LBSR DLY |
0615 DBOOT0 LDA COMREG |
0616 BMI DBOOT0 |
0617 LDA #$09 |
0618 STA COMREG |
0619 LBSR DLY |
0620 * |
0621 DISKWT LDA COMREG FETCH DRIVE STATUS |
0622 BITA #1 TEST BUSY BIT |
0623 BNE DISKWT LOOP UNTIL NOT BUSY |
0624 * |
0625 BITA #$10 |
0626 BNE DBOOT |
0627 * |
0628 LDX #$C000 LOGICAL ADDR. = $C000 |
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. |
0630 ORA #$10 |
0631 STA CCCREG |
0632 TFR X,D |
0633 COMA ; |
0634 COMB ; |
0635 STD ADDREG |
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100 |
0637 STX CNTREG STORE IN COUNT REGISTER |
0638 LDA #$FF LOAD THE CHANNEL REGISTER |
0639 STA CCREG |
0640 LDA #$FE SET CHANNEL 0 |
0641 STA PRIREG |
0642 LDA #1 SET SECTOR TO "1" |
0643 STA SECREG ISSUE COMMAND |
0644 LDA #$8C SET SINGLE SECTOR READ |
0645 STA COMREG ISSUE COMMAND |
0646 BSR DLY |
0647 * |
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE |
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT |
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7" |
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT |
0652 * IS STILL A ONE THE BOOT OPERATION WILL |
0653 * BE STARTED OVER FROM THE BEGINING. |
0654 * |
0655 CLRB ; |
0656 DBOOT1 PSHS B $FB55 |
0657 CLRB ; |
0658 DBOOT2 TST CCREG |
0659 BPL DBOOT3 |
0660 DECB ; |
0661 BNE DBOOT2 |
0662 PULS B |
0663 DECB |
0664 BNE DBOOT1 |
0665 BRA DBOOT |
0666 DBOOT3 PULS B |
0667 LDA COMREG |
0668 BITA #$1C |
0669 BEQ DBOOT4 |
0670 RTS ; |
0671 * |
0672 * |
0673 DBOOT4 LDB #$DE |
0674 STB DRVREG |
0675 LDX #$C000 |
0676 STX 10,U |
0677 TFR U,S $FB7B |
0678 RTI ; |
0679 ENDIF DMAFOPT |
0679 ENDIF DMAFOPT |
0680 * |
0681 IFD CF8OPT |
0682 * |
0683 * COMPACT FLASH BOOT |
0684 * |
0685 F9D5 8D 40 CFBOOT BSR WAITRDY |
0686 F9D7 86 E0 LDA #HEADLBA |
0687 F9D9 B7 E0 46 STA CF_HEAD |
0688 F9DC 8D 39 BSR WAITRDY |
0689 F9DE 86 01 LDA #FEAT8BIT |
0690 F9E0 B7 E0 41 STA CF_FEATURE |
0691 F9E3 86 EF LDA #CMDFEATURE |
0692 F9E5 B7 E0 47 STA CF_COMAND |
0693 F9E8 8D 2D BSR WAITRDY |
0694 * |
0695 * READ SECTORS FROM CF |
0696 * |
0697 F9EA 86 01 CFREAD LDA #$01 |
0698 F9EC B7 E0 42 STA CF_SECCNT |
0699 F9EF 4F CLRA |
0700 F9F0 B7 E0 43 STA CF_SECNUM |
0701 F9F3 B7 E0 44 STA CF_CYLLO |
0702 F9F6 B7 E0 45 STA CF_CYLHI |
0703 * |
0704 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE |
0705 F9FB B7 E0 47 STA CF_COMAND |
0706 F9FE 8D 17 BSR WAITRDY |
0707 FA00 8E C0 00 LDX #$C000 |
0708 * |
0709 * READ LOOP |
0710 * |
0711 FA03 8D 21 RDLOOP BSR WAITDRQ |
0712 FA05 B6 E0 40 LDA CF_DATA |
0713 FA08 A7 80 STA ,X+ |
0714 FA0A 8C C2 00 CMPX #$C200 |
0715 FA0D 26 F4 BNE RDLOOP |
0716 * |
0717 FA0F 8E C0 00 LDX #$C000 |
0718 FA12 AF 4A STX $0A,U |
0719 FA14 1F 34 TFR U,S |
0720 FA16 3B RTI |
0721 * |
0722 * WAIT UNTIL READY |
0723 * |
0724 FA17 B6 E0 47 WAITRDY LDA CF_STATUS |
0725 FA1A 85 80 BITA #BUSY |
0726 FA1C 26 F9 BNE WAITRDY |
0727 FA1E B6 E0 47 LDA CF_STATUS |
0728 FA21 85 40 BITA #DRDY |
0729 FA23 27 F2 BEQ WAITRDY |
0730 FA25 39 RTS |
0731 * |
0732 * WAIT FOR DATA REQUEST |
0733 * |
0734 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS |
0735 FA29 85 08 BITA #DRQ |
0736 FA2B 27 F9 BEQ WAITDRQ |
0737 FA2D 39 RTS |
0738 ENDIF CF8OPT |
0739 * |
0740 IFD IDEOPT |
0741 * |
0742 * XESS 16 BIT IDE BOOT |
0743 * |
0744 IDEBOOT LDD #AUXRESET |
0745 STD CF_AUX |
0746 LDD #AUXRSTREL |
0747 STD CF_AUX |
0748 LDD #HEADLBA |
0749 STD CF_HEAD |
0750 BSR WAITRDY |
0751 * |
0752 * READ SECTORS FROM CF |
0753 * |
0754 LDD #$01 |
0755 STD CF_SECCNT |
0756 CLRB |
0757 STD CF_SECNUM |
0758 STD CF_CYLLO |
0759 STD CF_CYLHI |
0760 * |
0761 LDB #CMDREAD ; IDE READ MULTIPLE |
0762 STD CF_COMAND |
0763 BSR WAITRDY |
0764 LDX #$C000 |
0765 * |
0766 * READ LOOP |
0767 * |
0768 RDLOOP BSR WAITDRQ |
0769 LDD CF_DATA |
0770 STB ,X+ |
0771 CMPX #$C100 |
0772 BNE RDLOOP |
0773 * |
0774 LDX #$C000 |
0775 STX $0A,U |
0776 TFR U,S |
0777 RTI |
0778 * |
0779 * WAIT UNTIL READY |
0780 * |
0781 WAITRDY LDD CF_STATUS |
0782 BITB #BUSY |
0783 BNE WAITRDY |
0784 LDD CF_STATUS |
0785 BITB #DRDY |
0786 BEQ WAITRDY |
0787 RTS |
0788 * |
0789 * WAIT FOR DATA REQUEST |
0790 * |
0791 WAITDRQ LDD CF_STATUS |
0792 BITB #DRQ |
0793 BEQ WAITDRQ |
0794 RTS |
0795 ENDIF IDEOPT |
0795 ENDIF IDEOPT |
0796 * |
0797 IFD RTCOPT |
0798 * |
0799 * CLOCK INTER FACE UTILITY |
0800 * |
0801 * TIME <Hours> <Minuits> <Seconds> |
0802 * If no argument is specified, the current time |
0803 * will be displayed. |
0804 * |
0805 * READ A REGISTER FROM THE COUNTER. |
0806 * The X Index rgister points to the register |
0807 * to be read. The Status Register is checked |
0808 * before and after the register is read before |
0809 * returning a value in accumulator A |
0810 * |
0811 RDCLK TST CLKSTA |
0812 BNE RDCLK |
0813 RDCLK1 LDA 0,X |
0814 TST CLKSTA |
0815 BNE RDCLK1 |
0816 RTS |
0817 * |
0818 * MAIN PROGRAM: |
0819 * |
0820 TIMSET LDX #COUNTR POINT TO TIMER |
0821 LBSR BYTE READ HOURS |
0822 BVS SHOWTM NO ARG, DISP TIME |
0823 STA HOUR,X |
0824 LBSR OUT1S |
0825 LBSR BYTE READ MINUITES |
0826 BVS SHOWTM |
0827 STA MINUIT,X |
0828 LBSR OUT1S |
0829 LBSR BYTE SECONDS. |
0830 BVS SHOWTM |
0831 STA SECOND,X |
0832 * |
0833 * DISPLAY CURRENT TIME |
0834 * |
0835 SHOWTM LBSR PCRLF |
0836 LDX #COUNTR+HOUR |
0837 LDB #3 |
0838 SHOWLP BSR RDCLK |
0839 LBSR OUT2H |
0840 LDA #': |
0841 LBSR OUTCH |
0842 LEAX -1,X |
0843 DECB |
0844 BNE SHOWLP |
0845 RTS |
0846 * |
0847 * INITIATE CLOCK. |
0848 * MASK INTERRUPTS. |
0849 * |
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS |
0851 TST CINTSR CLEAR ANY INTERRUPTS |
0852 RTS |
0853 ENDIF RTCOPT |
0853 ENDIF RTCOPT |
0854 IFD DATOPT |
0855 * |
0856 ***** LRA LOAD REAL ADDRESS ***** |
0857 * |
0858 * THE FOLLOWING CODE LOADS THE 20-BIT |
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE |
0860 * INTO THE "A" AND "X" REGISTERS. THIS |
0861 * ROUTINE IS ENTERED WITH THE LOGICAL |
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX" |
0863 * REGISTER. EXIT IS MADE WITH THE HIGH- |
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL |
0865 * ADDRESS IN THE "A" REGISTER, AND THE |
0866 * LOW-ORDER 16-BITS OF THE 20-BIT |
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER. |
0868 * ALL OTHER REGISTERS ARE PRESERVED. |
0869 * THIS ROUTINE IS REQUIRED SINCE THE |
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST |
0871 * PRESENT PHYSICAL ADDRESSES ON THE |
0872 * SYSTEM BUS. |
0873 * |
0874 FA2E 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK |
0875 FA30 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK |
0876 FA32 44 LSRA ; |
0877 FA33 44 LSRA ADJ FOR INDEXED INTO |
0878 FA34 44 LSRA CORRESPONDING LOCATION |
0879 FA35 44 LSRA IN LRA TABLE |
0880 FA36 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS |
0881 FA3A E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE |
0882 FA3C 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED |
0883 FA3D 54 LSRB PHYSICAL ADDRESS. |
0884 FA3E 54 LSRB EXTENDED MS 4-BITS ARE RETURNED |
0885 FA3F 54 LSRB IN THE "A" ACCUMULATOR |
0886 FA40 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK |
0887 FA42 E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE |
0888 FA44 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG |
0889 FA45 58 ASLB ADJ DATA FOR RELOCATION IN X REG |
0890 FA46 58 ASLB ; |
0891 FA47 58 ASLB $FB97 |
0892 FA48 58 ASLB ; |
0893 FA49 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR. |
0894 FA4B 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS |
0895 FA4D A7 62 STA 2,S SAVE IT IN X REG ON STACK |
0896 FA4F EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. |
0897 * |
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS |
0899 FA51 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG |
0900 * ON STACK |
0901 FA53 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK |
0902 ENDIF DATOPT |
0903 * |
0904 * DELAY LOOP |
0905 * |
0906 FA55 34 04 DLY PSHS B SAVE CONTENTS OF "B" |
0907 FA57 C6 20 LDB #$20 GET LOOP DELAY VALUE |
0908 FA59 5A SUB1 DECB SUBTRACT ONE FROM VALUE |
0909 FA5A 26 FD BNE SUB1 LOOP UNTIL ZERO |
0910 FA5C 35 84 PULS B,PC RESTORE CONTENTS OF "B" |
0911 * RTS ; |
0912 * |
0913 ***** "L" LOAD MIKBUG TAPE ***** |
0914 * |
0915 FA5E BD FC DF LOAD JSR ACINIZ |
0916 FA61 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE |
0917 FA63 17 02 64 LBSR OUTCH OUTPUT IT TO TERMINAL PORT |
0918 FA66 7F DF E2 CLR ECHO TURN OFF ECHO FLAG |
0919 FA69 17 02 26 LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO |
0920 FA6C 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? |
0921 FA6E 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. |
0922 FA70 17 02 1F LBSR ECHON |
0923 FA73 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ? |
0924 FA75 27 3D BEQ LOAD21 IF SO, EXIT LOAD |
0925 FA77 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? |
0926 FA79 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR. |
0927 FA7B 17 01 A8 LBSR BYTE INPUT BYTE COUNT |
0928 FA7E 34 02 PSHS A PUSH COUNT ON STACK |
0929 FA80 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX |
0930 FA82 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS |
0931 FA85 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX |
0932 FA87 34 10 PSHS X PUSH ADDR ON STACK |
0933 FA89 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE |
0934 FA8B EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM |
0935 FA8D EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM |
0936 FA8F 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS |
0937 FA91 6A E4 DEC ,S ADDRESS BYTES. |
0938 FA93 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK |
0939 FA95 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) |
0940 FA98 35 04 PULS B POP CHECKSUM FROM STACK |
0941 FA9A 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX |
0942 FA9C 34 02 PSHS A PUSH DATA BYTE ON STACK |
0943 FA9E EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK |
0944 FAA0 6A E4 DEC ,S DECREMENT BYTE COUNT 1 |
0945 FAA2 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM |
0946 FAA4 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY |
0947 FAA6 20 EB BRA LOAD10 GET NEXT DATA BYTE |
0948 FAA8 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; |
0949 FAA9 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) |
0950 FAAB C1 FF CMPB #$FF CHECKSUM OK? |
0951 FAAD 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE |
0952 FAAF 86 3F LDA #'? LOAD (?) ERROR INDICATOR |
0953 FAB1 17 02 16 LBSR OUTCH OUTPUT IT TO TERMINAL |
0954 FAB4 73 DF E2 LOAD21 COM ECHO TURN ECHO ON |
0955 FAB7 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE |
0956 FAB9 16 02 0E LBRA OUTCH OUTPUT IT |
0957 * |
0958 ***** "P" PUNCH MIKBUG TAPE ***** |
0959 * |
0960 FABC 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK |
0961 FABE 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS |
0962 FAC1 34 30 PSHS X,Y SAVE ADDRESSES ON STACK |
0963 FAC3 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH |
0964 FAC5 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR |
0965 FAC7 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH |
0966 FAC9 30 01 LEAX 1,X INCREMENT END ADDRESS |
0967 FACB AF E4 STX ,S STORE END ADDR ON STACK |
0968 FACD BD FC DF JSR ACINIZ |
0969 FAD0 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE |
0970 FAD2 17 01 F5 LBSR OUTCH OUTPUT IT TO TERMINAL |
0971 FAD5 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC |
0972 FAD7 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END |
0973 FAD9 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT |
0974 FADB 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES? |
0975 FADF 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES |
0976 FAE1 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. |
0977 FAE3 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT |
0978 FAE5 8E FE EF LDX #MSG20 POINT TO MSG "S1" |
0979 FAE8 17 00 2F LBSR PSTRNG PRINT MSG |
0980 FAEB CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT |
0981 FAED 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH |
0982 FAEF 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT |
0983 FAF2 AE 62 LDX 2,S LOAD BEGIN ADDRESS |
0984 FAF4 17 01 68 LBSR OUT4H PUNCH ADDRESS |
0985 FAF7 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM |
0986 FAF9 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM |
0987 FAFB EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM |
0988 FAFD A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH |
0989 FAFF 17 01 65 LBSR OUT2H OUTPUT DATA BYTE |
0990 FB02 6A 64 DEC 4,S DECREMENT BYTE COUNT |
0991 FB04 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE |
0992 FB06 53 COMB 1's COMPLIMENT CHECKSUM BYTE |
0993 FB07 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH |
0994 FB09 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE |
0995 FB0C AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR |
0996 FB0E AC E4 CMPX ,S COMPARE IT TO END ADDR |
0997 FB10 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. |
0998 FB12 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE |
0999 FB14 17 01 B3 LBSR OUTCH OUTPUT IT |
1000 FB17 32 65 LEAS 5,S READJUST STACK POINTER |
1001 FB19 39 RTS ; |
1002 * |
1003 * PRINT STRING PRECEEDED BY A CR & LF. |
1004 * |
1005 FB1A 8D 02 PSTRNG BSR PCRLF PRINT CR/LF |
1006 FB1C 20 71 BRA PDATA PRINT STRING POINTED TO BY IX |
1007 * |
1008 * PCRLF |
1009 * |
1010 FB1E 34 10 PCRLF PSHS X SAVE IX |
1011 FB20 8E FE A0 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
1012 FB23 17 00 69 LBSR PDATA PRINT MSG |
1013 FB26 35 90 PULS X,PC RESTORE IX & RETURN |
1014 * |
1015 * LONG BRANCHES TO COMMON ROUTINES |
1016 * |
1017 FB28 16 01 9D JOUT1S LBRA OUT1S |
1018 FB2B 16 00 F8 JBYTE LBRA BYTE |
1019 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR |
1020 * |
1021 * ALTER "PC" PROGRAM COUNTER |
1022 * |
1023 FB31 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " |
1024 FB34 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE |
1025 FB36 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC" |
1026 FB38 29 02 BVS ALTPCD EXIT IF INVALID HEX |
1027 FB3A AF 4A STX 10,U POKE IN NEW CONTENTS |
1028 FB3C 39 ALTPCD RTS ; |
1029 * |
1030 * ALTER "U" USER STACK POINTER |
1031 * |
1032 FB3D 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = " |
1033 FB3F 8D E7 BSR JOUT1S OUTPUT SPACE |
1034 FB41 8D EB BSR JIN1ADR |
1035 FB43 29 02 BVS ALTUD |
1036 FB45 AF 48 STX 8,U |
1037 FB47 39 ALTUD RTS ; |
1038 * |
1039 * ALTER "Y" INDEX REGISTER |
1040 * |
1041 FB48 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = " |
1042 FB4A 8D DC BSR JOUT1S OUTPUT SPACE |
1043 FB4C 8D E0 BSR JIN1ADR |
1044 FB4E 29 02 BVS ALTYD |
1045 FB50 AF 46 STX 6,U $F8F0 |
1046 FB52 39 ALTYD RTS ; |
1047 * |
1048 * ALTER "X" INDEX REGISTER |
1049 * |
1050 FB53 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " |
1051 FB55 8D D1 BSR JOUT1S OUTPUT SPACE |
1052 FB57 8D D5 BSR JIN1ADR |
1053 FB59 29 02 BVS ALTXD |
1054 FB5B AF 44 STX 4,U |
1055 FB5D 39 ALTXD RTS ; |
1056 * |
1057 * ALTER "DP" DIRECT PAGE REGISTER |
1058 * |
1059 FB5E 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " |
1060 FB60 8D C6 BSR JOUT1S OUTPUT SPACE |
1061 FB62 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1062 FB64 29 02 BVS ALTDPD |
1063 FB66 A7 43 STA 3,U |
1064 FB68 39 ALTDPD RTS ; |
1065 * |
1066 * ALTER "B" ACCUMULATOR |
1067 * |
1068 FB69 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = " |
1069 FB6B 8D BB BSR JOUT1S OUTPUT SPACE |
1070 FB6D 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1071 FB6F 29 02 BVS ALTBD |
1072 FB71 A7 42 STA 2,U |
1073 FB73 39 ALTBD RTS $F91C |
1074 * |
1075 * ALTER "A" ACCUMULATOR |
1076 * |
1077 FB74 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = " |
1078 FB76 8D B0 BSR JOUT1S OUTPUT SPACE |
1079 FB78 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1080 FB7A 29 02 BVS ALTAD |
1081 FB7C A7 41 STA 1,U |
1082 FB7E 39 ALTAD RTS ; |
1083 * |
1084 * ALTER "CC" REGISTER |
1085 * |
1086 FB7F 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " |
1087 FB81 8D A5 BSR JOUT1S OUTPUT SPACE |
1088 FB83 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1089 FB85 29 04 BVS ALTCCD |
1090 FB87 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST |
1091 FB89 A7 C4 STA ,U |
1092 FB8B 39 ALTCCD RTS ; |
1093 * |
1094 * PDATA |
1095 * |
1096 FB8C 17 01 3B PRINT LBSR OUTCH |
1097 FB8F A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
1098 FB91 81 04 CMPA #4 IS IT EOT? |
1099 FB93 26 F7 BNE PRINT IF NOT EOT PRINT IT |
1100 FB95 39 RTS ; |
1101 * |
1102 * PRINT REGISTERS |
1103 * |
1104 FB96 8E FE B2 PRTSP LDX #MSG10 POINT TO MSG "SP=" |
1105 FB99 8D F4 BSR PDATA PRINT MSG |
1106 FB9B 1F 31 TFR U,X |
1107 FB9D 16 00 BF JOUT4H LBRA OUT4H |
1108 * |
1109 FBA0 8E FE BE PRTUS LDX #MSG12 POINT TO MSG "US=" |
1110 FBA3 8D EA BSR PDATA PRINT MSG |
1111 FBA5 AE 48 LDX 8,U |
1112 FBA7 20 F4 BRA JOUT4H |
1113 * |
1114 FBA9 8E FE D0 PRTDP LDX #MSG15 POINT TO MSG "DP=" |
1115 FBAC 8D E1 BSR PDATA PRINT MSG |
1116 FBAE A6 43 LDA 3,U |
1117 FBB0 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII |
1118 * |
1119 FBB3 8E FE CA PRTIX LDX #MSG14 POINT TO MSG "IX=" |
1120 FBB6 8D D7 BSR PDATA PRINT MSG |
1121 FBB8 AE 44 LDX 4,U $FCE6 |
1122 FBBA 20 E1 BRA JOUT4H |
1123 * |
1124 FBBC 8E FE C4 PRTIY LDX #MSG13 POINT TO MSG "IY=" |
1125 FBBF 8D CE BSR PDATA PRINT MSG |
1126 FBC1 AE 46 LDX 6,U |
1127 FBC3 20 D8 BRA JOUT4H |
1128 * |
1129 FBC5 8E FE B8 PRTPC LDX #MSG11 POINT TO MSG "PC=" |
1130 FBC8 8D C5 BSR PDATA PRINT MSG |
1131 FBCA AE 4A LDX 10,U |
1132 FBCC 20 CF BRA JOUT4H |
1133 * |
1134 FBCE 8E FE D6 PRTA LDX #MSG16 POINT TO MSG "A=" |
1135 FBD1 8D BC BSR PDATA PRINT MSG |
1136 FBD3 A6 41 LDA 1,U |
1137 FBD5 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1138 * |
1139 FBD7 8E FE DB PRTB LDX #MSG17 POINT TO MSG "B=" |
1140 FBDA 8D B3 BSR PDATA PRINT MSG |
1141 FBDC A6 42 LDA 2,U |
1142 FBDE 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1143 * |
1144 FBE0 8E FE E0 PRTCC LDX #MSG18 POINT TO MSG "CC:" |
1145 FBE3 8D AA BSR PDATA PRINT MSG |
1146 FBE5 A6 C4 LDA ,U |
1147 FBE7 8E FE E7 LDX #MSG19 POINT TO MSG "EFHINZVC" |
1148 FBEA 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT |
1149 * |
1150 * "R" DISPLAY REGISTERS |
1151 * |
1152 FBED 8E FE AE REGSTR LDX #MSG5 POINT TO MSG " - " |
1153 FBF0 17 FF 27 LBSR PSTRNG PRINT MSG |
1154 FBF3 8D A1 BSR PRTSP $FCBF |
1155 FBF5 8D A9 BSR PRTUS $FCCA |
1156 FBF7 8D B0 BSR PRTDP $FCD5 |
1157 FBF9 8D B8 BSR PRTIX $FCE0 |
1158 FBFB 8D BF BSR PRTIY $FCEB |
1159 FBFD 8E FE AE LDX #MSG5 POINT TO MSG " - " |
1160 FC00 17 FF 17 LBSR PSTRNG PRINT MSG |
1161 FC03 8D C0 BSR PRTPC $FCF5 |
1162 FC05 8D C7 BSR PRTA $FCFF |
1163 FC07 8D CE BSR PRTB $FD09 |
1164 FC09 20 D5 BRA PRTCC $FD13 |
1165 * |
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. |
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". |
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT |
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX |
1171 * ADDRESS IS INPUT. |
1172 * |
1173 FC0B 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS |
1174 FC0D 29 4D BVS NOTHEX EXIT IF NOT VALID HEX |
1175 FC0F 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY" |
1176 FC11 86 2D LDA #'- |
1177 FC13 17 00 B4 LBSR OUTCH PRINT " - " |
1178 * |
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
1182 * |
1183 FC16 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) |
1184 FC18 29 42 BVS NOTHEX EXIT IF NOT VALID HEX |
1185 FC1A 1F 01 TFR D,X |
1186 FC1C 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) |
1187 FC1E 29 3C BVS NOTHEX |
1188 FC20 34 10 PSHS X |
1189 FC22 A7 61 STA 1,S |
1190 FC24 35 90 PULS X,PC |
1191 * |
1192 ***** INPUT BYTE (2 HEX CHAR.) ***** |
1193 * |
1194 FC26 8D 11 BYTE BSR INHEX GET HEX LEFT |
1195 FC28 29 32 BVS NOTHEX EXIT IF NOT VALID HEX |
1196 FC2A 48 ASLA ; |
1197 FC2B 48 ASLA ; |
1198 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE |
1199 FC2D 48 ASLA ; |
1200 FC2E 1F 89 TFR A,B PUT HEXL IN "B" |
1201 FC30 8D 07 BSR INHEX GET HEX RIGHT |
1202 FC32 29 28 BVS NOTHEX EXIT IF NOT VALID HEX |
1203 FC34 34 04 PSHS B PUSH HEXL ON STACK |
1204 FC36 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
1205 FC38 39 RTS RETURN WITH HEX L&R IN "A" |
1206 * |
1207 * |
1208 FC39 8D 57 INHEX BSR ECHON INPUT ASCII CHAR. |
1209 FC3B 81 30 CMPA #'0 IS IT > OR = "0" ? |
1210 FC3D 25 1D BCS NOTHEX IF LESS IT AIN'T HEX |
1211 FC3F 81 39 CMPA #'9 IS IT < OR = "9" ? |
1212 FC41 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA |
1213 FC43 80 30 SUBA #$30 ASCII ADJ. NUMERIC |
1214 FC45 39 RTS ; |
1215 * |
1216 * |
1217 FC46 81 41 INHEXA CMPA #'A IS IT > OR = "A" |
1218 FC48 25 12 BCS NOTHEX IF LESS IT AIN'T HEX |
1219 FC4A 81 46 CMPA #'F IS IT < OR = "F" ? |
1220 FC4C 22 03 BHI INHEXL IF > IT AIN'T HEX |
1221 FC4E 80 37 SUBA #$37 ASCII ADJ. ALPHA |
1222 FC50 39 RTS ; |
1223 * |
1224 FC51 81 61 INHEXL CMPA #'a IS IT > OR = "a" |
1225 FC53 25 07 BCS NOTHEX IF LESS IT AIN'T HEX |
1226 FC55 81 66 CMPA #'f IS IT < "f" |
1227 FC57 22 03 BHI NOTHEX IF > IT AIN'T HEX |
1228 FC59 80 57 SUBA #$57 ADJUST TO LOWER CASE |
1229 FC5B 39 RTS ; |
1230 * |
1231 * |
1232 FC5C 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
1233 FC5E 39 RTS ; |
1234 * |
1235 * |
1236 FC5F 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK |
1237 FC61 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. |
1238 FC63 8D 02 BSR OUTHL OUTPUT HEX LEFT |
1239 FC65 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. |
1240 FC67 OUTHL EQU * |
1241 FC67 34 02 OUT2H PSHS A SAVE IT BACK ON STACK |
1242 FC69 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
1243 FC6A 44 LSRA ; |
1244 FC6B 44 LSRA ; |
1245 FC6C 44 LSRA ; |
1246 FC6D 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII |
1247 FC6F 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
1248 FC71 84 0F ANDA #$0F STRIP LEFT NIBBLE |
1249 FC73 8B 30 XASCII ADDA #$30 ASCII ADJ |
1250 FC75 81 39 CMPA #$39 IS IT < OR = "9" ? |
1251 FC77 2F 02 BLE OUTC IF LESS, OUTPUT IT |
1252 FC79 8B 07 ADDA #7 IF > MAKE ASCII LETTER |
1253 FC7B 20 4D OUTC BRA OUTCH OUTPUT CHAR |
1254 * |
1255 * BINARY / ASCII --- THIS ROUTINE |
1256 * OUTPUTS A BYTE IN ENHANCED |
1257 * BINARY FORMAT. THE ENHANCEMENT |
1258 * IS DONE BY SUBSTITUTING ASCII |
1259 * LETTERS FOR THE ONES IN THE BYTE. |
1260 * THE ASCII ENHANCEMENT LETTERS |
1261 * ARE OBTAINED FROM THE STRING |
1262 * POINTED TO BY THE INDEX REG. "X". |
1263 * |
1264 FC7D 34 02 BIASCI PSHS A SAVE "A" ON STACK |
1265 FC7F C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE |
1266 FC81 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING |
1267 FC83 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 |
1268 FC85 25 02 BCS PRTBA IF ONE PRINT LETTER |
1269 FC87 86 2D LDA #'- IF ZERO PRINT "-" |
1270 FC89 8D 3F PRTBA BSR OUTCH PRINT IT |
1271 FC8B 8D 3B BSR OUT1S PRINT SPACE |
1272 FC8D 5A DECB SUB 1 FROM #BITS YET TO PRINT |
1273 FC8E 26 F1 BNE OUTBA |
1274 FC90 35 82 PULS A,PC |
1275 * |
1276 IFD EXTOPT |
1277 * |
1278 * EXTENDED USER COMMANDS |
1279 * |
1280 USRCMD JMP [MONEXT+EXTCMD] |
1281 ENDIF EXTOPT |
1281 ENDIF EXTOPT |
1282 * |
1283 * |
1284 FC92 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ? |
1285 FC95 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR |
1286 * |
1287 * INCHE |
1288 * |
1289 * ---GETS CHARACTER FROM TERMINAL AND |
1290 * ECHOS SAME. THE CHARACTER IS RETURNED |
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY |
1292 * BIT MASKED OFF. ALL OTHER REGISTERS |
1293 * ARE PRESERVED. |
1294 * |
1295 FC97 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL |
1296 FC99 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
1297 FC9B 20 2D BRA OUTCH ECHO CHAR TO TERMINAL |
1298 * |
1299 * INCH |
1300 * |
1301 * GET CHARACTER FROM TERMINAL. RETURN |
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
1304 * IS 8 BITS AND IS NOT ECHOED. |
1305 * |
1306 * |
1307 FC9D 34 10 INCH PSHS X SAVE IX |
1308 FC9F BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT |
1309 FCA2 A6 84 LDA ,X FETCH PORT STATUS |
1310 FCA4 85 01 BITA #1 TEST READY BIT, RDRF ? |
1311 IFD PS2OPT |
1312 FCA6 26 09 BNE GETST1 |
1313 FCA8 8E E0 20 LDX #PS2KBD |
1314 FCAB A6 84 LDA ,X |
1315 FCAD 85 01 BITA #1 |
1316 ENDIF PS2OPT |
1317 FCAF 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
1318 FCB1 A6 01 GETST1 LDA 1,X FETCH CHAR |
1319 FCB3 35 90 PULS X,PC RESTORE IX |
1320 * |
1321 * INCHEK |
1322 * |
1323 * CHECK FOR A CHARACTER AVAILABLE FROM |
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
1325 * FOR READ READY. ALL REGISTERS ARE |
1326 * PRESERVED, AND THE "Z" BIT WILL BE |
1327 * CLEAR IF A CHARACTER CAN BE READ. |
1328 * |
1329 * |
1330 FCB5 34 02 INCHEK PSHS A SAVE A ACCUM. |
1331 FCB7 A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS |
1332 FCBB 85 01 BITA #1 TEST READY BIT, RDRF ? |
1333 IFD PS2OPT |
1334 FCBD 26 05 BNE INCHEK1 |
1335 FCBF B6 E0 20 LDA PS2KBD |
1336 FCC2 85 01 BITA #1 TEST READY BIT< RDRF ? |
1337 ENDIF PS2OPT |
1338 FCC4 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. |
1339 * |
1340 FCC6 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES |
1341 FCC8 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE |
1342 * |
1343 * |
1344 * OUTCH |
1345 * |
1346 * OUTPUT CHARACTER TO TERMINAL. |
1347 * THE CHAR. TO BE OUTPUT IS |
1348 * PASSED IN THE A REGISTER. |
1349 * ALL REGISTERS ARE PRESERVED. |
1350 * |
1351 OUTCH IFD VDUOPT |
1352 FCCA 8D 45 BSR VOUTCH |
1353 ENDIF VDUOPT |
1354 IFD DG640OPT |
1355 BSR VOUTCH |
1356 ENDIF DG640OPT |
1356 ENDIF DG640OPT |
1357 FCCC 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX |
1358 FCCE BE DF E0 LDX CPORT GET ADDR. OF TERMINAL |
1359 FCD1 A6 84 FETSTA LDA ,X FETCH PORT STATUS |
1360 FCD3 85 02 BITA #2 TEST TDRE, OK TO XMIT ? |
1361 FCD5 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY |
1362 FCD7 35 02 PULS A GET CHAR. FOR XMIT |
1363 FCD9 A7 01 STA 1,X XMIT CHAR. |
1364 FCDB 35 90 PULS X,PC RESTORE IX |
1365 * |
1366 * IO INITIALIZATION |
1367 * |
1368 FCDD IOINIZ EQU * |
1369 IFD VDUOPT |
1370 FCDD 8D 13 BSR VINIZ |
1371 ENDIF VDUOPT |
1372 IFD DG640OPT |
1373 BSR VINIZ |
1374 ENDIF DG640OPT |
1374 ENDIF DG640OPT |
1375 FCDF BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
1376 FCE2 86 03 LDA #3 RESET ACIA PORT CODE |
1377 FCE4 A7 84 STA ,X STORE IN CONTROL REGISTER |
1378 FCE6 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
1379 FCE8 A7 84 STA ,X STORE IN CONTROL REGISTER |
1380 FCEA 6D 01 TST 1,X ANYTHING IN DATA REGISTER? |
1381 FCEC 86 FF LDA #$FF TURN ON ECHO FLAG |
1382 FCEE B7 DF E2 STA ECHO |
1383 FCF1 39 RTS |
1384 * |
1385 IFD VDUOPT |
1386 * |
1387 *************************************************** |
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * |
1389 * * |
1390 * 80 x 25 Characters |
1391 * |
1392 *************************************************** |
1393 * |
1394 *************************************************** |
1395 * INITIALIZE EMULATOR * |
1396 *************************************************** |
1397 * |
1398 FCF2 8E E0 30 VINIZ LDX #VDU |
1399 FCF5 CC 00 00 LDD #0 |
1400 FCF8 FD DF FB STD COLADX AND ROWADX |
1401 FCFB A7 02 STA VDUCOL,X |
1402 FCFD E7 03 STB VDUROW,X |
1403 FCFF E7 04 STB VDUOFF,X |
1404 FD01 FD DF FD STD NEWROW AND ESCFLG |
1405 FD04 C6 02 LDB #$02 |
1406 FD06 E7 01 STB VDUATT,X |
1407 FD08 7F DF FE CLR ESCFLG |
1408 FD0B 86 1B LDA #$1B SEND ESCAPE |
1409 FD0D 8D 02 BSR VOUTCH |
1410 FD0F 86 59 LDA #'Y CLEAR TO END OF SCREEN |
1411 * |
1412 ** VIDEO OUTPUT ROUTINE |
1413 * |
1414 FD11 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS |
1415 FD13 8E E0 30 LDX #VDU POINT TO VDU REGISTERS |
1416 * |
1417 ** CHECK FOR ESCAPE SEQUENCE |
1418 * |
1419 FD16 7D DF FE TST ESCFLG ESCAPE ACTIVE? |
1420 FD19 27 04 BEQ SOROU1 BRANCH IF NOT |
1421 FD1B 8D 74 BSR ESCAPE ELSE DO ESCAPE |
1422 FD1D 20 0D BRA RETURN AND RETURN |
1423 * |
1424 ** CHECK FOR CONTROL CHARACTERS |
1425 * |
1426 FD1F 81 20 SOROU1 CMPA #$20 CONTROL CODES? |
1427 FD21 24 04 BHS SOROU2 |
1428 FD23 8D 09 BSR CONTRL BRANCH IF SO |
1429 FD25 20 05 BRA RETURN |
1430 * |
1431 ** OUTPUT TEXT CHARACTER |
1432 * |
1433 FD27 A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER |
1434 FD29 17 00 C5 LBSR NEWCOL UPDATE COLUMN |
1435 * |
1436 ** DISPLAY CURSOR AND RETURN |
1437 * |
1438 FD2C 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1439 * |
1440 *************************************************** |
1441 * CONTROL CODE HANDLERS * |
1442 *************************************************** |
1443 * |
1444 FD2E 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1445 FD30 10 27 00 41 LBEQ BACKSP |
1446 FD34 81 1B CMPA #$1B ESCAPE SEQUENCE? |
1447 FD36 10 27 00 6C LBEQ SETESC |
1448 FD3A 81 1A CMPA #$1A CTRL Z - Clear Screen |
1449 FD3C 10 27 00 8E LBEQ CLRSCR |
1450 FD40 81 16 CMPA #$16 CTRL ^ - Home |
1451 FD42 10 27 00 45 LBEQ HOME |
1452 FD46 81 0D CMPA #$D CTRL M - RETURN? |
1453 FD48 10 27 00 99 LBEQ CRETN |
1454 FD4C 81 0C CMPA #$0C CTRL L - CHAR RIGHT |
1455 FD4E 10 27 00 2C LBEQ CHRIGHT |
1456 FD52 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE |
1457 FD54 10 27 00 11 LBEQ LINEUP |
1458 FD58 81 0A CMPA #$0A CTRL J - LINE FEED |
1459 FD5A 26 51 BNE RETESC NONE OF THESE, RETURN |
1460 * |
1461 ***************************************** LINE FEED |
1462 * |
1463 FD5C FC DF FB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1464 FD5F 5C INCB BUMP ROW |
1465 FD60 C1 19 CMPB #NUMLIN SCROLL TIME? |
1466 FD62 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT |
1467 FD66 16 00 99 LBRA SCROLL ELSE SCROLL IT |
1468 * |
1469 ***************************************** LINE FEED |
1470 * |
1471 FD69 FC DF FB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1472 FD6C 5D TSTB AT TOP OF SCREEN ? |
1473 FD6D 10 27 00 3C LBEQ RETESC Yes, Ignore |
1474 FD71 5A DECB No, Decrement ROW |
1475 FD72 16 00 74 LBRA NEWCUR POSITION CURSOR |
1476 * |
1477 *********************************** BACK SPACE |
1478 * |
1479 FD75 B6 DF FB BACKSP LDA COLADX |
1480 FD78 27 33 BEQ RETESC RETURN |
1481 FD7A 4A DECA |
1482 FD7B 16 00 68 LBRA POSCOL POSITION CURSOR |
1483 * |
1484 *********************************** CURSOR RIGHT |
1485 * |
1486 FD7E B6 DF FB CHRIGHT LDA COLADX |
1487 FD81 4C INCA |
1488 FD82 81 50 CMPA #LINLEN |
1489 FD84 10 27 00 25 LBEQ RETESC |
1490 FD88 16 00 5B LBRA POSCOL |
1491 * |
1492 *********************************** CURSOR RIGHT |
1493 * |
1494 FD8B CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN |
1495 FD8E 16 00 58 LBRA NEWCUR |
1496 * |
1497 *************************************************** |
1498 * ESCAPE HANDLERS * |
1499 *************************************************** |
1500 * |
1501 FD91 F6 DF FE ESCAPE LDAB ESCFLG GET FLAG |
1502 FD94 C1 3D CMPB #'= SETTING CURSOR? |
1503 FD96 27 16 BEQ ESCCUR BRANCH IF SO |
1504 FD98 81 59 CMPA #'Y CLEAR TO END OF SCREEN? |
1505 FD9A 10 27 00 6E LBEQ ESCCLS |
1506 FD9E 81 54 CMPA #'T CLEAR TO END OF LINE? |
1507 FDA0 27 31 BEQ ESCCLL |
1508 FDA2 81 3D CMPA #'= STARTING CURSOR SET? |
1509 FDA4 26 04 BNE CLRESC BRANCH IF NOT |
1510 * |
1511 ***************************** START ESCAPE SEQUENCE |
1512 * |
1513 FDA6 B7 DF FE SETESC STAA ESCFLG ELSE START CURSORING |
1514 FDA9 39 RTS AND RETURN |
1515 * |
1516 FDAA 7F DF FE CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1517 FDAD 39 RETESC RTS SO RETURN |
1518 * |
1519 ********************************* SET SCREEN CURSOR |
1520 * |
1521 FDAE 7D DF FD ESCCUR TST NEWROW ROW SET? |
1522 FDB1 26 04 BNE ESCCU1 BRANCH IF SO |
1523 FDB3 B7 DF FD STAA NEWROW ELSE SET NEW ROW |
1524 FDB6 39 RTS AND RETURN |
1525 * |
1526 FDB7 7F DF FE ESCCU1 CLR ESCFLG |
1527 FDBA 80 20 SUBA #$20 ADJUST COLUMN ADDRESS |
1528 FDBC 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1529 FDBE 22 ED BHI RETESC NOT OK, DO NOTHING |
1530 * |
1531 FDC0 F6 DF FD ESCCU2 LDAB NEWROW |
1532 FDC3 7F DF FD CLR NEWROW |
1533 FDC6 C0 20 SUBB #$20 ADJUST TO ROW ADDRESS |
1534 FDC8 C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1535 FDCA 22 E1 BHI RETESC ELSE RETURN DOING NOTHING |
1536 FDCC 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO |
1537 * |
1538 ****************** CLEAR FROM CURSOR TO END OF LINE |
1539 FDCE CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN |
1540 FDD1 8D 16 BSR NEWCUR |
1541 FDD3 B6 DF FB ESCCLL LDA COLADX |
1542 FDD6 C6 20 LDB #$20 AND CLEAR CHAR |
1543 FDD8 E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT |
1544 FDDA 4C INCA |
1545 FDDB A7 02 STA VDUCOL,X |
1546 FDDD 81 50 CMPA #LINLEN UNTIL END OF LINE |
1547 FDDF 26 F7 BNE ESCCL1 |
1548 FDE1 7F DF FE CLR ESCFLG |
1549 FDE4 39 RTS |
1550 * |
1551 *********************************** CARRIAGE RETURN |
1552 * |
1553 FDE5 4F CRETN CLRA SET COLUMN ZERO |
1554 FDE6 F6 DF FC POSCOL LDB ROWADX GET CURRENT ROW |
1555 * |
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1557 * |
1558 FDE9 FD DF FB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1559 FDEC A7 02 STA VDUCOL,X SET NEW COLUMN |
1560 FDEE E7 03 STB VDUROW,X SET NEW ROW |
1561 FDF0 39 RTS AND RETURN |
1562 * |
1563 ********************* UPDATE CURRENT COLUMN AND ROW |
1564 * |
1565 FDF1 FC DF FB NEWCOL LDD COLADX GET ROW AND COLUMN |
1566 FDF4 4C INCA BUMP COLUMN |
1567 FDF5 81 50 CMPA #LINLEN ROLL? |
1568 FDF7 26 F0 BNE NEWCUR BRANCH IF NOT |
1569 FDF9 4F CLRA ELSE RESET TO ZERO |
1570 FDFA 5C INCB AND BUMP ROW |
1571 FDFB C1 19 CMPB #NUMLIN |
1572 FDFD 26 EA BNE NEWCUR |
1573 FDFF 5A DECB BOTTOM ROW |
1574 FE00 8D E7 BSR NEWCUR |
1575 * |
1576 ********************************* SCROLL THE SCREEN |
1577 * |
1578 FE02 E6 04 SCROLL LDB VDUOFF,X |
1579 FE04 5C INCB |
1580 FE05 C1 19 CMPB #NUMLIN |
1581 FE07 25 01 BLO SCROL1 |
1582 FE09 5F CLRB |
1583 FE0A E7 04 SCROL1 STB VDUOFF,X |
1584 * |
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1586 * |
1587 FE0C F6 DF FB ESCCLS LDB COLADX GET CURSOR |
1588 FE0F 86 20 LDA #$20 GET A SPACE |
1589 FE11 F7 DF FB ESCCLS1 STB COLADX |
1590 FE14 E7 02 STB VDUCOL,X |
1591 FE16 A7 84 STA VDUCHR,X |
1592 FE18 5C INCB |
1593 FE19 C1 50 CMPB #LINLEN |
1594 FE1B 26 F4 BNE ESCCLS1 |
1595 * |
1596 FE1D F6 DF FC LDB ROWADX |
1597 FE20 5C INCB |
1598 FE21 C1 19 CMPB #NUMLIN |
1599 FE23 27 08 BEQ ESCCLS2 |
1600 FE25 F7 DF FC STB ROWADX |
1601 FE28 E7 03 STB VDUROW,X |
1602 FE2A 5F CLRB |
1603 FE2B 20 E4 BRA ESCCLS1 |
1604 * |
1605 FE2D 5F ESCCLS2 CLRB |
1606 FE2E F7 DF FB STB COLADX |
1607 FE31 E7 02 STB VDUCOL,X |
1608 FE33 F7 DF FE STB ESCFLG |
1609 FE36 39 RTS |
1610 ENDIF VDUOPT |
1611 * |
1612 IFD DG640OPT |
1613 *************************************************** |
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * |
1615 * * |
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * |
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * |
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * |
1619 * 16x64 BOARD). * |
1620 *************************************************** |
1621 |
1622 *************************************************** |
1623 * INITIALIZE EMULATOR * |
1624 *************************************************** |
1625 |
1626 VINIZ LDX #0 |
1627 STX COLADX AND ROWADX |
1628 STX NEWROW AND ESCFLG |
1629 LDX #SCREEN POINT TO SCREEN |
1630 STX CURSOR SET PROGRAM CURSOR |
1631 LDA #$1B SEND ESCAPE |
1632 BSR VOUTCH |
1633 LDA #'Y CLEAR TO END OF SCREEN |
1634 * |
1635 ** VIDEO OUTPUT ROUTINE |
1636 * |
1637 VOUTCH PSHS A,B,X SAVE REGISTERS |
1638 * |
1639 ** CLEAR CURSOR |
1640 LDX CURSOR |
1641 LDB 0,X |
1642 ANDB #$7F |
1643 STB 0,X |
1644 * |
1645 ** CHECK FOR ESCAPE SEQUENCE |
1646 TST ESCFLG ESCAPE ACTIVE? |
1647 BEQ SOROU1 BRANCH IF NOT |
1648 BSR ESCAPE ELSE DO ESCAPE |
1649 BRA RETURN AND RETURN |
1650 * |
1651 ** CHECK FOR CONTROL CHARACTERS |
1652 SOROU1 CMPA #$20 CONTROL CODES? |
1653 BHS SOROU2 |
1654 BSR CONTRL BRANCH IF SO |
1655 BRA RETURN |
1656 * |
1657 ** OUTPUT TEXT CHARACTER |
1658 SOROU2 LDX CURSOR ELSE GET CURSOR |
1659 STAA 0,X DISPLAY CHARACTER |
1660 LBSR NEWCOL UPDATE COLUMN |
1661 * |
1662 ** DISPLAY CURSOR AND RETURN |
1663 RETURN LDX CURSOR AND DISPLAY IT |
1664 LDB ,X |
1665 ORAB #$80 WITH REVID |
1666 STB ,X |
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1668 |
1669 *************************************************** |
1670 * CONTROL CODE HANDLERS * |
1671 *************************************************** |
1672 |
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1674 LBEQ BACKSP |
1675 CMPA #$1B ESCAPE SEQUENCE? |
1676 LBEQ SETESC |
1677 CMPA #$D CTRL M - RETURN? |
1678 LBEQ CRETN |
1679 CMPA #$0A CTRL J - LINE FEED |
1680 BNE RETESC NONE OF THESE, RETURN |
1681 |
1682 ***************************************** LINE FEED |
1683 |
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1685 INCB BUMP ROW |
1686 CMPB #NUMLIN SCROLL TIME? |
1687 LBNE NEWCUR POSITION CURSOR IF NOT |
1688 LBRA SCROLL ELSE SCROLL IT |
1689 |
1690 ***************************************** LINE FEED |
1691 |
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1693 TSTB AT TOP OF SCREEN ? |
1694 BEQ RETESC Yes, Ignore |
1695 DECB No, Decrement ROW |
1696 LBRA NEWCUR POSITION CURSOR |
1697 |
1698 |
1699 *********************************** BACK SPACE |
1700 |
1701 BACKSP LDA COLADX |
1702 BEQ RETESC RETURN |
1703 DECA |
1704 LBRA POSCOL POSITION CURSOR |
1705 |
1706 *********************************** CURSOR RIGHT |
1707 |
1708 CHRIGHT LDA COLADX |
1709 INCA |
1710 CMPA #LINLEN |
1711 BEQ RETESC |
1712 LBRA POSCOL |
1713 |
1714 *************************************************** |
1715 * ESCAPE HANDLERS * |
1716 *************************************************** |
1717 |
1718 ESCAPE LDAB ESCFLG GET FLAG |
1719 CMPB #'= SETTING CURSOR? |
1720 BEQ ESCCUR BRANCH IF SO |
1721 CMPA #'Y CLEAR TO END OF SCREEN? |
1722 LBEQ ESCCLS |
1723 CMPA #'T CLEAR TO END OF LINE? |
1724 BEQ ESCCLL |
1725 CMPA #'E INSERT LINE? |
1726 BEQ ESCINL |
1727 CMPA #'R DELETE LINE? |
1728 BEQ ESCDLL |
1729 CMPA #'= STARTING CURSOR SET? |
1730 BNE CLRESC BRANCH IF NOT |
1731 |
1732 ***************************** START ESCAPE SEQUENCE |
1733 |
1734 SETESC STAA ESCFLG ELSE START CURSORING |
1735 RTS AND RETURN |
1736 |
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1738 RETESC RTS SO RETURN |
1739 |
1740 ********************************* SET SCREEN CURSOR |
1741 |
1742 ESCCUR TST NEWROW ROW SET? |
1743 BNE ESCCU1 BRANCH IF SO |
1744 STAA NEWROW ELSE SET NEW ROW |
1745 RTS AND RETURN |
1746 |
1747 ESCCU1 CLR ESCFLG |
1748 SUBA #$20 ADJUST COLUMN ADDRESS |
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1750 BHI RETESC NOT OK, DO NOTHING |
1751 |
1752 ESCCU2 LDAB NEWROW |
1753 CLR NEWROW |
1754 SUBB #$20 ADJUST TO ROW ADDRESS |
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1756 BHI RETESC ELSE RETURN DOING NOTHING |
1757 BRA NEWCUR GO SET NEW CURSOR IF SO |
1758 * |
1759 *************************** DELETE LINE FROM SCREEN |
1760 |
1761 ESCDLL BSR CRETN GO COL. ZERO |
1762 LDB ROWADX |
1763 CMPB #NUMLIN-1 |
1764 BEQ SCROL3 |
1765 BRA SCROL1 AND DELETE THIS LINE |
1766 |
1767 *************************** INSERT LINE INTO SCREEN |
1768 |
1769 ESCINL BSR CRETN GO TO COL. ZERO |
1770 LDAB ROWADX |
1771 CMPB #NUMLIN-1 |
1772 BEQ ESCCLL |
1773 * |
1774 ** SCROLL SCREEN DOWN FROM CURSOR |
1775 * |
1776 LDX #SCREEN+SCNLEN-LINLEN |
1777 ESCIN0 LDAA 0,-X |
1778 STAA LINLEN,X |
1779 LDA SCNLEN,X |
1780 STA SCNLEN+LINLEN,X |
1781 CPX CURSOR |
1782 BNE ESCIN0 |
1783 |
1784 ****************** CLEAR FROM CURSOR TO END OF LINE |
1785 |
1786 ESCCLL LDA COLADX GET CURRENT COLUMN |
1787 LDX CURSOR GET CURSOR |
1788 LDB #$20 AND CLEAR CHAR |
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE |
1790 STB ,X+ CLEAR TEXT |
1791 INCA |
1792 CMPA #LINLEN UNTIL END OF LINE |
1793 BNE ESCLL1 |
1794 CLR ESCFLG |
1795 RTS |
1796 |
1797 *********************************** CARRIAGE RETURN |
1798 |
1799 CRETN CLRA SET COLUMN ZERO |
1800 POSCOL LDB ROWADX GET CURRENT ROW |
1801 |
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1803 |
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1805 LDA #LINLEN ELSE ADD A LINE |
1806 MUL LINLEN * ROWADX |
1807 ADDB COLADX |
1808 ADCA #0 |
1809 ADDD #SCREEN ADD SCREEN BASE. |
1810 STD CURSOR SAVE NEW CURSOR |
1811 TFR D,X GET CURSOR IN X |
1812 RTS AND RETURN |
1813 |
1814 ********************* UPDATE CURRENT COLUMN AND ROW |
1815 |
1816 NEWCOL LDD COLADX GET ROW AND COLUMN |
1817 INCA BUMP COLUMN |
1818 CMPA #LINLEN ROLL? |
1819 BNE NEWCUR BRANCH IF NOT |
1820 CLRA ELSE RESET TO ZERO |
1821 INCB AND BUMP ROW |
1822 CMPB #NUMLIN |
1823 BNE NEWCUR |
1824 DECB BOTTOM ROW |
1825 BSR NEWCUR |
1826 |
1827 ********************************* SCROLL THE SCREEN |
1828 |
1829 SCROLL LDX #SCREEN POINT TO SCREEN |
1830 SCROL1 LDA SCNLEN+LINLEN,X |
1831 STA SCNLEN,X |
1832 LDAA LINLEN,X MOVE TWO BYTES |
1833 STAA 0,X+ UP ONE LINE |
1834 CMPX #SCREEN+SCNLEN-LINLEN |
1835 BNE SCROL1 LOOP UNTIL DONE |
1836 BRA SCROL3 |
1837 |
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1839 |
1840 ESCCLS LDX CURSOR GET CURSOR |
1841 SCROL3 LDAA #$20 GET A SPACE |
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES |
1843 STA ,X+ AND TEXT |
1844 CMPX #SCREEN+SCNLEN |
1845 BNE SCROL2 UNTIL DONE |
1846 CLR ESCFLG |
1847 RTS |
1848 ENDIF DG640OPT |
1848 ENDIF DG640OPT |
1849 * |
1850 IFD PRTOPT |
1851 ************************************* |
1852 * |
1853 ** PRINTER DRIVER ROUTINES |
1854 * |
1855 ************************************* |
1856 * |
1857 ** PINIZ - INITIATE PRINTER PORT |
1858 * |
1859 PINIZ PSHS B |
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 |
1861 STD PADATA SET DDR AND SELECT DATA |
1862 * |
1863 ** RESET PRINTER |
1864 LDB #PRESET |
1865 STAB PADATA |
1866 RESTLP INCB DELAY FOR RESET |
1867 BNE RESTLP |
1868 STAA PADATA ACCA=DIRMSK |
1869 * |
1870 ** INITALIZE PORT B (DATA PORT) |
1871 LDAA #$2A |
1872 STAA PBCTRL |
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110 |
1874 STD PBDATA PBDREG PBCTRL |
1875 * |
1876 ** SELECT 66 LINES/PAGE |
1877 LDAA #$1B |
1878 BSR POUTCH |
1879 LDAA #'C |
1880 BSR POUTCH |
1881 LDAA #66 |
1882 PULS B |
1883 ************************************* |
1884 * |
1885 ** OUTPUT A CHARACTER TO THE PRINTER |
1886 * |
1887 ************************************* |
1888 POUTCH PSHS B |
1889 LDAB PBDATA CLEAR INTERRUPT BIT |
1890 * |
1891 ** WAIT TILL NOT BUSY |
1892 BUSYLP LDAB PADATA |
1893 BITB #PERROR |
1894 BEQ PEXIT |
1895 TSTB |
1896 BMI BUSYLP |
1897 * |
1898 ** NOW OUTPUT CHARACTER |
1899 STAA PBDATA |
1900 PEXIT PULS B,PC |
1901 ************************************* |
1902 * |
1903 ** PCHK TEST IFD PRINTER READY |
1904 * |
1905 ************************************* |
1906 PCHK TST PBCTRL TEST STATE OF CRB7 |
1907 RTS SET ON ACKNOWLEDGE |
1908 ENDIF PRTOPT |
1908 ENDIF PRTOPT |
1909 ************************************* |
1910 * |
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE |
1912 * |
1913 ************************************* |
1914 * |
1915 FE37 JMPTAB EQU * |
1916 FE37 01 FCB 1 " ^A " |
1917 FE38 FB 74 FDB ALTRA |
1918 FE3A 02 FCB 2 " ^B " |
1919 FE3B FB 69 FDB ALTRB |
1920 FE3D 03 FCB 3 " ^C " |
1921 FE3E FB 7F FDB ALTRCC |
1922 FE40 04 FCB 4 " ^D " |
1923 FE41 FB 5E FDB ALTRDP |
1924 FE43 10 FCB $10 " ^P " |
1925 FE44 FB 31 FDB ALTRPC |
1926 FE46 15 FCB $15 " ^U " |
1927 FE47 FB 3D FDB ALTRU |
1928 FE49 18 FCB $18 " ^X " |
1929 FE4A FB 53 FDB ALTRX |
1930 FE4C 19 FCB $19 " ^Y " |
1931 FE4D FB 48 FDB ALTRY |
1932 * |
1933 FE4F 42 FCC 'B' |
1934 FE50 F9 5C FDB BRKPNT |
1935 FE52 45 FCC 'E' |
1936 FE53 F8 FD FDB MEMDUMP |
1937 FE55 47 FCC 'G' |
1938 FE56 F8 A5 FDB GO |
1939 FE58 4C FCC 'L' |
1940 FE59 FA 5E FDB LOAD |
1941 FE5B 50 FCC 'P' |
1942 FE5C FA BC FDB PUNCH |
1943 FE5E 4D FCC 'M' |
1944 FE5F F8 A8 FDB MEMCHG |
1945 FE61 52 FCC 'R' |
1946 FE62 FB ED FDB REGSTR |
1947 FE64 53 FCC 'S' |
1948 FE65 F8 F1 FDB DISSTK |
1949 FE67 58 FCC 'X' |
1950 FE68 F9 88 FDB XBKPNT |
1951 IFD MFDCOPT |
1952 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT |
1953 FDB MINBOOT |
1954 ENDIF MFDCOPT |
1954 ENDIF MFDCOPT |
1955 IFD CF8OPT |
1956 FE6A 44 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT |
1957 FE6B F9 D5 FDB CFBOOT |
1958 ENDIF CF8OPT |
1959 IFD IDEOPT |
1960 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT |
1961 FDB IDEBOOT |
1962 ENDIF IDEOPT |
1962 ENDIF IDEOPT |
1963 IFD DMAFOPT |
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT |
1965 FDB DBOOT |
1966 ENDIF DMAFOPT |
1966 ENDIF DMAFOPT |
1967 IFD EXTOPT |
1968 FCC 'U' *** IF FPGA, 'U' IS FOR USER |
1969 FDB USRCMD |
1970 ENDIF EXTOPT |
1970 ENDIF EXTOPT |
1971 IFD RTCOPT |
1972 FCC 'T' |
1973 FDB TIMSET |
1974 ENDIF RTCOPT |
1974 ENDIF RTCOPT |
1975 IFD TRAOPT |
1976 FCC "T" |
1977 FDB TRACE |
1978 ENDIF TRAOPT |
1978 ENDIF TRAOPT |
1979 * |
1980 FE6D TABEND EQU * |
1981 * |
1982 * ** 6809 VECTOR ADDRESSES ** |
1983 * |
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES |
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY |
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE |
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO |
1988 * HIS OWN ROUTINES IF HE SO DESIRES. |
1989 * |
1990 * |
1991 FE6D F9 94 RAMVEC FDB SWIE USER-V |
1992 FE6F F8 A7 FDB RTI SWI3-V |
1993 FE71 F8 A7 FDB RTI SWI2-V |
1994 FE73 F8 A7 FDB RTI FIRQ-V |
1995 FE75 F8 A7 FDB RTI IRQ-V |
1996 FE77 F9 94 FDB SWIE SWI-V |
1997 FE79 FF FF FDB $FFFF SVC-VO |
1998 FE7B FF FF FDB $FFFF SVC-VL |
1999 * |
2000 * PRINTABLE MESSAGE STRINGS |
2001 * |
2002 FE7D 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
2003 FE82 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR ' |
55 47 20 31 2E 34 |
20 46 4F 52 20 |
2004 IFD S3EOPT |
2005 FCC 'S3E ' |
2006 ENDIF S3EOPT |
2006 ENDIF S3EOPT |
2007 IFD B5XOPT |
2008 FE93 42 35 2D 58 33 30 FCC 'B5-X300 ' |
30 20 |
2009 ENDIF B5XOPT |
2010 IFD S3SOPT |
2011 FCC 'S3STARTER ' |
2012 ENDIF S3SOPT |
2012 ENDIF S3SOPT |
2013 IFD ADSOPT |
2014 FCC 'ADS6809 ' |
2015 ENDIF ADSOPT |
2015 ENDIF ADSOPT |
2016 IFD SWTOPT` |
2017 FCC 'SWTPC ' |
2018 ENDIF SWTOPT |
2018 ENDIF SWTOPT |
2019 IFD XESOPT` |
2020 FCC 'XESS ' |
2021 ENDIF XESOPT |
2021 ENDIF XESOPT |
2022 FE9B 20 2D 20 FCC ' - ' |
2023 FE9E 04 FCB 4 |
2024 FE9F 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS |
04 |
2025 FEA6 3E MSG3 FCC '>' |
2026 FEA7 04 FCB 4 |
2027 FEA8 57 48 41 54 3F MSG4 FCC 'WHAT?' |
2028 FEAD 04 FCB 4 |
2029 FEAE 20 2D 20 MSG5 FCC ' - ' |
2030 FEB1 04 FCB 4' |
2031 FEB2 20 20 53 50 3D MSG10 FCC ' SP=' |
2032 FEB7 04 FCB 4 |
2033 FEB8 20 20 50 43 3D MSG11 FCC ' PC=' |
2034 FEBD 04 FCB 4 |
2035 FEBE 20 20 55 53 3D MSG12 FCC ' US=' |
2036 FEC3 04 FCB 4 |
2037 FEC4 20 20 49 59 3D MSG13 FCC ' IY=' |
2038 FEC9 04 FCB 4 |
2039 FECA 20 20 49 58 3D MSG14 FCC ' IX=' |
2040 FECF 04 FCB 4 |
2041 FED0 20 20 44 50 3D MSG15 FCC ' DP=' |
2042 FED5 04 FCB 4 |
2043 FED6 20 20 41 3D MSG16 FCC ' A=' |
2044 FEDA 04 FCB 4 |
2045 FEDB 20 20 42 3D MSG17 FCC ' B=' |
2046 FEDF 04 FCB 4 |
2047 FEE0 20 20 43 43 3A 20 MSG18 FCC ' CC: ' |
2048 FEE6 04 FCB 4 |
2049 FEE7 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' |
56 43 |
2050 FEEF 53 31 MSG20 FCC 'S1' |
2051 FEF1 04 FCB 4 |
2052 IFD DATOPT |
2053 * |
2054 * POWER UP/ RESET/ NMI ENTRY POINT |
2055 * |
2056 FF00 ORG $FF00 |
2057 * |
2058 * |
2059 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11 |
2060 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO |
2061 * |
2062 * |
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F |
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS |
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE |
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA |
2067 * STORED IN IT. |
2068 * |
2069 * |
2070 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION |
2071 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION |
2072 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ? |
2073 * |
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER |
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL |
2076 * PHYSICAL ADDRESSES. |
2077 * |
2078 FF0A 86 F0 LDA #$F0 |
2079 FF0C A7 84 STA ,X STORE $F0 AT $FFFF |
2080 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF |
2081 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" |
2082 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION |
2083 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0 |
2084 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ? |
2085 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP |
2086 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER |
2087 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? |
2088 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM |
2089 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN |
2090 * |
2091 * |
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF |
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX |
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED |
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT |
2096 * IS STORED IN RAM IN THE LOCATION THAT IS |
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, |
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND |
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE |
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE |
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE |
2102 * "7" IN THE $70A0 WILL BE STORED IN |
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS |
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND |
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE |
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE |
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- |
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT |
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE |
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK |
2111 * OF RAM RESPONDS. |
2112 * |
2113 * |
2114 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION |
2115 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2116 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS |
2117 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN |
2118 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING |
2119 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS |
2120 FF32 44 LSRA TRANSLATION RAM. |
2121 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D" |
2122 * |
2123 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER |
2124 * |
2125 * |
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES |
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK |
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS |
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION |
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF |
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO |
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... |
2133 * |
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- |
2136 * |
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE |
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... |
2139 * |
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 |
2142 * |
2143 * |
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF |
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL |
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK |
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT |
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 |
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 |
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE |
2151 * MEMORY ADDRESSED AS FOLLOWS.... |
2152 * |
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- |
2155 * |
2156 * |
2157 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2158 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD |
2159 FF40 6F 2E CLR 14,Y CLEAR $DFDE |
2160 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? |
2161 FF44 A7 2F STA 15,Y STORE AT $DFDF |
2162 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR |
2163 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 |
2164 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR |
2165 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING |
2166 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM |
2167 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO |
2168 FF54 27 22 BEQ FINTAB SKIP IF FINISHED |
2169 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION |
2170 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. |
2171 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC. |
2172 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION |
2173 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER |
2174 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION |
2175 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2176 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2177 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 |
2178 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM. |
2179 FF6E 44 LSRA |
2180 FF6F 44 LSRA |
2181 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE |
2182 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK |
2183 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE |
2184 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK |
2185 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? |
2186 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE |
2187 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE |
2188 * |
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF |
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES |
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT |
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---. |
2193 * |
2194 * |
2195 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C" |
2196 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE |
2197 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. |
2198 FF86 4A DECA ELSE POINT 4K LOWER |
2199 FF87 2A F9 BPL FINDC GO TRY AGAIN |
2200 FF89 20 14 BRA XFERTF |
2201 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND |
2202 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- |
2203 * |
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION |
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL |
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL |
2207 * ADDRESSES FROM $0000 AND UP.... |
2208 * |
2209 FF8F 4F CLRA START AT ZERO |
2210 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. |
2211 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE |
2212 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP |
2213 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE |
2214 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP |
2215 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY |
2216 FF9B 81 0C CMPA #$0C LAST ENTRY YET ? |
2217 FF9D 2D F3 BLT COMPRS |
2218 * |
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION |
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON |
2221 * THE MP-09 CPU CARD. |
2222 * |
2223 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11 |
2224 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE |
2225 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT |
2226 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11 |
2227 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE |
2228 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED |
2229 * |
2230 ELSE |
2231 LRA RTS |
2232 START LDS #STACK INITIALIZE STACK POINTER |
2233 CLRB |
2234 ENDIF DATOPT |
2234 ENDIF DATOPT |
2235 * |
2236 FFAB 53 COMB SET "B" NON-ZERO |
2237 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG |
2238 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE |
2239 * |
2240 ** INTERRUPT JUMP VECTORS |
2241 * |
2242 FFB2 6E 9F DF C0 V1 JMP [STACK] |
2243 FFB6 6E 9F DF C4 V2 JMP [SWI2] |
2244 FFBA 6E 9F DF C6 V3 JMP [FIRQ] |
2245 FFBE 6E 9F DF C8 V4 JMP [IRQ] |
2246 FFC2 6E 9F DF CA V5 JMP [SWI] |
2247 * |
2248 * SWI3 ENTRY POINT |
2249 * |
2250 FFC6 1F 43 SWI3E TFR S,U |
2251 FFC8 AE 4A LDX 10,U *$FFC8 |
2252 FFCA E6 80 LDB ,X+ |
2253 FFCC AF 4A STX 10,U |
2254 FFCE 4F CLRA |
2255 FFCF 58 ASLB |
2256 FFD0 49 ROLA |
2257 FFD1 BE DF CC LDX SVCVO |
2258 FFD4 8C FF FF CMPX #$FFFF |
2259 FFD7 27 0F BEQ SWI3Z |
2260 FFD9 30 8B LEAX D,X |
2261 FFDB BC DF CE CMPX SVCVL |
2262 FFDE 22 08 BHI SWI3Z |
2263 FFE0 34 10 PSHS X |
2264 FFE2 EC C4 LDD ,U |
2265 FFE4 AE 44 LDX 4,U |
2266 FFE6 6E F1 JMP [,S++] |
2267 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP |
2268 FFEA EE 42 LDU 2,U |
2269 FFEC 6E 9F DF C2 JMP [SWI3] |
2270 * |
2271 * 6809 VECTORS |
2272 * |
2273 FFF0 ORG $FFF0 |
2274 FFF0 FF B2 FDB V1 USER-V |
2275 FFF2 FF C6 FDB SWI3E SWI3-V |
2276 FFF4 FF B6 FDB V2 SWI2-V |
2277 FFF6 FF BA FDB V3 FIRQ-V |
2278 FFF8 FF BE FDB V4 IRQ-V |
2279 FFFA FF C2 FDB V5 SWI-V |
2280 FFFC FF B2 FDB V1 NMI-V |
2281 FFFE FF 00 FDB START RESTART-V |
0004 END START |
0005 END |
Program + Init Data = 2034 bytes |
Error count = 0 |
/sys09s3s_b16.vhd
0,0 → 1,64
INIT_00 => x"A780A610C6C0DF8E1074FE8E2EFA1AFB1EFB8FFBCEFCB9FC9BFCA1FC61F814F8", |
INIT_01 => x"17431FE4A7D0866AAFDD8C30FB265AE26F0CC65B0117E0DFBF00E08EF9265AA0", |
INIT_02 => x"0317A8FE8E0C0417F62A5A19048B0327856D0DC64FD0DF8E47031784FE8E9F04", |
INIT_03 => x"17408B981F5304175E86092C2081891FF1270D817F84370417B30217AFFE8E2E", |
INIT_04 => x"20F00217B1FE8EF52674FE8C02300F2780E13BFE8E20C0022F60C14704174C04", |
INIT_05 => x"17A4A60F0417A50317211F650217B7FE8E121F2D296B03173B341FBC2094ADC0", |
INIT_06 => x"27A4A1A4A7390F260D8117275E81DD271881E127088111285E0317070417A503", |
INIT_07 => x"0B031705201F30C0DF8E321FA20217BE203F31C2202131E503173F86E8031708", |
INIT_08 => x"279A03170527E4AC011FF0C4201F0634F0C41000C3101F390124E1AC20340629", |
INIT_09 => x"265A8E03172C031780A610C69603172E0317E4AEEE0117B7FE8E103439623203", |
INIT_0a => x"29B70217BC20EE265A7703172E8602237E810425208180A610C6E1AE860317F5", |
INIT_0b => x"3984A73F86A4AFA0A709273F8184A60F271035558DFFFF8E10341A24C0DF8C1E", |
INIT_0c => x"4AAF0427268D1F304AAE431F39FB265A188D08C6E3DF8E104603163F86490317", |
INIT_0d => x"A7A0A7A0A7FF8684A7A4A604263F8184A60A24C0DF8C21AEB9FE16480217068D", |
INIT_0e => x"0186398D46E0B7E086408D393D3139F7265A0427A1ACA0A608C6E3DF8E1039A0", |
INIT_0f => x"178D47E0B7208645E0B744E0B743E0B74F42E0B701862D8D47E0B7EF8641E0B7", |
INIT_10 => x"E0B6F926808547E0B63B341F4AAF00C08EF42600C28C80A740E0B6218D00C08E", |
INIT_11 => x"54545454A6E6D0DF8E104444444462A6363439F927088547E0B639F227408547", |
INIT_12 => x"FCBD8435FD265A20C60434B63562E762EA62A70F8462A65858585853A6E6E4E7", |
INIT_13 => x"0234A80117F12631813D273981230217F92653812A0217E2DF7F6802171186E3", |
INIT_14 => x"E0EB02340C2904358E01170434E46AE46AE4EBE0EBE0E6103421299101172629", |
INIT_15 => x"0117E26F1202161386E2DF731A02173F86BA27FFC102355FEB2080A70527E46A", |
INIT_16 => x"2320008310062762A3E4ECF901171286E3FCBDE4AF0130492562AC4D2930344A", |
INIT_17 => x"1780A684EB63EB62EB68011762AE750117981F03CB2F0017F8FE8E64E720C602", |
INIT_18 => x"10347120028D396532B701171486C326E4AC62AF5B0117981F53F526646A6501", |
INIT_19 => x"8D618D394AAF0229F68DF28D910017E50016F80016A101169035690017A9FE8E", |
INIT_1a => x"498D3944AF0229D58DD18D5E8D3946AF0229E08DDC8D728D3948AF0229EB8DE7", |
INIT_1b => x"8D3941A70229B18DB08D588D3942A70229BC8DBB8D6C8D3943A70229C78DC68D", |
INIT_1c => x"BF0016311FF48DBBFE8E39F726048180A63F011739C4A7808A0429A68DA58D5F", |
INIT_1d => x"8DCDFE8EE12044AED78DD3FE8EB4001643A6E18DD9FE8EF42048AEEA8DC7FE8E", |
INIT_1e => x"D02042A6B38DE4FE8ED92041A6BC8DDFFE8ECF204AAEC58DC1FE8ED82046AECE", |
INIT_1f => x"B7FE8EBF8DB88DB08DA98DA18D27FF17B7FE8E900016F0FE8EC4A6AA8DE9FE8E", |
INIT_20 => x"3C29088D011F42290E8DB800172D86121F4D29098DD520CE8DC78DC08D17FF17", |
INIT_21 => x"811D2530815B8D39E0AB04342829078D891F484848483229118D903561A71034", |
INIT_22 => x"3439021A39578003226681072561813937800322468112254181393080032239", |
INIT_23 => x"C602345120078B022F3981308B0F840235048D4444444402340235028D023510", |
INIT_24 => x"207F84048D0627E2DF7D00F09F6E8235F1265A3F8D438D2D860225E46880A608", |
INIT_25 => x"85E0DF9FA60234903501A6EE27018584A620E08E0926018584A6E0DFBE10342D", |
INIT_26 => x"3501A70235FA27028584A6E0DFBE1234458D2086008D8235018520E0B6052601", |
INIT_27 => x"A7FBDFFD0000CC30E08E39E2DFB7FF86016D84A7118684A70386E0DFBE138D90", |
INIT_28 => x"8D0427FEDF7D30E08E16345986028D1B86FEDF7F01E702C6FDDFFD04E703E702", |
INIT_29 => x"1A816C0027101B814100271008819635C5001784A70520098D042420810D2074", |
INIT_2a => x"51260A81110027100B812C0027100C81990027100D814500271016818E002710", |
INIT_2b => x"164A3327FBDFB67400165A3C0027105DFBDFFC9900168300261019C15CFBDFFC", |
INIT_2c => x"2710598116273DC1FEDFF65800160000CC5B00162500271050814CFBDFB66800", |
INIT_2d => x"2080FEDF7F39FDDFB70426FDDF7D39FEDF7F39FEDFB704263D81312754816E00", |
INIT_2e => x"A74C84E720C6FBDFB6168D0000CC1B20E12218C120C0FDDF7FFDDFF6ED224F81", |
INIT_2f => x"C15C4FF02650814CFBDFFC3903E702A7FBDFFDFCDFF64F39FEDF7FF726508102", |
INIT_30 => x"2650C15C84A702E7FBDFF72086FBDFF604E75F012519C15C04E6E78D5AEA2619", |
INIT_31 => x"FB0274FB0139FEDFF702E7FBDFF75FE4205F03E7FCDFF7082719C15CFCDFF6F4", |
INIT_32 => x"505EFA4CA5F847FDF8455CF94248FB1953FB183DFB1531FB105EFB047FFB0369", |
INIT_33 => x"94F9A7F8A7F8A7F8A7F894F992FC55D5F94488F958F1F853EDFB52A8F84DBCFA", |
INIT_34 => x"52415453335320524F4620342E312047554239305359530000000A0DFFFFFFFF", |
INIT_35 => x"3D5053202004202D20043F54414857043E040000000A0D4B04202D2020524554", |
INIT_36 => x"20043D50442020043D58492020043D59492020043D53552020043D4350202004", |
INIT_37 => x"000000000004315343565A4E4948464504203A43432020043D422020043D4120", |
INIT_38 => x"300B2784AC1084AF1084EEAA558E10A0D08E84A7F086FB264A80A70F86F0FF8E", |
INIT_39 => x"2DA7D0DF8E10C0DFCE10FDFFB74444444443101F84EFD620ED26A0F08C00F089", |
INIT_3a => x"1084AF10AA558E1084EE2227A0F08C00F08930FB2A4AA66F0C862FA7F0862E6F", |
INIT_3b => x"2EA7D0DF8E10F186D520A5A70F88891F44444444101FD0DF8E1084EFE92684AC", |
INIT_3c => x"8EF32D0C814C80E7A66F0427A6E6211F4F2CE7A66F1420F92A4A0526A6E60C86", |
INIT_3d => x"9F6EC6DF9F6EC4DF9F6EC0DF9F6E62F816E2DFF753F9265A80A7A0A610C6F0FF", |
INIT_3e => x"0822CEDFBC8B300F27FFFF8CCCDFBE49584F4AAF80E64AAE431FCADF9F6EC8DF", |
INIT_3f => x"00FFB2FFC2FFBEFFBAFFB6FFC6FFB2FFC2DF9F6E42EE1F37F16E44AEC4EC1034" |
/sys09xes.lst
0,0 → 1,3782
Assembler release DWC_2.0 version 2.11 |
May 6, 2004 (c) Motorola (free ware) |
0001 NAM SYS09BUG FOR XESS |
0000 INCLUDE "opt_xes.txt" |
0001 * |
0002 *************************************************** |
0003 * OPTION SWITCHES |
0004 *************************************************** |
0005 * |
0006 * |
0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE |
0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET |
0009 ** FOR LOADING AND SAVING S1 RECORDS |
0010 * |
0011 *S3EOPT EQU $FF SPARTAN3E STARTER |
0012 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD |
0013 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD |
0014 00FF XESOPT EQU $FF XESS XSA-3S100 & XST-3.0 |
0015 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY |
0016 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT |
0017 * |
0002 END |
0000 INCLUDE "sys09equ.txt" |
0001 * |
0002 *************************************************** |
0003 * MEMORY MAP EQUATES * |
0004 *************************************************** |
0005 E000 MONIO EQU $E000 I/O SPACE |
0006 IFD S3EOPT |
0007 MONRAM EQU $7FC0 |
0008 ELSE |
0009 DFC0 MONRAM EQU $DFC0 STACK SPACE |
0010 ENDIF S3EOPT |
0011 F800 MONROM EQU $F800 START OF ROM |
0012 IFD S3SOPT |
0013 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0014 EXTCMD EQU $00 EXTENDED OFFSET |
0015 ENDIF S3SOPT |
0015 ENDIF S3SOPT |
0016 IFD XESOPT |
0017 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS |
0018 0000 EXTCMD EQU $00 EXTENDED OFFSET |
0019 ENDIF XESOPT |
0020 *************************************************** |
0021 |
0022 IFD S3EOPT |
0023 * |
0024 * DIGILENT SPARTAN 3E STARTER |
0025 * |
0026 ACIAOPT EQU $FF ACIA AT PORT 0 |
0027 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0028 VDUOPT EQU $FF VDU AT $E030 |
0029 TRAOPT EQU $FF PIA TRACE TIMER |
0030 ENDIF S3EOPT |
0030 ENDIF S3EOPT |
0031 * |
0032 IFD S3SOPT |
0033 * |
0034 * DIGILENT SPARTAN 3 STARTER |
0035 * |
0036 ACIAOPT EQU $FF ACIA AT PORT 0 |
0037 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0038 VDUOPT EQU $FF VDU AT $E030 |
0039 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0040 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0041 EXTOPT EQU $FF EXTENDED COMMANDS |
0042 ENDIF S3SOPT |
0042 ENDIF S3SOPT |
0043 * |
0044 IFD B5XOPT |
0045 * |
0046 * BURCHED B5-X300 |
0047 * |
0048 ACIAOPT EQU $FF ACIA AT PORT 0 |
0049 PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0050 VDUOPT EQU $FF VDU AT $E030 |
0051 CF8OPT EQU $FF COMPACT FLASH AT $E040 |
0052 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0053 ENDIF B5XOPT |
0053 ENDIF B5XOPT |
0054 * |
0055 IFD XESOPT |
0056 * |
0057 * XESS XSA-3S1000 & XST-3.0 |
0058 * |
0059 00FF ACIAOPT EQU $FF ACIA AT PORT 0 |
0060 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020 |
0061 00FF VDUOPT EQU $FF VDU AT $E030 |
0062 00FF IDEOPT EQU $FF XESS IDE AT $E100 |
0063 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0064 00FF EXTOPT EQU $FF EXTENDED COMMANDS |
0065 ENDIF XESOPT |
0066 * |
0067 IFD ADSOPT |
0068 * |
0069 * ACKERMAN DIGITAL ADS6809 |
0070 * |
0071 DG640OPT EQU $FF DG640 VDU AT $E800 |
0072 *RTCOPT EQU $FF REAL TIME CLOCK |
0073 PRTOPT EQU $FF PRINTER DRIVERS |
0074 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0075 ENDIF ADSOPT |
0075 ENDIF ADSOPT |
0076 * |
0077 IFD SWTOPT |
0078 * |
0079 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER |
0080 * |
0081 ACIAOPT EQU $FF ACIA AT PORT 0 |
0082 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT |
0083 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT |
0084 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION |
0085 ENDIF |
0085 ENDIF |
0086 * |
0087 IFD ACIAOPT |
0088 * |
0089 *************************************************** |
0090 * SERIAL PORT * |
0091 *************************************************** |
0092 * |
0093 ** ACIA SITS ON PORT 0 |
0094 * |
0095 E000 ACIAS EQU MONIO+$00 CONTROL PORT |
0096 * |
0097 ENDIF ACIAOPT |
0098 IFD MFDCOPT |
0099 * |
0100 *************************************************** |
0101 * MINIFLOPPY DRIVE * |
0102 *************************************************** |
0103 * |
0104 ** FLOPPY DISK CONTROLLER SITS ON PORT 1 |
0105 * |
0106 DRVFDC EQU MONIO+$14 |
0107 CMDFDC EQU MONIO+$18 |
0108 SECFDC EQU MONIO+$1A |
0109 DATFDC EQU MONIO+$1B |
0110 ENDIF MFDCOPT |
0110 ENDIF MFDCOPT |
0111 IFD PS2OPT |
0112 * |
0113 *************************************************** |
0114 * VDU8 PS/2 KEYBOARD PORT * |
0115 *************************************************** |
0116 * |
0117 ** KEYBOARD SITS ON PORT 2 |
0118 * |
0119 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT |
0120 ENDIF PS2OPT |
0121 IFD VDUOPT |
0122 * |
0123 *************************************************** |
0124 * VDU8 DISPLAY DRIVER EQUATES * |
0125 *************************************************** |
0126 * |
0127 ** VDU8 DISPLAY SITS ON PORT 3 |
0128 * |
0129 E030 VDU EQU MONIO+$30 |
0130 0000 VDUCHR EQU 0 CHARACTER REGISTER |
0131 0001 VDUATT EQU 1 ATTRIBUTE REGISTER |
0132 0002 VDUCOL EQU 2 CURSOR COLUMN |
0133 0003 VDUROW EQU 3 CURSOR ROW |
0134 0004 VDUOFF EQU 4 ROW OFFSET |
0135 * |
0136 0050 LINLEN EQU 80 LENGTH OF A LINE |
0137 0019 NUMLIN EQU 25 NUMBER OF LINES |
0138 ENDIF VDUOPT |
0139 * |
0140 IFD CF8OPT |
0141 * |
0142 *************************************************** |
0143 * COMPACT FLASH EQUATES 8 BIT TRANSFER * |
0144 *************************************************** |
0145 * |
0146 ** COMPACT FLASH SITS AT PORT 4 |
0147 * |
0148 CF_BASE EQU MONIO+$40 |
0149 CF_DATA EQU CF_BASE+0 |
0150 CF_ERROR EQU CF_BASE+1 ; read error |
0151 CF_FEATURE EQU CF_BASE+1 ; write feature |
0152 CF_SECCNT EQU CF_BASE+2 |
0153 CF_SECNUM EQU CF_BASE+3 |
0154 CF_CYLLO EQU CF_BASE+4 |
0155 CF_CYLHI EQU CF_BASE+5 |
0156 CF_HEAD EQU CF_BASE+6 |
0157 CF_STATUS EQU CF_BASE+7 ; read status |
0158 CF_COMAND EQU CF_BASE+7 ; write command |
0159 * |
0160 * Command Equates |
0161 * |
0162 CMDREAD EQU $20 ; Read Single sector |
0163 CMDWRITE EQU $30 ; Write Single sector |
0164 CMDFEATURE EQU $EF |
0165 FEAT8BIT EQU $01 ; enable 8 bit transfers |
0166 HEADLBA EQU $E0 |
0167 * |
0168 * Status bit equates |
0169 * |
0170 BUSY EQU $80 |
0171 DRDY EQU $40 |
0172 DRQ EQU $08 |
0173 ERR EQU $01 |
0174 * |
0175 ENDIF CF8OPT |
0175 ENDIF CF8OPT |
0176 * |
0177 IFD IDEOPT |
0178 * |
0179 *************************************************** |
0180 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) * |
0181 *************************************************** |
0182 * |
0183 ** COMPACT FLASH SITS AT PORT 4 |
0184 * |
0185 E100 CF_BASE EQU MONIO+$0100 |
0186 E100 CF_DATA EQU CF_BASE+0 |
0187 E102 CF_ERROR EQU CF_BASE+2 ; read error |
0188 E102 CF_FEATURE EQU CF_BASE+2 ; write feature |
0189 E104 CF_SECCNT EQU CF_BASE+4 |
0190 E106 CF_SECNUM EQU CF_BASE+6 |
0191 E108 CF_CYLLO EQU CF_BASE+8 |
0192 E10A CF_CYLHI EQU CF_BASE+10 |
0193 E10C CF_HEAD EQU CF_BASE+12 |
0194 E10E CF_STATUS EQU CF_BASE+14 ; read status |
0195 E10E CF_COMAND EQU CF_BASE+14 ; write command |
0196 E11E CF_AUX EQU CF_BASE+30 |
0197 * |
0198 * Command Equates |
0199 * |
0200 0020 CMDREAD EQU $20 ; Read Single sector |
0201 0030 CMDWRITE EQU $30 ; Write Single sector |
0202 0006 AUXRESET EQU $06 ; Reset IDE |
0203 0002 AUXRSTREL EQU $02 ; Reset release IRQ masked |
0204 00E0 HEADLBA EQU $E0 |
0205 * |
0206 * Status bit equates |
0207 * |
0208 0080 BUSY EQU $80 |
0209 0040 DRDY EQU $40 |
0210 0008 DRQ EQU $08 |
0211 0001 ERR EQU $01 |
0212 * |
0213 ENDIF CF8OPT |
0214 * |
0215 IFD RTCOPT |
0216 * |
0217 ************************************************** |
0218 * MM58167A REAL TIME CLOCK MEMORY MAP: |
0219 ************************************************** |
0220 * |
0221 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5 |
0222 * |
0223 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS |
0224 * |
0225 * COUNTER AND COMPARITOR REGISTERS: |
0226 * |
0227 * Both the Clock Counter and Clock Comparitor |
0228 * consist of 8 registers for holding the time. |
0229 * The register offsets from the Counter and |
0230 * Comparitor registers are listed above. |
0231 * |
0232 COUNTR EQU CLOCK+0 |
0233 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS |
0234 * |
0235 * CLOCK REGISTER OFFSETS: |
0236 * These register offsets are used for the CLOCK |
0237 * and comparitor ram CMPRAM. |
0238 * |
0239 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS |
0240 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS |
0241 SECOND EQU 2 |
0242 MINUIT EQU 3 |
0243 HOUR EQU 4 |
0244 WKDAY EQU 5 |
0245 MTHDAY EQU 6 |
0246 MONTH EQU 7 |
0247 * |
0248 * INTERRUPT OUTPUT REGISTERS: |
0249 * |
0250 * An interrupt output may be generated at the |
0251 * following rates by setting the appropriate bit |
0252 * in the Interrupt Control Register (CINTCR). |
0253 * The Interrupt Status Register (CINTSR) must be |
0254 * read to clear the interrupt and will return |
0255 * the source of the interrupt. |
0256 * |
0257 * 1/Month Bit 7 |
0258 * 1/Week Bit 6 |
0259 * 1/Day Bit 5 |
0260 * 1/Hour Bit 4 |
0261 * 1/Minuite Bit 3 |
0262 * 1/Second Bit 2 |
0263 * 10/Second Bit 1 |
0264 * Comparitor Bit 0 |
0265 * |
0266 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER |
0267 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER |
0268 * |
0269 * COUNTER AND RAM RESETS; GO COMMAND. |
0270 * |
0271 * The counter and comparitor may be reset |
0272 * by writing $FF into CTRRES and CMPRES |
0273 * respectivly. |
0274 * A write to the Go command register (GOCMND) |
0275 * will reset the 1/1000ths, 1/100ths and 1/10ths |
0276 * of a second counter. |
0277 * |
0278 CTRRES EQU CLOCK+18 COUNTER RESET |
0279 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET |
0280 GOCMND EQU CLOCK+21 GO COMMAND |
0281 * |
0282 * CLOCK STATUS REGISTER. |
0283 * |
0284 * The counter takes 61 usec. to rollover for |
0285 * every 1KHz clock pulse. If the Status bit is |
0286 * set after reading the counter, the counter |
0287 * should be re-read to ensure the time is correct. |
0288 * |
0289 CLKSTA EQU CLOCK+20 STATUS BIT |
0290 SBYINT EQU CLOCK+22 STANDBY INTERRUPT |
0291 TSTMOD EQU CLOCK+31 TEST MODE REGISTER |
0292 ENDIF RTCOPT |
0292 ENDIF RTCOPT |
0293 * |
0294 IFD TRAOPT |
0295 * |
0296 ************************************************** |
0297 * PIA INTERRUPT TIMER |
0298 ************************************************** |
0299 * |
0300 ** PIA INTERRUPT TIMER SITS ON PORT 7 |
0301 * |
0302 ** PIA TIMER FOR SINGLE STEP / TRACE |
0303 * |
0304 * TADATA = Output = Timer preset register |
0305 * TACTRL - CA1 = input = rising edge = NMI |
0306 * - CA2 = Output = Timer Reset (Active High) |
0307 * TBDATA = Input = Timer read back register |
0308 * TBCTRL - CB1 = input = rising edge = FIRQ |
0309 * - CB2 = output = strobe low on write to TBDATA = Timer Preset |
0310 * |
0311 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0312 * CRA1 = 1 CA1 Rising edge IRQ |
0313 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0314 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0315 * CRA4 = 1 ] CA2 = Set/Reset output |
0316 * CRA5 = 1 ] |
0317 * CRA6 = X CA2 Input Interrupt Flag |
0318 * CRA7 = X CA1 Interrupt Flag |
0319 * |
0320 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0321 * CRB1 = 1 CB1 Rising edge IRQ |
0322 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0323 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0324 * CRB4 = 1 ] CB2 = Set/Reset output |
0325 * CRB5 = 1 ] |
0326 * CRB6 = X CB2 Input Interrupt Flag |
0327 * CRB7 = X CB1 Interrupt Flag |
0328 * |
0329 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output |
0330 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output |
0331 * |
0332 TADATA EQU MONIO+$70 Timer preset port |
0333 TACTRL EQU MONIO+$71 |
0334 TBDATA EQU MONIO+$72 Timer read back port |
0335 TBCTRL EQU MONIO+$73 |
0336 * |
0337 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged) |
0338 * |
0339 ENDIF TRAOPT |
0339 ENDIF TRAOPT |
0340 IFD ADSOPT |
0341 * |
0342 *************************************************** |
0343 * SERIAL PORT FOR DG640 * |
0344 *************************************************** |
0345 * |
0346 ** SET UP FOR ACKERMAN DIGITAL ADS6809 |
0347 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA |
0348 * |
0349 ACIAS EQU MONIO+$400 CONTROL PORT |
0350 * |
0351 ENDIF ADSOPT |
0351 ENDIF ADSOPT |
0352 IFD PRTOPT |
0353 * |
0354 *************************************************** |
0355 * PRINTER INTERFACE * |
0356 *************************************************** |
0357 * |
0358 PADATA EQU MONIO+$404 |
0359 PACTRL EQU MONIO+$405 |
0360 PBDATA EQU MONIO+$406 |
0361 PBCTRL EQU MONIO+$407 |
0362 * |
0363 ** CB1 ACK. I/P |
0364 ** CB2 STB. O/P |
0365 ** PB0 - PB7 DATA 1 - 8 O/P |
0366 ** PORT A BIT ASSIGNMENT |
0367 * |
0368 PBUSY EQU $80 I/P |
0369 PEMPTY EQU $40 I/P |
0370 SELECT EQU $20 I/P |
0371 PERROR EQU $10 I/P |
0372 PRESET EQU %00000100 O/P PA3 = 0 |
0373 AUTOFD EQU %00001000 O/P PA2 = 0 |
0374 DIRMSK EQU %00001100 |
0375 ENDIF PRTOPT |
0375 ENDIF PRTOPT |
0376 IFD DG640OPT |
0377 * |
0378 *************************************************** |
0379 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0380 *************************************************** |
0381 * |
0382 ** VIDEO DISPLAY DEFINITIONS |
0383 * |
0384 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY |
0385 LINLEN EQU 64 LENGTH OF A LINE |
0386 NUMLIN EQU 16 NUMBER OF LINES |
0387 SCNLEN EQU $400 LENGTH OF SCREEN |
0388 ENDIF DG640OPT |
0388 ENDIF DG640OPT |
0389 * |
0390 IFD DMAFOPT |
0391 * |
0392 *************************************************** |
0393 * DMAF2 8" DRIVE * |
0394 *************************************************** |
0395 * |
0396 ADDREG EQU $F000 ADDRESS REGISTER |
0397 CNTREG EQU $F002 COUNT REGISTER |
0398 CCREG EQU $F010 CHANNEL CONTROL REGISTER |
0399 PRIREG EQU $F014 DMA PRIORITY REGISTER |
0400 AAAREG EQU $F015 ??? |
0401 BBBREG EQU $F016 ??? |
0402 COMREG EQU $F020 1791 COMMAND REGISTER |
0403 SECREG EQU $F022 SECTOR REGISTER |
0404 DRVREG EQU $F024 DRIVE SELECT LATCH |
0405 CCCREG EQU $F040 ??? |
0406 ENDIF DMAFOPT |
0406 ENDIF DMAFOPT |
0407 IFD DATOPT |
0408 ************************************************** |
0409 * DYNAMIC ADDRESS TRANSLATION REGISTERS * |
0410 ************************************************** |
0411 * |
0412 FFF0 IC11 EQU $FFF0 DAT RAM CHIP |
0413 55AA TSTPAT EQU $55AA TEST PATTERN |
0414 ENDIF DATOPT |
0415 * |
0003 END |
0000 INCLUDE "sys09ide.txt" |
0001 * |
0002 ** SYS09BUG MONITOR EXTENSIONS |
0003 * |
0004 * FOR SYS09BUG ON THE XESS XSA-3S100 / XST-3.0 |
0005 * WITH I/O MAPPED AT $XE000 |
0006 * 16 BIT IDE MAPPED AT $E100 |
0007 * AND ROM MAPPED AT $XF000 |
0008 * |
0009 * |
|
|
sys09ide.txt page 2 |
0011 * |
0012 *************************************************** |
0013 * Serial PROM register |
0014 *************************************************** |
0015 * |
0016 ** CONFIGURATION PROM DEFINITIONS |
0017 * |
0018 E0C0 PROMREG EQU MONIO+$C0 |
0019 0001 PCLKHI EQU $01 Toggle PROM Clock High |
0020 0000 PCLKLO EQU $00 Toggle PROM Clock Low |
0021 0002 PRSTHI EQU $02 Toggle PROM Reset High |
0022 0000 PRSTLO EQU $00 Toggle PROM Reset Low |
0023 AA55 SYNCHI EQU $AA55 Synch Pattern High Word |
0024 FF00 SYNCLO EQU $FF00 Synch Pattern Low Word |
0025 * |
0026 * |
0027 *************************************************** |
0028 * START OF ROM * |
0029 *************************************************** |
0030 * |
0031 F800 MONITV EQU MONROM+0 FDB MONITOR |
0032 F802 NXTCMV EQU MONROM+2 FDB NEXTCMD |
0033 F804 INCHV EQU MONROM+4 FDB INCH |
0034 F806 INCHEV EQU MONROM+6 FDB INCHE |
0035 F808 INCHKV EQU MONROM+8 FDB INCHEK |
0036 F80A OUTCHV EQU MONROM+10 FDB OUTCH |
0037 F80C PDATAV EQU MONROM+12 FDB PDATA |
0038 F80E PCRLFV EQU MONROM+14 FDB PCRLF |
0039 F810 PSTRGV EQU MONROM+16 FDB PSTRNG |
0040 F812 LRAV EQU MONROM+18 FDB LRA |
0041 * |
0042 * Condition code flags |
0043 * |
0044 0001 CFLAG EQU $01 CARRY FLAG |
0045 0002 VFLAG EQU $02 OVERFLOW FLAG |
0046 0004 ZFLAG EQU $04 ZERO FLAG |
0047 0008 NFLAG EQU $08 NEGATIVE FLAG |
0048 0010 IFLAG EQU $10 IRQ MASK CC |
0049 0020 HFLAG EQU $20 HALF CARRY |
0050 0040 FFLAG EQU $40 FIRQ MASK CC |
0051 0080 EFLAG EQU $80 ENTIRE FLAG |
0052 * |
0053 * Serial Port |
0054 * |
0055 E000 ACIAC1 EQU ACIAS |
0056 E001 ACIAD1 EQU ACIAS+1 |
0057 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50) |
0058 * |
0059 * XMODEM Control characters |
0060 * |
0061 0001 SOH EQU $01 |
0062 0004 EOT EQU $04 |
0063 0006 ACK EQU $06 |
0064 0015 NAK EQU $15 |
0065 0018 CAN EQU $18 |
0066 * |
0067 * Some Disk Constants |
0068 * |
0069 0100 RMAXTRK EQU 256 |
0070 00FF RMAXSEC EQU 255 |
0071 FE01 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC |
0072 * |
0073 * RAM SPACE |
0074 * |
0075 * PUT THIS DOWN THE BOTTOM OF MEMORY |
0076 * |
0077 0100 ORG $0100 |
0078 0100 DRVNUM RMB 1 |
0079 0101 TRACK RMB 1 |
0080 0102 SECTOR RMB 1 |
0081 0103 CHKSUM RMB 1 |
0082 0104 BLKNUM RMB 1 Xmodem block number |
0083 0105 BYTCNT RMB 1 Xmodem byte count |
0084 0106 XSTATE RMB 2 Xmodem State Vector |
0085 0108 DELCNT RMB 3 $00,$00,$00 Xmodem Poll timer |
0086 010B MAXTRK RMB 1 |
0087 010C MAXSEC RMB 1 |
0088 0200 ORG $0200 |
0089 * |
0090 * SECTOR BUFFER |
0091 * |
0092 0200 BUFFER RMB 256 |
0093 * |
0094 **************************************** |
0095 * |
0096 * START OF EXTENSION COMMANDS |
0097 * |
0098 **************************************** |
0099 * |
0100 F000 ORG MONEXT |
0101 F000 F0 02 FDB NEXTEXT Jump to next extended command |
0102 * |
0103 ***** NEXTCMD ***** |
0104 * |
0105 F002 AD 9F F8 06 NEXTEXT JSR [INCHEV] GET ONE CHAR. FROM TERMINAL |
0106 F006 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
0107 F008 1F 89 TFR A,B |
0108 F00A 86 20 LDA #$20 |
0109 F00C AD 9F F8 0A JSR [OUTCHV] PRNT SPACE |
0110 F010 C1 60 CMPB #$60 |
0111 F012 2F 02 BLE NXTEX0 |
0112 F014 C0 20 SUBB #$20 |
0113 * |
0114 ***** DO TABLE LOOKUP ***** |
0115 * FOR COMMAND FUNCTIONS |
0116 * |
0117 F016 8E F0 2C NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE |
0118 F019 E1 80 NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
0119 F01B 27 0D BEQ JMPEXT BRANCH IF MATCH FOUND |
0120 F01D 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
0121 F01F 8C F0 35 CMPX #EXTEND REACHED END OF TABLE YET ? |
0122 F022 26 F5 BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY |
0123 F024 8E F0 35 LDX #MSGWHAT POINT TO MSG "WHAT?" |
0124 F027 16 02 29 LBRA PDATA1 PRINT MSG AND RETURN |
0125 F02A 6E 94 JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE |
0126 * |
0127 * EXTENDED COMMAND JUMP TABLE |
0128 * |
0129 F02C EXTTAB EQU * |
0130 F02C 42 FCC 'B' BOOT FLEX |
0131 F02D F0 3E FDB UBSUB |
0132 F02F 46 FCC 'F' FORMAT IDE DISK |
0133 F030 F0 EA FDB UFSUB |
0134 F032 58 FCC 'X' XMODEM ROM DISK UPLOAD |
0135 F033 F2 BC FDB UXSUB |
0136 * |
0137 F035 EXTEND EQU * |
0138 * |
0139 F035 57 48 41 54 20 3F MSGWHAT FCC "WHAT ?" |
0140 F03B 0A 0D 04 FCB $0A,$0D,$04 |
0141 * |
0142 * GO TO FLEX RESIDENT IN MEMORY |
0143 * |
0144 F03E 8E CD 00 UBSUB LDX #$CD00 |
0145 F041 AF 4A STX 10,U |
0146 F043 1F 34 TFR U,S |
0147 F045 3B RTI |
0148 * |
0149 * recieve char from remote drive. |
0150 * timeout if no response for approx 1s. |
0151 * Entry: no parameters |
0152 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
0153 * |
0154 F046 34 30 RCHAR PSHS X,Y |
0155 * |
0156 F048 8E 03 E8 LDX #1000 1000x inner loop |
0157 F04B 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
0158 F04F B6 E0 00 RCHAR2 LDA ACIAC1 test for recieved char |
0159 F052 47 ASRA |
0160 F053 25 0A BCS RCHAR3 get character |
0161 F055 31 3F LEAY -1,Y else, continue to count delay |
0162 F057 26 F6 BNE RCHAR2 |
0163 F059 30 1F LEAX -1,X |
0164 F05B 26 EE BNE RCHAR1 |
0165 F05D 35 B0 PULS X,Y,PC return with error if timed out |
0166 * |
0167 F05F B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set) |
0168 F062 35 B0 PULS X,Y,PC |
0169 * |
0170 * |
0171 * transmit char to remote drive. |
0172 * timeout if no response for approx 1s. (allows for use of hardware flow control) |
0173 * Entry: (A) = char to transmit |
0174 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout. |
0175 * |
0176 F064 34 30 SCHAR PSHS X,Y |
0177 F066 34 02 PSHS A |
0178 * |
0179 F068 8E 03 E8 LDX #1000 1000x inner loop |
0180 F06B 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms). |
0181 F06F B6 E0 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO |
0182 F072 47 ASRA |
0183 F073 47 ASRA |
0184 F074 25 0C BCS SCHAR3 send character |
0185 F076 31 3F LEAY -1,Y else, continue to count delay |
0186 F078 26 F5 BNE SCHAR2 |
0187 F07A 30 1F LEAX -1,X |
0188 F07C 26 ED BNE SCHAR1 |
0189 F07E 35 02 PULS A |
0190 F080 35 B0 PULS X,Y,PC return with error if timed out |
0191 * |
0192 F082 35 02 SCHAR3 PULS A |
0193 F084 B7 E0 01 STA ACIAD1 send data (carry bit still set) |
0194 F087 35 B0 PULS X,Y,PC |
0195 * |
0196 ** 'UF' Format IDE Drive to FLEX standard. |
0197 * |
0198 F089 0A 0D DISFOS FCB $0A,$0D |
0199 F08B 46 6F 72 6D 61 74 FCC 'Formating IDE disk... ' |
69 6E 67 20 49 44 |
45 20 64 69 73 6B |
2E 2E 2E 20 |
0200 F0A1 0A 0D FCB $0A,$0D |
0201 F0A3 44 72 69 76 65 20 FCC 'Drive Number ?' |
4E 75 6D 62 65 72 |
20 3F |
0202 F0B1 04 FCB 4 |
0203 F0B2 0A 0D 04 MESS6 FCB $0A,$0D,4 |
0204 F0B5 49 44 45 20 64 72 FCC 'IDE drive not allocated! ' |
69 76 65 20 6E 6F |
74 20 61 6C 6C 6F |
63 61 74 65 64 21 |
20 |
0205 F0CE 04 FCB 4 |
0206 F0CF 0A 0D UFMSG1 FCB $0A,$0D |
0207 F0D1 46 6F 72 6D 61 74 FCC 'Format Complete' |
20 43 6F 6D 70 6C |
65 74 65 |
0208 F0E0 04 FCB 4 |
0209 F0E1 49 44 45 44 49 53 VOLMSG FCC 'IDEDISK ' |
4B 20 |
0210 F0E9 04 FCB 4 |
0211 * |
0212 F0EA BD F4 BD UFSUB JSR INITDR |
0213 F0ED 8E F0 89 LDX #DISFOS |
0214 F0F0 BD F2 53 JSR PDATA1 |
0215 F0F3 17 FF 50 UFSUB1 LBSR RCHAR |
0216 F0F6 24 FB BCC UFSUB1 |
0217 F0F8 17 FF 69 LBSR SCHAR |
0218 F0FB 81 30 CMPA #'0' |
0219 F0FD 10 25 00 EF LBLO UFEXIT |
0220 F101 81 33 CMPA #'3' |
0221 F103 10 22 00 E9 LBHI UFEXIT |
0222 F107 80 30 SUBA #'0' |
0223 F109 1F 89 TFR A,B |
0224 F10B F7 01 00 STB DRVNUM |
0225 F10E 8E 00 FD LDX #DRVNUM-3 |
0226 F111 BD F5 3A JSR DRVSEL |
0227 * |
0228 * set up free chain |
0229 * |
0230 F114 8E 02 00 LDX #BUFFER clear out buffer |
0231 F117 4F CLRA |
0232 F118 5F CLRB |
0233 F119 A7 80 DFL1 STA 0,X+ |
0234 F11B 5A DECB |
0235 F11C 26 FB BNE DFL1 |
0236 * |
0237 F11E 7F 01 01 CLR TRACK |
0238 F121 86 01 LDA #1 |
0239 F123 B7 01 02 STA SECTOR |
0240 F126 8E 02 00 DFL2 LDX #BUFFER |
0241 F129 B6 01 01 LDA TRACK |
0242 F12C A7 84 STA 0,X |
0243 F12E B6 01 02 LDA SECTOR |
0244 F131 4C INCA |
0245 F132 81 00 CMPA #RMAXSEC+1 last sector on track? |
0246 F134 26 04 BNE DFL3 |
0247 F136 6C 84 INC 0,X |
0248 F138 86 01 LDA #1 |
0249 F13A A7 01 DFL3 STA 1,X |
0250 F13C B6 01 01 LDA TRACK |
0251 F13F F6 01 02 LDB SECTOR |
0252 F142 BD F5 15 JSR WRITSC |
0253 F145 7C 01 02 INC SECTOR |
0254 F148 B6 01 02 LDA SECTOR |
0255 F14B 81 00 CMPA #RMAXSEC+1 |
0256 F14D 26 D7 BNE DFL2 |
0257 F14F 86 01 LDA #1 |
0258 F151 B7 01 02 STA SECTOR |
0259 F154 7C 01 01 INC TRACK |
0260 F157 B6 01 01 LDA TRACK |
0261 F15A 81 00 CMPA #RMAXTRK |
0262 F15C 26 C8 BNE DFL2 |
0263 * break free chain at last track/sector |
0264 F15E 8E 02 00 LDX #BUFFER |
0265 F161 86 FF LDA #RMAXTRK-1 |
0266 F163 C6 FF LDB #RMAXSEC |
0267 F165 BD F4 F1 JSR READSC |
0268 F168 8E 02 00 LDX #BUFFER |
0269 F16B 6F 84 CLR 0,X |
0270 F16D 6F 01 CLR 1,X |
0271 F16F 86 FF LDA #RMAXTRK-1 |
0272 F171 C6 FF LDB #RMAXSEC |
0273 F173 BD F5 15 JSR WRITSC |
0274 * set up sector structure, SIR, directory etc |
0275 F176 8E 02 00 LDX #BUFFER |
0276 F179 4F CLRA |
0277 F17A C6 FF LDB #RMAXSEC |
0278 F17C BD F4 F1 JSR READSC |
0279 F17F 8E 02 00 LDX #BUFFER |
0280 F182 6F 84 CLR 0,X break end of directory chain |
0281 F184 6F 01 CLR 1,X |
0282 F186 4F CLRA |
0283 F187 C6 FF LDB #RMAXSEC |
0284 F189 BD F5 15 JSR WRITSC |
0285 * |
0286 F18C 8E 02 00 LDX #BUFFER |
0287 F18F 4F CLRA |
0288 F190 C6 03 LDB #3 set up SIR |
0289 F192 BD F4 F1 JSR READSC |
0290 F195 8E 02 00 LDX #BUFFER |
0291 F198 6F 84 CLR 0,X break forward link |
0292 F19A 6F 01 CLR 1,X |
0293 * |
0294 F19C 34 20 PSHS Y |
0295 F19E 10 8E F0 E1 LDY #VOLMSG |
0296 F1A2 C6 10 LDB #16 |
0297 F1A4 A6 A0 DFL4 LDA ,Y+ |
0298 F1A6 A7 85 STA B,X |
0299 F1A8 5C INCB |
0300 F1A9 C1 18 CMPB #24 |
0301 F1AB 26 F7 BNE DFL4 |
0302 F1AD 35 20 PULS Y |
0303 * |
0304 F1AF 4F CLRA |
0305 F1B0 F6 01 00 LDB DRVNUM volume number |
0306 F1B3 ED 88 1B STD 27,X |
0307 * |
0308 F1B6 CC 01 01 LDD #$0101 first trk/sec 01-01 |
0309 F1B9 ED 88 1D STD 29,X |
0310 F1BC 86 FF LDA #RMAXTRK-1 |
0311 F1BE C6 FF LDB #RMAXSEC |
0312 F1C0 ED 88 1F STD 31,X |
0313 F1C3 ED 88 26 STD 38,X |
0314 F1C6 CC FE 01 LDD #RTOTSEC total DATA sectors (2912-14) |
0315 F1C9 ED 88 21 STD 33,X |
0316 * |
0317 F1CC 86 01 LDA #01 month set default creation date (SYS09's birthday!) |
0318 F1CE A7 88 23 STA 35,X |
0319 F1D1 86 07 LDA #07 day |
0320 F1D3 A7 88 24 STA 36,X |
0321 F1D6 86 07 LDA #07 year |
0322 F1D8 A7 88 25 STA 37,X |
0323 * |
0324 F1DB 4F RF3 CLRA |
0325 F1DC C6 03 LDB #3 |
0326 F1DE BD F5 15 JSR WRITSC |
0327 * |
0328 * Not sure what this is about |
0329 * put bootstrap on track 0 sector 1 |
0330 * |
0331 * LDX #BUFFER |
0332 * CLRA |
0333 * LDB #1 |
0334 * JSR READSC |
0335 * LDX #BUFFER |
0336 * LDA #$AA set the init flag |
0337 * STA 0,X |
0338 * LDA #$55 |
0339 * STA 1,X |
0340 * CLRA |
0341 * LDB #1 |
0342 * JSR WRITSC |
0343 * |
0344 * Write Boot sector |
0345 * |
0346 F1E1 8E F7 00 LDX #BOOT |
0347 F1E4 4F CLRA TRACK 0 |
0348 F1E5 C6 01 LDB #$01 SECTOR 1 |
0349 F1E7 B7 01 01 STA TRACK |
0350 F1EA F7 01 02 STB SECTOR |
0351 F1ED 17 03 25 LBSR WRITSC |
0352 * |
0353 F1F0 8E F0 CF UFEXIT LDX #UFMSG1 |
0354 F1F3 7E F2 53 JMP PDATA1 |
0355 * |
0356 * ACIA INPUT TEST |
0357 * |
0358 F1F6 B6 E0 00 INTEST LDA ACIAC1 |
0359 F1F9 85 01 BITA #$01 |
0360 F1FB 39 RTS |
0361 * |
0362 * RESET ACIA |
0363 * |
0364 F1FC 86 03 ACIRST LDA #$03 master reset |
0365 F1FE B7 E0 00 STA ACIAC1 |
0366 F201 86 11 LDA #$11 |
0367 F203 B7 E0 00 STA ACIAC1 |
0368 F206 39 RTS |
0369 * |
0370 * ACIA INPUT |
0371 * |
0372 F207 86 10 INTER LDA #16 |
0373 F209 B7 01 08 STA DELCNT+0 |
0374 F20C 7F 01 09 CLR DELCNT+1 |
0375 F20F 7F 01 0A CLR DELCNT+2 |
0376 F212 B6 E0 00 INTER0 LDA ACIAC1 |
0377 F215 85 01 BITA #$01 |
0378 F217 26 08 BNE INTER1 |
0379 F219 85 78 BITA #$78 |
0380 F21B 27 0A BEQ INTER2 |
0381 F21D 8D DD BSR ACIRST |
0382 F21F 20 E6 BRA INTER |
0383 * |
0384 F221 B6 E0 01 INTER1 LDA ACIAD1 |
0385 F224 1C FD ANDCC #$FF-VFLAG |
0386 F226 39 RTS |
0387 * |
0388 F227 7A 01 0A INTER2 DEC DELCNT+2 |
0389 F22A 26 E6 BNE INTER0 |
0390 F22C 7A 01 09 DEC DELCNT+1 |
0391 F22F 26 E1 BNE INTER0 |
0392 F231 7A 01 08 DEC DELCNT+0 |
0393 F234 26 DC BNE INTER0 |
0394 F236 4F CLRA |
0395 F237 1A 02 ORCC #VFLAG |
0396 F239 39 RTS |
0397 * |
0398 * ACIA OUTPUT |
0399 * |
0400 F23A 34 02 OUTTER PSHS A |
0401 * |
0402 F23C B6 E0 00 OUTTE1 LDA ACIAC1 |
0403 F23F 85 02 BITA #$02 |
0404 F241 26 08 BNE OUTTE2 |
0405 F243 85 78 BITA #$78 |
0406 F245 27 F5 BEQ OUTTE1 |
0407 F247 8D B3 BSR ACIRST |
0408 F249 20 F1 BRA OUTTE1 |
0409 * |
0410 F24B 35 02 OUTTE2 PULS A |
0411 F24D B7 E0 01 STA ACIAD1 |
0412 F250 39 RTS |
0413 * |
0414 * Print Data |
0415 * |
0416 F251 8D E7 PDATA0 BSR OUTTER |
0417 F253 A6 80 PDATA1 LDA ,X+ |
0418 F255 81 04 CMPA #$04 |
0419 F257 26 F8 BNE PDATA0 |
0420 F259 39 RTS |
0421 * |
0422 * |
0423 ** 'UX' Xmodem IDE Disk upload |
0424 * |
0425 F25A 0D 0A UXMES0 FCB $0D,$0A |
0426 F25C 58 6D 6F 64 65 6D FCC 'Xmodem IDE Disk Upload' |
20 49 44 45 20 44 |
69 73 6B 20 55 70 |
6C 6F 61 64 |
0427 F272 04 FCB 4 |
0428 F273 0D 0A UXMES1 FCB $0D,$0A |
0429 F275 55 70 6C 6F 61 64 FCC 'Upload Complete' |
20 43 6F 6D 70 6C |
65 74 65 |
0430 F284 04 FCB 4 |
0431 F285 0D 0A UXMES2 FCB $0D,$0A |
0432 F287 55 70 6C 6F 61 64 FCC 'Upload Error' |
20 45 72 72 6F 72 |
0433 F293 04 FCB 4 |
0434 F294 0D 0A UXMSG3 FCB $0D,$0A |
0435 F296 44 72 69 76 65 20 FCC 'Drive Number :' |
4E 75 6D 62 65 72 |
20 3A |
0436 F2A4 04 FCB 4 |
0437 F2A5 0D 0A UXMSG4 FCB $0D,$0A |
0438 F2A7 41 72 65 20 59 6F FCC 'Are You Sure ? (Y/N)' |
75 20 53 75 72 65 |
20 3F 20 28 59 2F |
4E 29 |
0439 F2BB 04 FCB 4 |
0440 * |
0441 * Print Banner |
0442 * |
0443 F2BC 8E F2 5A UXSUB LDX #UXMES0 |
0444 F2BF 17 FF 91 LBSR PDATA1 |
0445 * |
0446 * Prompt for Disk drive number (0 to 3) |
0447 * |
0448 F2C2 8E F2 94 LDX #UXMSG3 |
0449 F2C5 17 FF 8B LBSR PDATA1 |
0450 F2C8 17 FF 3C UXSUB1 LBSR INTER |
0451 F2CB 29 FB BVS UXSUB1 |
0452 F2CD 17 FF 6A LBSR OUTTER |
0453 F2D0 81 30 CMPA #'0 |
0454 F2D2 10 25 01 2E LBLO UXEXIT |
0455 F2D6 81 33 CMPA #'3 |
0456 F2D8 10 22 01 28 LBHI UXEXIT |
0457 F2DC 80 30 SUBA #'0 |
0458 F2DE B7 01 00 STA DRVNUM |
0459 * |
0460 * Report selected drive |
0461 * |
0462 F2E1 8E F2 94 LDX #UXMSG3 |
0463 F2E4 17 FF 6C LBSR PDATA1 |
0464 F2E7 B6 01 00 LDA DRVNUM |
0465 F2EA 8B 30 ADDA #'0 |
0466 F2EC 17 FF 4B LBSR OUTTER |
0467 * |
0468 * Ask for confirmation (Y/N) |
0469 * |
0470 F2EF 8E F2 A5 LDX #UXMSG4 |
0471 F2F2 17 FF 5E LBSR PDATA1 |
0472 F2F5 17 FF 0F UXSUB2 LBSR INTER |
0473 F2F8 29 FB BVS UXSUB2 |
0474 F2FA 17 FF 3D LBSR OUTTER |
0475 F2FD 84 5F ANDA #$5F |
0476 F2FF 81 4E CMPA #'N |
0477 F301 10 27 00 FF LBEQ UXEXIT |
0478 F305 81 59 CMPA #'Y |
0479 F307 26 B3 BNE UXSUB |
0480 * |
0481 * We have confirmation ... now load the disk image |
0482 * |
0483 F309 17 01 B1 LBSR INITDR |
0484 F30C CE F4 2D LDU #XSTST |
0485 F30F FF 01 06 STU XSTATE |
0486 F312 86 01 LDA #1 |
0487 F314 B7 01 04 STA BLKNUM |
0488 * |
0489 * Sector1 |
0490 * |
0491 F317 8E 02 00 LDX #BUFFER |
0492 * |
0493 F31A 4F CLRA TRACK 0 |
0494 F31B C6 01 LDB #$01 SECTOR 1 |
0495 F31D B7 01 01 STA TRACK |
0496 F320 F7 01 02 STB SECTOR |
0497 * |
0498 F323 17 00 EA LBSR XREAD |
0499 F326 10 25 00 E0 LBCS UXERR |
0500 F32A 17 01 87 LBSR XACK |
0501 F32D 17 00 E0 LBSR XREAD |
0502 F330 10 25 00 D6 LBCS UXERR |
0503 * |
0504 F334 8E 02 00 LDX #BUFFER |
0505 F337 B6 01 01 LDA TRACK |
0506 F33A F6 01 02 LDB SECTOR |
0507 F33D 17 01 D5 LBSR WRITSC |
0508 F340 17 01 71 LBSR XACK |
0509 * |
0510 * Sector 2 |
0511 * |
0512 F343 8E 02 00 LDX #BUFFER |
0513 * |
0514 F346 B6 01 01 LDA TRACK |
0515 F349 F6 01 02 LDB SECTOR |
0516 F34C 5C INCB |
0517 F34D B7 01 01 STA TRACK |
0518 F350 F7 01 02 STB SECTOR |
0519 * |
0520 F353 17 00 BA LBSR XREAD |
0521 F356 10 25 00 B0 LBCS UXERR |
0522 F35A 17 01 57 LBSR XACK |
0523 F35D 17 00 B0 LBSR XREAD |
0524 F360 10 25 00 A6 LBCS UXERR |
0525 * |
0526 F364 8E 02 00 LDX #BUFFER |
0527 F367 B6 01 01 LDA TRACK |
0528 F36A F6 01 02 LDB SECTOR |
0529 F36D 17 01 A5 LBSR WRITSC |
0530 * |
0531 F370 17 01 41 LBSR XACK |
0532 * |
0533 * Sector 3 - SIR |
0534 * |
0535 F373 8E 02 00 LDX #BUFFER |
0536 * |
0537 F376 B6 01 01 LDA TRACK |
0538 F379 F6 01 02 LDB SECTOR |
0539 F37C 5C INCB |
0540 F37D B7 01 01 STA TRACK |
0541 F380 F7 01 02 STB SECTOR |
0542 * |
0543 F383 17 00 8A LBSR XREAD |
0544 F386 10 25 00 80 LBCS UXERR |
0545 F38A 17 01 27 LBSR XACK |
0546 F38D 17 00 80 LBSR XREAD |
0547 F390 10 25 00 76 LBCS UXERR |
0548 * |
0549 F394 8E 02 00 LDX #BUFFER |
0550 F397 A6 88 26 LDA 38,X |
0551 F39A 4C INCA |
0552 F39B B7 01 0B STA MAXTRK |
0553 F39E E6 88 27 LDB 39,X |
0554 F3A1 5C INCB |
0555 F3A2 F7 01 0C STB MAXSEC |
0556 F3A5 B6 01 01 LDA TRACK |
0557 F3A8 F6 01 02 LDB SECTOR |
0558 F3AB 17 01 67 LBSR WRITSC |
0559 * |
0560 F3AE 17 01 03 LBSR XACK |
0561 * |
0562 * Sector 4 to Last Track & Sector |
0563 * |
0564 * |
0565 F3B1 B6 01 01 LDA TRACK |
0566 F3B4 F6 01 02 LDB SECTOR |
0567 F3B7 5C INCB |
0568 * |
0569 F3B8 8E 02 00 UXLOOP LDX #BUFFER |
0570 F3BB B7 01 01 STA TRACK |
0571 F3BE F7 01 02 STB SECTOR |
0572 * |
0573 F3C1 17 00 4C LBSR XREAD |
0574 F3C4 10 25 00 42 LBCS UXERR |
0575 F3C8 17 00 E9 LBSR XACK |
0576 F3CB 17 00 42 LBSR XREAD |
0577 F3CE 10 25 00 38 LBCS UXERR |
0578 * |
0579 F3D2 8E 02 00 LDX #BUFFER |
0580 F3D5 B6 01 01 LDA TRACK |
0581 F3D8 F6 01 02 LDB SECTOR |
0582 F3DB 17 01 37 LBSR WRITSC |
0583 F3DE 17 00 D3 LBSR XACK |
0584 * |
0585 F3E1 B6 01 01 LDA TRACK |
0586 F3E4 F6 01 02 LDB SECTOR |
0587 F3E7 5C INCB |
0588 F3E8 F1 01 0C CMPB MAXSEC |
0589 F3EB 26 CB BNE UXLOOP |
0590 F3ED C6 01 LDB #1 |
0591 F3EF 4C INCA |
0592 F3F0 B1 01 0B CMPA MAXTRK |
0593 F3F3 26 C3 BNE UXLOOP |
0594 * |
0595 * |
0596 * Write Boot sector |
0597 * |
0598 F3F5 8E F7 00 LDX #BOOT |
0599 F3F8 4F CLRA TRACK 0 |
0600 F3F9 C6 01 LDB #$01 SECTOR 1 |
0601 F3FB B7 01 01 STA TRACK |
0602 F3FE F7 01 02 STB SECTOR |
0603 F401 17 01 11 LBSR WRITSC |
0604 * |
0605 F404 8E F2 73 UXEXIT LDX #UXMES1 |
0606 F407 7E F2 53 JMP PDATA1 |
0607 * |
0608 F40A 8E F2 85 UXERR LDX #UXMES2 |
0609 F40D 16 FE 43 LBRA PDATA1 |
0610 * |
0611 * Get a Byte using XModem protocol |
0612 * Carry clear => no errors |
0613 * Carry set => errors |
0614 * |
0615 F410 34 40 XREAD PSHS U |
0616 F412 FE 01 06 LDU XSTATE |
0617 * |
0618 F415 17 FD EF XBYTE0 LBSR INTER |
0619 F418 28 0A BVC XBYTE1 |
0620 F41A 86 15 LDA #NAK |
0621 F41C 17 FE 1B LBSR OUTTER |
0622 F41F CE F4 2D LDU #XSTST |
0623 F422 20 F1 BRA XBYTE0 |
0624 * |
0625 F424 AD C4 XBYTE1 JSR ,U |
0626 F426 26 ED BNE XBYTE0 |
0627 F428 FF 01 06 STU XSTATE |
0628 F42B 35 C0 PULS U,PC |
0629 * |
0630 * START - LOOK FOR SOH (START OF HEADER) = $01 |
0631 * |
0632 F42D 81 01 XSTST CMPA #SOH |
0633 F42F 26 06 BNE XSTST1 |
0634 F431 CE F4 4D LDU #XSTBL |
0635 F434 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0636 F436 39 RTS |
0637 * |
0638 F437 81 04 XSTST1 CMPA #EOT |
0639 F439 26 08 BNE XSTST2 |
0640 F43B 86 06 LDA #ACK |
0641 F43D 17 FD FA LBSR OUTTER |
0642 F440 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
0643 F442 39 RTS |
0644 * |
0645 F443 81 18 XSTST2 CMPA #CAN |
0646 F445 26 03 BNE XSTST3 |
0647 F447 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit |
0648 F449 39 RTS |
0649 * |
0650 F44A 1C FA XSTST3 ANDCC #$FF-CFLAG-ZFLAG |
0651 F44C 39 RTS |
0652 * |
0653 * Got SOH |
0654 * Now get block number |
0655 * |
0656 F44D B1 01 04 XSTBL CMPA BLKNUM |
0657 F450 26 06 BNE XSTBLE |
0658 F452 CE F4 63 LDU #XSTCOM |
0659 F455 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0660 F457 39 RTS |
0661 * |
0662 * Error in block number |
0663 * |
0664 F458 86 15 XSTBLE LDA #NAK |
0665 F45A 17 FD DD LBSR OUTTER |
0666 F45D CE F4 2D LDU #XSTST |
0667 F460 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0668 F462 39 RTS |
0669 * |
0670 * Get complement of block number |
0671 * |
0672 F463 43 XSTCOM COMA |
0673 F464 B1 01 04 CMPA BLKNUM |
0674 F467 26 EF BNE XSTBLE |
0675 F469 7F 01 03 CLR CHKSUM |
0676 F46C 86 80 LDA #128 |
0677 F46E B7 01 05 STA BYTCNT |
0678 F471 CE F4 77 LDU #XSTDA |
0679 F474 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit) |
0680 F476 39 RTS |
0681 * |
0682 * Get data bytes |
0683 * |
0684 F477 34 02 XSTDA PSHS A |
0685 F479 BB 01 03 ADDA CHKSUM |
0686 F47C B7 01 03 STA CHKSUM |
0687 F47F 35 02 PULS A |
0688 F481 7A 01 05 DEC BYTCNT |
0689 F484 26 03 BNE XSTDA1 |
0690 F486 CE F4 8E LDU #XSTCK |
0691 F489 A7 80 XSTDA1 STA ,X+ |
0692 F48B 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0693 F48D 39 RTS |
0694 * |
0695 * Byte count reached zero |
0696 * Check checksum byte |
0697 * |
0698 F48E B1 01 03 XSTCK CMPA CHKSUM |
0699 F491 26 0B BNE XSTCK1 retry if wrong checksum |
0700 * |
0701 * Checksum OK ... |
0702 * increment block number |
0703 * Don't send ACK until data written to CF |
0704 * |
0705 F493 7C 01 04 INC BLKNUM |
0706 F496 CE F4 2D LDU #XSTST |
0707 F499 1C FE ANDCC #$FF-CFLAG No abort |
0708 F49B 1A 04 ORCC #ZFLAG Valid data (exit) |
0709 F49D 39 RTS |
0710 * |
0711 * Checksum Error detected ... |
0712 * Reset Sector counter in ACCB to last 128 byte boundary |
0713 * and send NAK |
0714 * |
0715 F49E 34 04 XSTCK1 PSHS B |
0716 F4A0 1F 10 TFR X,D |
0717 F4A2 5A DECB |
0718 F4A3 C4 80 ANDB #128 |
0719 F4A5 1F 01 TFR D,X |
0720 F4A7 35 04 PULS B |
0721 F4A9 86 15 LDA #NAK |
0722 F4AB 17 FD 8C XSTCK2 LBSR OUTTER |
0723 F4AE CE F4 2D LDU #XSTST |
0724 F4B1 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit) |
0725 F4B3 39 RTS |
0726 * |
0727 * Acknowledge Data Received |
0728 * |
0729 F4B4 34 02 XACK PSHS A |
0730 F4B6 86 06 LDA #ACK |
0731 F4B8 17 FD 7F LBSR OUTTER |
0732 F4BB 35 82 PULS A,PC |
0733 * |
0734 * |
0735 ** FLEX 9 IDE DISK DRIVERS |
0736 * |
0737 * FOR SYS09BUG 1.2 ON THE XSA-3S1000 |
0738 * WITH I/O MAPPED AT $XE000 |
0739 * AND ROM MAPPED AT $XF000 |
0740 * |
0741 * |
0742 * INITIALIZE CF CARD FOR 8 BIT LBA MODE |
0743 * |
0744 F4BD CC 00 06 INITDR LDD #AUXRESET |
0745 F4C0 FD E1 1E STD CF_AUX |
0746 F4C3 CC 00 02 LDD #AUXRSTREL |
0747 F4C6 FD E1 1E STD CF_AUX |
0748 F4C9 CC 00 E0 LDD #HEADLBA |
0749 F4CC FD E1 0C STD CF_HEAD |
0750 F4CF 16 02 D6 LBRA WTRDY |
0751 * |
0752 * RESTORE DISK DRIVER (SEEK TRACK 00) |
0753 * |
0754 F4D2 8D 66 RESTR1 BSR DRVSEL |
0755 F4D4 4F CLRA ; Track 0 |
0756 F4D5 C6 01 LDB #$01 ; Sector 1 |
0757 * |
0758 * Seek track and sector |
0759 * A holds track number (0 - ??) |
0760 * B holds sector number (1 - ??) |
0761 * Sector numbers starts from 1 |
0762 * subtract 1 to start from sector 0 on CF |
0763 * |
0764 F4D7 34 02 SEEKTS PSHS A |
0765 F4D9 4F CLRA |
0766 F4DA 5A DECB |
0767 F4DB FD E1 06 STD CF_SECNUM |
0768 F4DE E6 E4 LDB ,S |
0769 F4E0 FD E1 08 STD CF_CYLLO |
0770 F4E3 F6 01 00 LDB DRVNUM |
0771 F4E6 FD E1 0A STD CF_CYLHI |
0772 F4E9 C6 01 LDB #$01 |
0773 F4EB FD E1 04 STD CF_SECCNT |
0774 F4EE 5F CLRB |
0775 F4EF 35 82 PULS A,PC |
0776 * |
0777 * READ SECTORS FROM CF |
0778 * |
0779 * |
0780 F4F1 8D E4 READSC BSR SEEKTS |
0781 F4F3 CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE |
0782 F4F6 FD E1 0E STD CF_COMAND |
0783 F4F9 17 02 AC LBSR WTRDY |
0784 * |
0785 * READ LOOP |
0786 * |
0787 F4FC 34 20 PSHS Y |
0788 F4FE 10 8E 01 00 LDY #256 |
0789 F502 17 02 B2 RDLP1 LBSR WTDRQ |
0790 F505 FC E1 00 LDD CF_DATA |
0791 F508 E7 80 STB ,X+ |
0792 F50A 31 3F LEAY -1,Y |
0793 F50C 26 F4 BNE RDLP1 |
0794 F50E 35 20 PULS Y |
0795 * |
0796 F510 17 02 95 LBSR WTRDY |
0797 F513 5F CLRB |
0798 F514 39 RTS |
0799 * |
0800 * WRITE SECTOR TO CF |
0801 * |
0802 F515 8D C0 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR |
0803 F517 CC 00 30 LDD #CMDWRITE ; IDE WRITE MULTIPLE |
0804 F51A FD E1 0E STD CF_COMAND |
0805 F51D 17 02 88 LBSR WTRDY |
0806 * |
0807 * WRITE LOOP |
0808 * |
0809 F520 34 20 PSHS Y |
0810 F522 10 8E 01 00 LDY #256 |
0811 F526 4F CLRA |
0812 F527 17 02 8D WRTLP1 LBSR WTDRQ |
0813 F52A E6 80 LDB ,X+ |
0814 F52C FD E1 00 STD CF_DATA |
0815 F52F 31 3F LEAY -1,Y |
0816 F531 26 F4 BNE WRTLP1 |
0817 F533 35 20 PULS Y |
0818 * |
0819 F535 17 02 70 LBSR WTRDY |
0820 F538 5F CLRB |
0821 F539 39 RTS |
0822 * |
0823 * DRIVE SELECT DISK DRIVER |
0824 * |
0825 F53A A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB |
0826 F53C 81 03 CMPA #3 |
0827 F53E 23 01 BLS DRVS2 IF > 3, SET IT TO 0 |
0828 F540 4F CLRA |
0829 F541 B7 01 00 DRVS2 STA DRVNUM |
0830 F544 5F CLRB ; SET Z, CLEAR C |
0831 F545 39 RTS |
0832 * |
0833 * CHECK DRIVE READY DISK DRIVER |
0834 * |
0835 F546 A6 03 CHKDRV LDA 3,X |
0836 F548 5F CLRB ; CLEAR C, SET Z |
0837 F549 39 RTS |
0838 ******************************************************* |
0839 * |
0840 * Bootstrap FLEX Loader |
0841 * |
0842 * SBUG1.8 loads the bootstap loader at $C000 |
0843 * however the Flex adaption manual has the |
0844 * bootstrap loader residing at $C100 |
0845 * Bootstrap Loader is position independent code |
0846 * |
0847 ****************************************************** |
0848 * |
0849 * Equates |
0850 * |
0851 C0FF BSSTACK EQU $C0FF |
0852 C300 SCTBUF EQU $C300 |
0853 * |
0854 * Start of Utility |
0855 * |
0856 F700 ORG MONEXT+$0700 |
0857 F700 20 0B BOOT BRA BLOAD0 |
0858 F702 00 00 00 FCB 0,0,0 |
0859 F705 00 TRK FCB 0 File start track |
0860 F706 00 SCT FCB 0 File start sector |
0861 F707 00 DNS FCB 0 Density Flag (not used) |
0862 F708 C0 00 TADR FDB $C000 Transfer address |
0863 F70A 00 00 LADR FDB 0 Load Address |
0864 F70C 00 DRNUM FCB 0 Drive number 0 |
0865 * |
0866 F70D 10 CE C0 FF BLOAD0 LDS #BSSTACK Set up Bootstrap stack |
0867 F711 EC 8C F1 LDD TRK,PCR Set up start track and sector |
0868 F714 FD C3 00 STD SCTBUF |
0869 F717 10 8E C4 00 LDY #SCTBUF+256 |
0870 * |
0871 * Perform actual file load |
0872 * |
0873 F71B 8D 35 BLOAD1 BSR GETCH Get acharcater |
0874 F71D 81 02 CMPA #$02 Data record hearder ? |
0875 F71F 27 10 BEQ BLOAD2 Skip, is so |
0876 F721 81 16 CMPA #$16 Xfr address hearder ? |
0877 F723 26 F6 BNE BLOAD1 Loop if neither |
0878 * |
0879 * Get transfer address |
0880 * |
0881 F725 8D 2B BSR GETCH |
0882 F727 A7 8C DE STA TADR,PCR |
0883 F72A 8D 26 BSR GETCH |
0884 F72C A7 8C DA STA TADR+1,PCR |
0885 F72F 20 EA BRA BLOAD1 |
0886 * |
0887 * Load data record |
0888 * |
0889 F731 8D 1F BLOAD2 BSR GETCH Get load address |
0890 F733 A7 8C D4 STA LADR,PCR |
0891 F736 8D 1A BSR GETCH |
0892 F738 A7 8C D0 STA LADR+1,PCR |
0893 F73B 8D 15 BSR GETCH Get Bytes count |
0894 F73D 1F 89 TFR A,B |
0895 F73F 5D TSTB |
0896 F740 27 D9 BEQ BLOAD1 Loop if count = 0 |
0897 F742 AE 8C C5 LDX LADR,PCR Get load address |
0898 F745 34 14 BLOAD3 PSHS B,X |
0899 F747 8D 09 BSR GETCH Get data character |
0900 F749 35 14 PULS B,X |
0901 F74B A7 80 STA ,X+ Store at load address |
0902 F74D 5A DECB |
0903 F74E 26 F5 BNE BLOAD3 Loop until count = 0 |
0904 F750 20 C9 BRA BLOAD1 |
0905 * |
0906 * Get Character routine |
0907 * Reads a sector if needed |
0908 * |
0909 F752 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ? |
0910 F756 26 0F BNE GETCH4 Go read Character if not |
0911 F758 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer |
0912 F75B EC 84 LDD 0,X Get forward Link |
0913 F75D 27 0B BEQ GOFLEX if zero, file is loaded |
0914 F75F 8D 26 BSR READ Read next sector |
0915 F761 26 9D BNE BOOT start over if error |
0916 F763 10 8E C3 04 LDY #SCTBUF+4 Point past link |
0917 F767 A6 A0 GETCH4 LDA ,Y+ Else, get a character |
0918 F769 39 RTS |
0919 * |
0920 * File is loaded, Jump to it |
0921 * |
0922 F76A 6E 9C 9B GOFLEX JMP [TADR,PCR] Jump to transfer address |
0923 |
0924 * |
0925 ** FLEX 9 IDE DISK DRIVERS |
0926 * |
0927 * Seek track and sector |
0928 * A holds track number (0 - ??) |
0929 * B holds sector number (1 - ??) |
0930 * Sector numbers starts from 1 |
0931 * subtract 1 to start from sector 0 on CF |
0932 * |
0933 F76D 34 02 SEEK PSHS A |
0934 F76F 4F CLRA |
0935 F770 5A DECB |
0936 F771 FD E1 06 STD CF_SECNUM |
0937 F774 E6 E4 LDB ,S |
0938 F776 FD E1 08 STD CF_CYLLO |
0939 F779 E6 8C 90 LDB DRNUM,PCR |
0940 F77C FD E1 0A STD CF_CYLHI |
0941 F77F C6 01 LDB #$01 |
0942 F781 FD E1 04 STD CF_SECCNT |
0943 F784 5F CLRB |
0944 F785 35 82 PULS A,PC |
0945 * |
0946 * READ SECTORS FROM CF |
0947 * |
0948 * |
0949 F787 8D E4 READ BSR SEEK |
0950 F789 CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE |
0951 F78C FD E1 0E STD CF_COMAND |
0952 F78F 8D 17 BSR WTRDY |
0953 * |
0954 * READ LOOP |
0955 * |
0956 F791 34 20 PSHS Y |
0957 F793 10 8E 01 00 LDY #256 |
0958 F797 8D 1E READ1 BSR WTDRQ |
0959 F799 FC E1 00 LDD CF_DATA |
0960 F79C E7 80 STB ,X+ |
0961 F79E 31 3F LEAY -1,Y |
0962 F7A0 26 F5 BNE READ1 |
0963 F7A2 35 20 PULS Y |
0964 * |
0965 F7A4 8D 02 BSR WTRDY |
0966 F7A6 5F CLRB |
0967 F7A7 39 RTS |
0968 * |
0969 * WAIT UNTIL READY |
0970 * |
0971 F7A8 FC E1 0E WTRDY LDD CF_STATUS |
0972 F7AB C5 80 BITB #BUSY |
0973 F7AD 26 F9 BNE WTRDY |
0974 F7AF FC E1 0E LDD CF_STATUS |
0975 F7B2 C5 40 BITB #DRDY |
0976 F7B4 27 F2 BEQ WTRDY |
0977 F7B6 39 RTS |
0978 * |
0979 * WAIT FOR DATA REQUEST |
0980 * |
0981 F7B7 FC E1 0E WTDRQ LDD CF_STATUS |
0982 F7BA C5 08 BITB #DRQ |
0983 F7BC 27 F9 BEQ WTDRQ |
0984 F7BE 39 RTS |
0985 * |
0004 END |
0000 INCLUDE "sys09bug.txt" |
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR |
0002 OPT l |
|
|
sys09bug.txt page 3 |
0004 * |
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL |
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY.... |
0007 * |
0008 * ALLEN CLARK WALLACE WATSON |
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE. |
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617 |
0011 * PH. 813-977-0347 PH. 813-985-1359 |
0012 * |
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT |
0014 * 2561 NANTUCKET DR APT. E |
0015 * ATLANTA, GA 30345 |
0016 * PH. 404-320-1043 |
0017 * |
0018 * MODIFIED TO SYS09BUG VER 1.0 |
0019 * FOR: SYSTEM09 FPGA SYSTEM |
0020 * BY: JOHN KENT |
0021 * DATE: 21ST NOVEMBER 2006 |
0022 * REMOVED: DISK BOOTS |
0023 * MEMORY TEST |
0024 * ADDED: ADM3A VDU DRIVER |
0025 * |
0026 * MODIFIED TO SYS09BUG VER 1.1 |
0027 * FOR: SYSTEM09 FPGA SYSTEM |
0028 * BY: JOHN KENT |
0029 * DATE: 7TH JANUARY 2007 |
0030 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000 |
0031 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS |
0032 * AND REALTIME CLOCK |
0033 * |
0034 * MODIFIED TO SYS09BUG VER 1.2 |
0035 * FOR: SYSTEM09 FPGA SYSTEM |
0036 * BY: JOHN KENT |
0037 * DATE: 21ST MAY 2007 |
0038 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION |
0039 * REMOVED PORT REDIRECTION ON PUNCH & LOAD |
0040 * |
0041 * Modified to SYS09BUG VER 1.3 |
0042 * FOR: SYSTEM09 FPGA SYSTEM |
0043 * BY: JOHN KENT |
0044 * DATE: 8TH JAN 2008 |
0045 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD |
0046 * WITH ONLY 32K OF RAM |
0047 * |
0048 * Modified to SYS09BUG VER 1.4 |
0049 * FOR: SYSTEM09 FPGA SYSTEM |
0050 * BY: JOHN KENT |
0051 * DATE: 3RD FEB 2008 |
0052 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE |
0053 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300 |
0054 * 16 BIT IDE DISK BOOT STRAP ROUTINE |
0055 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES |
0056 * |
0057 * *** COMMANDS *** |
0058 * |
0059 * CONTROL A = ALTER THE "A" ACCUMULATOR |
0060 * CONTROL B = ALTER THE "B" ACCUMULATOR |
0061 * CONTROL C = ALTER THE CONDITION CODE REGISTER |
0062 * CONTROL D = ALTER THE DIRECT PAGE REGISTER |
0063 * CONTROL P = ALTER THE PROGRAM COUNTER |
0064 * CONTROL U = ALTER USER STACK POINTER |
0065 * CONTROL X = ALTER "X" INDEX REGISTER |
0066 * CONTROL Y = ALTER "Y" INDEX REGISTER |
0067 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh |
0068 * D = 5.25" MINIFLOPPY BOOT |
0069 * E ssss-eeee = EXAMINE MEMORY |
0070 * FROM STARTING ADDRESS ssss |
0071 * TO ENDING ADDRESS eeee. |
0072 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI |
0073 * L = LOAD TAPE |
0074 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh |
0075 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR. |
0076 * R = DISPLAY REGISTER CONTENTS |
0077 * S = DISPLAY STACK FROM ssss TO $DFC0 |
0078 * U = 8" DMAF2 FLOPPY BOOT |
0079 * U = USER EXTENSION COMMANDS AT $F000 |
0080 * X = REMOVE ALL BREAKPOINTS |
0081 * |
0082 * |
0083 *************************************************** |
0084 * SYS09BUG VARIABLE SPACE |
0085 *************************************************** |
0086 * |
0087 DFC0 ORG MONRAM |
0088 DFC0 STACK EQU * TOP OF INTERNAL STACK |
0089 DFC0 NMI RMB 2 USER NMI VECTOR |
0090 DFC2 SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3 |
0091 DFC4 SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2 |
0092 DFC6 FIRQ RMB 2 FAST INTERRUPT VECTOR |
0093 DFC8 IRQ RMB 2 INTERRUPT VECTOR |
0094 DFCA SWI RMB 2 SOFTWARE INTERRUPT VECTOR |
0095 DFCC SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN |
0096 DFCE SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT |
0097 IFD DATOPT |
0098 DFD0 LRARAM RMB 16 LRA ADDRESSES |
0099 ENDIF DATOPT |
0100 DFE0 CPORT RMB 2 RE-VECTORABLE CONTROL PORT |
0101 DFE2 ECHO RMB 1 ECHO FLAG |
0102 DFE3 BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR |
0103 IFD TRAOPT |
0104 NMISAV RMB 2 NMI Jump Vector Backup |
0105 TRACNT RMB 2 Trace Count |
0106 ENDIF TRAOPT |
0106 ENDIF TRAOPT |
0107 IFD VDUOPT |
0108 * |
0109 ************************************************** |
0110 * VDU8 DISPLAY DRIVER VARIABLES * |
0111 ************************************************** |
0112 * |
0113 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ****** |
0114 DFFB COLADX RMB 1 CURSOR COLUMN |
0115 DFFC ROWADX RMB 1 CURSOR ROW |
0116 ************************************************** |
0117 * |
0118 DFFD NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0119 DFFE ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0120 ENDIF VDUOPT |
0121 IFD DG640OPT |
0122 * |
0123 *************************************************** |
0124 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES * |
0125 *************************************************** |
0126 * |
0127 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER ***** |
0128 COLADX RMB 1 CURSOR COLUMN |
0129 ROWADX RMB 1 CURSOR ROW |
0130 ************************************************* |
0131 CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS |
0132 NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE |
0133 ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE |
0134 ENDIF DG640OPT |
0134 ENDIF DG640OPT |
0135 * |
0136 * |
0137 *************************************************** |
0138 * START OF ROM * |
0139 *************************************************** |
0140 * |
0141 F800 ORG MONROM |
0142 F800 F8 14 FDB MONITOR |
0143 F802 F8 61 FDB NEXTCMD |
0144 F804 FC A1 FDB INCH |
0145 F806 FC 9B FDB INCHE |
0146 F808 FC B9 FDB INCHEK |
0147 F80A FC CE FDB OUTCH |
0148 F80C FB 8F FDB PDATA |
0149 F80E FB 1E FDB PCRLF |
0150 F810 FB 1A FDB PSTRNG |
0151 F812 FA 2E FDB LRA |
0152 * |
0153 IFD ADSOPT |
0154 FDB PCHK CHECK FOR PRINTER INPUT |
0155 FDB PINIZ INITIATE PRINTER |
0156 FDB POUTCH OUTPUT CH. TO PRINTER |
0157 FDB VINIZ |
0158 FDB VOUTCH |
0159 FDB ACINIZ |
0160 FDB AOUTCH |
0161 ENDIF ADSOPT |
0161 ENDIF ADSOPT |
0162 * |
0163 * MONITOR |
0164 * |
0165 * VECTOR ADDRESS STRING IS..... |
0166 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF |
0167 * |
0168 F814 8E FE 74 MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING |
0169 F817 10 8E DF C0 LDY #STACK POINT TO RAM VECTOR LOCATION |
0170 F81B C6 10 LDB #$10 BYTES TO MOVE = 16 |
0171 F81D A6 80 LOOPA LDA ,X+ GET VECTOR BYTE |
0172 F81F A7 A0 STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF |
0173 F821 5A DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE |
0174 F822 26 F9 BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED |
0175 * |
0176 * CONTENTS FROM TO FUNCTION |
0177 * $F8A1 $FE40 $DFC0 USER-V |
0178 * $F8A1 $FE42 $DFC2 SWI3-V |
0179 * $F8A1 $FE44 $DFC4 SWI2-V |
0180 * $F8A1 $FE46 $DFC6 FIRQ-V |
0181 * $F8A1 $FE48 $DFC8 IRQ-V |
0182 * $FAB0 $FE4A $DFCA SWI-V |
0183 * $FFFF $FE4C $DFCC SVC-VO |
0184 * $FFFF $FE4E $DFCE SVC-VL |
0185 * |
0186 F824 8E E0 00 LDX #ACIAS |
0187 F827 BF DF E0 STX CPORT STORE ADDR. IN RAM |
0188 F82A 17 01 5B LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS |
0189 F82D C6 0C LDB #12 CLEAR 12 BYTES ON STACK |
0190 F82F 6F E2 CLRSTK CLR ,-S |
0191 F831 5A DECB |
0192 F832 26 FB BNE CLRSTK |
0193 F834 30 8C DD LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY |
0194 F837 AF 6A STX 10,S ON STACK |
0195 F839 86 D0 LDA #$D0 PRESET CONDITION CODES ON STACK |
0196 F83B A7 E4 STA ,S |
0197 F83D 1F 43 TFR S,U |
0198 F83F 17 04 9F LBSR IOINIZ INITIALIZE CONTROL PORT |
0199 F842 8E FE 84 LDX #MSG1 POINT TO MONITOR MESSAGE |
0200 F845 17 03 47 LBSR PDATA PRINT MSG |
0201 * |
0202 IFD DATOPT |
0203 F848 8E DF D0 LDX #LRARAM POINT TO LRA RAM STORAGE AREA |
0204 F84B 4F CLRA START TOTAL AT ZERO |
0205 F84C C6 0D LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY |
0206 F84E 6D 85 FNDREL TST B,X TEST FOR RAM AT NEXT LOC. |
0207 F850 27 03 BEQ RELPAS IF NO RAM GO TO NEXT LOC. |
0208 F852 8B 04 ADDA #4 ELSE ADD 4K TO TOTAL |
0209 F854 19 DAA ADJ. TOTAL FOR DECIMAL |
0210 F855 5A RELPAS DECB SUB. 1 FROM LOCS. TO TEST |
0211 F856 2A F6 BPL FNDREL PRINT TOTAL OF RAM |
0212 F858 17 04 0C LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0213 F85B 8E FE A3 LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS |
0214 F85E 17 03 2E LBSR PDATA PRINT MSG |
0215 ENDIF DATOPT |
0216 * |
0217 IFD TRAOPT |
0218 LBSR TRAINZ |
0219 ENDIF TRAOPT |
0219 ENDIF TRAOPT |
0220 * |
0221 ***** NEXTCMD ***** |
0222 * |
0223 F861 8E FE AA NEXTCMD LDX #MSG3 POINT TO MSG ">" |
0224 F864 17 02 B3 LBSR PSTRNG PRINT MSG |
0225 F867 17 04 37 LBSR INCH GET ONE CHAR. FROM TERMINAL |
0226 F86A 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
0227 F86C 81 0D CMPA #$0D IS IT CARRIAGE RETURN ? |
0228 F86E 27 F1 BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR. |
0229 F870 1F 89 TFR A,B PUT CHAR. IN "B" ACCUM. |
0230 F872 81 20 CMPA #$20 IS IT CONTROL OR DATA CHAR ? |
0231 F874 2C 09 BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT |
0232 F876 86 5E LDA #'^ ELSE CNTRL CHAR CMD SO... |
0233 F878 17 04 53 LBSR OUTCH PRINT "^" |
0234 F87B 1F 98 TFR B,A RECALL CNTRL CMD CHAR |
0235 F87D 8B 40 ADDA #$40 CONVERT IT TO ASCII LETTER |
0236 F87F 17 04 4C PRTCMD LBSR OUTCH PRNT CMD CHAR |
0237 F882 17 04 47 LBSR OUT1S PRNT SPACE |
0238 F885 C1 60 CMPB #$60 |
0239 F887 2F 02 BLE NXTCH0 |
0240 F889 C0 20 SUBB #$20 |
0241 * |
0242 ***** DO TABLE LOOKUP ***** |
0243 * FOR COMMAND FUNCTIONS |
0244 * |
0245 F88B 8E FE 3B NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE |
0246 F88E E1 80 NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ? |
0247 F890 27 0F BEQ JMPCMD BRANCH IF MATCH FOUND |
0248 F892 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE |
0249 F894 8C FE 74 CMPX #TABEND REACHED END OF TABLE YET ? |
0250 F897 26 F5 BNE NXTCHR IF NOT END, CHECK NEXT ENTRY |
0251 F899 8E FE AC LDX #MSG4 POINT TO MSG "WHAT?" |
0252 F89C 17 02 F0 LBSR PDATA PRINT MSG |
0253 F89F 20 C0 BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD |
0254 F8A1 AD 94 JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE |
0255 F8A3 20 BC BRA NEXTCMD PROMPT FOR NEW COMMAND |
0256 * |
0257 * "G" GO OR CONTINUE |
0258 * |
0259 F8A5 1F 34 GO TFR U,S |
0260 F8A7 3B RTI RTI |
0261 * |
0262 ***** "M" MEMORY EXAMINE AND CHANGE ***** |
0263 * |
0264 F8A8 17 03 6B MEMCHG LBSR IN1ADR INPUT ADDRESS |
0265 F8AB 29 2D BVS CHRTN IF NOT HEX, RETURN |
0266 F8AD 1F 12 TFR X,Y SAVE ADDR IN "Y" |
0267 F8AF 8E FE B2 MEMC2 LDX #MSG5 POINT TO MSG " - " |
0268 F8B2 17 02 65 LBSR PSTRNG PRINT MSG |
0269 F8B5 1F 21 TFR Y,X FETCH ADDRESS |
0270 F8B7 17 03 A5 LBSR OUT4H PRINT ADDR IN HEX |
0271 F8BA 17 04 0F LBSR OUT1S OUTPUT SPACE |
0272 F8BD A6 A4 LDA ,Y GET CONTENTS OF CURRENT ADDR. |
0273 F8BF 17 03 A5 LBSR OUT2H OUTPUT CONTENTS IN ASCII |
0274 F8C2 17 04 07 LBSR OUT1S OUTPUT SPACE |
0275 F8C5 17 03 5E LBSR BYTE LOOP WAITING FOR OPERATOR INPUT |
0276 F8C8 28 11 BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC. |
0277 F8CA 81 08 CMPA #8 IS IT A BACKSPACE (CNTRL H)? |
0278 F8CC 27 E1 BEQ MEMC2 PROMPT OPERATOR AGAIN |
0279 F8CE 81 18 CMPA #$18 IS IT A CANCEL (CNTRL X)? |
0280 F8D0 27 DD BEQ MEMC2 PROMPT OPERATOR AGAIN |
0281 F8D2 81 5E CMPA #'^ IS IT AN UP ARROW? |
0282 F8D4 27 17 BEQ BACK DISPLAY PREVIOUS BYTE |
0283 F8D6 81 0D CMPA #$D IS IT A CR? |
0284 F8D8 26 0F BNE FORWRD DISPLAY NEXT BYTE |
0285 F8DA 39 CHRTN RTS EXIT ROUTINE |
0286 * |
0287 * |
0288 F8DB A7 A4 CHANGE STA ,Y CHANGE BYTE IN MEMORY |
0289 F8DD A1 A4 CMPA ,Y DID MEMORY BYTE CHANGE? |
0290 F8DF 27 08 BEQ FORWRD $F972 |
0291 F8E1 17 03 E8 LBSR OUT1S OUTPUT SPACE |
0292 F8E4 86 3F LDA #'? LOAD QUESTION MARK |
0293 F8E6 17 03 E5 LBSR OUTCH PRINT IT |
0294 F8E9 31 21 FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION |
0295 F8EB 20 C2 BRA MEMC2 PRINT LOCATION & CONTENTS |
0296 F8ED 31 3F BACK LEAY -1,Y POINT TO LAST MEM LOCATION |
0297 F8EF 20 BE BRA MEMC2 PRINT LOCATION & CONTENTS |
0298 * |
0299 * "S" DISPLAY STACK |
0300 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM |
0301 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT. |
0302 * |
0303 F8F1 17 02 A2 DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER |
0304 F8F4 1F 32 TFR U,Y |
0305 F8F6 8E DF C0 LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT |
0306 F8F9 30 1F LEAX -1,X POINT TO CURRENT STACK |
0307 F8FB 20 05 BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS |
0308 * |
0309 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII |
0310 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG. |
0311 * UPPER ADDRESS IN X-REG. |
0312 * IF HEX ADDRESSES ARE INVALID (V)=1. |
0313 * |
0314 F8FD 17 03 0B MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES |
0315 F900 29 06 BVS EDPRTN NEW COMMAND IF ILLEGAL HEX |
0316 F902 34 20 MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS |
0317 F904 AC E1 CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS? |
0318 F906 24 01 BCC AJDUMP IF NOT, DUMP HEX AND ASCII |
0319 F908 39 EDPRTN RTS ; |
0320 * |
0321 * ADJUST LOWER AND UPPER ADDRESS LIMITS |
0322 * TO EVEN 16 BYTE BOUNDRIES. |
0323 * |
0324 * IF LOWER ADDR = $4532 |
0325 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530. |
0326 * |
0327 * IF UPPER ADDR = $4567 |
0328 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570. |
0329 * |
0330 * ENTER WITH LOWER ADDRESS IN X-REG. |
0331 * -UPPER ADDRESS ON TOP OF STACK. |
0332 * |
0333 F909 1F 10 AJDUMP TFR X,D GET UPPER ADDR IN D-REG |
0334 F90B C3 00 10 ADDD #$10 ADD 16 TO UPPER ADDRESS |
0335 F90E C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0336 F910 34 06 PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT |
0337 F912 1F 20 TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG |
0338 F914 C4 F0 ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY |
0339 F916 1F 01 TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT |
0340 F918 AC E4 NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT |
0341 F91A 27 05 BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP |
0342 F91C 17 03 9A LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD |
0343 F91F 27 03 BEQ EDUMP |
0344 F921 32 62 SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING |
0345 F923 39 RTS ; |
0346 * |
0347 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS |
0348 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS. |
0349 * |
0350 F924 34 10 EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK |
0351 F926 8E FE B2 LDX #MSG5 POINT TO MSG " - " |
0352 F929 17 01 EE LBSR PSTRNG PRINT MSG |
0353 F92C AE E4 LDX ,S LOAD LOWER ADDR FROM TOP OF STACK |
0354 F92E 17 03 2E LBSR OUT4H PRINT THE ADDRESS |
0355 F931 17 03 96 LBSR OUT2S 2 SPACES |
0356 F934 C6 10 LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP |
0357 F936 A6 80 ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT |
0358 F938 17 03 2C LBSR OUT2H OUTPUT HEX BYTE AS ASCII |
0359 F93B 17 03 8E LBSR OUT1S OUTPUT SPACE |
0360 F93E 5A DECB $F9D1 DECREMENT BYTE COUNT |
0361 F93F 26 F5 BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED |
0362 * |
0363 * PRINT 16 ASCII CHARACTERS |
0364 * IF NOT PRINTABLE OR NOT VALID |
0365 * ASCII PRINT A PERIOD (.) |
0366 F941 17 03 86 LBSR OUT2S 2 SPACES |
0367 F944 AE E1 LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK |
0368 F946 C6 10 LDB #$10 SET ASCII CHAR TO PRINT = 16 |
0369 F948 A6 80 EDPASC LDA ,X+ GET CHARACTER FROM MEMORY |
0370 F94A 81 20 CMPA #$20 IF LESS THAN $20, NON-PRINTABLE? |
0371 F94C 25 04 BCS PERIOD IF SO, PRINT PERIOD INSTEAD |
0372 F94E 81 7E CMPA #$7E IS IT VALID ASCII? |
0373 F950 23 02 BLS PRASC IF SO PRINT IT |
0374 F952 86 2E PERIOD LDA #'. LOAD A PERIOD (.) |
0375 F954 17 03 77 PRASC LBSR OUTCH PRINT ASCII CHARACTER |
0376 F957 5A DECB DECREMENT COUNT |
0377 F958 26 EE BNE EDPASC |
0378 F95A 20 BC BRA NXTLIN |
0379 * |
0380 ***** "B" SET BREAKPOINT ***** |
0381 * |
0382 F95C 17 02 B7 BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS |
0383 F95F 29 1E BVS EXITBP EXIT IF INVALID HEX ADDR. |
0384 F961 8C DF C0 CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0 |
0385 F964 24 1A BCC BPERR IF ERROR PRINT (?), EXIT |
0386 F966 34 10 PSHS X $FA82 PUSH BP ADDRESS ON STACK |
0387 F968 8E FF FF LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE |
0388 F96B 8D 55 BSR BPTEST TEST BP TABLE FOR FREE SPACE |
0389 F96D 35 10 PULS X POP BP ADDRESS FROM STACK |
0390 F96F 27 0F BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE |
0391 F971 A6 84 LDA ,X GET DATA AT BREAKPOINT ADDRESS |
0392 F973 81 3F CMPA #$3F IS IT A SWI? |
0393 F975 27 09 BEQ BPERR IF SWI ALREADY, INDICATE ERROR |
0394 F977 A7 A0 STA ,Y+ SAVE DATA BYTE IN BP TABLE |
0395 F979 AF A4 STX ,Y SAVE BP ADDRESS IN BP TABLE |
0396 F97B 86 3F LDA #$3F LOAD A SWI ($3F) |
0397 F97D A7 84 STA ,X SAVE SWI AT BREAKPOINT ADDRESS |
0398 F97F 39 EXITBP RTS ; |
0399 * |
0400 * INDICATE ERROR SETTING BREAKPOINT |
0401 * |
0402 F980 17 03 49 BPERR LBSR OUT1S OUTPUT SPACE |
0403 F983 86 3F LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR |
0404 F985 16 03 46 LBRA OUTCH PRINT "?" |
0405 * |
0406 *** "X" CLEAR OUTSTANDING BREAKPOINTS *** |
0407 * |
0408 F988 10 8E DF E3 XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE |
0409 F98C C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0410 F98E 8D 18 XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE |
0411 F990 5A DECB $FAAC DECREMENT BP COUNTER |
0412 F991 26 FB BNE XBPLP END OF BREAKPOINT TABLE? |
0413 F993 39 RTS |
0414 * |
0415 ***** SWI ENTRY POINT ***** |
0416 * |
0417 F994 1F 43 SWIE TFR S,U TRANSFER STACK TO USER POINTER |
0418 F996 AE 4A LDX 10,U LOAD PC FROM STACK INTO X-REG |
0419 F998 30 1F LEAX -1,X ADJUST ADDR DOWN 1 BYTE. |
0420 F99A 8D 26 BSR BPTEST FIND BREAKPOINT IN BP TABLE |
0421 F99C 27 04 BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR |
0422 F99E AF 4A STX 10,U SAVE BREAKPOINT ADDR IN STACK |
0423 F9A0 8D 06 BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA |
0424 F9A2 17 02 48 REGPR LBSR REGSTR GO PRINT REGISTERS |
0425 * |
0426 IFD TRAOPT |
0427 LDX #0 |
0428 STX TRACNT |
0429 ENDIF TRAOPT |
0429 ENDIF TRAOPT |
0430 * |
0431 F9A5 16 FE B9 LBRA NEXTCMD GET NEXT COMMAND |
0432 * |
0433 F9A8 AE 21 RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE |
0434 F9AA 8C DF C0 CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY |
0435 F9AD 24 0A BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S |
0436 F9AF A6 84 LDA ,X GET DATA FROM BP ADDRESS |
0437 F9B1 81 3F CMPA #$3F IS IT SWI? |
0438 F9B3 26 04 BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S |
0439 F9B5 A6 A4 LDA ,Y GET ORIGINAL DATA FROM BP TABLE |
0440 F9B7 A7 84 STA ,X $FAD3 RESTORE DATA AT BP ADDRESS |
0441 F9B9 86 FF FFSTBL LDA #$FF LOAD $FF IN A-ACC |
0442 F9BB A7 A0 STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S |
0443 F9BD A7 A0 STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S |
0444 F9BF A7 A0 STA ,Y+ |
0445 F9C1 39 RTS |
0446 * |
0447 ** SEARCH BREAKPOINT TABLE FOR MATCH ** |
0448 * |
0449 F9C2 10 8E DF E3 BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE |
0450 F9C6 C6 08 LDB #8 LOAD BREAKPOINT COUNTER |
0451 F9C8 A6 A0 FNDBP LDA ,Y+ LOAD DATA BYTE |
0452 F9CA AC A1 CMPX ,Y++ COMPARE ADDRESS, IS IT SAME? |
0453 F9CC 27 04 BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY |
0454 F9CE 5A DECB IF NOT, DECREMENT BREAKPOINT COUNTER |
0455 F9CF 26 F7 BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH |
0456 F9D1 39 RTS ; |
0457 * |
0458 * |
0459 F9D2 31 3D BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY |
0460 F9D4 39 RTS |
0461 * |
0462 IFD TRAOPT |
0463 * |
0464 ** TRACE from address AAAA BB bytes |
0465 * |
0466 TRACE LBSR ALTPC1 SET UP NEW PC |
0467 BVS TREXIT ADDRESS ERROR, EXIT |
0468 LBSR OUT1S |
0469 LBSR IN1ADR Fetch Byte Count |
0470 BVS TREXIT Byte Count error, EXIT |
0471 STX TRACNT |
0472 * |
0473 LDX NMI Save NMI Vector |
0474 STX NMISAV |
0475 LDX #NMIE Set up NMI for Tracing |
0476 STX NMI |
0477 LBSR TRAINZ Initialise Hardware |
0478 BRA TRACEG Start Trace |
0479 TREXIT RTS |
0480 * |
0481 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB |
0482 * CRA1 = 1 CA1 Rising edge IRQ |
0483 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register |
0484 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1 |
0485 * CRA4 = 1 ] CA2 = Set/Reset output |
0486 * CRA5 = 1 ] |
0487 * CRA6 = X CA2 Input Interrupt Flag |
0488 * CRA7 = X CA1 Interrupt Flag |
0489 * |
0490 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB |
0491 * CRB1 = 1 CB1 Rising edge IRQ |
0492 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register |
0493 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1 |
0494 * CRB4 = 1 ] CB2 = Set/Reset output |
0495 * CRB5 = 1 ] |
0496 * CRB6 = X CB2 Input Interrupt Flag |
0497 * CRB7 = X CB1 Interrupt Flag |
0498 * |
0499 * |
0500 ** TRACE NMI ENTRY POINT |
0501 * |
0502 NMIE TFR S,U |
0503 LDA #$36 Disable Interrupt, CA2 Low |
0504 STA TACTRL |
0505 LDA TADATA Clear Interrupt flag by reading data port |
0506 * |
0507 LBSR REGSTR DUMP REGISTERS |
0508 * |
0509 LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI |
0510 LDA ,X |
0511 CMPA #$3F |
0512 BEQ TRACEX EXIT ON SWI |
0513 * |
0514 LDX TRACNT CHECK IF TRACE COUNT EXPIRED |
0515 BEQ TRACEX YES, GO BACK TO THE MONITOR |
0516 LEAX -1,X DECREMENT TRACE COUNT |
0517 STX TRACNT |
0518 * |
0519 ** TRACE GO (RESUME SINGLE STEP) |
0520 * |
0521 TRACEG TFR U,S SET UP PROGRAM STACK POINTER |
0522 LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1) |
0523 STA TADATA |
0524 LDA #$36 LOAD STROBE LOW |
0525 STA TACTRL |
0526 LDA TADATA CLEAR INTERRUPT |
0527 LDA #$36 RELEASE RESET |
0528 STA TBCTRL |
0529 LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE |
0530 STA TACTRL |
0531 RTI GO EXECUTE INSTRUCTION |
0532 * |
0533 TRACEX LDX NMISAV Restore NMI vector |
0534 STX NMI |
0535 LBRA NEXTCMD Jump back to the command loop. |
0536 * |
0537 ** TRACE HARDWARE INITIALISATION |
0538 * |
0539 TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED |
0540 STA TACTRL |
0541 LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED |
0542 STA TBCTRL |
0543 LDA #$FF PORTA = OUTPUT |
0544 STA TADATA |
0545 LDA #$00 PORTB = INPUT |
0546 STA TBDATA |
0547 LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW |
0548 STA TACTRL |
0549 LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH |
0550 STA TBCTRL |
0551 RTS |
0552 * |
0553 ENDIF TRAOPT |
0553 ENDIF TRAOPT |
0554 IFD MFDCOPT |
0555 * |
0556 ** "U" MINI DISK BOOT |
0557 * |
0558 MINBOOT TST CMDFDC |
0559 CLR DRVFDC |
0560 LDX #$0000 |
0561 LOOP LEAX $01,X |
0562 CMPX #$0000 |
0563 BNE LOOP |
0564 LDA #$0F |
0565 STA CMDFDC |
0566 BSR DELAY |
0567 LOOP1 LDB CMDFDC |
0568 BITB #$01 |
0569 BNE LOOP1 |
0570 LDA #$01 |
0571 STA SECFDC |
0572 BSR DELAY |
0573 LDA #$8C |
0574 STA CMDFDC |
0575 BSR DELAY |
0576 LDX #$C000 |
0577 BRA LOOP3 |
0578 LOOP2 BITB #$02 |
0579 BEQ LOOP3 |
0580 LDA DATFDC |
0581 STA ,X+ |
0582 LOOP3 LDB CMDFDC |
0583 BITB #$01 |
0584 BNE LOOP2 |
0585 BITB #$2C |
0586 BEQ LOOP4 |
0587 RTS |
0588 * |
0589 LOOP4 LDX #$C000 |
0590 STX $0A,U |
0591 TFR U,S |
0592 RTI |
0593 * |
0594 DELAY LDB #$04 |
0595 LOOP5 DECB |
0596 BNE LOOP5 |
0597 RTS |
0598 ENDIF MFDCOPT |
0598 ENDIF MFDCOPT |
0599 * |
0600 IFD DMAFOPT |
0601 * |
0602 *** "D" DISK BOOT FOR DMAF2 *** |
0603 * |
0604 DBOOT LDA #$DE |
0605 STA DRVREG |
0606 LDA #$FF |
0607 STA PRIREG $FAF8 |
0608 STA CCREG |
0609 STA AAAREG |
0610 STA BBBREG |
0611 TST CCREG |
0612 LDA #$D8 |
0613 STA COMREG |
0614 LBSR DLY |
0615 DBOOT0 LDA COMREG |
0616 BMI DBOOT0 |
0617 LDA #$09 |
0618 STA COMREG |
0619 LBSR DLY |
0620 * |
0621 DISKWT LDA COMREG FETCH DRIVE STATUS |
0622 BITA #1 TEST BUSY BIT |
0623 BNE DISKWT LOOP UNTIL NOT BUSY |
0624 * |
0625 BITA #$10 |
0626 BNE DBOOT |
0627 * |
0628 LDX #$C000 LOGICAL ADDR. = $C000 |
0629 BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR. |
0630 ORA #$10 |
0631 STA CCCREG |
0632 TFR X,D |
0633 COMA ; |
0634 COMB ; |
0635 STD ADDREG |
0636 LDX #$FEFF LOAD DMA BYTE COUNT = $100 |
0637 STX CNTREG STORE IN COUNT REGISTER |
0638 LDA #$FF LOAD THE CHANNEL REGISTER |
0639 STA CCREG |
0640 LDA #$FE SET CHANNEL 0 |
0641 STA PRIREG |
0642 LDA #1 SET SECTOR TO "1" |
0643 STA SECREG ISSUE COMMAND |
0644 LDA #$8C SET SINGLE SECTOR READ |
0645 STA COMREG ISSUE COMMAND |
0646 BSR DLY |
0647 * |
0648 * THE FOLLOWING CODE TESTS THE STATUS OF THE |
0649 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT |
0650 * ZERO THEN IT WILL LOOP WAITING FOR "D7" |
0651 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT |
0652 * IS STILL A ONE THE BOOT OPERATION WILL |
0653 * BE STARTED OVER FROM THE BEGINING. |
0654 * |
0655 CLRB ; |
0656 DBOOT1 PSHS B $FB55 |
0657 CLRB ; |
0658 DBOOT2 TST CCREG |
0659 BPL DBOOT3 |
0660 DECB ; |
0661 BNE DBOOT2 |
0662 PULS B |
0663 DECB |
0664 BNE DBOOT1 |
0665 BRA DBOOT |
0666 DBOOT3 PULS B |
0667 LDA COMREG |
0668 BITA #$1C |
0669 BEQ DBOOT4 |
0670 RTS ; |
0671 * |
0672 * |
0673 DBOOT4 LDB #$DE |
0674 STB DRVREG |
0675 LDX #$C000 |
0676 STX 10,U |
0677 TFR U,S $FB7B |
0678 RTI ; |
0679 ENDIF DMAFOPT |
0679 ENDIF DMAFOPT |
0680 * |
0681 IFD CF8OPT |
0682 * |
0683 * COMPACT FLASH BOOT |
0684 * |
0685 CFBOOT BSR WAITRDY |
0686 LDA #HEADLBA |
0687 STA CF_HEAD |
0688 BSR WAITRDY |
0689 LDA #FEAT8BIT |
0690 STA CF_FEATURE |
0691 LDA #CMDFEATURE |
0692 STA CF_COMAND |
0693 BSR WAITRDY |
0694 * |
0695 * READ SECTORS FROM CF |
0696 * |
0697 CFREAD LDA #$01 |
0698 STA CF_SECCNT |
0699 CLRA |
0700 STA CF_SECNUM |
0701 STA CF_CYLLO |
0702 STA CF_CYLHI |
0703 * |
0704 LDA #CMDREAD ; IDE READ MULTIPLE |
0705 STA CF_COMAND |
0706 BSR WAITRDY |
0707 LDX #$C000 |
0708 * |
0709 * READ LOOP |
0710 * |
0711 RDLOOP BSR WAITDRQ |
0712 LDA CF_DATA |
0713 STA ,X+ |
0714 CMPX #$C200 |
0715 BNE RDLOOP |
0716 * |
0717 LDX #$C000 |
0718 STX $0A,U |
0719 TFR U,S |
0720 RTI |
0721 * |
0722 * WAIT UNTIL READY |
0723 * |
0724 WAITRDY LDA CF_STATUS |
0725 BITA #BUSY |
0726 BNE WAITRDY |
0727 LDA CF_STATUS |
0728 BITA #DRDY |
0729 BEQ WAITRDY |
0730 RTS |
0731 * |
0732 * WAIT FOR DATA REQUEST |
0733 * |
0734 WAITDRQ LDA CF_STATUS |
0735 BITA #DRQ |
0736 BEQ WAITDRQ |
0737 RTS |
0738 ENDIF CF8OPT |
0738 ENDIF CF8OPT |
0739 * |
0740 IFD IDEOPT |
0741 * |
0742 * XESS 16 BIT IDE BOOT |
0743 * |
0744 F9D5 CC 00 06 IDEBOOT LDD #AUXRESET |
0745 F9D8 FD E1 1E STD CF_AUX |
0746 F9DB CC 00 02 LDD #AUXRSTREL |
0747 F9DE FD E1 1E STD CF_AUX |
0748 F9E1 CC 00 E0 LDD #HEADLBA |
0749 F9E4 FD E1 0C STD CF_HEAD |
0750 F9E7 8D 2E BSR WAITRDY |
0751 * |
0752 * READ SECTORS FROM CF |
0753 * |
0754 F9E9 CC 00 01 LDD #$01 |
0755 F9EC FD E1 04 STD CF_SECCNT |
0756 F9EF 5F CLRB |
0757 F9F0 FD E1 06 STD CF_SECNUM |
0758 F9F3 FD E1 08 STD CF_CYLLO |
0759 F9F6 FD E1 0A STD CF_CYLHI |
0760 * |
0761 F9F9 C6 20 LDB #CMDREAD ; IDE READ MULTIPLE |
0762 F9FB FD E1 0E STD CF_COMAND |
0763 F9FE 8D 17 BSR WAITRDY |
0764 FA00 8E C0 00 LDX #$C000 |
0765 * |
0766 * READ LOOP |
0767 * |
0768 FA03 8D 21 RDLOOP BSR WAITDRQ |
0769 FA05 FC E1 00 LDD CF_DATA |
0770 FA08 E7 80 STB ,X+ |
0771 FA0A 8C C1 00 CMPX #$C100 |
0772 FA0D 26 F4 BNE RDLOOP |
0773 * |
0774 FA0F 8E C0 00 LDX #$C000 |
0775 FA12 AF 4A STX $0A,U |
0776 FA14 1F 34 TFR U,S |
0777 FA16 3B RTI |
0778 * |
0779 * WAIT UNTIL READY |
0780 * |
0781 FA17 FC E1 0E WAITRDY LDD CF_STATUS |
0782 FA1A C5 80 BITB #BUSY |
0783 FA1C 26 F9 BNE WAITRDY |
0784 FA1E FC E1 0E LDD CF_STATUS |
0785 FA21 C5 40 BITB #DRDY |
0786 FA23 27 F2 BEQ WAITRDY |
0787 FA25 39 RTS |
0788 * |
0789 * WAIT FOR DATA REQUEST |
0790 * |
0791 FA26 FC E1 0E WAITDRQ LDD CF_STATUS |
0792 FA29 C5 08 BITB #DRQ |
0793 FA2B 27 F9 BEQ WAITDRQ |
0794 FA2D 39 RTS |
0795 ENDIF IDEOPT |
0796 * |
0797 IFD RTCOPT |
0798 * |
0799 * CLOCK INTER FACE UTILITY |
0800 * |
0801 * TIME <Hours> <Minuits> <Seconds> |
0802 * If no argument is specified, the current time |
0803 * will be displayed. |
0804 * |
0805 * READ A REGISTER FROM THE COUNTER. |
0806 * The X Index rgister points to the register |
0807 * to be read. The Status Register is checked |
0808 * before and after the register is read before |
0809 * returning a value in accumulator A |
0810 * |
0811 RDCLK TST CLKSTA |
0812 BNE RDCLK |
0813 RDCLK1 LDA 0,X |
0814 TST CLKSTA |
0815 BNE RDCLK1 |
0816 RTS |
0817 * |
0818 * MAIN PROGRAM: |
0819 * |
0820 TIMSET LDX #COUNTR POINT TO TIMER |
0821 LBSR BYTE READ HOURS |
0822 BVS SHOWTM NO ARG, DISP TIME |
0823 STA HOUR,X |
0824 LBSR OUT1S |
0825 LBSR BYTE READ MINUITES |
0826 BVS SHOWTM |
0827 STA MINUIT,X |
0828 LBSR OUT1S |
0829 LBSR BYTE SECONDS. |
0830 BVS SHOWTM |
0831 STA SECOND,X |
0832 * |
0833 * DISPLAY CURRENT TIME |
0834 * |
0835 SHOWTM LBSR PCRLF |
0836 LDX #COUNTR+HOUR |
0837 LDB #3 |
0838 SHOWLP BSR RDCLK |
0839 LBSR OUT2H |
0840 LDA #': |
0841 LBSR OUTCH |
0842 LEAX -1,X |
0843 DECB |
0844 BNE SHOWLP |
0845 RTS |
0846 * |
0847 * INITIATE CLOCK. |
0848 * MASK INTERRUPTS. |
0849 * |
0850 CLKINZ CLR CINTCR MASK ALL INTERRUPTS |
0851 TST CINTSR CLEAR ANY INTERRUPTS |
0852 RTS |
0853 ENDIF RTCOPT |
0853 ENDIF RTCOPT |
0854 IFD DATOPT |
0855 * |
0856 ***** LRA LOAD REAL ADDRESS ***** |
0857 * |
0858 * THE FOLLOWING CODE LOADS THE 20-BIT |
0859 * PHYSICAL ADDRESS OF A MEMORY BYTE |
0860 * INTO THE "A" AND "X" REGISTERS. THIS |
0861 * ROUTINE IS ENTERED WITH THE LOGICAL |
0862 * ADDRESS OF A MEMORY BYTE IN THE "IX" |
0863 * REGISTER. EXIT IS MADE WITH THE HIGH- |
0864 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL |
0865 * ADDRESS IN THE "A" REGISTER, AND THE |
0866 * LOW-ORDER 16-BITS OF THE 20-BIT |
0867 * PHYSICAL ADDRESS IN THE "IX" REGISTER. |
0868 * ALL OTHER REGISTERS ARE PRESERVED. |
0869 * THIS ROUTINE IS REQUIRED SINCE THE |
0870 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST |
0871 * PRESENT PHYSICAL ADDRESSES ON THE |
0872 * SYSTEM BUS. |
0873 * |
0874 FA2E 34 36 LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK |
0875 FA30 A6 62 LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK |
0876 FA32 44 LSRA ; |
0877 FA33 44 LSRA ADJ FOR INDEXED INTO |
0878 FA34 44 LSRA CORRESPONDING LOCATION |
0879 FA35 44 LSRA IN LRA TABLE |
0880 FA36 10 8E DF D0 LDY #LRARAM LOAD LRA TABLE BASE ADDRESS |
0881 FA3A E6 A6 LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE |
0882 FA3C 54 LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED |
0883 FA3D 54 LSRB PHYSICAL ADDRESS. |
0884 FA3E 54 LSRB EXTENDED MS 4-BITS ARE RETURNED |
0885 FA3F 54 LSRB IN THE "A" ACCUMULATOR |
0886 FA40 E7 E4 STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK |
0887 FA42 E6 A6 LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE |
0888 FA44 53 COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG |
0889 FA45 58 ASLB ADJ DATA FOR RELOCATION IN X REG |
0890 FA46 58 ASLB ; |
0891 FA47 58 ASLB $FB97 |
0892 FA48 58 ASLB ; |
0893 FA49 A6 62 LDA 2,S GET MS BYTE OF LOGICAL ADDR. |
0894 FA4B 84 0F ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS |
0895 FA4D A7 62 STA 2,S SAVE IT IN X REG ON STACK |
0896 FA4F EA 62 ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR. |
0897 * |
0898 * PLUS LS NIBBLE OF LOGICAL ADDRESS |
0899 FA51 E7 62 STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG |
0900 * ON STACK |
0901 FA53 35 B6 PULS A,B,X,Y,PC POP REGS. FROM STACK |
0902 ENDIF DATOPT |
0903 * |
0904 * DELAY LOOP |
0905 * |
0906 FA55 34 04 DLY PSHS B SAVE CONTENTS OF "B" |
0907 FA57 C6 20 LDB #$20 GET LOOP DELAY VALUE |
0908 FA59 5A SUB1 DECB SUBTRACT ONE FROM VALUE |
0909 FA5A 26 FD BNE SUB1 LOOP UNTIL ZERO |
0910 FA5C 35 84 PULS B,PC RESTORE CONTENTS OF "B" |
0911 * RTS ; |
0912 * |
0913 ***** "L" LOAD MIKBUG TAPE ***** |
0914 * |
0915 FA5E BD FC E3 LOAD JSR ACINIZ |
0916 FA61 86 11 LDA #$11 LOAD 'DC1' CASS. READ ON CODE |
0917 FA63 17 02 68 LBSR OUTCH OUTPUT IT TO TERMINAL PORT |
0918 FA66 7F DF E2 CLR ECHO TURN OFF ECHO FLAG |
0919 FA69 17 02 2A LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO |
0920 FA6C 81 53 LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ? |
0921 FA6E 26 F9 BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR. |
0922 FA70 17 02 23 LBSR ECHON |
0923 FA73 81 39 CMPA #'9 IS IT A "9" , END OF FILE CHAR ? |
0924 FA75 27 3D BEQ LOAD21 IF SO, EXIT LOAD |
0925 FA77 81 31 CMPA #'1 IS IT A "1" , FILE LOAD CHAR ? |
0926 FA79 26 F1 BNE LOAD2 IF NOT, LOOK FOR START CHAR. |
0927 FA7B 17 01 A8 LBSR BYTE INPUT BYTE COUNT |
0928 FA7E 34 02 PSHS A PUSH COUNT ON STACK |
0929 FA80 29 26 BVS LODERR (V) C-CODE SET, ILLEGAL HEX |
0930 FA82 17 01 91 LBSR IN1ADR INPUT LOAD ADDRESS |
0931 FA85 29 21 BVS LODERR (V) C-CODE SET, ADDR NOT HEX |
0932 FA87 34 10 PSHS X PUSH ADDR ON STACK |
0933 FA89 E6 E0 LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE |
0934 FA8B EB E0 ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM |
0935 FA8D EB E4 ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM |
0936 FA8F 6A E4 DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS |
0937 FA91 6A E4 DEC ,S ADDRESS BYTES. |
0938 FA93 34 04 LOAD10 PSHS B PUSH CHECKSUM ON STACK |
0939 FA95 17 01 8E LBSR BYTE INPUT DATA BYTE (2 HEX CHAR) |
0940 FA98 35 04 PULS B POP CHECKSUM FROM STACK |
0941 FA9A 29 0C BVS LODERR (V) SET, DATA BYTE NOT HEX |
0942 FA9C 34 02 PSHS A PUSH DATA BYTE ON STACK |
0943 FA9E EB E0 ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK |
0944 FAA0 6A E4 DEC ,S DECREMENT BYTE COUNT 1 |
0945 FAA2 27 05 BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM |
0946 FAA4 A7 80 STA ,X+ SAVE DATA BYTE IN MEMORY |
0947 FAA6 20 EB BRA LOAD10 GET NEXT DATA BYTE |
0948 FAA8 5F LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ; |
0949 FAA9 35 02 LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT) |
0950 FAAB C1 FF CMPB #$FF CHECKSUM OK? |
0951 FAAD 27 BA BEQ LOAD1 IF SO, LOAD NEXT LINE |
0952 FAAF 86 3F LDA #'? LOAD (?) ERROR INDICATOR |
0953 FAB1 17 02 1A LBSR OUTCH OUTPUT IT TO TERMINAL |
0954 FAB4 73 DF E2 LOAD21 COM ECHO TURN ECHO ON |
0955 FAB7 86 13 LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE |
0956 FAB9 16 02 12 LBRA OUTCH OUTPUT IT |
0957 * |
0958 ***** "P" PUNCH MIKBUG TAPE ***** |
0959 * |
0960 FABC 6F E2 PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK |
0961 FABE 17 01 4A LBSR IN2ADR GET BEGIN AND END ADDRESS |
0962 FAC1 34 30 PSHS X,Y SAVE ADDRESSES ON STACK |
0963 FAC3 29 4D BVS PUNEXT (V) C-CODE SET, EXIT PUNCH |
0964 FAC5 AC 62 CMPX 2,S COMPARE BEGIN TO END ADDR |
0965 FAC7 25 49 BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH |
0966 FAC9 30 01 LEAX 1,X INCREMENT END ADDRESS |
0967 FACB AF E4 STX ,S STORE END ADDR ON STACK |
0968 FACD BD FC E3 JSR ACINIZ |
0969 FAD0 86 12 LDA #$12 LOAD 'DC2' PUNCH ON CODE |
0970 FAD2 17 01 F9 LBSR OUTCH OUTPUT IT TO TERMINAL |
0971 FAD5 EC E4 PUNCH2 LDD ,S LOAD END ADDR IN D-ACC |
0972 FAD7 A3 62 SUBD 2,S SUBTRACT BEGIN FROM END |
0973 FAD9 27 06 BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT |
0974 FADB 10 83 00 20 CMPD #$20 LESS THAN 32 BYTES? |
0975 FADF 23 02 BLS PUNCH4 PUNCH THAT MANY BYTES |
0976 FAE1 C6 20 PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32. |
0977 FAE3 E7 64 PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT |
0978 FAE5 8E FE F3 LDX #MSG20 POINT TO MSG "S1" |
0979 FAE8 17 00 2F LBSR PSTRNG PRINT MSG |
0980 FAEB CB 03 ADDB #3 ADD 3 BYTES TO BYTE COUNT |
0981 FAED 1F 98 TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH |
0982 FAEF 17 01 75 LBSR OUT2H OUTPUT BYTE COUNT |
0983 FAF2 AE 62 LDX 2,S LOAD BEGIN ADDRESS |
0984 FAF4 17 01 68 LBSR OUT4H PUNCH ADDRESS |
0985 FAF7 EB 62 ADDB 2,S ADD ADDR MSB TO CHECKSUM |
0986 FAF9 EB 63 ADDB 3,S ADD ADDR LSB TO CHECKSUM |
0987 FAFB EB 84 PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM |
0988 FAFD A6 80 LDA ,X+ LOAD DATA BYTE TO PUNCH |
0989 FAFF 17 01 65 LBSR OUT2H OUTPUT DATA BYTE |
0990 FB02 6A 64 DEC 4,S DECREMENT BYTE COUNT |
0991 FB04 26 F5 BNE PUNCHL NOT DONE, PUNCH NEXT BYTE |
0992 FB06 53 COMB 1's COMPLIMENT CHECKSUM BYTE |
0993 FB07 1F 98 TFR B,A GET IT IN A-ACC TO PUNCH |
0994 FB09 17 01 5B LBSR OUT2H OUTPUT CHECKSUM BYTE |
0995 FB0C AF 62 STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR |
0996 FB0E AC E4 CMPX ,S COMPARE IT TO END ADDR |
0997 FB10 26 C3 BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT. |
0998 FB12 86 14 PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE |
0999 FB14 17 01 B7 LBSR OUTCH OUTPUT IT |
1000 FB17 32 65 LEAS 5,S READJUST STACK POINTER |
1001 FB19 39 RTS ; |
1002 * |
1003 * PRINT STRING PRECEEDED BY A CR & LF. |
1004 * |
1005 FB1A 8D 02 PSTRNG BSR PCRLF PRINT CR/LF |
1006 FB1C 20 71 BRA PDATA PRINT STRING POINTED TO BY IX |
1007 * |
1008 * PCRLF |
1009 * |
1010 FB1E 34 10 PCRLF PSHS X SAVE IX |
1011 FB20 8E FE A4 LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS |
1012 FB23 17 00 69 LBSR PDATA PRINT MSG |
1013 FB26 35 90 PULS X,PC RESTORE IX & RETURN |
1014 * |
1015 * LONG BRANCHES TO COMMON ROUTINES |
1016 * |
1017 FB28 16 01 A1 JOUT1S LBRA OUT1S |
1018 FB2B 16 00 F8 JBYTE LBRA BYTE |
1019 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR |
1020 * |
1021 * ALTER "PC" PROGRAM COUNTER |
1022 * |
1023 FB31 17 00 91 ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = " |
1024 FB34 8D F2 ALTPC1 BSR JOUT1S OUTPUT SPACE |
1025 FB36 8D F6 BSR JIN1ADR GET NEW CONTENTS FOR "PC" |
1026 FB38 29 02 BVS ALTPCD EXIT IF INVALID HEX |
1027 FB3A AF 4A STX 10,U POKE IN NEW CONTENTS |
1028 FB3C 39 ALTPCD RTS ; |
1029 * |
1030 * ALTER "U" USER STACK POINTER |
1031 * |
1032 FB3D 8D 61 ALTRU BSR PRTUS $FCCA PRINT MSG " US = " |
1033 FB3F 8D E7 BSR JOUT1S OUTPUT SPACE |
1034 FB41 8D EB BSR JIN1ADR |
1035 FB43 29 02 BVS ALTUD |
1036 FB45 AF 48 STX 8,U |
1037 FB47 39 ALTUD RTS ; |
1038 * |
1039 * ALTER "Y" INDEX REGISTER |
1040 * |
1041 FB48 8D 72 ALTRY BSR PRTIY PRINT MSG " IY = " |
1042 FB4A 8D DC BSR JOUT1S OUTPUT SPACE |
1043 FB4C 8D E0 BSR JIN1ADR |
1044 FB4E 29 02 BVS ALTYD |
1045 FB50 AF 46 STX 6,U $F8F0 |
1046 FB52 39 ALTYD RTS ; |
1047 * |
1048 * ALTER "X" INDEX REGISTER |
1049 * |
1050 FB53 8D 5E ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = " |
1051 FB55 8D D1 BSR JOUT1S OUTPUT SPACE |
1052 FB57 8D D5 BSR JIN1ADR |
1053 FB59 29 02 BVS ALTXD |
1054 FB5B AF 44 STX 4,U |
1055 FB5D 39 ALTXD RTS ; |
1056 * |
1057 * ALTER "DP" DIRECT PAGE REGISTER |
1058 * |
1059 FB5E 8D 49 ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = " |
1060 FB60 8D C6 BSR JOUT1S OUTPUT SPACE |
1061 FB62 8D C7 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1062 FB64 29 02 BVS ALTDPD |
1063 FB66 A7 43 STA 3,U |
1064 FB68 39 ALTDPD RTS ; |
1065 * |
1066 * ALTER "B" ACCUMULATOR |
1067 * |
1068 FB69 8D 6C ALTRB BSR PRTB $FD09 PRINT MSG " B = " |
1069 FB6B 8D BB BSR JOUT1S OUTPUT SPACE |
1070 FB6D 8D BC BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1071 FB6F 29 02 BVS ALTBD |
1072 FB71 A7 42 STA 2,U |
1073 FB73 39 ALTBD RTS $F91C |
1074 * |
1075 * ALTER "A" ACCUMULATOR |
1076 * |
1077 FB74 8D 58 ALTRA BSR PRTA $FCFF RINT MSG " A = " |
1078 FB76 8D B0 BSR JOUT1S OUTPUT SPACE |
1079 FB78 8D B1 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1080 FB7A 29 02 BVS ALTAD |
1081 FB7C A7 41 STA 1,U |
1082 FB7E 39 ALTAD RTS ; |
1083 * |
1084 * ALTER "CC" REGISTER |
1085 * |
1086 FB7F 8D 5F ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: " |
1087 FB81 8D A5 BSR JOUT1S OUTPUT SPACE |
1088 FB83 8D A6 BSR JBYTE INPUT BYTE (2 HEX CHAR) |
1089 FB85 29 04 BVS ALTCCD |
1090 FB87 8A 80 ORA #$80 SETS "E" FLAG IN PRINT LIST |
1091 FB89 A7 C4 STA ,U |
1092 FB8B 39 ALTCCD RTS ; |
1093 * |
1094 * PDATA |
1095 * |
1096 FB8C 17 01 3F PRINT LBSR OUTCH |
1097 FB8F A6 80 PDATA LDA ,X+ GET 1st CHAR. TO PRINT |
1098 FB91 81 04 CMPA #4 IS IT EOT? |
1099 FB93 26 F7 BNE PRINT IF NOT EOT PRINT IT |
1100 FB95 39 RTS ; |
1101 * |
1102 * PRINT REGISTERS |
1103 * |
1104 FB96 8E FE B6 PRTSP LDX #MSG10 POINT TO MSG "SP=" |
1105 FB99 8D F4 BSR PDATA PRINT MSG |
1106 FB9B 1F 31 TFR U,X |
1107 FB9D 16 00 BF JOUT4H LBRA OUT4H |
1108 * |
1109 FBA0 8E FE C2 PRTUS LDX #MSG12 POINT TO MSG "US=" |
1110 FBA3 8D EA BSR PDATA PRINT MSG |
1111 FBA5 AE 48 LDX 8,U |
1112 FBA7 20 F4 BRA JOUT4H |
1113 * |
1114 FBA9 8E FE D4 PRTDP LDX #MSG15 POINT TO MSG "DP=" |
1115 FBAC 8D E1 BSR PDATA PRINT MSG |
1116 FBAE A6 43 LDA 3,U |
1117 FBB0 16 00 B4 JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII |
1118 * |
1119 FBB3 8E FE CE PRTIX LDX #MSG14 POINT TO MSG "IX=" |
1120 FBB6 8D D7 BSR PDATA PRINT MSG |
1121 FBB8 AE 44 LDX 4,U $FCE6 |
1122 FBBA 20 E1 BRA JOUT4H |
1123 * |
1124 FBBC 8E FE C8 PRTIY LDX #MSG13 POINT TO MSG "IY=" |
1125 FBBF 8D CE BSR PDATA PRINT MSG |
1126 FBC1 AE 46 LDX 6,U |
1127 FBC3 20 D8 BRA JOUT4H |
1128 * |
1129 FBC5 8E FE BC PRTPC LDX #MSG11 POINT TO MSG "PC=" |
1130 FBC8 8D C5 BSR PDATA PRINT MSG |
1131 FBCA AE 4A LDX 10,U |
1132 FBCC 20 CF BRA JOUT4H |
1133 * |
1134 FBCE 8E FE DA PRTA LDX #MSG16 POINT TO MSG "A=" |
1135 FBD1 8D BC BSR PDATA PRINT MSG |
1136 FBD3 A6 41 LDA 1,U |
1137 FBD5 20 D9 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1138 * |
1139 FBD7 8E FE DF PRTB LDX #MSG17 POINT TO MSG "B=" |
1140 FBDA 8D B3 BSR PDATA PRINT MSG |
1141 FBDC A6 42 LDA 2,U |
1142 FBDE 20 D0 BRA JOUT2H OUTPUT HEX BYTE AS ASCII |
1143 * |
1144 FBE0 8E FE E4 PRTCC LDX #MSG18 POINT TO MSG "CC:" |
1145 FBE3 8D AA BSR PDATA PRINT MSG |
1146 FBE5 A6 C4 LDA ,U |
1147 FBE7 8E FE EB LDX #MSG19 POINT TO MSG "EFHINZVC" |
1148 FBEA 16 00 90 LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT |
1149 * |
1150 * "R" DISPLAY REGISTERS |
1151 * |
1152 FBED 8E FE B2 REGSTR LDX #MSG5 POINT TO MSG " - " |
1153 FBF0 17 FF 27 LBSR PSTRNG PRINT MSG |
1154 FBF3 8D A1 BSR PRTSP $FCBF |
1155 FBF5 8D A9 BSR PRTUS $FCCA |
1156 FBF7 8D B0 BSR PRTDP $FCD5 |
1157 FBF9 8D B8 BSR PRTIX $FCE0 |
1158 FBFB 8D BF BSR PRTIY $FCEB |
1159 FBFD 8E FE B2 LDX #MSG5 POINT TO MSG " - " |
1160 FC00 17 FF 17 LBSR PSTRNG PRINT MSG |
1161 FC03 8D C0 BSR PRTPC $FCF5 |
1162 FC05 8D C7 BSR PRTA $FCFF |
1163 FC07 8D CE BSR PRTB $FD09 |
1164 FC09 20 D5 BRA PRTCC $FD13 |
1165 * |
1166 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1167 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES. |
1168 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY". |
1169 * THE SECOND IS RETURNED IN "IX". THE "V" BIT |
1170 * IN THE C-CODE REG. IS SET IF AN INVALID HEX |
1171 * ADDRESS IS INPUT. |
1172 * |
1173 FC0B 8D 09 IN2ADR BSR IN1ADR GET FIRST ADDRESS |
1174 FC0D 29 4D BVS NOTHEX EXIT IF NOT VALID HEX |
1175 FC0F 1F 12 TFR X,Y SAVE FIRST ADDR. IN "IY" |
1176 FC11 86 2D LDA #'- |
1177 FC13 17 00 B8 LBSR OUTCH PRINT " - " |
1178 * |
1179 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE |
1180 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE |
1181 * ADDRESS IS RETURNED IN THE "X" REGISTER. |
1182 * |
1183 FC16 8D 0E IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR) |
1184 FC18 29 42 BVS NOTHEX EXIT IF NOT VALID HEX |
1185 FC1A 1F 01 TFR D,X |
1186 FC1C 8D 08 BSR BYTE INPUT BYTE (2 HEX CHAR) |
1187 FC1E 29 3C BVS NOTHEX |
1188 FC20 34 10 PSHS X |
1189 FC22 A7 61 STA 1,S |
1190 FC24 35 90 PULS X,PC |
1191 * |
1192 ***** INPUT BYTE (2 HEX CHAR.) ***** |
1193 * |
1194 FC26 8D 11 BYTE BSR INHEX GET HEX LEFT |
1195 FC28 29 32 BVS NOTHEX EXIT IF NOT VALID HEX |
1196 FC2A 48 ASLA ; |
1197 FC2B 48 ASLA ; |
1198 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE |
1199 FC2D 48 ASLA ; |
1200 FC2E 1F 89 TFR A,B PUT HEXL IN "B" |
1201 FC30 8D 07 BSR INHEX GET HEX RIGHT |
1202 FC32 29 28 BVS NOTHEX EXIT IF NOT VALID HEX |
1203 FC34 34 04 PSHS B PUSH HEXL ON STACK |
1204 FC36 AB E0 ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK |
1205 FC38 39 RTS RETURN WITH HEX L&R IN "A" |
1206 * |
1207 * |
1208 FC39 8D 5B INHEX BSR ECHON INPUT ASCII CHAR. |
1209 FC3B 81 30 CMPA #'0 IS IT > OR = "0" ? |
1210 FC3D 25 1D BCS NOTHEX IF LESS IT AIN'T HEX |
1211 FC3F 81 39 CMPA #'9 IS IT < OR = "9" ? |
1212 FC41 22 03 BHI INHEXA IF > MAYBE IT'S ALPHA |
1213 FC43 80 30 SUBA #$30 ASCII ADJ. NUMERIC |
1214 FC45 39 RTS ; |
1215 * |
1216 * |
1217 FC46 81 41 INHEXA CMPA #'A IS IT > OR = "A" |
1218 FC48 25 12 BCS NOTHEX IF LESS IT AIN'T HEX |
1219 FC4A 81 46 CMPA #'F IS IT < OR = "F" ? |
1220 FC4C 22 03 BHI INHEXL IF > IT AIN'T HEX |
1221 FC4E 80 37 SUBA #$37 ASCII ADJ. ALPHA |
1222 FC50 39 RTS ; |
1223 * |
1224 FC51 81 61 INHEXL CMPA #'a IS IT > OR = "a" |
1225 FC53 25 07 BCS NOTHEX IF LESS IT AIN'T HEX |
1226 FC55 81 66 CMPA #'f IS IT < "f" |
1227 FC57 22 03 BHI NOTHEX IF > IT AIN'T HEX |
1228 FC59 80 57 SUBA #$57 ADJUST TO LOWER CASE |
1229 FC5B 39 RTS ; |
1230 * |
1231 * |
1232 FC5C 1A 02 NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER |
1233 FC5E 39 RTS ; |
1234 * |
1235 * |
1236 FC5F 34 10 OUT4H PSHS X PUSH X-REG. ON THE STACK |
1237 FC61 35 02 PULS A POP MS BYTE OF X-REG INTO A-ACC. |
1238 FC63 8D 02 BSR OUTHL OUTPUT HEX LEFT |
1239 FC65 35 02 PULS A POP LS BYTE OF X-REG INTO A-ACC. |
1240 FC67 OUTHL EQU * |
1241 FC67 34 02 OUT2H PSHS A SAVE IT BACK ON STACK |
1242 FC69 44 LSRA CONVERT UPPER HEX NIBBLE TO ASCII |
1243 FC6A 44 LSRA ; |
1244 FC6B 44 LSRA ; |
1245 FC6C 44 LSRA ; |
1246 FC6D 8D 04 BSR XASCII PRINT HEX NIBBLE AS ASCII |
1247 FC6F 35 02 OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII |
1248 FC71 84 0F ANDA #$0F STRIP LEFT NIBBLE |
1249 FC73 8B 30 XASCII ADDA #$30 ASCII ADJ |
1250 FC75 81 39 CMPA #$39 IS IT < OR = "9" ? |
1251 FC77 2F 02 BLE OUTC IF LESS, OUTPUT IT |
1252 FC79 8B 07 ADDA #7 IF > MAKE ASCII LETTER |
1253 FC7B 20 51 OUTC BRA OUTCH OUTPUT CHAR |
1254 * |
1255 * BINARY / ASCII --- THIS ROUTINE |
1256 * OUTPUTS A BYTE IN ENHANCED |
1257 * BINARY FORMAT. THE ENHANCEMENT |
1258 * IS DONE BY SUBSTITUTING ASCII |
1259 * LETTERS FOR THE ONES IN THE BYTE. |
1260 * THE ASCII ENHANCEMENT LETTERS |
1261 * ARE OBTAINED FROM THE STRING |
1262 * POINTED TO BY THE INDEX REG. "X". |
1263 * |
1264 FC7D 34 02 BIASCI PSHS A SAVE "A" ON STACK |
1265 FC7F C6 08 LDB #8 PRESET LOOP# TO BITS PER BYTE |
1266 FC81 A6 80 OUTBA LDA ,X+ GET LETTER FROM STRING |
1267 FC83 68 E4 ASL ,S TEST BYTE FOR "1" IN B7 |
1268 FC85 25 02 BCS PRTBA IF ONE PRINT LETTER |
1269 FC87 86 2D LDA #'- IF ZERO PRINT "-" |
1270 FC89 8D 43 PRTBA BSR OUTCH PRINT IT |
1271 FC8B 8D 3F BSR OUT1S PRINT SPACE |
1272 FC8D 5A DECB SUB 1 FROM #BITS YET TO PRINT |
1273 FC8E 26 F1 BNE OUTBA |
1274 FC90 35 82 PULS A,PC |
1275 * |
1276 IFD EXTOPT |
1277 * |
1278 * EXTENDED USER COMMANDS |
1279 * |
1280 FC92 6E 9F F0 00 USRCMD JMP [MONEXT+EXTCMD] |
1281 ENDIF EXTOPT |
1282 * |
1283 * |
1284 FC96 7D DF E2 ECHON TST ECHO IS ECHO REQUIRED ? |
1285 FC99 27 06 BEQ INCH ECHO NOT REQ. IF CLEAR |
1286 * |
1287 * INCHE |
1288 * |
1289 * ---GETS CHARACTER FROM TERMINAL AND |
1290 * ECHOS SAME. THE CHARACTER IS RETURNED |
1291 * IN THE "A" ACCUMULATOR WITH THE PARITY |
1292 * BIT MASKED OFF. ALL OTHER REGISTERS |
1293 * ARE PRESERVED. |
1294 * |
1295 FC9B 8D 04 INCHE BSR INCH GET CHAR FROM TERMINAL |
1296 FC9D 84 7F ANDA #$7F STRIP PARITY FROM CHAR. |
1297 FC9F 20 2D BRA OUTCH ECHO CHAR TO TERMINAL |
1298 * |
1299 * INCH |
1300 * |
1301 * GET CHARACTER FROM TERMINAL. RETURN |
1302 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE |
1303 * ALL OTHER REGISTERS. THE INPUT CHARACTER |
1304 * IS 8 BITS AND IS NOT ECHOED. |
1305 * |
1306 * |
1307 FCA1 34 10 INCH PSHS X SAVE IX |
1308 FCA3 BE DF E0 GETSTA LDX CPORT POINT TO TERMINAL PORT |
1309 FCA6 A6 84 LDA ,X FETCH PORT STATUS |
1310 FCA8 85 01 BITA #1 TEST READY BIT, RDRF ? |
1311 IFD PS2OPT |
1312 FCAA 26 09 BNE GETST1 |
1313 FCAC 8E E0 20 LDX #PS2KBD |
1314 FCAF A6 84 LDA ,X |
1315 FCB1 85 01 BITA #1 |
1316 ENDIF PS2OPT |
1317 FCB3 27 EE BEQ GETSTA IF NOT RDY, THEN TRY AGAIN |
1318 FCB5 A6 01 GETST1 LDA 1,X FETCH CHAR |
1319 FCB7 35 90 PULS X,PC RESTORE IX |
1320 * |
1321 * INCHEK |
1322 * |
1323 * CHECK FOR A CHARACTER AVAILABLE FROM |
1324 * THE TERMINAL. THE SERIAL PORT IS CHECKED |
1325 * FOR READ READY. ALL REGISTERS ARE |
1326 * PRESERVED, AND THE "Z" BIT WILL BE |
1327 * CLEAR IF A CHARACTER CAN BE READ. |
1328 * |
1329 * |
1330 FCB9 34 02 INCHEK PSHS A SAVE A ACCUM. |
1331 FCBB A6 9F DF E0 LDA [CPORT] FETCH PORT STATUS |
1332 FCBF 85 01 BITA #1 TEST READY BIT, RDRF ? |
1333 IFD PS2OPT |
1334 FCC1 26 05 BNE INCHEK1 |
1335 FCC3 B6 E0 20 LDA PS2KBD |
1336 FCC6 85 01 BITA #1 TEST READY BIT< RDRF ? |
1337 ENDIF PS2OPT |
1338 FCC8 35 82 INCHEK1 PULS A,PC RESTORE A ACCUM. |
1339 * |
1340 FCCA 8D 00 OUT2S BSR OUT1S OUTPUT 2 SPACES |
1341 FCCC 86 20 OUT1S LDA #$20 OUTPUT 1 SPACE |
1342 * |
1343 * |
1344 * OUTCH |
1345 * |
1346 * OUTPUT CHARACTER TO TERMINAL. |
1347 * THE CHAR. TO BE OUTPUT IS |
1348 * PASSED IN THE A REGISTER. |
1349 * ALL REGISTERS ARE PRESERVED. |
1350 * |
1351 OUTCH IFD VDUOPT |
1352 FCCE 8D 45 BSR VOUTCH |
1353 ENDIF VDUOPT |
1354 IFD DG640OPT |
1355 BSR VOUTCH |
1356 ENDIF DG640OPT |
1356 ENDIF DG640OPT |
1357 FCD0 34 12 AOUTCH PSHS A,X SAVE A ACCUM AND IX |
1358 FCD2 BE DF E0 LDX CPORT GET ADDR. OF TERMINAL |
1359 FCD5 A6 84 FETSTA LDA ,X FETCH PORT STATUS |
1360 FCD7 85 02 BITA #2 TEST TDRE, OK TO XMIT ? |
1361 FCD9 27 FA BEQ FETSTA IF NOT LOOP UNTIL RDY |
1362 FCDB 35 02 PULS A GET CHAR. FOR XMIT |
1363 FCDD A7 01 STA 1,X XMIT CHAR. |
1364 FCDF 35 90 PULS X,PC RESTORE IX |
1365 * |
1366 * IO INITIALIZATION |
1367 * |
1368 FCE1 IOINIZ EQU * |
1369 IFD VDUOPT |
1370 FCE1 8D 13 BSR VINIZ |
1371 ENDIF VDUOPT |
1372 IFD DG640OPT |
1373 BSR VINIZ |
1374 ENDIF DG640OPT |
1374 ENDIF DG640OPT |
1375 FCE3 BE DF E0 ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS |
1376 FCE6 86 03 LDA #3 RESET ACIA PORT CODE |
1377 FCE8 A7 84 STA ,X STORE IN CONTROL REGISTER |
1378 FCEA 86 11 LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY |
1379 FCEC A7 84 STA ,X STORE IN CONTROL REGISTER |
1380 FCEE 6D 01 TST 1,X ANYTHING IN DATA REGISTER? |
1381 FCF0 86 FF LDA #$FF TURN ON ECHO FLAG |
1382 FCF2 B7 DF E2 STA ECHO |
1383 FCF5 39 RTS |
1384 * |
1385 IFD VDUOPT |
1386 * |
1387 *************************************************** |
1388 * VDU8 ADM3A REGISTER-MAPPED EMULATOR * |
1389 * * |
1390 * 80 x 25 Characters |
1391 * |
1392 *************************************************** |
1393 * |
1394 *************************************************** |
1395 * INITIALIZE EMULATOR * |
1396 *************************************************** |
1397 * |
1398 FCF6 8E E0 30 VINIZ LDX #VDU |
1399 FCF9 CC 00 00 LDD #0 |
1400 FCFC FD DF FB STD COLADX AND ROWADX |
1401 FCFF A7 02 STA VDUCOL,X |
1402 FD01 E7 03 STB VDUROW,X |
1403 FD03 E7 04 STB VDUOFF,X |
1404 FD05 FD DF FD STD NEWROW AND ESCFLG |
1405 FD08 C6 02 LDB #$02 |
1406 FD0A E7 01 STB VDUATT,X |
1407 FD0C 7F DF FE CLR ESCFLG |
1408 FD0F 86 1B LDA #$1B SEND ESCAPE |
1409 FD11 8D 02 BSR VOUTCH |
1410 FD13 86 59 LDA #'Y CLEAR TO END OF SCREEN |
1411 * |
1412 ** VIDEO OUTPUT ROUTINE |
1413 * |
1414 FD15 34 16 VOUTCH PSHS A,B,X SAVE REGISTERS |
1415 FD17 8E E0 30 LDX #VDU POINT TO VDU REGISTERS |
1416 * |
1417 ** CHECK FOR ESCAPE SEQUENCE |
1418 * |
1419 FD1A 7D DF FE TST ESCFLG ESCAPE ACTIVE? |
1420 FD1D 27 04 BEQ SOROU1 BRANCH IF NOT |
1421 FD1F 8D 74 BSR ESCAPE ELSE DO ESCAPE |
1422 FD21 20 0D BRA RETURN AND RETURN |
1423 * |
1424 ** CHECK FOR CONTROL CHARACTERS |
1425 * |
1426 FD23 81 20 SOROU1 CMPA #$20 CONTROL CODES? |
1427 FD25 24 04 BHS SOROU2 |
1428 FD27 8D 09 BSR CONTRL BRANCH IF SO |
1429 FD29 20 05 BRA RETURN |
1430 * |
1431 ** OUTPUT TEXT CHARACTER |
1432 * |
1433 FD2B A7 84 SOROU2 STAA VDUCHR,X DISPLAY CHARACTER |
1434 FD2D 17 00 C5 LBSR NEWCOL UPDATE COLUMN |
1435 * |
1436 ** DISPLAY CURSOR AND RETURN |
1437 * |
1438 FD30 35 96 RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1439 * |
1440 *************************************************** |
1441 * CONTROL CODE HANDLERS * |
1442 *************************************************** |
1443 * |
1444 FD32 81 08 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1445 FD34 10 27 00 41 LBEQ BACKSP |
1446 FD38 81 1B CMPA #$1B ESCAPE SEQUENCE? |
1447 FD3A 10 27 00 6C LBEQ SETESC |
1448 FD3E 81 1A CMPA #$1A CTRL Z - Clear Screen |
1449 FD40 10 27 00 8E LBEQ CLRSCR |
1450 FD44 81 16 CMPA #$16 CTRL ^ - Home |
1451 FD46 10 27 00 45 LBEQ HOME |
1452 FD4A 81 0D CMPA #$D CTRL M - RETURN? |
1453 FD4C 10 27 00 99 LBEQ CRETN |
1454 FD50 81 0C CMPA #$0C CTRL L - CHAR RIGHT |
1455 FD52 10 27 00 2C LBEQ CHRIGHT |
1456 FD56 81 0B CMPA #$0B CTRL K - MOVE UP ONE LINE |
1457 FD58 10 27 00 11 LBEQ LINEUP |
1458 FD5C 81 0A CMPA #$0A CTRL J - LINE FEED |
1459 FD5E 26 51 BNE RETESC NONE OF THESE, RETURN |
1460 * |
1461 ***************************************** LINE FEED |
1462 * |
1463 FD60 FC DF FB LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1464 FD63 5C INCB BUMP ROW |
1465 FD64 C1 19 CMPB #NUMLIN SCROLL TIME? |
1466 FD66 10 26 00 83 LBNE NEWCUR POSITION CURSOR IF NOT |
1467 FD6A 16 00 99 LBRA SCROLL ELSE SCROLL IT |
1468 * |
1469 ***************************************** LINE FEED |
1470 * |
1471 FD6D FC DF FB LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1472 FD70 5D TSTB AT TOP OF SCREEN ? |
1473 FD71 10 27 00 3C LBEQ RETESC Yes, Ignore |
1474 FD75 5A DECB No, Decrement ROW |
1475 FD76 16 00 74 LBRA NEWCUR POSITION CURSOR |
1476 * |
1477 *********************************** BACK SPACE |
1478 * |
1479 FD79 B6 DF FB BACKSP LDA COLADX |
1480 FD7C 27 33 BEQ RETESC RETURN |
1481 FD7E 4A DECA |
1482 FD7F 16 00 68 LBRA POSCOL POSITION CURSOR |
1483 * |
1484 *********************************** CURSOR RIGHT |
1485 * |
1486 FD82 B6 DF FB CHRIGHT LDA COLADX |
1487 FD85 4C INCA |
1488 FD86 81 50 CMPA #LINLEN |
1489 FD88 10 27 00 25 LBEQ RETESC |
1490 FD8C 16 00 5B LBRA POSCOL |
1491 * |
1492 *********************************** CURSOR RIGHT |
1493 * |
1494 FD8F CC 00 00 HOME LDD #0 HOME - POSITION TOP OF SCREEN |
1495 FD92 16 00 58 LBRA NEWCUR |
1496 * |
1497 *************************************************** |
1498 * ESCAPE HANDLERS * |
1499 *************************************************** |
1500 * |
1501 FD95 F6 DF FE ESCAPE LDAB ESCFLG GET FLAG |
1502 FD98 C1 3D CMPB #'= SETTING CURSOR? |
1503 FD9A 27 16 BEQ ESCCUR BRANCH IF SO |
1504 FD9C 81 59 CMPA #'Y CLEAR TO END OF SCREEN? |
1505 FD9E 10 27 00 6E LBEQ ESCCLS |
1506 FDA2 81 54 CMPA #'T CLEAR TO END OF LINE? |
1507 FDA4 27 31 BEQ ESCCLL |
1508 FDA6 81 3D CMPA #'= STARTING CURSOR SET? |
1509 FDA8 26 04 BNE CLRESC BRANCH IF NOT |
1510 * |
1511 ***************************** START ESCAPE SEQUENCE |
1512 * |
1513 FDAA B7 DF FE SETESC STAA ESCFLG ELSE START CURSORING |
1514 FDAD 39 RTS AND RETURN |
1515 * |
1516 FDAE 7F DF FE CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1517 FDB1 39 RETESC RTS SO RETURN |
1518 * |
1519 ********************************* SET SCREEN CURSOR |
1520 * |
1521 FDB2 7D DF FD ESCCUR TST NEWROW ROW SET? |
1522 FDB5 26 04 BNE ESCCU1 BRANCH IF SO |
1523 FDB7 B7 DF FD STAA NEWROW ELSE SET NEW ROW |
1524 FDBA 39 RTS AND RETURN |
1525 * |
1526 FDBB 7F DF FE ESCCU1 CLR ESCFLG |
1527 FDBE 80 20 SUBA #$20 ADJUST COLUMN ADDRESS |
1528 FDC0 81 4F CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1529 FDC2 22 ED BHI RETESC NOT OK, DO NOTHING |
1530 * |
1531 FDC4 F6 DF FD ESCCU2 LDAB NEWROW |
1532 FDC7 7F DF FD CLR NEWROW |
1533 FDCA C0 20 SUBB #$20 ADJUST TO ROW ADDRESS |
1534 FDCC C1 18 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1535 FDCE 22 E1 BHI RETESC ELSE RETURN DOING NOTHING |
1536 FDD0 20 1B BRA NEWCUR GO SET NEW CURSOR IF SO |
1537 * |
1538 ****************** CLEAR FROM CURSOR TO END OF LINE |
1539 FDD2 CC 00 00 CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN |
1540 FDD5 8D 16 BSR NEWCUR |
1541 FDD7 B6 DF FB ESCCLL LDA COLADX |
1542 FDDA C6 20 LDB #$20 AND CLEAR CHAR |
1543 FDDC E7 84 ESCCL1 STB VDUCHR,X DISPLAY TEXT |
1544 FDDE 4C INCA |
1545 FDDF A7 02 STA VDUCOL,X |
1546 FDE1 81 50 CMPA #LINLEN UNTIL END OF LINE |
1547 FDE3 26 F7 BNE ESCCL1 |
1548 FDE5 7F DF FE CLR ESCFLG |
1549 FDE8 39 RTS |
1550 * |
1551 *********************************** CARRIAGE RETURN |
1552 * |
1553 FDE9 4F CRETN CLRA SET COLUMN ZERO |
1554 FDEA F6 DF FC POSCOL LDB ROWADX GET CURRENT ROW |
1555 * |
1556 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1557 * |
1558 FDED FD DF FB NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1559 FDF0 A7 02 STA VDUCOL,X SET NEW COLUMN |
1560 FDF2 E7 03 STB VDUROW,X SET NEW ROW |
1561 FDF4 39 RTS AND RETURN |
1562 * |
1563 ********************* UPDATE CURRENT COLUMN AND ROW |
1564 * |
1565 FDF5 FC DF FB NEWCOL LDD COLADX GET ROW AND COLUMN |
1566 FDF8 4C INCA BUMP COLUMN |
1567 FDF9 81 50 CMPA #LINLEN ROLL? |
1568 FDFB 26 F0 BNE NEWCUR BRANCH IF NOT |
1569 FDFD 4F CLRA ELSE RESET TO ZERO |
1570 FDFE 5C INCB AND BUMP ROW |
1571 FDFF C1 19 CMPB #NUMLIN |
1572 FE01 26 EA BNE NEWCUR |
1573 FE03 5A DECB BOTTOM ROW |
1574 FE04 8D E7 BSR NEWCUR |
1575 * |
1576 ********************************* SCROLL THE SCREEN |
1577 * |
1578 FE06 E6 04 SCROLL LDB VDUOFF,X |
1579 FE08 5C INCB |
1580 FE09 C1 19 CMPB #NUMLIN |
1581 FE0B 25 01 BLO SCROL1 |
1582 FE0D 5F CLRB |
1583 FE0E E7 04 SCROL1 STB VDUOFF,X |
1584 * |
1585 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1586 * |
1587 FE10 F6 DF FB ESCCLS LDB COLADX GET CURSOR |
1588 FE13 86 20 LDA #$20 GET A SPACE |
1589 FE15 F7 DF FB ESCCLS1 STB COLADX |
1590 FE18 E7 02 STB VDUCOL,X |
1591 FE1A A7 84 STA VDUCHR,X |
1592 FE1C 5C INCB |
1593 FE1D C1 50 CMPB #LINLEN |
1594 FE1F 26 F4 BNE ESCCLS1 |
1595 * |
1596 FE21 F6 DF FC LDB ROWADX |
1597 FE24 5C INCB |
1598 FE25 C1 19 CMPB #NUMLIN |
1599 FE27 27 08 BEQ ESCCLS2 |
1600 FE29 F7 DF FC STB ROWADX |
1601 FE2C E7 03 STB VDUROW,X |
1602 FE2E 5F CLRB |
1603 FE2F 20 E4 BRA ESCCLS1 |
1604 * |
1605 FE31 5F ESCCLS2 CLRB |
1606 FE32 F7 DF FB STB COLADX |
1607 FE35 E7 02 STB VDUCOL,X |
1608 FE37 F7 DF FE STB ESCFLG |
1609 FE3A 39 RTS |
1610 ENDIF VDUOPT |
1611 * |
1612 IFD DG640OPT |
1613 *************************************************** |
1614 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR * |
1615 * * |
1616 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE * |
1617 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO * |
1618 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION * |
1619 * 16x64 BOARD). * |
1620 *************************************************** |
1621 |
1622 *************************************************** |
1623 * INITIALIZE EMULATOR * |
1624 *************************************************** |
1625 |
1626 VINIZ LDX #0 |
1627 STX COLADX AND ROWADX |
1628 STX NEWROW AND ESCFLG |
1629 LDX #SCREEN POINT TO SCREEN |
1630 STX CURSOR SET PROGRAM CURSOR |
1631 LDA #$1B SEND ESCAPE |
1632 BSR VOUTCH |
1633 LDA #'Y CLEAR TO END OF SCREEN |
1634 * |
1635 ** VIDEO OUTPUT ROUTINE |
1636 * |
1637 VOUTCH PSHS A,B,X SAVE REGISTERS |
1638 * |
1639 ** CLEAR CURSOR |
1640 LDX CURSOR |
1641 LDB 0,X |
1642 ANDB #$7F |
1643 STB 0,X |
1644 * |
1645 ** CHECK FOR ESCAPE SEQUENCE |
1646 TST ESCFLG ESCAPE ACTIVE? |
1647 BEQ SOROU1 BRANCH IF NOT |
1648 BSR ESCAPE ELSE DO ESCAPE |
1649 BRA RETURN AND RETURN |
1650 * |
1651 ** CHECK FOR CONTROL CHARACTERS |
1652 SOROU1 CMPA #$20 CONTROL CODES? |
1653 BHS SOROU2 |
1654 BSR CONTRL BRANCH IF SO |
1655 BRA RETURN |
1656 * |
1657 ** OUTPUT TEXT CHARACTER |
1658 SOROU2 LDX CURSOR ELSE GET CURSOR |
1659 STAA 0,X DISPLAY CHARACTER |
1660 LBSR NEWCOL UPDATE COLUMN |
1661 * |
1662 ** DISPLAY CURSOR AND RETURN |
1663 RETURN LDX CURSOR AND DISPLAY IT |
1664 LDB ,X |
1665 ORAB #$80 WITH REVID |
1666 STB ,X |
1667 PULS A,B,X,PC RESTORE REGISTERS AND RETURN |
1668 |
1669 *************************************************** |
1670 * CONTROL CODE HANDLERS * |
1671 *************************************************** |
1672 |
1673 CONTRL CMPA #$08 CTRL H - BACKSPACE ? |
1674 LBEQ BACKSP |
1675 CMPA #$1B ESCAPE SEQUENCE? |
1676 LBEQ SETESC |
1677 CMPA #$D CTRL M - RETURN? |
1678 LBEQ CRETN |
1679 CMPA #$0A CTRL J - LINE FEED |
1680 BNE RETESC NONE OF THESE, RETURN |
1681 |
1682 ***************************************** LINE FEED |
1683 |
1684 LINEFD LDD COLADX GET CURRENT COLUMN AND ROW |
1685 INCB BUMP ROW |
1686 CMPB #NUMLIN SCROLL TIME? |
1687 LBNE NEWCUR POSITION CURSOR IF NOT |
1688 LBRA SCROLL ELSE SCROLL IT |
1689 |
1690 ***************************************** LINE FEED |
1691 |
1692 LINEUP LDD COLADX GET CURRENT COLUMN AND ROW |
1693 TSTB AT TOP OF SCREEN ? |
1694 BEQ RETESC Yes, Ignore |
1695 DECB No, Decrement ROW |
1696 LBRA NEWCUR POSITION CURSOR |
1697 |
1698 |
1699 *********************************** BACK SPACE |
1700 |
1701 BACKSP LDA COLADX |
1702 BEQ RETESC RETURN |
1703 DECA |
1704 LBRA POSCOL POSITION CURSOR |
1705 |
1706 *********************************** CURSOR RIGHT |
1707 |
1708 CHRIGHT LDA COLADX |
1709 INCA |
1710 CMPA #LINLEN |
1711 BEQ RETESC |
1712 LBRA POSCOL |
1713 |
1714 *************************************************** |
1715 * ESCAPE HANDLERS * |
1716 *************************************************** |
1717 |
1718 ESCAPE LDAB ESCFLG GET FLAG |
1719 CMPB #'= SETTING CURSOR? |
1720 BEQ ESCCUR BRANCH IF SO |
1721 CMPA #'Y CLEAR TO END OF SCREEN? |
1722 LBEQ ESCCLS |
1723 CMPA #'T CLEAR TO END OF LINE? |
1724 BEQ ESCCLL |
1725 CMPA #'E INSERT LINE? |
1726 BEQ ESCINL |
1727 CMPA #'R DELETE LINE? |
1728 BEQ ESCDLL |
1729 CMPA #'= STARTING CURSOR SET? |
1730 BNE CLRESC BRANCH IF NOT |
1731 |
1732 ***************************** START ESCAPE SEQUENCE |
1733 |
1734 SETESC STAA ESCFLG ELSE START CURSORING |
1735 RTS AND RETURN |
1736 |
1737 CLRESC CLR ESCFLG NO OTHERS SUPPORTED |
1738 RETESC RTS SO RETURN |
1739 |
1740 ********************************* SET SCREEN CURSOR |
1741 |
1742 ESCCUR TST NEWROW ROW SET? |
1743 BNE ESCCU1 BRANCH IF SO |
1744 STAA NEWROW ELSE SET NEW ROW |
1745 RTS AND RETURN |
1746 |
1747 ESCCU1 CLR ESCFLG |
1748 SUBA #$20 ADJUST COLUMN ADDRESS |
1749 CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM |
1750 BHI RETESC NOT OK, DO NOTHING |
1751 |
1752 ESCCU2 LDAB NEWROW |
1753 CLR NEWROW |
1754 SUBB #$20 ADJUST TO ROW ADDRESS |
1755 CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW |
1756 BHI RETESC ELSE RETURN DOING NOTHING |
1757 BRA NEWCUR GO SET NEW CURSOR IF SO |
1758 * |
1759 *************************** DELETE LINE FROM SCREEN |
1760 |
1761 ESCDLL BSR CRETN GO COL. ZERO |
1762 LDB ROWADX |
1763 CMPB #NUMLIN-1 |
1764 BEQ SCROL3 |
1765 BRA SCROL1 AND DELETE THIS LINE |
1766 |
1767 *************************** INSERT LINE INTO SCREEN |
1768 |
1769 ESCINL BSR CRETN GO TO COL. ZERO |
1770 LDAB ROWADX |
1771 CMPB #NUMLIN-1 |
1772 BEQ ESCCLL |
1773 * |
1774 ** SCROLL SCREEN DOWN FROM CURSOR |
1775 * |
1776 LDX #SCREEN+SCNLEN-LINLEN |
1777 ESCIN0 LDAA 0,-X |
1778 STAA LINLEN,X |
1779 LDA SCNLEN,X |
1780 STA SCNLEN+LINLEN,X |
1781 CPX CURSOR |
1782 BNE ESCIN0 |
1783 |
1784 ****************** CLEAR FROM CURSOR TO END OF LINE |
1785 |
1786 ESCCLL LDA COLADX GET CURRENT COLUMN |
1787 LDX CURSOR GET CURSOR |
1788 LDB #$20 AND CLEAR CHAR |
1789 ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE |
1790 STB ,X+ CLEAR TEXT |
1791 INCA |
1792 CMPA #LINLEN UNTIL END OF LINE |
1793 BNE ESCLL1 |
1794 CLR ESCFLG |
1795 RTS |
1796 |
1797 *********************************** CARRIAGE RETURN |
1798 |
1799 CRETN CLRA SET COLUMN ZERO |
1800 POSCOL LDB ROWADX GET CURRENT ROW |
1801 |
1802 *********** GENERATE NEW CURSOR POSITION AND RETURN |
1803 |
1804 NEWCUR STD COLADX SAVE NEW ROW AND COLUMN |
1805 LDA #LINLEN ELSE ADD A LINE |
1806 MUL LINLEN * ROWADX |
1807 ADDB COLADX |
1808 ADCA #0 |
1809 ADDD #SCREEN ADD SCREEN BASE. |
1810 STD CURSOR SAVE NEW CURSOR |
1811 TFR D,X GET CURSOR IN X |
1812 RTS AND RETURN |
1813 |
1814 ********************* UPDATE CURRENT COLUMN AND ROW |
1815 |
1816 NEWCOL LDD COLADX GET ROW AND COLUMN |
1817 INCA BUMP COLUMN |
1818 CMPA #LINLEN ROLL? |
1819 BNE NEWCUR BRANCH IF NOT |
1820 CLRA ELSE RESET TO ZERO |
1821 INCB AND BUMP ROW |
1822 CMPB #NUMLIN |
1823 BNE NEWCUR |
1824 DECB BOTTOM ROW |
1825 BSR NEWCUR |
1826 |
1827 ********************************* SCROLL THE SCREEN |
1828 |
1829 SCROLL LDX #SCREEN POINT TO SCREEN |
1830 SCROL1 LDA SCNLEN+LINLEN,X |
1831 STA SCNLEN,X |
1832 LDAA LINLEN,X MOVE TWO BYTES |
1833 STAA 0,X+ UP ONE LINE |
1834 CMPX #SCREEN+SCNLEN-LINLEN |
1835 BNE SCROL1 LOOP UNTIL DONE |
1836 BRA SCROL3 |
1837 |
1838 **************** CLEAR FROM CURSOR TO END OF SCREEN |
1839 |
1840 ESCCLS LDX CURSOR GET CURSOR |
1841 SCROL3 LDAA #$20 GET A SPACE |
1842 SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES |
1843 STA ,X+ AND TEXT |
1844 CMPX #SCREEN+SCNLEN |
1845 BNE SCROL2 UNTIL DONE |
1846 CLR ESCFLG |
1847 RTS |
1848 ENDIF DG640OPT |
1848 ENDIF DG640OPT |
1849 * |
1850 IFD PRTOPT |
1851 ************************************* |
1852 * |
1853 ** PRINTER DRIVER ROUTINES |
1854 * |
1855 ************************************* |
1856 * |
1857 ** PINIZ - INITIATE PRINTER PORT |
1858 * |
1859 PINIZ PSHS B |
1860 LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04 |
1861 STD PADATA SET DDR AND SELECT DATA |
1862 * |
1863 ** RESET PRINTER |
1864 LDB #PRESET |
1865 STAB PADATA |
1866 RESTLP INCB DELAY FOR RESET |
1867 BNE RESTLP |
1868 STAA PADATA ACCA=DIRMSK |
1869 * |
1870 ** INITALIZE PORT B (DATA PORT) |
1871 LDAA #$2A |
1872 STAA PBCTRL |
1873 LDD #$FF2E ACCA=$FF ACCB =%00101110 |
1874 STD PBDATA PBDREG PBCTRL |
1875 * |
1876 ** SELECT 66 LINES/PAGE |
1877 LDAA #$1B |
1878 BSR POUTCH |
1879 LDAA #'C |
1880 BSR POUTCH |
1881 LDAA #66 |
1882 PULS B |
1883 ************************************* |
1884 * |
1885 ** OUTPUT A CHARACTER TO THE PRINTER |
1886 * |
1887 ************************************* |
1888 POUTCH PSHS B |
1889 LDAB PBDATA CLEAR INTERRUPT BIT |
1890 * |
1891 ** WAIT TILL NOT BUSY |
1892 BUSYLP LDAB PADATA |
1893 BITB #PERROR |
1894 BEQ PEXIT |
1895 TSTB |
1896 BMI BUSYLP |
1897 * |
1898 ** NOW OUTPUT CHARACTER |
1899 STAA PBDATA |
1900 PEXIT PULS B,PC |
1901 ************************************* |
1902 * |
1903 ** PCHK TEST IFD PRINTER READY |
1904 * |
1905 ************************************* |
1906 PCHK TST PBCTRL TEST STATE OF CRB7 |
1907 RTS SET ON ACKNOWLEDGE |
1908 ENDIF PRTOPT |
1908 ENDIF PRTOPT |
1909 ************************************* |
1910 * |
1911 * MONITOR KEYBOARD COMMAND JUMP TABLE |
1912 * |
1913 ************************************* |
1914 * |
1915 FE3B JMPTAB EQU * |
1916 FE3B 01 FCB 1 " ^A " |
1917 FE3C FB 74 FDB ALTRA |
1918 FE3E 02 FCB 2 " ^B " |
1919 FE3F FB 69 FDB ALTRB |
1920 FE41 03 FCB 3 " ^C " |
1921 FE42 FB 7F FDB ALTRCC |
1922 FE44 04 FCB 4 " ^D " |
1923 FE45 FB 5E FDB ALTRDP |
1924 FE47 10 FCB $10 " ^P " |
1925 FE48 FB 31 FDB ALTRPC |
1926 FE4A 15 FCB $15 " ^U " |
1927 FE4B FB 3D FDB ALTRU |
1928 FE4D 18 FCB $18 " ^X " |
1929 FE4E FB 53 FDB ALTRX |
1930 FE50 19 FCB $19 " ^Y " |
1931 FE51 FB 48 FDB ALTRY |
1932 * |
1933 FE53 42 FCC 'B' |
1934 FE54 F9 5C FDB BRKPNT |
1935 FE56 45 FCC 'E' |
1936 FE57 F8 FD FDB MEMDUMP |
1937 FE59 47 FCC 'G' |
1938 FE5A F8 A5 FDB GO |
1939 FE5C 4C FCC 'L' |
1940 FE5D FA 5E FDB LOAD |
1941 FE5F 50 FCC 'P' |
1942 FE60 FA BC FDB PUNCH |
1943 FE62 4D FCC 'M' |
1944 FE63 F8 A8 FDB MEMCHG |
1945 FE65 52 FCC 'R' |
1946 FE66 FB ED FDB REGSTR |
1947 FE68 53 FCC 'S' |
1948 FE69 F8 F1 FDB DISSTK |
1949 FE6B 58 FCC 'X' |
1950 FE6C F9 88 FDB XBKPNT |
1951 IFD MFDCOPT |
1952 FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT |
1953 FDB MINBOOT |
1954 ENDIF MFDCOPT |
1954 ENDIF MFDCOPT |
1955 IFD CF8OPT |
1956 FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT |
1957 FDB CFBOOT |
1958 ENDIF CF8OPT |
1958 ENDIF CF8OPT |
1959 IFD IDEOPT |
1960 FE6E 44 FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT |
1961 FE6F F9 D5 FDB IDEBOOT |
1962 ENDIF IDEOPT |
1963 IFD DMAFOPT |
1964 FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT |
1965 FDB DBOOT |
1966 ENDIF DMAFOPT |
1966 ENDIF DMAFOPT |
1967 IFD EXTOPT |
1968 FE71 55 FCC 'U' *** IF FPGA, 'U' IS FOR USER |
1969 FE72 FC 92 FDB USRCMD |
1970 ENDIF EXTOPT |
1971 IFD RTCOPT |
1972 FCC 'T' |
1973 FDB TIMSET |
1974 ENDIF RTCOPT |
1974 ENDIF RTCOPT |
1975 IFD TRAOPT |
1976 FCC "T" |
1977 FDB TRACE |
1978 ENDIF TRAOPT |
1978 ENDIF TRAOPT |
1979 * |
1980 FE74 TABEND EQU * |
1981 * |
1982 * ** 6809 VECTOR ADDRESSES ** |
1983 * |
1984 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES |
1985 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY |
1986 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE |
1987 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO |
1988 * HIS OWN ROUTINES IF HE SO DESIRES. |
1989 * |
1990 * |
1991 FE74 F9 94 RAMVEC FDB SWIE USER-V |
1992 FE76 F8 A7 FDB RTI SWI3-V |
1993 FE78 F8 A7 FDB RTI SWI2-V |
1994 FE7A F8 A7 FDB RTI FIRQ-V |
1995 FE7C F8 A7 FDB RTI IRQ-V |
1996 FE7E F9 94 FDB SWIE SWI-V |
1997 FE80 FF FF FDB $FFFF SVC-VO |
1998 FE82 FF FF FDB $FFFF SVC-VL |
1999 * |
2000 * PRINTABLE MESSAGE STRINGS |
2001 * |
2002 FE84 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0 |
2003 FE89 53 59 53 30 39 42 FCC 'SYS09BUG 1.4 FOR ' |
55 47 20 31 2E 34 |
20 46 4F 52 20 |
2004 IFD S3EOPT |
2005 FCC 'S3E ' |
2006 ENDIF S3EOPT |
2006 ENDIF S3EOPT |
2007 IFD B5XOPT |
2008 FCC 'B5-X300 ' |
2009 ENDIF B5XOPT |
2009 ENDIF B5XOPT |
2010 IFD S3SOPT |
2011 FCC 'S3STARTER ' |
2012 ENDIF S3SOPT |
2012 ENDIF S3SOPT |
2013 IFD ADSOPT |
2014 FCC 'ADS6809 ' |
2015 ENDIF ADSOPT |
2015 ENDIF ADSOPT |
2016 IFD SWTOPT` |
2017 FCC 'SWTPC ' |
2018 ENDIF SWTOPT |
2018 ENDIF SWTOPT |
2019 IFD XESOPT` |
2020 FE9A 58 45 53 53 20 FCC 'XESS ' |
2021 ENDIF XESOPT |
2022 FE9F 20 2D 20 FCC ' - ' |
2023 FEA2 04 FCB 4 |
2024 FEA3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS |
04 |
2025 FEAA 3E MSG3 FCC '>' |
2026 FEAB 04 FCB 4 |
2027 FEAC 57 48 41 54 3F MSG4 FCC 'WHAT?' |
2028 FEB1 04 FCB 4 |
2029 FEB2 20 2D 20 MSG5 FCC ' - ' |
2030 FEB5 04 FCB 4' |
2031 FEB6 20 20 53 50 3D MSG10 FCC ' SP=' |
2032 FEBB 04 FCB 4 |
2033 FEBC 20 20 50 43 3D MSG11 FCC ' PC=' |
2034 FEC1 04 FCB 4 |
2035 FEC2 20 20 55 53 3D MSG12 FCC ' US=' |
2036 FEC7 04 FCB 4 |
2037 FEC8 20 20 49 59 3D MSG13 FCC ' IY=' |
2038 FECD 04 FCB 4 |
2039 FECE 20 20 49 58 3D MSG14 FCC ' IX=' |
2040 FED3 04 FCB 4 |
2041 FED4 20 20 44 50 3D MSG15 FCC ' DP=' |
2042 FED9 04 FCB 4 |
2043 FEDA 20 20 41 3D MSG16 FCC ' A=' |
2044 FEDE 04 FCB 4 |
2045 FEDF 20 20 42 3D MSG17 FCC ' B=' |
2046 FEE3 04 FCB 4 |
2047 FEE4 20 20 43 43 3A 20 MSG18 FCC ' CC: ' |
2048 FEEA 04 FCB 4 |
2049 FEEB 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC' |
56 43 |
2050 FEF3 53 31 MSG20 FCC 'S1' |
2051 FEF5 04 FCB 4 |
2052 IFD DATOPT |
2053 * |
2054 * POWER UP/ RESET/ NMI ENTRY POINT |
2055 * |
2056 FF00 ORG $FF00 |
2057 * |
2058 * |
2059 FF00 8E FF F0 START LDX #IC11 POINT TO DAT RAM IC11 |
2060 FF03 86 0F LDA #$F GET COMPLIMENT OF ZERO |
2061 * |
2062 * |
2063 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F |
2064 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS |
2065 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE |
2066 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA |
2067 * STORED IN IT. |
2068 * |
2069 * |
2070 FF05 A7 80 DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION |
2071 FF07 4A DECA GET COMP. VALUE FOR NEXT LOCATION |
2072 FF08 26 FB BNE DATLP ALL 16 LOCATIONS INITIALIZED ? |
2073 * |
2074 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER |
2075 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL |
2076 * PHYSICAL ADDRESSES. |
2077 * |
2078 FF0A 86 F0 LDA #$F0 |
2079 FF0C A7 84 STA ,X STORE $F0 AT $FFFF |
2080 FF0E 8E D0 A0 LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF |
2081 FF11 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y" |
2082 FF15 EE 84 TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION |
2083 FF17 10 AF 84 STY ,X STORE TEST PATTERN AT $D0A0 |
2084 FF1A 10 AC 84 CMPY ,X IS THERE RAM AT THIS LOCATION ? |
2085 FF1D 27 0B BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP |
2086 FF1F 30 89 F0 00 LEAX -$1000,X ELSE POINT 4K LOWER |
2087 FF23 8C F0 A0 CMPX #$F0A0 DECREMENTED PAST ZER0 YET ? |
2088 FF26 26 ED BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM |
2089 FF28 20 D6 BRA START ELSE START ALL OVER AGAIN |
2090 * |
2091 * |
2092 * THE FOLLOWING CODE STORES THE COMPLEMENT OF |
2093 * THE MS CHARACTER OF THE FOUR CHARACTER HEX |
2094 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED |
2095 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT |
2096 * IS STORED IN RAM IN THE LOCATION THAT IS |
2097 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---, |
2098 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND |
2099 * WHEN TESTING LOCATION $70A0, MEANING THERE |
2100 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE |
2101 * $8000-$DFFF, THEN THE COMPLEMENT OF THE |
2102 * "7" IN THE $70A0 WILL BE STORED IN |
2103 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS |
2104 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND |
2105 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE |
2106 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE |
2107 * RAM THAT IS PHYSICALLY ADDRESSED AT $7--- |
2108 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT |
2109 * IS AT $D--- SINCE THAT IS THE ADDRESS THE |
2110 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK |
2111 * OF RAM RESPONDS. |
2112 * |
2113 * |
2114 FF2A EF 84 CNVADR STU ,X RESTORE DATA AT TEST LOCATION |
2115 FF2C 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2116 FF2E 43 COMA COMPLEMENT MSB OF THAT ADDRESS |
2117 FF2F 44 LSRA PUT MS 4 BITS OF ADDRESS IN |
2118 FF30 44 LSRA LOCATION D0-D3 TO ALLOW STORING |
2119 FF31 44 LSRA IT IN THE DYNAMIC ADDRESS |
2120 FF32 44 LSRA TRANSLATION RAM. |
2121 FF33 B7 FF FD STA $FFFD STORE XLATION FACTOR IN DAT "D" |
2122 * |
2123 FF36 10 CE DF C0 LDS #STACK INITIALIZE STACK POINTER |
2124 * |
2125 * |
2126 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES |
2127 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK |
2128 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS |
2129 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION |
2130 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF |
2131 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO |
2132 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---.... |
2133 * |
2134 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2135 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- -- |
2136 * |
2137 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE |
2138 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING.... |
2139 * |
2140 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2141 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0 |
2142 * |
2143 * |
2144 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF |
2145 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL |
2146 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK |
2147 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT |
2148 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000 |
2149 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000 |
2150 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE |
2151 * MEMORY ADDRESSED AS FOLLOWS.... |
2152 * |
2153 * 0 1 2 3 4 5 6 7 8 9 A B C D E F |
2154 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- -- |
2155 * |
2156 * |
2157 FF3A 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2158 FF3E A7 2D STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD |
2159 FF40 6F 2E CLR 14,Y CLEAR $DFDE |
2160 FF42 86 F0 LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ? |
2161 FF44 A7 2F STA 15,Y STORE AT $DFDF |
2162 FF46 86 0C LDA #$0C PRESET NUMBER OF BYTES TO CLEAR |
2163 FF48 6F A6 CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0 |
2164 FF4A 4A DECA SUB. 1 FROM BYTES LEFT TO CLEAR |
2165 FF4B 2A FB BPL CLRLRT CONTINUE IF NOT DONE CLEARING |
2166 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM |
2167 FF51 8C F0 A0 CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO |
2168 FF54 27 22 BEQ FINTAB SKIP IF FINISHED |
2169 FF56 EE 84 LDU ,X SAVE DATA AT CURRENT TEST LOCATION |
2170 FF58 10 8E 55 AA LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG. |
2171 FF5C 10 AF 84 STY ,X STORE TEST PATT. INTO RAM TEST LOC. |
2172 FF5F 10 AC 84 CMPY ,X VERIFY RAM AT TEST LOCATION |
2173 FF62 26 E9 BNE FNDRAM IF NO RAM GO LOOK 4K LOWER |
2174 FF64 EF 84 STU ,X ELSE RESTORE DATA TO TEST LOCATION |
2175 FF66 10 8E DF D0 LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE |
2176 FF6A 1F 10 TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D |
2177 FF6C 44 LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3 |
2178 FF6D 44 LSRA TO ALLOW STORING IT IN THE DAT RAM. |
2179 FF6E 44 LSRA |
2180 FF6F 44 LSRA |
2181 FF70 1F 89 TFR A,B SAVE OFFSET INTO LRARAM TABLE |
2182 FF72 88 0F EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK |
2183 FF74 A7 A5 STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE |
2184 FF76 20 D5 BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK |
2185 FF78 86 F1 FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ? |
2186 FF7A 10 8E DF D0 LDY #LRARAM POINT TO LRARAM TABLE |
2187 FF7E A7 2E STA 14,Y STORE $F1 AT $DFCE |
2188 * |
2189 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF |
2190 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES |
2191 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT |
2192 * LOGICALLY RESPONDS TO THE ADDRESS $C---. |
2193 * |
2194 * |
2195 FF80 86 0C LDA #$0C PRESET NUMBER HEX "C" |
2196 FF82 E6 A6 FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE |
2197 FF84 26 05 BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR. |
2198 FF86 4A DECA ELSE POINT 4K LOWER |
2199 FF87 2A F9 BPL FINDC GO TRY AGAIN |
2200 FF89 20 14 BRA XFERTF |
2201 FF8B 6F A6 FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND |
2202 FF8D E7 2C STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C--- |
2203 * |
2204 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION |
2205 * FACTORS SUCH THAT ALL REMAINING RAM WILL |
2206 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL |
2207 * ADDRESSES FROM $0000 AND UP.... |
2208 * |
2209 FF8F 4F CLRA START AT ZERO |
2210 FF90 1F 21 TFR Y,X START POINTER "X" START OF "LRARAM" TABLE. |
2211 FF92 E6 A6 COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE |
2212 FF94 27 04 BEQ PNTNXT IF IT'S ZER0 SKIP |
2213 FF96 6F A6 CLR A,Y ELSE ERASE FROM TABLE |
2214 FF98 E7 80 STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP |
2215 FF9A 4C PNTNXT INCA GET OFFSET TO NEXT ENTRY |
2216 FF9B 81 0C CMPA #$0C LAST ENTRY YET ? |
2217 FF9D 2D F3 BLT COMPRS |
2218 * |
2219 * THE FOLLOWING CODE TRANSFER THE TRANSLATION |
2220 * FACTORS FROM THE LRARAM TABLE TO IC11 ON |
2221 * THE MP-09 CPU CARD. |
2222 * |
2223 FF9F 8E FF F0 XFERTF LDX #IC11 POINT TO DAT RAM IC11 |
2224 FFA2 C6 10 LDB #$10 GET NO. OF BYTES TO MOVE |
2225 FFA4 A6 A0 FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT |
2226 FFA6 A7 80 STA ,X+ POKE XLATION FACTOR IN IC11 |
2227 FFA8 5A DECB SUB 1 FROM BYTES TO MOVE |
2228 FFA9 26 F9 BNE FETCH CONTINUE UNTIL 16 MOVED |
2229 * |
2230 ELSE |
2231 LRA RTS |
2232 START LDS #STACK INITIALIZE STACK POINTER |
2233 CLRB |
2234 ENDIF DATOPT |
2234 ENDIF DATOPT |
2235 * |
2236 FFAB 53 COMB SET "B" NON-ZERO |
2237 FFAC F7 DF E2 STB ECHO TURN ON ECHO FLAG |
2238 FFAF 16 F8 62 LBRA MONITOR INITIALIZATION IS COMPLETE |
2239 * |
2240 ** INTERRUPT JUMP VECTORS |
2241 * |
2242 FFB2 6E 9F DF C0 V1 JMP [STACK] |
2243 FFB6 6E 9F DF C4 V2 JMP [SWI2] |
2244 FFBA 6E 9F DF C6 V3 JMP [FIRQ] |
2245 FFBE 6E 9F DF C8 V4 JMP [IRQ] |
2246 FFC2 6E 9F DF CA V5 JMP [SWI] |
2247 * |
2248 * SWI3 ENTRY POINT |
2249 * |
2250 FFC6 1F 43 SWI3E TFR S,U |
2251 FFC8 AE 4A LDX 10,U *$FFC8 |
2252 FFCA E6 80 LDB ,X+ |
2253 FFCC AF 4A STX 10,U |
2254 FFCE 4F CLRA |
2255 FFCF 58 ASLB |
2256 FFD0 49 ROLA |
2257 FFD1 BE DF CC LDX SVCVO |
2258 FFD4 8C FF FF CMPX #$FFFF |
2259 FFD7 27 0F BEQ SWI3Z |
2260 FFD9 30 8B LEAX D,X |
2261 FFDB BC DF CE CMPX SVCVL |
2262 FFDE 22 08 BHI SWI3Z |
2263 FFE0 34 10 PSHS X |
2264 FFE2 EC C4 LDD ,U |
2265 FFE4 AE 44 LDX 4,U |
2266 FFE6 6E F1 JMP [,S++] |
2267 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP |
2268 FFEA EE 42 LDU 2,U |
2269 FFEC 6E 9F DF C2 JMP [SWI3] |
2270 * |
2271 * 6809 VECTORS |
2272 * |
2273 FFF0 ORG $FFF0 |
2274 FFF0 FF B2 FDB V1 USER-V |
2275 FFF2 FF C6 FDB SWI3E SWI3-V |
2276 FFF4 FF B6 FDB V2 SWI2-V |
2277 FFF6 FF BA FDB V3 FIRQ-V |
2278 FFF8 FF BE FDB V4 IRQ-V |
2279 FFFA FF C2 FDB V5 SWI-V |
2280 FFFC FF B2 FDB V1 NMI-V |
2281 FFFE FF 00 FDB START RESTART-V |
0005 END START |
0006 END |
Program + Init Data = 3583 bytes |
Error count = 0 |
/readme.txt
0,0 → 1,122
System09 Monitor Program |
======================== |
John Kent |
3rd February 2008 |
|
1. Introduction. |
|
System09 is FPGA SOC (System On a Chip) that uses a 6809 instruction compatible FPGA core. |
The system is based around the old SWTPc (South West Technical Product Computer), |
the difference being the FPGA version runs witha 25 MHz E Clock where as the SWTPc |
ran with a 1MHz to 2MHz E clock. |
|
2. Disk Operating Systems |
|
The SWTPc ran the FLEX9, OS9 and Uniflex operating systems. |
|
2.1 Flex9 |
|
Flex is a single user operating system developed by TSC (Technical Systems Consultants). |
It was to the Motorola 8 bit microprocessor family what CP/M was to the 8080 and Z80 family. |
Flex9 typically used SBUG1.8 as the monitor program for providing the terminal drivers |
and primative debug functions. |
|
2.2 UniFlex |
|
UniFlex was TSC's multi tasking version of their Flex operating system. |
I don't know much about it, other that the fact that much of the code is available on the |
internet. UniFlex made use of the extended memory, and used thw SWTPc DMAF-2 Floppy |
Disk Controller. |
|
2.3 OS9 |
|
OS9 is a realtime multitasking operating system. It used to come in a basic 64K version |
called Level 1 and an extended memory version that used the DAT (Dynamic Address Translation) |
to map in up to 1 MByte of memory and was called level 2. |
|
The SWTPc emulator from Evensons Consulting Services uses just the ACIA serial port |
at $E000, a SWTPc MP-T timer module at $E040 for interrupts and a Western Digital |
FD1771 or FD179X Floppy disk controller to run OS9 level 1. |
|
OS9 had two special 2KByte boot ROMs at resided at $F000 and $F800. |
These contain the start up code to load OS9 from the disk drive and run it. |
|
3. Monitor Features |
|
System09 is based on SBUG1.8, which was typically used for the Flex9 operating system |
however I have had to strip out some of the functionality to fit video display and |
PS/2 keyboard drivers. The VDU and PS/2 keyboard operate in parallel with the serial |
port so that commands may be entered either locally on the FPGA system remotely by |
the serial port on say a PC running a terminal program such as hyperterm. |
|
3.1 Mass storage |
|
SBUG1.8 had two disk boots, one was for a the DC-1 or compatible floppy disk controller |
that was mapped at $E01X and the other was for the DMAF2 which used the 6844 DMA controller |
and was mapped at $F000 just below the SBUG1.8 monitor program. |
|
In system09 there is no Western Digital Compatible Floppy disk Controller. (At least not yet.) |
Instead provisons have been made for booting from either a Compact Flash card or an IDE hard drive. |
|
The method for interfaceing to an IDE drive or CF card varies from FPGA board to FPGA board. |
Some FPGA boards such as the Spartan 3 and Spartan 3E starter boards do not have provision |
for a Compact Flash card or IDE card, although they do have expansion ports that could be |
used for CF or IDE interfaces. |
|
Some FPGA boards, such as the BurchED B5-X300 have a dedicated CF add on module, which allows |
you to map the CF card in any way you like. The XESS XST-3S1000 and XST-3.0 carrier board on the |
other hand provides a 16 bit peripheral bus that can be used to access the IDE drive connector, |
ethernet controller or two expansion connectors. The Trenz TE0141 and TE0140 boards have the |
CF card mapped into the memory address and data bus, but have done so in such a fashion that it |
can only be used in 8 bit transfer mode. |
|
CF cards can be programmed to run in 8 bit mode or 16 bit mode. 8 Bit mode is handier for |
interfaceing to 8 bit micros sych as system09, however this mode is not necessarily supported |
by IDE disk drives. |
|
4. FPGA Cards |
|
4.1 BurchEd B5-X300 |
|
The B5-X300 version of Sys09bug is covered by the "FPGAOPT" options flag. |
It provides text VDU drivers and PS/2 keyboard interface, ACIA serial port, |
and Compact Flash Bootstrap. The B5-X300 uses a 300Kgate Spartan 2E FPGA which |
means the Block RAM used to hold the monitor ROMs is only 4Kbits. |
four Block RAMs are required to implement a 2KByte monitor program. |
|
4.2 Digilent / Xilinx Spartan 3 Starter Board |
|
The Xilinx spartan 3 starter board was designed by Digilent. It uses the Spartan 3 FPGA |
and intially came in a 200K gate version although a 1000KGate version is also available. |
The Spartan 3 starterboard is fitted wit 256K x 32 bits of RAM, which is mapped as 1M x 8 bits. |
|
The Spartan 3 starter board does not have any mass storage interfaces, although it does have |
expansion sockets that may be used to add external CF or IDE interfaces. The SRAM on the |
otherhand can be used as a RAM disk, and data can be downloaded via serial link. |
|
David Rumball designed his version of system09 called the Microbox 2000 which was based on |
the spartan 3 starter board. He was able to use a configuration flash loader to load |
a ROM disk into RAM. He also implemented a RAM disk and a virtual disk that was hosted on |
a PC using the FLEXNET software. |
|
I borrowed some of his work to extend sys09bug on the spartan 3 starter but have yet to get |
it working. |
|
4.3 Digilent / Xilinx Spartan 3E starter board |
|
Digilent produced a Spartan 3e starter board for Xilinx. The big difference between the |
Spartan 3 board and the spartan 3E board is that the latter uses SDRAM rather than SRAM |
and is consequently harder to use. The spartan 3E starter was used to verify the operation |
of the 6809 core, however because of the difficulty implementing the SDRAM controller |
I used Block RAM instead. The design implemented a PIA interrupt timer that sys09bug could |
use to single step through instructions one at a time. The S3E version of System09 implements |
a Trace command that performs a register dump after each instruction is executed. |
This allowed comparison of the FPGA 6809 core with a reference design using the original chip. |
|
Because RAM was limitted in the S3E, System09 also does not implement the DAT so the monitor |
start up code at the top of memory to test for memory is not implemented in the S3E version. |
|
4.4 XESS XSA-3S1000 / XST-3.0 |
|
|
|
/sys09s3s.aux
0,0 → 1,6
t m |
l SYS09S3S.S19 |
t h |
s sys09s3s_b16.vhd f800 ffff |
q |
|
/SYS09S3E.S19
0,0 → 1,60
S123F800F814F84BFC90FC8AFCA8FCBDFB82FB11FB0DFEE18EFE60108E7FC0C610A680A74A |
S123F820A05A26F98EE000BF7FD0170145C60C6FE25A26FB308CDDAF6A86D0A7E41F431728 |
S123F840048E8EFE7017033A1701DE8EFE951702BC17043C847F810D27F11F8981202C0958 |
S123F860865E1704581F988B4017045117044CC1602F02C0208EFE2AE180270F30028CFE9D |
S123F8806026F58EFE971702F920C0AD9420BC1F343B170374292D1F128EFE9D17026E1F45 |
S123F8A0211703AE170414A6A41703AE17040C1703672811810827E1811827DD815E2717EE |
S123F8C0810D260F39A7A4A1A427081703ED863F1703EA312120C2313F20BE1702AB1F3202 |
S123F8E08E7FC0301F200517031429063420ACE12401391F10C30010C4F034061F20C4F044 |
S123F9001F01ACE4270517039F270332623934108EFE9D1701F7AEE417033717039BC6106D |
S123F920A6801703351703935A26F517038BAEE1C610A68081202504817E2302862E170340 |
S123F9407C5A26EE20BC1702C0291E8C7FC0241A34108EFFFF8D5B3510270FA684813F2770 |
S123F96009A7A0AFA4863FA7843917034E863F16034B108E7FD3C6088D1E5A26FB391F43A7 |
S123F980AE4A301F8D2C2704AF4A8D0C1702518E0000BF7FED16FEB3AE218C7FC0240AA64E |
S123F9A084813F2604A6A4A78486FFA7A0A7A0A7A039108E7FD3C608A6A0ACA127045A26D1 |
S123F9C0F739313D3917015F291C1702EE1702392914BF7FEDBE7FC0BF7FEB8EF9E7BF7FFD |
S123F9E0C01700452020391F438636B7E071B6E0701701ECAE4AA684813F2724BE7FED27C0 |
S123FA001F301FBF7FED1F34860DB7E0708636B7E071B6E0708636B7E073863FB7E0713BC4 |
S123FA20BE7FEBBF7FC016FE228632B7E071863AB7E07386FFB7E0708600B7E0728636B74E |
S123FA40E071863EB7E073393404C6205A26FD3584BDFCD286111702647F7FD217022681C7 |
S123FA605326F917021F8139273D813126F11701A83402292617019129213410E6E0EBE0E4 |
S123FA80EBE46AE46AE4340417018E3504290C3402EBE06AE42705A78020EB5F3502C1FFA8 |
S123FAA027BA863F170216737FD2861316020E6FE217014A3430294DAC6225493001AFE41D |
S123FAC0BDFCD286121701F5ECE4A3622706108300202302C620E7648EFEDE17002FCB0369 |
S123FAE01F98170175AE62170168EB62EB63EB84A6801701656A6426F5531F9817015BAF6C |
S123FB0062ACE426C386141701B33265398D02207134108EFE8F170069359016019D160043 |
S123FB20F81600E51700918DF28DF62902AF4A398D618DE78DEB2902AF48398D728DDC8D9D |
S123FB40E02902AF46398D5E8DD18DD52902AF44398D498DC68DC72902A743398D6C8DBB5A |
S123FB608DBC2902A742398D588DB08DB12902A741398D5F8DA58DA629048A80A7C43917FC |
S123FB80013BA680810426F7398EFEA18DF41F311600BF8EFEAD8DEAAE4820F48EFEBF8DBF |
S123FBA0E1A6431600B48EFEB98DD7AE4420E18EFEB38DCEAE4620D88EFEA78DC5AE4A20EE |
S123FBC0CF8EFEC58DBCA64120D98EFECA8DB3A64220D08EFECF8DAAA6C48EFED616009066 |
S123FBE08EFE9D17FF278DA18DA98DB08DB88DBF8EFE9D17FF178DC08DC78DCE20D58D098C |
S123FC00294D1F12862D1700B48D0E29421F018D08293C3410A76135908D112932484848B9 |
S123FC20481F898D0729283404ABE0398D578130251D81392203803039814125128146226E |
S123FC400380373981612507816622038057391A0239341035028D023502340244444444A7 |
S123FC608D043502840F8B3081392F028B07204D3402C608A68068E42502862D8D3F8D3B9C |
S123FC805A26F135827D7FD227068D04847F202D3410BE7FD0A684850126098EE020A68474 |
S123FCA0850127EEA60135903402A69F7FD085012605B6E020850135828D0086208D453492 |
S123FCC012BE7FD0A684850227FA3502A70135908D13BE7FD08603A7848611A7846D018674 |
S123FCE0FFB77FD2398EE030CC0000FD7FEFA702E703E704FD7FF1C602E7017F7FF2861BBF |
S123FD008D02865934168EE0307D7FF227048D74200D812024048D092005A7841700C53582 |
S123FD2096810810270041811B1027006C811A1027008E811610270045810D102700998197 |
S123FD400C1027002C810B10270011810A2651FC7FEF5CC11910260083160099FC7FEF5D8B |
S123FD601027003C5A160074B67FEF27334A160068B67FEF4C81501027002516005BCC0008 |
S123FD8000160058F67FF2C13D271681591027006E81542731813D2604B77FF2397F7FF26A |
S123FDA0397D7FF12604B77FF1397F7FF28020814F22EDF67FF17F7FF1C020C11822E120EF |
S123FDC01BCC00008D16B67FEFC620E7844CA702815026F77F7FF2394FF67FF0FD7FEFA74E |
S123FDE002E70339FC7FEF4C815026F04F5CC11926EA5A8DE7E6045CC11925015FE704F654 |
S123FE007FEF8620F77FEFE702A7845CC15026F4F67FF05CC1192708F77FF0E7035F20E44D |
S123FE205FF77FEFE702F77FF23901FB6702FB5C03FB7204FB5110FB2415FB3018FB461913 |
S123FE40FB3B42F94645F8E747F88F4CFA5150FAAF4DF89252FBE053F8DB58F97254F9C566 |
S123FE60F97EF891F891F891F891F97EFFFFFFFF0D0A000000535953303942554720312E94 |
S123FE803420464F522053334520202D20044B0D0A000000043E04574841543F04202D201B |
S123FEA004202053503D04202050433D04202055533D04202049593D04202049583D042074 |
S123FEC02044503D042020413D042020423D04202043433A2004454648494E5A564353319F |
S123FEE0043910CE7FC05F53F77FD216F9266E9F7FC06E9F7FC46E9F7FC66E9F7FC86E9F26 |
S123FF007FCA1F43AE4AE680AF4A4F5849BE7FCC8CFFFF270F308BBC7FCE22083410ECC440 |
S10FFF20AE446EF1371FEE426E9F7FC2AC |
S113FFF0FEEEFF02FEF2FEF6FEFAFEFEFEEEFEE26C |
S9030000FC |