*** empty log message ***
[h316.git] / lib / hachti / src / megastore.asm
diff --git a/lib/hachti/src/megastore.asm b/lib/hachti/src/megastore.asm
new file mode 100644 (file)
index 0000000..2a2a26b
--- /dev/null
@@ -0,0 +1,191 @@
+*  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
+* 
+********************************************************************************