"Loading 13181/7970 MagTape Support" $PRINT CRLF ; modified 12/16/07 for v1.4 - MTBOOT jumps to code after booting to CLC ; modified 9/29/07 for v1.11 - MTBOOT uses PRESET rather than -IRQ ; modified 9/2/07 for v1.1 - added ,C to MTSTATUS's LIA ; modified 8/29/04 for v0.58 - added MTBOOT to core system ; modified 3/15/03 for v0.56 - CLF 6 mods to MTREAD/MTWRITE, mod MTGEN ; modified 11/28/02 for v0.54 - adjustments for altered MSUSER ; modified 11/19/02 for v0.54 - new MTGEN format w/ version up front ; modified 11/17/02 - "fixed" DMSTATUS, modified MTSCAN ; ---------------------------------------------------------- ; ; Magnetic Tape Definitions ; ; RELEASED DMA MAG TAPE CODE FOR 7970E ; HARDWARE INTERFACE VALUES FOR 13181 CONTROLLER ; CHANGES MADE 3-31-02, TESTED 4-4-02 ; COMMENTS ADDED FOR RELEASE 4-5-02 ; CONVERTED TO HPIPLOS DEFINITIONS 4-7-02 ; ADDED MTSTATUS 4-10-02 ; CONVERTED TO CREATE FORM 9-21-02 ; ; NOTE, THIS CODE USES DMA CHANNEL 1, BUT DOES NOT ; USE NOR GENERATE INTERUPTS. ; "Loading MTINIT" $PRINT CRLF CREATE MTINIT JMP CSTART * MTINIT code/docs follow vars/subs * * CHANGE THESE DEFINITIONS TO MOVE MAG TAPE CONTROLLER * TO ANOTHER SLOT, BUT ALSO CHANGE RCW1 AND WCW1! * MTDAT EQU 14 MTCMD EQU 15 RCW1 OCT 120014 WCW1 OCT 20014 * * other constants/variables for MT MASK2 OCT 10 RCW2 OCT 0 * address w/ b.15 set RCW3 OCT 0 * -length RRF OCT 23 B15SE OCT 100000 WCW2 OCT 0 * address WCW3 OCT 0 * -len WCC OCT 31 B15CL OCT 77777 * bit 15 clear GAP OCT 000015 GFM OCT 000215 CLRMT OCT 000110 SEL0 OCT 001400 FSR OCT 000003 BSR OCT 000041 FSF OCT 000203 BSF OCT 000241 REW OCT 000101 RWO OCT 000105 * * SUBROUTINE TO SEND COMMAND TO MTC, NO TIMEOUT! * MAG TAPE COMMAND IS IN B-REG, HANDSHAKES TO CHECK * FOR A BUSY CONTROLLER, SO THIS WILL HOLD OFF ANY * COMMANDS WHILE TAPE IT STILL MOVING (LIKE A REWIND * TO LOAD POINT COMMAND). * DOMTC NOP REJCT OTB MTCMD LIA MTCMD * GET CONTROLLER STATUS AND MASK2 * MASK BUSY BIT SZA * IS CONTROLLER BUSY? JMP REJCT * YES, KEEP TRYING STC MTCMD,C * NO, ISSUE NEW COMMAND JMP DOMTC,I * AND GET OUTTA HERE * * "MTINIT" * INITIALIZE MAG TAPE SYSTEM AND SELECT DRIVE ZERO * ITS SAFE TO RUN THIS BEFORE ALL TAPE OPERATIONS * BUT IS ONLY NEEDED AT POWERUP ONCE. * CAN BE ALTERED TO SELECT ADDITIONAL TAPE DRIVES * ON THE CONTROLLER, BUT I ONLY HAVE ONE DRIVE. * CSTART LDB CLRMT OTB MTCMD STC MTCMD,C SFS MTCMD JMP *-1 LDA SEL0 OTA MTCMD END ; "Loading MTREAD" $PRINT CRLF CREATE MTREAD /KEEP * * "MTREAD" - MagTape Read * Usage: @BLK GET 2000 MTREAD will read 2000 words * into memory blocks (starting with block #0) * 50000 400 MTREAD will read 400 words into memory * starting at 50000 (example numbers in octal) * JSB ZSPOP,I * pop stack - length CMA,INA * 2's compliment STA RCW3 JSB ZSPOP,I * pop stack - address IOR B15SE * set bit15 STA RCW2 LDA RCW1 * SET STC/CLF PROTOCOL AND SLOT OTA 6B CLC 2B * SET DATA DIRECTION AND ADDRESS LDA RCW2 OTA 2B STC 2B * SET TRANSFER LENGHT LDA RCW3 OTA 2B LDB RRF * GET MAG TAPE COMMAND JSB DOMTC * ISSUE TO CONTROLLER STC MTDAT,C * START DATA CHANNEL STC 6B,C * START DMA TRANSFER SFS 6B * IS DMA TRANSFER COMPLETE? JMP *-1 * NO, KEEP CHECKING * * YES, DATA IS NOW IN MEMORY CLF 6B * reset dma (fix the clock!) END ; "Loading MTWRITE" $PRINT CRLF CREATE MTWRITE /KEEP * * "MTWRITE" - MagTape Write * @BLK GET 2000 MTREAD - read 2000 octal words into blocks * 20000 1000 MTREAD - read 1000 words into memory at 20000. * JSB ZSPOP,I * pop length CMA,INA * 2's compliment STA WCW3 JSB ZSPOP,I * pop address AND B15CL * clear b.15 STA WCW2 LDA WCW1 * SET STC/CLF PROTOCOL AND SLOT OTA 6B CLC 2B * SET DATA DIRECTION AND ADDRESS LDA WCW2 OTA 2B STC 2B * SET TRANSFER LENGHT LDA WCW3 OTA 2B LDB WCC * GET MAG TAPE COMMAND JSB DOMTC * ISSUE MAG TAPE COMMAND STC MTDAT,C * START DATA CHANNEL STC 6B,C * START DMA TRANSFER SFS 6B * IS DMA TRANSFER COMPLETE? JMP *-1 * NO, KEEP CHECKING * * YES, DATA IS NOW ON TAPE CLF 6B * reset dma END ; "Loading GAP" $PRINT CRLF CREATE GAP /KEEP * * "GAP" - WRITE INTER RECORD GAP * INTER RECORD GAPS MUST BE USED BETWEEN ALL RECORDS * WITHIN A FILE FOR THE RECORD FORWARD AND RECORD * REVERSE COMMANDS. * LDB GAP JSB DOMTC END ; "Loading GAPMARK" $PRINT CRLF CREATE GAPMARK /KEEP * * "GAPMARK" - WRITE GAP AND FILE MARK * GAP AND FILE MARKS MUST BE USED TO SEPERATE FILES * (SETS OF RECORDS) ON TAPE FOR THE FILE FORWARD AND * FILE REVERSE COMMANDS (revised 5/11/02) * LDB GFM JSB DOMTC END ; "Loading FS1R" $PRINT CRLF CREATE FS1R /KEEP * * "FS1R" FORWARD SPACE 1 RECORD * THIS IS USED TO POSITION TAPE TO A DESIRED RECORD WITHIN * A FILE ON TAPE. * LDB FSR JSB DOMTC END ; "Loading BS1R" $PRINT CRLF CREATE BS1R /KEEP * * "BS1R" BACK SPACE 1 RECORD * THIS IS USED TO POSITION TAPE TO A DESIRED RECORD WITHIN * A FILE ON TAPE. * LDB BSR JSB DOMTC END ; "Loading FS1F" $PRINT CRLF CREATE FS1F /KEEP * * "FS1F" - FORWARD SPACE 1 FILE * THIS IS USED TO POSITION TAPE TO A DESIRED FILE ON TAPE. * LDB FSF JSB DOMTC END ; "Loading BS1F" $PRINT CRLF CREATE BS1F /KEEP * * "BS1F" - BACK SPACE 1 FILE * THIS IS USED TO POSITION TAPE TO A DESIRED FILE ON TAPE. * LDB BSF JSB DOMTC END ; "Loading RWLP" $PRINT CRLF CREATE RWLP /KEEP * * "RWLP" - REWIND TO LOAD POINT * THIS REWINDS THE TAPE TO THE PHYSICAL START OF ALL FILES * ON TAPE. * LDB REW JSB DOMTC END ; "Loading RWOL" $PRINT CRLF CREATE RWOL /KEEP * * "RWOL" - REWIND TO OFF LINE * WARNING, THIS COMMAND WILL REWIND THE TAPE UNTIL IT IS * PHYSICALLY DE-MOUNTED FROM THE DRIVE. THE TAPE DRIVE * WILL NO LONGER BE ACCESSIBLE UNTIL THE OPERATOR RE-THREADS * THE TAPE THROUGH THE TENSION ARMS, HEADS AND CAPSTAN WHEEL. * LDB RWO JSB DOMTC END ; "Loading MTSTATUS" $PRINT CRLF CREATE MTSTATUS /KEEP * * "MTSTATUS" - returns mag-tape status word * LIA MTCMD,C * 9/2/07 added ,C JSB ZSPSH,I END ;--------------------------------------------------- "Loading MTBOOT" $PRINT CRLF ; ; file# MTBOOT - boots the specified magtape file ; Hardcoded for slots 14/15, edit * points to change ; OCTAL DEFINE MTBOOT ;visible stub.. see below DEC END ;DEC will be replaced by forward call ;booter...mod 8/25/04 CREATE B LDA MTBOC get start address of data STA TMP1 save source pointer LDA MTBOD get destination address (77676) STA TMP2 save destination pointer MTBOL LDA TMP1,I loop.. get source word STA TMP2,I put at destination address ISZ TMP2 increment destination pointer LDA TMP1 get source pointer CPA MTBOE last data done? JMP MTBEX yes - execute ISZ TMP1 no - increment source pointer JMP MTBOL loop for more MTBEX JSB ZSPOP,I execute - pop file count JMP *+1,I run tape boot code OCT 077700 entry point MTBOD OCT 077676 MTBOC DEF *+1 * from 077676 to 077777 12/16/07 - avoid booting w/ control(s) set * edit * locations to change slots OCT 106700 CLC 0 at 77676 OCT 024002 JMP 2 at 77677 OCT 106501 OCT 006011 OCT 027714 OCT 003004 OCT 073775 OCT 067772 OCT 017762 OCT 102315 * OCT 027707 OCT 067774 OCT 037775 OCT 027706 OCT 067773 OCT 017762 OCT 103714 * OCT 102215 * OCT 027752 OCT 102314 * OCT 027717 OCT 107514 * OCT 005727 OCT 007000 OCT 077775 OCT 102215 * OCT 027752 OCT 102314 * OCT 027727 OCT 107514 * OCT 074000 OCT 077762 OCT 027742 OCT 177762 OCT 040001 OCT 037762 OCT 102314 * OCT 027742 OCT 107514 * OCT 037775 OCT 027737 OCT 054000 OCT 027717 OCT 102011 OCT 102515 * OCT 001727 OCT 002020 OCT 027676 was HLT 77, now JMP 77676 OCT 001727 OCT 001310 OCT 102000 OCT 027714 OCT 077716 OCT 106615 * OCT 102515 * OCT 001323 OCT 001310 OCT 027763 OCT 103715 * OCT 127762 OCT 001501 OCT 001423 OCT 000203 OCT 177777 OCT 000000 OCT 000000 MTBOE DEF *-1 END DEFINE MTB PRESET #1 S>SR B ;select file skip, run booter (file# on stack) END ;wrap MTBOOT around B and MTB and patch MTBOOT to run MTB "MTB" $DEFADR DUP DEC GET ;push MTB word address & link value "MTBOOT" $DEFADR DEC SWAP PUT ;wrap MTBOOT around MTB code "MTBOOT" $DEFADR INC SWAP PUT ;replace dummy with MTB call ;avoids context markers but there's no way to browse inside ;------------------ end core MT defs ---------------------- ; Additional MT definitions ; Revised 5/11/02 ;-------------------------------------------------- "Loading MTWAIT" $PRINT CRLF ; OCTAL DEFINE MTWAIT DO MTSTATUS 1400 AND WHILE END ; ;-------------------------------------------------- "Loading ?MTERROR" $PRINT CRLF ; OCTAL DEFINE ?MTERROR MTSTATUS 22 AND IFNZ 7 PCHR "Mag Tape Data read error. " $PRINT CRLF ENDIF END ; ;-------------------------------------------------- "Loading MTSCAN" $PRINT CRLF ; modified 11/19/02 VARIABLE EOF VARIABLE RECORDS VARIABLE FILES OCTAL DEFINE MTSCAN CRLF MTINIT RWLP MTWAIT EOF #0 PUT RECORDS #0 PUT FILES #0 PUT DO ;MTINIT removed from loop FS1R MTWAIT ?MTERROR MTSTATUS 240 AND IFZ RECORDS GET INC RECORDS SWAP PUT EOF #0 PUT #1 ELSE FILES GET INC FILES SWAP PUT EOF GET INC EOF SWAP PUT EOF GET 2 SUB IFZ BS1R MTWAIT " Logical End of tape detected." $PRINT CRLF #0 ELSE EOF GET IFZ #0 ELSE ;was ..GET IFNZ " File Number " $PRINT FILES GET PNUM " Records = " $PRINT RECORDS GET PNUM CRLF RECORDS #0 PUT #1 ENDIF ENDIF ENDIF WHILE CRLF END ; ;-------------------------------------------------- "Loading MTGEN" $PRINT CRLF ; ; MTGEN - writes bootable system to magtape ; Uses MSUSER/DMS, hpiplos 0.54+ source ; 3/15/03 better user feedback while saving ; OCTAL DEFINE MTGEN DMSTATUS 20000 AND IFZ "DMS must be enabled" $PRINT ELSE "New Volume or File? (V/F) " $PRINT CHRIN CRLF CASE = 126 RWLP MTWAIT #1 = 106 MTSCAN MTWAIT #1 DEFAULT #0 ENDCASE IFNZ MS_SAVE ;save current MS vectors 100 DUP ;start at 100, dup for pointer MSUSER ;redirect MS to user map starting at 100 "Saving HP-IPL/OS" $PRINT ;each 1K prints a dot 2000 DO ;push starting address and start loop DUP ;start address for abs out DUP 1777 ADD ;push start address + 1777 DUP EOD SUB IF<0 ;if Z ;put 0 on Z to keep going ELSE ;if >=eod DROP EOD ;use eod for end adr #1 S>Z ;put 1 on Z to terminate ENDIF ABSOUT 56 PCHR ;save and print dot 2000 ADD ;add 2000 to start address Z>S UNTIL ;everything up to and including EOD saved DROP ;starting address 2 1777 ABSOUT 56 PCHR ;save 1st 1K and print dot ;---- CRLF "Saving HiMem..." $PRINT 70000 75777 ABSOUT ;save octapus and high mem ;73000 to 75777 free for driver code etc ;76000 to 77777 not disturbed PTZERO ;terminate the ABS ;UPTR will point to 1st unwritten location UPTR GET OVER SUB ;subtract start address from pointer UDMA ;user dma CRLF "Writing to tape..." $PRINT MTWRITE MTWAIT ?MTERROR MTWAIT ;write to tape GAPMARK MTWAIT GAPMARK MTWAIT BS1R MTWAIT ;finish SDMA ;restore system DMA MS_RESTORE ;back to whatever ENDIF ENDIF END ;--------------------------------------- "Done" $PRINT CONSOLE