;************************************* ; ; ATARI 1050 DISK DRIVE INTERFACE ; ; COPYRIGHT 1985 (C) BY EMC ; ; 2793/2797 VERSION ; REVISION 1.10 ; REVISION 2.02 ; REVISION 2.20 ; REVISION 2.30 ; REVISION 2.31 ; REVISION 2.40 ; REVISION 3.00 FIXED TRACK 0 CAL PROB ; REVISION 3.10 MADE UNBUFFERD DEFAULT ; LAST UPDATED FEB 21, 1987 ; ;************************************** ; ; ;SYSTEM CONSTANTS ; ; DRA = $0280 ;6532 DATA REGISTER DDRA = $0281 ;DATA DIREC. REG A DRB = $0282 ;DATA REGISTER B DDRB = $0283 ;DATA DIREC REG B RTDE = $0284 ;READ TIMER DISABLE IRQ WT24E = $029F ;WRITE TIMER ENABLE INT. WT64D = $0296 ;WRITE TIMER DISABLE INT. ;************************************** ; ; BIT ASSIGNMENTS ;PORT A: ; D0:SELECT SWITCH ; D1:SELECT SWITCH ; D2:NOT USED ; D3:N MOTOR CONTROL ; D4:WRITE PRE COMPENSATE ; D5:FDC DOUBLE DENSITY ; D6:6532 IRQ ; D7:FDC DATA REQUEST ; ;PORT B: ; D0:DATA OUT ; D1:VCC READY ; D2:NS04 ; D3:NS03 ; D4:NS02 ; D5:NS01 ; D6:DATA IN ; D7:CMD ; ;************************************** STREG = $0400 ;FDC STATUS REGISTER CMDREG = $0400 ;FDC COMMAND REGISTER TRKREG = $0401 ;FDC TRACK REGISTER SECREG = $0402 ;FDC SECTOR REGISTER DTAREG = $0403 ;FDC DATA REGISTER ;PAGE ZERO VALUES ZERO = $00 ;START OF PAGE ZERO ; ;GLOBAL VARIABLES ;THESE SHOULD BE SET BY ONE ROUTINE ;BUT CAN BE READ BY ALL ORG 0 ; CSELXX DS 2 ;COMMAND CONTINUATION ;VECTOR ;INITIALIZED TO POINT ;TO CMDNAK. USRE RESETS ;TO POINT TO OWN ;COMMAND DECODE ;ROUTINE ; ;VARIABLES USED BY GET ; GCNT DS 1 ;GET COUNT FLAG DS 1 ;USED BY GET ; ;VARIABLES USE BY CSUM ; CHKSUM DS 1 ;CHECKSUM 1 BYTE ; ;VARIALBES USED BY RCMDFRM ; ;************************************ ; ; CMDFRM:DEVICE SELECT CODE ; +1:COMMAND BYTE ; +2:DAUX1 FROM SIO ; +3:DAUX2 FROM SIO ; +4:CHECKSUM FROM SIO ; ;************************************ ; CMDFRM DS 4 ;COMMAND FRAM BUFFER ; TRACK DS 1 ;CURRERT TRACK NTRK DS 1 ;NEW TRACK TO READ NSEC DS 1 ;NEW SECTOR TO READ STRADR DS 2 ;POINTER TO START LOADING ;PROGRAM DATA INTO RAM TC DS 1 ;TIMER COUNT FOR 5 SEC MFLAG DS 1 ;MOTOR ON FLAG TINB DS 1 ;TRACK IN BUFFER ; STAT DS 4 ; ; ;************************************ ; ; STATUS BYTES: ; STAT: ; STAT+1: ; STAT+2: ; STAT+3: ; ;************************************ ; ; TEMP DS 1 ;TEMP BYTE LOCATION BPNT DS 2 ;SECTOR BUFFER POINTER LENTH DS 1 ;DATA PARAMETER FOR SEND ; CONFIG DS 12 ;12 BYTES FOR DATA CONTROL DRCLSD DS 1 ;FF WHEN CLOSED SECT DS 1 TRCK DS 1 BASE DS 2 BPNT1 DS 2 ;2 BYTES TRKCH DS 26 ;18 BYTE SECTOR OK ARRAY ; ;GLOBAL ;VARIABLES USED BY ACTION RUNTIME ;LIBRARY FUNCTIONS ; SIGN DS 1 ;ONE BYTE FOR SIGN INFO ATMP DS 2 ;TEMP LOCATION FOR MATH TNPNT DS 52 ;EXTRA SPACE FOR TRACK NUM ;POINTERS TL DS 1 ;TIME LIMIT FOR MOTOR HANG ON TFLAG DS 1 ;TRACK BUFFER ENABLE FLAG BCNT DS 1 ;BUFFER COUNT FOR SPECIAL ;COPY ROUTINES CFMTBF DS 2 ;BUFFER FOR CUSTOM FORMAT ; ORG $88 ; GET DS 3 ;PROGRAMABLE JUMP VECTOR ;FOR THE GET ROUTINE PUT DS 3 ;PROGRAMABLE JUMP VECTOR ;FOR THE PUT ROUTINE CMDRT DS 1 ;COMMAND RETRY COUNT SSTAT DS 1 ;BUAD RATE STAT 0=USPEED CSERCT DS 1 ;CHECK SUM ERROR COUNT TADRES DS 6 ;SIX BYTES TRACK ADDRESS FDCFLG DS 1 ;INDCATES FDC TYPE FOUND RSECCM DS 1 ;READ SECTOR COMMAND WSECCM DS 1 ;WRITE SECTOR COMMAND WSDMCM DS 1 ;WRITE SECTOR DEL DATA DCKFLG DS 1 ;DENSITY CHECK INHIBIT SRATE DS 1 ;STEP RATE STPPOS DS 1 ;STEPPER POSSITION ; ORG $B0 ; SKTAB DS 26 ;SKEW TABLE FOR RDTK ; ; BUFF = $2000 ;256 BYTE BUFFER I/O ; ; ORG $4000 ;ADDRESS TO LOAD INTO RAM ;WHEN USING DEBUG, ETC. LOC $E000 ;RUN LOCATION FOR CODE ;THIS ALLOWS US TO ROM CODE ; ;************************************** ; ;JUMP VECTOR TABLE ; THIS IS WHERE USER PROGRAMS CALL TO ; ACCESS THE VARIOUS UTILITIES IN THIS ; PROGRAM ; THESE WILL BE THE ONLY DOCUMENTED ; ENTRY POINTS INTO THE SYSTEM ; ;************************************** ; VECTAB JMP START ;COLDSTART NAKV JMP NAK ;SEND NOT ACKKNOLEDGE ERRV JMP ERR ;SEND ERROR CODE BACK ACKV JMP ACK ;SEND ACK BACK CMPLV JMP CMPLT ;SEND COMPLETE BACK DELV JMP DELAY ;DO 250 USEC DELAY GETV JMP GET ;GET DATA FROM SERIAL BUS PUTV JMP PUT ;PUT BYTE TO ATARI CSUMV JMP CSUM ;COMPUT CHECKSUM READV JMP READ ;GET DATA FROM ATARI ;ALSO CHECKS THE CHECK SUM SENDV JMP SEND ;SEND BUFFER BACK TO ;ATARI WITH A CHECKSUM FINTV JMP FINT ;FDC FORCE INTERRUPT MULTV JMP MULT ;PERFORM 8 BY 8 MULTIPLY TRK0V JMP TRK0 ;RECAL HEAD POSITION WT5MSV JMP SWAIT ;5 MSEC DELAY SKTKV JMP SKTK ;SEEK TRACK NTSV JMP NTS ;CALCULATE NEW TRACK FROM ;DATA IN COMMAND FRAME RSECV JMP RSEC ;READ SECTOR ON CURRENT ;TRACK VSECV JMP VSEC ;VERIFY SECTOR ON ;CURRENT TRACK WSECV JMP WSEC ;WRITE SECTOR TO CURRENT ;TRACK RDTKV JMP RDTK ;READ ALL SECTORS ON ;CURRENT TRACK AND ;PUT THEM IN TRACK ;BUFFER SBPNTV JMP SBPNT ;SET SECTOR BUFFER ;POINTER RDSCV JMP RDSC ;SEND DATA IN TRACK ;TRACK BUFFER THAT ;CORRESPONDS TO ;SECTOR NUMBER MOONV JMP MOON ;TURN MOTOR ON MOOFFV JMP MOOFF ;TURN MOTOR OFF ; VCMDXT JMP CMDXIT VCMDNK JMP CMDNAK VCMDER JMP CMDERR ; ; ;ACTION RUNTIME VECTORS ; LSHV JMP LSH ;LEFT SHIFT RSHV JMP RSH ;RIGHT SHIFT MLTV JMP MLTI ;MULTIPLY DIVV JMP DIVI ;DIVIDE SARGV JMP SARGS ;PASS ARGUMENTS LOWV JMP LOWB ;RETURN LOW BYTE HIV JMP HIB ;RETURN HIGH BYTE ; ;MORE ENTRYS ; CSSKV JMP CSSK REVTV JMP REVT CKBFV JMP CKBF DLNTRV JMP DLNTRY RTATV JMP RTAT ;ROTOTE SECTOR MAP BUFF CMPV JMP CMP CRCV JMP CRC ;CALLS ABOVE WCEV SRTV JMP SRT ;SPECIAL READ TRACK ZABV JMP ZAB ;ZERO A BUFFER SWSV JMP SWS ;WRITE A DELETED DATA MARK SRDAV JMP SRDA ;SPECIAL READ ADDRESS BBV JMP BB ;BUILD A BLOCK OF DATA DFLTSV JMP DFLTS ;SET SKEW DEFAULTS RADRV JMP RADR ;READ ADDRESS ; ; ;************************************* ; ; RUNTIME LIBRARY FUNCTION FOR ACTION! ; ; RSH ; LSH ; MULT ; DIV ; MOD ; SARGS ; ;************************************* ; LSH PROC ; ;THIS ROUTINE WILL SHIFT A NUMBER LEFT ; :SHIFT = $84 ;NUMBER OF BYTES TO SHIFT :MSB = $85 ;MOST SIG BYTE TO SHIFT ; LDY :SHIFT ;ARE WE SHIFTING BY ZERO BEQ :LSHXT ;YES, JUST EXIT STX :MSB ;STORE MOST SIGNIFICANT BYTE :LOOP ASL A ;SHIFT LSB ROL :MSB ;SHIFT MSB DEY ;DECREMENT SHIFT BNE :LOOP ;KEEP ON GOING LDX :MSB ;RETURN MSB IN XREG :LSHXT RTS EPROC ; ; RSH PROC ;RIGHT SHIFT FUNCTION ; :SHIFT = $84 ;AMOUNT TO SHIFT BY :MSB = $85 ;MOST SIG BYTE ; LDY :SHIFT ;IS SHIFT = 0? BEQ :RSHXT ;YES EXIT STX :MSB :LOOP LSR :MSB ;SHIFT MOST SIG BYTE ROR A ;SHIFT LSB DEY ;DECREMENT SHIFT BNE :LOOP LDX :MSB ;RETURN MSB IN X REG :RSHXT RTS ; SSNG PROC ;SET SIGN ; :OP3 = $86 ; LDY SIGN BPL :SS08 SS1 STA :OP3 STX :OP3+1 SEC LDA #$00 SBC :OP3 TAY LDA #$00 SBC :OP3+1 TAX TYA :SS08 RTS EPROC SMOPS PROC ; :OP1 = $82 :OP2 = $84 :OP3 = $86 ; STX SIGN CPX #$00 BPL :SM11 JSR SS1 :SM11 STA :OP1 STX :OP1+1 LDA :OP2+1 BPL :SM15 TAX EOR SIGN STA SIGN LDA :OP2 JSR SS1 ;SET SIGN STA :OP2 STX :OP2+1 :SM15 LDA #$00 STA :OP3+1 RTS EPROC ; MLTB PROC ; :OP1 = $82 :OP2 = $84 :OP3 = $86 ; BEQ :MB16 DEX STX ATMP+1 TAX BEQ :MB16 STX ATMP LDA #$00 LDX #$08 :MB20 ASL A ASL ATMP BCC :MB19 ADC ATMP+1 :MB19 DEX BNE :MB20 CLC ADC :OP3+1 STA :OP3+1 :MB16 LDA :OP3 LDX :OP3+1 RTS EPROC ; MLTI PROC ; :OP1 = $82 :OP2 = $84 :OP3 = $86 ; JSR SMOPS LDX :OP1 BEQ :MI22 STX ATMP LDX :OP2 BEQ :MI22 DEX STX ATMP+1 LDX #$08 :MI24 ASL A ROL :OP3+1 ASL ATMP BCC :MI23 ADC ATMP+1 BCC :MI23 INC :OP3+1 :MI23 DEX BNE :MI24 :MI22 STA :OP3 LDA :OP1 LDX :OP2+1 JSR MLTB LDA :OP1+1 LDX :OP2 JSR MLTB JMP SSNG EPROC ; ;DIVIDE TWO NUMBERS ; DIVI PROC ; :OP1 = $82 :OP2 = $84 :OP3 = $86 ; JSR SMOPS LDA :OP2+1 BEQ :DI27 LDX #$08 :DI29 ROL :OP1 ROL :OP1+1 ROL :OP3+1 SEC LDA :OP1+1 SBC :OP2 TAY LDA :OP3+1 SBC :OP2+1 BCC :DI28 STA :OP3+1 STY :OP1+1 :DI28 DEX BNE :DI29 LDA :OP1 ROL A LDX #$00 LDY :OP1+1 STY :OP3 JMP SSNG :DI27 LDX #$10 :DI32 ROL :OP1 ROL :OP1+1 ROL A BCS :DI30 CMP :OP2 BCC :DI31 :DI30 SBC :OP2 SEC :DI31 DEX BNE :DI32 ROL :OP1 ROL :OP1+1 STA :OP3 LDA :OP1 LDX :OP1+1 JMP SSNG EPROC ; ; DO MOD FUNCTION ; MODI PROC ; :RMDR = $86 ;REMAINDER JSR DIVI ;DO DIVISION LDA :RMDR ;RETURN LO BYTE IN ACC LDX :RMDR+1 ;RETURN HI BYTE IN X REG RTS EPROC ; ; PASS PARAMETERS BETWEEN FUNCTIONS ; SARGS PROC ; :PRAMS = $A0 ;SIXTEEN BYTES :TEMP = $84 ;TWO BYTES :PPNT = $82 ; STA :PRAMS ;STORE PARAMS STORED IN STX :PRAMS+1 ;A,X,Y REGISTERS STY :PRAMS+2 CLC ;PREPARE TO ADD PLA ;POP RETURN ADDRESS FROM STACK STA :TEMP ;STORE IN TEMP LOCATION ADC #$03 ;CALCULATE NEW RETURN ADDRESS TAY ;TO BRANCH AROUND POINTER TO PLA ;PASSED PARAMETERS STA :TEMP+1 ;$0085 ADC #$00 PHA ;PUSH NEW RETRUN ADDRESS ON STACK TYA PHA LDY #$01 ;POINT TO PARAMETERS AREA LDA (:TEMP),Y ;LOW BYTE OF POINTER STA :PPNT INY LDA (:TEMP),Y ;HIGH BYTE OF POINTER STA :PPNT+1 INY LDA (:TEMP),Y ;NUMBER OF PARAMETERS TAY :LOOP LDA :PRAMS,Y ;TRANSFER FROM STA (:PPNT),Y ;TEMPORARY TO LOCAL DEY ;PARAMETER AREA BPL :LOOP RTS EPROC ; ;************************************** ; THESE ARE OTHER USEFUL ACTION! ; FUNCTIONS ; ;************************************** ; ;RETRUN LSB OF A CARD ; HIB PROC ; :RES = $A0 ; STX :RES RTS EPROC ; ;RETURN HIGH BYTE OF A CARD ; LOWB PROC ; :RES = $A0 ; STA :RES RTS EPROC ; ; LINK D2:DD15M1.ASM