File RFDSYS.PA (PAL assembler source file)

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

/	REMEX FLOPPY DISK SYSTEM    ----    O/S-8  DEVICE HANDLER(S)
/	                   BY
/	SOFTWARE ENGINEERING
/	ANN ARBOR, MICHIGAN
/	OCTOBER 24, 1977
/	APRIL 11, 1979......'BOOTSTRAP 4' PROCEDURE ADDED!
/	R.L.COLE
/
/	PROGRAMMED FOR
/
/	PHARMACOLOGY DEPARTMENT
/	THE UNIVERSITY OF MICHIGAN MEDICAL CENTER
/
/
/
/	PROGRAM PROVIDES HANDLERS FOR THE REMEX RFS7500 FLOPPY DISK
/	SYSTEM ON A PDP-8/E  (12K MEMORY MIN)
/	HANDLERS ARE:   SYS
/			FD00
/			FD01
/			FD02
/			FD03
/	HANDLERS OCCUPY FIELD 0,  LOCS  7607-7743
/			FIELD 2,  LOCS  7600-7773  AS IN TD8E
/	THE RFS7500 MUST BE SET UP FOR 16 SECTOR OPERATION
/	AND THE MEDIA MUST BE SO FORMATTED
/	DURING  'BUILD'  ONLY THOSE HANDLERS FOR DRIVES THAT EXIST
/	SHOULD BE ACTIVATED.  ACTIVATING OTHERS COULD CAUSE A SYSTEM
/	HANG IF THEY ARE CALLED INADVERTANTLY.
/
/
/
/	DEFINE SPECIAL IOT'S FOR SYSTEM
/
	LCMD=6140	/LOAD RFS COMMAND REGISTER
	RDRA=6141	/READ DATA REGISTER 'A'  --  LSB OF DATA
	RDRB=6142	/READ DATA REGISTER 'B'  --  MSB OF DATA
	LDRA=6143	/LOAD DATA REGISTER 'A'
	LDRB=6144	/LOAD DATA REGISTER 'B'
	SKDN=6145	/SKIP IF OPERATION DONE
	LDCA=6146	/LOAD CORE ADDRESS REGISTER FROM ACC
	RDST=6147	/READ RFS SYSTEM STATUS
	SKDR=6150	/SKIP IF RFS AWAITS DATA TRANSFER
	SKER=6151	/SKIP IF ERRORS OCCURRED IN OPERATION
	BSW=7002	/SWAP LOW AND HIGH ACC HALVES
	LMQ=7421	/LOAD 'MQ' FROM ACC,  CLEAR ACC
	MQA=7501	/INCLUSIVE OR 'MQ' INTO ACC
/
/

/ / DEVICE HANDLER CONTROL BLOCK FOR 'BUILD' / *0 /ORIGIN SPECIFIES CONTROL BLOCK HEADER / -5 /THIS CODE DEFINES FIVE HANDLERS / DEVICE RFD /GROUP NAME 'REMEX FLOPPY DISK' DEVICE SYS /HANDLER PERMANENT MAME 4400 /DEFINE FILE STRUCTURED DEVICE '40' 6007 /DEVICE IS 'TWO PAGE SYSTEM' 0 /AS SPECIFIED BY 'BUILD' DEFINITION 1140 /ASSUME 76(DEC) (114 OCT) GOOD TRACKS / DEVICE RFD /'REMEX FLOPPY DISK' DEVICE FD00 /UNIT 0 FLOPPY DISK = SYS 4400 /DEVICE IS FILE STRUCTURED, TYPE 40 5033 /TWO PAGE CO-RESIDENT. ENT IS REL 33. ZBLOCK 2 / DEVICE RFD DEVICE FD01 /SECOND HANDLER DEVICE NAME 4400 5032 /ENT IS REL 32. ZBLOCK 2 / DEVICE RFD DEVICE FD02 /THIRD HANDLER DEVICE NAME 4400 5031 /ENT IS REL 31. ZBLOCK 2 / DEVICE RFD DEVICE FD03 /FOURTH HANDLER DEVICE NAME 4400 5030 /ENT IS REL 30. ZBLOCK 2 / EJECT / / HERE IS "BOOTSTRAP 2" FOR SYSTEM / READ IN FROM TRACK 0, SECTOR 1 BY PROGRAM LOADED FROM PAPER TAPE / READS IN SECTOR 2 INTO FIELD 0 AND TRANSFERS CONTROL TO IT / "BOOTSTRAP 3" IS CODED INTO MAIN BODY OF HANDLER / -27 /BOOTSTRAP 2 OCUPIES 27 LOCATIONS / NOPUNCH /ORIGINS ASSEMPLER BUT NOT 'BUILD' *7600 ENPUNCH / NOP /BOOT 1 HAS A JUMP HERE XF, TAD L7600 /SET UP CORE POINTER DCA PTR RW, SKDR /WAIT FOR A BYTE TO BECOME AVAILABLE JMP .-1 RDRA /READ THE LOW ORDER PART LMQ /PUT IT TEMPORARILY IN THE 'MQ' RDRB /READ THE HIGH ORDER PART BSW /PUT IT IN THE HIGH ORDER POSITION MQA /COMBINE THE HIGH AND LOW ORDER PARTS DCA I PTR /STORE IT IN CORE ISZ PTR /INDEX STORE ADDRESS. ALSO JOB COUNTER. JMP RW /GO WAIT FOR NEXT WORD TO AVAIL ITSELF NOP /TWO LOCATION PAD FOR BANK COMPATIBLE BOOTSTRAP NOP CDF /NEXT OPERATION WILL BE BANK 0 (MERGES W/ BOOT 1) ISZ FLAG /CHECK PHASE JMP XF /START BOOT 2 CIF /SET GO TO BOOT 3 JMP BOOT3 / FLAG, -2 /FLAGS BOOT PHASE PTR, PTR /POINTER/COUNTER. MUST COME IN POINTING TO ITSELF. L7600, 7600 / / END OF BOOTSTRAP CODE / END OF HEADER BLOCK /
/ / HERE ARE THE HANDLERS THEMSELVES / / FIRST A FLAG ORIGIN FOR 'BUILD' / *200 /IDENTIFIES FIRST PAGE OF HANDLER / / THEN ONE TO ASSEMBLE BY / NOPUNCH *7600 ENPUNCH / MON, ZBLOCK 7 /SAVE CALL IS BUILT HERE / SYS, HLT /ENTRY OF SYSTEM HANDLER CLA /PROTECT JMP SYENT /GO TO REAL ENTRY / / BOOTSTRAP 3...READS IN FIELD 2 FROM BLOCK 66 / 3 /WHO THE HELL KNOWS WHY!!!! BOOT3, RDST /WAIT FOR LAST OPERATION TO COMPLETE AND IDLE SMA CLA JMP BOOT3 TAD AVEC /SET UP CORE ADDRESS OF OPERATION DATA LDCA /TRANSMIT TO CONTROL IAC /SEND DISK ADDRESS VIA BREAK LCMD SKDN /WAIT FOR OP TO COMPLETE JMP .-1 STL IAC RAL /NOW TRANSFER WORD COUNT VIA BREAK JMP BOOTC /GO TO WHERE BOOT CODE IS CONTINUED / / HERE ARE THE 'NON-SYSTEM' ENTRIES / LTAD, TAD FDA0 /REPLACEMENT CODE ISZDKN, ISZ DKN /REPLACEMENT CODE / FDA3, ISZ DKN /UNIT 3 ENTRY FDA2, ISZ DKN /UNIT 2 ENTRY FDA1, ISZ DKN /UNIT 1 ENTRY FDA0, ISZ DKN /UNIT 0 ENTRY CLA /PROTECT TAD DKN /FIND ADDRESS WHERE CALL ENTERED CIA TAD LTAD /COMPUTE A 'TAD ENT' DCA FUNC /STORE IT FOR USE STL RTR /COMPUTE A 'DCA ENT' TAD FUNC DCA DFUNC /STORE IT FOR USE FUNC, HLT /REPLACED W/ 'TAD ENT' DCA SYS /PUT ENTRY VALUE IN LOC 'SYS' TAD ISZDKN /RESTORE PREVIOUS VALUE DFUNC, HLT /REPLACED W/ 'DCA ENT' TAD DKN /PREPARE UNIT NUMBER FOR FIELD 2 CODE BSW /CONTROL FORMAT IS UNIT*64+SEC SYENT, LMQ /TRANSFER UNIT CODE IN 'MQ' DCA DKN /LEAVE 'DKN' EQUAL 0 FOR NEXT CALL TAD SYS /CARRY CALLING ADDRESS IN ACC / / NOW GO TO BANK 2 TO PROCESS DATA TRANSFER / CIF 20 JMP ENT2 / / CONTINUED BOOTSTRAP 3 CODE / BOOTC, LCMD /LOAD COMMAND TO TRANSFER WORD COUNT SKDN /WAIT FOR IT TO OCCUR JMP .-1 TAD L57 /SET UP AN ACC TRANSFER READ LCMD TAD K7600 /SET UP CORE POINTER TO 7600 DCA PCA CDF 20 /THIS TRANSFER IS INTO FIELD 2 / / TRANSFER LOOP / RXW, SKDR /WAIT FOR DATA TO ARRIVE JMP .-1 RDRA /GET LOW ORDER PART LMQ /AND PUT IT IN TEMPORARY RDRB /GET HIGH ORDER PART BSW /AND PUT IT IN HIGH ORDER ACC MQA /COMBINE HIGH AND LOW ORDER PARTS DCA I PCA /PUT WORD IN CORE JMP RXX /JUMP OVER PROTECTION /***************************************************************************** IFNZRO .-7700 <NZERR> HLT HLT JMP .-1 /STRAY USR CALLS CRASH HERE /***************************************************************************** RXX, ISZ PCA /ADVANCE CORE POINTER/JOB COUNTER JMP RXW /GO WAIT FOR NEXT WORD CDF /GET DF IN SYNC W/ IF / / BEGIN 'BOOTSTRAP 4' CODE--READ BLOCK 66A / INTO 17600 TO 17777 / JMS SYS /USE THE SYSTEM HANDLER WHICH IS NOW IN CORE 0110 /FUNCTION IS READ 1 PAGE INTO BANK 1 7600 /AT LOCATION (1)7600 0066 /FROM BLOCK 66 HLT /ON ERROR--HALT / / END OF 'BOOTSTRAP 4' / JMP MON /START SYTEM DKN, 0 /UNIT NUMBER L57, 57 AVEC, VEC VEC, 16 /SECTOR NUMBER FOR BOOT 3 TRANSFER 6 /TRACK NUMBER FOR BOOT 3 TRANSFER K7600, 7600 /PROVIDES LOW ORDER WORD COUNT FOR BOOT 3 0 /HIGH ORDER WORD COUNT FOR BOOT 3 PCA, 0 /COREADDRESS POINTER FOR BOOT 3 / / END OF FIELD 0 CODE FOR HANDLERS /
/ / THE FOLLOWING IS THE SECOND PAGE OF THE HANDLER / IT RESIDES IN THE 7600 PAGE OF FIELD 2, A LA TD8E / IT IS READ IN BY BOOT 3 / IT IS ENTERED WITH THE UNIT NUMBER IN THE 'MQ' IN CONTROL FORMAT / AND WITH THE CALLING ADDRESS+1 IN THE ACC / THE DF IS SET TO THE CALLING FIELD / / *400 /FLAG TO 'BUILD' MEANS SECOND HANDLER PAGE / NOPUNCH FIELD 2 /FOR THE ASSEMBLER *7600 /CERTAIN CONVENIENCES ACCRUE ENPUNCH / / BEGIN HANDLER PAGE 2 / BK2, 0 /PSEUDO ENTRY POINT ENT2, DCA BK2 /SAVE ARGUMENT POINTER RDF /GET CALLING (RETURN) FIELD TAD RCFD /MAKE RETURN INSTRUCTION DCA XCF /STORE IT WHERE IT WILL BE USED TAD I BK2 /GET CODE OF REQUESTED OPERATION DCA ROP /SAVE IT ISZ BK2 /POINT TO CA TAD I BK2 /GET CA DCA CA /SAVE CA LOCALLY ISZ BK2 /POINT TO BLOCK NUMBER TAD I BK2 /PICK UP BLOCK NUMBER AND L7 /COMPUTE SECTOR NUMBER STL RAL /2*(BLOCK.AND.7 + 1/2) = 2*BLOCK.AND.7 + 1 MQA /MERGE W/ UNIT NUMBER==>UNSEC DCA UNSEC /STORE FOR LATER USE CMA CLL RTL /SET UP RETRY COUNTER DCA RTC /INITIAL VALUE = -3 TAD I BK2 /PICK UP BLOCK AGAIN TO COMPUTE TRACK ISZ BK2 /INDEX RETURN POINTER TO ERROR EXIT SPA /TEST FOR BLOCK# MUCH TOO BIG JMP ERR /NON-HARDWARE DETECTED ERROR CLL RTR /SHIFT TRACK INTO POSITION RAR DCA TRK / / ARGUMENTS ARE COLLECTED AND CONVERTED / WHEN SYSTEM IS IDLE, COMMENCE / CRDY, RDST /WAIT FOR FORMATTER NOT BUSY SMA CLA /H-O BIT IS F'R IDLE JMP CRDY TAD ROP /BREAK UP OP-CODE CLL RAL /MAKE L-O WORD COUNT AND X7600 /L-O WC IS 0 OR 200 (EIGHT BIT) DCA WCL TAD WCL //H-O PART IS CONVERTED TO CONTROL FORMAT BSW /BY DIVIDING BY 400 (100 * 4) RTR /WE CAN BE SLOPPY W/ H-O BITS BECAUSE DCA WCH /CONTROL ONLY WORKS WITH LOW 8 / UNW, TAD LUNSEC /SET UP CA FOR CONTROL WORD PASS VIA BREAK LDCA TAD L2001 /DISK ADDRESS PASS FROM BANK 2 VIA BREAK LCMD SKDN /WAIT FOR OPERATION TO FINISH JMP .-1 RDST /MAKE SURE DRIVE IS READY RAL /DRIVE READY IS STATUS BIT 1 SMA CLA JMP UNW /UNIT WAIT LOOP / TAD L2003 /SET UP TRANSFER OF WORD COUNT LCMD SKDN /WAIT FOR OPERATION TO COMPLETE JMP .-1 / TAD CA /SET UP DATA POINTER DCA PTX TAD ROP /SET UP FIELD TO USER'S BUFFER FIELD AND L70 /MASK OUT BUFFER FIELD NUMBER TAD RCDF DCA X /PUT IT IN LINE / / EVERYTHING READY TO BEGIN THE READ OR WRITE / TAD ROP /PICK OUT DIRECTION BIT RAL /READ/WRITE BIT STAYS IN LINK DURING OP SNL CLA /SKIP IF WRITE OP TAD L12 /DIFFERENCE OF READ AND WRITE CODES TAD L45 /ACC CONTAINS APPROPRIATE COMMAND CODE LCMD /START CONTROL X, HLT /REPLACED W/ 'CDF BUFFER FIELD' JMP XFW /GO WAIT FOR DATA TRANSFER RQUEST /***************************************************************************** / PROTRCT AGAINST FAULTY USR CALLS RTC, 0 /USE LOCATION AS TEMP COUNTER HLT /***************************************************************************** / CDN, SKDN /CHECK FOR OPERATION COMPLETE JMP XFW /NOT YET, CHECK FOR DATA / / CONTROL SAYS OPERATION IS COMPLETE / CHECK SOME THINGS AND EXIT / TAD UNSEC /DO NOT CHECK 'CTRL-C' ON UNIT 0 AND L300 /LOOK ONLY AT UNIT BITS SZA CLA KSF /CHECK KEYBOARD FLAG JMP CER /NO KEY OR UNIT 0...GO CHECK FOR ERRORS TAD X7600 /PICK UP A 200 BIT KRS /'OR' IN THE CHARACTER IN TTY BUFFER TAD L175 /A 'CTRL-C' WOULD HAVE BEEN 7603 (-175) SZA CLA JMP CER /NOT A 'CTRL-C'...GO CHECK FOR ERRORS RCFD, CDF CIF /'CTRL-C'...GO TO MONITOR (NOTE CONSTANT) JMP MON CER, SKER /SKIP IF DETECTED ERROR(S) JMP OPOK /THERE ARE NONE. EXIT STAGE LEFT. ISZ RTC /ERROR. ANY RETRIES LEFT? JMP CRDY /YES. GO GIVE IT ANOTHER ATTEMPT. ERR, CLA CMA /NO. RETURN ERROR FLAG. SKP / OPOK, ISZ BK2 /NO ERROR...USE SUCCESS RETURN XCF, HLT /REPLACED W/ 'CDF CIF CALL FIELD' JMP I BK2 /RETURN TO USER CODE / / HERE IS THE CODE THAT EFFECTS THE DATA TRANSFERS / / / READ / READ, RDRA /GET LOW ORDER PART OF WORD LMQ /PUT IT IN 'MQ' FOR SAFEKEEPING RDRB /GET HIGH ORDER PART OF WORD BSW /PUT IT THERE MQA /COMBINE WORD PARTS DCA I PTX /PUT IT IN USER'S BUFFER / Q, ISZ PTX /ADVANCE POINTER FOR NEXT WORD XFW, SKDR /WAIT FOR TRANSFER NEEDED JMP CDN /NO TRANSFER...GO CHECK DONE SNL CLA /TEST READ/WRITE FLAG (LINK) JMP READ / / WRITE / TAD I PTX /GET THE WORD TO WRITE LDRA /TRANSFER LOW ORDER PART TAD I PTX /GET THE WORD AGAIN BSW LDRB /TRANSFER HIGH ORDER PART JMP Q /GO TO INDEX AND PREPARE FOR NEXT WORD / / END OF HANDLER /
/ / CONSTANTS AND VARIABLES / L175, 175 /CONSTANT FOR 'CTRL-C' CHECK L45, 45 /CODE: WRITE DATA FROM ACC NOW L12, 12 /W/ 45: READ DATA INTO ACC NOW RCDF, CDF /TO MAKE A CDF L70, 70 /TO MASK A FIELD L2003, 2003 /CODE: READ XFER COUNT FROM FIELD 2 L2001, 2001 /CODE: READ DISK ADDRESS FROM FIELD 2 LUNSEC, UNSEC /VECTOR POINTER X7600, 7600 /A MASK ROP, 0 /REQUESTED OPERATION CODE STORED HERE L300, 300 /MASK FOR UNIT CHECK L7, 7 /SECTOR MASK CA, 0 /USER'S CA SAVED HERE UNSEC, 0 /UNIT, SECTOR TRK, 0 /TRACK WCL, 0 /LOW ORDER WORD COUNT PTX=. /WORD IS USED AS CORE TRANSFER POINTER WCH, 0 /HIGH ORDER WORD COUNT / / END OF REMEX FLOPPY DISK SYSTEM HANDLER / $



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