URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [sys09bug/] [sys09atl.lst] - Rev 221
Compare with Previous | Blame | View Log
Assembler release DWC_2.0 version 2.11May 6, 2004 (c) Motorola (free ware)0001 NAM SYS09BUG FOR ATLYS0000 INCLUDE "opt_atl.asm"0001 *0002 ***************************************************0003 * OPTION SWITCHES0004 ***************************************************0005 *0006 *0007 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE0008 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET0009 ** FOR LOADING AND SAVING S1 RECORDS0010 *0011 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT0012 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY0013 *B3SOPT EQU $FF B3-SPARTAN2 FPGA VIDEO & PS2 KEYBOARD0014 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD0015 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD0016 *S3EOPT EQU $FF SPARTAN3E STARTER0017 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.00018 00FF ATLOPT EQU $FF Digilent Atlys0019 *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 ATLOPT0025 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS0026 0000 EXTCMD EQU $00 EXTENDED OFFSET0027 ENDIF ATLOPT0028 IFD DE270OPT0029 MONEXT EQU $F000 START OF EXTENDED COMMANDS0030 EXTCMD EQU $00 EXTENDED OFFSET0031 ENDIF DE270OPT0031 ENDIF DE270OPT0032 **************************************************0033 **************************************************00340035 IFD SWTOPT0036 *0037 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER0038 *0039 ACIAOPT EQU $FF ACIA AT PORT 00040 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT0041 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT0042 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0043 ENDIF0043 ENDIF0044 *0045 IFD ADSOPT0046 *0047 * ACKERMAN DIGITAL ADS68090048 *0049 DG640OPT EQU $FF DG640 VDU AT $E8000050 *RTCOPT EQU $FF REAL TIME CLOCK0051 PRTOPT EQU $FF PRINTER DRIVERS0052 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT0053 ENDIF ADSOPT0053 ENDIF ADSOPT0054 *0055 IFD B3SOPT0056 *0057 * BURCHED SPARTAN 2 B3+0058 *0059 ACIAOPT EQU $FF ACIA AT PORT 00060 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200061 VDUOPT EQU $FF VDU AT $E0300062 IDEOPT EQU $FF IDE AT $E1000063 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0064 HFCOPT EQU $FF HARDWARE FLOW CONTROL0065 ENDIF B3SOPT0065 ENDIF B3SOPT0066 *0067 IFD B5XOPT0068 *0069 * BURCHED SPARTAN 2 B5-X3000070 *0071 ACIAOPT EQU $FF ACIA AT PORT 00072 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200073 VDUOPT EQU $FF VDU AT $E0300074 CF8OPT EQU $FF COMPACT FLASH AT $E0400075 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0076 HFCOPT EQU $FF HARDWARE FLOW CONTROL0077 ENDIF B5XOPT0077 ENDIF B5XOPT0078 *0079 IFD S3SOPT0080 *0081 * DIGILENT SPARTAN 3 STARTER0082 *0083 ACIAOPT EQU $FF ACIA AT PORT 00084 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200085 VDUOPT EQU $FF VDU AT $E0300086 CF8OPT EQU $FF COMPACT FLASH AT $E0400087 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0088 EXTOPT EQU $FF EXTENDED COMMANDS0089 ENDIF S3SOPT0089 ENDIF S3SOPT0090 *0091 IFD S3EOPT0092 *0093 * DIGILENT SPARTAN 3E STARTER0094 *0095 ACIAOPT EQU $FF ACIA AT PORT 00096 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200097 VDUOPT EQU $FF VDU AT $E0300098 TRAOPT EQU $FF PIA TRACE TIMER0099 ENDIF S3EOPT0099 ENDIF S3EOPT0100 *0101 IFD XESOPT0102 *0103 * XESS SPARTAN 3 XSA-3S1000 & XST-3.00104 *0105 ACIAOPT EQU $FF ACIA AT PORT 00106 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200107 VDUOPT EQU $FF VDU AT $E0300108 IDEOPT EQU $FF IDE AT $E1000109 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0110 HFCOPT EQU $FF HARDWARE FLOW CONTROL0111 EXTOPT EQU $FF EXTENDED COMMANDS0112 ENDIF XESOPT0112 ENDIF XESOPT0113 *0114 IFD ATLOPT0115 *0116 * Digilent Atlys SPARTAN60117 *0118 00FF ACIAOPT EQU $FF ACIA AT PORT 00119 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E0200120 00FF VDUOPT EQU $FF VDU AT $E0300121 00FF IDEOPT EQU $FF IDE AT $E1000122 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0123 00FF HFCOPT EQU $FF HARDWARE FLOW CONTROL0124 00FF EXTOPT EQU $FF EXTENDED COMMANDS0125 ENDIF ATLOPT0126 *0127 IFD DE270OPT0128 *0129 * TERASIC CYCLONE 2 DE2-700130 *0131 ACIAOPT EQU $FF ACIA AT PORT 00132 PS2OPT EQU $FF PS2 KEYBOARD AT $E0200133 VDUOPT EQU $FF VDU AT $E0300134 CF8OPT EQU $FF COMPACT FLASH AT $E0400135 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION0136 EXTOPT EQU $FF EXTENDED COMMANDS0137 ENDIF DE270OPT0137 ENDIF DE270OPT0138 *0139 *0140 IFD ACIAOPT0141 *0142 ***************************************************0143 * SERIAL PORT *0144 ***************************************************0145 *0146 ** ACIA SITS ON PORT 00147 *0148 E000 ACIAS EQU MONIO+$00 CONTROL PORT0149 *0150 ENDIF ACIAOPT0151 IFD MFDCOPT0152 *0153 ***************************************************0154 * MINIFLOPPY DRIVE *0155 ***************************************************0156 *0157 ** FLOPPY DISK CONTROLLER SITS ON PORT 10158 *0159 DRVFDC EQU MONIO+$140160 CMDFDC EQU MONIO+$180161 SECFDC EQU MONIO+$1A0162 DATFDC EQU MONIO+$1B0163 ENDIF MFDCOPT0163 ENDIF MFDCOPT0164 IFD PS2OPT0165 *0166 ***************************************************0167 * VDU8 PS/2 KEYBOARD PORT *0168 ***************************************************0169 *0170 ** KEYBOARD SITS ON PORT 20171 *0172 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT0173 ENDIF PS2OPT0174 IFD VDUOPT0175 *0176 ***************************************************0177 * VDU8 DISPLAY DRIVER EQUATES *0178 ***************************************************0179 *0180 ** VDU8 DISPLAY SITS ON PORT 30181 *0182 E030 VDU EQU MONIO+$300183 0000 VDUCHR EQU 0 CHARACTER REGISTER0184 0001 VDUATT EQU 1 ATTRIBUTE REGISTER0185 0002 VDUCOL EQU 2 CURSOR COLUMN0186 0003 VDUROW EQU 3 CURSOR ROW0187 0004 VDUOFF EQU 4 ROW OFFSET0188 *0189 0050 LINLEN EQU 80 LENGTH OF A LINE0190 0019 NUMLIN EQU 25 NUMBER OF LINES0191 ENDIF VDUOPT0192 *0193 IFD CF8OPT0194 *0195 ***************************************************0196 * COMPACT FLASH EQUATES 8 BIT TRANSFER *0197 ***************************************************0198 *0199 ** COMPACT FLASH SITS AT PORT 40200 *0201 CF_BASE EQU MONIO+$400202 CF_DATA EQU CF_BASE+00203 CF_ERROR EQU CF_BASE+1 ; read error0204 CF_FEATURE EQU CF_BASE+1 ; write feature0205 CF_SECCNT EQU CF_BASE+20206 CF_SECNUM EQU CF_BASE+30207 CF_CYLLO EQU CF_BASE+40208 CF_CYLHI EQU CF_BASE+50209 CF_HEAD EQU CF_BASE+60210 CF_STATUS EQU CF_BASE+7 ; read status0211 CF_COMAND EQU CF_BASE+7 ; write command0212 *0213 * Command Equates0214 *0215 CMDREAD EQU $20 ; Read Single sector0216 CMDWRITE EQU $30 ; Write Single sector0217 CMDFEATURE EQU $EF0218 FEAT8BIT EQU $01 ; enable 8 bit transfers0219 HEADLBA EQU $E00220 *0221 * Status bit equates0222 *0223 BUSY EQU $800224 DRDY EQU $400225 DRQ EQU $080226 ERR EQU $010227 *0228 ENDIF CF8OPT0228 ENDIF CF8OPT0229 *0230 IFD IDEOPT0231 *0232 ***************************************************0233 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *0234 ***************************************************0235 *0236 ** COMPACT FLASH SITS AT PORT 40237 *0238 E100 CF_BASE EQU MONIO+$01000239 E100 CF_DATA EQU CF_BASE+00240 E102 CF_ERROR EQU CF_BASE+2 ; read error0241 E102 CF_FEATURE EQU CF_BASE+2 ; write feature0242 E104 CF_SECCNT EQU CF_BASE+40243 E106 CF_SECNUM EQU CF_BASE+60244 E108 CF_CYLLO EQU CF_BASE+80245 E10A CF_CYLHI EQU CF_BASE+100246 E10C CF_HEAD EQU CF_BASE+120247 E10E CF_STATUS EQU CF_BASE+14 ; read status0248 E10E CF_COMAND EQU CF_BASE+14 ; write command0249 E11E CF_AUX EQU CF_BASE+300250 *0251 * Command Equates0252 *0253 0020 CMDREAD EQU $20 ; Read Single sector0254 0030 CMDWRITE EQU $30 ; Write Single sector0255 0006 AUXRESET EQU $06 ; Reset IDE0256 0002 AUXRSTREL EQU $02 ; Reset release IRQ masked0257 00E0 HEADLBA EQU $E00258 *0259 * Status bit equates0260 *0261 0080 BUSY EQU $800262 0040 DRDY EQU $400263 0008 DRQ EQU $080264 0001 ERR EQU $010265 *0266 ENDIF CF8OPT0267 *0268 IFD RTCOPT0269 *0270 **************************************************0271 * MM58167A REAL TIME CLOCK MEMORY MAP:0272 **************************************************0273 *0274 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 50275 *0276 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS0277 *0278 * COUNTER AND COMPARITOR REGISTERS:0279 *0280 * Both the Clock Counter and Clock Comparitor0281 * consist of 8 registers for holding the time.0282 * The register offsets from the Counter and0283 * Comparitor registers are listed above.0284 *0285 COUNTR EQU CLOCK+00286 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS0287 *0288 * CLOCK REGISTER OFFSETS:0289 * These register offsets are used for the CLOCK0290 * and comparitor ram CMPRAM.0291 *0292 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS0293 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS0294 SECOND EQU 20295 MINUIT EQU 30296 HOUR EQU 40297 WKDAY EQU 50298 MTHDAY EQU 60299 MONTH EQU 70300 *0301 * INTERRUPT OUTPUT REGISTERS:0302 *0303 * An interrupt output may be generated at the0304 * following rates by setting the appropriate bit0305 * in the Interrupt Control Register (CINTCR).0306 * The Interrupt Status Register (CINTSR) must be0307 * read to clear the interrupt and will return0308 * the source of the interrupt.0309 *0310 * 1/Month Bit 70311 * 1/Week Bit 60312 * 1/Day Bit 50313 * 1/Hour Bit 40314 * 1/Minuite Bit 30315 * 1/Second Bit 20316 * 10/Second Bit 10317 * Comparitor Bit 00318 *0319 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER0320 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER0321 *0322 * COUNTER AND RAM RESETS; GO COMMAND.0323 *0324 * The counter and comparitor may be reset0325 * by writing $FF into CTRRES and CMPRES0326 * respectivly.0327 * A write to the Go command register (GOCMND)0328 * will reset the 1/1000ths, 1/100ths and 1/10ths0329 * of a second counter.0330 *0331 CTRRES EQU CLOCK+18 COUNTER RESET0332 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET0333 GOCMND EQU CLOCK+21 GO COMMAND0334 *0335 * CLOCK STATUS REGISTER.0336 *0337 * The counter takes 61 usec. to rollover for0338 * every 1KHz clock pulse. If the Status bit is0339 * set after reading the counter, the counter0340 * should be re-read to ensure the time is correct.0341 *0342 CLKSTA EQU CLOCK+20 STATUS BIT0343 SBYINT EQU CLOCK+22 STANDBY INTERRUPT0344 TSTMOD EQU CLOCK+31 TEST MODE REGISTER0345 ENDIF RTCOPT0345 ENDIF RTCOPT0346 *0347 IFD TRAOPT0348 *0349 **************************************************0350 * PIA INTERRUPT TIMER0351 **************************************************0352 *0353 ** PIA INTERRUPT TIMER SITS ON PORT 70354 *0355 ** PIA TIMER FOR SINGLE STEP / TRACE0356 *0357 * TADATA = Output = Timer preset register0358 * TACTRL - CA1 = input = rising edge = NMI0359 * - CA2 = Output = Timer Reset (Active High)0360 * TBDATA = Input = Timer read back register0361 * TBCTRL - CB1 = input = rising edge = FIRQ0362 * - CB2 = output = strobe low on write to TBDATA = Timer Preset0363 *0364 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB0365 * CRA1 = 1 CA1 Rising edge IRQ0366 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register0367 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 10368 * CRA4 = 1 ] CA2 = Set/Reset output0369 * CRA5 = 1 ]0370 * CRA6 = X CA2 Input Interrupt Flag0371 * CRA7 = X CA1 Interrupt Flag0372 *0373 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB0374 * CRB1 = 1 CB1 Rising edge IRQ0375 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register0376 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 10377 * CRB4 = 1 ] CB2 = Set/Reset output0378 * CRB5 = 1 ]0379 * CRB6 = X CB2 Input Interrupt Flag0380 * CRB7 = X CB1 Interrupt Flag0381 *0382 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output0383 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output0384 *0385 TADATA EQU MONIO+$70 Timer preset port0386 TACTRL EQU MONIO+$710387 TBDATA EQU MONIO+$72 Timer read back port0388 TBCTRL EQU MONIO+$730389 *0390 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)0391 *0392 ENDIF TRAOPT0392 ENDIF TRAOPT0393 IFD ADSOPT0394 *0395 ***************************************************0396 * SERIAL PORT FOR DG640 *0397 ***************************************************0398 *0399 ** SET UP FOR ACKERMAN DIGITAL ADS68090400 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA0401 *0402 ACIAS EQU MONIO+$400 CONTROL PORT0403 *0404 ENDIF ADSOPT0404 ENDIF ADSOPT0405 IFD PRTOPT0406 *0407 ***************************************************0408 * PRINTER INTERFACE *0409 ***************************************************0410 *0411 PADATA EQU MONIO+$4040412 PACTRL EQU MONIO+$4050413 PBDATA EQU MONIO+$4060414 PBCTRL EQU MONIO+$4070415 *0416 ** CB1 ACK. I/P0417 ** CB2 STB. O/P0418 ** PB0 - PB7 DATA 1 - 8 O/P0419 ** PORT A BIT ASSIGNMENT0420 *0421 PBUSY EQU $80 I/P0422 PEMPTY EQU $40 I/P0423 SELECT EQU $20 I/P0424 PERROR EQU $10 I/P0425 PRESET EQU %00000100 O/P PA3 = 00426 AUTOFD EQU %00001000 O/P PA2 = 00427 DIRMSK EQU %000011000428 ENDIF PRTOPT0428 ENDIF PRTOPT0429 IFD DG640OPT0430 *0431 ***************************************************0432 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *0433 ***************************************************0434 *0435 ** VIDEO DISPLAY DEFINITIONS0436 *0437 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY0438 LINLEN EQU 64 LENGTH OF A LINE0439 NUMLIN EQU 16 NUMBER OF LINES0440 SCNLEN EQU $400 LENGTH OF SCREEN0441 ENDIF DG640OPT0441 ENDIF DG640OPT0442 *0443 IFD DMAFOPT0444 *0445 ***************************************************0446 * DMAF2 8" DRIVE *0447 ***************************************************0448 *0449 ADDREG EQU $F000 ADDRESS REGISTER0450 CNTREG EQU $F002 COUNT REGISTER0451 CCREG EQU $F010 CHANNEL CONTROL REGISTER0452 PRIREG EQU $F014 DMA PRIORITY REGISTER0453 AAAREG EQU $F015 ???0454 BBBREG EQU $F016 ???0455 COMREG EQU $F020 1791 COMMAND REGISTER0456 SECREG EQU $F022 SECTOR REGISTER0457 DRVREG EQU $F024 DRIVE SELECT LATCH0458 CCCREG EQU $F040 ???0459 ENDIF DMAFOPT0459 ENDIF DMAFOPT0460 IFD DATOPT0461 **************************************************0462 * DYNAMIC ADDRESS TRANSLATION REGISTERS *0463 **************************************************0464 *0465 FFF0 IC11 EQU $FFF0 DAT RAM CHIP0466 55AA TSTPAT EQU $55AA TEST PATTERN0467 ENDIF DATOPT0468 *0003 END0000 INCLUDE "sys09ide.asm"0001 *0002 ** SYS09BUG MONITOR EXTENSIONS0003 *0004 * FOR SYS09BUG ON THE XESS XSA-3S100 / XST-3.00005 * WITH I/O MAPPED AT $XE0000006 * 16 BIT IDE MAPPED AT $E1000007 * AND ROM MAPPED AT $XF0000008 *0009 *sys09ide.asm page 20011 *0012 ***************************************************0013 * Serial PROM register0014 ***************************************************0015 *0016 ** CONFIGURATION PROM DEFINITIONS0017 *0018 E0C0 PROMREG EQU MONIO+$C00019 0001 PCLKHI EQU $01 Toggle PROM Clock High0020 0000 PCLKLO EQU $00 Toggle PROM Clock Low0021 0002 PRSTHI EQU $02 Toggle PROM Reset High0022 0000 PRSTLO EQU $00 Toggle PROM Reset Low0023 AA55 SYNCHI EQU $AA55 Synch Pattern High Word0024 FF00 SYNCLO EQU $FF00 Synch Pattern Low Word0025 *0026 *0027 ***************************************************0028 * START OF ROM *0029 ***************************************************0030 *0031 F800 MONITV EQU MONROM+0 FDB MONITOR0032 F802 NXTCMV EQU MONROM+2 FDB NEXTCMD0033 F804 INCHV EQU MONROM+4 FDB INCH0034 F806 INCHEV EQU MONROM+6 FDB INCHE0035 F808 INCHKV EQU MONROM+8 FDB INCHEK0036 F80A OUTCHV EQU MONROM+10 FDB OUTCH0037 F80C PDATAV EQU MONROM+12 FDB PDATA0038 F80E PCRLFV EQU MONROM+14 FDB PCRLF0039 F810 PSTRGV EQU MONROM+16 FDB PSTRNG0040 F812 LRAV EQU MONROM+18 FDB LRA0041 *0042 * Condition code flags0043 *0044 0001 CFLAG EQU $01 CARRY FLAG0045 0002 VFLAG EQU $02 OVERFLOW FLAG0046 0004 ZFLAG EQU $04 ZERO FLAG0047 0008 NFLAG EQU $08 NEGATIVE FLAG0048 0010 IFLAG EQU $10 IRQ MASK CC0049 0020 HFLAG EQU $20 HALF CARRY0050 0040 FFLAG EQU $40 FIRQ MASK CC0051 0080 EFLAG EQU $80 ENTIRE FLAG0052 *0053 * Serial Port0054 *0055 E000 ACIAC1 EQU ACIAS0056 E001 ACIAD1 EQU ACIAS+10057 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50)0058 *0059 * XMODEM Control characters0060 *0061 0001 SOH EQU $010062 0004 EOT EQU $040063 0006 ACK EQU $060064 0015 NAK EQU $150065 0018 CAN EQU $180066 *0067 * Some Disk Constants0068 *0069 0100 RMAXTRK EQU 2560070 00FF RMAXSEC EQU 2550071 FE01 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC0072 *0073 * RAM SPACE0074 *0075 * PUT THIS DOWN THE BOTTOM OF MEMORY0076 *0077 0100 ORG $01000078 0100 DRVNUM RMB 10079 0101 TRACK RMB 10080 0102 SECTOR RMB 10081 0103 CHKSUM RMB 10082 0104 BLKNUM RMB 1 Xmodem block number0083 0105 BYTCNT RMB 1 Xmodem byte count0084 0106 XSTATE RMB 2 Xmodem State Vector0085 0108 DELCNT RMB 3 $00,$00,$00 Xmodem Poll timer0086 010B MAXTRK RMB 10087 010C MAXSEC RMB 10088 0200 ORG $02000089 *0090 * SECTOR BUFFER0091 *0092 0200 BUFFER RMB 2560093 *0094 ****************************************0095 *0096 * START OF EXTENSION COMMANDS0097 *0098 ****************************************0099 *0100 F000 ORG MONEXT0101 F000 F0 02 FDB NEXTEXT Jump to next extended command0102 *0103 ***** NEXTCMD *****0104 *0105 F002 AD 9F F8 06 NEXTEXT JSR [INCHEV] GET ONE CHAR. FROM TERMINAL0106 F006 84 7F ANDA #$7F STRIP PARITY FROM CHAR.0107 F008 1F 89 TFR A,B0108 F00A 86 20 LDA #$200109 F00C AD 9F F8 0A JSR [OUTCHV] PRNT SPACE0110 F010 C1 60 CMPB #$600111 F012 2F 02 BLE NXTEX00112 F014 C0 20 SUBB #$200113 *0114 ***** DO TABLE LOOKUP *****0115 * FOR COMMAND FUNCTIONS0116 *0117 F016 8E F0 2C NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE0118 F019 E1 80 NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?0119 F01B 27 0D BEQ JMPEXT BRANCH IF MATCH FOUND0120 F01D 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE0121 F01F 8C F0 35 CMPX #EXTEND REACHED END OF TABLE YET ?0122 F022 26 F5 BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY0123 F024 8E F0 35 LDX #MSGWHAT POINT TO MSG "WHAT?"0124 F027 16 02 29 LBRA PDATA1 PRINT MSG AND RETURN0125 F02A 6E 94 JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE0126 *0127 * EXTENDED COMMAND JUMP TABLE0128 *0129 F02C EXTTAB EQU *0130 F02C 42 FCC 'B' BOOT FLEX0131 F02D F0 3E FDB UBSUB0132 F02F 46 FCC 'F' FORMAT IDE DISK0133 F030 F0 EA FDB UFSUB0134 F032 58 FCC 'X' XMODEM ROM DISK UPLOAD0135 F033 F2 BC FDB UXSUB0136 *0137 F035 EXTEND EQU *0138 *0139 F035 57 48 41 54 20 3F MSGWHAT FCC "WHAT ?"0140 F03B 0A 0D 04 FCB $0A,$0D,$040141 *0142 * GO TO FLEX RESIDENT IN MEMORY0143 *0144 F03E 8E CD 00 UBSUB LDX #$CD000145 F041 AF 4A STX 10,U0146 F043 1F 34 TFR U,S0147 F045 3B RTI0148 *0149 * recieve char from remote drive.0150 * timeout if no response for approx 1s.0151 * Entry: no parameters0152 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.0153 *0154 F046 34 30 RCHAR PSHS X,Y0155 *0156 F048 8E 03 E8 LDX #1000 1000x inner loop0157 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 char0159 F052 47 ASRA0160 F053 25 0A BCS RCHAR3 get character0161 F055 31 3F LEAY -1,Y else, continue to count delay0162 F057 26 F6 BNE RCHAR20163 F059 30 1F LEAX -1,X0164 F05B 26 EE BNE RCHAR10165 F05D 35 B0 PULS X,Y,PC return with error if timed out0166 *0167 F05F B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set)0168 F062 35 B0 PULS X,Y,PC0169 *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 transmit0174 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.0175 *0176 F064 34 30 SCHAR PSHS X,Y0177 F066 34 02 PSHS A0178 *0179 F068 8E 03 E8 LDX #1000 1000x inner loop0180 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 FIFO0182 F072 47 ASRA0183 F073 47 ASRA0184 F074 25 0C BCS SCHAR3 send character0185 F076 31 3F LEAY -1,Y else, continue to count delay0186 F078 26 F5 BNE SCHAR20187 F07A 30 1F LEAX -1,X0188 F07C 26 ED BNE SCHAR10189 F07E 35 02 PULS A0190 F080 35 B0 PULS X,Y,PC return with error if timed out0191 *0192 F082 35 02 SCHAR3 PULS A0193 F084 B7 E0 01 STA ACIAD1 send data (carry bit still set)0194 F087 35 B0 PULS X,Y,PC0195 *0196 ** 'UF' Format IDE Drive to FLEX standard.0197 *0198 F089 0A 0D DISFOS FCB $0A,$0D0199 F08B 46 6F 72 6D 61 74 FCC 'Formating IDE disk... '69 6E 67 20 49 4445 20 64 69 73 6B2E 2E 2E 200200 F0A1 0A 0D FCB $0A,$0D0201 F0A3 44 72 69 76 65 20 FCC 'Drive Number ?'4E 75 6D 62 65 7220 3F0202 F0B1 04 FCB 40203 F0B2 0A 0D 04 MESS6 FCB $0A,$0D,40204 F0B5 49 44 45 20 64 72 FCC 'IDE drive not allocated! '69 76 65 20 6E 6F74 20 61 6C 6C 6F63 61 74 65 64 21200205 F0CE 04 FCB 40206 F0CF 0A 0D UFMSG1 FCB $0A,$0D0207 F0D1 46 6F 72 6D 61 74 FCC 'Format Complete'20 43 6F 6D 70 6C65 74 650208 F0E0 04 FCB 40209 F0E1 49 44 45 44 49 53 VOLMSG FCC 'IDEDISK '4B 200210 F0E9 04 FCB 40211 *0212 F0EA BD F4 BD UFSUB JSR INITDR0213 F0ED 8E F0 89 LDX #DISFOS0214 F0F0 BD F2 53 JSR PDATA10215 F0F3 17 FF 50 UFSUB1 LBSR RCHAR0216 F0F6 24 FB BCC UFSUB10217 F0F8 17 FF 69 LBSR SCHAR0218 F0FB 81 30 CMPA #'0'0219 F0FD 10 25 00 EF LBLO UFEXIT0220 F101 81 33 CMPA #'3'0221 F103 10 22 00 E9 LBHI UFEXIT0222 F107 80 30 SUBA #'0'0223 F109 1F 89 TFR A,B0224 F10B F7 01 00 STB DRVNUM0225 F10E 8E 00 FD LDX #DRVNUM-30226 F111 BD F5 3A JSR DRVSEL0227 *0228 * set up free chain0229 *0230 F114 8E 02 00 LDX #BUFFER clear out buffer0231 F117 4F CLRA0232 F118 5F CLRB0233 F119 A7 80 DFL1 STA 0,X+0234 F11B 5A DECB0235 F11C 26 FB BNE DFL10236 *0237 F11E 7F 01 01 CLR TRACK0238 F121 86 01 LDA #10239 F123 B7 01 02 STA SECTOR0240 F126 8E 02 00 DFL2 LDX #BUFFER0241 F129 B6 01 01 LDA TRACK0242 F12C A7 84 STA 0,X0243 F12E B6 01 02 LDA SECTOR0244 F131 4C INCA0245 F132 81 00 CMPA #RMAXSEC+1 last sector on track?0246 F134 26 04 BNE DFL30247 F136 6C 84 INC 0,X0248 F138 86 01 LDA #10249 F13A A7 01 DFL3 STA 1,X0250 F13C B6 01 01 LDA TRACK0251 F13F F6 01 02 LDB SECTOR0252 F142 BD F5 15 JSR WRITSC0253 F145 7C 01 02 INC SECTOR0254 F148 B6 01 02 LDA SECTOR0255 F14B 81 00 CMPA #RMAXSEC+10256 F14D 26 D7 BNE DFL20257 F14F 86 01 LDA #10258 F151 B7 01 02 STA SECTOR0259 F154 7C 01 01 INC TRACK0260 F157 B6 01 01 LDA TRACK0261 F15A 81 00 CMPA #RMAXTRK0262 F15C 26 C8 BNE DFL20263 * break free chain at last track/sector0264 F15E 8E 02 00 LDX #BUFFER0265 F161 86 FF LDA #RMAXTRK-10266 F163 C6 FF LDB #RMAXSEC0267 F165 BD F4 F1 JSR READSC0268 F168 8E 02 00 LDX #BUFFER0269 F16B 6F 84 CLR 0,X0270 F16D 6F 01 CLR 1,X0271 F16F 86 FF LDA #RMAXTRK-10272 F171 C6 FF LDB #RMAXSEC0273 F173 BD F5 15 JSR WRITSC0274 * set up sector structure, SIR, directory etc0275 F176 8E 02 00 LDX #BUFFER0276 F179 4F CLRA0277 F17A C6 FF LDB #RMAXSEC0278 F17C BD F4 F1 JSR READSC0279 F17F 8E 02 00 LDX #BUFFER0280 F182 6F 84 CLR 0,X break end of directory chain0281 F184 6F 01 CLR 1,X0282 F186 4F CLRA0283 F187 C6 FF LDB #RMAXSEC0284 F189 BD F5 15 JSR WRITSC0285 *0286 F18C 8E 02 00 LDX #BUFFER0287 F18F 4F CLRA0288 F190 C6 03 LDB #3 set up SIR0289 F192 BD F4 F1 JSR READSC0290 F195 8E 02 00 LDX #BUFFER0291 F198 6F 84 CLR 0,X break forward link0292 F19A 6F 01 CLR 1,X0293 *0294 F19C 34 20 PSHS Y0295 F19E 10 8E F0 E1 LDY #VOLMSG0296 F1A2 C6 10 LDB #160297 F1A4 A6 A0 DFL4 LDA ,Y+0298 F1A6 A7 85 STA B,X0299 F1A8 5C INCB0300 F1A9 C1 18 CMPB #240301 F1AB 26 F7 BNE DFL40302 F1AD 35 20 PULS Y0303 *0304 F1AF 4F CLRA0305 F1B0 F6 01 00 LDB DRVNUM volume number0306 F1B3 ED 88 1B STD 27,X0307 *0308 F1B6 CC 01 01 LDD #$0101 first trk/sec 01-010309 F1B9 ED 88 1D STD 29,X0310 F1BC 86 FF LDA #RMAXTRK-10311 F1BE C6 FF LDB #RMAXSEC0312 F1C0 ED 88 1F STD 31,X0313 F1C3 ED 88 26 STD 38,X0314 F1C6 CC FE 01 LDD #RTOTSEC total DATA sectors (2912-14)0315 F1C9 ED 88 21 STD 33,X0316 *0317 F1CC 86 01 LDA #01 month set default creation date (SYS09's birthday!)0318 F1CE A7 88 23 STA 35,X0319 F1D1 86 07 LDA #07 day0320 F1D3 A7 88 24 STA 36,X0321 F1D6 86 07 LDA #07 year0322 F1D8 A7 88 25 STA 37,X0323 *0324 F1DB 4F RF3 CLRA0325 F1DC C6 03 LDB #30326 F1DE BD F5 15 JSR WRITSC0327 *0328 * Not sure what this is about0329 * put bootstrap on track 0 sector 10330 *0331 * LDX #BUFFER0332 * CLRA0333 * LDB #10334 * JSR READSC0335 * LDX #BUFFER0336 * LDA #$AA set the init flag0337 * STA 0,X0338 * LDA #$550339 * STA 1,X0340 * CLRA0341 * LDB #10342 * JSR WRITSC0343 *0344 * Write Boot sector0345 *0346 F1E1 8E F7 00 LDX #BOOT0347 F1E4 4F CLRA TRACK 00348 F1E5 C6 01 LDB #$01 SECTOR 10349 F1E7 B7 01 01 STA TRACK0350 F1EA F7 01 02 STB SECTOR0351 F1ED 17 03 25 LBSR WRITSC0352 *0353 F1F0 8E F0 CF UFEXIT LDX #UFMSG10354 F1F3 7E F2 53 JMP PDATA10355 *0356 * ACIA INPUT TEST0357 *0358 F1F6 B6 E0 00 INTEST LDA ACIAC10359 F1F9 85 01 BITA #$010360 F1FB 39 RTS0361 *0362 * RESET ACIA0363 *0364 F1FC 86 03 ACIRST LDA #$03 master reset0365 F1FE B7 E0 00 STA ACIAC10366 F201 86 11 LDA #$110367 F203 B7 E0 00 STA ACIAC10368 F206 39 RTS0369 *0370 * ACIA INPUT0371 *0372 F207 86 10 INTER LDA #160373 F209 B7 01 08 STA DELCNT+00374 F20C 7F 01 09 CLR DELCNT+10375 F20F 7F 01 0A CLR DELCNT+20376 F212 B6 E0 00 INTER0 LDA ACIAC10377 F215 85 01 BITA #$010378 F217 26 08 BNE INTER10379 F219 85 78 BITA #$780380 F21B 27 0A BEQ INTER20381 F21D 8D DD BSR ACIRST0382 F21F 20 E6 BRA INTER0383 *0384 F221 B6 E0 01 INTER1 LDA ACIAD10385 F224 1C FD ANDCC #$FF-VFLAG0386 F226 39 RTS0387 *0388 F227 7A 01 0A INTER2 DEC DELCNT+20389 F22A 26 E6 BNE INTER00390 F22C 7A 01 09 DEC DELCNT+10391 F22F 26 E1 BNE INTER00392 F231 7A 01 08 DEC DELCNT+00393 F234 26 DC BNE INTER00394 F236 4F CLRA0395 F237 1A 02 ORCC #VFLAG0396 F239 39 RTS0397 *0398 * ACIA OUTPUT0399 *0400 F23A 34 02 OUTTER PSHS A0401 *0402 F23C B6 E0 00 OUTTE1 LDA ACIAC10403 F23F 85 02 BITA #$020404 F241 26 08 BNE OUTTE20405 F243 85 78 BITA #$780406 F245 27 F5 BEQ OUTTE10407 F247 8D B3 BSR ACIRST0408 F249 20 F1 BRA OUTTE10409 *0410 F24B 35 02 OUTTE2 PULS A0411 F24D B7 E0 01 STA ACIAD10412 F250 39 RTS0413 *0414 * Print Data0415 *0416 F251 8D E7 PDATA0 BSR OUTTER0417 F253 A6 80 PDATA1 LDA ,X+0418 F255 81 04 CMPA #$040419 F257 26 F8 BNE PDATA00420 F259 39 RTS0421 *0422 *0423 ** 'UX' Xmodem IDE Disk upload0424 *0425 F25A 0D 0A UXMES0 FCB $0D,$0A0426 F25C 58 6D 6F 64 65 6D FCC 'Xmodem IDE Disk Upload'20 49 44 45 20 4469 73 6B 20 55 706C 6F 61 640427 F272 04 FCB 40428 F273 0D 0A UXMES1 FCB $0D,$0A0429 F275 55 70 6C 6F 61 64 FCC 'Upload Complete'20 43 6F 6D 70 6C65 74 650430 F284 04 FCB 40431 F285 0D 0A UXMES2 FCB $0D,$0A0432 F287 55 70 6C 6F 61 64 FCC 'Upload Error'20 45 72 72 6F 720433 F293 04 FCB 40434 F294 0D 0A UXMSG3 FCB $0D,$0A0435 F296 44 72 69 76 65 20 FCC 'Drive Number :'4E 75 6D 62 65 7220 3A0436 F2A4 04 FCB 40437 F2A5 0D 0A UXMSG4 FCB $0D,$0A0438 F2A7 41 72 65 20 59 6F FCC 'Are You Sure ? (Y/N)'75 20 53 75 72 6520 3F 20 28 59 2F4E 290439 F2BB 04 FCB 40440 *0441 * Print Banner0442 *0443 F2BC 8E F2 5A UXSUB LDX #UXMES00444 F2BF 17 FF 91 LBSR PDATA10445 *0446 * Prompt for Disk drive number (0 to 3)0447 *0448 F2C2 8E F2 94 LDX #UXMSG30449 F2C5 17 FF 8B LBSR PDATA10450 F2C8 17 FF 3C UXSUB1 LBSR INTER0451 F2CB 29 FB BVS UXSUB10452 F2CD 17 FF 6A LBSR OUTTER0453 F2D0 81 30 CMPA #'00454 F2D2 10 25 01 2E LBLO UXEXIT0455 F2D6 81 33 CMPA #'30456 F2D8 10 22 01 28 LBHI UXEXIT0457 F2DC 80 30 SUBA #'00458 F2DE B7 01 00 STA DRVNUM0459 *0460 * Report selected drive0461 *0462 F2E1 8E F2 94 LDX #UXMSG30463 F2E4 17 FF 6C LBSR PDATA10464 F2E7 B6 01 00 LDA DRVNUM0465 F2EA 8B 30 ADDA #'00466 F2EC 17 FF 4B LBSR OUTTER0467 *0468 * Ask for confirmation (Y/N)0469 *0470 F2EF 8E F2 A5 LDX #UXMSG40471 F2F2 17 FF 5E LBSR PDATA10472 F2F5 17 FF 0F UXSUB2 LBSR INTER0473 F2F8 29 FB BVS UXSUB20474 F2FA 17 FF 3D LBSR OUTTER0475 F2FD 84 5F ANDA #$5F0476 F2FF 81 4E CMPA #'N0477 F301 10 27 00 FF LBEQ UXEXIT0478 F305 81 59 CMPA #'Y0479 F307 26 B3 BNE UXSUB0480 *0481 * We have confirmation ... now load the disk image0482 *0483 F309 17 01 B1 LBSR INITDR0484 F30C CE F4 2D LDU #XSTST0485 F30F FF 01 06 STU XSTATE0486 F312 86 01 LDA #10487 F314 B7 01 04 STA BLKNUM0488 *0489 * Sector10490 *0491 F317 8E 02 00 LDX #BUFFER0492 *0493 F31A 4F CLRA TRACK 00494 F31B C6 01 LDB #$01 SECTOR 10495 F31D B7 01 01 STA TRACK0496 F320 F7 01 02 STB SECTOR0497 *0498 F323 17 00 EA LBSR XREAD0499 F326 10 25 00 E0 LBCS UXERR0500 F32A 17 01 87 LBSR XACK0501 F32D 17 00 E0 LBSR XREAD0502 F330 10 25 00 D6 LBCS UXERR0503 *0504 F334 8E 02 00 LDX #BUFFER0505 F337 B6 01 01 LDA TRACK0506 F33A F6 01 02 LDB SECTOR0507 F33D 17 01 D5 LBSR WRITSC0508 F340 17 01 71 LBSR XACK0509 *0510 * Sector 20511 *0512 F343 8E 02 00 LDX #BUFFER0513 *0514 F346 B6 01 01 LDA TRACK0515 F349 F6 01 02 LDB SECTOR0516 F34C 5C INCB0517 F34D B7 01 01 STA TRACK0518 F350 F7 01 02 STB SECTOR0519 *0520 F353 17 00 BA LBSR XREAD0521 F356 10 25 00 B0 LBCS UXERR0522 F35A 17 01 57 LBSR XACK0523 F35D 17 00 B0 LBSR XREAD0524 F360 10 25 00 A6 LBCS UXERR0525 *0526 F364 8E 02 00 LDX #BUFFER0527 F367 B6 01 01 LDA TRACK0528 F36A F6 01 02 LDB SECTOR0529 F36D 17 01 A5 LBSR WRITSC0530 *0531 F370 17 01 41 LBSR XACK0532 *0533 * Sector 3 - SIR0534 *0535 F373 8E 02 00 LDX #BUFFER0536 *0537 F376 B6 01 01 LDA TRACK0538 F379 F6 01 02 LDB SECTOR0539 F37C 5C INCB0540 F37D B7 01 01 STA TRACK0541 F380 F7 01 02 STB SECTOR0542 *0543 F383 17 00 8A LBSR XREAD0544 F386 10 25 00 80 LBCS UXERR0545 F38A 17 01 27 LBSR XACK0546 F38D 17 00 80 LBSR XREAD0547 F390 10 25 00 76 LBCS UXERR0548 *0549 F394 8E 02 00 LDX #BUFFER0550 F397 A6 88 26 LDA 38,X0551 F39A 4C INCA0552 F39B B7 01 0B STA MAXTRK0553 F39E E6 88 27 LDB 39,X0554 F3A1 5C INCB0555 F3A2 F7 01 0C STB MAXSEC0556 F3A5 B6 01 01 LDA TRACK0557 F3A8 F6 01 02 LDB SECTOR0558 F3AB 17 01 67 LBSR WRITSC0559 *0560 F3AE 17 01 03 LBSR XACK0561 *0562 * Sector 4 to Last Track & Sector0563 *0564 *0565 F3B1 B6 01 01 LDA TRACK0566 F3B4 F6 01 02 LDB SECTOR0567 F3B7 5C INCB0568 *0569 F3B8 8E 02 00 UXLOOP LDX #BUFFER0570 F3BB B7 01 01 STA TRACK0571 F3BE F7 01 02 STB SECTOR0572 *0573 F3C1 17 00 4C LBSR XREAD0574 F3C4 10 25 00 42 LBCS UXERR0575 F3C8 17 00 E9 LBSR XACK0576 F3CB 17 00 42 LBSR XREAD0577 F3CE 10 25 00 38 LBCS UXERR0578 *0579 F3D2 8E 02 00 LDX #BUFFER0580 F3D5 B6 01 01 LDA TRACK0581 F3D8 F6 01 02 LDB SECTOR0582 F3DB 17 01 37 LBSR WRITSC0583 F3DE 17 00 D3 LBSR XACK0584 *0585 F3E1 B6 01 01 LDA TRACK0586 F3E4 F6 01 02 LDB SECTOR0587 F3E7 5C INCB0588 F3E8 F1 01 0C CMPB MAXSEC0589 F3EB 26 CB BNE UXLOOP0590 F3ED C6 01 LDB #10591 F3EF 4C INCA0592 F3F0 B1 01 0B CMPA MAXTRK0593 F3F3 26 C3 BNE UXLOOP0594 *0595 *0596 * Write Boot sector0597 *0598 F3F5 8E F7 00 LDX #BOOT0599 F3F8 4F CLRA TRACK 00600 F3F9 C6 01 LDB #$01 SECTOR 10601 F3FB B7 01 01 STA TRACK0602 F3FE F7 01 02 STB SECTOR0603 F401 17 01 11 LBSR WRITSC0604 *0605 F404 8E F2 73 UXEXIT LDX #UXMES10606 F407 7E F2 53 JMP PDATA10607 *0608 F40A 8E F2 85 UXERR LDX #UXMES20609 F40D 16 FE 43 LBRA PDATA10610 *0611 * Get a Byte using XModem protocol0612 * Carry clear => no errors0613 * Carry set => errors0614 *0615 F410 34 40 XREAD PSHS U0616 F412 FE 01 06 LDU XSTATE0617 *0618 F415 17 FD EF XBYTE0 LBSR INTER0619 F418 28 0A BVC XBYTE10620 F41A 86 15 LDA #NAK0621 F41C 17 FE 1B LBSR OUTTER0622 F41F CE F4 2D LDU #XSTST0623 F422 20 F1 BRA XBYTE00624 *0625 F424 AD C4 XBYTE1 JSR ,U0626 F426 26 ED BNE XBYTE00627 F428 FF 01 06 STU XSTATE0628 F42B 35 C0 PULS U,PC0629 *0630 * START - LOOK FOR SOH (START OF HEADER) = $010631 *0632 F42D 81 01 XSTST CMPA #SOH0633 F42F 26 06 BNE XSTST10634 F431 CE F4 4D LDU #XSTBL0635 F434 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)0636 F436 39 RTS0637 *0638 F437 81 04 XSTST1 CMPA #EOT0639 F439 26 08 BNE XSTST20640 F43B 86 06 LDA #ACK0641 F43D 17 FD FA LBSR OUTTER0642 F440 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit0643 F442 39 RTS0644 *0645 F443 81 18 XSTST2 CMPA #CAN0646 F445 26 03 BNE XSTST30647 F447 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit0648 F449 39 RTS0649 *0650 F44A 1C FA XSTST3 ANDCC #$FF-CFLAG-ZFLAG0651 F44C 39 RTS0652 *0653 * Got SOH0654 * Now get block number0655 *0656 F44D B1 01 04 XSTBL CMPA BLKNUM0657 F450 26 06 BNE XSTBLE0658 F452 CE F4 63 LDU #XSTCOM0659 F455 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)0660 F457 39 RTS0661 *0662 * Error in block number0663 *0664 F458 86 15 XSTBLE LDA #NAK0665 F45A 17 FD DD LBSR OUTTER0666 F45D CE F4 2D LDU #XSTST0667 F460 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)0668 F462 39 RTS0669 *0670 * Get complement of block number0671 *0672 F463 43 XSTCOM COMA0673 F464 B1 01 04 CMPA BLKNUM0674 F467 26 EF BNE XSTBLE0675 F469 7F 01 03 CLR CHKSUM0676 F46C 86 80 LDA #1280677 F46E B7 01 05 STA BYTCNT0678 F471 CE F4 77 LDU #XSTDA0679 F474 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)0680 F476 39 RTS0681 *0682 * Get data bytes0683 *0684 F477 34 02 XSTDA PSHS A0685 F479 BB 01 03 ADDA CHKSUM0686 F47C B7 01 03 STA CHKSUM0687 F47F 35 02 PULS A0688 F481 7A 01 05 DEC BYTCNT0689 F484 26 03 BNE XSTDA10690 F486 CE F4 8E LDU #XSTCK0691 F489 A7 80 XSTDA1 STA ,X+0692 F48B 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)0693 F48D 39 RTS0694 *0695 * Byte count reached zero0696 * Check checksum byte0697 *0698 F48E B1 01 03 XSTCK CMPA CHKSUM0699 F491 26 0B BNE XSTCK1 retry if wrong checksum0700 *0701 * Checksum OK ...0702 * increment block number0703 * Don't send ACK until data written to CF0704 *0705 F493 7C 01 04 INC BLKNUM0706 F496 CE F4 2D LDU #XSTST0707 F499 1C FE ANDCC #$FF-CFLAG No abort0708 F49B 1A 04 ORCC #ZFLAG Valid data (exit)0709 F49D 39 RTS0710 *0711 * Checksum Error detected ...0712 * Reset Sector counter in ACCB to last 128 byte boundary0713 * and send NAK0714 *0715 F49E 34 04 XSTCK1 PSHS B0716 F4A0 1F 10 TFR X,D0717 F4A2 5A DECB0718 F4A3 C4 80 ANDB #1280719 F4A5 1F 01 TFR D,X0720 F4A7 35 04 PULS B0721 F4A9 86 15 LDA #NAK0722 F4AB 17 FD 8C XSTCK2 LBSR OUTTER0723 F4AE CE F4 2D LDU #XSTST0724 F4B1 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)0725 F4B3 39 RTS0726 *0727 * Acknowledge Data Received0728 *0729 F4B4 34 02 XACK PSHS A0730 F4B6 86 06 LDA #ACK0731 F4B8 17 FD 7F LBSR OUTTER0732 F4BB 35 82 PULS A,PC0733 *0734 *0735 ** FLEX 9 IDE DISK DRIVERS0736 *0737 * FOR SYS09BUG 1.2 ON THE XSA-3S10000738 * WITH I/O MAPPED AT $XE0000739 * AND ROM MAPPED AT $XF0000740 *0741 *0742 * INITIALIZE CF CARD FOR 8 BIT LBA MODE0743 *0744 F4BD CC 00 06 INITDR LDD #AUXRESET0745 F4C0 FD E1 1E STD CF_AUX0746 F4C3 CC 00 02 LDD #AUXRSTREL0747 F4C6 FD E1 1E STD CF_AUX0748 F4C9 CC 00 E0 LDD #HEADLBA0749 F4CC FD E1 0C STD CF_HEAD0750 F4CF 16 02 D6 LBRA WTRDY0751 *0752 * RESTORE DISK DRIVER (SEEK TRACK 00)0753 *0754 F4D2 8D 66 RESTR1 BSR DRVSEL0755 F4D4 4F CLRA ; Track 00756 F4D5 C6 01 LDB #$01 ; Sector 10757 *0758 * Seek track and sector0759 * A holds track number (0 - ??)0760 * B holds sector number (1 - ??)0761 * Sector numbers starts from 10762 * subtract 1 to start from sector 0 on CF0763 *0764 F4D7 34 02 SEEKTS PSHS A0765 F4D9 4F CLRA0766 F4DA 5A DECB0767 F4DB FD E1 06 STD CF_SECNUM0768 F4DE E6 E4 LDB ,S0769 F4E0 FD E1 08 STD CF_CYLLO0770 F4E3 F6 01 00 LDB DRVNUM0771 F4E6 FD E1 0A STD CF_CYLHI0772 F4E9 C6 01 LDB #$010773 F4EB FD E1 04 STD CF_SECCNT0774 F4EE 5F CLRB0775 F4EF 35 82 PULS A,PC0776 *0777 * READ SECTORS FROM CF0778 *0779 *0780 F4F1 8D E4 READSC BSR SEEKTS0781 F4F3 CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE0782 F4F6 FD E1 0E STD CF_COMAND0783 F4F9 17 02 AC LBSR WTRDY0784 *0785 * READ LOOP0786 *0787 F4FC 34 20 PSHS Y0788 F4FE 10 8E 01 00 LDY #2560789 F502 17 02 B2 RDLP1 LBSR WTDRQ0790 F505 FC E1 00 LDD CF_DATA0791 F508 E7 80 STB ,X+0792 F50A 31 3F LEAY -1,Y0793 F50C 26 F4 BNE RDLP10794 F50E 35 20 PULS Y0795 *0796 F510 17 02 95 LBSR WTRDY0797 F513 5F CLRB0798 F514 39 RTS0799 *0800 * WRITE SECTOR TO CF0801 *0802 F515 8D C0 WRITSC BSR SEEKTS ; SEEK TRACK & SECTOR0803 F517 CC 00 30 LDD #CMDWRITE ; IDE WRITE MULTIPLE0804 F51A FD E1 0E STD CF_COMAND0805 F51D 17 02 88 LBSR WTRDY0806 *0807 * WRITE LOOP0808 *0809 F520 34 20 PSHS Y0810 F522 10 8E 01 00 LDY #2560811 F526 4F CLRA0812 F527 17 02 8D WRTLP1 LBSR WTDRQ0813 F52A E6 80 LDB ,X+0814 F52C FD E1 00 STD CF_DATA0815 F52F 31 3F LEAY -1,Y0816 F531 26 F4 BNE WRTLP10817 F533 35 20 PULS Y0818 *0819 F535 17 02 70 LBSR WTRDY0820 F538 5F CLRB0821 F539 39 RTS0822 *0823 * DRIVE SELECT DISK DRIVER0824 *0825 F53A A6 03 DRVSEL LDA 3,X GET DRIVE # FROM FCB0826 F53C 81 03 CMPA #30827 F53E 23 01 BLS DRVS2 IF > 3, SET IT TO 00828 F540 4F CLRA0829 F541 B7 01 00 DRVS2 STA DRVNUM0830 F544 5F CLRB ; SET Z, CLEAR C0831 F545 39 RTS0832 *0833 * CHECK DRIVE READY DISK DRIVER0834 *0835 F546 A6 03 CHKDRV LDA 3,X0836 F548 5F CLRB ; CLEAR C, SET Z0837 F549 39 RTS0838 *******************************************************0839 *0840 * Bootstrap FLEX Loader0841 *0842 * SBUG1.8 loads the bootstap loader at $C0000843 * however the Flex adaption manual has the0844 * bootstrap loader residing at $C1000845 * Bootstrap Loader is position independent code0846 *0847 ******************************************************0848 *0849 * Equates0850 *0851 C0FF BSSTACK EQU $C0FF0852 C300 SCTBUF EQU $C3000853 *0854 * Start of Utility0855 *0856 F700 ORG MONEXT+$07000857 F700 20 0B BOOT BRA BLOAD00858 F702 00 00 00 FCB 0,0,00859 F705 00 TRK FCB 0 File start track0860 F706 00 SCT FCB 0 File start sector0861 F707 00 DNS FCB 0 Density Flag (not used)0862 F708 C0 00 TADR FDB $C000 Transfer address0863 F70A 00 00 LADR FDB 0 Load Address0864 F70C 00 DRNUM FCB 0 Drive number 00865 *0866 F70D 10 CE C0 FF BLOAD0 LDS #BSSTACK Set up Bootstrap stack0867 F711 EC 8C F1 LDD TRK,PCR Set up start track and sector0868 F714 FD C3 00 STD SCTBUF0869 F717 10 8E C4 00 LDY #SCTBUF+2560870 *0871 * Perform actual file load0872 *0873 F71B 8D 35 BLOAD1 BSR GETCH Get acharcater0874 F71D 81 02 CMPA #$02 Data record hearder ?0875 F71F 27 10 BEQ BLOAD2 Skip, is so0876 F721 81 16 CMPA #$16 Xfr address hearder ?0877 F723 26 F6 BNE BLOAD1 Loop if neither0878 *0879 * Get transfer address0880 *0881 F725 8D 2B BSR GETCH0882 F727 A7 8C DE STA TADR,PCR0883 F72A 8D 26 BSR GETCH0884 F72C A7 8C DA STA TADR+1,PCR0885 F72F 20 EA BRA BLOAD10886 *0887 * Load data record0888 *0889 F731 8D 1F BLOAD2 BSR GETCH Get load address0890 F733 A7 8C D4 STA LADR,PCR0891 F736 8D 1A BSR GETCH0892 F738 A7 8C D0 STA LADR+1,PCR0893 F73B 8D 15 BSR GETCH Get Bytes count0894 F73D 1F 89 TFR A,B0895 F73F 5D TSTB0896 F740 27 D9 BEQ BLOAD1 Loop if count = 00897 F742 AE 8C C5 LDX LADR,PCR Get load address0898 F745 34 14 BLOAD3 PSHS B,X0899 F747 8D 09 BSR GETCH Get data character0900 F749 35 14 PULS B,X0901 F74B A7 80 STA ,X+ Store at load address0902 F74D 5A DECB0903 F74E 26 F5 BNE BLOAD3 Loop until count = 00904 F750 20 C9 BRA BLOAD10905 *0906 * Get Character routine0907 * Reads a sector if needed0908 *0909 F752 10 8C C4 00 GETCH CMPY #SCTBUF+256 out of data ?0910 F756 26 0F BNE GETCH4 Go read Character if not0911 F758 8E C3 00 GETCH2 LDX #SCTBUF Point to buffer0912 F75B EC 84 LDD 0,X Get forward Link0913 F75D 27 0B BEQ GOFLEX if zero, file is loaded0914 F75F 8D 26 BSR READ Read next sector0915 F761 26 9D BNE BOOT start over if error0916 F763 10 8E C3 04 LDY #SCTBUF+4 Point past link0917 F767 A6 A0 GETCH4 LDA ,Y+ Else, get a character0918 F769 39 RTS0919 *0920 * File is loaded, Jump to it0921 *0922 F76A 6E 9C 9B GOFLEX JMP [TADR,PCR] Jump to transfer address09230924 *0925 ** FLEX 9 IDE DISK DRIVERS0926 *0927 * Seek track and sector0928 * A holds track number (0 - ??)0929 * B holds sector number (1 - ??)0930 * Sector numbers starts from 10931 * subtract 1 to start from sector 0 on CF0932 *0933 F76D 34 02 SEEK PSHS A0934 F76F 4F CLRA0935 F770 5A DECB0936 F771 FD E1 06 STD CF_SECNUM0937 F774 E6 E4 LDB ,S0938 F776 FD E1 08 STD CF_CYLLO0939 F779 E6 8C 90 LDB DRNUM,PCR0940 F77C FD E1 0A STD CF_CYLHI0941 F77F C6 01 LDB #$010942 F781 FD E1 04 STD CF_SECCNT0943 F784 5F CLRB0944 F785 35 82 PULS A,PC0945 *0946 * READ SECTORS FROM CF0947 *0948 *0949 F787 8D E4 READ BSR SEEK0950 F789 CC 00 20 LDD #CMDREAD ; IDE READ MULTIPLE0951 F78C FD E1 0E STD CF_COMAND0952 F78F 8D 17 BSR WTRDY0953 *0954 * READ LOOP0955 *0956 F791 34 20 PSHS Y0957 F793 10 8E 01 00 LDY #2560958 F797 8D 1E READ1 BSR WTDRQ0959 F799 FC E1 00 LDD CF_DATA0960 F79C E7 80 STB ,X+0961 F79E 31 3F LEAY -1,Y0962 F7A0 26 F5 BNE READ10963 F7A2 35 20 PULS Y0964 *0965 F7A4 8D 02 BSR WTRDY0966 F7A6 5F CLRB0967 F7A7 39 RTS0968 *0969 * WAIT UNTIL READY0970 *0971 F7A8 FC E1 0E WTRDY LDD CF_STATUS0972 F7AB C5 80 BITB #BUSY0973 F7AD 26 F9 BNE WTRDY0974 F7AF FC E1 0E LDD CF_STATUS0975 F7B2 C5 40 BITB #DRDY0976 F7B4 27 F2 BEQ WTRDY0977 F7B6 39 RTS0978 *0979 * WAIT FOR DATA REQUEST0980 *0981 F7B7 FC E1 0E WTDRQ LDD CF_STATUS0982 F7BA C5 08 BITB #DRQ0983 F7BC 27 F9 BEQ WTDRQ0984 F7BE 39 RTS0985 *0004 END0000 INCLUDE "sys09bug.asm"0001 * NAM SYS09BUG12 SYSTEM09 MONITOR0002 OPT lsys09bug.asm page 30004 *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 C5 FDB INCHEK0159 F80A FC E0 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 74 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 B5 LBSR IOINIZ ; INITIALIZE CONTROL PORT0211 F842 8E FE 84 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 A3 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 AA 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 65 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 5E PRTCMD LBSR OUTCH ; PRNT CMD CHAR0249 F882 17 04 59 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 3B 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 74 CMPX #TABEND ; REACHED END OF TABLE YET ?0262 F897 26 F5 BNE NXTCHR ; IF NOT END, CHECK NEXT ENTRY0263 F899 8E FE AC 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 B2 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 21 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 19 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 FA LBSR OUT1S ; OUTPUT SPACE0304 F8E4 86 3F LDA #'? ; LOAD QUESTION MARK0305 F8E6 17 03 F7 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 A6 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 B2 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 A8 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 A0 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 98 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 89 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 5B BPERR LBSR OUT1S ; OUTPUT SPACE0415 F983 86 3F LDA #'? ; LOAD (?), INDICATE BREAKPOINT ERROR0416 F985 16 03 58 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 CFBOOT BSR WAITRDY0698 LDA #HEADLBA0699 STA CF_HEAD0700 BSR WAITRDY0701 LDA #FEAT8BIT0702 STA CF_FEATURE0703 LDA #CMDFEATURE0704 STA CF_COMAND0705 BSR WAITRDY0706 *0707 * READ SECTORS FROM CF0708 *0709 CFREAD LDA #$010710 STA CF_SECCNT0711 CLRA0712 STA CF_SECNUM0713 STA CF_CYLLO0714 STA CF_CYLHI0715 *0716 LDA #CMDREAD ; IDE READ MULTIPLE0717 STA CF_COMAND0718 BSR WAITRDY0719 LDX #$C0000720 *0721 * READ LOOP0722 *0723 RDLOOP BSR WAITDRQ0724 LDA CF_DATA0725 STA ,X+0726 CMPX #$C2000727 BNE RDLOOP0728 *0729 LDX #$C0000730 STX $0A,U0731 TFR U,S0732 RTI0733 *0734 * WAIT UNTIL READY0735 *0736 WAITRDY LDA CF_STATUS0737 BITA #BUSY0738 BNE WAITRDY0739 LDA CF_STATUS0740 BITA #DRDY0741 BEQ WAITRDY0742 RTS0743 *0744 * WAIT FOR DATA REQUEST0745 *0746 WAITDRQ LDA CF_STATUS0747 BITA #DRQ0748 BEQ WAITDRQ0749 RTS0750 ENDIF CF8OPT0750 ENDIF CF8OPT0751 *0752 IFD IDEOPT0753 *0754 * XESS 16 BIT IDE BOOT0755 *0756 F9D5 CC 00 06 IDEBOOT LDD #AUXRESET0757 F9D8 FD E1 1E STD CF_AUX0758 F9DB CC 00 02 LDD #AUXRSTREL0759 F9DE FD E1 1E STD CF_AUX0760 F9E1 CC 00 E0 LDD #HEADLBA0761 F9E4 FD E1 0C STD CF_HEAD0762 F9E7 8D 2E BSR WAITRDY0763 *0764 * READ SECTORS FROM CF0765 *0766 F9E9 CC 00 01 LDD #$010767 F9EC FD E1 04 STD CF_SECCNT0768 F9EF 5F CLRB0769 F9F0 FD E1 06 STD CF_SECNUM0770 F9F3 FD E1 08 STD CF_CYLLO0771 F9F6 FD E1 0A STD CF_CYLHI0772 *0773 F9F9 C6 20 LDB #CMDREAD ; IDE READ MULTIPLE0774 F9FB FD E1 0E STD CF_COMAND0775 F9FE 8D 17 BSR WAITRDY0776 FA00 8E C0 00 LDX #$C0000777 *0778 * READ LOOP0779 *0780 FA03 8D 21 RDLOOP BSR WAITDRQ0781 FA05 FC E1 00 LDD CF_DATA0782 FA08 E7 80 STB ,X+0783 FA0A 8C C1 00 CMPX #$C1000784 FA0D 26 F4 BNE RDLOOP0785 *0786 FA0F 8E C0 00 LDX #$C0000787 FA12 AF 4A STX $0A,U0788 FA14 1F 34 TFR U,S0789 FA16 3B RTI0790 *0791 * WAIT UNTIL READY0792 *0793 FA17 FC E1 0E WAITRDY LDD CF_STATUS0794 FA1A C5 80 BITB #BUSY0795 FA1C 26 F9 BNE WAITRDY0796 FA1E FC E1 0E LDD CF_STATUS0797 FA21 C5 40 BITB #DRDY0798 FA23 27 F2 BEQ WAITRDY0799 FA25 39 RTS0800 *0801 * WAIT FOR DATA REQUEST0802 *0803 FA26 FC E1 0E WAITDRQ LDD CF_STATUS0804 FA29 C5 08 BITB #DRQ0805 FA2B 27 F9 BEQ WAITDRQ0806 FA2D 39 RTS0807 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 F9 LOAD JSR ACINIZ0928 FA61 86 11 LDA #$11 ; LOAD 'DC1' CASS. READ ON CODE0929 FA63 17 02 7A 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 2C 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 24 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 F9 JSR ACINIZ0981 FAD0 86 12 LDA #$12 ; LOAD 'DC2' PUNCH ON CODE0982 FAD2 17 02 0B 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 F3 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 C9 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 A4 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 B3 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 51 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 B6 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 C2 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 D4 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 CE 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 C8 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 BC 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 DA 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 DF 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 E4 PRTCC LDX #MSG18 ; POINT TO MSG "CC:"1157 FBE3 8D AA BSR PDATA ; PRINT MSG1158 FBE5 A6 C4 LDA ,U1159 FBE7 8E FE EB 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 B2 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 B2 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 CA 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 63 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 55 PRTBA BSR OUTCH ; PRINT IT1283 FC8B 8D 51 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 3F 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 FCA3 86 11 LDA #$11 ; SET RTS* LOW, REQUEST FAR END TO TX1322 FCA5 A7 9F DF E0 STA [CPORT]1323 ENDIF HFCOPT1324 FCA9 BE DF E0 GETSTA LDX CPORT ; POINT TO TERMINAL PORT1325 FCAC A6 84 LDA ,X ; FETCH PORT STATUS1326 FCAE 85 01 BITA #1 ; TEST READY BIT, RDRF ?1327 IFD PS2OPT1328 FCB0 26 09 BNE GETST11329 FCB2 8E E0 20 LDX #PS2KBD1330 FCB5 A6 84 LDA ,X1331 FCB7 85 01 BITA #11332 ENDIF PS2OPT1333 FCB9 27 EE BEQ GETSTA ; IF NOT RDY, THEN TRY AGAIN1334 FCBB GETST1 EQU *1335 IFD HFCOPT1336 FCBB 86 51 LDA #$51 ; SET RTS* HIGH, STOP FAR END FROM TXING, UNTIL NEXT INPUT1337 FCBD A7 9F DF E0 STA [CPORT]1338 ENDIF HFCOPT1339 FCC1 A6 01 LDA 1,X ; FETCH CHAR1340 FCC3 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 FCC5 34 02 INCHEK PSHS A ; SAVE A ACCUM1352 IFD HFCOPT1353 FCC7 86 11 LDA #$11 ; SET RTS* LOW, REQUEST FAR END TO TX1354 FCC9 A7 9F DF E0 STA [CPORT]1355 ENDIF HFCOPT1356 FCCD A6 9F DF E0 LDA [CPORT] ; FETCH PORT STATUS1357 FCD1 85 01 BITA #1 ; TEST READY BIT, RDRF ?1358 IFD PS2OPT1359 FCD3 26 05 BNE INCHEK11360 FCD5 B6 E0 20 LDA PS2KBD1361 FCD8 85 01 BITA #1 ; TEST READY BIT< RDRF ?1362 ENDIF PS2OPT1363 FCDA 35 82 INCHEK1 PULS A,PC ; RESTORE A ACCUM.1364 *1365 FCDC 8D 00 OUT2S BSR OUT1S ; OUTPUT 2 SPACES1366 FCDE 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 FCE0 8D 49 BSR VOUTCH1378 ENDIF VDUOPT1379 IFD DG640OPT1380 BSR VOUTCH1381 ENDIF DG640OPT1381 ENDIF DG640OPT1382 FCE2 34 12 AOUTCH PSHS A,X ; SAVE A ACCUM AND IX1383 FCE4 BE DF E0 LDX CPORT ; GET ADDR. OF TERMINAL1384 FCE7 A6 84 FETSTA LDA ,X ; FETCH PORT STATUS1385 FCE9 85 02 BITA #2 ; TEST TDRE, OK TO XMIT ?1386 FCEB 27 FA BEQ FETSTA ; IF NOT LOOP UNTIL RDY1387 FCED 85 08 BITA #8 ; CLEAR TO SEND ?1388 FCEF 26 F6 BNE FETSTA ; NO, LOOP UNTIL CLEAR1389 FCF1 35 02 PULS A ; GET CHAR. FOR XMIT1390 FCF3 A7 01 STA 1,X ; XMIT CHAR.1391 FCF5 35 90 PULS X,PC ; RESTORE IX1392 *1393 * IO INITIALIZATION1394 *1395 FCF7 IOINIZ EQU *1396 IFD VDUOPT1397 FCF7 8D 13 BSR VINIZ1398 ENDIF VDUOPT1399 IFD DG640OPT1400 BSR VINIZ1401 ENDIF DG640OPT1401 ENDIF DG640OPT1402 FCF9 BE DF E0 ACINIZ LDX CPORT ; POINT TO CONTROL PORT ADDRESS1403 FCFC 86 03 LDA #3 ; RESET ACIA PORT CODE1404 FCFE A7 84 STA ,X ; STORE IN CONTROL REGISTER1405 FD00 86 51 LDA #$51 ; SET 8 DATA, 2 STOP AN 0 PARITY RTS* HIGH1406 FD02 A7 84 STA ,X ; STORE IN CONTROL REGISTER1407 FD04 6D 01 TST 1,X ; ANYTHING IN DATA REGISTER?1408 FD06 86 FF LDA #$FF ; TURN ON ECHO FLAG1409 FD08 B7 DF E2 STA ECHO1410 FD0B 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 FD0C 8E E0 30 VINIZ LDX #VDU1426 FD0F CC 00 00 LDD #01427 FD12 FD DF FB STD COLADX ; AND ROWADX1428 FD15 A7 02 STA VDUCOL,X1429 FD17 E7 03 STB VDUROW,X1430 FD19 E7 04 STB VDUOFF,X1431 FD1B FD DF FD STD NEWROW ; AND ESCFLG1432 FD1E C6 02 LDB #$021433 FD20 E7 01 STB VDUATT,X1434 FD22 7F DF FE CLR ESCFLG1435 FD25 86 1B LDA #$1B ; SEND ESCAPE1436 FD27 8D 02 BSR VOUTCH1437 FD29 86 59 LDA #'Y ; CLEAR TO END OF SCREEN1438 *1439 ** VIDEO OUTPUT ROUTINE1440 *1441 FD2B 34 16 VOUTCH PSHS A,B,X ; SAVE REGISTERS1442 FD2D 8E E0 30 LDX #VDU ; POINT TO VDU REGISTERS1443 *1444 ** CHECK FOR ESCAPE SEQUENCE1445 *1446 FD30 7D DF FE TST ESCFLG ; ESCAPE ACTIVE?1447 FD33 27 04 BEQ SOROU1 ; BRANCH IF NOT1448 FD35 8D 60 BSR ESCAPE ; ELSE DO ESCAPE1449 FD37 20 0D BRA RETURN ; AND RETURN1450 *1451 ** CHECK FOR CONTROL CHARACTERS1452 *1453 FD39 81 20 SOROU1 CMPA #$20 ; CONTROL CODES?1454 FD3B 24 04 BHS SOROU21455 FD3D 8D 09 BSR CONTRL ; BRANCH IF SO1456 FD3F 20 05 BRA RETURN1457 *1458 ** OUTPUT TEXT CHARACTER1459 *1460 FD41 A7 84 SOROU2 STA VDUCHR,X ; DISPLAY CHARACTER1461 FD43 17 00 AF LBSR NEWCOL ; UPDATE COLUMN1462 *1463 ** DISPLAY CURSOR AND RETURN1464 *1465 FD46 35 96 RETURN PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN1466 *1467 ***************************************************1468 * CONTROL CODE HANDLERS *1469 ***************************************************1470 *1471 FD48 81 08 CONTRL CMPA #$08 ; CTRL H - BACKSPACE ?1472 FD4A 27 34 BEQ BACKSP1473 FD4C 81 1B CMPA #$1B ; ESCAPE SEQUENCE?1474 FD4E 27 5A BEQ SETESC1475 FD50 81 1A CMPA #$1A ; CTRL Z - Clear Screen1476 FD52 10 27 00 7C LBEQ CLRSCR1477 FD56 81 16 CMPA #$16 ; CTRL ^ - Home1478 FD58 27 38 BEQ HOME1479 FD5A 81 0D CMPA #$0D ; CTRL M - RETURN?1480 FD5C 10 27 00 89 LBEQ CRETN1481 FD60 81 0C CMPA #$0C ; CTRL L - CHAR RIGHT1482 FD62 27 24 BEQ CHRIGHT1483 FD64 81 0B CMPA #$0B ; CTRL K - MOVE UP ONE LINE1484 FD66 27 0F BEQ LINEUP1485 FD68 81 0A CMPA #$0A ; CTRL J - LINE FEED1486 FD6A 26 45 BNE RETESC ; NONE OF THESE, RETURN1487 *1488 ***************************************** LINE FEED1489 *1490 FD6C FC DF FB LINEFD LDD COLADX ; GET CURRENT COLUMN AND ROW1491 FD6F 5C INCB ; BUMP ROW1492 FD70 C1 19 CMPB #NUMLIN ; SCROLL TIME?1493 FD72 26 79 BNE NEWCUR ; POSITION CURSOR IF NOT1494 FD74 16 00 8F LBRA SCROLL ; ELSE SCROLL IT1495 *1496 ***************************************** LINE FEED1497 *1498 FD77 FC DF FB LINEUP LDD COLADX ; GET CURRENT COLUMN AND ROW1499 FD7A 5D TSTB ; AT TOP OF SCREEN ?1500 FD7B 27 34 BEQ RETESC ; Yes, Ignore1501 FD7D 5A DECB ; No, Decrement ROW1502 FD7E 20 6D BRA NEWCUR ; POSITION CURSOR1503 *1504 *********************************** BACK SPACE1505 *1506 FD80 B6 DF FB BACKSP LDA COLADX1507 FD83 27 2C BEQ RETESC ; RETURN1508 FD85 4A DECA1509 FD86 20 62 BRA POSCOL ; POSITION CURSOR1510 *1511 *********************************** CURSOR RIGHT1512 *1513 FD88 B6 DF FB CHRIGHT LDA COLADX1514 FD8B 4C INCA1515 FD8C 81 50 CMPA #LINLEN1516 FD8E 27 21 BEQ RETESC1517 FD90 20 58 BRA POSCOL1518 *1519 *********************************** CURSOR RIGHT1520 *1521 FD92 CC 00 00 HOME LDD #0 ; HOME - POSITION TOP OF SCREEN1522 FD95 20 56 BRA NEWCUR1523 *1524 ***************************************************1525 * ESCAPE HANDLERS *1526 ***************************************************1527 *1528 FD97 F6 DF FE ESCAPE LDB ESCFLG ; GET FLAG1529 FD9A C1 3D CMPB #'= ; SETTING CURSOR?1530 FD9C 27 14 BEQ ESCCUR ; BRANCH IF SO1531 FD9E 81 59 CMPA #'Y ; CLEAR TO END OF SCREEN?1532 FDA0 27 6E BEQ ESCCLS1533 FDA2 81 54 CMPA #'T ; CLEAR TO END OF LINE?1534 FDA4 27 31 BEQ ESCCLL1535 FDA6 81 3D CMPA #'= ; STARTING CURSOR SET?1536 FDA8 26 04 BNE CLRESC ; BRANCH IF NOT1537 *1538 ***************************** START ESCAPE SEQUENCE1539 *1540 FDAA B7 DF FE SETESC STA ESCFLG ; ELSE START CURSORING1541 FDAD 39 RTS ; AND RETURN1542 *1543 FDAE 7F DF FE CLRESC CLR ESCFLG ; NO OTHERS SUPPORTED1544 FDB1 39 RETESC RTS ; SO RETURN1545 *1546 ********************************* SET SCREEN CURSOR1547 *1548 FDB2 7D DF FD ESCCUR TST NEWROW ; ROW SET?1549 FDB5 26 04 BNE ESCCU1 ; BRANCH IF SO1550 FDB7 B7 DF FD STA NEWROW ; ELSE SET NEW ROW1551 FDBA 39 RTS ; AND RETURN1552 *1553 FDBB 7F DF FE ESCCU1 CLR ESCFLG1554 FDBE 80 20 SUBA #$20 ; ADJUST COLUMN ADDRESS1555 FDC0 81 4F CMPA #LINLEN-1 ;CHECK FOR ACCEPTABLE COLUM1556 FDC2 22 ED BHI RETESC ; NOT OK, DO NOTHING1557 *1558 FDC4 F6 DF FD ESCCU2 LDB NEWROW1559 FDC7 7F DF FD CLR NEWROW1560 FDCA C0 20 SUBB #$20 ; ADJUST TO ROW ADDRESS1561 FDCC C1 18 CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW1562 FDCE 22 E1 BHI RETESC ; ELSE RETURN DOING NOTHING1563 FDD0 20 1B BRA NEWCUR ; GO SET NEW CURSOR IF SO1564 *1565 ****************** CLEAR FROM CURSOR TO END OF LINE1566 *1567 FDD2 CC 00 00 CLRSCR LDD #0 ; CLEAR FROM TOP OF SCREEN1568 FDD5 8D 16 BSR NEWCUR1569 FDD7 B6 DF FB ESCCLL LDA COLADX1570 FDDA C6 20 LDB #$20 ; AND CLEAR CHAR1571 FDDC E7 84 ESCCL1 STB VDUCHR,X ; DISPLAY TEXT1572 FDDE 4C INCA1573 FDDF A7 02 STA VDUCOL,X1574 FDE1 81 50 CMPA #LINLEN ; UNTIL END OF LINE1575 FDE3 26 F7 BNE ESCCL11576 FDE5 7F DF FE CLR ESCFLG1577 FDE8 39 RTS1578 *1579 *********************************** CARRIAGE RETURN1580 *1581 FDE9 4F CRETN CLRA ; SET COLUMN ZERO1582 FDEA F6 DF FC POSCOL LDB ROWADX ; GET CURRENT ROW1583 *1584 *********** GENERATE NEW CURSOR POSITION AND RETURN1585 *1586 FDED FD DF FB NEWCUR STD COLADX ; SAVE NEW ROW AND COLUMN1587 FDF0 A7 02 STA VDUCOL,X ; SET NEW COLUMN1588 FDF2 E7 03 STB VDUROW,X ; SET NEW ROW1589 FDF4 39 RTS ; AND RETURN1590 *1591 ********************* UPDATE CURRENT COLUMN AND ROW1592 *1593 FDF5 FC DF FB NEWCOL LDD COLADX ; GET ROW AND COLUMN1594 FDF8 4C INCA ; BUMP COLUMN1595 FDF9 81 50 CMPA #LINLEN ; ROLL?1596 FDFB 26 F0 BNE NEWCUR ; BRANCH IF NOT1597 FDFD 4F CLRA ; ELSE RESET TO ZERO1598 FDFE 5C INCB ; AND BUMP ROW1599 FDFF C1 19 CMPB #NUMLIN1600 FE01 26 EA BNE NEWCUR1601 FE03 5A DECB ; BOTTOM ROW1602 FE04 8D E7 BSR NEWCUR1603 *1604 ********************************* SCROLL THE SCREEN1605 *1606 FE06 E6 04 SCROLL LDB VDUOFF,X1607 FE08 5C INCB1608 FE09 C1 19 CMPB #NUMLIN1609 FE0B 25 01 BLO SCROL11610 FE0D 5F CLRB1611 FE0E E7 04 SCROL1 STB VDUOFF,X1612 *1613 **************** CLEAR FROM CURSOR TO END OF SCREEN1614 *1615 FE10 F6 DF FB ESCCLS LDB COLADX ; GET CURSOR1616 FE13 86 20 LDA #$20 ; GET A SPACE1617 FE15 F7 DF FB ESCCLS1 STB COLADX1618 FE18 E7 02 STB VDUCOL,X1619 FE1A A7 84 STA VDUCHR,X1620 FE1C 5C INCB1621 FE1D C1 50 CMPB #LINLEN1622 FE1F 26 F4 BNE ESCCLS11623 *1624 FE21 F6 DF FC LDB ROWADX1625 FE24 5C INCB1626 FE25 C1 19 CMPB #NUMLIN1627 FE27 27 08 BEQ ESCCLS21628 FE29 F7 DF FC STB ROWADX1629 FE2C E7 03 STB VDUROW,X1630 FE2E 5F CLRB1631 FE2F 20 E4 BRA ESCCLS11632 *1633 FE31 5F ESCCLS2 CLRB1634 FE32 F7 DF FB STB COLADX1635 FE35 E7 02 STB VDUCOL,X1636 FE37 F7 DF FE STB ESCFLG1637 FE3A 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 FE3B JMPTAB EQU *1953 FE3B 01 FCB 1 " ^A "1954 FE3C FB 74 FDB ALTRA1955 FE3E 02 FCB 2 " ^B "1956 FE3F FB 69 FDB ALTRB1957 FE41 03 FCB 3 " ^C "1958 FE42 FB 7F FDB ALTRCC1959 FE44 04 FCB 4 " ^D "1960 FE45 FB 5E FDB ALTRDP1961 FE47 10 FCB $10 " ^P "1962 FE48 FB 31 FDB ALTRPC1963 FE4A 15 FCB $15 " ^U "1964 FE4B FB 3D FDB ALTRU1965 FE4D 18 FCB $18 " ^X "1966 FE4E FB 53 FDB ALTRX1967 FE50 19 FCB $19 " ^Y "1968 FE51 FB 48 FDB ALTRY1969 *1970 FE53 42 FCC 'B'1971 FE54 F9 5C FDB BRKPNT1972 FE56 45 FCC 'E'1973 FE57 F8 FD FDB MEMDUMP1974 FE59 47 FCC 'G'1975 FE5A F8 A5 FDB GO1976 FE5C 4C FCC 'L'1977 FE5D FA 5E FDB LOAD1978 FE5F 50 FCC 'P'1979 FE60 FA BC FDB PUNCH1980 FE62 4D FCC 'M'1981 FE63 F8 A8 FDB MEMCHG1982 FE65 52 FCC 'R'1983 FE66 FB ED FDB REGSTR1984 FE68 53 FCC 'S'1985 FE69 F8 F1 FDB DISSTK1986 FE6B 58 FCC 'X'1987 FE6C F9 88 FDB XBKPNT1988 IFD MFDCOPT1989 FCC 'D' ; *** SWTPC USES 'U' FOR MINIBOOT1990 FDB MINBOOT1991 ENDIF MFDCOPT1991 ENDIF MFDCOPT1992 IFD CF8OPT1993 FCC 'D' ; *** FPGA 8 BIT USES 'D' FOR CFBOOT1994 FDB CFBOOT1995 ENDIF CF8OPT1995 ENDIF CF8OPT1996 IFD IDEOPT1997 FE6E 44 FCC 'D' ; *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT1998 FE6F F9 D5 FDB IDEBOOT1999 ENDIF IDEOPT2000 IFD DMAFOPT2001 FCC 'U' ; *** SWTPC USES 'D' FOR DMAF2 BOOT2002 FDB DBOOT2003 ENDIF DMAFOPT2003 ENDIF DMAFOPT2004 IFD EXTOPT2005 FE71 55 FCC 'U' ; *** IF FPGA, 'U' IS FOR USER2006 FE72 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 FE74 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 FE74 F9 94 RAMVEC FDB SWIE ; USER-V2029 FE76 F8 A7 FDB RTI ; SWI3-V2030 FE78 F8 A7 FDB RTI ; SWI2-V2031 FE7A F8 A7 FDB RTI ; FIRQ-V2032 FE7C F8 A7 FDB RTI ; IRQ-V2033 FE7E F9 94 FDB SWIE ; SWI-V2034 FE80 FF FF FDB $FFFF ; SVC-VO2035 FE82 FF FF FDB $FFFF ; SVC-VL2036 *2037 * PRINTABLE MESSAGE STRINGS2038 *2039 FE84 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 02040 FE89 53 79 73 30 39 42 FCC 'Sys09Bug 1.7 FOR '75 67 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 ATLOPT2063 FE9A 41 74 6C 79 73 FCC 'Atlys'2064 ENDIF ATLOPT2065 IFD DE270OPT2066 FCC 'DE2-70'2067 ENDIF DE270OPT2067 ENDIF DE270OPT2068 FE9F 20 2D 20 FCC ' - '2069 FEA2 04 FCB 42070 FEA3 4B 0D 0A 00 00 00 MSG2 FCB 'K,$0D,$0A,$00,$00,$00,$04 ; K,<CR>,<LF>,3 NULS,<EOT>042071 FEAA 3E MSG3 FCC '>'2072 FEAB 04 FCB 42073 FEAC 57 48 41 54 3F MSG4 FCC 'WHAT?'2074 FEB1 04 FCB 42075 FEB2 20 2D 20 MSG5 FCC ' - '2076 FEB5 04 FCB 4'2077 FEB6 20 20 53 50 3D MSG10 FCC ' SP='2078 FEBB 04 FCB 42079 FEBC 20 20 50 43 3D MSG11 FCC ' PC='2080 FEC1 04 FCB 42081 FEC2 20 20 55 53 3D MSG12 FCC ' US='2082 FEC7 04 FCB 42083 FEC8 20 20 49 59 3D MSG13 FCC ' IY='2084 FECD 04 FCB 42085 FECE 20 20 49 58 3D MSG14 FCC ' IX='2086 FED3 04 FCB 42087 FED4 20 20 44 50 3D MSG15 FCC ' DP='2088 FED9 04 FCB 42089 FEDA 20 20 41 3D MSG16 FCC ' A='2090 FEDE 04 FCB 42091 FEDF 20 20 42 3D MSG17 FCC ' B='2092 FEE3 04 FCB 42093 FEE4 20 20 43 43 3A 20 MSG18 FCC ' CC: '2094 FEEA 04 FCB 42095 FEEB 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'56 432096 FEF3 53 31 MSG20 FCC 'S1'2097 FEF5 04 FCB 42098 IFD DATOPT2099 *2100 * POWER UP/ RESET/ NMI ENTRY POINT2101 *2102 FF00 ORG $FF002103 *2104 *2105 FF00 8E FF F0 START LDX #IC11 ; POINT TO DAT RAM IC112106 FF03 86 0F LDA #$0F ; GET COMPLIMENT OF ZERO2107 *2108 *2109 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F2110 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS2111 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE2112 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA2113 * STORED IN IT.2114 *2115 *2116 FF05 A7 80 DATLP STA ,X+ ; STORE & POINT TO NEXT RAM LOCATION2117 FF07 4A DECA ; GET COMP. VALUE FOR NEXT LOCATION2118 FF08 26 FB BNE DATLP ; ALL 16 LOCATIONS INITIALIZED ?2119 *2120 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER2121 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL2122 * PHYSICAL ADDRESSES.2123 *2124 FF0A 86 F0 LDA #$F02125 FF0C A7 84 STA ,X ; STORE $F0 AT $FFFF2126 FF0E 8E D0 A0 LDX #$D0A0 ; ASSUME RAM TO BE AT $D000-$DFFF2127 FF11 10 8E 55 AA LDY #TSTPAT ; LOAD TEST DATA PATTERN INTO "Y"2128 FF15 EE 84 TSTRAM LDU ,X ; SAVE DATA FROM TEST LOCATION2129 FF17 10 AF 84 STY ,X ; STORE TEST PATTERN AT $D0A02130 FF1A 10 AC 84 CMPY ,X ; IS THERE RAM AT THIS LOCATION ?2131 FF1D 27 0B BEQ CNVADR ; IF MATCH THERE'S RAM, SO SKIP2132 FF1F 30 89 F0 00 LEAX -$1000,X ; ELSE POINT 4K LOWER2133 FF23 8C F0 A0 CMPX #$F0A0 ; DECREMENTED PAST ZER0 YET ?2134 FF26 26 ED BNE TSTRAM ; IF NOT CONTINUE TESTING FOR RAM2135 FF28 20 D6 BRA START ; ELSE START ALL OVER AGAIN2136 *2137 *2138 * THE FOLLOWING CODE STORES THE COMPLEMENT OF2139 * THE MS CHARACTER OF THE FOUR CHARACTER HEX2140 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED2141 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT2142 * IS STORED IN RAM IN THE LOCATION THAT IS2143 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,2144 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND2145 * WHEN TESTING LOCATION $70A0, MEANING THERE2146 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE2147 * $8000-$DFFF, THEN THE COMPLEMENT OF THE2148 * "7" IN THE $70A0 WILL BE STORED IN2149 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS2150 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND2151 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE2152 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE2153 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---2154 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT2155 * IS AT $D--- SINCE THAT IS THE ADDRESS THE2156 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK2157 * OF RAM RESPONDS.2158 *2159 *2160 FF2A EF 84 CNVADR STU ,X ; RESTORE DATA AT TEST LOCATION2161 FF2C 1F 10 TFR X,D ; PUT ADDR. OF PRESENT 4K BLOCK IN D2162 FF2E 43 COMA ; COMPLEMENT MSB OF THAT ADDRESS2163 FF2F 44 LSRA ; PUT MS 4 BITS OF ADDRESS IN2164 FF30 44 LSRA ; LOCATION D0-D3 TO ALLOW STORING2165 FF31 44 LSRA ; IT IN THE DYNAMIC ADDRESS2166 FF32 44 LSRA ; TRANSLATION RAM.2167 FF33 B7 FF FD STA $FFFD ; STORE XLATION FACTOR IN DAT "D"2168 *2169 FF36 10 CE DF C0 LDS #STACK ; INITIALIZE STACK POINTER2170 *2171 *2172 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES2173 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK2174 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS2175 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION2176 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF2177 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO2178 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....2179 *2180 * 0 1 2 3 4 5 6 7 8 9 A B C D E F2181 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --2182 *2183 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE2184 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....2185 *2186 * 0 1 2 3 4 5 6 7 8 9 A B C D E F2187 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F02188 *2189 *2190 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF2191 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL2192 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK2193 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT2194 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C0002195 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D0002196 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE2197 * MEMORY ADDRESSED AS FOLLOWS....2198 *2199 * 0 1 2 3 4 5 6 7 8 9 A B C D E F2200 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --2201 *2202 *2203 FF3A 10 8E DF D0 LDY #LRARAM ; POINT TO LOGICAL/REAL ADDR. TABLE2204 FF3E A7 2D STA 13,Y ; STORE $D--- XLATION FACTOR AT $DFDD2205 FF40 6F 2E CLR 14,Y ; CLEAR $DFDE2206 FF42 86 F0 LDA #$F0 ; DESTINED FOR IC8 AN MEM EXPANSION ?2207 FF44 A7 2F STA 15,Y ; STORE AT $DFDF2208 FF46 86 0C LDA #$0C ; PRESET NUMBER OF BYTES TO CLEAR2209 FF48 6F A6 CLRLRT CLR A,Y ; CLEAR $DFDC THRU $DFD02210 FF4A 4A DECA ; SUB. 1 FROM BYTES LEFT TO CLEAR2211 FF4B 2A FB BPL CLRLRT ; CONTINUE IF NOT DONE CLEARING2212 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X ; POINT TO NEXT LOWER 4K OF RAM2213 FF51 8C F0 A0 CMPX #$F0A0 ; TEST FOR DECREMENT PAST ZERO2214 FF54 27 22 BEQ FINTAB ; SKIP IF FINISHED2215 FF56 EE 84 LDU ,X ; SAVE DATA AT CURRENT TEST LOCATION2216 FF58 10 8E 55 AA LDY #TSTPAT ; LOAD TEST DATA PATTERN INTO Y REG.2217 FF5C 10 AF 84 STY ,X ; STORE TEST PATT. INTO RAM TEST LOC.2218 FF5F 10 AC 84 CMPY ,X ; VERIFY RAM AT TEST LOCATION2219 FF62 26 E9 BNE FNDRAM ; IF NO RAM GO LOOK 4K LOWER2220 FF64 EF 84 STU ,X ; ELSE RESTORE DATA TO TEST LOCATION2221 FF66 10 8E DF D0 LDY #LRARAM ; POINT TO LOGICAL/REAL ADDR. TABLE2222 FF6A 1F 10 TFR X,D ; PUT ADDR. OF PRESENT 4K BLOCK IN D2223 FF6C 44 LSRA ; PUT MS 4 BITS OF ADDR. IN LOC. D0-D32224 FF6D 44 LSRA ; TO ALLOW STORING IT IN THE DAT RAM.2225 FF6E 44 LSRA2226 FF6F 44 LSRA2227 FF70 1F 89 TFR A,B ; SAVE OFFSET INTO LRARAM TABLE2228 FF72 88 0F EORA #$0F ; INVERT MSB OF ADDR. OF CURRENT 4K BLK2229 FF74 A7 A5 STA B,Y ; SAVE TRANSLATION FACTOR IN LRARAM TABLE2230 FF76 20 D5 BRA FNDRAM ; GO TRANSLATE ADDR. OF NEXT 4K BLK2231 FF78 86 F1 FINTAB LDA #$F1 ; DESTINED FOR IC8 AND MEM EXPANSION ?2232 FF7A 10 8E DF D0 LDY #LRARAM ; POINT TO LRARAM TABLE2233 FF7E A7 2E STA 14,Y ; STORE $F1 AT $DFCE2234 *2235 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF2236 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES2237 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT2238 * LOGICALLY RESPONDS TO THE ADDRESS $C---.2239 *2240 *2241 FF80 86 0C LDA #$0C ; PRESET NUMBER HEX "C"2242 FF82 E6 A6 FINDC LDB A,Y ; GET ENTRY FROM LRARAM TABLE2243 FF84 26 05 BNE FOUNDC ; BRANCH IF RAM THIS PHYSICAL ADDR.2244 FF86 4A DECA ; ELSE POINT 4K LOWER2245 FF87 2A F9 BPL FINDC ; GO TRY AGAIN2246 FF89 20 14 BRA XFERTF2247 FF8B 6F A6 FOUNDC CLR A,Y ; CLR XLATION FACTOR OF 4K BLOCK FOUND2248 FF8D E7 2C STB $0C,Y ; GIVE IT XLATION FACTOR MOVING IT TO $C---2249 *2250 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION2251 * FACTORS SUCH THAT ALL REMAINING RAM WILL2252 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL2253 * ADDRESSES FROM $0000 AND UP....2254 *2255 FF8F 4F CLRA ; START AT ZERO2256 FF90 1F 21 TFR Y,X ; START POINTER "X" START OF "LRARAM" TABLE.2257 FF92 E6 A6 COMPRS LDB A,Y ; GET ENTRY FROM "LRARAM" TABLE2258 FF94 27 04 BEQ PNTNXT ; IF IT'S ZER0 SKIP2259 FF96 6F A6 CLR A,Y ; ELSE ERASE FROM TABLE2260 FF98 E7 80 STB ,X+ ; AND ENTER ABOVE LAST ENTRY- BUMP2261 FF9A 4C PNTNXT INCA ; GET OFFSET TO NEXT ENTRY2262 FF9B 81 0C CMPA #$0C ; LAST ENTRY YET ?2263 FF9D 2D F3 BLT COMPRS2264 *2265 * THE FOLLOWING CODE TRANSFER THE TRANSLATION2266 * FACTORS FROM THE LRARAM TABLE TO IC11 ON2267 * THE MP-09 CPU CARD.2268 *2269 FF9F 8E FF F0 XFERTF LDX #IC11 ; POINT TO DAT RAM IC112270 FFA2 C6 10 LDB #$10 ; GET NO. OF BYTES TO MOVE2271 FFA4 A6 A0 FETCH LDA ,Y+ ; GET BYTE AND POINT TO NEXT2272 FFA6 A7 80 STA ,X+ ; POKE XLATION FACTOR IN IC112273 FFA8 5A DECB ; SUB 1 FROM BYTES TO MOVE2274 FFA9 26 F9 BNE FETCH ; CONTINUE UNTIL 16 MOVED2275 *2276 ELSE2277 LRA RTS2278 START LDS #STACK ; INITIALIZE STACK POINTER2279 CLRB2280 ENDIF DATOPT2280 ENDIF DATOPT2281 *2282 FFAB 53 COMB ; SET "B" NON-ZERO2283 FFAC F7 DF E2 STB ECHO ; TURN ON ECHO FLAG2284 FFAF 16 F8 62 LBRA MONITOR ; INITIALIZATION IS COMPLETE2285 *2286 ** INTERRUPT JUMP VECTORS2287 *2288 FFB2 6E 9F DF C0 V1 JMP [STACK]2289 FFB6 6E 9F DF C4 V2 JMP [SWI2]2290 FFBA 6E 9F DF C6 V3 JMP [FIRQ]2291 FFBE 6E 9F DF C8 V4 JMP [IRQ]2292 FFC2 6E 9F DF CA V5 JMP [SWI]2293 *2294 * SWI3 ENTRY POINT2295 *2296 FFC6 1F 43 SWI3E TFR S,U2297 FFC8 AE 4A LDX 10,U *$FFC82298 FFCA E6 80 LDB ,X+2299 FFCC AF 4A STX 10,U2300 FFCE 4F CLRA2301 FFCF 58 ASLB2302 FFD0 49 ROLA2303 FFD1 BE DF CC LDX SVCVO2304 FFD4 8C FF FF CMPX #$FFFF2305 FFD7 27 0F BEQ SWI3Z2306 FFD9 30 8B LEAX D,X2307 FFDB BC DF CE CMPX SVCVL2308 FFDE 22 08 BHI SWI3Z2309 FFE0 34 10 PSHS X2310 FFE2 EC C4 LDD ,U2311 FFE4 AE 44 LDX 4,U2312 FFE6 6E F1 JMP [,S++]2313 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP2314 FFEA EE 42 LDU 2,U2315 FFEC 6E 9F DF C2 JMP [SWI3]2316 *2317 * 6809 VECTORS2318 *2319 FFF0 ORG $FFF02320 FFF0 FF B2 FDB V1 USER-V2321 FFF2 FF C6 FDB SWI3E SWI3-V2322 FFF4 FF B6 FDB V2 SWI2-V2323 FFF6 FF BA FDB V3 FIRQ-V2324 FFF8 FF BE FDB V4 IRQ-V2325 FFFA FF C2 FDB V5 SWI-V2326 FFFC FF B2 FDB V1 NMI-V2327 FFFE FF 00 FDB START RESTART-V0005 END START0006 ENDProgram + Init Data = 3583 bytesError count = 0ACIAC1 E000ACIAD1 E001ACIAOPT 00FFACIAS E000ACINIZ FCF9ACIRST F1FCACK 0006AJDUMP F909ALTAD FB7EALTBD FB73ALTCCD FB8BALTDPD FB68ALTPC1 FB34ALTPCD FB3CALTRA FB74ALTRB FB69ALTRCC FB7FALTRDP FB5EALTRPC FB31ALTRU FB3DALTRX FB53ALTRY FB48ALTUD FB47ALTXD FB5DALTYD FB52AOUTCH FCE2ATLOPT 00FFAUXRESET 0006AUXRSTREL 0002BACK F8EDBACKSP FD80BIASCI FC7DBLKNUM 0104BLOAD0 F70DBLOAD1 F71BBLOAD2 F731BLOAD3 F745BOOT F700BPADJ F9D2BPERR F980BPTBL DFE3BPTEST F9C2BRKPNT F95CBSSTACK C0FFBUFFER 0200BUSY 0080BYTCNT 0105BYTE FC26CAN 0018CFLAG 0001CF_AUX E11ECF_BASE E100CF_COMAND E10ECF_CYLHI E10ACF_CYLLO E108CF_DATA E100CF_ERROR E102CF_FEATURE E102CF_HEAD E10CCF_SECCNT E104CF_SECNUM E106CF_STATUS E10ECHANGE F8DBCHKDRV F546CHKSUM 0103CHRIGHT FD88CHRTN F8DACLRESC FDAECLRLRT FF48CLRSCR FDD2CLRSTK F82FCMDREAD 0020CMDWRITE 0030CNVADR FF2ACOLADX DFFBCOMPRS FF92CONTRL FD48CPORT DFE0CRETN FDE9DATLP FF05DATOPT 00FFDELCNT 0108DELCON 04E2DFL1 F119DFL2 F126DFL3 F13ADFL4 F1A4DISFOS F089DISSTK F8F1DLY FA55DNS F707DRDY 0040DRNUM F70CDRQ 0008DRVNUM 0100DRVS2 F541DRVSEL F53AECHO DFE2ECHON FC96EDPASC F948EDPRTN F908EDUMP F924EFLAG 0080ELOOP F936EOT 0004ERR 0001ESCAPE FD97ESCCL1 FDDCESCCLL FDD7ESCCLS FE10ESCCLS1 FE15ESCCLS2 FE31ESCCU1 FDBBESCCU2 FDC4ESCCUR FDB2ESCFLG DFFEEXITBP F97FEXTCMD 0000EXTEND F035EXTOPT 00FFEXTTAB F02CFETCH FFA4FETSTA FCE7FFLAG 0040FFSTBL F9B9FINDC FF82FINTAB FF78FIRQ DFC6FNDBP F9C8FNDRAM FF4DFNDREL F84EFORWRD F8E9FOUNDC FF8BGETCH F752GETCH2 F758GETCH4 F767GETST1 FCBBGETSTA FCA9GO F8A5GOFLEX F76AHEADLBA 00E0HFCOPT 00FFHFLAG 0020HOME FD92IC11 FFF0IDEBOOT F9D5IDEOPT 00FFIFLAG 0010IN1ADR FC16IN2ADR FC0BINCH FCA1INCHE FC9BINCHEK FCC5INCHEK1 FCDAINCHEV F806INCHKV F808INCHV F804INHEX FC39INHEXA FC46INHEXL FC51INITDR F4BDINTER F207INTER0 F212INTER1 F221INTER2 F227INTEST F1F6IOINIZ FCF7IRQ DFC8JBYTE FB2BJIN1ADR FB2EJMPCMD F8A1JMPEXT F02AJMPTAB FE3BJOUT1S FB28JOUT2H FBB0JOUT4H FB9DLADR F70ALINEFD FD6CLINEUP FD77LINLEN 0050LOAD FA5ELOAD1 FA69LOAD10 FA93LOAD16 FAA9LOAD2 FA6CLOAD21 FAB4LODERR FAA8LOOPA F81DLRA FA2ELRARAM DFD0LRAV F812MAXSEC 010CMAXTRK 010BMDUMP1 F902MEMC2 F8AFMEMCHG F8A8MEMDUMP F8FDMESS6 F0B2MONEXT F000MONIO E000MONITOR F814MONITV F800MONRAM DFC0MONROM F800MSG1 FE84MSG10 FEB6MSG11 FEBCMSG12 FEC2MSG13 FEC8MSG14 FECEMSG15 FED4MSG16 FEDAMSG17 FEDFMSG18 FEE4MSG19 FEEBMSG2 FEA3MSG20 FEF3MSG3 FEAAMSG4 FEACMSG5 FEB2MSGWHAT F035NAK 0015NEWCOL FDF5NEWCUR FDEDNEWROW DFFDNEXTCMD F861NEXTEXT F002NFLAG 0008NMI DFC0NOTHEX FC5CNUMLIN 0019NXTCH0 F88BNXTCHR F88ENXTCMV F802NXTEX0 F016NXTEX1 F019NXTLIN F918OUT1S FCDEOUT2H FC67OUT2S FCDCOUT4H FC5FOUTBA FC81OUTC FC7BOUTCH FCE0OUTCHV F80AOUTHL FC67OUTHR FC6FOUTTE1 F23COUTTE2 F24BOUTTER F23APCLKHI 0001PCLKLO 0000PCRLF FB1EPCRLFV F80EPDATA FB8FPDATA0 F251PDATA1 F253PDATAV F80CPERIOD F952PNTNXT FF9APOSCOL FDEAPRASC F954PRINT FB8CPROMREG E0C0PRSTHI 0002PRSTLO 0000PRTA FBCEPRTB FBD7PRTBA FC89PRTCC FBE0PRTCMD F87FPRTDP FBA9PRTIX FBB3PRTIY FBBCPRTPC FBC5PRTSP FB96PRTUS FBA0PS2KBD E020PS2OPT 00FFPSTRGV F810PSTRNG FB1APUNCH FABCPUNCH2 FAD5PUNCH3 FAE1PUNCH4 FAE3PUNCHL FAFBPUNEXT FB12RAMVEC FE74RCHAR F046RCHAR1 F04BRCHAR2 F04FRCHAR3 F05FRDLOOP FA03RDLP1 F502READ F787READ1 F797READSC F4F1REGPR F9A2REGSTR FBEDRELPAS F855RESTR1 F4D2RETESC FDB1RETURN FD46RF3 F1DBRMAXSEC 00FFRMAXTRK 0100ROWADX DFFCRPLSWI F9A8RTI F8A7RTOTSEC FE01SCHAR F064SCHAR1 F06BSCHAR2 F06FSCHAR3 F082SCROL1 FE0ESCROLL FE06SCT F706SCTBUF C300SECTOR 0102SEEK F76DSEEKTS F4D7SETESC FDAASKPDMP F921SOH 0001SOROU1 FD39SOROU2 FD41STACK DFC0START FF00SUB1 FA59SVCVL DFCESVCVO DFCCSWI DFCASWI2 DFC4SWI3 DFC2SWI3E FFC6SWI3Z FFE8SWIE F994SYNCHI AA55SYNCLO FF00TABEND FE74TADR F708TRACK 0101TRK F705TSTPAT 55AATSTRAM FF15UBSUB F03EUFEXIT F1F0UFMSG1 F0CFUFSUB F0EAUFSUB1 F0F3USRCMD FC92UXERR F40AUXEXIT F404UXLOOP F3B8UXMES0 F25AUXMES1 F273UXMES2 F285UXMSG3 F294UXMSG4 F2A5UXSUB F2BCUXSUB1 F2C8UXSUB2 F2F5V1 FFB2V2 FFB6V3 FFBAV4 FFBEV5 FFC2VDU E030VDUATT 0001VDUCHR 0000VDUCOL 0002VDUOFF 0004VDUOPT 00FFVDUROW 0003VFLAG 0002VINIZ FD0CVOLMSG F0E1VOUTCH FD2BWAITDRQ FA26WAITRDY FA17WRITSC F515WRTLP1 F527WTDRQ F7B7WTRDY F7A8XACK F4B4XASCII FC73XBKPNT F988XBPLP F98EXBYTE0 F415XBYTE1 F424XFERTF FF9FXREAD F410XSTATE 0106XSTBL F44DXSTBLE F458XSTCK F48EXSTCK1 F49EXSTCK2 F4ABXSTCOM F463XSTDA F477XSTDA1 F489XSTST F42DXSTST1 F437XSTST2 F443XSTST3 F44AZFLAG 0004
