OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /System09/trunk/src
    from Rev 106 to Rev 120
    Reverse comparison

Rev 106 → Rev 120

/dsk/DISK_RAM.dsk Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
/sys09bug/sys09270.lst
0,0 → 1,2861
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 NAM SYS09BUG FOR TERASIC CYCLONE II DE2-70
0000 INCLUDE "opt_270.asm"
0001
0002 *
0003 ***************************************************
0004 * OPTION SWITCHES
0005 ***************************************************
0006 *
0007 *
0008 ** THE CONTROL PORT CAN ONLY BE ONE OF THESE
0009 ** NOTE THAT THE ACIA WILL ALWAYS BE PRESET
0010 ** FOR LOADING AND SAVING S1 RECORDS
0011 *
0012 *SWTOPT EQU $FF SWTP ACIA SERIAL CONTROL PORT
0013 *ADSOPT EQU $FF ADS6809 & DG640 VIDEO DISPAY
0014 *B3SOPT EQU $FF B3-SPARTAN2 FPGA VIDEO & PS2 KEYBOARD
0015 *B5XOPT EQU $FF B5-X300 FPGA VIDEO & PS2 KEYBOARD
0016 *S3SOPT EQU $FF SPARTAN3 STARTER FPGA VIDEO & PS2 KEYBOARD
0017 *S3EOPT EQU $FF SPARTAN3E STARTER
0018 *XESOPT EQU $FF XESS XSA-3S100 & XST-3.0
0019 00FF DE270OPT EQU $FF CYCLONE II DE2-70
0020 *
0002 END
0000 INCLUDE "sys09equ.asm"
0001 *
0002 ***************************************************
0003 * MEMORY MAP EQUATES *
0004 ***************************************************
0005 E000 MONIO EQU $E000 I/O SPACE
0006 IFD B3SOPT
0007 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0008 EXTCMD EQU $00 EXTENDED OFFSET
0009 ENDIF B3SOPT
0009 ENDIF B3SOPT
0010 IFD S3EOPT
0011 MONRAM EQU $7FC0
0012 ELSE
0013 DFC0 MONRAM EQU $DFC0 STACK SPACE
0014 ENDIF S3EOPT
0015 F800 MONROM EQU $F800 START OF ROM
0016 IFD S3SOPT
0017 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0018 EXTCMD EQU $00 EXTENDED OFFSET
0019 ENDIF S3SOPT
0019 ENDIF S3SOPT
0020 IFD XESOPT
0021 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0022 EXTCMD EQU $00 EXTENDED OFFSET
0023 ENDIF XESOPT
0023 ENDIF XESOPT
0024 IFD DE270OPT
0025 F000 MONEXT EQU $F000 START OF EXTENDED COMMANDS
0026 0000 EXTCMD EQU $00 EXTENDED OFFSET
0027 ENDIF DE270OPT
0028 **************************************************
0029 **************************************************
0030
0031 IFD SWTOPT
0032 *
0033 * SOUTH WEST TECHNICAL PRODUCTS COMPUTER
0034 *
0035 ACIAOPT EQU $FF ACIA AT PORT 0
0036 DMAFOPT EQU $FF DMAF2 8" FLOPPY DISK BOOT
0037 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0038 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0039 ENDIF
0039 ENDIF
0040 *
0041 IFD ADSOPT
0042 *
0043 * ACKERMAN DIGITAL ADS6809
0044 *
0045 DG640OPT EQU $FF DG640 VDU AT $E800
0046 *RTCOPT EQU $FF REAL TIME CLOCK
0047 PRTOPT EQU $FF PRINTER DRIVERS
0048 MFDCOPT EQU $FF MINIFLOPPY 5.25" DISK BOOT
0049 ENDIF ADSOPT
0049 ENDIF ADSOPT
0050 *
0051 IFD B3SOPT
0052 *
0053 * BURCHED SPARTAN 2 B3+
0054 *
0055 ACIAOPT EQU $FF ACIA AT PORT 0
0056 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0057 VDUOPT EQU $FF VDU AT $E030
0058 IDEOPT EQU $FF IDE AT $E100
0059 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0060 HFCOPT EQU $FF HARDWARE FLOW CONTROL
0061 ENDIF B3SOPT
0061 ENDIF B3SOPT
0062 *
0063 IFD B5XOPT
0064 *
0065 * BURCHED SPARTAN 2 B5-X300
0066 *
0067 ACIAOPT EQU $FF ACIA AT PORT 0
0068 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0069 VDUOPT EQU $FF VDU AT $E030
0070 CF8OPT EQU $FF COMPACT FLASH AT $E040
0071 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0072 HFCOPT EQU $FF HARDWARE FLOW CONTROL
0073 ENDIF B5XOPT
0073 ENDIF B5XOPT
0074 *
0075 IFD S3SOPT
0076 *
0077 * DIGILENT SPARTAN 3 STARTER
0078 *
0079 ACIAOPT EQU $FF ACIA AT PORT 0
0080 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0081 VDUOPT EQU $FF VDU AT $E030
0082 CF8OPT EQU $FF COMPACT FLASH AT $E040
0083 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0084 EXTOPT EQU $FF EXTENDED COMMANDS
0085 ENDIF S3SOPT
0085 ENDIF S3SOPT
0086 *
0087 IFD S3EOPT
0088 *
0089 * DIGILENT SPARTAN 3E STARTER
0090 *
0091 ACIAOPT EQU $FF ACIA AT PORT 0
0092 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0093 VDUOPT EQU $FF VDU AT $E030
0094 TRAOPT EQU $FF PIA TRACE TIMER
0095 ENDIF S3EOPT
0095 ENDIF S3EOPT
0096 *
0097 IFD XESOPT
0098 *
0099 * XESS SPARTAN 3 XSA-3S1000 & XST-3.0
0100 *
0101 ACIAOPT EQU $FF ACIA AT PORT 0
0102 PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0103 VDUOPT EQU $FF VDU AT $E030
0104 IDEOPT EQU $FF IDE AT $E100
0105 DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0106 HFCOPT EQU $FF HARDWARE FLOW CONTROL
0107 EXTOPT EQU $FF EXTENDED COMMANDS
0108 ENDIF XESOPT
0108 ENDIF XESOPT
0109 *
0110 IFD DE270OPT
0111 *
0112 * TERASIC CYCLONE 2 DE2-70
0113 *
0114 00FF ACIAOPT EQU $FF ACIA AT PORT 0
0115 00FF PS2OPT EQU $FF PS2 KEYBOARD AT $E020
0116 00FF VDUOPT EQU $FF VDU AT $E030
0117 00FF CF8OPT EQU $FF COMPACT FLASH AT $E040
0118 00FF DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
0119 00FF EXTOPT EQU $FF EXTENDED COMMANDS
0120 ENDIF DE270OPT
0121 *
0122 *
0123 IFD ACIAOPT
0124 *
0125 ***************************************************
0126 * SERIAL PORT *
0127 ***************************************************
0128 *
0129 ** ACIA SITS ON PORT 0
0130 *
0131 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0132 *
0133 ENDIF ACIAOPT
0134 IFD MFDCOPT
0135 *
0136 ***************************************************
0137 * MINIFLOPPY DRIVE *
0138 ***************************************************
0139 *
0140 ** FLOPPY DISK CONTROLLER SITS ON PORT 1
0141 *
0142 DRVFDC EQU MONIO+$14
0143 CMDFDC EQU MONIO+$18
0144 SECFDC EQU MONIO+$1A
0145 DATFDC EQU MONIO+$1B
0146 ENDIF MFDCOPT
0146 ENDIF MFDCOPT
0147 IFD PS2OPT
0148 *
0149 ***************************************************
0150 * VDU8 PS/2 KEYBOARD PORT *
0151 ***************************************************
0152 *
0153 ** KEYBOARD SITS ON PORT 2
0154 *
0155 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0156 ENDIF PS2OPT
0157 IFD VDUOPT
0158 *
0159 ***************************************************
0160 * VDU8 DISPLAY DRIVER EQUATES *
0161 ***************************************************
0162 *
0163 ** VDU8 DISPLAY SITS ON PORT 3
0164 *
0165 E030 VDU EQU MONIO+$30
0166 0000 VDUCHR EQU 0 CHARACTER REGISTER
0167 0001 VDUATT EQU 1 ATTRIBUTE REGISTER
0168 0002 VDUCOL EQU 2 CURSOR COLUMN
0169 0003 VDUROW EQU 3 CURSOR ROW
0170 0004 VDUOFF EQU 4 ROW OFFSET
0171 *
0172 0050 LINLEN EQU 80 LENGTH OF A LINE
0173 0019 NUMLIN EQU 25 NUMBER OF LINES
0174 ENDIF VDUOPT
0175 *
0176 IFD CF8OPT
0177 *
0178 ***************************************************
0179 * COMPACT FLASH EQUATES 8 BIT TRANSFER *
0180 ***************************************************
0181 *
0182 ** COMPACT FLASH SITS AT PORT 4
0183 *
0184 E040 CF_BASE EQU MONIO+$40
0185 E040 CF_DATA EQU CF_BASE+0
0186 E041 CF_ERROR EQU CF_BASE+1 ; read error
0187 E041 CF_FEATURE EQU CF_BASE+1 ; write feature
0188 E042 CF_SECCNT EQU CF_BASE+2
0189 E043 CF_SECNUM EQU CF_BASE+3
0190 E044 CF_CYLLO EQU CF_BASE+4
0191 E045 CF_CYLHI EQU CF_BASE+5
0192 E046 CF_HEAD EQU CF_BASE+6
0193 E047 CF_STATUS EQU CF_BASE+7 ; read status
0194 E047 CF_COMAND EQU CF_BASE+7 ; write command
0195 *
0196 * Command Equates
0197 *
0198 0020 CMDREAD EQU $20 ; Read Single sector
0199 0030 CMDWRITE EQU $30 ; Write Single sector
0200 00EF CMDFEATURE EQU $EF
0201 0001 FEAT8BIT EQU $01 ; enable 8 bit transfers
0202 00E0 HEADLBA EQU $E0
0203 *
0204 * Status bit equates
0205 *
0206 0080 BUSY EQU $80
0207 0040 DRDY EQU $40
0208 0008 DRQ EQU $08
0209 0001 ERR EQU $01
0210 *
0211 ENDIF CF8OPT
0212 *
0213 IFD IDEOPT
0214 *
0215 ***************************************************
0216 * COMPACT FLASH EQUATES 16 BIT TRANSFER (XESS) *
0217 ***************************************************
0218 *
0219 ** COMPACT FLASH SITS AT PORT 4
0220 *
0221 CF_BASE EQU MONIO+$0100
0222 CF_DATA EQU CF_BASE+0
0223 CF_ERROR EQU CF_BASE+2 ; read error
0224 CF_FEATURE EQU CF_BASE+2 ; write feature
0225 CF_SECCNT EQU CF_BASE+4
0226 CF_SECNUM EQU CF_BASE+6
0227 CF_CYLLO EQU CF_BASE+8
0228 CF_CYLHI EQU CF_BASE+10
0229 CF_HEAD EQU CF_BASE+12
0230 CF_STATUS EQU CF_BASE+14 ; read status
0231 CF_COMAND EQU CF_BASE+14 ; write command
0232 CF_AUX EQU CF_BASE+30
0233 *
0234 * Command Equates
0235 *
0236 CMDREAD EQU $20 ; Read Single sector
0237 CMDWRITE EQU $30 ; Write Single sector
0238 AUXRESET EQU $06 ; Reset IDE
0239 AUXRSTREL EQU $02 ; Reset release IRQ masked
0240 HEADLBA EQU $E0
0241 *
0242 * Status bit equates
0243 *
0244 BUSY EQU $80
0245 DRDY EQU $40
0246 DRQ EQU $08
0247 ERR EQU $01
0248 *
0249 ENDIF CF8OPT
0249 ENDIF CF8OPT
0250 *
0251 IFD RTCOPT
0252 *
0253 **************************************************
0254 * MM58167A REAL TIME CLOCK MEMORY MAP:
0255 **************************************************
0256 *
0257 ** REAL TIME CLOCK SITS ON PORT 4 AND PORT 5
0258 *
0259 CLOCK EQU MONIO+$40 CLOCK BASE ADDRESS AND REGISTERS
0260 *
0261 * COUNTER AND COMPARITOR REGISTERS:
0262 *
0263 * Both the Clock Counter and Clock Comparitor
0264 * consist of 8 registers for holding the time.
0265 * The register offsets from the Counter and
0266 * Comparitor registers are listed above.
0267 *
0268 COUNTR EQU CLOCK+0
0269 CMPRAM EQU CLOCK+8 COMPARITOR REGISTERS
0270 *
0271 * CLOCK REGISTER OFFSETS:
0272 * These register offsets are used for the CLOCK
0273 * and comparitor ram CMPRAM.
0274 *
0275 S10000 EQU 0 TEN THOUNSANDTHS OF SECONDS
0276 S100 EQU 1 HUNDRETHS AND TENTHS OF SECONDS
0277 SECOND EQU 2
0278 MINUIT EQU 3
0279 HOUR EQU 4
0280 WKDAY EQU 5
0281 MTHDAY EQU 6
0282 MONTH EQU 7
0283 *
0284 * INTERRUPT OUTPUT REGISTERS:
0285 *
0286 * An interrupt output may be generated at the
0287 * following rates by setting the appropriate bit
0288 * in the Interrupt Control Register (CINTCR).
0289 * The Interrupt Status Register (CINTSR) must be
0290 * read to clear the interrupt and will return
0291 * the source of the interrupt.
0292 *
0293 * 1/Month Bit 7
0294 * 1/Week Bit 6
0295 * 1/Day Bit 5
0296 * 1/Hour Bit 4
0297 * 1/Minuite Bit 3
0298 * 1/Second Bit 2
0299 * 10/Second Bit 1
0300 * Comparitor Bit 0
0301 *
0302 CINTSR EQU CLOCK+16 INTERRUPT STATUS REGISTER
0303 CINTCR EQU CLOCK+17 INTERRUPT CONTROL REGISTER
0304 *
0305 * COUNTER AND RAM RESETS; GO COMMAND.
0306 *
0307 * The counter and comparitor may be reset
0308 * by writing $FF into CTRRES and CMPRES
0309 * respectivly.
0310 * A write to the Go command register (GOCMND)
0311 * will reset the 1/1000ths, 1/100ths and 1/10ths
0312 * of a second counter.
0313 *
0314 CTRRES EQU CLOCK+18 COUNTER RESET
0315 CMPRES EQU CLOCK+19 COMPARITOR RAM RESET
0316 GOCMND EQU CLOCK+21 GO COMMAND
0317 *
0318 * CLOCK STATUS REGISTER.
0319 *
0320 * The counter takes 61 usec. to rollover for
0321 * every 1KHz clock pulse. If the Status bit is
0322 * set after reading the counter, the counter
0323 * should be re-read to ensure the time is correct.
0324 *
0325 CLKSTA EQU CLOCK+20 STATUS BIT
0326 SBYINT EQU CLOCK+22 STANDBY INTERRUPT
0327 TSTMOD EQU CLOCK+31 TEST MODE REGISTER
0328 ENDIF RTCOPT
0328 ENDIF RTCOPT
0329 *
0330 IFD TRAOPT
0331 *
0332 **************************************************
0333 * PIA INTERRUPT TIMER
0334 **************************************************
0335 *
0336 ** PIA INTERRUPT TIMER SITS ON PORT 7
0337 *
0338 ** PIA TIMER FOR SINGLE STEP / TRACE
0339 *
0340 * TADATA = Output = Timer preset register
0341 * TACTRL - CA1 = input = rising edge = NMI
0342 * - CA2 = Output = Timer Reset (Active High)
0343 * TBDATA = Input = Timer read back register
0344 * TBCTRL - CB1 = input = rising edge = FIRQ
0345 * - CB2 = output = strobe low on write to TBDATA = Timer Preset
0346 *
0347 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0348 * CRA1 = 1 CA1 Rising edge IRQ
0349 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0350 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0351 * CRA4 = 1 ] CA2 = Set/Reset output
0352 * CRA5 = 1 ]
0353 * CRA6 = X CA2 Input Interrupt Flag
0354 * CRA7 = X CA1 Interrupt Flag
0355 *
0356 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0357 * CRB1 = 1 CB1 Rising edge IRQ
0358 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0359 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0360 * CRB4 = 1 ] CB2 = Set/Reset output
0361 * CRB5 = 1 ]
0362 * CRB6 = X CB2 Input Interrupt Flag
0363 * CRB7 = X CB1 Interrupt Flag
0364 *
0365 * DDRA = 0 TADATA = Input, DDRA = 1 TADATA = Output
0366 * DDRB = 0 TBDATA = Input, DDRB = 1 TBDATA = Output
0367 *
0368 TADATA EQU MONIO+$70 Timer preset port
0369 TACTRL EQU MONIO+$71
0370 TBDATA EQU MONIO+$72 Timer read back port
0371 TBCTRL EQU MONIO+$73
0372 *
0373 TRADEL EQU 13 Number of E cycles for RTI (May need to be fudged)
0374 *
0375 ENDIF TRAOPT
0375 ENDIF TRAOPT
0376 IFD ADSOPT
0377 *
0378 ***************************************************
0379 * SERIAL PORT FOR DG640 *
0380 ***************************************************
0381 *
0382 ** SET UP FOR ACKERMAN DIGITAL ADS6809
0383 ** THE ADS6809 S100 BOAD HAS AN ON BOARD ACIA
0384 *
0385 ACIAS EQU MONIO+$400 CONTROL PORT
0386 *
0387 ENDIF ADSOPT
0387 ENDIF ADSOPT
0388 IFD PRTOPT
0389 *
0390 ***************************************************
0391 * PRINTER INTERFACE *
0392 ***************************************************
0393 *
0394 PADATA EQU MONIO+$404
0395 PACTRL EQU MONIO+$405
0396 PBDATA EQU MONIO+$406
0397 PBCTRL EQU MONIO+$407
0398 *
0399 ** CB1 ACK. I/P
0400 ** CB2 STB. O/P
0401 ** PB0 - PB7 DATA 1 - 8 O/P
0402 ** PORT A BIT ASSIGNMENT
0403 *
0404 PBUSY EQU $80 I/P
0405 PEMPTY EQU $40 I/P
0406 SELECT EQU $20 I/P
0407 PERROR EQU $10 I/P
0408 PRESET EQU %00000100 O/P PA3 = 0
0409 AUTOFD EQU %00001000 O/P PA2 = 0
0410 DIRMSK EQU %00001100
0411 ENDIF PRTOPT
0411 ENDIF PRTOPT
0412 IFD DG640OPT
0413 *
0414 ***************************************************
0415 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0416 ***************************************************
0417 *
0418 ** VIDEO DISPLAY DEFINITIONS
0419 *
0420 SCREEN EQU MONIO+$0800 START OF SCREEN MEMORY
0421 LINLEN EQU 64 LENGTH OF A LINE
0422 NUMLIN EQU 16 NUMBER OF LINES
0423 SCNLEN EQU $400 LENGTH OF SCREEN
0424 ENDIF DG640OPT
0424 ENDIF DG640OPT
0425 *
0426 IFD DMAFOPT
0427 *
0428 ***************************************************
0429 * DMAF2 8" DRIVE *
0430 ***************************************************
0431 *
0432 ADDREG EQU $F000 ADDRESS REGISTER
0433 CNTREG EQU $F002 COUNT REGISTER
0434 CCREG EQU $F010 CHANNEL CONTROL REGISTER
0435 PRIREG EQU $F014 DMA PRIORITY REGISTER
0436 AAAREG EQU $F015 ???
0437 BBBREG EQU $F016 ???
0438 COMREG EQU $F020 1791 COMMAND REGISTER
0439 SECREG EQU $F022 SECTOR REGISTER
0440 DRVREG EQU $F024 DRIVE SELECT LATCH
0441 CCCREG EQU $F040 ???
0442 ENDIF DMAFOPT
0442 ENDIF DMAFOPT
0443 IFD DATOPT
0444 **************************************************
0445 * DYNAMIC ADDRESS TRANSLATION REGISTERS *
0446 **************************************************
0447 *
0448 FFF0 IC11 EQU $FFF0 DAT RAM CHIP
0449 55AA TSTPAT EQU $55AA TEST PATTERN
0450 ENDIF DATOPT
0451 *
0003 END
0000 INCLUDE "sys09bug.asm"
0001 * NAM SYS09BUG12 SYSTEM09 MONITOR
0002 OPT l
 
sys09bug.asm page 2
0004 *
0005 * MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
0006 * PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
0007 *
0008 * ALLEN CLARK WALLACE WATSON
0009 * 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
0010 * LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
0011 * PH. 813-977-0347 PH. 813-985-1359
0012 *
0013 * MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
0014 * 2561 NANTUCKET DR APT. E
0015 * ATLANTA, GA 30345
0016 * PH. 404-320-1043
0017 *
0018 * MODIFIED TO SYS09BUG VER 1.0
0019 * FOR: SYSTEM09 FPGA SYSTEM
0020 * BY: JOHN KENT
0021 * DATE: 21ST NOVEMBER 2006
0022 * REMOVED: DISK BOOTS
0023 * MEMORY TEST
0024 * ADDED: ADM3A VDU DRIVER
0025 *
0026 * MODIFIED TO SYS09BUG VER 1.1
0027 * BY: JOHN KENT
0028 * DATE: 7TH JANUARY 2007
0029 * ADDED: 'U' USER EXTENTION COMMANDS AT $F000
0030 * CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
0031 * AND REALTIME CLOCK
0032 *
0033 * MODIFIED TO SYS09BUG VER 1.2
0034 * BY: JOHN KENT
0035 * DATE: 21ST MAY 2007
0036 * ADDED: COMPACT FLASH BOOT TO FPGA VERSION
0037 * REMOVED PORT REDIRECTION ON PUNCH & LOAD
0038 *
0039 * Modified to SYS09BUG VER 1.3
0040 * BY: JOHN KENT
0041 * DATE: 8TH JAN 2008
0042 * ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
0043 * WITH ONLY 32K OF RAM
0044 *
0045 * Modified to SYS09BUG VER 1.4
0046 * BY: JOHN KENT
0047 * DATE: 3RD FEB 2008
0048 * ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
0049 * SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
0050 * 16 BIT IDE DISK BOOT STRAP ROUTINE
0051 *
0052 * Modified to SYS09BUG VER 1.5
0053 * BY: JOHN KENT
0054 * DATE: 7TH SEP 2008
0055 * ADDED: ADDED "B3-S2+" STRING
0056 *
0057 * Modified to SYS09BUG VER 1.6
0058 * BY: JOHN KENT
0059 * DATE: 2ND DEC 2008
0060 * ADDED: ADDED HARDWARE FLOW CONTROL
0061 *
0062 * CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
0063 *
0064 * Modified to SYS09BUG VER 1.7
0065 * BY: JOHN KENT
0066 * DATE: 16TH OCT 2010
0067 * ADDED: "DE2-70" STRING
0068 *
0069 * *** COMMANDS ***
0070 *
0071 * CONTROL A = ALTER THE "A" ACCUMULATOR
0072 * CONTROL B = ALTER THE "B" ACCUMULATOR
0073 * CONTROL C = ALTER THE CONDITION CODE REGISTER
0074 * CONTROL D = ALTER THE DIRECT PAGE REGISTER
0075 * CONTROL P = ALTER THE PROGRAM COUNTER
0076 * CONTROL U = ALTER USER STACK POINTER
0077 * CONTROL X = ALTER "X" INDEX REGISTER
0078 * CONTROL Y = ALTER "Y" INDEX REGISTER
0079 * B hhhh = SET BREAKPOINT AT LOCATION $hhhh
0080 * D = 5.25" MINIFLOPPY BOOT
0081 * E ssss-eeee = EXAMINE MEMORY
0082 * FROM STARTING ADDRESS ssss
0083 * TO ENDING ADDRESS eeee.
0084 * G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
0085 * L = LOAD TAPE
0086 * M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
0087 * P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
0088 * R = DISPLAY REGISTER CONTENTS
0089 * S = DISPLAY STACK FROM ssss TO $DFC0
0090 * U = 8" DMAF2 FLOPPY BOOT
0091 * U = USER EXTENSION COMMANDS AT $F000
0092 * X = REMOVE ALL BREAKPOINTS
0093 *
0094 *
0095 ***************************************************
0096 * SYS09BUG VARIABLE SPACE
0097 ***************************************************
0098 *
0099 DFC0 ORG MONRAM
0100 DFC0 STACK EQU * ; TOP OF INTERNAL STACK
0101 DFC0 NMI RMB 2 ; USER NMI VECTOR
0102 DFC2 SWI3 RMB 2 ; SOFTWARE INTERRUPT VECTOR #3
0103 DFC4 SWI2 RMB 2 ; SOFTWARE INTERRUPT VECTOR #2
0104 DFC6 FIRQ RMB 2 ; FAST INTERRUPT VECTOR
0105 DFC8 IRQ RMB 2 ; INTERRUPT VECTOR
0106 DFCA SWI RMB 2 ; SOFTWARE INTERRUPT VECTOR
0107 DFCC SVCVO RMB 2 ; SUPERVISOR CALL VECTOR ORGIN
0108 DFCE SVCVL RMB 2 ; SUPERVISOR CALL VECTOR LIMIT
0109 IFD DATOPT
0110 DFD0 LRARAM RMB 16 ; LRA ADDRESSES
0111 ENDIF DATOPT
0112 DFE0 CPORT RMB 2 ; RE-VECTORABLE CONTROL PORT
0113 DFE2 ECHO RMB 1 ; ECHO FLAG
0114 DFE3 BPTBL RMB 24 ; BREAKPOINT TABLE BASE ADDR
0115 IFD TRAOPT
0116 NMISAV RMB 2 ; NMI Jump Vector Backup
0117 TRACNT RMB 2 ; Trace Count
0118 ENDIF TRAOPT
0118 ENDIF TRAOPT
0119 IFD VDUOPT
0120 *
0121 **************************************************
0122 * VDU8 DISPLAY DRIVER VARIABLES *
0123 **************************************************
0124 *
0125 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0126 DFFB COLADX RMB 1 ; CURSOR COLUMN
0127 DFFC ROWADX RMB 1 ; CURSOR ROW
0128 **************************************************
0129 *
0130 DFFD NEWROW RMB 1 ; NEW ROW TEMP FOR ESCAPE
0131 DFFE ESCFLG RMB 1 ; ESCAPE SEQUENCE ACTIVE
0132 ENDIF VDUOPT
0133 IFD DG640OPT
0134 *
0135 ***************************************************
0136 * DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
0137 ***************************************************
0138 *
0139 ***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
0140 COLADX RMB 1 ; CURSOR COLUMN
0141 ROWADX RMB 1 ; CURSOR ROW
0142 *************************************************
0143 CURSOR RMB 2 ; ABSOLUTE SCREEN ADDRESS
0144 NEWROW RMB 1 ; NEW ROW TEMP FOR ESCAPE
0145 ESCFLG RMB 1 ; ESCAPE SEQUENCE ACTIVE
0146 ENDIF DG640OPT
0146 ENDIF DG640OPT
0147 *
0148 *
0149 ***************************************************
0150 * START OF ROM *
0151 ***************************************************
0152 *
0153 F800 ORG MONROM
0154 F800 F8 14 FDB MONITOR
0155 F802 F8 61 FDB NEXTCMD
0156 F804 FC A1 FDB INCH
0157 F806 FC 9B FDB INCHE
0158 F808 FC B9 FDB INCHEK
0159 F80A FC CE FDB OUTCH
0160 F80C FB 8F FDB PDATA
0161 F80E FB 1E FDB PCRLF
0162 F810 FB 1A FDB PSTRNG
0163 F812 FA 2E FDB LRA
0164 *
0165 IFD ADSOPT
0166 FDB PCHK ; CHECK FOR PRINTER INPUT
0167 FDB PINIZ ; INITIATE PRINTER
0168 FDB POUTCH ; OUTPUT CH. TO PRINTER
0169 FDB VINIZ
0170 FDB VOUTCH
0171 FDB ACINIZ
0172 FDB AOUTCH
0173 ENDIF ADSOPT
0173 ENDIF ADSOPT
0174 *
0175 * MONITOR
0176 *
0177 * VECTOR ADDRESS STRING IS.....
0178 * $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
0179 *
0180 F814 8E FE 62 MONITOR LDX #RAMVEC ; POINT TO VECTOR ADDR. STRING
0181 F817 10 8E DF C0 LDY #STACK ; POINT TO RAM VECTOR LOCATION
0182 F81B C6 10 LDB #$10 ; BYTES TO MOVE = 16
0183 F81D A6 80 LOOPA LDA ,X+ ; GET VECTOR BYTE
0184 F81F A7 A0 STA ,Y+ ; PUT VECTORS IN RAM / $DFC0-$DFCF
0185 F821 5A DECB ; SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
0186 F822 26 F9 BNE LOOPA ; CONTINUE UNTIL ALL VECTORS MOVED
0187 *
0188 * CONTENTS FROM TO FUNCTION
0189 * $F8A1 $FE40 $DFC0 USER-V
0190 * $F8A1 $FE42 $DFC2 SWI3-V
0191 * $F8A1 $FE44 $DFC4 SWI2-V
0192 * $F8A1 $FE46 $DFC6 FIRQ-V
0193 * $F8A1 $FE48 $DFC8 IRQ-V
0194 * $FAB0 $FE4A $DFCA SWI-V
0195 * $FFFF $FE4C $DFCC SVC-VO
0196 * $FFFF $FE4E $DFCE SVC-VL
0197 *
0198 F824 8E E0 00 LDX #ACIAS
0199 F827 BF DF E0 STX CPORT ; STORE ADDR. IN RAM
0200 F82A 17 01 5B LBSR XBKPNT ; CLEAR OUTSTANDING BREAKPOINTS
0201 F82D C6 0C LDB #12 ; CLEAR 12 BYTES ON STACK
0202 F82F 6F E2 CLRSTK CLR ,-S
0203 F831 5A DECB
0204 F832 26 FB BNE CLRSTK
0205 F834 30 8C DD LEAX MONITOR,PCR ; SET PC TO SBUG-E ENTRY
0206 F837 AF 6A STX 10,S ; ON STACK
0207 F839 86 D0 LDA #$D0 ; PRESET CONDITION CODES ON STACK
0208 F83B A7 E4 STA ,S
0209 F83D 1F 43 TFR S,U
0210 F83F 17 04 A3 LBSR IOINIZ ; INITIALIZE CONTROL PORT
0211 F842 8E FE 72 LDX #MSG1 ; POINT TO MONITOR MESSAGE
0212 F845 17 03 47 LBSR PDATA ; PRINT MSG
0213 *
0214 IFD DATOPT
0215 F848 8E DF D0 LDX #LRARAM ; POINT TO LRA RAM STORAGE AREA
0216 F84B 4F CLRA START ; TOTAL AT ZERO
0217 F84C C6 0D LDB #13 ; TOTAL UP ALL ACTIVE RAM MEMORY
0218 F84E 6D 85 FNDREL TST B,X ; TEST FOR RAM AT NEXT LOC.
0219 F850 27 03 BEQ RELPAS ; IF NO RAM GO TO NEXT LOC.
0220 F852 8B 04 ADDA #4 ; ELSE ADD 4K TO TOTAL
0221 F854 19 DAA ; ADJ. TOTAL FOR DECIMAL
0222 F855 5A RELPAS DECB ; SUB. 1 FROM LOCS. TO TEST
0223 F856 2A F6 BPL FNDREL ; PRINT TOTAL OF RAM
0224 F858 17 04 0C LBSR OUT2H ; OUTPUT HEX BYTE AS ASCII
0225 F85B 8E FE 92 LDX #MSG2 ; POINT TO MSG 'K' CR/LF + 3 NULS
0226 F85E 17 03 2E LBSR PDATA ; PRINT MSG
0227 ENDIF DATOPT
0228 *
0229 IFD TRAOPT
0230 LBSR TRAINZ
0231 ENDIF TRAOPT
0231 ENDIF TRAOPT
0232 *
0233 ***** NEXTCMD *****
0234 *
0235 F861 8E FE 99 NEXTCMD LDX #MSG3 ; POINT TO MSG ">"
0236 F864 17 02 B3 LBSR PSTRNG ; PRINT MSG
0237 F867 17 04 37 LBSR INCH ; GET ONE CHAR. FROM TERMINAL
0238 F86A 84 7F ANDA #$7F ; STRIP PARITY FROM CHAR.
0239 F86C 81 0D CMPA #$0D ; IS IT CARRIAGE RETURN ?
0240 F86E 27 F1 BEQ NEXTCMD ; IF CR THEN GET ANOTHER CHAR.
0241 F870 1F 89 TFR A,B ; PUT CHAR. IN "B" ACCUM.
0242 F872 81 20 CMPA #$20 ; IS IT CONTROL OR DATA CHAR ?
0243 F874 2C 09 BGE PRTCMD ; IF CMD CHAR IS DATA, PRNT IT
0244 F876 86 5E LDA #'^ ; ELSE CNTRL CHAR CMD SO...
0245 F878 17 04 53 LBSR OUTCH ; PRINT "^"
0246 F87B 1F 98 TFR B,A ; RECALL CNTRL CMD CHAR
0247 F87D 8B 40 ADDA #$40 ; CONVERT IT TO ASCII LETTER
0248 F87F 17 04 4C PRTCMD LBSR OUTCH ; PRNT CMD CHAR
0249 F882 17 04 47 LBSR OUT1S ; PRNT SPACE
0250 F885 C1 60 CMPB #$60
0251 F887 2F 02 BLE NXTCH0
0252 F889 C0 20 SUBB #$20
0253 *
0254 ***** DO TABLE LOOKUP *****
0255 * FOR COMMAND FUNCTIONS
0256 *
0257 F88B 8E FE 29 NXTCH0 LDX #JMPTAB ; POINT TO JUMP TABLE
0258 F88E E1 80 NXTCHR CMPB ,X+ ; DOES COMMAND MATCH TABLE ENTRY ?
0259 F890 27 0F BEQ JMPCMD ; BRANCH IF MATCH FOUND
0260 F892 30 02 LEAX 2,X ; POINT TO NEXT ENTRY IN TABLE
0261 F894 8C FE 62 CMPX #TABEND ; REACHED END OF TABLE YET ?
0262 F897 26 F5 BNE NXTCHR ; IF NOT END, CHECK NEXT ENTRY
0263 F899 8E FE 9B LDX #MSG4 ; POINT TO MSG "WHAT?"
0264 F89C 17 02 F0 LBSR PDATA ; PRINT MSG
0265 F89F 20 C0 BRA NEXTCMD ; IF NO MATCH, PRMPT FOR NEW CMD
0266 F8A1 AD 94 JMPCMD JSR [,X] ; JUMP TO COMMAND ROUTINE
0267 F8A3 20 BC BRA NEXTCMD ; PROMPT FOR NEW COMMAND
0268 *
0269 * "G" GO OR CONTINUE
0270 *
0271 F8A5 1F 34 GO TFR U,S
0272 F8A7 3B RTI RTI
0273 *
0274 ***** "M" MEMORY EXAMINE AND CHANGE *****
0275 *
0276 F8A8 17 03 6B MEMCHG LBSR IN1ADR ; INPUT ADDRESS
0277 F8AB 29 2D BVS CHRTN ; IF NOT HEX, RETURN
0278 F8AD 1F 12 TFR X,Y ; SAVE ADDR IN "Y"
0279 F8AF 8E FE A1 MEMC2 LDX #MSG5 ; POINT TO MSG " - "
0280 F8B2 17 02 65 LBSR PSTRNG ; PRINT MSG
0281 F8B5 1F 21 TFR Y,X ; FETCH ADDRESS
0282 F8B7 17 03 A5 LBSR OUT4H ; PRINT ADDR IN HEX
0283 F8BA 17 04 0F LBSR OUT1S ; OUTPUT SPACE
0284 F8BD A6 A4 LDA ,Y ; GET CONTENTS OF CURRENT ADDR.
0285 F8BF 17 03 A5 LBSR OUT2H ; OUTPUT CONTENTS IN ASCII
0286 F8C2 17 04 07 LBSR OUT1S ; OUTPUT SPACE
0287 F8C5 17 03 5E LBSR BYTE ; LOOP WAITING FOR OPERATOR INPUT
0288 F8C8 28 11 BVC CHANGE ; IF VALID HEX GO CHANGE MEM. LOC.
0289 F8CA 81 08 CMPA #8 ; IS IT A BACKSPACE (CNTRL H)?
0290 F8CC 27 E1 BEQ MEMC2 ; PROMPT OPERATOR AGAIN
0291 F8CE 81 18 CMPA #$18 ; IS IT A CANCEL (CNTRL X)?
0292 F8D0 27 DD BEQ MEMC2 ; PROMPT OPERATOR AGAIN
0293 F8D2 81 5E CMPA #'^ ; IS IT AN UP ARROW?
0294 F8D4 27 17 BEQ BACK ; DISPLAY PREVIOUS BYTE
0295 F8D6 81 0D CMPA #$D ; IS IT A CR?
0296 F8D8 26 0F BNE FORWRD ; DISPLAY NEXT BYTE
0297 F8DA 39 CHRTN RTS ; EXIT ROUTINE
0298 *
0299 *
0300 F8DB A7 A4 CHANGE STA ,Y ; CHANGE BYTE IN MEMORY
0301 F8DD A1 A4 CMPA ,Y ; DID MEMORY BYTE CHANGE?
0302 F8DF 27 08 BEQ FORWRD ; $F972
0303 F8E1 17 03 E8 LBSR OUT1S ; OUTPUT SPACE
0304 F8E4 86 3F LDA #'? ; LOAD QUESTION MARK
0305 F8E6 17 03 E5 LBSR OUTCH ; PRINT IT
0306 F8E9 31 21 FORWRD LEAY 1,Y ; POINT TO NEXT HIGHER MEM LOCATION
0307 F8EB 20 C2 BRA MEMC2 ; PRINT LOCATION & CONTENTS
0308 F8ED 31 3F BACK LEAY -1,Y ; POINT TO LAST MEM LOCATION
0309 F8EF 20 BE BRA MEMC2 ; PRINT LOCATION & CONTENTS
0310 *
0311 * "S" DISPLAY STACK
0312 * HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
0313 ** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
0314 *
0315 F8F1 17 02 A2 DISSTK LBSR PRTSP ; PRINT CURRENT STACK POINTER
0316 F8F4 1F 32 TFR U,Y
0317 F8F6 8E DF C0 LDX #STACK ; LOAD INTERNAL STACK AS UPPER LIMIT
0318 F8F9 30 1F LEAX -1,X ; POINT TO CURRENT STACK
0319 F8FB 20 05 BRA MDUMP1 ; ENTER MEMORY DUMP OF STACK CONTENTS
0320 *
0321 * "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
0322 * AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
0323 * UPPER ADDRESS IN X-REG.
0324 * IF HEX ADDRESSES ARE INVALID (V)=1.
0325 *
0326 F8FD 17 03 0B MEMDUMP LBSR IN2ADR ; INPUT ADDRESS BOUNDRIES
0327 F900 29 06 BVS EDPRTN ; NEW COMMAND IF ILLEGAL HEX
0328 F902 34 20 MDUMP1 PSHS Y ; COMPARE LOWER TO UPPER BOUNDS
0329 F904 AC E1 CMPX ,S++ ; LOWER BOUNDS > UPPER BOUNDS?
0330 F906 24 01 BCC AJDUMP ; IF NOT, DUMP HEX AND ASCII
0331 F908 39 EDPRTN RTS ;
0332 *
0333 * ADJUST LOWER AND UPPER ADDRESS LIMITS
0334 * TO EVEN 16 BYTE BOUNDRIES.
0335 *
0336 * IF LOWER ADDR = $4532
0337 * LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
0338 *
0339 * IF UPPER ADDR = $4567
0340 * UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
0341 *
0342 * ENTER WITH LOWER ADDRESS IN X-REG.
0343 * -UPPER ADDRESS ON TOP OF STACK.
0344 *
0345 F909 1F 10 AJDUMP TFR X,D ; GET UPPER ADDR IN D-REG
0346 F90B C3 00 10 ADDD #$10 ; ADD 16 TO UPPER ADDRESS
0347 F90E C4 F0 ANDB #$F0 ; MASK TO EVEN 16 BYTE BOUNDRY
0348 F910 34 06 PSHS A,B ; SAVE ON STACK AS UPPER DUMP LIMIT
0349 F912 1F 20 TFR Y,D ; $F9A5 GET LOWER ADDRESS IN D-REG
0350 F914 C4 F0 ANDB #$F0 ; MASK TO EVEN 16 BYTE BOUNDRY
0351 F916 1F 01 TFR D,X ; PUT IN X-REG AS LOWER DUMP LIMIT
0352 F918 AC E4 NXTLIN CMPX ,S ; COMPARE LOWER TO UPPER LIMIT
0353 F91A 27 05 BEQ SKPDMP ; IF EQUAL SKIP HEX-ASCII DUMP
0354 F91C 17 03 9A LBSR INCHEK ; CHECK FOR INPUT FROM KEYBOARD
0355 F91F 27 03 BEQ EDUMP
0356 F921 32 62 SKPDMP LEAS 2,S ; READJUST STACK IF NOT DUMPING
0357 F923 39 RTS ;
0358 *
0359 * PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
0360 * FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
0361 *
0362 F924 34 10 EDUMP PSHS X ; PUSH LOWER ADDR LIMIT ON STACK
0363 F926 8E FE A1 LDX #MSG5 ; POINT TO MSG " - "
0364 F929 17 01 EE LBSR PSTRNG ; PRINT MSG
0365 F92C AE E4 LDX ,S ; LOAD LOWER ADDR FROM TOP OF STACK
0366 F92E 17 03 2E LBSR OUT4H ; PRINT THE ADDRESS
0367 F931 17 03 96 LBSR OUT2S ; 2 SPACES
0368 F934 C6 10 LDB #$10 ; LOAD COUNT OF 16 BYTES TO DUMP
0369 F936 A6 80 ELOOP LDA ,X+ ; GET FROM MEMORY HEX BYTE TO PRINT
0370 F938 17 03 2C LBSR OUT2H ; OUTPUT HEX BYTE AS ASCII
0371 F93B 17 03 8E LBSR OUT1S ; OUTPUT SPACE
0372 F93E 5A DECB ; $F9D1 DECREMENT BYTE COUNT
0373 F93F 26 F5 BNE ELOOP ; CONTINUE TIL 16 HEX BYTES PRINTED
0374 *
0375 * PRINT 16 ASCII CHARACTERS
0376 * IF NOT PRINTABLE OR NOT VALID
0377 * ASCII PRINT A PERIOD (.)
0378 F941 17 03 86 LBSR OUT2S ; 2 SPACES
0379 F944 AE E1 LDX ,S++ ; GET LOW LIMIT FRM STACK - ADJ STACK
0380 F946 C6 10 LDB #$10 ; SET ASCII CHAR TO PRINT = 16
0381 F948 A6 80 EDPASC LDA ,X+ ; GET CHARACTER FROM MEMORY
0382 F94A 81 20 CMPA #$20 ; IF LESS THAN $20, NON-PRINTABLE?
0383 F94C 25 04 BCS PERIOD ; IF SO, PRINT PERIOD INSTEAD
0384 F94E 81 7E CMPA #$7E ; IS IT VALID ASCII?
0385 F950 23 02 BLS PRASC ; IF SO PRINT IT
0386 F952 86 2E PERIOD LDA #'. ; LOAD A PERIOD (.)
0387 F954 17 03 77 PRASC LBSR OUTCH ; PRINT ASCII CHARACTER
0388 F957 5A DECB ; DECREMENT COUNT
0389 F958 26 EE BNE EDPASC
0390 F95A 20 BC BRA NXTLIN
0391 *
0392 ***** "B" SET BREAKPOINT *****
0393 *
0394 F95C 17 02 B7 BRKPNT LBSR IN1ADR ; GET BREAKPOINT ADDRESS
0395 F95F 29 1E BVS EXITBP ; EXIT IF INVALID HEX ADDR.
0396 F961 8C DF C0 CMPX #STACK ; ADDRESS ILLEGAL IF >=$DFC0
0397 F964 24 1A BCC BPERR ; IF ERROR PRINT (?), EXIT
0398 F966 34 10 PSHS X ; $FA82 PUSH BP ADDRESS ON STACK
0399 F968 8E FF FF LDX #$FFFF ; LOAD DUMMY ADDR TO TEST BP TABLE
0400 F96B 8D 55 BSR BPTEST ; TEST BP TABLE FOR FREE SPACE
0401 F96D 35 10 PULS X ; POP BP ADDRESS FROM STACK
0402 F96F 27 0F BEQ BPERR ; (Z) SET, OUT OF BP TABLE SPACE
0403 F971 A6 84 LDA ,X ; GET DATA AT BREAKPOINT ADDRESS
0404 F973 81 3F CMPA #$3F ; IS IT A SWI?
0405 F975 27 09 BEQ BPERR ; IF SWI ALREADY, INDICATE ERROR
0406 F977 A7 A0 STA ,Y+ ; SAVE DATA BYTE IN BP TABLE
0407 F979 AF A4 STX ,Y ; SAVE BP ADDRESS IN BP TABLE
0408 F97B 86 3F LDA #$3F ; LOAD A SWI ($3F)
0409 F97D A7 84 STA ,X ; SAVE SWI AT BREAKPOINT ADDRESS
0410 F97F 39 EXITBP RTS ;
0411 *
0412 * INDICATE ERROR SETTING BREAKPOINT
0413 *
0414 F980 17 03 49 BPERR LBSR OUT1S ; OUTPUT SPACE
0415 F983 86 3F LDA #'? ; LOAD (?), INDICATE BREAKPOINT ERROR
0416 F985 16 03 46 LBRA OUTCH ; PRINT "?"
0417 *
0418 *** "X" CLEAR OUTSTANDING BREAKPOINTS ***
0419 *
0420 F988 10 8E DF E3 XBKPNT LDY #BPTBL ; POINT TO BREAKPOINT TABLE
0421 F98C C6 08 LDB #8 ; LOAD BREAKPOINT COUNTER
0422 F98E 8D 18 XBPLP BSR RPLSWI ; REMOVE USED ENTRY IN BP TABLE
0423 F990 5A DECB $FAAC ; DECREMENT BP COUNTER
0424 F991 26 FB BNE XBPLP ; END OF BREAKPOINT TABLE?
0425 F993 39 RTS
0426 *
0427 ***** SWI ENTRY POINT *****
0428 *
0429 F994 1F 43 SWIE TFR S,U ; TRANSFER STACK TO USER POINTER
0430 F996 AE 4A LDX 10,U ; LOAD PC FROM STACK INTO X-REG
0431 F998 30 1F LEAX -1,X ; ADJUST ADDR DOWN 1 BYTE.
0432 F99A 8D 26 BSR BPTEST ; FIND BREAKPOINT IN BP TABLE
0433 F99C 27 04 BEQ REGPR ; IF FOUND, REPLACE DATA AT BP ADDR
0434 F99E AF 4A STX 10,U ; SAVE BREAKPOINT ADDR IN STACK
0435 F9A0 8D 06 BSR RPLSWI ; GO REPLACE SWI WITH ORIGINAL DATA
0436 F9A2 17 02 48 REGPR LBSR REGSTR ; GO PRINT REGISTERS
0437 *
0438 IFD TRAOPT
0439 LDX #0
0440 STX TRACNT
0441 ENDIF TRAOPT
0441 ENDIF TRAOPT
0442 *
0443 F9A5 16 FE B9 LBRA NEXTCMD ; GET NEXT COMMAND
0444 *
0445 F9A8 AE 21 RPLSWI LDX 1,Y ; LOAD BP ADDRESS FROM BP TABLE
0446 F9AA 8C DF C0 CMPX #STACK ; COMPARE TO TOP AVAILABLE USER MEMORY
0447 F9AD 24 0A BCC FFSTBL ; GO RESET TABLE ENTRY TO $FF'S
0448 F9AF A6 84 LDA ,X ; GET DATA FROM BP ADDRESS
0449 F9B1 81 3F CMPA #$3F ; IS IT SWI?
0450 F9B3 26 04 BNE FFSTBL ; IF NOT, RESET TABLE ENTRY TO $FF'S
0451 F9B5 A6 A4 LDA ,Y ; GET ORIGINAL DATA FROM BP TABLE
0452 F9B7 A7 84 STA ,X ; $FAD3 RESTORE DATA AT BP ADDRESS
0453 F9B9 86 FF FFSTBL LDA #$FF ; LOAD $FF IN A-ACC
0454 F9BB A7 A0 STA ,Y+ ; RESET BREAKPOINT TABLE DATA TO $FF'S
0455 F9BD A7 A0 STA ,Y+ ; RESET BREAKPOINT TABLE ADDR TO $FF'S
0456 F9BF A7 A0 STA ,Y+
0457 F9C1 39 RTS
0458 *
0459 ** SEARCH BREAKPOINT TABLE FOR MATCH **
0460 *
0461 F9C2 10 8E DF E3 BPTEST LDY #BPTBL ; POINT TO BREAKPOINT TABLE
0462 F9C6 C6 08 LDB #8 ; LOAD BREAKPOINT COUNTER
0463 F9C8 A6 A0 FNDBP LDA ,Y+ ; LOAD DATA BYTE
0464 F9CA AC A1 CMPX ,Y++ ; COMPARE ADDRESS, IS IT SAME?
0465 F9CC 27 04 BEQ BPADJ ; IF SO, ADJUST POINTER FOR TABLE ENTRY
0466 F9CE 5A DECB ; IF NOT, DECREMENT BREAKPOINT COUNTER
0467 F9CF 26 F7 BNE FNDBP ; AND LOOK FOR NEXT POSSIBLE MATCH
0468 F9D1 39 RTS ;
0469 *
0470 *
0471 F9D2 31 3D BPADJ LEAY -3,Y ; MOVE POINTER TO BEGIN OF BP ENTRY
0472 F9D4 39 RTS
0473 *
0474 IFD TRAOPT
0475 *
0476 ** TRACE from address AAAA BB bytes
0477 *
0478 TRACE LBSR ALTPC1 ; SET UP NEW PC
0479 BVS TREXIT ; ADDRESS ERROR, EXIT
0480 LBSR OUT1S
0481 LBSR IN1ADR ; Fetch Byte Count
0482 BVS TREXIT ; Byte Count error, EXIT
0483 STX TRACNT
0484 *
0485 LDX NMI ; Save NMI Vector
0486 STX NMISAV
0487 LDX #NMIE ; Set up NMI for Tracing
0488 STX NMI
0489 LBSR TRAINZ ; Initialise Hardware
0490 BRA TRACEG ; Start Trace
0491 TREXIT RTS
0492 *
0493 * CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
0494 * CRA1 = 1 CA1 Rising edge IRQ
0495 * CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
0496 * CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
0497 * CRA4 = 1 ] CA2 = Set/Reset output
0498 * CRA5 = 1 ]
0499 * CRA6 = X CA2 Input Interrupt Flag
0500 * CRA7 = X CA1 Interrupt Flag
0501 *
0502 * CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
0503 * CRB1 = 1 CB1 Rising edge IRQ
0504 * CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
0505 * CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
0506 * CRB4 = 1 ] CB2 = Set/Reset output
0507 * CRB5 = 1 ]
0508 * CRB6 = X CB2 Input Interrupt Flag
0509 * CRB7 = X CB1 Interrupt Flag
0510 *
0511 *
0512 ** TRACE NMI ENTRY POINT
0513 *
0514 NMIE TFR S,U
0515 LDA #$36 ; Disable Interrupt, CA2 Low
0516 STA TACTRL
0517 LDA TADATA ; Clear Interrupt flag by reading data port
0518 *
0519 LBSR REGSTR ; DUMP REGISTERS
0520 *
0521 LDX 10,U ; TEST IF NEXT INSTRUCTION IS A SWI
0522 LDA ,X
0523 CMPA #$3F
0524 BEQ TRACEX ; EXIT ON SWI
0525 *
0526 LDX TRACNT ; CHECK IF TRACE COUNT EXPIRED
0527 BEQ TRACEX ; YES, GO BACK TO THE MONITOR
0528 LEAX -1,X ; ECREMENT TRACE COUNT
0529 STX TRACNT
0530 *
0531 ** TRACE GO (RESUME SINGLE STEP)
0532 *
0533 TRACEG TFR U,S ; SET UP PROGRAM STACK POINTER
0534 LDA #TRADEL ; SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
0535 STA TADATA
0536 LDA #$36 ; LOAD STROBE LOW
0537 STA TACTRL
0538 LDA TADATA ; CLEAR INTERRUPT
0539 LDA #$36 ; RELEASE RESET
0540 STA TBCTRL
0541 LDA #$3F ; RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
0542 STA TACTRL
0543 RTI ; GO EXECUTE INSTRUCTION
0544 *
0545 TRACEX LDX NMISAV ; Restore NMI vector
0546 STX NMI
0547 LBRA NEXTCMD ; Jump back to the command loop.
0548 *
0549 ** TRACE HARDWARE INITIALISATION
0550 *
0551 TRAINZ LDA #$32 ; SELECT DDRA, CA2 LOW, NMI DISABLED
0552 STA TACTRL
0553 LDA #$3A ; SELECT DDRB, CB2 HIGH, FIRQ DISABLED
0554 STA TBCTRL
0555 LDA #$FF ; PORTA = OUTPUT
0556 STA TADATA
0557 LDA #$00 ; PORTB = INPUT
0558 STA TBDATA
0559 LDA #$36 ; SELECT OUTPUT REGISTER A, CA2 LOW
0560 STA TACTRL
0561 LDA #$3E ; SELECT OUTPUT REGISTER B, CB2 HIGH
0562 STA TBCTRL
0563 RTS
0564 *
0565 ENDIF TRAOPT
0565 ENDIF TRAOPT
0566 IFD MFDCOPT
0567 *
0568 ** "U" MINI DISK BOOT
0569 *
0570 MINBOOT TST CMDFDC
0571 CLR DRVFDC
0572 LDX #$0000
0573 LOOP LEAX $01,X
0574 CMPX #$0000
0575 BNE LOOP
0576 LDA #$0F
0577 STA CMDFDC
0578 BSR DELAY
0579 LOOP1 LDB CMDFDC
0580 BITB #$01
0581 BNE LOOP1
0582 LDA #$01
0583 STA SECFDC
0584 BSR DELAY
0585 LDA #$8C
0586 STA CMDFDC
0587 BSR DELAY
0588 LDX #$C000
0589 BRA LOOP3
0590 LOOP2 BITB #$02
0591 BEQ LOOP3
0592 LDA DATFDC
0593 STA ,X+
0594 LOOP3 LDB CMDFDC
0595 BITB #$01
0596 BNE LOOP2
0597 BITB #$2C
0598 BEQ LOOP4
0599 RTS
0600 *
0601 LOOP4 LDX #$C000
0602 STX $0A,U
0603 TFR U,S
0604 RTI
0605 *
0606 DELAY LDB #$04
0607 LOOP5 DECB
0608 BNE LOOP5
0609 RTS
0610 ENDIF MFDCOPT
0610 ENDIF MFDCOPT
0611 *
0612 IFD DMAFOPT
0613 *
0614 *** "D" DISK BOOT FOR DMAF2 ***
0615 *
0616 DBOOT LDA #$DE
0617 STA DRVREG
0618 LDA #$FF
0619 STA PRIREG ; $FAF8
0620 STA CCREG
0621 STA AAAREG
0622 STA BBBREG
0623 TST CCREG
0624 LDA #$D8
0625 STA COMREG
0626 LBSR DLY
0627 DBOOT0 LDA COMREG
0628 BMI DBOOT0
0629 LDA #$09
0630 STA COMREG
0631 LBSR DLY
0632 *
0633 DISKWT LDA COMREG ; FETCH DRIVE STATUS
0634 BITA #1 ; TEST BUSY BIT
0635 BNE DISKWT ; LOOP UNTIL NOT BUSY
0636 *
0637 BITA #$10
0638 BNE DBOOT
0639 *
0640 LDX #$C000 ; LOGICAL ADDR. = $C000
0641 BSR LRA ; GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
0642 ORA #$10
0643 STA CCCREG
0644 TFR X,D
0645 COMA ;
0646 COMB ;
0647 STD ADDREG
0648 LDX #$FEFF ; LOAD DMA BYTE COUNT = $100
0649 STX CNTREG ; STORE IN COUNT REGISTER
0650 LDA #$FF ; LOAD THE CHANNEL REGISTER
0651 STA CCREG
0652 LDA #$FE ; SET CHANNEL 0
0653 STA PRIREG
0654 LDA #1 ; SET SECTOR TO "1"
0655 STA SECREG ; ISSUE COMMAND
0656 LDA #$8C ; SET SINGLE SECTOR READ
0657 STA COMREG ; ISSUE COMMAND
0658 BSR DLY
0659 *
0660 * THE FOLLOWING CODE TESTS THE STATUS OF THE
0661 * CHANNEL CONTROL REGISTER. IF "D7" IS NOT
0662 * ZERO THEN IT WILL LOOP WAITING FOR "D7"
0663 * TO GO TO ZERO. IF AFTER 65,536 TRIES IT
0664 * IS STILL A ONE THE BOOT OPERATION WILL
0665 * BE STARTED OVER FROM THE BEGINING.
0666 *
0667 CLRB ;
0668 DBOOT1 PSHS B ; $FB55
0669 CLRB ;
0670 DBOOT2 TST CCREG
0671 BPL DBOOT3
0672 DECB ;
0673 BNE DBOOT2
0674 PULS B
0675 DECB
0676 BNE DBOOT1
0677 BRA DBOOT
0678 DBOOT3 PULS B
0679 LDA COMREG
0680 BITA #$1C
0681 BEQ DBOOT4
0682 RTS ;
0683 *
0684 *
0685 DBOOT4 LDB #$DE
0686 STB DRVREG
0687 LDX #$C000
0688 STX 10,U
0689 TFR U,S ; $FB7B
0690 RTI ;
0691 ENDIF DMAFOPT
0691 ENDIF DMAFOPT
0692 *
0693 IFD CF8OPT
0694 *
0695 * COMPACT FLASH BOOT
0696 *
0697 F9D5 8D 40 CFBOOT BSR WAITRDY
0698 F9D7 86 E0 LDA #HEADLBA
0699 F9D9 B7 E0 46 STA CF_HEAD
0700 F9DC 8D 39 BSR WAITRDY
0701 F9DE 86 01 LDA #FEAT8BIT
0702 F9E0 B7 E0 41 STA CF_FEATURE
0703 F9E3 86 EF LDA #CMDFEATURE
0704 F9E5 B7 E0 47 STA CF_COMAND
0705 F9E8 8D 2D BSR WAITRDY
0706 *
0707 * READ SECTORS FROM CF
0708 *
0709 F9EA 86 01 CFREAD LDA #$01
0710 F9EC B7 E0 42 STA CF_SECCNT
0711 F9EF 4F CLRA
0712 F9F0 B7 E0 43 STA CF_SECNUM
0713 F9F3 B7 E0 44 STA CF_CYLLO
0714 F9F6 B7 E0 45 STA CF_CYLHI
0715 *
0716 F9F9 86 20 LDA #CMDREAD ; IDE READ MULTIPLE
0717 F9FB B7 E0 47 STA CF_COMAND
0718 F9FE 8D 17 BSR WAITRDY
0719 FA00 8E C0 00 LDX #$C000
0720 *
0721 * READ LOOP
0722 *
0723 FA03 8D 21 RDLOOP BSR WAITDRQ
0724 FA05 B6 E0 40 LDA CF_DATA
0725 FA08 A7 80 STA ,X+
0726 FA0A 8C C2 00 CMPX #$C200
0727 FA0D 26 F4 BNE RDLOOP
0728 *
0729 FA0F 8E C0 00 LDX #$C000
0730 FA12 AF 4A STX $0A,U
0731 FA14 1F 34 TFR U,S
0732 FA16 3B RTI
0733 *
0734 * WAIT UNTIL READY
0735 *
0736 FA17 B6 E0 47 WAITRDY LDA CF_STATUS
0737 FA1A 85 80 BITA #BUSY
0738 FA1C 26 F9 BNE WAITRDY
0739 FA1E B6 E0 47 LDA CF_STATUS
0740 FA21 85 40 BITA #DRDY
0741 FA23 27 F2 BEQ WAITRDY
0742 FA25 39 RTS
0743 *
0744 * WAIT FOR DATA REQUEST
0745 *
0746 FA26 B6 E0 47 WAITDRQ LDA CF_STATUS
0747 FA29 85 08 BITA #DRQ
0748 FA2B 27 F9 BEQ WAITDRQ
0749 FA2D 39 RTS
0750 ENDIF CF8OPT
0751 *
0752 IFD IDEOPT
0753 *
0754 * XESS 16 BIT IDE BOOT
0755 *
0756 IDEBOOT LDD #AUXRESET
0757 STD CF_AUX
0758 LDD #AUXRSTREL
0759 STD CF_AUX
0760 LDD #HEADLBA
0761 STD CF_HEAD
0762 BSR WAITRDY
0763 *
0764 * READ SECTORS FROM CF
0765 *
0766 LDD #$01
0767 STD CF_SECCNT
0768 CLRB
0769 STD CF_SECNUM
0770 STD CF_CYLLO
0771 STD CF_CYLHI
0772 *
0773 LDB #CMDREAD ; IDE READ MULTIPLE
0774 STD CF_COMAND
0775 BSR WAITRDY
0776 LDX #$C000
0777 *
0778 * READ LOOP
0779 *
0780 RDLOOP BSR WAITDRQ
0781 LDD CF_DATA
0782 STB ,X+
0783 CMPX #$C100
0784 BNE RDLOOP
0785 *
0786 LDX #$C000
0787 STX $0A,U
0788 TFR U,S
0789 RTI
0790 *
0791 * WAIT UNTIL READY
0792 *
0793 WAITRDY LDD CF_STATUS
0794 BITB #BUSY
0795 BNE WAITRDY
0796 LDD CF_STATUS
0797 BITB #DRDY
0798 BEQ WAITRDY
0799 RTS
0800 *
0801 * WAIT FOR DATA REQUEST
0802 *
0803 WAITDRQ LDD CF_STATUS
0804 BITB #DRQ
0805 BEQ WAITDRQ
0806 RTS
0807 ENDIF IDEOPT
0807 ENDIF IDEOPT
0808 *
0809 IFD RTCOPT
0810 *
0811 * CLOCK INTER FACE UTILITY
0812 *
0813 * TIME <Hours> <Minuits> <Seconds>
0814 * If no argument is specified, the current time
0815 * will be displayed.
0816 *
0817 * READ A REGISTER FROM THE COUNTER.
0818 * The X Index rgister points to the register
0819 * to be read. The Status Register is checked
0820 * before and after the register is read before
0821 * returning a value in accumulator A
0822 *
0823 RDCLK TST CLKSTA
0824 BNE RDCLK
0825 RDCLK1 LDA 0,X
0826 TST CLKSTA
0827 BNE RDCLK1
0828 RTS
0829 *
0830 * MAIN PROGRAM:
0831 *
0832 TIMSET LDX #COUNTR ; POINT TO TIMER
0833 LBSR BYTE ; READ HOURS
0834 BVS SHOWTM ; NO ARG, DISP TIME
0835 STA HOUR,X
0836 LBSR OUT1S
0837 LBSR BYTE ; READ MINUITES
0838 BVS SHOWTM
0839 STA MINUIT,X
0840 LBSR OUT1S
0841 LBSR BYTE ; SECONDS.
0842 BVS SHOWTM
0843 STA SECOND,X
0844 *
0845 * DISPLAY CURRENT TIME
0846 *
0847 SHOWTM LBSR PCRLF
0848 LDX #COUNTR+HOUR
0849 LDB #3
0850 SHOWLP BSR RDCLK
0851 LBSR OUT2H
0852 LDA #':
0853 LBSR OUTCH
0854 LEAX -1,X
0855 DECB
0856 BNE SHOWLP
0857 RTS
0858 *
0859 * INITIATE CLOCK.
0860 * MASK INTERRUPTS.
0861 *
0862 CLKINZ CLR CINTCR ; MASK ALL INTERRUPTS
0863 TST CINTSR ; CLEAR ANY INTERRUPTS
0864 RTS
0865 ENDIF RTCOPT
0865 ENDIF RTCOPT
0866 IFD DATOPT
0867 *
0868 ***** LRA LOAD REAL ADDRESS *****
0869 *
0870 * THE FOLLOWING CODE LOADS THE 20-BIT
0871 * PHYSICAL ADDRESS OF A MEMORY BYTE
0872 * INTO THE "A" AND "X" REGISTERS. THIS
0873 * ROUTINE IS ENTERED WITH THE LOGICAL
0874 * ADDRESS OF A MEMORY BYTE IN THE "IX"
0875 * REGISTER. EXIT IS MADE WITH THE HIGH-
0876 * ORDER FOUR BITS OF THE 20-BIT PHYSICAL
0877 * ADDRESS IN THE "A" REGISTER, AND THE
0878 * LOW-ORDER 16-BITS OF THE 20-BIT
0879 * PHYSICAL ADDRESS IN THE "IX" REGISTER.
0880 * ALL OTHER REGISTERS ARE PRESERVED.
0881 * THIS ROUTINE IS REQUIRED SINCE THE
0882 * DMAF1 AND DMAF2 DISK CONTROLLERS MUST
0883 * PRESENT PHYSICAL ADDRESSES ON THE
0884 * SYSTEM BUS.
0885 *
0886 FA2E 34 36 LRA PSHS A,B,X,Y ; PUSH REGISTERS ON STACK
0887 FA30 A6 62 LDA 2,S ; GET MSB LOGICAL ADDR FRM X REG ON STACK
0888 FA32 44 LSRA ;
0889 FA33 44 LSRA ; ADJ FOR INDEXED INTO
0890 FA34 44 LSRA ; CORRESPONDING LOCATION
0891 FA35 44 LSRA ; IN LRA TABLE
0892 FA36 10 8E DF D0 LDY #LRARAM ; LOAD LRA TABLE BASE ADDRESS
0893 FA3A E6 A6 LDB A,Y ; GET PHYSICAL ADDR. DATA FROM LRA TABLE
0894 FA3C 54 LSRB ; ADJ. REAL ADDR. TO REFLECT EXTENDED
0895 FA3D 54 LSRB ; PHYSICAL ADDRESS.
0896 FA3E 54 LSRB ; EXTENDED MS 4-BITS ARE RETURNED
0897 FA3F 54 LSRB ; IN THE "A" ACCUMULATOR
0898 FA40 E7 E4 STB ,S ; MS 4 BITS IN A ACCUM. STORED ON STACK
0899 FA42 E6 A6 LDB A,Y ; LOAD REAL ADDRESS DATA FROM LRA TABLE
0900 FA44 53 COMB ; COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
0901 FA45 58 ASLB ; ADJ DATA FOR RELOCATION IN X REG
0902 FA46 58 ASLB ;
0903 FA47 58 ASLB ; $FB97
0904 FA48 58 ASLB ;
0905 FA49 A6 62 LDA 2,S ; GET MS BYTE OF LOGICAL ADDR.
0906 FA4B 84 0F ANDA #$0F ; MASK MS NIBBLE OF LOGICAL ADDRESS
0907 FA4D A7 62 STA 2,S ; SAVE IT IN X REG ON STACK
0908 FA4F EA 62 ORB 2,S ; SET MS BYTE IN X REG TO ADJ PHY ADDR.
0909 *
0910 * PLUS LS NIBBLE OF LOGICAL ADDRESS
0911 *
0912 FA51 E7 62 STB 2,S ; SAVE AS LS 16 BITS OF PHY ADDR IN X REG ON STACK
0913 FA53 35 B6 PULS A,B,X,Y,PC ; POP REGS. FROM STACK
0914 ENDIF DATOPT
0915 *
0916 * DELAY LOOP
0917 *
0918 FA55 34 04 DLY PSHS B ; SAVE CONTENTS OF "B"
0919 FA57 C6 20 LDB #$20 ; GET LOOP DELAY VALUE
0920 FA59 5A SUB1 DECB ; SUBTRACT ONE FROM VALUE
0921 FA5A 26 FD BNE SUB1 ; LOOP UNTIL ZERO
0922 FA5C 35 84 PULS B,PC ; RESTORE CONTENTS OF "B"
0923 * RTS ;
0924 *
0925 ***** "L" LOAD MIKBUG TAPE *****
0926 *
0927 FA5E BD FC E7 LOAD JSR ACINIZ
0928 FA61 86 11 LDA #$11 ; LOAD 'DC1' CASS. READ ON CODE
0929 FA63 17 02 68 LBSR OUTCH ; OUTPUT IT TO TERMINAL PORT
0930 FA66 7F DF E2 CLR ECHO ; TURN OFF ECHO FLAG
0931 FA69 17 02 2A LOAD1 LBSR ECHON ; INPUT 8 BIT BYTE WITH NO ECHO
0932 FA6C 81 53 LOAD2 CMPA #'S ; IS IT AN "S", START CHARACTER ?
0933 FA6E 26 F9 BNE LOAD1 ; IF NOT, DISCARD AND GET NEXT CHAR.
0934 FA70 17 02 23 LBSR ECHON
0935 FA73 81 39 CMPA #'9 ; IS IT A "9" , END OF FILE CHAR ?
0936 FA75 27 3D BEQ LOAD21 ; IF SO, EXIT LOAD
0937 FA77 81 31 CMPA #'1 ; IS IT A "1" , FILE LOAD CHAR ?
0938 FA79 26 F1 BNE LOAD2 ; IF NOT, LOOK FOR START CHAR.
0939 FA7B 17 01 A8 LBSR BYTE ; INPUT BYTE COUNT
0940 FA7E 34 02 PSHS A ; PUSH COUNT ON STACK
0941 FA80 29 26 BVS LODERR ; (V) C-CODE SET, ILLEGAL HEX
0942 FA82 17 01 91 LBSR IN1ADR ; INPUT LOAD ADDRESS
0943 FA85 29 21 BVS LODERR ; (V) C-CODE SET, ADDR NOT HEX
0944 FA87 34 10 PSHS X ; PUSH ADDR ON STACK
0945 FA89 E6 E0 LDB ,S+ ; LOAD MSB OF ADDR AS CHECKSUM BYTE
0946 FA8B EB E0 ADDB ,S+ ; ADD LSB OF ADDR TO CHECKSUM
0947 FA8D EB E4 ADDB ,S ; ADD BYTE COUNT BYTE TO CHECKSUM
0948 FA8F 6A E4 DEC ,S ; $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
0949 FA91 6A E4 DEC ,S ; ADDRESS BYTES.
0950 FA93 34 04 LOAD10 PSHS B ; PUSH CHECKSUM ON STACK
0951 FA95 17 01 8E LBSR BYTE ; INPUT DATA BYTE (2 HEX CHAR)
0952 FA98 35 04 PULS B ; POP CHECKSUM FROM STACK
0953 FA9A 29 0C BVS LODERR ; (V) SET, DATA BYTE NOT HEX
0954 FA9C 34 02 PSHS A ; PUSH DATA BYTE ON STACK
0955 FA9E EB E0 ADDB ,S+ ; ADD DATA TO CHECKSUM, AUTO INC STACK
0956 FAA0 6A E4 DEC ,S ; DECREMENT BYTE COUNT 1
0957 FAA2 27 05 BEQ LOAD16 ; IF BYTE COUNT ZERO, TEST CHECKSUM
0958 FAA4 A7 80 STA ,X+ ; SAVE DATA BYTE IN MEMORY
0959 FAA6 20 EB BRA LOAD10 ; GET NEXT DATA BYTE
0960 FAA8 5F LODERR CLRB ; ERROR CONDITION, ZERO CHECKSUM ;
0961 FAA9 35 02 LOAD16 PULS A ; ADJUST STACK (REMOVE BYTE COUNT)
0962 FAAB C1 FF CMPB #$FF ; CHECKSUM OK?
0963 FAAD 27 BA BEQ LOAD1 ; IF SO, LOAD NEXT LINE
0964 FAAF 86 3F LDA #'? ; LOAD (?) ERROR INDICATOR
0965 FAB1 17 02 1A LBSR OUTCH ; OUTPUT IT TO TERMINAL
0966 FAB4 73 DF E2 LOAD21 COM ECHO ; TURN ECHO ON
0967 FAB7 86 13 LDA #$13 ; $FC5F LOAD 'DC3' CASS. READ OFF CODE
0968 FAB9 16 02 12 LBRA OUTCH ; OUTPUT IT
0969 *
0970 ***** "P" PUNCH MIKBUG TAPE *****
0971 *
0972 FABC 6F E2 PUNCH CLR ,-S ; CLEAR RESERVED BYTE ON STACK
0973 FABE 17 01 4A LBSR IN2ADR ; GET BEGIN AND END ADDRESS
0974 FAC1 34 30 PSHS X,Y ; SAVE ADDRESSES ON STACK
0975 FAC3 29 4D BVS PUNEXT ; (V) C-CODE SET, EXIT PUNCH
0976 FAC5 AC 62 CMPX 2,S ; COMPARE BEGIN TO END ADDR
0977 FAC7 25 49 BCS PUNEXT ; IF BEGIN GREATER THAN END, EXIT PUNCH
0978 FAC9 30 01 LEAX 1,X ; INCREMENT END ADDRESS
0979 FACB AF E4 STX ,S ; STORE END ADDR ON STACK
0980 FACD BD FC E7 JSR ACINIZ
0981 FAD0 86 12 LDA #$12 ; LOAD 'DC2' PUNCH ON CODE
0982 FAD2 17 01 F9 LBSR OUTCH ; OUTPUT IT TO TERMINAL
0983 FAD5 EC E4 PUNCH2 LDD ,S ; LOAD END ADDR IN D-ACC
0984 FAD7 A3 62 SUBD 2,S ; SUBTRACT BEGIN FROM END
0985 FAD9 27 06 BEQ PUNCH3 ; SAME, PUNCH 32 BYTES DEFAULT
0986 FADB 10 83 00 20 CMPD #$20 ; LESS THAN 32 BYTES?
0987 FADF 23 02 BLS PUNCH4 ; PUNCH THAT MANY BYTES
0988 FAE1 C6 20 PUNCH3 LDB #$20 ; LOAD BYTE COUNT OF 32.
0989 FAE3 E7 64 PUNCH4 STB 4,S ; STORE ON STACK AS BYTE COUNT
0990 FAE5 8E FE E2 LDX #MSG20 ; POINT TO MSG "S1"
0991 FAE8 17 00 2F LBSR PSTRNG ; PRINT MSG
0992 FAEB CB 03 ADDB #3 ; ADD 3 BYTES TO BYTE COUNT
0993 FAED 1F 98 TFR B,A ; GET BYTE COUNT IN A-ACC TO PUNCH
0994 FAEF 17 01 75 LBSR OUT2H ; OUTPUT BYTE COUNT
0995 FAF2 AE 62 LDX 2,S ; LOAD BEGIN ADDRESS
0996 FAF4 17 01 68 LBSR OUT4H ; PUNCH ADDRESS
0997 FAF7 EB 62 ADDB 2,S ; ADD ADDR MSB TO CHECKSUM
0998 FAF9 EB 63 ADDB 3,S ; ADD ADDR LSB TO CHECKSUM
0999 FAFB EB 84 PUNCHL ADDB ,X ; ADD DATA BYTE TO CHECKSUM
1000 FAFD A6 80 LDA ,X+ ; LOAD DATA BYTE TO PUNCH
1001 FAFF 17 01 65 LBSR OUT2H ; OUTPUT DATA BYTE
1002 FB02 6A 64 DEC 4,S ; DECREMENT BYTE COUNT
1003 FB04 26 F5 BNE PUNCHL ; NOT DONE, PUNCH NEXT BYTE
1004 FB06 53 COMB 1's ; COMPLIMENT CHECKSUM BYTE
1005 FB07 1F 98 TFR B,A ; GET IT IN A-ACC TO PUNCH
1006 FB09 17 01 5B LBSR OUT2H ; OUTPUT CHECKSUM BYTE
1007 FB0C AF 62 STX 2,S ; SAVE X-REG IN STACK AS NEW PUNCH ADDR
1008 FB0E AC E4 CMPX ,S ; COMPARE IT TO END ADDR
1009 FB10 26 C3 BNE PUNCH2 ; $FCB5 PUNCH NOT DONE, CONT.
1010 FB12 86 14 PUNEXT LDA #$14 ; LOAD 'DC4' PUNCH OFF CODE
1011 FB14 17 01 B7 LBSR OUTCH ; OUTPUT IT
1012 FB17 32 65 LEAS 5,S ; READJUST STACK POINTER
1013 FB19 39 RTS ;
1014 *
1015 * PRINT STRING PRECEEDED BY A CR & LF.
1016 *
1017 FB1A 8D 02 PSTRNG BSR PCRLF ; PRINT CR/LF
1018 FB1C 20 71 BRA PDATA ; PRINT STRING POINTED TO BY IX
1019 *
1020 * PCRLF
1021 *
1022 FB1E 34 10 PCRLF PSHS X ; SAVE IX
1023 FB20 8E FE 93 LDX #MSG2+1 ; POINT TO MSG CR/LF + 3 NULS
1024 FB23 17 00 69 LBSR PDATA ; PRINT MSG
1025 FB26 35 90 PULS X,PC ; RESTORE IX & RETURN
1026 *
1027 * LONG BRANCHES TO COMMON ROUTINES
1028 *
1029 FB28 16 01 A1 JOUT1S LBRA OUT1S
1030 FB2B 16 00 F8 JBYTE LBRA BYTE
1031 FB2E 16 00 E5 JIN1ADR LBRA IN1ADR
1032 *
1033 * ALTER "PC" PROGRAM COUNTER
1034 *
1035 FB31 17 00 91 ALTRPC LBSR PRTPC ; $FCF5 PRINT MSG " PC = "
1036 FB34 8D F2 ALTPC1 BSR JOUT1S ; OUTPUT SPACE
1037 FB36 8D F6 BSR JIN1ADR ; GET NEW CONTENTS FOR "PC"
1038 FB38 29 02 BVS ALTPCD ; EXIT IF INVALID HEX
1039 FB3A AF 4A STX 10,U ; POKE IN NEW CONTENTS
1040 FB3C 39 ALTPCD RTS ;
1041 *
1042 * ALTER "U" USER STACK POINTER
1043 *
1044 FB3D 8D 61 ALTRU BSR PRTUS ; $FCCA PRINT MSG " US = "
1045 FB3F 8D E7 BSR JOUT1S ; OUTPUT SPACE
1046 FB41 8D EB BSR JIN1ADR ; GET NEW CONTENTS FOR "US"
1047 FB43 29 02 BVS ALTUD ; EXIT IF INVALID HEX
1048 FB45 AF 48 STX 8,U ; POKE IN NEW CONTENTS
1049 FB47 39 ALTUD RTS ;
1050 *
1051 * ALTER "Y" INDEX REGISTER
1052 *
1053 FB48 8D 72 ALTRY BSR PRTIY ; PRINT MSG " IY = "
1054 FB4A 8D DC BSR JOUT1S ; OUTPUT SPACE
1055 FB4C 8D E0 BSR JIN1ADR ; GET NEW CONTENTS FOR "IY"
1056 FB4E 29 02 BVS ALTYD ; EXIT IF INVALID HEX
1057 FB50 AF 46 STX 6,U ; $F8F0 POKE IN NEW CONTENTS
1058 FB52 39 ALTYD RTS ;
1059 *
1060 * ALTER "X" INDEX REGISTER
1061 *
1062 FB53 8D 5E ALTRX BSR PRTIX ; $FCE0 PRINT MSG " IX = "
1063 FB55 8D D1 BSR JOUT1S ; OUTPUT SPACE
1064 FB57 8D D5 BSR JIN1ADR
1065 FB59 29 02 BVS ALTXD
1066 FB5B AF 44 STX 4,U
1067 FB5D 39 ALTXD RTS ;
1068 *
1069 * ALTER "DP" DIRECT PAGE REGISTER
1070 *
1071 FB5E 8D 49 ALTRDP BSR PRTDP ; $FCD5 PRINT MSG " DP = "
1072 FB60 8D C6 BSR JOUT1S ; OUTPUT SPACE
1073 FB62 8D C7 BSR JBYTE ; INPUT BYTE (2 HEX CHAR)
1074 FB64 29 02 BVS ALTDPD
1075 FB66 A7 43 STA 3,U
1076 FB68 39 ALTDPD RTS ;
1077 *
1078 * ALTER "B" ACCUMULATOR
1079 *
1080 FB69 8D 6C ALTRB BSR PRTB ; $FD09 PRINT MSG " B = "
1081 FB6B 8D BB BSR JOUT1S ; OUTPUT SPACE
1082 FB6D 8D BC BSR JBYTE ; INPUT BYTE (2 HEX CHAR)
1083 FB6F 29 02 BVS ALTBD
1084 FB71 A7 42 STA 2,U
1085 FB73 39 ALTBD RTS ; $F91C
1086 *
1087 * ALTER "A" ACCUMULATOR
1088 *
1089 FB74 8D 58 ALTRA BSR PRTA ; $FCFF RINT MSG " A = "
1090 FB76 8D B0 BSR JOUT1S ; OUTPUT SPACE
1091 FB78 8D B1 BSR JBYTE ; INPUT BYTE (2 HEX CHAR)
1092 FB7A 29 02 BVS ALTAD
1093 FB7C A7 41 STA 1,U
1094 FB7E 39 ALTAD RTS ;
1095 *
1096 * ALTER "CC" REGISTER
1097 *
1098 FB7F 8D 5F ALTRCC BSR PRTCC ; $FD13 PRINT MSG " CC: "
1099 FB81 8D A5 BSR JOUT1S ; OUTPUT SPACE
1100 FB83 8D A6 BSR JBYTE ; INPUT BYTE (2 HEX CHAR)
1101 FB85 29 04 BVS ALTCCD
1102 FB87 8A 80 ORA #$80 ; SETS "E" FLAG IN PRINT LIST
1103 FB89 A7 C4 STA ,U
1104 FB8B 39 ALTCCD RTS ;
1105 *
1106 * PDATA
1107 *
1108 FB8C 17 01 3F PRINT LBSR OUTCH
1109 FB8F A6 80 PDATA LDA ,X+ ; GET 1st CHAR. TO PRINT
1110 FB91 81 04 CMPA #4 ; IS IT EOT?
1111 FB93 26 F7 BNE PRINT ; IF NOT EOT PRINT IT
1112 FB95 39 RTS ;
1113 *
1114 * PRINT REGISTERS
1115 *
1116 FB96 8E FE A5 PRTSP LDX #MSG10 ; POINT TO MSG "SP="
1117 FB99 8D F4 BSR PDATA ; PRINT MSG
1118 FB9B 1F 31 TFR U,X
1119 FB9D 16 00 BF JOUT4H LBRA OUT4H
1120 *
1121 FBA0 8E FE B1 PRTUS LDX #MSG12 ; POINT TO MSG "US="
1122 FBA3 8D EA BSR PDATA ; PRINT MSG
1123 FBA5 AE 48 LDX 8,U
1124 FBA7 20 F4 BRA JOUT4H
1125 *
1126 FBA9 8E FE C3 PRTDP LDX #MSG15 ; POINT TO MSG "DP="
1127 FBAC 8D E1 BSR PDATA ; PRINT MSG
1128 FBAE A6 43 LDA 3,U
1129 FBB0 16 00 B4 JOUT2H LBRA OUT2H ; OUTPUT HEX BYTE AS ASCII
1130 *
1131 FBB3 8E FE BD PRTIX LDX #MSG14 ; POINT TO MSG "IX="
1132 FBB6 8D D7 BSR PDATA ; PRINT MSG
1133 FBB8 AE 44 LDX 4,U ; $FCE6
1134 FBBA 20 E1 BRA JOUT4H
1135 *
1136 FBBC 8E FE B7 PRTIY LDX #MSG13 ; POINT TO MSG "IY="
1137 FBBF 8D CE BSR PDATA ; PRINT MSG
1138 FBC1 AE 46 LDX 6,U
1139 FBC3 20 D8 BRA JOUT4H
1140 *
1141 FBC5 8E FE AB PRTPC LDX #MSG11 ; POINT TO MSG "PC="
1142 FBC8 8D C5 BSR PDATA ; PRINT MSG
1143 FBCA AE 4A LDX 10,U
1144 FBCC 20 CF BRA JOUT4H
1145 *
1146 FBCE 8E FE C9 PRTA LDX #MSG16 ; POINT TO MSG "A="
1147 FBD1 8D BC BSR PDATA ; PRINT MSG
1148 FBD3 A6 41 LDA 1,U
1149 FBD5 20 D9 BRA JOUT2H ; OUTPUT HEX BYTE AS ASCII
1150 *
1151 FBD7 8E FE CE PRTB LDX #MSG17 ; POINT TO MSG "B="
1152 FBDA 8D B3 BSR PDATA ; PRINT MSG
1153 FBDC A6 42 LDA 2,U
1154 FBDE 20 D0 BRA JOUT2H ; OUTPUT HEX BYTE AS ASCII
1155 *
1156 FBE0 8E FE D3 PRTCC LDX #MSG18 ; POINT TO MSG "CC:"
1157 FBE3 8D AA BSR PDATA ; PRINT MSG
1158 FBE5 A6 C4 LDA ,U
1159 FBE7 8E FE DA LDX #MSG19 ; POINT TO MSG "EFHINZVC"
1160 FBEA 16 00 90 LBRA BIASCI ; OUTPUT IN BINARY/ASCII FORMAT
1161 *
1162 * "R" DISPLAY REGISTERS
1163 *
1164 FBED 8E FE A1 REGSTR LDX #MSG5 ; POINT TO MSG " - "
1165 FBF0 17 FF 27 LBSR PSTRNG ; PRINT MSG
1166 FBF3 8D A1 BSR PRTSP ; $FCBF
1167 FBF5 8D A9 BSR PRTUS ; $FCCA
1168 FBF7 8D B0 BSR PRTDP ; $FCD5
1169 FBF9 8D B8 BSR PRTIX ; $FCE0
1170 FBFB 8D BF BSR PRTIY ; $FCEB
1171 FBFD 8E FE A1 LDX #MSG5 ; POINT TO MSG " - "
1172 FC00 17 FF 17 LBSR PSTRNG ; PRINT MSG
1173 FC03 8D C0 BSR PRTPC ; $FCF5
1174 FC05 8D C7 BSR PRTA ; $FCFF
1175 FC07 8D CE BSR PRTB ; $FD09
1176 FC09 20 D5 BRA PRTCC ; $FD13
1177 *
1178 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1179 * OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
1180 * THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
1181 * THE SECOND IS RETURNED IN "IX". THE "V" BIT
1182 * IN THE C-CODE REG. IS SET IF AN INVALID HEX
1183 * ADDRESS IS INPUT.
1184 *
1185 FC0B 8D 09 IN2ADR BSR IN1ADR ; GET FIRST ADDRESS
1186 FC0D 29 4D BVS NOTHEX ; EXIT IF NOT VALID HEX
1187 FC0F 1F 12 TFR X,Y ; SAVE FIRST ADDR. IN "IY"
1188 FC11 86 2D LDA #'-
1189 FC13 17 00 B8 LBSR OUTCH ; PRINT " - "
1190 *
1191 * THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
1192 * OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
1193 * ADDRESS IS RETURNED IN THE "X" REGISTER.
1194 *
1195 FC16 8D 0E IN1ADR BSR BYTE ; INPUT BYTE (2 HEX CHAR)
1196 FC18 29 42 BVS NOTHEX ; EXIT IF NOT VALID HEX
1197 FC1A 1F 01 TFR D,X
1198 FC1C 8D 08 BSR BYTE ; INPUT BYTE (2 HEX CHAR)
1199 FC1E 29 3C BVS NOTHEX
1200 FC20 34 10 PSHS X
1201 FC22 A7 61 STA 1,S
1202 FC24 35 90 PULS X,PC
1203 *
1204 ***** INPUT BYTE (2 HEX CHAR.) *****
1205 *
1206 FC26 8D 11 BYTE BSR INHEX ; GET HEX LEFT
1207 FC28 29 32 BVS NOTHEX ; EXIT IF NOT VALID HEX
1208 FC2A 48 ASLA ;
1209 FC2B 48 ASLA ;
1210 FC2C 48 ASLA ; SHIFT INTO LEFT NIBBLE
1211 FC2D 48 ASLA ;
1212 FC2E 1F 89 TFR A,B ; PUT HEXL IN "B"
1213 FC30 8D 07 BSR INHEX ; GET HEX RIGHT
1214 FC32 29 28 BVS NOTHEX ; EXIT IF NOT VALID HEX
1215 FC34 34 04 PSHS B ; PUSH HEXL ON STACK
1216 FC36 AB E0 ADDA ,S+ ; ADD HEXL TO HEXR AND ADJ. STK
1217 FC38 39 RTS ; RETURN WITH HEX L&R IN "A"
1218 *
1219 *
1220 FC39 8D 5B INHEX BSR ECHON ; INPUT ASCII CHAR.
1221 FC3B 81 30 CMPA #'0 ; IS IT > OR = "0" ?
1222 FC3D 25 1D BCS NOTHEX ; IF LESS IT AIN'T HEX
1223 FC3F 81 39 CMPA #'9 ; IS IT < OR = "9" ?
1224 FC41 22 03 BHI INHEXA ; IF > MAYBE IT'S ALPHA
1225 FC43 80 30 SUBA #$30 ; ASCII ADJ. NUMERIC
1226 FC45 39 RTS ;
1227 *
1228 *
1229 FC46 81 41 INHEXA CMPA #'A ; IS IT > OR = "A"
1230 FC48 25 12 BCS NOTHEX ; IF LESS IT AIN'T HEX
1231 FC4A 81 46 CMPA #'F ; IS IT < OR = "F" ?
1232 FC4C 22 03 BHI INHEXL ; IF > IT AIN'T HEX
1233 FC4E 80 37 SUBA #'A-10 ; ($37) ASCII ADJ. ALPHA
1234 FC50 39 RTS ;
1235 *
1236 FC51 81 61 INHEXL CMPA #'a ; IS IT > OR = "a"
1237 FC53 25 07 BCS NOTHEX ; IF LESS IT AIN'T HEX
1238 FC55 81 66 CMPA #'f ; IS IT < "f"
1239 FC57 22 03 BHI NOTHEX ; IF > IT AIN'T HEX
1240 FC59 80 57 SUBA #'a-10 ; ($57) ADJUST TO LOWER CASE
1241 FC5B 39 RTS ;
1242 *
1243 *
1244 FC5C 1A 02 NOTHEX ORCC #2 ; SET (V) FLAG IN C-CODES REGISTER
1245 FC5E 39 RTS ;
1246 *
1247 *
1248 FC5F 34 10 OUT4H PSHS X ; PUSH X-REG. ON THE STACK
1249 FC61 35 02 PULS A ; POP MS BYTE OF X-REG INTO A-ACC.
1250 FC63 8D 02 BSR OUTHL ; OUTPUT HEX LEFT
1251 FC65 35 02 PULS A ; POP LS BYTE OF X-REG INTO A-ACC.
1252 FC67 OUTHL EQU *
1253 FC67 34 02 OUT2H PSHS A ; SAVE IT BACK ON STACK
1254 FC69 44 LSRA ; CONVERT UPPER HEX NIBBLE TO ASCII
1255 FC6A 44 LSRA ;
1256 FC6B 44 LSRA ;
1257 FC6C 44 LSRA ;
1258 FC6D 8D 04 BSR XASCII ; PRINT HEX NIBBLE AS ASCII
1259 FC6F 35 02 OUTHR PULS A ; CONVERT LOWER HEX NIBBLE TO ASCII
1260 FC71 84 0F ANDA #$0F ; STRIP LEFT NIBBLE
1261 FC73 8B 30 XASCII ADDA #$30 ; ASCII ADJ
1262 FC75 81 39 CMPA #$39 ; IS IT < OR = "9" ?
1263 FC77 2F 02 BLE OUTC ; IF LESS, OUTPUT IT
1264 FC79 8B 07 ADDA #7 ; IF > MAKE ASCII LETTER
1265 FC7B 20 51 OUTC BRA OUTCH ; OUTPUT CHAR
1266 *
1267 * BINARY / ASCII --- THIS ROUTINE
1268 * OUTPUTS A BYTE IN ENHANCED
1269 * BINARY FORMAT. THE ENHANCEMENT
1270 * IS DONE BY SUBSTITUTING ASCII
1271 * LETTERS FOR THE ONES IN THE BYTE.
1272 * THE ASCII ENHANCEMENT LETTERS
1273 * ARE OBTAINED FROM THE STRING
1274 * POINTED TO BY THE INDEX REG. "X".
1275 *
1276 FC7D 34 02 BIASCI PSHS A ; SAVE "A" ON STACK
1277 FC7F C6 08 LDB #8 ; PRESET LOOP# TO BITS PER BYTE
1278 FC81 A6 80 OUTBA LDA ,X+ ; GET LETTER FROM STRING
1279 FC83 68 E4 ASL ,S ; TEST BYTE FOR "1" IN B7
1280 FC85 25 02 BCS PRTBA ; IF ONE PRINT LETTER
1281 FC87 86 2D LDA #'- ; IF ZERO PRINT "-"
1282 FC89 8D 43 PRTBA BSR OUTCH ; PRINT IT
1283 FC8B 8D 3F BSR OUT1S ; PRINT SPACE
1284 FC8D 5A DECB ; SUB 1 FROM #BITS YET TO PRINT
1285 FC8E 26 F1 BNE OUTBA
1286 FC90 35 82 PULS A,PC
1287 *
1288 IFD EXTOPT
1289 *
1290 * EXTENDED USER COMMANDS
1291 *
1292 FC92 6E 9F F0 00 USRCMD JMP [MONEXT+EXTCMD]
1293 ENDIF EXTOPT
1294 *
1295 *
1296 FC96 7D DF E2 ECHON TST ECHO ; IS ECHO REQUIRED ?
1297 FC99 27 06 BEQ INCH ; ECHO NOT REQ. IF CLEAR
1298 *
1299 * INCHE
1300 *
1301 * GETS CHARACTER FROM TERMINAL AND
1302 * ECHOS SAME. THE CHARACTER IS RETURNED
1303 * IN THE "A" ACCUMULATOR WITH THE PARITY
1304 * BIT MASKED OFF. ALL OTHER REGISTERS
1305 * ARE PRESERVED.
1306 *
1307 FC9B 8D 04 INCHE BSR INCH ; GET CHAR FROM TERMINAL
1308 FC9D 84 7F ANDA #$7F ; STRIP PARITY FROM CHAR.
1309 FC9F 20 2D BRA OUTCH ; ECHO CHAR TO TERMINAL
1310 *
1311 * INCH
1312 *
1313 * GET CHARACTER FROM TERMINAL. RETURN
1314 * CHARACTER IN "A" ACCUMULATOR AND PRESERVE
1315 * ALL OTHER REGISTERS. THE INPUT CHARACTER
1316 * IS 8 BITS AND IS NOT ECHOED.
1317 *
1318 *
1319 FCA1 34 10 INCH PSHS X ; SAVE IX
1320 IFD HFCOPT
1321 LDA #$11 ; SET RTS* LOW, REQUEST FAR END TO TX
1322 STA [CPORT]
1323 ENDIF HFCOPT
1323 ENDIF HFCOPT
1324 FCA3 BE DF E0 GETSTA LDX CPORT ; POINT TO TERMINAL PORT
1325 FCA6 A6 84 LDA ,X ; FETCH PORT STATUS
1326 FCA8 85 01 BITA #1 ; TEST READY BIT, RDRF ?
1327 IFD PS2OPT
1328 FCAA 26 09 BNE GETST1
1329 FCAC 8E E0 20 LDX #PS2KBD
1330 FCAF A6 84 LDA ,X
1331 FCB1 85 01 BITA #1
1332 ENDIF PS2OPT
1333 FCB3 27 EE BEQ GETSTA ; IF NOT RDY, THEN TRY AGAIN
1334 FCB5 GETST1 EQU *
1335 IFD HFCOPT
1336 LDA #$51 ; SET RTS* HIGH, STOP FAR END FROM TXING, UNTIL NEXT INPUT
1337 STA [CPORT]
1338 ENDIF HFCOPT
1338 ENDIF HFCOPT
1339 FCB5 A6 01 LDA 1,X ; FETCH CHAR
1340 FCB7 35 90 PULS X,PC ; RESTORE IX
1341 *
1342 * INCHEK
1343 *
1344 * CHECK FOR A CHARACTER AVAILABLE FROM
1345 * THE TERMINAL. THE SERIAL PORT IS CHECKED
1346 * FOR READ READY. ALL REGISTERS ARE
1347 * PRESERVED, AND THE "Z" BIT WILL BE
1348 * CLEAR IF A CHARACTER CAN BE READ.
1349 *
1350 *
1351 FCB9 34 02 INCHEK PSHS A ; SAVE A ACCUM
1352 IFD HFCOPT
1353 LDA #$11 ; SET RTS* LOW, REQUEST FAR END TO TX
1354 STA [CPORT]
1355 ENDIF HFCOPT
1355 ENDIF HFCOPT
1356 FCBB A6 9F DF E0 LDA [CPORT] ; FETCH PORT STATUS
1357 FCBF 85 01 BITA #1 ; TEST READY BIT, RDRF ?
1358 IFD PS2OPT
1359 FCC1 26 05 BNE INCHEK1
1360 FCC3 B6 E0 20 LDA PS2KBD
1361 FCC6 85 01 BITA #1 ; TEST READY BIT< RDRF ?
1362 ENDIF PS2OPT
1363 FCC8 35 82 INCHEK1 PULS A,PC ; RESTORE A ACCUM.
1364 *
1365 FCCA 8D 00 OUT2S BSR OUT1S ; OUTPUT 2 SPACES
1366 FCCC 86 20 OUT1S LDA #$20 ; OUTPUT 1 SPACE
1367 *
1368 *
1369 * OUTCH
1370 *
1371 * OUTPUT CHARACTER TO TERMINAL.
1372 * THE CHAR. TO BE OUTPUT IS
1373 * PASSED IN THE A REGISTER.
1374 * ALL REGISTERS ARE PRESERVED.
1375 *
1376 OUTCH IFD VDUOPT
1377 FCCE 8D 49 BSR VOUTCH
1378 ENDIF VDUOPT
1379 IFD DG640OPT
1380 BSR VOUTCH
1381 ENDIF DG640OPT
1381 ENDIF DG640OPT
1382 FCD0 34 12 AOUTCH PSHS A,X ; SAVE A ACCUM AND IX
1383 FCD2 BE DF E0 LDX CPORT ; GET ADDR. OF TERMINAL
1384 FCD5 A6 84 FETSTA LDA ,X ; FETCH PORT STATUS
1385 FCD7 85 02 BITA #2 ; TEST TDRE, OK TO XMIT ?
1386 FCD9 27 FA BEQ FETSTA ; IF NOT LOOP UNTIL RDY
1387 FCDB 85 08 BITA #8 ; CLEAR TO SEND ?
1388 FCDD 26 F6 BNE FETSTA ; NO, LOOP UNTIL CLEAR
1389 FCDF 35 02 PULS A ; GET CHAR. FOR XMIT
1390 FCE1 A7 01 STA 1,X ; XMIT CHAR.
1391 FCE3 35 90 PULS X,PC ; RESTORE IX
1392 *
1393 * IO INITIALIZATION
1394 *
1395 FCE5 IOINIZ EQU *
1396 IFD VDUOPT
1397 FCE5 8D 13 BSR VINIZ
1398 ENDIF VDUOPT
1399 IFD DG640OPT
1400 BSR VINIZ
1401 ENDIF DG640OPT
1401 ENDIF DG640OPT
1402 FCE7 BE DF E0 ACINIZ LDX CPORT ; POINT TO CONTROL PORT ADDRESS
1403 FCEA 86 03 LDA #3 ; RESET ACIA PORT CODE
1404 FCEC A7 84 STA ,X ; STORE IN CONTROL REGISTER
1405 FCEE 86 51 LDA #$51 ; SET 8 DATA, 2 STOP AN 0 PARITY RTS* HIGH
1406 FCF0 A7 84 STA ,X ; STORE IN CONTROL REGISTER
1407 FCF2 6D 01 TST 1,X ; ANYTHING IN DATA REGISTER?
1408 FCF4 86 FF LDA #$FF ; TURN ON ECHO FLAG
1409 FCF6 B7 DF E2 STA ECHO
1410 FCF9 39 RTS
1411 *
1412 IFD VDUOPT
1413 *
1414 ***************************************************
1415 * VDU8 ADM3A REGISTER-MAPPED EMULATOR *
1416 * *
1417 * 80 x 25 Characters
1418 *
1419 ***************************************************
1420 *
1421 ***************************************************
1422 * INITIALIZE EMULATOR *
1423 ***************************************************
1424 *
1425 FCFA 8E E0 30 VINIZ LDX #VDU
1426 FCFD CC 00 00 LDD #0
1427 FD00 FD DF FB STD COLADX ; AND ROWADX
1428 FD03 A7 02 STA VDUCOL,X
1429 FD05 E7 03 STB VDUROW,X
1430 FD07 E7 04 STB VDUOFF,X
1431 FD09 FD DF FD STD NEWROW ; AND ESCFLG
1432 FD0C C6 02 LDB #$02
1433 FD0E E7 01 STB VDUATT,X
1434 FD10 7F DF FE CLR ESCFLG
1435 FD13 86 1B LDA #$1B ; SEND ESCAPE
1436 FD15 8D 02 BSR VOUTCH
1437 FD17 86 59 LDA #'Y ; CLEAR TO END OF SCREEN
1438 *
1439 ** VIDEO OUTPUT ROUTINE
1440 *
1441 FD19 34 16 VOUTCH PSHS A,B,X ; SAVE REGISTERS
1442 FD1B 8E E0 30 LDX #VDU ; POINT TO VDU REGISTERS
1443 *
1444 ** CHECK FOR ESCAPE SEQUENCE
1445 *
1446 FD1E 7D DF FE TST ESCFLG ; ESCAPE ACTIVE?
1447 FD21 27 04 BEQ SOROU1 ; BRANCH IF NOT
1448 FD23 8D 60 BSR ESCAPE ; ELSE DO ESCAPE
1449 FD25 20 0D BRA RETURN ; AND RETURN
1450 *
1451 ** CHECK FOR CONTROL CHARACTERS
1452 *
1453 FD27 81 20 SOROU1 CMPA #$20 ; CONTROL CODES?
1454 FD29 24 04 BHS SOROU2
1455 FD2B 8D 09 BSR CONTRL ; BRANCH IF SO
1456 FD2D 20 05 BRA RETURN
1457 *
1458 ** OUTPUT TEXT CHARACTER
1459 *
1460 FD2F A7 84 SOROU2 STA VDUCHR,X ; DISPLAY CHARACTER
1461 FD31 17 00 AF LBSR NEWCOL ; UPDATE COLUMN
1462 *
1463 ** DISPLAY CURSOR AND RETURN
1464 *
1465 FD34 35 96 RETURN PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN
1466 *
1467 ***************************************************
1468 * CONTROL CODE HANDLERS *
1469 ***************************************************
1470 *
1471 FD36 81 08 CONTRL CMPA #$08 ; CTRL H - BACKSPACE ?
1472 FD38 27 34 BEQ BACKSP
1473 FD3A 81 1B CMPA #$1B ; ESCAPE SEQUENCE?
1474 FD3C 27 5A BEQ SETESC
1475 FD3E 81 1A CMPA #$1A ; CTRL Z - Clear Screen
1476 FD40 10 27 00 7C LBEQ CLRSCR
1477 FD44 81 16 CMPA #$16 ; CTRL ^ - Home
1478 FD46 27 38 BEQ HOME
1479 FD48 81 0D CMPA #$0D ; CTRL M - RETURN?
1480 FD4A 10 27 00 89 LBEQ CRETN
1481 FD4E 81 0C CMPA #$0C ; CTRL L - CHAR RIGHT
1482 FD50 27 24 BEQ CHRIGHT
1483 FD52 81 0B CMPA #$0B ; CTRL K - MOVE UP ONE LINE
1484 FD54 27 0F BEQ LINEUP
1485 FD56 81 0A CMPA #$0A ; CTRL J - LINE FEED
1486 FD58 26 45 BNE RETESC ; NONE OF THESE, RETURN
1487 *
1488 ***************************************** LINE FEED
1489 *
1490 FD5A FC DF FB LINEFD LDD COLADX ; GET CURRENT COLUMN AND ROW
1491 FD5D 5C INCB ; BUMP ROW
1492 FD5E C1 19 CMPB #NUMLIN ; SCROLL TIME?
1493 FD60 26 79 BNE NEWCUR ; POSITION CURSOR IF NOT
1494 FD62 16 00 8F LBRA SCROLL ; ELSE SCROLL IT
1495 *
1496 ***************************************** LINE FEED
1497 *
1498 FD65 FC DF FB LINEUP LDD COLADX ; GET CURRENT COLUMN AND ROW
1499 FD68 5D TSTB ; AT TOP OF SCREEN ?
1500 FD69 27 34 BEQ RETESC ; Yes, Ignore
1501 FD6B 5A DECB ; No, Decrement ROW
1502 FD6C 20 6D BRA NEWCUR ; POSITION CURSOR
1503 *
1504 *********************************** BACK SPACE
1505 *
1506 FD6E B6 DF FB BACKSP LDA COLADX
1507 FD71 27 2C BEQ RETESC ; RETURN
1508 FD73 4A DECA
1509 FD74 20 62 BRA POSCOL ; POSITION CURSOR
1510 *
1511 *********************************** CURSOR RIGHT
1512 *
1513 FD76 B6 DF FB CHRIGHT LDA COLADX
1514 FD79 4C INCA
1515 FD7A 81 50 CMPA #LINLEN
1516 FD7C 27 21 BEQ RETESC
1517 FD7E 20 58 BRA POSCOL
1518 *
1519 *********************************** CURSOR RIGHT
1520 *
1521 FD80 CC 00 00 HOME LDD #0 ; HOME - POSITION TOP OF SCREEN
1522 FD83 20 56 BRA NEWCUR
1523 *
1524 ***************************************************
1525 * ESCAPE HANDLERS *
1526 ***************************************************
1527 *
1528 FD85 F6 DF FE ESCAPE LDB ESCFLG ; GET FLAG
1529 FD88 C1 3D CMPB #'= ; SETTING CURSOR?
1530 FD8A 27 14 BEQ ESCCUR ; BRANCH IF SO
1531 FD8C 81 59 CMPA #'Y ; CLEAR TO END OF SCREEN?
1532 FD8E 27 6E BEQ ESCCLS
1533 FD90 81 54 CMPA #'T ; CLEAR TO END OF LINE?
1534 FD92 27 31 BEQ ESCCLL
1535 FD94 81 3D CMPA #'= ; STARTING CURSOR SET?
1536 FD96 26 04 BNE CLRESC ; BRANCH IF NOT
1537 *
1538 ***************************** START ESCAPE SEQUENCE
1539 *
1540 FD98 B7 DF FE SETESC STA ESCFLG ; ELSE START CURSORING
1541 FD9B 39 RTS ; AND RETURN
1542 *
1543 FD9C 7F DF FE CLRESC CLR ESCFLG ; NO OTHERS SUPPORTED
1544 FD9F 39 RETESC RTS ; SO RETURN
1545 *
1546 ********************************* SET SCREEN CURSOR
1547 *
1548 FDA0 7D DF FD ESCCUR TST NEWROW ; ROW SET?
1549 FDA3 26 04 BNE ESCCU1 ; BRANCH IF SO
1550 FDA5 B7 DF FD STA NEWROW ; ELSE SET NEW ROW
1551 FDA8 39 RTS ; AND RETURN
1552 *
1553 FDA9 7F DF FE ESCCU1 CLR ESCFLG
1554 FDAC 80 20 SUBA #$20 ; ADJUST COLUMN ADDRESS
1555 FDAE 81 4F CMPA #LINLEN-1 ;CHECK FOR ACCEPTABLE COLUM
1556 FDB0 22 ED BHI RETESC ; NOT OK, DO NOTHING
1557 *
1558 FDB2 F6 DF FD ESCCU2 LDB NEWROW
1559 FDB5 7F DF FD CLR NEWROW
1560 FDB8 C0 20 SUBB #$20 ; ADJUST TO ROW ADDRESS
1561 FDBA C1 18 CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW
1562 FDBC 22 E1 BHI RETESC ; ELSE RETURN DOING NOTHING
1563 FDBE 20 1B BRA NEWCUR ; GO SET NEW CURSOR IF SO
1564 *
1565 ****************** CLEAR FROM CURSOR TO END OF LINE
1566 *
1567 FDC0 CC 00 00 CLRSCR LDD #0 ; CLEAR FROM TOP OF SCREEN
1568 FDC3 8D 16 BSR NEWCUR
1569 FDC5 B6 DF FB ESCCLL LDA COLADX
1570 FDC8 C6 20 LDB #$20 ; AND CLEAR CHAR
1571 FDCA E7 84 ESCCL1 STB VDUCHR,X ; DISPLAY TEXT
1572 FDCC 4C INCA
1573 FDCD A7 02 STA VDUCOL,X
1574 FDCF 81 50 CMPA #LINLEN ; UNTIL END OF LINE
1575 FDD1 26 F7 BNE ESCCL1
1576 FDD3 7F DF FE CLR ESCFLG
1577 FDD6 39 RTS
1578 *
1579 *********************************** CARRIAGE RETURN
1580 *
1581 FDD7 4F CRETN CLRA ; SET COLUMN ZERO
1582 FDD8 F6 DF FC POSCOL LDB ROWADX ; GET CURRENT ROW
1583 *
1584 *********** GENERATE NEW CURSOR POSITION AND RETURN
1585 *
1586 FDDB FD DF FB NEWCUR STD COLADX ; SAVE NEW ROW AND COLUMN
1587 FDDE A7 02 STA VDUCOL,X ; SET NEW COLUMN
1588 FDE0 E7 03 STB VDUROW,X ; SET NEW ROW
1589 FDE2 39 RTS ; AND RETURN
1590 *
1591 ********************* UPDATE CURRENT COLUMN AND ROW
1592 *
1593 FDE3 FC DF FB NEWCOL LDD COLADX ; GET ROW AND COLUMN
1594 FDE6 4C INCA ; BUMP COLUMN
1595 FDE7 81 50 CMPA #LINLEN ; ROLL?
1596 FDE9 26 F0 BNE NEWCUR ; BRANCH IF NOT
1597 FDEB 4F CLRA ; ELSE RESET TO ZERO
1598 FDEC 5C INCB ; AND BUMP ROW
1599 FDED C1 19 CMPB #NUMLIN
1600 FDEF 26 EA BNE NEWCUR
1601 FDF1 5A DECB ; BOTTOM ROW
1602 FDF2 8D E7 BSR NEWCUR
1603 *
1604 ********************************* SCROLL THE SCREEN
1605 *
1606 FDF4 E6 04 SCROLL LDB VDUOFF,X
1607 FDF6 5C INCB
1608 FDF7 C1 19 CMPB #NUMLIN
1609 FDF9 25 01 BLO SCROL1
1610 FDFB 5F CLRB
1611 FDFC E7 04 SCROL1 STB VDUOFF,X
1612 *
1613 **************** CLEAR FROM CURSOR TO END OF SCREEN
1614 *
1615 FDFE F6 DF FB ESCCLS LDB COLADX ; GET CURSOR
1616 FE01 86 20 LDA #$20 ; GET A SPACE
1617 FE03 F7 DF FB ESCCLS1 STB COLADX
1618 FE06 E7 02 STB VDUCOL,X
1619 FE08 A7 84 STA VDUCHR,X
1620 FE0A 5C INCB
1621 FE0B C1 50 CMPB #LINLEN
1622 FE0D 26 F4 BNE ESCCLS1
1623 *
1624 FE0F F6 DF FC LDB ROWADX
1625 FE12 5C INCB
1626 FE13 C1 19 CMPB #NUMLIN
1627 FE15 27 08 BEQ ESCCLS2
1628 FE17 F7 DF FC STB ROWADX
1629 FE1A E7 03 STB VDUROW,X
1630 FE1C 5F CLRB
1631 FE1D 20 E4 BRA ESCCLS1
1632 *
1633 FE1F 5F ESCCLS2 CLRB
1634 FE20 F7 DF FB STB COLADX
1635 FE23 E7 02 STB VDUCOL,X
1636 FE25 F7 DF FE STB ESCFLG
1637 FE28 39 RTS
1638 ENDIF VDUOPT
1639 *
1640 IFD DG640OPT
1641 ***************************************************
1642 * TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
1643 * *
1644 * FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
1645 * HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
1646 * CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
1647 * 16x64 BOARD). *
1648 ***************************************************
1649 *
1650 ***************************************************
1651 * INITIALIZE EMULATOR *
1652 ***************************************************
1653 *
1654 VINIZ LDX #0
1655 STX COLADX ; AND ROWADX
1656 STX NEWROW ; AND ESCFLG
1657 LDX #SCREEN ; POINT TO SCREEN
1658 STX CURSOR ; SET PROGRAM CURSOR
1659 LDA #$1B ; SEND ESCAPE
1660 BSR VOUTCH
1661 LDA #'Y ; CLEAR TO END OF SCREEN
1662 *
1663 ** VIDEO OUTPUT ROUTINE
1664 *
1665 VOUTCH PSHS A,B,X ; SAVE REGISTERS
1666 *
1667 ** CLEAR CURSOR
1668 *
1669 LDX CURSOR
1670 LDB 0,X
1671 ANDB #$7F
1672 STB 0,X
1673 *
1674 ** CHECK FOR ESCAPE SEQUENCE
1675 *
1676 TST ESCFLG ; ESCAPE ACTIVE?
1677 BEQ SOROU1 ; BRANCH IF NOT
1678 BSR ESCAPE ; ELSE DO ESCAPE
1679 BRA RETURN ; AND RETURN
1680 *
1681 ** CHECK FOR CONTROL CHARACTERS
1682 *
1683 SOROU1 CMPA #$20 ; CONTROL CODES?
1684 BHS SOROU2
1685 BSR CONTRL ; BRANCH IF SO
1686 BRA RETURN
1687 *
1688 ** OUTPUT TEXT CHARACTER
1689 *
1690 SOROU2 LDX CURSOR ; ELSE GET CURSOR
1691 STA 0,X ; DISPLAY CHARACTER
1692 LBSR NEWCOL ; UPDATE COLUMN
1693 *
1694 ** DISPLAY CURSOR AND RETURN
1695 *
1696 RETURN LDX CURSOR ; AND DISPLAY IT
1697 LDB ,X
1698 ORB #$80 ; WITH REVID
1699 STB ,X
1700 PULS A,B,X,PC ; RESTORE REGISTERS AND RETURN
1701 *
1702 ***************************************************
1703 * CONTROL CODE HANDLERS *
1704 ***************************************************
1705 *
1706 CONTRL CMPA #$08 ; CTRL H - BACKSPACE ?
1707 LBEQ BACKSP
1708 CMPA #$1B ; ESCAPE SEQUENCE?
1709 LBEQ SETESC
1710 CMPA #$D ; CTRL M - RETURN?
1711 LBEQ CRETN
1712 CMPA #$0A ; CTRL J - LINE FEED
1713 BNE RETESC ; NONE OF THESE, RETURN
1714 *
1715 ***************************************** LINE FEED
1716 *
1717 LINEFD LDD COLADX ; GET CURRENT COLUMN AND ROW
1718 INCB ; BUMP ROW
1719 CMPB #NUMLIN ; SCROLL TIME?
1720 LBNE NEWCUR ; POSITION CURSOR IF NOT
1721 LBRA SCROLL ; ELSE SCROLL IT
1722 *
1723 ***************************************** LINE FEED
1724 *
1725 LINEUP LDD COLADX ; GET CURRENT COLUMN AND ROW
1726 TSTB ; AT TOP OF SCREEN ?
1727 BEQ RETESC ; YES, RETURN
1728 DECB ; NO, DECREMENT ROW
1729 LBRA NEWCUR ; POSITION CURSOR
1730 *
1731 *********************************** BACK SPACE
1732 *
1733 BACKSP LDA COLADX ; GET CURRENT COLUMN AND ROW
1734 BEQ RETESC ; IF AT TOP LEFT CORNER RETURN
1735 DECA ; OTHERWISE BACK STEP ONE CHARACTER
1736 LBRA POSCOL ; POSITION CURSOR
1737 *
1738 *********************************** CURSOR RIGHT
1739 *
1740 CHRIGHT LDA COLADX ; GET CURRENT COLUMN AND ROW
1741 INCA ; MOVE RIGHT ONE CHARACTER
1742 CMPA #LINLEN ; ARE WE AT THE END OF THE LINE ?
1743 BEQ RETESC ; YES, RETURN
1744 LBRA POSCOL ; NO, POSITION CURSOR
1745 *
1746 ***************************************************
1747 * ESCAPE HANDLERS *
1748 ***************************************************
1749 *
1750 ESCAPE LDB ESCFLG ; ARE WE IN AN ESCAPE SEQUENCE ?
1751 CMPB #'= ; ARE WE SETTING CURSOR?
1752 BEQ ESCCUR ; YES BRANCH TO SET CURSOR
1753 CMPA #'Y ; CLEAR TO END OF SCREEN?
1754 LBEQ ESCCLS ; YES, CLEAR SCREEN
1755 CMPA #'T ; CLEAR TO END OF LINE?
1756 BEQ ESCCLL ; YES, CLEAR LINE
1757 CMPA #'E ; INSERT LINE?
1758 BEQ ESCINL
1759 CMPA #'R ; DELETE LINE?
1760 BEQ ESCDLL
1761 CMPA #'= ; STARTING CURSOR SET?
1762 BNE CLRESC ; BRANCH IF NOT
1763 *
1764 ***************************** START ESCAPE SEQUENCE
1765 *
1766 SETESC STA ESCFLG ; ELSE START CURSORING
1767 RTS ; AND RETURN
1768 *
1769 CLRESC CLR ESCFLG ; NO OTHERS SUPPORTED
1770 RETESC RTS ; SO RETURN
1771 *
1772 ********************************* SET SCREEN CURSOR
1773 *
1774 ESCCUR TST NEWROW ; ROW SET?
1775 BNE ESCCU1 ; BRANCH IF SO
1776 STA NEWROW ; ELSE SET NEW ROW
1777 RTS ; AND RETURN
1778 *
1779 ESCCU1 CLR ESCFLG
1780 SUBA #$20 ; ADJUST COLUMN ADDRESS
1781 CMPA #LINLEN-1 ; CHECK FOR ACCEPTABLE COLUM
1782 BHI RETESC ; NOT OK, DO NOTHING
1783 *
1784 ESCCU2 LDB NEWROW
1785 CLR NEWROW
1786 SUBB #$20 ; ADJUST TO ROW ADDRESS
1787 CMPB #NUMLIN-1 ; CHECK FOR ACCEPTABLE ROW
1788 BHI RETESC ; ELSE RETURN DOING NOTHING
1789 BRA NEWCUR ; GO SET NEW CURSOR IF SO
1790 *
1791 *************************** DELETE LINE FROM SCREEN
1792 *
1793 ESCDLL BSR CRETN ; GO COL. ZERO
1794 LDB ROWADX
1795 CMPB #NUMLIN-1
1796 BEQ SCROL3
1797 BRA SCROL1 ; AND DELETE THIS LINE
1798 *
1799 *************************** INSERT LINE INTO SCREEN
1800 *
1801 ESCINL BSR CRETN ; GO TO COL. ZERO
1802 LDB ROWADX
1803 CMPB #NUMLIN-1
1804 BEQ ESCCLL
1805 *
1806 ** SCROLL SCREEN DOWN FROM CURSOR
1807 *
1808 LDX #SCREEN+SCNLEN-LINLEN
1809 ESCIN0 LDA ,-X
1810 STA LINLEN,X
1811 LDA SCNLEN,X
1812 STA SCNLEN+LINLEN,X
1813 CMPX CURSOR
1814 BNE ESCIN0
1815 *
1816 ****************** CLEAR FROM CURSOR TO END OF LINE
1817 *
1818 ESCCLL LDA COLADX ; GET CURRENT COLUMN
1819 LDX CURSOR ; GET CURSOR
1820 LDB #$20 ; AND CLEAR CHAR
1821 ESCLL1 STB SCNLEN,X ; CLEAR ATTRIBUTE
1822 STB ,X+ ; CLEAR TEXT
1823 INCA
1824 CMPA #LINLEN ; UNTIL END OF LINE
1825 BNE ESCLL1
1826 CLR ESCFLG
1827 RTS
1828 *
1829 *********************************** CARRIAGE RETURN
1830 *
1831 CRETN CLRA ; SET COLUMN ZERO
1832 POSCOL LDB ROWADX ; GET CURRENT ROW
1833 *
1834 *********** GENERATE NEW CURSOR POSITION AND RETURN
1835 *
1836 NEWCUR STD COLADX ; SAVE NEW ROW AND COLUMN
1837 LDA #LINLEN ; ELSE ADD A LINE
1838 MUL ; LINLEN * ROWADX
1839 ADDB COLADX
1840 ADCA #0
1841 ADDD #SCREEN ; ADD SCREEN BASE.
1842 STD CURSOR ; SAVE NEW CURSOR
1843 TFR D,X ; GET CURSOR IN X
1844 RTS ; AND RETURN
1845 *
1846 ********************* UPDATE CURRENT COLUMN AND ROW
1847 *
1848 NEWCOL LDD COLADX ; GET ROW AND COLUMN
1849 INCA ; BUMP COLUMN
1850 CMPA #LINLEN ; ROLL?
1851 BNE NEWCUR ; BRANCH IF NOT
1852 CLRA ; ELSE RESET TO ZERO
1853 INCB ; AND BUMP ROW
1854 CMPB #NUMLIN
1855 BNE NEWCUR
1856 DECB ; BOTTOM ROW
1857 BSR NEWCUR
1858 *
1859 ********************************* SCROLL THE SCREEN
1860 *
1861 SCROLL LDX #SCREEN ; POINT TO SCREEN
1862 SCROL1 LDA SCNLEN+LINLEN,X
1863 STA SCNLEN,X
1864 LDA LINLEN,X ; MOVE TWO BYTES
1865 STA ,X+ ; UP ONE LINE
1866 CMPX #SCREEN+SCNLEN-LINLEN
1867 BNE SCROL1 ; LOOP UNTIL DONE
1868 BRA SCROL3
1869 *
1870 **************** CLEAR FROM CURSOR TO END OF SCREEN
1871 *
1872 ESCCLS LDX CURSOR ; GET CURSOR
1873 SCROL3 LDA #$20 ; GET A SPACE
1874 SCROL2 STA SCNLEN,X ; CLEAR ATTRIBUTES
1875 STA ,X+ ; AND TEXT
1876 CMPX #SCREEN+SCNLEN
1877 BNE SCROL2 ; UNTIL DONE
1878 CLR ESCFLG
1879 RTS
1880 ENDIF DG640OPT
1880 ENDIF DG640OPT
1881 *
1882 IFD PRTOPT
1883 *************************************
1884 *
1885 ** PRINTER DRIVER ROUTINES
1886 *
1887 *************************************
1888 *
1889 ** PINIZ - INITIATE PRINTER PORT
1890 *
1891 PINIZ PSHS B
1892 LDD #DIRMSK*256+$04 ; ACCA=DIRMSK ACCB=$04
1893 STD PADATA ; SET DDR AND SELECT DATA
1894 *
1895 ** RESET PRINTER
1896 *
1897 LDB #PRESET
1898 STB PADATA
1899 RESTLP INCB ; DELAY FOR RESET
1900 BNE RESTLP
1901 STA PADATA ; ACCA=DIRMSK
1902 *
1903 ** INITALIZE PORT B (DATA PORT)
1904 *
1905 LDA #$2A
1906 STA PBCTRL
1907 LDD #$FF2E ; ACCA=$FF ACCB =%00101110
1908 STD PBDATA ; PBDREG PBCTRL
1909 *
1910 ** SELECT 66 LINES/PAGE
1911 *
1912 LDA #$1B
1913 BSR POUTCH
1914 LDA #'C
1915 BSR POUTCH
1916 LDA #66
1917 PULS B
1918 *************************************
1919 *
1920 ** OUTPUT A CHARACTER TO THE PRINTER
1921 *
1922 *************************************
1923 POUTCH PSHS B
1924 LDB PBDATA ; CLEAR INTERRUPT BIT
1925 *
1926 ** WAIT TILL NOT BUSY
1927 *
1928 BUSYLP LDB PADATA
1929 BITB #PERROR
1930 BEQ PEXIT
1931 TSTB
1932 BMI BUSYLP
1933 *
1934 ** NOW OUTPUT CHARACTER
1935 *
1936 STA PBDATA
1937 PEXIT PULS B,PC
1938 *************************************
1939 *
1940 ** PCHK TEST IFD PRINTER READY
1941 *
1942 *************************************
1943 PCHK TST PBCTRL ; TEST STATE OF CRB7
1944 RTS ; SET ON ACKNOWLEDGE
1945 ENDIF PRTOPT
1945 ENDIF PRTOPT
1946 *************************************
1947 *
1948 * MONITOR KEYBOARD COMMAND JUMP TABLE
1949 *
1950 *************************************
1951 *
1952 FE29 JMPTAB EQU *
1953 FE29 01 FCB 1 " ^A "
1954 FE2A FB 74 FDB ALTRA
1955 FE2C 02 FCB 2 " ^B "
1956 FE2D FB 69 FDB ALTRB
1957 FE2F 03 FCB 3 " ^C "
1958 FE30 FB 7F FDB ALTRCC
1959 FE32 04 FCB 4 " ^D "
1960 FE33 FB 5E FDB ALTRDP
1961 FE35 10 FCB $10 " ^P "
1962 FE36 FB 31 FDB ALTRPC
1963 FE38 15 FCB $15 " ^U "
1964 FE39 FB 3D FDB ALTRU
1965 FE3B 18 FCB $18 " ^X "
1966 FE3C FB 53 FDB ALTRX
1967 FE3E 19 FCB $19 " ^Y "
1968 FE3F FB 48 FDB ALTRY
1969 *
1970 FE41 42 FCC 'B'
1971 FE42 F9 5C FDB BRKPNT
1972 FE44 45 FCC 'E'
1973 FE45 F8 FD FDB MEMDUMP
1974 FE47 47 FCC 'G'
1975 FE48 F8 A5 FDB GO
1976 FE4A 4C FCC 'L'
1977 FE4B FA 5E FDB LOAD
1978 FE4D 50 FCC 'P'
1979 FE4E FA BC FDB PUNCH
1980 FE50 4D FCC 'M'
1981 FE51 F8 A8 FDB MEMCHG
1982 FE53 52 FCC 'R'
1983 FE54 FB ED FDB REGSTR
1984 FE56 53 FCC 'S'
1985 FE57 F8 F1 FDB DISSTK
1986 FE59 58 FCC 'X'
1987 FE5A F9 88 FDB XBKPNT
1988 IFD MFDCOPT
1989 FCC 'D' ; *** SWTPC USES 'U' FOR MINIBOOT
1990 FDB MINBOOT
1991 ENDIF MFDCOPT
1991 ENDIF MFDCOPT
1992 IFD CF8OPT
1993 FE5C 44 FCC 'D' ; *** FPGA 8 BIT USES 'D' FOR CFBOOT
1994 FE5D F9 D5 FDB CFBOOT
1995 ENDIF CF8OPT
1996 IFD IDEOPT
1997 FCC 'D' ; *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
1998 FDB IDEBOOT
1999 ENDIF IDEOPT
1999 ENDIF IDEOPT
2000 IFD DMAFOPT
2001 FCC 'U' ; *** SWTPC USES 'D' FOR DMAF2 BOOT
2002 FDB DBOOT
2003 ENDIF DMAFOPT
2003 ENDIF DMAFOPT
2004 IFD EXTOPT
2005 FE5F 55 FCC 'U' ; *** IF FPGA, 'U' IS FOR USER
2006 FE60 FC 92 FDB USRCMD
2007 ENDIF EXTOPT
2008 IFD RTCOPT
2009 FCC 'T'
2010 FDB TIMSET
2011 ENDIF RTCOPT
2011 ENDIF RTCOPT
2012 IFD TRAOPT
2013 FCC "T"
2014 FDB TRACE
2015 ENDIF TRAOPT
2015 ENDIF TRAOPT
2016 *
2017 FE62 TABEND EQU *
2018 *
2019 * ** 6809 VECTOR ADDRESSES **
2020 *
2021 * FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
2022 * FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
2023 * ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
2024 * RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
2025 * HIS OWN ROUTINES IF HE SO DESIRES.
2026 *
2027 *
2028 FE62 F9 94 RAMVEC FDB SWIE ; USER-V
2029 FE64 F8 A7 FDB RTI ; SWI3-V
2030 FE66 F8 A7 FDB RTI ; SWI2-V
2031 FE68 F8 A7 FDB RTI ; FIRQ-V
2032 FE6A F8 A7 FDB RTI ; IRQ-V
2033 FE6C F9 94 FDB SWIE ; SWI-V
2034 FE6E FF FF FDB $FFFF ; SVC-VO
2035 FE70 FF FF FDB $FFFF ; SVC-VL
2036 *
2037 * PRINTABLE MESSAGE STRINGS
2038 *
2039 FE72 0D 0A 00 00 00 MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
2040 FE77 53 59 53 30 39 42 FCC 'SYS09BUG 1.7 FOR '
55 47 20 31 2E 37
20 46 4F 52 20
2041 IFD SWTOPT
2042 FCC 'SWTPC'
2043 ENDIF SWTOPT
2043 ENDIF SWTOPT
2044 IFD ADSOPT
2045 FCC 'ADS6809'
2046 ENDIF ADSOPT
2046 ENDIF ADSOPT
2047 IFD B3SOPT
2048 FCC 'B3-S2+'
2049 ENDIF B3SOPT
2049 ENDIF B3SOPT
2050 IFD B5XOPT
2051 FCC 'B5-X300'
2052 ENDIF B5XOPT
2052 ENDIF B5XOPT
2053 IFD S3SOPT
2054 FCC 'S3STARTER'
2055 ENDIF S3SOPT
2055 ENDIF S3SOPT
2056 IFD S3EOPT
2057 FCC 'S3E'
2058 ENDIF S3EOPT
2058 ENDIF S3EOPT
2059 IFD XESOPT
2060 FCC 'XESS'
2061 ENDIF XESOPT
2061 ENDIF XESOPT
2062 IFD DE270OPT
2063 FE88 44 45 32 2D 37 30 FCC 'DE2-70'
2064 ENDIF DE270OPT
2065 FE8E 20 2D 20 FCC ' - '
2066 FE91 04 FCB 4
2067 FE92 4B 0D 0A 00 00 00 MSG2 FCB 'K,$0D,$0A,$00,$00,$00,$04 ; K,<CR>,<LF>,3 NULS,<EOT>
04
2068 FE99 3E MSG3 FCC '>'
2069 FE9A 04 FCB 4
2070 FE9B 57 48 41 54 3F MSG4 FCC 'WHAT?'
2071 FEA0 04 FCB 4
2072 FEA1 20 2D 20 MSG5 FCC ' - '
2073 FEA4 04 FCB 4'
2074 FEA5 20 20 53 50 3D MSG10 FCC ' SP='
2075 FEAA 04 FCB 4
2076 FEAB 20 20 50 43 3D MSG11 FCC ' PC='
2077 FEB0 04 FCB 4
2078 FEB1 20 20 55 53 3D MSG12 FCC ' US='
2079 FEB6 04 FCB 4
2080 FEB7 20 20 49 59 3D MSG13 FCC ' IY='
2081 FEBC 04 FCB 4
2082 FEBD 20 20 49 58 3D MSG14 FCC ' IX='
2083 FEC2 04 FCB 4
2084 FEC3 20 20 44 50 3D MSG15 FCC ' DP='
2085 FEC8 04 FCB 4
2086 FEC9 20 20 41 3D MSG16 FCC ' A='
2087 FECD 04 FCB 4
2088 FECE 20 20 42 3D MSG17 FCC ' B='
2089 FED2 04 FCB 4
2090 FED3 20 20 43 43 3A 20 MSG18 FCC ' CC: '
2091 FED9 04 FCB 4
2092 FEDA 45 46 48 49 4E 5A MSG19 FCC 'EFHINZVC'
56 43
2093 FEE2 53 31 MSG20 FCC 'S1'
2094 FEE4 04 FCB 4
2095 IFD DATOPT
2096 *
2097 * POWER UP/ RESET/ NMI ENTRY POINT
2098 *
2099 FF00 ORG $FF00
2100 *
2101 *
2102 FF00 8E FF F0 START LDX #IC11 ; POINT TO DAT RAM IC11
2103 FF03 86 0F LDA #$0F ; GET COMPLIMENT OF ZERO
2104 *
2105 *
2106 * INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
2107 * OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
2108 * IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
2109 * OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
2110 * STORED IN IT.
2111 *
2112 *
2113 FF05 A7 80 DATLP STA ,X+ ; STORE & POINT TO NEXT RAM LOCATION
2114 FF07 4A DECA ; GET COMP. VALUE FOR NEXT LOCATION
2115 FF08 26 FB BNE DATLP ; ALL 16 LOCATIONS INITIALIZED ?
2116 *
2117 * NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
2118 * ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
2119 * PHYSICAL ADDRESSES.
2120 *
2121 FF0A 86 F0 LDA #$F0
2122 FF0C A7 84 STA ,X ; STORE $F0 AT $FFFF
2123 FF0E 8E D0 A0 LDX #$D0A0 ; ASSUME RAM TO BE AT $D000-$DFFF
2124 FF11 10 8E 55 AA LDY #TSTPAT ; LOAD TEST DATA PATTERN INTO "Y"
2125 FF15 EE 84 TSTRAM LDU ,X ; SAVE DATA FROM TEST LOCATION
2126 FF17 10 AF 84 STY ,X ; STORE TEST PATTERN AT $D0A0
2127 FF1A 10 AC 84 CMPY ,X ; IS THERE RAM AT THIS LOCATION ?
2128 FF1D 27 0B BEQ CNVADR ; IF MATCH THERE'S RAM, SO SKIP
2129 FF1F 30 89 F0 00 LEAX -$1000,X ; ELSE POINT 4K LOWER
2130 FF23 8C F0 A0 CMPX #$F0A0 ; DECREMENTED PAST ZER0 YET ?
2131 FF26 26 ED BNE TSTRAM ; IF NOT CONTINUE TESTING FOR RAM
2132 FF28 20 D6 BRA START ; ELSE START ALL OVER AGAIN
2133 *
2134 *
2135 * THE FOLLOWING CODE STORES THE COMPLEMENT OF
2136 * THE MS CHARACTER OF THE FOUR CHARACTER HEX
2137 * ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
2138 * BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
2139 * IS STORED IN RAM IN THE LOCATION THAT IS
2140 * ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
2141 * THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
2142 * WHEN TESTING LOCATION $70A0, MEANING THERE
2143 * IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
2144 * $8000-$DFFF, THEN THE COMPLEMENT OF THE
2145 * "7" IN THE $70A0 WILL BE STORED IN
2146 * THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
2147 * AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
2148 * BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
2149 * 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
2150 * RAM THAT IS PHYSICALLY ADDRESSED AT $7---
2151 * WILL RESPOND AND APPEAR TO THE 6809 THAT IT
2152 * IS AT $D--- SINCE THAT IS THE ADDRESS THE
2153 * 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
2154 * OF RAM RESPONDS.
2155 *
2156 *
2157 FF2A EF 84 CNVADR STU ,X ; RESTORE DATA AT TEST LOCATION
2158 FF2C 1F 10 TFR X,D ; PUT ADDR. OF PRESENT 4K BLOCK IN D
2159 FF2E 43 COMA ; COMPLEMENT MSB OF THAT ADDRESS
2160 FF2F 44 LSRA ; PUT MS 4 BITS OF ADDRESS IN
2161 FF30 44 LSRA ; LOCATION D0-D3 TO ALLOW STORING
2162 FF31 44 LSRA ; IT IN THE DYNAMIC ADDRESS
2163 FF32 44 LSRA ; TRANSLATION RAM.
2164 FF33 B7 FF FD STA $FFFD ; STORE XLATION FACTOR IN DAT "D"
2165 *
2166 FF36 10 CE DF C0 LDS #STACK ; INITIALIZE STACK POINTER
2167 *
2168 *
2169 * THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
2170 * OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
2171 * OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
2172 * IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
2173 * TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
2174 * THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
2175 * RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
2176 *
2177 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2178 * 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
2179 *
2180 * ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
2181 * CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
2182 *
2183 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2184 * 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
2185 *
2186 *
2187 * HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
2188 * HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
2189 * ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
2190 * PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
2191 * IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
2192 * WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
2193 * RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
2194 * MEMORY ADDRESSED AS FOLLOWS....
2195 *
2196 * 0 1 2 3 4 5 6 7 8 9 A B C D E F
2197 * 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
2198 *
2199 *
2200 FF3A 10 8E DF D0 LDY #LRARAM ; POINT TO LOGICAL/REAL ADDR. TABLE
2201 FF3E A7 2D STA 13,Y ; STORE $D--- XLATION FACTOR AT $DFDD
2202 FF40 6F 2E CLR 14,Y ; CLEAR $DFDE
2203 FF42 86 F0 LDA #$F0 ; DESTINED FOR IC8 AN MEM EXPANSION ?
2204 FF44 A7 2F STA 15,Y ; STORE AT $DFDF
2205 FF46 86 0C LDA #$0C ; PRESET NUMBER OF BYTES TO CLEAR
2206 FF48 6F A6 CLRLRT CLR A,Y ; CLEAR $DFDC THRU $DFD0
2207 FF4A 4A DECA ; SUB. 1 FROM BYTES LEFT TO CLEAR
2208 FF4B 2A FB BPL CLRLRT ; CONTINUE IF NOT DONE CLEARING
2209 FF4D 30 89 F0 00 FNDRAM LEAX -$1000,X ; POINT TO NEXT LOWER 4K OF RAM
2210 FF51 8C F0 A0 CMPX #$F0A0 ; TEST FOR DECREMENT PAST ZERO
2211 FF54 27 22 BEQ FINTAB ; SKIP IF FINISHED
2212 FF56 EE 84 LDU ,X ; SAVE DATA AT CURRENT TEST LOCATION
2213 FF58 10 8E 55 AA LDY #TSTPAT ; LOAD TEST DATA PATTERN INTO Y REG.
2214 FF5C 10 AF 84 STY ,X ; STORE TEST PATT. INTO RAM TEST LOC.
2215 FF5F 10 AC 84 CMPY ,X ; VERIFY RAM AT TEST LOCATION
2216 FF62 26 E9 BNE FNDRAM ; IF NO RAM GO LOOK 4K LOWER
2217 FF64 EF 84 STU ,X ; ELSE RESTORE DATA TO TEST LOCATION
2218 FF66 10 8E DF D0 LDY #LRARAM ; POINT TO LOGICAL/REAL ADDR. TABLE
2219 FF6A 1F 10 TFR X,D ; PUT ADDR. OF PRESENT 4K BLOCK IN D
2220 FF6C 44 LSRA ; PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
2221 FF6D 44 LSRA ; TO ALLOW STORING IT IN THE DAT RAM.
2222 FF6E 44 LSRA
2223 FF6F 44 LSRA
2224 FF70 1F 89 TFR A,B ; SAVE OFFSET INTO LRARAM TABLE
2225 FF72 88 0F EORA #$0F ; INVERT MSB OF ADDR. OF CURRENT 4K BLK
2226 FF74 A7 A5 STA B,Y ; SAVE TRANSLATION FACTOR IN LRARAM TABLE
2227 FF76 20 D5 BRA FNDRAM ; GO TRANSLATE ADDR. OF NEXT 4K BLK
2228 FF78 86 F1 FINTAB LDA #$F1 ; DESTINED FOR IC8 AND MEM EXPANSION ?
2229 FF7A 10 8E DF D0 LDY #LRARAM ; POINT TO LRARAM TABLE
2230 FF7E A7 2E STA 14,Y ; STORE $F1 AT $DFCE
2231 *
2232 * THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
2233 * RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
2234 * THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
2235 * LOGICALLY RESPONDS TO THE ADDRESS $C---.
2236 *
2237 *
2238 FF80 86 0C LDA #$0C ; PRESET NUMBER HEX "C"
2239 FF82 E6 A6 FINDC LDB A,Y ; GET ENTRY FROM LRARAM TABLE
2240 FF84 26 05 BNE FOUNDC ; BRANCH IF RAM THIS PHYSICAL ADDR.
2241 FF86 4A DECA ; ELSE POINT 4K LOWER
2242 FF87 2A F9 BPL FINDC ; GO TRY AGAIN
2243 FF89 20 14 BRA XFERTF
2244 FF8B 6F A6 FOUNDC CLR A,Y ; CLR XLATION FACTOR OF 4K BLOCK FOUND
2245 FF8D E7 2C STB $0C,Y ; GIVE IT XLATION FACTOR MOVING IT TO $C---
2246 *
2247 * THE FOLLOWING CODE ADJUSTS THE TRANSLATION
2248 * FACTORS SUCH THAT ALL REMAINING RAM WILL
2249 * RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
2250 * ADDRESSES FROM $0000 AND UP....
2251 *
2252 FF8F 4F CLRA ; START AT ZERO
2253 FF90 1F 21 TFR Y,X ; START POINTER "X" START OF "LRARAM" TABLE.
2254 FF92 E6 A6 COMPRS LDB A,Y ; GET ENTRY FROM "LRARAM" TABLE
2255 FF94 27 04 BEQ PNTNXT ; IF IT'S ZER0 SKIP
2256 FF96 6F A6 CLR A,Y ; ELSE ERASE FROM TABLE
2257 FF98 E7 80 STB ,X+ ; AND ENTER ABOVE LAST ENTRY- BUMP
2258 FF9A 4C PNTNXT INCA ; GET OFFSET TO NEXT ENTRY
2259 FF9B 81 0C CMPA #$0C ; LAST ENTRY YET ?
2260 FF9D 2D F3 BLT COMPRS
2261 *
2262 * THE FOLLOWING CODE TRANSFER THE TRANSLATION
2263 * FACTORS FROM THE LRARAM TABLE TO IC11 ON
2264 * THE MP-09 CPU CARD.
2265 *
2266 FF9F 8E FF F0 XFERTF LDX #IC11 ; POINT TO DAT RAM IC11
2267 FFA2 C6 10 LDB #$10 ; GET NO. OF BYTES TO MOVE
2268 FFA4 A6 A0 FETCH LDA ,Y+ ; GET BYTE AND POINT TO NEXT
2269 FFA6 A7 80 STA ,X+ ; POKE XLATION FACTOR IN IC11
2270 FFA8 5A DECB ; SUB 1 FROM BYTES TO MOVE
2271 FFA9 26 F9 BNE FETCH ; CONTINUE UNTIL 16 MOVED
2272 *
2273 ELSE
2274 LRA RTS
2275 START LDS #STACK ; INITIALIZE STACK POINTER
2276 CLRB
2277 ENDIF DATOPT
2277 ENDIF DATOPT
2278 *
2279 FFAB 53 COMB ; SET "B" NON-ZERO
2280 FFAC F7 DF E2 STB ECHO ; TURN ON ECHO FLAG
2281 FFAF 16 F8 62 LBRA MONITOR ; INITIALIZATION IS COMPLETE
2282 *
2283 ** INTERRUPT JUMP VECTORS
2284 *
2285 FFB2 6E 9F DF C0 V1 JMP [STACK]
2286 FFB6 6E 9F DF C4 V2 JMP [SWI2]
2287 FFBA 6E 9F DF C6 V3 JMP [FIRQ]
2288 FFBE 6E 9F DF C8 V4 JMP [IRQ]
2289 FFC2 6E 9F DF CA V5 JMP [SWI]
2290 *
2291 * SWI3 ENTRY POINT
2292 *
2293 FFC6 1F 43 SWI3E TFR S,U
2294 FFC8 AE 4A LDX 10,U *$FFC8
2295 FFCA E6 80 LDB ,X+
2296 FFCC AF 4A STX 10,U
2297 FFCE 4F CLRA
2298 FFCF 58 ASLB
2299 FFD0 49 ROLA
2300 FFD1 BE DF CC LDX SVCVO
2301 FFD4 8C FF FF CMPX #$FFFF
2302 FFD7 27 0F BEQ SWI3Z
2303 FFD9 30 8B LEAX D,X
2304 FFDB BC DF CE CMPX SVCVL
2305 FFDE 22 08 BHI SWI3Z
2306 FFE0 34 10 PSHS X
2307 FFE2 EC C4 LDD ,U
2308 FFE4 AE 44 LDX 4,U
2309 FFE6 6E F1 JMP [,S++]
2310 FFE8 37 1F SWI3Z PULU A,B,X,CC,DP
2311 FFEA EE 42 LDU 2,U
2312 FFEC 6E 9F DF C2 JMP [SWI3]
2313 *
2314 * 6809 VECTORS
2315 *
2316 FFF0 ORG $FFF0
2317 FFF0 FF B2 FDB V1 USER-V
2318 FFF2 FF C6 FDB SWI3E SWI3-V
2319 FFF4 FF B6 FDB V2 SWI2-V
2320 FFF6 FF BA FDB V3 FIRQ-V
2321 FFF8 FF BE FDB V4 IRQ-V
2322 FFFA FF C2 FDB V5 SWI-V
2323 FFFC FF B2 FDB V1 NMI-V
2324 FFFE FF 00 FDB START RESTART-V
0004 END START
0005 END
Program + Init Data = 2021 bytes
Error count = 0
/sys09bug/sys09270.s19
0,0 → 1,66
S123F800F814F861FCA1FC9BFCB9FCCEFB8FFB1EFB1AFA2E8EFE62108EDFC0C610A680A71E
S123F820A05A26F98EE000BFDFE017015BC60C6FE25A26FB308CDDAF6A86D0A7E41F4317A2
S123F84004A38EFE721703478EDFD04FC60D6D8527038B04195A2AF617040C8EFE921703A2
S123F8602E8EFE991702B3170437847F810D27F11F8981202C09865E1704531F988B401701
S123F880044C170447C1602F02C0208EFE29E180270F30028CFE6226F58EFE9B1702F020AB
S123F8A0C0AD9420BC1F343B17036B292D1F128EFEA11702651F211703A517040FA6A41798
S123F8C003A517040717035E2811810827E1811827DD815E2717810D260F39A7A4A1A427AB
S123F8E0081703E8863F1703E5312120C2313F20BE1702A21F328EDFC0301F200517030BE2
S123F90029063420ACE12401391F10C30010C4F034061F20C4F01F01ACE4270517039A27DB
S123F9200332623934108EFEA11701EEAEE417032E170396C610A68017032C17038E5A2688
S123F940F5170386AEE1C610A68081202504817E2302862E1703775A26EE20BC1702B7290D
S123F9601E8CDFC0241A34108EFFFF8D553510270FA684813F2709A7A0AFA4863FA78439F2
S123F980170349863F160346108EDFE3C6088D185A26FB391F43AE4A301F8D262704AF4AD5
S123F9A08D0617024816FEB9AE218CDFC0240AA684813F2604A6A4A78486FFA7A0A7A0A717
S123F9C0A039108EDFE3C608A6A0ACA127045A26F739313D398D4086E0B7E0468D398601AA
S123F9E0B7E04186EFB7E0478D2D8601B7E0424FB7E043B7E044B7E0458620B7E0478D17B6
S123FA008EC0008D21B6E040A7808CC20026F48EC000AF4A1F343BB6E047858026F9B6E015
S123FA2047854027F239B6E047850827F9393436A66244444444108EDFD0E6A654545454F6
S123FA40E7E4E6A65358585858A662840FA762EA62E76235B63404C6205A26FD3584BDFC67
S123FA60E786111702687FDFE217022A815326F91702238139273D813126F11701A83402F4
S123FA80292617019129213410E6E0EBE0EBE46AE46AE4340417018E3504290C3402EBE093
S123FAA06AE42705A78020EB5F3502C1FF27BA863F17021A73DFE286131602126FE2170107
S123FAC04A3430294DAC6225493001AFE4BDFCE786121701F9ECE4A362270610830020239D
S123FAE002C620E7648EFEE217002FCB031F98170175AE62170168EB62EB63EB84A6801732
S123FB0001656A6426F5531F9817015BAF62ACE426C386141701B73265398D0220713410EE
S123FB208EFE9317006935901601A11600F81600E51700918DF28DF62902AF4A398D618D1A
S123FB40E78DEB2902AF48398D728DDC8DE02902AF46398D5E8DD18DD52902AF44398D49E1
S123FB608DC68DC72902A743398D6C8DBB8DBC2902A742398D588DB08DB12902A741398D7C
S123FB805F8DA58DA629048A80A7C43917013FA680810426F7398EFEA58DF41F311600BF93
S123FBA08EFEB18DEAAE4820F48EFEC38DE1A6431600B48EFEBD8DD7AE4420E18EFEB78DA3
S123FBC0CEAE4620D88EFEAB8DC5AE4A20CF8EFEC98DBCA64120D98EFECE8DB3A64220D007
S123FBE08EFED38DAAA6C48EFEDA1600908EFEA117FF278DA18DA98DB08DB88DBF8EFEA12C
S123FC0017FF178DC08DC78DCE20D58D09294D1F12862D1700B88D0E29421F018D08293CE3
S123FC203410A76135908D112932484848481F898D0729283404ABE0398D5B8130251D81B1
S123FC40392203803039814125128146220380373981612507816622038057391A023934D1
S123FC601035028D0235023402444444448D043502840F8B3081392F028B0720513402C62D
S123FC8008A68068E42502862D8D438D3F5A26F135826E9FF0007DDFE227068D04847F202C
S123FCA02D3410BEDFE0A684850126098EE020A684850127EEA60135903402A69FDFE085F5
S123FCC0012605B6E020850135828D0086208D493412BEDFE0A684850227FA850826F63585
S123FCE002A70135908D13BEDFE08603A7848651A7846D0186FFB7DFE2398EE030CC0000B0
S123FD00FDDFFBA702E703E704FDDFFDC602E7017FDFFE861B8D02865934168EE0307DDF52
S123FD20FE27048D60200D812024048D092005A7841700AF359681082734811B275A811AA0
S123FD401027007C81162738810D10270089810C2724810B270F810A2645FCDFFB5CC1190C
S123FD60267916008FFCDFFB5D27345A206DB6DFFB272C4A2062B6DFFB4C815027212058AA
S123FD80CC00002056F6DFFEC13D27148159276E81542731813D2604B7DFFE397FDFFE392B
S123FDA07DDFFD2604B7DFFD397FDFFE8020814F22EDF6DFFD7FDFFDC020C11822E1201BF1
S123FDC0CC00008D16B6DFFBC620E7844CA702815026F77FDFFE394FF6DFFCFDDFFBA702B7
S123FDE0E70339FCDFFB4C815026F04F5CC11926EA5A8DE7E6045CC11925015FE704F6DF0B
S123FE00FB8620F7DFFBE702A7845CC15026F4F6DFFC5CC1192708F7DFFCE7035F20E45F1D
S123FE20F7DFFBE702F7DFFE3901FB7402FB6903FB7F04FB5E10FB3115FB3D18FB5319FB44
S123FE404842F95C45F8FD47F8A54CFA5E50FABC4DF8A852FBED53F8F158F98844F9D55554
S123FE60FC92F994F8A7F8A7F8A7F8A7F994FFFFFFFF0D0A000000535953303942554720E1
S123FE80312E3720464F52204445322D3730202D20044B0D0A000000043E04574841543FC6
S123FEA004202D2004202053503D04202050433D04202055533D04202049593D04202049BC
S123FEC0583D04202044503D042020413D042020423D04202043433A2004454648494E5A03
S108FEE05643533104F8
S123FF008EFFF0860FA7804A26FB86F0A7848ED0A0108E55AAEE8410AF8410AC84270B30A6
S123FF2089F0008CF0A026ED20D6EF841F104344444444B7FFFD10CEDFC0108EDFD0A72DD9
S123FF406F2E86F0A72F860C6FA64A2AFB3089F0008CF0A02722EE84108E55AA10AF84102E
S123FF60AC8426E9EF84108EDFD01F10444444441F89880FA7A520D586F1108EDFD0A72E26
S123FF80860CE6A626054A2AF920146FA6E72C4F1F21E6A627046FA6E7804C810C2DF38E02
S123FFA0FFF0C610A6A0A7805A26F953F7DFE216F8626E9FDFC06E9FDFC46E9FDFC66E9FFC
S123FFC0DFC86E9FDFCA1F43AE4AE680AF4A4F5849BEDFCC8CFFFF270F308BBCDFCE2208A0
S113FFE03410ECC4AE446EF1371FEE426E9FDFC294
S113FFF0FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00EB
S9030000FC
/sys09bug/sys09bug.asm
24,7 → 24,6
* ADDED: ADM3A VDU DRIVER
*
* MODIFIED TO SYS09BUG VER 1.1
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 7TH JANUARY 2007
* ADDED: 'U' USER EXTENTION COMMANDS AT $F000
32,7 → 31,6
* AND REALTIME CLOCK
*
* MODIFIED TO SYS09BUG VER 1.2
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 21ST MAY 2007
* ADDED: COMPACT FLASH BOOT TO FPGA VERSION
39,7 → 37,6
* REMOVED PORT REDIRECTION ON PUNCH & LOAD
*
* Modified to SYS09BUG VER 1.3
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 8TH JAN 2008
* ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
46,7 → 43,6
* WITH ONLY 32K OF RAM
*
* Modified to SYS09BUG VER 1.4
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 3RD FEB 2008
* ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
54,13 → 50,11
* 16 BIT IDE DISK BOOT STRAP ROUTINE
*
* Modified to SYS09BUG VER 1.5
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 7TH SEP 2008
* ADDED: ADDED "B3-S2+" STRING
*
* Modified to SYS09BUG VER 1.6
* FOR: SYSTEM09 FPGA SYSTEM
* BY: JOHN KENT
* DATE: 2ND DEC 2008
* ADDED: ADDED HARDWARE FLOW CONTROL
67,6 → 61,11
*
* CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
*
* Modified to SYS09BUG VER 1.7
* BY: JOHN KENT
* DATE: 16TH OCT 2010
* ADDED: "DE2-70" STRING
*
* *** COMMANDS ***
*
* CONTROL A = ALTER THE "A" ACCUMULATOR
1263,7 → 1262,7
CMPA #$39 ; IS IT < OR = "9" ?
BLE OUTC ; IF LESS, OUTPUT IT
ADDA #7 ; IF > MAKE ASCII LETTER
OUTC BRA OUTCH ; OUTPUT CHAR
OUTC BRA OUTCH ; OUTPUT CHAR
*
* BINARY / ASCII --- THIS ROUTINE
* OUTPUTS A BYTE IN ENHANCED
2038,28 → 2037,31
* PRINTABLE MESSAGE STRINGS
*
MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
FCC 'SYS09BUG 1.6 FOR '
IFD SWTOPT`
FCC 'SWTPC '
FCC 'SYS09BUG 1.7 FOR '
IFD SWTOPT
FCC 'SWTPC'
ENDIF SWTOPT
IFD ADSOPT
FCC 'ADS6809 '
FCC 'ADS6809'
ENDIF ADSOPT
IFD B3SOPT
FCC 'B3-S2+ '
FCC 'B3-S2+'
ENDIF B3SOPT
IFD B5XOPT
FCC 'B5-X300 '
FCC 'B5-X300'
ENDIF B5XOPT
IFD S3SOPT
FCC 'S3STARTER '
FCC 'S3STARTER'
ENDIF S3SOPT
IFD S3EOPT
FCC 'S3E '
FCC 'S3E'
ENDIF S3EOPT
IFD XESOPT`
FCC 'XESS '
IFD XESOPT
FCC 'XESS'
ENDIF XESOPT
IFD DE270OPT
FCC 'DE2-70'
ENDIF DE270OPT
FCC ' - '
FCB 4
MSG2 FCB 'K,$0D,$0A,$00,$00,$00,$04 ; K,<CR>,<LF>,3 NULS,<EOT>
/sys09bug/sys09equ.asm
21,7 → 21,12
MONEXT EQU $F000 START OF EXTENDED COMMANDS
EXTCMD EQU $00 EXTENDED OFFSET
ENDIF XESOPT
***************************************************
IFD DE270OPT
MONEXT EQU $F000 START OF EXTENDED COMMANDS
EXTCMD EQU $00 EXTENDED OFFSET
ENDIF DE270OPT
**************************************************
**************************************************
 
IFD SWTOPT
*
45,7 → 50,7
*
IFD B3SOPT
*
* BURCHED B3-SPARTAN2
* BURCHED SPARTAN 2 B3+
*
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
57,7 → 62,7
*
IFD B5XOPT
*
* BURCHED B5-X300
* BURCHED SPARTAN 2 B5-X300
*
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
91,7 → 96,7
*
IFD XESOPT
*
* XESS XSA-3S1000 & XST-3.0
* XESS SPARTAN 3 XSA-3S1000 & XST-3.0
*
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
102,7 → 107,19
EXTOPT EQU $FF EXTENDED COMMANDS
ENDIF XESOPT
*
IFD DE270OPT
*
* TERASIC CYCLONE 2 DE2-70
*
ACIAOPT EQU $FF ACIA AT PORT 0
PS2OPT EQU $FF PS2 KEYBOARD AT $E020
VDUOPT EQU $FF VDU AT $E030
CF8OPT EQU $FF COMPACT FLASH AT $E040
DATOPT EQU $FF DYNAMIC ADDRESS TRANSLATION
EXTOPT EQU $FF EXTENDED COMMANDS
ENDIF DE270OPT
*
*
IFD ACIAOPT
*
***************************************************
/sys09bug/sys09270.sh
0,0 → 1,2
../../Tools/as09/as09_dos.exe sys09270.asm -l > sys09270.lst
../../Tools/epedit/epedit.exe sys09270.aux
/sys09bug/sys09270.txt
0,0 → 1,5
NAM SYS09BUG FOR TERASIC CYCLONE II DE2-70
INCLUDE "opt_270.txt"
INCLUDE "sys09equ.txt"
INCLUDE "sys09bug.txt"
END
/sys09bug/sys09270.asm
0,0 → 1,5
NAM SYS09BUG FOR TERASIC CYCLONE II DE2-70
INCLUDE "opt_270.asm"
INCLUDE "sys09equ.asm"
INCLUDE "sys09bug.asm"
END
/sys09bug/sys09270.hex
0,0 → 1,129
:10000000F814F861FCA1FC9BFCC5FCE0FB8FFB1E17
:10001000FB1AFA2E8EFE74108EDFC0C610A680A7C3
:10002000A05A26F98EE000BFDFE017015BC60C6F17
:10003000E25A26FB308CDDAF6A86D0A7E41F431757
:1000400004B58EFE841703478EDFD04FC60D6D8535
:1000500027038B04195A2AF617040C8EFEA41703E3
:100060002E8EFEAB1702B3170437847F810D27F164
:100070001F8981202C09865E1704651F988B401705
:10008000045E170459C1602F02C0208EFE3BE18040
:10009000270F30028CFE7426F58EFEAD1702F0207D
:1000A000C0AD9420BC1F343B17036B292D1F128E4B
:1000B000FEB31702651F211703A5170421A6A41775
:1000C00003A517041917035E2811810827E1811879
:1000D00027DD815E2717810D260F39A7A4A1A4274C
:1000E000081703FA863F1703F7312120C2313F205A
:1000F000BE1702A21F328EDFC0301F200517030B70
:1001000029063420ACE12401391F10C30010C4F0CB
:1001100034061F20C4F01F01ACE427051703A627EF
:100120000332623934108EFEB31701EEAEE41703CA
:100130002E1703A8C610A68017032C1703A05A2653
:10014000F5170398AEE1C610A68081202504817EB4
:100150002302862E1703895A26EE20BC1702B729E0
:100160001E8CDFC0241A34108EFFFF8D55351027EA
:100170000FA684813F2709A7A0AFA4863FA7843993
:1001800017035B863F160358108EDFE3C6088D18F1
:100190005A26FB391F43AE4A301F8D262704AF4A2B
:1001A0008D0617024816FEB9AE218CDFC0240AA6C0
:1001B00084813F2604A6A4A78486FFA7A0A7A0A7A2
:1001C000A039108EDFE3C608A6A0ACA127045A26EA
:1001D000F739313D39CC0006FDE11ECC0002FDE1CE
:1001E0001ECC00E0FDE10C8D2ECC0001FDE1045F92
:1001F000FDE106FDE108FDE10AC620FDE10E8D17D7
:100200008EC0008D21FCE100E7808CC10026F48EB9
:10021000C000AF4A1F343BFCE10EC58026F9FCE16B
:100220000EC54027F239FCE10EC50827F9393436EE
:10023000A66244444444108EDFD0E6A6545454547D
:10024000E7E4E6A65358585858A662840FA762EA16
:1002500062E76235B63404C6205A26FD3584BDFCFB
:10026000F9861117027A7FDFE217022A815326F9F5
:100270001702238139273D813126F11701A8340265
:10028000292617019129213410E6E0EBE0EBE46A1E
:10029000E46AE4340417018E3504290C3402EBE0DF
:1002A0006AE42705A78020EB5F3502C1FF27BA86E5
:1002B0003F17022C73DFE286131602246FE2170148
:1002C0004A3430294DAC6225493001AFE4BDFCF918
:1002D000861217020BECE4A362270610830020238A
:1002E00002C620E7648EFEF417002FCB031F981779
:1002F0000175AE62170168EB62EB63EB84A68017B1
:1003000001656A6426F5531F9817015BAF62ACE480
:1003100026C386141701C93265398D022071341045
:100320008EFEA517006935901601B31600F8160069
:10033000E51700918DF28DF62902AF4A398D618D56
:10034000E78DEB2902AF48398D728DDC8DE02902F3
:10035000AF46398D5E8DD18DD52902AF44398D4997
:100360008DC68DC72902A743398D6C8DBB8DBC29E5
:1003700002A742398D588DB08DB12902A741398D20
:100380005F8DA58DA629048A80A7C439170151A6BF
:1003900080810426F7398EFEB78DF41F311600BF19
:1003A0008EFEC38DEAAE4820F48EFED58DE1A643C5
:1003B0001600B48EFECF8DD7AE4420E18EFEC98DDF
:1003C000CEAE4620D88EFEBD8DC5AE4A20CF8EFE65
:1003D000DB8DBCA64120D98EFEE08DB3A64220D095
:1003E0008EFEE58DAAA6C48EFEEC1600908EFEB39E
:1003F00017FF278DA18DA98DB08DB88DBF8EFEB34F
:1004000017FF178DC08DC78DCE20D58D09294D1FA3
:1004100012862D1700CA8D0E29421F018D08293C16
:100420003410A76135908D112932484848481F89FA
:100430008D0729283404ABE0398D5B8130251D817F
:1004400039220380303981412512814622038037C9
:100450003981612507816622038057391A023934B0
:100460001035028D0235023402444444448D043573
:1004700002840F8B3081392F028B0720633402C630
:1004800008A68068E42502862D8D558D515A26F1E7
:1004900035826E9FF0007DDFE227068D04847F2089
:1004A0003F34108611A79FDFE0BEDFE0A684850100
:1004B00026098EE020A684850127EE8651A79FDFBE
:1004C000E0A601359034028611A79FDFE0A69FDFEA
:1004D000E085012605B6E020850135828D00862065
:1004E0008D493412BEDFE0A684850227FA850826EE
:1004F000F63502A70135908D13BEDFE08603A78491
:100500008651A7846D0186FFB7DFE2398EE030CCDB
:100510000000FDDFFBA702E703E704FDDFFDC602E5
:10052000E7017FDFFE861B8D02865934168EE03090
:100530007DDFFE27048D60200D812024048D09209D
:1005400005A7841700AF359681082734811B275AE9
:10055000811A1027007C81162738810D1027008909
:10056000810C2724810B270F810A2645FCDFFB5CC9
:10057000C119267916008FFCDFFB5D27345A206DE8
:10058000B6DFFB272C4A2062B6DFFB4C81502721C7
:100590002058CC00002056F6DFFEC13D27148159BB
:1005A000276E81542731813D2604B7DFFE397FDF76
:1005B000FE397DDFFD2604B7DFFD397FDFFE8020B9
:1005C000814F22EDF6DFFD7FDFFDC020C11822E163
:1005D000201BCC00008D16B6DFFBC620E7844CA79D
:1005E00002815026F77FDFFE394FF6DFFCFDDFFB8F
:1005F000A702E70339FCDFFB4C815026F04F5CC1BA
:100600001926EA5A8DE7E6045CC11925015FE70463
:10061000F6DFFB8620F7DFFBE702A7845CC15026EC
:10062000F4F6DFFC5CC1192708F7DFFCE7035F2065
:10063000E45FF7DFFBE702F7DFFE3901FB7402FB43
:100640006903FB7F04FB5E10FB3115FB3D18FB5378
:1006500019FB4842F95C45F8FD47F8A54CFA5E5095
:10066000FABC4DF8A852FBED53F8F158F98844F95B
:10067000D555FC92F994F8A7F8A7F8A7F8A7F9942C
:10068000FFFFFFFF0D0A0000005359533039425558
:100690004720312E3720464F52204445322D3730E7
:1006A000202D20044B0D0A000000043E0457484151
:1006B000543F04202D2004202053503D042020507E
:1006C000433D04202055533D04202049593D04203A
:1006D0002049583D04202044503D042020413D0441
:1006E0002020423D04202043433A20044546484907
:1006F0004E5A564353310400000000000000000031
:100700008EFFF0860FA7804A26FB86F0A7848ED046
:10071000A0108E55AAEE8410AF8410AC84270B3045
:1007200089F0008CF0A026ED20D6EF841F10434402
:10073000444444B7FFFD10CEDFC0108EDFD0A72D9C
:100740006F2E86F0A72F860C6FA64A2AFB3089F001
:10075000008CF0A02722EE84108E55AA10AF8410D2
:10076000AC8426E9EF84108EDFD01F10444444444B
:100770001F89880FA7A520D586F1108EDFD0A72E60
:10078000860CE6A626054A2AF920146FA6E72C4F08
:100790001F21E6A627046FA6E7804C810C2DF38E5F
:1007A000FFF0C610A6A0A7805A26F953F7DFE2167D
:1007B000F8626E9FDFC06E9FDFC46E9FDFC66E9FC4
:1007C000DFC86E9FDFCA1F43AE4AE680AF4A4F586C
:1007D00049BEDFCC8CFFFF270F308BBCDFCE220859
:1007E0003410ECC4AE446EF1371FEE426E9FDFC290
:1007F000FFB2FFC6FFB6FFBAFFBEFFC2FFB2FF00E7
:00000001FF
/sys09bug/sys09270.aux
0,0 → 1,7
t m
l SYS09270.S19
c f800 ffff 0
t i
s sys09270.hex 0 800
q
 
/Flex9/flex9ide.sh
1,3 → 1,3
../../Tools/as09/as09.exe flex9ide.asm -l > flex9ide.lst
../../Tools/epedit/epedit.exe flex9ide.aux
 
../../Tools/as09/as09_dos.exe flex9ide.asm -l > flex9ide.lst
../../Tools/epedit/epedit.exe flex9ide.aux
 
/Flex9/flex9ram.asm
9,5 → 9,5
INCLUDE "f9-cli.txt"
INCLUDE "f9-monio.txt"
INCLUDE "f9-fms.txt"
INCLUDE "f9-dkram.txt"
INCLUDE "f9-monex.txt"
END COLDS
/Flex9/F9-MONEX.S19
0,0 → 1,66
S123DE000E570E5B0E5F0E630E6C0E9F0EA30EA70EBF0EC300000000000000000000000027
S10BDE20000102031040FFFFA2
S1230000079C0117013F013D013D013D013D013D0052005200520117013F013D013D013DA3
S1230020013D013D005200520052005200520052005200520052005200520052005201789D
S123004001E70247024C024C024C024C0052005200525F5D1CFE396E9FDE326E9FDE346E84
S12300609FDE368D072701396E9FDE383430E603F7DE1E8EDE2AA68581FF26083530C60FC8
S12300805D1A0139C6143D8E0002308B108EDE32C614A680A7A05A26F935306E9FDE3A6EE3
S12300A09FDE3C6E9FDE3E4FB7DE1E8EDE1B8DBC2504AD9FDE40B6DE1E4C810426EA396EBB
S12300C09FDE426E9FDE441FA8B7DE221A50CEDE2AF6DE1EE6C5CEDE2EB6DE1FABC584F062
S12300E0A7E2B6DE208001880F840FABE09700B6DE1F840F8B005F1F03398600880F9700B3
S1230100B6DE221F8A39B7DE1FF7DE201CFE1A0439C6405D1A0139347017FFEA17FFA81000
S12301208EDE465FA6C0A7A05A26F917FFCC108EDE465FA6A0A7805A26F95F35F05F39344B
S12301407017FFC2CEDE2AF6DE1EE6C5C1012707C100270316FFBA108EDE465FA680A7A0A8
S12301605A26F917FF61108EDE465FA6A0A7C05A26F917FF855F35F0340434027FDE217FBA
S1230180DE228673BD0281244CB6DE1EBD028124443502BD0281243D3502BD028124365F50
S12301A0BD02652430A780BBDE22B7DE2224037CDE215A26EBBD0265241B3402BD0265243C
S12301C0141F89350210B3DE21260E8606BD028124035F200DC61020098615BD028124F5C0
S12301E0C609F7DE215D39340434027FDE217FDE228672BD028124DDB6DE1EBD028124D511
S12302003502BD028124CE3502BD028124C75FA680BD028124BFBBDE22B7DE2224037CDE74
S1230220215A26EBB6DE21BD028124A9B6DE22BD028124A1BD0265249C810626035F20029C
S1230240C60AF7DE215D39F6DE215D398651BD0281240CBD02652407810626035F2004C624
S1230260101A015D3934308E03E8108E04E2960047250A313F26F7301F26EF35B0960135AA
S1230280B0343034028E03E8108E04E296004747250C313F26F6301F26EE350235B035027C
S12302A0970135B00A0D466F726D6174696E672052414D6469736B2E2E2E20040A0D045239
S12302C0616D6469736B206E6F7420616C6C6F63617465642120048E02A4BD04508EDE2A47
S12302E05FA6858101270C5CC10426F58E02BCBD045039F7DE1E8EDE1B9D6C8EDE464F5F06
S1230300A7805A26FB7FDE1F8601B7DE208EDE46B6DE1FA784B6DE204C810F26046C8486BF
S123032001A701B6DE1FF6DE209D5B7CDE20B6DE20810F26D88601B7DE207CDE1FB6DE1F4D
S1230340814026C98EDE46863FC60E9D578EDE466F846F01863FC60E9D5B8EDE464FC60E2F
S12303609D578EDE466F846F014FC60E9D5B8EDE464FC6039D578EDE466F846F01CC524123
S1230380ED8810CC4D44ED8812CC4953ED8814CC4B20ED8816CC0001ED881BCC0101ED889D
S12303A01D863FC60EED881FED8826CC0372ED88218601A788238607A788248607A78825E3
S12303C04FC6039D5B8EDE464FC6019D578EDE4686AAA7848655A7014FC6010E5B080842EC
S12303E06F6F74696E6720696E7465726E616C20464C45582E2E2E2E0D0A048E03DDBD049B
S1230400508ED3E5108E0424ECA1ED818CD3FD26F78EDE00108E043CECA1ED818CDE1E2615
S1230420F77ECD00045C046800020008046804680468046404680460045404580E570E5BA2
S12304400E5F0E630E6C0E9F0EA30EA70EBF0EC36E9F00006E9F00006E9F00006E9F00005B
S12304606E9F00006E9F00003953657269616C20524F4D204469736B2075706C6F61642047
S12304802E2E2E0D0A04524F4D204469736B204C6F616465640D0A048E0469BD0450860004
S12304A0B7DE1E4FC601B7DE1FF7DE2017FC185FBD04D3A7C05A26F817FC3FB6DE1FF6DEF0
S12304C0205CC10F26E0C6014C813026D98E04867E045034048D0E484848481F898D0634B7
S12304E004ABE03584BD050B29FB80302BF781092F0A81112BEF81162EEB800739960085F3
S123050001398603970086119700398610B7DE277FDE287FDE299600850126088578270942
S12305208DE020E796011C02397ADE2926E87ADE2826E37ADE2726DE4F1A0239340296004A
S123054085022608857827F68DB820F235029701390D0A586D6F64656D20524F4D2044690D
S1230560736B2055706C6F6164040D0A55706C6F616420436F6D706C657465040D0A55705B
S12305806C6F6164204572726F72048E055117FEBF8601B7DE238E05F9BFDE258600B7DE29
S12305A01E4FC601B7DE1FF7DE2017FB1A5F17002B2520A7C05A26F617FB3FB6DE1FF6DE93
S12305C0205CC10F26DEC6014C813026D78E056A7E045017FB248E057C16FE743410BEDE8A
S12305E02517FF27280A861517FF518E05F920F1AD8426EDBFDE253590810126068E06199E
S12306001CFA3981042608860617FF301A0539811826031A05391CFA39B1DE2326068E06CF
S12306202F1CFA39861517FF138E05F91CFA3943B1DE2326EF7FDE218680B7DE248E06437B
S12306401CFA393402BBDE21B7DE2135027ADE2426038E065A1CFE1A0439B1DE2126077C0D
S1230660DE238606200D34041F305AC4801F033504861517FEC68E05F91CFA3908084C6F20
S1230680616420524F4D206469736B2066726F6D20636F6E6669672050524F4D2E04466F09
S12306A0756E642053594E432C206C6F6164696E6720646174612E2E2E0A0D04524F4D20FB
S12306C04469736B204C6F616465642E0A0D04524F4D204469736B204E6F7420466F756E37
S12306E0642E0A0D048E067CBD04508D5A108E00208E00008D6C8D7C2715301F8C000026B6
S1230700F3311F108C000026EB8E06CF7E04508E069EBD04504FB7DE1EC601B7DE1FF7DE1B
S12307202017F9A35F8D67A7C05A26F917F9CBB6DE1FF6DE205CC10F26E1C6014C81302610
S1230740DA8E06BC7E045086009700860097008E0000301F8C000026FBBFDF46BFDF4839D2
S1230760860097008600970096004478DF493979DF4879DF4779DF46CC000010B3DF4826CF
S12307800CCC000010B3DF46393404C6088DD35A2600B6DF49358417FCBE847F1F898620BD
S12307A017FCB1C1602F07C0208E07C4E180271230028C07D326FA8E07D316FC936E94423E
S11A07C003FB4C04984602D75006E558058B57484154203F0A0D0448
S9030000FC
/Flex9/f9-monex.txt
0,0 → 1,1304
*
** FLEX 9 DISK DRIVERS
*
* FOR SYS09BUG ON THE
* DIGILENT SPARTAN 3 STARTER BOARD AND
* TERASIC CYCLONE 2 DE1 BOARD
* WITH I/O MAPPED AT $XE000
* AND ROM MAPPED AT $XF000
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
* THE TERASIC CYCLONE 2 DE1 BOARD HAS 512KBYTE OF SRAM
* THE FIRST 64K IS USED BY FLEX,
* THE SECOND 128K IS USED AS A ROM DISK
* THE REMAINING RAM IS USED FOR A RAM DISK
*
*
CFLAG EQU $01 CARRY FLAG
VFLAG EQU $02 OVERFLOW FLAG
ZFLAG EQU $04 ZERO FLAG
NFLAG EQU $08 NEGATIVE FLAG
IFLAG EQU $10 IRQ MASK CC
HFLAG EQU $20 HALF CARRY
FFLAG EQU $40 FIRQ MASK CC
EFLAG EQU $80 ENTIRE FLAG
*
MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
DATREG EQU IC11 DAT REGISTERS
*
* Serial Port
*
ACIAC1 EQU ACIAS
ACIAD1 EQU ACIAS+1
DELCON EQU 1250 Delay (Processor clock in MHz * 50)
*
* XMODEM Control characters
*
SOH EQU $01
EOT EQU $04
ACK EQU $06
NAK EQU $15
CAN EQU $18
*
* DRIVE GEOMETRY
*
EMAXSEC EQU 14 ROM DISK
EMAXTRK EQU 48 3 * 16 * 14 * 256 = 172,032 Bytes
ETOTSEC EQU EMAXTRK*EMAXSEC-EMAXSEC
*
RMAXSEC EQU 14 RAM DISK
*RMAXTRK EQU 192 12 * 16 * 14 * 256 = 688,128 Bytes Digilent Spartan 3
RMAXTRK EQU 64 4 * 16 * 14 * 256 = 229,376 Bytes Terasic Cyclone 2
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
*
* DRIVE TYPES
*
DTYPROM EQU 0 ROM DISK
DTYPRAM EQU 1 RAM DISK
DTYPFLS EQU 2 FLASH DISK
DTYPNET EQU 3 FLEXNET DISK
*
ORG $DE00
*
* DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
* Disk driver for RAM Disk.
*
* 14 SECTORS PER TRACK
* 16 * N TRACKS PER DISK
*
* ROM DISK OCCUPIES $10000 - $1E000 ... $30000 - $3E000
* RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
* Track Buffer page mapped at $E000 - $EFFF
* MAPPAG = $00 = 0 x $1000 (4 K pages)
 
* ON SWTPC ROM AT $XF000 AND IO AT $XE000
* APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
* WHEN USING RAM AS A RAMDISK.
* THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT
* THE LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE
* THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
*
*
*
* FLEX disk jump table.
*
READ JMP READSC
WRITE JMP WRITSC
VERIFY JMP BUSY
RESTOR JMP RESTR1
DRIVE JMP DRVSEL
DRVRDY JMP CHKRDY
QUICK JMP CHKQIK
COLDDR JMP DINIT
WARMDR JMP DWARM
SEEK JMP SEEKTS
*
* RAM SPACE
*
DRVNUM FCB 0
TRACK FCB 0
SECTOR FCB 0
CHKSUM FCB 0
CCSAVE FCB 0
BLKNUM FCB 0 Xmodem block number
BYTCNT FCB 0 Xmodem byte count
XSTATE FDB 0 Xmodem State Vector
DELCNT FCB $00,$00,$00 Xmodem Poll timer
*
* Disc driver type table.
* Indexed by drive number
*
DTYPTAB FCB DTYPROM Drive 0 (ROM Disk)
FCB DTYPRAM Drive 1 (RAM Disk)
FCB DTYPFLS Drive 2 (FLASH Disk)
FCB DTYPNET Drive 3 (NETPC Disk)
*
* RAM Disk offset
* Indexed by drive type
*
DOFFTAB FCB $10 ROM Disk $10000
FCB $40 RAM DISK $40000
FCB $FF Flash Disk
FCB $FF NETPC Disk
*
REAVEC RMB 2 Disc driver jump table.
WRIVEC RMB 2
VERVEC RMB 2
RSTVEC RMB 2
DRVVEC RMB 2
CHKVEC RMB 2
QUIVEC RMB 2
INIVEC RMB 2
WARVEC RMB 2
SEEVEC RMB 2
*
* SECTOR BUFFER
*
BUFFER RMB 256
SYNCREG RMB 4 Prom input register
*
****************************************
*
* START OF EXTENSION COMMANDS
*
****************************************
*
ORG MONEXT
FDB NEXTEXT Jump to next extended command
*
*
*****************************************
* Disk drivers *
* ------------ *
* The system dependant code for the *
* disc drivers fits here. Two tables *
* must be included. These are DTYPTAB a *
* four byte table that defines which of *
* the (up to four) following sets of *
* jump tables to use, and TABSRT the *
* jump tables themselves. For a full *
* description of the floppy drivers see *
* section 4 (pp9-14) of the general *
* Flex adaptation guide. *
*****************************************
*
* Mass storage drivers for embedded applications.
*
* Jump tables.
TABSRT FDB EREAD Drive type 0 (ROM disk).
FDB EWRITE
FDB ECHECK
FDB ECHECK
FDB ECHECK
FDB ECHECK
FDB ECHECK
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
*
FDB EREAD Drive type 1 (RAM disk).
FDB EWRITE
FDB ECHECK
FDB ECHECK
FDB ECHECK
FDB ECHECK
FDB ECHECK
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
*
FDB DDUMMY Drive type 2 (External Flash disk).
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
*
FDB NREAD Drive type 3 (NetPC drive via serial port).
FDB NWRITE
FDB NVERIFY
FDB NCHECK
FDB NCHECK
FDB NCHECK
FDB NCHECK
FDB DDUMMY
FDB DDUMMY
FDB DDUMMY
*
*
* Dummy routine (no errors).
DDUMMY CLRB
TSTB Set (z)=1
ANDCC #$FF-CFLAG Set (c)=0
RTS
* *
**************************
* Main Flex entry points *
*************************
*
* Read sector routine.
* Entry: (X) = address where sector is to be placed.
* (A) = Track number.
* (B) = Sector number.
* Exit: (B) = Error code (z)=1 if no error.
READSC JMP [REAVEC]
*
* Write track routine.
* Entry: (X) = Address of area of memory from which the data will be taken.
* (A) = Track number.
* (B) = Sector number.
* Exit: (B) = Error condition, (Z)=1 no an error.
WRITSC JMP [WRIVEC]
*
* Verify sector routine.
* Entry: no parameters.
* Exit: (B) = Error condition (Z)=1 if no error.
BUSY JMP [VERVEC]
*
* Restore drive to track 00.
* Entry: (X) = FCB address (3,X contains drive number).
* Exit: (B) = Error condition, (Z)=1 if no error.
RESTR1 BSR DRVSEL Select drive first.
BEQ RST1
RTS
RST1 JMP [RSTVEC]
*
* Select current drive.
* Entry: (X) = FCB address (3,X contains drive number).
* Exit: (B) = Error condition, (Z)=0 and (c)=1 if error.
* (B) = $0F if non existant drive.
DRVSEL PSHS X,Y
LDB 3,X Get driver type.
STB DRVNUM
LDX #DTYPTAB
LDA B,X
CMPA #$FF Is the drive nonexistant?
BNE DRIVE1
PULS X,Y
LDB #$0F
TSTB
ORCC #$01
RTS
*
DRIVE1 LDB #20 Get correct table start address.
MUL
LDX #TABSRT
LEAX D,X
LDY #REAVEC Copy table into ram.
LDB #20
DRIVE2 LDA 0,X+
STA 0,Y+
DECB
BNE DRIVE2
PULS X,Y
JMP [DRVVEC]
*
* Check for drive ready.
* Entry: (X) = FCB address (3,X contains drive number)>
* Exit: (B) = Error condition, (Z)=0 AND (C)=1 if drive is not ready.
CHKRDY JMP [CHKVEC]
*
* Quick drive ready check.
* Entry: (X) = FCB address (3,X contains drive number).
* Exit: (B) = Error condition, (Z)=0 AND (c)=1 if drive not ready.
CHKQIK JMP [QUIVEC]
*
* Init (cold start).
* Entry: no parameters.
* Exit: no change.
DINIT CLRA
DINIT1 STA DRVNUM Init each valid drive in turn.
LDX #DRVNUM-3
BSR DRVSEL
BCS DINIT2
JSR [INIVEC]
DINIT2 LDA DRVNUM
INCA
CMPA #4
BNE DINIT1
RTS
*
* Warm start.
* Entry: no parameters.
* Exit: no change.
DWARM JMP [WARVEC]
*
* Seek track.
* Entry: (A) = Track number.
* (B) = Sector number.
* Exit: (B) = Error condition, (Z)=1 if no error.
SEEKTS JMP [SEEVEC]
*
*
*****************************************************
* ROMdisk drivers *
* --------------- *
* Drivers to support a ROMdisk in the external RAM *
* of the SYS09. The ROMdisk base address is $10000 *
*****************************************************
* Dummy return for ROM disk (write protected!)
*
* MAP RAM DISK INTO MEMORY SPACE
*
MAPIN TFR CC,A ; Save state of interrupt masks
STA CCSAVE
ORCC #FFLAG+IFLAG ; Mask interrupts while IO mapped out
LDU #DTYPTAB ; Point to Drive Type table
LDB DRVNUM ; Get working drive number
LDB B,U
LDU #DOFFTAB
LDA TRACK
ADDA B,U ; Add Base offset into RAM
ANDA #$F0 ; Mask MSN
STA ,-S ; Save A on stack
*
LDA SECTOR
SUBA #1 ; Sectors 1 to 14 => 0 to 13
EORA #$0F ; Complement LSNybble
ANDA #$0F
*
ADDA ,S+ ; Add sector to LSN of Track and pop
STA DATREG+MAPPAG
*
LDA TRACK ; LSN of Track indexes into 4K page
ANDA #$0F
ADDA #MAPPAG*16
CLRB
TFR D,U
RTS
*
* MAP RAM DISK OUT OF MEMORY
*
MAPOUT LDA #MAPPAG ; Point to the Flex page
EORA #$0F ; Complement LSNybble
STA DATREG+MAPPAG ; map in Flex page
LDA CCSAVE ; restore interrupt masks
TFR A,CC
RTS
*
* Seek track and sector
* A holds track number (0-32)
* B holds sector number (1-14)
*
ESEEK STA TRACK
STB SECTOR
ANDCC #$FE ; CLEAR CARRY
ORCC #$04 ; SET Z
RTS
*
* MARK DISK READ ONLY
*
EDUMMY LDB #$40
TSTB
ORCC #$01
RTS
*
EREAD PSHS X,Y,U push sequentialy to preserve order on stack
LBSR ESEEK
LBSR MAPIN build external ram address
*
LDY #BUFFER
CLRB
ERLOOP1 LDA 0,U+ move 256 bytes to buffer from external RAM
STA 0,Y+
DECB
BNE ERLOOP1
*
LBSR MAPOUT
*
LDY #BUFFER
CLRB
ERLOOP2 LDA 0,Y+ move 256 bytes from buffer to Flex RAM
STA 0,X+
DECB
BNE ERLOOP2
*
CLRB
PULS X,Y,U,PC restore all registers
*
* check for marker bytes $AA55 in first bytes of first track/sector
*
*ECHECK CLRA
* LDB #1
* LDX #BUFFER
* BSR EREAD
* LDD BUFFER
* CMPD #$AA55
* BNE EERR
* LBRA DDUMMY
*EERR LDB #$80 not ready bit set
* TSTB
* ORCC #$01
* RTS
ECHECK CLRB
RTS
*
* Write Sector
*
EWRITE PSHS X,Y,U
LBSR ESEEK
LDU #DTYPTAB ; Point to Drive Type table
LDB DRVNUM ; Get working drive number
LDB B,U ; Fetch Drive type
CMPB #DTYPRAM ; Is it a RAM Disk ?
BEQ EWOK ; Yep, can write to it
CMPB #DTYPROM ; Allow writes to ROM Disk too
BEQ EWOK
LBRA EDUMMY ; Nope report read only
*
EWOK LDY #BUFFER
CLRB
EWLOOP1 LDA 0,X+ move 256 bytes to buffer from Flex RAM
STA 0,Y+
DECB
BNE EWLOOP1
*
LBSR MAPIN
*
LDY #BUFFER
CLRB
EWLOOP2 LDA 0,Y+ move 256 bytes from buffer to external RAM
STA 0,U+
DECB
BNE EWLOOP2
*
LBSR MAPOUT
*
CLRB
PULS X,Y,U,PC
*
*
*****************************************************
* FlexNet drivers *
* --------------- *
* Drivers to support a remote connection via the *
* serial port using the FlexNet protocol as defined *
* in FLEXNet_421B *
*****************************************************
*
*
* read sector from remote drive
*
NREAD PSHS B
PSHS A
CLR CHKSUM clear checksum
CLR CHKSUM+1
*
LDA #'s Send read sector command
JSR SCHAR
BCC NRD_DNR if timeout, then flag drive not ready
*
LDA DRVNUM send drive
JSR SCHAR
BCC NRD_DNR
*
PULS A send track
JSR SCHAR
BCC NRD_DNR
*
PULS A send sector
JSR SCHAR
BCC NRD_DNR
*
* transfer 256 bytes
CLRB
NREAD1 JSR RCHAR read byte
BCC NRD_DNR if timeout, then flag drive not ready
STA 0,X+
ADDA CHKSUM+1 update checksum
STA CHKSUM+1
BCC NREAD2
INC CHKSUM
NREAD2 DECB
BNE NREAD1
*
* compare checksums
JSR RCHAR get checksum msb
BCC NRD_DNR
PSHS A
JSR RCHAR get checksum lsb
BCC NRD_DNR
TFR A,B
PULS A
CMPD CHKSUM compare checksums
BNE NRD_ERR if checksum error, then flag crc read error
*
LDA #ACK no checksum error, send ACK char
JSR SCHAR
BCC NRD_DNR
CLRB all OK, flag no error
BRA NRD_END
*
NRD_DNR LDB #16 flag drive not ready
BRA NRD_END
*
NRD_ERR LDA #NAK send NAK
JSR SCHAR
BCC NRD_DNR
LDB #09 flag crc read error
*
NRD_END STB CHKSUM used by VERIFY
TSTB
RTS
*
*
* write sector to remote drive
*
NWRITE PSHS B
PSHS A
CLR CHKSUM clear checksum
CLR CHKSUM+1
*
LDA #'r Send write sector command
JSR SCHAR
BCC NRD_DNR if timeout, then flag drive not ready
*
LDA DRVNUM send drive
JSR SCHAR
BCC NRD_DNR
*
PULS A send track
JSR SCHAR
BCC NRD_DNR
*
PULS A send sector
JSR SCHAR
BCC NRD_DNR
*
* transfer 256 bytes
CLRB
NWRITE1 LDA 0,X+
JSR SCHAR write byte
BCC NRD_DNR if timeout, then flag drive not ready
ADDA CHKSUM+1 update checksum
STA CHKSUM+1
BCC NWRITE2
INC CHKSUM
NWRITE2 DECB
BNE NWRITE1
*
* compare checksums
LDA CHKSUM
JSR SCHAR send checksum msb
BCC NRD_DNR
LDA CHKSUM+1
JSR SCHAR send checksum lsb
BCC NRD_DNR
*
JSR RCHAR get checksum response
BCC NRD_DNR
CMPA #ACK
BNE NWR_ERR if checksum error, then flag write error
*
CLRB all OK, flag no error
BRA NWR_END
*
NWR_ERR LDB #10 flag write error
*
NWR_END STB CHKSUM used by VERIFY
TSTB
RTS
*
*
* verify last sector written to remote drive
*
NVERIFY LDB CHKSUM test last checksum
TSTB
RTS
*
*
* quck check and check drive ready
*
NCHECK LDA #'Q quick check command
JSR SCHAR
BCC NCK_ERR if timeout, then flag drive not ready
 
JSR RCHAR get response from host
BCC NCK_ERR
CMPA #ACK
BNE NCK_ERR if NAK, then flag drive not ready
 
CLRB all OK, flag drive ready
BRA NCK_END
*
NCK_ERR LDB #16 report drive not ready
ORCC #$01 check needs carry set as well
*
NCK_END TSTB
RTS
*
*
* recieve char from remote drive.
* timeout if no response for approx 1s.
* Entry: no parameters
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
*
RCHAR PSHS X,Y
*
LDX #1000 1000x inner loop
RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
RCHAR2 LDA ACIAC1 test for recieved char
ASRA
BCS RCHAR3 get character
LEAY -1,Y else, continue to count delay
BNE RCHAR2
LEAX -1,X
BNE RCHAR1
PULS X,Y,PC return with error if timed out
*
RCHAR3 LDA ACIAD1 return data (carry bit still set)
PULS X,Y,PC
*
*
* transmit char to remote drive.
* timeout if no response for approx 1s. (allows for use of hardware flow control)
* Entry: (A) = char to transmit
* Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
*
SCHAR PSHS X,Y
PSHS A
*
LDX #1000 1000x inner loop
SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
SCHAR2 LDA ACIAC1 test for space in transmit FIFO
ASRA
ASRA
BCS SCHAR3 send character
LEAY -1,Y else, continue to count delay
BNE SCHAR2
LEAX -1,X
BNE SCHAR1
PULS A
PULS X,Y,PC return with error if timed out
*
SCHAR3 PULS A
STA ACIAD1 send data (carry bit still set)
PULS X,Y,PC
*
** 'UF' Format RAMdisc to FLEX standard.
*
DISFOS FCB $0A,$0D
FCC 'Formating RAMdisk... '
FCB 4
MESS6 FCB $0A,$0D,4
FCC 'Ramdisk not allocated! '
FCB 4
*
UFSUB LDX #DISFOS
JSR PDATA1
LDX #DTYPTAB search for allocated ramdisk
CLRB
FMT9 LDA B,X
CMPA #DTYPRAM driver type 1 is ramdisk
BEQ FFOUND
INCB
CMPB #4 end of table? then not allocated.
BNE FMT9
LDX #MESS6
JSR PDATA1
RTS
*
FFOUND STB DRVNUM
LDX #DRVNUM-3
JSR DRVSEL
*
* set up free chain
*
LDX #BUFFER clear out buffer
CLRA
CLRB
DFL1 STA 0,X+
DECB
BNE DFL1
*
CLR TRACK
LDA #1
STA SECTOR
DFL2 LDX #BUFFER
LDA TRACK
STA 0,X
LDA SECTOR
INCA
CMPA #RMAXSEC+1 last sector on track?
BNE DFL3
INC 0,X
LDA #1
DFL3 STA 1,X
LDA TRACK
LDB SECTOR
JSR WRITSC
INC SECTOR
LDA SECTOR
CMPA #RMAXSEC+1
BNE DFL2
LDA #1
STA SECTOR
INC TRACK
LDA TRACK
CMPA #RMAXTRK
BNE DFL2
* break free chain at last track/sector
LDX #BUFFER
LDA #RMAXTRK-1
LDB #RMAXSEC
JSR READSC
LDX #BUFFER
CLR 0,X
CLR 1,X
LDA #RMAXTRK-1
LDB #RMAXSEC
JSR WRITSC
* set up sector structure, SIR, directory etc
LDX #BUFFER
CLRA
LDB #RMAXSEC
JSR READSC
LDX #BUFFER
CLR 0,X break end of directory chain
CLR 1,X
CLRA
LDB #RMAXSEC
JSR WRITSC
*
LDX #BUFFER
CLRA
LDB #3 set up SIR
JSR READSC
LDX #BUFFER
CLR 0,X break forward link
CLR 1,X
LDD #$5241 set volume name (RAMDISK )
STD 16,X
LDD #$4D44
STD 18,X
LDD #$4953
STD 20,X
LDD #$4B20
STD 22,X
LDD #1 volume number
STD 27,X
LDD #$0101 first trk/sec 01-01
STD 29,X
LDA #RMAXTRK-1
LDB #RMAXSEC
STD 31,X
STD 38,X
LDD #RTOTSEC total DATA sectors (2912-14)
STD 33,X
*
LDA #01 month set default creation date (SYS09's birthday!)
STA 35,X
LDA #07 day
STA 36,X
LDA #07 year
STA 37,X
*
RF3 CLRA
LDB #3
JSR WRITSC
*
LDX #BUFFER
CLRA
LDB #1
JSR READSC
LDX #BUFFER
LDA #$AA set the init flag
STA 0,X
LDA #$55
STA 1,X
CLRA
LDB #1
JMP WRITSC
*
********************************
* System specific Boot *
* command goes here. *
********************************
*
* Boot FLEX from the FPGA's internal pre-loaded scratch RAM
*
UBMESS FCB $08, $08
FCC 'Booting internal FLEX....'
FCB $0D,$0A,$04
*
UBSUB LDX #UBMESS
JSR PDATA1
*
LDX #$D3E5
LDY #CONTAB Overlay console driver table
UB1 LDD 0,Y++
STD 0,X++
CMPX #$D3FD
BNE UB1
*
LDX #$DE00 Overlay disk driver table
LDY #DISTAB
UB2 LDD 0,Y++
STD 0,X++
CMPX #$DE1E
BNE UB2
*
UBEND JMP $CD00
*
* FLEX console jump table.
CONTAB FDB INPNE INPUT NO ECHO
FDB DUMMY INTERRUPT HANDLER
FDB MONRAM+$02 SWI VECTOR
FDB MONRAM+$08 IRQ VECTOR
FDB DUMMY TIMER OFF
FDB DUMMY TIMER ON
FDB DUMMY TIMER INITIALIZATION
FDB CONTRL MONITOR
FDB DUMMY TERMINAL INITIALIZATION
FDB STATUS INPUT CHECK
FDB OUTP TERMINAL OUTPUT
FDB INPE TERMINAL INPUT WITH ECHO
*
* FLEX disk jump table.
DISTAB JMP READSC
JMP WRITSC
JMP BUSY
JMP RESTR1
JMP DRVSEL
JMP CHKRDY
JMP CHKQIK
JMP DINIT
JMP DWARM
JMP SEEKTS
*
* Monitor jumps
*
PDATA1 JMP [PDATAV]
OUTP JMP [OUTCHV]
INPE JMP [INCHEV]
INPNE JMP [INCHV]
STATUS JMP [INCHKV]
CONTRL JMP [MONITV]
DUMMY RTS
*
** 'UL' LOAD ROM DISK VIA SERIAL PORT
*
ULMES FCC 'Serial ROM Disk upload ...'
FCB $0D,$0A,$04
ULMES1 FCC 'ROM Disk Loaded'
FCB $0D,$0A,$04
*
ULSUB LDX #ULMES
JSR PDATA1
*
LDA #$00
STA DRVNUM
CLRA TRACK 0
LDB #$01 SECTOR 1
ULLOOP0 STA TRACK
STB SECTOR`
LBSR MAPIN
*
CLRB xfer 256 bytes at a time.
ULLOOP1 JSR LRBYTE transfer should be hex bytes
STA ,U+
DECB
BNE ULLOOP1
*
LBSR MAPOUT
*
LDA TRACK
LDB SECTOR
INCB
CMPB #EMAXSEC+1
BNE ULLOOP0
LDB #1
INCA
CMPA #EMAXTRK
BNE ULLOOP0
*
ULEXIT LDX #ULMES1
JMP PDATA1
*
* Read a byte from the serial port
*
LRBYTE PSHS B
BSR LRHEX Get hex digit.
ASLA
ASLA Shift to msb.
ASLA
ASLA
TFR A,B Save in B.
BSR LRHEX Get next digit.
PSHS B
ADDA 0,S+ Add together bytes.
PULS B,PC
*
LRHEX JSR INTER
BVS LRHEX
SUBA #$30 Remove ascii bias.
BMI LRHEX
CMPA #$09 Number?
BLE LRHEX1 Yes.
CMPA #$11 Keep testing.
BMI LRHEX
CMPA #$16
BGT LRHEX
SUBA #$07
LRHEX1 RTS
*
* ACIA INPUT TEST
*
INTEST LDA ACIAC1
BITA #$01
RTS
*
* RESET ACIA
*
ACIRST LDA #$03 master reset
STA ACIAC1
LDA #$11
STA ACIAC1
RTS
*
* ACIA INPUT
*
INTER LDA #16
STA DELCNT+0
CLR DELCNT+1
CLR DELCNT+2
INTER0 LDA ACIAC1
BITA #$01
BNE INTER1
BITA #$78
BEQ INTER2
BSR ACIRST
BRA INTER
*
INTER1 LDA ACIAD1
ANDCC #VFLAG
RTS
*
INTER2 DEC DELCNT+2
BNE INTER0
DEC DELCNT+1
BNE INTER0
DEC DELCNT+0
BNE INTER0
CLRA
ORCC #VFLAG
RTS
*
* ACIA OUTPUT
*
OUTTER PSHS A
*
OUTTE1 LDA ACIAC1
BITA #$02
BNE OUTTE2
BITA #$78
BEQ OUTTE1
BSR ACIRST
BRA OUTTE1
*
OUTTE2 PULS A
STA ACIAD1
RTS
*
** 'UX' Xmodem ROM Disk upload
*
UXMES FCB $0D,$0A
FCC 'Xmodem ROM Disk Upload'
FCB 4
UXMES1 FCB $0D,$0A
FCC 'Upload Complete'
FCB 4
UXMES2 FCB $0D,$0A
FCC 'Upload Error'
FCB 4
*
UXSUB LDX #UXMES
LBSR PDATA1
*
LDA #1
STA BLKNUM
LDX #XSTSTR
STX XSTATE
*
LDA #$00
STA DRVNUM
CLRA TRACK 0
LDB #$01 SECTOR 1
UXLOOP0 STA TRACK
STB SECTOR
LBSR MAPIN
*
CLRB xfer 256 bytes at a time.
UXLOOP1 LBSR XBYTE transfer should be hex bytes
BCS UXERR
STA ,U+
DECB
BNE UXLOOP1
*
LBSR MAPOUT
*
LDA TRACK
LDB SECTOR
INCB
CMPB #EMAXSEC+1
BNE UXLOOP0
LDB #1
INCA
CMPA #EMAXTRK
BNE UXLOOP0
*
UXEXIT LDX #UXMES1
JMP PDATA1
*
UXERR LBSR MAPOUT
LDX #UXMES2
LBRA PDATA1
*
* Get a Byte using XModem protocol
* Carry clear => no errors
* Carry set => errors
*
XBYTE PSHS X
LDX XSTATE
*
XBYTE0 LBSR INTER
BVC XBYTE1
LDA #NAK
LBSR OUTTER
LDX #XSTSTR
BRA XBYTE0
*
XBYTE1 JSR ,X
BNE XBYTE0
STX XSTATE
PULS X,PC
*
* START - LOOK FOR SOH (START OF HEADER) = $01
*
XSTSTR CMPA #SOH
BNE XSTSTR1
LDX #XSTBLK
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
RTS
*
XSTSTR1 CMPA #EOT
BNE XSTSTR2
LDA #ACK
LBSR OUTTER
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
RTS
*
XSTSTR2 CMPA #CAN
BNE XSTSTR3
ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
RTS
*
XSTSTR3 ANDCC #$FF-CFLAG-ZFLAG
RTS
*
* Got SOH
* Now get block number
*
XSTBLK CMPA BLKNUM
BNE XSTBLKE
LDX #XSTCOM
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
RTS
*
* Error in block number
*
XSTBLKE LDA #NAK
LBSR OUTTER
LDX #XSTSTR
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
RTS
*
* Get complement of block number
*
XSTCOM COMA
CMPA BLKNUM
BNE XSTBLKE
CLR CHKSUM
LDA #128
STA BYTCNT
LDX #XSTDAT
ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
RTS
*
* Get data bytes
*
XSTDAT PSHS A
ADDA CHKSUM
STA CHKSUM
PULS A
DEC BYTCNT
BNE XSTDAT1
LDX #XSTCHK
XSTDAT1 ANDCC #$FF-CFLAG No abort
ORCC #ZFLAG Valid data (exit)
RTS
*
* Byte count reached zero
* Check checksum byte
*
XSTCHK CMPA CHKSUM
BNE XSTCHK1 retry if wrong checksum
*
* Checksum OK ...
* increment block number
* and send ACK
*
INC BLKNUM
LDA #ACK
BRA XSTCHK2
*
* Checksum Error detected ...
* Reset Sector counter in ACCB to last 128 byte boundary
* and send NAK
*
XSTCHK1 PSHS B
TFR U,D
DECB
ANDB #128
TFR D,U
PULS B
LDA #NAK
XSTCHK2 LBSR OUTTER
LDX #XSTSTR
ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
RTS
*
** 'UP' Load ROMdisk via config PROM.
*
UPMES FCB $08,$08
FCC 'Load ROM disk from config PROM.'
FCB 4
UPMES1 FCC 'Found SYNC, loading data...'
FCB $0A,$0D,4
UPMES2 FCC 'ROM Disk Loaded.'
FCB $0A,$0D,4
UPMES3 FCC 'ROM Disk Not Found.'
FCB $0A,$0D,4
*
UPSUB LDX #UPMES
JSR PDATA1
*
BSR UPRESET
LDY #$0020 Set up count for 2 MBit
LDX #$0000
UPSUB1 BSR UPBIT Shift in bit
BSR UPSYNC Test for Sync pattern`
BEQ UPSUB4 Skip if found
LEAX -1,X Count Down inner loop
CMPX #$0000
BNE UPSUB1 Branch if inner loop not complete
LEAY -1,X Count down outer loop
CMPY #$0000
BNE UPSUB1 Branch if outer loop not complete
*
LDX #UPMES3 2MBits scanned, no synch, report error
JMP PDATA1
*
UPSUB4 LDX #UPMES1 Sync found, now load disk
JSR PDATA1
*
CLRA
STA DRVNUM select Drive 0
LDB #$01
UPSUB2 STA TRACK track 0
STB SECTOR sector 1
*
LBSR MAPIN map in buffer
CLRB 256 byte sector
UPSUB3 BSR UPBYTE read byte from prom
STA ,U+ Store in buffer
DECB
BNE UPSUB3 Loop until sector read`
LBSR MAPOUT map out buffer
*
LDA TRACK Advance sector
LDB SECTOR
INCB
CMPB #EMAXSEC+1 Wrap on max sector count
BNE UPSUB2
LDB #1
INCA Advance track
CMPA #EMAXTRK
BNE UPSUB2
*
UPEXIT LDX #UPMES2 Load complete, report message
JMP PDATA1
*
* Reset Serial PROM
*
UPRESET LDA #PRSTHI Strobe the reset line
STA PROMREG
LDA #PRSTLO
STA PROMREG
LDX #$0000 Delay a while`
UPRST1 LEAX -1,X
CMPX #$0000
BNE UPRST1
STX SYNCREG+0 Clear Sync Shift Register
STX SYNCREG+2
RTS
*
* Input 1 Bit From PROM
*
UPBIT LDA #PCLKHI
STA PROMREG
LDA #PCLKLO
STA PROMREG
LDA PROMREG
LSRA
ASL SYNCREG+3
RTS
*
* Test for 32 bit Sync Word
*
UPSYNC ROL SYNCREG+2
ROL SYNCREG+1
ROL SYNCREG+0
LDD #SYNCLO
CMPD SYNCREG+2
BNE UPSYNCX
LDD #SYNCHI
CMPD SYNCREG+0
UPSYNCX RTS
*
* Input 1 Byte From PROM
*
UPBYTE PSHS B
LDB #8
UPBYTE1 BSR UPBIT
DECB
BNE UPBYTE1
LDA SYNCREG+3
PULS B,PC
*
***** NEXTCMD *****
*
NEXTEXT LBSR INPE GET ONE CHAR. FROM TERMINAL
ANDA #$7F STRIP PARITY FROM CHAR.
TFR A,B
LDA #$20
LBSR OUTP PRNT SPACE
CMPB #$60
BLE NXTEX0
SUBB #$20
*
***** DO TABLE LOOKUP *****
* FOR COMMAND FUNCTIONS
*
NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE
NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
BEQ JMPEXT BRANCH IF MATCH FOUND
LEAX 2,X POINT TO NEXT ENTRY IN TABLE
CMPX #EXTEND REACHED END OF TABLE YET ?
BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY
LDX #MSGWHAT POINT TO MSG "WHAT?"
LBRA PDATA1 PRINT MSG AND RETURN
JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE
*
* EXTENDED COMMAND JUMP TABLE
*
EXTTAB EQU *
FCC 'B' BOOT FLEX
FDB UBSUB
FCC 'L' LOAD ROM DISK OVER SERIAL PORT
FDB ULSUB
FCC 'F' FORMAT RAM DISK
FDB UFSUB
FCC 'P' LOAD ROM DISK FROM PROM
FDB UPSUB
FCC 'X' XMODEM ROM DISK UPLOAD
FDB UXSUB
*
EXTEND EQU *
*
MSGWHAT FCC "WHAT ?"
FCB $0A,$0D,$04
END
/Flex9/f9-monex.asm
2,9 → 2,11
** FLEX 9 DISK DRIVERS
*
* FOR SYS09BUG ON THE DIGILENT SPARTAN 3 STARTER BOARD
* AND THE TERASIC CYCLONE 2 DE1 BOARD
* WITH I/O MAPPED AT $XE000
* AND ROM MAPPED AT $XF000
* THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
* THE TERASIC CYCLONE 2 DE1 BOARD HAS 512KB OF SRAM
* THE FIRST 64K IS USED BY FLEX,
* THE SECOND 128K IS USED AS A ROM DISK
* THE REMAINING RAM IS USED FOR A RAM DISK
43,7 → 45,8
ETOTSEC EQU EMAXTRK*EMAXSEC-EMAXSEC
*
RMAXSEC EQU 14 RAM DISK
RMAXTRK EQU 192 12 * 16 * 14 * 256 = 688,128 Bytes
* RMAXTRK EQU 192 12 * 16 * 256 = 688,128 Bytes (Spartan 3 starter with 1MB)
RMAXTRK EQU 64 4 * 16 * 14 * 256 = 229,376 Bytes (Cyclone 2 DE1 with 512KB)
RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
*
* DRIVE TYPES
/Flex9/flex9ram.lst
0,0 → 1,4009
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 NAM FLEX SOURCE
0000 INCLUDE "f9-moneq.txt"
 
f9-moneq.txt page 2
0002 *
0003 ***************************************************
0004 * MEMORY MAP EQUATES *
0005 ***************************************************
0006 E000 MONIO EQU $E000 I/O SPACE
0007 DFC0 MONRAM EQU $DFC0 STACK SPACE
0008 F800 MONROM EQU $F800 START OF ROM
0009 F000 MONEXT EQU $F000 EXTENDED COMMANDS
0010 *MONEXT EQU $1000 EXTENDED COMMANDS
0011 *
0012 ***************************************************
0013 * SYS09BUG VARIABLE SPACE
0014 ***************************************************
0015 *
0016 DFC0 STACK EQU MONRAM+0 TOP OF INTERNAL STACK / USER VECTOR
0017 DFC2 SWI3 EQU MONRAM+2 SOFTWARE INTERRUPT VECTOR #3
0018 DFC4 SWI2 EQU MONRAM+4 SOFTWARE INTERRUPT VECTOR #2
0019 DFC6 FIRQ EQU MONRAM+6 FAST INTERRUPT VECTOR
0020 DFC8 IRQ EQU MONRAM+8 INTERRUPT VECTOR
0021 DFCA SWI EQU MONRAM+10 SOFTWARE INTERRUPT VECTOR
0022 DFCC SVCVO EQU MONRAM+12 SUPERVISOR CALL VECTOR ORGIN
0023 DFCE SVCVL EQU MONRAM+14 SUPERVISOR CALL VECTOR LIMIT
0024 DFD0 LRARAM EQU MONRAM+16 LRA ADDRESSES
0025 DFE0 CPORT EQU MONRAM+32 RE-VECTORABLE CONTROL PORT
0026 DFE2 ECHO EQU MONRAM+34 ECHO FLAG
0027 DFE3 BPTBL EQU MONRAM+35 BREAKPOINT TABLE BASE ADDR
0028 **************************************************
0029 * VDU BYTES *
0030 **************************************************
0031 *
0032 **** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
0033 DFFB COLADX EQU MONRAM+59 CURSOR COLUMN
0034 DFFC ROWADX EQU MONRAM+60 CURSOR ROW
0035 **************************************************
0036 *
0037 DFFD NEWROW EQU MONRAM+61 NEW ROW TEMP FOR ESCAPE
0038 DFFE ESCFLG EQU MONRAM+62 ESCAPE SEQUENCE ACTIVE
0039 *
0040 ***************************************************
0041 * SERIAL PORT *
0042 ***************************************************
0043 *
0044 E000 ACIAS EQU MONIO+$00 CONTROL PORT
0045 *
0046 ***************************************************
0047 * PS/2 KEYBOARD PORT *
0048 ***************************************************
0049 *
0050 E020 PS2KBD EQU MONIO+$20 PS/2 KEYBOARD PORT
0051 *
0052 ***************************************************
0053 * ADM3A DISPLAY DRIVER VARIABLES *
0054 ***************************************************
0055 *
0056 ** VIDEO DISPLAY DEFINITIONS
0057 *
0058 E030 VDU EQU MONIO+$30
0059 0000 VDUCHR EQU 0 CHARACTER REGISTER
0060 0001 VDUATT EQU 1 ATTRIBUTE REGISTER
0061 0002 VDUCOL EQU 2 CURSOR COLUMN
0062 0003 VDUROW EQU 3 CURSOR ROW
0063 0004 VDUOFF EQU 4 ROW OFFSET
0064 *
0065 0050 LINLEN EQU 80 LENGTH OF A LINE
0066 0019 NUMLIN EQU 25 NUMBER OF LINES
0067 *
0068 ***************************************************
0069 * Serial PROM register
0070 ***************************************************
0071 *
0072 ** CONFIGURATION PROM DEFINITIONS
0073 *
0074 E0C0 PROMREG EQU MONIO+$C0
0075 0001 PCLKHI EQU $01 Toggle PROM Clock High
0076 0000 PCLKLO EQU $00 Toggle PROM Clock Low
0077 0002 PRSTHI EQU $02 Toggle PROM Reset High
0078 0000 PRSTLO EQU $00 Toggle PROM Reset Low
0079 AA55 SYNCHI EQU $AA55 Synch Pattern High Word
0080 FF00 SYNCLO EQU $FF00 Synch Pattern Low Word
0081 *
0082 *
0083 ***************************************************
0084 * Dynamic Address Translation Registers
0085 ***************************************************
0086 *
0087 ** DAT Table
0088 *
0089 FFF0 IC11 EQU $FFF0 DAT RAM CHIP
0090 *
0091 ***************************************************
0092 * START OF ROM *
0093 ***************************************************
0094 *
0095 F800 MONITV EQU MONROM+0 FDB MONITOR
0096 F802 NXTCMV EQU MONROM+2 FDB NEXTCMD
0097 F804 INCHV EQU MONROM+4 FDB INCH
0098 F806 INCHEV EQU MONROM+6 FDB INCHE
0099 F808 INCHKV EQU MONROM+8 FDB INCHEK
0100 F80A OUTCHV EQU MONROM+10 FDB OUTCH
0101 F80C PDATAV EQU MONROM+12 FDB PDATA
0102 F80E PCRLFV EQU MONROM+14 FDB PCRLF
0103 F810 PSTRGV EQU MONROM+16 FDB PSTRNG
0104 F812 LRAV EQU MONROM+18 FDB LRA
0002 END
0000 INCLUDE "f9-equ.txt"
0001 0000 Z0000 EQU $0000
0002 0005 Z0005 EQU $0005
0003 0044 Z0044 EQU $0044
0004 00A0 Z00A0 EQU $00A0
0005 C07F ZC07F EQU $C07F
0006 C080 LINBUF EQU $C080
0007 C0FF ZC0FF EQU $C0FF
0003 END
0000 INCLUDE "f9-spool.txt"
0001 *
0002 ** PRINTER SPOOLING
0003 *
0004 C700 ORG $C700
0005 C700 7E C7 21 PRSPL1 JMP ZC721
0006 C703 7E C7 03 PRSPL2 JMP *
0007 C706 7E C7 47 PRSPL3 JMP ZC747
0008 C709 7E C7 85 PRSPL4 JMP ZC785
0009 C70C 7E C7 95 PRSPL5 JMP ZC795
0010 C70F 7E C7 1F PRSPL6 JMP ZC71F
0011 *
0012 ** SPOOLER SCRATCH AREA
0013 *
0014 C712 0C 00 00 00 00 C8 ZC712 FCB $0C,$00,$00,$00,$00,$C8,$10
10
0015 C719 C8 10 ZC719 FCB $C8,$10
0016 C71B 00 QCNT FCB $00
0017 C71C 00 ZC71C FCB $00
0018 C71D 00 ZC71D FCB $00
0019 C71E 00 ZC71E FCB $00
0020 *
0021 C71F 3B ZC71F RTI
0022 C720 12 NOP
0023 *
0024 C721 1A 10 ZC721 ORCC #$10
0025 C723 BE CC 31 LDX ZCC31
0026 C726 10 EF 02 STS 2,X
0027 C729 7D CC 34 TST ZCC34
0028 C72C 26 11 BNE ZC73F
0029 C72E 8E CC FC LDX #ZCCFC
0030 C731 7C CC 34 INC ZCC34
0031 C734 6D 84 TST ,X
0032 C736 27 07 BEQ ZC73F
0033 C738 BF CC 31 ZC738 STX ZCC31
0034 C73B 10 EE 02 LDS $02,X
0035 C73E 3B RTI
0036 *
0037 C73F 8E CC F8 ZC73F LDX #ZCCF8
0038 C742 7F CC 34 CLR ZCC34
0039 C745 20 F1 BRA ZC738
0040 *
0041 C747 1A 10 ZC747 ORCC #$10
0042 C749 7D C7 1B TST QCNT
0043 C74C 27 29 BEQ ZC777
0044 C74E BE C7 19 LDX ZC719
0045 C751 A6 84 LDA ,X
0046 C753 34 02 PSHS A
0047 C755 EC 01 LDD $01,X
0048 C757 8E CA C0 LDX #ZCAC0
0049 C75A ED 88 40 STD $40,X
0050 C75D 35 02 PULS A
0051 C75F A7 03 STA $03,X
0052 C761 6F 84 CLR ,X
0053 C763 86 01 LDA #$01
0054 C765 A7 02 STA $02,X
0055 C767 6F 88 22 CLR $22,X
0056 C76A 6F 88 3B CLR $3B,X
0057 C76D 7D C7 1E ZC76D TST ZC71E
0058 C770 27 29 BEQ ZC79B
0059 C772 11 3F SWI3
0060 C774 12 NOP
0061 C775 20 F6 BRA ZC76D
0062 *
0063 C777 1C EF ZC777 ANDCC #$EF
0064 C779 AD 9F D3 ED ZC779 JSR [TOFVEC]
0065 C77D 7F CC FC CLR ZCCFC
0066 C780 11 3F SWI3
0067 C782 12 NOP
0068 C783 20 F4 BRA ZC779
0069 *
0070 C785 1A 10 ZC785 ORCC #$10
0071 C787 7D CC 30 TST ZCC30
0072 C78A 27 05 BEQ ZC791
0073 C78C 11 3F SWI3
0074 C78E 12 NOP
0075 C78F 20 F4 BRA ZC785
0076 *
0077 C791 7C CC 30 ZC791 INC ZCC30
0078 C794 39 RTS
0079 *
0080 C795 7F CC 30 ZC795 CLR ZCC30
0081 C798 1C EF ANDCC #$EF
0082 C79A 39 RTS
0083 *
0084 C79B 7D C7 1D ZC79B TST ZC71D
0085 C79E 26 27 BNE ZC7C7
0086 C7A0 8E CA C0 LDX #ZCAC0
0087 C7A3 BD D4 06 JSR FMS
0088 C7A6 26 1F BNE ZC7C7
0089 C7A8 7D C7 1C TST ZC71C
0090 C7AB 27 0F BEQ ZC7BC
0091 C7AD 7F C7 1C CLR ZC71C
0092 C7B0 81 0A CMPA #$0A
0093 C7B2 27 0F BEQ ZC7C3
0094 C7B4 34 02 PSHS A
0095 C7B6 86 0A LDA #$0A
0096 C7B8 8D 3C BSR ZC7F6
0097 C7BA 35 02 PULS A
0098 C7BC 81 0D ZC7BC CMPA #$0D
0099 C7BE 26 03 BNE ZC7C3
0100 C7C0 B7 C7 1C STA ZC71C
0101 C7C3 8D 31 ZC7C3 BSR ZC7F6
0102 C7C5 20 D4 BRA ZC79B
0103 *
0104 C7C7 86 0D ZC7C7 LDA #$0D
0105 C7C9 8D 2B BSR ZC7F6
0106 C7CB 86 0A LDA #$0A
0107 C7CD 8D 27 BSR ZC7F6
0108 C7CF B6 C7 12 LDA ZC712
0109 C7D2 8D 22 BSR ZC7F6
0110 C7D4 7F C7 1D CLR ZC71D
0111 C7D7 BE C7 19 LDX ZC719
0112 C7DA 6D 03 TST $03,X
0113 C7DC 27 05 BEQ ZC7E3
0114 C7DE 6A 03 DEC $03,X
0115 C7E0 7E C7 47 JMP ZC747
0116 *
0117 C7E3 30 04 ZC7E3 LEAX $04,X
0118 C7E5 8C C8 40 CMPX #FCB
0119 C7E8 26 03 BNE ZC7ED
0120 C7EA 8E C8 10 LDX #ZC810
0121 C7ED BF C7 19 ZC7ED STX ZC719
0122 C7F0 7A C7 1B DEC QCNT
0123 C7F3 7E C7 47 JMP ZC747
0124 *
0125 C7F6 BD CC D8 ZC7F6 JSR PCHK
0126 C7F9 2B 05 BMI ZC800
0127 C7FB 11 3F SWI3
0128 C7FD 12 NOP
0129 C7FE 20 F6 BRA ZC7F6
0130 *
0131 C800 7E CC E4 ZC800 JMP POUT
0132 C810 ZC810 EQU $C810
0133 C838 ZC838 EQU $C838
0004 END
0000 INCLUDE "f9-sfcb.txt"
0001 *
0002 ** SYSTEM FILE CONTROL BLOCK
0003 *
0004 C840 ORG $C840
0005 C840 FF FCB FCB $FF
0006 C841 00 FCB $00
0007 C842 00 FCB $00
0008 C843 00 FCB $00
0009 C844 53 54 41 52 54 55 ZC844 FCC "STARTUP"
50
0010 C84B 00 FCB $00
0011 C84C 54 58 54 FCC "TXT"
0012 C84F 00 FCB $00
0005 END
0000 INCLUDE "f9-init.txt"
0001 *
0002 ** FLEX INITIATION
0003 *
0004 CA00 ORG $CA00
0005 CA00 20 06 ZCA00 BRA ZCA08
0006 CA02 BD CA AC ZCA02 JSR >ZCAAC
0007 CA05 39 RTS
0008 CA06 C0 A0 ZCA06 SUBB #$A0
0009 CA08 86 39 ZCA08 LDA #$39
0010 CA0A B7 D3 FD STA >ZD3FD
0011 CA0D BE CC 2B LDX >MEMEND
0012 CA10 30 89 00 A1 LEAX $00A1,X
0013 CA14 BF CA 06 STX >ZCA06
0014 CA17 AD 9F D3 F1 JSR [TINVEC]
0015 CA1B BE D3 FB LDX >INVEC
0016 CA1E BF CD 0A STX >INCH+1
0017 CA21 BF CD 0D STX >INCH2+1
0018 CA24 BE D3 F9 LDX >OUTVEC
0019 CA27 BF CD 10 STX >OUTCH+1
0020 CA2A BF CD 13 STX >OUTCH2+1
0021 CA2D BE D3 F7 LDX >STAVEC
0022 CA30 BF CD 4F STX >ZCD4E+1
0023 CA33 8E 00 A0 LDX #Z00A0
0024 CA36 C6 B9 LDB #$B9
0025 CA38 A6 84 ZCA38 LDA ,X
0026 CA3A E7 84 STB ,X
0027 CA3C 12 NOP
0028 CA3D E1 84 CMPB ,X
0029 CA3F 26 0B BNE ZCA4C
0030 CA41 A7 84 STA ,X
0031 CA43 30 89 04 00 LEAX $0400,X
0032 CA47 BC CA 06 CMPX >ZCA06
0033 CA4A 26 EC BNE ZCA38
0034 CA4C 30 89 FF 5F ZCA4C LEAX $FF5F,X
0035 CA50 BF CC 2B STX >MEMEND
0036 CA53 8E CD 03 LDX #WARMS
0037 CA56 BF CC 16 STX >ESCVEC
0038 CA59 8E CA DC LDX #TTLSTR
0039 CA5C BD CE 81 JSR >PSTRG1
0040 CA5F BD CE B5 JSR >PCRLF1
0041 CA62 8D 9E BSR ZCA02
0042 CA64 BD CE B5 JSR >PCRLF1
0043 CA67 8E C8 40 LDX #FCB
0044 CA6A 86 01 LDA #$01
0045 CA6C A7 84 STA ,X
0046 CA6E BD D4 06 JSR >FMS
0047 CA71 27 08 BEQ ZCA7B
0048 CA73 A6 01 LDA $01,X
0049 CA75 BD D2 00 JSR >ZD200
0050 CA78 7E CD 67 JMP >WARM1
0051
0052 CA7B 8E C0 80 ZCA7B LDX #LINBUF
0053 CA7E BF CC 14 ZCA7E STX >LINPTR
0054 CA81 8E C8 40 LDX #FCB
0055 CA84 BD D4 06 JSR >FMS
0056 CA87 27 05 BEQ ZCA8E
0057 CA89 34 30 PSHS Y,X
0058 CA8B 7E D2 D7 JMP >ZD2D7
0059
0060 CA8E BE CC 14 ZCA8E LDX >LINPTR
0061 CA91 A7 80 STA ,X+
0062 CA93 81 0D CMPA #$0D
0063 CA95 26 E7 BNE ZCA7E
0064 CA97 8E C8 40 LDX #FCB
0065 CA9A BD D1 F4 JSR >ZD1F4
0066 CA9D 8E C0 80 LDX #LINBUF
0067 CAA0 BF CC 14 STX >LINPTR
0068 CAA3 8E CD 67 LDX #WARM1
0069 CAA6 BF CC 43 STX >ZCC43
0070 CAA9 7E D3 2E JMP >ZD32E
0071
0072 CAAC 8E CA EC ZCAAC LDX #DATSTR
0073 CAAF BD CE 81 JSR >PSTRG1
0074 CAB2 BD CE 2B JSR >INBUF1
0075 CAB5 8D 14 BSR ZCACB
0076 CAB7 25 F3 BCS ZCAAC
0077 CAB9 B7 CC 0E STA >MONTH
0078 CABC 8D 0D BSR ZCACB
0079 CABE 25 EC BCS ZCAAC
0080 CAC0 B7 CC 0F ZCAC0 STA >DAY
0081 CAC3 8D 06 BSR ZCACB
0082 CAC5 25 E5 BCS ZCAAC
0083 CAC7 B7 CC 10 STA >YEAR
0084 CACA 39 RTS
0085
0086 CACB BD D1 75 ZCACB JSR >INDEC1
0087 CACE 25 0B BCS ZCADB
0088 CAD0 B6 CC 1C LDA >LODOFF+1
0089 CAD3 5D TSTB
0090 CAD4 27 03 BEQ ZCAD9
0091 CAD6 1C FE ANDCC #$FE
0092 CAD8 39 RTS
0093
0094 CAD9 1A 01 ZCAD9 ORCC #$01
0095 CADB 39 ZCADB RTS
0096
0097 CADC 36 38 30 39 20 46 TTLSTR FCC "6809 FLEX V3.01"
4C 45 58 20 56 33
2E 30 31
0098 CAEB 04 FCB $04
0099 CAEC 44 41 54 45 20 28 DATSTR FCC "DATE (MM,DD,YY)? "
4D 4D 2C 44 44 2C
59 59 29 3F 20
0100 CAFD 04 FCB $04
0006 END
0000 INCLUDE "f9-var.txt"
0001 *
0002 ** TTYSET PARAMETERS
0003 *
0004 CC00 ORG $CC00
0005 CC00 08 BSPCHR FCB $08
0006 CC01 18 DELCHR FCB $18
0007 CC02 3A EOLCHR FCB $3A
0008 CC03 19 DEPCNT FCB 25
0009 CC04 00 WIDCNT FCB $00
0010 CC05 04 NULCNT FCB $04
0011 CC06 40 TABCHR FCB '@
0012 CC07 00 BSECHR FCB $00
0013 CC08 00 EJTCNT FCB $00
0014 CC09 FF PAUSE FCB $FF
0015 CC0A 1B ESCCHR FCB $1B
0016 CC0B 00 SYSDRV FCB 0
0017 CC0C 01 WRKDRV FCB 1
0018 CC0D 00 ZCC0D FCB $00
0019 CC0E DATERG EQU *
0020 CC0E 00 MONTH FCB $00
0021 CC0F 00 DAY FCB $00
0022 CC10 00 YEAR FCB $00
0023 CC11 00 LASTRM FCB $00
0024 CC12 00 00 UCTVEC FDB $0000
0025 CC14 00 00 LINPTR FDB $0000
0026 CC16 00 00 ESCVEC FDB $0000
0027 CC18 00 CURCHR FCB $00
0028 CC19 00 PRVCHR FCB $00
0029 CC1A 00 CURLIN FCB $00
0030 CC1B 00 00 LODOFF FDB $0000
0031 CC1D 00 TRNFLG FCB $00
0032 CC1E 00 00 TRNVEC FDB $0000
0033 CC20 00 ERRTYP FCB $00
0034 CC21 00 SIOFLG FCB $00
0035 CC22 00 OUTSWT FCB $00
0036 CC23 00 INPSWT FCB $00
0037 CC24 00 00 FOPADR FDB $0000
0038 CC26 00 00 FIPADR FDB $0000
0039 CC28 00 CMDFLG FCB $00
0040 CC29 00 CURCOL FCB $00
0041 CC2A 00 FCB $00
0042 CC2B BF FF MEMEND FDB $BFFF
0043 CC2D 00 00 ERRVEC FDB $0000
0044 CC2F 01 FIEFLG FCB $01
0045 CC30 00 ZCC30 FCB $00
0046 CC31 00 00 00 ZCC31 FCB $00,$00,$00
0047 CC34 00 00 00 00 00 00 ZCC34 FCB $00,$00,$00,$00,$00,$00,$00
00
0048 CC3D ZCC3D EQU $CC3D
0049 CC3F ZCC3F EQU $CC3F
0050 CC43 ZCC43 EQU $CC43
0051 CC45 ZCC45 EQU $CC45
0052 CC47 ZCC47 EQU $CC47
0053 CC49 ORG $CC49
0054 CC49 60 MAPUP FCB $60 MAP LOWER TO UPPERCASE
0055 CC4A ZCC4A EQU $CC4A
0056 CC4B ZCC4B EQU $CC4B
0057 CC4C ZCC4C EQU $CC4C
0058 CC4D ZCC4D EQU $CC4D
0007 END
0000 INCLUDE "f9-data.txt"
0001 *
0002 ** STRINGS AND MESSAGES
0003 *
0004 CC4E ORG $CC4E
0005 CC4E 2B 2B 2B PMTSTR FCC "+++"
0006 CC51 04 FCB $04
0007 CC52 3F 3F 3F QRYSTR FCC "???"
0008 CC55 04 FCB $04
0009 CC56 57 48 41 54 3F WOTMSG FCC "WHAT?"
0010 CC5B 04 FCB $04
0011 CC5C 43 41 4E 27 54 20 NTRMSG FCC "CAN'T TRANSFER"
54 52 41 4E 53 46
45 52
0012 CC6A 04 FCB $04
0013 CC6B 4E 4F 54 20 46 4F NFDMSG FCC "NOT FOUND"
55 4E 44
0014 CC74 04 FCB $04
0015 CC75 44 49 53 4B 20 45 DERMSG FCC "DISK ERROR #"
52 52 4F 52 20 23
0016 CC81 04 FCB $04
0017 CC82 44 52 49 56 45 53 DNRMSG FCC "DRIVES NOT READY"
20 4E 4F 54 20 52
45 41 44 59
0018 CC92 04 FCB $04
0019 *
0020 ** MEMORY RESIDENT COMMANDS
0021 *
0022 CC93 47 45 54 CMDTBL FCC "GET"
0023 CC96 00 FCB $00
0024 CC97 D2 0F FDB GETCMD
0025 CC99 4D 4F 4E FCC "MON"
0026 CC9C 00 FCB $00
0027 CC9D D3 4B FDB ZD34B
0028 CC9F 00 FCB $00
0029 *
0030 ** DECIMAL CONVERSION TABLE
0031 *
0032 CCA0 27 10 DECTBL FDB 10000
0033 CCA2 03 E8 FDB 1000
0034 CCA4 00 64 FDB 100
0035 CCA6 00 0A FDB 10
0008 END
0000 INCLUDE "f9-cli.txt"
0001 *********************************************
0002 *
0003 * FLEX COMMAND LINE INTERPRETER & SUBROUTINES
0004 *
0005 *********************************************
0006 CD00 ORG $CD00
0007 *
0008 ** FLEX JUMPS
0009 *
0010 CD00 7E CD 57 COLDS JMP >COLD1
0011 CD03 7E CD 67 WARMS JMP >WARM1
0012 CD06 7E CD B1 RENTER JMP >RENT1
0013 CD09 7E CD 09 INCH JMP >INCH
0014 CD0C 7E CD 0C INCH2 JMP >INCH2
0015 CD0F 7E CD 0F OUTCH JMP >OUTCH
0016 CD12 7E CD 12 OUTCH2 JMP >OUTCH2
0017 CD15 7E CE FB GETCHR JMP >GETCH1
0018 CD18 7E CF 41 PUTCHR JMP >PUTCH1
0019 CD1B 7E CE 2B INBUFF JMP >INBUF1
0020 CD1E 7E CE 81 PSTRNG JMP >PSTRG1
0021 CD21 7E CF ED CLASS JMP >CLASS1
0022 CD24 7E CE B5 PCRLF JMP >PCRLF1
0023 CD27 7E D0 0E NXTCH JMP >NXTCH1
0024 CD2A 7E CD EA RSTRIO JMP >RSTIO1
0025 CD2D 7E D0 36 GETFIL JMP >GETFL1
0026 CD30 7E D1 A2 LOAD JMP >LOAD1
0027 CD33 7E D0 EB SETEXT JMP >SETEX1
0028 CD36 7E D3 49 ADDBX JMP >ADDBX1
0029 CD39 7E CF 86 OUTDEC JMP >OUTDC1
0030 CD3C 7E CF D4 OUTHEX JMP >OUTHX1
0031 CD3F 7E D2 7F RPTERR JMP >RPTER1
0032 CD42 7E D1 2F GETHEX JMP >GETHX1
0033 CD45 7E CF D0 OUTADR JMP >OUTAD1
0034 CD48 7E D1 75 INDEC JMP >INDEC1
0035 CD4B 7E D3 29 DOCMND JMP >DOCMD1
0036 CD4E 7E CD 4E ZCD4E JMP >ZCD4E
0037 CD51 7E CE 05 JMP >ZCE05
0038 CD54 7E CE 05 JMP >ZCE05
0039 *
0040 ** COLD START ENTRY
0041 *
0042 CD57 10 CE C0 7F COLD1 LDS #ZC07F
0043 CD5B 7F CC 11 ZCD5B CLR >LASTRM
0044 CD5E BD D4 00 JSR >ZD400
0045 CD61 7F CC 28 CLR >CMDFLG
0046 CD64 BD D3 FD JSR >ZD3FD
0047 *
0048 ** WARM START ENTRY
0049 *
0050 CD67 10 CE C0 7F WARM1 LDS #ZC07F
0051 CD6B BD DE 18 JSR >WARMDR
0052 CD6E 8E CD 03 LDX #WARMS
0053 CD71 BF CC 16 STX >ESCVEC
0054 CD74 8E C7 00 LDX #PRSPL1
0055 CD77 AF 9F D3 E9 STX [SWIVVC]
0056 CD7B BE D3 E7 LDX >IHNDVC
0057 CD7E AF 9F D3 EB STX [IRQVVC]
0058 CD82 8E CC F8 LDX #ZCCF8
0059 CD85 BF CC 31 STX >ZCC31
0060 CD88 7F CC 34 CLR >ZCC34
0061 CD8B 7F CC 4C CLR >ZCC4C
0062 CD8E 8D 5A BSR RSTIO1
0063 CD90 B6 CC 11 LDA >LASTRM
0064 CD93 B1 CC 02 CMPA >EOLCHR
0065 CD96 26 05 BNE ZCD9D
0066 CD98 7C CC 15 INC >LINPTR+1
0067 CD9B 20 14 BRA RENT1
0068
0069 CD9D 7D CC 28 ZCD9D TST >CMDFLG
0070 CDA0 10 26 05 97 LBNE ZD33B
0071 CDA4 BD D4 03 JSR >FMSCLS
0072 CDA7 26 B2 BNE ZCD5B
0073 CDA9 8E CC 4E LDX #PMTSTR
0074 CDAC BD CE 81 JSR >PSTRG1
0075 CDAF 8D 7A BSR INBUF1
0076 *
0077 ** MAIN CONTROL LOOP
0078 *
0079 CDB1 BD D0 D4 RENT1 JSR >ZD0D4
0080 CDB4 81 0D CMPA #$0D
0081 CDB6 27 E5 BEQ ZCD9D
0082 CDB8 8E C8 40 ZCDB8 LDX #FCB
0083 CDBB 7C CC 0D INC >ZCC0D
0084 CDBE BD D0 36 JSR >GETFL1
0085 CDC1 25 16 BCS ZCDD9
0086 CDC3 8E CC 93 LDX #CMDTBL
0087 CDC6 8D 3E BSR ZCE06
0088 CDC8 27 09 BEQ ZCDD3
0089 CDCA BE CC 12 LDX >UCTVEC
0090 CDCD 27 07 BEQ ZCDD6
0091 CDCF 8D 35 BSR ZCE06
0092 CDD1 26 03 BNE ZCDD6
0093 CDD3 6E 98 01 ZCDD3 JMP [$01,X]
0094
0095 CDD6 BD D2 2E ZCDD6 JSR >ZD22E
0096 CDD9 8E CC 56 ZCDD9 LDX #WOTMSG
0097 CDDC 86 15 LDA #$15
0098 CDDE B7 CC 20 ZCDDE STA >ERRTYP
0099 CDE1 BD CE 81 ZCDE1 JSR >PSTRG1
0100 CDE4 7F CC 11 ZCDE4 CLR >LASTRM
0101 CDE7 7E CD 67 JMP >WARM1
0102 *
0103 ** RESTORE IO VECTORS
0104 *
0105 CDEA BE CD 13 RSTIO1 LDX >OUTCH2+1
0106 CDED BF CD 10 STX >OUTCH+1
0107 CDF0 BE CD 0D LDX >INCH2+1
0108 CDF3 BF CD 0A STX >INCH+1
0109 CDF6 7F CC 23 CLR >INPSWT
0110 CDF9 7F CC 22 CLR >OUTSWT
0111 CDFC 7F CC 21 CLR >SIOFLG
0112 CDFF 7F CC 26 CLR >FIPADR
0113 CE02 7F CC 24 CLR >FOPADR
0114 CE05 39 ZCE05 RTS
0115
0116 CE06 10 8E C8 44 ZCE06 LDY #ZC844
0117 CE0A A6 A0 ZCE0A LDA ,Y+
0118 CE0C 81 5F CMPA #$5F
0119 CE0E 23 02 BLS ZCE12
0120 CE10 80 20 SUBA #$20
0121 CE12 A1 80 ZCE12 CMPA ,X+
0122 CE14 26 08 BNE ZCE1E
0123 CE16 6D 84 TST ,X
0124 CE18 26 F0 BNE ZCE0A
0125 CE1A 6D A4 TST ,Y
0126 CE1C 27 0C BEQ ZCE2A
0127 CE1E 6D 80 ZCE1E TST ,X+
0128 CE20 26 FC BNE ZCE1E
0129 CE22 30 02 LEAX $02,X
0130 CE24 6D 84 TST ,X
0131 CE26 26 DE BNE ZCE06
0132 CE28 1C FB ANDCC #$FB
0133 CE2A 39 ZCE2A RTS
0134 *
0135 ** GET USER COMMAND LINE
0136 *
0137 CE2B 8E C0 80 INBUF1 LDX #LINBUF
0138 CE2E BF CC 14 STX >LINPTR
0139 CE31 BD CE FB ZCE31 JSR >GETCH1
0140 CE34 B1 CC 01 CMPA >DELCHR
0141 CE37 27 1D BEQ ZCE56
0142 CE39 B1 CC 00 CMPA >BSPCHR
0143 CE3C 27 1F BEQ ZCE5D
0144 CE3E 81 0D CMPA #$0D
0145 CE40 27 0D BEQ ZCE4F
0146 CE42 81 0A CMPA #$0A
0147 CE44 27 32 BEQ ZCE78
0148 CE46 81 1F CMPA #$1F
0149 CE48 23 E7 BLS ZCE31
0150 CE4A 8C C0 FF ZCE4A CMPX #ZC0FF
0151 CE4D 27 E2 BEQ ZCE31
0152 CE4F A7 80 ZCE4F STA ,X+
0153 CE51 81 0D CMPA #$0D
0154 CE53 26 DC BNE ZCE31
0155 CE55 39 RTS
0156
0157 CE56 8E CC 52 ZCE56 LDX #QRYSTR
0158 CE59 8D 26 BSR PSTRG1
0159 CE5B 20 CE BRA INBUF1
0160
0161 CE5D 8C C0 80 ZCE5D CMPX #LINBUF
0162 CE60 27 F4 BEQ ZCE56
0163 CE62 30 1F LEAX -$01,X
0164 CE64 B6 CC 07 LDA >BSECHR
0165 CE67 81 08 CMPA #$08
0166 CE69 26 08 BNE ZCE73
0167 CE6B 86 20 LDA #$20
0168 CE6D BD CF 66 JSR >ZCF66
0169 CE70 B6 CC 07 LDA >BSECHR
0170 CE73 BD CF 66 ZCE73 JSR >ZCF66
0171 CE76 20 B9 BRA ZCE31
0172
0173 CE78 86 0D ZCE78 LDA #$0D
0174 CE7A BD CF 41 JSR >PUTCH1
0175 CE7D 86 20 LDA #$20
0176 CE7F 20 C9 BRA ZCE4A
0177
0178 CE81 8D 32 PSTRG1 BSR PCRLF1
0179 CE83 A6 84 ZCE83 LDA ,X
0180 CE85 81 04 CMPA #$04
0181 CE87 27 6F BEQ ZCEF8
0182 CE89 BD CF 41 JSR >PUTCH1
0183 CE8C 30 01 LEAX $01,X
0184 CE8E 20 F3 BRA ZCE83
0185
0186 CE90 BD CD 4E ZCE90 JSR >ZCD4E
0187 CE93 27 65 BEQ ZCEFA
0188 CE95 AD 9F D3 E5 JSR [ZD3E5]
0189 CE99 B1 CC 0A CMPA >ESCCHR
0190 CE9C 26 5C BNE ZCEFA
0191 CE9E 7F CC 1A ZCE9E CLR >CURLIN
0192 CEA1 AD 9F D3 E5 ZCEA1 JSR [ZD3E5]
0193 CEA5 B1 CC 0A CMPA >ESCCHR
0194 CEA8 27 50 BEQ ZCEFA
0195 CEAA 81 03 CMPA #$03 CTRL C
0196 CEAC 26 F3 BNE ZCEA1
0197 CEAE 7F CC 11 CLR >LASTRM
0198 CEB1 6E 9F CC 16 JMP [ESCVEC]
0199 *
0200 ** PRINT CR, LINEFEED
0201 *
0202 CEB5 7D CC 21 PCRLF1 TST >SIOFLG
0203 CEB8 26 27 BNE ZCEE1
0204 CEBA 8D D4 BSR ZCE90
0205 CEBC B6 CC 03 LDA >DEPCNT
0206 CEBF 27 20 BEQ ZCEE1
0207 CEC1 B1 CC 1A CMPA >CURLIN
0208 CEC4 22 18 BHI ZCEDE
0209 CEC6 7F CC 1A CLR >CURLIN
0210 CEC9 7D CC 09 TST >PAUSE
0211 CECC 27 02 BEQ ZCED0
0212 CECE 8D CE BSR ZCE9E
0213 CED0 34 04 ZCED0 PSHS B
0214 CED2 F6 CC 08 LDB >EJTCNT
0215 CED5 27 05 BEQ ZCEDC
0216 CED7 8D 08 ZCED7 BSR ZCEE1
0217 CED9 5A DECB
0218 CEDA 26 FB BNE ZCED7
0219 CEDC 35 04 ZCEDC PULS B
0220 CEDE 7C CC 1A ZCEDE INC >CURLIN
0221 CEE1 86 0D ZCEE1 LDA #$0D
0222 CEE3 8D 5C BSR PUTCH1
0223 CEE5 86 0A LDA #$0A
0224 CEE7 8D 58 BSR PUTCH1
0225 CEE9 34 04 PSHS B
0226 CEEB F6 CC 05 LDB >NULCNT
0227 CEEE 27 06 BEQ ZCEF6
0228 CEF0 4F ZCEF0 CLRA
0229 CEF1 8D 4E BSR PUTCH1
0230 CEF3 5A DECB
0231 CEF4 26 FA BNE ZCEF0
0232 CEF6 35 04 ZCEF6 PULS B
0233 CEF8 1C FE ZCEF8 ANDCC #$FE
0234 CEFA 39 ZCEFA RTS
0235 *
0236 ** GET A CHARACTER HONOURING TTYSET
0237 *
0238 CEFB 7D CC 23 GETCH1 TST >INPSWT
0239 CEFE 26 1A BNE ZCF1A
0240 CF00 7D CC 26 TST >FIPADR
0241 CF03 27 10 BEQ ZCF15
0242 CF05 8D 1A BSR ZCF21
0243 CF07 7D CC 2F TST >FIEFLG
0244 CF0A 27 11 BEQ ZCF1D
0245 CF0C 7D CC 24 TST >FOPADR
0246 CF0F 27 0C BEQ ZCF1D
0247 CF11 8D 53 BSR ZCF66
0248 CF13 20 08 BRA ZCF1D
0249 CF15 BD CD 09 ZCF15 JSR >INCH
0250 CF18 20 03 BRA ZCF1D
0251
0252 CF1A BD CD 0C ZCF1A JSR >INCH2
0253 CF1D 7F CC 1A ZCF1D CLR >CURLIN
0254 CF20 39 RTS
0255
0256 CF21 BF CC 47 ZCF21 STX >ZCC47
0257 CF24 BE CC 26 LDX >FIPADR
0258 CF27 20 06 BRA ZCF2F
0259
0260 CF29 BF CC 47 ZCF29 STX >ZCC47
0261 CF2C BE CC 24 LDX >FOPADR
0262 CF2F BD D4 06 ZCF2F JSR >FMS
0263 CF32 26 04 BNE ZCF38
0264 CF34 BE CC 47 LDX >ZCC47
0265 CF37 39 RTS
0266
0267 CF38 7F CC 24 ZCF38 CLR >FOPADR
0268 CF3B BD D2 7F JSR >RPTER1
0269 CF3E 7E CD 03 JMP >WARMS
0270 *
0271 ** OUTPUT CHARACTER HONOURING TTYSET
0272 *
0273 CF41 7D CC 21 PUTCH1 TST >SIOFLG
0274 CF44 26 20 BNE ZCF66
0275 CF46 81 1F CMPA #$1F
0276 CF48 22 05 BHI ZCF4F
0277 CF4A 7F CC 29 CLR >CURCOL
0278 CF4D 20 17 BRA ZCF66
0279
0280 CF4F 7C CC 29 ZCF4F INC >CURCOL
0281 CF52 34 02 PSHS A
0282 CF54 B6 CC 04 LDA >WIDCNT
0283 CF57 27 0B BEQ ZCF64
0284 CF59 B1 CC 29 CMPA >CURCOL
0285 CF5C 24 06 BCC ZCF64
0286 CF5E BD CE B5 JSR >PCRLF1
0287 CF61 7C CC 29 INC >CURCOL
0288 CF64 35 02 ZCF64 PULS A
0289 CF66 34 02 ZCF66 PSHS A
0290 CF68 7D CC 22 TST >OUTSWT
0291 CF6B 26 13 BNE ZCF80
0292 CF6D 7D CC 24 TST >FOPADR
0293 CF70 27 04 BEQ ZCF76
0294 CF72 8D B5 BSR ZCF29
0295 CF74 20 0D BRA ZCF83
0296
0297 CF76 7D CC 26 ZCF76 TST >FIPADR
0298 CF79 26 08 BNE ZCF83
0299 CF7B BD CD 0F JSR >OUTCH
0300 CF7E 20 03 BRA ZCF83
0301 CF80 BD CD 12 ZCF80 JSR >OUTCH2
0302 CF83 35 02 ZCF83 PULS A
0303 CF85 39 RTS
0304
0305 CF86 7F CC 4A OUTDC1 CLR >ZCC4A
0306 CF89 F7 CC 1D STB >TRNFLG
0307 CF8C 86 04 LDA #$04
0308 CF8E B7 CC 4D STA >ZCC4D
0309 CF91 EC 84 LDD ,X
0310 CF93 8E CC A0 LDX #DECTBL
0311 CF96 8D 0B ZCF96 BSR ZCFA3
0312 CF98 30 02 LEAX $02,X
0313 CF9A 7A CC 4D DEC >ZCC4D
0314 CF9D 26 F7 BNE ZCF96
0315 CF9F 1F 98 TFR B,A
0316 CFA1 20 3D BRA OUTHXR
0317
0318 CFA3 7F CC 4B ZCFA3 CLR >ZCC4B
0319 CFA6 10 A3 84 ZCFA6 CMPD ,X
0320 CFA9 25 07 BCS ZCFB2
0321 CFAB A3 84 SUBD ,X
0322 CFAD 7C CC 4B INC >ZCC4B
0323 CFB0 20 F4 BRA ZCFA6
0324
0325 CFB2 34 02 ZCFB2 PSHS A
0326 CFB4 B6 CC 4B LDA >ZCC4B
0327 CFB7 26 10 BNE ZCFC9
0328 CFB9 7D CC 4A TST >ZCC4A
0329 CFBC 26 0B BNE ZCFC9
0330 CFBE 7D CC 1D TST >TRNFLG
0331 CFC1 27 0B BEQ ZCFCE
0332 CFC3 86 20 LDA #$20
0333 CFC5 8D 23 BSR ZCFEA
0334 CFC7 20 05 BRA ZCFCE
0335
0336 CFC9 7C CC 4A ZCFC9 INC >ZCC4A
0337 CFCC 8D 12 BSR OUTHXR
0338 CFCE 35 82 ZCFCE PULS PC,A
0339 *
0340 ** DISPLAY HEX ADDRESS
0341 *
0342 CFD0 8D 02 OUTAD1 BSR OUTHX1
0343 CFD2 30 01 LEAX $01,X
0344 *
0345 ** OUPUT HEX BYTE
0346 *
0347 CFD4 A6 84 OUTHX1 LDA ,X
0348 CFD6 8D 04 BSR OUTHXL
0349 CFD8 A6 84 LDA ,X
0350 CFDA 20 04 BRA OUTHXR
0351
0352 CFDC 44 OUTHXL LSRA
0353 CFDD 44 LSRA
0354 CFDE 44 LSRA
0355 CFDF 44 LSRA
0356 CFE0 84 0F OUTHXR ANDA #$0F
0357 CFE2 8B 30 ADDA #$30
0358 CFE4 81 39 CMPA #$39
0359 CFE6 23 02 BLS ZCFEA
0360 CFE8 8B 07 ADDA #$07
0361 CFEA 7E CF 41 ZCFEA JMP >PUTCH1
0362 *
0363 ** CLASSIFY CHARACTER ALHA/NUMERIC
0364 *
0365 CFED 81 30 CLASS1 CMPA #'0
0366 CFEF 25 14 BCS ZD005
0367 CFF1 81 39 CMPA #'9
0368 CFF3 23 16 BLS ZD00B
0369 CFF5 81 41 CMPA #'A
0370 CFF7 25 0C BCS ZD005
0371 CFF9 81 5A CMPA #'Z
0372 CFFB 23 0E BLS ZD00B
0373 CFFD 81 61 CMPA #'a $61
0374 CFFF 25 04 BCS ZD005
0375 D001 81 7A CMPA #'z $7A
0376 D003 23 06 BLS ZD00B
0377 D005 1A 01 ZD005 ORCC #$01
0378 D007 B7 CC 11 STA >LASTRM
0379 D00A 39 RTS
0380 D00B 1C FE ZD00B ANDCC #$FE
0381 D00D 39 RTS
0382 *
0383 ** GET NEXT CHARACTER FROM FILE
0384 *
0385 D00E 34 10 NXTCH1 PSHS X
0386 D010 BE CC 14 LDX >LINPTR
0387 D013 B6 CC 18 LDA >CURCHR
0388 D016 B7 CC 19 STA >PRVCHR
0389 D019 A6 80 ZD019 LDA ,X+
0390 D01B B7 CC 18 STA >CURCHR
0391 D01E 81 0D CMPA #$0D
0392 D020 27 10 BEQ ZD032
0393 D022 B1 CC 02 CMPA >EOLCHR
0394 D025 27 0B BEQ ZD032
0395 D027 BF CC 14 STX >LINPTR
0396 D02A 81 20 CMPA #$20
0397 D02C 26 04 BNE ZD032
0398 D02E A1 84 CMPA ,X
0399 D030 27 E7 BEQ ZD019
0400 D032 8D B9 ZD032 BSR CLASS1
0401 D034 35 90 PULS PC,X
0402 *
0403 ** PARSE FILE SPEC. IN LINE BUFFER
0404 *
0405 D036 86 15 GETFL1 LDA #$15
0406 D038 A7 01 STA $01,X
0407 D03A 86 FF LDA #$FF
0408 D03C A7 03 STA $03,X
0409 D03E 6F 04 CLR $04,X
0410 D040 6F 0C CLR $0C,X
0411 D042 BD D0 D4 JSR >ZD0D4
0412 D045 86 08 LDA #$08
0413 D047 B7 CC 4B STA >ZCC4B
0414 D04A 8D 34 BSR ZD080
0415 D04C 25 2E BCS ZD07C
0416 D04E 26 0F BNE ZD05F
0417 D050 8D 2E BSR ZD080
0418 D052 25 28 BCS ZD07C
0419 D054 26 09 BNE ZD05F
0420 D056 BC CC 3F CMPX >ZCC3F
0421 D059 27 6C BEQ ZD0C7
0422 D05B 8D 23 BSR ZD080
0423 D05D 23 68 BLS ZD0C7
0424 D05F BE CC 3F ZD05F LDX >ZCC3F
0425 D062 6D 04 TST $04,X
0426 D064 27 61 BEQ ZD0C7
0427 D066 6D 03 TST $03,X
0428 D068 2A 0F BPL ZD079
0429 D06A 7D CC 0D TST >ZCC0D
0430 D06D 27 05 BEQ ZD074
0431 D06F B6 CC 0B LDA >SYSDRV
0432 D072 20 03 BRA ZD077
0433
0434 D074 B6 CC 0C ZD074 LDA >WRKDRV
0435 D077 A7 03 ZD077 STA $03,X
0436 D079 7F CC 0D ZD079 CLR >ZCC0D
0437 D07C BE CC 3F ZD07C LDX >ZCC3F
0438 D07F 39 RTS
0439
0440 D080 8D 8C ZD080 BSR NXTCH1
0441 D082 25 43 BCS ZD0C7
0442 D084 81 39 CMPA #$39
0443 D086 22 15 BHI ZD09D
0444 D088 BE CC 3F LDX >ZCC3F
0445 D08B 6D 03 TST $03,X
0446 D08D 2A 38 BPL ZD0C7
0447 D08F 84 03 ANDA #$03
0448 D091 A7 03 STA $03,X
0449 D093 BD D0 0E JSR >NXTCH1
0450 D096 24 2F BCC ZD0C7
0451 D098 81 2E ZD098 CMPA #$2E
0452 D09A 1C FE ANDCC #$FE
0453 D09C 39 RTS
0454
0455 D09D F6 CC 4B ZD09D LDB >ZCC4B
0456 D0A0 2B 25 BMI ZD0C7
0457 D0A2 34 04 PSHS B
0458 D0A4 C0 05 SUBB #$05
0459 D0A6 F7 CC 4B STB >ZCC4B
0460 D0A9 35 04 PULS B
0461 D0AB B1 CC 49 ZD0AB CMPA >MAPUP
0462 D0AE 25 02 BCS ZD0B2
0463 D0B0 80 20 SUBA #$20
0464 D0B2 A7 04 ZD0B2 STA $04,X
0465 D0B4 30 01 LEAX $01,X
0466 D0B6 5A DECB
0467 D0B7 BD D0 0E JSR >NXTCH1
0468 D0BA 24 08 BCC ZD0C4
0469 D0BC 81 2D CMPA #$2D
0470 D0BE 27 04 BEQ ZD0C4
0471 D0C0 81 5F CMPA #$5F
0472 D0C2 26 06 BNE ZD0CA
0473 D0C4 5D ZD0C4 TSTB
0474 D0C5 26 E4 BNE ZD0AB
0475 D0C7 1A 01 ZD0C7 ORCC #$01
0476 D0C9 39 RTS
0477
0478 D0CA 5D ZD0CA TSTB
0479 D0CB 27 CB BEQ ZD098
0480 D0CD 6F 04 CLR $04,X
0481 D0CF 30 01 LEAX $01,X
0482 D0D1 5A DECB
0483 D0D2 20 F6 BRA ZD0CA
0484
0485 D0D4 BF CC 3F ZD0D4 STX >ZCC3F
0486 D0D7 BE CC 14 LDX >LINPTR
0487 D0DA A6 84 ZD0DA LDA ,X
0488 D0DC 81 20 CMPA #$20
0489 D0DE 26 04 BNE ZD0E4
0490 D0E0 30 01 LEAX $01,X
0491 D0E2 20 F6 BRA ZD0DA
0492 D0E4 BF CC 14 ZD0E4 STX >LINPTR
0493 D0E7 BE CC 3F LDX >ZCC3F
0494 D0EA 39 RTS
0495 *
0496 ** DEFAULT FILE EXTENSION
0497 *
0498 D0EB 34 30 SETEX1 PSHS Y,X
0499 D0ED E6 0C LDB $0C,X
0500 D0EF 26 18 BNE ZD109
0501 D0F1 10 8E D1 0B LDY #EXTTBL
0502 D0F5 81 0B CMPA #$0B
0503 D0F7 22 10 BHI ZD109
0504 D0F9 C6 03 LDB #$03
0505 D0FB 3D MUL
0506 D0FC 31 A5 LEAY B,Y
0507 D0FE C6 03 LDB #$03
0508 D100 A6 A0 ZD100 LDA ,Y+
0509 D102 A7 0C STA $0C,X
0510 D104 30 01 LEAX $01,X
0511 D106 5A DECB
0512 D107 26 F7 BNE ZD100
0513 D109 35 B0 ZD109 PULS PC,Y,X
0514 *
0515 ** STANDARD FILE NAME EXTTENSIONS
0516 *
0517 D10B 42 49 4E EXTTBL FCC "BIN"
0518 D10E 54 58 54 FCC "TXT"
0519 D111 43 4D 44 FCC "CMD"
0520 D114 42 41 53 FCC "BAS"
0521 D117 53 59 53 FCC "SYS"
0522 D11A 42 41 4B FCC "BAK"
0523 D11D 53 43 52 FCC "SCR"
0524 D120 44 41 54 FCC "DAT"
0525 D123 42 41 43 FCC "BAC"
0526 D126 44 49 52 FCC "DIR"
0527 D129 50 52 54 FCC "PRT"
0528 D12C 4F 55 54 FCC "OUT"
0529 *
0530 ** READ A HEX ADDRESS FROM THE LINE BUFFER
0531 *
0532 D12F BD D2 1E GETHX1 JSR >ZD21E
0533 D132 BD D0 0E ZD132 JSR >NXTCH1
0534 D135 25 22 BCS ZD159
0535 D137 8D 26 BSR ZD15F
0536 D139 25 18 BCS ZD153
0537 D13B 34 04 PSHS B
0538 D13D C6 04 LDB #$04
0539 D13F 78 CC 1C ZD13F ASL >LODOFF+1
0540 D142 79 CC 1B ROL >LODOFF
0541 D145 5A DECB
0542 D146 26 F7 BNE ZD13F
0543 D148 35 04 PULS B
0544 D14A BB CC 1C ADDA >LODOFF+1
0545 D14D B7 CC 1C STA >LODOFF+1
0546 D150 5C INCB
0547 D151 20 DF BRA ZD132
0548
0549 D153 BD D0 0E ZD153 JSR >NXTCH1
0550 D156 24 FB BCC ZD153
0551 D158 39 RTS
0552
0553 D159 BE CC 1B ZD159 LDX >LODOFF
0554 D15C 1C FE ANDCC #$FE
0555 D15E 39 RTS
0556
0557 D15F 80 47 ZD15F SUBA #$47
0558 D161 2A 0F BPL ZD172
0559 D163 8B 06 ADDA #$06
0560 D165 2A 04 BPL ZD16B
0561 D167 8B 07 ADDA #$07
0562 D169 2A 07 BPL ZD172
0563 D16B 8B 0A ZD16B ADDA #$0A
0564 D16D 2B 03 BMI ZD172
0565 D16F 1C FE ANDCC #$FE
0566 D171 39 RTS
0567
0568 D172 1A 01 ZD172 ORCC #$01
0569 D174 39 RTS
0570
0571 D175 BD D2 1E INDEC1 JSR >ZD21E
0572 D178 BD D0 0E ZD178 JSR >NXTCH1
0573 D17B 25 DC BCS ZD159
0574 D17D 81 39 CMPA #$39
0575 D17F 22 D2 BHI ZD153
0576 D181 84 0F ANDA #$0F
0577 D183 34 04 PSHS B
0578 D185 34 02 PSHS A
0579 D187 FC CC 1B LDD >LODOFF
0580 D18A 58 ASLB
0581 D18B 49 ROLA
0582 D18C 58 ASLB
0583 D18D 49 ROLA
0584 D18E 58 ASLB
0585 D18F 49 ROLA
0586 D190 F3 CC 1B ADDD >LODOFF
0587 D193 F3 CC 1B ADDD >LODOFF
0588 D196 EB E0 ADDB ,S+
0589 D198 89 00 ADCA #$00
0590 D19A FD CC 1B STD >LODOFF
0591 D19D 35 04 PULS B
0592 D19F 5C INCB
0593 D1A0 20 D6 BRA ZD178
0594 *
0595 ** LOAD BINARY FILE
0596 *
0597 D1A2 7F CC 1D LOAD1 CLR >TRNFLG
0598 D1A5 8D 3D ZD1A5 BSR ZD1E4
0599 D1A7 81 02 CMPA #$02
0600 D1A9 27 15 BEQ ZD1C0
0601 D1AB 81 16 CMPA #$16
0602 D1AD 26 F6 BNE ZD1A5
0603 D1AF 8D 33 BSR ZD1E4
0604 D1B1 B7 CC 1E STA >TRNVEC
0605 D1B4 8D 2E BSR ZD1E4
0606 D1B6 B7 CC 1F STA >TRNVEC+1
0607 D1B9 86 01 LDA #$01
0608 D1BB B7 CC 1D STA >TRNFLG
0609 D1BE 20 E5 BRA ZD1A5
0610
0611 D1C0 8D 22 ZD1C0 BSR ZD1E4
0612 D1C2 1F 89 TFR A,B
0613 D1C4 8D 1E BSR ZD1E4
0614 D1C6 1E 89 EXG A,B
0615 D1C8 F3 CC 1B ADDD >LODOFF
0616 D1CB FD CC 3D STD >ZCC3D
0617 D1CE 8D 14 BSR ZD1E4
0618 D1D0 1F 89 TFR A,B
0619 D1D2 4D TSTA
0620 D1D3 27 D0 BEQ ZD1A5
0621 D1D5 8D 0D ZD1D5 BSR ZD1E4
0622 D1D7 BE CC 3D LDX >ZCC3D
0623 D1DA A7 80 STA ,X+
0624 D1DC BF CC 3D STX >ZCC3D
0625 D1DF 5A DECB
0626 D1E0 26 F3 BNE ZD1D5
0627 D1E2 20 C1 BRA ZD1A5
0628
0629 D1E4 8E C8 40 ZD1E4 LDX #FCB
0630 D1E7 BD D4 06 JSR >FMS
0631 D1EA 27 11 BEQ ZD1FD
0632 D1EC A6 01 LDA $01,X
0633 D1EE 81 08 CMPA #$08
0634 D1F0 26 0E BNE ZD200
0635 D1F2 32 62 LEAS $02,S
0636 D1F4 86 04 ZD1F4 LDA #$04
0637 D1F6 A7 84 STA ,X
0638 D1F8 BD D4 06 JSR >FMS
0639 D1FB 26 0D BNE ZD20A
0640 D1FD 1C FE ZD1FD ANDCC #$FE
0641 D1FF 39 RTS
0642
0643 D200 B7 CC 20 ZD200 STA >ERRTYP
0644 D203 81 04 CMPA #$04
0645 D205 26 03 BNE ZD20A
0646 D207 1A 01 ORCC #$01
0647 D209 39 RTS
0648
0649 D20A 8D 73 ZD20A BSR RPTER1
0650 D20C 7E CD E4 JMP >ZCDE4
0651 *
0652 ** 'GET' - LOAD BINARY FILE
0653 *
0654 D20F 86 00 GETCMD LDA #$00
0655 D211 8D 35 BSR ZD248
0656 D213 25 0F BCS ZD224
0657 D215 8D 07 BSR ZD21E
0658 D217 7C CC 4C INC >ZCC4C
0659 D21A 8D 86 BSR LOAD1
0660 D21C 20 F1 BRA GETCMD
0661
0662 D21E 4F ZD21E CLRA
0663 D21F 5F CLRB
0664 D220 FD CC 1B STD >LODOFF
0665 D223 39 RTS
0666
0667 D224 F6 CC 4C ZD224 LDB >ZCC4C
0668 D227 10 27 FB AE LBEQ ZCDD9
0669 D22B 7E CD 03 JMP >WARMS
0670
0671 D22E 86 02 ZD22E LDA #$02
0672 D230 8D 22 BSR ZD254
0673 D232 8D EA BSR ZD21E
0674 D234 BD D1 A2 JSR >LOAD1
0675 D237 F6 CC 1D LDB >TRNFLG
0676 D23A 27 04 BEQ ZD240
0677 D23C 6E 9F CC 1E JMP [TRNVEC]
0678
0679 D240 8E CC 5C ZD240 LDX #NTRMSG
0680 D243 86 81 LDA #$81
0681 D245 7E CD DE JMP >ZCDDE
0682
0683 D248 34 02 ZD248 PSHS A
0684 D24A 8E C8 40 LDX #FCB
0685 D24D BD D0 36 JSR >GETFL1
0686 D250 35 02 PULS A
0687 D252 25 1A BCS ZD26E
0688 D254 8E C8 40 ZD254 LDX #FCB
0689 D257 BD D0 EB JSR >SETEX1
0690 D25A 8E C8 40 LDX #FCB
0691 D25D 86 01 LDA #$01
0692 D25F A7 84 STA ,X
0693 D261 BD D1 E4 JSR >ZD1E4
0694 D264 10 25 00 BB LBCS ZD323
0695 D268 86 FF LDA #$FF
0696 D26A A7 88 3B STA $3B,X
0697 D26D 39 RTS
0698
0699 D26E B6 CC 11 ZD26E LDA >LASTRM
0700 D271 81 0D CMPA #$0D
0701 D273 27 07 BEQ ZD27C
0702 D275 B1 CC 02 CMPA >EOLCHR
0703 D278 10 26 FB 5D LBNE ZCDD9
0704 D27C 1A 01 ZD27C ORCC #$01
0705 D27E 39 RTS
0706
0707 D27F 34 30 RPTER1 PSHS Y,X
0708 D281 A6 01 LDA $01,X
0709 D283 B7 CC 20 STA >ERRTYP
0710 D286 27 63 BEQ ZD2EB
0711 D288 BD CD EA JSR >RSTIO1
0712 D28B 10 BE CC 2D LDY >ERRVEC
0713 D28F 26 08 BNE ZD299
0714 D291 81 10 CMPA #$10
0715 D293 27 58 BEQ ZD2ED
0716 D295 10 8E D3 61 LDY #ZD361
0717 D299 8E C8 40 ZD299 LDX #FCB
0718 D29C 6D 02 TST $02,X
0719 D29E 27 09 BEQ ZD2A9
0720 D2A0 86 04 LDA #$04
0721 D2A2 A7 84 STA ,X
0722 D2A4 BD D4 06 JSR >FMS
0723 D2A7 26 2E BNE ZD2D7
0724 D2A9 8E C8 38 ZD2A9 LDX #ZC838
0725 D2AC C6 0B LDB #$0B
0726 D2AE 8D 6E BSR ZD31E
0727 D2B0 8E C8 40 LDX #FCB
0728 D2B3 B6 CC 0B LDA >SYSDRV
0729 D2B6 A7 03 STA $03,X
0730 D2B8 86 01 LDA #$01
0731 D2BA A7 84 STA ,X
0732 D2BC BD D4 06 JSR >FMS
0733 D2BF 26 16 BNE ZD2D7
0734 D2C1 B6 CC 20 LDA >ERRTYP
0735 D2C4 4A DECA
0736 D2C5 47 ASRA
0737 D2C6 47 ASRA
0738 D2C7 4C INCA
0739 D2C8 6F 88 20 CLR $20,X
0740 D2CB A7 88 21 STA $21,X
0741 D2CE 86 15 LDA #$15
0742 D2D0 A7 84 STA ,X
0743 D2D2 BD D4 06 JSR >FMS
0744 D2D5 27 1E BEQ ZD2F5
0745 D2D7 8E CC 75 ZD2D7 LDX #DERMSG
0746 D2DA BD CE 81 JSR >PSTRG1
0747 D2DD BE CC 3F LDX >ZCC3F
0748 D2E0 B6 CC 20 LDA >ERRTYP
0749 D2E3 A7 01 STA $01,X
0750 D2E5 6F 84 CLR ,X
0751 D2E7 5F CLRB
0752 D2E8 BD CF 86 JSR >OUTDC1
0753 D2EB 35 B0 ZD2EB PULS PC,Y,X
0754
0755 D2ED 8E CC 82 ZD2ED LDX #DNRMSG
0756 D2F0 BD CE 81 JSR >PSTRG1
0757 D2F3 20 F6 BRA ZD2EB
0758
0759 D2F5 BD CE B5 ZD2F5 JSR >PCRLF1
0760 D2F8 8E C8 40 LDX #FCB
0761 D2FB B6 CC 20 LDA >ERRTYP
0762 D2FE 4A DECA
0763 D2FF 84 03 ANDA #$03
0764 D301 C6 3F LDB #$3F
0765 D303 3D MUL
0766 D304 CB 04 ADDB #$04
0767 D306 E7 88 22 STB $22,X
0768 D309 BD D4 06 ZD309 JSR >FMS
0769 D30C 26 C9 BNE ZD2D7
0770 D30E BD CF 41 JSR >PUTCH1
0771 D311 81 0D CMPA #$0D
0772 D313 26 F4 BNE ZD309
0773 D315 86 04 LDA #$04
0774 D317 A7 84 STA ,X
0775 D319 BD D4 06 JSR >FMS
0776 D31C 20 CD BRA ZD2EB
0777 D31E 34 30 ZD31E PSHS Y,X
0778 D320 7E D1 00 JMP >ZD100
0779
0780 D323 8E CC 6B ZD323 LDX #NFDMSG NOT FOUND
0781 D326 7E CD E1 JMP >ZCDE1
0782 *
0783 ** CALL FLEX AS A SUBROUTINE
0784 *
0785 D329 35 06 DOCMD1 PULS B,A
0786 D32B FD CC 43 STD >ZCC43
0787 D32E 10 FF CC 45 ZD32E STS >ZCC45
0788 D332 7F CC 20 CLR >ERRTYP
0789 D335 7C CC 28 INC >CMDFLG
0790 D338 7E CD B8 JMP >ZCDB8
0791 D33B 7F CC 28 ZD33B CLR >CMDFLG
0792 D33E 10 FE CC 45 LDS >ZCC45
0793 D342 F6 CC 20 LDB >ERRTYP
0794 D345 6E 9F CC 43 JMP [ZCC43]
0795 *
0796 ** ADD ACCB TO IX
0797 *
0798 D349 3A ADDBX1 ABX
0799 D34A 39 RTS
0800
0801 D34B 7D CC FC ZD34B TST >ZCCFC
0802 D34E 26 04 BNE ZD354
0803 D350 6E 9F D3 F3 JMP [MONVEC]
0804
0805 D354 8E C8 40 ZD354 LDX #FCB
0806 D357 86 1B LDA #$1B
0807 D359 A7 01 STA $01,X
0808 D35B BD D2 7F JSR >RPTER1
0809 D35E 7E CD 67 JMP >WARM1
0810
0811 D361 45 52 52 4F 52 53 ZD361 FCC /ERRORS/
0812 D367 00 00 FCB $00,$00
0813 D369 53 59 53 FCC /SYS/
0009 END
0000 INCLUDE "f9-monio.txt"
0001 *
0002 ** TERMINAL AND PRINTER DRIVERS
0003 ** SYS09BUG - Spartan 3 Starter Board
0004 *
0005 ** FLEX DRIVER MEMORY MAP:
0006 ** C700 - C83F PRINTER SPOOLER
0007 ** CCC0 - CCF7 PRINTER DRIVERS
0008 ** D370 - D3FF CONSOLE DRIVERS
0009 ** DE00 - DFAF DISK DRIVERS
0010 *
0011 *
0012 ** INTERRUPT VECTORS
0013 *
0014 DFC8 IRQVEC EQU MONRAM+$08
0015 DFC2 SWIVEC EQU MONRAM+$02 SWI3 VECTOR
0016 *
0017 ** PRINTER DRIVERS
0018 *
0019 CCC0 ORG $CCC0
0020 CCC0 7E D3 70 PINIT JMP DUMRTS INITIATE PRINTER
0021 CCD8 ORG $CCD8
0022 CCD8 7E D3 70 PCHK JMP DUMRTS CHECK IF PRINTER READY
0023 CCE4 ORG $CCE4
0024 CCE4 7E D3 70 POUT JMP DUMRTS OUTPUT CHR. TO PRINTER
0025 CCF8 ORG $CCF8
0026 CCF8 01 00 00 00 ZCCF8 FCB $01,$00,$00,$00
0027 CCFC 00 00 00 00 ZCCFC FCB $00,$00,$00,$00
0028 *
0029 ** CONSOLE DRIVER PATCHES:
0030 *
0031 D370 ORG $D370
0032 D370 IHND EQU * INTERRUPT HANDLER
0033 D370 TMON EQU * TIMER ON
0034 D370 TMOFF EQU * TIMER OFF
0035 D370 TMINT EQU * TIMER INITIALIZATION
0036 D370 DUMRTS EQU *
0037 D370 39 RTS
0038 *
0039 ** SBUG MONITOR I/O CALLS
0040 *
0041 D371 7E D3 70 TERINZ JMP DUMRTS INITIATE ACIA
0042 D374 6E 9F F8 04 INCHNE JMP [MONROM+$04] INPUT WITHOUT ECHO
0043 D378 6E 9F F8 00 MONITR JMP [MONROM+$00]
0044 D37C 6E 9F F8 08 INCHEK JMP [MONROM+$08] CHECK FOR TERMINAL ENTRY
0045 D380 6E 9F F8 0A OUTEEE JMP [MONROM+$0A] OUPUT CHARACTER
0046 D384 6E 9F F8 06 INEEE JMP [MONROM+$06] INPUT WITH ECHO
0047
0048 *
0049 ** AUTO BLOCK FDBS
0050 *
0051 D3E5 ORG $D3E5
0052 D3E5 D3 74 ZD3E5 FDB INCHNE INPUT - NO ECHO
0053 D3E7 D3 70 IHNDVC FDB IHND IRQ INTERRUPT HANDLER
0054 D3E9 DF C2 SWIVVC FDB SWIVEC SWI3 VECTOR LOCATION
0055 D3EB DF C8 IRQVVC FDB IRQVEC IRQ VECTOR LOCATION
0056 D3ED D3 70 TOFVEC FDB TMOFF TIMER OFF ROUTINE
0057 D3EF D3 70 TONVEC FDB TMON TIMER ON ROUTINE
0058 D3F1 D3 70 TINVEC FDB TMINT TIMER INITIALIZE ROUTINE
0059 D3F3 D3 78 MONVEC FDB MONITR MONITOR RETURN ADDRESS
0060 D3F5 D3 71 TERVEC FDB TERINZ TERMINAL INITIATION
0061 D3F7 D3 7C STAVEC FDB INCHEK CHECK TERMINAL STATUS
0062 D3F9 D3 80 OUTVEC FDB OUTEEE TERMINAL CHAR OUTPUT
0063 D3FB D3 84 INVEC FDB INEEE TERMINAL INPUT CHARACTER
0064 D3FD 7E CA 00 ZD3FD JMP ZCA00
0010 END
0000 INCLUDE "f9-fms.txt"
0001 *
0002 ** FILE MANAGEMENT SYSTEM
0003 *
0004 D400 7E D4 36 ZD400 JMP >ZD436
0005 D403 7E D4 59 FMSCLS JMP >ZD459
0006 D406 7E D4 7B FMS JMP >FMS1
0007 D409 20 44 49 53 4B 20 CPYMSG FCC / DISK OPERATING SYSTEM/
4F 50 45 52 41 54
49 4E 47 20 53 59
53 54 45 4D
0008 D41F 20 43 4F 50 59 52 FCC / COPYRIGHT (C) 1980 BY/
49 47 48 54 20 28
43 29 20 31 39 38
30 20 42 59
0009 D435 20 54 45 43 48 4E FCC / TECHNICAL SYSTEMS CONSULTANTS/
49 43 41 4C 20 53
59 53 54 45 4D 53
20 43 4F 4E 53 55
4C 54 41 4E 54 53
0010 D409 ORG CPYMSG
0011 D409 FCBPTR RMB 2
0012 D40B CURFCB RMB 4
0013 D40F ZD40F RMB 2
0014 D411 ZD411 RMB 1
0015 D412 ZD412 RMB 1
0016 D413 ZD413 RMB 1
0017 D414 ZD414 RMB 1
0018 D415 ZD415 RMB 2
0019 D417 ZD417 RMB 1
0020 D418 ZD418 RMB 2
0021 D41A ZD41A RMB 1
0022 D41B ZD41B RMB 2
0023 D41D ZD41D RMB 24
0024 D435 FF VERFLG FCB $FF
0025 *
0026 **
0027 *
0028 D436 BD DE 15 ZD436 JSR >COLDDR
0029 D439 8E D4 09 LDX #FCBPTR
0030 D43C C6 0A LDB #$0A
0031 D43E 8D 11 BSR ZD451
0032 D440 8E 00 05 LDX #Z0005
0033 D443 BF D4 13 STX >ZD413
0034 D446 BF D4 15 STX >ZD415
0035 D449 7F D4 1A CLR >ZD41A
0036 D44C 8E D4 1B ZD44C LDX #ZD41B
0037 D44F C6 1A LDB #$1A
0038 D451 6F 80 ZD451 CLR ,X+
0039 D453 5A DECB
0040 D454 26 FB BNE ZD451
0041 D456 7E C7 0C JMP >PRSPL5
0042
0043 D459 BD C7 09 ZD459 JSR >PRSPL4
0044 D45C BE D4 09 ZD45C LDX >FCBPTR
0045 D45F 27 EB BEQ ZD44C
0046 D461 30 88 E4 LEAX -$1C,X
0047 D464 BF D4 0B STX >CURFCB
0048 D467 34 20 PSHS Y
0049 D469 BD DA C3 JSR >CLOSE
0050 D46C 35 20 PULS Y
0051 D46E 24 EC BCC ZD45C
0052 D470 BE D4 0B LDX >CURFCB
0053 D473 6F 02 CLR $02,X
0054 D475 BD C7 0C JSR >PRSPL5
0055 D478 C6 FF LDB #$FF
0056 D47A 39 RTS
0057
0058 *
0059 ** FMS CALL, PROCESSING
0060 *
0061 D47B 7D CC FC FMS1 TST >ZCCFC
0062 D47E 27 03 BEQ ZD483
0063 D480 BD C7 09 JSR >PRSPL4
0064 D483 34 24 ZD483 PSHS Y,B
0065 D485 BF D4 0B STX >CURFCB
0066 D488 6F 01 CLR $01,X
0067 D48A E6 84 LDB ,X
0068 D48C 26 22 BNE DOFUNC
0069 *
0070 ** READ/WRITE CHAR/BYTE
0071 *
0072 D48E E6 02 LDB $02,X
0073 D490 27 1A BEQ ZD4AC
0074 D492 C1 02 CMPB #$02
0075 D494 27 11 BEQ ZD4A7
0076 D496 BD D5 B4 JSR >ZD5B4
0077 D499 BE D4 0B ZD499 LDX >CURFCB
0078 D49C 25 26 BCS ZD4C4
0079 D49E 7D CC FC TST >ZCCFC
0080 D4A1 26 23 BNE ZD4C6
0081 D4A3 5F CLRB
0082 D4A4 35 24 PULS Y,B
0083 D4A6 39 RTS
0084
0085 D4A7 BD D6 CF ZD4A7 JSR >ZD6CF
0086 D4AA 20 ED BRA ZD499
0087 D4AC C6 12 ZD4AC LDB #$12
0088 D4AE 20 14 BRA ZD4C4
0089
0090 D4B0 C1 16 DOFUNC CMPB #$16
0091 D4B2 23 04 BLS DOFUN1
0092 D4B4 C6 01 LDB #$01
0093 D4B6 20 0C BRA ZD4C4
0094 D4B8 5A DOFUN1 DECB
0095 D4B9 58 ASLB
0096 D4BA 8E D4 CE LDX #FMSTBL
0097 D4BD AD 95 JSR [B,X]
0098 D4BF BE D4 0B LDX >CURFCB
0099 D4C2 24 02 BCC ZD4C6
0100 D4C4 E7 01 ZD4C4 STB $01,X
0101 D4C6 BD C7 0C ZD4C6 JSR >PRSPL5
0102 D4C9 6D 01 TST $01,X
0103 D4CB 35 24 PULS Y,B
0104 D4CD 39 RTS
0105 *
0106 ** FMS COMMAND VECTOR TABLE
0107 *
0108 D4CE D9 86 FMSTBL FDB OPENRD FC 1
0109 D4D0 D9 D9 FDB OPENWR FC 2
0110 D4D2 DA F9 FDB OPENUD FC 3
0111 D4D4 DA C3 FDB CLOSE FC 4
0112 D4D6 D5 E2 FDB REWIND FC 5
0113 D4D8 D8 1D FDB OPNDIR FC 6
0114 D4DA D8 38 FDB GETREC FC 7
0115 D4DC D8 76 FDB PUTREC FC 8
0116 D4DE D6 41 FDB RDSECT FC 9
0117 D4E0 D6 9F FDB WRSECT FC 10
0118 D4E2 D9 69 FDB RESV1 FC 11
0119 D4E4 DB D6 FDB DELETE FC 12
0120 D4E6 DB 2C FDB RENAME FC 13
0121 D4E8 D6 99 FDB RESV2 FC 14
0122 D4EA DA 87 FDB NXTSEC FC 15
0123 D4EC D8 10 FDB OPNREC FC 16
0124 D4EE D5 6F FDB GETBYT FC 17
0125 D4F0 D5 90 FDB PUTBYT FC 18
0126 D4F2 DB 07 FDB RESV3 FC 19
0127 D4F4 DD BD FDB NXTDRV FC 20
0128 D4F6 DC FB FDB POSREC FC 21
0129 D4F8 DC E5 FDB BAKREC FC 22
0130 *
0131 **
0132 *
0133 D4FA 8D 20 ZD4FA BSR ZD51C
0134 D4FC 26 05 BNE ZD503
0135 D4FE C6 02 LDB #$02
0136 D500 1A 01 ORCC #$01
0137 D502 39 RTS
0138
0139 D503 ED 84 ZD503 STD ,X
0140 D505 AE 84 LDX ,X
0141 D507 6F 84 CLR ,X
0142 D509 6F 01 CLR $01,X
0143 D50B 39 RTS
0144
0145 D50C 8D 0E ZD50C BSR ZD51C
0146 D50E 27 05 BEQ ZD515
0147 D510 C6 0D LDB #$0D
0148 D512 1A 01 ORCC #$01
0149 D514 39 RTS
0150
0151 D515 EC 94 ZD515 LDD [,X]
0152 D517 ED 84 STD ,X
0153 D519 1C FE ANDCC #$FE
0154 D51B 39 RTS
0155
0156 D51C FC D4 0B ZD51C LDD >CURFCB
0157 D51F C3 00 1C ADDD #$001C
0158 D522 8E D4 09 LDX #FCBPTR
0159 D525 10 AE 84 ZD525 LDY ,X
0160 D528 26 03 BNE ZD52D
0161 D52A 1C FB ANDCC #$FB
0162 D52C 39 RTS
0163
0164 D52D 10 A3 84 ZD52D CMPD ,X
0165 D530 26 01 BNE ZD533
0166 D532 39 RTS
0167 D533 AE 84 ZD533 LDX ,X
0168 D535 20 EE BRA ZD525
0169
0170 D537 BE D4 0B ZD537 LDX >CURFCB
0171 D53A 4F CLRA
0172 D53B 5F CLRB
0173 D53C 8D 02 BSR ZD540
0174 D53E C6 2F LDB #$2F
0175 D540 A7 88 11 ZD540 STA $11,X
0176 D543 30 01 LEAX $01,X
0177 D545 5A DECB
0178 D546 26 F8 BNE ZD540
0179 D548 39 RTS
0180
0181 D549 BE D4 0B ZD549 LDX >CURFCB
0182 D54C C6 0B LDB #$0B
0183 D54E A6 04 ZD54E LDA $04,X
0184 D550 A7 88 24 STA $24,X
0185 D553 30 01 LEAX $01,X
0186 D555 5A DECB
0187 D556 26 F6 BNE ZD54E
0188 D558 39 RTS
0189
0190 D559 BE D4 0B ZD559 LDX >CURFCB
0191 D55C C6 0B LDB #$0B
0192 D55E A6 04 ZD55E LDA $04,X
0193 D560 34 02 PSHS A
0194 D562 A6 88 24 LDA $24,X
0195 D565 A1 E0 CMPA ,S+
0196 D567 26 05 BNE ZD56E
0197 D569 30 01 LEAX $01,X
0198 D56B 5A DECB
0199 D56C 26 F0 BNE ZD55E
0200 D56E 39 ZD56E RTS
0201 *
0202 ** GET RANDOM BYTE FROM SECTOR
0203 *
0204 D56F BE D4 0B GETBYT LDX >CURFCB
0205 D572 E6 02 LDB $02,X
0206 D574 54 LSRB
0207 D575 24 79 BCC ZD5F0
0208 D577 E6 88 23 LDB $23,X
0209 D57A 7E D6 00 JMP >ZD600
0210
0211 D57D BE D4 0B ZD57D LDX >CURFCB
0212 D580 E6 88 22 LDB $22,X
0213 D583 6C 88 22 INC $22,X
0214 D586 3A ABX
0215 D587 A7 88 40 STA $40,X
0216 D58A 5C INCB
0217 D58B 26 1F BNE ZD5AC
0218 D58D 1A 01 ORCC #$01
0219 D58F 39 RTS
0220 *
0221 ** PUT RANDOM BYTE IN SECTOR
0222 *
0223 D590 BE D4 0B PUTBYT LDX >CURFCB
0224 D593 E6 02 LDB $02,X
0225 D595 C4 03 ANDB #$03
0226 D597 C1 03 CMPB #$03
0227 D599 26 55 BNE ZD5F0
0228 D59B CA 80 ORB #$80
0229 D59D E7 02 STB $02,X
0230 D59F E6 0F LDB $0F,X
0231 D5A1 C5 80 BITB #$80
0232 D5A3 26 0A BNE ZD5AF
0233 D5A5 E6 88 23 LDB $23,X
0234 D5A8 3A ABX
0235 D5A9 A7 88 40 STA $40,X
0236 D5AC 1C FE ZD5AC ANDCC #$FE
0237 D5AE 39 RTS
0238
0239 D5AF C6 0B ZD5AF LDB #$0B
0240 D5B1 1A 01 ORCC #$01
0241 D5B3 39 RTS
0242
0243 D5B4 A6 88 3B ZD5B4 LDA $3B,X
0244 D5B7 2B 3C BMI ZD5F5
0245 D5B9 27 07 BEQ ZD5C2
0246 D5BB 6A 88 3B DEC $3B,X
0247 D5BE 86 20 LDA #$20
0248 D5C0 20 1D BRA ZD5DF
0249
0250 D5C2 8D 31 ZD5C2 BSR ZD5F5
0251 D5C4 25 1B BCS ZD5E1
0252 D5C6 81 18 CMPA #$18
0253 D5C8 22 15 BHI ZD5DF
0254 D5CA 27 F6 BEQ ZD5C2
0255 D5CC 81 09 CMPA #$09
0256 D5CE 26 0C BNE ZD5DC
0257 D5D0 8D 23 BSR ZD5F5
0258 D5D2 25 0D BCS ZD5E1
0259 D5D4 BE D4 0B LDX >CURFCB
0260 D5D7 A7 88 3B STA $3B,X
0261 D5DA 20 D8 BRA ZD5B4
0262
0263 D5DC 4D ZD5DC TSTA
0264 D5DD 27 E3 BEQ ZD5C2
0265 D5DF 1C FE ZD5DF ANDCC #$FE
0266 D5E1 39 ZD5E1 RTS
0267 *
0268 ** REWIND FILE
0269 *
0270 D5E2 BD DA B1 REWIND JSR >ZDAB1
0271 D5E5 25 09 BCS ZD5F0
0272 D5E7 85 01 BITA #$01
0273 D5E9 27 05 BEQ ZD5F0
0274 D5EB A7 84 STA ,X
0275 D5ED 7E D9 A0 JMP >ZD9A0
0276
0277 D5F0 C6 12 ZD5F0 LDB #$12
0278 D5F2 1A 01 ORCC #$01
0279 D5F4 39 RTS
0280
0281 D5F5 BE D4 0B ZD5F5 LDX >CURFCB
0282 D5F8 E6 88 22 LDB $22,X
0283 D5FB 27 0A BEQ ZD607
0284 D5FD 6C 88 22 INC $22,X
0285 D600 3A ZD600 ABX
0286 D601 A6 88 40 LDA $40,X
0287 D604 1C FE ANDCC #$FE
0288 D606 39 RTS
0289
0290 D607 8D 03 ZD607 BSR ZD60C
0291 D609 24 EA BCC ZD5F5
0292 D60B 39 RTS
0293
0294 D60C BE D4 0B ZD60C LDX >CURFCB
0295 D60F EC 88 40 LDD $40,X
0296 D612 6C 88 21 INC $21,X
0297 D615 26 03 BNE ZD61A
0298 D617 6C 88 20 INC $20,X
0299 D61A 10 83 00 00 ZD61A CMPD #$0000
0300 D61E 27 1C BEQ ZD63C
0301 D620 ED 88 1E ZD620 STD $1E,X
0302 D623 34 02 PSHS A
0303 D625 86 04 LDA #$04
0304 D627 A7 88 22 STA $22,X
0305 D62A 35 02 PULS A
0306 D62C 8D 13 BSR RDSECT
0307 D62E 24 10 BCC ZD640
0308 D630 C5 80 BITB #$80
0309 D632 27 04 BEQ ZD638
0310 D634 C6 10 LDB #$10
0311 D636 20 06 BRA ZD63E
0312
0313 D638 C6 09 ZD638 LDB #$09
0314 D63A 20 02 BRA ZD63E
0315
0316 D63C C6 08 ZD63C LDB #$08
0317 D63E 1A 01 ZD63E ORCC #$01
0318 D640 39 ZD640 RTS
0319 *
0320 ** READ SINGLE SECTOR
0321 *
0322 D641 8D 25 RDSECT BSR ZD668
0323 D643 BE D4 0B LDX >CURFCB
0324 D646 BD DE 0C JSR >DRIVE
0325 D649 25 12 BCS ZD65D
0326 D64B 8D 11 ZD64B BSR ZD65E
0327 D64D BD DE 00 JSR >READ
0328 D650 26 03 BNE ZD655
0329 D652 1C FE ANDCC #$FE
0330 D654 39 RTS
0331
0332 D655 34 04 ZD655 PSHS B
0333 D657 8D 17 BSR ZD670
0334 D659 35 04 PULS B
0335 D65B 24 EE BCC ZD64B
0336 D65D 39 ZD65D RTS
0337
0338 D65E BE D4 0B ZD65E LDX >CURFCB
0339 D661 EC 88 1E LDD $1E,X
0340 D664 30 88 40 LEAX $40,X
0341 D667 39 RTS
0342
0343 D668 4F ZD668 CLRA
0344 D669 B7 D4 11 STA >ZD411
0345 D66C B7 D4 12 STA >ZD412
0346 D66F 39 RTS
0347
0348 D670 C5 10 ZD670 BITB #$10
0349 D672 26 11 BNE ZD685
0350 D674 C5 80 BITB #$80
0351 D676 26 24 BNE ZD69C
0352 D678 F6 D4 11 LDB >ZD411
0353 D67B 5C INCB
0354 D67C C1 07 CMPB #$07
0355 D67E 27 05 BEQ ZD685
0356 D680 F7 D4 11 STB >ZD411
0357 D683 20 14 BRA RESV2
0358
0359 D685 7F D4 11 ZD685 CLR >ZD411
0360 D688 F6 D4 12 LDB >ZD412
0361 D68B 5C INCB
0362 D68C C1 04 CMPB #$04
0363 D68E 27 0C BEQ ZD69C
0364 D690 F7 D4 12 STB >ZD412
0365 D693 BE D4 0B LDX >CURFCB
0366 D696 BD DE 09 JSR >RESTOR
0367 *
0368 ** RESERVED
0369 *
0370 D699 1C FE RESV2 ANDCC #$FE
0371 D69B 39 RTS
0372 D69C 1A 01 ZD69C ORCC #$01
0373 D69E 39 RTS
0374 *
0375 ** WRITE SINGLE SECTOR
0376 *
0377 D69F 8D C7 WRSECT BSR ZD668
0378 D6A1 BE D4 0B LDX >CURFCB
0379 D6A4 BD DE 0C JSR >DRIVE
0380 D6A7 25 20 BCS ZD6C9
0381 D6A9 BE D4 0B ZD6A9 LDX >CURFCB
0382 D6AC 8D B0 BSR ZD65E
0383 D6AE BD DE 03 JSR >WRITE
0384 D6B1 26 0A BNE ZD6BD
0385 D6B3 B6 D4 35 LDA >VERFLG
0386 D6B6 27 37 BEQ ZD6EF
0387 D6B8 BD DE 06 JSR >VERIFY
0388 D6BB 27 32 BEQ ZD6EF
0389 D6BD C5 40 ZD6BD BITB #$40
0390 D6BF 26 0B BNE ZD6CC
0391 D6C1 34 04 PSHS B
0392 D6C3 8D AB BSR ZD670
0393 D6C5 35 04 PULS B
0394 D6C7 24 E0 BCC ZD6A9
0395 D6C9 39 ZD6C9 RTS
0396
0397 D6CA C6 20 LDB #$20
0398 D6CC 1A 01 ZD6CC ORCC #$01
0399 D6CE 39 RTS
0400
0401 D6CF BE D4 0B ZD6CF LDX >CURFCB
0402 D6D2 E6 88 3B LDB $3B,X
0403 D6D5 2B 3D BMI ZD714
0404 D6D7 81 20 CMPA #$20
0405 D6D9 26 0F BNE ZD6EA
0406 D6DB 5C INCB
0407 D6DC E7 88 3B STB $3B,X
0408 D6DF C1 7F CMPB #$7F
0409 D6E1 26 0C BNE ZD6EF
0410 D6E3 20 0D BRA ZD6F2
0411
0412 D6E5 8D 0B ZD6E5 BSR ZD6F2
0413 D6E7 24 E6 BCC ZD6CF
0414 D6E9 39 RTS
0415
0416 D6EA 5D ZD6EA TSTB
0417 D6EB 27 27 BEQ ZD714
0418 D6ED 20 F6 BRA ZD6E5
0419
0420 D6EF 1C FE ZD6EF ANDCC #$FE
0421 D6F1 39 RTS
0422
0423 D6F2 34 02 ZD6F2 PSHS A
0424 D6F4 C1 01 CMPB #$01
0425 D6F6 26 04 BNE ZD6FC
0426 D6F8 86 20 LDA #$20
0427 D6FA 20 10 BRA ZD70C
0428
0429 D6FC 86 09 ZD6FC LDA #$09
0430 D6FE 8D 14 BSR ZD714
0431 D700 35 02 PULS A
0432 D702 25 0F BCS ZD713
0433 D704 34 02 PSHS A
0434 D706 BE D4 0B LDX >CURFCB
0435 D709 A6 88 3B LDA $3B,X
0436 D70C 6F 88 3B ZD70C CLR $3B,X
0437 D70F 8D 03 BSR ZD714
0438 D711 35 02 PULS A
0439 D713 39 ZD713 RTS
0440
0441 D714 BE D4 0B ZD714 LDX >CURFCB
0442 D717 E6 02 LDB $02,X
0443 D719 C1 02 CMPB #$02
0444 D71B 10 26 FE D1 LBNE ZD5F0
0445 D71F E6 88 22 LDB $22,X
0446 D722 C1 04 CMPB #$04
0447 D724 26 08 BNE ZD72E
0448 D726 34 02 PSHS A
0449 D728 8D 21 BSR ZD74B
0450 D72A 35 02 PULS A
0451 D72C 25 0F BCS ZD73D
0452 D72E BD D5 7D ZD72E JSR >ZD57D
0453 D731 24 0A BCC ZD73D
0454 D733 C6 04 LDB #$04
0455 D735 BE D4 0B LDX >CURFCB
0456 D738 E7 88 22 STB $22,X
0457 D73B 1C FE ANDCC #$FE
0458 D73D 39 ZD73D RTS
0459
0460 D73E BE D4 0B ZD73E LDX >CURFCB
0461 D741 4F CLRA
0462 D742 5F CLRB
0463 D743 ED 88 20 STD $20,X
0464 D746 ED 88 42 STD $42,X
0465 D749 20 27 BRA ZD772
0466
0467 D74B E6 88 12 ZD74B LDB $12,X
0468 D74E 26 22 BNE ZD772
0469 D750 E6 88 17 LDB $17,X
0470 D753 27 44 BEQ ZD799
0471 D755 6F 88 17 CLR $17,X
0472 D758 8D 3F BSR ZD799
0473 D75A 25 2A BCS ZD786
0474 D75C 8D E0 BSR ZD73E
0475 D75E 25 26 BCS ZD786
0476 D760 8D DC BSR ZD73E
0477 D762 25 22 BCS ZD786
0478 D764 BE D4 0B LDX >CURFCB
0479 D767 C6 02 LDB #$02
0480 D769 E7 88 17 STB $17,X
0481 D76C EC 88 11 LDD $11,X
0482 D76F 7E DC 82 JMP >ZDC82
0483
0484 D772 8D 0E ZD772 BSR ZD782
0485 D774 BE D4 0B LDX >CURFCB
0486 D777 ED 88 40 STD $40,X
0487 D77A BD D6 9F JSR >WRSECT
0488 D77D 24 1A BCC ZD799
0489 D77F 7E DB C1 JMP >ZDBC1
0490
0491 D782 8D 03 ZD782 BSR ZD787
0492 D784 EC 84 LDD ,X
0493 D786 39 ZD786 RTS
0494
0495 D787 BE D4 0B ZD787 LDX >CURFCB
0496 D78A E6 03 LDB $03,X
0497 D78C 86 06 LDA #$06
0498 D78E 3D MUL
0499 D78F 8E D4 1D LDX #ZD41D
0500 D792 3A ABX
0501 D793 BF D4 1B STX >ZD41B
0502 D796 6D 84 TST ,X
0503 D798 39 RTS
0504
0505 D799 8D E7 ZD799 BSR ZD782
0506 D79B 26 05 BNE ZD7A2
0507 D79D C6 07 LDB #$07
0508 D79F 1A 01 ZD79F ORCC #$01
0509 D7A1 39 RTS
0510
0511 D7A2 BE D4 0B ZD7A2 LDX >CURFCB
0512 D7A5 ED 88 13 STD $13,X
0513 D7A8 6D 88 12 TST $12,X
0514 D7AB 26 03 BNE ZD7B0
0515 D7AD ED 88 11 STD $11,X
0516 D7B0 6C 88 16 ZD7B0 INC $16,X
0517 D7B3 26 03 BNE ZD7B8
0518 D7B5 6C 88 15 INC $15,X
0519 D7B8 6D 88 17 ZD7B8 TST $17,X
0520 D7BB 27 0B BEQ ZD7C8
0521 D7BD BD DC 43 JSR >ZDC43
0522 D7C0 25 DD BCS ZD79F
0523 D7C2 BE D4 0B LDX >CURFCB
0524 D7C5 EC 88 13 LDD $13,X
0525 D7C8 BD D6 20 ZD7C8 JSR >ZD620
0526 D7CB 25 D2 BCS ZD79F
0527 D7CD BE D4 0B LDX >CURFCB
0528 D7D0 EC 88 40 LDD $40,X
0529 D7D3 34 06 PSHS B,A
0530 D7D5 8D B0 BSR ZD787
0531 D7D7 35 06 PULS B,A
0532 D7D9 ED 84 STD ,X
0533 D7DB 26 0A BNE ZD7E7
0534 D7DD 6F 02 CLR $02,X
0535 D7DF 6F 03 CLR $03,X
0536 D7E1 6F 04 CLR $04,X
0537 D7E3 6F 05 CLR $05,X
0538 D7E5 20 08 BRA ZD7EF
0539
0540 D7E7 10 AE 04 ZD7E7 LDY $04,X
0541 D7EA 31 3F LEAY -$01,Y
0542 D7EC 10 AF 04 STY $04,X
0543 D7EF 4F ZD7EF CLRA
0544 D7F0 BE D4 0B LDX >CURFCB
0545 D7F3 6C 88 21 INC $21,X
0546 D7F6 26 03 BNE ZD7FB
0547 D7F8 6C 88 20 INC $20,X
0548 D7FB 5F ZD7FB CLRB
0549 D7FC A7 88 40 ZD7FC STA $40,X
0550 D7FF 30 01 LEAX $01,X
0551 D801 5A DECB
0552 D802 26 F8 BNE ZD7FC
0553 D804 BE D4 0B LDX >CURFCB
0554 D807 EC 88 20 LDD $20,X
0555 D80A ED 88 42 STD $42,X
0556 D80D 1C FE ANDCC #$FE
0557 D80F 39 RTS
0558 *
0559 ** OPEN SYSTEM INFO. RECORD
0560 *
0561 D810 5F OPNREC CLRB
0562 D811 34 04 PSHS B
0563 D813 C6 03 LDB #$03
0564 D815 20 0E BRA ZD825
0565 D817 BE D4 15 LDX >ZD415
0566 D81A BF D4 13 STX >ZD413
0567 D81D F6 D4 13 OPNDIR LDB >ZD413
0568 D820 34 04 PSHS B
0569 D822 F6 D4 14 LDB >ZD414
0570 D825 BE D4 0B ZD825 LDX >CURFCB
0571 D828 E7 88 41 STB $41,X
0572 D82B 35 04 PULS B
0573 D82D E7 88 40 STB $40,X
0574 D830 7F D4 18 CLR >ZD418
0575 D833 5F CLRB
0576 D834 E7 88 22 STB $22,X
0577 D837 39 RTS
0578 *
0579 ** GET INFO RECORD
0580 *
0581 D838 BE D4 0B GETREC LDX >CURFCB
0582 D83B E6 88 22 LDB $22,X
0583 D83E 26 1D BNE ZD85D
0584 D840 BD D6 0C JSR >ZD60C
0585 D843 25 30 BCS ZD875
0586 D845 BE D4 0B LDX >CURFCB
0587 D848 7D D4 18 TST >ZD418
0588 D84B 26 05 BNE ZD852
0589 D84D DC 44 LDD <Z0044
0590 D84F FD D4 18 STD >ZD418
0591 D852 86 10 ZD852 LDA #$10
0592 D854 A7 88 22 STA $22,X
0593 D857 EC 88 1E LDD $1E,X
0594 D85A ED 88 2F STD $2F,X
0595 D85D A6 88 22 ZD85D LDA $22,X
0596 D860 A7 88 31 STA $31,X
0597 D863 C6 18 LDB #$18
0598 D865 34 14 ZD865 PSHS X,B
0599 D867 BD D5 F5 JSR >ZD5F5
0600 D86A 35 14 PULS X,B
0601 D86C A7 04 STA $04,X
0602 D86E 30 01 LEAX $01,X
0603 D870 5A DECB
0604 D871 26 F2 BNE ZD865
0605 D873 1C FE ANDCC #$FE
0606 D875 39 ZD875 RTS
0607 *
0608 ** PUT INFORMATION RECORD
0609 *
0610 D876 BE D4 0B PUTREC LDX >CURFCB
0611 D879 A6 88 31 LDA $31,X
0612 D87C A7 88 22 STA $22,X
0613 D87F C6 18 LDB #$18
0614 D881 34 14 ZD881 PSHS X,B
0615 D883 A6 04 LDA $04,X
0616 D885 BD D7 14 JSR >ZD714
0617 D888 35 14 PULS X,B
0618 D88A 30 01 LEAX $01,X
0619 D88C 5A DECB
0620 D88D 26 F2 BNE ZD881
0621 D88F 7E D6 9F JMP >WRSECT
0622
0623 D892 BE D4 0B ZD892 LDX >CURFCB
0624 D895 A6 03 LDA $03,X
0625 D897 A7 88 23 STA $23,X
0626 D89A B6 D4 17 LDA >ZD417
0627 D89D 7D D4 1A TST >ZD41A
0628 D8A0 26 31 BNE ZD8D3
0629 D8A2 A7 03 STA $03,X
0630 D8A4 BE D4 15 LDX >ZD415
0631 D8A7 BF D4 13 STX >ZD413
0632 D8AA 8C 00 05 ZD8AA CMPX #Z0005
0633 D8AD 27 0C BEQ ZD8BB
0634 D8AF 8D 22 BSR ZD8D3
0635 D8B1 23 37 BLS ZD8EA
0636 D8B3 BE D4 18 LDX >ZD418
0637 D8B6 BF D4 13 STX >ZD413
0638 D8B9 20 EF BRA ZD8AA
0639
0640 D8BB BE D4 0B ZD8BB LDX >CURFCB
0641 D8BE A6 88 23 LDA $23,X
0642 D8C1 A7 03 STA $03,X
0643 D8C3 2A 0E BPL ZD8D3
0644 D8C5 BD DD BD ZD8C5 JSR >NXTDRV
0645 D8C8 25 36 BCS ZD900
0646 D8CA 8D 07 BSR ZD8D3
0647 D8CC 23 1C BLS ZD8EA
0648 D8CE BD DD AD JSR >ZDDAD
0649 D8D1 20 F2 BRA ZD8C5
0650
0651 D8D3 BE D4 0B ZD8D3 LDX >CURFCB
0652 D8D6 7F D4 1A CLR >ZD41A
0653 D8D9 BD D5 49 JSR >ZD549
0654 D8DC BD D8 1D JSR >OPNDIR
0655 D8DF BD D8 38 ZD8DF JSR >GETREC
0656 D8E2 24 07 BCC ZD8EB
0657 D8E4 C1 08 CMPB #$08
0658 D8E6 27 18 BEQ ZD900
0659 D8E8 1A 01 ORCC #$01
0660 D8EA 39 ZD8EA RTS
0661
0662 D8EB BE D4 0B ZD8EB LDX >CURFCB
0663 D8EE A6 04 LDA $04,X
0664 D8F0 27 0C BEQ ZD8FE
0665 D8F2 2A 02 BPL ZD8F6
0666 D8F4 8D 0F BSR ZD905
0667 D8F6 BD D5 59 ZD8F6 JSR >ZD559
0668 D8F9 26 E4 BNE ZD8DF
0669 D8FB 1C FE ANDCC #$FE
0670 D8FD 39 RTS
0671
0672 D8FE 8D 05 ZD8FE BSR ZD905
0673 D900 1C FB ZD900 ANDCC #$FB
0674 D902 1C FE ANDCC #$FE
0675 D904 39 RTS
0676
0677 D905 A6 88 33 ZD905 LDA $33,X
0678 D908 26 0C BNE ZD916
0679 D90A EC 88 2F LDD $2F,X
0680 D90D ED 88 32 STD $32,X
0681 D910 A6 88 31 LDA $31,X
0682 D913 A7 88 34 STA $34,X
0683 D916 39 ZD916 RTS
0684
0685 D917 BD D7 87 ZD917 JSR >ZD787
0686 D91A 26 17 BNE ZD933
0687 D91C 8D 18 BSR ZD936
0688 D91E 25 15 BCS ZD935
0689 D920 C6 06 LDB #$06
0690 D922 10 BE D4 0B LDY >CURFCB
0691 D926 BE D4 1B LDX >ZD41B
0692 D929 A6 A8 5D ZD929 LDA $5D,Y
0693 D92C 31 21 LEAY $01,Y
0694 D92E A7 80 STA ,X+
0695 D930 5A DECB
0696 D931 26 F6 BNE ZD929
0697 D933 1C FE ZD933 ANDCC #$FE
0698 D935 39 ZD935 RTS
0699
0700 D936 BD D8 10 ZD936 JSR >OPNREC
0701 D939 BD D6 0C JSR >ZD60C
0702 D93C 25 08 BCS ZD946
0703 D93E BE D4 0B LDX >CURFCB
0704 D941 C6 10 LDB #$10
0705 D943 E7 88 22 STB $22,X
0706 D946 39 ZD946 RTS
0707
0708 D947 BD D7 87 ZD947 JSR >ZD787
0709 D94A 8D EA BSR ZD936
0710 D94C 25 F8 BCS ZD946
0711 D94E C6 06 LDB #$06
0712 D950 10 BE D4 0B LDY >CURFCB
0713 D954 BE D4 1B LDX >ZD41B
0714 D957 A6 80 ZD957 LDA ,X+
0715 D959 A7 A8 5D STA $5D,Y
0716 D95C 31 21 LEAY $01,Y
0717 D95E 5A DECB
0718 D95F 26 F6 BNE ZD957
0719 D961 BD D6 9F JSR >WRSECT
0720 D964 24 E0 BCC ZD946
0721 D966 7E DB C1 JMP >ZDBC1
0722 *
0723 **
0724 *
0725 D969 BE D4 0B RESV1 LDX >CURFCB
0726 D96C 86 02 LDA #$02
0727 D96E A7 02 STA $02,X
0728 D970 EC 88 2F LDD $2F,X
0729 D973 ED 88 1E STD $1E,X
0730 D976 BD D6 41 JSR >RDSECT
0731 D979 25 08 BCS ZD983
0732 D97B BD D8 76 JSR >PUTREC
0733 D97E 24 05 BCC ZD985
0734 D980 7E DB C1 JMP >ZDBC1
0735
0736 D983 C6 0A ZD983 LDB #$0A
0737 D985 39 ZD985 RTS
0738 *
0739 ** OPEN FOR READ
0740 *
0741 D986 BD D4 FA OPENRD JSR >ZD4FA
0742 D989 25 3D BCS ZD9C8
0743 D98B BD D8 92 JSR >ZD892
0744 D98E 25 38 BCS ZD9C8
0745 D990 26 3B BNE ZD9CD
0746 D992 BE D4 0B LDX >CURFCB
0747 D995 7D D4 1A TST >ZD41A
0748 D998 27 06 BEQ ZD9A0
0749 D99A A6 0F LDA $0F,X
0750 D99C 85 20 BITA #$20
0751 D99E 26 29 BNE ZD9C9
0752 D9A0 BD DC C0 ZD9A0 JSR >ZDCC0
0753 D9A3 25 2A BCS ZD9CF
0754 D9A5 EC 88 11 LDD $11,X
0755 D9A8 ED 88 40 STD $40,X
0756 D9AB BD DA 76 JSR >ZDA76
0757 D9AE E6 88 17 LDB $17,X
0758 D9B1 27 13 BEQ ZD9C6
0759 D9B3 34 04 ZD9B3 PSHS B
0760 D9B5 BD D6 0C JSR >ZD60C
0761 D9B8 35 04 PULS B
0762 D9BA 25 0C BCS ZD9C8
0763 D9BC 5A DECB
0764 D9BD 26 F4 BNE ZD9B3
0765 D9BF BE D4 0B LDX >CURFCB
0766 D9C2 5F CLRB
0767 D9C3 E7 88 22 STB $22,X
0768 D9C6 1C FE ZD9C6 ANDCC #$FE
0769 D9C8 39 ZD9C8 RTS
0770
0771 D9C9 C6 11 ZD9C9 LDB #$11
0772 D9CB 20 02 BRA ZD9CF
0773
0774 D9CD C6 04 ZD9CD LDB #$04
0775 D9CF 34 04 ZD9CF PSHS B
0776 D9D1 BD D5 0C JSR >ZD50C
0777 D9D4 35 04 PULS B
0778 D9D6 1A 01 ORCC #$01
0779 D9D8 39 RTS
0780
0781 D9D9 BE D4 0B OPENWR LDX >CURFCB
0782 D9DC 6D 03 TST $03,X
0783 D9DE 2A 08 BPL ZD9E8
0784 D9E0 BD DD BD JSR >NXTDRV
0785 D9E3 24 03 BCC ZD9E8
0786 D9E5 C6 10 LDB #$10
0787 D9E7 39 RTS
0788
0789 D9E8 BD D4 FA ZD9E8 JSR >ZD4FA
0790 D9EB 25 E2 BCS ZD9CF
0791 D9ED BD D5 37 JSR >ZD537
0792 D9F0 BD D9 17 JSR >ZD917
0793 D9F3 25 DA BCS ZD9CF
0794 D9F5 BD D8 92 JSR >ZD892
0795 D9F8 25 D5 BCS ZD9CF
0796 D9FA 26 04 BNE ZDA00
0797 D9FC C6 03 LDB #$03
0798 D9FE 20 CF BRA ZD9CF
0799
0800 DA00 BD DC C0 ZDA00 JSR >ZDCC0
0801 DA03 25 CA BCS ZD9CF
0802 DA05 BE D4 0B LDX >CURFCB
0803 DA08 C6 0A LDB #$0A
0804 DA0A 6F 0F ZDA0A CLR $0F,X
0805 DA0C 30 01 LEAX $01,X
0806 DA0E 5A DECB
0807 DA0F 26 F9 BNE ZDA0A
0808 DA11 BE D4 0B LDX >CURFCB
0809 DA14 EC 88 32 LDD $32,X
0810 DA17 27 27 BEQ ZDA40
0811 DA19 ED 88 2F STD $2F,X
0812 DA1C A6 88 34 LDA $34,X
0813 DA1F A7 88 31 STA $31,X
0814 DA22 FC CC 0E LDD >DATERG
0815 DA25 ED 88 19 STD $19,X
0816 DA28 B6 CC 10 LDA >YEAR
0817 DA2B A7 88 1B STA $1B,X
0818 DA2E BD DD AD JSR >ZDDAD
0819 DA31 BD D9 69 JSR >RESV1
0820 DA34 25 99 BCS ZD9CF
0821 DA36 8D 3E BSR ZDA76
0822 DA38 86 04 LDA #$04
0823 DA3A A7 88 22 STA $22,X
0824 DA3D 1C FE ANDCC #$FE
0825 DA3F 39 RTS
0826
0827 DA40 BE D4 0B ZDA40 LDX >CURFCB
0828 DA43 6F 88 17 CLR $17,X
0829 DA46 6C 88 12 INC $12,X
0830 DA49 EC 88 2F LDD $2F,X
0831 DA4C BD D6 20 JSR >ZD620
0832 DA4F 25 0D BCS ZDA5E
0833 DA51 BD D7 72 JSR >ZD772
0834 DA54 25 08 BCS ZDA5E
0835 DA56 BD D6 9F JSR >WRSECT
0836 DA59 24 06 BCC ZDA61
0837 DA5B BD DB C1 JSR >ZDBC1
0838 DA5E 7E D9 CF ZDA5E JMP >ZD9CF
0839
0840 DA61 BE D4 0B ZDA61 LDX >CURFCB
0841 DA64 EC 88 1E LDD $1E,X
0842 DA67 ED 88 32 STD $32,X
0843 DA6A 86 10 LDA #$10
0844 DA6C A7 88 34 STA $34,X
0845 DA6F BD D9 47 JSR >ZD947
0846 DA72 25 EA BCS ZDA5E
0847 DA74 20 8A BRA ZDA00
0848
0849 DA76 BE D4 0B ZDA76 LDX >CURFCB
0850 DA79 A6 84 LDA ,X
0851 DA7B A7 02 STA $02,X
0852 DA7D 6F 84 CLR ,X
0853 DA7F 6F 88 3B CLR $3B,X
0854 DA82 4F CLRA
0855 DA83 A7 88 22 STA $22,X
0856 DA86 39 RTS
0857 *
0858 ** READ/WRITE NEXT SECTOR
0859 *
0860 DA87 8D 28 NXTSEC BSR ZDAB1
0861 DA89 25 0E BCS ZDA99
0862 DA8B 6F 84 CLR ,X
0863 DA8D 44 LSRA
0864 DA8E 10 25 FB 7A LBCS ZD60C
0865 DA92 C6 04 LDB #$04
0866 DA94 E7 88 22 STB $22,X
0867 DA97 1C FE ANDCC #$FE
0868 DA99 39 ZDA99 RTS
0869
0870 DA9A BE D4 0B ZDA9A LDX >CURFCB
0871 DA9D A6 02 LDA $02,X
0872 DA9F 81 83 CMPA #$83
0873 DAA1 26 0B BNE ZDAAE
0874 DAA3 86 03 LDA #$03
0875 DAA5 A7 02 STA $02,X
0876 DAA7 BD D6 9F ZDAA7 JSR >WRSECT
0877 DAAA 10 25 01 13 LBCS ZDBC1
0878 DAAE 1C FE ZDAAE ANDCC #$FE
0879 DAB0 39 RTS
0880
0881 DAB1 8D E7 ZDAB1 BSR ZDA9A
0882 DAB3 25 0D BCS ZDAC2
0883 DAB5 BE D4 0B LDX >CURFCB
0884 DAB8 A6 02 LDA $02,X
0885 DABA 81 03 CMPA #$03
0886 DABC 23 F0 BLS ZDAAE
0887 DABE C6 12 LDB #$12
0888 DAC0 1A 01 ORCC #$01
0889 DAC2 39 ZDAC2 RTS
0890
0891 DAC3 8D EC CLOSE BSR ZDAB1
0892 DAC5 25 31 BCS ZDAF8
0893 DAC7 81 02 CMPA #$02
0894 DAC9 27 08 BEQ ZDAD3
0895 DACB BE D4 0B ZDACB LDX >CURFCB
0896 DACE 6F 02 CLR $02,X
0897 DAD0 7E D5 0C JMP >ZD50C
0898
0899 DAD3 A6 88 12 ZDAD3 LDA $12,X
0900 DAD6 26 05 BNE ZDADD
0901 DAD8 BD DB A7 JSR >ZDBA7
0902 DADB 20 19 BRA ZDAF6
0903
0904 DADD 8D C8 ZDADD BSR ZDAA7
0905 DADF 25 17 BCS ZDAF8
0906 DAE1 BE D4 0B LDX >CURFCB
0907 DAE4 6D 88 17 TST $17,X
0908 DAE7 27 05 BEQ ZDAEE
0909 DAE9 BD DC 98 JSR >ZDC98
0910 DAEC 25 0A BCS ZDAF8
0911 DAEE BD D9 69 ZDAEE JSR >RESV1
0912 DAF1 25 05 BCS ZDAF8
0913 DAF3 BD D9 47 JSR >ZD947
0914 DAF6 24 D3 ZDAF6 BCC ZDACB
0915 DAF8 39 ZDAF8 RTS
0916 *
0917 ** OPEN FOR UPDATE
0918 *
0919 DAF9 BD D9 86 OPENUD JSR >OPENRD
0920 DAFC 25 28 BCS ZDB26
0921 DAFE BD D6 0C JSR >ZD60C
0922 DB01 25 23 BCS ZDB26
0923 DB03 86 03 LDA #$03
0924 DB05 20 18 BRA ZDB1F
0925 *
0926 **
0927 *
0928 DB07 BD D9 86 RESV3 JSR >OPENRD
0929 DB0A 25 1A BCS ZDB26
0930 DB0C BE D4 0B LDX >CURFCB
0931 DB0F A6 0F LDA $0F,X
0932 DB11 85 80 BITA #$80
0933 DB13 26 12 BNE ZDB27
0934 DB15 EC 88 13 LDD $13,X
0935 DB18 BD D6 20 JSR >ZD620
0936 DB1B 25 09 BCS ZDB26
0937 DB1D 86 02 LDA #$02
0938 DB1F BE D4 0B ZDB1F LDX >CURFCB
0939 DB22 A7 02 STA $02,X
0940 DB24 1C FE ANDCC #$FE
0941 DB26 39 ZDB26 RTS
0942
0943 DB27 C6 0B ZDB27 LDB #$0B
0944 DB29 1A 01 ORCC #$01
0945 DB2B 39 RTS
0946 *
0947 ** RENAME FILE
0948 *
0949 DB2C 8D 35 RENAME BSR ZDB63
0950 DB2E BD D8 92 JSR >ZD892
0951 DB31 25 2A BCS ZDB5D
0952 DB33 27 24 BEQ ZDB59
0953 DB35 BE D4 0B LDX >CURFCB
0954 DB38 C6 0B LDB #$0B
0955 DB3A A6 88 24 ZDB3A LDA $24,X
0956 DB3D A7 04 STA $04,X
0957 DB3F 30 01 LEAX $01,X
0958 DB41 5A DECB
0959 DB42 26 F6 BNE ZDB3A
0960 DB44 8D 4D BSR ZDB93
0961 DB46 25 15 BCS ZDB5D
0962 DB48 BE D4 0B LDX >CURFCB
0963 DB4B A6 0F LDA $0F,X
0964 DB4D 85 80 BITA #$80
0965 DB4F 26 D6 BNE ZDB27
0966 DB51 85 60 BITA #$60
0967 DB53 26 09 BNE ZDB5E
0968 DB55 8D 0C BSR ZDB63
0969 DB57 20 55 BRA ZDBAE
0970
0971 DB59 C6 03 ZDB59 LDB #$03
0972 DB5B 1A 01 ORCC #$01
0973 DB5D 39 ZDB5D RTS
0974 DB5E C6 0C ZDB5E LDB #$0C
0975 DB60 1A 01 ORCC #$01
0976 DB62 39 RTS
0977
0978 DB63 BE D4 0B ZDB63 LDX >CURFCB
0979 DB66 86 0B LDA #$0B
0980 DB68 B7 D4 11 STA >ZD411
0981 DB6B A6 04 ZDB6B LDA $04,X
0982 DB6D E6 88 35 LDB $35,X
0983 DB70 A7 88 35 STA $35,X
0984 DB73 E7 04 STB $04,X
0985 DB75 30 01 LEAX $01,X
0986 DB77 7A D4 11 DEC >ZD411
0987 DB7A 26 EF BNE ZDB6B
0988 DB7C BE D4 0B LDX >CURFCB
0989 DB7F A6 0C LDA $0C,X
0990 DB81 26 0C BNE ZDB8F
0991 DB83 C6 03 LDB #$03
0992 DB85 A6 88 3D ZDB85 LDA $3D,X
0993 DB88 A7 0C STA $0C,X
0994 DB8A 30 01 LEAX $01,X
0995 DB8C 5A DECB
0996 DB8D 26 F6 BNE ZDB85
0997 DB8F BE D4 0B ZDB8F LDX >CURFCB
0998 DB92 39 RTS
0999
1000 DB93 8D CE ZDB93 BSR ZDB63
1001 DB95 BD D8 92 ZDB95 JSR >ZD892
1002 DB98 25 07 BCS ZDBA1
1003 DB9A 26 06 BNE ZDBA2
1004 DB9C BE D4 0B LDX >CURFCB
1005 DB9F 1C FE ANDCC #$FE
1006 DBA1 39 ZDBA1 RTS
1007
1008 DBA2 C6 04 ZDBA2 LDB #$04
1009 DBA4 1A 01 ORCC #$01
1010 DBA6 39 RTS
1011
1012 DBA7 BE D4 0B ZDBA7 LDX >CURFCB
1013 DBAA 86 FF LDA #$FF
1014 DBAC A7 04 STA $04,X
1015 DBAE BD D9 69 ZDBAE JSR >RESV1
1016 DBB1 BE D4 0B LDX >CURFCB
1017 DBB4 86 00 LDA #$00
1018 DBB6 A7 02 STA $02,X
1019 DBB8 39 RTS
1020
1021 DBB9 ED 88 40 ZDBB9 STD $40,X
1022 DBBC BD D6 9F JSR >WRSECT
1023 DBBF 24 14 BCC ZDBD5
1024 DBC1 C5 40 ZDBC1 BITB #$40
1025 DBC3 26 08 BNE ZDBCD
1026 DBC5 C5 80 BITB #$80
1027 DBC7 27 0A BEQ ZDBD3
1028 DBC9 C6 10 LDB #$10
1029 DBCB 20 06 BRA ZDBD3
1030 DBCD C6 0B ZDBCD LDB #$0B
1031 DBCF 20 02 BRA ZDBD3
1032
1033 DBD1 C6 0A LDB #$0A
1034 DBD3 1A 01 ZDBD3 ORCC #$01
1035 DBD5 39 ZDBD5 RTS
1036 *
1037 ** DELETE FILE
1038 *
1039 DBD6 BD D9 17 DELETE JSR >ZD917
1040 DBD9 25 5E BCS ZDC39
1041 DBDB 8D B8 BSR ZDB95
1042 DBDD 25 5A BCS ZDC39
1043 DBDF BE D4 0B LDX >CURFCB
1044 DBE2 A6 0F LDA $0F,X
1045 DBE4 85 80 BITA #$80
1046 DBE6 26 52 BNE ZDC3A
1047 DBE8 85 60 BITA #$60
1048 DBEA 26 52 BNE ZDC3E
1049 DBEC BD D7 87 JSR >ZD787
1050 DBEF BE D4 1B LDX >ZD41B
1051 DBF2 EC 02 LDD $02,X
1052 DBF4 26 0F BNE ZDC05
1053 DBF6 BE D4 0B LDX >CURFCB
1054 DBF9 EC 88 11 LDD $11,X
1055 DBFC 27 33 BEQ ZDC31
1056 DBFE BE D4 1B LDX >ZD41B
1057 DC01 ED 84 STD ,X
1058 DC03 20 14 BRA ZDC19
1059
1060 DC05 BE D4 0B ZDC05 LDX >CURFCB
1061 DC08 BD D6 20 JSR >ZD620
1062 DC0B 25 2C BCS ZDC39
1063 DC0D BE D4 0B LDX >CURFCB
1064 DC10 EC 88 11 LDD $11,X
1065 DC13 27 1C BEQ ZDC31
1066 DC15 8D A2 BSR ZDBB9
1067 DC17 25 20 BCS ZDC39
1068 DC19 BE D4 0B ZDC19 LDX >CURFCB
1069 DC1C EC 88 13 LDD $13,X
1070 DC1F BE D4 1B LDX >ZD41B
1071 DC22 ED 02 STD $02,X
1072 DC24 BE D4 0B LDX >CURFCB
1073 DC27 EC 88 15 LDD $15,X
1074 DC2A BE D4 1B LDX >ZD41B
1075 DC2D E3 04 ADDD $04,X
1076 DC2F ED 04 STD $04,X
1077 DC31 BD DB A7 ZDC31 JSR >ZDBA7
1078 DC34 25 03 BCS ZDC39
1079 DC36 BD D9 47 JSR >ZD947
1080 DC39 39 ZDC39 RTS
1081
1082 DC3A C6 0B ZDC3A LDB #$0B
1083 DC3C 20 02 BRA ZDC40
1084 DC3E C6 0C ZDC3E LDB #$0C
1085 DC40 1A 01 ZDC40 ORCC #$01
1086 DC42 39 RTS
1087
1088 DC43 EC 88 1E ZDC43 LDD $1E,X
1089 DC46 5C INCB
1090 DC47 E1 88 3C CMPB $3C,X
1091 DC4A 23 03 BLS ZDC4F
1092 DC4C C6 01 LDB #$01
1093 DC4E 4C INCA
1094 DC4F 10 A3 88 13 ZDC4F CMPD $13,X
1095 DC53 26 0E BNE ZDC63
1096 DC55 A6 88 37 LDA $37,X
1097 DC58 81 FF CMPA #$FF
1098 DC5A 27 07 BEQ ZDC63
1099 DC5C 4C INCA
1100 DC5D A7 88 37 STA $37,X
1101 DC60 1C FE ANDCC #$FE
1102 DC62 39 RTS
1103
1104 DC63 8D 33 ZDC63 BSR ZDC98
1105 DC65 25 30 BCS ZDC97
1106 DC67 BE D4 0B LDX >CURFCB
1107 DC6A A6 88 3A LDA $3A,X
1108 DC6D 8B 03 ADDA #$03
1109 DC6F 26 16 BNE ZDC87
1110 DC71 EC 88 1E LDD $1E,X
1111 DC74 10 A3 88 11 CMPD $11,X
1112 DC78 27 05 BEQ ZDC7F
1113 DC7A C6 17 LDB #$17
1114 DC7C 1A 01 ORCC #$01
1115 DC7E 39 RTS
1116
1117 DC7F EC 88 40 ZDC7F LDD $40,X
1118 DC82 ED 88 38 ZDC82 STD $38,X
1119 DC85 86 04 LDA #$04
1120 DC87 A7 88 3A ZDC87 STA $3A,X
1121 DC8A EC 88 13 LDD $13,X
1122 DC8D ED 88 35 STD $35,X
1123 DC90 86 01 LDA #$01
1124 DC92 A7 88 37 STA $37,X
1125 DC95 1C FE ANDCC #$FE
1126 DC97 39 ZDC97 RTS
1127
1128 DC98 EC 88 38 ZDC98 LDD $38,X
1129 DC9B BD D6 20 JSR >ZD620
1130 DC9E 25 F7 BCS ZDC97
1131 DCA0 BE D4 0B LDX >CURFCB
1132 DCA3 1F 12 TFR X,Y
1133 DCA5 E6 88 3A LDB $3A,X
1134 DCA8 3A ABX
1135 DCA9 C6 03 LDB #$03
1136 DCAB A6 A8 35 ZDCAB LDA $35,Y
1137 DCAE 31 21 LEAY $01,Y
1138 DCB0 A7 88 40 STA $40,X
1139 DCB3 30 01 LEAX $01,X
1140 DCB5 5A DECB
1141 DCB6 26 F3 BNE ZDCAB
1142 DCB8 BD D6 9F JSR >WRSECT
1143 DCBB 24 DA BCC ZDC97
1144 DCBD 7E DB C1 JMP >ZDBC1
1145
1146 DCC0 BD D8 10 ZDCC0 JSR >OPNREC
1147 DCC3 BD D6 0C JSR >ZD60C
1148 DCC6 25 46 BCS ZDD0E
1149 DCC8 BE D4 0B LDX >CURFCB
1150 DCCB 4F CLRA
1151 DCCC 5F CLRB
1152 DCCD ED 88 20 STD $20,X
1153 DCD0 A6 88 67 LDA $67,X
1154 DCD3 A7 88 3C STA $3C,X
1155 DCD6 5F CLRB
1156 DCD7 6F 88 40 ZDCD7 CLR $40,X
1157 DCDA 30 01 LEAX $01,X
1158 DCDC 5A DECB
1159 DCDD 26 F8 BNE ZDCD7
1160 DCDF BE D4 0B LDX >CURFCB
1161 DCE2 1C FE ANDCC #$FE
1162 DCE4 39 RTS
1163 *
1164 ** BACKUP ONE RECORD
1165 *
1166 DCE5 BE D4 0B BAKREC LDX >CURFCB
1167 DCE8 A6 88 17 LDA $17,X
1168 DCEB 27 1D BEQ ZDD0A
1169 DCED EC 88 20 LDD $20,X
1170 DCF0 83 00 01 SUBD #$0001
1171 DCF3 2A 03 BPL ZDCF8
1172 DCF5 7E DD 9A JMP >ZDD9A
1173 *
1174 ** POSITION TO RECORD N
1175 *
1176 DCF8 ED 88 20 ZDCF8 STD $20,X
1177 DCFB BD DA B1 POSREC JSR >ZDAB1
1178 DCFE 25 0E BCS ZDD0E
1179 DD00 46 RORA
1180 DD01 24 07 BCC ZDD0A
1181 DD03 6F 84 CLR ,X
1182 DD05 A6 88 17 LDA $17,X
1183 DD08 26 05 BNE ZDD0F
1184 DD0A C6 12 ZDD0A LDB #$12
1185 DD0C 1A 01 ORCC #$01
1186 DD0E 39 ZDD0E RTS
1187
1188 DD0F 7F D4 11 ZDD0F CLR >ZD411
1189 DD12 EC 88 11 LDD $11,X
1190 DD15 10 AE 88 20 LDY $20,X
1191 DD19 27 6A BEQ ZDD85
1192 DD1B BD DD 9F JSR >ZDD9F
1193 DD1E 25 EE BCS ZDD0E
1194 DD20 4F CLRA
1195 DD21 5F CLRB
1196 DD22 6D 02 ZDD22 TST $02,X
1197 DD24 27 74 BEQ ZDD9A
1198 DD26 EB 02 ADDB $02,X
1199 DD28 89 00 ADCA #$00
1200 DD2A BF D4 0F STX >ZD40F
1201 DD2D BE D4 0B LDX >CURFCB
1202 DD30 10 A3 88 20 CMPD $20,X
1203 DD34 24 2C BCC ZDD62
1204 DD36 BE D4 0F LDX >ZD40F
1205 DD39 30 03 LEAX $03,X
1206 DD3B 34 02 PSHS A
1207 DD3D B6 D4 11 LDA >ZD411
1208 DD40 4C INCA
1209 DD41 B7 D4 11 STA >ZD411
1210 DD44 81 54 CMPA #$54
1211 DD46 27 08 BEQ ZDD50
1212 DD48 81 A8 CMPA #$A8
1213 DD4A 35 02 PULS A
1214 DD4C 27 4C BEQ ZDD9A
1215 DD4E 20 D2 BRA ZDD22
1216
1217 DD50 34 04 ZDD50 PSHS B
1218 DD52 BE D4 0B LDX >CURFCB
1219 DD55 EC 88 40 LDD $40,X
1220 DD58 8D 45 BSR ZDD9F
1221 DD5A 25 3E BCS ZDD9A
1222 DD5C 35 04 PULS B
1223 DD5E 35 02 PULS A
1224 DD60 20 C0 BRA ZDD22
1225
1226 DD62 A3 88 20 ZDD62 SUBD $20,X
1227 DD65 BE D4 0F LDX >ZD40F
1228 DD68 A6 02 LDA $02,X
1229 DD6A 34 04 PSHS B
1230 DD6C A0 E0 SUBA ,S+
1231 DD6E 4A DECA
1232 DD6F 1F 89 TFR A,B
1233 DD71 A6 84 LDA ,X
1234 DD73 EB 01 ADDB $01,X
1235 DD75 BE D4 0B LDX >CURFCB
1236 DD78 25 05 BCS ZDD7F
1237 DD7A E1 88 3C ZDD7A CMPB $3C,X
1238 DD7D 23 06 BLS ZDD85
1239 DD7F E0 88 3C ZDD7F SUBB $3C,X
1240 DD82 4C INCA
1241 DD83 20 F5 BRA ZDD7A
1242
1243 DD85 BD D6 20 ZDD85 JSR >ZD620
1244 DD88 25 14 BCS ZDD9E
1245 DD8A BE D4 0B LDX >CURFCB
1246 DD8D EC 88 42 LDD $42,X
1247 DD90 10 A3 88 20 CMPD $20,X
1248 DD94 27 14 BEQ ZDDAA
1249 DD96 C6 19 LDB #$19
1250 DD98 20 02 BRA ZDD9C
1251
1252 DD9A C6 18 ZDD9A LDB #$18
1253 DD9C 1A 01 ZDD9C ORCC #$01
1254 DD9E 39 ZDD9E RTS
1255
1256 DD9F BD D6 20 ZDD9F JSR >ZD620
1257 DDA2 25 08 BCS ZDDAC
1258 DDA4 BE D4 0B LDX >CURFCB
1259 DDA7 C6 44 LDB #$44
1260 DDA9 3A ABX
1261 DDAA 1C FE ZDDAA ANDCC #$FE
1262 DDAC 39 ZDDAC RTS
1263
1264 DDAD BE D4 0B ZDDAD LDX >CURFCB
1265 DDB0 C6 0B LDB #$0B
1266 DDB2 A6 88 24 ZDDB2 LDA $24,X
1267 DDB5 A7 04 STA $04,X
1268 DDB7 30 01 LEAX $01,X
1269 DDB9 5A DECB
1270 DDBA 26 F6 BNE ZDDB2
1271 DDBC 39 RTS
1272 *
1273 ** FIND NEXT DRIVE
1274 *
1275 DDBD BE D4 0B NXTDRV LDX >CURFCB
1276 DDC0 A6 03 LDA $03,X
1277 DDC2 4C INCA
1278 DDC3 81 04 CMPA #$04
1279 DDC5 24 0F BCC ZDDD6
1280 DDC7 A7 03 STA $03,X
1281 DDC9 26 05 BNE ZDDD0
1282 DDCB BD DE 0F JSR >DRVRDY
1283 DDCE 20 03 BRA ZDDD3
1284
1285 DDD0 BD DE 12 ZDDD0 JSR >QUICK
1286 DDD3 25 E8 ZDDD3 BCS NXTDRV
1287 DDD5 39 RTS
1288
1289 DDD6 C6 10 ZDDD6 LDB #$10
1290 DDD8 1A 01 ORCC #$01
1291 DDDA 39 RTS
0011 END
0000 INCLUDE "f9-monex.txt"
0001 *
0002 ** FLEX 9 DISK DRIVERS
0003 *
0004 * FOR SYS09BUG ON THE
0005 * DIGILENT SPARTAN 3 STARTER BOARD AND
0006 * TERASIC CYCLONE 2 DE1 BOARD
0007 * WITH I/O MAPPED AT $XE000
0008 * AND ROM MAPPED AT $XF000
0009 * THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
0010 * THE TERASIC CYCLONE 2 DE1 BOARD HAS 512KBYTE OF SRAM
0011 * THE FIRST 64K IS USED BY FLEX,
0012 * THE SECOND 128K IS USED AS A ROM DISK
0013 * THE REMAINING RAM IS USED FOR A RAM DISK
0014 *
0015 *
0016 0001 CFLAG EQU $01 CARRY FLAG
0017 0002 VFLAG EQU $02 OVERFLOW FLAG
0018 0004 ZFLAG EQU $04 ZERO FLAG
0019 0008 NFLAG EQU $08 NEGATIVE FLAG
0020 0010 IFLAG EQU $10 IRQ MASK CC
0021 0020 HFLAG EQU $20 HALF CARRY
0022 0040 FFLAG EQU $40 FIRQ MASK CC
0023 0080 EFLAG EQU $80 ENTIRE FLAG
0024 *
0025 0000 MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
0026 FFF0 DATREG EQU IC11 DAT REGISTERS
0027 *
0028 * Serial Port
0029 *
0030 E000 ACIAC1 EQU ACIAS
0031 E001 ACIAD1 EQU ACIAS+1
0032 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50)
0033 *
0034 * XMODEM Control characters
0035 *
0036 0001 SOH EQU $01
0037 0004 EOT EQU $04
0038 0006 ACK EQU $06
0039 0015 NAK EQU $15
0040 0018 CAN EQU $18
0041 *
0042 * DRIVE GEOMETRY
0043 *
0044 000E EMAXSEC EQU 14 ROM DISK
0045 0030 EMAXTRK EQU 48 3 * 16 * 14 * 256 = 172,032 Bytes
0046 0292 ETOTSEC EQU EMAXTRK*EMAXSEC-EMAXSEC
0047 *
0048 000E RMAXSEC EQU 14 RAM DISK
0049 *RMAXTRK EQU 192 12 * 16 * 14 * 256 = 688,128 Bytes Digilent Spartan 3
0050 0040 RMAXTRK EQU 64 4 * 16 * 14 * 256 = 229,376 Bytes Terasic Cyclone 2
0051 0372 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
0052 *
0053 * DRIVE TYPES
0054 *
0055 0000 DTYPROM EQU 0 ROM DISK
0056 0001 DTYPRAM EQU 1 RAM DISK
0057 0002 DTYPFLS EQU 2 FLASH DISK
0058 0003 DTYPNET EQU 3 FLEXNET DISK
0059 *
0060 DE00 ORG $DE00
0061 *
0062 * DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
0063 * Disk driver for RAM Disk.
0064 *
0065 * 14 SECTORS PER TRACK
0066 * 16 * N TRACKS PER DISK
0067 *
0068 * ROM DISK OCCUPIES $10000 - $1E000 ... $30000 - $3E000
0069 * RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
0070 * Track Buffer page mapped at $E000 - $EFFF
0071 * MAPPAG = $00 = 0 x $1000 (4 K pages)
0072
0073 * ON SWTPC ROM AT $XF000 AND IO AT $XE000
0074 * APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
0075 * WHEN USING RAM AS A RAMDISK.
0076 * THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT
0077 * THE LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE
0078 * THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
0079 *
0080 *
0081 *
0082 * FLEX disk jump table.
0083 *
0084 DE00 7E F0 57 READ JMP READSC
0085 DE03 7E F0 5B WRITE JMP WRITSC
0086 DE06 7E F0 5F VERIFY JMP BUSY
0087 DE09 7E F0 63 RESTOR JMP RESTR1
0088 DE0C 7E F0 6C DRIVE JMP DRVSEL
0089 DE0F 7E F0 9F DRVRDY JMP CHKRDY
0090 DE12 7E F0 A3 QUICK JMP CHKQIK
0091 DE15 7E F0 A7 COLDDR JMP DINIT
0092 DE18 7E F0 BF WARMDR JMP DWARM
0093 DE1B 7E F0 C3 SEEK JMP SEEKTS
0094 *
0095 * RAM SPACE
0096 *
0097 DE1E 00 DRVNUM FCB 0
0098 DE1F 00 TRACK FCB 0
0099 DE20 00 SECTOR FCB 0
0100 DE21 00 CHKSUM FCB 0
0101 DE22 00 CCSAVE FCB 0
0102 DE23 00 BLKNUM FCB 0 Xmodem block number
0103 DE24 00 BYTCNT FCB 0 Xmodem byte count
0104 DE25 00 00 XSTATE FDB 0 Xmodem State Vector
0105 DE27 00 00 00 DELCNT FCB $00,$00,$00 Xmodem Poll timer
0106 *
0107 * Disc driver type table.
0108 * Indexed by drive number
0109 *
0110 DE2A 00 DTYPTAB FCB DTYPROM Drive 0 (ROM Disk)
0111 DE2B 01 FCB DTYPRAM Drive 1 (RAM Disk)
0112 DE2C 02 FCB DTYPFLS Drive 2 (FLASH Disk)
0113 DE2D 03 FCB DTYPNET Drive 3 (NETPC Disk)
0114 *
0115 * RAM Disk offset
0116 * Indexed by drive type
0117 *
0118 DE2E 10 DOFFTAB FCB $10 ROM Disk $10000
0119 DE2F 40 FCB $40 RAM DISK $40000
0120 DE30 FF FCB $FF Flash Disk
0121 DE31 FF FCB $FF NETPC Disk
0122 *
0123 DE32 REAVEC RMB 2 Disc driver jump table.
0124 DE34 WRIVEC RMB 2
0125 DE36 VERVEC RMB 2
0126 DE38 RSTVEC RMB 2
0127 DE3A DRVVEC RMB 2
0128 DE3C CHKVEC RMB 2
0129 DE3E QUIVEC RMB 2
0130 DE40 INIVEC RMB 2
0131 DE42 WARVEC RMB 2
0132 DE44 SEEVEC RMB 2
0133 *
0134 * SECTOR BUFFER
0135 *
0136 DE46 BUFFER RMB 256
0137 DF46 SYNCREG RMB 4 Prom input register
0138 *
0139 ****************************************
0140 *
0141 * START OF EXTENSION COMMANDS
0142 *
0143 ****************************************
0144 *
0145 F000 ORG MONEXT
0146 F000 F7 BD FDB NEXTEXT Jump to next extended command
0147 *
0148 *
0149 *****************************************
0150 * Disk drivers *
0151 * ------------ *
0152 * The system dependant code for the *
0153 * disc drivers fits here. Two tables *
0154 * must be included. These are DTYPTAB a *
0155 * four byte table that defines which of *
0156 * the (up to four) following sets of *
0157 * jump tables to use, and TABSRT the *
0158 * jump tables themselves. For a full *
0159 * description of the floppy drivers see *
0160 * section 4 (pp9-14) of the general *
0161 * Flex adaptation guide. *
0162 *****************************************
0163 *
0164 * Mass storage drivers for embedded applications.
0165 *
0166 * Jump tables.
0167 F002 F1 19 TABSRT FDB EREAD Drive type 0 (ROM disk).
0168 F004 F1 41 FDB EWRITE
0169 F006 F1 3F FDB ECHECK
0170 F008 F1 3F FDB ECHECK
0171 F00A F1 3F FDB ECHECK
0172 F00C F1 3F FDB ECHECK
0173 F00E F1 3F FDB ECHECK
0174 F010 F0 52 FDB DDUMMY
0175 F012 F0 52 FDB DDUMMY
0176 F014 F0 52 FDB DDUMMY
0177 *
0178 F016 F1 19 FDB EREAD Drive type 1 (RAM disk).
0179 F018 F1 41 FDB EWRITE
0180 F01A F1 3F FDB ECHECK
0181 F01C F1 3F FDB ECHECK
0182 F01E F1 3F FDB ECHECK
0183 F020 F1 3F FDB ECHECK
0184 F022 F1 3F FDB ECHECK
0185 F024 F0 52 FDB DDUMMY
0186 F026 F0 52 FDB DDUMMY
0187 F028 F0 52 FDB DDUMMY
0188 *
0189 F02A F0 52 FDB DDUMMY Drive type 2 (External Flash disk).
0190 F02C F0 52 FDB DDUMMY
0191 F02E F0 52 FDB DDUMMY
0192 F030 F0 52 FDB DDUMMY
0193 F032 F0 52 FDB DDUMMY
0194 F034 F0 52 FDB DDUMMY
0195 F036 F0 52 FDB DDUMMY
0196 F038 F0 52 FDB DDUMMY
0197 F03A F0 52 FDB DDUMMY
0198 F03C F0 52 FDB DDUMMY
0199 *
0200 F03E F1 7A FDB NREAD Drive type 3 (NetPC drive via serial port).
0201 F040 F1 E9 FDB NWRITE
0202 F042 F2 49 FDB NVERIFY
0203 F044 F2 4E FDB NCHECK
0204 F046 F2 4E FDB NCHECK
0205 F048 F2 4E FDB NCHECK
0206 F04A F2 4E FDB NCHECK
0207 F04C F0 52 FDB DDUMMY
0208 F04E F0 52 FDB DDUMMY
0209 F050 F0 52 FDB DDUMMY
0210 *
0211 *
0212 * Dummy routine (no errors).
0213 F052 5F DDUMMY CLRB
0214 F053 5D TSTB Set (z)=1
0215 F054 1C FE ANDCC #$FF-CFLAG Set (c)=0
0216 F056 39 RTS
0217 * *
0218 **************************
0219 * Main Flex entry points *
0220 *************************
0221 *
0222 * Read sector routine.
0223 * Entry: (X) = address where sector is to be placed.
0224 * (A) = Track number.
0225 * (B) = Sector number.
0226 * Exit: (B) = Error code (z)=1 if no error.
0227 F057 6E 9F DE 32 READSC JMP [REAVEC]
0228 *
0229 * Write track routine.
0230 * Entry: (X) = Address of area of memory from which the data will be taken.
0231 * (A) = Track number.
0232 * (B) = Sector number.
0233 * Exit: (B) = Error condition, (Z)=1 no an error.
0234 F05B 6E 9F DE 34 WRITSC JMP [WRIVEC]
0235 *
0236 * Verify sector routine.
0237 * Entry: no parameters.
0238 * Exit: (B) = Error condition (Z)=1 if no error.
0239 F05F 6E 9F DE 36 BUSY JMP [VERVEC]
0240 *
0241 * Restore drive to track 00.
0242 * Entry: (X) = FCB address (3,X contains drive number).
0243 * Exit: (B) = Error condition, (Z)=1 if no error.
0244 F063 8D 07 RESTR1 BSR DRVSEL Select drive first.
0245 F065 27 01 BEQ RST1
0246 F067 39 RTS
0247 F068 6E 9F DE 38 RST1 JMP [RSTVEC]
0248 *
0249 * Select current drive.
0250 * Entry: (X) = FCB address (3,X contains drive number).
0251 * Exit: (B) = Error condition, (Z)=0 and (c)=1 if error.
0252 * (B) = $0F if non existant drive.
0253 F06C 34 30 DRVSEL PSHS X,Y
0254 F06E E6 03 LDB 3,X Get driver type.
0255 F070 F7 DE 1E STB DRVNUM
0256 F073 8E DE 2A LDX #DTYPTAB
0257 F076 A6 85 LDA B,X
0258 F078 81 FF CMPA #$FF Is the drive nonexistant?
0259 F07A 26 08 BNE DRIVE1
0260 F07C 35 30 PULS X,Y
0261 F07E C6 0F LDB #$0F
0262 F080 5D TSTB
0263 F081 1A 01 ORCC #$01
0264 F083 39 RTS
0265 *
0266 F084 C6 14 DRIVE1 LDB #20 Get correct table start address.
0267 F086 3D MUL
0268 F087 8E F0 02 LDX #TABSRT
0269 F08A 30 8B LEAX D,X
0270 F08C 10 8E DE 32 LDY #REAVEC Copy table into ram.
0271 F090 C6 14 LDB #20
0272 F092 A6 80 DRIVE2 LDA 0,X+
0273 F094 A7 A0 STA 0,Y+
0274 F096 5A DECB
0275 F097 26 F9 BNE DRIVE2
0276 F099 35 30 PULS X,Y
0277 F09B 6E 9F DE 3A JMP [DRVVEC]
0278 *
0279 * Check for drive ready.
0280 * Entry: (X) = FCB address (3,X contains drive number)>
0281 * Exit: (B) = Error condition, (Z)=0 AND (C)=1 if drive is not ready.
0282 F09F 6E 9F DE 3C CHKRDY JMP [CHKVEC]
0283 *
0284 * Quick drive ready check.
0285 * Entry: (X) = FCB address (3,X contains drive number).
0286 * Exit: (B) = Error condition, (Z)=0 AND (c)=1 if drive not ready.
0287 F0A3 6E 9F DE 3E CHKQIK JMP [QUIVEC]
0288 *
0289 * Init (cold start).
0290 * Entry: no parameters.
0291 * Exit: no change.
0292 F0A7 4F DINIT CLRA
0293 F0A8 B7 DE 1E DINIT1 STA DRVNUM Init each valid drive in turn.
0294 F0AB 8E DE 1B LDX #DRVNUM-3
0295 F0AE 8D BC BSR DRVSEL
0296 F0B0 25 04 BCS DINIT2
0297 F0B2 AD 9F DE 40 JSR [INIVEC]
0298 F0B6 B6 DE 1E DINIT2 LDA DRVNUM
0299 F0B9 4C INCA
0300 F0BA 81 04 CMPA #4
0301 F0BC 26 EA BNE DINIT1
0302 F0BE 39 RTS
0303 *
0304 * Warm start.
0305 * Entry: no parameters.
0306 * Exit: no change.
0307 F0BF 6E 9F DE 42 DWARM JMP [WARVEC]
0308 *
0309 * Seek track.
0310 * Entry: (A) = Track number.
0311 * (B) = Sector number.
0312 * Exit: (B) = Error condition, (Z)=1 if no error.
0313 F0C3 6E 9F DE 44 SEEKTS JMP [SEEVEC]
0314 *
0315 *
0316 *****************************************************
0317 * ROMdisk drivers *
0318 * --------------- *
0319 * Drivers to support a ROMdisk in the external RAM *
0320 * of the SYS09. The ROMdisk base address is $10000 *
0321 *****************************************************
0322 * Dummy return for ROM disk (write protected!)
0323 *
0324 * MAP RAM DISK INTO MEMORY SPACE
0325 *
0326 F0C7 1F A8 MAPIN TFR CC,A ; Save state of interrupt masks
0327 F0C9 B7 DE 22 STA CCSAVE
0328 F0CC 1A 50 ORCC #FFLAG+IFLAG ; Mask interrupts while IO mapped out
0329 F0CE CE DE 2A LDU #DTYPTAB ; Point to Drive Type table
0330 F0D1 F6 DE 1E LDB DRVNUM ; Get working drive number
0331 F0D4 E6 C5 LDB B,U
0332 F0D6 CE DE 2E LDU #DOFFTAB
0333 F0D9 B6 DE 1F LDA TRACK
0334 F0DC AB C5 ADDA B,U ; Add Base offset into RAM
0335 F0DE 84 F0 ANDA #$F0 ; Mask MSN
0336 F0E0 A7 E2 STA ,-S ; Save A on stack
0337 *
0338 F0E2 B6 DE 20 LDA SECTOR
0339 F0E5 80 01 SUBA #1 ; Sectors 1 to 14 => 0 to 13
0340 F0E7 88 0F EORA #$0F ; Complement LSNybble
0341 F0E9 84 0F ANDA #$0F
0342 *
0343 F0EB AB E0 ADDA ,S+ ; Add sector to LSN of Track and pop
0344 F0ED B7 FF F0 STA DATREG+MAPPAG
0345 *
0346 F0F0 B6 DE 1F LDA TRACK ; LSN of Track indexes into 4K page
0347 F0F3 84 0F ANDA #$0F
0348 F0F5 8B 00 ADDA #MAPPAG*16
0349 F0F7 5F CLRB
0350 F0F8 1F 03 TFR D,U
0351 F0FA 39 RTS
0352 *
0353 * MAP RAM DISK OUT OF MEMORY
0354 *
0355 F0FB 86 00 MAPOUT LDA #MAPPAG ; Point to the Flex page
0356 F0FD 88 0F EORA #$0F ; Complement LSNybble
0357 F0FF B7 FF F0 STA DATREG+MAPPAG ; map in Flex page
0358 F102 B6 DE 22 LDA CCSAVE ; restore interrupt masks
0359 F105 1F 8A TFR A,CC
0360 F107 39 RTS
0361 *
0362 * Seek track and sector
0363 * A holds track number (0-32)
0364 * B holds sector number (1-14)
0365 *
0366 F108 B7 DE 1F ESEEK STA TRACK
0367 F10B F7 DE 20 STB SECTOR
0368 F10E 1C FE ANDCC #$FE ; CLEAR CARRY
0369 F110 1A 04 ORCC #$04 ; SET Z
0370 F112 39 RTS
0371 *
0372 * MARK DISK READ ONLY
0373 *
0374 F113 C6 40 EDUMMY LDB #$40
0375 F115 5D TSTB
0376 F116 1A 01 ORCC #$01
0377 F118 39 RTS
0378 *
0379 F119 34 70 EREAD PSHS X,Y,U push sequentialy to preserve order on stack
0380 F11B 17 FF EA LBSR ESEEK
0381 F11E 17 FF A6 LBSR MAPIN build external ram address
0382 *
0383 F121 10 8E DE 46 LDY #BUFFER
0384 F125 5F CLRB
0385 F126 A6 C0 ERLOOP1 LDA 0,U+ move 256 bytes to buffer from external RAM
0386 F128 A7 A0 STA 0,Y+
0387 F12A 5A DECB
0388 F12B 26 F9 BNE ERLOOP1
0389 *
0390 F12D 17 FF CB LBSR MAPOUT
0391 *
0392 F130 10 8E DE 46 LDY #BUFFER
0393 F134 5F CLRB
0394 F135 A6 A0 ERLOOP2 LDA 0,Y+ move 256 bytes from buffer to Flex RAM
0395 F137 A7 80 STA 0,X+
0396 F139 5A DECB
0397 F13A 26 F9 BNE ERLOOP2
0398 *
0399 F13C 5F CLRB
0400 F13D 35 F0 PULS X,Y,U,PC restore all registers
0401 *
0402 * check for marker bytes $AA55 in first bytes of first track/sector
0403 *
0404 *ECHECK CLRA
0405 * LDB #1
0406 * LDX #BUFFER
0407 * BSR EREAD
0408 * LDD BUFFER
0409 * CMPD #$AA55
0410 * BNE EERR
0411 * LBRA DDUMMY
0412 *EERR LDB #$80 not ready bit set
0413 * TSTB
0414 * ORCC #$01
0415 * RTS
0416 F13F 5F ECHECK CLRB
0417 F140 39 RTS
0418 *
0419 * Write Sector
0420 *
0421 F141 34 70 EWRITE PSHS X,Y,U
0422 F143 17 FF C2 LBSR ESEEK
0423 F146 CE DE 2A LDU #DTYPTAB ; Point to Drive Type table
0424 F149 F6 DE 1E LDB DRVNUM ; Get working drive number
0425 F14C E6 C5 LDB B,U ; Fetch Drive type
0426 F14E C1 01 CMPB #DTYPRAM ; Is it a RAM Disk ?
0427 F150 27 07 BEQ EWOK ; Yep, can write to it
0428 F152 C1 00 CMPB #DTYPROM ; Allow writes to ROM Disk too
0429 F154 27 03 BEQ EWOK
0430 F156 16 FF BA LBRA EDUMMY ; Nope report read only
0431 *
0432 F159 10 8E DE 46 EWOK LDY #BUFFER
0433 F15D 5F CLRB
0434 F15E A6 80 EWLOOP1 LDA 0,X+ move 256 bytes to buffer from Flex RAM
0435 F160 A7 A0 STA 0,Y+
0436 F162 5A DECB
0437 F163 26 F9 BNE EWLOOP1
0438 *
0439 F165 17 FF 5F LBSR MAPIN
0440 *
0441 F168 10 8E DE 46 LDY #BUFFER
0442 F16C 5F CLRB
0443 F16D A6 A0 EWLOOP2 LDA 0,Y+ move 256 bytes from buffer to external RAM
0444 F16F A7 C0 STA 0,U+
0445 F171 5A DECB
0446 F172 26 F9 BNE EWLOOP2
0447 *
0448 F174 17 FF 84 LBSR MAPOUT
0449 *
0450 F177 5F CLRB
0451 F178 35 F0 PULS X,Y,U,PC
0452 *
0453 *
0454 *****************************************************
0455 * FlexNet drivers *
0456 * --------------- *
0457 * Drivers to support a remote connection via the *
0458 * serial port using the FlexNet protocol as defined *
0459 * in FLEXNet_421B *
0460 *****************************************************
0461 *
0462 *
0463 * read sector from remote drive
0464 *
0465 F17A 34 04 NREAD PSHS B
0466 F17C 34 02 PSHS A
0467 F17E 7F DE 21 CLR CHKSUM clear checksum
0468 F181 7F DE 22 CLR CHKSUM+1
0469 *
0470 F184 86 73 LDA #'s Send read sector command
0471 F186 BD F2 85 JSR SCHAR
0472 F189 24 4C BCC NRD_DNR if timeout, then flag drive not ready
0473 *
0474 F18B B6 DE 1E LDA DRVNUM send drive
0475 F18E BD F2 85 JSR SCHAR
0476 F191 24 44 BCC NRD_DNR
0477 *
0478 F193 35 02 PULS A send track
0479 F195 BD F2 85 JSR SCHAR
0480 F198 24 3D BCC NRD_DNR
0481 *
0482 F19A 35 02 PULS A send sector
0483 F19C BD F2 85 JSR SCHAR
0484 F19F 24 36 BCC NRD_DNR
0485 *
0486 * transfer 256 bytes
0487 F1A1 5F CLRB
0488 F1A2 BD F2 67 NREAD1 JSR RCHAR read byte
0489 F1A5 24 30 BCC NRD_DNR if timeout, then flag drive not ready
0490 F1A7 A7 80 STA 0,X+
0491 F1A9 BB DE 22 ADDA CHKSUM+1 update checksum
0492 F1AC B7 DE 22 STA CHKSUM+1
0493 F1AF 24 03 BCC NREAD2
0494 F1B1 7C DE 21 INC CHKSUM
0495 F1B4 5A NREAD2 DECB
0496 F1B5 26 EB BNE NREAD1
0497 *
0498 * compare checksums
0499 F1B7 BD F2 67 JSR RCHAR get checksum msb
0500 F1BA 24 1B BCC NRD_DNR
0501 F1BC 34 02 PSHS A
0502 F1BE BD F2 67 JSR RCHAR get checksum lsb
0503 F1C1 24 14 BCC NRD_DNR
0504 F1C3 1F 89 TFR A,B
0505 F1C5 35 02 PULS A
0506 F1C7 10 B3 DE 21 CMPD CHKSUM compare checksums
0507 F1CB 26 0E BNE NRD_ERR if checksum error, then flag crc read error
0508 *
0509 F1CD 86 06 LDA #ACK no checksum error, send ACK char
0510 F1CF BD F2 85 JSR SCHAR
0511 F1D2 24 03 BCC NRD_DNR
0512 F1D4 5F CLRB all OK, flag no error
0513 F1D5 20 0D BRA NRD_END
0514 *
0515 F1D7 C6 10 NRD_DNR LDB #16 flag drive not ready
0516 F1D9 20 09 BRA NRD_END
0517 *
0518 F1DB 86 15 NRD_ERR LDA #NAK send NAK
0519 F1DD BD F2 85 JSR SCHAR
0520 F1E0 24 F5 BCC NRD_DNR
0521 F1E2 C6 09 LDB #09 flag crc read error
0522 *
0523 F1E4 F7 DE 21 NRD_END STB CHKSUM used by VERIFY
0524 F1E7 5D TSTB
0525 F1E8 39 RTS
0526 *
0527 *
0528 * write sector to remote drive
0529 *
0530 F1E9 34 04 NWRITE PSHS B
0531 F1EB 34 02 PSHS A
0532 F1ED 7F DE 21 CLR CHKSUM clear checksum
0533 F1F0 7F DE 22 CLR CHKSUM+1
0534 *
0535 F1F3 86 72 LDA #'r Send write sector command
0536 F1F5 BD F2 85 JSR SCHAR
0537 F1F8 24 DD BCC NRD_DNR if timeout, then flag drive not ready
0538 *
0539 F1FA B6 DE 1E LDA DRVNUM send drive
0540 F1FD BD F2 85 JSR SCHAR
0541 F200 24 D5 BCC NRD_DNR
0542 *
0543 F202 35 02 PULS A send track
0544 F204 BD F2 85 JSR SCHAR
0545 F207 24 CE BCC NRD_DNR
0546 *
0547 F209 35 02 PULS A send sector
0548 F20B BD F2 85 JSR SCHAR
0549 F20E 24 C7 BCC NRD_DNR
0550 *
0551 * transfer 256 bytes
0552 F210 5F CLRB
0553 F211 A6 80 NWRITE1 LDA 0,X+
0554 F213 BD F2 85 JSR SCHAR write byte
0555 F216 24 BF BCC NRD_DNR if timeout, then flag drive not ready
0556 F218 BB DE 22 ADDA CHKSUM+1 update checksum
0557 F21B B7 DE 22 STA CHKSUM+1
0558 F21E 24 03 BCC NWRITE2
0559 F220 7C DE 21 INC CHKSUM
0560 F223 5A NWRITE2 DECB
0561 F224 26 EB BNE NWRITE1
0562 *
0563 * compare checksums
0564 F226 B6 DE 21 LDA CHKSUM
0565 F229 BD F2 85 JSR SCHAR send checksum msb
0566 F22C 24 A9 BCC NRD_DNR
0567 F22E B6 DE 22 LDA CHKSUM+1
0568 F231 BD F2 85 JSR SCHAR send checksum lsb
0569 F234 24 A1 BCC NRD_DNR
0570 *
0571 F236 BD F2 67 JSR RCHAR get checksum response
0572 F239 24 9C BCC NRD_DNR
0573 F23B 81 06 CMPA #ACK
0574 F23D 26 03 BNE NWR_ERR if checksum error, then flag write error
0575 *
0576 F23F 5F CLRB all OK, flag no error
0577 F240 20 02 BRA NWR_END
0578 *
0579 F242 C6 0A NWR_ERR LDB #10 flag write error
0580 *
0581 F244 F7 DE 21 NWR_END STB CHKSUM used by VERIFY
0582 F247 5D TSTB
0583 F248 39 RTS
0584 *
0585 *
0586 * verify last sector written to remote drive
0587 *
0588 F249 F6 DE 21 NVERIFY LDB CHKSUM test last checksum
0589 F24C 5D TSTB
0590 F24D 39 RTS
0591 *
0592 *
0593 * quck check and check drive ready
0594 *
0595 F24E 86 51 NCHECK LDA #'Q quick check command
0596 F250 BD F2 85 JSR SCHAR
0597 F253 24 0C BCC NCK_ERR if timeout, then flag drive not ready
0598
0599 F255 BD F2 67 JSR RCHAR get response from host
0600 F258 24 07 BCC NCK_ERR
0601 F25A 81 06 CMPA #ACK
0602 F25C 26 03 BNE NCK_ERR if NAK, then flag drive not ready
0603
0604 F25E 5F CLRB all OK, flag drive ready
0605 F25F 20 04 BRA NCK_END
0606 *
0607 F261 C6 10 NCK_ERR LDB #16 report drive not ready
0608 F263 1A 01 ORCC #$01 check needs carry set as well
0609 *
0610 F265 5D NCK_END TSTB
0611 F266 39 RTS
0612 *
0613 *
0614 * recieve char from remote drive.
0615 * timeout if no response for approx 1s.
0616 * Entry: no parameters
0617 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
0618 *
0619 F267 34 30 RCHAR PSHS X,Y
0620 *
0621 F269 8E 03 E8 LDX #1000 1000x inner loop
0622 F26C 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
0623 F270 B6 E0 00 RCHAR2 LDA ACIAC1 test for recieved char
0624 F273 47 ASRA
0625 F274 25 0A BCS RCHAR3 get character
0626 F276 31 3F LEAY -1,Y else, continue to count delay
0627 F278 26 F6 BNE RCHAR2
0628 F27A 30 1F LEAX -1,X
0629 F27C 26 EE BNE RCHAR1
0630 F27E 35 B0 PULS X,Y,PC return with error if timed out
0631 *
0632 F280 B6 E0 01 RCHAR3 LDA ACIAD1 return data (carry bit still set)
0633 F283 35 B0 PULS X,Y,PC
0634 *
0635 *
0636 * transmit char to remote drive.
0637 * timeout if no response for approx 1s. (allows for use of hardware flow control)
0638 * Entry: (A) = char to transmit
0639 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
0640 *
0641 F285 34 30 SCHAR PSHS X,Y
0642 F287 34 02 PSHS A
0643 *
0644 F289 8E 03 E8 LDX #1000 1000x inner loop
0645 F28C 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
0646 F290 B6 E0 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO
0647 F293 47 ASRA
0648 F294 47 ASRA
0649 F295 25 0C BCS SCHAR3 send character
0650 F297 31 3F LEAY -1,Y else, continue to count delay
0651 F299 26 F5 BNE SCHAR2
0652 F29B 30 1F LEAX -1,X
0653 F29D 26 ED BNE SCHAR1
0654 F29F 35 02 PULS A
0655 F2A1 35 B0 PULS X,Y,PC return with error if timed out
0656 *
0657 F2A3 35 02 SCHAR3 PULS A
0658 F2A5 B7 E0 01 STA ACIAD1 send data (carry bit still set)
0659 F2A8 35 B0 PULS X,Y,PC
0660 *
0661 ** 'UF' Format RAMdisc to FLEX standard.
0662 *
0663 F2AA 0A 0D DISFOS FCB $0A,$0D
0664 F2AC 46 6F 72 6D 61 74 FCC 'Formating RAMdisk... '
69 6E 67 20 52 41
4D 64 69 73 6B 2E
2E 2E 20
0665 F2C1 04 FCB 4
0666 F2C2 0A 0D 04 MESS6 FCB $0A,$0D,4
0667 F2C5 52 61 6D 64 69 73 FCC 'Ramdisk not allocated! '
6B 20 6E 6F 74 20
61 6C 6C 6F 63 61
74 65 64 21 20
0668 F2DC 04 FCB 4
0669 *
0670 F2DD 8E F2 AA UFSUB LDX #DISFOS
0671 F2E0 BD F4 6A JSR PDATA1
0672 F2E3 8E DE 2A LDX #DTYPTAB search for allocated ramdisk
0673 F2E6 5F CLRB
0674 F2E7 A6 85 FMT9 LDA B,X
0675 F2E9 81 01 CMPA #DTYPRAM driver type 1 is ramdisk
0676 F2EB 27 0C BEQ FFOUND
0677 F2ED 5C INCB
0678 F2EE C1 04 CMPB #4 end of table? then not allocated.
0679 F2F0 26 F5 BNE FMT9
0680 F2F2 8E F2 C2 LDX #MESS6
0681 F2F5 BD F4 6A JSR PDATA1
0682 F2F8 39 RTS
0683 *
0684 F2F9 F7 DE 1E FFOUND STB DRVNUM
0685 F2FC 8E DE 1B LDX #DRVNUM-3
0686 F2FF BD F0 6C JSR DRVSEL
0687 *
0688 * set up free chain
0689 *
0690 F302 8E DE 46 LDX #BUFFER clear out buffer
0691 F305 4F CLRA
0692 F306 5F CLRB
0693 F307 A7 80 DFL1 STA 0,X+
0694 F309 5A DECB
0695 F30A 26 FB BNE DFL1
0696 *
0697 F30C 7F DE 1F CLR TRACK
0698 F30F 86 01 LDA #1
0699 F311 B7 DE 20 STA SECTOR
0700 F314 8E DE 46 DFL2 LDX #BUFFER
0701 F317 B6 DE 1F LDA TRACK
0702 F31A A7 84 STA 0,X
0703 F31C B6 DE 20 LDA SECTOR
0704 F31F 4C INCA
0705 F320 81 0F CMPA #RMAXSEC+1 last sector on track?
0706 F322 26 04 BNE DFL3
0707 F324 6C 84 INC 0,X
0708 F326 86 01 LDA #1
0709 F328 A7 01 DFL3 STA 1,X
0710 F32A B6 DE 1F LDA TRACK
0711 F32D F6 DE 20 LDB SECTOR
0712 F330 BD F0 5B JSR WRITSC
0713 F333 7C DE 20 INC SECTOR
0714 F336 B6 DE 20 LDA SECTOR
0715 F339 81 0F CMPA #RMAXSEC+1
0716 F33B 26 D7 BNE DFL2
0717 F33D 86 01 LDA #1
0718 F33F B7 DE 20 STA SECTOR
0719 F342 7C DE 1F INC TRACK
0720 F345 B6 DE 1F LDA TRACK
0721 F348 81 40 CMPA #RMAXTRK
0722 F34A 26 C8 BNE DFL2
0723 * break free chain at last track/sector
0724 F34C 8E DE 46 LDX #BUFFER
0725 F34F 86 3F LDA #RMAXTRK-1
0726 F351 C6 0E LDB #RMAXSEC
0727 F353 BD F0 57 JSR READSC
0728 F356 8E DE 46 LDX #BUFFER
0729 F359 6F 84 CLR 0,X
0730 F35B 6F 01 CLR 1,X
0731 F35D 86 3F LDA #RMAXTRK-1
0732 F35F C6 0E LDB #RMAXSEC
0733 F361 BD F0 5B JSR WRITSC
0734 * set up sector structure, SIR, directory etc
0735 F364 8E DE 46 LDX #BUFFER
0736 F367 4F CLRA
0737 F368 C6 0E LDB #RMAXSEC
0738 F36A BD F0 57 JSR READSC
0739 F36D 8E DE 46 LDX #BUFFER
0740 F370 6F 84 CLR 0,X break end of directory chain
0741 F372 6F 01 CLR 1,X
0742 F374 4F CLRA
0743 F375 C6 0E LDB #RMAXSEC
0744 F377 BD F0 5B JSR WRITSC
0745 *
0746 F37A 8E DE 46 LDX #BUFFER
0747 F37D 4F CLRA
0748 F37E C6 03 LDB #3 set up SIR
0749 F380 BD F0 57 JSR READSC
0750 F383 8E DE 46 LDX #BUFFER
0751 F386 6F 84 CLR 0,X break forward link
0752 F388 6F 01 CLR 1,X
0753 F38A CC 52 41 LDD #$5241 set volume name (RAMDISK )
0754 F38D ED 88 10 STD 16,X
0755 F390 CC 4D 44 LDD #$4D44
0756 F393 ED 88 12 STD 18,X
0757 F396 CC 49 53 LDD #$4953
0758 F399 ED 88 14 STD 20,X
0759 F39C CC 4B 20 LDD #$4B20
0760 F39F ED 88 16 STD 22,X
0761 F3A2 CC 00 01 LDD #1 volume number
0762 F3A5 ED 88 1B STD 27,X
0763 F3A8 CC 01 01 LDD #$0101 first trk/sec 01-01
0764 F3AB ED 88 1D STD 29,X
0765 F3AE 86 3F LDA #RMAXTRK-1
0766 F3B0 C6 0E LDB #RMAXSEC
0767 F3B2 ED 88 1F STD 31,X
0768 F3B5 ED 88 26 STD 38,X
0769 F3B8 CC 03 72 LDD #RTOTSEC total DATA sectors (2912-14)
0770 F3BB ED 88 21 STD 33,X
0771 *
0772 F3BE 86 01 LDA #01 month set default creation date (SYS09's birthday!)
0773 F3C0 A7 88 23 STA 35,X
0774 F3C3 86 07 LDA #07 day
0775 F3C5 A7 88 24 STA 36,X
0776 F3C8 86 07 LDA #07 year
0777 F3CA A7 88 25 STA 37,X
0778 *
0779 F3CD 4F RF3 CLRA
0780 F3CE C6 03 LDB #3
0781 F3D0 BD F0 5B JSR WRITSC
0782 *
0783 F3D3 8E DE 46 LDX #BUFFER
0784 F3D6 4F CLRA
0785 F3D7 C6 01 LDB #1
0786 F3D9 BD F0 57 JSR READSC
0787 F3DC 8E DE 46 LDX #BUFFER
0788 F3DF 86 AA LDA #$AA set the init flag
0789 F3E1 A7 84 STA 0,X
0790 F3E3 86 55 LDA #$55
0791 F3E5 A7 01 STA 1,X
0792 F3E7 4F CLRA
0793 F3E8 C6 01 LDB #1
0794 F3EA 7E F0 5B JMP WRITSC
0795 *
0796 ********************************
0797 * System specific Boot *
0798 * command goes here. *
0799 ********************************
0800 *
0801 * Boot FLEX from the FPGA's internal pre-loaded scratch RAM
0802 *
0803 F3ED 08 08 UBMESS FCB $08, $08
0804 F3EF 42 6F 6F 74 69 6E FCC 'Booting internal FLEX....'
67 20 69 6E 74 65
72 6E 61 6C 20 46
4C 45 58 2E 2E 2E
2E
0805 F408 0D 0A 04 FCB $0D,$0A,$04
0806 *
0807 F40B 8E F3 ED UBSUB LDX #UBMESS
0808 F40E BD F4 6A JSR PDATA1
0809 *
0810 F411 8E D3 E5 LDX #$D3E5
0811 F414 10 8E F4 34 LDY #CONTAB Overlay console driver table
0812 F418 EC A1 UB1 LDD 0,Y++
0813 F41A ED 81 STD 0,X++
0814 F41C 8C D3 FD CMPX #$D3FD
0815 F41F 26 F7 BNE UB1
0816 *
0817 F421 8E DE 00 LDX #$DE00 Overlay disk driver table
0818 F424 10 8E F4 4C LDY #DISTAB
0819 F428 EC A1 UB2 LDD 0,Y++
0820 F42A ED 81 STD 0,X++
0821 F42C 8C DE 1E CMPX #$DE1E
0822 F42F 26 F7 BNE UB2
0823 *
0824 F431 7E CD 00 UBEND JMP $CD00
0825 *
0826 * FLEX console jump table.
0827 F434 F4 76 CONTAB FDB INPNE INPUT NO ECHO
0828 F436 F4 82 FDB DUMMY INTERRUPT HANDLER
0829 F438 DF C2 FDB MONRAM+$02 SWI VECTOR
0830 F43A DF C8 FDB MONRAM+$08 IRQ VECTOR
0831 F43C F4 82 FDB DUMMY TIMER OFF
0832 F43E F4 82 FDB DUMMY TIMER ON
0833 F440 F4 82 FDB DUMMY TIMER INITIALIZATION
0834 F442 F4 7E FDB CONTRL MONITOR
0835 F444 F4 82 FDB DUMMY TERMINAL INITIALIZATION
0836 F446 F4 7A FDB STATUS INPUT CHECK
0837 F448 F4 6E FDB OUTP TERMINAL OUTPUT
0838 F44A F4 72 FDB INPE TERMINAL INPUT WITH ECHO
0839 *
0840 * FLEX disk jump table.
0841 F44C 7E F0 57 DISTAB JMP READSC
0842 F44F 7E F0 5B JMP WRITSC
0843 F452 7E F0 5F JMP BUSY
0844 F455 7E F0 63 JMP RESTR1
0845 F458 7E F0 6C JMP DRVSEL
0846 F45B 7E F0 9F JMP CHKRDY
0847 F45E 7E F0 A3 JMP CHKQIK
0848 F461 7E F0 A7 JMP DINIT
0849 F464 7E F0 BF JMP DWARM
0850 F467 7E F0 C3 JMP SEEKTS
0851 *
0852 * Monitor jumps
0853 *
0854 F46A 6E 9F F8 0C PDATA1 JMP [PDATAV]
0855 F46E 6E 9F F8 0A OUTP JMP [OUTCHV]
0856 F472 6E 9F F8 06 INPE JMP [INCHEV]
0857 F476 6E 9F F8 04 INPNE JMP [INCHV]
0858 F47A 6E 9F F8 08 STATUS JMP [INCHKV]
0859 F47E 6E 9F F8 00 CONTRL JMP [MONITV]
0860 F482 39 DUMMY RTS
0861 *
0862 ** 'UL' LOAD ROM DISK VIA SERIAL PORT
0863 *
0864 F483 53 65 72 69 61 6C ULMES FCC 'Serial ROM Disk upload ...'
20 52 4F 4D 20 44
69 73 6B 20 75 70
6C 6F 61 64 20 2E
2E 2E
0865 F49D 0D 0A 04 FCB $0D,$0A,$04
0866 F4A0 52 4F 4D 20 44 69 ULMES1 FCC 'ROM Disk Loaded'
73 6B 20 4C 6F 61
64 65 64
0867 F4AF 0D 0A 04 FCB $0D,$0A,$04
0868 *
0869 F4B2 8E F4 83 ULSUB LDX #ULMES
0870 F4B5 BD F4 6A JSR PDATA1
0871 *
0872 F4B8 86 00 LDA #$00
0873 F4BA B7 DE 1E STA DRVNUM
0874 F4BD 4F CLRA TRACK 0
0875 F4BE C6 01 LDB #$01 SECTOR 1
0876 F4C0 B7 DE 1F ULLOOP0 STA TRACK
0877 F4C3 F7 DE 20 STB SECTOR`
0878 F4C6 17 FB FE LBSR MAPIN
0879 *
0880 F4C9 5F CLRB xfer 256 bytes at a time.
0881 F4CA BD F4 ED ULLOOP1 JSR LRBYTE transfer should be hex bytes
0882 F4CD A7 C0 STA ,U+
0883 F4CF 5A DECB
0884 F4D0 26 F8 BNE ULLOOP1
0885 *
0886 F4D2 17 FC 26 LBSR MAPOUT
0887 *
0888 F4D5 B6 DE 1F LDA TRACK
0889 F4D8 F6 DE 20 LDB SECTOR
0890 F4DB 5C INCB
0891 F4DC C1 0F CMPB #EMAXSEC+1
0892 F4DE 26 E0 BNE ULLOOP0
0893 F4E0 C6 01 LDB #1
0894 F4E2 4C INCA
0895 F4E3 81 30 CMPA #EMAXTRK
0896 F4E5 26 D9 BNE ULLOOP0
0897 *
0898 F4E7 8E F4 A0 ULEXIT LDX #ULMES1
0899 F4EA 7E F4 6A JMP PDATA1
0900 *
0901 * Read a byte from the serial port
0902 *
0903 F4ED 34 04 LRBYTE PSHS B
0904 F4EF 8D 0E BSR LRHEX Get hex digit.
0905 F4F1 48 ASLA
0906 F4F2 48 ASLA Shift to msb.
0907 F4F3 48 ASLA
0908 F4F4 48 ASLA
0909 F4F5 1F 89 TFR A,B Save in B.
0910 F4F7 8D 06 BSR LRHEX Get next digit.
0911 F4F9 34 04 PSHS B
0912 F4FB AB E0 ADDA 0,S+ Add together bytes.
0913 F4FD 35 84 PULS B,PC
0914 *
0915 F4FF BD F5 28 LRHEX JSR INTER
0916 F502 29 FB BVS LRHEX
0917 F504 80 30 SUBA #$30 Remove ascii bias.
0918 F506 2B F7 BMI LRHEX
0919 F508 81 09 CMPA #$09 Number?
0920 F50A 2F 0A BLE LRHEX1 Yes.
0921 F50C 81 11 CMPA #$11 Keep testing.
0922 F50E 2B EF BMI LRHEX
0923 F510 81 16 CMPA #$16
0924 F512 2E EB BGT LRHEX
0925 F514 80 07 SUBA #$07
0926 F516 39 LRHEX1 RTS
0927 *
0928 * ACIA INPUT TEST
0929 *
0930 F517 B6 E0 00 INTEST LDA ACIAC1
0931 F51A 85 01 BITA #$01
0932 F51C 39 RTS
0933 *
0934 * RESET ACIA
0935 *
0936 F51D 86 03 ACIRST LDA #$03 master reset
0937 F51F B7 E0 00 STA ACIAC1
0938 F522 86 11 LDA #$11
0939 F524 B7 E0 00 STA ACIAC1
0940 F527 39 RTS
0941 *
0942 * ACIA INPUT
0943 *
0944 F528 86 10 INTER LDA #16
0945 F52A B7 DE 27 STA DELCNT+0
0946 F52D 7F DE 28 CLR DELCNT+1
0947 F530 7F DE 29 CLR DELCNT+2
0948 F533 B6 E0 00 INTER0 LDA ACIAC1
0949 F536 85 01 BITA #$01
0950 F538 26 08 BNE INTER1
0951 F53A 85 78 BITA #$78
0952 F53C 27 0A BEQ INTER2
0953 F53E 8D DD BSR ACIRST
0954 F540 20 E6 BRA INTER
0955 *
0956 F542 B6 E0 01 INTER1 LDA ACIAD1
0957 F545 1C 02 ANDCC #VFLAG
0958 F547 39 RTS
0959 *
0960 F548 7A DE 29 INTER2 DEC DELCNT+2
0961 F54B 26 E6 BNE INTER0
0962 F54D 7A DE 28 DEC DELCNT+1
0963 F550 26 E1 BNE INTER0
0964 F552 7A DE 27 DEC DELCNT+0
0965 F555 26 DC BNE INTER0
0966 F557 4F CLRA
0967 F558 1A 02 ORCC #VFLAG
0968 F55A 39 RTS
0969 *
0970 * ACIA OUTPUT
0971 *
0972 F55B 34 02 OUTTER PSHS A
0973 *
0974 F55D B6 E0 00 OUTTE1 LDA ACIAC1
0975 F560 85 02 BITA #$02
0976 F562 26 08 BNE OUTTE2
0977 F564 85 78 BITA #$78
0978 F566 27 F5 BEQ OUTTE1
0979 F568 8D B3 BSR ACIRST
0980 F56A 20 F1 BRA OUTTE1
0981 *
0982 F56C 35 02 OUTTE2 PULS A
0983 F56E B7 E0 01 STA ACIAD1
0984 F571 39 RTS
0985 *
0986 ** 'UX' Xmodem ROM Disk upload
0987 *
0988 F572 0D 0A UXMES FCB $0D,$0A
0989 F574 58 6D 6F 64 65 6D FCC 'Xmodem ROM Disk Upload'
20 52 4F 4D 20 44
69 73 6B 20 55 70
6C 6F 61 64
0990 F58A 04 FCB 4
0991 F58B 0D 0A UXMES1 FCB $0D,$0A
0992 F58D 55 70 6C 6F 61 64 FCC 'Upload Complete'
20 43 6F 6D 70 6C
65 74 65
0993 F59C 04 FCB 4
0994 F59D 0D 0A UXMES2 FCB $0D,$0A
0995 F59F 55 70 6C 6F 61 64 FCC 'Upload Error'
20 45 72 72 6F 72
0996 F5AB 04 FCB 4
0997 *
0998 F5AC 8E F5 72 UXSUB LDX #UXMES
0999 F5AF 17 FE B8 LBSR PDATA1
1000 *
1001 F5B2 86 01 LDA #1
1002 F5B4 B7 DE 23 STA BLKNUM
1003 F5B7 8E F6 1A LDX #XSTSTR
1004 F5BA BF DE 25 STX XSTATE
1005 *
1006 F5BD 86 00 LDA #$00
1007 F5BF B7 DE 1E STA DRVNUM
1008 F5C2 4F CLRA TRACK 0
1009 F5C3 C6 01 LDB #$01 SECTOR 1
1010 F5C5 B7 DE 1F UXLOOP0 STA TRACK
1011 F5C8 F7 DE 20 STB SECTOR
1012 F5CB 17 FA F9 LBSR MAPIN
1013 *
1014 F5CE 5F CLRB xfer 256 bytes at a time.
1015 F5CF 17 00 2B UXLOOP1 LBSR XBYTE transfer should be hex bytes
1016 F5D2 25 20 BCS UXERR
1017 F5D4 A7 C0 STA ,U+
1018 F5D6 5A DECB
1019 F5D7 26 F6 BNE UXLOOP1
1020 *
1021 F5D9 17 FB 1F LBSR MAPOUT
1022 *
1023 F5DC B6 DE 1F LDA TRACK
1024 F5DF F6 DE 20 LDB SECTOR
1025 F5E2 5C INCB
1026 F5E3 C1 0F CMPB #EMAXSEC+1
1027 F5E5 26 DE BNE UXLOOP0
1028 F5E7 C6 01 LDB #1
1029 F5E9 4C INCA
1030 F5EA 81 30 CMPA #EMAXTRK
1031 F5EC 26 D7 BNE UXLOOP0
1032 *
1033 F5EE 8E F5 8B UXEXIT LDX #UXMES1
1034 F5F1 7E F4 6A JMP PDATA1
1035 *
1036 F5F4 17 FB 04 UXERR LBSR MAPOUT
1037 F5F7 8E F5 9D LDX #UXMES2
1038 F5FA 16 FE 6D LBRA PDATA1
1039 *
1040 * Get a Byte using XModem protocol
1041 * Carry clear => no errors
1042 * Carry set => errors
1043 *
1044 F5FD 34 10 XBYTE PSHS X
1045 F5FF BE DE 25 LDX XSTATE
1046 *
1047 F602 17 FF 23 XBYTE0 LBSR INTER
1048 F605 28 0A BVC XBYTE1
1049 F607 86 15 LDA #NAK
1050 F609 17 FF 4F LBSR OUTTER
1051 F60C 8E F6 1A LDX #XSTSTR
1052 F60F 20 F1 BRA XBYTE0
1053 *
1054 F611 AD 84 XBYTE1 JSR ,X
1055 F613 26 ED BNE XBYTE0
1056 F615 BF DE 25 STX XSTATE
1057 F618 35 90 PULS X,PC
1058 *
1059 * START - LOOK FOR SOH (START OF HEADER) = $01
1060 *
1061 F61A 81 01 XSTSTR CMPA #SOH
1062 F61C 26 06 BNE XSTSTR1
1063 F61E 8E F6 3A LDX #XSTBLK
1064 F621 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
1065 F623 39 RTS
1066 *
1067 F624 81 04 XSTSTR1 CMPA #EOT
1068 F626 26 08 BNE XSTSTR2
1069 F628 86 06 LDA #ACK
1070 F62A 17 FF 2E LBSR OUTTER
1071 F62D 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
1072 F62F 39 RTS
1073 *
1074 F630 81 18 XSTSTR2 CMPA #CAN
1075 F632 26 03 BNE XSTSTR3
1076 F634 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
1077 F636 39 RTS
1078 *
1079 F637 1C FA XSTSTR3 ANDCC #$FF-CFLAG-ZFLAG
1080 F639 39 RTS
1081 *
1082 * Got SOH
1083 * Now get block number
1084 *
1085 F63A B1 DE 23 XSTBLK CMPA BLKNUM
1086 F63D 26 06 BNE XSTBLKE
1087 F63F 8E F6 50 LDX #XSTCOM
1088 F642 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
1089 F644 39 RTS
1090 *
1091 * Error in block number
1092 *
1093 F645 86 15 XSTBLKE LDA #NAK
1094 F647 17 FF 11 LBSR OUTTER
1095 F64A 8E F6 1A LDX #XSTSTR
1096 F64D 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
1097 F64F 39 RTS
1098 *
1099 * Get complement of block number
1100 *
1101 F650 43 XSTCOM COMA
1102 F651 B1 DE 23 CMPA BLKNUM
1103 F654 26 EF BNE XSTBLKE
1104 F656 7F DE 21 CLR CHKSUM
1105 F659 86 80 LDA #128
1106 F65B B7 DE 24 STA BYTCNT
1107 F65E 8E F6 64 LDX #XSTDAT
1108 F661 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
1109 F663 39 RTS
1110 *
1111 * Get data bytes
1112 *
1113 F664 34 02 XSTDAT PSHS A
1114 F666 BB DE 21 ADDA CHKSUM
1115 F669 B7 DE 21 STA CHKSUM
1116 F66C 35 02 PULS A
1117 F66E 7A DE 24 DEC BYTCNT
1118 F671 26 03 BNE XSTDAT1
1119 F673 8E F6 7B LDX #XSTCHK
1120 F676 1C FE XSTDAT1 ANDCC #$FF-CFLAG No abort
1121 F678 1A 04 ORCC #ZFLAG Valid data (exit)
1122 F67A 39 RTS
1123 *
1124 * Byte count reached zero
1125 * Check checksum byte
1126 *
1127 F67B B1 DE 21 XSTCHK CMPA CHKSUM
1128 F67E 26 07 BNE XSTCHK1 retry if wrong checksum
1129 *
1130 * Checksum OK ...
1131 * increment block number
1132 * and send ACK
1133 *
1134 F680 7C DE 23 INC BLKNUM
1135 F683 86 06 LDA #ACK
1136 F685 20 0D BRA XSTCHK2
1137 *
1138 * Checksum Error detected ...
1139 * Reset Sector counter in ACCB to last 128 byte boundary
1140 * and send NAK
1141 *
1142 F687 34 04 XSTCHK1 PSHS B
1143 F689 1F 30 TFR U,D
1144 F68B 5A DECB
1145 F68C C4 80 ANDB #128
1146 F68E 1F 03 TFR D,U
1147 F690 35 04 PULS B
1148 F692 86 15 LDA #NAK
1149 F694 17 FE C4 XSTCHK2 LBSR OUTTER
1150 F697 8E F6 1A LDX #XSTSTR
1151 F69A 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
1152 F69C 39 RTS
1153 *
1154 ** 'UP' Load ROMdisk via config PROM.
1155 *
1156 F69D 08 08 UPMES FCB $08,$08
1157 F69F 4C 6F 61 64 20 52 FCC 'Load ROM disk from config PROM.'
4F 4D 20 64 69 73
6B 20 66 72 6F 6D
20 63 6F 6E 66 69
67 20 50 52 4F 4D
2E
1158 F6BE 04 FCB 4
1159 F6BF 46 6F 75 6E 64 20 UPMES1 FCC 'Found SYNC, loading data...'
53 59 4E 43 2C 20
6C 6F 61 64 69 6E
67 20 64 61 74 61
2E 2E 2E
1160 F6DA 0A 0D 04 FCB $0A,$0D,4
1161 F6DD 52 4F 4D 20 44 69 UPMES2 FCC 'ROM Disk Loaded.'
73 6B 20 4C 6F 61
64 65 64 2E
1162 F6ED 0A 0D 04 FCB $0A,$0D,4
1163 F6F0 52 4F 4D 20 44 69 UPMES3 FCC 'ROM Disk Not Found.'
73 6B 20 4E 6F 74
20 46 6F 75 6E 64
2E
1164 F703 0A 0D 04 FCB $0A,$0D,4
1165 *
1166 F706 8E F6 9D UPSUB LDX #UPMES
1167 F709 BD F4 6A JSR PDATA1
1168 *
1169 F70C 8D 5A BSR UPRESET
1170 F70E 10 8E 00 20 LDY #$0020 Set up count for 2 MBit
1171 F712 8E 00 00 LDX #$0000
1172 F715 8D 6C UPSUB1 BSR UPBIT Shift in bit
1173 F717 8D 7C BSR UPSYNC Test for Sync pattern`
1174 F719 27 15 BEQ UPSUB4 Skip if found
1175 F71B 30 1F LEAX -1,X Count Down inner loop
1176 F71D 8C 00 00 CMPX #$0000
1177 F720 26 F3 BNE UPSUB1 Branch if inner loop not complete
1178 F722 31 1F LEAY -1,X Count down outer loop
1179 F724 10 8C 00 00 CMPY #$0000
1180 F728 26 EB BNE UPSUB1 Branch if outer loop not complete
1181 *
1182 F72A 8E F6 F0 LDX #UPMES3 2MBits scanned, no synch, report error
1183 F72D 7E F4 6A JMP PDATA1
1184 *
1185 F730 8E F6 BF UPSUB4 LDX #UPMES1 Sync found, now load disk
1186 F733 BD F4 6A JSR PDATA1
1187 *
1188 F736 4F CLRA
1189 F737 B7 DE 1E STA DRVNUM select Drive 0
1190 F73A C6 01 LDB #$01
1191 F73C B7 DE 1F UPSUB2 STA TRACK track 0
1192 F73F F7 DE 20 STB SECTOR sector 1
1193 *
1194 F742 17 F9 82 LBSR MAPIN map in buffer
1195 F745 5F CLRB 256 byte sector
1196 F746 8D 67 UPSUB3 BSR UPBYTE read byte from prom
1197 F748 A7 C0 STA ,U+ Store in buffer
1198 F74A 5A DECB
1199 F74B 26 F9 BNE UPSUB3 Loop until sector read`
1200 F74D 17 F9 AB LBSR MAPOUT map out buffer
1201 *
1202 F750 B6 DE 1F LDA TRACK Advance sector
1203 F753 F6 DE 20 LDB SECTOR
1204 F756 5C INCB
1205 F757 C1 0F CMPB #EMAXSEC+1 Wrap on max sector count
1206 F759 26 E1 BNE UPSUB2
1207 F75B C6 01 LDB #1
1208 F75D 4C INCA Advance track
1209 F75E 81 30 CMPA #EMAXTRK
1210 F760 26 DA BNE UPSUB2
1211 *
1212 F762 8E F6 DD UPEXIT LDX #UPMES2 Load complete, report message
1213 F765 7E F4 6A JMP PDATA1
1214 *
1215 * Reset Serial PROM
1216 *
1217 F768 86 02 UPRESET LDA #PRSTHI Strobe the reset line
1218 F76A B7 E0 C0 STA PROMREG
1219 F76D 86 00 LDA #PRSTLO
1220 F76F B7 E0 C0 STA PROMREG
1221 F772 8E 00 00 LDX #$0000 Delay a while`
1222 F775 30 1F UPRST1 LEAX -1,X
1223 F777 8C 00 00 CMPX #$0000
1224 F77A 26 F9 BNE UPRST1
1225 F77C BF DF 46 STX SYNCREG+0 Clear Sync Shift Register
1226 F77F BF DF 48 STX SYNCREG+2
1227 F782 39 RTS
1228 *
1229 * Input 1 Bit From PROM
1230 *
1231 F783 86 01 UPBIT LDA #PCLKHI
1232 F785 B7 E0 C0 STA PROMREG
1233 F788 86 00 LDA #PCLKLO
1234 F78A B7 E0 C0 STA PROMREG
1235 F78D B6 E0 C0 LDA PROMREG
1236 F790 44 LSRA
1237 F791 78 DF 49 ASL SYNCREG+3
1238 F794 39 RTS
1239 *
1240 * Test for 32 bit Sync Word
1241 *
1242 F795 79 DF 48 UPSYNC ROL SYNCREG+2
1243 F798 79 DF 47 ROL SYNCREG+1
1244 F79B 79 DF 46 ROL SYNCREG+0
1245 F79E CC FF 00 LDD #SYNCLO
1246 F7A1 10 B3 DF 48 CMPD SYNCREG+2
1247 F7A5 26 07 BNE UPSYNCX
1248 F7A7 CC AA 55 LDD #SYNCHI
1249 F7AA 10 B3 DF 46 CMPD SYNCREG+0
1250 F7AE 39 UPSYNCX RTS
1251 *
1252 * Input 1 Byte From PROM
1253 *
1254 F7AF 34 04 UPBYTE PSHS B
1255 F7B1 C6 08 LDB #8
1256 F7B3 8D CE UPBYTE1 BSR UPBIT
1257 F7B5 5A DECB
1258 F7B6 26 FB BNE UPBYTE1
1259 F7B8 B6 DF 49 LDA SYNCREG+3
1260 F7BB 35 84 PULS B,PC
1261 *
1262 ***** NEXTCMD *****
1263 *
1264 F7BD 17 FC B2 NEXTEXT LBSR INPE GET ONE CHAR. FROM TERMINAL
1265 F7C0 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1266 F7C2 1F 89 TFR A,B
1267 F7C4 86 20 LDA #$20
1268 F7C6 17 FC A5 LBSR OUTP PRNT SPACE
1269 F7C9 C1 60 CMPB #$60
1270 F7CB 2F 02 BLE NXTEX0
1271 F7CD C0 20 SUBB #$20
1272 *
1273 ***** DO TABLE LOOKUP *****
1274 * FOR COMMAND FUNCTIONS
1275 *
1276 F7CF 8E F7 E5 NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE
1277 F7D2 E1 80 NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
1278 F7D4 27 0D BEQ JMPEXT BRANCH IF MATCH FOUND
1279 F7D6 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
1280 F7D8 8C F7 F4 CMPX #EXTEND REACHED END OF TABLE YET ?
1281 F7DB 26 F5 BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY
1282 F7DD 8E F7 F4 LDX #MSGWHAT POINT TO MSG "WHAT?"
1283 F7E0 16 FC 87 LBRA PDATA1 PRINT MSG AND RETURN
1284 F7E3 6E 94 JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE
1285 *
1286 * EXTENDED COMMAND JUMP TABLE
1287 *
1288 F7E5 EXTTAB EQU *
1289 F7E5 42 FCC 'B' BOOT FLEX
1290 F7E6 F4 0B FDB UBSUB
1291 F7E8 4C FCC 'L' LOAD ROM DISK OVER SERIAL PORT
1292 F7E9 F4 B2 FDB ULSUB
1293 F7EB 46 FCC 'F' FORMAT RAM DISK
1294 F7EC F2 DD FDB UFSUB
1295 F7EE 50 FCC 'P' LOAD ROM DISK FROM PROM
1296 F7EF F7 06 FDB UPSUB
1297 F7F1 58 FCC 'X' XMODEM ROM DISK UPLOAD
1298 F7F2 F5 AC FDB UXSUB
1299 *
1300 F7F4 EXTEND EQU *
1301 *
1302 F7F4 57 48 41 54 20 3F MSGWHAT FCC "WHAT ?"
1303 F7FA 0A 0D 04 FCB $0A,$0D,$04
0012 END
0013 END COLDS
Program + Init Data = 7039 bytes
Error count = 0
/Flex9/flex9ram.sh
1,3 → 1,3
../../Tools/as09/as09.exe flex9ram.asm -l > flex9ram.lst
../../Tools/as09/as09_dos.exe flex9ram.asm -l > flex9ram.lst
../../Tools/epedit/epedit.exe flex9ram.aux
 
/Flex9/flex9cf8.sh
1,2 → 1,2
../../Tools/as09/as09.exe flex9cf8.asm -l > flex9cf8.lst
../../Tools/epedit/epedit.exe flex9cf8.aux
../../Tools/as09/as09_dos.exe flex9cf8.asm -l > flex9cf8.lst
../../Tools/epedit/epedit.exe flex9cf8.aux
/Flex9/FLEX9RAM.S19
0,0 → 1,230
S123C7007EC7217EC7037EC7477EC7857EC7957EC71F0C00000000C810C810000000003BDC
S123C720121A10BECC3110EF027DCC3426118ECCFC7CCC346D842707BFCC3110EE023B8ED3
S123C740CCF87FCC3420F11A107DC71B2729BEC719A6843402EC018ECAC0ED88403502A712
S123C760036F848601A7026F88226F883B7DC71E2729113F1220F61CEFAD9FD3ED7FCCFCBC
S123C780113F1220F41A107DCC302705113F1220F47CCC30397FCC301CEF397DC71D2627BC
S123C7A08ECAC0BDD406261F7DC71C270F7FC71C810A270F3402860A8D3C3502810D26034B
S123C7C0B7C71C8D3120D4860D8D2B860A8D27B6C7128D227FC71DBEC7196D0327056A0332
S123C7E07EC74730048CC84026038EC810BFC7197AC71B7EC747BDCCD82B05113F1220F6C2
S106C8007ECCE403
S113C840FF000000535441525455500054585400B2
S123CA002006BDCAAC39C0A08639B7D3FDBECC2B308900A1BFCA06AD9FD3F1BED3FBBFCD14
S123CA200ABFCD0DBED3F9BFCD10BFCD13BED3F7BFCD4F8E00A0C6B9A684E78412E1842648
S123CA400BA78430890400BCCA0626EC3089FF5FBFCC2B8ECD03BFCC168ECADCBDCE81BD78
S123CA60CEB58D9EBDCEB58EC8408601A784BDD4062708A601BDD2007ECD678EC080BFCC75
S123CA80148EC840BDD406270534307ED2D7BECC14A780810D26E78EC840BDD1F48EC08054
S123CAA0BFCC148ECD67BFCC437ED32E8ECAECBDCE81BDCE2B8D1425F3B7CC0E8D0D25ECC9
S123CAC0B7CC0F8D0625E5B7CC1039BDD175250BB6CC1C5D27031CFE391A01393638303981
S121CAE020464C45582056332E3031044441544520284D4D2C44442C5959293F20048B
S123CC0008183A190004400000FF1B0001000000000000000000000000000000000000003E
S11ECC200000000000000000000000BFFF000001000000000000000000000036
S104CC496086
S123CC4E2B2B2B043F3F3F04574841543F0443414E2754205452414E53464552044E4F543E
S123CC6E20464F554E44044449534B204552524F52202304445249564553204E4F54205296
S11DCC8E454144590447455400D20F4D4F4E00D34B00271003E80064000A08
S123CD007ECD577ECD677ECDB17ECD097ECD0C7ECD0F7ECD127ECEFB7ECF417ECE2B7ECEC5
S123CD20817ECFED7ECEB57ED00E7ECDEA7ED0367ED1A27ED0EB7ED3497ECF867ECFD47EE8
S123CD40D27F7ED12F7ECFD07ED1757ED3297ECD4E7ECE057ECE0510CEC07F7FCC11BDD460
S123CD60007FCC28BDD3FD10CEC07FBDDE188ECD03BFCC168EC700AF9FD3E9BED3E7AF9FBB
S123CD80D3EB8ECCF8BFCC317FCC347FCC4C8D5AB6CC11B1CC0226057CCC1520147DCC2887
S123CDA010260597BDD40326B28ECC4EBDCE818D7ABDD0D4810D27E58EC8407CCC0DBDD003
S123CDC03625168ECC938D3E2709BECC1227078D3526036E9801BDD22E8ECC568615B7CCAF
S123CDE020BDCE817FCC117ECD67BECD13BFCD10BECD0DBFCD0A7FCC237FCC227FCC217FC7
S123CE00CC267FCC2439108EC844A6A0815F23028020A18026086D8426F06DA4270C6D8058
S123CE2026FC30026D8426DE1CFB398EC080BFCC14BDCEFBB1CC01271DB1CC00271F810D4F
S123CE40270D810A2732811F23E78CC0FF27E2A780810D26DC398ECC528D2620CE8CC080AF
S123CE6027F4301FB6CC07810826088620BDCF66B6CC07BDCF6620B9860DBDCF41862020F2
S123CE80C98D32A6848104276FBDCF41300120F3BDCD4E2765AD9FD3E5B1CC0A265C7FCCF4
S123CEA01AAD9FD3E5B1CC0A2750810326F37FCC116E9FCC167DCC2126278DD4B6CC0327A6
S123CEC020B1CC1A22187FCC1A7DCC0927028DCE3404F6CC0827058D085A26FB35047CCC63
S123CEE01A860D8D5C860A8D583404F6CC0527064F8D4E5A26FA35041CFE397DCC23261A1B
S123CF007DCC2627108D1A7DCC2F27117DCC24270C8D532008BDCD092003BDCD0C7FCC1AB7
S123CF2039BFCC47BECC262006BFCC47BECC24BDD4062604BECC47397FCC24BDD27F7ECDF9
S123CF40037DCC212620811F22057FCC2920177CCC293402B6CC04270BB1CC292406BDCEEE
S123CF60B57CCC29350234027DCC2226137DCC2427048DB5200D7DCC262608BDCD0F200316
S123CF80BDCD123502397FCC4AF7CC1D8604B7CC4DEC848ECCA08D0B30027ACC4D26F71FAF
S123CFA098203D7FCC4B10A3842507A3847CCC4B20F43402B6CC4B26107DCC4A260B7DCC6B
S123CFC01D270B86208D2320057CCC4A8D1235828D023001A6848D04A684200444444444C2
S123CFE0840F8B30813923028B077ECF4181302514813923168141250C815A230E816125FD
S123D00004817A23061A01B7CC11391CFE393410BECC14B6CC18B7CC19A680B7CC18810D42
S123D0202710B1CC02270BBFCC1481202604A18427E78DB935908615A70186FFA7036F0477
S123D0406F0CBDD0D48608B7CC4B8D34252E260F8D2E25282609BCCC3F276C8D232368BEC1
S123D060CC3F6D0427616D032A0F7DCC0D2705B6CC0B2003B6CC0CA7037FCC0DBECC3F393B
S123D0808D8C254381392215BECC3F6D032A388403A703BDD00E242F812E1CFE39F6CC4B51
S123D0A02B253404C005F7CC4B3504B1CC4925028020A70430015ABDD00E2408812D270475
S123D0C0815F26065D26E41A01395D27CB6F0430015A20F6BFCC3FBECC14A68481202604C5
S123D0E0300120F6BFCC14BECC3F393430E60C2618108ED10B810B2210C6033D31A5C603D3
S123D100A6A0A70C30015A26F735B042494E545854434D4442415353595342414B5343524D
S123D1204441544241434449525052544F5554BDD21EBDD00E25228D2625183404C6047886
S123D140CC1C79CC1B5A26F73504BBCC1CB7CC1C5C20DFBDD00E24FB39BECC1B1CFE3980CB
S123D160472A0F8B062A048B072A078B0A2B031CFE391A0139BDD21EBDD00E25DC8139221A
S123D180D2840F34043402FCCC1B584958495849F3CC1BF3CC1BEBE08900FDCC1B35045C71
S123D1A020D67FCC1D8D3D81022715811626F68D33B7CC1E8D2EB7CC1F8601B7CC1D20E5E7
S123D1C08D221F898D1E1E89F3CC1BFDCC3D8D141F894D27D08D0DBECC3DA780BFCC3D5A8B
S123D1E026F320C18EC840BDD4062711A6018108260E32628604A784BDD406260D1CFE3902
S123D200B7CC20810426031A01398D737ECDE486008D35250F8D077CCC4C8D8620F14F5FC0
S123D220FDCC1B39F6CC4C1027FBAE7ECD0386028D228DEABDD1A2F6CC1D27046E9FCC1EB2
S123D2408ECC5C86817ECDDE34028EC840BDD0363502251A8EC840BDD0EB8EC8408601A70D
S123D26084BDD1E4102500BB86FFA7883B39B6CC11810D2707B1CC021026FB5D1A013934B8
S123D28030A601B7CC202763BDCDEA10BECC2D260881102758108ED3618EC8406D02270906
S123D2A08604A784BDD406262E8EC838C60B8D6E8EC840B6CC0BA7038601A784BDD4062634
S123D2C016B6CC204A47474C6F8820A788218615A784BDD406271E8ECC75BDCE81BECC3FC1
S123D2E0B6CC20A7016F845FBDCF8635B08ECC82BDCE8120F6BDCEB58EC840B6CC204A8453
S123D30003C63F3DCB04E78822BDD40626C9BDCF41810D26F48604A784BDD40620CD3430CC
S123D3207ED1008ECC6B7ECDE13506FDCC4310FFCC457FCC207CCC287ECDB87FCC2810FEE3
S123D340CC45F6CC206E9FCC433A397DCCFC26046E9FD3F38EC840861BA701BDD27F7ECDCD
S10FD360674552524F525300005359537A
S106CCC07ED370AC
S106CCD87ED37094
S106CCE47ED37088
S10BCCF801000000000000002F
S11BD370397ED3706E9FF8046E9FF8006E9FF8086E9FF80A6E9FF80672
S123D3E5D374D370DFC2DFC8D370D370D370D378D371D37CD380D3847ECA007ED4367ED4DF
S123D405597ED47B204449534B204F5045524154494E472053595354454D20434F50595217
S123D4254947485420284329203139383020425920544543484E4943414C205359535445F3
S111D4454D5320434F4E53554C54414E5453B7
S123D435FFBDDE158ED409C60A8D118E0005BFD413BFD4157FD41A8ED41BC61A6F805A2631
S123D455FB7EC70CBDC709BED40927EB3088E4BFD40B3420BDDAC3352024ECBED40B6F02D2
S123D475BDC70CC6FF397DCCFC2703BDC7093424BFD40B6F01E6842622E602271AC10227DE
S123D49511BDD5B4BED40B25267DCCFC26235F352439BDD6CF20EDC6122014C1162304C676
S123D4B501200C5A588ED4CEAD95BED40B2402E701BDC70C6D01352439D986D9D9DAF9DA09
S123D4D5C3D5E2D81DD838D876D641D69FD969DBD6DB2CD699DA87D810D56FD590DB07DDC0
S123D4F5BDDCFBDCE58D202605C6021A0139ED84AE846F846F01398D0E2705C60D1A01399D
S123D515EC94ED841CFE39FCD40BC3001C8ED40910AE8426031CFB3910A384260139AE8405
S123D53520EEBED40B4F5F8D02C62FA7881130015A26F839BED40BC60BA604A78824300137
S123D5555A26F639BED40BC60BA6043402A68824A1E0260530015A26F039BED40BE6025404
S123D5752479E688237ED600BED40BE688226C88223AA788405C261F1A0139BED40BE602AA
S123D595C403C1032655CA80E702E60FC580260AE688233AA788401CFE39C60B1A0139A677
S123D5B5883B2B3C27076A883B8620201D8D31251B8118221527F68109260C8D23250DBEA3
S123D5D5D40BA7883B20D84D27E31CFE39BDDAB1250985012705A7847ED9A0C6121A0139D1
S123D5F5BED40BE68822270A6C88223AA688401CFE398D0324EA39BED40BEC88406C882166
S123D61526036C882010830000271CED881E34028604A7882235028D132410C5802704C6F9
S123D635102006C6092002C6081A01398D25BED40BBDDE0C25128D11BDDE0026031CFE39A6
S123D65534048D17350424EE39BED40BEC881E308840394FB7D411B7D41239C5102611C55F
S123D675802624F6D4115CC1072705F7D41120147FD411F6D4125CC104270CF7D412BED489
S123D6950BBDDE091CFE391A01398DC7BED40BBDDE0C2520BED40B8DB0BDDE03260AB6D40C
S123D6B5352737BDDE062732C540260B34048DAB350424E039C6201A0139BED40BE6883B28
S123D6D52B3D8120260F5CE7883BC17F260C200D8D0B24E6395D272720F61CFE393402C168
S123D6F50126048620201086098D143502250F3402BED40BA6883B6F883B8D03350239BE49
S123D715D40BE602C1021026FED1E68822C104260834028D213502250FBDD57D240AC60488
S123D735BED40BE788221CFE39BED40B4F5FED8820ED88422027E688122622E688172744B9
S123D7556F88178D3F252A8DE025268DDC2522BED40BC602E78817EC88117EDC828D0EBE7A
S123D775D40BED8840BDD69F241A7EDBC18D03EC8439BED40BE60386063D8ED41D3ABFD49E
S123D7951B6D84398DE72605C6071A0139BED40BED88136D88122603ED88116C881626035D
S123D7B56C88156D8817270BBDDC4325DDBED40BEC8813BDD62025D2BED40BEC88403406D2
S123D7D58DB03506ED84260A6F026F036F046F05200810AE04313F10AF044FBED40B6C8850
S123D7F52126036C88205FA7884030015A26F8BED40BEC8820ED88421CFE395F3404C603A0
S123D815200EBED415BFD413F6D4133404F6D414BED40BE788413504E788407FD4185FE79B
S123D835882239BED40BE68822261DBDD60C2530BED40B7DD4182605DC44FDD4188610A711
S123D8558822EC881EED882FA68822A78831C6183414BDD5F53514A70430015A26F21CFEC1
S123D87539BED40BA68831A78822C6183414A604BDD714351430015A26F27ED69FBED40B15
S123D895A603A78823B6D4177DD41A2631A703BED415BFD4138C0005270C8D222337BED4BB
S123D8B518BFD41320EFBED40BA68823A7032A0EBDDDBD25368D07231CBDDDAD20F2BED442
S123D8D50B7FD41ABDD549BDD81DBDD8382407C10827181A0139BED40BA604270C2A028DA3
S123D8F50FBDD55926E41CFE398D051CFB1CFE39A68833260CEC882FED8832A68831A78851
S123D9153439BDD78726178D182515C60610BED40BBED41BA6A85D3121A7805A26F61CFE70
S123D93539BDD810BDD60C2508BED40BC610E7882239BDD7878DEA25F8C60610BED40BBE01
S123D955D41BA680A7A85D31215A26F6BDD69F24E07EDBC1BED40B8602A702EC882FED88EF
S123D9751EBDD6412508BDD87624057EDBC1C60A39BDD4FA253DBDD8922538263BBED40BA9
S123D9957DD41A2706A60F85202629BDDCC0252AEC8811ED8840BDDA76E688172713340447
S123D9B5BDD60C3504250C5A26F4BED40B5FE788221CFE39C6112002C6043404BDD50C3523
S123D9D5041A0139BED40B6D032A08BDDDBD2403C61039BDD4FA25E2BDD537BDD91725DA03
S123D9F5BDD89225D52604C60320CFBDDCC025CABED40BC60A6F0F30015A26F9BED40BECA5
S123DA1588322727ED882FA68834A78831FCCC0EED8819B6CC10A7881BBDDDADBDD96925D4
S123DA35998D3E8604A788221CFE39BED40B6F88176C8812EC882FBDD620250DBDD77225D7
S123DA5508BDD69F2406BDDBC17ED9CFBED40BEC881EED88328610A78834BDD94725EA20EF
S123DA758ABED40BA684A7026F846F883B4FA78822398D28250E6F84441025FB7AC604E71B
S123DA9588221CFE39BED40BA6028183260B8603A702BDD69F102501131CFE398DE7250D50
S123DAB5BED40BA602810323F0C6121A01398DEC253181022708BED40B6F027ED50CA68829
S123DAD5122605BDDBA720198DC82517BED40B6D88172705BDDC98250ABDD9692505BDD9F3
S123DAF54724D339BDD9862528BDD60C252386032018BDD986251ABED40BA60F858026129B
S123DB15EC8813BDD62025098602BED40BA7021CFE39C60B1A01398D35BDD892252A2724BB
S123DB35BED40BC60BA68824A70430015A26F68D4D2515BED40BA60F858026D6856026093F
S123DB558D0C2055C6031A0139C60C1A0139BED40B860BB7D411A604E68835A78835E704F5
S123DB7530017AD41126EFBED40BA60C260CC603A6883DA70C30015A26F6BED40B398DCEA7
S123DB95BDD89225072606BED40B1CFE39C6041A0139BED40B86FFA704BDD969BED40B86F0
S123DBB500A70239ED8840BDD69F2414C5402608C580270AC6102006C60B2002C60A1A01C8
S123DBD539BDD917255E8DB8255ABED40BA60F8580265285602652BDD787BED41BEC0226F7
S123DBF50FBED40BEC88112733BED41BED842014BED40BBDD620252CBED40BEC8811271C29
S123DC158DA22520BED40BEC8813BED41BED02BED40BEC8815BED41BE304ED04BDDBA725A8
S123DC3503BDD94739C60B2002C60C1A0139EC881E5CE1883C2303C6014C10A38813260E4B
S123DC55A6883781FF27074CA788371CFE398D332530BED40BA6883A8B032616EC881E100D
S123DC75A388112705C6171A0139EC8840ED88388604A7883AEC8813ED88358601A7883780
S123DC951CFE39EC8838BDD62025F7BED40B1F12E6883A3AC603A6A8353121A788403001AF
S123DCB55A26F3BDD69F24DA7EDBC1BDD810BDD60C2546BED40B4F5FED8820A68867A7883B
S123DCD53C5F6F884030015A26F8BED40B1CFE39BED40BA68817271DEC88208300012A0355
S123DCF57EDD9AED8820BDDAB1250E4624076F84A688172605C6121A01397FD411EC88111D
S123DD1510AE8820276ABDDD9F25EE4F5F6D022774EB028900BFD40FBED40B10A3882024BB
S123DD352CBED40F30033402B6D4114CB7D4118154270881A83502274C20D23404BED40B73
S123DD55EC88408D45253E3504350220C0A38820BED40FA6023404A0E04A1F89A684EB011D
S123DD75BED40B2505E1883C2306E0883C4C20F5BDD6202514BED40BEC884210A38820272F
S123DD9514C6192002C6181A0139BDD6202508BED40BC6443A1CFE39BED40BC60BA688244F
S123DDB5A70430015A26F639BED40BA6034C8104240FA7032605BDDE0F2003BDDE1225E819
S109DDD539C6101A0139E1
S123DE007EF0577EF05B7EF05F7EF0637EF06C7EF09F7EF0A37EF0A77EF0BF7EF0C3000067
S115DE2000000000000000000000000102031040FFFF98
S123F000F7BDF119F141F13FF13FF13FF13FF13FF052F052F052F119F141F13FF13FF13F7A
S123F020F13FF13FF052F052F052F052F052F052F052F052F052F052F052F052F052F17AA7
S123F040F1E9F249F24EF24EF24EF24EF052F052F0525F5D1CFE396E9FDE326E9FDE346E18
S123F0609FDE368D072701396E9FDE383430E603F7DE1E8EDE2AA68581FF26083530C60FD8
S123F0805D1A0139C6143D8EF002308B108EDE32C614A680A7A05A26F935306E9FDE3A6E03
S123F0A09FDE3C6E9FDE3E4FB7DE1E8EDE1B8DBC2504AD9FDE40B6DE1E4C810426EA396ECB
S123F0C09FDE426E9FDE441FA8B7DE221A50CEDE2AF6DE1EE6C5CEDE2EB6DE1FABC584F072
S123F0E0A7E2B6DE208001880F840FABE0B7FFF0B6DE1F840F8B005F1F03398600880FB794
S123F100FFF0B6DE221F8A39B7DE1FF7DE201CFE1A0439C6405D1A0139347017FFEA17FFD9
S123F120A6108EDE465FA6C0A7A05A26F917FFCB108EDE465FA6A0A7805A26F95F35F05F13
S123F14039347017FFC2CEDE2AF6DE1EE6C5C1012707C100270316FFBA108EDE465FA68092
S123F160A7A05A26F917FF5F108EDE465FA6A0A7C05A26F917FF845F35F0340434027FDE26
S123F180217FDE228673BDF285244CB6DE1EBDF28524443502BDF285243D3502BDF2852485
S123F1A0365FBDF2672430A780BBDE22B7DE2224037CDE215A26EBBDF267241B3402BDF26C
S123F1C06724141F89350210B3DE21260E8606BDF28524035F200DC61020098615BDF28576
S123F1E024F5C609F7DE215D39340434027FDE217FDE228672BDF28524DDB6DE1EBDF28519
S123F20024D53502BDF28524CE3502BDF28524C75FA680BDF28524BFBBDE22B7DE22240309
S123F2207CDE215A26EBB6DE21BDF28524A9B6DE22BDF28524A1BDF267249C810626035F9A
S123F2402002C60AF7DE215D39F6DE215D398651BDF285240CBDF2672407810626035F20F6
S123F26004C6101A015D3934308E03E8108E04E2B6E00047250A313F26F6301F26EE35B0BE
S123F280B6E00135B0343034028E03E8108E04E2B6E0004747250C313F26F5301F26ED35E0
S123F2A00235B03502B7E00135B00A0D466F726D6174696E672052414D6469736B2E2E2EBC
S123F2C020040A0D0452616D6469736B206E6F7420616C6C6F63617465642120048EF2AA77
S123F2E0BDF46A8EDE2A5FA6858101270C5CC10426F58EF2C2BDF46A39F7DE1E8EDE1BBD11
S123F300F06C8EDE464F5FA7805A26FB7FDE1F8601B7DE208EDE46B6DE1FA784B6DE204C43
S123F320810F26046C848601A701B6DE1FF6DE20BDF05B7CDE20B6DE20810F26D78601B748
S123F340DE207CDE1FB6DE1F814026C88EDE46863FC60EBDF0578EDE466F846F01863FC6E1
S123F3600EBDF05B8EDE464FC60EBDF0578EDE466F846F014FC60EBDF05B8EDE464FC60390
S123F380BDF0578EDE466F846F01CC5241ED8810CC4D44ED8812CC4953ED8814CC4B20ED73
S123F3A08816CC0001ED881BCC0101ED881D863FC60EED881FED8826CC0372ED88218601C8
S123F3C0A788238607A788248607A788254FC603BDF05B8EDE464FC601BDF0578EDE4686F2
S123F3E0AAA7848655A7014FC6017EF05B0808426F6F74696E6720696E7465726E616C2053
S123F400464C45582E2E2E2E0D0A048EF3EDBDF46A8ED3E5108EF434ECA1ED818CD3FD26D4
S123F420F78EDE00108EF44CECA1ED818CDE1E26F77ECD00F476F482DFC2DFC8F482F48288
S123F440F482F47EF482F47AF46EF4727EF0577EF05B7EF05F7EF0637EF06C7EF09F7EF093
S123F460A37EF0A77EF0BF7EF0C36E9FF80C6E9FF80A6E9FF8066E9FF8046E9FF8086E9F24
S123F480F8003953657269616C20524F4D204469736B2075706C6F6164202E2E2E0D0A04B4
S123F4A0524F4D204469736B204C6F616465640D0A048EF483BDF46A8600B7DE1E4FC601BC
S123F4C0B7DE1FF7DE2017FBFE5FBDF4EDA7C05A26F817FC26B6DE1FF6DE205CC10F26E081
S123F4E0C6014C813026D98EF4A07EF46A34048D0E484848481F898D063404ABE03584BDE0
S123F500F52829FB80302BF781092F0A81112BEF81162EEB800739B6E0008501398603B760
S123F520E0008611B7E000398610B7DE277FDE287FDE29B6E000850126088578270A8DDD41
S123F54020E6B6E0011C02397ADE2926E67ADE2826E17ADE2726DC4F1A02393402B6E000AE
S123F56085022608857827F58DB320F13502B7E001390D0A586D6F64656D20524F4D20446D
S123F58069736B2055706C6F6164040D0A55706C6F616420436F6D706C657465040D0A5552
S123F5A0706C6F6164204572726F72048EF57217FEB88601B7DE238EF61ABFDE258600B76B
S123F5C0DE1E4FC601B7DE1FF7DE2017FAF95F17002B2520A7C05A26F617FB1FB6DE1FF6C5
S123F5E0DE205CC10F26DEC6014C813026D78EF58B7EF46A17FB048EF59D16FE6D3410BE75
S123F600DE2517FF23280A861517FF4F8EF61A20F1AD8426EDBFDE253590810126068EF6CC
S123F6203A1CFA3981042608860617FF2E1A0539811826031A05391CFA39B1DE2326068E8D
S123F640F6501CFA39861517FF118EF61A1CFA3943B1DE2326EF7FDE218680B7DE248EF697
S123F660641CFA393402BBDE21B7DE2135027ADE2426038EF67B1CFE1A0439B1DE21260704
S123F6807CDE238606200D34041F305AC4801F033504861517FEC48EF61A1CFA3908084CF3
S123F6A06F616420524F4D206469736B2066726F6D20636F6E6669672050524F4D2E0446F9
S123F6C06F756E642053594E432C206C6F6164696E6720646174612E2E2E0A0D04524F4D9C
S123F6E0204469736B204C6F616465642E0A0D04524F4D204469736B204E6F7420466F7575
S123F7006E642E0A0D048EF69DBDF46A8D5A108E00208E00008D6C8D7C2715301F8C000042
S123F72026F3311F108C000026EB8EF6F07EF46A8EF6BFBDF46A4FB7DE1EC601B7DE1FF78D
S123F740DE2017F9825F8D67A7C05A26F917F9ABB6DE1FF6DE205CC10F26E1C6014C813089
S123F76026DA8EF6DD7EF46A8602B7E0C08600B7E0C08E0000301F8C000026F9BFDF46BF61
S123F780DF48398601B7E0C08600B7E0C0B6E0C04478DF493979DF4879DF4779DF46CCFF2F
S123F7A00010B3DF482607CCAA5510B3DF46393404C6088DCE5A26FBB6DF49358417FCB20A
S123F7C0847F1F89862017FCA5C1602F02C0208EF7E5E180270D30028CF7F426F58EF7F4AE
S120F7E016FC876E9442F40B4CF4B246F2DD50F70658F5AC57484154203F0A0D0431
S9030000FC
/Flex9/f9-monex.lst
0,0 → 1,1412
Assembler release DWC_2.0 version 2.11
May 6, 2004 (c) Motorola (free ware)
0001 *
0002 ** FLEX 9 DISK DRIVERS
0003 *
0004 * FOR SYS09BUG ON THE
0005 * DIGILENT SPARTAN 3 STARTER BOARD AND
0006 * TERASIC CYCLONE 2 DE1 BOARD
0007 * WITH I/O MAPPED AT $XE000
0008 * AND ROM MAPPED AT $XF000
0009 * THE DIGILENT SPARTAN 3 STARTER BOARD HAS 1MBYTE OF SRAM
0010 * THE TERASIC CYCLONE 2 DE1 BOARD HAS 512KBYTE OF SRAM
0011 * THE FIRST 64K IS USED BY FLEX,
0012 * THE SECOND 128K IS USED AS A ROM DISK
0013 * THE REMAINING RAM IS USED FOR A RAM DISK
0014 *
0015 *
0016 0001 CFLAG EQU $01 CARRY FLAG
0017 0002 VFLAG EQU $02 OVERFLOW FLAG
0018 0004 ZFLAG EQU $04 ZERO FLAG
0019 0008 NFLAG EQU $08 NEGATIVE FLAG
0020 0010 IFLAG EQU $10 IRQ MASK CC
0021 0020 HFLAG EQU $20 HALF CARRY
0022 0040 FFLAG EQU $40 FIRQ MASK CC
0023 0080 EFLAG EQU $80 ENTIRE FLAG
0024 *
0025 0000 MAPPAG EQU $00 PAGE $0000 DAT ADDRESS
f9-monex.txt, line no. 26: Symbol undefined Pass 2
0026 0000 DATREG EQU IC11 DAT REGISTERS
0027 *
0028 * Serial Port
0029 *
f9-monex.txt, line no. 30: Symbol undefined Pass 2
0030 0000 ACIAC1 EQU ACIAS
f9-monex.txt, line no. 31: Symbol undefined Pass 2
0031 0001 ACIAD1 EQU ACIAS+1
0032 04E2 DELCON EQU 1250 Delay (Processor clock in MHz * 50)
0033 *
0034 * XMODEM Control characters
0035 *
0036 0001 SOH EQU $01
0037 0004 EOT EQU $04
0038 0006 ACK EQU $06
0039 0015 NAK EQU $15
0040 0018 CAN EQU $18
0041 *
0042 * DRIVE GEOMETRY
0043 *
0044 000E EMAXSEC EQU 14 ROM DISK
0045 0030 EMAXTRK EQU 48 3 * 16 * 14 * 256 = 172,032 Bytes
0046 0292 ETOTSEC EQU EMAXTRK*EMAXSEC-EMAXSEC
0047 *
0048 000E RMAXSEC EQU 14 RAM DISK
0049 *RMAXTRK EQU 192 12 * 16 * 14 * 256 = 688,128 Bytes Digilent Spartan 3
0050 0040 RMAXTRK EQU 64 4 * 16 * 14 * 256 = 229,376 Bytes Terasic Cyclone 2
0051 0372 RTOTSEC EQU RMAXTRK*RMAXSEC-RMAXSEC
0052 *
0053 * DRIVE TYPES
0054 *
0055 0000 DTYPROM EQU 0 ROM DISK
0056 0001 DTYPRAM EQU 1 RAM DISK
0057 0002 DTYPFLS EQU 2 FLASH DISK
0058 0003 DTYPNET EQU 3 FLEXNET DISK
0059 *
0060 DE00 ORG $DE00
0061 *
0062 * DISK DRIVER JUMP TABLE LAST UPDATE: 22/12/2006
0063 * Disk driver for RAM Disk.
0064 *
0065 * 14 SECTORS PER TRACK
0066 * 16 * N TRACKS PER DISK
0067 *
0068 * ROM DISK OCCUPIES $10000 - $1E000 ... $30000 - $3E000
0069 * RAM DISK OCCUPIES $40000 - $4E000 ... $F0000 - $FE000
0070 * Track Buffer page mapped at $E000 - $EFFF
0071 * MAPPAG = $00 = 0 x $1000 (4 K pages)
0072
0073 * ON SWTPC ROM AT $XF000 AND IO AT $XE000
0074 * APPEARS THROUGHOUT THE MEMORY SO MUST BE SKIPPED OVER
0075 * WHEN USING RAM AS A RAMDISK.
0076 * THE MSN OF THE TRACK MAPS INTO THE MSN OF THE DAT
0077 * THE LSN OF THE TRACK NUMBER INDEXES INTO THE 4K RAM PAGE
0078 * THE SECTOR MAPS INTO THE LSN OF THE DAT WHICH IS INVERTED
0079 *
0080 *
0081 *
0082 * FLEX disk jump table.
0083 *
0084 DE00 0E 57 READ JMP READSC
f9-monex.txt, line no. 85: Phasing Error
0085 DE02 0E 5B WRITE JMP WRITSC
f9-monex.txt, line no. 86: Phasing Error
0086 DE04 0E 5F VERIFY JMP BUSY
f9-monex.txt, line no. 87: Phasing Error
0087 DE06 0E 63 RESTOR JMP RESTR1
f9-monex.txt, line no. 88: Phasing Error
0088 DE08 0E 6C DRIVE JMP DRVSEL
f9-monex.txt, line no. 89: Phasing Error
0089 DE0A 0E 9F DRVRDY JMP CHKRDY
f9-monex.txt, line no. 90: Phasing Error
0090 DE0C 0E A3 QUICK JMP CHKQIK
f9-monex.txt, line no. 91: Phasing Error
0091 DE0E 0E A7 COLDDR JMP DINIT
f9-monex.txt, line no. 92: Phasing Error
0092 DE10 0E BF WARMDR JMP DWARM
f9-monex.txt, line no. 93: Phasing Error
0093 DE12 0E C3 SEEK JMP SEEKTS
0094 *
0095 * RAM SPACE
0096 *
f9-monex.txt, line no. 97: Phasing Error
0097 DE14 00 DRVNUM FCB 0
f9-monex.txt, line no. 98: Phasing Error
0098 DE15 00 TRACK FCB 0
f9-monex.txt, line no. 99: Phasing Error
0099 DE16 00 SECTOR FCB 0
f9-monex.txt, line no. 100: Phasing Error
0100 DE17 00 CHKSUM FCB 0
f9-monex.txt, line no. 101: Phasing Error
0101 DE18 00 CCSAVE FCB 0
f9-monex.txt, line no. 102: Phasing Error
0102 DE19 00 BLKNUM FCB 0 Xmodem block number
f9-monex.txt, line no. 103: Phasing Error
0103 DE1A 00 BYTCNT FCB 0 Xmodem byte count
f9-monex.txt, line no. 104: Phasing Error
0104 DE1B 00 00 XSTATE FDB 0 Xmodem State Vector
f9-monex.txt, line no. 105: Phasing Error
0105 DE1D 00 00 00 DELCNT FCB $00,$00,$00 Xmodem Poll timer
0106 *
0107 * Disc driver type table.
0108 * Indexed by drive number
0109 *
f9-monex.txt, line no. 110: Phasing Error
0110 DE20 00 DTYPTAB FCB DTYPROM Drive 0 (ROM Disk)
0111 DE21 01 FCB DTYPRAM Drive 1 (RAM Disk)
0112 DE22 02 FCB DTYPFLS Drive 2 (FLASH Disk)
0113 DE23 03 FCB DTYPNET Drive 3 (NETPC Disk)
0114 *
0115 * RAM Disk offset
0116 * Indexed by drive type
0117 *
f9-monex.txt, line no. 118: Phasing Error
0118 DE24 10 DOFFTAB FCB $10 ROM Disk $10000
0119 DE25 40 FCB $40 RAM DISK $40000
0120 DE26 FF FCB $FF Flash Disk
0121 DE27 FF FCB $FF NETPC Disk
0122 *
f9-monex.txt, line no. 123: Phasing Error
0123 DE28 REAVEC RMB 2 Disc driver jump table.
f9-monex.txt, line no. 124: Phasing Error
0124 DE2A WRIVEC RMB 2
f9-monex.txt, line no. 125: Phasing Error
0125 DE2C VERVEC RMB 2
f9-monex.txt, line no. 126: Phasing Error
0126 DE2E RSTVEC RMB 2
f9-monex.txt, line no. 127: Phasing Error
0127 DE30 DRVVEC RMB 2
f9-monex.txt, line no. 128: Phasing Error
0128 DE32 CHKVEC RMB 2
f9-monex.txt, line no. 129: Phasing Error
0129 DE34 QUIVEC RMB 2
f9-monex.txt, line no. 130: Phasing Error
0130 DE36 INIVEC RMB 2
f9-monex.txt, line no. 131: Phasing Error
0131 DE38 WARVEC RMB 2
f9-monex.txt, line no. 132: Phasing Error
0132 DE3A SEEVEC RMB 2
0133 *
0134 * SECTOR BUFFER
0135 *
f9-monex.txt, line no. 136: Phasing Error
0136 DE3C BUFFER RMB 256
f9-monex.txt, line no. 137: Phasing Error
0137 DF3C SYNCREG RMB 4 Prom input register
0138 *
0139 ****************************************
0140 *
0141 * START OF EXTENSION COMMANDS
0142 *
0143 ****************************************
0144 *
f9-monex.txt, line no. 145: Symbol undefined Pass 2
0145 0000 ORG MONEXT
0146 0000 07 9C FDB NEXTEXT Jump to next extended command
0147 *
0148 *
0149 *****************************************
0150 * Disk drivers *
0151 * ------------ *
0152 * The system dependant code for the *
0153 * disc drivers fits here. Two tables *
0154 * must be included. These are DTYPTAB a *
0155 * four byte table that defines which of *
0156 * the (up to four) following sets of *
0157 * jump tables to use, and TABSRT the *
0158 * jump tables themselves. For a full *
0159 * description of the floppy drivers see *
0160 * section 4 (pp9-14) of the general *
0161 * Flex adaptation guide. *
0162 *****************************************
0163 *
0164 * Mass storage drivers for embedded applications.
0165 *
0166 * Jump tables.
0167 0002 01 17 TABSRT FDB EREAD Drive type 0 (ROM disk).
0168 0004 01 3F FDB EWRITE
0169 0006 01 3D FDB ECHECK
0170 0008 01 3D FDB ECHECK
0171 000A 01 3D FDB ECHECK
0172 000C 01 3D FDB ECHECK
0173 000E 01 3D FDB ECHECK
0174 0010 00 52 FDB DDUMMY
0175 0012 00 52 FDB DDUMMY
0176 0014 00 52 FDB DDUMMY
0177 *
0178 0016 01 17 FDB EREAD Drive type 1 (RAM disk).
0179 0018 01 3F FDB EWRITE
0180 001A 01 3D FDB ECHECK
0181 001C 01 3D FDB ECHECK
0182 001E 01 3D FDB ECHECK
0183 0020 01 3D FDB ECHECK
0184 0022 01 3D FDB ECHECK
0185 0024 00 52 FDB DDUMMY
0186 0026 00 52 FDB DDUMMY
0187 0028 00 52 FDB DDUMMY
0188 *
0189 002A 00 52 FDB DDUMMY Drive type 2 (External Flash disk).
0190 002C 00 52 FDB DDUMMY
0191 002E 00 52 FDB DDUMMY
0192 0030 00 52 FDB DDUMMY
0193 0032 00 52 FDB DDUMMY
0194 0034 00 52 FDB DDUMMY
0195 0036 00 52 FDB DDUMMY
0196 0038 00 52 FDB DDUMMY
0197 003A 00 52 FDB DDUMMY
0198 003C 00 52 FDB DDUMMY
0199 *
0200 003E 01 78 FDB NREAD Drive type 3 (NetPC drive via serial port).
0201 0040 01 E7 FDB NWRITE
0202 0042 02 47 FDB NVERIFY
0203 0044 02 4C FDB NCHECK
0204 0046 02 4C FDB NCHECK
0205 0048 02 4C FDB NCHECK
0206 004A 02 4C FDB NCHECK
0207 004C 00 52 FDB DDUMMY
0208 004E 00 52 FDB DDUMMY
0209 0050 00 52 FDB DDUMMY
0210 *
0211 *
0212 * Dummy routine (no errors).
0213 0052 5F DDUMMY CLRB
0214 0053 5D TSTB Set (z)=1
0215 0054 1C FE ANDCC #$FF-CFLAG Set (c)=0
0216 0056 39 RTS
0217 * *
0218 **************************
0219 * Main Flex entry points *
0220 *************************
0221 *
0222 * Read sector routine.
0223 * Entry: (X) = address where sector is to be placed.
0224 * (A) = Track number.
0225 * (B) = Sector number.
0226 * Exit: (B) = Error code (z)=1 if no error.
0227 0057 6E 9F DE 32 READSC JMP [REAVEC]
0228 *
0229 * Write track routine.
0230 * Entry: (X) = Address of area of memory from which the data will be taken.
0231 * (A) = Track number.
0232 * (B) = Sector number.
0233 * Exit: (B) = Error condition, (Z)=1 no an error.
0234 005B 6E 9F DE 34 WRITSC JMP [WRIVEC]
0235 *
0236 * Verify sector routine.
0237 * Entry: no parameters.
0238 * Exit: (B) = Error condition (Z)=1 if no error.
0239 005F 6E 9F DE 36 BUSY JMP [VERVEC]
0240 *
0241 * Restore drive to track 00.
0242 * Entry: (X) = FCB address (3,X contains drive number).
0243 * Exit: (B) = Error condition, (Z)=1 if no error.
0244 0063 8D 07 RESTR1 BSR DRVSEL Select drive first.
0245 0065 27 01 BEQ RST1
0246 0067 39 RTS
0247 0068 6E 9F DE 38 RST1 JMP [RSTVEC]
0248 *
0249 * Select current drive.
0250 * Entry: (X) = FCB address (3,X contains drive number).
0251 * Exit: (B) = Error condition, (Z)=0 and (c)=1 if error.
0252 * (B) = $0F if non existant drive.
0253 006C 34 30 DRVSEL PSHS X,Y
0254 006E E6 03 LDB 3,X Get driver type.
0255 0070 F7 DE 1E STB DRVNUM
0256 0073 8E DE 2A LDX #DTYPTAB
0257 0076 A6 85 LDA B,X
0258 0078 81 FF CMPA #$FF Is the drive nonexistant?
0259 007A 26 08 BNE DRIVE1
0260 007C 35 30 PULS X,Y
0261 007E C6 0F LDB #$0F
0262 0080 5D TSTB
0263 0081 1A 01 ORCC #$01
0264 0083 39 RTS
0265 *
0266 0084 C6 14 DRIVE1 LDB #20 Get correct table start address.
0267 0086 3D MUL
0268 0087 8E 00 02 LDX #TABSRT
0269 008A 30 8B LEAX D,X
0270 008C 10 8E DE 32 LDY #REAVEC Copy table into ram.
0271 0090 C6 14 LDB #20
0272 0092 A6 80 DRIVE2 LDA 0,X+
0273 0094 A7 A0 STA 0,Y+
0274 0096 5A DECB
0275 0097 26 F9 BNE DRIVE2
0276 0099 35 30 PULS X,Y
0277 009B 6E 9F DE 3A JMP [DRVVEC]
0278 *
0279 * Check for drive ready.
0280 * Entry: (X) = FCB address (3,X contains drive number)>
0281 * Exit: (B) = Error condition, (Z)=0 AND (C)=1 if drive is not ready.
0282 009F 6E 9F DE 3C CHKRDY JMP [CHKVEC]
0283 *
0284 * Quick drive ready check.
0285 * Entry: (X) = FCB address (3,X contains drive number).
0286 * Exit: (B) = Error condition, (Z)=0 AND (c)=1 if drive not ready.
0287 00A3 6E 9F DE 3E CHKQIK JMP [QUIVEC]
0288 *
0289 * Init (cold start).
0290 * Entry: no parameters.
0291 * Exit: no change.
0292 00A7 4F DINIT CLRA
0293 00A8 B7 DE 1E DINIT1 STA DRVNUM Init each valid drive in turn.
0294 00AB 8E DE 1B LDX #DRVNUM-3
0295 00AE 8D BC BSR DRVSEL
0296 00B0 25 04 BCS DINIT2
0297 00B2 AD 9F DE 40 JSR [INIVEC]
0298 00B6 B6 DE 1E DINIT2 LDA DRVNUM
0299 00B9 4C INCA
0300 00BA 81 04 CMPA #4
0301 00BC 26 EA BNE DINIT1
0302 00BE 39 RTS
0303 *
0304 * Warm start.
0305 * Entry: no parameters.
0306 * Exit: no change.
0307 00BF 6E 9F DE 42 DWARM JMP [WARVEC]
0308 *
0309 * Seek track.
0310 * Entry: (A) = Track number.
0311 * (B) = Sector number.
0312 * Exit: (B) = Error condition, (Z)=1 if no error.
0313 00C3 6E 9F DE 44 SEEKTS JMP [SEEVEC]
0314 *
0315 *
0316 *****************************************************
0317 * ROMdisk drivers *
0318 * --------------- *
0319 * Drivers to support a ROMdisk in the external RAM *
0320 * of the SYS09. The ROMdisk base address is $10000 *
0321 *****************************************************
0322 * Dummy return for ROM disk (write protected!)
0323 *
0324 * MAP RAM DISK INTO MEMORY SPACE
0325 *
0326 00C7 1F A8 MAPIN TFR CC,A ; Save state of interrupt masks
0327 00C9 B7 DE 22 STA CCSAVE
0328 00CC 1A 50 ORCC #FFLAG+IFLAG ; Mask interrupts while IO mapped out
0329 00CE CE DE 2A LDU #DTYPTAB ; Point to Drive Type table
0330 00D1 F6 DE 1E LDB DRVNUM ; Get working drive number
0331 00D4 E6 C5 LDB B,U
0332 00D6 CE DE 2E LDU #DOFFTAB
0333 00D9 B6 DE 1F LDA TRACK
0334 00DC AB C5 ADDA B,U ; Add Base offset into RAM
0335 00DE 84 F0 ANDA #$F0 ; Mask MSN
0336 00E0 A7 E2 STA ,-S ; Save A on stack
0337 *
0338 00E2 B6 DE 20 LDA SECTOR
0339 00E5 80 01 SUBA #1 ; Sectors 1 to 14 => 0 to 13
0340 00E7 88 0F EORA #$0F ; Complement LSNybble
0341 00E9 84 0F ANDA #$0F
0342 *
0343 00EB AB E0 ADDA ,S+ ; Add sector to LSN of Track and pop
0344 00ED 97 00 STA DATREG+MAPPAG
0345 *
0346 00EF B6 DE 1F LDA TRACK ; LSN of Track indexes into 4K page
0347 00F2 84 0F ANDA #$0F
0348 00F4 8B 00 ADDA #MAPPAG*16
0349 00F6 5F CLRB
0350 00F7 1F 03 TFR D,U
0351 00F9 39 RTS
0352 *
0353 * MAP RAM DISK OUT OF MEMORY
0354 *
0355 00FA 86 00 MAPOUT LDA #MAPPAG ; Point to the Flex page
0356 00FC 88 0F EORA #$0F ; Complement LSNybble
0357 00FE 97 00 STA DATREG+MAPPAG ; map in Flex page
0358 0100 B6 DE 22 LDA CCSAVE ; restore interrupt masks
0359 0103 1F 8A TFR A,CC
0360 0105 39 RTS
0361 *
0362 * Seek track and sector
0363 * A holds track number (0-32)
0364 * B holds sector number (1-14)
0365 *
0366 0106 B7 DE 1F ESEEK STA TRACK
0367 0109 F7 DE 20 STB SECTOR
0368 010C 1C FE ANDCC #$FE ; CLEAR CARRY
0369 010E 1A 04 ORCC #$04 ; SET Z
0370 0110 39 RTS
0371 *
0372 * MARK DISK READ ONLY
0373 *
0374 0111 C6 40 EDUMMY LDB #$40
0375 0113 5D TSTB
0376 0114 1A 01 ORCC #$01
0377 0116 39 RTS
0378 *
0379 0117 34 70 EREAD PSHS X,Y,U push sequentialy to preserve order on stack
0380 0119 17 FF EA LBSR ESEEK
0381 011C 17 FF A8 LBSR MAPIN build external ram address
0382 *
0383 011F 10 8E DE 46 LDY #BUFFER
0384 0123 5F CLRB
0385 0124 A6 C0 ERLOOP1 LDA 0,U+ move 256 bytes to buffer from external RAM
0386 0126 A7 A0 STA 0,Y+
0387 0128 5A DECB
0388 0129 26 F9 BNE ERLOOP1
0389 *
0390 012B 17 FF CC LBSR MAPOUT
0391 *
0392 012E 10 8E DE 46 LDY #BUFFER
0393 0132 5F CLRB
0394 0133 A6 A0 ERLOOP2 LDA 0,Y+ move 256 bytes from buffer to Flex RAM
0395 0135 A7 80 STA 0,X+
0396 0137 5A DECB
0397 0138 26 F9 BNE ERLOOP2
0398 *
0399 013A 5F CLRB
0400 013B 35 F0 PULS X,Y,U,PC restore all registers
0401 *
0402 * check for marker bytes $AA55 in first bytes of first track/sector
0403 *
0404 *ECHECK CLRA
0405 * LDB #1
0406 * LDX #BUFFER
0407 * BSR EREAD
0408 * LDD BUFFER
0409 * CMPD #$AA55
0410 * BNE EERR
0411 * LBRA DDUMMY
0412 *EERR LDB #$80 not ready bit set
0413 * TSTB
0414 * ORCC #$01
0415 * RTS
0416 013D 5F ECHECK CLRB
0417 013E 39 RTS
0418 *
0419 * Write Sector
0420 *
0421 013F 34 70 EWRITE PSHS X,Y,U
0422 0141 17 FF C2 LBSR ESEEK
0423 0144 CE DE 2A LDU #DTYPTAB ; Point to Drive Type table
0424 0147 F6 DE 1E LDB DRVNUM ; Get working drive number
0425 014A E6 C5 LDB B,U ; Fetch Drive type
0426 014C C1 01 CMPB #DTYPRAM ; Is it a RAM Disk ?
0427 014E 27 07 BEQ EWOK ; Yep, can write to it
0428 0150 C1 00 CMPB #DTYPROM ; Allow writes to ROM Disk too
0429 0152 27 03 BEQ EWOK
0430 0154 16 FF BA LBRA EDUMMY ; Nope report read only
0431 *
0432 0157 10 8E DE 46 EWOK LDY #BUFFER
0433 015B 5F CLRB
0434 015C A6 80 EWLOOP1 LDA 0,X+ move 256 bytes to buffer from Flex RAM
0435 015E A7 A0 STA 0,Y+
0436 0160 5A DECB
0437 0161 26 F9 BNE EWLOOP1
0438 *
0439 0163 17 FF 61 LBSR MAPIN
0440 *
0441 0166 10 8E DE 46 LDY #BUFFER
0442 016A 5F CLRB
0443 016B A6 A0 EWLOOP2 LDA 0,Y+ move 256 bytes from buffer to external RAM
0444 016D A7 C0 STA 0,U+
0445 016F 5A DECB
0446 0170 26 F9 BNE EWLOOP2
0447 *
0448 0172 17 FF 85 LBSR MAPOUT
0449 *
0450 0175 5F CLRB
0451 0176 35 F0 PULS X,Y,U,PC
0452 *
0453 *
0454 *****************************************************
0455 * FlexNet drivers *
0456 * --------------- *
0457 * Drivers to support a remote connection via the *
0458 * serial port using the FlexNet protocol as defined *
0459 * in FLEXNet_421B *
0460 *****************************************************
0461 *
0462 *
0463 * read sector from remote drive
0464 *
0465 0178 34 04 NREAD PSHS B
0466 017A 34 02 PSHS A
0467 017C 7F DE 21 CLR CHKSUM clear checksum
0468 017F 7F DE 22 CLR CHKSUM+1
0469 *
0470 0182 86 73 LDA #'s Send read sector command
0471 0184 BD 02 81 JSR SCHAR
0472 0187 24 4C BCC NRD_DNR if timeout, then flag drive not ready
0473 *
0474 0189 B6 DE 1E LDA DRVNUM send drive
0475 018C BD 02 81 JSR SCHAR
0476 018F 24 44 BCC NRD_DNR
0477 *
0478 0191 35 02 PULS A send track
0479 0193 BD 02 81 JSR SCHAR
0480 0196 24 3D BCC NRD_DNR
0481 *
0482 0198 35 02 PULS A send sector
0483 019A BD 02 81 JSR SCHAR
0484 019D 24 36 BCC NRD_DNR
0485 *
0486 * transfer 256 bytes
0487 019F 5F CLRB
0488 01A0 BD 02 65 NREAD1 JSR RCHAR read byte
0489 01A3 24 30 BCC NRD_DNR if timeout, then flag drive not ready
0490 01A5 A7 80 STA 0,X+
0491 01A7 BB DE 22 ADDA CHKSUM+1 update checksum
0492 01AA B7 DE 22 STA CHKSUM+1
0493 01AD 24 03 BCC NREAD2
0494 01AF 7C DE 21 INC CHKSUM
0495 01B2 5A NREAD2 DECB
0496 01B3 26 EB BNE NREAD1
0497 *
0498 * compare checksums
0499 01B5 BD 02 65 JSR RCHAR get checksum msb
0500 01B8 24 1B BCC NRD_DNR
0501 01BA 34 02 PSHS A
0502 01BC BD 02 65 JSR RCHAR get checksum lsb
0503 01BF 24 14 BCC NRD_DNR
0504 01C1 1F 89 TFR A,B
0505 01C3 35 02 PULS A
0506 01C5 10 B3 DE 21 CMPD CHKSUM compare checksums
0507 01C9 26 0E BNE NRD_ERR if checksum error, then flag crc read error
0508 *
0509 01CB 86 06 LDA #ACK no checksum error, send ACK char
0510 01CD BD 02 81 JSR SCHAR
0511 01D0 24 03 BCC NRD_DNR
0512 01D2 5F CLRB all OK, flag no error
0513 01D3 20 0D BRA NRD_END
0514 *
0515 01D5 C6 10 NRD_DNR LDB #16 flag drive not ready
0516 01D7 20 09 BRA NRD_END
0517 *
0518 01D9 86 15 NRD_ERR LDA #NAK send NAK
0519 01DB BD 02 81 JSR SCHAR
0520 01DE 24 F5 BCC NRD_DNR
0521 01E0 C6 09 LDB #09 flag crc read error
0522 *
0523 01E2 F7 DE 21 NRD_END STB CHKSUM used by VERIFY
0524 01E5 5D TSTB
0525 01E6 39 RTS
0526 *
0527 *
0528 * write sector to remote drive
0529 *
0530 01E7 34 04 NWRITE PSHS B
0531 01E9 34 02 PSHS A
0532 01EB 7F DE 21 CLR CHKSUM clear checksum
0533 01EE 7F DE 22 CLR CHKSUM+1
0534 *
0535 01F1 86 72 LDA #'r Send write sector command
0536 01F3 BD 02 81 JSR SCHAR
0537 01F6 24 DD BCC NRD_DNR if timeout, then flag drive not ready
0538 *
0539 01F8 B6 DE 1E LDA DRVNUM send drive
0540 01FB BD 02 81 JSR SCHAR
0541 01FE 24 D5 BCC NRD_DNR
0542 *
0543 0200 35 02 PULS A send track
0544 0202 BD 02 81 JSR SCHAR
0545 0205 24 CE BCC NRD_DNR
0546 *
0547 0207 35 02 PULS A send sector
0548 0209 BD 02 81 JSR SCHAR
0549 020C 24 C7 BCC NRD_DNR
0550 *
0551 * transfer 256 bytes
0552 020E 5F CLRB
0553 020F A6 80 NWRITE1 LDA 0,X+
0554 0211 BD 02 81 JSR SCHAR write byte
0555 0214 24 BF BCC NRD_DNR if timeout, then flag drive not ready
0556 0216 BB DE 22 ADDA CHKSUM+1 update checksum
0557 0219 B7 DE 22 STA CHKSUM+1
0558 021C 24 03 BCC NWRITE2
0559 021E 7C DE 21 INC CHKSUM
0560 0221 5A NWRITE2 DECB
0561 0222 26 EB BNE NWRITE1
0562 *
0563 * compare checksums
0564 0224 B6 DE 21 LDA CHKSUM
0565 0227 BD 02 81 JSR SCHAR send checksum msb
0566 022A 24 A9 BCC NRD_DNR
0567 022C B6 DE 22 LDA CHKSUM+1
0568 022F BD 02 81 JSR SCHAR send checksum lsb
0569 0232 24 A1 BCC NRD_DNR
0570 *
0571 0234 BD 02 65 JSR RCHAR get checksum response
0572 0237 24 9C BCC NRD_DNR
0573 0239 81 06 CMPA #ACK
0574 023B 26 03 BNE NWR_ERR if checksum error, then flag write error
0575 *
0576 023D 5F CLRB all OK, flag no error
0577 023E 20 02 BRA NWR_END
0578 *
0579 0240 C6 0A NWR_ERR LDB #10 flag write error
0580 *
0581 0242 F7 DE 21 NWR_END STB CHKSUM used by VERIFY
0582 0245 5D TSTB
0583 0246 39 RTS
0584 *
0585 *
0586 * verify last sector written to remote drive
0587 *
0588 0247 F6 DE 21 NVERIFY LDB CHKSUM test last checksum
0589 024A 5D TSTB
0590 024B 39 RTS
0591 *
0592 *
0593 * quck check and check drive ready
0594 *
0595 024C 86 51 NCHECK LDA #'Q quick check command
0596 024E BD 02 81 JSR SCHAR
0597 0251 24 0C BCC NCK_ERR if timeout, then flag drive not ready
0598
0599 0253 BD 02 65 JSR RCHAR get response from host
0600 0256 24 07 BCC NCK_ERR
0601 0258 81 06 CMPA #ACK
0602 025A 26 03 BNE NCK_ERR if NAK, then flag drive not ready
0603
0604 025C 5F CLRB all OK, flag drive ready
0605 025D 20 04 BRA NCK_END
0606 *
0607 025F C6 10 NCK_ERR LDB #16 report drive not ready
0608 0261 1A 01 ORCC #$01 check needs carry set as well
0609 *
0610 0263 5D NCK_END TSTB
0611 0264 39 RTS
0612 *
0613 *
0614 * recieve char from remote drive.
0615 * timeout if no response for approx 1s.
0616 * Entry: no parameters
0617 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
0618 *
0619 0265 34 30 RCHAR PSHS X,Y
0620 *
0621 0267 8E 03 E8 LDX #1000 1000x inner loop
0622 026A 10 8E 04 E2 RCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
0623 026E 96 00 RCHAR2 LDA ACIAC1 test for recieved char
0624 0270 47 ASRA
0625 0271 25 0A BCS RCHAR3 get character
0626 0273 31 3F LEAY -1,Y else, continue to count delay
0627 0275 26 F7 BNE RCHAR2
0628 0277 30 1F LEAX -1,X
0629 0279 26 EF BNE RCHAR1
0630 027B 35 B0 PULS X,Y,PC return with error if timed out
0631 *
0632 027D 96 01 RCHAR3 LDA ACIAD1 return data (carry bit still set)
0633 027F 35 B0 PULS X,Y,PC
0634 *
0635 *
0636 * transmit char to remote drive.
0637 * timeout if no response for approx 1s. (allows for use of hardware flow control)
0638 * Entry: (A) = char to transmit
0639 * Exit: (A) = recieved char, (C)=1 if valid char, (C)=0 if timeout.
0640 *
0641 0281 34 30 SCHAR PSHS X,Y
0642 0283 34 02 PSHS A
0643 *
0644 0285 8E 03 E8 LDX #1000 1000x inner loop
0645 0288 10 8E 04 E2 SCHAR1 LDY #DELCON delay constant for inner loop (approx 1ms).
0646 028C 96 00 SCHAR2 LDA ACIAC1 test for space in transmit FIFO
0647 028E 47 ASRA
0648 028F 47 ASRA
0649 0290 25 0C BCS SCHAR3 send character
0650 0292 31 3F LEAY -1,Y else, continue to count delay
0651 0294 26 F6 BNE SCHAR2
0652 0296 30 1F LEAX -1,X
0653 0298 26 EE BNE SCHAR1
0654 029A 35 02 PULS A
0655 029C 35 B0 PULS X,Y,PC return with error if timed out
0656 *
0657 029E 35 02 SCHAR3 PULS A
0658 02A0 97 01 STA ACIAD1 send data (carry bit still set)
0659 02A2 35 B0 PULS X,Y,PC
0660 *
0661 ** 'UF' Format RAMdisc to FLEX standard.
0662 *
0663 02A4 0A 0D DISFOS FCB $0A,$0D
0664 02A6 46 6F 72 6D 61 74 FCC 'Formating RAMdisk... '
69 6E 67 20 52 41
4D 64 69 73 6B 2E
2E 2E 20
0665 02BB 04 FCB 4
0666 02BC 0A 0D 04 MESS6 FCB $0A,$0D,4
0667 02BF 52 61 6D 64 69 73 FCC 'Ramdisk not allocated! '
6B 20 6E 6F 74 20
61 6C 6C 6F 63 61
74 65 64 21 20
0668 02D6 04 FCB 4
0669 *
0670 02D7 8E 02 A4 UFSUB LDX #DISFOS
0671 02DA BD 04 50 JSR PDATA1
0672 02DD 8E DE 2A LDX #DTYPTAB search for allocated ramdisk
0673 02E0 5F CLRB
0674 02E1 A6 85 FMT9 LDA B,X
0675 02E3 81 01 CMPA #DTYPRAM driver type 1 is ramdisk
0676 02E5 27 0C BEQ FFOUND
0677 02E7 5C INCB
0678 02E8 C1 04 CMPB #4 end of table? then not allocated.
0679 02EA 26 F5 BNE FMT9
0680 02EC 8E 02 BC LDX #MESS6
0681 02EF BD 04 50 JSR PDATA1
0682 02F2 39 RTS
0683 *
0684 02F3 F7 DE 1E FFOUND STB DRVNUM
0685 02F6 8E DE 1B LDX #DRVNUM-3
0686 02F9 9D 6C JSR DRVSEL
0687 *
0688 * set up free chain
0689 *
0690 02FB 8E DE 46 LDX #BUFFER clear out buffer
0691 02FE 4F CLRA
0692 02FF 5F CLRB
0693 0300 A7 80 DFL1 STA 0,X+
0694 0302 5A DECB
0695 0303 26 FB BNE DFL1
0696 *
0697 0305 7F DE 1F CLR TRACK
0698 0308 86 01 LDA #1
0699 030A B7 DE 20 STA SECTOR
0700 030D 8E DE 46 DFL2 LDX #BUFFER
0701 0310 B6 DE 1F LDA TRACK
0702 0313 A7 84 STA 0,X
0703 0315 B6 DE 20 LDA SECTOR
0704 0318 4C INCA
0705 0319 81 0F CMPA #RMAXSEC+1 last sector on track?
0706 031B 26 04 BNE DFL3
0707 031D 6C 84 INC 0,X
0708 031F 86 01 LDA #1
0709 0321 A7 01 DFL3 STA 1,X
0710 0323 B6 DE 1F LDA TRACK
0711 0326 F6 DE 20 LDB SECTOR
0712 0329 9D 5B JSR WRITSC
0713 032B 7C DE 20 INC SECTOR
0714 032E B6 DE 20 LDA SECTOR
0715 0331 81 0F CMPA #RMAXSEC+1
0716 0333 26 D8 BNE DFL2
0717 0335 86 01 LDA #1
0718 0337 B7 DE 20 STA SECTOR
0719 033A 7C DE 1F INC TRACK
0720 033D B6 DE 1F LDA TRACK
0721 0340 81 40 CMPA #RMAXTRK
0722 0342 26 C9 BNE DFL2
0723 * break free chain at last track/sector
0724 0344 8E DE 46 LDX #BUFFER
0725 0347 86 3F LDA #RMAXTRK-1
0726 0349 C6 0E LDB #RMAXSEC
0727 034B 9D 57 JSR READSC
0728 034D 8E DE 46 LDX #BUFFER
0729 0350 6F 84 CLR 0,X
0730 0352 6F 01 CLR 1,X
0731 0354 86 3F LDA #RMAXTRK-1
0732 0356 C6 0E LDB #RMAXSEC
0733 0358 9D 5B JSR WRITSC
0734 * set up sector structure, SIR, directory etc
0735 035A 8E DE 46 LDX #BUFFER
0736 035D 4F CLRA
0737 035E C6 0E LDB #RMAXSEC
0738 0360 9D 57 JSR READSC
0739 0362 8E DE 46 LDX #BUFFER
0740 0365 6F 84 CLR 0,X break end of directory chain
0741 0367 6F 01 CLR 1,X
0742 0369 4F CLRA
0743 036A C6 0E LDB #RMAXSEC
0744 036C 9D 5B JSR WRITSC
0745 *
0746 036E 8E DE 46 LDX #BUFFER
0747 0371 4F CLRA
0748 0372 C6 03 LDB #3 set up SIR
0749 0374 9D 57 JSR READSC
0750 0376 8E DE 46 LDX #BUFFER
0751 0379 6F 84 CLR 0,X break forward link
0752 037B 6F 01 CLR 1,X
0753 037D CC 52 41 LDD #$5241 set volume name (RAMDISK )
0754 0380 ED 88 10 STD 16,X
0755 0383 CC 4D 44 LDD #$4D44
0756 0386 ED 88 12 STD 18,X
0757 0389 CC 49 53 LDD #$4953
0758 038C ED 88 14 STD 20,X
0759 038F CC 4B 20 LDD #$4B20
0760 0392 ED 88 16 STD 22,X
0761 0395 CC 00 01 LDD #1 volume number
0762 0398 ED 88 1B STD 27,X
0763 039B CC 01 01 LDD #$0101 first trk/sec 01-01
0764 039E ED 88 1D STD 29,X
0765 03A1 86 3F LDA #RMAXTRK-1
0766 03A3 C6 0E LDB #RMAXSEC
0767 03A5 ED 88 1F STD 31,X
0768 03A8 ED 88 26 STD 38,X
0769 03AB CC 03 72 LDD #RTOTSEC total DATA sectors (2912-14)
0770 03AE ED 88 21 STD 33,X
0771 *
0772 03B1 86 01 LDA #01 month set default creation date (SYS09's birthday!)
0773 03B3 A7 88 23 STA 35,X
0774 03B6 86 07 LDA #07 day
0775 03B8 A7 88 24 STA 36,X
0776 03BB 86 07 LDA #07 year
0777 03BD A7 88 25 STA 37,X
0778 *
0779 03C0 4F RF3 CLRA
0780 03C1 C6 03 LDB #3
0781 03C3 9D 5B JSR WRITSC
0782 *
0783 03C5 8E DE 46 LDX #BUFFER
0784 03C8 4F CLRA
0785 03C9 C6 01 LDB #1
0786 03CB 9D 57 JSR READSC
0787 03CD 8E DE 46 LDX #BUFFER
0788 03D0 86 AA LDA #$AA set the init flag
0789 03D2 A7 84 STA 0,X
0790 03D4 86 55 LDA #$55
0791 03D6 A7 01 STA 1,X
0792 03D8 4F CLRA
0793 03D9 C6 01 LDB #1
0794 03DB 0E 5B JMP WRITSC
0795 *
0796 ********************************
0797 * System specific Boot *
0798 * command goes here. *
0799 ********************************
0800 *
0801 * Boot FLEX from the FPGA's internal pre-loaded scratch RAM
0802 *
0803 03DD 08 08 UBMESS FCB $08, $08
0804 03DF 42 6F 6F 74 69 6E FCC 'Booting internal FLEX....'
67 20 69 6E 74 65
72 6E 61 6C 20 46
4C 45 58 2E 2E 2E
2E
0805 03F8 0D 0A 04 FCB $0D,$0A,$04
0806 *
0807 03FB 8E 03 DD UBSUB LDX #UBMESS
0808 03FE BD 04 50 JSR PDATA1
0809 *
0810 0401 8E D3 E5 LDX #$D3E5
0811 0404 10 8E 04 24 LDY #CONTAB Overlay console driver table
0812 0408 EC A1 UB1 LDD 0,Y++
0813 040A ED 81 STD 0,X++
0814 040C 8C D3 FD CMPX #$D3FD
0815 040F 26 F7 BNE UB1
0816 *
0817 0411 8E DE 00 LDX #$DE00 Overlay disk driver table
0818 0414 10 8E 04 3C LDY #DISTAB
0819 0418 EC A1 UB2 LDD 0,Y++
0820 041A ED 81 STD 0,X++
0821 041C 8C DE 1E CMPX #$DE1E
0822 041F 26 F7 BNE UB2
0823 *
0824 0421 7E CD 00 UBEND JMP $CD00
0825 *
0826 * FLEX console jump table.
0827 0424 04 5C CONTAB FDB INPNE INPUT NO ECHO
0828 0426 04 68 FDB DUMMY INTERRUPT HANDLER
f9-monex.txt, line no. 829: Symbol undefined Pass 2
0829 0428 00 02 FDB MONRAM+$02 SWI VECTOR
f9-monex.txt, line no. 830: Symbol undefined Pass 2
0830 042A 00 08 FDB MONRAM+$08 IRQ VECTOR
0831 042C 04 68 FDB DUMMY TIMER OFF
0832 042E 04 68 FDB DUMMY TIMER ON
0833 0430 04 68 FDB DUMMY TIMER INITIALIZATION
0834 0432 04 64 FDB CONTRL MONITOR
0835 0434 04 68 FDB DUMMY TERMINAL INITIALIZATION
0836 0436 04 60 FDB STATUS INPUT CHECK
0837 0438 04 54 FDB OUTP TERMINAL OUTPUT
0838 043A 04 58 FDB INPE TERMINAL INPUT WITH ECHO
0839 *
0840 * FLEX disk jump table.
0841 043C 0E 57 DISTAB JMP READSC
0842 043E 0E 5B JMP WRITSC
0843 0440 0E 5F JMP BUSY
0844 0442 0E 63 JMP RESTR1
0845 0444 0E 6C JMP DRVSEL
0846 0446 0E 9F JMP CHKRDY
0847 0448 0E A3 JMP CHKQIK
0848 044A 0E A7 JMP DINIT
0849 044C 0E BF JMP DWARM
0850 044E 0E C3 JMP SEEKTS
0851 *
0852 * Monitor jumps
0853 *
f9-monex.txt, line no. 854: Symbol undefined Pass 2
0854 0450 6E 9F 00 00 PDATA1 JMP [PDATAV]
f9-monex.txt, line no. 855: Symbol undefined Pass 2
0855 0454 6E 9F 00 00 OUTP JMP [OUTCHV]
f9-monex.txt, line no. 856: Symbol undefined Pass 2
0856 0458 6E 9F 00 00 INPE JMP [INCHEV]
f9-monex.txt, line no. 857: Symbol undefined Pass 2
0857 045C 6E 9F 00 00 INPNE JMP [INCHV]
f9-monex.txt, line no. 858: Symbol undefined Pass 2
0858 0460 6E 9F 00 00 STATUS JMP [INCHKV]
f9-monex.txt, line no. 859: Symbol undefined Pass 2
0859 0464 6E 9F 00 00 CONTRL JMP [MONITV]
0860 0468 39 DUMMY RTS
0861 *
0862 ** 'UL' LOAD ROM DISK VIA SERIAL PORT
0863 *
0864 0469 53 65 72 69 61 6C ULMES FCC 'Serial ROM Disk upload ...'
20 52 4F 4D 20 44
69 73 6B 20 75 70
6C 6F 61 64 20 2E
2E 2E
0865 0483 0D 0A 04 FCB $0D,$0A,$04
0866 0486 52 4F 4D 20 44 69 ULMES1 FCC 'ROM Disk Loaded'
73 6B 20 4C 6F 61
64 65 64
0867 0495 0D 0A 04 FCB $0D,$0A,$04
0868 *
0869 0498 8E 04 69 ULSUB LDX #ULMES
0870 049B BD 04 50 JSR PDATA1
0871 *
0872 049E 86 00 LDA #$00
0873 04A0 B7 DE 1E STA DRVNUM
0874 04A3 4F CLRA TRACK 0
0875 04A4 C6 01 LDB #$01 SECTOR 1
0876 04A6 B7 DE 1F ULLOOP0 STA TRACK
0877 04A9 F7 DE 20 STB SECTOR`
0878 04AC 17 FC 18 LBSR MAPIN
0879 *
0880 04AF 5F CLRB xfer 256 bytes at a time.
0881 04B0 BD 04 D3 ULLOOP1 JSR LRBYTE transfer should be hex bytes
0882 04B3 A7 C0 STA ,U+
0883 04B5 5A DECB
0884 04B6 26 F8 BNE ULLOOP1
0885 *
0886 04B8 17 FC 3F LBSR MAPOUT
0887 *
0888 04BB B6 DE 1F LDA TRACK
0889 04BE F6 DE 20 LDB SECTOR
0890 04C1 5C INCB
0891 04C2 C1 0F CMPB #EMAXSEC+1
0892 04C4 26 E0 BNE ULLOOP0
0893 04C6 C6 01 LDB #1
0894 04C8 4C INCA
0895 04C9 81 30 CMPA #EMAXTRK
0896 04CB 26 D9 BNE ULLOOP0
0897 *
0898 04CD 8E 04 86 ULEXIT LDX #ULMES1
0899 04D0 7E 04 50 JMP PDATA1
0900 *
0901 * Read a byte from the serial port
0902 *
0903 04D3 34 04 LRBYTE PSHS B
0904 04D5 8D 0E BSR LRHEX Get hex digit.
0905 04D7 48 ASLA
0906 04D8 48 ASLA Shift to msb.
0907 04D9 48 ASLA
0908 04DA 48 ASLA
0909 04DB 1F 89 TFR A,B Save in B.
0910 04DD 8D 06 BSR LRHEX Get next digit.
0911 04DF 34 04 PSHS B
0912 04E1 AB E0 ADDA 0,S+ Add together bytes.
0913 04E3 35 84 PULS B,PC
0914 *
0915 04E5 BD 05 0B LRHEX JSR INTER
0916 04E8 29 FB BVS LRHEX
0917 04EA 80 30 SUBA #$30 Remove ascii bias.
0918 04EC 2B F7 BMI LRHEX
0919 04EE 81 09 CMPA #$09 Number?
0920 04F0 2F 0A BLE LRHEX1 Yes.
0921 04F2 81 11 CMPA #$11 Keep testing.
0922 04F4 2B EF BMI LRHEX
0923 04F6 81 16 CMPA #$16
0924 04F8 2E EB BGT LRHEX
0925 04FA 80 07 SUBA #$07
0926 04FC 39 LRHEX1 RTS
0927 *
0928 * ACIA INPUT TEST
0929 *
0930 04FD 96 00 INTEST LDA ACIAC1
0931 04FF 85 01 BITA #$01
0932 0501 39 RTS
0933 *
0934 * RESET ACIA
0935 *
0936 0502 86 03 ACIRST LDA #$03 master reset
0937 0504 97 00 STA ACIAC1
0938 0506 86 11 LDA #$11
0939 0508 97 00 STA ACIAC1
0940 050A 39 RTS
0941 *
0942 * ACIA INPUT
0943 *
0944 050B 86 10 INTER LDA #16
0945 050D B7 DE 27 STA DELCNT+0
0946 0510 7F DE 28 CLR DELCNT+1
0947 0513 7F DE 29 CLR DELCNT+2
0948 0516 96 00 INTER0 LDA ACIAC1
0949 0518 85 01 BITA #$01
0950 051A 26 08 BNE INTER1
0951 051C 85 78 BITA #$78
0952 051E 27 09 BEQ INTER2
0953 0520 8D E0 BSR ACIRST
0954 0522 20 E7 BRA INTER
0955 *
0956 0524 96 01 INTER1 LDA ACIAD1
0957 0526 1C 02 ANDCC #VFLAG
0958 0528 39 RTS
0959 *
0960 0529 7A DE 29 INTER2 DEC DELCNT+2
0961 052C 26 E8 BNE INTER0
0962 052E 7A DE 28 DEC DELCNT+1
0963 0531 26 E3 BNE INTER0
0964 0533 7A DE 27 DEC DELCNT+0
0965 0536 26 DE BNE INTER0
0966 0538 4F CLRA
0967 0539 1A 02 ORCC #VFLAG
0968 053B 39 RTS
0969 *
0970 * ACIA OUTPUT
0971 *
0972 053C 34 02 OUTTER PSHS A
0973 *
0974 053E 96 00 OUTTE1 LDA ACIAC1
0975 0540 85 02 BITA #$02
0976 0542 26 08 BNE OUTTE2
0977 0544 85 78 BITA #$78
0978 0546 27 F6 BEQ OUTTE1
0979 0548 8D B8 BSR ACIRST
0980 054A 20 F2 BRA OUTTE1
0981 *
0982 054C 35 02 OUTTE2 PULS A
0983 054E 97 01 STA ACIAD1
0984 0550 39 RTS
0985 *
0986 ** 'UX' Xmodem ROM Disk upload
0987 *
0988 0551 0D 0A UXMES FCB $0D,$0A
0989 0553 58 6D 6F 64 65 6D FCC 'Xmodem ROM Disk Upload'
20 52 4F 4D 20 44
69 73 6B 20 55 70
6C 6F 61 64
0990 0569 04 FCB 4
0991 056A 0D 0A UXMES1 FCB $0D,$0A
0992 056C 55 70 6C 6F 61 64 FCC 'Upload Complete'
20 43 6F 6D 70 6C
65 74 65
0993 057B 04 FCB 4
0994 057C 0D 0A UXMES2 FCB $0D,$0A
0995 057E 55 70 6C 6F 61 64 FCC 'Upload Error'
20 45 72 72 6F 72
0996 058A 04 FCB 4
0997 *
0998 058B 8E 05 51 UXSUB LDX #UXMES
0999 058E 17 FE BF LBSR PDATA1
1000 *
1001 0591 86 01 LDA #1
1002 0593 B7 DE 23 STA BLKNUM
1003 0596 8E 05 F9 LDX #XSTSTR
1004 0599 BF DE 25 STX XSTATE
1005 *
1006 059C 86 00 LDA #$00
1007 059E B7 DE 1E STA DRVNUM
1008 05A1 4F CLRA TRACK 0
1009 05A2 C6 01 LDB #$01 SECTOR 1
1010 05A4 B7 DE 1F UXLOOP0 STA TRACK
1011 05A7 F7 DE 20 STB SECTOR
1012 05AA 17 FB 1A LBSR MAPIN
1013 *
1014 05AD 5F CLRB xfer 256 bytes at a time.
1015 05AE 17 00 2B UXLOOP1 LBSR XBYTE transfer should be hex bytes
1016 05B1 25 20 BCS UXERR
1017 05B3 A7 C0 STA ,U+
1018 05B5 5A DECB
1019 05B6 26 F6 BNE UXLOOP1
1020 *
1021 05B8 17 FB 3F LBSR MAPOUT
1022 *
1023 05BB B6 DE 1F LDA TRACK
1024 05BE F6 DE 20 LDB SECTOR
1025 05C1 5C INCB
1026 05C2 C1 0F CMPB #EMAXSEC+1
1027 05C4 26 DE BNE UXLOOP0
1028 05C6 C6 01 LDB #1
1029 05C8 4C INCA
1030 05C9 81 30 CMPA #EMAXTRK
1031 05CB 26 D7 BNE UXLOOP0
1032 *
1033 05CD 8E 05 6A UXEXIT LDX #UXMES1
1034 05D0 7E 04 50 JMP PDATA1
1035 *
1036 05D3 17 FB 24 UXERR LBSR MAPOUT
1037 05D6 8E 05 7C LDX #UXMES2
1038 05D9 16 FE 74 LBRA PDATA1
1039 *
1040 * Get a Byte using XModem protocol
1041 * Carry clear => no errors
1042 * Carry set => errors
1043 *
1044 05DC 34 10 XBYTE PSHS X
1045 05DE BE DE 25 LDX XSTATE
1046 *
1047 05E1 17 FF 27 XBYTE0 LBSR INTER
1048 05E4 28 0A BVC XBYTE1
1049 05E6 86 15 LDA #NAK
1050 05E8 17 FF 51 LBSR OUTTER
1051 05EB 8E 05 F9 LDX #XSTSTR
1052 05EE 20 F1 BRA XBYTE0
1053 *
1054 05F0 AD 84 XBYTE1 JSR ,X
1055 05F2 26 ED BNE XBYTE0
1056 05F4 BF DE 25 STX XSTATE
1057 05F7 35 90 PULS X,PC
1058 *
1059 * START - LOOK FOR SOH (START OF HEADER) = $01
1060 *
1061 05F9 81 01 XSTSTR CMPA #SOH
1062 05FB 26 06 BNE XSTSTR1
1063 05FD 8E 06 19 LDX #XSTBLK
1064 0600 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
1065 0602 39 RTS
1066 *
1067 0603 81 04 XSTSTR1 CMPA #EOT
1068 0605 26 08 BNE XSTSTR2
1069 0607 86 06 LDA #ACK
1070 0609 17 FF 30 LBSR OUTTER
1071 060C 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
1072 060E 39 RTS
1073 *
1074 060F 81 18 XSTSTR2 CMPA #CAN
1075 0611 26 03 BNE XSTSTR3
1076 0613 1A 05 ORCC #CFLAG+ZFLAG Set (c)=1 abort & exit
1077 0615 39 RTS
1078 *
1079 0616 1C FA XSTSTR3 ANDCC #$FF-CFLAG-ZFLAG
1080 0618 39 RTS
1081 *
1082 * Got SOH
1083 * Now get block number
1084 *
1085 0619 B1 DE 23 XSTBLK CMPA BLKNUM
1086 061C 26 06 BNE XSTBLKE
1087 061E 8E 06 2F LDX #XSTCOM
1088 0621 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
1089 0623 39 RTS
1090 *
1091 * Error in block number
1092 *
1093 0624 86 15 XSTBLKE LDA #NAK
1094 0626 17 FF 13 LBSR OUTTER
1095 0629 8E 05 F9 LDX #XSTSTR
1096 062C 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
1097 062E 39 RTS
1098 *
1099 * Get complement of block number
1100 *
1101 062F 43 XSTCOM COMA
1102 0630 B1 DE 23 CMPA BLKNUM
1103 0633 26 EF BNE XSTBLKE
1104 0635 7F DE 21 CLR CHKSUM
1105 0638 86 80 LDA #128
1106 063A B7 DE 24 STA BYTCNT
1107 063D 8E 06 43 LDX #XSTDAT
1108 0640 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, No valid data (no exit)
1109 0642 39 RTS
1110 *
1111 * Get data bytes
1112 *
1113 0643 34 02 XSTDAT PSHS A
1114 0645 BB DE 21 ADDA CHKSUM
1115 0648 B7 DE 21 STA CHKSUM
1116 064B 35 02 PULS A
1117 064D 7A DE 24 DEC BYTCNT
1118 0650 26 03 BNE XSTDAT1
1119 0652 8E 06 5A LDX #XSTCHK
1120 0655 1C FE XSTDAT1 ANDCC #$FF-CFLAG No abort
1121 0657 1A 04 ORCC #ZFLAG Valid data (exit)
1122 0659 39 RTS
1123 *
1124 * Byte count reached zero
1125 * Check checksum byte
1126 *
1127 065A B1 DE 21 XSTCHK CMPA CHKSUM
1128 065D 26 07 BNE XSTCHK1 retry if wrong checksum
1129 *
1130 * Checksum OK ...
1131 * increment block number
1132 * and send ACK
1133 *
1134 065F 7C DE 23 INC BLKNUM
1135 0662 86 06 LDA #ACK
1136 0664 20 0D BRA XSTCHK2
1137 *
1138 * Checksum Error detected ...
1139 * Reset Sector counter in ACCB to last 128 byte boundary
1140 * and send NAK
1141 *
1142 0666 34 04 XSTCHK1 PSHS B
1143 0668 1F 30 TFR U,D
1144 066A 5A DECB
1145 066B C4 80 ANDB #128
1146 066D 1F 03 TFR D,U
1147 066F 35 04 PULS B
1148 0671 86 15 LDA #NAK
1149 0673 17 FE C6 XSTCHK2 LBSR OUTTER
1150 0676 8E 05 F9 LDX #XSTSTR
1151 0679 1C FA ANDCC #$FF-CFLAG-ZFLAG No abort, no valid data (no exit)
1152 067B 39 RTS
1153 *
1154 ** 'UP' Load ROMdisk via config PROM.
1155 *
1156 067C 08 08 UPMES FCB $08,$08
1157 067E 4C 6F 61 64 20 52 FCC 'Load ROM disk from config PROM.'
4F 4D 20 64 69 73
6B 20 66 72 6F 6D
20 63 6F 6E 66 69
67 20 50 52 4F 4D
2E
1158 069D 04 FCB 4
1159 069E 46 6F 75 6E 64 20 UPMES1 FCC 'Found SYNC, loading data...'
53 59 4E 43 2C 20
6C 6F 61 64 69 6E
67 20 64 61 74 61
2E 2E 2E
1160 06B9 0A 0D 04 FCB $0A,$0D,4
1161 06BC 52 4F 4D 20 44 69 UPMES2 FCC 'ROM Disk Loaded.'
73 6B 20 4C 6F 61
64 65 64 2E
1162 06CC 0A 0D 04 FCB $0A,$0D,4
1163 06CF 52 4F 4D 20 44 69 UPMES3 FCC 'ROM Disk Not Found.'
73 6B 20 4E 6F 74
20 46 6F 75 6E 64
2E
1164 06E2 0A 0D 04 FCB $0A,$0D,4
1165 *
1166 06E5 8E 06 7C UPSUB LDX #UPMES
1167 06E8 BD 04 50 JSR PDATA1
1168 *
1169 06EB 8D 5A BSR UPRESET
1170 06ED 10 8E 00 20 LDY #$0020 Set up count for 2 MBit
1171 06F1 8E 00 00 LDX #$0000
1172 06F4 8D 6C UPSUB1 BSR UPBIT Shift in bit
1173 06F6 8D 7C BSR UPSYNC Test for Sync pattern`
1174 06F8 27 15 BEQ UPSUB4 Skip if found
1175 06FA 30 1F LEAX -1,X Count Down inner loop
1176 06FC 8C 00 00 CMPX #$0000
1177 06FF 26 F3 BNE UPSUB1 Branch if inner loop not complete
1178 0701 31 1F LEAY -1,X Count down outer loop
1179 0703 10 8C 00 00 CMPY #$0000
1180 0707 26 EB BNE UPSUB1 Branch if outer loop not complete
1181 *
1182 0709 8E 06 CF LDX #UPMES3 2MBits scanned, no synch, report error
1183 070C 7E 04 50 JMP PDATA1
1184 *
1185 070F 8E 06 9E UPSUB4 LDX #UPMES1 Sync found, now load disk
1186 0712 BD 04 50 JSR PDATA1
1187 *
1188 0715 4F CLRA
1189 0716 B7 DE 1E STA DRVNUM select Drive 0
1190 0719 C6 01 LDB #$01
1191 071B B7 DE 1F UPSUB2 STA TRACK track 0
1192 071E F7 DE 20 STB SECTOR sector 1
1193 *
1194 0721 17 F9 A3 LBSR MAPIN map in buffer
1195 0724 5F CLRB 256 byte sector
1196 0725 8D 67 UPSUB3 BSR UPBYTE read byte from prom
1197 0727 A7 C0 STA ,U+ Store in buffer
1198 0729 5A DECB
1199 072A 26 F9 BNE UPSUB3 Loop until sector read`
1200 072C 17 F9 CB LBSR MAPOUT map out buffer
1201 *
1202 072F B6 DE 1F LDA TRACK Advance sector
1203 0732 F6 DE 20 LDB SECTOR
1204 0735 5C INCB
1205 0736 C1 0F CMPB #EMAXSEC+1 Wrap on max sector count
1206 0738 26 E1 BNE UPSUB2
1207 073A C6 01 LDB #1
1208 073C 4C INCA Advance track
1209 073D 81 30 CMPA #EMAXTRK
1210 073F 26 DA BNE UPSUB2
1211 *
1212 0741 8E 06 BC UPEXIT LDX #UPMES2 Load complete, report message
1213 0744 7E 04 50 JMP PDATA1
1214 *
1215 * Reset Serial PROM
1216 *
f9-monex.txt, line no. 1217: Symbol undefined Pass 2
1217 0747 86 00 UPRESET LDA #PRSTHI Strobe the reset line
f9-monex.txt, line no. 1218: Symbol undefined Pass 2
1218 0749 97 00 STA PROMREG
f9-monex.txt, line no. 1219: Symbol undefined Pass 2
1219 074B 86 00 LDA #PRSTLO
f9-monex.txt, line no. 1220: Symbol undefined Pass 2
1220 074D 97 00 STA PROMREG
1221 074F 8E 00 00 LDX #$0000 Delay a while`
f9-monex.txt, line no. 1222: Phasing Error
1222 0752 30 1F UPRST1 LEAX -1,X
1223 0754 8C 00 00 CMPX #$0000
1224 0757 26 FB BNE UPRST1
1225 0759 BF DF 46 STX SYNCREG+0 Clear Sync Shift Register
1226 075C BF DF 48 STX SYNCREG+2
1227 075F 39 RTS
1228 *
1229 * Input 1 Bit From PROM
1230 *
f9-monex.txt, line no. 1231: Phasing Error
f9-monex.txt, line no. 1231: Symbol undefined Pass 2
1231 0760 86 00 UPBIT LDA #PCLKHI
f9-monex.txt, line no. 1232: Symbol undefined Pass 2
1232 0762 97 00 STA PROMREG
f9-monex.txt, line no. 1233: Symbol undefined Pass 2
1233 0764 86 00 LDA #PCLKLO
f9-monex.txt, line no. 1234: Symbol undefined Pass 2
1234 0766 97 00 STA PROMREG
f9-monex.txt, line no. 1235: Symbol undefined Pass 2
1235 0768 96 00 LDA PROMREG
1236 076A 44 LSRA
1237 076B 78 DF 49 ASL SYNCREG+3
1238 076E 39 RTS
1239 *
1240 * Test for 32 bit Sync Word
1241 *
f9-monex.txt, line no. 1242: Phasing Error
1242 076F 79 DF 48 UPSYNC ROL SYNCREG+2
1243 0772 79 DF 47 ROL SYNCREG+1
1244 0775 79 DF 46 ROL SYNCREG+0
f9-monex.txt, line no. 1245: Symbol undefined Pass 2
1245 0778 CC 00 00 LDD #SYNCLO
1246 077B 10 B3 DF 48 CMPD SYNCREG+2
1247 077F 26 0C BNE UPSYNCX
f9-monex.txt, line no. 1248: Symbol undefined Pass 2
1248 0781 CC 00 00 LDD #SYNCHI
1249 0784 10 B3 DF 46 CMPD SYNCREG+0
f9-monex.txt, line no. 1250: Phasing Error
1250 0788 39 UPSYNCX RTS
1251 *
1252 * Input 1 Byte From PROM
1253 *
f9-monex.txt, line no. 1254: Phasing Error
1254 0789 34 04 UPBYTE PSHS B
1255 078B C6 08 LDB #8
f9-monex.txt, line no. 1256: Phasing Error
1256 078D 8D D3 UPBYTE1 BSR UPBIT
1257 078F 5A DECB
1258 0790 26 00 BNE UPBYTE1
1259 0792 B6 DF 49 LDA SYNCREG+3
1260 0795 35 84 PULS B,PC
1261 *
1262 ***** NEXTCMD *****
1263 *
f9-monex.txt, line no. 1264: Phasing Error
1264 0797 17 FC BE NEXTEXT LBSR INPE GET ONE CHAR. FROM TERMINAL
1265 079A 84 7F ANDA #$7F STRIP PARITY FROM CHAR.
1266 079C 1F 89 TFR A,B
1267 079E 86 20 LDA #$20
1268 07A0 17 FC B1 LBSR OUTP PRNT SPACE
1269 07A3 C1 60 CMPB #$60
1270 07A5 2F 07 BLE NXTEX0
1271 07A7 C0 20 SUBB #$20
1272 *
1273 ***** DO TABLE LOOKUP *****
1274 * FOR COMMAND FUNCTIONS
1275 *
f9-monex.txt, line no. 1276: Phasing Error
1276 07A9 8E 07 C4 NXTEX0 LDX #EXTTAB POINT TO JUMP TABLE
f9-monex.txt, line no. 1277: Phasing Error
1277 07AC E1 80 NXTEX1 CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
1278 07AE 27 12 BEQ JMPEXT BRANCH IF MATCH FOUND
1279 07B0 30 02 LEAX 2,X POINT TO NEXT ENTRY IN TABLE
1280 07B2 8C 07 D3 CMPX #EXTEND REACHED END OF TABLE YET ?
1281 07B5 26 FA BNE NXTEX1 IF NOT END, CHECK NEXT ENTRY
1282 07B7 8E 07 D3 LDX #MSGWHAT POINT TO MSG "WHAT?"
1283 07BA 16 FC 93 LBRA PDATA1 PRINT MSG AND RETURN
f9-monex.txt, line no. 1284: Phasing Error
1284 07BD 6E 94 JMPEXT JMP [,X] JUMP TO COMMAND ROUTINE
1285 *
1286 * EXTENDED COMMAND JUMP TABLE
1287 *
f9-monex.txt, line no. 1288: Phasing Error
1288 07BF EXTTAB EQU *
1289 07BF 42 FCC 'B' BOOT FLEX
1290 07C0 03 FB FDB UBSUB
1291 07C2 4C FCC 'L' LOAD ROM DISK OVER SERIAL PORT
1292 07C3 04 98 FDB ULSUB
1293 07C5 46 FCC 'F' FORMAT RAM DISK
1294 07C6 02 D7 FDB UFSUB
1295 07C8 50 FCC 'P' LOAD ROM DISK FROM PROM
1296 07C9 06 E5 FDB UPSUB
1297 07CB 58 FCC 'X' XMODEM ROM DISK UPLOAD
1298 07CC 05 8B FDB UXSUB
1299 *
f9-monex.txt, line no. 1300: Phasing Error
1300 07CE EXTEND EQU *
1301 *
f9-monex.txt, line no. 1302: Phasing Error
1302 07CE 57 48 41 54 20 3F MSGWHAT FCC "WHAT ?"
1303 07D4 0A 0D 04 FCB $0A,$0D,$04
1304 END
Program + Init Data = 2047 bytes
Error count = 68

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.