/SERIAL-BASED DISK SYSTEM - NON-SYS /NON-SYSTEM HANDLER FOR OS/8 /KYLE OWEN 17/FEB/2014 - ORIGINAL TO VERSION D /BOB ADAMSON 16/NOV/2015 - EXTENDED TO 4 DISKS FOR NON-SYS / - REMOVED REDUNDANT CDFS / - DISABLED INTERRUPTS FROM HERE / - REPLACED BSWS WITH ROTATES VERS="E&77 BASER=6400 /USING DEVICE 40/41 BASET=6410 SKCF=BASER SKSF=BASER+1 SKCC=BASER+2 SKRS=BASER+4 SKIE=BASER+5 SKRB=BASER+6 STFL=BASET STSF=BASET+1 STCF=BASET+2 STPC=BASET+4 STSK=BASET+5 STLS=BASET+6 BLKNUM=6260 /HANDLER SENDS: /A OR B FOR PRIMARY DISK, SIDE A OR B /C OR D FOR SECOND DISK, SIDE A OR B /E OR F FOR THIRD DISK, SIDE A OR B /G OR H FOR FOURTH DISK, SIDE A OR B *0 -10 /EIGHT DEVICES (4 DISKS = 8 LOGICAL DISKS) DEVICE SDIS; DEVICE SDA0; 4640; SDA0&177; 0; 0 DEVICE SDIS; DEVICE SDB0; 4640; SDB0&177; 0; 0 DEVICE SDIS; DEVICE SDA1; 4640; SDA1&177; 0; 0 DEVICE SDIS; DEVICE SDB1; 4640; SDB1&177; 0; 0 DEVICE SDIS; DEVICE SDA2; 4640; SDA2&177; 0; 0 DEVICE SDIS; DEVICE SDB2; 4640; SDB2&177; 0; 0 DEVICE SDIS; DEVICE SDA3; 4640; SDA3&177; 0; 0 DEVICE SDIS; DEVICE SDB3; 4640; SDB3&177; 0; 0 *200 SENDC, 0 /SEND CHARACTER IN AC STLS STSF JMP .-1 /WAIT FOR IT TO GO JMP I SENDC /WE HAVE NOT CLEARED THE AC SNDNUM, 0 /SEND 12-BIT WORD AS TWO CONSECUTIVE CHARACTERS JMS SENDC /SEND BOTTOM 8 BITS OF WORD RTR /NO BSW TO SUIT 8/I ETC RTR RTR JMS SENDC /SEND TOP 4 BITS PLUS SOME - LET SERVER HANDLE IT. CLA JMP I SNDNUM /EXIT WITH AC=0 GETNUM, 0 /RECEIVE 1 WORD AS 2 SUCCESSIVE SIXBITS SKCC /CLEAR AC AND FLAG SKSF /WAITING FOR THE FLAG TO SET JMP .-1 SKRB /READ BUFFER WHICH WILL BE 1ST SIXBIT CLL RTL /SHIFT SIXBIT TO BITS 0-5 RTL /NO BSW TO SUIT 8/I ETC RTL SKSF /WAITING FOR THE NEXT FLAG JMP .-1 /WHICH WILL BE THE 2ND SIXBIT SKRS /OR BUFFER WITH AC TO GIVE 12 BIT WORD JMP I GETNUM CTRLC, 0 /CHECK FOR ^C KEYBOARD INTERRUPTS S7600, 7600 /= CLA ALSO OS/8 ENTRY POINT KSF /HAS THE KEYBOARD BEEN HIT? JMP I CTRLC /NO, JUST GO AWAY KRS /IF HE'S TYPED, READ THE KEY AND S177 /7 BITS ONLY IN CASE OF PARITY TAD M3 /^C IS CODE 203 SZA CLA /WAS IT ^C? JMP I CTRLC /NO, JUST GO AWAY SCDI, CIF CDF 0 /IF WE HAD A ^C, FORCE FIELD 0 JMP I S7600 /AND EXIT TO OS/8 SDB3, VERS /ENTRY POINT LIST (NOTE REVERSE ORDER) SDA3, ISZ SDCNT /COUNT UP WHERE WE ENTERED SDB2, ISZ SDCNT /EVENTUALLY SDCNT WILL BE SDA2, ISZ SDCNT /THE NUMBER OF THE ENTRY POINT SDB1, ISZ SDCNT /MINUS 1 COUNTING FROM THE TOP SDA1, ISZ SDCNT /IE SDCNT=7 FOR ENTRY SDB3 SDB0, ISZ SDCNT /DOWN TO =0 FOR SDA0 SDA0, ISZ SDCNT /FOR THIS ENTRY, SDCNT WILL =0 /THE NEXT CONSTANT MUST STAY HERE /RELATIVE TO THE FOREGOING ENTRIES WKUP, 101 /"A" - ('AND' INSTRUCTION IS DON'T CARE) CLA CLL SKIE /NO INTERRUPTS FROM THIS CONSOLE TAD SDCNT /AC=ENTRY POINT NUMBER MINUS 1 CMA /AC=ENTRY POINT MINUS 8 TAD SDTAD /AC=TAD (ENTRY POINT) DCA SDGET /READY TO SAVE ENTRY POINT VALUE CLA CLL CML RTR /=2000 TAD SDGET /AC=DCA (ENTRY POINT) DCA SRESTR /GET READY TO REWRITE ENTRY POINT RDF /GET THE CALLING DATA FIELD TAD SCDI /AND MAKE A RETURN FIELD CHANGE DCA SFIELD /FOR OUR EXIT SDGET, HLT /BECOMES TAD (ENTRY POINT) DCA SDENT /WHICH IS START OF PARAMETER LIST TAD SDISZ /GET THE ORIGINAL ISZ INSTRUCTION SRESTR, HLT /AND RESET THE ENTRY POINT /OK, WE'RE ALL SET FOR THE TRANSFER JMS CTRLC /SEE IF WE'RE BEING INTERRUPTED SDTAD, TAD WKUP /IF NOT GET WAKEUP CHARACTER 'A' TAD SDCNT /ADD THE OFFSET (0-7, IE NOW 'A'-'H') JMS SENDC /LET THE SERVER KNOW WHICH DEVICE CLA DCA SDCNT /RESET THE ENTRY COUNTER FOR NEXT TIME JMS GETNEX /TELL SERVER REQUIRED FUNCTION TAD I SDENT /GET BUFFER ADDRESS DCA SLOC /STORE BUFFER ADDRESS FOR XFER JMS GETNEX /TELL SERVER BUFFER ADDRESS JMS GETNEX /TELL SERVER STARTING BLOCK NUMBER JMS GETNUM /RECEIVE CDF INSTRUCTION DCA .+1 /FOR TRANSFER HLT /AND SET UP THE TRANSFER FIELD JMS GETNUM /RECEIVE NEGATIVE WORD COUNT DCA WORDCT GETACK, JMS GETNUM /4000=READ, 4001=WRITE, 0000=DONE, 2000=ERROR SNA /WAS IT ZERO? JMP EXIT /YES, EXIT CLL RAL /NO, IS HIGH BIT SET? SNL JMP ERROR /NO, ERROR! SZA CLA /YES, READ OR WRITE? JMP TXLP /TIME TO WRITE /READ ROUTINE RXLP, JMS GETNUM /GET WORD DCA I SLOC /STORE CONTENTS ISZ SLOC /NEXT LOCATION NOP /CAN'T CHECK ^C - SERVER MAY BLOW UP ISZ WORDCT /INCREMENT WORD COUNT...DONE? JMP RXLP /NO, KEEP LOOPING JMP GETACK /CHECK FINAL ACKNOWLEDGEMENT /WRITE ROUTINE TXLP, TAD I SLOC /GET WORD ISZ SLOC /NEXT LOCATION NOP /CAN'T CHECK ^C - SERVER WOULD HANG JMS SNDNUM /SEND IT ISZ WORDCT /INCREMENT WORD COUNT...DONE? JMP TXLP /NO, KEEP LOOPING JMP GETACK /CHECK FINAL ACKNOWLEDGEMENT GETNEX, 0 /PARAMETER HANDLER UTILITY TAD I SDENT /FETCH NEXT CALLING PARAMETER JMS SNDNUM /AND SEND IT TO THE SERVER ISZ SDENT /MOVE POINTER TO NEXT PARAMETER JMP I GETNEX EXIT, ISZ SDENT /POINT TO NORMAL EXIT JMS CTRLC /LAST CHECK FOR INTERRUPT SFIELD, HLT /MODIFIED TO CDI JMP I SDENT /EXIT TO APPROPRIATE ADDRESS ERROR, CLL CML RAR /ROTATE ERROR CODE AND SET NEGATIVE BIT JMP SFIELD /ERROR EXIT SDCNT, 0 /TRACKER FOR ENTRY POINT NUMBER SDENT, 0 /SURROGATE FOR ENTRY POINT SDISZ, ISZ SDCNT /TO RESTORE ENTRY POINT S177, 177 M3, -3 /MINUS OF ^C 7-BIT CHARACTER SLOC, 0 WORDCT, 0 $$$$$$