;-*-Midas-*- Title HSNAME: jobdevice ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; HS:SNAME;FN1 FN2 translates to DSK:;FN1 FN2 ;;; ;;; HF:FN1 FN2 translates to DSK:;FN1 FN2 ;;; ;;; H: and HSNAME: are DWIMish and work as HS: if possible, else HF: ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; A=1 ;General porpoise B=2 C=3 D=4 E=5 T1=6 T2=7 T3=10 P=17 Call==PUSHJ P, Return==POPJ P, BOJc==1 DSKc==2 ;Who knows which way the file will be opened? LSRi==3 ;Channel to map in the Inquire database PDLen==20 ;;; ;;;;; ;;; Define SYSCAL op,args .Call [Setz ? Sixbit /op/ ? args ((Setz))] Termin ;;; ;;;;; ;;; 444400,,Buffer*2000 ;Image (BufPtr - 1) AI = -1 (true) BufPtr: 440700,,Buffer*2000 ;Ascii (BufPtr + 0) AI = 0 (false) 2000 ;Image BufLen: 2000*5 ;Ascii IO: 0 ;True = OUTPUT mode, else INPUT AI: 0 ;True = IMAGE mode, else ASCII CalBlk: SETZ CalNam: 0 CalChn: %Climm,,DSKc CalArg: Block 10 Opcode: 0 ;Stuff given to us by JOBCAL Data: Block 3 Cargs: Block 5 OutPtr: 0 ;AOBJN to next block of Clouts: Block 7 ;values to return to calling program ;Call's to already open file, no returned values Pass2: Sixbit /ACCESS/ ? Sixbit /DELEWO/ ? Sixbit /DSKUPD/ ? Sixbit /SREAPB/ Sixbit /FINISH/ ? Sixbit /FORCE/ ? Sixbit /RENMWO/ ? Sixbit /RESRDT/ Sixbit /SAUTH/ ? Sixbit /SDMPBT/ ? SIxbit /SFDATE/ ? Sixbit /SRDATE/ nPass2==.-Pass2 ;Call's to open file, with values returned. Pass3: Sixbit /DIRSIZ/ ? 2 Sixbit /FILBLK/ ? 4 Sixbit /FILLEN/ ? 4 Sixbit /RAUTH/ ? 1 Sixbit /RDMPBT/ ? 1 Sixbit /RFDATE/ ? 1 Sixbit /RFNAME/ ? 5 Sixbit /RFPNTR/ ? 2 Sixbit /STATUS/ ? 1 Sixbit /LNKEDP/ ? 1 nPass3==<.-Pass3>/2 Mode: 0 JOBds: 122 ;Ascii/Unit/Output/device-code 22 Device: 0 ;5 words starting here are passed to a .RCHST FN1: 0 FN2: 0 Sname: 0 DskPtr: 0 PDList: -PDLen,,PDList Block PDLen Where: Open ? Iot ? MLink ? Reset ? Rchst ? Access ? FDele1 ? FDele2 ? SCall ;Opcode= 0 1 2 3 4 5 6 7 8. Tsint: Loc 42 -TsintL,,Tsint Loc Tsint P 0 ? 1_BOJc ? -1 ? -1 ? Handle TsintL==.-Tsint Error: 0 ;Error returned by a syscall DWIM: 0 ;True for H: or HSNAME: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Begin: Move P,PDList .Suset [.sMsk2,,[1_BOJc]] .Suset [.rOption,,T1] Tlo T1,Optint .Suset [.sOption,,T1] Syscal OPEN,[%Clbit,,.uao\10 %Climm,,BOJc [Sixbit /BOJ/]] Jrst Die Syscal CORBLK,[%Climm,,%Cbprv ;Make DSK buffer %Climm,,%Jself %Climm,,Buffer %Climm,,%Jsnew] Jrst Die Movei A,LSRi Move B,[-20,,Inquir] Call LSRTNS"LSRMAP ;Make pages for INQUIR hackery Jrst Lose Syscal JOBCAL,[%Climm,,BOJc %Clout,,Opcode [-12,,Data]] Jrst Lose Jrst GCS ;;; ;;;;; ;;; Handle: Syscal JOBCAL,[%Climm,,BOJc %Clout,,Opcode [-12,,Data]] Jrst Dismis GCS: Hrrz A,Opcode ;Grand Central Station Jrst @Where(A) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; .UUO handling (mostly... sort of...) ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Open: Ldb T1,[370200,,Opcode] ;Bits 4.5 and 4.6 on = Close Jumpn T1,Close Move A,Data+5 Andi A,5 ;No fancy modes, just ascii/image, i/o Call Moder ;Makes IO and AI from control bits Movem A,Mode Move T3,Data+4 Call DWIMp Skipn DWIM Jrst Open1 Trne A,1 ;No DWIMish open for outputs Jrst fatMNA Open1: Movem T3,Device Move T1,Data+3 ;SNAME Move T2,Data+1 ;FN1 Movem T2,FN1 Call gHsnam Move T1,Data+2 Movem T1,FN2 Syscal OPEN,[%Clbtw,,Mode ? %Climm,,DSKc [Sixbit /DSK/] ? FN1 ? FN2 ? Sname %Clerr,,Error] Jrst FatErr Syscal CORBLK,[%Climm,,0 ;Delete INQUIR pages - No longer needed %Climm,,%Jself [-20,,Inquir]] Jfcl ;ok, ok, we'll keep 'em! .Close LSRi, Syscal JOBSTS,[%Climm,,BOJc ? JOBds ;Specify real SNAME Device ? FN1 ? FN2 ? Sname] Jfcl ;...if we can. Syscal JOBRET,[%Climm,,BOJc ? %Climm,,1] Jrst Lose Wait: Jfcl .Hang ;Now wait until we are needed... Close: .Close DSKc, Jrst Die ;If there's no file, why should we stick around? Iot: Skipl Data ;Block mode IOT? Jrst Ioti Hlro B,Data ;-#words (Indeed) Movns B ;#words Skipn AI Imuli B,5 ;(words x 5 = #bytes for ascii mode) Jrst Siot Ioti: Move B,Data Caie B,1 Jrst Siot Skipe IO Jrst [.Iot BOJc,A ;BOJ --> DSK (o) .Iot DSKc,A Jrst Handle] .Iot DSKc,A ;DSK --> BOJ (i) .Iot BOJc,A Jrst Handle Siot: Move A,AI ;B has #bytes to SIOT Skipe IO Jrst Sioto Sioti: Move T1,B Camle T1,BufLen(A) Move T1,BufLen(A) Move D,T1 Move T2,BufPtr(A) Syscal SIOT,[%Climm,,DSKc ? T2 ? T1 ? %Clerr,,Error] Jrst NFErr Move E,T1 Sub D,T1 ;# actually gotten from DiSK Move T1,D Move T2,BufPtr(A) Syscal SIOT,[%Climm,,BOJc ? T2 ? T1 ? %Clerr,,Error] Jrst NFErr Jumpe E,[Sub B,D Jumpn B,Sioti Jrst Handle] Syscal JOBRET,[%Climm,,BOJc ? %Climm,,0] Jrst Lose Jrst Handle Sioto: Move T1,B Camle T1,BufLen(A) Move T1,BufLen(A) Move D,T1 Move T2,BufPtr(A) Syscal SIOT,[%Climm,,BOJc ? T2 ? T1 ? %Clerr,,Error] Jrst NFErr Move T1,D Move T2,BufPtr(A) Syscal SIOT,[%Climm,,DSKc ? T2 ? T1 ? %Clerr,,Error] Jrst NFErr Sub B,D Jumpn B,Sioto Jrst Handle MLink: Move T3,Data+4 ;Device Call DWIMp Skipe DWIM Jrst fatMNA Move T1,Data+3 ;SNAME Move T2,Data+1 ;FN1 Call gHsnam Move E,Sname Move T1,Data+6 Move T2,Data Call gHsnam Exch E,Sname Syscal MLINK,[[Sixbit /DSK/] ? Data+1 ? Data+2 ? Sname Data ? Data+5 ? E %Clerr,,Error] Jrst FatErr Syscal JOBRET,[%Climm,,BOJc ? %Climm,,1] Jrst Lose Jrst Die Reset: .Reset DSKc, Jrst Win Rchst: Syscal RFPNTR,[%Climm,,DSKc ? %Clout,,DskPtr ? %Clerr,,Error] Jrst NFErr Syscal JOBRET,[%Climm,,BOJc ? %Climm,,0 ? [-5,,[Sixbit /DSK/]]] Jrst Lose Jrst Handle Access: .Access DSKc,Data Jrst Win FDele1: Move T3,Data+4 ;Rename or Delete Call DWIMp Skipe DWIM Jrst fatMNA Move T1,Data+3 Move T2,Data+1 Call gHsnam Skipe Data Skipn Data+5 Jrst Delete Syscal RENAME,[[Sixbit /DSK/] ? Data+1 ? Data+2 ? Sname Data ? Data+5 ? %Clerr,,Error] Jrst FatErr Syscal JOBRET,[%Climm,,BOJc ? %Climm,,1] Jrst Lose Jrst Die Delete: Syscal DELETE,[[Sixbit /DSK/] ? Data+1 ? Data+2 ? Sname] Jrst FatErr Syscal JOBRET,[%Climm,,BOJc ? %Climm,,1] Jrst Lose Jrst Die FDele2: Skipe DWIM Jrst nfMNA Skipe Data Skipn Data+5 Jrst DeleWo Syscal RENMWO,[%Climm,,DSKc ? Data ? Data+5 ? %Clerr,,Error] Jrst NFErr Jrst Win DeleWo: Syscal DELEWO,[%Climm,,DSKc ? %Clerr,,Error] Jrst NFErr Jrst Win ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Symbolic .CALL handling (really!) ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SCall: Move A,Data ;Name of call Look2: Came A,[Sixbit /CLOSE/] Jrst Look2a .Close DSKc, Jrst Die Look2a: Movsi B,-nPass2 Loop2: Came A,Pass2(B) Jrst [Aobjn B,Loop2 Jrst Look3] Movem A,CalNam Sos C,Data+2 ;# args (not counting their channel) Move T2,[Setzb Error] Movem T2,CalArg(C) Loop2a: Movei A,CArgs(C) ;Store loc of arg Movem A,CalChn(C) Sojg C,Loop2a .Call CALBLK Jrst NFErr ;Not fatal if we lose Jrst Win Look3: Movsi B,-nPass3 Movei C,Pass3 Loop3: Came A,(C) Jrst [Addi C,2 Aobjn B,Loop3 Jrst nfMNA] Movem A,CalNam Movn B,1(C) ;Minus # VALS needed/wanted Hrlm B,OutPtr Movei T1,Clouts Hrrm T1,OutPtr ;AOBJN pointer to returned-data area Movei T2,CalArg Move E,[%Clout,,Clouts] Loop3a: Movem E,(T2) Aoj E, Aoj T2, Aojn B,Loop3a Move T1,[Setzb Error] Movem T1,(T2) ;Last thing is %Clerr,,Error .Call CALBLK Jrst NFErr Syscal JOBRET,[%Climm,,BOJc ? %Climm,,1 ? OutPtr] Jrst Lose Jrst DisMis ;; ;;; Win or Lose ;; Win: Syscal JOBRET,[%Climm,,BOJc ? %Climm,,1] Jrst Lose Jrst Handle DisMis: Syscal DISMIS,[P] Jrst Lose Die: .Logout 1, .Value NFErr: Setz T1, FatErr: Seto T1, Movss Error Syscal JOBRET,[%Climm,,BOJc ? Error] Jrst Lose Jumpn T1,Die Syscal DISMIS,[P] ; Jrst Lose Lose: Syscal JOBRET,[%Climm,,BOJc ? [%Enadv,,]] Jfcl .Lose %LsSys fatMNA: Syscal JOBRET,[%Climm,,BOJc ? [%Ensmd,,0]] ;Mode Not Available Jfcl Jrst Die nfMNA: Syscal JOBRET,[%Climm,,BOJc ? [%Ensmd,,0]] Jrst Lose Jrst Handle NotUNM: Syscal JOBRET,[%Climm,,BOJc ? [%Ebdfn,,0]] ;Illegal FN Jfcl Jrst Die ;; ;;; Subroutines ;; DWIMp: Came T3,[Sixbit /HSNAME/] Camn T3,[Sixbit /H/] Setom DWIM Return gHsnam: Movei A,LSRi Came T3,[Sixbit /HF/] Jrst gHp1 Move T1,T2 Setz T2, gHp1: Move B,T1 Call LSRTNS"LSRUNM Jrst [Camn T3,[Sixbit /HS/] Jrst NotUNM Move B,T2 Call LSRTNS"LSRUNM Jrst NotUNM Move T1,T2 Jrst .+1] Move A,T1 Setzb C,D Call LSRTNS"LSRHSN Jrst NotUNM Movem D,Sname Move T1,D Return Moder: Trne A,1 Setom IO ;Output Trne A,4 Setom AI ;Image Caie A,.uai Jrst [.Close BOJc, Move T1,A Trc T1,1 Syscal OPEN,[%Clbtw,,T1 ? %Climm,,BOJc ? [Sixbit /BOJ/]] Jrst Lose Return] Return ;;; ;;;;; ;;; $$HSNM==1 $$ULNM==0 $$ULNP==0 $$UNAM==0 .INSRT SYSENG;LSRTNS Buffer==._-14+1 ;DSK buffer page Inquir==Buffer+1 ;Start of LSRTNS-mapped-stuff pages END BEGIN