/ - OS/8 8-BIT RX01 FLOPPY SYSTEM HANDLER V2.0 / / /This is an OS/8 system handler for the RX8E floppy disk drive. It uses /the 8-bit transfer mode instead of the 12-bit transfer mode used in the /DEC supplied handler. This gives an increase of over 30% in total available /space on a diskette. This handler is a two page system handler which /should be compatiable with all DEC software, especially BRTS and FRTS /which do special things with two-page system handlers. Being a two-page /handler requires that there be at least 12K of memory in the machine. This /hanler will ** ONLY ** work on PDP-8/E's or later, since it uses the BSW /instruction. This handler does a "three sector interleave" on data storage /That is, data is stagered on the disk; an OS/8 block requires three sectors /when 8-bit mode is used. The first sector for the block is transferred. /The second sector of the block has two intervening sectors. This is done /because the data in the sector is transfer to the computer via programmed /I/O, which requires a given amount of time. After the data for the first /sector is processed and some internal bookeeping is done, the second sector /of the block should just be arriving under the heads of the floppy. If /it were missed (i.e. already gone by the heads) the computer would have /wait up 1/6th of a second for the sector to again come under the heads. /Accumulate this delay for each sector and it becomes very noticable to the /user of the OS/8 system. This handler should make the interleave for /all machines that DEC has the RX8E interfaced to, including the VT78. / / For any further details/complaints / contact: / / Mr. Richard A. Karhuse / Computer Science Research Lab. / Northwestern University / Tech. Institute - B626 / 2145 Sheridan Road / Evanston, Il. 60201 / (312) 492-5248 / / / / INSTRUCTION DEFINITION FOR "POST-MORTUM" TRACE BACK IN CASE OF SYSTEM / DEATH. / ENTRY= HLT /SUBROUTINE ENTRY POINT INSTRT= HLT /IN-LINE GENERATE INSTRUCTION / / FLOPPY IOT DEFINITIONS / LCD= 6751 /LOAD FLOPPY COMMAND REGISTER, AC==>CMD REG.; 0==>AC /FORMAT: / BIT 0-3 NOT USED / BIT 4=1 ==>MAINT. MODE...DO **NOT** USE! / BIT 5=0 ==>12-BIT TRANSFER MODE 64BYTES/SECTOR 23USEC/BYTE / =1 ==> 8-BIT TRANSFER MODE 128BYTES/SECTOR 18USEC/BYTE / BIT 6 NOT USED / BIT 8-10 FUNCTION CODE / VALUE FUNCTION / 0 FILL BUFFER / 1 EMPTY BUFFER / 2 WRITE SECTOR / 3 READ SECTOR / 4 ..NOT USED / 5 READ STATUS / 6 WRITE DELETED DATA SECTOR / 7 READ ERROR REG. / / BIT 11 NOT USED XDR= 6752 /TRANSFER DATA BETWEEN AC AND INTERFACE REG. / DIRECTION OF TRANSFER DETERMINED BY COMMAND IN EFFECT STR= 6753 /SKIP IF TRANSFER REQUEST FLAG IS SET, CLEAR FLAG SER= 6754 /SKIP IF ERROR FLAG IS SET, CLEAR FLAG SDN= 6755 /SKIP IF DONE FLAG IS SET, CLEAR FLAG INIT= 6757 /INITIALIZE CONTROLLER & INTERFACE VERSION= 2 DEVTYP= 55 /OS/8 DEVICE TYPE ERRAC= CLA CLL CMA RTL /NUMBER OF RETRIES ON AN ERROR / /REQUIRED INFORMATION FOR BUILD / *0 -3 /THREE HANDLERS CORESIDENT: SYS, FDA0 & FDA1 / /1ST---SYS / DEVICE RX8 /PERMANET DEVICE NAME DEVICE SYS /DESCRIPTOR BLOCK FOR SYS DEVTYP^10+4000 /DEVICE CONTROL BLOCK: FILE STRUCTURE+DEVICE TYPE FDA0&177+6000 /ENTRY POINT + 2-PAGE SYSTEM HANDLER 0 DECIMAL;76^26%3;OCTAL /DEVICE BLOCK LENGTH / /2ND---FDA0 / DEVICE RX8 DEVICE FDA0 /DESCRIPTOR BLOCK FOR FDA0 DEVTYP^10+4000 /DEVICE CONTROL BLOCK FDA0&177+5000 /ENTRY POINT + 2-PAGE HANDLER + CORESIDENT W/SYS 0 DECIMAL;76^26%3;OCTAL /DEVICE BLOCK LENGTH / /3RD---FDA1 / DEVICE RX8 DEVICE FDA1 /DESCRIPTOR BLOCK FOR FDA1 DEVTYP^10+4000 /DEVICE CONTROL BLOCK: (SEE ABOVE) FDA1&177+5000 /ENTRY POINT + 2-PAGE HANDLER + CORESIDENT W/SYS 0 DECIMAL;76^26%3;OCTAL /DEVICE BLOCK LENGTH BOOTBG-BOOTEND /-LENGTH OF SECONDARY BOOTSTRAP / USER TOGGLE-IN BOOTSTRAP....GOOD-LUCK IF YOU HAVE TO DO THIS BY HAND!!! / RELOC 161 NOPUNCH BTMP3, .-. /BOOTSTRAP TEMPORARIES....DO NOT NEED TO TOGGLE! BTMP2, .-. BTMP1, .-. / /*************************************************************** / ************************************************** / ********************************** / ******************** / ***** / * / / START TOGGLING HERE!!!! / BSEC, 1 /SECTOR NUMBER....START OFF WITH 1 TW, 20 /UNIT SWITCH FLOP...CHANGE BETWEEN +/-20 TO DENOTE / UNIT ATTEMPTED TO BE BOOTSTRAPPED. BUNIT, 122 /BOOTSTRAP COMMAND REG....8-BIT MODE,EMPTY BUFFER / WILL BE UNIT 0 SHORTLY S7400, 7400 /CHARACTER MASK / / START BOOTSTRAP HERE !!!! / START, SDN /WAIT FOR FLOPPY TO BE READY AFTER FRONT PANEL CLEAR JMP .-1 /...OR POWER-UP SEQUENCE/RESET S7600, BOOT, 7600 TAD TW /FLIP UNIT UNDER TEST CIA DCA TW TAD TW TAD BUNIT /ADJUST COMMAND REGISTER DCA BUNIT CLA CLL IAC RTL TAD BUNIT LCD /ISSUE READ TAD BSEC JMS BXFER / OF SECTOR #1 CLA CLL IAC JMS BXFER / OF TRACK #1.....THE FIRST BLOCK ON THE DISK SDN JMP .-1 /WAIT FOR RX01 TO FIND BLOCK & TRANSFER IT TO BUFFER SER /TEST FOR ERROR SKP CLA /NONE....BUT DO HAVE A DIRTY AC! JMP BOOT /ERROR....PROBABLY DISKETTE NOT MOUNTED TRY NEXT UNIT TAD BUNIT /WE HAVE FLOPPY MOUNT AND HAVE 1ST SECTOR LCD /ISSUE AN EMPTY BUFFER LOOP, JMS BXFER /MAJOR DISK DATA TO CORE TRANSFER LOOP DCA BTMP1 /....GET 1ST BYTE JMS BXFER DCA BTMP2 /....AND 2ND BYTE JMS BXFER DCA BTMP3 /....AND 3RD BYTE TAD BTMP3 /..START PACKING BYTES AND STORING THEM AWAY RTL /......USING STANDARD OS/8 3 TO 2 PACKING ALGORITHM RTL AND S7400 TAD BTMP1 JMS STORE /....STORE 1ST WORD TAD BTMP3 BSW RTL AND S7400 TAD BTMP2 JMS STORE /....STORE 2ND WORD JMP LOOP /DO IT AGAIN...LOOP BROKEN BY BXFER WHEN ENTIRE /SECTOR HAS BEEN TRANSFERED. BXFER, ENTRY /SUBROUTINE TO TRANSFER DATA TO/FORM RX01 CONTROLLER STR /WAIT 'TILL RX01 READY FOR NEW DATA JMP .+3 XDR /TRANSFER DATA OUT JMP I BXFER /RETURN W/DATA STILL IN AC SDN /TEST IF DONE TRANSFERING THIS SECTOR JMP BXFER+1 / NO....JUST WAIT SER /TEST IF ERROR JMPPTR, JMP I JMPTBL / ..NO...DO NEXT OPERATION FROM LIST HLT /WHOOPS....ERROR IN MIDDLE OF BOOTING!!!!!! PTR, SLOAD /INSTRUCTION STORAGE POINT..INITIALLY SET TO / SECONDARY BOOTSTRAP LOCATION STORE, ENTRY /SUBROUTINE TO STORE INSTRUCTION AWAY IN SEQUENTIAL /LOCATIONS CDF 0 /ORIGINALLY PUT DATA IN FIELD 0...WILL CHANGE TO / FIELD 1 THEN 2. DCA I PTR /SAVE INSTRUCTION ISZ PTR /INCREMENT POINTER....RELYING UPON SKIP TO GET INTO /SECONDARY BOOTSTRAP CODE!!!! JMP I STORE /CONTINUE W/TRANSFER OF INSTRUCTIONS ENPUNCH / / END OF USER TOGGLE-IN BOOTSTRAP CODE!!!! / / * / ******** / ****************** / *********************************** / ************************************************* /******************************************************************* / / / START OF SECONDARY BOOTSTRAP CODE....BROUGHT IN BY PROCEDING CODE / / BOOTBG, SLOAD, TAD S10 /GOT HERE BECAUSE "STORE" FILL THE LAST PAGE OF A / FIELD. TAD STORE+1 /INCREMENT DATA FIELD FOR INSTRUCTION STUFFING DCA STORE+1 TAD S7600 DCA PTR /RESET POINTER TO LAST PAGE OF NEXT FIELD. JMP I STORE / / OPERATION JUMP TABLE...DETERMINE WHAT TO DO NEXT AFTER READING A SECTOR / JMPTBL, B1 /CONTINUE READING OS/8 BLK #0--SKIP TO CODE THAT / BELONGS AT 07600 AND BRING IT IN B2 /COMPLETE BLK#0...CODE AT 07600 B3 /BRING 17600 CODE FROM OS/8 BLOCK #66 B2 /CONTINUE W/FIELD 1 CODE...START FIELD 2 CODE B2 /COMPLETE FIELD 2 CODE TRANSFER B4 /....START UP THE SYSTEM!!!! B1, CLA CLL CML IAC RAL TAD BSEC /INTERLEAVE TO SECTOR #4 DCA BSEC JMS BLCMD /ISSUE READ SECTOR/EMPTY BUFFER COMMANDS JMS BXFER /SKIP THE 1ST 64 BYTES...GARABAGE ISZ CNTR JMP .-2 CLA CLL TAD S7600 /START TRANSFERRING THE CODE THAT DCA PTR /BELONGS AT 07600 JMP LOOP /..VIA MAIN INSTRUCTION TRANSFER LOOP CNTR, -100 B2, CLA CLL CML IAC RAL TAD BSEC /INTERLEAVE TO SECTOR #7 DCA BSEC JMS BLCMD /ISSUE READ SECTOR/EMPTY BUFFER JMP BXFER+1 /CONTINUE READING CODE IN B3, TAD S7600 /INDEX TO OS/8 BLOCK #66 DCA BTRCK TAD S7TAD /MODIFY BLCMD TO FUDGE TRACK # DCA BTRCK+1 TAD S23 /FUDGE THE STARTING SECTOR # JMP B2+2 /...AND CONTINUE B4, TAD FLPNOP /ISSUE NOP TO FLOPPIES IN ORDER TO SET DONE FLAG LCD TAD TW /DID WE BOOT RIGHT DRIVE? CDF CIF 0 SPA CLA JMP I S7605 /....NO...LEAVE SYSTEM HANDLER ALONE..AND GO! CLA CLL IAC RTL /...YES...MODIFY SYSTEM HANDLER TO REFLECT THIS RTL TAD I SC100 DCA I SC100 JMP I S7605 /START HER UP!!! BLCMD, ENTRY /SUBROUTINE TO READ COMMAND THEN EMPTY BUFFER CLA CLL IAC RTL / TO FLOPPIES...USES BSEC FOR SECTOR # & BTRCK FOR / TRACK # TAD BUNIT /ISSUE READ LCD TAD BSEC /FOR GIVEN SECTOR STR JMP .-1 XDR BTRCK, CLA CLL IAC NOP STR JMP .-1 XDR /AND GIVEN TRACK # ISZ JMPPTR /AT END OF THIS SECTOR DO NEXT OPERATION SDN /WAIT FOR FLOPPY TO FIND AND PUT DATA INTO HOLDING BUFFER JMP .-1 SER /ERROR? SKP CLA /...NO...BUT DO HAVE A DIRTY AC! HLT /...YES....ERROR IN MIDDLE OF BOOTSTRAPPING!!!! TAD BUNIT /ISSUE AN EMPTY BUFFER LCD JMP I BLCMD FLPNOP, S10, 10 S23, 23 S7605, 7605 SC100, C100 S7, 7 S7TAD, TAD S7 BOOTEND= . / / **** END OF SECONDARY BOOTSTRAP CODE **** / RELOC *200 /FIELD 0 RX01 8-BIT SYSTEM HANDLER CODE RELOC 7600 ZBLOCK 7 /SKIP THE FIRST 7 LOCATION...FIELD 0 SYSTEM CALLS FDA0, VERSION /SYSTEM HANDLER ENTRY POINT...FDA0 CLA CLL C70, 70 3;IFNZRO .-7613 FDA, TAD C100 /SET MODE TO DRIVE # DCA XMODE /SAVE TEMPORARILY...DRIVE # + 8-BIT TRANSFER MODE TAD CFCN DCA XPTR /RESET POINTER TO FIELD 2 DATA AREA RDF /DETERMINE FIELD CALLED FROM... TAD CCDF / CREATE A CDF TO FIELD IN ORDER TO FETCH ARG'S. DCA CALCDF CLA CLL CML RAR TAD I FDA0 /FETCH 1ST ARG...PUT R/W BIT INTO LINK..LNK=1 IF WRITE AND C70 /.....GET FIELD OF DATA TO BE TRANSFERED TAD CCDF /.....CREATE CDF POINTING TO DATA FIELD DCA BUFCDF CML RTL DCA XFCN /.....USE VALUE OF LINK TO GENERATE FLOPPY R/W FUNC. ERRAC /SET ERROR COUNTER = -3 DCA ERRCTR /ZERO FLOPPY ERROR FLAG CCDF, CDF 0 TAD XFCN /BOTH FIELD OF CODE WILL USE THIS VALUE, 0==>READ OPERATION TAD XMODE JMS XCHNG /SEND FLOPPY R/W FUNC. TO FIELD 2 DATA AREA TAD I FDA0 /FETCH 1ST ARG. AGAIN ISZ FDA0 /...(LAST TIME IT WILL BE NEEDED) AND C3700 /...CREATE (# OF WORDS)/2 TO BE TRANSFERED FROM # OF PAGES. CDF 20;IFNZRO .-7643 CIA /WANT THIS A NEGATIVE NUMBER FOR ISZ'S FCNNOP, SNA CLL CML RAR /......IF # OF PAGES=0, ASSUME WHOLE FIELD TRANSFER JMS XCHNG /SEND WORD COUNT (WC) UP TO FIELD 2 TAD I FDA0 /FETCH 2ND ARG....DATA BUFFER POINTER ISZ FDA0 /....(LAST TIME WE'LL NEED THIS ARG) JMS XCHNG /SEND TO BUFPTR IN FIELD 2 TAD I FDA0 /FETCH 3RD ARG...THE STARTING BLOCK # FOR TRANSFER CLL RAL TAD I FDA0 /...MULTIPLE BY 3 ISZ FDA0 /....(LAST TIME WE NEED THIS ARG) JMS XCHNG DCA ERRFLG SDN /WAIT FOR FLOPPY TO BE DONE..(THIS IS NEEDED FOR JMP .-1 / POWER-UP & POWER-FAIL TO WORK CORRECTLY) BUFCDF, INSTRT /SET DATA FIELD POINTING TO DATA CIF 20 / AND LET FIELD 2 DO ALL THE PROCESSING JMP DOIT C3700, 3700 FDA1, VERSION /FDA1 HANDLER ENTRY POINT CFCN, 7600 /A GROUP 2 CLA IFNZRO FCN-7600 TAD FDA1 /FUDGE ENTRY POINT TO LOOK LIKE FDA0 DCA FDA0 TAD C20 /BUT SET MODE TO DRIVE #1 JMP FDA /XCHNG...SUBROUTINE TO TRANSFER AC TO THE NEXT DATA LOCATION IN FIELD 2 / XCHNG, ENTRY /AC= VALUE TO BE PUT IN FIELD 2 CDF 20 /SET DATA FIELD TO 2 DCA I XPTR /..POCK UP VALUE ISZ XPTR /..SELECT NEXT DATA LOCATION CALCDF, INSTRT /..RESET DATA FIELD TO CALLING FIELD JMP I XCHNG /....THAT'S ALL FOLKS / /RTN....TRANSFER DONE...CLEANUP CODE & RETURN TO USER / RTN, STR /IF ODD # OF PAGES TRANSFERED, WE HAVE TO PAD OUT SKP CLA /LAST SECTOR. DISK DOES NOT WANT MORE DATA XDR /DISK DOES WANT MORE DATA...SEND IT WHATEVER IS IN / THE AC....MAY *** NOT *** BE 0'S SDN /DISK DONE? JMP RTN /...NO...SEND IT MORE DATA OR WAIT UNTIL IT IS CLA CLL IAC RAL /CREATE A CDF CIF FOR HANDLER RETURN TAD CALCDF DCA RTNCXF /....SAVE IT TAD XFCN CDF CIF 20 SNA CLA JMP DSKFIN /IF WRITE OPERATION SEND OUT LAST BUFFER RTN1, TAD FCNNOP /DISK DONE FLAG RESET...MUST BE RESET LCD /DO IT WITH A FLOPPY NOP INSTRUCTION TAD ERRFLG /DID WE HAVE AN ERROR? C100, SMA /SKIP IF WE DID....TAKE ERROR RETURN & AC IS NEG. ISZ FDA0 /NO ERROR...TAKE NORMAL RETURN W/CLEAR AC RTNCXF, INSTRT /CDF CIF TO CALLING FIELD JMP I FDA0 /AND RETURN TO CALLER ERROR, TAD XFCN /ERROR PROCESSOR SNA CLA /TEST TYPE OF ERROR JMP ERRWRT /...A WRITE ERROR..CANN'T INIT DRIVE OTHERWISE / DATA IN FLOPPY HOLDING BUFFER WOULD BE LOST INIT /...A READ ERROR ..CAN INITIALIZE DRIVE & TRY AGAIN SDN JMP .-1 /WAIT FOR THAT TO BE DONE ERRWRT, CIF 20 ISZ ERRCTR /MORE RETRIES? JMP RETRY /...YES ERRAC /...NO...JUST RESET TRY COUNTER & DO THE TRANSFER DCA ERRCTR CLA CLL CML RAR DCA ERRFLG /SET ERROR FLAB JMP HRDERR / AND PROCEED LIKE NOTHING HAPPENED C20, 20 IFZERO .-7745&4000 XPTR= 7750 /DATA BREAK LOCATION...USE AS TEMPORARIES..NO DATA BREAK XMODE= 7751 / SHOULD BE OCCURRING DURING A FLOPPY TRANSFER OPERATION! XFCN= 7752 /FLOPPY FUNCTION IN PROGRESS ERRCTR= 7753 /ERROR COUNTER ERRFLG= 7754 /ERROR FLAG...0==> NO ERROR, 4000=>ERROR! FREE= 7755 /FIELD 2 RX01 8-BIT SYSTEM HANDLER CODE RELOC *400 RELOC 7600 / / DATA COMMUNICATION AREA WITH FIELD 0 / VALUES TRANSFER UP HERE VIA XCHNG SUBROUTINE / THE ORDER & ABSOLUTE LOCATION MUST NOT CHANGE!! / FCN, .-. /TYPE OF FUNCTION (0==>WRITE/20==>READ) + 8-BIT MODE + DRIVE # WC, .-. /WORD COUNT...-NUMBER OF TWO WORD PAIRS TO TRANSFER BUFPTR, .-. /BUFFER POINTER....LOCATION WHERE USER'S BUFFER LOCATED BLK, .-. /"FLOPPY BLOCK" ENCODING OF DESIRED BLOCK / / MAIN DATA TRANSFER LOOPS / DOIT, JMS DIVSUB /COMPUTE THE 1ST TRACK/SECTOR VALUES CLA CLL IAC RAL AND FCN SNA CLA /READ OR WRITE? JMP WRITE /....AS THE LABEL WOULD INDICATION..A WRITE! JMS DISKIO /..A READ...FILL THE HOLDING BUFFER JMS LCMD /SEND UP AN EMPTY BUFFER RDLOOP, JMS XFER /..START BRING THE BYTES DOWN DCA TMP1 /...THE 1ST BYTE SAVE....WILL USE OS/8 PACKING JMS XFER DCA TMP2 /...SAVE THE 2ND BYTE JMS XFER DCA TMP3 /...AND THE 3RD BYTE...START PACKING! TAD TMP3 RTL RTL AND C7400 TAD TMP1 DCA I BUFPTR /THE 1ST WORD IS CONSTRUCTED & SAVE IN USER'S BUFFER ISZ BUFPTR C32, 32 / PROTECT IF SKIP...(AC CLEAR HERE) TAD TMP3 /START ON 2ND WORD BSW RTL AND C7400 TAD TMP2 DCA I BUFPTR /AND SAVE IT AWAY ISZ BUFPTR SECTOR, .-. / HOLD DESIRED SECTOR...PROTECT ISZ..ALWAY <32 ISZ WC /MORE PAIR OF WORDS TO TRANSER? JMP RDLOOP /YES...CONTINUE...XFER WILL FETCH SUBSEQUENT SECTORS IF NEEDED TO SATISFY WC JMP RTNX /END...DO COMMON RETURN STUFF. WRITE, JMS LCMD /ISSUE A FILL HOLDING BUFFER WTLOOP, STL CLA /UNPACK USER'S BUFFER INTO FLOPPY HOLDING BUFFER RTL /....THIS CODE IS STOLEN FROM THE KL8E HANDLER! RTL /CREATE A FLAG FOR WHEN THE 2ND BYTE HAS BEEN SENT SPA /1ST, 2ND OR 3RD BYTE? JMP WTLOP1 /3RD BYTE DCA TMP1 /SAVE FLAG + ACCUMULATE PART OF 3RD BYTE TAD I BUFPTR /FETCH NEXT 12-BIT WORD JMS XFER /TRANSFER LOW ORDER 8-BITS, AC UNCHANGED AND C7400 /GET PART OF 3RD BYTE CLL RAL TAD TMP1 /ADD INTO ACCUMULATION/FLAG REGISTER ISZ BUFPTR /BUMP POINTER C7400, 7400 /** NOP **...MUST BE A NOP...VALUABLE INFOR IN AC! JMP WTLOOP+1 /NEAT...HOW THIS LOOP WORKS!!!! WTLOP1, JMS XFER /HAVE 3RD BYTE IN LOW ODDER 8-BITS..SEND IT UP ISZ WC /LAST WORD PAIR? JMP WTLOOP /NO...CONTINUE..XFER WILL GET MORE DATA IF NEDDED RTNX, CDF CIF 0 /RETURN TO FIELD 0...LET RETURN TO USER JMP RTN DISKIO, ENTRY /FETCH NEXT SECTOR FROM DISK CLA CLL IAC RTL /ISSUE THE APPROPRIATE READ/WRITE CMMD JMS LCMD TAD SECTOR / WITH THE DESIRED SECTOR # STR JMP .-1 XDR CLA CLL / DIRTY AC! TAD TRACK / AND THE DESIRED TRACK @ STR JMP .-1 XDR CLA CLL / DIRTY AC! ISZ BLK /INCREMENT TO NEXT FLOPPY SECTOR NUMBER JMS DIVSUB /HAVE A LOT OF TIME WHILE RX01 FINDS DATA AREA / COMPUTE NEXT TRACK/SECTOR VALUES SDN /RX01 DONE? JMP .-1 SER /ERROR HRDERR, JMP I DISKIO /NO...RETURN TO TRANSFER LOOPS (RETRUN HERE IF HARD ERROR) CIF 0 /ERROR..LET FIELD 0 HANDLE IT JMP ERROR RETRY, CLA CLL CMA / HERE IF WE WANT A RETRY TAD BLK DCA BLK /UNDO BLOCK INCREMENT JMS DIVSUB /RECOMPUTE OLD TRACK/SECTOR JMP DISKIO+1 /AND TRY AGAIN! TMP3, XFER, ENTRY /TRANSFER DATA TO/FROM FLOPPY STR /FLOPPY READY? JMP XF1 /NO...DONE? XDR /YES...TRANSFER DATA JMP I XFER / AND RETURN XF1, SDN /DONE? JMP XFER+1 /JUST WAIT AROUND DCA AC /SAVE THE VALUABLE INFORMATION IN AC JMS DISKIO /GET NEW DATA (READ)/ GET REDID OF OLD DATA (WRITE) JMS LCMD /ISSUE NEW EMPTY/FILL COMMAND TAD AC /RESTORE AC JMP XFER+1 /ATTEMP TRANSFER AGAIN LCMD, ENTRY /SEND COMMAND TO FLOPPY, AC=0 FOR FILL/EMPTY FUNCITON TAD FCN / AC=4 FOR READ/WRITE LCD JMP I LCMD /RETURN W/ CLEAR AC DSKFIN, JMS DISKIO /IF A WRITE FUNCTION, NEED TO SEND OUT LAST SECTOR CDF CIF 0 JMP RTN1 DIVSUB, ENTRY /COMPUTE TRACK/SECTOR FOR FLOPPY BLOCK # DCA TRACK / BLK= (OS/8 BLOCK #)*3+SECTOR #0,1,2 TAD BLK /COMPUTE TRACK #=(BLK/26)+1 DIVLOP, ISZ TRACK /GIVE THE PLUS 1 FIRST TIME THRU, KEEP COUNT OF 26 SUBSTRACTIONS TAD M32 SMA / DONE DIVIDING? JMP DIVLOP /NO....DO IT AGAIN DCA SECTOR /AC= -REMAINDER, MULTIPLE BY 3 TAD SECTOR CLL RAL TAD SECTOR DIVLP2, TAD C32 /COMPUTE MODULO(26) SECTOR # SPA /DONE? JMP DIVLP2 /KEEP TAKING THE MODULO DOWN IAC CLL /ADD ONE, CLEAR LINK...NEED FOR FIELD 0 CODE! DCA SECTOR /SAVE IT AWAY JMP I DIVSUB TRACK, .-. /NEXT TRACK FOR OPERATION AC, .-. /TEMPORARY TO HOLD AC TMP1, .-. /TEMPORARY TMP2, .-. /TEMPORARY M32, -32 IFZERO .-7775&4000 $$$$$ END OF FLOPPY HANDLER $$$$$$$$$$$$