URL
https://opencores.org/ocsvn/System09/System09/trunk
Subversion Repositories System09
[/] [System09/] [trunk/] [src/] [Flex9/] [f9-monex.lst] - Rev 120
Compare with Previous | Blame | View Log
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