+* MS$IOR, MS$IOW - MEGASTORE PIO ACCESS ROUTINES
+*********************************************************************************
+*
+* M$IOR - READ DATA FROM AMPEX MEGASTORE
+* M$IOW - WRITE DATA TO AMPEX MEGASTORE
+*
+* PURPOSE:
+*
+* ACCESS AMPEX MEGASTORE RAM DISK SYSTEM VIA PROGRAMMED IO.
+* SHOULD WORK WITH HONEYWELL FIXED HEAD DISK AS WELL.
+*
+*
+* AUTHOR:
+*
+* PHILIPP HACHTMANN
+*
+*
+* REVISIONS:
+*
+* REV 1 29.10.2009 INITIAL VERSION
+*
+*
+* CALLING SEQUENCE:
+*
+* DISK ADDRESS IS EXPECTED IN A.
+* *
+* CALL MS$IOR CALL TO READ ROUTINE
+* DAC BUFFP POINTER TO READ BUFFER
+* DAC CNTP POINTER TO NUMBER OF BLOCKS TO TRANSFER
+* DAC 0 NEEDED FOR FORTRAN IV COMPATIBILITY
+*
+* CALL MS$IOW CALL TO WRITE ROUTINE
+* DAC BUFFP POINTER TO WRITE BUFFER
+* DAC CNTP POINTER TO NUMBER OF BLOCKS TO TRANSFER
+* DAC 0 NEEDED FOR FORTRAN IV COMPATIBILITY
+*
+* EVERY BLOCK CONTAINS 16 WORDS.
+* INDEX AND B REGISTER ARE PRESERVED.
+* RETURN VALUES ARE STORED IN A.
+*
+* RETURN VALUES:
+*
+* 0 - NO ERROR
+* 1 - PARITY ERROR
+* 2 - ACCESS ERROR, ADDRESSED BLOCK NONEXISTANT
+* 3 - TIMOUT ERROR, SHOULD NOT OCCUR
+* 4 - MEGASTORE NOT BUSY, UNSPECIFIED ABORT
+*
+*
+* REMARKS:
+*
+* THE FOLLOWING IS MORE CORRECT THAN THE MEGASTORE MANUAL.
+* IT HAS BEEN PAINFULLY VERIFIED AGAINST REALITY AND SCHEMATICS.
+*
+* SKS '522 SKIP IF *NO* TIMEOUT OCCURED
+*
+*
+* *******************************************************************************
+* EXPORT SYMBOLS
+*
+ SUBR MS$IOR,READ
+ SUBR MS$IOW,WRIT
+*
+ ABS
+ ORG '20000
+*
+*
+*********************************************************************************
+*
+* READ ROUTINE
+*
+READ DAC 0
+*
+ SSP CLEAR WRITE BIT IF ACCIDENTALLY SET
+ STA DADD SAVE DISK ADDRESS
+ LDA RDBR READ BRANCH INSTRUCTION FOR INNER LOOP
+ STA BRAN SAVE TO BRANCH LOCATION
+ LDA READ LOAD RETURN POINTER
+ JMP MAIN GO TO MAIN WORKING PART
+*
+*
+*********************************************************************************
+*
+* WRITE ROUTINE
+*
+WRIT DAC 0
+*
+ SSM SET WRITE BIT
+ STA DADD SAVE DISK ADDRESS
+ LDA WRBR READ BRANCH INSTRUCTION FOR INNER LOOP
+ STA BRAN SAVE TO BRANCH LOCATION
+ LDA WRIT LOAD RETURN POINTER
+ JMP MAIN GO TO MAIN WORKING PART
+*
+*
+********************************************************************************
+*
+* MAIN WORKING PART
+*
+MAIN STA RTPT SAVE RETURN POINTER
+ LDA* RTPT BUFFER ADDRESS
+ STA PTR SAVE TO POINTER
+ IRS RTPT
+ LDA* RTPT GET BLOCK COUNT POINTER
+ STA CNT TEMPORARILY STORE POINTER
+ LDA* CNT GET BLOCK COUNT VALUE
+ ALS 4 MULTIPLY BY 16, MAKING IT THE WORD COUNT
+ TCA NEGATE IT
+ STA CNT AND SET UP THE LOOP COUNTER
+ IRS RTPT JUMP OVER CALLER'S DAC 0
+*
+****************************************
+* INITIALIZE MEGASTORE
+*
+ LDA DADD LOAD DISK ADDRESS
+ OCP '722 ACTIVATE IO MODE
+ OTA '22 WRITE DISK ADDRESS TO MEGASTORE
+ JMP *-1 WAIT IF NEEDED
+*
+****************************************
+* WORKING LOOP
+*
+LOOP SKS '22 CHECK FOR READY - THERE IS NO REASON FOR THIS CHECK
+ JMP *-1 -- OTHER THAN IT IS NEEDED BY THE MEGASTORE!
+*
+BRAN HLT DYNAMICALLY FILLED WITH RDBR OR WRBR
+*
+RD CRA CLEAR A, ONE OF MY BOARDS DOESN'T DO INA '1022
+ INA '22 GET DATA FROM MEGASTORE
+* INA '1022 CAN BE USED FOR ABOVE TWO WHEN CONTROL HAS BEEN FIXED.
+RDBR JMP RD COPIED TO BRAN
+ STA* PTR STORE TO BUFFER
+ JMP EBRA TO END OF BRANCH
+*
+WR LDA* PTR
+ OTA '22 WRITE TO MEGASTORE
+WRBR JMP WR COPIED TO BRAN
+*
+****************************************
+* ERROR CHECKS
+*
+EBRA CRA
+ AOA ERROR CODE 1
+ SKS '0222 SKIP IF NO PARITY ERROR
+ JMP ABRT ABORT
+*
+ AOA ERROR CODE 2
+ SKS '322 SKIP IF NO ACCESS ERROR
+ JMP ABRT ABORT
+*
+ AOA ERROR CODE 3
+ SKS '522 SKIP IF *NO* TIMEOUT (SEE ERRATA)
+ JMP ABRT ABORT
+*
+ AOA ERROR CODE 4
+ SKS '122 SKIP IF MEGASTORE NOT BUSY - IT SHOULD BE BUSY!
+ SKP
+ JMP ABRT ABORT
+*
+****************************************
+* END OF LOOP
+ IRS PTR INCREMENT POINTER
+ IRS CNT LOOP COUNTER UPDATE
+ JMP LOOP LOOP AGAIN
+*
+****************************************
+* CLEANUP AND EXIT
+*
+ CRA
+ABRT SKS '122 CHECK FOR BUSY (AGAIN)
+ OCP '722 STOP MEGASTORE IF BUSY
+ JMP* RTPT RETURN VIA RETURN POINTER
+*
+*
+********************************************************************************
+*
+* VARIABLES
+*
+CNT DAC 0 LOOP COUNTER
+PTR DAC 0 DATA POINTER
+DADD DAC 0 DISK ADDRESS: BIT 1=WRITE, 15 LSB SECTOR ADDRESS
+RTPT DAC 0 RETURN POINTER
+*
+*
+********************************************************************************
+*
+* THE END OF EVERYTHING
+*
+ END
+*
+********************************************************************************