File RX01RT.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/2 FLOPPY DISK HANDLER FOR RTS-8
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1975 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/

/1 RTS-8 RX01 HANDLER TASK=RX8A /MAY BE EDITED TO 'RX8B', 'RX8C', OR 'RX8D' . INIWT=0 CUR=10 LOC=3200 /LOAD ADDRESS IFNDEF RXDVCD <RXDVCD=750> /DEVICE CODE OF FLOPPY CONTROLLER / SR / MESSAGE FORMAT: /RXMESG,ZBLOCK 3 / CODE+DEL+MODE+UNIT / RW+PAGES+FIELD / BUFADD / BLOKNO / STATUS /MODE= 0 TRANSFER IN 12-BIT MODE / 100 TRANSFER IN 8-BIT MODE /CODE= 0 IGNORE DEL AND USE PAGES & BLOKNO IN OS/8 SENSE / 4000 SPECIAL PHYSICAL SECTOR ACTION. IGNORE PAGES AND / ASSUME BLOKNO HAS FORM TTTTTTTSSSSS / SPECIFYING ABSOLUTE PHYSICAL TRACK AND SECTOR NUMBER /DEL= 0 DON'T CONSIDER DELETED DATA MARKS / 2000 HANDLE DELE/GENERAL INFORMATION: /THERE ARE 128 BYTES PER SECTOR, /26 SECTORS PER TRACK NUMBER 1-26 DECIMAL (1-32 OCTAL) /77 TRACKS PER FLOPPY NUMBERED 0-76 DECIMAL (0-114 OCTAL) /IN 12-BIT MODE, THERE ARE 64 WORDS PER SECTOR (4 SECTORS PER OS/8 BLOCK) /IN 8-BIT MODE, THERE ARE 128 BYTES PER SECTOR (2 SECTORS PER OS/8 BLOCK) /STANDARD RTS-8, OS/8 INTERLEAVE SCHEME ON FLOPPY IS AS FOLLOWS: / OS/8 LOGICAL PHYSICAL PHYSICAL / BLK REC # TRACK # SECTORS /0 0-3 1 1,3,5,7 /1 4-7 1 9,11,13,15 /2 8-11 1 17,19,21,23 /3 12-15 1 25,2,4,6 /4 16-19 1 8,10,12,14 /5 20-23 1 16,18,20,22 /6 24-27 1/2 24,26/1,3 /7 28-31 2 5,7,9,11 /8 32-35 2 13,15,17,19 /9 36-39 2 21,23,25,2 /10 40-43 2 4,6,8,10 /11 44-47 2 12,14,16,18 /12 48-51 2 20,22,24,26 /13 52-55 3 1,3,5,7 /... ... /ALGORITHM TO CONVERT OS/8 BLOCK NUMBER TO PHYSICAL TRACK AND SECTOR #S: /1. MULTIPLY OS/8 BLOCK NUMBER, B, BY 4 TO GET INITIAL LOGICAL / RECORD NUMBER. (NEXT 3 LOGICAL RECORD NUMBERS ARE SEQUENTIAL.) /2. DIVIDE LOGICAL RECORD NUMBER BY 13 TO GET QUOTIENT Q / AND REMAINDER R. /3. DIVIDE QUOTIENT Q BY 2 TO GET NEW QUOTIENT T AND NEW REMAINDER S. /4. PHYSICAL TRACK NUMBER IS 1+T . /5. PHYSICAL SECTOR NUMBER IS 1+2*R+S .
/FORMAT OF RX8E COMMAND REGISTER: /BITS 0-3 UNUSED /BIT 4 MAINTENANCE /BIT 5 MODE BIT (1 MEANS 8-BIT MODE, 0 MEANS 12-BIT MODE) /BIT 6 UNUSED /BIT 7 DRIVE /BITS 8-10 FUNCTION / 000 FILL BUFFER / 001 EMPTY BUFFER / 010 WRITE SECTOR / 011 READ SECTOR / 100 UNUSED / 101 READ STATUS / 110 WRITE DELETED DATA SECTOR / 111 MAINTENANCE /BIT 11 UNUSED /FORMAT OF RX8E STATUS WORD: /BITS 0-3 UNUSED /BIT 4 SELECTED DRIVE READY /BIT 5 DELETED DATA INDICATION /BITS 6-7 UNUSED /BIT 8 UNUSED BUT RESERVED FOR FUTURE USE /BIT 9 INIT DONE /BIT 10 PARITY ERROR /BIT 11 CRC ERROR /A FLOPPY CONTAINS 3722(8)=2002(10) SECTORS. /SINCE 26(10)=32(8) ARE NOT USED BY OS/8, /THE HIGHEST LOGICAL RECORD # IS 1975(10)=3667(8). /THUS THE LARGEST OS/8 BLOCK NUMBER IS 493(10)=755(8). /IN OTHER WORDS, A FLOPPY CONTAINS 494(10) OS/8 BLOCKS OF DATA.
LCD= 6001+RXDVCD /LOAD COMMAND REGISTER XDR= 6002+RXDVCD /TRANSFER DATA REGISTER STR= 6003+RXDVCD /SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG SER= 6004+RXDVCD /SKIP ON ERROR FLAG, CLEAR FLAG SDN= 6005+RXDVCD /SKIP ON DONE FLAG, CLEAR FLAG INTR= 6006+RXDVCD /INTERRUPT ENABLE/DISABLE INIT= 6007+RXDVCD /INITIALIZE CONTROLLER AND RECALIBRATE DRIVES FIELD CUR%10 *LOC BUFFER, /BUFFER ADDRESS START, CAL /INSERT INTERRUPT SKIP IN SKIP CHAIN DFLAG, SKPINS / <0 WAITING, =0 FINISHED, >0 PENDING /FLOPPY IS INITIALLY BUSY CMD, INTRPT REC, CLA IAC WC, INTR /ENABLE INTERRUPTS STATUS, CLA LOOP, CAL RECEIV /GET A MESSAGE MADDR, 0 /ADDRESS OF MESSAGE LEFT HERE DCA MSGFLD /CDF TO FIELD OF MESSAGE LEFT IN AC STA TAD MADDR DCA MADDR /RESET MADDR TO POINT BACK TO PARAM BLOCK -1 JMS GET /GET UNIT AND SPECIAL FUNCTIONS BIT DCA FNCTN JMS GET /GET FUNCTION WORD DCA FN JMS GET /GET BUFFER ADDRESS DCA BUFFER JMS GET /GET BLOCK NUMBER DCA BLOCK CDF CUR TAD BLOCK CLL RTL DCA REC /FIRST LOGICAL RECORD IS 4* OS/8 RECORD TAD FN AND (70 /ISOLATE FIELD OF BUFFER TAD (CDF DCA BUFCDF /STORE AWAY IN-LINE TAD FN RAL /MOVE # OF PAGES INTO AC 0-4 AND L7600 /TURN PAGE COUNT INTO WORD COUNT CIA DCA WC /STORE NEGATIVE OF WORD COUNT TAD FNCTN AND (100 TAD (100-1 DCA MSK TAD FNCTN SMA CLA /LOOK AT CODE BIT JMP NOSPEC /NOTHING SPECIAL TAD MSK CMA DCA WC /STORE REVISED NEGATIVE OF WORD COUNT TAD BLOCK AND L37 DCA I (SECTOR TAD BLOCK RTR RTR RAR AND (177 DCA I (TRACK NOSPEC, TAD FN /GET RW BIT SPA CLA /IF IT'S A READ, WE MUST PRE-READ JMP STWRIT /OTHERWISE, START FILLING RX01 BUFFER WORDLP, TAD WC /GET WORD COUNT AND MSK /CHECK FOR MULTIPLE OF 64 (OR 128) WORDS SZA CLA /AT SUCH A BOUNDARY, WE WANT TO DO I/O JMP BUFCDF /OTHERWISE, JUST TRANSFER BETWEEN BUFFERS JMS I (DISKIO /READ OR WRITE A BUFFER ISZ REC /BUMP RECORD NUMBER TAD I (STATE DCA STATUS STWRIT, TAD FN RAL /RW BIT TO LINK CLA CML RTL /AC=2 IF READ, 0 IF WRITE JMS LDCMD /AC=0 --> FILL SECTOR BUFFER /AC=2 --> EMPTY SECTOR BUFFER BUFCDF, HLT /FIRST TIME THROUGH, DO CDF TO FIELD OF BUFFER TRANWD, TAD I BUFFER /GET CONTENTS OF BUFFER IN CASE WRITING JMS I (TRANS /TRANSFER A WORD BETWEEN CORE AND RX01 BUFFER DCA I BUFFER /STORE CONTENTS OF BUFFER IN CASE READING CDF CUR ISZ BUFFER /BUMP BUFFER POINTER L37, 37 /IN CASE IT SKIPS ISZ WC /BUMP WORD COUNT JMP WORDLP /REITERATE TAD FN /LOOK AT RW BIT AGAIN SPA CLA JMS I (DISKIO /IF WRITING, DUMP LAST RECORD. TAD FNCTN CMA RAL SZL SPA CLA /RETURN STATUS IF CODE=1 AND DEL=1 RETRN, DCA STATUS /OTHERWISE ZERO STATUS JMS GET L7600, 7600 /CLA TAD STATUS DCA I MADDR TAD MSGFLD DCA EFCDF TAD MADDR TAD (-7 /POINT TO MESSAGE EVENT FLAG CAL POST /POST EVENT FLAG POINTED TO BY AC EFCDF, HLT /FIELD OF EVENT FLAG JMP LOOP /GET ANOTHER MESSAGE GET, 0 /CHANGE DF TO FIELD OF MSG; GET NEXT ENTRY MSGFLD, HLT ISZ MADDR TAD I MADDR JMP I GET FNCTN, 0 /CODE+DEL+MODE+UNIT BLOCK, 0 /BLOCK NUMBER
LDCMD, 0 /WAIT FOR DONE FLAG AND LOAD COMMAND REGISTER DCA CMD /SAVE COMMAND JMS I (DWAIT /WAIT FOR DONE FLAG MSK, 77 /77 IF 12-BIT MODE; 177 IF 8-BIT MODE /WE DON'T CARE IF PREVIOUS OPERATION HAD AN ERROR /BECAUSE WE ARE NOW INITIATING A NEW OPERATION. TAD CMD IOF LCD /LOAD NEW COMMAND REGISTER CONTENTS ISZ DFLAG ION JMP I LDCMD FN, 0 /RW+PAGES+FIELD PAGE
TRANS, 0 STR JMP .-1 XDR JMP I TRANS
INTRPT, ZBLOCK 2 /RTS OVERHEAD SDN /SKIP ON DONE AND CLEAR FLAG JMP I INTRPT /IT AINT THIS FLAG CDF CUR XDR /READ STATUS AND (377 /12-BIT MODE LEAVES GARBAGE IN AC 0-3 DCA STATE TAD (DFLAG CIF 0 POSTDS DISKIO, 0 /READ OR WRITE RECORD TAD (-10 DCA TRYCNT /RETRY 8 TIMES TRYAGN, TAD I (FNCTN AND (100 DCA MODBIT TAD I (FN RAL /RW BIT TO LINK CLA CML RTL TAD (4 DCA FNBITS TAD I (FNCTN CMA RAL SMA SNL CLA TAD I (FN SMA CLA JMP T2 TAD (14 /DOING A WRITE IN SPECIAL MODE WITH DEL SET DCA FNBITS T2, TAD I (FNCTN RAR /UNIT TO LINK CLA RTL RTL RAL /UNIT TO BIT 7 TAD FNBITS JMS I (LDCMD TAD I (FNCTN SPA CLA JMP SPECL /ALREADY HAVE SECTOR AND TRACK /ROUTINE TO DIVIDE N BY 13 GIVING QUOTIENT Q AND REMAINDER IN N. TAD I (REC DCA N TAD (200^15 DCA D DCA Q DLOOP, TAD D CLL CIA TAD N SNL SKP CLA DCA N TAD Q RAL DCA Q TAD D CLL RAR DCA D SNL /13 EVENTUALLY TRIES TO SHIFT INTO LINK JMP DLOOP / FINAL REMAINDER IS NOW IN N TAD Q CLL RAR /QUOTIENT IS NEW TRACK-1 IAC /SINCE WE'RE OFFSETTING EVERYTHING UP ONE TRACK DCA TRACK /SO THAT WE DON'T TOUCH PHYSICAL TRACK 0 TAD N /LINK IS NOW TO BE ADDED TO 2^N RAL IAC /SECTORS BEGIN COUNTING AT 1 DCA SECTOR /DONE COULD COME UP DURING FOLLOWING CODE SPECL, TAD SECTOR JMS TRANS CLA TAD TRACK JMS TRANS CLA JMS DWAIT /WAIT FOR DONE SKP /ANY ERRORS? JMP I DISKIO /NONE IOF INIT ISZ I (DFLAG CLA IAC INTR /INIT DISABLES INTERRUPTS ION ISZ TRYCNT JMP TRYAGN ERR, STL CLA RAR /JAM ON AC BIT 0 MEANING 'HARD ERROR' TAD STATE JMP I (RETRN
TRYCNT, -10 /NUMBER OF RETRIES N, 0 D, 0 Q, 0 TRACK, 0 SECTOR, 0 MODBIT, 0 FNBITS, 0 STATE, 0 DWAIT, 0 CAL WAITE DFLAG TAD (4 /BIT 9 IS THE 'INIT DONE' BIT SER /DONE COULD COME UP AFTER A POWER FAIL AND STATE /SO ERROR FLAG OR INIT STATUS IS AN ERROR SNA CLA ISZ DWAIT /SKIP RETURN IF NO ERRORS AND NO INIT DONE JMP I DWAIT $



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search