At line 1 changed one line |
!!!Atari 815 DUAL DISK CONTROLLER |
!!!Atari 815 DUAL DISK CONTROLLER by Bob Warne with additional comments, lables & equates by Dave Staugas |
At line 5 changed 2 lines |
* [DUAL 815 DISK CONTROLLER-Original.asm] ; original source code from Curt Vendel and his Atari museum [atarimuseum.com|http://www.atarimuseum.com] |
* [DUAL 815 DISK CONTROLLER.asm] ; same as above, but with post production for better reading from kheller2 from [AtariAge|https://atariage.com/forums/topic/78379-atari-815-controller-source/?do=findComment&comment=4122495] |
* [DUAL 815 DISK CONTROLLER source code - original|DUAL 815 DISK CONTROLLER.asm] ; original source code from Curt Vendel and his Atari museum [atarimuseum.com|http://www.atarimuseum.com] |
* [DUAL 815 DISK CONTROLLER - post processed original source code|DUAL 815 DISK CONTROLLER-Original.asm] ; same as above, but with post production for better reading from kheller2 from [AtariAge|https://atariage.com/forums/topic/78379-atari-815-controller-source/?do=findComment&comment=4122495] |
At line 10 changed 3 lines |
ORG+$068B LDX #36 |
LDY #E4 |
JMP 2777 |
.TITLE DUAL 815 DISK CONTROLLER |
; |
; |
; ********************************* |
; * * |
; * 815 DUAL DISK CONTROLLER * |
; * * |
; ********************************* |
; |
; |
; PROGRAMMER: BOB WARNE |
; |
; ADDITIONAL COMMENTS, LABELS & EQUATES BY DAVE STAUGAS |
; |
; |
; |
.ENABLE AMA |
.RADIX 10 |
.ASECT |
; |
; MEMORY MAP: |
; |
; 0000-00FF RAM (USED FOR DATA BUFFER) |
; 0100-0101 SYNCHRONOUS SERIAL DATA ADAPTER REGISTERS (MOTOROLA MC68B52) |
; 0180-01FF RAM (STACK AND PROGRAM SCRATCH) |
; 0200-021F MAPS TO PIA #2 |
; 0280-029F MAPS TO PIA #3 |
; 0380-039F MAPS TO PIA #1 |
; 0800-0FFF CONTROLLER ROM (PART #1) |
; 7000-77FF CONTROLLER ROM (PART #2) |
; |
; |
; EQUATES^H |
; |
; |
BIT7 = ^H080 |
BIT6 = ^H040 |
BIT5 = ^H020 |
BIT4 = ^H010 |
BIT3 = ^H008 |
BIT2 = ^H004 |
BIT1 = ^H002 |
BIT0 = ^H001 |
; |
; PAGE 0 |
; |
ZPRL = ^H0000 ;START OF ZERO PAGE DATA BUFFER |
ZP80 = ^H0080 |
ZP91 = ^H0091 |
FRMCRC = ^H00A0 |
ZPCRC = ^H00AE |
ZPNTL = ^H00C0 |
ZPNTH = ^H00C1 |
SCTPT = ^H00F6 |
CRCLP = ^H00F7 |
IDAM = ^H00F8 |
TRKNO = ^H00F9 |
BYTE00 = ^H00FA |
SCTNO = ^H00FB |
BYTE01 = ^H00FC |
CRC1 = ^H00FD |
CRC2 = ^H00FE |
BYTE4E = ^H00FF |
; |
.= ^H0100 ;START OF SSDA HARDWARE SPACE |
; |
; THE NEXT TWO ADDRESSES MAP TO THE MOTOROLA MC68B52 (SSDA) |
; |
; DATA BITS ARE REVERSED (0 -> 7, 1 -> 6, 2 -> 5, ETC) |
; FROM THE BIT DEFINITIONS IN THE LITERATURE SO THAT |
; SERIAL DATA IS SHIFTED MSB FIRST. |
; |
SSDA0: .=.+1 |
; |
; WHEN READ, THIS ADDR IS A STATUS REGISTER. |
; BITS FOR THIS REGISTER ARE DEFINED: |
; |
; 7 - RECEIVER DATA AVAILABLE (RDA) |
; 6 - TRANSMITTER DATA REGISTER AVAILABLE (TDRA) |
; 5 - DATA CARRIER DETECT BAR (DCD) |
; 4 - CLEAR TO SEND BAR (CTS) |
; 3 - TRANSMITTER UNDERFLOW (TUF) |
; 2 - RECEIVER OVERRUN (RX OVRN) |
; 1 - RECEIVER PARITY ERROR (PE) |
; 0 - INTERRUPT REQUEST (IRQ) |
; |
; BIT EQUATES FOR SSDA0 (READ): |
; |
RDA = BIT7 ;RECEIVER DATA AVAILABLE |
TDRA = BIT6 ;TRANSMITTER DATA REGISTER AVAILABLE |
DCD = BIT5 ;DATA CARRIER DETECT BAR |
CTS = BIT4 ;CLEAR TO SEND BAR |
TUF = BIT3 ;TRANSMITTER UNDERFLOW |
RXOVRN = BIT2 ;RECEIVER OVERRUN |
PE = BIT1 ;RECEIVER PARITY ERROR |
IRQ = BIT0 ;INTERRUPT REQUEST |
; |
; |
; WHEN WRITTEN, THIS ADDRESS IS CONTROL REGISTER #1 |
; BITS FOR THIS REGISTER ARE DEFINED: |
; |
; 7 - RECEIVER RESET (RX RS) |
; 6 - TRANSMITTER RESET (TX RS) |
; 5 - STRIP SYNCH CHARACTERS (STRIP SYNCH) |
; 4 - CLEAR SYNCH |
; 3 - TRANSMITTER INTERRUPT ENABLE (TIE) |
; 2 - RECEIVER INTERRUPT ENABLE (RIE) |
; 1 - ADDRESS CONTROL #1 (AC1) |
; 0 - ADDRESS CONTROL #2 (AC2) |
; |
; BIT EQUATES FOR SSDA0 (WRITE): |
; |
RXRS = BIT7 ;RECEIVER RESET |
TXRS = BIT6 ;TRANSMITTER RESET |
STRIPS = BIT5 ;STRIP SYNCH CHARACTERS |
CLEARS = BIT4 ;CLEAR SYNCH |
TIE = BIT3 ;TRANSMITTER INTERRUPT ENABLE |
RIE = BIT2 ;RECEIVER INTERRUPT ENABLE |
AC1 = BIT1 ;ADDRESS CONTROL #1 |
AC2 = BIT0 ;ADDRESS CONTROL #2 |
SSDA1: .=.+1 |
; |
; A READ OF THIS ADDRESS ACCESSES DATA FROM THE SSDA RECEIVE |
; DATA FIFO. |
; |
; A WRITE TO THIS ADDRESS ACCESSES ANY OF 4 INTERNAL REGISTERS |
; WHICH ARE SELECTED BY WRITING APPROPRIATE DATA TO THE AC1, AC2 |
; DATA BITS IN CONTROL REGISTER #1. |
; |
; BIT DEFINITIONS FOR THE FOUR WRITE ONLY REGISTERS: |
; |
; AC1=0 & AC2=0 SELECT CONTROL REGISTER #2: |
; |
; 7 - PERIPHERAL CONTROL #1 (PC1) ALWAYS 1 |
; 6 - PERIPHERAL CONTROL #2 (PC2) ALWAYS 0 |
; 5 - 1 BYTE/2 BYTE TRANSFER ALWAYS 0 (TWO BYTE) |
; 4 - WORD LENGTH SELECT 1 (WS1) ALWAYS 1 |
; 3 - WORD LENGTH SELECT 2 (WS2) ALWAYS 1 |
; 2 - WORD LENGTH SELECT 3 (WS3) ALWAYS 0 |
; 1 - TRANSMIT SYNCH CODE ON UNDERFLOW 1 |
; 0 - ERROR INTERRUPT ENABLE (EIE) 1 |
; |
; BIT EQUATES FOR CONTROL REGISTER #2: |
; |
PC1 = BIT7 ;PERIPHERAL CONTROL #1 |
PC2 = BIT6 ;PERIPHERAL CONTROL #2 |
BYTE12 = BIT5 ;1 OR 2 BYTE TRANSFER |
WS1 = BIT4 ;WORD LENGTH SELECT #1 |
WS2 = BIT3 ;WORD LENGTH SELECT #2 |
WS3 = BIT2 ;WORD LENGTH SELECT #3 |
TXSUND = BIT1 ;TRANSMIT SYNCH ON UNDERFLOW |
EIE = BIT0 ;ERROR INTERRUPT ENABLE |
; |
; |
; AC1=1 & AC2=0 SELECTS CONTROL REGISTER #3 |
; |
; 7 - EXTERNAL/INTERNAL SYNCH MODE CONTROL (E/I SYNCH) =0 |
; 6 - 1 SYNCH CHAR/2 SYNCH CHAR MODE CONTROL =0 |
; 5 - CLEAR CTS BAR STATUS =0 |
; 4 - CLEAR TRANSMITTER UNDERFLOW STATUS (CTUF) =0 |
; 3 - NOT USED |
; 2 - NOT USED |
; 1 - NOT USED |
; 0 - NOT USED |
; |
; BIT EQUATES FOR CONTROL REGGISTER #3 |
; |
EISYNC = BIT7 ;EXTERNAL/INTERNAL SYNCH MODE CONTROL |
SYNC12 = BIT6 ;SYNCH CHAR MODE CONTROL |
CCTS = BIT5 ;CLEAR CTS BAR STATUS |
CTUF = BIT4 ;CLEAT TUF STATUS |
; |
; |
; AC1=0 & AC2=1 SELECTS SYNCH CODE REGISTER |
; |
; AC1=1 & AC2=1 SELECTS TRANSMIT DATA FIFO |
.= ^H0180 ;START OF STACK & SCRATCH RAM |
; |
STPNT: .=. |
RAM3: .=.+1 |
; |
; NEXT FIVE BYTES ARE SAVE AREA FOR COMMAND FRAME INPUT |
; |
UNITNB: .=.+1 ;DRIVE UNIT # (ASCII) |
CTLCMD: .=.+1 ;CONTROLLER COMMAND |
AUX1: .=.+1 ;LSB OF 16-BIT LOGICAL SECTOR # |
AUX2: .=.+1 ;MSB OF 16-BIT LOGICAL SECTOR # |
RCDCSM: .=.+1 ;COMMAND FRAME CHECKSUM |
; |
; |
; |
TMPOUT: .=.+1 ;ALL SERIAL OUTPUT SHIFTED FROM THIS ADDR |
DICKSM: .=.+1 ;DATA FIELD CHECKSUM TEMP |
.=.+8 ;SPARE |
; |
; NEXT 4 BYTES SENT TO COLLEEN FOR STATUS COMMAND ON BOTTOM DRV |
; |
STFLG2: .=.+1 ;BOTTOM DRV STATUS FLAGS |
DEVST2: .=.+1 ;BOTTOM DRV XTRA STATUS |
WCTLB2: .=.+1 ;BOTTOM DRV WORST CASE TIMEOUT (LSB) |
WCTMB2: .=.+1 ;DELAY (MSB) |
; |
; NEXT 2 BYTES ARE CODES FOR PORTB2: |
; |
EGON: .=.+1 ;ERASE GATE TURN ON CODE |
WGOFF: .=.+1 ;WRITE GATE TURN OFF CODE (LEAVES EG ON) |
; |
; NEXT 2 BYTES ARE USED FOR CRC GENERATION: |
; |
BAKER: .=.+1 ;CRC GENERATION SCRATCH 1 |
ABLE: .=.+1 ;CRC GENERATION SCRATCH 2 |
GAPBYT: .=.+1 ;BYTE INIT'D TO $4E FOR CRC WRITE |
; |
; |
DH80T: .=.+1 ;DOUBLE HEAD & 80 TRK TEST BYTE |
; |
; 7 - DOUBLE=1 / SINGLE=0 HEAD DRIVE |
; 6 - 80 TRK=1 / 40 TRK=0 TRACK DENSITY |
; |
; BIT EQUATES: |
; |
DBLHED = BIT7 ;DOUBLE/SINGLE HEADED DRVS |
TPI96 = BIT6 ;TRACK DENSITY BIT |
; |
.=.+3 ;SPARE |
STPDIR: .=.+1 |
RDCRC2: .=.+1 |
RDCRC1: .=.+1 |
STPNB2: .=.+1 ;# OF STEPS TO DESIRED TRACK, BOTTOM DRV |
PRTRK2: .=.+1 ;PRESENT TRACK #, BOTTOM DRV |
SPSDC2: .=.+1 ;LOOP COUNTER FOR BOTTOM DRV SHUTDOWN TIMER |
SPMDC2: .=.+1 |
SCRT1: .=.+1 |
SCRT2: .=.+1 |
; |
SCTTBL: .=.+11 ;START OF 11-BYTE ID FIELD |
SPMDLC: .=.+1 ;1 SEC LOOP COUNT FOR SPM SHUT-OFF (4 * 125 MS) |
.=.+27 ;SPARE |
STPSCR: .=.+1 ;STEP ROUTINE SCRATCH |
PRSTRK: .=.+1 ;PRESENT TRACK #, TOP DRV |
STPNBR: .=.+1 ;# OF STEPS TO DESIRED TRK #, TOP DRV |
; |
; THE NEXT 4 BYTES SENT TO COLLEEN FOR STATUS COMMAND, TOP DRV |
; |
STFLGS: .=.+1 ;STATUS FLAGS (TOP DRV) SHIPPED TO COLLEEN |
; |
; BIT DEFINITIONS FOR CONTROLLER STATUS FLAGS BYTE: |
; |
; 7 - TRACK DENSITY (0=40 TRK, 1=80 TRK) |
; 6 - SERIAL BAUD RATE (0=19.2KB, 1=38.4KBAUD) |
; 5 - SECTOR SIZE (0=128B/S, 1=256 BYTES/SECTOR) |
; 4 - MOTOR/SELECT LITE STATUS (0=OFF, 1=ON) |
; 3 - WRITE PROTECT STATUS (1=WRITE PROTECTED) |
; 2 - READ/WRITE ERROR (SET IF ERROR, LAST R/W) |
; 1 - INVALID DATA FRAME " " |
; 0 - INVALID COMMAND FRAME " " |
; |
; BIT EQUATES FOR STFLGS: |
; |
TRK80 = BIT7 ;TRACK DENSITY |
BAUD38 = BIT6 ;SERIAL BAUD RATE |
SEC256 = BIT5 ;SECTOR SIZE |
MTR0 = BIT4 ;MOTOR ON STATUS |
WPS0 = BIT3 ;WRITE PROTECT |
RWE0 = BIT2 ;READ/WRITE ERROR |
INVDF0 = BIT1 ;INVALID DATA FRAME ERROR |
INVCF0 = BIT0 ;INVALID COMMAND FRAME ERROR |
; |
DEVSTA: .=.+1 ;TOP DRV EXTRA STATUS |
; |
; BIT DEFINITIONS FOR EXTRA STATUS BYTE: |
; |
; 7 - N/A |
; 6 - N/A |
; 5 - N/A |
; 4 - NO ID MARK? |
; 3 - N/A |
; 2 - N/A |
; 1 - N/A |
; 0 - N/A |
; |
; BIT EQUATES FOR DEVSTA: |
; |
NOID = BIT4 ;NO ID MARK FOUND? |
DUM10 = BIT3 ;??? |
; |
WCTLSB: .=.+1 ;WORST CASE TIMEOUT SENT TO COLLEEN (LSB) |
WCTMSB: .=.+1 ;(MSB) |
; |
PACNTR: .=.+1 ;R/W ERROR RETRY COUNT |
.=.+2 ;SPARE |
SSCTMS: .=.+1 ;MSB,16-BIT LOGICAL SECTOR # (SECTOR BREAKDOWN) |
SSCTLS: .=.+1 ;LSB, SAVED BY SEC BRKDWN BUT NOT USED |
.=.+1 ;SPARE |
TRKNBR: .=.+1 ;TRACK # COMPUTED IN SECTOR BREAK-DOWN |
SCTNBR: .=.+1 ;SECTOR # FROM SECTOR BREAK-DOWN |
INMODE: .=.+1 ;INTERNAL MODE REGISTER |
; |
; BIT DEFINITIONS FOR INMODE: |
; |
; 7 - 19.2/38.4 KBAUD SERIAL DATA RATE (19.2 KBAUD = 1) |
; 6 - DRIVE SELECT (TOP DRIVE = 1, BOTTOM DRIVE = 0) |
; 5 - SIDE SELECT (FOR DUAL HEADED DRIVES, SIDE0=0, SIDE1=1) |
; 4 - N/A |
; 3 - N/A |
; 2 - SPM2 NOT ON >1 SEC IF SET |
; 1 - N/A |
; 0 - IF SET, WITHIN COMMAND INPUT ROUTINE (ALSO USED FOR DATA/CMD FRAME |
; CHECKSUM ROUTINE SELECT) |
; |
; BIT EQUATES FOR INMODE: |
; |
BAUD19 = BIT7 ;SERIAL DATA RATE SELECT |
TOPDRV = BIT6 ;DRIVE SELECT |
SIDE1 = BIT5 ;SIDE SELECT |
DUM1 = BIT4 ;DUMMY BIT NOT USED |
DUM2 = BIT3 ;DUMMY BIT NOT USED |
S2NRDY = BIT2 ;BOTTOM DRV, SPM NOT READY |
DUM3 = BIT1 ;DUMMY BIT NOT USED |
CMDFIN = BIT0 ;COMMAND FRAME INPUT |
CRCTST = BIT0 ;CRC TESTING INDICATOR |
DUM11 = BIT0 ;DUMMY BIT USED |
; |
; |
INSTAT: .=.+1 ;INTERNAL STATUS REGISTER |
; |
; BIT DEFINITIONS FOR INTERNAL STATUS REGISTER: |
; |
; 7 - RECEIVING NEW COMMAND WORDS IF SET |
; 6 - BUSY, SET WHENEVER GOING TO A ROUTINE THAT WILL KEEP US |
; AWAY FROM THE COMMAND FRAME MONITOR MORE THAN 400 MS |
; 5 - SHUTDOWN IN PROGRESS, WHEN SET INDICATES CONTROL SHOULD RTS |
; FROM MAIN MONITOR--DOES NOT INDICATE 400 MS ABSENCE |
; 4 - NO DISK |
; 3 - FORMAT ERROR IF SET, AND READ AFTER WRITE FLAG! |
; 2 - SPINDLE MOTOR HAS NOT BEEN ON 1 SEC IF SET |
; 1 - COMMAND RECEIVE ERROR IF SET |
; 0 - IF SET, COLLEEN HAS NOT BEEN WITH US 100 MS+ |
; |
; BIT EQUATES FOR INSTAT: |
; |
RECCMD = BIT7 ;RECEIVING COMMAND |
BUSY = BIT6 ;CONTROLLER BUSY |
SHTDWN = BIT5 ;SHUTDOWN IN PROGRESS |
NODISK = BIT4 ;NO DISK |
FMTER = BIT3 ;FORMAT ERROR |
RDAFWR = BIT3 ;READ AFTER WRITE INDICATOR |
S1NRDY = BIT2 ;SPM TOP DRIVE NOT READY |
CRECR = BIT1 ;COMMAND RECEIVE ERROR |
NO800 = BIT0 ;COLLEEN HAS NOT BEEN WITH US |
; |
; |
INSCRT: .=.+1 ;LAST INDEX +1 TO TERMINATE INPUT OR CHECKSUM |
TMRSCR: .=.+1 ;TIMER SCRATCH |
FSCTBP: .=.+1 ;FORMAT VERIFY ERROR RETRY COUNT |
BFRPNT: .=.+1 ;FORMAT BAD SECTOR # BUFFER INDEX |
.=.+1 ;SPARE |
TMPSB: .=.+1 ;*2 TEMP STORAGE FOR SECTOR BUILD-UP |
MSBSB: .=.+1 ;MSB FOR SECTOR BUILD-UP |
CSSCRT: .=.+1 |
YSAVE: .=.+1 |
.=.+1 ;SPARE |
CTABL: .=.+1 ;JUMP INDIRECT ADDRESS FOR COMMAND INTERPRETER |
CTABH: .=.+1 ;MSB |
CISCRT: .=.+1 ;COMMAND INTERPRETER SCRATCH |
SPMSDC: .=.+1 ;LOOP COUNTER FOR TOP DRV SHUTDOWN TIMER |
.= ^H0200 ;START OF PIA #3 ADDR SPACE |
; |
PORTA3: .=.+1 ;PORT A, ONBOARD PIA #3 |
; |
; BIT ASSIGNMENTS FOR PORT A, PIA #3: |
; |
; 7 - DRIVE ADDR DECODE INPUT |
; 6 - N/A |
; 5 - N/A |
; 4 - WRITE LIGHT, TOP DRIVE OUTPUT |
; 3 - READ LIGHT, TOP DRIVE OUTPUT |
; 2 - 96/48 TPI SENSE (96 = 0) INPUT |
; 1 - MOTOR ON/DRV SELECT, BOTTOM DRV OUTPUT |
; 0 - DRIVE ADDR DECODE 2 INPUT |
; |
; BIT EQUATES FOR PORTA3: |
; |
DRVAD1 = BIT7 ;DRIVE ADDRESS DECODE #1 |
DUM4 = BIT6 ;DUMMY BIT NOT USED |
DUM5 = BIT5 ;DUMMY BIT NOT USED |
WLTOP = BIT4 ;WRITE LIGHT, TOP DRIVE |
RLTOP = BIT3 ;READ LIGHT, TOP DRIVE |
TPISNS = BIT2 ;TPI SENSE |
SELBOT = BIT1 ;MOTOR ON/DRV SEL BOTTOM DRIVE |
DRVAD2 = BIT0 ;DRIVE ADDRESS DECODE #2 |
; |
PADDR3: .=.+1 ;PORT A, PIA #3 DATA DIRECTION CONTROL (1=OUTPUT TO PIA) |
PORTB3: .=.+1 ;PORT B, PIA #3 |
; |
; BIT DEFINITIONS FOR PORT B, PIA #3: |
; |
; 7 - DRIVE MANUFACTURER (=0 IF NOT MPI) INPUT |
; 6 - # OF HEAD(S) (DOUBLE HEADED IF =0) INPUT |
; 5 - BOTTOM DRV STEPPER MOTOR PHASE 4 OUTPUT |
; 4 - BOTTOM DRV STEPPER MOTOR PHASE 3 OUTPUT |
; 3 - BOTTOM DRV STEPPER MOTOR PHASE 2 OUTPUT |
; 2 - BOTTOM DRV STEPPER MOTOR PHASE 1 OUTPUT |
; 1 - EXTENDED PROM SPACE INSTALLED IF =0 INPUT |
; 0 - INNER TRKS AMPLIFIER ADJUST (0=TRK>20) OUTPUT |
; |
; BIT EQUATES FOR PORTB3: |
; |
DMANUF = BIT7 ;DRIVE MANUFACTURER |
HEADNO = BIT6 ;# OF HEADS/DRV |
SPBOT4 = BIT5 ;BOTTOM STEPPER PHASE 4 |
SPBOT3 = BIT4 ;BOTTOM STEPPER PHASE 3 |
SPBOT2 = BIT3 ;BOTTOM STEPPER PHASE 2 |
SPBOT1 = BIT2 ;BOTTOM STEPPER PHASE 1 |
XTPROM = BIT1 ;EXTENDED PROM SPACE |
AMPADJ = BIT0 ;INNER TRACK AMPLIFIER ADJUST |
; |
; |
PBDDR3: .=.+1 ;DATA DIRECTION CONTROL, PORT B PIA #3 |
PIA3EC: .=.+1 |
TIMR3R = ^H0215 |
TIMR23 = ^H021F |
.= ^H0280 ;START OF PIA #2 ADDR SPACE |
PORTA2: .=.+1 ;PORT A, PIA #2 |
; |
; BIT DEFINITIONS FOR PORT A, PIA #2: |
; |
; 7 - WRITE LIGHT, BOTTOM DRIVE (0=ON) OUTPUT |
; 6 - READ LIGHT, BOTTOM DRIVE (0=ON) OUTPUT |
; 5 - N/A |
; 4 - BOTTOM DRIVE, BOTTOM HEAD READ (0=ON) OUTPUT |
; 3 - BOTTOM DRIVE, TOP HEAD READ (0=ON) OUTPUT |
; 2 - N/A |
; 1 - TOP DRIVE, BOTTOM HEAD READ (1=ON) OUTPUT |
; 0 - TOP DRIVE, TOP HEAD READ (1=ON) OUTPUT |
; |
; BIT EQUATES FOR PORTA2: |
; |
WLBOT = BIT7 ;WRITE LIGHT, BOTTOM DRV |
RLBOT = BIT6 ;READ LIGHT, BOTTOM DRV |
DUM7 = BIT5 ;DUMMY BIT NOT USED |
BDBHRD = BIT4 ;BOTTOM DRV, BOTTOM HEAD, READ |
BDTHRD = BIT3 ;BOTTOM DRV, TOP HEAD, READ |
DUM8 = BIT2 ;DUMMY BIT NOT USED |
TDBHRD = BIT1 ;TOP DRIVE, BOTTOM HEAD, READ |
TDTHRD = BIT0 ;TOP DRIVE, TOP HEAD, READ |
; |
PADDR2: .=.+1 ;DATA DIRECTION CONTROL REG, PORT A, PIA #2 |
PORTB2: .=.+1 ;PORT B, PIA #2 |
; |
; BIT DEFINITIONS FOR PORT B, PIA #2: |
; (ALL BITS ENABLED WHEN 0) |
; |
; 7 - BOTTOM DRIVE, BOTTOM HEAD ERASE OUTPUT |
; 6 - BOTTOM DRIVE, BOTTOM HEAD WRITE OUTPUT |
; 5 - BOTTOM DRIVE, TOP HEAD ERASE OUTPUT |
; 4 - BOTTOM DRIVE, TOP HEAD WRITE OUTPUT |
; 3 - TOP DRIVE, BOTTOM HEAD ERASE OUTPUT |
; 2 - TOP DRIVE, BOTTOM HEAD WRITE OUTPUT |
; 1 - TOP DRIVE, TOP HEAD ERASE OUTPUT |
; 0 - TOP DRIVE, TOP HEAD WRITE OUTPUT |
; |
; BIT EQUATES FOR PORTB2: |
; |
BDBHER = BIT7 ;BOTTOM DRIVE, BOTTOM HEAD ERASE |
BDBHWR = BIT6 ;BOTTOM DRV, BOTTOM HEAD WRITE |
BDTHER = BIT5 ;BOT DRV, TOP HEAD ERASE |
BDTHWR = BIT4 ;BOT DRV, TOP HEAD WRITE |
TDBHER = BIT3 ;TOP DRV, BOTTOM HEAD ERASE |
TDBHWR = BIT2 ;TOP DRV, BOTTOM HEAD WRITE |
TDTHER = BIT1 ;TOP DRV, TOP HEAD ERASE |
TDTHWR = BIT0 ;TOP DRV, TOP HEAD WRITE |
; |
PBDDR2: .=.+1 ;DATA DIRECTION CONTROL, PORT B, PIA #2 |
PIA2EC: .=.+1 |
TIMR2R = ^H0295 |
TIMR22 = ^H029F |
.= ^H0380 ;START OF PIA #1 ADDR SPACE |
; |
PORTA1: .=.+1 ;PORT A, PIA #1 |
; |
; BIT DEFINITIONS FOR PORT A, PIA #1: |
; |
; 7 - SYNCH MATCH INPUT |
; 6 - CLK RESET OUTPUT |
; 5 - CTS BAR RESET OUTPUT |
; 4 - WRITE PROTECT, TOP DRIVE INPUT |
; 3 - MASTER RESET SSDA OUTPUT |
; 2 - N/A |
; 1 - MOTOR ON, DRIVE SELECT, TOP DRIVE OUTPUT |
; 0 - WRITE PROTECT, BOTTOM DRIVE INPUT |
; |
; BIT EQUATES FOR PORTA1: |
; |
SYNCMT = BIT7 ;SYNCH MATCH |
CLKRST = BIT6 ;CLK RESET |
CTSRST = BIT5 ;CTS BAR RESET |
WPTOP = BIT4 ;WRITE PROTECT, TOP DRV |
MRSSDA = BIT3 ;MASTER RESET SSDA |
DUM9 = BIT2 ;DUMMY BIT USED IN PROGRAM |
SELTOP = BIT1 ;MOTOR ON, DRV SELECT TOP DRV |
WPBOT = BIT0 ;WRITE PROTECT, BOTTOM DRV |
; |
PADDR1: .=.+1 ;DATA DIRECTION CONTROL, PORT A, PIA #1 |
PORTB1: .=.+1 ;PORT B, PIA #1 |
; |
; BIT DEFINITIONS FOR PORT B, PIA #1: |
; |
; 7 - SERIAL DATA INPUT INPUT |
; 6 - COMMAND FRAME INPUT (1=RECEIVING CMD FRAME) |
; 5 - TOP DRIVE STEPPER MOTOR PHASE 4 OUTPUT |
; 4 - TOP DRIVE STEPPER MOTOR PHASE 3 OUTPUT |
; 3 - TOP DRIVE STEPPER MOTOR PHASE 2 OUTPUT |
; 2 - TOP DRIVE STEPPER MOTOR PHASE 1 OUTPUT |
; 1 - READY/VCC INPUT |
; 0 - SERIAL DATA OUTPUT OUTPUT |
; |
; |
; BIT EQUATES FOR PORTB1: |
; |
SERIN = BIT7 ;SERIAL DATA INPUT |
CMDFRM = BIT6 ;COMMAND FRAME |
SPTOP4 = BIT5 ;TOP DRV, STEPPER 4 |
SPTOP3 = BIT4 ;TOP DRV, STEPPER 3 |
SPTOP2 = BIT3 ;TOP DRV, STEPPER 2 |
SPTOP1 = BIT2 ;TOP DRV, STEPPER 1 |
RDY = BIT1 ;READY/VCC |
SEROUT = BIT0 ;SERIAL DATA OUTPUT |
; |
PBDDR1: .=.+1 ;DATA DIRECTION CONTROL FOR PORT B, PIA #1 |
PIA1EC: .=.+1 |
TIMR1R = ^H0395 |
TIMR3 = ^H039E |
TIMR2 = ^H039F |
; |
; PAGE 8 |
; |
; THE FOLLOWING ARE ADDRESSES INTO A JUMP TABLE FOR 38 KBAUD SERIAL |
; AND DOUBLE HEADED DRIVES ROUTINES. THE TABLE WILL ULTIMATELY |
; RESIDE AT 800 HEX. |
; |
XTND0 = ^H0800 |
XTND1 = ^H0803 |
XTND2 = ^H0806 |
XTND3 = ^H0809 |
XTND4 = ^H080C |
XTND5 = ^H080F ;FORMAT VERIFY FOR 38KBAUD, DOUBLE HEAD, OR 96 TPI |
XTND6 = ^H0812 ;SECTOR # VALIDITY TEST, > 720 |
XTND7 = ^H0815 |
XTND8 = ^H0818 ;DATA FIELD INPUT, 38K BAUD |
XTND9 = ^H081B |
XTND10 = ^H081E ;SIDE 2 CLRS? |
XTND11 = ^H0821 |
XTND12 = ^H0824 |
XTND13 = ^H0827 |
XTND14 = ^H082A |
; |
; MISCELLANEOUS EQUATES |
; |
TIMOUT = 224 ;WORST CASE TIME OUT VALUE TO SHIP TO COLLEEN |
MAXTRK = 39 ;MAXIMUM TRACK #, THIS TIME AROUND |
ACK = 'A ;ACKNOWLEGE CODE |
NAK = 'N ;NEGATIVE ACKNOWLEGE |
CMPLT = 'C ;COMMAND COMPLETE CODE |
ERROR = 'E ;COMMAND EXECUTION ERROR |
; |
; COMMANDS SUPPORTED BY CONTROLLER |
; |
DOWNL = ^H020 ;DOWN LOAD |
FORMT = ^H021 ;FORMAT DISK |
WRINOV = ^H050 ;WRITE SECTOR WITHOUT VERIFY |
RDSPIN = ^H051 ;CONTINUOUSLY READ A SECTOR (FOR TESTING ALIGNMENT) |
READSC = ^H052 ;READ A SECTOR |
STATCD = ^H053 ;STATUS COMMAND |
READAD = ^H054 ;READ FROM ADDRESS |
MTRDLY = ^H055 ;MOTOR ON DELAY 30 SEC |
VERIFY = ^H056 ;VERIFY A SECTOR AGAINST INPUT DATA |
WRIVER = ^H057 ;WRITE A SECTOR WITH VERIFY |
; |
; DATA PATTERNS USED FOR FORMATTING: |
; |
DAM = ^H0FB ;DATA ADDRESS MARK |
; |
; START OF ROM BASED PROGRAM |
; |
.=^H00800 |
; |
; |
; **************************** |
; POWER-ON INTIALIZATION |
; **************************** |
; |
INIT: CLD ;BINARY ARITHMETIC |
LDA #BDBHRD+BDTHRD+TDBHRD+TDTHRD |
LDX #255 |
TXS ;STACK POINTER -> $1FF |
STA PORTA2 |
STX PORTB2 ;INIT TO READ, ALL HEADS |
STX PADDR2 ;ALL PORTA2 BITS ARE OUTPUT |
STX PBDDR2 ;AND PORTB2 TOO |
LDA #0 |
STA PORTA1 ;TURN OFF TOP DRV SPM |
STA PORTA3 ;TURN OFF BOTTOM DRV TOO |
STA PORTB3 ;CLEAR BOTTOM DRV STEPPER BITS |
LDA #WLTOP+RLTOP+SELBOT |
STA PADDR3 ;BITS SET FOR OUTPUT |
LDX #CLKRST+CTSRST+MRSSDA+SELTOP |
STX PADDR1 ;BITS SET FOR OUTPUT |
LDX #SPTOP1+SPTOP2+SPTOP3+SPTOP4 |
STX PBDDR1 ;TOP DRIVE STEPPERS SET AS OUTPUT |
INX |
STX PBDDR3 ;BOTTOM DRIVE STEPPERS (& BIT0) SET AS OUT |
LDX #SPTOP4+SPTOP3 |
STX PORTB1 ;INIT STP PHASE,BOTH DRVS |
STX PORTB3 |
STX PIA1EC |
STX PIA3EC |
STX PIA2EC |
; |
; **************************** |
; INITIALIZATION CONTINUED |
; **************************** |
; |
INITC: LDX #CLKRST+CTSRST+MRSSDA |
STX PORTA1 ;NABL RD CLK SWITCH,TUF LATCH |
;AND SSDA CHIP |
LDA #RXRS+TXRS+CLEARS |
STA SSDA0 ;REST REC(X)MIT. NABL C2 WRITE |
LDA #PC1+WS1+WS2+TXSUND+EIE |
STA SSDA1 ;INIT C2 REG |
LDA #RXRS+TXRS+CLEARS+AC1 |
STA SSDA0 ;NABL C3 WRITE |
LDA #0 |
STA SSDA1 ;INIT C3 REG |
; |
; POWER ON RAM TEST |
; |
RAMTST: LDX #127 ;128-BYTE BLOCKS TO TEST |
RT1: STA ZPRL(X) |
STA ZP80(X) |
STA RAM3(X) ;CLR & CHK 3 128 BYTE 6532'S |
CMP ZPRL(X) |
BNE RTERR |
CMP ZP80(X) |
BNE RTERR |
CMP RAM3(X) |
BNE RTERR |
DEX |
BPL RT1 |
BMI PASRAM |
RTERR: LDA #RLTOP ;TOP READ LITE |
RTERR1: STA PORTA3 ;FLASH DRV1 RD LAMP FOR RAM |
RTERR2: DEX ;FAILURE INDICATION |
BNE RTERR2 |
INY |
BNE RTERR2 |
EOR #RLTOP |
BPL RTERR1 |
; |
; WE PASSED |
; |
PASRAM: LDA #NO800+S1NRDY ;SET INSTAT FOR COLEN ABSNT |
STA INSTAT ;AND SPM UNSTABL |
LDA #BAUD19+TOPDRV+S2NRDY ;SET INMODE FOR 19K I/O ROUTS |
STA INMODE ;SPM2 UNSTBL,&DRIVE1 SEL |
LDA #MAXTRK |
STA PRTRK2 ;ASSUME DRIVE2 ON TRK 39 |
STA PRSTRK ;ASSUME DRV1 ON TRK 39 |
LDA #4 |
STA SPMDLC ;SET FOR 4 DELAYS OF 125MS EACH |
;FOR SPM STABL |
LDA #TIMOUT&255 |
STA WCTLSB |
STA WCTLB2 |
LDA #TIMOUT/256 |
STA WCTMSB ;SET WORS CASE TIMOUT STAT BYTES |
STA WCTMB2 ;FOR BOTH DRIVE 1 AND 2 |
STA DEVSTA ;CLR ALL CONTROLR STAT DRV1 |
STA DEVST2 ;DITTO FOR DRV2 |
STA SPMSDC ;CLR SHUTDN TIME DRV1 |
STA SPSDC2 ;DITTO FOR DRV2 |
; |
; COPY ID FIELD INTO RAM |
; |
LDX #10 ;11-BYTE ID FIELD |
SCTSET: LDA IDFLD(X) |
STA SCTTBL(X) |
DEX |
BPL SCTSET ;PRLMNARY SETUP OF RD/WRTSET |
;SYNC DATA |
INX ;X=0 |
LDY #BAUD38+SEC256 |
LDA PORTB3 |
AND #XTPROM ;CHECK EXTRA PROM FLAG |
BNE INIT50 |
JSR XTND14 ;GO TO XTRA ROM FOR MOR DH/96 |
;TPI AND 38K TSTING |
INIT50: STY STFLGS ;SET DRV1 STAT TO REFLCT DH/96 |
;TPI AND 38K CAPABILITIES |
STY STFLG2 ;DITTO FOR DRV2 |
STX DH80T ;SET FOR SGL HEAD, 40 TRACK |
JSR CLRST ;CLEAR ERROR FLAGS ON TOP DRV |
JSR CLRST2 ;BOTTOM TOO |
; |
; |
; ***************************** |
; WARM START RE-ENTRY POINT |
; ***************************** |
; |
; |
; |
INIT2: LDX #255 ;REDO STACK POINTER |
TXS ;TO TOP OF STACK |
LDA #^CWPS0 |
JSR CLRST1 ;CLEAR TOP DRV WP STATUS |
LDA #^CWPS0 |
JSR CLRS12 ;BOTTOM DRV TOO |
LDX #WPS0 ;GET WRITE PROTECT STATUS BIT IN X |
LDA PORTA1 ;CHECK HARDWARE FOR STATUS |
TAY ;SAVE IN Y FOR BOTTOM DRV TEST |
AND #WPTOP ;CHECK TOP DRV WRITE PROTECT |
BEQ INIT29 ;IF NOT PROTECTED, GOTO BOTTOM DRV CHECK |
TXA ;ELSE, GET WP FLAG IN ACCUM |
JSR ORSTF ;SET IT IN TOP DRV STATUS FLAGS |
INIT29: TYA ;GET PORTA1 IN ACCUM AGAIN |
AND #WPBOT ;CHECK BOTTOM DRV WRITE PROTECT |
BEQ INIT21 ;IF NOT PROTECTED, GET ON WITH INIT |
TXA ;ELSE, GET WP FLAG IN ACCUM |
JSR ORSTF2 ;SET IT IN BOTTOM DRV STATUS FLAGS |
; |
; |
; |
INIT21: LDX #BDBHRD+BDTHRD+TDBHRD+TDTHRD |
STX PORTA2 ;TURN OFF ALL LTS AND RD NABLS |
LDA PORTA3 |
AND #^C<WLTOP+RLTOP> |
STA PORTA3 |
BIT DH80T |
BPL INIT22 |
JSR XTND10 ;GO TO XTRA ROM FOR SIDE2 CLRS |
INIT22: LDA #TOPDRV |
JSR ORINMD ;SET FOR DRV1 SRVICE |
LDA #MAXTRK |
JSR CSTEP ;CALC STPS NEEDED FOR TRK 39 DRV |
STY STPNBR ;1 AND SAVE TMP |
LDA #^CTOPDRV |
JSR ANDNMD ;SET FOR DRIV2 SRVICE |
LDA #MAXTRK |
JSR CSTEP ;CALC STPS NEEDED FOR TRK 39,DRV |
STY STPNB2 ;2 AND SAVE TMP |
LDA #SHTDWN |
JSR ORINST ;SET SHUTDN BIT IN INTRNL STAT |
LDA #^CRDAFWR |
JSR ANINS |
INIT3: LDX SPMSDC |
BEQ INIT4 ;BRNCH IF DRV1 TIMED OUT |
LDA #255 |
STA TIMR23 ;SET 125MS DELA |
DEX |
STX SPMSDC ;UPDATE AND SAV DRV1 TIMR SCRT |
INIT4: LDX SPSDC2 |
BEQ INIT5 ;BRNCH IF DRV2 TIMED OUT |
LDA #255 |
STA TIMR23 ;SET 125MS DELA |
DEX |
STX SPSDC2 ;UPDATE AND SAV DRV2 TIMR SCRT |
INIT5: LDX SPMSDC |
BNE INIT6 ;BRNCH IF DRV1 NOT TIMED OUT |
LDX #^H080 |
LDY STPNBR ;GET SET TO STP DRV1 |
BEQ INIT11 ;BRNCH IF NO STPS NEEDED ON DRV1 |
JSR STEP1 ;STEP DRV1 AND SAV STP CNTR |
BEQ INIT11 ;BRNCH IF LAST STP JUST DONE |
INIT51: STY STPNBR |
INIT6: LDX SPSDC2 |
BNE INIT7 ;BRNCH IF DRV2 NOT TIMED OUT |
LDX #^H080 |
LDY STPNB2 ;GET SET TO STP DRV2 |
BEQ INIT12 ;BRNCH IF NO STPS NEEDED ON DRV2 |
JSR STP2 ;STP DRV2 AND SAV STP CNTR |
BEQ INIT12 ;BRNCH IF LAST STP JUST DONE |
INIT61: STY STPNB2 |
INIT7: LDX SPMSDC |
BNE INIT8 ;BRNCH TO POLL TIMR IF DRV1 NOT |
;TIMED OUT |
LDX SPSDC2 |
BNE INIT8 ;RNCH TO POLL TIMR IF DRV2 NOT |
;TIMED OUT |
LDX STPNBR |
BNE INIT9 ;BRNCH TO POLL 5MS TIMR IF DRV1 |
;NOT ON TRK 39 |
LDX STPNB2 |
BNE INIT9 ;BRNCH TO POLL 5MS TIMR IF DRV2 |
;NOT ON TRK 39 |
INIT71: LDA #^CSHTDWN |
JSR ANINS ;CLR SHUTDN BIT IN INTRNL STAT |
JMP MMON ;LEAVE THIS ROUT--POLL FOR CMND |
; |
INIT11: LDA #CLKRST+CTSRST+MRSSDA |
STA PORTA1 ;TURN OFF SPM1 |
LDA #S2NRDY |
JSR ORINST ;SET SPM1 UNSTBL BIT |
JMP INIT51 |
; |
INIT12: LDA #0 |
STA PORTA3 ;TURN OFF SPM2 |
LDA #S2NRDY |
JSR ORINMD ;SET SPM2 UNSTBL BIT |
JMP INIT61 |
; |
INIT8: BIT TIMR3R |
BMI INIT10 ;BRNCH IF 125MS UP |
JSR MMON |
INIT9: BIT TIMR1R |
BMI INIT5 ;BRNCH IF 5MS UP |
JSR MMON |
JMP INIT9 |
; |
INIT10: BIT TIMR1R |
BMI INIT13 ;BRNCH IF 5 MS UP |
JSR MMON |
JMP INIT10 |
INIT13: JMP INIT3 |
; |
; |
; **************** |
; MAIN MONITOR |
; **************** |
; |
; MONITORS THE READY PORT FOR |
; COLLEEN PRESENCE. MONITORS THE CMND |
; FRAME,BRINGS IN 5 BYTE COMMAND, CHE |
; CKS FOR VALID CHECKSUM, CHECKS IF |
; CMND ADDRESS IS FOR FLOPPY BEFORE |
; GOING TO CMND INTERPRET ROUT |
; |
; |
MMON: LDA PORTB1 |
LSR |
LSR |
BCS NCOLL ;TST RDY PORT &BRNCH IF COLEN AB |
;SENT |
LDA INSTAT |
LSR |
BCS JCOLL ;TST IF COLEN PRSNT 100MS BRNCH |
;IF NOT |
BIT PORTB1 ; |
BVC NOCF ;TST FOR CMND FRAME BRNCH IF NO |
BIT INSTAT |
BVC EDGE ;BRNCH IF MISSED EDGE BY 400US |
LDA #^H0A4 |
JSR TIMER |
BIT PORTB1 ;WAIT 100MS,THEN TEST IF |
BVS EDGE ;CMND FRAME STILL PRESNT |
NOCF: LDA INSTAT |
AND #BUSY+SHTDWN |
BNE MMX ;TST TO JSR BACK TO BUSY OR |
JMP MMON ;SPIN IN MAIN MONITOR ROUT |
MMX: RTS |
JCOLL: LDA #^H0A4 |
JSR TIMER |
LDA #^CNO800 |
JSR ANINS ;SET STAT TO REFLCT COLEN NOT |
;PRESNT 100MS |
JMP MMON |
NCOLL: LDA #NO800 |
JSR ORINST ;SET INTRNL STAT NOT RDY BIT |
JMP NOCF |
EDGE: LDA #RECCMD |
JSR ORINST ;SET INTRNL STAT "NEW CMND BIT" |
LDX #0 |
LDA #5 |
STA INSCRT ;SET UP TO BRING IN CMND |
JSR CINPUT |
; |
; **************************** |
; MAIN MONITOR (CONTINUED) |
; **************************** |
; |
MMON1: LDX #0 |
DEC INSCRT ;SET UP TO GEN CS ON 4 BYTE |
JSR CDCKSM ;CMND |
BEQ CCMD ;BRNCH IF CS OK |
LDA #CRECR ;SET COMMAND RECEIVE ERROR |
JSR ORINST ;IN INSTAT |
CCMD: LDA PORTA3 ;CHECK DRIVE ADDR DECODE |
LSR ;CHECK DRV ADDR #2 |
BCC ADRDC3 ;IF SET, GOTO ADRDC3 |
LDX #'1 |
ASL ;RESTORE PORTA3 |
BMI ADRDC5 ;IF DRV ADDR #1 IS SET, BRANCH |
LDX #'5 |
ADRDC5: CPX UNITNB |
BEQ ADRDC7 ;BRNCH IF DRIV ADDRESED IS ODD |
INX |
CPX UNITNB |
BEQ ADRDC6 ;BRNCH IF EVEN DRIV ADRESED IS U |
CCF: BIT PORTB1 |
BVS CCF ;SPIN TIL COMND FRAM GONE |
LDA #^C<RECCMD+CRECR> ;CLR REC NEW CMND AND |
JSR ANINS ;CS ERR BITS |
JMP MMON ;RETURN TO MON SER BUS |
; |
; |
ADRDC6: LDA #^C<TOPDRV> |
JSR ANDNMD ;UPDATE INMODE FOR DRIV 2 SEL |
; |
ADRDC8: JSR CMDI ;GO COMMAND INTERP---FOR US |
JMP MMON |
; |
ADRDC7: LDA #TOPDRV |
JSR ORINMD ;UPDATE INMODE FOR DRIV 1 SEL |
BNE ADRDC8 |
ADRDC3: LDX #'3 |
ASL |
BMI ADRDC5 |
LDX #'7 |
BNE ADRDC5 |
; |
; *********************** |
; COMMAND INTERPRETER |
; *********************** |
; |
; |
CMDI: LDA INSTAT ;CHECK RECEIVE ERROR FLAG |
AND #CRECR ;MASK OFF OTHERS |
BNE CMD2 ;IF CHECKSUM ERROR, GOTO INVALID CMD NAK |
LDA CTLCMD ;ELSE, FETCH CMD CODE FROM CMD FRAME |
LDX #TBBT-TABB ;MAXIMUM INDEX INTO LEGAL CMD CODE TABLE |
XTAB: CMP TABB(X) ;COMPARE REC'D CMD W/LEGAL CMD LIST |
BEQ GTCMD ;GOT A MATCH, GO EXECUTE |
DEX ;ELSE, DECREMENT INDEX |
BPL XTAB ;LOOP IF ^AANY LEGAL ENTRIES LEFT |
BMI CMD2 ;NO, UNCONDITIONAL SEND INVALID CMD FRAME |
; |
GTCMD: LDA TABL(X) ;YES, FETCH LO ADDR OF ROUT |
STA CTABL ;SAVE IN INDIRECT JUMP VECTOR |
LDA TABH(X) ;FETCH HI ADDR TOO |
STA CTABH ;SAVE IN HI ADDR OF VECTOR |
JMP @CTABL ;JUMP TO SELECTED COMMAND ROUTINE |
; |
CMD2: LDA #INVCF0 ;SET INVALID CMD FRAME FLAG |
JSR OR0STX ;IN PRESENT DRIVE STATUS BYTE |
JSR MFUTST ;SET SPM ON BIT IN STATUS TOO |
; |
CMD3: BIT PORTB1 |
BVS CMD3 ;WAIT TIL CMD FRAME GONE |
LDA #NAK ;LOAD NAK CODE |
JSR SAA2 ;SEND IT TO COLLEEN |
LDA #^CCRECR ;CLEAR CMD RECEIVE ERROR FLAG |
JSR ANINS ; IN INTERNAL STATUS REGISTER |
RTS ;RETURN TO MAIN MONITOR |
; |
; ************************************** |
; COMMAND INTERPRETER LOOK-UP TABLES |
; ************************************** |
; |
; |
TABB: .BYTE DOWNL,FORMT,WRINOV,RDSPIN,READSC,STATCD,READAD,MTRDLY,VERIFY,WRIVER |
; |
TBBT =.-1 |
; |
TABL: .BYTE DOWNLD&255 ;DOWN LOAD |
.BYTE FRMT&255 ;FORMAT |
.BYTE WRITE1&255 ;WRITE, NO VERIFY |
.BYTE RDSPN&255 ;READ SPIN |
.BYTE READ&255 ;READ SECTOR |
.BYTE STCMD&255 ;STATUS COMMAND |
.BYTE RDADR&255 ;READ FROM ADDRESS |
.BYTE MOTRON&255 ;MOTOR ON DELAY |
.BYTE WRITE&255 ;VERIFY ENTERS AT WRITE |
.BYTE WRITE&255 ;WRITE/VERIFY |
; |
TABH: .BYTE DOWNLD/256 |
.BYTE FRMT/256 |
.BYTE WRITE1/256 |
.BYTE RDSPN/256 |
.BYTE READ/256 |
.BYTE STCMD/256 |
.BYTE RDADR/256 |
.BYTE MOTRON/256 |
.BYTE WRITE/256 |
.BYTE WRITE/256 |
; |
; ***************** |
; WRITE ROUTINE |
; ***************** |
; |
WRITE: LDA #RDAFWR |
JSR ORINST ;SET INSTAT FOR READ AFTR WRITE |
; |
; WRITE, NO VERIFY ENTRY POINT: |
; |
WRITE1: JSR TSN ;GO INSUR RECVD SECTR NUMBR VAL |
BCC WR10 ;BRNCH IF SCTOR VALID |
JMP WR91 |
WR10: LDA #^H04E |
STA GAPBYT |
JSR SETSUP |
BEQ WR92 ;BRNCH IF NO STEPS NEEDE |
JSR STEP |
WR92: STY STPNBR ;SAV TEMP NUMBR STEPS NEEDED |
STX STPDIR ;SAV STEP DIRECT TEMP |
JSR INPUT ;GO INPUT DATA FIELD,COMP,CALC- |
;-ULATE CS AND COMPAR CS'S |
BEQ WR20 ;BRNCH IF NO CS ERR |
WR5: LDA #MTR0+INVDF0 |
WR51: JSR OR0STX ;SET SPM AND DATA FRAME ERROR FLGS |
JMP INIT2 |
; |
WR20: JSR SAA1 ;GO ACK DATA FIELD |
LDX STPDIR |
LDY STPNBR |
JSR STPTST ;GO EXECUT STEPS IF NEEDED |
JSR SPMDY ;INSURE SPM STABL |
LDA CTLCMD |
CMP #VERIFY ;CHECK FOR VERIFY ONLY |
BNE WR201 ;BRNCH IF HERE FOR WRITE |
JSR CRCSUP |
JMP WR30 ;GO DO VERFY |
WR201: JSR WPTST |
BEQ WR2 ;BRNCH IF NOT WP |
JMP WR7 |
WR2: JSR CRCSUP |
WRITE2: LDY #0 ;Y SET TO INDICAT PASS |
JSR SYNC ;THRU SYNC LOOP FOR IDAM |
BNE WR21 ;BRNCH IF HAV SYNC |
LDA #NOID |
JSR ORST1 ;UPDATE DEVICE STAT FOR NO ID |
JMP WR8 |
WR21: JSR FWSL |
LDX #12 |
JSR FSL |
LDX EGON |
STX PORTB2 |
LDX #5 |
JSR FSL |
JSR FWSL1 ;GO XMIT REMAINDR OF DATA FIELD |
;GAP AND ID |
SEC ;CARRY MUST REFLECT LST BIT XMIT |
;ED. |
LDX #0 ;CLR BUFR POINTR |
JSR WSL ;GO XMIT 128 BYTE BUFR THRU |
;CLK/DTA LOOKUP TBL |
; |
; *************** |
; WRITE CRC'S |
; *************** |
; |
; (CALLED ONLY ONCE BY WRITE ROUTINE, COULD BE "IN-LINE") |
; |
; WCRC WRITES 2 CRC'S FOR DATA FIELD |
; DURING WRITE ROUT. NOT USED B |
; BY FORMAT ROUT |
; |
WCRC: LDX #128-3 ;INDEX FOR 2 BYTES |
WCRC1: BIT SSDA0 |
BVC WCRC1 ;POLL SSDA FOR XMIT REG AVAIL |
LDA BAKER-<128-3>(X) |
ROR |
LSR |
LSR |
LSR |
TAY |
LDA CDLT(Y) |
STA SSDA1 |
LDA BAKER-<128-3>(X) |
AND #^H01F |
TAY |
LSR |
LDA CDLT(Y) |
STA SSDA1 |
INX |
BPL WCRC1 |
; |
; |
WSPIN: LDA SSDA0 |
AND #TUF |
BEQ WSPIN ;BRNCH TIL TUF SET IN STATREG |
LDA #RDA+TDRA+CTS+PE+IRQ |
STA SSDA0 ;REST XMIT |
LDA PORTA1 |
AND #^CCTSRST |
STA PORTA1 ;REST CTS FF |
ORA #CTSRST |
STA PORTA1 ;SET CTS FF |
LDA WGOFF |
STA PORTB2 |
JSR EGOFF |
LDA INSTAT |
AND #RDAFWR |
BEQ WR36 ;BRNCH IF NO READ CHK REQIRED |
WR30: LDA #READSC |
STA CTLCMD |
JSR RDWRLT |
JSR WFRD ;GO RD SCTR TO VRIFY |
BCS WRITE9 ;BRNCH IF BAD WRITE VRIFY |
WR36: LDA #MTR0 |
JSR OR0STX ;UPDTE STAT FOR GOOD WRITE |
JSR RDSUB |
WR360: LDA #CMPLT |
WR6: JSR SAA2 ;OUTPUT TO COLLEEN |
JMP INIT2 ;GOTO SHUTDOWN |
; |
WR91: LDA #^CRDAFWR |
JSR ANINS |
JMP CMD2 |
; |
WR7: LDA #MTR0+WPS0+RWE0 ;SET STATUS FOR WP |
WR70: JSR OR0STX |
LDA #ERROR ;SET A FOR ERR |
JMP WR6 |
; |
WR8: LDX PACNTR |
BEQ WRITE9 ;BRNCH TO GIV UP WRITE ATMPT |
JSR ERRTRY ;REPOSITON HEAD |
JMP WRITE2 ;REATMPT WRITE |
WRITE9: LDA #MTR0+RWE0 |
JMP WR70 ;GO SET STATUS FOR ERR |
WFRD: LDA #1 |
STA PACNTR ;SET FOR 2 READ ATTEMPTS |
WR3: LDY #0 |
JSR SYNC ;LOOK FOR IDAM |
BNE WR300 ;BRNCH IF HAV SYNC |
LDA #NOID |
JMP WR44 |
WR300: JSR RDSUB |
LDA #3 |
LDY #1 |
JSR SYNC01 ;LOOK FOR DAM |
BEQ WR34 ;BRNCH IF NO SYNC |
LDX #0 |
WR31: BIT SSDA0 |
BPL WR31 |
LDA SSDA1 |
CMP #^H0FB |
BNE WR34 |
LDA INMODE |
LSR |
BCS WR40 ;BRNCH IF HERE ON FORMAT CHK |
LDA SSDA1 |
CMP ZPRL(X) |
BNE WR34 ;BRNCH IF ONE DATA FIELD WORD |
;ERR |
WR32: INX |
WR33: BIT SSDA0 |
BPL WR33 ;BRNCH TIL RDA |
LDA SSDA1 |
CMP ZPRL(X) |
BNE WR34 |
INX |
BEQ WR37 ;BRNCH IF ALL DATA FIELD OK |
LDA SSDA1 |
CMP ZPRL(X) |
BEQ WR32 |
WR34: DEC PACNTR |
BPL WR3 ;BRNCH TO RETRY READ CHK |
SEC |
RTS |
; |
WR37: LDA SSDA1 |
CMP BAKER |
BNE WR43 ;BRNCH IF CRC1 NO MATCH |
WR35: BIT SSDA0 |
BPL WR35 |
LDA SSDA1 |
CMP ABLE |
BNE WR43 |
JSR RDSUB |
CLC ;CRY=NO ERR ON RETRN |
RTS |
; |
WR40: LDA SSDA1 |
CMP #^H0B6 |
BNE WR34 ;BRNCH IF ERR |
WR41: INX |
WR42: BIT SSDA0 |
BPL WR42 |
LDA SSDA1 |
CMP #^H0B6 |
BNE WR34 ;BRNCH IF ERR |
INX |
BEQ WR37 ;BRNCH IF 256 BYTES CHKD |
LDA SSDA1 |
CMP #^H0B6 |
BEQ WR41 ;BRNCH IF NO ERR |
JMP WR34 |
WR43: LDA #DUM10 |
WR44: JSR ORST1 ;SET BIT IN DEVICE STATUS |
JMP WR34 |
; |
; **************** |
; READ ROUTINE |
; **************** |
; |
READ: JSR TSN ;TEST FOR VALID SCT NUMBR |
BCC READ01 |
JMP CMD2 |
READ01: JSR SETSUP |
JSR STPTST |
JSR SPMDY ;GO INSUR SPM STABL |
READ0: LDY #0 ;Y SET TO INDICAT PASS THRU |
JSR SYNC ;SYNC LOOP FOR IDAM |
BNE READ00 |
LDA #NOID ;BIT IS IN DEVSTA |
JMP RD35 ;UPDATE CNTRLR STAT FOR ERR |
READ00: JSR RDSUB |
LDY #1 ;Y SET TO INDICATE PASS THRU |
LDA #3 |
JSR SYNC01 ;SYNC LOOP FOR DAM |
BEQ READ6 ;BRNCH IF NO SYNC |
LDX #0 ;CLR BUFR POINTR |
READ1: BIT SSDA0 ;POLL STATREG FOR RDA |
BPL READ1 |
LDA SSDA1 ;SRVICE SSDA |
CMP #DAM ;FIRST WORD MUST BE DAM |
BNE READ6 ;GO TO ERR IF NOT DAM |
LDA SSDA1 |
STA ZPRL(X) ;STOR IN XFER BUFR |
READ2: INX |
READ3: BIT SSDA0 ;POLL STATREG FOR RDA |
BPL READ3 |
LDA SSDA1 |
STA ZPRL(X) ;STOR IN XFER BUFR |
INX |
BEQ READ4 ;BRNCH IF BUFRS FUL |
LDA SSDA1 |
STA ZPRL(X) |
JMP READ2 |
READ4: LDA SSDA1 |
STA RDCRC1 ;SAVE CRC1 |
READ5: BIT SSDA0 |
BPL READ5 |
LDA SSDA1 |
STA RDCRC2 ;SAVE CRC2 |
JSR CRCSUP |
LDA RDCRC1 |
CMP BAKER |
BNE RD34 |
LDA RDCRC2 |
CMP ABLE |
BNE RD34 |
RD31: LDA #MTR0 |
JSR OR0STX |
RD32: LDA #CMPLT |
RD33: STA TMPOUT |
JSR SETOP |
JSR BFROUT |
JMP INIT2 |
RD34: LDA #DUM10 |
RD35: JSR ORST1 ;UPDATE CONTRLR STAT FOR ERR |
READ6: LDX PACNTR |
BEQ READ7 ;BRNCH TO GIV UP READ ATTEMPT |
JSR ERRTRY ;GO REPOSITION HEAD |
JMP READ0 ;TRY TO READ AGAIN |
READ7: LDA #MTR0+RWE0 |
JSR OR0STX ;UPDATE STATUS TO REFLECT ERR |
LDA #ERROR |
JMP RD33 ;OUTPUT "E" TO COLEN |
RDSUB: LDA #^C<NOID+DUM10> |
JSR ANDST1 |
RTS |
; |
; ************ |
; DOWNLOAD |
; ************ |
; |
; INPUTS 256 BYTES FROM COLN, |
; XECUTES PROGRAM THEN,STRTNG AT ZP00. |
; |
DOWNLD: JSR SAA |
LDX #1 |
STX AUX2 |
JSR INPUT |
BNE DNLD6 ;BRNCH IF DATAFRAM ERR |
PHA |
JSR ZPRL ;GO XECUTE PROGRM |
BIT INMODE |
BVC DNLD2 ;BRNCH TO SET DRV2 STAT BYTES |
STA STFLGS ;SAV A(Y)(X),PS IN DRV1 STAT BYTES |
STX STFLGS+1 |
STY STFLGS+2 |
PLA |
STA STFLGS+3 |
JMP DNLD4 |
DNLD2: STA STFLG2 ;SAV A@X(Y),PS IN DRV2 STAT BYTEZ |
STX STFLG2+1 |
STY STFLG2+2 |
PLA |
STA STFLG2+3 |
DNLD4: LDA #CMPLT |
JSR SAA2 |
JMP INIT21 |
DNLD6: JSR MFUTST ;UPDATuE SPM FLG BIT |
LDA #2 |
JMP WR51 ;GO UPDATE STAT FOR DATA FRAM ER |
; |
; ****************************** |
; READ-SPIN (ALIGNMENT TEST) |
; ****************************** |
; |
; RDSPIN---TURNS ON SPM,RDLITE,&HD |
; NABL. SPINS TIL NXT CMD RECVD. |
; USED FOR TSTIN ONLY |
; |
RDSPN: LDX #READSC |
STX CTLCMD |
JSR SETSUP |
JSR STPTST |
JMP INIT71 |
; |
; |
; ******************************** |
; READ FROM ADDRESS (128-BYTE) |
; ******************************** |
; |
RDADR: CLC |
LDA AUX1 |
TAY |
ORA AUX2 |
BEQ EXTST |
LDA AUX2 |
JMP RDADR1 |
EXTST: LDY #XSTAT&255 |
LDA PORTB3 |
AND #XTPROM |
BNE RDADR0 |
SEC ;SET CRY IF XTNDED ROM INSTALD |
RDADR0: LDA #XSTAT/256 |
RDADR1: STY ZPNTL |
STA ZPNTH ;SET 0-PGE POINTR |
LDY #0 |
RDADRL: LDA @ZPNTL(Y) |
STA ZPRL(Y) ;MOV 128 BYTES TO BUFRS |
INY |
BPL RDADRL |
BCC RDADR3 |
JSR XTND1 ;GO TO UPDATE IF X ROM INSTLD |
RDADR3: LDX #1 |
STX AUX1 |
DEX |
STX AUX2 |
JMP RD32 |
; |
; *************** |
; STATUS CMND |
; *************** |
; |
; TESTS TO DETERMINE WHICH |
; DRIVE TO XMIT STATUS FOR, SENDS |
; 4 BYTE STATUS AND CHKSM TO COL- |
; -LEEN WHICH RELECTS STATE OF |
; DRIVE DURING LAST COMMAND. UP- |
; DATES DRIVE STATUS UPON COMPLET- |
; -ION OF STATUS CMND |
; |
STCMD: JSR SAA ;ACK CMND |
LDX #4 |
BIT INMODE |
BVC SCMD20 ;BRNCH IF CMND FOR DRV2 |
SCMD10: LDA WCTMSB-4(X) ;MOVE 4 BYTE STAT FOR DRV1 |
STA STPNT(X) ;INTO MORE CONVENIENT LOC. |
DEX |
BNE SCMD10 |
STCMD1: LDY #4 |
STY INSCRT |
JSR CDCKSM ;GEN CS ON 4 BYTE STAT |
STA RCDCSM |
LDA #CMPLT |
STA TMPOUT ;SET TO XMIT "C" |
JSR SETOP ;OPEN SERIAL OUTPUT PORT |
LDX #128-5 ;5 BYTES TO SEND |
JSR OUTPUT |
STCMD2: LDY #15 |
STCMD3: DEY ;SET DELA OF |
BNE STCMD3 ;74 MACH CYC |
LDY UNITNB-<128-5>(X) |
STY TMPOUT |
JSR OUTPUT ;OUTPUT 1 BYTE |
INX |
BPL STCMD2 |
JSR RSTOUT ;CLOSE OUTPUT PORT |
BIT INMODE |
BVC SCMD21 ;BRNCH IF CMND FOR DRV2 |
JSR CLRST ;CLR ALL STAT BUT WP |
JSR SPMFU ;UPDATE DRV1 SPM FLG |
JMP INIT2 |
SCMD20: LDA WCTMB2-4(X) ;MOVE 4 BYTE STAT FOR DRV2 |
STA STPNT(X) ;INTO MORE CONVEINIENT LOC |
DEX |
BNE SCMD20 |
BEQ STCMD1 ;FWR BUYTES THAN JMP |
SCMD21: JSR CLRST2 ;CLR ALL BUT BASIC STATUS FOR DR |
;VE 2 |
JSR SPM2FU ;UPDATE DRV2 SPM FLG |
JMP INIT2 |
; |
; |
; ****************** |
; FORMAT ROUTINE |
; ****************** |
; |
FRMT: JSR SAA |
JSR SPMON ;TURN ON SPM IF NOT ALREADY |
JSR RDWRLT |
JSR SPMDY ;INSURE MOTOR UP TO SPEED |
JSR WPTST |
BEQ CONFRM ;TEST DISC NOT WP,IF NOT,BRNCH. |
LDA #MTR0+WPS0+RWE0 |
JSR OR0STX |
LDA #^H0FF |
STA ZPRL ;DS TRMS TO FRNT |
STA ZPRL+1 |
JMP READ7 |
CONFRM: LDY #MAXTRK+5 |
JSR REHME |
LDX #^H0FE |
STX IDAM ;INIT ID FIELD LIST |
LDX #^H04E |
STX BYTE4E |
LDX #0 |
STX BYTE00 |
STX TRKNO |
STX SCTTBL+4 |
INX |
STX BYTE01 |
TRKLP: JSR STSUP2 ;GO TO TST FOR <20 TRK SWITCH |
LDX #0 |
STX SCTPT |
STX CRCLP |
INX |
STX SCTTBL+6 |
FCRCLP: LDX #^H0F8 |
JSR CRCGEN ;GO GEN 2 BYTE CRC ON 5 BYTE ID |
;FIELD FOR THIS TRK,SCT NUMBER. |
LDX CRCLP |
LDA BAKER |
STA FRMCRC(X) |
INX |
LDA ABLE |
STA FRMCRC(X) |
INX |
STX CRCLP |
LDY SCTPT |
LDX SCTRS(Y) |
BIT STFLGS |
BPL FORM0 |
JSR XTND4 ;GO TO XTRA ROM IF 38K CAPABL |
FORM0: STX SCTTBL+6 |
INC SCTPT |
CPY #18 |
BNE FCRCLP ;BRNCH IF MOR CRCS TO DO |
LDX #0 |
STX SCTPT |
LDA FRMCRC(X) |
STA CRC1 ;STORE FIRST CRC IN ID LIST |
INX |
STX SCTNO ;REST SCT NUMBER TO 01 |
LDA FRMCRC(X) ;STOR SECOND CRC IN ID LIST |
STA CRC2 |
STX CRCLP ;SAVE CRC LIST POINTER |
FWT: LDA TIMR1R |
BPL FWT ;WAIT FOR LAST STEP TO SETTLE. |
JSR STST1 ;WAIT 10MS FOR LAST STP SETL |
JSR FWSL |
LDX EGON |
STX PORTB2 ;TURN ON ERASE GATE |
LDX #255 ;SET X AS 255 BYTE COUNTER. |
JSR FSL ;GO XMIT 255 BYTES OF "4E" |
DEX ;SETS X TO FF AS X EQUALS 00 ON |
;RETURN FROM PREVIOUS JSR. |
JSR FSL ;GO XMIT 255 BYTES OF "4E" |
DEX |
JSR FSL ;XMIT 255 BYTES OF "4E" |
SCTLP: LDA #^H0AA |
TAY |
LDX #8 |
JSR FSL ;XMIT 8 BYTES OF "00". THIS IS S |
;ECOND HALF OF GAP3. |
LDA #^H044 |
LDY #^H089 |
LDX #3 |
JSR FSL ;XMIT 3 BYTES OF "A1". THIS IS |
;ID AM SYNC LEADER. |
LDA #^H055 |
LDY #^H054 |
LDX #1 |
JSR FSL ;XMIT 1 BYTE "FE". THIS IS ID AM |
LDX #^H0F9 |
CLC |
JSR WSL ;XMIT 7 BYTES OF ID FIELD THRU |
;ID FIELD TABLE. |
LDA #^H092 |
FONE: BIT SSDA0 |
BVC FONE |
STA SSDA1 |
LDY #^H054 |
STY SSDA1 ;XMIT 1 BYTE "4G" FAST-LATE |
LDX #18 |
JSR FSL ;XMIT 20 MORE BYTES OF "4E". THI |
;S IS FIRST HALF GAP 2. |
INC CRCLP |
LDX CRCLP |
LDA FRMCRC(X) ;MOVE CRC1 FOR NXT SCTOR INTO |
STA CRC1 ;ID FIELD LIST |
LDA #^H0AA |
TAY |
LDX #12 |
JSR FSL ;XMIT 12 BYTES OF "00". THIS IS |
;LAST HALF OF GAP 2. |
INC CRCLP |
LDX CRCLP |
LDA FRMCRC(X) ;MOVE NXT CRC2 INTO ID |
STA CRC2 ;FIELD LIST |
LDA #^H044 |
LDY #^H089 |
LDX #3 |
JSR FSL ;XMIT 3 BYTES "A1" THIS IS DAM |
;SYNC LEADER |
LDA #^H055 |
LDY #^H045 |
INX |
JSR FSL ;XMIT 1 BYTE "FB" THIS IS DAM. |
LDA #^H045 |
LDY #^H014 |
INX |
JSR FSL ;XMIT 1 BYTE "00" |
LDA #^H045 |
LDX #^H0FF ;XMIT 255 BYTES "00". THIS,PLUS |
JSR FSL ;PREVIOS XMIT=128 BYTE DATA FLD |
LDA #^H045 |
LDY #^H029 |
INX |
;XMIT 1 BYTE "48" THIS IS |
JSR FSL ;CRC1 FOR DATA FIELD OF ALL "00" |
LDA #^H014 |
LDY #^H0AA |
INX |
;XMIT 1 BYTE "29" THIS IS |
JSR FSL ;CRC2 FOR DATA FIELD ALL "00" |
LDA #^H092 |
LDY #^H054 |
INX |
;XMIT 1 BYTE "4E" THIS IS |
JSR FSL ;1 BYTE OF GAP 3 FIRST HALF |
LDA #^H092 |
LDX #23 ;XMIT 23 BYTES "4E" THIS |
JSR FSL ;COMPLETES FIRST HALF GAP3 |
LDY SCTPT |
LDX SCTRS(Y) |
STX SCTNO ;MOV NXT SCTR IN |
INC SCTPT |
CPY #17 ;CHK FOR 18 SCTRS FRMTD |
BNE JSCTLP ;IF NOT, GO DO ANOTHER |
LDA #RXRS+TXRS+CLEARS+AC1+AC2 |
STA SSDA0 ;REST XMIT |
LDA WGOFF |
STA PORTB2 ;TURN OFF WG |
INC TRKNO |
INC SCTTBL+4 |
JSR EGOFF |
LDX #MAXTRK+1 |
LDA DH80T |
BEQ FONE1 |
JSR XTND3 ;GO TEST FOR MAX # OF TRKS TO FORMAT |
FONE1: CPX TRKNO ;CHK FOR ALL TRKS FORMATED |
BEQ FTST |
LDX #^H080 ;X MUST BE NEG VALUE BEFOR ENTRY |
;TO STEP ROUT TO STEP IN |
JSR STEP |
JMP TRKLP ;GO FORMAT ANOTHR TRK |
JSCTLP: JMP SCTLP ;MUST GO TO SCTLP FROM HERE BRNCH |
;OUT OF RANGE |
; |
; *************** |
; FORMAT TEST |
; *************** |
; |
; TESTS ALL SCTRS |
; AFTR ACTUAL |
; FORMAT AND COMPILES LISTING OF |
; BAD SCTRS TO SEND TO COLEN AT |
; END. (63 BAD SCTRS MAX) |
; |
FTST: LDA #READSC |
STA CTLCMD |
JSR RDWRLT |
LDX #0 |
STX BFRPNT |
LDY #^H080 |
FT1: LDA SCTRS(X) ;ALTRNATLY MOVE SCTR #'S |
STA ZPRL(Y) ;FROM ROM INTO BUFRS |
INY ;AT HEX LOC.0080 TO 0091 |
INX ;INCLUSIV |
INX |
CPX #18 |
BNE FT2 |
LDX #1 |
STX ZP91 |
FT2: CPX #17 |
BNE FT1 |
DEC SCTTBL+4 |
FT21: LDX #128 |
FT3: LDA ZPRL(X) |
INX |
STX FSCTBP ;SAV SCTR PNTR |
STA SCTTBL+6 |
JSR STSUP1 ;DO CRC ON SCTR ID FIELD |
LDA #^H060 |
STA ABLE |
LDA #^H0B1 |
STA BAKER |
LDA #DUM11 |
JSR ORINMD ;SET LSB INMODE FOR WFRD |
;ROUT TSTING |
JSR WFRD ;READ 1 SCTR |
DEC INMODE |
BCS FT5 ;BRNCH IF SCTR READ ERR |
FT4: LDX FSCTBP |
CPX #128+18 |
BNE FT3 ;BRNCH IF MOR SCTRS TO READ |
LDY SCTTBL+4 |
BNE FT40 ;BRANCH IF ALL TRKS NOT READ |
LDA DH80T |
BEQ FT6 ;BRANCH IF NOT DH OR 96 TPI DRVS |
JSR XTND5 |
JMP FT6 |
; |
FT40: DEY |
STY SCTTBL+4 |
LDX #0 |
LDY #1 |
JSR STPTST ;STP TO NXT TRK |
JMP FT21 ;CONT TST |
; |
FT5: LDA #FMTER |
JSR ORINST ;SET FORMAT ERR BIT INSTAT |
; |
; TRACK/SECTOR CONVERSION TO |
; 2 BYTE SECTOR NUMBER |
; |
SCTBU: LDY #0 |
STY MSBSB |
LDX BFRPNT |
LDA SCTTBL+4 ;GET TRK NMBR |
ASL |
STA TMPSB ;SAVE TIMES TWO |
ASL |
ROL MSBSB |
ASL |
ROL MSBSB |
ASL |
ROL MSBSB |
ADC TMPSB |
TAY |
LDA #0 |
ADC MSBSB |
STA MSBSB |
TYA |
CLC |
ADC SCTTBL+6 |
STA ZPRL(X) |
LDA #0 |
ADC MSBSB |
INX |
STA ZPRL(X) |
LDA DH80T |
BEQ FT51 |
JSR XTND11 ;GOTO INCREASE SEC # FOR SIDE 2 |
;; |
FT51: INX |
STX BFRPNT |
CPX #128-2 |
BNE FT4 ;BRNCH IF BAD SCTR BUFR NOT FULL |
FT6: LDA #^H0FF |
LDX BFRPNT |
STA ZPRL(X) |
INX |
STA ZPRL(X) |
STA SCTTBL+4 |
; |
LDA #FORMT |
STA CTLCMD |
; |
LDA INSTAT |
AND #FMTER |
BNE FT7 ;BRNCH IF ANY BAD SCTRS |
JMP RD31 |
FT7: LDA #^CFMTER |
JSR ANINS ;CLR FRMTERR BIT INSTAT |
JMP READ7 |
; |
; |
; *********************** |
; FORMAT SERVICE LOOP |
; *********************** |
; |
FSL: BIT SSDA0 ;POLL STATRG FOR XMITRA |
BVC FSL |
STA SSDA1 ;DBL LOAD TO SSDA--16 BITS |
STY SSDA1 ;0F CLK/DTA=8 BIT WORD TO DISC |
DEX |
BNE FSL ;CONT SRVCE TIL X=00 |
RTS |
; |
; *********************** |
; MOTOR DELAY 30 SECS |
; *********************** |
; |
; TURN ON SPM AND SETS FOR 30 |
; SEC DELAY BEFORE SHUTOFF |
; |
MOTRON: JSR SAA |
JSR SPMON |
LDX #255 |
BIT INMODE |
BVC MON2 |
STX SPMSDC ;SET DRV1 MOTR FOR 30 SEC DLA |
BVS MON4 |
MON2: STX SPSDC2 ;SET DRV2 MOTR FOR 30 SEC DLA |
MON4: JMP STCMD |
; |
; |
; ******** |
; STEP |
; ******** |
; |
; TESTS TO DETERMINE WHICH |
; DRIVE TO PERFORM 1 STEP ON. STEPS, |
; SETS UP 5MS TIMER BUT DOES NOT WAIT |
; |
STEP: BIT INMODE |
BVC STP2 ;BRNCH IF HERE TO STEP DRIV2 |
; |
; REHOME HEAD |
; STEP ROUTINE |
; |
STEP1: LDA #^H0A0 |
STA TIMR3 ;SET FOR 5.25MS STEP WIDTH |
LDA PORTB1 |
AND #SPTOP1+SPTOP2+SPTOP3+SPTOP4 |
INX |
BMI STPIN |
DEC PRSTRK ;STP TO OUTR TRK |
LSR |
STA STPSCR |
AND #BIT1 |
BEQ STEP2 |
LDA #SPTOP4 |
ORA STPSCR |
BPL STEP3 |
STPIN: INC PRSTRK ;STP TO INNR TRK |
ASL |
STA STPSCR |
AND #BIT6 |
BEQ STEP2 |
LDA #SPTOP1 |
ORA STPSCR |
BPL STEP3 |
STEP2: LDA STPSCR |
STEP3: STA PORTB1 ;THIS IS PHYSICAL STEP |
DEY ;Y=NUMBER OF STEPS TO GO |
RTS |
; |
; |
STP2: LDA #^H0A0 |
STA TIMR3 ;SET FOR 5.25MS DELA |
LDA PORTB3 |
AND #SPBOT1+SPBOT2+SPBOT3+SPBOT4 |
INX |
BMI STPIN2 |
DEC PRTRK2 ;STP TO OUTR TRK |
LSR |
STA STPSCR |
AND #BIT1 |
BEQ STEP22 |
LDA #SPBOT4 |
ORA STPSCR |
BPL STEP32 |
STPIN2: INC PRTRK2 ;STP TP INER TRK |
ASL |
STA STPSCR |
AND #BIT6 |
BEQ STEP22 |
LDA #SPBOT1 |
ORA STPSCR |
BPL STEP32 |
STEP22: LDA STPSCR |
STEP32: STA PORTB3 ;THIS IS PHYSICAL STEP |
DEY ;Y=NUMBER OF STEPS TO GO |
RTS |
; |
; *************** |
; SECTOR TEST |
; *************** |
; |
; TESTS IF PRESENT CMND |
; SECTOR NUMR IS 1,2,OR3. SETS |
; CARRY IF SO FOR TESTING ON |
; RETURN TO BUFRS OUT OR INPUT. |
; |
SCTTST: LDX #0 |
CPX SCTTBL+4 |
CLC |
BNE SCTST1 ;BRNCH IF PRESENT TRK# NOT 00 |
LDA SCTTBL+5 ;BRANCH IF ON SIDE 2 |
BNE SCTST1 |
LDA #3 |
CMP SCTTBL+6 ;TST IF PRSNT SCT 1,2,OR3 |
SCTST1: RTS |
; |
; |
; *********************** |
; MOTOR STATUS UPDATE |
; *********************** |
; |
; TSTS TO DETRMIN WHICH DRV |
; TO UPDATE MOTR STAT ON. THEN, |
; UPDATES ONLY THAT STAT BIT |
; |
MFUTST: BIT INMODE |
BVC SPM2FU ;BRNCH IF HERE TO UPDATE DRV2 |
;MOTR STAT |
; |
; |
SPMFU: LDA PORTA1 |
LSR |
LSR |
LDA #MTR0 |
BCS MFU1 |
LDA #0 |
MFU1: JMP ORSTF |
; |
; |
SPM2FU: LDA PORTA3 ;TST IF DRV 2 MOTER |
LSR ;ON |
LSR |
LDA #MTR0 |
BCS MFU12 ;BRNCH IF DRV2 MOTR ON |
LDA #0 |
MFU12: JMP ORSTF2 ;GO UPDATE DRV2 STATUS |
; |
; |
; ****************** |
; ERROR HANDLING |
; ******************* |
; |
; ERRTRY TSTS TO DETRMIN WHICH DRV |
; TO REPOSITION HEAD ON FOR |
; RD OR WRIT RETRY. EITHR REHOMES AND |
; REPOSITIONS OR STPS ONCE AND BACK. |
; |
ERRTRY: DEX |
STX PACNTR |
TYA |
BNE ERR2 ;BRNCH IF DAM NOT FOUND |
CPX #2 |
BNE ERR2 ;BRNCH IF ONLY ONE PASS MADE |
LDY #MAXTRK+5 |
JSR REHME ;REHOME HEAD |
BMI ERR6 ;ALWAYS BRNCH |
ERR2: CPX #1 |
BNE ERR8 ;BRNCH IF THIS NOT THIRD ATMPT |
LDY STPDIR |
BMI ERR4 ;BRNCH TO STP IN AND BACK |
DEC TRKNBR |
JSR ERRSUB ;STP OUT |
INC TRKNBR |
BPL ERR6 ;ALWAYS BRNCH TO STP BACK |
ERR4: INC TRKNBR |
JSR ERRSUB ;STEP IN |
DEC TRKNBR |
ERR6: JSR ERRSUB ;STP BACK |
ERR8: RTS |
; |
ERRSUB: LDA TRKNBR |
JSR CSTEP |
JSR STPTST |
RTS |
; |
; |
; ************************** |
; READ/WRITE LITE SELECT |
; ************************** |
; |
; RDWRLT TSTS TO DETRMIN WHICH |
; READ HD TO NABL AND TRNS ON EITHR RD |
; OR WRIT LITE FOR PROPER DRV |
; |
RDWRLT: LDA INMODE |
ASL |
BPL RWLT4 ;BRNCH IF CMND FOR DRV2 |
LDX #BDBHRD+BDTHRD+TDBHRD |
ASL |
BMI RWLT1 ;BRNCH IF CMND FOR SIDE2 |
LDX #BDBHRD+BDTHRD+TDTHRD |
RWLT1: STX PORTA2 |
LDA PORTA3 |
AND #^C<WLTOP+RLTOP> |
STA PORTA3 |
LDX CTLCMD |
CPX #READSC |
BEQ RWLT2 |
ORA #WLTOP |
RWLT3: STA PORTA3 |
RTS |
; |
RWLT2: ORA #RLTOP |
BNE RWLT3 ;UNCONDITIONAL BRANCH (SAVE A BYTE) |
; |
RWLT4: LDX #RLBOT+BDBHRD+TDBHRD+TDTHRD |
ASL |
BMI RWLT5 ;BRNCH IF CMND FOR SIDE2 |
LDX #RLBOT+BDTHRD+TDBHRD+TDTHRD |
RWLT5: TXA |
LDX CTLCMD |
CPX #READSC |
BEQ RWLT6 |
CLC |
ADC #RLBOT ;ADC? |
RWLT6: STA PORTA2 |
RTS |
; |
; ****************** |
; COMMANDS INPUT |
; ****************** |
; |
; INPUTS FROM COLLEEN TO |
; COMMANDS BUFRS. COMPLIMENTS DATA |
; RUNS AT 19.2K EXCEPT -- WHEN |
; INPUTTING DATA FIELD CS FOR INPUT |
; ROUTINE. MAY RUN AT 19.2K OR 38.4K |
; THEN |
; |
CHKIN: LDA PORTB1 ;NTR HERE FOR DATA FIELD CHKSM |
BPL CHKIN |
BMI CIN0 ;HAV CS STRT BIT,BRNCH |
CINPUT: BIT PORTB1 |
BVC CIN5 ;BRNCH IF CMD FRAM GONE--ERR |
BPL CINPUT ;BRNCH IF NO STRT BIT YET |
CIN0: LDA INMODE |
AND #BAUD19+CMDFIN |
CMP #CMDFIN |
BEQ CIN1 ;BRNCH IF RUNNING AT 38K SPEED |
LDY #11 |
CNDLA1: DEY |
BNE CNDLA1 ;DELA OF 54 M CYC |
CIN2: LDY #128-8 ;SET BIT CNTR |
CNDLA2: TYA ;SAVE BIT CNTR |
LDY #14 |
CNDLA3: DEY |
BNE CNDLA3 ;DELA OF 69 M CYC AT 19K, 9 |
;M CYC AT 38K FOR BIT SPACE, |
;44 M CYC AT 38K FOR STRT BIT |
TAY ;RETREIV BIT CNTR |
LDA PORTB1 ;RETREIV 1 BIT |
ROL ;SHIFT OUT CRY |
ROR UNITNB(X) ;ASSEMBL BIT TO PRSNT WORD |
INY |
BPL CIN3 ;BRNCH TIL 8 BITS DONE |
LDA UNITNB(X) |
EOR #255 |
STA UNITNB(X) ;COMPLMNT LAST BYTE IN |
INX |
CPX INSCRT |
BNE CIN4 ;BRNCH IF MORE BYTES TO BRING IN |
RTS |
; |
CIN1: LDY #128-8 |
NOP |
LDY #9 |
BNE CNDLA3 ;ALWAYS BRNCH |
CIN3: LDA INMODE |
AND #BAUD19+CMDFIN |
CMP #CMDFIN |
BNE CNDLA2 ;BRNCH IF RUNNING AT 19K SPEED |
TYA |
LDY #2 |
NOP |
NOP |
NOP |
BNE CNDLA3 ;ALWAYS BRNCH |
CIN4: LDY #13 |
CNDLA4: DEY |
BNE CNDLA4 ;DELA 64 M CYC |
BEQ CINPUT ;ALWAYS BRNCH |
CIN5: JMP CMD2 ;HAVE CMND FRAM ERR |
; |
; **************************** |
; CRC SETUP FOR DATA FIELD |
; **************************** |
; |
CRCSUP: LDA #CRCTST |
JSR ORINMD ;SET LSB IN INMODE FOR CRC TSTIN |
LDX #0 |
LDY #^H0E2 |
STY BAKER |
LDY #^H095 |
STY ABLE |
JSR CRCETR |
LDA #^CCRCTST |
JSR ANDNMD ;CLR LSB IN INMODE |
RTS |
; |
; ****************** |
; ERASE GATE OFF |
; ****************** |
; |
; |
; EGOFF TIMESOUT 832US BEFOR |
; TURNING OFF PROPR EG |
; |
EGOFF: LDA #^H01A |
STA TIMR3 ;SET TIMR FOR 832US |
EGOFF1: LDA TIMR1R |
BPL EGOFF1 ;WAIT FOR TIMR INTRUPuT |
LDA #BDBHER+BDBHWR+BDTHER+BDTHWR+TDBHER+TDBHWR+TDTHER+TDTHWR |
STA PORTB2 ;TURN OFF EG |
RTS |
; |
; ********** |
; SETSUP |
; ********** |
; |
; PRFORMS COMMON HOUSE |
; KEEPING FOR READ AND WRITE ROUTS. |
; |
SETSUP: JSR SAA ;ACK CMND |
JSR SPMON ;TURN ON SPM IF NOT ALREADY |
JSR RDWRLT |
LDA #3 ;ERROR RETRY COUNT |
STA PACNTR |
JSR SCTBD ;CONVRT RECEIVD SEC TO TRK/SEC |
STSUP0: LDA SCTNBR |
STA SCTTBL+6 ;INIT SYNCTBL |
LDA TRKNBR |
STA SCTTBL+4 |
STSUP1: LDX #^H0F8 |
JSR CRCGEN |
LDX BAKER |
STX SCTTBL+8 ;CRC1 |
STA SCTTBL+9 ;CRC2 |
STSUP2: LDA PORTB3 |
LDX SCTTBL+4 ;GET TRK NMBR GOING TO |
CPX #20 |
BIT DH80T |
BVC STUP20 |
JSR XTND13 ;GO XTRZ ROM IF 96TPI |
STUP20: BCC STSUP3 |
AND #^CAMPADJ ;CLR RD/WRITE >20 TRK GATE |
BNE STSUP4 |
STSUP3: ORA #AMPADJ ;SET RD/WRITE <21 TRK GATE |
STSUP4: STA PORTB3 |
LDA TRKNBR |
JSR CSTEP |
RTS |
; |
; *************** |
; BUFFERS OUT |
; *************** |
; |
; OUTPUTS ASCII "C"/"E", |
; 256 BYTE BUFFER AND CHECK |
; SUM. COMPUTES CHECKSUM |
; |
BFROUT: JSR SCTTST ;TST IF SCTR 1,2,OR 3 |
STX CSSCRT ;CLR FOR FIRST CS ADD |
BCC BOUT01 ;BRNCH IF TST RESLT NOT 1,2,OR 3 |
LDA #FORMT |
CMP CTLCMD |
BEQ BOUT01 ;BRNCH IF PRSNT CMND A FORMAT |
BOUT0: LDA ZPRL(X) ;MOVE LOWR HALF |
STA ZP80(X) ;OF BFRS TO |
INX ;UPR HALF |
BPL BOUT0 |
BOUT01: CLC |
BIT INMODE |
BMI BOUT02 ;BRNCH IF 19.2K |
JMP XTND9 |
BOUT02: PHP |
JSR OUTPUT ;OUTPUT "C" OR "E" |
LDY #8 |
BOUT1: DEY |
BNE BOUT1 ;DELA OF 39 MACH CYC |
BOUT2: LDY #8 |
BOUT3: DEY |
BNE BOUT3 ;DELA OF 39 MACH CYC |
LDY ZPRL(X) |
STY TMPOUT ;MOVE 1 BYTE INTO OUTPUT SCRATCH |
JSR OUTPUT ;OUTPUT 1 BYTE |
PLP ;RETREIV CRY |
JSR DFCKSM ;ADD LAST BYTE OUT TO CS |
PHP ;SAV CRY FROM LAST CS ADD |
INX |
BNE BOUT2 ;BRNCH IF 256 BYTES NOT DONE |
LDA CSSCRT |
PLP |
ADC #0 ;ADD LAST CS ADD CRY TO CS |
STA TMPOUT |
LDY #7 |
BOUT4: DEY |
BNE BOUT4 ;DELA OF 34 MACH CYC |
JSR OUTPUT ;OUTPUT CHEKSUM |
RSTOUT: LDX PBDDR1 |
DEX |
STX PBDDR1 ;REST OUTPUT PORT |
RTS |
; |
; ********************** |
; WRITE SERVICE LOOP |
; ********************** |
; |
WSL: BIT SSDA0 ;POLL STATREG FOR XMITRA |
BVC WSL |
LDA ZPRL(X) ;GET DATA WORD FROM BUFR |
ROR ;SHIFT OUT LOWR 4 BITS,BRING |
LSR ;IN LSB OF LAST BYTE XMITED |
LSR ;THRU CARRY |
LSR ;NOW HAV 5 BIT POINTER IN LSB'S |
TAY ;Y WILL BE POINTR |
LDA CDLT(Y) ;GET 1 BYTE C/D FROM TABLE |
STA SSDA1 |
LDA ZPRL(X) ;GET DATA WORD FROM BUFR AGAIN |
AND #^H01F ;MASK OFF TOP 3 BITS |
TAY ;Y WILL BE POINTER |
LSR ;SAV LSB IN CRY FOR NXT WORD |
;TO XMIT |
LDA CDLT(Y) ;GET 1 BYTE C/D FROM TABLE |
STA SSDA1 ;XMIT |
INX ;CONT SERVICE ROUTINE TIL X=00 |
BNE WSL |
RTS |
; |
; ********** |
; REHOME |
; ********** |
; |
; TESTS TO DETERMINE TO |
; REHOME DRIVE 1 OR 2. REHOMES, |
; WAITING 5MS AFTR EACH STEP. |
; WAITS ONLY 5MS AFTR LST STP |
; SETS RESPECTIV DRIV SCRATH LOC |
; TO INDICAT TRK 00 |
; |
REHME: LDX #SPTOP1+SPTOP4 |
BIT DH80T |
BVC RHM10 |
JSR XTND7 ;GO TO XTRA ROM IF 96TPI |
RHM10: BIT INMODE ;TST TO REHME DRV1 OR 2 |
BVS REHME1 ;BRNCH TO REHME DRV1 |
STX PORTB3 ;INIT STP PHASE TO REHME DRIV 2 |
RHM12: JSR STEP |
BEQ RHM42 |
RHM22: LDA TIMR1R |
BPL RHM22 ;SPIN TIL 5MS UP |
JMP RHM12 |
RHM32: JMP REHME1 ;GO REHOME DRIV 1 |
RHM42: STY PRTRK2 ;SET PRTRK2 TO INDICATE DRIV 2 |
;ON TRK 00 |
RHM52: LDA #128 |
STA TIMR3 ;SET TIMR FOR 50MS |
RHM62: LDA TIMR1R |
BPL RHM62 |
RTS |
REHME1: STX PORTB1 ;INIT STP PHASE |
REHM4: JSR STEP |
BEQ REHM3 |
REHM2: LDA TIMR1R |
BPL REHM2 ;WAIT 5MS FOR STP SETL |
BMI REHM4 |
REHM3: STY PRSTRK ;SET FOR TRK 00 |
BEQ RHM52 |
; |
; ********** |
; OUTPUT |
; ********** |
; |
; OUTPUTS 1 BYTE FROM TMPOUT |
; TO COLLEEN AT 19.2K |
; |
OUTPUT: LDA PORTB1 |
AND #^CSEROUT |
STA PORTB1 ;START BIT OUT |
LDY ZPRL ;DELA 3 MACH CYC |
LDY #128-8 ;SET BIT COUNTR |
OUT1: NOP |
NOP |
NOP ;DELA 6 MACH CYC |
STY YSAVE ;SAV BIT COUNTR |
LDY #14 |
OUT2: DEY |
BNE OUT2 ;DELA 69 MACH CYC |
LDY YSAVE |
LSR |
ROR TMPOUT |
ROL |
STA PORTB1 |
INY |
BPL OUT1 ;BRNCH TIL 8 BITS OUT |
LSR |
SEC |
ROL |
LDY #17 |
OUT3: DEY |
BNE OUT3 ;DELA 84 MACH CYC |
NOP |
NOP ;DELA 4 MACH CYC |
STA PORTB1 ;STOP BIT OUT |
RTS |
; |
; ******************** |
; SPINDLE MOTOR ON |
; ******************** |
; |
; TESTS TO DETERMINE WHICH |
; DRIVE TO TURN ON SPM. TURNS ON SPM I |
; F NOT ALREADY ON AND SETS TO INDICAT |
; 500MS DELA REQUIRED |
;SETS FOR 6 SEC DELA ON SHUTDOWN |
; |
SPMON: BIT INMODE |
BVC SPO02 ;BRNCH IF HERE TO TURN ON SPM 2 |
; |
; |
; TEST IF SPM IS ON. IF NOT,TURN ON AND |
; SET TO INDICATE 500MS DELAY REQ. |
; |
SPMON1: LDA PORTA1 |
LSR |
LSR ;TEST IF SPM IS ON. IF OM,LEAVE |
BCS SPO1 ;ROUTINE |
LDA #CLKRST+CTSRST+MRSSDA+SELTOP |
STA PORTA1 ;TURN ON SPM |
LDA #255 |
STA TIMR2 ;SET FOR 125MS DELAY |
LDA #4 |
STA SPMDLC ;SET FOR 4 DELAYS |
SPO1: LDA #24 |
STA SPMSDC ;SET FOR 3 SEC DLA ON SHTDWN |
RTS |
; |
; |
SPO02: LDA PORTA3 |
LSR |
LSR |
BCS SPO12 ;BRNCH IF SPM2 ALREADY ON |
LDA #SELBOT |
STA PORTA3 ;TURN ON SPM2 |
LDA #255 |
STA TIMR23 ;SET FOR 125MS DELA |
LDA #4 |
STA SPMDC2 ;SET FOR 4 DELAS |
SPO12: LDA #24 |
STA SPSDC2 ;SET FOR 3 SEC DELA ON SHTDN |
RTS |
; |
; *********************** |
; SPINDLE MOTOR READY |
; *********************** |
; |
; TESTS TO DETERMINE WHICH |
; DRIVE TO PERFORM DELAY ON. WAITS |
; FOR 500 MS IF NEEDED. UPDATES STUTUS |
; TO REFLECT THIS SPM ON AND STABL |
; |
SPMDY: BIT INMODE |
BVC SPDY12 ;BRNCH IF HERE FOR SPM2 DELA |
; |
; |
; |
; |
; TEST IF SPM SPEED STABLE/WAIT IF NOT. |
; |
SPMDY1: LDA INSTAT |
LSR |
LSR |
LSR |
BCC SPMDY4 ;IF SPM STABL,LEAVE ROUT |
SPMDY2: LDA TIMR1R |
BPL SPMDY2 ;WAIT 125MS |
DEC SPMDLC |
BEQ SPMDY3 ;CONT DELAY LOOPS TIL SPMDLC=00 |
LDA #255 |
STA TIMR2 ;RESET TIMER FOR 125MS DELAY |
JMP SPMDY2 |
SPMDY3: LDA #^CS1NRDY |
JSR ANINS ;CLEAR MOTOR NOT READY BIT IN IN |
SPMDY4: LDA #NODISK ;TERNL STAT REG |
JSR OR0ST ;SET SPM ON FLG IN XFER STAT |
RTS ;REG |
; |
SPDY12: LDA INMODE |
AND #S2NRDY |
BEQ SPDY42 ;BRNCH IF SPM2 STABL |
SPDY22: LDA TIMR3R |
BPL SPDY22 ;WAIT 125MS |
DEC SPMDC2 |
BEQ SPDY32 ;CONT DELA LOOPS TIL SPMDC2=00 |
LDA #255 |
STA TIMR23 ;RESET TIMR FOR 125MS DELA |
JMP SPDY22 |
SPDY32: LDA #^CS2NRDY |
JSR ANDNMD ;CLR MOTOR UNSTABL BIT IN INMODE |
SPDY42: RTS |
; |
; *********************** |
; CRC GENERATION LOOP |
; *********************** |
; |
CRCGEN: LDA #^H0FF |
STA ABLE |
STA BAKER |
CRCETR: LDA INMODE |
LSR |
.BYTE ^H0BD ;ABSOLUTE ADDR. SO INDEX DOESN'T WRAP INTO |
;0 PAGE |
.WORD ZPCRC ;"LDA ZPCRC(X) ABSOLUTE" |
BCC CRCT1 |
LDA ZPRL(X) |
CRCT1: EOR BAKER |
STA SCRT1 |
LSR |
LSR |
LSR |
LSR |
EOR BAKER |
TAY |
LDA INMODE |
LSR |
TYA |
BCC CRCT3 |
EOR ZPRL(X) |
CRCT2: AND #^H00F |
STA SCRT2 |
LDA SCRT1 |
AND #^H0F0 |
EOR SCRT2 |
STA SCRT2 |
LSR |
LSR |
LSR |
EOR ABLE |
STA ABLE |
LDA SCRT2 |
ASL |
ASL |
ASL |
ASL |
STA SCRT1 |
EOR ABLE |
STA BAKER |
LDA SCRT1 |
ASL |
EOR SCRT2 |
STA ABLE |
INX |
BNE CRCETR |
RTS |
CRCT3: .BYTE ^H05D ;FORCE ABS. ADDR. SO INDEX DOESN'T WRAP |
.WORD ZPCRC ;"EOR ZPCRC(X) ABSOLUTE" |
JMP CRCT2 |
; |
; *********************** |
; SYNCRONIZATION LOOP |
; *********************** |
; |
SYNC00: JMP SYNC7 |
SYNC: LDA #6 ;SET TIMR LOOP CNTR FOR 5 LOOPS |
STA SPMDC2 |
SYNC0: DEC SPMDC2 |
BEQ SYNC00 ;BRNCH IF 5 TIMR LOOPS DONE |
CPY #1 |
BEQ SYNC00 ;BRNCH IF HERE FOR DAM AND 1 TIM |
;R LOOP DONE |
LDA #255 ;SET TIMR FOR 130 MS |
SYNC01: STA TIMR23 |
NUTS: LDA TIMR3R |
BMI SYNC0 ;BRNCH IF TIMR DONE |
LDA #RXRS+TXRS+CLEARS |
STA SSDA0 |
LDA #^H09B |
STA SSDA1 |
SYNCLP: LDA #RXRS+TXRS+CLEARS+AC2 |
STA SSDA0 ;REST REC(X)MIT. NABL SR WRITE |
LDA #^H044 ;LOAD SYNC REG WITH HEX 44 (FIRS |
STA SSDA1 ;T HALF SYNC CHAR CLK/DATA PATRN |
LDA PORTA1 |
AND #^CCLKRST |
STA PORTA1 ;REST PA6(PORTA1) TO RESET READ |
ORA #CLKRST ;CLOCK FAST. |
STA PORTA1 ;NABL READ CLOCK SWITCH |
LDA #TXRS+AC2 |
STA SSDA0 ;NABL REC |
SYNC1: LDA TIMR3R |
BMI SYNC0 ;BRNCH IF TIMR DONE |
BIT PORTA1 |
BPL SYNC1 ;BRNCH IF NO SYNC MATCH FROM |
;SSDA CHIP |
LDA #^H089 ;HAV FIRST SYNC MATCH. LOAD SYNC |
STA SSDA1 ;REG WITH SECND HALF CLK/DATA |
LDX #4 ;PATRN OF SYNC CHAR AND |
SYNC2: DEX ;WAIT APPROX. 13US MORE BEFORE |
BNE SYNC2 ;VERIFICATION OF SECOND SM |
BIT PORTA1 ;MUST HAV SECOND SM NOW. IF NOT, |
BMI NUTS ;FALSE STRT RESTRT SYNCLOOP |
;P. |
LDA #TXRS |
STA SSDA0 ;NABL C2 WRITE,CONT REC |
LDA #PC1+PC2+WS1+WS2+TXSUND+EIE |
STA SSDA1 ;NOW HAV SYNC. INHIBIT |
;FURTHER SM OCCURENCES. |
CPY #2 |
BEQ SYNC6 |
LDX #2 |
LDA #3 |
STA TIMR3 |
SYNC3: BIT TIMR1R |
BMI NUTS |
BIT SSDA0 |
BPL SYNC3 ;POLL SSDA STAT REG FOR RDA |
SYNC4: LDA SSDA1 ;CMPRE NXT 2 |
CMP #^H0A1 ;BYTES IN TO "A1" |
BNE NUTS ;NOT EQUAL=FALSE STRT |
DEX |
BNE SYNC4 |
TYA |
BNE SYNC6 |
LDX #128-8 |
SYNC5: BIT SSDA0 |
BPL SYNC5 |
LDA SSDA1 ;CMPARE NXT 8 WORDS IN |
CMP SCTTBL+3-<128-8>(X) ;WITH THIS TRK,SCT DATA |
BNE NUTS ;IN TBLE. IF ANY ERRS |
INX ;HAV FLSE STRT--RESTRT LOOP |
LDA SSDA1 |
CMP SCTTBL+3-<128-8>(X) |
BEQ SYNC8 |
JMP NUTS |
SYNC8: INX |
BPL SYNC5 |
SYNC6: LDA #1 |
SYNC7: RTS ;Z=0 ON EXIT MEANS HAV SYNC |
; |
; ************************** |
; TIMEOUT WG BEFORE STEP |
; ************************** |
; |
TWGBS: LDA #8 |
JSR TIMER ;DELAY |
JSR STEP |
RTS |
; |
; ********* |
; TIMER |
; ********* |
; |
TIMER: STA TMRSCR |
TMR1: DEY |
BNE TMR1 |
DEC TMRSCR |
BNE TMR1 |
RTS |
; |
; *************************** |
; STATUS CLEAR AND UPDATE |
; *************************** |
; |
; TSTS TO DETRMIN WHICH DRV TO |
; UPDATE STAT ON. CLEARS ALL BUT BASIC |
; STATUS BITS, THEN UPDATES STAT BY |
; CONTNTS OF ACCUMULATR ON ENTRY TO |
; THIS ROUT |
; |
OR0STX: BIT INMODE |
BVC OR0ST2 ;BRNCH IF HERE TO UPDATE DRV2 |
; |
OR0ST: PHA |
LDA #^C<MTR0+RWE0+INVDF0+INVCF0> |
AND STFLGS |
STA STFLGS |
PLA |
ORSTF: ORA STFLGS |
STA STFLGS |
RTS |
; |
ORINST: ORA INSTAT |
STA INSTAT |
RTS |
; |
OR0ST2: PHA |
LDA #^C<MTR0+RWE0+INVDF0+INVCF0> |
AND STFLG2 |
STA STFLG2 |
PLA |
ORSTF2: ORA STFLG2 |
STA STFLG2 |
RTS |
; |
CLRST: LDA #^C<MTR0+RWE0+INVDF0+INVCF0> |
CLRST1: AND STFLGS |
STA STFLGS |
RTS |
; |
CLRST2: LDA #^C<MTR0+RWE0+INVDF0+INVCF0> |
CLRS12: AND STFLG2 |
STA STFLG2 |
RTS |
; |
; ********************** |
; WRITE PROTECT TEST |
; ********************** |
; |
; WPTST TESTS TO DETRMIN WENICH |
; DRV TO PERFORM WP TEST ON. Z FLG |
; RESET IF DRV WP |
; |
WPTST: LDA PORTA1 |
BIT INMODE |
BVC WPTST1 ;BRNCH IF HERE TO CHK WP DRV2 |
WPTST0: AND #WPTOP |
RTS |
; |
WPTST1: AND #WPBOT |
RTS |
; |
ANINS: AND INSTAT |
STA INSTAT |
RTS |
; |
; ********************** |
; UPDATE INMODE BITS |
; ********************** |
; |
ORINMD: ORA INMODE |
STA INMODE |
RTS |
; |
ANDNMD: AND INMODE |
STA INMODE |
RTS |
; |
; ****************************** |
; UPDATE DEVICE STATUS FLAGS |
; ****************************** |
; |
ORST1: BIT INMODE |
BVC ORST10 |
ORA DEVSTA |
STA DEVSTA |
RTS |
; |
ORST10: ORA DEVST2 |
STA DEVST2 |
RTS |
; |
ANDST1: BIT INMODE |
BVC ANST10 |
AND DEVSTA |
STA DEVSTA |
RTS |
; |
ANST10: AND DEVST2 |
STA DEVST2 |
RTS |
; |
; ****************************** |
; TEST RECEIVED SECTOR NUMBR |
; ****************************** |
; |
TSN: LDX AUX2 |
LDA AUX1 |
BEQ TSN2 ;BRNCH IF LS HALF 00 |
TSN1: CPX #3 |
BCS TSN3 ;BRNCH IF MS HALF 03 OR MORE |
CMP #^H0D1 |
BCS TSN4 ;BRNCH IF LS HALF D1 OR MORE |
TSN11: CLC ;SET CRY FOR NO ERR |
RTS |
TSN2: CPX #0 |
BNE TSN1 ;BRNCH IF MS HALF NOT 00 |
TSN3: SEC ;SET CRY FOR ERR |
LDA DH80T |
AND #DBLHED+TPI96 |
BEQ TSN31 |
JSR XTND6 ;GO XTRA ROM IF 96TPI 0R DH |
TSN31: RTS |
TSN4: CPX #2 |
BEQ TSN3 ;BRNCH IF MS HALF 02 |
JMP TSN11 |
; |
; |
; ******************************* |
; DATA FIELD CHECKSUM COMPUTE |
; ******************************* |
; |
; SMALL ROUT USED TO |
; GENERAT CS ON DATA BUFRS FOR BOTH |
; I/O ROUTS |
; |
DFCKSM: LDA CSSCRT ;GET CURENT CS WORD |
ADC ZPRL(X) ;ADD LAST WORD TO CS |
STA CSSCRT ;SAV TEMP |
RTS |
; |
; |
; ********************* |
; COMMANDS CHECKSUM |
; ********************* |
; |
; GENERATES CS ON 4 BYTE CMND |
; AND COMPARES RESULT AGAINST REC CS |
; ON EXIT,Z=1 IF NO ERR |
; |
CDCKSM: LDA #0 |
CLC ;CLR A & CRY FOR FIRST ADD |
CS1: ADC UNITNB(X) ;ADD ONE WORD TO CS |
PHP ;SAV CRY FOR NXT ADD |
INX |
CPX INSCRT ;CHK FOR ALL BYTES ADDED |
BEQ CS2 ;BRNCH IF ALL ADDED |
PLP ;RETREIV CRY |
JMP CS1 ;GO DO ANOTHR ADD |
CS2: PLP ;RETREIV CRY |
ADC #0 ;ADD LST CRY TO CS |
CMP UNITNB(X) ;COMPAR CS TO RECVD CS |
RTS |
; |
; ********************** |
; FORMAT/WRITE SETUP |
; ********************** |
; |
; PERFORMS BASIC |
; SETUP OPRATIOMS FOR BOTH WRITE |
; AND FORMAT ROUTS |
; |
; |
FWSL: LDA PORTA2 |
ORA #BDBHRD+BDTHRD+TDBHRD+TDTHRD |
STA PORTA2 ;DISABLE ALL READ HEADS |
; |
WGEGSU: LDA INMODE |
ASL |
BMI WGEG2 ;BRNCH IF DRV2 ADDRSD |
; |
ASL |
ASL |
LDA #^H0EF |
LDX #^H0CF |
LDY #^H0DF |
BCS WGEG1 |
LDA #^H0BF |
LDX #^H03F |
LDY #^H07F |
BCC WGEG1 |
; |
WGEG2: ASL |
ASL ;LOAD CRY WITH "SIDE" BIT |
LDA #^H0FE |
LDX #^H0FC ;PORTB2 VALUES (IN X, Y) |
LDY #^H0FD |
BCS WGEG1 ;BRNCH IF SIDE2 ADRSD |
LDA #^H0FB |
LDX #^H0F3 |
LDY #^H0F7 |
; |
WGEG1: STX EGON |
STY WGOFF ;SAV TMP EG AND WG CODES |
; |
; |
STA PORTB2 |
LDA #^H0D3 |
STA SSDA0 ;RST REC AND XMIT NABL |
;XMIT FIFO WRITE |
LDA #^H092 ;PRELOAD XMIT FIFO |
LDY #^H054 ;CLK/DTA PATRN |
STA SSDA1 ;FOR 1 BYTE OF |
STY SSDA1 ;"4E" |
LDX #^H093 ;HOLD REC, |
STX SSDA0 ;NABL XMIT,NABL XMIT FIFO WRITE |
RTS |
; |
; ***************************** |
; FORMAT/WRITE SETUP PART 2 |
; ***************************** |
; |
; XMITSTHE SECOND HALF OF |
; THE GAP AND ALL OF THE ID FOR |
; THE DATA FIELD IN BOTH THE WRITE |
; AND FORMAT ROUTS |
; |
; |
FWSL1: LDA #^H0AA |
TAY |
LDX #^H00C |
JSR FSL ;XMIT 12 BYTES "00" |
LDA #^H044 |
LDY #^H089 |
LDX #^H003 |
JSR FSL ;XMIT 3 BYTES MODIFIED "A1" |
LDA #^H055 |
LDY #^H045 |
INX |
JSR FSL ;XMIT 1 BYTE "FB" THIS IS DAM |
RTS |
; |
; ******************** |
; DATA FIELD INPUT |
; ******************** |
; |
; INPUTS FROM COLLEEN TO |
; DATA BUFRS. COMPLIMENTS DATA. GEN- |
; -ERATES CS.INPUTS COLLEEN'S CS |
; THRU COMMANDS CHECKSUM ROUT AND |
; COMPARES IT TO IT'S OWN CS. SETS |
; Z FLG IF THEY MATCH. |
; ALSO, TESTS SCRATCH LOC |
; INMODE TO DETERMIN WHAT SPEED TO |
; INPUT AT (19.2K OR 38.4K) |
; |
INPUT: JSR SCTTST ;TST IF PRSNT CMND SCTR NUMBR |
;1,2,OR 3 |
STX CSSCRT ;CLR FOR FIRST CS ADD |
BCC IN0 ;BRNCH IF TST RESLT NOT 1,2OR3 |
LDX #128 ;SET TO BRING IN ONLY 128 BYTS |
IN0: LDA #255 |
STA TIMR22 ;SET TIMR FOR 125MS |
LDY #7 |
STY INSCRT ;SET POINTR FOR CS IN |
INC INMODE ;SET BIT 0 IN INMODE FOR INPUT |
CLC |
BIT INMODE |
BMI IN00 ;BRNCH FOR 19.2K RATE |
JMP XTND8 ;GO TO XTRA ROM FOR 38K |
IN00: PHP |
;ADD |
IN01: LDA TIMR2R |
BMI IN9 ;BRNCH IF TIMD OUT--DTA FLD ERR |
IN1: LDA PORTB1 |
BPL IN01 ;BRNCH IF NO STRT BIT |
LDY #12 |
INDLA1: DEY |
BNE INDLA1 ;INDLA1=54 MACHIN CYCLS |
LDY #128-8 ;SET BIT COUNTR |
INDLA2: TYA ;SAV BIT COUNTR TEMP |
LDY #15 |
INDLA3: DEY |
BNE INDLA3 ;DELAY 74 MACH CYC AT 19K, 14 |
;CYC AT 38K FOR BIT CNTRS AND |
;49 CYC AT 38K FOR STRT BIT DLA |
TAY ;RETREIV BIT CNTR |
LDA PORTB1 ;RETREIVE 1 BIT |
ROL ;SHIFT TO CRY |
ROR ZPRL(X) ;ASSEMBL TO PRSNT WORD |
INY |
BPL IN4 ;BRNCH UNTIL 8 BITS ASSEMBLED |
LDA ZPRL(X) |
EOR #255 |
STA ZPRL(X) ;COMPLIMENT LAST BYTE ASSMBLD |
PLP ;RETREIVE LAST CS ADD CRY |
JSR DFCKSM ;GO ADD LAST WORD IN TO CS |
PHP ;SAVE CRY FROM LAST CS ADD |
INX |
BNE IN5 ;BRNCH IF BUFRS NOT FULL |
LDX #4 |
IN6: DEX |
BNE IN6 ;SET DELA OF 21 MACH CYC |
LDX #6 |
JSR CHKIN ;GET CS FROM COLEN |
STA DICKSM ;SAV RECVD CS TEMP |
JSR SCTTST ;TST IF SCTR 1,2,OR 3 |
BCC IN8 ;BRNCH IF NOT SCTR 1,2,OR 3 |
IN7: LDA ZP80(X) |
STA ZPRL(X) ;MOVE TOP HALF OF BUFRS TO |
INX ;LOWR HALF |
BPL IN7 |
IN8: LDA CSSCRT ;GET COMPUTED CS |
PLP ;RETREIVE LAST CS ADD CRY |
ADC #0 ; ADD LAST CRY TO CS |
DEC INMODE ;REST INMODE "INPUT BIT" FOR |
;EXIT FROM INPUT ROUT |
CMP DICKSM ;COMPARE TWO CS'S |
;T FROM INPUT ROUT |
; |
; |
; DELAY OF 225 USECS ADDED BY DAVE: |
; |
PHP ;SAVE Z FLAG FROM COMPARE |
LDY #90 ;LOAD TIMER |
INDLY: DEY |
BNE INDLY ;LOOP TIL TIME OUT |
PLP ;RESTORE Z FLAG |
; |
BEQ IN10 ;IF GOOD CHECKSUM, RETURN Z SET |
LDA #NAK ;ELSE, GET NAK BYTE |
JSR SAA2 ;SEND BACK TO COLLEEN |
JMP WR5 ;UPDATE FLGS & GOTO INIT2 |
IN10: RTS |
; |
; |
; |
IN4: LDA INMODE |
BMI INDLA2 |
IN5: LDY #6 |
STY TIMR22 ;SET TIMR FOR 2.5MS DELA |
INDLA4: DEY |
BNE INDLA4 ;INDLA4=29 MACH CYC |
BEQ IN1 ;ALWAYS BRNCH |
IN9: DEC INMODE |
PLP |
LDA #255 |
RTS |
; |
; **************************** |
; SECTOR BREAKDOWN ROUTINE |
; **************************** |
; |
; BREAKS THE TWO BYTE |
; SECTOR NUMBER RECEIVED OVR THE |
; BUS DOWN TO A TRK AND SCTOR NUMBR |
; |
; |
SCTBD: LDA AUX2 |
STA SSCTMS |
LDA AUX1 |
STA SSCTLS |
LDX #^H004 |
SCTBD1: ROR AUX2 |
ROR |
DEX |
BNE SCTBD1 |
ROR AUX2 |
LDX #^H004 |
SCTBD2: LSR AUX2 |
DEX |
BNE SCTBD2 |
SCTBD3: ASL |
CMP AUX2 |
BCS SCTBD4 |
STA AUX1 |
LSR |
STA TRKNBR |
SEC |
LDA AUX2 |
SBC AUX1 |
STA SCTNBR |
RTS |
SCTBD4: LSR |
TAX |
DEX |
LDA #^H010 |
CLC |
ADC AUX2 |
STA AUX2 |
TXA |
JMP SCTBD3 |
; |
; |
; ************************** |
; COMPUTE STEP/DIRECTION |
; ************************** |
; |
; COMPUTE # OF STEPS AND DIRECTION |
; TO DESIRED TRK |
; |
CSTEP: LDX #^H080 ;ASSUME POS RESLT "STP IN" |
LDY #0 ;ASSUME NO STEP NEEDED |
SEC |
BIT INMODE |
BVS CST10 |
SBC PRTRK2 |
JMP CST3 |
CST10: SBC PRSTRK ;SUB PRSNT TRK FROM DESIRED TRK |
CST3: BEQ CST2 ;RESULT=00 MEANS NO STP,BRNCH |
BPL CST1 ;IF RESULT POS ,BRNCH |
LDX #0 ;SET X TO INDICATE "STP OUT" |
EOR #^H0FF ;2'S COMP RESLT |
CLC |
ADC #1 |
CST1: TAY ;Y= NUMBR OF STPS TO EXECUTE |
CST2: RTS |
; |
; |
; ************* |
; STEP TEST |
; ************* |
; |
; TESTS FOR FURTHER STEPS |
; TO EXECUTE,STEPz,WAITS 5 OR 10 MS |
; |
STPTST: BEQ STST2 ;EXIT IF NO STPS TO DO |
GOSTP: JSR STEP |
BEQ STST1 |
WAIT5: LDA TIMR1R ;WAIT 5 MS BFOR NXT STP |
BPL WAIT5 |
JMP GOSTP |
STST1: LDA #20 |
STA TIMR2 ;SET FOR 10 MS DELAY |
WAIT10: LDA TIMR1R ;WAIT 10 MS FOR HEAD SETL |
BPL WAIT10 |
STX STPDIR |
STST2: RTS |
; |
; ************************* |
; SEND ACKNOWLEGE/ACCUM |
; ************************* |
; |
; XMITS AN ACKNOWLEDGE OR THE |
; CONTENTS OF THE ACCUMULATR TO COLLE |
; |
SAA: BIT PORTB1 |
BVS SAA ;WAIT TIL COMND FRAME GONE |
SAA1: LDA #ACK |
SAA2: STA TMPOUT ;SET TO XMIT CONTNTS OF ACUM |
JSR SETOP |
JSR OUTPUT |
JSR RSTOUT ;RESET OUTPUT PORT |
RTS |
; |
; |
; ******************* |
; SET OUTPUT PORT |
; ******************* |
; |
; NABLS OUTPUT PORT AND PUTS |
; A "1" ON IT (STOP BIT) |
; |
SETOP: LDX PORTB1 |
STX PORTB1 ;INSURE A "1" ON PORT |
LDX PBDDR1 |
INX |
STX PBDDR1 ;NABL OUTPUT PORT |
RTS |
; |
; *************** |
; DATA TABLES |
; *************** |
; |
;ID FIELD TABLE |
; |
IDFLD: .BYTE ^H0A1,^H0A1,^H0A1,^H0FE,^H0FF,^H000 |
.BYTE ^H0FF,^H001,^H0FF,^H0FF,^H04E |
;---------------------------------------------------- |
; SCTRS---TABL USED BY FORMAT ROUT |
; FOR SECTOR STAGR |
; |
SCTRS: .BYTE 10,9,18,8,17,7,16,6,15 |
.BYTE 5,14,4,13,3,12,2,11 |
;---------------------------------------------------- |
; CLK/DATA LOOK-UP TABLE |
; |
; |
CDLT: .BYTE ^H0AA,^H0A9,^H0A4,^H0A5,^H092,^H091,^H094,^H095,^H04A,^H049,^H044 |
.BYTE ^H045,^H052,^H051,^H054,^H055 |
.BYTE ^H02A,^H029,^H024,^H025,^H012,^H011,^H014,^H015,^H04A,^H049,^H044 |
.BYTE ^H045,^H052,^H051,^H054,^H055 |
;---------------------------------------------------- |
; |
; EXTENDED STATUS BYTES: |
; |
XSTAT: .BYTE ^H004,^H0D0,^H002,^H000,^H001 |
.BYTE ^H007,^H00C,^H000,^H000,^H000 |
.BYTE ^H0AA,^H055 |
; |
ENDCOD = . |
AVAIL = VEC-ENDCOD ;# OF FREE BYTES IN THIS ROM |
; |
; ******************** |
; POWER-UP VECTORS |
; ******************** |
; |
.= ^H017FC |
; |
VEC: .WORD INIT,INIT |
; |
; |
.END |