/RXO1 NONSYS BYTE MODE HANDLER FOR OS/8 EJML 3/77 / * * MODIFIED FOR COS - 310 COMPATIBILITY / 7/80 RHM / This handler increases the storage capacity of a /floppy disk by storing a block in three disk sectors, /rather than four used by the standard handler. This /increases the available file space on a system disk /by 40%, and on a non-system disk by 35%. (658 vs. 494 /blocks). It is a two page handler, and has two entry /points RBA0 and RBA1 (drives 0 and 1); thus both /handlers for a dual drive are co-resident. VERSION="D&77 /ASSEMBLY PARAMETERS DEVTYP=50 /DCB WORD DEVICE TYPE DEVCOD=75 /DEVICE CODE /IOT'S LCD=DEVCOD^10+6001 XDR=LCD+1 STR=XDR+1 SER=STR+1 SDN=SER+1 INIT=SDN+2 *0 /HEADER BLOCK -2 /NUMBER OF HANDLERS=2 DEVICE RX8 /GROUP NAME DEVICE RXB0 /PERM NAME - ENTRY FOR DRIVE 0. DEVTYP^10+4000 /DEVICE CONTROL BLOCK DISK0&177+4000 /ENTRY POINT WORD 0 0 DEVICE RX8 DEVICE RXB1 /ENTRY FOR DRIVE 1. DEVTYP^10+4000 DISK1&177+4000 0 0 / The page-independent coding for the handler /follows. The first page contains entry points at 31 /(RXB0:) and 35 (RXB1:), some initialization code, /several subroutines, and the return. The "main line" /is in the second page, which acquires and decodes the /arguments, then executes the read or write routine, /which does the byte/word translation. Each byte is /sent or fetched by the first page routine CHKSEC /which also reads or writes a new sector when /necessary. Three sectors are used to store each /block, and every three sectors are interleaved. /The total number of blocks (658) is mapped /sequentially up the floppy. Block 0 uses track 1, sectors /1, 4, and 7. Block 1 uses track 1, sectors 10, 13, 16, etc. /Track 0 is not used. *200 /FIRST HANDLER PAGE /CONSTANTS AND TEMPORARIES USED TO PAD /THE ENTRY POINTS TO 31 AND 35 PAGE2, P2ENT-GPG2 /POINTER TO SECOND PAGE RWCD, 0 K100, 100 FLMTCD, JMP OVER JMPOVR=FLMTCD LOADCD, 0 /SUB TO SEND COMMAND DCA XFERBY /SAVE COMMAND KSF JMP NCONTC /No ^c! TAD K7600 /DISCARD PARITY KRS /"OR" KEYBOARD IN TAD K175 /CONTROL C? SZA CLA /SKIP IF IS JMP NCONTC /NO REAL CONTROL C CDIF0, CDF CIF 0 /REAL CONTROL C - JMP I K7600 /JMP TO MONITOR NCONTC, SDN /SKIP ON DONE FLAG JMP LOADCD+2 /TRY AGAIN TAD K100 /FOR BYTE MODE TAD XFERBY /RETRIEVE COMMAND LCD /LOAD COMMAND RX02, NOP /Becomes JMS XFERBY for an RX02. JMP I LOADCD /RETURN DISK0, VERSION /RXB0: ENTRY K7600, 7600 /A CLA. JMP MKRWCD /Make the read/write command. K16, 16 /Constant to pad E.P. DISK1, VERSION /RXB1: ENTRY CLA CLL /IN CASE NON ZERO ON ENTRY TAD DISK1 /REPLACE ARG POINTER DCA DISK0 STL RTL /NL2 FOR DRIVE 1 MKRWCD, STL RTL /AC=2 OR 12 RAL /AC=4 OR 24 FOR RD/WR SECTOR DCA RWCD /SAVE READ/WR CMD ONCE, TAD RDSTAT /Get status TAD RWCD /Get drive number bit TRACK, JMS LOADCD BYTCNT, SDN SECTOR, JMP .-1 /Wait for done. XDR AND K10 /Is the RX02 bit set? SZA CLA /Skip if it is an RX01. TAD JMSXFB /It's a RX02. DCA RX02 /Zap the '02 location. RX01, TAD K16 /Set done. LCD TAD JMPOVR DCA ONCE OVER, RDF /GET CALLING FIELD TAD CDIF0 /PREPARE RETURN DCA RTNDF /SAVE IT CLL CML RAR /NL4000 TAD I DISK0 /GET ARG 1 (RD/WR) CLA CML RTL /MAKE & SAVE FILL/ DCA FLMTCD /EMPTY BUFFER CMD TAD FLMTCD /GET IT BACK RTR /L=1 IF READ TAD K7600 SZL /Leave w.c. at 200 unless reading. STA /-1 For read. DCA BYTCNT /Set the counter. JMS . /PREPARE LINK TO GPG2, TAD .-1 /PAGE 2 TAD PAGE2 DCA PAGE2 DCA .-4 /FIRST TIME ONLY TAD DISK0 /ARG POINTER IN AC JMS I PAGE2 /GO TO MAIN LINE K10, BKNO3, 10 /SECTOR NUMBER ** MUST BE HERE ** SKP /RETURN FROM READ JMS DSKRW /RETURN FROM WRITE GOODRT, ISZ DISK0 /POINT TO NORMAL RETURN BADRT, ISZ DISK0 ISZ DISK0 ISZ DISK0 RDSTAT, /Once only code. Has offset to make read status cmd RTNDF, 12-4-100 /RETURN TO CALLER JMP I DISK0 XFERBY, 0 /SUB TO XFER BYTE STR /SPIN UNTIL XFER REQ JMP .-1 XDR /DO IT JMP I XFERBY /RETURN CHKSEC, 0 /SUB TO CHECK SECTOR COUNT CLA CLL /CLEAR ANY CONTENTS OF AC ISZ BYTCNT /Check if RX buffer is empty. JMP I CHKSEC /Nope. JMS DSKRW /GET ANOTHER SECTOR ISZ BKNO3 /BUMP SECTOR NUMBER TAD FLMTCD /SEND FILL/EMPTY JMS LOADCD /BUFFER COMMAND ISZ CHKSEC /FLAG AS HAVING A BYTE. TAD K7600 DCA BYTCNT /Reset counter. JMP I CHKSEC /RETURN DSKRW, 0 DCA TRACK TAD BKNO3 /GET THE TRACK AND SECTOR DIV26, ISZ TRACK /NEW PARTIAL QUOT TAD (-32 /SUBTRACT 26 SMA /Skip when division overflows. JMP DIV26 /KEEP DIVIDING DCA SECTOR /SAVE REMAINDER (-26) TAD SECTOR CLL RAL /INTERLEAVE STEP TAD SECTOR /MULTIPLY BY THREE MOD, TAD (32 /MAKE POSITIVE REMAINDER SPA JMP MOD /KEEP TRYING IAC /SKIP SECTOR 0 DCA SECTOR /Save the sector # TAD FLMTCD /GET READ/WRITE TAD RWCD /ADD GET SECTOR JMS LOADCD /SEND IT TAD SECTOR /Get the sector # back. JMSXFB, JMS XFERBY /GIVE TO RX CLA /GET TRACK TAD TRACK JMS XFERBY /TO RX CLA TAD K16 /Set DONE again. JMS LOADCD SER JMP I DSKRW /Return. STA JMP BADRT /Return a fatal error. K175, 175 PAGE P2ENT, 0 /SECOND HANDLER PAGE DCA CALENT /SAVE ARG POINTER TAD I CALENT /Get first arg. SMA CLA /SKIP IF WRITE STA /NL-1 DCA LNKSAV /SAVE READ OR WRITE GOINIT, JMP SETUP /GO SET UP POINTERS TAD I CALENT /GET ARG 1 (FUNCTION) AND K70 /ISOLATE BUFFER FIELD TAD CDF0 /MAKE CDF COMMAND DCA BUFCDF /STORE IT TAD I CALENT /GET ARG 1 AGAIN CLL RAL /WORD COUNT AND K76002 /Only the word count bits. CIA /MINUS DCA DWCNT /STORE IT ISZ CALENT /BUMP ARG POINTER TAD I CALENT /GET BUFFER ADDRESS DCA BUFADD /STORE IT ISZ CALENT /BUMP ARG POINTER TAD I CALENT /GET START BLOCK CLL RAL /TIMES TWO TAD I CALENT /NOW TIMES THREE ISZ CALENT /POINT TO ERROR RETURN DCA TBKNO3 /SAVE SECTOR NUMBER CDF0, CDF 0 /RESET TO MY FIELD TAD TBKNO3 /RETRIEVE SECTOR NUMBER DCA I P2ENT /STORE IN PAGE 1 ISZ P2ENT /BUMP RETURN ADDRESS TEMP, /TEMP STORE FOR READ/WRITE BUFCDF, CDF 0 /CHANGE TO BUFFER FIELD ISZ LNKSAV /SKIP IF READ JMP WRITE / READ ROUTINE /READS THREE SECTORS FROM THE RX01 INTO A BUFFER. THE /FIRST SECTOR GOES INTO THE HIGH 4 BITS OF THE BLOCK, AND /THE NEXT TWO SECTORS GO INTO THE LOW EIGHT BITS. JMS I PCHKSE /START THE READ K70, 70 /Should skip. READ, TAD DWCNT /GET THE WORD COUNT FOR THE HIGH 4 BITS STL RAR /DIVIDED BY TWO (TWO WORDS PER BYTE) DCA HICNT /SAVE IT TAD BUFADD /SAVE THE BUFFER POINTER DCA BUFSAV BIT4, JMS I PXFERB /GET A BYTE CLL RTL /SHIFT LEFT TWO .... DCA TEMP /SAVE IT THAT WAY TAD TEMP CLL RTL /AND LEFT 4 JMS STASH /SAVE IN BUFFER TAD TEMP /GET SHIFTED TWO BSW /SHIFTED EIGHT NOW. JMS STASH /SECOND WORD. JMS I PCHKSE /DONE SECTOR YET? SKP JMP FIXED /YUP. DO THE REST. ISZ HICNT /DONE WORD COUNT ? JMP BIT4 /NOPE. EMPTY, JMS I PXFERB /IF OVERFLOW, EMPTY THE BUFFER JMS I PCHKSE /CHECK FOR DONE JMP EMPTY /LOOP UNTIL END OF SECTOR FIXED, CLA CLL CMA RAL /AC = -2; WANT TO READ TWO SECTORS IN DCA SECCTR /EIGHT BIT MODE (UNLESS W.C. STOPS US) TAD BUFSAV /GET THE SAVED BUFFER POINTER DCA BUFADD /RESTORE IT BIT8, TAD I BUFADD /GET THE HIGH FOUR BITS ALREADY SET AND K7400 /ONLY THOSE JMS I PXFERB /GET THE LOW EIGHT BITS JMS STASH /STASH IN BUFFER ISZ DWCNT /CHECK WORD COUNT SKP JMP I P2ENT /RETURN IF OVERFLOW JMS I PCHKSE /CHECK END OF SECTOR JMP BIT8 /NOT YET ISZ SECCTR /READ BOTH EIGHT BIT SECTORS? JMP BIT8 /NOPE. JMP READ /YUP. READ FOUR BIT NOW. / WRITE ROUTINE - WRITES FULL BLOCKS ONLY, PACKS /USING COS-310 SCHEME. WRITE, ISZ P2ENT /POINT TO WRITE RETURN JMS I PLOADC /SEND FILL BUFFER COMMAND WRT4, TAD BUFADD /SAVE BUFFER ADDRESS DCA BUFSAV WRT4LP, JMS GETBYT /GET A BYTE FROM THE USER'S BUFFER AND K7400 /HIGH 4 BITS ONLY RTR DCA TEMP JMS GETBYT /NEXT WORD AND K7400 BSW /INTO POSITION TAD TEMP /GET THE LAST WORD RTR JMS I PXFERB /GIVE TO RX01 JMS I PCHKSE /CHECK IF FULL JMP WRT4LP /GET ANOTHER BYTE CLA CLL CMA RAL /SET AC=-2 DCA SECCTR /DO 2 SECTORS OF 8-BIT. TAD BUFSAV DCA BUFADD WRT8, JMS GETBYT /GET A WORD JMS I PXFERB /GIVE TO RX01 K76002, 7600 /Clear the word written. ISZ DWCNT /CHECK WORD COUNT SKP JMP I P2ENT /ALL DONE JMS I PCHKSE /CHECK IF MORE JMP WRT8 /KEEP FILLING ISZ SECCTR /BOTH SECTORS DONE? JMP WRT8 /NOPE. JMP WRT4 /YEP. GO BACK TO 4 BIT. CALENT, STASH, 0 DCA I BUFADD /STORE IN BUFFER ISZ BUFADD /RESET POINTER LNKSAV, 0 /Covers skip. JMP I STASH /RETURN SETUP, TAD PXFERB /ROUTINE TO SET UP SNA /POINTERS TO PAGE 1 DWCNT, JMP INITND /LOCS; USED ONLY ONCE BUFADD, TAD P2ENT /AFTER LOADING, THEN TBKNO3, DCA PXFERB /USED FOR STORAGE SECCTR, ISZ .-1 HICNT, ISZ SETUP BUFSAV, JMP SETUP INITND, DCA GOINIT /DONT COME HERE AGAIN JMP GOINIT+1 PXFERB, XFERBY-BKNO3 /POINTERS TO PAGE 1 PLOADC, LOADCD-BKNO3 PCHKSE, CHKSEC-BKNO3 GETBYT, 0 /END OF LIST TAD I BUFADD ISZ BUFADD K7400, 7400 /NOP, Covers skip. JMP I GETBYT $