URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [sys09bug/] [sys09270.lst] - Rev 131
Go to most recent revision | Compare with Previous | Blame | View Log
Assembler release DWC_2.0 version 2.11May 6, 2004 (c) Motorola (free ware)0001 NAM SYS09BUG FOR TERASIC CYCLONE II DE2-700000 INCLUDE "opt_270.asm"00010002 *0003 ***************************************************0004 * OPTION SWITCHES0005 ***************************************************0006 *0007 *0008 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE0009 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET0010 ** FOR LOADING AND SAVING S1 RECORDS0011 *0012 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT0013 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY0014 *B3SOPT EQU $FF B3-SPARTAN2 FPGA VIDEO & PS2 KEYBOARD0015 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD0016 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD0017 *S3EOPT EQU $FF SPARTAN3E STARTER0018 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.00019 00FF DE270OPT EQU $FF CYCLONE II DE2-700020 *0002 END0000 INCLUDE "sys09equ.asm"0001 *0002 ***************************************************0003 * MEMORY MAP EQUATES *0004 ***************************************************0005 E000 MONIO EQU $E000 I/O SPACE0006 IFD B3SOPT0007 MONEXT EQU $F000 START OF EXTENDED COMMANDS0008 EXTCMD EQU $00 EXTENDED OFFSET0009 ENDIF B3SOPT0009 ENDIF B3SOPT0010 IFD S3EOPT0011 MONRAM EQU $7FC00012 ELSE0013 DFC0 MONRAM EQU $DFC0 STACK SPACE0014 ENDIF S3EOPT0015 F800 MONROM EQU $F800 START OF ROM0016 IFD S3SOPT0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS0018 EXTCMD EQU $00 EXTENDED OFFSET0019 ENDIF S3SOPT0019 ENDIF S3SOPT0020 IFD XESOPT0021 MONEXT EQU $F000 START OF EXTENDED COMMANDS0022 EXTCMD EQU $00 EXTENDED OFFSET0023 ENDIF XESOPT0023 ENDIF XESOPT0024 IFD DE270OPT0025 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS0026 0000 EXTCMD EQU $00 EXTENDED OFFSET0027 ENDIF DE270OPT0028 **************************************************0029 **************************************************00300031 IFD SWTOPT0032 *0033 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER0034 *0035 ACIAOPT EQU $FF ACIA AT PORT 00036 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT0037 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT0038 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0039 ENDIF0039 ENDIF0040 *0041 IFD ADSOPT0042 *0043 * ACKERMAN DIGITAL ADS68090044 *0045 DG640OPT EQU $FF DG640 VDU AT $E8000046 *RTCOPT EQU $FF REAL TIME CLOCK0047 PRTOPT EQU $FF PRINTER DRIVERS0048 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT0049 ENDIF ADSOPT0049 ENDIF ADSOPT0050 *0051 IFD B3SOPT0052 *0053 * BURCHED SPARTAN 2 B3+0054 *0055 ACIAOPT EQU $FF ACIA AT PORT 00056 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200057 VDUOPT EQU $FF VDU AT $E0300058 IDEOPT EQU $FF IDE AT $E1000059 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0060 HFCOPT EQU $FF HARDWARE FLOW CONTROL0061 ENDIF B3SOPT0061 ENDIF B3SOPT0062 *0063 IFD B5XOPT0064 *0065 * BURCHED SPARTAN 2 B5-X3000066 *0067 ACIAOPT EQU $FF ACIA AT PORT 00068 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200069 VDUOPT EQU $FF VDU AT $E0300070 CF8OPT EQU $FF COMPACT FLASH AT $E0400071 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0072 HFCOPT EQU $FF HARDWARE FLOW CONTROL0073 ENDIF B5XOPT0073 ENDIF B5XOPT0074 *0075 IFD S3SOPT0076 *0077 * DIGILENT SPARTAN 3 STARTER0078 *0079 ACIAOPT EQU $FF ACIA AT PORT 00080 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200081 VDUOPT EQU $FF VDU AT $E0300082 CF8OPT EQU $FF COMPACT FLASH AT $E0400083 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0084 EXTOPT EQU $FF EXTENDED COMMANDS0085 ENDIF S3SOPT0085 ENDIF S3SOPT0086 *0087 IFD S3EOPT0088 *0089 * DIGILENT SPARTAN 3E STARTER0090 *0091 ACIAOPT EQU $FF ACIA AT PORT 00092 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200093 VDUOPT EQU $FF VDU AT $E0300094 TRAOPT EQU $FF PIA TRACE TIMER0095 ENDIF S3EOPT0095 ENDIF S3EOPT0096 *0097 IFD XESOPT0098 *0099 * XESS SPARTAN 3 XSA-3S1000 & XST-3.00100 *0101 ACIAOPT EQU $FF ACIA AT PORT 00102 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200103 VDUOPT EQU $FF VDU AT $E0300104 IDEOPT EQU $FF IDE AT $E1000105 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0106 HFCOPT EQU $FF HARDWARE FLOW CONTROL0107 EXTOPT EQU $FF EXTENDED COMMANDS0108 ENDIF XESOPT0108 ENDIF XESOPT0109 *0110 IFD DE270OPT0111 *0112 * TERASIC CYCLONE 2 DE2-700113 *0114 00FF ACIAOPT EQU $FF ACIA AT PORT 00115 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E0200116 00FF VDUOPT EQU $FF VDU AT $E0300117 00FF CF8OPT EQU $FF COMPACT FLASH AT $E0400118 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0119 00FF EXTOPT EQU $FF EXTENDED COMMANDS0120 ENDIF DE270OPT0121 *0122 *0123 IFD ACIAOPT0124 *0125 ***************************************************0126 * SERIAL PORT *0127 ***************************************************0128 *0129 ** ACIA SITS ON PORT 00130 *0131 E000 ACIAS EQU MONIO+$00 CONTROL PORT0132 *0133 ENDIF ACIAOPT0134 IFD MFDCOPT0135 *0136 ***************************************************0137 * MINIFLOPPY DRIVE *0138 ***************************************************0139 *0140 ** FLOPPY DISK CONTROLLER SITS ON PORT 10141 *0142 DRVFDC EQU MONIO+$140143 CMDFDC EQU MONIO+$180144 SECFDC EQU MONIO+$1A0145 DATFDC EQU MONIO+$1B0146 ENDIF MFDCOPT0146 ENDIF MFDCOPT0147 IFD PS2OPT0148 *0149 ***************************************************0150 * VDU8 PS/2 KEYBOARD PORT *0151 ***************************************************0152 *0153 ** KEYBOARD SITS ON PORT 20154 *0155 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT0156 ENDIF PS2OPT0157 IFD VDUOPT0158 *0159 ***************************************************0160 * VDU8 DISPLAY DRIVER EQUATES *0161 ***************************************************0162 *0163 ** VDU8 DISPLAY SITS ON PORT 30164 *0165 E030 VDU EQU MONIO+$300166 0000 VDUCHR EQU 0 CHARACTER REGISTER0167 0001 VDUATT EQU 1 ATTRIBUTE REGISTER0168 0002 VDUCOL EQU 2 CURSOR COLUMN0169 0003 VDUROW EQU 3 CURSOR ROW0170 0004 VDUOFF EQU 4 ROW OFFSET0171 *0172 0050 LINLEN EQU 80 LENGTH OF A LINE0173 0019 NUMLIN EQU 25 NUMBER OF LINES0174 ENDIF VDUOPT0175 *0176 IFD CF8OPT0177 *0178 ***************************************************0179 * COMPACT FLASH EQUATES 8 BIT TRANSFER *0180 ***************************************************0181 *0182 ** COMPACT FLASH SITS AT PORT 40183 *0184 E040 CF_BASE EQU MONIO+$400185 E040 CF_DATA EQU CF_BASE+00186 E041 CF_ERROR EQU CF_BASE+1 ; read error0187 E041 CF_FEATURE EQU CF_BASE+1 ; write feature0188 E042 CF_SECCNT EQU CF_BASE+20189 E043 CF_SECNUM EQU CF_BASE+30190 E044 CF_CYLLO EQU CF_BASE+40191 E045 CF_CYLHI EQU CF_BASE+50192 E046 CF_HEAD EQU CF_BASE+60193 E047 CF_STATUS EQU CF_BASE+7 ; read status0194 E047 CF_COMAND EQU CF_BASE+7 ; write command0195 *0196 * Command Equates0197 *0198 0020 CMDREAD EQU $20 ; Read Single sector0199 0030 CMDWRITE EQU $30 ; Write Single sector0200 00EF CMDFEATURE EQU $EF0201 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers0202 00E0 HEADLBA EQU $E00203 *0204 * Status bit equates0205 *0206 0080 BUSY EQU $800207 0040 DRDY EQU $400208 0008 DRQ EQU $080209 0001 ERR EQU $010210 *0211 ENDIF CF8OPT0212 *0213 IFD IDEOPT0214 *0215 ***************************************************0216 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *0217 ***************************************************0218 *0219 ** COMPACT FLASH SITS AT PORT 40220 *0221 CF_BASE EQU MONIO+$01000222 CF_DATA EQU CF_BASE+00223 CF_ERROR EQU CF_BASE+2 ; read error0224 CF_FEATURE EQU CF_BASE+2 ; write feature0225 CF_SECCNT EQU CF_BASE+40226 CF_SECNUM EQU CF_BASE+60227 CF_CYLLO EQU CF_BASE+80228 CF_CYLHI EQU CF_BASE+100229 CF_HEAD EQU CF_BASE+120230 CF_STATUS EQU CF_BASE+14 ; read status0231 CF_COMAND EQU CF_BASE+14 ; write command0232 CF_AUX EQU CF_BASE+300233 *0234 * Command Equates0235 *0236 CMDREAD EQU $20 ; Read Single sector0237 CMDWRITE EQU $30 ; Write Single sector0238 AUXRESET EQU $06 ; Reset IDE0239 AUXRSTREL EQU $02 ; Reset release IRQ masked0240 HEADLBA EQU $E00241 *0242 * Status bit equates0243 *0244 BUSY EQU $800245 DRDY EQU $400246 DRQ EQU $080247 ERR EQU $010248 *0249 ENDIF CF8OPT0249 ENDIF CF8OPT0250 *0251 IFD RTCOPT0252 *0253 **************************************************0254 * MM58167A REAL TIME CLOCK MEMORY MAP:0255 **************************************************0256 *0257 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 50258 *0259 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS0260 *0261 * COUNTER AND COMPARITOR REGISTERS:0262 *0263 * Both the Clock Counter and Clock Comparitor0264 * consist of 8 registers for holding the time.0265 * The register offsets from the Counter and0266 * Comparitor registers are listed above.0267 *0268 COUNTR EQU CLOCK+00269 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS0270 *0271 * CLOCK REGISTER OFFSETS:0272 * These register offsets are used for the CLOCK0273 * and comparitor ram CMPRAM.0274 *0275 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS0276 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS0277 SECOND EQU 20278 MINUIT EQU 30279 HOUR EQU 40280 WKDAY EQU 50281 MTHDAY EQU 60282 MONTH EQU 70283 *0284 * INTERRUPT OUTPUT REGISTERS:0285 *0286 * An interrupt output may be generated at the0287 * following rates by setting the appropriate bit0288 * in the Interrupt Control Register (CINTCR).0289 * The Interrupt Status Register (CINTSR) must be0290 * read to clear the interrupt and will return0291 * the source of the interrupt.0292 *0293 * 1/Month Bit 70294 * 1/Week Bit 60295 * 1/Day Bit 50296 * 1/Hour Bit 40297 * 1/Minuite Bit 30298 * 1/Second Bit 20299 * 10/Second Bit 10300 * Comparitor Bit 00301 *0302 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER0303 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER0304 *0305 * COUNTER AND RAM RESETS; GO COMMAND.0306 *0307 * The counter and comparitor may be reset0308 * by writing $FF into CTRRES and CMPRES0309 * respectivly.0310 * A write to the Go command register (GOCMND)0311 * will reset the 1/1000ths, 1/100ths and 1/10ths0312 * of a second counter.0313 *0314 CTRRES EQU CLOCK+18 COUNTER RESET0315 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET0316 GOCMND EQU CLOCK+21 GO COMMAND0317 *0318 * CLOCK STATUS REGISTER.0319 *0320 * The counter takes 61 usec. to rollover for0321 * every 1KHz clock pulse. If the Status bit is0322 * set after reading the counter, the counter0323 * should be re-read to ensure the time is correct.0324 *0325 CLKSTA EQU CLOCK+20 STATUS BIT0326 SBYINT EQU CLOCK+22 STANDBY INTERRUPT0327 TSTMOD EQU CLOCK+31 TEST MODE REGISTER0328 ENDIF RTCOPT0328 ENDIF RTCOPT0329 *0330 IFD TRAOPT0331 *0332 **************************************************0333 * PIA INTERRUPT TIMER0334 **************************************************0335 *0336 ** PIA INTERRUPT TIMER SITS ON PORT 70337 *0338 ** PIA TIMER FOR SINGLE STEP / TRACE0339 *0340 * TADATA = Output = Timer preset register0341 * TACTRL - CA1 = input = rising edge = NMI0342 * - CA2 = Output = Timer Reset (Active High)0343 * TBDATA = Input = Timer read back register0344 * TBCTRL - CB1 = input = rising edge = FIRQ0345 * - CB2 = output = strobe low on write to TBDATA = Timer Preset0346 *0347 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB0348 * CRA1 = 1 CA1 Rising edge IRQ0349 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register0350 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 10351 * CRA4 = 1 ] CA2 = Set/Reset output0352 * CRA5 = 1 ]0353 * CRA6 = X CA2 Input Interrupt Flag0354 * CRA7 = X CA1 Interrupt Flag0355 *0356 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB0357 * CRB1 = 1 CB1 Rising edge IRQ0358 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register0359 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 10360 * CRB4 = 1 ] CB2 = Set/Reset output0361 * CRB5 = 1 ]0362 * CRB6 = X CB2 Input Interrupt Flag0363 * CRB7 = X CB1 Interrupt Flag0364 *0365 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output0366 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output0367 *0368 TADATA EQU MONIO+$70 Timer preset port0369 TACTRL EQU MONIO+$710370 TBDATA EQU MONIO+$72 Timer read back port0371 TBCTRL EQU MONIO+$730372 *0373 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)0374 *0375 ENDIF TRAOPT0375 ENDIF TRAOPT0376 IFD ADSOPT0377 *0378 ***************************************************0379 * SERIAL PORT FOR DG640 *0380 ***************************************************0381 *0382 ** SET UP FOR ACKERMAN DIGITAL ADS68090383 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA0384 *0385 ACIAS EQU MONIO+$400 CONTROL PORT0386 *0387 ENDIF ADSOPT0387 ENDIF ADSOPT0388 IFD PRTOPT0389 *0390 ***************************************************0391 * PRINTER INTERFACE *0392 ***************************************************0393 *0394 PADATA EQU MONIO+$4040395 PACTRL EQU MONIO+$4050396 PBDATA EQU MONIO+$4060397 PBCTRL EQU MONIO+$4070398 *0399 ** CB1 ACK. I/P0400 ** CB2 STB. O/P0401 ** PB0 - PB7 DATA 1 - 8 O/P0402 ** PORT A BIT ASSIGNMENT0403 *0404 PBUSY EQU $80 I/P0405 PEMPTY EQU $40 I/P0406 SELECT EQU $20 I/P0407 PERROR EQU $10 I/P0408 PRESET EQU %00000100 O/P PA3 = 00409 AUTOFD EQU %00001000 O/P PA2 = 00410 DIRMSK EQU %000011000411 ENDIF PRTOPT0411 ENDIF PRTOPT0412 IFD DG640OPT0413 *0414 ***************************************************0415 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *0416 ***************************************************0417 *0418 ** VIDEO DISPLAY DEFINITIONS0419 *0420 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY0421 LINLEN EQU 64 LENGTH OF A LINE0422 NUMLIN EQU 16 NUMBER OF LINES0423 SCNLEN EQU $400 LENGTH OF SCREEN0424 ENDIF DG640OPT0424 ENDIF DG640OPT0425 *0426 IFD DMAFOPT0427 *0428 ***************************************************0429 * DMAF2 8" DRIVE *0430 ***************************************************0431 *0432 ADDREG EQU $F000 ADDRESS REGISTER0433 CNTREG EQU $F002 COUNT REGISTER0434 CCREG EQU $F010 CHANNEL CONTROL REGISTER0435 PRIREG EQU $F014 DMA PRIORITY REGISTER0436 AAAREG EQU $F015 ???0437 BBBREG EQU $F016 ???0438 COMREG EQU $F020 1791 COMMAND REGISTER0439 SECREG EQU $F022 SECTOR REGISTER0440 DRVREG EQU $F024 DRIVE SELECT LATCH0441 CCCREG EQU $F040 ???0442 ENDIF DMAFOPT0442 ENDIF DMAFOPT0443 IFD DATOPT0444 **************************************************0445 * DYNAMIC ADDRESS TRANSLATION REGISTERS *0446 **************************************************0447 *0448 FFF0 IC11 EQU $FFF0 DAT RAM CHIP0449 55AA TSTPAT EQU $55AA TEST PATTERN0450 ENDIF DATOPT0451 *0003 END0000 INCLUDE "sys09bug.asm"0001 * NAM SYS09BUG12 SYSTEM09 MONITOR0002 OPT lsys09bug.asm page 20004 *0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....0007 *0008 * ALLEN CLARK WALLACE WATSON0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 336170011 * PH. 813-977-0347 PH. 813-985-13590012 *0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT0014 * 2561 NANTUCKET DR APT. E0015 * ATLANTA, GA 303450016 * PH. 404-320-10430017 *0018 * MODIFIED TO SYS09BUG VER 1.00019 * FOR: SYSTEM09 FPGA SYSTEM0020 * BY: JOHN KENT0021 * DATE: 21ST NOVEMBER 20060022 * REMOVED: DISK BOOTS0023 * MEMORY TEST0024 * ADDED: ADM3A VDU DRIVER0025 *0026 * MODIFIED TO SYS09BUG VER 1.10027 * BY: JOHN KENT0028 * DATE: 7TH JANUARY 20070029 * ADDED: 'U' USER EXTENTION COMMANDS AT $F0000030 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS0031 * AND REALTIME CLOCK0032 *0033 * MODIFIED TO SYS09BUG VER 1.20034 * BY: JOHN KENT0035 * DATE: 21ST MAY 20070036 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION0037 * REMOVED PORT REDIRECTION ON PUNCH & LOAD0038 *0039 * Modified to SYS09BUG VER 1.30040 * BY: JOHN KENT0041 * DATE: 8TH JAN 20080042 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD0043 * WITH ONLY 32K OF RAM0044 *0045 * Modified to SYS09BUG VER 1.40046 * BY: JOHN KENT0047 * DATE: 3RD FEB 20080048 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE0049 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X3000050 * 16 BIT IDE DISK BOOT STRAP ROUTINE0051 *0052 * Modified to SYS09BUG VER 1.50053 * BY: JOHN KENT0054 * DATE: 7TH SEP 20080055 * ADDED: ADDED "B3-S2+" STRING0056 *0057 * Modified to SYS09BUG VER 1.60058 * BY: JOHN KENT0059 * DATE: 2ND DEC 20080060 * ADDED: ADDED HARDWARE FLOW CONTROL0061 *0062 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES0063 *0064 * Modified to SYS09BUG VER 1.70065 * BY: JOHN KENT0066 * DATE: 16TH OCT 20100067 * ADDED: "DE2-70" STRING0068 *0069 * *** COMMANDS ***0070 *0071 * CONTROL A = ALTER THE "A" ACCUMULATOR0072 * CONTROL B = ALTER THE "B" ACCUMULATOR0073 * CONTROL C = ALTER THE CONDITION CODE REGISTER0074 * CONTROL D = ALTER THE DIRECT PAGE REGISTER0075 * CONTROL P = ALTER THE PROGRAM COUNTER0076 * CONTROL U = ALTER USER STACK POINTER0077 * CONTROL X = ALTER "X" INDEX REGISTER0078 * CONTROL Y = ALTER "Y" INDEX REGISTER0079 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh0080 * D = 5.25" MINIFLOPPY BOOT0081 * E ssss-eeee = EXAMINE MEMORY0082 * FROM STARTING ADDRESS ssss0083 * TO ENDING ADDRESS eeee.0084 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI0085 * L = LOAD TAPE0086 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh0087 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.0088 * R = DISPLAY REGISTER CONTENTS0089 * S = DISPLAY STACK FROM ssss TO $DFC00090 * U = 8" DMAF2 FLOPPY BOOT0091 * U = USER EXTENSION COMMANDS AT $F0000092 * X = REMOVE ALL BREAKPOINTS0093 *0094 *0095 ***************************************************0096 * SYS09BUG VARIABLE SPACE0097 ***************************************************0098 *0099 DFC0 ORG MONRAM0100 DFC0 STACK EQU * ; TOP OF INTERNAL STACK0101 DFC0 NMI RMB 2 ; USER NMI VECTOR0102 DFC2 SWI3 RMB 2 ; SOFTWARE INTERRUPT VECTOR #30103 DFC4 SWI2 RMB 2 ; SOFTWARE INTERRUPT VECTOR #20104 DFC6 FIRQ RMB 2 ; FAST INTERRUPT VECTOR0105 DFC8 IRQ RMB 2 ; INTERRUPT VECTOR0106 DFCA SWI RMB 2 ; SOFTWARE INTERRUPT VECTOR0107 DFCC SVCVO RMB 2 ; SUPERVISOR CALL VECTOR ORGIN0108 DFCE SVCVL RMB 2 ; SUPERVISOR CALL VECTOR LIMIT0109 IFD DATOPT0110 DFD0 LRARAM RMB 16 ; LRA ADDRESSES0111 ENDIF DATOPT0112 DFE0 CPORT RMB 2 ; RE-VECTORABLE CONTROL PORT0113 DFE2 ECHO RMB 1 ; ECHO FLAG0114 DFE3 BPTBL RMB 24 ; BREAKPOINT TABLE BASE ADDR0115 IFD TRAOPT0116 NMISAV RMB 2 ; NMI Jump Vector Backup0117 TRACNT RMB 2 ; Trace Count0118 ENDIF TRAOPT0118 ENDIF TRAOPT0119 IFD VDUOPT0120 *0121 **************************************************0122 * VDU8 DISPLAY DRIVER VARIABLES *0123 **************************************************0124 *0125 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******0126 DFFB COLADX RMB 1 ; CURSOR COLUMN0127 DFFC ROWADX RMB 1 ; CURSOR ROW0128 **************************************************0129 *0130 DFFD NEWROW RMB 1 ; NEW ROW TEMP FOR ESCAPE0131 DFFE ESCFLG RMB 1 ; ESCAPE SEQUENCE ACTIVE0132 ENDIF VDUOPT0133 IFD DG640OPT0134 *0135 ***************************************************0136 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *0137 ***************************************************0138 *0139 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****0140 COLADX RMB 1 ; CURSOR COLUMN0141 ROWADX RMB 1 ; CURSOR ROW0142 *************************************************0143 CURSOR RMB 2 ; ABSOLUTE SCREEN ADDRESS0144 NEWROW RMB 1 ; NEW ROW TEMP FOR ESCAPE0145 ESCFLG RMB 1 ; ESCAPE SEQUENCE ACTIVE0146 ENDIF DG640OPT0146 ENDIF DG640OPT0147 *0148 *0149 ***************************************************0150 * START OF ROM *0151 ***************************************************0152 *0153 F800 ORG MONROM0154 F800 F8 14 FDB MONITOR0155 F802 F8 61 FDB NEXTCMD0156 F804 FC A1 FDB INCH0157 F806 FC 9B FDB INCHE0158 F808 FC B9 FDB INCHEK0159 F80A FC CE FDB OUTCH0160 F80C FB 8F FDB PDATA0161 F80E FB 1E FDB PCRLF0162 F810 FB 1A FDB PSTRNG0163 F812 FA 2E FDB LRA0164 *0165 IFD ADSOPT0166 FDB PCHK ; CHECK FOR PRINTER INPUT0167 FDB PINIZ ; INITIATE PRINTER0168 FDB POUTCH ; OUTPUT CH. TO PRINTER0169 FDB VINIZ0170 FDB VOUTCH0171 FDB ACINIZ0172 FDB AOUTCH0173 ENDIF ADSOPT0173 ENDIF ADSOPT0174 *0175 * MONITOR0176 *0177 * VECTOR ADDRESS STRING IS.....0178 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF0179 *0180 F814 8E FE 62 MONITOR LDX #RAMVEC ; POINT TO VECTOR ADDR. STRING0181 F817 10 8E DF C0 LDY #STACK ; POINT TO RAM VECTOR LOCATION0182 F81B C6 10 LDB #$10 ; BYTES TO MOVE = 160183 F81D A6 80 LOOPA LDA ,X+ ; GET VECTOR BYTE0184 F81F A7 A0 STA ,Y+ ; PUT VECTORS IN RAM / $DFC0-$DFCF0185 F821 5A DECB ; SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE0186 F822 26 F9 BNE LOOPA ; CONTINUE UNTIL ALL VECTORS MOVED0187 *0188 * CONTENTS FROM TO FUNCTION0189 * $F8A1 $FE40 $DFC0 USER-V0190 * $F8A1 $FE42 $DFC2 SWI3-V0191 * $F8A1 $FE44 $DFC4 SWI2-V0192 * $F8A1 $FE46 $DFC6 FIRQ-V0193 * $F8A1 $FE48 $DFC8 IRQ-V0194 * $FAB0 $FE4A $DFCA SWI-V0195 * $FFFF $FE4C $DFCC SVC-VO0196 * $FFFF $FE4E $DFCE SVC-VL0197 *0198 F824 8E E0 00 LDX #ACIAS0199 F827 BF DF E0 STX CPORT ; STORE ADDR. IN RAM0200 F82A 17 01 5B LBSR XBKPNT ; CLEAR OUTSTANDING BREAKPOINTS0201 F82D C6 0C LDB #12 ; CLEAR 12 BYTES ON STACK0202 F82F 6F E2 CLRSTK CLR ,-S0203 F831 5A DECB0204 F832 26 FB BNE CLRSTK0205 F834 30 8C DD LEAX MONITOR,PCR ; SET PC TO SBUG-E ENTRY0206 F837 AF 6A STX 10,S ; ON STACK0207 F839 86 D0 LDA #$D0 ; PRESET CONDITION CODES ON STACK0208 F83B A7 E4 STA ,S0209 F83D 1F 43 TFR S,U0210 F83F 17 04 A3 LBSR IOINIZ ; INITIALIZE CONTROL PORT0211 F842 8E FE 72 LDX #MSG1 ; POINT TO MONITOR MESSAGE0212 F845 17 03 47 LBSR PDATA ; PRINT MSG0213 *0214 IFD DATOPT0215 F848 8E DF D0 LDX #LRARAM ; POINT TO LRA RAM STORAGE AREA0216 F84B 4F CLRA START ; TOTAL AT ZERO0217 F84C C6 0D LDB #13 ; TOTAL UP ALL ACTIVE RAM MEMORY0218 F84E 6D 85 FNDREL TST B,X ; TEST FOR RAM AT NEXT LOC.0219 F850 27 03 BEQ RELPAS ; IF NO RAM GO TO NEXT LOC.0220 F852 8B 04 ADDA #4 ; ELSE ADD 4K TO TOTAL0221 F854 19 DAA ; ADJ. TOTAL FOR DECIMAL0222 F855 5A RELPAS DECB ; SUB. 1 FROM LOCS. TO TEST0223 F856 2A F6 BPL FNDREL ; PRINT TOTAL OF RAM0224 F858 17 04 0C LBSR OUT2H ; OUTPUT HEX BYTE AS ASCII0225 F85B 8E FE 92 LDX #MSG2 ; POINT TO MSG 'K' CR/LF + 3 NULS0226 F85E 17 03 2E LBSR PDATA ; PRINT MSG0227 ENDIF DATOPT0228 *0229 IFD TRAOPT0230 LBSR TRAINZ0231 ENDIF TRAOPT0231 ENDIF TRAOPT0232 *0233 ***** NEXTCMD *****0234 *0235 F861 8E FE 99 NEXTCMD LDX #MSG3 ; POINT TO MSG ">"0236 F864 17 02 B3 LBSR PSTRNG ; PRINT MSG0237 F867 17 04 37 LBSR INCH ; GET ONE CHAR. FROM TERMINAL0238 F86A 84 7F ANDA #$7F ; STRIP PARITY FROM CHAR.0239 F86C 81 0D CMPA #$0D ; IS IT CARRIAGE RETURN ?0240 F86E 27 F1 BEQ NEXTCMD ; IF CR THEN GET ANOTHER CHAR.0241 F870 1F 89 TFR A,B ; PUT CHAR. IN "B" ACCUM.0242 F872 81 20 CMPA #$20 ; IS IT CONTROL OR DATA CHAR ?0243 F874 2C 09 BGE PRTCMD ; IF CMD CHAR IS DATA, PRNT IT0244 F876 86 5E LDA #'^ ; ELSE CNTRL CHAR CMD SO...0245 F878 17 04 53 LBSR OUTCH ; PRINT "^"0246 F87B 1F 98 TFR B,A ; RECALL CNTRL CMD CHAR0247 F87D 8B 40 ADDA #$40 ; CONVERT IT TO ASCII LETTER0248 F87F 17 04 4C PRTCMD LBSR OUTCH ; PRNT CMD CHAR0249 F882 17 04 47 LBSR OUT1S ; PRNT SPACE0250 F885 C1 60 CMPB #$600251 F887 2F 02 BLE NXTCH00252 F889 C0 20 SUBB #$200253 *0254 ***** DO TABLE LOOKUP *****0255 * FOR COMMAND FUNCTIONS0256 *0257 F88B 8E FE 29 NXTCH0 LDX #JMPTAB ; POINT TO JUMP TABLE0258 F88E E1 80 NXTCHR CMPB ,X+ ; DOES COMMAND MATCH TABLE ENTRY ?0259 F890 27 0F BEQ JMPCMD ; BRANCH IF MATCH FOUND0260 F892 30 02 LEAX 2,X ; POINT TO NEXT ENTRY IN TABLE0261 F894 8C FE 62 CMPX #TABEND ; REACHED END OF TABLE YET ?0262 F897 26 F5 BNE NXTCHR ; IF NOT END, CHECK NEXT ENTRY0263 F899 8E FE 9B LDX #MSG4 ; POINT TO MSG "WHAT?"0264 F89C 17 02 F0 LBSR PDATA ; PRINT MSG0265 F89F 20 C0 BRA NEXTCMD ; IF NO MATCH, PRMPT FOR NEW CMD0266 F8A1 AD 94 JMPCMD JSR [,X] ; JUMP TO COMMAND ROUTINE0267 F8A3 20 BC BRA NEXTCMD ; PROMPT FOR NEW COMMAND0268 *0269 * "G" GO OR CONTINUE0270 *0271 F8A5 1F 34 GO TFR U,S0272 F8A7 3B RTI RTI0273 *0274 ***** "M" MEMORY EXAMINE AND CHANGE *****0275 *0276 F8A8 17 03 6B MEMCHG LBSR IN1ADR ; INPUT ADDRESS0277 F8AB 29 2D BVS CHRTN ; IF NOT HEX, RETURN0278 F8AD 1F 12 TFR X,Y ; SAVE ADDR IN "Y"0279 F8AF 8E FE A1 MEMC2 LDX #MSG5 ; POINT TO MSG " - "0280 F8B2 17 02 65 LBSR PSTRNG ; PRINT MSG0281 F8B5 1F 21 TFR Y,X ; FETCH ADDRESS0282 F8B7 17 03 A5 LBSR OUT4H ; PRINT ADDR IN HEX0283 F8BA 17 04 0F LBSR OUT1S ; OUTPUT SPACE0284 F8BD A6 A4 LDA ,Y ; GET CONTENTS OF CURRENT ADDR.0285 F8BF 17 03 A5 LBSR OUT2H ; OUTPUT CONTENTS IN ASCII0286 F8C2 17 04 07 LBSR OUT1S ; OUTPUT SPACE0287 F8C5 17 03 5E LBSR BYTE ; LOOP WAITING FOR OPERATOR INPUT0288 F8C8 28 11 BVC CHANGE ; IF VALID HEX GO CHANGE MEM. LOC.0289 F8CA 81 08 CMPA #8 ; IS IT A BACKSPACE (CNTRL H)?0290 F8CC 27 E1 BEQ MEMC2 ; PROMPT OPERATOR AGAIN0291 F8CE 81 18 CMPA #$18 ; IS IT A CANCEL (CNTRL X)?0292 F8D0 27 DD BEQ MEMC2 ; PROMPT OPERATOR AGAIN0293 F8D2 81 5E CMPA #'^ ; IS IT AN UP ARROW?0294 F8D4 27 17 BEQ BACK ; DISPLAY PREVIOUS BYTE0295 F8D6 81 0D CMPA #$D ; IS IT A CR?0296 F8D8 26 0F BNE FORWRD ; DISPLAY NEXT BYTE0297 F8DA 39 CHRTN RTS ; EXIT ROUTINE0298 *0299 *0300 F8DB A7 A4 CHANGE STA ,Y ; CHANGE BYTE IN MEMORY0301 F8DD A1 A4 CMPA ,Y ; DID MEMORY BYTE CHANGE?0302 F8DF 27 08 BEQ FORWRD ; $F9720303 F8E1 17 03 E8 LBSR OUT1S ; OUTPUT SPACE0304 F8E4 86 3F LDA #'? ; LOAD QUESTION MARK0305 F8E6 17 03 E5 LBSR OUTCH ; PRINT IT0306 F8E9 31 21 FORWRD LEAY 1,Y ; POINT TO NEXT HIGHER MEM LOCATION0307 F8EB 20 C2 BRA MEMC2 ; PRINT LOCATION & CONTENTS0308 F8ED 31 3F BACK LEAY -1,Y ; POINT TO LAST MEM LOCATION0309 F8EF 20 BE BRA MEMC2 ; PRINT LOCATION & CONTENTS0310 *0311 * "S" DISPLAY STACK0312 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM0313 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.0314 *0315 F8F1 17 02 A2 DISSTK LBSR PRTSP ; PRINT CURRENT STACK POINTER0316 F8F4 1F 32 TFR U,Y0317 F8F6 8E DF C0 LDX #STACK ; LOAD INTERNAL STACK AS UPPER LIMIT0318 F8F9 30 1F LEAX -1,X ; POINT TO CURRENT STACK0319 F8FB 20 05 BRA MDUMP1 ; ENTER MEMORY DUMP OF STACK CONTENTS0320 *0321 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII0322 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.0323 * UPPER ADDRESS IN X-REG.0324 * IF HEX ADDRESSES ARE INVALID (V)=1.0325 *0326 F8FD 17 03 0B MEMDUMP LBSR IN2ADR ; INPUT ADDRESS BOUNDRIES0327 F900 29 06 BVS EDPRTN ; NEW COMMAND IF ILLEGAL HEX0328 F902 34 20 MDUMP1 PSHS Y ; COMPARE LOWER TO UPPER BOUNDS0329 F904 AC E1 CMPX ,S++ ; LOWER BOUNDS > UPPER BOUNDS?0330 F906 24 01 BCC AJDUMP ; IF NOT, DUMP HEX AND ASCII0331 F908 39 EDPRTN RTS ;0332 *0333 * ADJUST LOWER AND UPPER ADDRESS LIMITS0334 * TO EVEN 16 BYTE BOUNDRIES.0335 *0336 * IF LOWER ADDR = $45320337 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.0338 *0339 * IF UPPER ADDR = $45670340 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.0341 *0342 * ENTER WITH LOWER ADDRESS IN X-REG.0343 * -UPPER ADDRESS ON TOP OF STACK.0344 *0345 F909 1F 10 AJDUMP TFR X,D ; GET UPPER ADDR IN D-REG0346 F90B C3 00 10 ADDD #$10 ; ADD 16 TO UPPER ADDRESS0347 F90E C4 F0 ANDB #$F0 ; MASK TO EVEN 16 BYTE BOUNDRY0348 F910 34 06 PSHS A,B ; SAVE ON STACK AS UPPER DUMP LIMIT0349 F912 1F 20 TFR Y,D ; $F9A5 GET LOWER ADDRESS IN D-REG0350 F914 C4 F0 ANDB #$F0 ; MASK TO EVEN 16 BYTE BOUNDRY0351 F916 1F 01 TFR D,X ; PUT IN X-REG AS LOWER DUMP LIMIT0352 F918 AC E4 NXTLIN CMPX ,S ; COMPARE LOWER TO UPPER LIMIT0353 F91A 27 05 BEQ SKPDMP ; IF EQUAL SKIP HEX-ASCII DUMP0354 F91C 17 03 9A LBSR INCHEK ; CHECK FOR INPUT FROM KEYBOARD0355 F91F 27 03 BEQ EDUMP0356 F921 32 62 SKPDMP LEAS 2,S ; READJUST STACK IF NOT DUMPING0357 F923 39 RTS ;0358 *0359 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS0360 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.0361 *0362 F924 34 10 EDUMP PSHS X ; PUSH LOWER ADDR LIMIT ON STACK0363 F926 8E FE A1 LDX #MSG5 ; POINT TO MSG " - "0364 F929 17 01 EE LBSR PSTRNG ; PRINT MSG0365 F92C AE E4 LDX ,S ; LOAD LOWER ADDR FROM TOP OF STACK0366 F92E 17 03 2E LBSR OUT4H ; PRINT THE ADDRESS0367 F931 17 03 96 LBSR OUT2S ; 2 SPACES0368 F934 C6 10 LDB #$10 ; LOAD COUNT OF 16 BYTES TO DUMP0369 F936 A6 80 ELOOP LDA ,X+ ; GET FROM MEMORY HEX BYTE TO PRINT0370 F938 17 03 2C LBSR OUT2H ; OUTPUT HEX BYTE AS ASCII0371 F93B 17 03 8E LBSR OUT1S ; OUTPUT SPACE0372 F93E 5A DECB ; $F9D1 DECREMENT BYTE COUNT0373 F93F 26 F5 BNE ELOOP ; CONTINUE TIL 16 HEX BYTES PRINTED0374 *0375 * PRINT 16 ASCII CHARACTERS0376 * IF NOT PRINTABLE OR NOT VALID0377 * ASCII PRINT A PERIOD (.)0378 F941 17 03 86 LBSR OUT2S ; 2 SPACES0379 F944 AE E1 LDX ,S++ ; GET LOW LIMIT FRM STACK - ADJ STACK0380 F946 C6 10 LDB #$10 ; SET ASCII CHAR TO PRINT = 160381 F948 A6 80 EDPASC LDA ,X+ ; GET CHARACTER FROM MEMORY0382 F94A 81 20 CMPA #$20 ; IF LESS THAN $20, NON-PRINTABLE?0383 F94C 25 04 BCS PERIOD ; IF SO, PRINT PERIOD INSTEAD0384 F94E 81 7E CMPA #$7E ; IS IT VALID ASCII?0385 F950 23 02 BLS PRASC ; IF SO PRINT IT0386 F952 86 2E PERIOD LDA #'. ; LOAD A PERIOD (.)0387 F954 17 03 77 PRASC LBSR OUTCH ; PRINT ASCII CHARACTER0388 F957 5A DECB ; DECREMENT COUNT0389 F958 26 EE BNE EDPASC0390 F95A 20 BC BRA NXTLIN0391 *0392 ***** "B" SET BREAKPOINT *****0393 *0394 F95C 17 02 B7 BRKPNT LBSR IN1ADR ; GET BREAKPOINT ADDRESS0395 F95F 29 1E BVS EXITBP ; EXIT IF INVALID HEX ADDR.0396 F961 8C DF C0 CMPX #STACK ; ADDRESS ILLEGAL IF >=$DFC00397 F964 24 1A BCC BPERR ; IF ERROR PRINT (?), EXIT0398 F966 34 10 PSHS X ; $FA82 PUSH BP ADDRESS ON STACK0399 F968 8E FF FF LDX #$FFFF ; LOAD DUMMY ADDR TO TEST BP TABLE0400 F96B 8D 55 BSR BPTEST ; TEST BP TABLE FOR FREE SPACE0401 F96D 35 10 PULS X ; POP BP ADDRESS FROM STACK0402 F96F 27 0F BEQ BPERR ; (Z) SET, OUT OF BP TABLE SPACE0403 F971 A6 84 LDA ,X ; GET DATA AT BREAKPOINT ADDRESS0404 F973 81 3F CMPA #$3F ; IS IT A SWI?0405 F975 27 09 BEQ BPERR ; IF SWI ALREADY, INDICATE ERROR0406 F977 A7 A0 STA ,Y+ ; SAVE DATA BYTE IN BP TABLE0407 F979 AF A4 STX ,Y ; SAVE BP ADDRESS IN BP TABLE0408 F97B 86 3F LDA #$3F ; LOAD A SWI ($3F)0409 F97D A7 84 STA ,X ; SAVE SWI AT BREAKPOINT ADDRESS0410 F97F 39 EXITBP RTS ;0411 *0412 * INDICATE ERROR SETTING BREAKPOINT0413 *0414 F980 17 03 49 BPERR LBSR OUT1S ; OUTPUT SPACE0415 F983 86 3F LDA #'? ; LOAD (?), INDICATE BREAKPOINT ERROR0416 F985 16 03 46 LBRA OUTCH ; PRINT "?"0417 *0418 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***0419 *0420 F988 10 8E DF E3 XBKPNT LDY #BPTBL ; POINT TO BREAKPOINT TABLE0421 F98C C6 08 LDB #8 ; LOAD BREAKPOINT COUNTER0422 F98E 8D 18 XBPLP BSR RPLSWI ; REMOVE USED ENTRY IN BP TABLE0423 F990 5A DECB $FAAC ; DECREMENT BP COUNTER0424 F991 26 FB BNE XBPLP ; END OF BREAKPOINT TABLE?0425 F993 39 RTS0426 *0427 ***** SWI ENTRY POINT *****0428 *0429 F994 1F 43 SWIE TFR S,U ; TRANSFER STACK TO USER POINTER0430 F996 AE 4A LDX 10,U ; LOAD PC FROM STACK INTO X-REG0431 F998 30 1F LEAX -1,X ; ADJUST ADDR DOWN 1 BYTE.0432 F99A 8D 26 BSR BPTEST ; FIND BREAKPOINT IN BP TABLE0433 F99C 27 04 BEQ REGPR ; IF FOUND, REPLACE DATA AT BP ADDR0434 F99E AF 4A STX 10,U ; SAVE BREAKPOINT ADDR IN STACK0435 F9A0 8D 06 BSR RPLSWI ; GO REPLACE SWI WITH ORIGINAL DATA0436 F9A2 17 02 48 REGPR LBSR REGSTR ; GO PRINT REGISTERS0437 *0438 IFD TRAOPT0439 LDX #00440 STX TRACNT0441 ENDIF TRAOPT0441 ENDIF TRAOPT0442 *0443 F9A5 16 FE B9 LBRA NEXTCMD ; GET NEXT COMMAND0444 *0445 F9A8 AE 21 RPLSWI LDX 1,Y ; LOAD BP ADDRESS FROM BP TABLE0446 F9AA 8C DF C0 CMPX #STACK ; COMPARE TO TOP AVAILABLE USER MEMORY0447 F9AD 24 0A BCC FFSTBL ; GO RESET TABLE ENTRY TO $FF'S0448 F9AF A6 84 LDA ,X ; GET DATA FROM BP ADDRESS0449 F9B1 81 3F CMPA #$3F ; IS IT SWI?0450 F9B3 26 04 BNE FFSTBL ; IF NOT, RESET TABLE ENTRY TO $FF'S0451 F9B5 A6 A4 LDA ,Y ; GET ORIGINAL DATA FROM BP TABLE0452 F9B7 A7 84 STA ,X ; $FAD3 RESTORE DATA AT BP ADDRESS0453 F9B9 86 FF FFSTBL LDA #$FF ; LOAD $FF IN A-ACC0454 F9BB A7 A0 STA ,Y+ ; RESET BREAKPOINT TABLE DATA TO $FF'S0455 F9BD A7 A0 STA ,Y+ ; RESET BREAKPOINT TABLE ADDR TO $FF'S0456 F9BF A7 A0 STA ,Y+0457 F9C1 39 RTS0458 *0459 ** SEARCH BREAKPOINT TABLE FOR MATCH **0460 *0461 F9C2 10 8E DF E3 BPTEST LDY #BPTBL ; POINT TO BREAKPOINT TABLE0462 F9C6 C6 08 LDB #8 ; LOAD BREAKPOINT COUNTER0463 F9C8 A6 A0 FNDBP LDA ,Y+ ; LOAD DATA BYTE0464 F9CA AC A1 CMPX ,Y++ ; COMPARE ADDRESS, IS IT SAME?0465 F9CC 27 04 BEQ BPADJ ; IF SO, ADJUST POINTER FOR TABLE ENTRY0466 F9CE 5A DECB ; IF NOT, DECREMENT BREAKPOINT COUNTER0467 F9CF 26 F7 BNE FNDBP ; AND LOOK FOR NEXT POSSIBLE MATCH0468 F9D1 39 RTS ;0469 *0470 *0471 F9D2 31 3D BPADJ LEAY -3,Y ; MOVE POINTER TO BEGIN OF BP ENTRY0472 F9D4 39 RTS0473 *0474 IFD TRAOPT0475 *0476 ** TRACE from address AAAA BB bytes0477 *0478 TRACE LBSR ALTPC1 ; SET UP NEW PC0479 BVS TREXIT ; ADDRESS ERROR, EXIT0480 LBSR OUT1S0481 LBSR IN1ADR ; Fetch Byte Count0482 BVS TREXIT ; Byte Count error, EXIT0483 STX TRACNT0484 *0485 LDX NMI ; Save NMI Vector0486 STX NMISAV0487 LDX #NMIE ; Set up NMI for Tracing0488 STX NMI0489 LBSR TRAINZ ; Initialise Hardware0490 BRA TRACEG ; Start Trace0491 TREXIT RTS0492 *0493 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB0494 * CRA1 = 1 CA1 Rising edge IRQ0495 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register0496 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 10497 * CRA4 = 1 ] CA2 = Set/Reset output0498 * CRA5 = 1 ]0499 * CRA6 = X CA2 Input Interrupt Flag0500 * CRA7 = X CA1 Interrupt Flag0501 *0502 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB0503 * CRB1 = 1 CB1 Rising edge IRQ0504 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register0505 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 10506 * CRB4 = 1 ] CB2 = Set/Reset output0507 * CRB5 = 1 ]0508 * CRB6 = X CB2 Input Interrupt Flag0509 * CRB7 = X CB1 Interrupt Flag0510 *0511 *0512 ** TRACE NMI ENTRY POINT0513 *0514 NMIE TFR S,U0515 LDA #$36 ; Disable Interrupt, CA2 Low0516 STA TACTRL0517 LDA TADATA ; Clear Interrupt flag by reading data port0518 *0519 LBSR REGSTR ; DUMP REGISTERS0520 *0521 LDX 10,U ; TEST IF NEXT INSTRUCTION IS A SWI0522 LDA ,X0523 CMPA #$3F0524 BEQ TRACEX ; EXIT ON SWI0525 *0526 LDX TRACNT ; CHECK IF TRACE COUNT EXPIRED0527 BEQ TRACEX ; YES, GO BACK TO THE MONITOR0528 LEAX -1,X ; ECREMENT TRACE COUNT0529 STX TRACNT0530 *0531 ** TRACE GO (RESUME SINGLE STEP)0532 *0533 TRACEG TFR U,S ; SET UP PROGRAM STACK POINTER0534 LDA #TRADEL ; SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)0535 STA TADATA0536 LDA #$36 ; LOAD STROBE LOW0537 STA TACTRL0538 LDA TADATA ; CLEAR INTERRUPT0539 LDA #$36 ; RELEASE RESET0540 STA TBCTRL0541 LDA #$3F ; RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE0542 STA TACTRL0543 RTI ; GO EXECUTE INSTRUCTION0544 *0545 TRACEX LDX NMISAV ; Restore NMI vector0546 STX NMI0547 LBRA NEXTCMD ; Jump back to the command loop.0548 *0549 ** TRACE HARDWARE INITIALISATION0550 *0551 TRAINZ LDA #$32 ; SELECT DDRA, CA2 LOW, NMI DISABLED0552 STA TACTRL0553 LDA #$3A ; SELECT DDRB, CB2 HIGH, FIRQ DISABLED0554 STA TBCTRL0555 LDA #$FF ; PORTA = OUTPUT0556 STA TADATA0557 LDA #$00 ; PORTB = INPUT0558 STA TBDATA0559 LDA #$36 ; SELECT OUTPUT REGISTER A, CA2 LOW0560 STA TACTRL0561 LDA #$3E ; SELECT OUTPUT REGISTER B, CB2 HIGH0562 STA TBCTRL0563 RTS0564 *0565 ENDIF TRAOPT0565 ENDIF TRAOPT0566 IFD MFDCOPT0567 *0568 ** "U" MINI DISK BOOT0569 *0570 MINBOOT TST CMDFDC0571 CLR DRVFDC0572 LDX #$00000573 LOOP LEAX $01,X0574 CMPX #$00000575 BNE LOOP0576 LDA #$0F0577 STA CMDFDC0578 BSR DELAY0579 LOOP1 LDB CMDFDC0580 BITB #$010581 BNE LOOP10582 LDA #$010583 STA SECFDC0584 BSR DELAY0585 LDA #$8C0586 STA CMDFDC0587 BSR DELAY0588 LDX #$C0000589 BRA LOOP30590 LOOP2 BITB #$020591 BEQ LOOP30592 LDA DATFDC0593 STA ,X+0594 LOOP3 LDB CMDFDC0595 BITB #$010596 BNE LOOP20597 BITB #$2C0598 BEQ LOOP40599 RTS0600 *0601 LOOP4 LDX #$C0000602 STX $0A,U0603 TFR U,S0604 RTI0605 *0606 DELAY LDB #$040607 LOOP5 DECB0608 BNE LOOP50609 RTS0610 ENDIF MFDCOPT0610 ENDIF MFDCOPT0611 *0612 IFD DMAFOPT0613 *0614 *** "D" DISK BOOT FOR DMAF2 ***0615 *0616 DBOOT LDA #$DE0617 STA DRVREG0618 LDA #$FF0619 STA PRIREG ; $FAF80620 STA CCREG0621 STA AAAREG0622 STA BBBREG0623 TST CCREG0624 LDA #$D80625 STA COMREG0626 LBSR DLY0627 DBOOT0 LDA COMREG0628 BMI DBOOT00629 LDA #$090630 STA COMREG0631 LBSR DLY0632 *0633 DISKWT LDA COMREG ; FETCH DRIVE STATUS0634 BITA #1 ; TEST BUSY BIT0635 BNE DISKWT ; LOOP UNTIL NOT BUSY0636 *0637 BITA #$100638 BNE DBOOT0639 *0640 LDX #$C000 ; LOGICAL ADDR. = $C0000641 BSR LRA ; GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.0642 ORA #$100643 STA CCCREG0644 TFR X,D0645 COMA ;0646 COMB ;0647 STD ADDREG0648 LDX #$FEFF ; LOAD DMA BYTE COUNT = $1000649 STX CNTREG ; STORE IN COUNT REGISTER0650 LDA #$FF ; LOAD THE CHANNEL REGISTER0651 STA CCREG0652 LDA #$FE ; SET CHANNEL 00653 STA PRIREG0654 LDA #1 ; SET SECTOR TO "1"0655 STA SECREG ; ISSUE COMMAND0656 LDA #$8C ; SET SINGLE SECTOR READ0657 STA COMREG ; ISSUE COMMAND0658 BSR DLY0659 *0660 * THE FOLLOWING CODE TESTS THE STATUS OF THE0661 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT0662 * ZERO THEN IT WILL LOOP WAITING FOR "D7"0663 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT0664 * IS STILL A ONE THE BOOT OPERATION WILL0665 * BE STARTED OVER FROM THE BEGINING.0666 *0667 CLRB ;0668 DBOOT1 PSHS B ; $FB550669 CLRB ;0670 DBOOT2 TST CCREG0671 BPL DBOOT30672 DECB ;0673 BNE DBOOT20674 PULS B0675 DECB0676 BNE DBOOT10677 BRA DBOOT0678 DBOOT3 PULS B0679 LDA COMREG0680 BITA #$1C0681 BEQ DBOOT40682 RTS ;0683 *0684 *0685 DBOOT4 LDB #$DE0686 STB DRVREG0687 LDX #$C0000688 STX 10,U0689 TFR U,S ; $FB7B0690 RTI ;0691 ENDIF DMAFOPT0691 ENDIF DMAFOPT0692 *0693 IFD CF8OPT0694 *0695 * COMPACT FLASH BOOT0696 *0697 F9D5 8D 40 CFBOOT BSR WAITRDY0698 F9D7 86 E0 LDA #HEADLBA0699 F9D9 B7 E0 46 STA CF_HEAD0700 F9DC 8D 39 BSR WAITRDY0701 F9DE 86 01 LDA #FEAT8BIT0702 F9E0 B7 E0 41 STA CF_FEATURE0703 F9E3 86 EF LDA #CMDFEATURE0704 F9E5 B7 E0 47 STA CF_COMAND0705 F9E8 8D 2D BSR WAITRDY0706 *0707 * READ SECTORS FROM CF0708 *0709 F9EA 86 01 CFREAD LDA #$010710 F9EC B7 E0 42 STA CF_SECCNT0711 F9EF 4F CLRA0712 F9F0 B7 E0 43 STA CF_SECNUM0713 F9F3 B7 E0 44 STA CF_CYLLO0714 F9F6 B7 E0 45 STA CF_CYLHI0715 *0716 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE0717 F9FB B7 E0 47 STA CF_COMAND0718 F9FE 8D 17 BSR WAITRDY0719 FA00 8E C0 00 LDX #$C0000720 *0721 * READ LOOP0722 *0723 FA03 8D 21 RDLOOP BSR WAITDRQ0724 FA05 B6 E0 40 LDA CF_DATA0725 FA08 A7 80 STA ,X+0726 FA0A 8C C2 00 CMPX #$C2000727 FA0D 26 F4 BNE RDLOOP0728 *0729 FA0F 8E C0 00 LDX #$C0000730 FA12 AF 4A STX $0A,U0731 FA14 1F 34 TFR U,S0732 FA16 3B RTI0733 *0734 * WAIT UNTIL READY0735 *0736 FA17 B6 E0 47 WAITRDY LDA CF_STATUS0737 FA1A 85 80 BITA #BUSY0738 FA1C 26 F9 BNE WAITRDY0739 FA1E B6 E0 47 LDA CF_STATUS0740 FA21 85 40 BITA #DRDY0741 FA23 27 F2 BEQ WAITRDY0742 FA25 39 RTS0743 *0744 * WAIT FOR DATA REQUEST0745 *0746 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS0747 FA29 85 08 BITA #DRQ0748 FA2B 27 F9 BEQ WAITDRQ0749 FA2D 39 RTS0750 ENDIF CF8OPT0751 *0752 IFD IDEOPT0753 *0754 * XESS 16 BIT IDE BOOT0755 *0756 IDEBOOT LDD #AUXRESET0757 STD CF_AUX0758 LDD #AUXRSTREL0759 STD CF_AUX0760 LDD #HEADLBA0761 STD CF_HEAD0762 BSR WAITRDY0763 *0764 * READ SECTORS FROM CF0765 *0766 LDD #$010767 STD CF_SECCNT0768 CLRB0769 STD CF_SECNUM0770 STD CF_CYLLO0771 STD CF_CYLHI0772 *0773 LDB #CMDREAD ; IDE READ MULTIPLE0774 STD CF_COMAND0775 BSR WAITRDY0776 LDX #$C0000777 *0778 * READ LOOP0779 *0780 RDLOOP BSR WAITDRQ0781 LDD CF_DATA0782 STB ,X+0783 CMPX #$C1000784 BNE RDLOOP0785 *0786 LDX #$C0000787 STX $0A,U0788 TFR U,S0789 RTI0790 *0791 * WAIT UNTIL READY0792 *0793 WAITRDY LDD CF_STATUS0794 BITB #BUSY0795 BNE WAITRDY0796 LDD CF_STATUS0797 BITB #DRDY0798 BEQ WAITRDY0799 RTS0800 *0801 * WAIT FOR DATA REQUEST0802 *0803 WAITDRQ LDD CF_STATUS0804 BITB #DRQ0805 BEQ WAITDRQ0806 RTS0807 ENDIF IDEOPT0807 ENDIF IDEOPT0808 *0809 IFD RTCOPT0810 *0811 * CLOCK INTER FACE UTILITY0812 *0813 * TIME <Hours> <Minuits> <Seconds>0814 * If no argument is specified, the current time0815 * will be displayed.0816 *0817 * READ A REGISTER FROM THE COUNTER.0818 * The X Index rgister points to the register0819 * to be read. The Status Register is checked0820 * before and after the register is read before0821 * returning a value in accumulator A0822 *0823 RDCLK TST CLKSTA0824 BNE RDCLK0825 RDCLK1 LDA 0,X0826 TST CLKSTA0827 BNE RDCLK10828 RTS0829 *0830 * MAIN PROGRAM:0831 *0832 TIMSET LDX #COUNTR ; POINT TO TIMER0833 LBSR BYTE ; READ HOURS0834 BVS SHOWTM ; NO ARG, DISP TIME0835 STA HOUR,X0836 LBSR OUT1S0837 LBSR BYTE ; READ MINUITES0838 BVS SHOWTM0839 STA MINUIT,X0840 LBSR OUT1S0841 LBSR BYTE ; SECONDS.0842 BVS SHOWTM0843 STA SECOND,X0844 *0845 * DISPLAY CURRENT TIME0846 *0847 SHOWTM LBSR PCRLF0848 LDX #COUNTR+HOUR0849 LDB #30850 SHOWLP BSR RDCLK0851 LBSR OUT2H0852 LDA #':0853 LBSR OUTCH0854 LEAX -1,X0855 DECB0856 BNE SHOWLP0857 RTS0858 *0859 * INITIATE CLOCK.0860 * MASK INTERRUPTS.0861 *0862 CLKINZ CLR CINTCR ; MASK ALL INTERRUPTS0863 TST CINTSR ; CLEAR ANY INTERRUPTS0864 RTS0865 ENDIF RTCOPT0865 ENDIF RTCOPT0866 IFD DATOPT0867 *0868 ***** LRA LOAD REAL ADDRESS *****0869 *0870 * THE FOLLOWING CODE LOADS THE 20-BIT0871 * PHYSICAL ADDRESS OF A MEMORY BYTE0872 * INTO THE "A" AND "X" REGISTERS. THIS0873 * ROUTINE IS ENTERED WITH THE LOGICAL0874 * ADDRESS OF A MEMORY BYTE IN THE "IX"0875 * REGISTER. EXIT IS MADE WITH THE HIGH-0876 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL0877 * ADDRESS IN THE "A" REGISTER, AND THE0878 * LOW-ORDER 16-BITS OF THE 20-BIT0879 * PHYSICAL ADDRESS IN THE "IX" REGISTER.0880 * ALL OTHER REGISTERS ARE PRESERVED.0881 * THIS ROUTINE IS REQUIRED SINCE THE0882 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST0883 * PRESENT PHYSICAL ADDRESSES ON THE0884 * SYSTEM BUS.0885 *0886 FA2E 34 36 LRA PSHS A,B,X,Y ; PUSH REGISTERS ON STACK0887 FA30 A6 62 LDA 2,S ; GET MSB LOGICAL ADDR FRM X REG ON STACK0888 FA32 44 LSRA ;0889 FA33 44 LSRA ; ADJ FOR INDEXED INTO0890 FA34 44 LSRA ; CORRESPONDING LOCATION0891 FA35 44 LSRA ; IN LRA TABLE0892 FA36 10 8E DF D0 LDY #LRARAM ; LOAD LRA TABLE BASE ADDRESS0893 FA3A E6 A6 LDB A,Y ; GET PHYSICAL ADDR. DATA FROM LRA TABLE0894 FA3C 54 LSRB ; ADJ. REAL ADDR. TO REFLECT EXTENDED0895 FA3D 54 LSRB ; PHYSICAL ADDRESS.0896 FA3E 54 LSRB ; EXTENDED MS 4-BITS ARE RETURNED0897 FA3F 54 LSRB ; IN THE "A" ACCUMULATOR0898 FA40 E7 E4 STB ,S ; MS 4 BITS IN A ACCUM. STORED ON STACK0899 FA42 E6 A6 LDB A,Y ; LOAD REAL ADDRESS DATA FROM LRA TABLE0900 FA44 53 COMB ; COMP TO ADJ FOR PHYSICAL ADDR. IN X REG0901 FA45 58 ASLB ; ADJ DATA FOR RELOCATION IN X REG0902 FA46 58 ASLB ;0903 FA47 58 ASLB ; $FB970904 FA48 58 ASLB ;0905 FA49 A6 62 LDA 2,S ; GET MS BYTE OF LOGICAL ADDR.0906 FA4B 84 0F ANDA #$0F ; MASK MS NIBBLE OF LOGICAL ADDRESS0907 FA4D A7 62 STA 2,S ; SAVE IT IN X REG ON STACK0908 FA4F EA 62 ORB 2,S ; SET MS BYTE IN X REG TO ADJ PHY ADDR.0909 *0910 * PLUS LS NIBBLE OF LOGICAL ADDRESS0911 *0912 FA51 E7 62 STB 2,S ; SAVE AS LS 16 BITS OF PHY ADDR IN X REG ON STACK0913 FA53 35 B6 PULS A,B,X,Y,PC ; POP REGS. FROM STACK0914 ENDIF DATOPT0915 *0916 * DELAY LOOP0917 *0918 FA55 34 04 DLY PSHS B ; SAVE CONTENTS OF "B"0919 FA57 C6 20 LDB #$20 ; GET LOOP DELAY VALUE0920 FA59 5A SUB1 DECB ; SUBTRACT ONE FROM VALUE0921 FA5A 26 FD BNE SUB1 ; LOOP UNTIL ZERO0922 FA5C 35 84 PULS B,PC ; RESTORE CONTENTS OF "B"0923 * RTS ;0924 *0925 ***** "L" LOAD MIKBUG TAPE *****0926 *0927 FA5E BD FC E7 LOAD JSR ACINIZ0928 FA61 86 11 LDA #$11 ; LOAD 'DC1' CASS. READ ON CODE0929 FA63 17 02 68 LBSR OUTCH ; OUTPUT IT TO TERMINAL PORT0930 FA66 7F DF E2 CLR ECHO ; TURN OFF ECHO FLAG0931 FA69 17 02 2A LOAD1 LBSR ECHON ; INPUT 8 BIT BYTE WITH NO ECHO0932 FA6C 81 53 LOAD2 CMPA #'S ; IS IT AN "S", START CHARACTER ?0933 FA6E 26 F9 BNE LOAD1 ; IF NOT, DISCARD AND GET NEXT CHAR.0934 FA70 17 02 23 LBSR ECHON0935 FA73 81 39 CMPA #'9 ; IS IT A "9" , END OF FILE CHAR ?0936 FA75 27 3D BEQ LOAD21 ; IF SO, EXIT LOAD0937 FA77 81 31 CMPA #'1 ; IS IT A "1" , FILE LOAD CHAR ?0938 FA79 26 F1 BNE LOAD2 ; IF NOT, LOOK FOR START CHAR.0939 FA7B 17 01 A8 LBSR BYTE ; INPUT BYTE COUNT0940 FA7E 34 02 PSHS A ; PUSH COUNT ON STACK0941 FA80 29 26 BVS LODERR ; (V) C-CODE SET, ILLEGAL HEX0942 FA82 17 01 91 LBSR IN1ADR ; INPUT LOAD ADDRESS0943 FA85 29 21 BVS LODERR ; (V) C-CODE SET, ADDR NOT HEX0944 FA87 34 10 PSHS X ; PUSH ADDR ON STACK0945 FA89 E6 E0 LDB ,S+ ; LOAD MSB OF ADDR AS CHECKSUM BYTE0946 FA8B EB E0 ADDB ,S+ ; ADD LSB OF ADDR TO CHECKSUM0947 FA8D EB E4 ADDB ,S ; ADD BYTE COUNT BYTE TO CHECKSUM0948 FA8F 6A E4 DEC ,S ; $FC37 DECREMENT BYTE COUNT 2 TO BYPASS0949 FA91 6A E4 DEC ,S ; ADDRESS BYTES.0950 FA93 34 04 LOAD10 PSHS B ; PUSH CHECKSUM ON STACK0951 FA95 17 01 8E LBSR BYTE ; INPUT DATA BYTE (2 HEX CHAR)0952 FA98 35 04 PULS B ; POP CHECKSUM FROM STACK0953 FA9A 29 0C BVS LODERR ; (V) SET, DATA BYTE NOT HEX0954 FA9C 34 02 PSHS A ; PUSH DATA BYTE ON STACK0955 FA9E EB E0 ADDB ,S+ ; ADD DATA TO CHECKSUM, AUTO INC STACK0956 FAA0 6A E4 DEC ,S ; DECREMENT BYTE COUNT 10957 FAA2 27 05 BEQ LOAD16 ; IF BYTE COUNT ZERO, TEST CHECKSUM0958 FAA4 A7 80 STA ,X+ ; SAVE DATA BYTE IN MEMORY0959 FAA6 20 EB BRA LOAD10 ; GET NEXT DATA BYTE0960 FAA8 5F LODERR CLRB ; ERROR CONDITION, ZERO CHECKSUM ;0961 FAA9 35 02 LOAD16 PULS A ; ADJUST STACK (REMOVE BYTE COUNT)0962 FAAB C1 FF CMPB #$FF ; CHECKSUM OK?0963 FAAD 27 BA BEQ LOAD1 ; IF SO, LOAD NEXT LINE0964 FAAF 86 3F LDA #'? ; LOAD (?) ERROR INDICATOR0965 FAB1 17 02 1A LBSR OUTCH ; OUTPUT IT TO TERMINAL0966 FAB4 73 DF E2 LOAD21 COM ECHO ; TURN ECHO ON0967 FAB7 86 13 LDA #$13 ; $FC5F LOAD 'DC3' CASS. READ OFF CODE0968 FAB9 16 02 12 LBRA OUTCH ; OUTPUT IT0969 *0970 ***** "P" PUNCH MIKBUG TAPE *****0971 *0972 FABC 6F E2 PUNCH CLR ,-S ; CLEAR RESERVED BYTE ON STACK0973 FABE 17 01 4A LBSR IN2ADR ; GET BEGIN AND END ADDRESS0974 FAC1 34 30 PSHS X,Y ; SAVE ADDRESSES ON STACK0975 FAC3 29 4D BVS PUNEXT ; (V) C-CODE SET, EXIT PUNCH0976 FAC5 AC 62 CMPX 2,S ; COMPARE BEGIN TO END ADDR0977 FAC7 25 49 BCS PUNEXT ; IF BEGIN GREATER THAN END, EXIT PUNCH0978 FAC9 30 01 LEAX 1,X ; INCREMENT END ADDRESS0979 FACB AF E4 STX ,S ; STORE END ADDR ON STACK0980 FACD BD FC E7 JSR ACINIZ0981 FAD0 86 12 LDA #$12 ; LOAD 'DC2' PUNCH ON CODE0982 FAD2 17 01 F9 LBSR OUTCH ; OUTPUT IT TO TERMINAL0983 FAD5 EC E4 PUNCH2 LDD ,S ; LOAD END ADDR IN D-ACC0984 FAD7 A3 62 SUBD 2,S ; SUBTRACT BEGIN FROM END0985 FAD9 27 06 BEQ PUNCH3 ; SAME, PUNCH 32 BYTES DEFAULT0986 FADB 10 83 00 20 CMPD #$20 ; LESS THAN 32 BYTES?0987 FADF 23 02 BLS PUNCH4 ; PUNCH THAT MANY BYTES0988 FAE1 C6 20 PUNCH3 LDB #$20 ; LOAD BYTE COUNT OF 32.0989 FAE3 E7 64 PUNCH4 STB 4,S ; STORE ON STACK AS BYTE COUNT0990 FAE5 8E FE E2 LDX #MSG20 ; POINT TO MSG "S1"0991 FAE8 17 00 2F LBSR PSTRNG ; PRINT MSG0992 FAEB CB 03 ADDB #3 ; ADD 3 BYTES TO BYTE COUNT0993 FAED 1F 98 TFR B,A ; GET BYTE COUNT IN A-ACC TO PUNCH0994 FAEF 17 01 75 LBSR OUT2H ; OUTPUT BYTE COUNT0995 FAF2 AE 62 LDX 2,S ; LOAD BEGIN ADDRESS0996 FAF4 17 01 68 LBSR OUT4H ; PUNCH ADDRESS0997 FAF7 EB 62 ADDB 2,S ; ADD ADDR MSB TO CHECKSUM0998 FAF9 EB 63 ADDB 3,S ; ADD ADDR LSB TO CHECKSUM0999 FAFB EB 84 PUNCHL ADDB ,X ; ADD DATA BYTE TO CHECKSUM1000 FAFD A6 80 LDA ,X+ ; LOAD DATA BYTE TO PUNCH1001 FAFF 17 01 65 LBSR OUT2H ; OUTPUT DATA BYTE1002 FB02 6A 64 DEC 4,S ; DECREMENT BYTE COUNT1003 FB04 26 F5 BNE PUNCHL ; NOT DONE, PUNCH NEXT BYTE1004 FB06 53 COMB 1's ; COMPLIMENT CHECKSUM BYTE1005 FB07 1F 98 TFR B,A ; GET IT IN A-ACC TO PUNCH1006 FB09 17 01 5B LBSR OUT2H ; OUTPUT CHECKSUM BYTE1007 FB0C AF 62 STX 2,S ; SAVE X-REG IN STACK AS NEW PUNCH ADDR1008 FB0E AC E4 CMPX ,S ; COMPARE IT TO END ADDR1009 FB10 26 C3 BNE PUNCH2 ; $FCB5 PUNCH NOT DONE, CONT.1010 FB12 86 14 PUNEXT LDA #$14 ; LOAD 'DC4' PUNCH OFF CODE1011 FB14 17 01 B7 LBSR OUTCH ; OUTPUT IT1012 FB17 32 65 LEAS 5,S ; READJUST STACK POINTER1013 FB19 39 RTS ;1014 *1015 * PRINT STRING PRECEEDED BY A CR & LF.1016 *1017 FB1A 8D 02 PSTRNG BSR PCRLF ; PRINT CR/LF1018 FB1C 20 71 BRA PDATA ; PRINT STRING POINTED TO BY IX1019 *1020 * PCRLF1021 *1022 FB1E 34 10 PCRLF PSHS X ; SAVE IX1023 FB20 8E FE 93 LDX #MSG2+1 ; POINT TO MSG CR/LF + 3 NULS1024 FB23 17 00 69 LBSR PDATA ; PRINT MSG1025 FB26 35 90 PULS X,PC ; RESTORE IX & RETURN1026 *1027 * LONG BRANCHES TO COMMON ROUTINES1028 *1029 FB28 16 01 A1 JOUT1S LBRA OUT1S1030 FB2B 16 00 F8 JBYTE LBRA BYTE1031 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR1032 *1033 * ALTER "PC" PROGRAM COUNTER1034 *1035 FB31 17 00 91 ALTRPC LBSR PRTPC ; $FCF5 PRINT MSG " PC = "1036 FB34 8D F2 ALTPC1 BSR JOUT1S ; OUTPUT SPACE1037 FB36 8D F6 BSR JIN1ADR ; GET NEW CONTENTS FOR "PC"1038 FB38 29 02 BVS ALTPCD ; EXIT IF INVALID HEX1039 FB3A AF 4A STX 10,U ; POKE IN NEW CONTENTS1040 FB3C 39 ALTPCD RTS ;1041 *1042 * ALTER "U" USER STACK POINTER1043 *1044 FB3D 8D 61 ALTRU BSR PRTUS ; $FCCA PRINT MSG " US = "1045 FB3F 8D E7 BSR JOUT1S ; OUTPUT SPACE1046 FB41 8D EB BSR JIN1ADR ; GET NEW CONTENTS FOR "US"1047 FB43 29 02 BVS ALTUD ; EXIT IF INVALID HEX1048 FB45 AF 48 STX 8,U ; POKE IN NEW CONTENTS1049 FB47 39 ALTUD RTS ;1050 *1051 * ALTER "Y" INDEX REGISTER1052 *1053 FB48 8D 72 ALTRY BSR PRTIY ; PRINT MSG " IY = "1054 FB4A 8D DC BSR JOUT1S ; OUTPUT SPACE1055 FB4C 8D E0 BSR JIN1ADR ; GET NEW CONTENTS FOR "IY"1056 FB4E 29 02 BVS ALTYD ; EXIT IF INVALID HEX1057 FB50 AF 46 STX 6,U ; $F8F0 POKE IN NEW CONTENTS1058 FB52 39 ALTYD RTS ;1059 *1060 * ALTER "X" INDEX REGISTER1061 *1062 FB53 8D 5E ALTRX BSR PRTIX ; $FCE0 PRINT MSG " IX = "1063 FB55 8D D1 BSR JOUT1S ; OUTPUT SPACE1064 FB57 8D D5 BSR JIN1ADR1065 FB59 29 02 BVS ALTXD1066 FB5B AF 44 STX 4,U1067 FB5D 39 ALTXD RTS ;1068 *1069 * ALTER "DP" DIRECT PAGE REGISTER1070 *1071 FB5E 8D 49 ALTRDP BSR PRTDP ; $FCD5 PRINT MSG " DP = "1072 FB60 8D C6 BSR JOUT1S ; OUTPUT SPACE1073 FB62 8D C7 BSR JBYTE ; INPUT BYTE (2 HEX CHAR)1074 FB64 29 02 BVS ALTDPD1075 FB66 A7 43 STA 3,U1076 FB68 39 ALTDPD RTS ;1077 *1078 * ALTER "B" ACCUMULATOR1079 *1080 FB69 8D 6C ALTRB BSR PRTB ; $FD09 PRINT MSG " B = "1081 FB6B 8D BB BSR JOUT1S ; OUTPUT SPACE1082 FB6D 8D BC BSR JBYTE ; INPUT BYTE (2 HEX CHAR)1083 FB6F 29 02 BVS ALTBD1084 FB71 A7 42 STA 2,U1085 FB73 39 ALTBD RTS ; $F91C1086 *1087 * ALTER "A" ACCUMULATOR1088 *1089 FB74 8D 58 ALTRA BSR PRTA ; $FCFF RINT MSG " A = "1090 FB76 8D B0 BSR JOUT1S ; OUTPUT SPACE1091 FB78 8D B1 BSR JBYTE ; INPUT BYTE (2 HEX CHAR)1092 FB7A 29 02 BVS ALTAD1093 FB7C A7 41 STA 1,U1094 FB7E 39 ALTAD RTS ;1095 *1096 * ALTER "CC" REGISTER1097 *1098 FB7F 8D 5F ALTRCC BSR PRTCC ; $FD13 PRINT MSG " CC: "1099 FB81 8D A5 BSR JOUT1S ; OUTPUT SPACE1100 FB83 8D A6 BSR JBYTE ; INPUT BYTE (2 HEX CHAR)1101 FB85 29 04 BVS ALTCCD1102 FB87 8A 80 ORA #$80 ; SETS "E" FLAG IN PRINT LIST1103 FB89 A7 C4 STA ,U1104 FB8B 39 ALTCCD RTS ;1105 *1106 * PDATA1107 *1108 FB8C 17 01 3F PRINT LBSR OUTCH1109 FB8F A6 80 PDATA LDA ,X+ ; GET 1st CHAR. TO PRINT1110 FB91 81 04 CMPA #4 ; IS IT EOT?1111 FB93 26 F7 BNE PRINT ; IF NOT EOT PRINT IT1112 FB95 39 RTS ;1113 *1114 * PRINT REGISTERS1115 *1116 FB96 8E FE A5 PRTSP LDX #MSG10 ; POINT TO MSG "SP="1117 FB99 8D F4 BSR PDATA ; PRINT MSG1118 FB9B 1F 31 TFR U,X1119 FB9D 16 00 BF JOUT4H LBRA OUT4H1120 *1121 FBA0 8E FE B1 PRTUS LDX #MSG12 ; POINT TO MSG "US="1122 FBA3 8D EA BSR PDATA ; PRINT MSG1123 FBA5 AE 48 LDX 8,U1124 FBA7 20 F4 BRA JOUT4H1125 *1126 FBA9 8E FE C3 PRTDP LDX #MSG15 ; POINT TO MSG "DP="1127 FBAC 8D E1 BSR PDATA ; PRINT MSG1128 FBAE A6 43 LDA 3,U1129 FBB0 16 00 B4 JOUT2H LBRA OUT2H ; OUTPUT HEX BYTE AS ASCII1130 *1131 FBB3 8E FE BD PRTIX LDX #MSG14 ; POINT TO MSG "IX="1132 FBB6 8D D7 BSR PDATA ; PRINT MSG1133 FBB8 AE 44 LDX 4,U ; $FCE61134 FBBA 20 E1 BRA JOUT4H1135 *1136 FBBC 8E FE B7 PRTIY LDX #MSG13 ; POINT TO MSG "IY="1137 FBBF 8D CE BSR PDATA ; PRINT MSG1138 FBC1 AE 46 LDX 6,U1139 FBC3 20 D8 BRA JOUT4H1140 *1141 FBC5 8E FE AB PRTPC LDX #MSG11 ; POINT TO MSG "PC="1142 FBC8 8D C5 BSR PDATA ; PRINT MSG1143 FBCA AE 4A LDX 10,U1144 FBCC 20 CF BRA JOUT4H1145 *1146 FBCE 8E FE C9 PRTA LDX #MSG16 ; POINT TO MSG "A="1147 FBD1 8D BC BSR PDATA ; PRINT MSG1148 FBD3 A6 41 LDA 1,U1149 FBD5 20 D9 BRA JOUT2H ; OUTPUT HEX BYTE AS ASCII1150 *1151 FBD7 8E FE CE PRTB LDX #MSG17 ; POINT TO MSG "B="1152 FBDA 8D B3 BSR PDATA ; PRINT MSG1153 FBDC A6 42 LDA 2,U1154 FBDE 20 D0 BRA JOUT2H ; OUTPUT HEX BYTE AS ASCII1155 *1156 FBE0 8E FE D3 PRTCC LDX #MSG18 ; POINT TO MSG "CC:"1157 FBE3 8D AA BSR PDATA ; PRINT MSG1158 FBE5 A6 C4 LDA ,U1159 FBE7 8E FE DA LDX #MSG19 ; POINT TO MSG "EFHINZVC"1160 FBEA 16 00 90 LBRA BIASCI ; OUTPUT IN BINARY/ASCII FORMAT1161 *1162 * "R" DISPLAY REGISTERS1163 *1164 FBED 8E FE A1 REGSTR LDX #MSG5 ; POINT TO MSG " - "1165 FBF0 17 FF 27 LBSR PSTRNG ; PRINT MSG1166 FBF3 8D A1 BSR PRTSP ; $FCBF1167 FBF5 8D A9 BSR PRTUS ; $FCCA1168 FBF7 8D B0 BSR PRTDP ; $FCD51169 FBF9 8D B8 BSR PRTIX ; $FCE01170 FBFB 8D BF BSR PRTIY ; $FCEB1171 FBFD 8E FE A1 LDX #MSG5 ; POINT TO MSG " - "1172 FC00 17 FF 17 LBSR PSTRNG ; PRINT MSG1173 FC03 8D C0 BSR PRTPC ; $FCF51174 FC05 8D C7 BSR PRTA ; $FCFF1175 FC07 8D CE BSR PRTB ; $FD091176 FC09 20 D5 BRA PRTCC ; $FD131177 *1178 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE1179 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.1180 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".1181 * THE SECOND IS RETURNED IN "IX". THE "V" BIT1182 * IN THE C-CODE REG. IS SET IF AN INVALID HEX1183 * ADDRESS IS INPUT.1184 *1185 FC0B 8D 09 IN2ADR BSR IN1ADR ; GET FIRST ADDRESS1186 FC0D 29 4D BVS NOTHEX ; EXIT IF NOT VALID HEX1187 FC0F 1F 12 TFR X,Y ; SAVE FIRST ADDR. IN "IY"1188 FC11 86 2D LDA #'-1189 FC13 17 00 B8 LBSR OUTCH ; PRINT " - "1190 *1191 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE1192 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE1193 * ADDRESS IS RETURNED IN THE "X" REGISTER.1194 *1195 FC16 8D 0E IN1ADR BSR BYTE ; INPUT BYTE (2 HEX CHAR)1196 FC18 29 42 BVS NOTHEX ; EXIT IF NOT VALID HEX1197 FC1A 1F 01 TFR D,X1198 FC1C 8D 08 BSR BYTE ; INPUT BYTE (2 HEX CHAR)1199 FC1E 29 3C BVS NOTHEX1200 FC20 34 10 PSHS X1201 FC22 A7 61 STA 1,S1202 FC24 35 90 PULS X,PC1203 *1204 ***** INPUT BYTE (2 HEX CHAR.) *****1205 *1206 FC26 8D 11 BYTE BSR INHEX ; GET HEX LEFT1207 FC28 29 32 BVS NOTHEX ; EXIT IF NOT VALID HEX1208 FC2A 48 ASLA ;1209 FC2B 48 ASLA ;1210 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE1211 FC2D 48 ASLA ;1212 FC2E 1F 89 TFR A,B ; PUT HEXL IN "B"1213 FC30 8D 07 BSR INHEX ; GET HEX RIGHT1214 FC32 29 28 BVS NOTHEX ; EXIT IF NOT VALID HEX1215 FC34 34 04 PSHS B ; PUSH HEXL ON STACK1216 FC36 AB E0 ADDA ,S+ ; ADD HEXL TO HEXR AND ADJ. STK1217 FC38 39 RTS ; RETURN WITH HEX L&R IN "A"1218 *1219 *1220 FC39 8D 5B INHEX BSR ECHON ; INPUT ASCII CHAR.1221 FC3B 81 30 CMPA #'0 ; IS IT > OR = "0" ?1222 FC3D 25 1D BCS NOTHEX ; IF LESS IT AIN'T HEX1223 FC3F 81 39 CMPA #'9 ; IS IT < OR = "9" ?1224 FC41 22 03 BHI INHEXA ; IF > MAYBE IT'S ALPHA1225 FC43 80 30 SUBA #$30 ; ASCII ADJ. NUMERIC1226 FC45 39 RTS ;1227 *1228 *1229 FC46 81 41 INHEXA CMPA #'A ; IS IT > OR = "A"1230 FC48 25 12 BCS NOTHEX ; IF LESS IT AIN'T HEX1231 FC4A 81 46 CMPA #'F ; IS IT < OR = "F" ?1232 FC4C 22 03 BHI INHEXL ; IF > IT AIN'T HEX1233 FC4E 80 37 SUBA #'A-10 ; ($37) ASCII ADJ. ALPHA1234 FC50 39 RTS ;1235 *1236 FC51 81 61 INHEXL CMPA #'a ; IS IT > OR = "a"1237 FC53 25 07 BCS NOTHEX ; IF LESS IT AIN'T HEX1238 FC55 81 66 CMPA #'f ; IS IT < "f"1239 FC57 22 03 BHI NOTHEX ; IF > IT AIN'T HEX1240 FC59 80 57 SUBA #'a-10 ; ($57) ADJUST TO LOWER CASE1241 FC5B 39 RTS ;1242 *1243 *1244 FC5C 1A 02 NOTHEX ORCC #2 ; SET (V) FLAG IN C-CODES REGISTER1245 FC5E 39 RTS ;1246 *1247 *1248 FC5F 34 10 OUT4H PSHS X ; PUSH X-REG. ON THE STACK1249 FC61 35 02 PULS A ; POP MS BYTE OF X-REG INTO A-ACC.1250 FC63 8D 02 BSR OUTHL ; OUTPUT HEX LEFT1251 FC65 35 02 PULS A ; POP LS BYTE OF X-REG INTO A-ACC.1252 FC67 OUTHL EQU *1253 FC67 34 02 OUT2H PSHS A ; SAVE IT BACK ON STACK1254 FC69 44 LSRA ; CONVERT UPPER HEX NIBBLE TO ASCII1255 FC6A 44 LSRA ;1256 FC6B 44 LSRA ;1257 FC6C 44 LSRA ;1258 FC6D 8D 04 BSR XASCII ; PRINT HEX NIBBLE AS ASCII1259 FC6F 35 02 OUTHR PULS A ; CONVERT LOWER HEX NIBBLE TO ASCII1260 FC71 84 0F ANDA #$0F ; STRIP LEFT NIBBLE1261 FC73 8B 30 XASCII ADDA #$30 ; ASCII ADJ1262 FC75 81 39 CMPA #$39 ; IS IT < OR = "9" ?1263 FC77 2F 02 BLE OUTC ; IF LESS, OUTPUT IT1264 FC79 8B 07 ADDA #7 ; IF > MAKE ASCII LETTER1265 FC7B 20 51 OUTC BRA OUTCH ; OUTPUT CHAR1266 *1267 * BINARY / ASCII --- THIS ROUTINE1268 * OUTPUTS A BYTE IN ENHANCED1269 * BINARY FORMAT. THE ENHANCEMENT1270 * IS DONE BY SUBSTITUTING ASCII1271 * LETTERS FOR THE ONES IN THE BYTE.1272 * THE ASCII ENHANCEMENT LETTERS1273 * ARE OBTAINED FROM THE STRING1274 * POINTED TO BY THE INDEX REG. "X".1275 *1276 FC7D 34 02 BIASCI PSHS A ; SAVE "A" ON STACK1277 FC7F C6 08 LDB #8 ; PRESET LOOP# TO BITS PER BYTE1278 FC81 A6 80 OUTBA LDA ,X+ ; GET LETTER FROM STRING1279 FC83 68 E4 ASL ,S ; TEST BYTE FOR "1" IN B71280 FC85 25 02 BCS PRTBA ; IF ONE PRINT LETTER1281 FC87 86 2D LDA #'- ; IF ZERO PRINT "-"1282 FC89 8D 43 PRTBA BSR OUTCH ; PRINT IT1283 FC8B 8D 3F BSR OUT1S ; PRINT SPACE1284 FC8D 5A DECB ; SUB 1 FROM #BITS YET TO PRINT1285 FC8E 26 F1 BNE OUTBA1286 FC90 35 82 PULS A,PC1287 *1288 IFD EXTOPT1289 *1290 * EXTENDED USER COMMANDS1291 *1292 FC92 6E 9F F0 00 USRCMD JMP [MONEXT+EXTCMD]1293 ENDIF EXTOPT1294 *1295 *1296 FC96 7D DF E2 ECHON TST ECHO ; IS ECHO REQUIRED ?1297 FC99 27 06 BEQ INCH ; ECHO NOT REQ. IF CLEAR1298 *1299 * INCHE1300 *1301 * GETS CHARACTER FROM TERMINAL AND1302 * ECHOS SAME. THE CHARACTER IS RETURNED1303 * IN THE "A" ACCUMULATOR WITH THE PARITY1304 * BIT MASKED OFF. ALL OTHER REGISTERS1305 * ARE PRESERVED.1306 *1307 FC9B 8D 04 INCHE BSR INCH ; GET CHAR FROM TERMINAL1308 FC9D 84 7F ANDA #$7F ; STRIP PARITY FROM CHAR.1309 FC9F 20 2D BRA OUTCH ; ECHO CHAR TO TERMINAL1310 *1311 * INCH1312 *1313 * GET CHARACTER FROM TERMINAL. RETURN1314 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE1315 * ALL OTHER REGISTERS. THE INPUT CHARACTER1316 * IS 8 BITS AND IS NOT ECHOED.1317 *1318 *1319 FCA1 34 10 INCH PSHS X ; SAVE IX1320 IFD HFCOPT1321 LDA #$11 ; SET RTS* LOW, REQUEST FAR END TO TX1322 STA [CPORT]1323 ENDIF HFCOPT1323 ENDIF HFCOPT1324 FCA3 BE DF E0 GETSTA LDX CPORT ; POINT TO TERMINAL PORT1325 FCA6 A6 84 LDA ,X ; FETCH PORT STATUS1326 FCA8 85 01 BITA #1 ; TEST READY BIT, RDRF ?1327 IFD PS2OPT1328 FCAA 26 09 BNE GETST11329 FCAC 8E E0 20 LDX #PS2KBD1330 FCAF A6 84 LDA ,X1331 FCB1 85 01 BITA #11332 ENDIF PS2OPT1333 FCB3 27 EE BEQ GETSTA ; IF NOT RDY, THEN TRY AGAIN1334 FCB5 GETST1 EQU *1335 IFD HFCOPT1336 LDA #$51 ; SET RTS* HIGH, STOP FAR END FROM TXING, UNTIL NEXT INPUT1337 STA [CPORT]1338 ENDIF HFCOPT1338 ENDIF HFCOPT1339 FCB5 A6 01 LDA 1,X ; FETCH CHAR1340 FCB7 35 90 PULS X,PC ; RESTORE IX1341 *1342 * INCHEK1343 *1344 * CHECK FOR A CHARACTER AVAILABLE FROM1345 * THE TERMINAL. THE SERIAL PORT IS CHECKED1346 * FOR READ READY. ALL REGISTERS ARE1347 * PRESERVED, AND THE "Z" BIT WILL BE1348 * CLEAR IF A CHARACTER CAN BE READ.1349 *1350 *1351 FCB9 34 02 INCHEK PSHS A ; SAVE A ACCUM1352 IFD HFCOPT1353 LDA #$11 ; SET RTS* LOW, REQUEST FAR END TO TX1354 STA [CPORT]1355 ENDIF HFCOPT1355 ENDIF HFCOPT1356 FCBB A6 9F DF E0 LDA [CPORT] ; FETCH PORT STATUS1357 FCBF 85 01 BITA #1 ; TEST READY BIT, RDRF ?1358 IFD PS2OPT1359 FCC1 26 05 BNE INCHEK11360 FCC3 B6 E0 20 LDA PS2KBD1361 FCC6 85 01 BITA #1 ; TEST READY BIT< RDRF ?1362 ENDIF PS2OPT1363 FCC8 35 82 INCHEK1 PULS A,PC ; RESTORE A ACCUM.1364 *1365 FCCA 8D 00 OUT2S BSR OUT1S ; OUTPUT 2 SPACES1366 FCCC 86 20 OUT1S LDA #$20 ; OUTPUT 1 SPACE1367 *1368 *1369 * OUTCH1370 *1371 * OUTPUT CHARACTER TO TERMINAL.1372 * THE CHAR. TO BE OUTPUT IS1373 * PASSED IN THE A REGISTER.1374 * ALL REGISTERS ARE PRESERVED.1375 *1376 OUTCH IFD VDUOPT1377 FCCE 8D 49 BSR VOUTCH1378 ENDIF VDUOPT1379 IFD DG640OPT1380 BSR VOUTCH1381 ENDIF DG640OPT1381 ENDIF DG640OPT1382 FCD0 34 12 AOUTCH PSHS A,X ; SAVE A ACCUM AND IX1383 FCD2 BE DF E0 LDX CPORT ; GET ADDR. OF TERMINAL1384 FCD5 A6 84 FETSTA LDA ,X ; FETCH PORT STATUS1385 FCD7 85 02 BITA #2 ; TEST TDRE, OK TO XMIT ?1386 FCD9 27 FA BEQ FETSTA ; IF NOT LOOP UNTIL RDY1387 FCDB 85 08 BITA #8 ; CLEAR TO SEND ?1388 FCDD 26 F6 BNE FETSTA ; NO, LOOP UNTIL CLEAR1389 FCDF 35 02 PULS A ; GET CHAR. FOR XMIT1390 FCE1 A7 01 STA 1,X ; XMIT CHAR.1391 FCE3 35 90 PULS X,PC ; RESTORE IX1392 *1393 * IO INITIALIZATION1394 *1395 FCE5 IOINIZ EQU *1396 IFD VDUOPT1397 FCE5 8D 13 BSR VINIZ1398 ENDIF VDUOPT1399 IFD DG640OPT1400 BSR VINIZ1401 ENDIF DG640OPT1401 ENDIF DG640OPT1402 FCE7 BE DF E0 ACINIZ LDX CPORT ; POINT TO CONTROL PORT ADDRESS1403 FCEA 86 03 LDA #3 ; RESET ACIA PORT CODE1404 FCEC A7 84 STA ,X ; STORE IN CONTROL REGISTER1405 FCEE 86 51 LDA #$51 ; SET 8 DATA, 2 STOP AN 0 PARITY RTS* HIGH1406 FCF0 A7 84 STA ,X ; STORE IN CONTROL REGISTER1407 FCF2 6D 01 TST 1,X ; ANYTHING IN DATA REGISTER?1408 FCF4 86 FF LDA #$FF ; TURN ON ECHO FLAG1409 FCF6 B7 DF E2 STA ECHO1410 FCF9 39 RTS1411 *1412 IFD VDUOPT1413 *1414 ***************************************************1415 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *1416 * *1417 * 80 x 25 Characters1418 *1419 ***************************************************1420 *1421 ***************************************************1422 * INITIALIZE EMULATOR *1423 ***************************************************1424 *1425 FCFA 8E E0 30 VINIZ LDX #VDU1426 FCFD CC 00 00 LDD #01427 FD00 FD DF FB STD COLADX ; AND ROWADX1428 FD03 A7 02 STA VDUCOL,X1429 FD05 E7 03 STB VDUROW,X1430 FD07 E7 04 STB VDUOFF,X1431 FD09 FD DF FD STD NEWROW ; AND ESCFLG1432 FD0C C6 02 LDB #$021433 FD0E E7 01 STB VDUATT,X1434 FD10 7F DF FE CLR ESCFLG1435 FD13 86 1B LDA #$1B ; SEND ESCAPE1436 FD15 8D 02 BSR VOUTCH1437 FD17 86 59 LDA #'Y ; CLEAR TO END OF SCREEN1438 *1439 ** VIDEO OUTPUT ROUTINE1440 *1441 FD19 34 16 VOUTCH PSHS A,B,X ; SAVE REGISTERS1442 FD1B 8E E0 30 LDX #VDU ; POINT TO VDU REGISTERS1443 *1444 ** CHECK FOR ESCAPE SEQUENCE1445 *1446 FD1E 7D DF FE TST ESCFLG ; ESCAPE ACTIVE?1447 FD21 27 04 BEQ SOROU1 ; BRANCH IF NOT1448 FD23 8D 60 BSR ESCAPE ; ELSE DO ESCAPE1449 FD25 20 0D BRA RETURN ; AND RETURN1450 *1451 ** CHECK FOR CONTROL CHARACTERS1452 *1453 FD27 81 20 SOROU1 CMPA #$20 ; CONTROL CODES?1454 FD29 24 04 BHS SOROU21455 FD2B 8D 09 BSR CONTRL ; BRANCH IF SO1456 FD2D 20 05 BRA RETURN1457 *1458 ** OUTPUT TEXT CHARACTER1459 *1460 FD2F A7 84 SOROU2 STA VDUCHR,X ; DISPLAY CHARACTER1461 FD31 17 00 AF LBSR NEWCOL ; UPDATE COLUMN1462 *1463 ** DISPLAY CURSOR AND RETURN1464 *1465 FD34 35 96 RETURN PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN1466 *1467 ***************************************************1468 * CONTROL CODE HANDLERS *1469 ***************************************************1470 *1471 FD36 81 08 CONTRL CMPA #$08 ; CTRL H - BACKSPACE ?1472 FD38 27 34 BEQ BACKSP1473 FD3A 81 1B CMPA #$1B ; ESCAPE SEQUENCE?1474 FD3C 27 5A BEQ SETESC1475 FD3E 81 1A CMPA #$1A ; CTRL Z - Clear Screen1476 FD40 10 27 00 7C LBEQ CLRSCR1477 FD44 81 16 CMPA #$16 ; CTRL ^ - Home1478 FD46 27 38 BEQ HOME1479 FD48 81 0D CMPA #$0D ; CTRL M - RETURN?1480 FD4A 10 27 00 89 LBEQ CRETN1481 FD4E 81 0C CMPA #$0C ; CTRL L - CHAR RIGHT1482 FD50 27 24 BEQ CHRIGHT1483 FD52 81 0B CMPA #$0B ; CTRL K - MOVE UP ONE LINE1484 FD54 27 0F BEQ LINEUP1485 FD56 81 0A CMPA #$0A ; CTRL J - LINE FEED1486 FD58 26 45 BNE RETESC ; NONE OF THESE, RETURN1487 *1488 ***************************************** LINE FEED1489 *1490 FD5A FC DF FB LINEFD LDD COLADX ; GET CURRENT COLUMN AND ROW1491 FD5D 5C INCB ; BUMP ROW1492 FD5E C1 19 CMPB #NUMLIN ; SCROLL TIME?1493 FD60 26 79 BNE NEWCUR ; POSITION CURSOR IF NOT1494 FD62 16 00 8F LBRA SCROLL ; ELSE SCROLL IT1495 *1496 ***************************************** LINE FEED1497 *1498 FD65 FC DF FB LINEUP LDD COLADX ; GET CURRENT COLUMN AND ROW1499 FD68 5D TSTB ; AT TOP OF SCREEN ?1500 FD69 27 34 BEQ RETESC ; Yes, Ignore1501 FD6B 5A DECB ; No, Decrement ROW1502 FD6C 20 6D BRA NEWCUR ; POSITION CURSOR1503 *1504 *********************************** BACK SPACE1505 *1506 FD6E B6 DF FB BACKSP LDA COLADX1507 FD71 27 2C BEQ RETESC ; RETURN1508 FD73 4A DECA1509 FD74 20 62 BRA POSCOL ; POSITION CURSOR1510 *1511 *********************************** CURSOR RIGHT1512 *1513 FD76 B6 DF FB CHRIGHT LDA COLADX1514 FD79 4C INCA1515 FD7A 81 50 CMPA #LINLEN1516 FD7C 27 21 BEQ RETESC1517 FD7E 20 58 BRA POSCOL1518 *1519 *********************************** CURSOR RIGHT1520 *1521 FD80 CC 00 00 HOME LDD #0 ; HOME - POSITION TOP OF SCREEN1522 FD83 20 56 BRA NEWCUR1523 *1524 ***************************************************1525 * ESCAPE HANDLERS *1526 ***************************************************1527 *1528 FD85 F6 DF FE ESCAPE LDB ESCFLG ; GET FLAG1529 FD88 C1 3D CMPB #'= ; SETTING CURSOR?1530 FD8A 27 14 BEQ ESCCUR ; BRANCH IF SO1531 FD8C 81 59 CMPA #'Y ; CLEAR TO END OF SCREEN?1532 FD8E 27 6E BEQ ESCCLS1533 FD90 81 54 CMPA #'T ; CLEAR TO END OF LINE?1534 FD92 27 31 BEQ ESCCLL1535 FD94 81 3D CMPA #'= ; STARTING CURSOR SET?1536 FD96 26 04 BNE CLRESC ; BRANCH IF NOT1537 *1538 ***************************** START ESCAPE SEQUENCE1539 *1540 FD98 B7 DF FE SETESC STA ESCFLG ; ELSE START CURSORING1541 FD9B 39 RTS ; AND RETURN1542 *1543 FD9C 7F DF FE CLRESC CLR ESCFLG ; NO OTHERS SUPPORTED1544 FD9F 39 RETESC RTS ; SO RETURN1545 *1546 ********************************* SET SCREEN CURSOR1547 *1548 FDA0 7D DF FD ESCCUR TST NEWROW ; ROW SET?1549 FDA3 26 04 BNE ESCCU1 ; BRANCH IF SO1550 FDA5 B7 DF FD STA NEWROW ; ELSE SET NEW ROW1551 FDA8 39 RTS ; AND RETURN1552 *1553 FDA9 7F DF FE ESCCU1 CLR ESCFLG1554 FDAC 80 20 SUBA #$20 ; ADJUST COLUMN ADDRESS1555 FDAE 81 4F CMPA #LINLEN-1 ;CHECK FOR ACCEPTABLE COLUM1556 FDB0 22 ED BHI RETESC ; NOT OK, DO NOTHING1557 *1558 FDB2 F6 DF FD ESCCU2 LDB NEWROW1559 FDB5 7F DF FD CLR NEWROW1560 FDB8 C0 20 SUBB #$20 ; ADJUST TO ROW ADDRESS1561 FDBA C1 18 CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW1562 FDBC 22 E1 BHI RETESC ; ELSE RETURN DOING NOTHING1563 FDBE 20 1B BRA NEWCUR ; GO SET NEW CURSOR IF SO1564 *1565 ****************** CLEAR FROM CURSOR TO END OF LINE1566 *1567 FDC0 CC 00 00 CLRSCR LDD #0 ; CLEAR FROM TOP OF SCREEN1568 FDC3 8D 16 BSR NEWCUR1569 FDC5 B6 DF FB ESCCLL LDA COLADX1570 FDC8 C6 20 LDB #$20 ; AND CLEAR CHAR1571 FDCA E7 84 ESCCL1 STB VDUCHR,X ; DISPLAY TEXT1572 FDCC 4C INCA1573 FDCD A7 02 STA VDUCOL,X1574 FDCF 81 50 CMPA #LINLEN ; UNTIL END OF LINE1575 FDD1 26 F7 BNE ESCCL11576 FDD3 7F DF FE CLR ESCFLG1577 FDD6 39 RTS1578 *1579 *********************************** CARRIAGE RETURN1580 *1581 FDD7 4F CRETN CLRA ; SET COLUMN ZERO1582 FDD8 F6 DF FC POSCOL LDB ROWADX ; GET CURRENT ROW1583 *1584 *********** GENERATE NEW CURSOR POSITION AND RETURN1585 *1586 FDDB FD DF FB NEWCUR STD COLADX ; SAVE NEW ROW AND COLUMN1587 FDDE A7 02 STA VDUCOL,X ; SET NEW COLUMN1588 FDE0 E7 03 STB VDUROW,X ; SET NEW ROW1589 FDE2 39 RTS ; AND RETURN1590 *1591 ********************* UPDATE CURRENT COLUMN AND ROW1592 *1593 FDE3 FC DF FB NEWCOL LDD COLADX ; GET ROW AND COLUMN1594 FDE6 4C INCA ; BUMP COLUMN1595 FDE7 81 50 CMPA #LINLEN ; ROLL?1596 FDE9 26 F0 BNE NEWCUR ; BRANCH IF NOT1597 FDEB 4F CLRA ; ELSE RESET TO ZERO1598 FDEC 5C INCB ; AND BUMP ROW1599 FDED C1 19 CMPB #NUMLIN1600 FDEF 26 EA BNE NEWCUR1601 FDF1 5A DECB ; BOTTOM ROW1602 FDF2 8D E7 BSR NEWCUR1603 *1604 ********************************* SCROLL THE SCREEN1605 *1606 FDF4 E6 04 SCROLL LDB VDUOFF,X1607 FDF6 5C INCB1608 FDF7 C1 19 CMPB #NUMLIN1609 FDF9 25 01 BLO SCROL11610 FDFB 5F CLRB1611 FDFC E7 04 SCROL1 STB VDUOFF,X1612 *1613 **************** CLEAR FROM CURSOR TO END OF SCREEN1614 *1615 FDFE F6 DF FB ESCCLS LDB COLADX ; GET CURSOR1616 FE01 86 20 LDA #$20 ; GET A SPACE1617 FE03 F7 DF FB ESCCLS1 STB COLADX1618 FE06 E7 02 STB VDUCOL,X1619 FE08 A7 84 STA VDUCHR,X1620 FE0A 5C INCB1621 FE0B C1 50 CMPB #LINLEN1622 FE0D 26 F4 BNE ESCCLS11623 *1624 FE0F F6 DF FC LDB ROWADX1625 FE12 5C INCB1626 FE13 C1 19 CMPB #NUMLIN1627 FE15 27 08 BEQ ESCCLS21628 FE17 F7 DF FC STB ROWADX1629 FE1A E7 03 STB VDUROW,X1630 FE1C 5F CLRB1631 FE1D 20 E4 BRA ESCCLS11632 *1633 FE1F 5F ESCCLS2 CLRB1634 FE20 F7 DF FB STB COLADX1635 FE23 E7 02 STB VDUCOL,X1636 FE25 F7 DF FE STB ESCFLG1637 FE28 39 RTS1638 ENDIF VDUOPT1639 *1640 IFD DG640OPT1641 ***************************************************1642 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *1643 * *1644 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *1645 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *1646 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *1647 * 16x64 BOARD). *1648 ***************************************************1649 *1650 ***************************************************1651 * INITIALIZE EMULATOR *1652 ***************************************************1653 *1654 VINIZ LDX #01655 STX COLADX ; AND ROWADX1656 STX NEWROW ; AND ESCFLG1657 LDX #SCREEN ; POINT TO SCREEN1658 STX CURSOR ; SET PROGRAM CURSOR1659 LDA #$1B ; SEND ESCAPE1660 BSR VOUTCH1661 LDA #'Y ; CLEAR TO END OF SCREEN1662 *1663 ** VIDEO OUTPUT ROUTINE1664 *1665 VOUTCH PSHS A,B,X ; SAVE REGISTERS1666 *1667 ** CLEAR CURSOR1668 *1669 LDX CURSOR1670 LDB 0,X1671 ANDB #$7F1672 STB 0,X1673 *1674 ** CHECK FOR ESCAPE SEQUENCE1675 *1676 TST ESCFLG ; ESCAPE ACTIVE?1677 BEQ SOROU1 ; BRANCH IF NOT1678 BSR ESCAPE ; ELSE DO ESCAPE1679 BRA RETURN ; AND RETURN1680 *1681 ** CHECK FOR CONTROL CHARACTERS1682 *1683 SOROU1 CMPA #$20 ; CONTROL CODES?1684 BHS SOROU21685 BSR CONTRL ; BRANCH IF SO1686 BRA RETURN1687 *1688 ** OUTPUT TEXT CHARACTER1689 *1690 SOROU2 LDX CURSOR ; ELSE GET CURSOR1691 STA 0,X ; DISPLAY CHARACTER1692 LBSR NEWCOL ; UPDATE COLUMN1693 *1694 ** DISPLAY CURSOR AND RETURN1695 *1696 RETURN LDX CURSOR ; AND DISPLAY IT1697 LDB ,X1698 ORB #$80 ; WITH REVID1699 STB ,X1700 PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN1701 *1702 ***************************************************1703 * CONTROL CODE HANDLERS *1704 ***************************************************1705 *1706 CONTRL CMPA #$08 ; CTRL H - BACKSPACE ?1707 LBEQ BACKSP1708 CMPA #$1B ; ESCAPE SEQUENCE?1709 LBEQ SETESC1710 CMPA #$D ; CTRL M - RETURN?1711 LBEQ CRETN1712 CMPA #$0A ; CTRL J - LINE FEED1713 BNE RETESC ; NONE OF THESE, RETURN1714 *1715 ***************************************** LINE FEED1716 *1717 LINEFD LDD COLADX ; GET CURRENT COLUMN AND ROW1718 INCB ; BUMP ROW1719 CMPB #NUMLIN ; SCROLL TIME?1720 LBNE NEWCUR ; POSITION CURSOR IF NOT1721 LBRA SCROLL ; ELSE SCROLL IT1722 *1723 ***************************************** LINE FEED1724 *1725 LINEUP LDD COLADX ; GET CURRENT COLUMN AND ROW1726 TSTB ; AT TOP OF SCREEN ?1727 BEQ RETESC ; YES, RETURN1728 DECB ; NO, DECREMENT ROW1729 LBRA NEWCUR ; POSITION CURSOR1730 *1731 *********************************** BACK SPACE1732 *1733 BACKSP LDA COLADX ; GET CURRENT COLUMN AND ROW1734 BEQ RETESC ; IF AT TOP LEFT CORNER RETURN1735 DECA ; OTHERWISE BACK STEP ONE CHARACTER1736 LBRA POSCOL ; POSITION CURSOR1737 *1738 *********************************** CURSOR RIGHT1739 *1740 CHRIGHT LDA COLADX ; GET CURRENT COLUMN AND ROW1741 INCA ; MOVE RIGHT ONE CHARACTER1742 CMPA #LINLEN ; ARE WE AT THE END OF THE LINE ?1743 BEQ RETESC ; YES, RETURN1744 LBRA POSCOL ; NO, POSITION CURSOR1745 *1746 ***************************************************1747 * ESCAPE HANDLERS *1748 ***************************************************1749 *1750 ESCAPE LDB ESCFLG ; ARE WE IN AN ESCAPE SEQUENCE ?1751 CMPB #'= ; ARE WE SETTING CURSOR?1752 BEQ ESCCUR ; YES BRANCH TO SET CURSOR1753 CMPA #'Y ; CLEAR TO END OF SCREEN?1754 LBEQ ESCCLS ; YES, CLEAR SCREEN1755 CMPA #'T ; CLEAR TO END OF LINE?1756 BEQ ESCCLL ; YES, CLEAR LINE1757 CMPA #'E ; INSERT LINE?1758 BEQ ESCINL1759 CMPA #'R ; DELETE LINE?1760 BEQ ESCDLL1761 CMPA #'= ; STARTING CURSOR SET?1762 BNE CLRESC ; BRANCH IF NOT1763 *1764 ***************************** START ESCAPE SEQUENCE1765 *1766 SETESC STA ESCFLG ; ELSE START CURSORING1767 RTS ; AND RETURN1768 *1769 CLRESC CLR ESCFLG ; NO OTHERS SUPPORTED1770 RETESC RTS ; SO RETURN1771 *1772 ********************************* SET SCREEN CURSOR1773 *1774 ESCCUR TST NEWROW ; ROW SET?1775 BNE ESCCU1 ; BRANCH IF SO1776 STA NEWROW ; ELSE SET NEW ROW1777 RTS ; AND RETURN1778 *1779 ESCCU1 CLR ESCFLG1780 SUBA #$20 ; ADJUST COLUMN ADDRESS1781 CMPA #LINLEN-1 ; CHECK FOR ACCEPTABLE COLUM1782 BHI RETESC ; NOT OK, DO NOTHING1783 *1784 ESCCU2 LDB NEWROW1785 CLR NEWROW1786 SUBB #$20 ; ADJUST TO ROW ADDRESS1787 CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW1788 BHI RETESC ; ELSE RETURN DOING NOTHING1789 BRA NEWCUR ; GO SET NEW CURSOR IF SO1790 *1791 *************************** DELETE LINE FROM SCREEN1792 *1793 ESCDLL BSR CRETN ; GO COL. ZERO1794 LDB ROWADX1795 CMPB #NUMLIN-11796 BEQ SCROL31797 BRA SCROL1 ; AND DELETE THIS LINE1798 *1799 *************************** INSERT LINE INTO SCREEN1800 *1801 ESCINL BSR CRETN ; GO TO COL. ZERO1802 LDB ROWADX1803 CMPB #NUMLIN-11804 BEQ ESCCLL1805 *1806 ** SCROLL SCREEN DOWN FROM CURSOR1807 *1808 LDX #SCREEN+SCNLEN-LINLEN1809 ESCIN0 LDA ,-X1810 STA LINLEN,X1811 LDA SCNLEN,X1812 STA SCNLEN+LINLEN,X1813 CMPX CURSOR1814 BNE ESCIN01815 *1816 ****************** CLEAR FROM CURSOR TO END OF LINE1817 *1818 ESCCLL LDA COLADX ; GET CURRENT COLUMN1819 LDX CURSOR ; GET CURSOR1820 LDB #$20 ; AND CLEAR CHAR1821 ESCLL1 STB SCNLEN,X ; CLEAR ATTRIBUTE1822 STB ,X+ ; CLEAR TEXT1823 INCA1824 CMPA #LINLEN ; UNTIL END OF LINE1825 BNE ESCLL11826 CLR ESCFLG1827 RTS1828 *1829 *********************************** CARRIAGE RETURN1830 *1831 CRETN CLRA ; SET COLUMN ZERO1832 POSCOL LDB ROWADX ; GET CURRENT ROW1833 *1834 *********** GENERATE NEW CURSOR POSITION AND RETURN1835 *1836 NEWCUR STD COLADX ; SAVE NEW ROW AND COLUMN1837 LDA #LINLEN ; ELSE ADD A LINE1838 MUL ; LINLEN * ROWADX1839 ADDB COLADX1840 ADCA #01841 ADDD #SCREEN ; ADD SCREEN BASE.1842 STD CURSOR ; SAVE NEW CURSOR1843 TFR D,X ; GET CURSOR IN X1844 RTS ; AND RETURN1845 *1846 ********************* UPDATE CURRENT COLUMN AND ROW1847 *1848 NEWCOL LDD COLADX ; GET ROW AND COLUMN1849 INCA ; BUMP COLUMN1850 CMPA #LINLEN ; ROLL?1851 BNE NEWCUR ; BRANCH IF NOT1852 CLRA ; ELSE RESET TO ZERO1853 INCB ; AND BUMP ROW1854 CMPB #NUMLIN1855 BNE NEWCUR1856 DECB ; BOTTOM ROW1857 BSR NEWCUR1858 *1859 ********************************* SCROLL THE SCREEN1860 *1861 SCROLL LDX #SCREEN ; POINT TO SCREEN1862 SCROL1 LDA SCNLEN+LINLEN,X1863 STA SCNLEN,X1864 LDA LINLEN,X ; MOVE TWO BYTES1865 STA ,X+ ; UP ONE LINE1866 CMPX #SCREEN+SCNLEN-LINLEN1867 BNE SCROL1 ; LOOP UNTIL DONE1868 BRA SCROL31869 *1870 **************** CLEAR FROM CURSOR TO END OF SCREEN1871 *1872 ESCCLS LDX CURSOR ; GET CURSOR1873 SCROL3 LDA #$20 ; GET A SPACE1874 SCROL2 STA SCNLEN,X ; CLEAR ATTRIBUTES1875 STA ,X+ ; AND TEXT1876 CMPX #SCREEN+SCNLEN1877 BNE SCROL2 ; UNTIL DONE1878 CLR ESCFLG1879 RTS1880 ENDIF DG640OPT1880 ENDIF DG640OPT1881 *1882 IFD PRTOPT1883 *************************************1884 *1885 ** PRINTER DRIVER ROUTINES1886 *1887 *************************************1888 *1889 ** PINIZ - INITIATE PRINTER PORT1890 *1891 PINIZ PSHS B1892 LDD #DIRMSK*256+$04 ; ACCA=DIRMSK ACCB=$041893 STD PADATA ; SET DDR AND SELECT DATA1894 *1895 ** RESET PRINTER1896 *1897 LDB #PRESET1898 STB PADATA1899 RESTLP INCB ; DELAY FOR RESET1900 BNE RESTLP1901 STA PADATA ; ACCA=DIRMSK1902 *1903 ** INITALIZE PORT B (DATA PORT)1904 *1905 LDA #$2A1906 STA PBCTRL1907 LDD #$FF2E ; ACCA=$FF ACCB =%001011101908 STD PBDATA ; PBDREG PBCTRL1909 *1910 ** SELECT 66 LINES/PAGE1911 *1912 LDA #$1B1913 BSR POUTCH1914 LDA #'C1915 BSR POUTCH1916 LDA #661917 PULS B1918 *************************************1919 *1920 ** OUTPUT A CHARACTER TO THE PRINTER1921 *1922 *************************************1923 POUTCH PSHS B1924 LDB PBDATA ; CLEAR INTERRUPT BIT1925 *1926 ** WAIT TILL NOT BUSY1927 *1928 BUSYLP LDB PADATA1929 BITB #PERROR1930 BEQ PEXIT1931 TSTB1932 BMI BUSYLP1933 *1934 ** NOW OUTPUT CHARACTER1935 *1936 STA PBDATA1937 PEXIT PULS B,PC1938 *************************************1939 *1940 ** PCHK TEST IFD PRINTER READY1941 *1942 *************************************1943 PCHK TST PBCTRL ; TEST STATE OF CRB71944 RTS ; SET ON ACKNOWLEDGE1945 ENDIF PRTOPT1945 ENDIF PRTOPT1946 *************************************1947 *1948 * MONITOR KEYBOARD COMMAND JUMP TABLE1949 *1950 *************************************1951 *1952 FE29 JMPTAB EQU *1953 FE29 01 FCB 1 " ^A "1954 FE2A FB 74 FDB ALTRA1955 FE2C 02 FCB 2 " ^B "1956 FE2D FB 69 FDB ALTRB1957 FE2F 03 FCB 3 " ^C "1958 FE30 FB 7F FDB ALTRCC1959 FE32 04 FCB 4 " ^D "1960 FE33 FB 5E FDB ALTRDP1961 FE35 10 FCB $10 " ^P "1962 FE36 FB 31 FDB ALTRPC1963 FE38 15 FCB $15 " ^U "1964 FE39 FB 3D FDB ALTRU1965 FE3B 18 FCB $18 " ^X "1966 FE3C FB 53 FDB ALTRX1967 FE3E 19 FCB $19 " ^Y "1968 FE3F FB 48 FDB ALTRY1969 *1970 FE41 42 FCC 'B'1971 FE42 F9 5C FDB BRKPNT1972 FE44 45 FCC 'E'1973 FE45 F8 FD FDB MEMDUMP1974 FE47 47 FCC 'G'1975 FE48 F8 A5 FDB GO1976 FE4A 4C FCC 'L'1977 FE4B FA 5E FDB LOAD1978 FE4D 50 FCC 'P'1979 FE4E FA BC FDB PUNCH1980 FE50 4D FCC 'M'1981 FE51 F8 A8 FDB MEMCHG1982 FE53 52 FCC 'R'1983 FE54 FB ED FDB REGSTR1984 FE56 53 FCC 'S'1985 FE57 F8 F1 FDB DISSTK1986 FE59 58 FCC 'X'1987 FE5A F9 88 FDB XBKPNT1988 IFD MFDCOPT1989 FCC 'D' ; *** SWTPC USES 'U' FOR MINIBOOT1990 FDB MINBOOT1991 ENDIF MFDCOPT1991 ENDIF MFDCOPT1992 IFD CF8OPT1993 FE5C 44 FCC 'D' ; *** FPGA 8 BIT USES 'D' FOR CFBOOT1994 FE5D F9 D5 FDB CFBOOT1995 ENDIF CF8OPT1996 IFD IDEOPT1997 FCC 'D' ; *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT1998 FDB IDEBOOT1999 ENDIF IDEOPT1999 ENDIF IDEOPT2000 IFD DMAFOPT2001 FCC 'U' ; *** SWTPC USES 'D' FOR DMAF2 BOOT2002 FDB DBOOT2003 ENDIF DMAFOPT2003 ENDIF DMAFOPT2004 IFD EXTOPT2005 FE5F 55 FCC 'U' ; *** IF FPGA, 'U' IS FOR USER2006 FE60 FC 92 FDB USRCMD2007 ENDIF EXTOPT2008 IFD RTCOPT2009 FCC 'T'2010 FDB TIMSET2011 ENDIF RTCOPT2011 ENDIF RTCOPT2012 IFD TRAOPT2013 FCC "T"2014 FDB TRACE2015 ENDIF TRAOPT2015 ENDIF TRAOPT2016 *2017 FE62 TABEND EQU *2018 *2019 * ** 6809 VECTOR ADDRESSES **2020 *2021 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES2022 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY2023 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE2024 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO2025 * HIS OWN ROUTINES IF HE SO DESIRES.2026 *2027 *2028 FE62 F9 94 RAMVEC FDB SWIE ; USER-V2029 FE64 F8 A7 FDB RTI ; SWI3-V2030 FE66 F8 A7 FDB RTI ; SWI2-V2031 FE68 F8 A7 FDB RTI ; FIRQ-V2032 FE6A F8 A7 FDB RTI ; IRQ-V2033 FE6C F9 94 FDB SWIE ; SWI-V2034 FE6E FF FF FDB $FFFF ; SVC-VO2035 FE70 FF FF FDB $FFFF ; SVC-VL2036 *2037 * PRINTABLE MESSAGE STRINGS2038 *2039 FE72 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 02040 FE77 53 59 53 30 39 42 FCC 'SYS09BUG 1.7 FOR '55 47 20 31 2E 3720 46 4F 52 202041 IFD SWTOPT2042 FCC 'SWTPC'2043 ENDIF SWTOPT2043 ENDIF SWTOPT2044 IFD ADSOPT2045 FCC 'ADS6809'2046 ENDIF ADSOPT2046 ENDIF ADSOPT2047 IFD B3SOPT2048 FCC 'B3-S2+'2049 ENDIF B3SOPT2049 ENDIF B3SOPT2050 IFD B5XOPT2051 FCC 'B5-X300'2052 ENDIF B5XOPT2052 ENDIF B5XOPT2053 IFD S3SOPT2054 FCC 'S3STARTER'2055 ENDIF S3SOPT2055 ENDIF S3SOPT2056 IFD S3EOPT2057 FCC 'S3E'2058 ENDIF S3EOPT2058 ENDIF S3EOPT2059 IFD XESOPT2060 FCC 'XESS'2061 ENDIF XESOPT2061 ENDIF XESOPT2062 IFD DE270OPT2063 FE88 44 45 32 2D 37 30 FCC 'DE2-70'2064 ENDIF DE270OPT2065 FE8E 20 2D 20 FCC ' - '2066 FE91 04 FCB 42067 FE92 4B 0D 0A 00 00 00 MSG2 FCB 'K,$0D,$0A,$00,$00,$00,$04 ; K,<CR>,<LF>,3 NULS,<EOT>042068 FE99 3E MSG3 FCC '>'2069 FE9A 04 FCB 42070 FE9B 57 48 41 54 3F MSG4 FCC 'WHAT?'2071 FEA0 04 FCB 42072 FEA1 20 2D 20 MSG5 FCC ' - '2073 FEA4 04 FCB 4'2074 FEA5 20 20 53 50 3D MSG10 FCC ' SP='2075 FEAA 04 FCB 42076 FEAB 20 20 50 43 3D MSG11 FCC ' PC='2077 FEB0 04 FCB 42078 FEB1 20 20 55 53 3D MSG12 FCC ' US='2079 FEB6 04 FCB 42080 FEB7 20 20 49 59 3D MSG13 FCC ' IY='2081 FEBC 04 FCB 42082 FEBD 20 20 49 58 3D MSG14 FCC ' IX='2083 FEC2 04 FCB 42084 FEC3 20 20 44 50 3D MSG15 FCC ' DP='2085 FEC8 04 FCB 42086 FEC9 20 20 41 3D MSG16 FCC ' A='2087 FECD 04 FCB 42088 FECE 20 20 42 3D MSG17 FCC ' B='2089 FED2 04 FCB 42090 FED3 20 20 43 43 3A 20 MSG18 FCC ' CC: '2091 FED9 04 FCB 42092 FEDA 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'56 432093 FEE2 53 31 MSG20 FCC 'S1'2094 FEE4 04 FCB 42095 IFD DATOPT2096 *2097 * POWER UP/ RESET/ NMI ENTRY POINT2098 *2099 FF00 ORG $FF002100 *2101 *2102 FF00 8E FF F0 START LDX #IC11 ; POINT TO DAT RAM IC112103 FF03 86 0F LDA #$0F ; GET COMPLIMENT OF ZERO2104 *2105 *2106 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F2107 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS2108 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE2109 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA2110 * STORED IN IT.2111 *2112 *2113 FF05 A7 80 DATLP STA ,X+ ; STORE & POINT TO NEXT RAM LOCATION2114 FF07 4A DECA ; GET COMP. VALUE FOR NEXT LOCATION2115 FF08 26 FB BNE DATLP ; ALL 16 LOCATIONS INITIALIZED ?2116 *2117 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER2118 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL2119 * PHYSICAL ADDRESSES.2120 *2121 FF0A 86 F0 LDA #$F02122 FF0C A7 84 STA ,X ; STORE $F0 AT $FFFF2123 FF0E 8E D0 A0 LDX #$D0A0 ; ASSUME RAM TO BE AT $D000-$DFFF2124 FF11 10 8E 55 AA LDY #TSTPAT ; LOAD TEST DATA PATTERN INTO "Y"2125 FF15 EE 84 TSTRAM LDU ,X ; SAVE DATA FROM TEST LOCATION2126 FF17 10 AF 84 STY ,X ; STORE TEST PATTERN AT $D0A02127 FF1A 10 AC 84 CMPY ,X ; IS THERE RAM AT THIS LOCATION ?2128 FF1D 27 0B BEQ CNVADR ; IF MATCH THERE'S RAM, SO SKIP2129 FF1F 30 89 F0 00 LEAX -$1000,X ; ELSE POINT 4K LOWER2130 FF23 8C F0 A0 CMPX #$F0A0 ; DECREMENTED PAST ZER0 YET ?2131 FF26 26 ED BNE TSTRAM ; IF NOT CONTINUE TESTING FOR RAM2132 FF28 20 D6 BRA START ; ELSE START ALL OVER AGAIN2133 *2134 *2135 * THE FOLLOWING CODE STORES THE COMPLEMENT OF2136 * THE MS CHARACTER OF THE FOUR CHARACTER HEX2137 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED2138 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT2139 * IS STORED IN RAM IN THE LOCATION THAT IS2140 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,2141 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND2142 * WHEN TESTING LOCATION $70A0, MEANING THERE2143 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE2144 * $8000-$DFFF, THEN THE COMPLEMENT OF THE2145 * "7" IN THE $70A0 WILL BE STORED IN2146 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS2147 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND2148 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE2149 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE2150 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---2151 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT2152 * IS AT $D--- SINCE THAT IS THE ADDRESS THE2153 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK2154 * OF RAM RESPONDS.2155 *2156 *2157 FF2A EF 84 CNVADR STU ,X ; RESTORE DATA AT TEST LOCATION2158 FF2C 1F 10 TFR X,D ; PUT ADDR. OF PRESENT 4K BLOCK IN D2159 FF2E 43 COMA ; COMPLEMENT MSB OF THAT ADDRESS2160 FF2F 44 LSRA ; PUT MS 4 BITS OF ADDRESS IN2161 FF30 44 LSRA ; LOCATION D0-D3 TO ALLOW STORING2162 FF31 44 LSRA ; IT IN THE DYNAMIC ADDRESS2163 FF32 44 LSRA ; TRANSLATION RAM.2164 FF33 B7 FF FD STA $FFFD ; STORE XLATION FACTOR IN DAT "D"2165 *2166 FF36 10 CE DF C0 LDS #STACK ; INITIALIZE STACK POINTER2167 *2168 *2169 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES2170 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK2171 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS2172 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION2173 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF2174 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO2175 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....2176 *2177 * 0 1 2 3 4 5 6 7 8 9 A B C D E F2178 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --2179 *2180 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE2181 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....2182 *2183 * 0 1 2 3 4 5 6 7 8 9 A B C D E F2184 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F02185 *2186 *2187 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF2188 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL2189 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK2190 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT2191 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C0002192 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D0002193 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE2194 * MEMORY ADDRESSED AS FOLLOWS....2195 *2196 * 0 1 2 3 4 5 6 7 8 9 A B C D E F2197 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --2198 *2199 *2200 FF3A 10 8E DF D0 LDY #LRARAM ; POINT TO LOGICAL/REAL ADDR. TABLE2201 FF3E A7 2D STA 13,Y ; STORE $D--- XLATION FACTOR AT $DFDD2202 FF40 6F 2E CLR 14,Y ; CLEAR $DFDE2203 FF42 86 F0 LDA #$F0 ; DESTINED FOR IC8 AN MEM EXPANSION ?2204 FF44 A7 2F STA 15,Y ; STORE AT $DFDF2205 FF46 86 0C LDA #$0C ; PRESET NUMBER OF BYTES TO CLEAR2206 FF48 6F A6 CLRLRT CLR A,Y ; CLEAR $DFDC THRU $DFD02207 FF4A 4A DECA ; SUB. 1 FROM BYTES LEFT TO CLEAR2208 FF4B 2A FB BPL CLRLRT ; CONTINUE IF NOT DONE CLEARING2209 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X ; POINT TO NEXT LOWER 4K OF RAM2210 FF51 8C F0 A0 CMPX #$F0A0 ; TEST FOR DECREMENT PAST ZERO2211 FF54 27 22 BEQ FINTAB ; SKIP IF FINISHED2212 FF56 EE 84 LDU ,X ; SAVE DATA AT CURRENT TEST LOCATION2213 FF58 10 8E 55 AA LDY #TSTPAT ; LOAD TEST DATA PATTERN INTO Y REG.2214 FF5C 10 AF 84 STY ,X ; STORE TEST PATT. INTO RAM TEST LOC.2215 FF5F 10 AC 84 CMPY ,X ; VERIFY RAM AT TEST LOCATION2216 FF62 26 E9 BNE FNDRAM ; IF NO RAM GO LOOK 4K LOWER2217 FF64 EF 84 STU ,X ; ELSE RESTORE DATA TO TEST LOCATION2218 FF66 10 8E DF D0 LDY #LRARAM ; POINT TO LOGICAL/REAL ADDR. TABLE2219 FF6A 1F 10 TFR X,D ; PUT ADDR. OF PRESENT 4K BLOCK IN D2220 FF6C 44 LSRA ; PUT MS 4 BITS OF ADDR. IN LOC. D0-D32221 FF6D 44 LSRA ; TO ALLOW STORING IT IN THE DAT RAM.2222 FF6E 44 LSRA2223 FF6F 44 LSRA2224 FF70 1F 89 TFR A,B ; SAVE OFFSET INTO LRARAM TABLE2225 FF72 88 0F EORA #$0F ; INVERT MSB OF ADDR. OF CURRENT 4K BLK2226 FF74 A7 A5 STA B,Y ; SAVE TRANSLATION FACTOR IN LRARAM TABLE2227 FF76 20 D5 BRA FNDRAM ; GO TRANSLATE ADDR. OF NEXT 4K BLK2228 FF78 86 F1 FINTAB LDA #$F1 ; DESTINED FOR IC8 AND MEM EXPANSION ?2229 FF7A 10 8E DF D0 LDY #LRARAM ; POINT TO LRARAM TABLE2230 FF7E A7 2E STA 14,Y ; STORE $F1 AT $DFCE2231 *2232 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF2233 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES2234 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT2235 * LOGICALLY RESPONDS TO THE ADDRESS $C---.2236 *2237 *2238 FF80 86 0C LDA #$0C ; PRESET NUMBER HEX "C"2239 FF82 E6 A6 FINDC LDB A,Y ; GET ENTRY FROM LRARAM TABLE2240 FF84 26 05 BNE FOUNDC ; BRANCH IF RAM THIS PHYSICAL ADDR.2241 FF86 4A DECA ; ELSE POINT 4K LOWER2242 FF87 2A F9 BPL FINDC ; GO TRY AGAIN2243 FF89 20 14 BRA XFERTF2244 FF8B 6F A6 FOUNDC CLR A,Y ; CLR XLATION FACTOR OF 4K BLOCK FOUND2245 FF8D E7 2C STB $0C,Y ; GIVE IT XLATION FACTOR MOVING IT TO $C---2246 *2247 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION2248 * FACTORS SUCH THAT ALL REMAINING RAM WILL2249 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL2250 * ADDRESSES FROM $0000 AND UP....2251 *2252 FF8F 4F CLRA ; START AT ZERO2253 FF90 1F 21 TFR Y,X ; START POINTER "X" START OF "LRARAM" TABLE.2254 FF92 E6 A6 COMPRS LDB A,Y ; GET ENTRY FROM "LRARAM" TABLE2255 FF94 27 04 BEQ PNTNXT ; IF IT'S ZER0 SKIP2256 FF96 6F A6 CLR A,Y ; ELSE ERASE FROM TABLE2257 FF98 E7 80 STB ,X+ ; AND ENTER ABOVE LAST ENTRY- BUMP2258 FF9A 4C PNTNXT INCA ; GET OFFSET TO NEXT ENTRY2259 FF9B 81 0C CMPA #$0C ; LAST ENTRY YET ?2260 FF9D 2D F3 BLT COMPRS2261 *2262 * THE FOLLOWING CODE TRANSFER THE TRANSLATION2263 * FACTORS FROM THE LRARAM TABLE TO IC11 ON2264 * THE MP-09 CPU CARD.2265 *2266 FF9F 8E FF F0 XFERTF LDX #IC11 ; POINT TO DAT RAM IC112267 FFA2 C6 10 LDB #$10 ; GET NO. OF BYTES TO MOVE2268 FFA4 A6 A0 FETCH LDA ,Y+ ; GET BYTE AND POINT TO NEXT2269 FFA6 A7 80 STA ,X+ ; POKE XLATION FACTOR IN IC112270 FFA8 5A DECB ; SUB 1 FROM BYTES TO MOVE2271 FFA9 26 F9 BNE FETCH ; CONTINUE UNTIL 16 MOVED2272 *2273 ELSE2274 LRA RTS2275 START LDS #STACK ; INITIALIZE STACK POINTER2276 CLRB2277 ENDIF DATOPT2277 ENDIF DATOPT2278 *2279 FFAB 53 COMB ; SET "B" NON-ZERO2280 FFAC F7 DF E2 STB ECHO ; TURN ON ECHO FLAG2281 FFAF 16 F8 62 LBRA MONITOR ; INITIALIZATION IS COMPLETE2282 *2283 ** INTERRUPT JUMP VECTORS2284 *2285 FFB2 6E 9F DF C0 V1 JMP [STACK]2286 FFB6 6E 9F DF C4 V2 JMP [SWI2]2287 FFBA 6E 9F DF C6 V3 JMP [FIRQ]2288 FFBE 6E 9F DF C8 V4 JMP [IRQ]2289 FFC2 6E 9F DF CA V5 JMP [SWI]2290 *2291 * SWI3 ENTRY POINT2292 *2293 FFC6 1F 43 SWI3E TFR S,U2294 FFC8 AE 4A LDX 10,U *$FFC82295 FFCA E6 80 LDB ,X+2296 FFCC AF 4A STX 10,U2297 FFCE 4F CLRA2298 FFCF 58 ASLB2299 FFD0 49 ROLA2300 FFD1 BE DF CC LDX SVCVO2301 FFD4 8C FF FF CMPX #$FFFF2302 FFD7 27 0F BEQ SWI3Z2303 FFD9 30 8B LEAX D,X2304 FFDB BC DF CE CMPX SVCVL2305 FFDE 22 08 BHI SWI3Z2306 FFE0 34 10 PSHS X2307 FFE2 EC C4 LDD ,U2308 FFE4 AE 44 LDX 4,U2309 FFE6 6E F1 JMP [,S++]2310 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP2311 FFEA EE 42 LDU 2,U2312 FFEC 6E 9F DF C2 JMP [SWI3]2313 *2314 * 6809 VECTORS2315 *2316 FFF0 ORG $FFF02317 FFF0 FF B2 FDB V1 USER-V2318 FFF2 FF C6 FDB SWI3E SWI3-V2319 FFF4 FF B6 FDB V2 SWI2-V2320 FFF6 FF BA FDB V3 FIRQ-V2321 FFF8 FF BE FDB V4 IRQ-V2322 FFFA FF C2 FDB V5 SWI-V2323 FFFC FF B2 FDB V1 NMI-V2324 FFFE FF 00 FDB START RESTART-V0004 END START0005 ENDProgram + Init Data = 2021 bytesError count = 0
Go to most recent revision | Compare with Previous | Blame | View Log
