;COPYRIGHT 1971, 1972 DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V04 .TITLE DV.DF ;DISK DRIVER (RF11) VERSION 1 ; RESIDENT MONITOR ROUTINE FOR SYSTEM USAGE ; CONTAINS SET UP & TRANSFER ROUTINES ONLY R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .GLOBL DF ;TABLE OF STANDARDS AND POINTERS DF: .WORD 0 ;CURRENT DDB ADDRESS (0 IF IDLE) DFFLGS: .BYTE 37 ;STANDARD FACILITY INDICATOR .BYTE 200 ;(NORMAL & FILE-BASED) .BYTE 4 ;STANDARD BUFFER SIZE/16 .BYTE DF.INT-DF;COPYRIGHT:- DIGITAL EQUIPMENT CORP.,MAYNARD,MASS. ; 1971,1972 ; ;VERSION NO:- V07 ; ; .IFDF DVRRWD .TITLE DV.QT .GLOBL QT .ENDC .IFNDF DVRRWD .TITLE DV.MT .GLOBL MT .ENDC ; .CSECT R0=%0 ;DDB PTR R1=%1 ;LCMMD PTR R2=%2 ;CMMD REG R3=%3 ;SP FUNC BLOCK PTR R4=%4 ; R5=%5 ;SCRATCH SP=%6 PC=%7 ; ; ; MTS=172520 ;TM11 STATUS MTC=172522 ;TM11 COMMAND MTBRC=172524 ;TM11 BYTE/RECORD COUNTER MTCMA=172526 ;TM11 CORE MEMORY ADDRESS MTD=172530 ;TM11 DATA BUFFER MTRD=172532 ;TM11;COPYRIGHT 1971, 1972 DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V02 ; PAPER TAPE READER DRIVER (PR) .TITLE DV.PR .GLOBL PR R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; PREAMBLE PR: .WORD 0 ;DCURRENT DDCB OR 0 .BYTE PR.BP ; FACILITIES INDICATOR .BYTE 0 .BYTE 2 ; STANDARD BUFFER SIZE / 16. .BYTE PR.INT-PR ; INTERRUPT ADDRESS .BYTE 200 ; PRIORITY 4 INTERRUPT .BYTE PR.OPN-PR ; DISPATCH OPEN .BYTE PR.TFR-PR ; TRANSFER (IN) .BYTE 0 ; CLOSE .BYTE 0 ;COPYRIGHT 1971,1972, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V06 .TITLE DV.PP .GLOBL PP R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; PAPER TAPE PUNCH DRIVER (PP) ; PREAMBLE ; PP: .WORD 0 ; CURRENT DCB OR 0 .BYTE PP.BP ; FACILITIES .BYTE 0 .BYTE 2 ; 32 WORD STD BUFFER .BYTE PP.INT-PP ; TRANSFER ADDRESS .BYTE 200 ; STATUS .BYTE PP.OPN-PP ; RELATIVE ADDRESSES FOR OPEN .BYTE PP.TFR-PP ; TRANSFER .BYTE PP.CLS-PP ; CLOSE .BYTE 0,0 ; SP ;T.V. CONTENT .BYTE 240 ;PRIORITY FOR T.V. .BYTE 0 ;DESPATCH TABLE .BYTE DF.TFR-DF ;SHOWS TFR RTN ONLY .BYTE 0 .BYTE 0 .BYTE 0 ;SPARE DF.NAM: .RAD50 'DF' .WORD DF.DIR ;MFD BLOCK .WORD 0 ;REQUIRED FOR BIT MAP INFO ;TRANSFER INITIATE DF.TFR: MOV @PC,DF.RTC ;ZERO RETRY COUNT DF.RPT: MOVB @PC,@#DF.DCS+1 ;CLEAR DISK IN CASE OF ERROR MOV DF,R0 ;GET DDB ADDRESS CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DF.DCS+12,R2 ;SET HWR POINTER MOVB @PC,R3 ;SET UP BLOCK CONVERSION READ LINES ; PS=177776 ;PROCESSOR STATUS ; ; ;MTS BITS ; ILC=100000 EOF=40000 CRE=20000 PAE=10000 BGL=4000 EOT=2000 RLE=1000 BTE=400 NXM=200 SELR=100 BOT=40 CH79=20 SDWN=10 WRL=4 RWS=2 TUR=1 DENB=140 PARB=10 ; ;MTC BITS ; ERR=100000 DEN=60000 POWR=10000 PAR=4000 UNIT=3400 CUR=200 INT=100 ADEX=60 CMMD=16 GOB=1 ; ;MTRD BIT ; GAPSDN=10000 ; ;COMMANDS ; RWU=0 READ=1 WRITE=2 EOFM=3 RWD=4 SKPR=5 BSPR=6 ; ; ; ;THIS IS THE DEVICE DRIVER FOR THE TM11/TU10 ; ; SPECIAL FUNCTIONS .BYTE 0 ; DUMMY PR.NAM: .RAD50 'PR' INTCNT: .WORD 0 ; INTERNAL COUNT STOADD: .WORD 0 ; STORE NEXT ADDRESS ; MAIN DRIVER ; BEGIN TRANSFER PR.TFR: MOV PR,R0 ; GET DDB MOV 10(R0),R4 ; PRESERVE USER COUNT ASL R4 ; BYTE COUNT MOV R4,INTCNT MOV 6(R0),STOADD ; SAVE BUFFER ADDRESS BIS #101,@#PR.CSR ; ENABLE INTERRUPT RTS PC ;RETURN ; THE PR IS DRIVEN BY THE FOLLOWING INTERRUPT ROUTINE ; PR.INT: TST @#PR.CSR ; TEST FOR ERROR BMI PR.ERR ; YES MOVB @#PR.BUF,@STOA F & SPARE PP.NAM: .RAD50 'PP' PP.TRL: .WORD 1 ; TRAILER INDOCATOR = 0 PPCT: .WORD 0 ; INTERNAL COUNT PPFPT: .WORD 0 ; CURRENT BUFFER POINTER ; ; DRIVER BODY PP.TFR: MOV PP,R0 ; GET CURRENT DDB MOV 6(R0),PPFPT ; GET BUFFER POINTER MOV 10(R0),R4 ; PRESERVE WORD COUNT ASL R4 ; CONVERT TO BYTES MOV R4,PPCT ; AND SAVE MOVB #1,PP.TRL ; RESET TO TFR PP.UEN: MOV (SP),-(SP) ; SIMULATE INTERRUPT MOV @#ST.ATS,2(SP) ; FROM JSR PC,XXX MOV @#PP.VCT,@#ST.ATS ; RUN UNDER PUNCH STATUS PP.IN MOV (R0)+,R4 ;GET BLOCK NUMBER (******) ASL R4 ;CONVERT TO WORDS ROLB R3 BCC .-4 MOV R3,-(R2) ;SET UP DISK ADDRESS & EXT. MOV R4,-(R2) MOV (R0)+,-(R2) ;MOVE IN WORD COUNT ... MOV (R0)+,-(R2) ;& MEMORY ADDRESS MOV (R0)+,R1 ;GET FUNCTION BISB @PC,R1 ;ADD INT ENB & GO BIC #177470,R1 ;REMOVE OTHER GARBAGE (******) MOV R1,-(R2) ;SEND TO CONTROL RTS PC ;RETURN TO MONITOR FOR NOW ;(******) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION ;INTERRUPT SERVICE DF.INT: MOV @#V.RSAV, .IFDF DVRRWD QT: .ENDC MT: .WORD 0 ;BUSY INDICATOR .BYTE 177 ;ALL GENERAL STRUCTURE EXCEPT OPEN .BYTE 40 ;SPECIAL STRUCTURE = MAG TAPE .BYTE 20 ;BUFFER SIZE = 512 BYTES .BYTE INTJ-MT ;INTERRUPT HANDLER .BYTE 240 ;PRIO FOR INTERRUPT SERVICE .BYTE 0 ;NO OPEN ENTRY .BYTE TRANS-MT ;TRANSFER ENTRY .BYTE CLOSJ-MT ;CLOSE ENTRY .BYTE SPECJ-MT ;SPECIAL FUNCTION ENTRY .BYTE 0 .IFDF DVRRWD MT.NAM: .RAD50 /QT/ .ENDC .IFNDF DVRRWD MT.NAM: .RAD50 /MT / .ENDC ; OPNFLG: .BYTE DD ; STORE CHARACTER INC STOADD ; UPDATE INC INTCNT ; POINTERS BEQ PR.DNE BIS #101,@#PR.CSR ; ENABLE RTI ; AND RETURN PR.ERR: PR.DNE: MOV @#PR.SAV,-(SP) ; SET UP JSR JSR R5,@(SP)+ PR.DIS: CLRB @#PR.CSR ; DISABLE INTERRUPT MOV PR,R0 ; DDB ADDRESS MOV INTCNT,R1 ; REMAINING COUNT BEQ PR.FRT ; NONE SUB #6,R1 ; ROUNDED TO WORDS (AND TEAR) ASR R1 MOV R1,16(R0) ; RETURN RESULT TO CALLER PR.FRT: JMP @14(R0) ; COMPLETION RETURN ; OPEN ROUTINE: PR.OPR: MOV PR.NAM,-(SP) ; AT: TST @#PP.CSR ; PUNCH OUT OF PAPER OR OFF BMI PP.ERR ; YES TST PPCT BEQ PP.DNE ; ALREADY FINISHED INC PPCT ; COUNT THIS ONE MOVB @PPFPT,@#PP.BRG ; MOVE CHARACTER TO PUNCH TSTB PP.TRL ; TRAILER OR NO BEQ PP.NOI ; TRAILER INC PPFPT ; NEXT ADDRESS OF BUF. PP.NOI: BIS #100,@#PP.CSR ; ENABLE INTERRUPT RTI ; RETURN PP.DNE: MOV @#PP.SAV,.+10 ; SAVE REGS FOR RETURN JSR R5,@#0 CLR @#PP.CSR ; DISABLE INTERRUPT PP.IGN: MOV PP,R0 ; CURRENT DDB JMP @14(R0) ; COMPLETION RETURN P-(SP) JSR R5,@(SP)+ MOV #DF.DCS,R1 ;ERROR CAUSE INTERRUPT? MOV (R1)+,R2 BMI DF.ERR ;YES - GO FIND CAUSE MOV DF,R0 ;GET DDB ADDRESS DF.XIT: MOV 14(R0),PC ;RETURN MONITOR ;ERROR ROUTINE: DF.ERR: BIT #11000,R2 ;PARITY OR MISSED? BEQ DF.OFF DF.AGN: ASL #0 ;YES - RETRIED 8 TIMES? DF.RTC=.-2 BCS DF.PER ;IF SO FORCE CONTINUE JSR PC,DF.RPT ;OTHERWISE TRY AGAIN DF.REC: MOV @#V.XIT,R5 JMP 4(R5) DF.PER: BIS #100000,12(R0) ;RETURN PARITY FAIL FLAG TST @R1 ;ALREADY AT BLOCK END? BEQ D0,0,0,0,0,0,0,0 ;SET BY OPEN ROUTINE,CLEARED BY CLOSE LCMMD: .BYTE -1,-1,-1,-1,-1,-1,-1,-1, ;1 BYTE FOR EACH DEVICE .BYTE 0,0,0,0,0,0,0,0 ;DEN/PAR FOR EACH DEVICE INTENB: .BYTE 0 INTRET: .WORD 0 ;ADDR FOR RET FROM INT HANDLER TCMMD: .BYTE 0 ;LAST CMMD SAVE LOCN FOR ERR RECOVERY ERRSW: .BYTE 0 ;SET BY ERR RECOVERY IF NOT RECOVERED RETRY: .WORD 0 ;RETRY COUNT FOR ERROR RECOVERY TRYCNT: .WORD -15. ;INITIAL RETRY COUNT LASTAT: .WORD 0 ;ADDR IN LCMMD VECTOR FOR INT HANDLER CMA: .WORD 0 BRC: DDITIONAL INFO MOV #402,-(SP) ;NOT READY - 1,2 ERR MSG IOT PR.OPN: TST @#PR.CSR ; TAPE READY BMI PR.OPR ; NO TST (SP)+ ;CLEAR CALL FROM STACK MOV PR,R0 ;GET DDB ADDRESS BR PR.FRT ; .... & TAKE COMPLETE RETN ; PR.BUF=177552 PR.CSR=177550 PR.BP=234 PR.SAV=44 .END P.ERR: MOV #63200,-(SP) ;SHOW DEVICE NAME MOV #402,-(SP) ; PRINT 1-2 ERR MSG IOT ; NOT READY BR PP.INT PP.OPN: PP.CLS: CLRB PP.TRL ; INDICATE TRAILER OPERATION MOV PC,-(SP) ADD #PP.TRL-.,@SP MOV (SP)+,PPFPT ; SET BUFFER ADDRESS MOV #177524,PPCT ; Z FOLDS TRAILER BR PP.UEN ; NORMAL FROM HERE ON ST.ATS=177776 PP.VCT=76 PP.CSR=177554 PP.BRG=177556 PP.SAV=44 PP.BP=332 PP.SPF=PP.IGN .END F.XIT ;IF SO EXIT NOW TST DF.RTC ;OTHERWISE CHECK IF 2ND TIME BEQ DF.OFF ;IF SO NO POINT IN MORE INC -(R1) ;CONTINUE DISK TRANSFER BR DF.REC ;... VIA COMMON EXIT ;ERROR IS NOT IMMEDIATELY RECOVERABLE: DF.OFF: CLR DF ;FREE DISK FOR EDP MOV -(R1),-(SP) ;DISK STATUS IS EVIDENCE MOV #DF.ENO,-(SP) ;SET UP ERROR NO. BIT #SDRVR,DFFLGS ;SYSTEM DRIVER? BEQ DF.SND ;NO - BRANCH CLR @SP ;CODE TO FORCE A HALT DF.SND: IOT ;GO TO DIAG. PRT. ;DEFINITIONS: DF.DCS=177460 DF.DIR=1 DF.ENO=1.WORD 0 ; INIT: MOV 12(R0),R1 ;GET UNIT NUM BIC #174377,R1 ;CLR EXTRA BITS MOV R1,@#MTC SWAB R1 ADD PC,R1 ADD #LCMMD-.,R1 ;ADDR IN LAST CMMD VECTOR MOV (SP)+,R4 ;SAVE RETURN ADDR MOV (SP)+,R5 ;SAVE ORIGINAL PC MOV @#PS,-(SP) ;SIMULATE INT CALL MOV R5,-(SP) MOV @#44,-(SP) ;SAVE REGS JSR R5,@(SP)+ MOV R4,-(SP) ;RESET CALLING PC MOV R1,LASTAT ;SAVE FOR INT HANDLER JSR PC,READY ;CHECK IF UNIT READY TSTB (R1) ;CHECK IF DEVICE INITIALIZED BPL INITX ;BRANCH IF IS MOVB #DENB; COPYRIGHT 1972 DIGITAL EQUIPMENT CORPORATION ;VERSION NUMBER V08 .TITLE DV.LP .IFNDF CENT .IFNDF LP11 LP11=80. ;DEFAULT TO 80. COLUMN LP-11 .ENDC .ENDC .IFDF LP11 LP.SIZ=LP11 ;NUMBER OF PRINT POSITIONS LP.SK2=12 ;LF -- TRANSLATION OF "SKIP-CH-2" (22) .ENDC .IFDF CENT LP.SIZ=CENT ;NUMBER OF PRINT POSITIONS LP.SK2=13 ;VT -- TRANSLATION OF "SKIP-CH-2" (22) .ENDC .GLOBL LP ;DRIVER FOR LP11 AND CENTRONICS 101 ;CHANGE LINES LP.NAM TO LP.SK2 FOR ;DEVICE DEPENDENT CHARACTER;COPYRIGHT 1971, 1972 DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V02 .TITLE DV.DT ; .GLOBL DT ;DECTAPE DRIVER VERSION 1 23 JULY 70 ; PRESENTLY CONTAINS ONLY ROUTINE FOR TRANSFER ; ;STANDARD DRIVER TABLE: DT: .WORD 0 ;BUSY FLAG (DDB ADDR WHEN BUSY) .BYTE 37,300 ;FACILITY INDICATOR .BYTE 16. ;STD BUFF SIZE/16. .BYTE DT.INT-DT ;POINTER TO INT SVCE .BYTE 340 ;INT SVCE PRIORITY .BYTE 0 ;DESPATCH TABLE .... .BYTE DT.TFR-DT ;...FOR TRANSFER ONLY! .BYTE 0 .BYTE 0426 V.XIT=42 V.RSAV=44 SDRVR=10000 .END ,10(R1) ;SET DEFAULT DEN=800,PAR=ODD CLRB (R1) ;CLEAR NON INIT STATE INITX: RTS PC ; SIMCOM: CLRB ERRSW ;CLEAR ERROR SWITCH TSTB INTENB ;BRANCH IF INT RET BNE MTEXIT TSTB -3(R0) ;BRANCH IF CALLED FROM QUEUE BNE MTEXIT ADD #20,SP ;REMOVE PC,PS AND REGS MTEXIT: CLRB INTENB JMP @14(R0) ;COMPLETION EXIT ; ; ; ; GO: MOV (SP)+,INTRET ;SAVE INT RETURN ADDR GOA: MOV CMA,@#MTCMA MOV BRC,@#MTBRC CMPB (R1),#WRITE ;CHECK IF THIS IS A WRITE BNE GO2 ;BRANCH IF NOT GO1: BIT #WRL,@#MISTICS LP: .WORD 0 ;CURRENT DDB PTR .BYTE 322 ;FACILITIES INDICATOR .BYTE 0 .BYTE 3 ;NO. BUF UNITS/BUFFER ;(ALLOWS 96 BYTES/TRAN) .BYTE LP.INT-LP ;INTERRUPT ENTRY .BYTE 200 ;INT STATUS (PRI=4) .BYTE LP.OPN-LP ;OPEN ENTRY .BYTE LP.TRN-LP ;TRAN ENTRY .BYTE LP.CLS-LP ;CLOSE ENTRY .BYTE 0,0 ;SPECIAL,SPARE LP.NAM: .RAD50 /LP/ ;DEVICE NAME LP.CSR=177514 ;CSR ADDR LP.TRP=200 ;TRAP VEC ADDR ;FOR LP11, USE 12(LF) ;FOR CENTRONICS, USE 13(VT) LP.LIN: .WORD 0 ;# CHARS .BYTE 0 ;SPARE DT.NAM: .RAD50 'DT' .WORD DT.DIR ;FIXED MFD BLOCK .WORD 0,0,0,0,0,0,0,0 ;POINTERS FOR BIT MAP ACCESS ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;SET UP TRANSFER: DT.TFR: MOV @PC,DT.RTC ;SET RETRY COUNT DT.PR1: MOV DT,R0 ;GET ADDRESS OF DDB ... MOV #DT.CBA,R1 ;... & OF HWR BLOCK CLR @R1 CMP (R0)+,(R0)+ ;SKIP USER LINE IN DDB MOV (R0)+,DT.BRQ ;SAVE BLOCK NO FOR LATER MOV (R0)+,@R1 ;SET READY MEMORY ADDR ... MOV (R0)+,-(R1) ;... &;COPYRIGHT 1971,1972 DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V03 ; .TITLE DV.KB ;DRIVER FOR TELETYPE MODEL ASR33 NOV 70 ; ;CONSIDERS TELETYPE AS 2 DEVICES:- ; A) KEYBOARD & PRINTER TERMINAL ("KB") ; B) PAPER TAPE READER/PUNCH ("TT") ; ;KB INPUT WILL BE ACCEPTED AND BUFFERED INTERNALLY, ; INDEPENDENTLY OF PROGRAM REQUESTS FOR DATA, AS ; LONG AS SPACE REMAINS. DATA WILL BE PASSED TO THE PROGRAM ; AT MONITOR REQUEST, ONE LINE AT A TIME, WHERE A ; LINE IS DEFINED AS A SET OTS ;CHECK IF WRITE LOCK ON BEQ GO2 ;BRANCH IF NOT JSR PC,READY1 ;ISSUE ACTION MSG BR GO1 ;GO TEST IF LOCK STILL ON GO2: JSR PC,READY ;CHECK IF DEVICE READY BISB 10(R1),@#MTC+1 ;SET DEN AND PAR BIS #INT+GOB,R2 ;SET INT ENB AND GO BITS MOVB R2,@#MTC ;ISSUE INSTRUCTION GO3: MOV @#46,-(SP) ;RESTORE REGS JSR R5,@(SP)+ RTI ;RETURN TO INTERRUPT ; ; READY1: MOV MT.NAM,-(SP) ;ISSUE ACTION DIAG - MOV #402,-(SP) ;DEVICE NOT READY IOT READY: BIT #SELR,@#MTS ;TEST IF DEVICE READY BEQ R SENT FOR THIS LINE LP.BKS: .WORD 0 ;BLANK COUNTER BTCT: .WORD 0 ;TRAN CHAR COUNT (COMPL) BUFAD: .WORD 0 ;BUF PTR ;REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 LP.FRM: .BYTE 15,14 ;CR,FF ;OPEN AND CLOSE LP.OPN:LP.CLS: JSR PC,LP.STS ;SIM INT ADD #LP.FRM-.,R1 ;R1=PC BY LP.STS MOV R1,BUFAD ;ADDR OF CR,FF MOV R2,BTCT ;R2=-2 BY LP.STS BR LP.INT ;TRAN LP.TRN: JSR PC,LP.STS ;SIM INT MOV LP,R0 ;DDB ADDR MOV 6(R0),BUFAD ;SAVE BUF ADDR MOV 10(R0 WORD COUNT DT.PR2: CLRB DT.INT ;SET INT'RUPT SW. TO SRCH MOV DT.BRQ,DT.BCK ;SET BLK CTRL FOR SRCH MOV #100,R3 ;USED IN NEXT SEQUENCE MOV R3,DT.TAC ;SET TURN AROUND COUNT MOV @R0,-(SP) ;GET UNIT, DIRECTION & FUNC BIC #170341,@SP ;CLEAR POSS. GARBAGE BIS R3,@SP ;ADD IN INT ENB BIT BITB @SP,@PC ;WRITE REQD? BEQ .+6 ;(READ O.K. ALRDY)***** ADD #12,@SP ;IF SO GET DECTAPE EQUIV. MOVB @SP,DT.FRQ ;SAVE FUNC FOR LATER MOVB @PC,@SP ;RESET FUNC TO SRCH (INT ENB) ASL R3 ;(NOW CONTAIN!F CHARACTERS TERMINATING ; AT EACH OCCURENCE OF LINE-FEED, VERTICAL TAB OR ; LINE-FEED. THE LINE WILL ALSO BE ECHOED AT THE ; PRINTER (SUBJECT TO PROGRAM OR OPERATOR CONTROL) ; WHEN TRANSFERRED TO THE PROGRAM. ; DURING PROCESSING, THE FOLLOWING CHARACTERS WILL ; RECEIVE TREATMENT SHOWN:- ; ; ESC (OR ALT MODE) - WILL CAUSE NEXT CHARACTER ; TO LOSE ANY SPECIAL PROPERTIES I.E. AS ; GIVEN BELOW OR AS TERMINATOR ; CTL/U - WILL DELETE CURRENT LINE, IF ANY INPUT EXISTS. ; (WILL CAUSE ECHO OF CR-L"EADY1 ;BRANCH IF NOT BIT #GAPSDN,@#MTRD BNE READYX BIT #TUR+RWS+SDWN,@#MTS BEQ READY1 READYX: RTS PC ;RETURN TO CALLER ; INTJ: JMP INTH SPECJ: JMP SPEC CLOSJ: JMP CLOSE ; ; TRANS: JSR PC,INIT ;INIT CHECK DEVICE MOV 6(R0),CMA ;SET BUFF ADDR MOV 10(R0),BRC ;SET WORD COUNT ASL BRC ;CVT TO BYTE COUNT MOV 12(R0),R2 BIC #177713,R2 ;CLR ALL BUT READ AND ADDR EXT BITS BIT #4,R2 ;CHECK INPUT/OUTPUT BEQ TRANO ;BRANCH IF OUTPUT MOVB #READ,(R1) ;SET LAST CMMDSREAD SUB #2,R2 ;S#),BTCT ;DDB WORD COUNT ASL BTCT ;CHANGE TO BYTES ;INTERRUPT LP.INT: LP.DIS: BIC #100,@#LP.CSR ;DISABLE TST @#LP.CSR ;ERROR TEST BMI LP.ERR ;NO ERROR,SO CONTINUE MOV R2,-(SP) MOV R1,-(SP) MOV LP.LIN,-(SP) TST BTCT ;CURRENT BYTE RESIDUE BEQ LP.DNE ;DONE (NO MORE) MOV BUFAD,R2 ;CURRENT BUF ADDR LP.LOP: ;MAIN LOOP MOVB (R2)+,R1 ;NEXT CHAR BEQ LP.DNP ;SKIP IF NULL LP.LPB: ;NOTE: THE NEXT FOUR INTRUCTIONS MAY BE DELETED, ; IF TRAILING SPACE SUPPRESSION IS NOT NEEDED $S 200)***** BIT @SP,#4000 ;TRAVEL FORWARD? BNE .+4 INC R3 ;IF SO R3 NOW 201 & SO ... MOVB R3,DT.SSW ;MAKING BPL OR BMI AS REQD MOV (SP)+,-(R1) ;SET DECTAPE CONTROL RTS PC ;RETURN TO CALLER FOR NOW ;***** CARE USED AS LITERAL BY PREVIOUS INSTRUCTION!!! ;INTERRUPT SERVICE (A) - SEARCH IN PRORESS: DT.SIP: TST @#DT.CCM ;CHECK STATUS BMI DT.SER ;IF ERROR GO INVESTIGATE CMP @#DT.CDT,DT.BRQ ;CHECK BLOCK FOUND BEQ DT.BFD ;IF ONE REQD, GO ACTION BMI DT.SXT ;GET TO BLOCK THIS WAY? DT.S%F ALSO (REV.7/4/71) ; IF NONE, WILL TERMINATE CURRENT LINE OF OUTPUT. ; RUBOUT - WILL ERASE PREVIOUS VALID CHARACTER IN ; THE LINE. IT WILL BE ECHOED:- \(DEL.CHAR.) ; SUCCESSIVE RUBOUTS WILL PRODUCE STRING ; OF DELETED CHARS. (IN REVERSE) BETWEEN ; \...\. IT WILL BE IGNORED IF NO CHARS. ; ARE AVAILABLE FOR DELETION ; RETURN - WILL ECHO RETURN/LINE-FEED (WILL ; THEREFORE ALSO ACT AS TERMINATOR) ; OTHER CHARACTERS MAY PRODUCE SPECIAL ECHO (SEE ; KB OUTPUT BELOW) ; ;KB OUTPUT WILL ALSO &ET UP READ CMMD BR TRAN2 TRANO: BIT #EOT,@#MTS ;CHECK IF AT EOT BEQ TRAN1 ;BRANCH IF NOT MOV 10(R0),16(R0) ;RETURN WORD COUNT TRAN7: BR SIMCOM ;REJECT CMMD - EXIT TRAN1: MOVB #WRITE,(R1) ;SET LAST CMMD S WRITE ADD #4,R2 ;SET UP WRITE CMMD TRAN2: JSR PC,GO ;GO INITIATE I/O MOV @#MTBRC,R2 CMPB (R1),#READ ;COME HERE AFTER INT ERR CHK BNE TRAN6 ;BRANCH IF NOT READ BIT #EOF,@#MTS ;IF EOF, SET INIT CNT IN RESIDUE BEQ TRAN6 MOV BRC,R2 TRAN6: ASR R2 ;CHECK IF ODD BYTES SHORT REC BC'-- ; TRAILING TABS WILL STILL BE SUPPRESSED, HOWEVER... CMPB R1,#40 ;BLANK? BNE .+10 INC LP.BKS ;JUST INC BLANK COUNT AND MOVE ON BR LP.TRT CMPB R1,#13 ;VT? BEQ LP.DNP CMPB R1,#22 ;CHANNEL 2? BNE .+6 ;NO MOVB #LP.SK2,R1 ;YES, TRANSLATE CMPB R1,#177 ;RUBOUT? BEQ LP.DNP TSTB @#LP.CSR ;CHECK DEVICE READY BPL LP.STI ;QUIT IF NOT ;DEVICE CAN ACCEPT ANOTHER CHAR ;PROCEED TO CHECK CMPB R1,#11 ;TAB? BEQ LP.PTB ;YES, GO SIMULATE IT BLO LP.CLO ;NOT A TERMINATOR EITHER C(SW=.-1 ;(BPL IF TRAVEL BACKWARD) DT.TA1: BICB #40,@#177776 ;DROP PRIORITY ASRB #0 ;HOW MANY TURNS? DT.TAC=.-2 BCS DT.BER ;IF 6 CAN'T FIND BLOCK MOV #4000,-(SP) ;OTHERWISE MUST TURN AROUND MOV #2,-(SP) ;ASSUME TRAVEL NOW FWD RORB DT.SSW ;CHECK DIRECTION BCS DT.TA2 ;IF FWD OMIT NEXT NEG 2(SP) ;IF BWD, REVERSE EVERYTHING NEG @SP DT.TA2: SUB (SP)+,DT.BRQ ;ALLOW 2 BLKS FOR 2ND TURN ADD (SP)+,@#DT.CCM ;SWITCH STATUS ROLB DT.SSW ;RESET DIR SW (C BIT REVERSES) DT.SXT: INCB @#DT.CCM)BE EFFECTED ON A LINE-BY LINE ; BASIS. THE FOLLOWING CHARS. WILL BE ECHOED AS ; SHOWN:- ; ; ALL CTL CHARS. (OTHER THAN THOSE FOR FORM CONTROL ; WILL APPEAR:- ^(CORR. CHAR.) ; HORIZONTAL TAB WILL BE REPLACED BY SPACES ON ; A MODULO-8 BASIS. ; FORM-FEED WILL BE REPLACED BY LINE-FEEDS ON A ; MODULO-8 BASIS. ; VERTICAL TAB, RUBOUT (IF NOT RESULT OF KEYBOARD ECHO) ; & NULL WILL BE IGNORED. ; N.B. ECHO WILL OCCUR ALSO IF APPROPRIATE CHAR APPEARS ; WITHIN DELETE STRING ON INPUT. ;TT INPUT AN*C TRAN3 ;BRANCH IF NOT MOV @#MTCMA,R5 ;PUT NULL IN NEXT BUFF POS CLRB (R5) INC R2 ;ROUND UP WORD COUNT TRAN3: BEQ .+6 ;BRANCH IF NO RESIDUE BIS #100000,R2 ;INSURE NEG WORD COUNT BIT #RLE,@#MTS ;CHECK IF LENGTH ERROR BEQ TRAN4 ;BRANCH IF NOT INCB ERRSW TRAN4: MOV R2,16(R0) ;RETURN RESIDUE WORD COUNT TRANX: TSTB ERRSW ;BRANCH IF NO ERRORS BEQ TRAN5 BIS #100000,12(R0) ;SET ERR BIT TRAN5: BR TRAN7 ;TAKE DONE EXIT ; SPEC: JSR PC,INIT ;INIT CHECK DEVICE MOV 2(R0),R3 ;GET FUNC B+MPB R1,#15 ;CR,FF,VT,LF? BHI LP.CLO ;NO BEQ LP.RSC ;TREAT CR SPECIALLY ;GUARANTEE CR BEFORE TERMINATORS LP.TRM: TST @SP ;AT BEGINNING OF LINE? BEQ LP.RSB ;YES ;NO, FORCE CR DEC R2 DEC BTCT MOVB #15,R1 LP.RSC: ;RESET COUNTS CLR @SP ;NEW LINE BR LP.RSB LP.CLO: ;CHECK LINE OVERFLOW CMP @SP,#LP.SIZ BGE LP.DNP ;SKIP IF FULL INC @SP ;ELSE COUNT LINE CHARS DEC LP.BKS ;CHECK BLANK COUNT BMI LP.RSB ;GO AHEAD IF NO BLANK COUNT MOVB #40,@#LP.CSR+2 ;OTHERWISE, P, ;CONTINUE SEARCH RTI ;WAIT NEXT BLOCK ;BLOCK FOUND - CHECK TRAVEL CORRECT: DT.BFD: CMP #0,#0 ;TRAVEL AS ORIGINALLY STORED? DT.BRQ=.-4 DT.BCK=.-2 BNE DT.TA1 ;IF NOT MUST TURN AGAIN INCB DT.INT ;RESET INT'RUPT SW FOR TFR MOVB #0,@#DT.CCM ;MOVE IN CORRECT FUNC DT.FRQ=.-4 BR DT.SXT ;... & GO SET UNDERWAY ;INTERRUPT SERVICE (B) - TRANSFER COMPLETE (?): DT.INT: BR .+2 ;INTERRUPT SWITCH .... BR DT.SIP ;FOR SRCH COMES HERE! BICB #40,@#177776 ;DROP PRIORITY MOV @#V.RSAV,-(SP) ;ON T-D OUTPUT WILL BE PASSED DIRECTLY TO OR FROM ; THE PROGRAM, AT MONITOR REQUEST ONLY, AND IT ; WILL NOT BE PROCESSED IN ANY WAY, (INCLUDING NO ; INPUT ECHO). ; NEITHER WILL BE ALLOWED TO PROCEED WHILE ; THE CORRESPONDING KB COMPONENT IS ACTIVELY ; ENGAGED VIZ. KEYBOARD WAITING INPUT TO SATISFY ; A MONITOR REQUEST OR PRINTER IN THE MIDDLE OF ; OUTPUT FROM MONITOR OR LINE OF INPUT ECHO.(& VICE ; VERSA). ; HOWEVER IN ORDER THAT BOTH READER & PUNCH MAY BE ; CONCURRENTLY IN USE THE ROUTINES TO HANDLE .LOCK ADDR MOVB (R3),R5 ;GET FUNC BYTE SUB #SPFST,R5 BMI TRAN5 ;BRANCH OUT IF NOT CMP #SPLST,R5 ;SUPPORTED FUNCTION BLO TRAN5 CMPB #3,1(R3) ;CHECK IF VALID FUNC BLOCK BHI ABORT ;ABORT IF NOT ASL R5 ADD PC,R5 ADD #SPECT-.,R5 JMP @R5 ;GO TO PROPER SP FUNC ROUTINE ; ; SPFST=1 SPLST=6 ; SPECT: BR OFFLIN BR WEOF BR RWND BR SKP BR BSP BR PARDEN BR TUSTAT ; ; ABORT: MOV R3,-(SP) ;ISSUE SP FUNC BLOCK BAD ABORT MOV #1433,-(SP) ;WITH ADDR OF SP FUNC BLOCK IOT ; OFF/UT OUT A BLANK BR LP.LPB ;AND TRY AGAIN LP.RSB: CLR LP.BKS ;SHOW NO BLANKS WAITING FOR PRINT LP.TBF: MOVB R1,@#LP.CSR+2 ;OUTPUT CHAR LP.DNP: LP.TRT: INC BTCT ;UPDATE BUF RESIDUE BNE LP.LOP ;MORE? ;DONE FOR NOW TSTB @#LP.CSR ;DEV BUSY? BPL LP.STJ ;YES LP.DNE: ;NO, SO NO INTERRUPT MOV (SP)+,LP.LIN ;RESTORE TEMPORARIES MOV (SP)+,R1 MOV (SP)+,R2 MOV @#S.RSV,-(SP) JSR R5,@(SP)+ ;SAVE REGS MOV LP,R0 ;DDB PTR JMP @14(R0) ;DDB COMPLETE - EXIT ; LP.STI: DEC R2 ;0RANSFER COMPLETE ... JSR R5,@(SP)+ ;SAVE USER REGISTERS MOV DT,R0 ;GET DDB ADDR MOV #DT.CCM,R1 ;GET STATUS ADDR MOV #10,R3 ;SET MAGIC CONSTANT TST @R1 ;ERROR CAUSE INT'RUPT? BMI DT.TER ;IF SO GO & SEE WHY MOVB R3,@R1 ;OTHERWISE STOP TAPE ... DT.TXT: MOV 14(R0),PC ;... & TAKE COMPLETE RETN ;SEARCH ERROR - DETERMINE CAUSE: DT.SER: TST @#DT.TST ;IN END ZONE? BMI DT.TA1 ;O.K. MEANS TURN AROUND BICB #40,@#177776 ;DROP PRIORITY MOV @#V.RSAV,-(SP) ;SAVE ALL USER REGS. JSR R5,@(SP)1THESE ; DEVICES WILL MAINTAIN THEIR OWN INDICATORS OF ; THEIR STATE OF READINESS FOR USE AND WILL CAUSE ; TT ALWAYS TO APPEAR IDLE TO THE MONITOR(THEY ; WILL ALSO SCREAM IF THE PROGRAM TRIES TO MAKE ; THEM DO MORE THAN ONE TASK AT A TIME!!!!) ; THE DRIVER HAS NO MEANS OF KNOWING WHEN THE READER ; OR PUNCH IS PHYSICALLY 'IN GEAR'. THE USING ; PROGRAM MUST THEREFORE TAKE THE RESPONSIBILITY ; FOR NOTIFYING THE OPERATOR OF ITS REQUIREMENTS ; IN THIS RESPECT. ; ;FOR BOTH TT AND KB, THE USER MUST U2LIN: JSR PC,EOFCK ;WRITE EOF IF NECESSARY CLRB (R1) ;SET LAST CMMD=OFFLINE MOVB #1,@#MTC ;ISSUE DISABLED RWV BR TUSTAT ;GET STAT AND EXIT RWND: JSR PC,EOFCK ;ISSUE WRITE EOF IF NECESSARY JSR PC,RWNDC ;ISSUE DISABLED RWD BR TUSTAT ;GET STATUS AND EXIT RWNDC: MOVB #RWD,(R1) ;SET LAST CMMD=RWD .IFDF DVRRWD BR RWNDX ;BYPASS REWIND .ENDC BIT #BOT+RWS,@#MTS ;IS IT REWOUND BNE RWNDX ;YES, BRANCH MOV #16,R2 ;ISSUE RWD JMP GO RWNDX: RTS PC ; EOFCK: CMPB (R1),#WRITE ;IF LAST CMMD WA3SET TO RESCAN BYTE LP.STJ: MOV (SP)+,LP.LIN ;SAVE COUNTS FOR INTERRUPT MOV R2,BUFAD MOV (SP)+,R1 ;RESTORE REGS MOV (SP)+,R2 BIS #100,@#LP.CSR ;ALLOW INTERRUPT RTI ;RETURN TO USER LP.ERR: ;ERROR ON DEVICE MOV LP.NAM,-(SP) ;SHOW DEVC NAME MOV #402,-(SP) ;GIVE 1-2 ERR CODE IOT BR LP.DIS ;TRY AGAIN ; ;INTERRUPT SIMULATOR LP.STS: MOV (SP)+,R1 ;RTN PC MOV (SP),-(SP) ;OLD PC CLR R2 ;ADDRESS PS (-2) MOV -(R2),2(SP) ;OLD STATUS MOV @#LP.TRP+2,(R2) ;NEW STATUS MOV R1,PC ;RET4+ MOV #DT.TST,R1 ;GET DECTAPE STATUS DT.EXT: MOV @R1,-(SP) ;SET UP TO TELL USER MOV #DT.IRE,-(SP) BIT #14000,(R1)+ ;.... ASSUMING H-W FAILURE BEQ DT.STP ;.... IF SEL OR ILO MOV #DT.NRE,@SP ;DIAGNOSE TAPE FAULT DIFF. MOV DT.NAM,2(SP) ;... AS NOT READY DT.STP: MOVB #10,@R1 ;STOP TAPE IN CASE IOT ;GO TO DIAG PRINT DT.RXT: JSR PC,DT.PR1 ;ON RECOVERY, SET UP RETRY MOV @#V.RRES,R5 ;RESTORE USER REGS JSR R5,@R5 RTI ;... & HOPE FOR BETTER THINGS! ;BLOCK NOT FOUND IN SEARCH: DT.BER: 5SE A MONITOR KEYBOARD ; CALL TO INDICATE END OF AVAILABLE DATA. ; ;N.B. 1) IN USE FLAGS OPERATE AS FOLLOWS:- ; ; TT.ISW & TT.OSW:= WHEN IN USE CONTAIN ADDRESS ; OF DDB FOR DATASET UNDER SERVICE. ; IF ACTUALLY UNDERWAY, THIS WILL ; APPEAR AS A POSITIVE VALUE. IT ; WILL BE NEGATED IF THAT SERVICE ; MUST WAIT FOR KB TO RELEASE ; APPROPRIATE DEVICE. ; KB.ISW:= WILL BE SET ONLY IF INPUT ; NEEDED BY THE PROGRAM IS NOT ; IMMEDIATELY AVAILABLE. WILL ; CONTAIN PTR TO LAS6S WRITE BEQ EOFCK1 ;BRANCH RTS PC ;ELSE RETURN EOFCK1: MOV #6,R2 ;SET CMMD=WRITE EOF MOV (SP)+,INTRET ;SET INT RET ADDR JMP GO1 ;GO EXECUTE ; WEOF: MOVB #EOFM,(R1) ;SET LAST CMMD JSR PC,EOFCK1 ;GO EXECUTE WRITE EOF BR TUSTAT ;AT INT RET, GET STAT AND EXIT ; ; PARDEN: BIT #CH79,@#MTS ;IF 9 TRACK TAPE BEQ TUSTAT ;BRANCH (IGNORE NEW SETTINGS) MOV 4(R3),R5 ;GET NEW DEN/PAR BIC #176376,R5 ;CLR EXTRA BITS ASRB R5 ;SET INTO PROPER POSITION RORB R5 RORB R5 ROR R5 ROR R5 RURN ; ;TAB SIMULATOR LP.PTB: MOV @SP,-(SP) ;CURRENT LINE POSITION ADD LP.BKS,@SP ;+ACCUMULATED BLANKS BIS #177770,@SP ;MOD(X,8)-8 SUB (SP)+,LP.BKS ;ADD 1 TO 8 BLANKS BR LP.TRT ;MOVE ON S.STAT=177776 ;PS ADDR S.RSV=44 ;ADDR OF REGSAVE ROUTINE .END LP FMOV DT.BCK,-(SP) ;GIVE BLOCK NO. AS EVIDENCE MOV #DT.BRE,-(SP) MOV #DT.CCM,R1 ;GET CONTROL ADDRESS BR DT.STP ;TRANSFER ERROR: DT.TER: BIT #34000,-(R1) ;TAPE FAILURE/OPERATOR FAULT? BNE DT.EXT ;IF SO PRINT & WAIT RECOVERY BIT #100400,(R1)+ ;END ZONE/N.E.M? BNE DT.FER ;IF SO TREAT AS FATAL ;RECOVERABLE ERRORS (TIMING OR PARITY): ASL #0 ;RETRIED 8-9 TIMES ALRDY? DT.RTC=.-2 BCC DT.RXT ;IF NOT TRY AGAIN .... BIS #100000,12(R0) ;OTHERWISE SIGNAL ERROR MOVB R3,(R1)+ ;STOP TAPE IN CASGT CHAR. IN ; ECHO SCAN. ; KB.OSW:= WILL BE SET TO 1 WHILE ; PRINTER IS OPERATING ON OUTPUT ; & NEGATIVELY DURING INPUT ECHO. ; IN LATTER CASE REMAINS SET UNTIL ; LINE TERMINATOR HAS BEEN DESPATCHED ; ; 2) ON ENTRY FROM MONITOR, BOTH TT & KB EXPECT ; R0 SET TO DDB ADDRESS & R5 TO THAT OF ; PROCESSOR STATUS REGISTER (AS CURRENTLY ; PROVIDED BY S.CDB) .GLOBL KB ;REGISTER ASSIGNMENTS: R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TKS=177560 TKB=TKS+2 TPS=177564 TPEOR R5 MOVB R5,10(R1) ;SET NEW DEN/PAR BR TUSTAT ; SKP: MOVB #SKPR,(R1) ;SET LAST CMMD=SKP MOV #8.,R2 ;SET CMMD BR SKPBSP ;GO SET COUNT AND EXEC BSP: MOVB #BSPR,(R1) ;SET LAST CMMD=BSP MOV #10.,R2 ;SET CMMD BIT #BOT+RWS,@#MTS ;TEST IF AT BOT BEQ SKPBSP ;BRANCH IF NOT MOV 4(R3),6(R3) ;REJECT CMMD RETURN REC COUNT BR TUSTAT ;SET STATUS AND EXIT SKPBSP: MOV 4(R3),BRC ;SET RECORD COUNT NEG BRC JSR PC,GO ;GO EXECUTE CMMD MOV @#MTBRC,6(R3) ;SET RESIDUE REC COUNT NEG 6(R3) ; H .IFDF LOWDEN .TITLE DV.DKL .ENDC .IFNDF LOWDEN .IFNDF CONFIG .TITLE DV.DKH .ENDC .IFDF CONFIG .IFNZ CONFIG&1 .TITLE DV.DKL .IFF .TITLE DV.DKH .ENDC .ENDC .ENDC ;DISK DRIVER (RK11) VERSION V06 ; 002 ;COPYRIGHT DIGITAL EQUIPMENT CORPORATION ;MAYNARD, MASSACHUSETTS JUNE 1971, 1972 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 PC=%7 RKDS=177400 RKER=177402 RKCS=177404 RKWC=177406 RKBA=177410 RKDA=177412 RKDIR=1 V.RSAV=44 V.XIT=42 PS="""DDDDDDD """@""""@DD""""""""""""""""ADDB CkQ1`TkQ]fkQ$fkQMkQ 3 kQ JEkQ|1kQ/7 dxkQ=NbkQ*a $D ! 8a ͋,L  Bw&B ` % & }&*C$$Βe E%>k  aʋaՀ$ & * P$ ΋Ί   ΋   d Ί  ( 1'u  Q$f $5@ U C΋ Cb M΋U@ U &  B" .&0 M ITUSTAT: MOVB 10(R1),R2 ;GET DEN/PAR MOVB (R1),R1 ;GET LAST CMMD SWAB R2 BIS R2,R1 ;SET DEN AND PAR MOV @#MTS,R2 BIT #CRE+PAE+RLE,R2 ;TEST STATUS FOR ERROR BEQ STAT1 ;BRANCH IF NONE BIS #100000,R1 ;SET ERR BIT STAT1: BIT #EOT,R2 ;TEST IF EOT BEQ STAT2 ;BRANCH IF NOT BIS #1000,R1 ;SET EOT BIT STAT2: BIT #BOT+RWS,R2 ;TEST IF AT BOT BEQ STAT3 ;BRANCH IF NOT BIS #400,R1 ;SET BOT BIT STAT3: BIT #EOF,R2 ;TEST IF EOF BEQ STAT4 ;BRANCH IF NOT BIS #200,R1 ;SET EOF BIT STAT4: BJE MOV 1(R1),R2 ;...BUT CHK ALL WORDS DONE! BEQ DT.TXT ;IF SO THAT'S IT! ADD R3,R0 ;GO TO WORD COUNT IN DDB SUB (R0)+,R2 ;... & USE TO DETERMINE ... SWAB R2 ;... NO. OF BLOCKS DONE BITB R3,(R1)+ ;CHECK PRESENT TRAVEL BEQ .+4 ;ADJUST NO. ACCORDINGLY NEG R2 ADD R2,DT.BRQ ;MODIFY SEARCH START BLOCK CLR DT.RTC ;... & RETRY COUNT JSR PC,DT.PR2 ;GO SET UP NEW START BR DT.RXT+4 ;... & WAIT RESULTS! ;FATAL ERRORS - END ZONE OR NON-EXISTENT MEMORY: DT.FER: MOV @R0,-(SP) ;GIVE CALL AS KB=TPS+2 ;DESCRIPTION TABLE - TERMINAL DEVICE (KB): KB: .WORD 0 ;BUSY FLAG .BYTE 327 ;FACILITIES: I/O,ASC,M/U,OPN,CLS .BYTE 1 ; ALSO TERMINAL .BYTE 2 ;STD BUFFER = 32 WORDS .BYTE KB.INT-KB ;POINTER TO INT SVCE KB.PSP: .BYTE 200 ;INT SVCE PRIORITY ;ALSO USED AS PRINT SUPPRESS SW. .BYTE KB.OPN-KB ;DESPATCH TABLE TO ROUTINES .BYTE KB.TFR-KB .BYTE KB.CLS-KB .BYTE 0 ;CURRENTLY NO SP. FUNC. .BYTE 0 .RAD50 "KB" ;DESCRIPTION TABLE - PAPER TAPE DEVICE (TT): TT: .WORD 0 ;AS L177776 SDRVR=10000 .GLOBL DK ;STANDARD DOS INTERFACE TABLE DK: .WORD 0 ;0 IF IDLE, DDB PTR OTHERWISE DKFLGS: .WORD 102037 ;FACILITES WORD .BYTE 20 ;STD BUFFER SIZE IS 256. WORDS .BYTE DKINT-DK ;OFFSET TO INTERRUPT HANDLER .BYTE 240 ;PRIORITY LEVEL 5 .BYTE 0 ;NO OPEN ROUTINE .BYTE DKSTRT-DK ;OFFSET TO TRANSFER HANDLER .BYTE 0 ;NO CLOSE ROUTINE .BYTE 0 ;NO SPECIAL FUNCTIONS .BYTE 0 ;CURRENTLY UNUSED DKNAM: .RAD50 /DK/ ;DEVICE NAME .WORD RKDIR ;FIRST MFD BLOCK .WOMIC #177753,R2 ;CLEAR ALL BUT WRL AND 79CH BITS SWAB R2 BIS R2,R1 ;SET WRL AND 7,9 TRACK MOV R1,2(R3) ;RETURN STATUS BR COMJ ;EXIT ; ; ; CLOSE: JSR PC,INIT ;INIT CHECK ON DEVICE CLRB -10(R1) ;CLEAR OPEN FLAG JSR PC,EOFCK ;IF LAST CMMD WAS WRITE, WRITE 3 EOFS JSR PC,EOFCK JSR PC,EOFCK .IFDF DVRRWD ; ; ISSUE 2 BSPS INSTEAD OF RWD IF OUTPUT ; OR SKIP TO END OF FILE IF INPUT ; CMPB (R1),#WRITE ;IF LAST CMMD WAS WRITE BNE CLOSE1 MOV #10.,R2 ;ISSUE 2 BSPS MOV #-1,BRC MOVBEVIDENCE MOV #DT.FRE,-(SP) ;PRINT DIAGNOSIS BR DT.STP ;MISCELLANEOUSDEFINITIONS: V.RSAV=44 V.RRES=46 DT.DIR=100 DT.TST=177340 DT.CCM=177342 DT.CBA=177346 DT.CDT=177350 DT.NRE=402 DT.IRE=404 DT.FRE=1415 DT.BRE=1416 .END OFOR KB (EXCEPT NOT TERMINAL) .BYTE 327 .BYTE 0 .BYTE 1 .BYTE TT.INT-TT TT.EDI: .BYTE 200 ;ALSO USED AS DATA END FLAG .BYTE TT.OPN-TT .BYTE TT.TFR-TT .BYTE TT.CLS-TT .BYTE 0 .BYTE 0 .RAD50 "TT" KB.INT: TT.INT: JMP KT.INT ;COMMON ENTRY TO INT SVCE ;PAPER-TAPE SET-UP ROUTINES: ; 1) OPEN & CLOSE: ; ON OUTPUT REQUEST, OPEN & CLOSE WILL GENERATE ; APPROX. 6 INCHES OF BLANK TAPE AS ; LEADER OR TRAILER. ; FOR INPUT, ONLY ACTION WILL BE CLEARANCE OF ; ANY CURRENT END OF DATA IPRD 0,0,0,0,0,0,0,0 ;BIT MAP POINTERS DKSTRT: MOV @PC,DKREPT ;CLEAR RETRY INDICATOR DKRTRY: MOVB 13(R0),R1 ;GET UNIT IN R1(13-15) BIC #177770,R1 .IFDF MIXED .IFNDF LOWDEN MOV R1,R4 ;SAVE UNIT FOR LATER USE .ENDC .ENDC ASR R1 ;LEFT-JUSTIFY UNIT ROR R1 ROR R1 ROR R1 ;UNIT NOW AS DESIRED CMP (R0)+,(R0)+ ;POINTER DDB+BLOCK MOV (R0)+,R2 .IFDF MIXED .IFNDF LOWDEN MOV (PC)+,R3 ;GET DENSITY PATTERN .WORD CONFIG ASL R3 ;MOVE APPROP. TO UNIT DEC R4 BGE .-4 BCC .+4 ;IFQ #BSPR,(R1) ;THIS IS SOLELY FOR INT ERR CHK JSR PC,GO MOV #10.,R2 BR CLOSE2 ; CLOSE1: BIT #EOF,@#MTS ;SKIP TO EOF UNLESS ALREADY THERE BNE CLOSE3 MOV #8.,R2 CLR BRC MOV #SKPR,(R1) CLOSE2: JSR PC,GO .ENDC CLOSE3: JSR PC,RWNDC ;ISSUE DISABLED RWD COMJ: JMP SIMCOM ; ; ; ; INTH: MOV @#44,-(SP) ;SAVE REGS JSR R5,@(SP)+ MOV MT,R0 ;GET DDB ADDR MOV LASTAT,R1 ;GET LCMMD VECTOR ADDR MOV 2(R0),R3 ;GET SP FNC BLOCK ADDR MOV #MTC,R5 ;ADDR OF CMMD REG BIC #100,(R5) ;DISABLE DEVIR;COPYRIGHT 1971, 1972 DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V01 ; .TITLE DV.DC ;DISK DRIVER (RC11) VERSION 1 ; IF RC11 IS THE SYSTEM DISK, A SHORT FORM OF THIS ; DRIVER MAY BE OBTAINED BY INCLUDING A DEFINITION ; FOR 'SYSDV'. FOR A SYSTEM BASED ON A DIFFERENT ; DISK, THIS DRIVER MAY BE ASSEMBLED WITH A ; DEFINITION AND RC11 MAY THEN BE TREATED AS JUST ; ANOTHER DEVICE. ; ; THIS VERSION CONTAINS SET-UP & TRANSFER ; ROUTINES ONLY. ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=SNDICATOR. TT.OPN: TT.CLS: JSR R4,TT.DCK ;CHECK TRANSFER DIRECTION BR TT.OPI TT.OPO: CLR R2 ;FOR OUTPUT SET SW. MOVB #-100,R3 ;... & COUNT FOR L/T CODE BR TT.TFO ;JOIN TT.TFO FOR REST TT.OPI: BISB @PC,TT.EDI ;FOR INPUT, CLEAR EOF MARK TSTB -3(R0) ;COME FROM QUEUE? BEQ KT.IXT JSR R4,KT.ISM ;IF SO SIMUL8 INT. BR .+4 ;...TO ALLOW RTN AS REQD. KT.IXT: TST (SP)+ ;IF NOT IGNORE INTERIM RTN MOV 14(R0),PC ;...& SHOW ACTION DONE ; 2) NORMAL TRANSFER: ; THIS ROUTINE MERELY SETS UP TRANST LOW DENSITY ... ASL R2 ;ADJUST BLOCK NO. .ENDC .ENDC .IFDF LOWDEN ASL R2 .ENDC CMP R2,#4800. ;IS BLOCK WITHIN BOUNDS? BLO DKIN20 ;YES - BRANCH MOV -(R0),-(R6) ;OUTPUT ILLEGAL BLOCK NUMBER MOV #1435,-(R6) ;AND F035 BR DKER20 ;... AFTER SYSDV CHK DKIN10: ADD R2,R1 ;ADD IN VALID QUOTIENT ASR R2 ;ADJ REMAINDER FOR DIV BY 12 ASR R2 ADD R4,R2 DKIN20: MOV R2,R4 ;DIVIDE BY 16 - SAVE REMAINDER BIC #177760,R4 BIC R4,R2 ;EXTRACT QUOTIENT ... BNE DKIN10 ;... IF ANY BUILD UCE INTERRUPT MOV @#MTS,R2 ;GET STATUS OF DEVICE INCB INTENB ;SET INT FLAG BIT #ILC+NXM,R2 ;CHECK ILLEGAL CMMD, NONEXIST CORE BEQ INT1 ;BRANCH IF NOT INTF: MOV R2,-(SP) ;DISPLAY STATUS AND DIAGNOSE MOV #1432,-(SP) ;FATAL ERROR-MAG TAPE IOT ;ABORT ; INT1: TSTB TCMMD ;CHECK IF THIS WAS A RETRY BEQ INT3 ;BRANCH IF NOT BPL INT2 ;BRANCH IF WAS NOT BSP OF RETRY CLR R2 BISB TCMMD,R2 ;GET CMMD NEGB TCMMD ;SET-NOT BSP JMP GOA ;GO TRY AGAIN ; INT2: BIT #BGL+BTE+CRE+PAE,R2;TEST IV%5 SP=%6 PC=%7 .GLOBL DC ;TABLE OF STANDARDS AND POINTERS DC: .WORD 0 ;CURRENT DDB ADDRESS (0 IF IDLE) DCFLGS: .BYTE 37 ;STANDARD FACILITY INDICATOR .BYTE 200 ;(NORMAL & FILE-BASED) .BYTE 4 ;STANDARD BUFFER SIZE/16 .BYTE DC.INT-DC ;T.V. CONTENT .BYTE 240 ;PRIORITY FOR T.V. .BYTE 0 ;DESPATCH TABLE .BYTE DC.TFR-DC ;SHOWS TFR RTN ONLY .BYTE 0 .BYTE 0 .BYTE 0 ;SPARE DC.NAM: .RAD50 'DC' .WORD DC.DIR ;MFD BLOCK .WORD 0 ;REQUIRED FOR BIT MAP INFO ;TRANSFER INITIATE DC.TFWFER CONTROLS ; AS PASSED BY MONITOR IN ASSOCIATED ; DDB AND THEN USES INTERRUPT ROUTINES ; TO INITIATE TRANSFER REQUIRED, ; PROVIDED ALWAYS THAT THE CORRESPONDING KB ; COMPONENT IS NOT ALREADY IN USE. TT.TFR: JSR R4,TT.DCK ;CHECK TRANSFER DIRECTION BR TT.TFI TT.TFO: JSR R1,TT.OIC ;FOR OUTPUT SET-UP FOLLOWING:- TT.OSW: .WORD 0 ;USING DDB IF BUSY, NEG IF WAITING TT.OCT: .WORD 0 ;BYTE COUNT FOR TRANSFER TT.OBP: .WORD 0 ;CURRENT BUFFER POINTER KB.OSW: .WORD 0 ;KBO BUSY FLAG .WORD KT.OSXRESULT CMP R4,#12. ;CHECK REMAINDER BLT .+6 ;IF BETWEEN 12 & 15 ... ADD #4,R4 ;... CAUSE SURFACE INCR. ADD R4,R1 ;PUT SECTOR INTO REST MOV #RKDA,R4 MOV R1,@R4 ;SET UP DISK ADDRESS MOV (R0)+,-(R4) ;SET UP MEMORY ADDRESS MOV (R0)+,-(R4) ;SET UP WORD COUNT MOV (R0)+,R1 ;PUT IN THE FUNCTION BISB @PC,R1 ;SET I.D.E. AND GO BITS BIC #177460,R1 ;CLEAR GARBAGE -*****- MOV R1,-(R4) ;SEND FUNCTION TO CONTROL RTS PC ; -*****- USED AS LITERAL BY THE PREVIOUS INSTRUCTION ; ; INTERRUPYF ERROR THIS TIME BEQ INT7 ;BRANCH IF NOT INC RETRY BNE INT6 ;BRANCH IF TO TRY AGAIN BIT #BGL,R2 ;IF ERR=BUS GRANT LATE BNE INTF ;IS FATAL INCB ERRSW ;SET ERROR FLAG BIT #4,(R5) ;IF WRITE OR WEOF, ISSUE ACTION DIAG BEQ INT7 MOV R2,-(SP) MOV #412,-(SP) IOT BR INT7 ;GO TO SPECIFIC ROUTINE ; INT3: BIT #BGL+BTE+PAE+CRE,R2;CHECK IF ERROR BEQ INT7 ;BRANCH IF NOT CMPB #SKPR,(R1) ;BRANCH IF SKIP OR BSP BEQ INT4 CMPB #BSPR,(R1) BEQ INT4 MOV TRYCNT,RETRY ;SET RETRY COUNTZR: MOV @PC,DC.RTC ;ZERO RETRY COUNT MOV DC,R0 ;GET DDB ADDRESS DC.RPT: CMP (R0)+,(R0)+ ;BUMP POINTER TO BLOCK NO. MOV #DC.DCS-4,R2 ;SET HWR POINTER MOV (R0)+,@R2 ;MOVE IN BLOCK NO. ... ASL @R2 ;...MODIFIED ADD #10,R2 ;STEP TO MEMORY STORE MOV (R0)+,@R2 ;MOVE IN ADDR REQD. ... MOV (R0)+,-(R2) ;& WORD COUNT MOV (R0)+,R1 ;GET FUNCTION BISB @PC,R1 ;ADD INT ENB & GO BIC #177470,R1 ;REMOVE OTHER GARBAGE (******) MOV R1,-(R2) ;SEND TO CONTROL RTS PC ;RETURN TO MONITOR FOR NOW ;(***[T-TT.OIX ;ENTRY IF PUNCH IMMEDIATE ;IF PRINT BUSY EXITS TO MONITOR TT.TFI: DEC R2 ;ADJUST POINTER FOR START ... JSR R1,TT.OIC ;OTHERWISE SIMILAR FOR INPUT TT.ISW: .WORD 0 TT.ICT: .WORD 0 TT.IBP: .WORD 0 KB.ISW: .WORD 0 .WORD TT.ISE-TT.OIX ;TERMINAL ROUTINES FOR SIMILAR SET-UP: ; 1) OPEN & CLOSE: ; THIS ROUTINE CAUSES CARRIAGE RESTORE IF OUTPUT ; IS TO FOLLOW; FOR INPUT, IT WILL ; MERELY CLEAR ANY CURRENT END OF DATA ; INDICATION. KB.OPN: KB.CLS: JSR R4,KB.DCK ;NOW CHECK DIRECT\T PROCESSOR DKINT: MOV @#V.RSAV,-(R6) JSR R5,@(R6)+ MOV DK,R0 ;GET THE DDB MOV #RKDS,R5 MOV (R5)+,R1 ;SAVE RKDS AND RKER FOR LATER MOV (R5)+,R2 MOV @R5,R4 ;SAVE RKCS BMI DKERP ;YES - BRANCH BIT #10,R4 ;WAS LAST FCN A DRIVE RESET? BNE DKER00 ;YES - BRANCH DKXIT: JMP @14(R0) ;EXIT ;ERROR PROCESSOR: DKERP: ASL R4 ;HARD ERROR? BMI DKHER ;YES - BRANCH DKER00: ROL (PC)+ ;TRIED 8 TIMES? DKREPT: .WORD 0 BCC DKER25 ;IF NOT TRY SOME MORE DKER10: BIS #100000,12(R0) ;SET FAI] BIT #12,(R5) ;IF CMMD IS WRITE BNE INT6 BIS #10,(R5) ;TRY WRITE WITH LONG GAP INT6: MOVB (R5),TCMMD ;SAVE CMMD MOVB #10.,R2 ;SET UP BSP MOV #-1,@#MTBRC ;COUNT OF 1 JMP GO2 ;GO EXECUTE ; INT4: BIT #EOF+BOT,R2 ;IF EOF OR BOT BNE INT7 ;SKIP OR BSP IS DONE TST @#MTBRC ;IF COUNT EXHAUSTED BEQ INT7 ;IS DONE MOVB (R5),R2 ;ELSE SET UP CMMD JMP GO2 ;CONTINUE SKIP OR BSP ; INT7: CLRB TCMMD ;CLEAR RETRY INDICATORS CLRB RETRY MOV INTRET,PC ;GO TO SPECIFIC ROUTINE ; ; .END ^***) - CARE!!!! USED AS LITERAL BY PREVIOUS INSTRUCTION ;INTERRUPT SERVICE DC.INT: MOV @#V.RSAV,-(SP) JSR R5,@(SP)+ MOV DC,R0 ;GET DDB ADDRESS MOV #DC.DCS-2,R1 ;GET PTR TO H/W REGS. MOV (R1)+,R3 ;SAVE ERROR STATUS REGS. BMI DC.AGN ;IF DATA LATE SET TRY AGAIN MOV (R1)+,R2 ;ANY ERRORS SEEN? BMI DC.ERR ;YES - GO FIND CAUSE DC.XIT: JMP @14(R0) ;RETURN MONITOR ;ERROR ROUTINE: DC.ERR: ASL R2 ;CHECK ERROR CAUSE ... BPL DC.OFF ;FOR DATA FAILURE ... ASL (PC)+ ;.... ALREADY RETRIED 8 _ION BR KB.OPI MOV R5,R3 ;FOR OUTPUT, SET BYTE COUNT (-2) MOV R5,#0 ;SET LINE-COUNT KB.LCT=.-2 MOV (PC)+,@R2 ;....& CTLS IN BUFFER .BYTE 15,12 BR KB.TFO ;JOIN KB.TFO FOR REST KB.OPI: BISB #200,KB.PSP ;FOR INPUT CLEAR EOF MARK ... BICB #10,KB.PSP ;... & ALLOW PROG ECHO JSR PC,KB.IGI ;CLEAR INTERNAL BUFFER BR TT.OPI+4 ;OTHERWISE NO ACTION ; 3) TRANSFER OPERATIONS: ; A) PRINTER IN ITS OWN WRITE: ; THIS ROUTINE OPERATES IN THE SAME MANNER AS ; THOSE FOR TT IN THAT IT MERELY ; C`LURE FLAG TST @#RKWC ;HAS WORD COUNT REACHED 0? BEQ DKXIT ;YES - GO EXIT DKER15: MOV R2,-(R6) ;OUTPUT RKER MOV #1427,-(R6) ;AND F027 BITB #7,13(R0) ;IS THIS UNIT 0? BNE DKER20 ;NO - BRANCH BIT #SDRVR,DKFLGS ;SYSTEM DRIVER? BEQ DKER20 ;NO - BRANCH CLR @R6 ;SET CODE TO HALT DKER20: CLR DK ;FREE DRIVER IOT ;OUTPUT MESSAGE MOV (R6)+,DK ;IF COME BACK RESET FLAG DKER25: JSR PC,DKRTRY ;RE-INIT TFR DKER30: MOV @#V.XIT,R5 JMP 4(R5) DKHER: MOV #1,@R5 ;CLEAR THE CONTROL DKHR00: bTIMES? DC.RTC: .WORD 0 BCS DC.PER ;IF SO FORCE CONTINUE DC.AGN: JSR PC,DC.RPT ;OTHERWISE TRY AGAIN DC.REC: MOV @#V.XIT,R5 JMP 4(R5) DC.PER: ASL R3 ;IF DATA SYNC ERR. NOW ... BPL DC.OFF ;... TREAT AS FATAL BIS #100000,12(R0) ;RETURN PARITY FAIL FLAG TST @R1 ;ALREADY AT BLOCK END? BEQ DC.XIT ;IF SO EXIT NOW MOV @PC,DC.RTC ;NO MORE REPEAT TRIES NOW INC -(R1) ;CONTINUE DISK TRANSFER BR DC.REC ;... VIA COMMON EXIT ;ERROR IS NOT IMMEDIATELY RECOVERABLE: DC.OFF: CLR DC ;FREE DISK cOLLECTS THE TRANSFER CONTROLS ; PASSED ON BY THE MONITOR AND THEN ; USES THE INTERRUPT SERVICING ROUTINE ; TO INITIATE THE TRANSFER./ (ASSUMING ; PUNCH IS NOT ALREADT UNDERWAY) KB.TFR: JSR R4,KB.DCK ;CHECK DIRECTION BR KB.TFI KB.TFO: JSR R4,KT.ISM ;SIMULATE INTERRUPT MOV #1,KB.OSW ;SET IN USE FLAG (AS PRINTER) MOV R2,#0 ;SET BUFFER POINTER ... KB.OBP=.-2 MOV R3,#0 ;... & BYTE COUNT KB.OCT=.-2 KB.ITO: TST TT.OSW ;PUNCH ALREADY IN USE? BNE KT.CXT ;IF SO LET IT FINISH KT.OST: BITBdTSTB @R5 ;DONE YET? BPL DKHR00 ;NO - LOOP BIT #200,R1 ;IS IT DRIVE NOT READY BEQ DKRDY ;IF YES : A002 BIT #1000,R1 ;IS IT SEEK INCOMPLETE? BEQ DKHR05 ;NO - BRANCH MOV R1,4(R5) ;REPLACE DRIVE # MOV #115,@R5 ;SET UP FOR DRIVE RESET BR DKER30 ;TAKE INTERIM EXIT DKHR05: BIT #11400,R2 ;CAN WE POSSIBLY GO ON? BNE DKER00 ;YES - BRANCH BIT #20000,R2 ;IS IT WRITE LOCK OUT? BEQ DKER15 ;NO - BRANCH DKRDY: MOV R0,-(R6) ;SAVE BUSY FLAG MOV DKNAM,-(R6) ;OUTPUT NAME MOV #402,-(R6) ;ANe;COPYRIGHT 1971,1972, DIGITAL EQUIPMENT COPR., MAYNARD, MASS. ;VERSION NUMBER: V07 ; ;CARD READER DRIVER (CR) ; ; A) FOR ASCII INPUT. AT EACH TRANSFER REQUEST ; ONE CARD WILL BE READ. UP TO 80 CHARACTERS, ; FOLLOWED BY CR-LF, WILL BE PASSED TO THE ; CALLING ROUTINE AS SPECIFIED BY THE WORD ; COUNT GIVEN. (IF THIS IS > 41, REMAINING ; BYTES WILL BE CLEARED. ; ALL ERRORS (INCLUDING 'HOPPER EMPTY' UPON ; AN 'OPEN' CALL) WILL BE TREATED AS 'DEVICE ; NOT READY'. USER CAN RESUME OPERATION BY ; REFOR EDP MOV -(R1),-(SP) ;DISK STATUS IS EVIDENCE MOV #DC.ENO,-(SP) ;SET UP ERROR NO. BIT #SDRVR,DCFLGS ;SYSTEM DRIVER? BEQ DC.SND ;NO - BRANCH CLR @SP ;CODE TO FORCE A HALT DC.SND: IOT ;GO TO DIAG. PRT. ;DEFINITIONS: DC.DCS=177446 DC.DIR=1 DC.ENO=1426 V.RSAV=44 V.XIT=42 SDRVR=10000 .END g @PC,@#TPS ;PRINTER DOING CMD? BNE .-4 ;IF SO LET IT FINISH BISB #200,@R5 ;RAISE PRL FOR SAFETY MOVB #100,@#TPS ;ENABLE INTERRUPT BR KT.CXT ;... & WAIT TO COME BACK ; B) KEYBOARD SPECIAL OPERATIONS: ; THIS ROUTINE ATTEMPTS TO SATISFY EACH MONITOR ; REQUEST FOR DATA FROM ITS OWN INTERNAL ; CIRCULAR BUFFER. AT THE FIRST REQUEST ; IT WILL SCAN THE BUFFER FOR THE FIRST ; LINE TERMINATOR - IF FOUND IT WILL ; THEN WAIT UNTIL WHOLE LINE HAS BEEN ; ECHOED (UNLESS THIS BE SUPPRESSED); IF D A002 BR DKER20 ;... & GO PRINT .END iCTIFICATION OF ERROR OR REFILL OF HOPPER ; AND ENTRY OF 'CO' COMMAND AT KEYBOARD. ; THE END OF A FILE WILL BE DETERMINED BY ; RECOGNITION OF A TERMINAL CONTROL CARD:- ; 12-11-0-1-6-7-8-9 PUNCHED IN C.C. 1 ; ; XXXXXXXXXXXXXXXXXXXXXXXXX ; X X ; X NOTES X ; X X ; XXXXXXXXXXXXXXXXXXXXXXXXX ; ; 1) THIS DRIVER CAN BE ASSEMBLED FOR USE ; IN CONNECTION WITH EITHER '026' OR '029' ; PUNCHES OR BOTH AS INDICATED BY PARAMETER ; SPECIFICATION AT START OF SOURCE INPUT ; AS FOLLOWS:- ; A)k; NOT IT WILL WAIT UNTIL A TERMINATOR IS INPUT, ; ECHOING AS REQUIRED DURING SUCH WAIT. ; WHEN A LINE HAS BEEN COMPLETED, IT WILL ; TRANSMIT AS MANY CHARACTERS AS HAVE BEEN ; DEMANDED BY THE MONITOR, PADDING IF THE ; LINE IS TOO SHORT. SUBSEQUENT REQUESTS ; FROM THE MONITOR WILL BE SATISFIED ; FROM THE SAME LINE IF ANY REMAINS, WITH ; SIMILAR PADDING CONSIDERATIONS. (FOR ; .TRAN REQUESTS, AS SHOWN BY MONITOR ; ASKING FOR NON-STD BUFFER CAPACITY, ; DATA WILL BE PASSED AS LINES BUT WIlION BR KB.OPI MOV R5,R3 ;FOR OUTPUT, SET BYTE COUNT (-2) MOV R5,#0 ;SET LINE-COUNT KB.LCT=.-2 MOV (PC)+,@R2 ;....& CTLS IN BUFFER .BYTE 15,12 BR KB.TFO ;JOIN KB.TFO FOR REST KB.OPI: BISB #200,KB.PSP ;FOR INPUT CLEAR EOF MARK ... BICB #10,KB.PSP ;... & ALLOW PROG ECHO JSR PC,KB.IGI ;CLEAR INTERNAL BUFFER BR TT.OPI+4 ;OTHERWISE NO ACTION ; 3) TRANSFER OPERATIONS: ; A) PRINTER IN ITS OWN WRITE: ; THIS ROUTINE OPERATES IN THE SAME MANNER AS ; THOSE FOR TT IN THAT IT MERELY ; Cm "ONLY26=0" - READ ONLY '026' CODES. ; B) "ONLY29=0" - READ ONLY '029' CODES ; C) "DEFALT=0" - READ BOTH TYPES OF CODE ; WITH '026' AS DEFAULT ; D) NIL - READ BOTH TYPES OF CODE ; WITH '029' AS DEFAULT ; ; IN CASES (C) & (D), DRIVER WILL USE DEFAULT ; UNLESS DIRECTED OTHERWISE BY ENTRY OF A ; CONTROL CARD PUNCHED IN C.C. 1:- ; ; 12-0-2-4-6-8 = '029' CODES FOLLOW ; 12-2-4-8 = '026' CODES FOLLOW ; ; 2) IF PARAMETER "BLANKS" IS DEFINED, C.C. 73-80 ; & TRAILING SPoTH ; NO PADDING UNTIL WHOLE OF BUFFER ; HAS BEEN FILLED. ; THE DATA WILL NOT FREE ITS AREA IN THE CIRCULAR ; BUFFER UNTIL TRANSFERRED TO THE MONITOR ; IN ORDER THAT THE SAME BUFFER CAN BE USED ; FOR BOTH INPUT & ECHO OUTPUT. IF THE ; CAPACITY OF THIS BUFFER IS EXCEEDED, THE ; KEYBOARD INTERRUPT WILL BE DISABLED - ; THOUGH NOT FOR INTERMEDIATE PAPER-TAPE ; READ OPERATIONS - UNTIL ROOM IS AGAIN ; AVAILABLE. ; PROVIDED THAT THERE IS ALREADY SUFFICIENT DATA ; IN THE BUFFER TO OPERATE IpOLLECTS THE TRANSFER CONTROLS ; PASSED ON BY THE MONITOR AND THEN ; USES THE INTERRUPT SERVICING ROUTINE ; TO INITIATE THE TRANSFER./ (ASSUMING ; PUNCH IS NOT ALREADT UNDERWAY) KB.TFR: JSR R4,KB.DCK ;CHECK DIRECTION BR KB.TFI KB.TFO: JSR R4,KT.ISM ;SIMULATE INTERRUPT MOV #1,KB.OSW ;SET IN USE FLAG (AS PRINTER) MOV R2,#0 ;SET BUFFER POINTER ... KB.OBP=.-2 MOV R3,#0 ;... & BYTE COUNT KB.OCT=.-2 KB.ITO: TST TT.OSW ;PUNCH ALREADY IN USE? BNE KT.CXT ;IF SO LET IT FINISH KT.OST: BITBqACES BEFORE THESE WILL BE DISCARDED, ; WITH 'CR-LF' FOLLOWING LAST VALID DATA, PROVIDED ; THAT CARD FILE IS PRECEDED BY CTL CARD WITH ; 12-11-0-7-8-9 PUNCHED IN C.C. 1. IN THIS CASE ; HOWEVER, IF THE USER BUFFER IS WORD 1, BITS 15-4 ; C.C.2 > WORD 1, BITS 3-0; WORD 2, BITS 15-8 ; C.C.3 > WORD 2, BITS 7-0; WORD 3, BITS 15-12 ; C.C.4 > WORD 3, BITS 11-0 ; ; THE PACKED FORM WILL BE TRANSFERRED TO THE USER ; BUFFER UNTIL THIS IS FILLED, ANY DATA THEN REMAINING ; IN THE INTERNAL BUFFER BEING RETAINED UNTIL THE ; NEXT READ REQUEST. ; ; TREATMENT OF ASCII READING WILL STILL FOLLOW PATTw R2,#0 ;SET BUFFER POINTER (MON.) KB.IBP=.-2 KB.OTI: JSR PC,KB.IGP ;NOW GET INTERNAL PTRS CMP R2,KB.ILE ;LINE UNDER PROCESS ALREADY? BNE KB.IP1 ;IF SO NO COLLECTION ;SCAN FOR LINE TERMINATOR: CLR -(SP) ;OTHERWISE SET COUNTER MOV R3,KB.OBP ;STORE CURRENT PRINT POINT KB.IC1: MOV R3,KB.ISW ;... & SET WAIT IN CASE CMP R3,R1 ;ANYTHING IN BUFFER? BEQ KB.IC3 ;IF NOT PERHAPS ECHO SO FAR KB.IC2: MOVB (R3)+,R0 ;GET NEXT CHARACTER JSR R3,KB.PCK ;ADJUST POINTER IF NEC. DEC @SP ;... & COUNT x; NOT IT WILL WAIT UNTIL A TERMINATOR IS INPUT, ; ECHOING AS REQUIRED DURING SUCH WAIT. ; WHEN A LINE HAS BEEN COMPLETED, IT WILL ; TRANSMIT AS MANY CHARACTERS AS HAVE BEEN ; DEMANDED BY THE MONITOR, PADDING IF THE ; LINE IS TOO SHORT. SUBSEQUENT REQUESTS ; FROM THE MONITOR WILL BE SATISFIED ; FROM THE SAME LINE IF ANY REMAINS, WITH ; SIMILAR PADDING CONSIDERATIONS. (FOR ; .TRAN REQUESTS, AS SHOWN BY MONITOR ; ASKING FOR NON-STD BUFFER CAPACITY, ; DATA WILL BE PASSED AS LINES BUT WIyERN ; DESCRIBED IN THE PREVIOUS PARAGRAPH WITHOUT EXCEPTION. ; ; THE ONLY CONTROL CARD WHICH WILL HAVE ANY EFFECT ; IN BINARY READING WILL BE THAT INDICATING E.O.F. (IN ; THIS CASE 12-11-0-1-6-7-8-9 PUNCHING MUST APPEAR IN AT ; LEAST C.C. 1 THRU 8). ; ; N.B. WHEN ASSEMBLED FOR USAGE IN BOTH MODES, AN 'OPEN' ; CALL WILL NOT CAUSE READING OF A CARD TO ALLOW THIS ; TO BE TRANSLATED AS REQUIRED BY THE READ MODE ; SPECIFIED BY THE USER. ; ; C) DRIVER CAN ALSO BE USED FOR 80-COLUMN MARK ; SENSE R{ CMPB R0,#14 ;IS IT TERMINATOR? BGT KB.IC1 ;IF NOT GET NEXT CMPB R0,#12 BLT KB.IC1 ;TERMINATOR FOUND - ECHO LINE TO END: MOV R3,KB.ILE ;SET LINE END ... CLR KB.ISW ;... & CLEAR WAIT KB.IC3: MOVB @PC,@#TKS ;ENABLE INTS IN CASE MOV R3,KB.ECP ;SAVE CURRENT ECHO PTR MOV @PC,KB.OSW ;IF SO SET OUTPUT FLAG TO SHOW MOV (SP)+,KB.OCT ;... & SET COUNT BEQ KT.CXT BITB @PC,@#TPS ;IF ANY TO DO GO PRINT BEQ KB.ITO ;... UNLESS IT'S BUSY ;COMMON EXIT SEQUENCE: KT.CXT: MOV @#V.RRES,-(SP) ;RE|TH ; NO PADDING UNTIL WHOLE OF BUFFER ; HAS BEEN FILLED. ; THE DATA WILL NOT FREE ITS AREA IN THE CIRCULAR ; BUFFER UNTIL TRANSFERRED TO THE MONITOR ; IN ORDER THAT THE SAME BUFFER CAN BE USED ; FOR BOTH INPUT & ECHO OUTPUT. IF THE ; CAPACITY OF THIS BUFFER IS EXCEEDED, THE ; KEYBOARD INTERRUPT WILL BE DISABLED - ; THOUGH NOT FOR INTERMEDIATE PAPER-TAPE ; READ OPERATIONS - UNTIL ROOM IS AGAIN ; AVAILABLE. ; PROVIDED THAT THERE IS ALREADY SUFFICIENT DATA ; IN THE BUFFER TO OPERATE I}EADER. FOR 40 -COLUMN READER, ECONOMIES ; IN BUFFER SIZE CAN BE OBTAINED BY DEFINITION ; AT ASSEMLBY OF PARAMETER "MARKS". THIS WILL ; ALSO PREVENT AUTOMATIC REMOVAL OF COLS 33-40 ; IN 'BLANKS-SUPPRESS' MODE OF USAGE. ; ; ; XXXXXXXXXXXXXXXXXXXXXXXXX ; X X ; X NOTE X ; X X ; XXXXXXXXXXXXXXXXXXXXXXXXX ; ; PARAMETER DEFINITIONS CAN BE MADE DURING PASS 1 ; OF THE ASSEMBLY ONLY IF REQD AS DESCRIBED IN ; PAL-11R MANUAL, SECTION 9-2, E.G. ; ; #CR,LP:,/PA:2 ; ; XXXXXXXXXXXXXXXXXXXXXXXX ; .TITLE DV.CR .GLOBL CR ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;INTERFACE TABLE: CR: .WORD 0 ;CURRENT DDB OR 0 IF IDLE .IFNDF BINARY .BYTE 224,0 ;FACILITIES: ASCII INPUT,OPEN INC. .ENDC .IFDF BINARY .BYTE 234,0 ;ALLOW BINARY IF REQD. .ENDC .IFNDF MARKS .BYTE 3 ;STD BUFFER SIZE = 96 BYTES .ENDC .IFDF MARKS .BYTE 2 ;(64 IF 40-COL MARK SENSE) .ENDC IF FOUND INC R2 INC KB.ICT ;MONITOR BUFFER FULL? BNE KB.IP2 KB.IP4: MOV KB.ICT,16(R0) ;RETURN WORDS NOT AVAILABLE ASR 16(R0) KB.OXT: CLR KB.OSW ;FREE PRINTER IF NEC. ;COMMON EXIT FOR KB & PUNCH ON COMPLETION: ; READER DOES NOT NEED TO JOIN IN, PROVIDED ; INTERRUPT IS ENABLED ON EXIT - IF SAFE. KT.OXT: MOV 14(R0),-(SP) ;SIMULATE INTERRUPT JSR R4,KT.ISM TST KB.OSW ;PRINT WAIT ON PUNCH? BNE KB.OIS ;IF SO GO TO IT TST KB.ISW ;KEYBOARD WAITING? BNE KT.CXT ;IF SO MUST FINISH TST R2,#0 ;SET BUFFER POINTER (MON.) KB.IBP=.-2 KB.OTI: JSR PC,KB.IGP ;NOW GET INTERNAL PTRS CMP R2,KB.ILE ;LINE UNDER PROCESS ALREADY? BNE KB.IP1 ;IF SO NO COLLECTION ;SCAN FOR LINE TERMINATOR: CLR -(SP) ;OTHERWISE SET COUNTER MOV R3,KB.OBP ;STORE CURRENT PRINT POINT KB.IC1: MOV R3,KB.ISW ;... & SET WAIT IN CASE CMP R3,R1 ;ANYTHING IN BUFFER? BEQ KB.IC3 ;IF NOT PERHAPS ECHO SO FAR KB.IC2: MOVB (R3)+,R0 ;GET NEXT CHARACTER JSR R3,KB.PCK ;ADJUST POINTER IF NEC. DEC @SP ;... & COUNT .BYTE CR.INT-CR,300 ;INT'RUPT SVCE AT PRL 6 .BYTE CR.OPN-CR ;OFFSET TO OPEN .BYTE CR.TFR-CR ;OFFSET TO TRANSFER .BYTE 0,0,0 ;(NO CLOSE OR SPEC. FUNC.) CR.NAM: .RAD50 'CR' ;OPEN PROCESSOR: CR.ONR: JSR PC,CR.NRY CR.OPN: BIT #400,@#CR.CSR ;CARDS IN HOPPER? BNE CR.ONR ;IF NOT TELL USER TO READY .IFNDF ONLY26&ONLY29 .IFNDF DEFALT ;FOR DUAL-PUNCH DRIVER ... CLR (PC)+ ;... SET CONV. TABLE OFFSET .ENDC ;... FOR DEFAULT PUNCH .IFDF DEFALT ;... AS APPROPRIATE MOV #106,(PC)+ ;OFFSET T TT.ISW ;READER WAITING? BLT TT.ISE-4 TST TT.OSW ;MAYBE PRINTER HOLDING PUNCH? BGE KT.CXT .EOT ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001D ; ;ASR33 TELETYPE DRIVER PART 2: ; ;COMPLETION EXIT SEQUENCE FOR PRINTER INTERRUPT: ; MOVED HERE TO BE IN BRANCH RANGE KB.ODN: MOV KB,R0 ;GET ADDRESS OF DDB TST (SP)+ ;CLEAN UP STACK BPL KB.OXT ;IF NORMAL PRINT EXIT BR KB.OTI ;OTHERWISE RECALL INPUT PROC. ; ;INTERRUPT SERVICING ROUTINES: ; ; A) PUN CMPB R0,#14 ;IS IT TERMINATOR? BGT KB.IC1 ;IF NOT GET NEXT CMPB R0,#12 BLT KB.IC1 ;TERMINATOR FOUND - ECHO LINE TO END: MOV R3,KB.ILE ;SET LINE END ... CLR KB.ISW ;... & CLEAR WAIT KB.IC3: MOVB @PC,@#TKS ;ENABLE INTS IN CASE MOV R3,KB.ECP ;SAVE CURRENT ECHO PTR MOV @PC,KB.OSW ;IF SO SET OUTPUT FLAG TO SHOW MOV (SP)+,KB.OCT ;... & SET COUNT BEQ KT.CXT BITB @PC,@#TPS ;IF ANY TO DO GO PRINT BEQ KB.ITO ;... UNLESS IT'S BUSY ;COMMON EXIT SEQUENCE: KT.CXT: MOV @#V.RRES,-(SP) ;REO 026 CONVERSION TABLE .ENDC CR.TOS: .WORD 0 .ENDC .IFDF BLANKS ;IF BLANK-SUPPRESS VERSION ... CLRB CR.ZSW ;... FORCE SUPPRESS OFF .ENDC .IFNDF BINARY TST (SP)+ ;IGNORE INTERIM RETURN JMP CR.DXT ;... & TAKE COMPLETION .ENDC .IFDF BINARY ;FOR BINARY VERSION ... CLRB CR.TFR ;... FORCE NO OPEN READ BR CR.ODN CR.OXT: INCB CR.TFR ;... BY MAKING COME HERE BR CR.ODN ;... BEFORE EXIT .ENDC ;SUBSIDIARY ROUTINES: ; A) RESTART AFTER ERROR: CR.AGN: .IFDF BINARY ;IN BCH CALL: ; THIS ROUTINE MOVES CHARACTERS TO THE PUNCH ; WITHOUT PROCESSING UNTIL BUFFER IS ; EMPTY. ON COMPLETION CALLS KB PRINT ; ROUTINE IF WAITING. COM TT.OSW ;SHOW PUNCH NOW U/W TT.OIS: MOV PC,R1 ;SET POINTER TO STORES ADD #TT.OBP-.,R1 MOV @R1,R0 ;GET BUFF PTR .... BEQ TT.OGO ;... ZERO IF OPEN/CLOSE MOVB @(R1)+,R0 ;OTHERWISE GET NEXT CHAR. INC -(R1) ;... & BUMP POINTER TT.OGO: INC -(R1) ;ASSUMING THERE IS ANY TO GET!! BGT TT.ODN KT.OGO: MOV #TPS,R4 ;SET HWR PTR TT.IGO: STORE USER REGS JSR R5,@(SP)+ RTI V.RRES=46 ;LINE NOW ECHOED IF NECESSARY - START TFR TO MONITOR: KB.IP1: MOV R2,R3 ;SET START OF LINE MOV KB.IBP,R2 ;... & OF MONITOR BUFFER KB.IP2: CMP R3,KB.ILE ;MORE IN THE LINE? BNE KB.IP3 CMPB @(R0),#10 ;IF NOT IS IT .TRAN? BEQ KB.TRA ;IF SO GO FOR MORE CLRB -(R3) ;OTHERWISE NULL PAD KB.IP3: MOVB (R3)+,@R2 ;GET CHAR. JSR R3,KB.PCK ;ADJUST PTR IF NEC. MOV R3,KB.IPY ;SAVE NEW LINE START CMPB @R2,#177 ;LOOK FOR RUBOUT BEQ KB.IP3 ;IGNORE INARY VERSION ... TSTB CR.ISW ;... CHECK IF BINARY READ BEQ CR.TFR ;IF NOT CAN JUST START OVER BR CR.ERD ;ELSE LEAVE USER BUFFER ALONE ; B) INITIALISE INTERNAL BUFFER POINTERS: CR.ISP: MOV PC,-(SP) ;GET BUFFER START ADD #CR.BUF-.,@SP MOV @SP,(PC)+ CR.IBS: .WORD 0 ADD #CR.BSZ,@SP ;NOW GET END MOV @SP,(PC)+ ;STORE AS CONTROL CR.IBE: .WORD 0 MOV (SP)+,(PC)+ ;... & AS INIT. PTR CR.IBP: .WORD 0 INCB @PC ;MUSTN'T COME HERE AGAIN! .ENDC ;TRANSFER SET-UP PROCESSOR: CR.TFR: .IFDF MOV #101,(R4)+ ;RE-ENABLE INTERRUPT MOVB R0,@R4 ;DESPATCH CHARACTER BR KT.CXT ;... & WAIT TILL DONE TT.ODN: MOV -(R1),R0 ;GET USING DDB ADDRESS CLR @R1 ;... & CLEAR BUSY FLAG BR KT.OXT ;GO TO COMMON COMP EXIT ; B) READER CALL: ; THIS ROUTINE MOVES INPUT CHARACTER TO MONITOR ; BUFFER WITHOUT PROCESSING OR ECHO UNTIL ; EITHER ITS BUFFER IS FILLED OR AN EXTERNAL ; EOD HAS BEEN ENTERED. REQUEST FOR NEXT CHAR. ; IS MADE WITH INT & GO ENABLED (IN CASE KB ; HAS DISABLED BECAUSE ITS BUIF FOUND INC R2 INC KB.ICT ;MONITOR BUFFER FULL? BNE KB.IP2 KB.IP4: MOV KB.ICT,16(R0) ;RETURN WORDS NOT AVAILABLE ASR 16(R0) KB.OXT: CLR KB.OSW ;FREE PRINTER IF NEC. ;COMMON EXIT FOR KB & PUNCH ON COMPLETION: ; READER DOES NOT NEED TO JOIN IN, PROVIDED ; INTERRUPT IS ENABLED ON EXIT - IF SAFE. KT.OXT: MOV 14(R0),-(SP) ;SIMULATE INTERRUPT JSR R4,KT.ISM TST KB.OSW ;PRINT WAIT ON PUNCH? BNE KB.OIS ;IF SO GO TO IT TST KB.ISW ;KEYBOARD WAITING? BNE KT.CXT ;IF SO MUST FINISH TSTBINARY ;FOR BINARY VERSION ... BR .+4 ;... SWITCH TABLE FORCES ... BR CR.OXT ;... CORRECT INIT. BR CR.ISP .ENDC MOV CR,R0 ;GET DDB ADDRESS ADD #6,R0 ;... & MOVE TO BUFFER STORE MOV (R0)+,-(SP) ;GET BUFFER POINTER MOV @SP,-(SP) ;... & BUILD BUFF END SUB @R0,@SP SUB (R0)+,@SP MOV (SP)+,(PC)+ ;SAVE RESULT ... CR.UBE: .WORD 0 .IFDF BINARY ;IN BINARY VERSION ... MOVB @R0,R0 ;... CHECK MODE BICB #376,R0 MOVB R0,CR.ISW ;IF ASCII CLEAR SWITCH BEQ CR.RDC ;IF BINARY WANTED .FFER FULL) COM TT.ISW ;SHOW READER NOW U/W TT.ISE: MOVB @TT.IBP,R0 ;DUMMY FOR ENTRY! TT.IIS: MOV #TKS,R4 ;SET HWR PTR MOV PC,R1 ;SET POINTER TO STORES ADD #TT.IBP-.,R1 MOVB R0,@(R1)+ ;STORE CHARACTER INC -(R1) ;... & BTMP POINTER INC -(R1) ;MORE TO COME? BGT TT.IDN TSTB TT.EDI ;EOD ENTERED? BMI TT.IGO ;EXIT VIA O/P RTN TT.IDN: MOVB @PC,@R4 ;ENABLE KBD INTS MOV -(R1),R0 ;WHEN DONE, GET USING DDB ;************ CARE!!! USED AS LITERAL BY PREVIOUS INSTR ******* CLR (R1)+ ;.. TT.ISW ;READER WAITING? BLT TT.ISE-4 TST TT.OSW ;MAYBE PRINTER HOLDING PUNCH? BGE KT.CXT .EOT ;COPYRIGHT 1971, DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;VERSION NUMBER: V001D ; ;ASR33 TELETYPE DRIVER PART 2: ; ;COMPLETION EXIT SEQUENCE FOR PRINTER INTERRUPT: ; MOVED HERE TO BE IN BRANCH RANGE KB.ODN: MOV KB,R0 ;GET ADDRESS OF DDB TST (SP)+ ;CLEAN UP STACK BPL KB.OXT ;IF NORMAL PRINT EXIT BR KB.OTI ;OTHERWISE RECALL INPUT PROC. ; ;INTERRUPT SERVICING ROUTINES: ; ; A) PUN.. MOV (SP)+,R0 ;... SET PTRS & SWITCH MOV CR.IBP,R1 CLR R2 ;SET INTERRUPT FLAG CR.BIN: CMP R1,CR.IBE ;INTERNAL BUFF EMPTY? BNE CR.BLP CR.ERD: MOV CR.IBS,CR.IBP ;IF SO RESET INTERNAL PTR MOV R0,-(SP) ;SAVE USER BUFF PTR ... CR.RDC: .ENDC MOV @SP,(PC)+ CR.UBP: .WORD 0 CLR @(SP)+ ;ZERO UNDERWAY FLAG MOV #101,@#CR.CSR ;ENABLE INT & GO FOR CD READ RTS PC ;RETURN USER FOR NOW .IFDF BINARY ;WITH BINARY DATA ... CR.BLP: SWAB @R1 ;... COMPLETE CONVERSION MOV (R1)+,(R0)+ ;... & GI. & CLEAR BUSY ASR @R1 ;CONVERT ANY REMAINING COUNT MOV @R1,16(R0) ;... & GIVE TO MONITOR MOV 14(R0),PC ;EXIT DIRECTLY TO MONITO ; 2) TERMINAL INTERRUPTS: ; A) KEYBOARD CALL: ; THIS ROUTINE STORES INPUT IN BUFFER, CONVERTING ; ALT MODE TO ESC, FLAGGING CHAR AFTER THESE ; TO STOP SPECIAL ACTION & FOLLOWING CR WITH ; LF. ALLOWS MORE INPUT IF ROOM IN BUFFER ; BY LEAVING INT ENB BUT WILL ACCEPT ONLY ; CTL/U WHEN THE BUFFER IS FILLED. CALLS PROC. ; ROUTINE IF CURRENTLY AWAITING DATA. CH CALL: ; THIS ROUTINE MOVES CHARACTERS TO THE PUNCH ; WITHOUT PROCESSING UNTIL BUFFER IS ; EMPTY. ON COMPLETION CALLS KB PRINT ; ROUTINE IF WAITING. COM TT.OSW ;SHOW PUNCH NOW U/W TT.OIS: MOV PC,R1 ;SET POINTER TO STORES ADD #TT.OBP-.,R1 MOV @R1,R0 ;GET BUFF PTR .... BEQ TT.OGO ;... ZERO IF OPEN/CLOSE MOVB @(R1)+,R0 ;OTHERWISE GET NEXT CHAR. INC -(R1) ;... & BUMP POINTER TT.OGO: INC -(R1) ;ASSUMING THERE IS ANY TO GET!! BGT TT.ODN KT.OGO: MOV #TPS,R4 ;SET HWR PTR TT.IGO: VE TO USER CMP R0,CR.UBE ;USER BUFFER FULL? BNE CR.BIN ;IF NOT GET NEXT WORD MOV R1,CR.IBP ;OTHERWISE SAVE INT PTR TST R2 ;COME HERE ON INTERRUPT? BNE CR.ODN ;IF SO MODE SW. SET MOV @SP,-(SP) ;ELSE MUST SIMULATE ... MOV -(R2),2(SP) ;... STORE PC & PS SUB #16,SP ;... & DUMMY SAVE REGS. CR.ODN: TST (SP)+ ;IGNORE RETURN PC JMP CR.DXT ;... & TAKE COMPLETION EXIT .ENDC ;INTERRUPT SERVICE ROUTINES: ; A) CHECK FOR ERROR & COLLECT INPUT: CR.INT: MOV R0,-(SP) ;SAVE USER R0 MOV CR KT.INT: BCS KT.INO ;COMMON ENTRY ON INT. TST TT.ISW ;IF INPUT, READER'S BABY? BGT TT.IIS ;IF SO GIVE IT TO HIM! KB.IIS: JSR PC,KB.IGP ;GET INTERNAL BUFF PTRS MOV PC,R4 ;SET CHECK STRING POINTER ADD #KB.ICS-.,R4 BICB (R4)+,R0 ;STRIP PARITY BIT CMPB R0,(R4)+ ;^U INPUT? BNE KB.IG1 ;IF NOT CONTINUE CMP R1,R2 ;OTHERWISE ANY OTHER INPUT? BNE KB.IG1 MOV KB.OSW,R5 ;IF NOT, PRINT U/W? BLE KB.IG5 BISB R5,KB.PSP ;IF SO STOP LINE OUTPUT BR KB.IG5 ;... & FORGET IT! KB.IG1: MOV R1,R3MOV #101,(R4)+ ;RE-ENABLE INTERRUPT MOVB R0,@R4 ;DESPATCH CHARACTER BR KT.CXT ;... & WAIT TILL DONE TT.ODN: MOV -(R1),R0 ;GET USING DDB ADDRESS CLR @R1 ;... & CLEAR BUSY FLAG BR KT.OXT ;GO TO COMMON COMP EXIT ; B) READER CALL: ; THIS ROUTINE MOVES INPUT CHARACTER TO MONITOR ; BUFFER WITHOUT PROCESSING OR ECHO UNTIL ; EITHER ITS BUFFER IS FILLED OR AN EXTERNAL ; EOD HAS BEEN ENTERED. REQUEST FOR NEXT CHAR. ; IS MADE WITH INT & GO ENABLED (IN CASE KB ; HAS DISABLED BECAUSE ITS BU.UBP,R0 ;GET USER BUFF PTR ... MOV @#CR.CSR,-(SP) ;... & READER STATUS ASL (SP)+ ;CHECK FOR SPECIAL CASES BCC .+6 JMP CR.ERR ;GO RETRY IF ERROR BMI CR.DUN ;CLEAN UP IF DONE MOV R1,-(SP) ;NOW SAVE USER R1 .IFDF BINARY ;IN BINARY VERSION ... CR.ISW: BR .+4 ;... USE APPROPRIATE CONVERSION BR CR.ASC ; B) BINARY CONVERT & STORE: MOV CR.IBP,R1 ;GET INT BUFF PTR MOV @#CR.DB1,-(SP) ;... & INPUT MOV @SP,-(SP) ;... 2 COPIES FOR LATER COMB 1(R0) ;ODD COLUMN? BPL CR.BST ASL @SP ;SET MOVING PTR KB.ESW: BR .+4 ;ESC SW. (BR .+2 WHEN SET) BIS -(R4),R0 ;FLAG CHAR. IF LAST = ESC CLRB KB.ESW ;ASSUME ESC COMING CMPB R0,(R4)+ ;RUBOUT? (OR FLAGGED) BHIS KB.IG2 ;IF SO OMIT ESC CHECK CMPB R0,(R4)+ ;ALT MODES (375/6)? BGE KB.IG5 CMPB R0,(R4)+ ;... OR ESCAPE? BEQ KB.IG5 ;IF SO SET SWITCH KB.IG2: INCB KB.ESW ;... BY OMITTING THIS ;STORE CHARACTER IF ROOM IN BUFFER: SUB R2,R1 ;MORE ROOM IN BUFFER? BMI .+6 SUB #KB.IBZ,R1 ;... ALLOWING WRAP AROUND ADD #3,R1 ;(FFER FULL) COM TT.ISW ;SHOW READER NOW U/W TT.ISE: MOVB @TT.IBP,R0 ;DUMMY FOR ENTRY! TT.IIS: MOV #TKS,R4 ;SET HWR PTR MOV PC,R1 ;SET POINTER TO STORES ADD #TT.IBP-.,R1 MOVB R0,@(R1)+ ;STORE CHARACTER INC -(R1) ;... & BTMP POINTER INC -(R1) ;MORE TO COME? BGT TT.IDN TSTB TT.EDI ;EOD ENTERED? BMI TT.IGO ;EXIT VIA O/P RTN TT.IDN: MOVB @PC,@R4 ;ENABLE KBD INTS MOV -(R1),R0 ;WHEN DONE, GET USING DDB ;************ CARE!!! USED AS LITERAL BY PREVIOUS INSTR ******* CLR (R1)+ ;..;IF SO SHIFT INPUT TO HIGH ASL @SP ASL @SP ASL @SP CLRB (R1)+ ;MAKE NXT INSTR = MOVB CR.BST: BISB 1(SP),-1(R1) ;SET HIGH BYTE AS REQD. MOVB (SP)+,(R1)+ ;THEN LOW BYTE MOV R1,CR.IBP ;SAVE PTR CMP (SP)+,#7417 ;NOW LOOK FOR EOF CARD BNE CR.BXT DECB @R0 ;... PUNCHED 12-11-0-1 BPL CR.BXT ;... IN CC 1 THRU 8 ASLB @R0 BMI CR.CXT ;IF NOT FND TRY NEXT TIME JMP CR.EOF ;OTHERWISE IGNORE REST OF CARD .ENDC ; C) ASCII CONVERT & STORE: ; IF AT COL 1 WE MUST READ THE BINARY BUFFER,SAFETY MARGIN) BLT KB.IG3 BGT KB.IG4 ;IF NOT FOR 1 CHAR ONLY .. CMPB R0,#25 ;... ALLOW ^U ONLY BNE KB.IG4 KB.IG3: MOVB R0,(R3)+ ;OTHERWISE STORE INPUT JSR R3,KB.PCK ;... & ADJUST PTR CMPB R0,(R4)+ ;FOLLOW CR WITH LF ... BNE .+6 MOVB (R4)+,R0 BR KB.IG3 MOV R3,KB.IPX ;SAVE POINTER KB.IG4: MOV R3,R1 KB.IG5: MOVB @PC,@#TKS ;REENABLE INTERRUPT MOV KB.ISW,R3 ;INPUT AWAITED? BEQ TT.ODN-2 ;IF NOT, EXIT MOV KB.OCT,-(SP) ;OTHERWISE PICK UP ECHO CNT BMI .+4 ;LEAVE ANY REMAINING ... . & CLEAR BUSY ASR @R1 ;CONVERT ANY REMAINING COUNT MOV @R1,16(R0) ;... & GIVE TO MONITOR MOV 14(R0),PC ;EXIT DIRECTLY TO MONITO ; 2) TERMINAL INTERRUPTS: ; A) KEYBOARD CALL: ; THIS ROUTINE STORES INPUT IN BUFFER, CONVERTING ; ALT MODE TO ESC, FLAGGING CHAR AFTER THESE ; TO STOP SPECIAL ACTION & FOLLOWING CR WITH ; LF. ALLOWS MORE INPUT IF ROOM IN BUFFER ; BY LEAVING INT ENB BUT WILL ACCEPT ONLY ; CTL/U WHEN THE BUFFER IS FILLED. CALLS PROC. ; ROUTINE IF CURRENTLY AWAITING DATA. CHECK FOR ; ONE OF SEVERAL CONTROL CARDS, AND CONVERT BACK TO ASCII. ; CR.ASC: TSTB @R0 ;CHECK FOR COL 1 BEQ CR.C1 MOVB @#CR.DB2,R1 ;GET ASCII VERSION BR CR.CVT ;. . . AND GO CONVERT CR.C1: MOV @#CR.DB1,R1 ;GET CHARACTER IN BINARY FORM CMP R1,#EOF ;CHECK FOR EOF CARD BNE .+6 JMP CR.EOF .IFDF BLANKS ;FOR BLANK SUPPRESS ... CMP R1,#BSUP ;... LOOK FOR SUPPRESS ON BNE .+6 JMP CR.ZON .ENDC .IFNDF ONLY26&ONLY29;FOR DUAL PUNCH DRIVER ... CMP R1,#SET29 ;... CHECK IF 029 CTL BN CLR @SP ;OTHERWISE ZERO IT JMP KB.IC1 ;... & GO PROCESS ; B) PRINTER CALL: ; THIS ROUTINE HANDLES ALL PRINT OPERATIONS, ; INCLUDING SPECIAL ECHO AS REQD.I.E.:- ; CONVERSION OF HT & FF, DISCARDING OF ; NULL, VT & PRINT RUBOUT, CONVERSION ; OF CTL CHARS TO ^ FOLLOWED BY ASSOC. ; NORMAL CHAR. ; IT ALSO EFFECTS ERASURE OF UNWANTED INPUT BY ; ACTUALLY REPLACING CHAR WITH RUBOUT, ; (INCLUDING ESCAPE IF PRECEDING) & ; PRODUCES APPROPRIATE ECHO. FOR ^U ; IT ADJUSTS LINE START TO REMOV KT.INT: BCS KT.INO ;COMMON ENTRY ON INT. TST TT.ISW ;IF INPUT, READER'S BABY? BGT TT.IIS ;IF SO GIVE IT TO HIM! KB.IIS: JSR PC,KB.IGP ;GET INTERNAL BUFF PTRS MOV PC,R4 ;SET CHECK STRING POINTER ADD #KB.ICS-.,R4 BICB (R4)+,R0 ;STRIP PARITY BIT CMPB R0,(R4)+ ;^U INPUT? BNE KB.IG1 ;IF NOT CONTINUE CMP R1,R2 ;OTHERWISE ANY OTHER INPUT? BNE KB.IG1 MOV KB.OSW,R5 ;IF NOT, PRINT U/W? BLE KB.IG5 BISB R5,KB.PSP ;IF SO STOP LINE OUTPUT BR KB.IG5 ;... & FORGET IT! KB.IG1: MOV R1,R3E .+6 JMP CR.029 CMP R1,#SET26 ;... OR 026 CTL BNE .+6 JMP CR.026 .ENDC ; NOW WE KNOW THAT WE HAVE A NORMAL ASCII CHARACTER BUT ; IT IS IN BINARY MODE. CONVERT AS FOLLOWS: ; BITS GO TO ; 11-9 7-5 ; 1 3 ; 0 4 ; 8-2 2-0 NOTE THAT THIS ONE WONT FIT. ; SEE PERIPHERALS MANUAL FOR THE ; CORRECT ALGORITHM. ; THIS ALGORITHM WORKS FOR ; NON-MULTI-PUNCHED CARDS. ; (IE, ALL LEGAL CHARACTER CODES) MOV R2,-(SP) ;SAVE USER REGISTER 2 MOV R1,R2 BIC #170774,R1 ;CLEAR AE ; UNWANTED GARBAGE & RELEASES KB BUFFER ; AREA IT OCCUPIES. ; IT WILL NOT BE CALLED FOR SUPPRESSED ECHO; ; HOWEVER FOR SUPPRESSED PRINT IT ; PERFORMS NORMAL PROCESSING, ONLY ; STOPPING ACTUAL OUTPUT TRANSMISSION. ; ;ENTRY FOR OUTPUT INTERRUPT: KT.INO: TST TT.OSW ;ON OUTPUT INT MAY BE PUNCH BGT TT.OIS ;IF SO GO TO ITS ROUTINE ;STANDARD SEQUENCE FOR PRINTER PROCESSING: ; GETS CHAR. OR ITS SUBSTITUTE & SETS UP FOR NEXT ; A) GET CHARACTER FROM BUFFER: KB.OIS: MOV KB.OBP,R3 ;GET BUFFE ;SET MOVING PTR KB.ESW: BR .+4 ;ESC SW. (BR .+2 WHEN SET) BIS -(R4),R0 ;FLAG CHAR. IF LAST = ESC CLRB KB.ESW ;ASSUME ESC COMING CMPB R0,(R4)+ ;RUBOUT? (OR FLAGGED) BHIS KB.IG2 ;IF SO OMIT ESC CHECK CMPB R0,(R4)+ ;ALT MODES (375/6)? BGE KB.IG5 CMPB R0,(R4)+ ;... OR ESCAPE? BEQ KB.IG5 ;IF SO SET SWITCH KB.IG2: INCB KB.ESW ;... BY OMITTING THIS ;STORE CHARACTER IF ROOM IN BUFFER: SUB R2,R1 ;MORE ROOM IN BUFFER? BMI .+6 SUB #KB.IBZ,R1 ;... ALLOWING WRAP AROUND ADD #3,R1 ;(LL BUT 11-9, 0, 1 ASR R1 ;OLD BIT 0 => C BIT IN STATUS BCC .+6 BIS #200,R1 ;WILL BE BIT 4 IN FINAL WORD ASR R1 ;OLD BIT 1 => C BIT BCC .+6 BIS #40,R1 ;WILL BE BIT 3 ASR R1 ASR R1 ;11-9 NOW IN 7-5, 3-4 ALSO SET BIT #774,R2 ;CHECK 8-2 BEQ CR.CVD ;ALL DONE IF ZERO ASR R2 SWAB R2 ;OLD 8-2 NOW IN 15-9 CR.CVL: INC R1 ;ALL THIS JUST TO BE COMPATABLE ASL R2 ;WITH THE 10 BCC CR.CVL CR.CVD: MOV (SP)+,R2 ;RESTORE USER R2 MOVB R1,R1 ;SIGN EXTEND IF BIT 7 ON. CR.CVT: MOV #1R POINTER IF NOT MOV KB.OSW,-(SP) ;GET SWITCH FOR LATER CHECKING KB.OGO: INC KB.OCT ;MORE IN BUFFER? BGT KB.ODN CLR R5 ;WILL BE USED AS RUBOUT SW. MOV PC,R4 ;FOR MORE, SET CHK STRG PTR ADD #KB.OCS-.,R4 MOV R3,R2 ;HOLD BUFF PTR AGAINST ECHO SIT MOVB (R3)+,R0 ;GET CHARACTER ... JSR R3,KB.PCK ;... & ADJUST PTR ; B) IF ECHO PRINT, TAKE DELETE ACTION IF REQUIRED: TST @SP ;CHECK IF ECHO PRINT BPL KB.OG1 ;IF NOT OMIT ALL THIS CMPB R0,#25 ;CHECK FOR ^U BNE KB.OD0 TST KB.CSW SAFETY MARGIN) BLT KB.IG3 BGT KB.IG4 ;IF NOT FOR 1 CHAR ONLY .. CMPB R0,#25 ;... ALLOW ^U ONLY BNE KB.IG4 KB.IG3: MOVB R0,(R3)+ ;OTHERWISE STORE INPUT JSR R3,KB.PCK ;... & ADJUST PTR CMPB R0,(R4)+ ;FOLLOW CR WITH LF ... BNE .+6 MOVB (R4)+,R0 BR KB.IG3 MOV R3,KB.IPX ;SAVE POINTER KB.IG4: MOV R3,R1 KB.IG5: MOVB @PC,@#TKS ;REENABLE INTERRUPT MOV KB.ISW,R3 ;INPUT AWAITED? BEQ TT.ODN-2 ;IF NOT, EXIT MOV KB.OCT,-(SP) ;OTHERWISE PICK UP ECHO CNT BMI .+4 ;LEAVE ANY REMAINING ... 04,-(SP) ;SET INDEX FOR SPECIAL CHARACTERS CMPB R1,#240 ;TEST IF RPG SPECIAL BEQ CR.RPG INC (SP) CMPB R1,#140 ;TEST IF RPG SPECIAL BEQ CR.RPG TST (SP)+ TSTB R1 BPL .+6 ;CONVERT CODES >200 ... ADD #340,R1 ;... TO RANGE >140 MOV R1,-(SP) ;CONVERT CARD CODE ... CR.SUB: SUB #40,R1 ;FOR EACH 40 IN CODE ... BMI CR.STO ;... ADD 21 & STRIP 40 SUB #17,@SP ;... TO GET TABLE INDEX BR CR.SUB CR.STO: .IFNDF ONLY26&ONLY29 ADD CR.TOS,@SP ;PICK APPROP. TABLE .ENDC CR.RPG: ADD PC,@S;SECOND TIME THRU? BNE KB.OS6 ;IF SO SET UP CRLF ECHO KB.OD0: MOV #0,R5 ;RUBOUT SWITCH ON? KB.DSW=.-2 BEQ KB.OD2 CMPB R0,@R4 ;IF SO RUBOUT AGAIN? BNE KB.OD3 ;NO - GO CLEAR SWITCH NOW KB.OD1: CMP R5,KB.IPY ;ANY TO DELETE? BEQ KB.OGO ;IF NOT IGNORE CMP R5,KB.IBS ;ADJUST IF NECESSARY BNE .+6 ADD #KB.IBZ,R5 CMPB -(R5),@R4 ;IGNORE IF DELETED ALREADY BEQ KB.OD1 MOVB @R5,R0 ;ERASE DELETED CHAR. MOVB @R4,@R5 KB.OD2: CMPB R0,@R4 ;IF NO DELETE SW, RUBOUT NOW? BNE KB.OG1 MOV R2 CLR @SP ;OTHERWISE ZERO IT JMP KB.IC1 ;... & GO PROCESS ; B) PRINTER CALL: ; THIS ROUTINE HANDLES ALL PRINT OPERATIONS, ; INCLUDING SPECIAL ECHO AS REQD.I.E.:- ; CONVERSION OF HT & FF, DISCARDING OF ; NULL, VT & PRINT RUBOUT, CONVERSION ; OF CTL CHARS TO ^ FOLLOWED BY ASSOC. ; NORMAL CHAR. ; IT ALSO EFFECTS ERASURE OF UNWANTED INPUT BY ; ACTUALLY REPLACING CHAR WITH RUBOUT, ; (INCLUDING ESCAPE IF PRECEDING) & ; PRODUCES APPROPRIATE ECHO. FOR ^U ; IT ADJUSTS LINE START TO REMOVP ;COMPUTE ADDR OF BYTE REQD ADD #CR.TBL-.,@SP MOVB @(SP)+,(R0)+ ;... & STORE IN BUFFER CMP R0,CR.UBE ;BUFFER FULL? BEQ CR.EXT CR.BXT: MOVB @PC,@R0 ;IF NOT SET UNDERWAY FLAG CR.CXT: MOV R0,CR.UBP ;SAVE NEW POINTER MOV (SP)+,R1 ;RESTORE USER REGS. CR.IXT: MOV (SP)+,R0 RTI ;... & EXIT ; D) CARD COMPLETED: CR.DUN: CLRB @#CR.CSR ;STOP INTERRUPTS TSTB @R0 ;IF NO PROCESSING YET ... BEQ CR.RPT ;... CONTINUE MOV (SP)+,R0 ;OTHERWISE RESTORE USER R0 MOV @#CR.RSV,-(SP) ;... & NOW SA,R5 ;IF SO SET SWITCH BR .+4 KB.OD3: CLR R5 ;IF ALSO AT END OF STRING ... MOVB #134,R0 ;... REPLACE WITH \ KB.OD4: ADD #5,R4 ;BUMP STRG PTR .... BR KB.OS3 ;... & GO SIT FOR NOW ; C) PROCESS FOR SPECIAL CHARACTERS: KB.OG1: MOVB (R4)+,R1 ;ADJUST CHECK POINTER BICB (R4)+,R0 ;STRIP PARITY BIT ... BEQ KB.OGO ;... & IGNORE NULLS CMPB R0,R1 ;... RUBOUT .... BEQ KB.OGO CMPB R0,(R4)+ ;... & VERTICAL TAB BEQ KB.OGO MOV R0,R1 ;SAVE IN CASE REQUIRED LATER CMPB R0,(R4)+ ;REPLACE HE ; UNWANTED GARBAGE & RELEASES KB BUFFER ; AREA IT OCCUPIES. ; IT WILL NOT BE CALLED FOR SUPPRESSED ECHO; ; HOWEVER FOR SUPPRESSED PRINT IT ; PERFORMS NORMAL PROCESSING, ONLY ; STOPPING ACTUAL OUTPUT TRANSMISSION. ; ;ENTRY FOR OUTPUT INTERRUPT: KT.INO: TST TT.OSW ;ON OUTPUT INT MAY BE PUNCH BGT TT.OIS ;IF SO GO TO ITS ROUTINE ;STANDARD SEQUENCE FOR PRINTER PROCESSING: ; GETS CHAR. OR ITS SUBSTITUTE & SETS UP FOR NEXT ; A) GET CHARACTER FROM BUFFER: KB.OIS: MOV KB.OBP,R3 ;GET BUFFEVE ALL JSR R5,@(SP)+ MOV CR.UBP,R0 ;SET USER BUFF PTR .IFDF BINARY ;FOR BINARY VERSION ... TSTB CR.ISW ;... CHECK IF BINARY READ BNE CR.BDN ;IF SO ACTION ACCRODINGLY .ENDC MOV CR.UBE,R1 ;FOR ASCII, SET END PTR .IFDF BLANKS ;... & PERHAPS CHECK SUPPRESS CR.ZSW: BR .+2 ;SWITCH ON? BR CR.ADN ;IF NOT NO SUPPRESSION .IFNDF MARKS TSTB @R0 ;TEST IF END OF FILE BMI CR.DXT ;SKIP NEXT CALCULATION IF EOF CMP R0,R1 ;IF BUFFER FULL OMIT NEXT BEQ .+6 SUB #8.,R0 ;OTHERWISE LOSE CORIZ. TAB ... BNE KB.OG2 MOVB #40,R0 ;... WITH SPACES .... TSTB #7 ;... UNTIL NEXT TAB STOP KB.TCT=.-2 BNE KB.OS2 ;MEANWHILE SIT ON HT KB.OG2: CMPB R0,(R4)+ ;FORM FEED ... BNE KB.OG3 MOVB @R4,R0 ;... IS REPLACED BY LF TST KB.LCT ;... UNTIL PAGE-END BNE KB.OS3 KB.OG3: CMPB R0,(R4)+ ;LINE-FEED.... BEQ KB.OS4 ;... MUST LOOK FOR PAGE-END CMPB R0,#15 ;CR MAY RESTORE PRINT BEQ KB.OS5 ;... SO GO CHECK CMPB R0,#32 ;NOW LOOK FOR OTHER CTL CHARS BGT KB.OG4 BISB #100,R0 ;THESR POINTER IF NOT MOV KB.OSW,-(SP) ;GET SWITCH FOR LATER CHECKING KB.OGO: INC KB.OCT ;MORE IN BUFFER? BGT KB.ODN CLR R5 ;WILL BE USED AS RUBOUT SW. MOV PC,R4 ;FOR MORE, SET CHK STRG PTR ADD #KB.OCS-.,R4 MOV R3,R2 ;HOLD BUFF PTR AGAINST ECHO SIT MOVB (R3)+,R0 ;GET CHARACTER ... JSR R3,KB.PCK ;... & ADJUST PTR ; B) IF ECHO PRINT, TAKE DELETE ACTION IF REQUIRED: TST @SP ;CHECK IF ECHO PRINT BPL KB.OG1 ;IF NOT OMIT ALL THIS CMPB R0,#25 ;CHECK FOR ^U BNE KB.OD0 TST KB.CSW C 73-80 .ENDC CMPB -(R0),#240 ;THEN TRAILING SPACES BEQ .-4 TSTB (R0)+ ;ADJUST PTR WHEN DONE CR.ADN: .ENDC CLRB -(R1) ;CLEAR REST OF BUFFER CMP R1,R0 BHI .-4 MOVB #215,(R1)+ ;MOVE IN CARRIAGE RETURN MOVB #012,(R1)+ ;MOVE IN LINE FEED CR.DXT: MOV CR,R0 ;GET DDB ADDRESS JMP @14(R0) ;TAKE COMPLETION EXIT .IFDF BINARY CR.BDN: MOV CR.IBS,R1 ;FOR BINARY, INIT INT PTR MOVB @R0,R2 ;EXIT IF EOF SEEN BMI CR.DXT ;ALSO SETS INTERRUPT FLAG JSR PC,CR.BIN ;ELSE GO MOVE DATA TO USER E MUST BE CONVERTED COM #0 ;... & PRECEDED BY ^ KB.CSW=.-2 BNE KB.OS1 KB.OG4: DECB KB.TCT ;RESET TAB STOP IF NEC BPL KB.OG6 KB.OG5: MOVB @R4,KB.TCT KB.OG6: MOV R5,KB.DSW ;STORE LATEST DELETE SW. TST (SP)+ ;TRUE PRINT? BPL .+4 ;IF NOT ADJUST FOR ECHO INC R4 BITB @R4,KB.PSP ;BECAUSE,AFTER ALL THAT, .... BNE KB.OIS+4 ;... MAYBE NO PRINT ANYWAY!!! MOV R3,KB.OBP ;SAVE LATEST PTR SETTING JMP KT.OGO ;JOIN TT TO OUTPUT ;SPECIAL CASES: ; 1) CTL CHARACTERS (FIRST PASS): KB.OS1: MO;SECOND TIME THRU? BNE KB.OS6 ;IF SO SET UP CRLF ECHO KB.OD0: MOV #0,R5 ;RUBOUT SWITCH ON? KB.DSW=.-2 BEQ KB.OD2 CMPB R0,@R4 ;IF SO RUBOUT AGAIN? BNE KB.OD3 ;NO - GO CLEAR SWITCH NOW KB.OD1: CMP R5,KB.IPY ;ANY TO DELETE? BEQ KB.OGO ;IF NOT IGNORE CMP R5,KB.IBS ;ADJUST IF NECESSARY BNE .+6 ADD #KB.IBZ,R5 CMPB -(R5),@R4 ;IGNORE IF DELETED ALREADY BEQ KB.OD1 MOVB @R5,R0 ;ERASE DELETED CHAR. MOVB @R4,@R5 KB.OD2: CMPB R0,@R4 ;IF NO DELETE SW, RUBOUT NOW? BNE KB.OG1 MOV R2 MOV @#CR.SXT,R5 ;IF COME BACK, MORE READ REQD. JMP 4(R5) ;SO TAKE SYSTEM EXIT .ENDC ;SPECIAL CASE PROCESSING: ; A) ERROR ROUTINE: CR.ERR: CLRB @#CR.CSR ;STOP INTERRUPTS JSR PC,CR.NRY ;INFORM OPERATOR CR.RPT: JSR PC,CR.AGN ;IF RETURN TRY AGAIN BR CR.IXT ;... & EXIT FOR NOW ; B) END OF FILE CARD SEEN: CR.EOF: MOV CR,R1 ;GET DDB ADDRESS .IFNDF BINARY ;FOR SIMPLE VERSION ... MOV 10(R1),16(R1) ;... NO DATA READ ON EOF .ENDC .IFDF BINARY ;MAYBE SOME IF BINARY ... ADD #16,R1 ;VB #136,R0 ;ECHO ^ THIS TIME CMPB -(R4),-(R4) ;MOVE STRING POINTER BACK ... ; 2) HORIZONTAL TAB: ; (ALSO RUBOUT \ ECHO) KB.OS2: INC R4 ;GO TO LF IN STRING TST R5 ;TAB UNDER DELETION? BEQ KB.OS3 ;IF SO GO AND SIT MOVB R1,(R5)+ ;OTHERWISE USE DELETE SIT ; 3) FORM FEED: KB.OS3: MOV R2,R3 ;AS WELL AS NORMAL SIT DEC KB.OCT ;... BY ADJUST CNT & PTR BR KB.OG3 ; 4) LINE-FEED: KB.OS4: INC KB.LCT ;IF AT PAGE-END ... BLE KB.OG5 MOV #-7.,KB.LCT ;... RESET LINE COUNT BR KB.OG5 ;R,R5 ;IF SO SET SWITCH BR .+4 KB.OD3: CLR R5 ;IF ALSO AT END OF STRING ... MOVB #134,R0 ;... REPLACE WITH \ KB.OD4: ADD #5,R4 ;BUMP STRG PTR .... BR KB.OS3 ;... & GO SIT FOR NOW ; C) PROCESS FOR SPECIAL CHARACTERS: KB.OG1: MOVB (R4)+,R1 ;ADJUST CHECK POINTER BICB (R4)+,R0 ;STRIP PARITY BIT ... BEQ KB.OGO ;... & IGNORE NULLS CMPB R0,R1 ;... RUBOUT .... BEQ KB.OGO CMPB R0,(R4)+ ;... & VERTICAL TAB BEQ KB.OGO MOV R0,R1 ;SAVE IN CASE REQUIRED LATER CMPB R0,(R4)+ ;REPLACE HSO MOVE TO UNUSED COUNT STORE MOV R0,@R1 ;... & COMPUTE VALUE REQD SUB CR.UBE,@R1 ASR @R1 ;... AS WORDS! .ENDC COM @R0 ;SET FLAG CR.EXT: BISB #2,@#CR.CSR ;ALLOW REST OF CARD THRU BR CR.CXT ; C) CONTROL CARD SEEN: .IFNDF ONLY26&ONLY29 ;FOR DUAL PUNCH DRIVER ... CR.026: MOV #106,CR.TOS ;... SET TABLE OFFSET ... BR CR.EXT ;... & IGNORE REST OF CTL CARD CR.029: CLR CR.TOS BR CR.EXT .ENDC .IFDF BLANKS ;IN SUPPRESS VERSION CR.ZON: MOVB #1,CR.ZSW ;...SET SUPPRESS ON BR CR.EXT ETURN TO RESET TAB STOP ; 5) CARRIAGE RETURN: KB.OS5: TST @SP ;TRUE PRINT? BMI KB.OG5 BICB @SP,KB.PSP ;IF SO, REMOVE LINE SUPPRESS BR KB.OG5 ; 6) INPUT CTRL/U - RESTORE CARRIAGE: KB.OS6: MOVB -(R4),@R2 ;REPLACE ^U WITH LF MOVB -(R4),-(R2) ;... & PREV SLOT WITH CR CMP KB.IPY,KB.ILE ;LINE ALREADY U/W? BNE .+6 ;IF SO LEAVE END PTR MOV R3,KB.ILE ;OTHERWISE RESET IT ... MOV R3,KB.IPY ;... & RELEASE INPUT BUFFER CMPB (R4)+,(R4)+ ;RESET STRING PTR DEC KB.OCT ;ADJUST CNT FOR 1 CHAR .ORIZ. TAB ... BNE KB.OG2 MOVB #40,R0 ;... WITH SPACES .... TSTB #7 ;... UNTIL NEXT TAB STOP KB.TCT=.-2 BNE KB.OS2 ;MEANWHILE SIT ON HT KB.OG2: CMPB R0,(R4)+ ;FORM FEED ... BNE KB.OG3 MOVB @R4,R0 ;... IS REPLACED BY LF TST KB.LCT ;... UNTIL PAGE-END BNE KB.OS3 KB.OG3: CMPB R0,(R4)+ ;LINE-FEED.... BEQ KB.OS4 ;... MUST LOOK FOR PAGE-END CMPB R0,#15 ;CR MAY RESTORE PRINT BEQ KB.OS5 ;... SO GO CHECK CMPB R0,#32 ;NOW LOOK FOR OTHER CTL CHARS BGT KB.OG4 BISB #100,R0 ;THES ;AGAIN IGNORE REST OF CARD .ENDC ;READER NOT READY SUBROUTINE: CR.NRY: MOV CR.NAM,-(SP) ;IDENTIFY DEVICE MOV #402,-(SP) ;GIVE NOT READY CODE IOT ;... & CALL EDP RTS PC ;TRY AGAIN IF COME BACK ; ;MISCELLANEOUS DEFINITIONS: CR.CSR=177160 CR.DB1=177162 CR.DB2=177164 CR.SXT=42 CR.RSV=44 EOF=007417 ;12-11-0-1-6-7-8-9 PUNCH SET26=004242 ;12-2-4-8 PUNCH SET29=005252 ;12-0-2-4-6-8 PUNCH BSUP=007007 ;12-11-0-7-8-9 PUNCH CR.TBL: ;PARITY ASCII CONVERSION TABLE FOR 029 PUNCH .IF.. BR KB.OD4 ;USE ANOTHER SPECIAL LOOP ;... TO ADJ. FOR OTHER & RESET ;SUBSIDIARY SUB-ROUTINES: ; 1) CHECK TRANSFER DIRECTION ON SET-UP ENTRY: ; CALLED BY JSR R4,TT.DCK OR KB.DCK ; RETURNS CALL+2 FOR INPUT, CALL+4 FOR OUTPUT ; WITH TRANSFER CONTROLS IN REGS. & ; SAVED PRIORITY IN R4 (FOR TT ONLY). TT.DCK: MOV @R5,@SP ;PREVENT INTERRUPT FOR NOW MOVB #340,@R5 KB.DCK: MOV R0,R1 ;SET MOVING POINTER ADD #6,R1 MOV (R1)+,R2 ;GET BUFFER ADDRESS MOV (R1)+,R3 ;... & WORD COUNT ASLE MUST BE CONVERTED COM #0 ;... & PRECEDED BY ^ KB.CSW=.-2 BNE KB.OS1 KB.OG4: DECB KB.TCT ;RESET TAB STOP IF NEC BPL KB.OG6 KB.OG5: MOVB @R4,KB.TCT KB.OG6: MOV R5,KB.DSW ;STORE LATEST DELETE SW. TST (SP)+ ;TRUE PRINT? BPL .+4 ;IF NOT ADJUST FOR ECHO INC R4 BITB @R4,KB.PSP ;BECAUSE,AFTER ALL THAT, .... BNE KB.OIS+4 ;... MAYBE NO PRINT ANYWAY!!! MOV R3,KB.OBP ;SAVE LATEST PTR SETTING JMP KT.OGO ;JOIN TT TO OUTPUT ;SPECIAL CASES: ; 1) CTL CHARACTERS (FIRST PASS): KB.OS1: MONDF ONLY26 .BYTE 240 ;SPACE .BYTE 261 ;1 .BYTE 262 ;;2 .BYTE 63 ;3 .BYTE 264 ;4 .BYTE 65 ;5 .BYTE 66 ;6 .BYTE 267 ;7 .BYTE 270 ;8 .BYTE 240 ;EMPTY .BYTE 72 ;: .BYTE 243 ;# .BYTE 300 ;@ .BYTE 47 ;' .BYTE 275 ;= .BYTE 42 ;" .BYTE 71 ;9 ; .BYTE 60 ;0 .BYTE 257 ;/ .BYTE 123 ;S .BYTE 324 ;T .BYTE 125 ;U .BYTE 126 ;V .BYTE 327 ;W .BYTE 330 ;X .BYTE 131 ;Y .BYTE 240 ;EMPTY .BYTE 134 ;\ .BYTE 254 ;, .BYTE 245 ;% .BYTE 137 R3 ;... AS BYTES BIT #2,(R1)+ ;CHECK TRANSFER FUNC BEQ .+4 ;IF READ TAKE 1ST EXIT TST (R4)+ ;IF WRITE TAKE 2ND RTS R4 ;... WITH R1 AT COMP RTN ; 2) SIMULATE INTERRUPT: ; CALLED BY JSR R4,KT.ISM ; WITH RETURN ON TOP OF STACK ; EXITS WITH SIM. INT CALL BELOW 'SAVED' REGS ON ; STACK (R0 CORRECTLY SAVED) KT.ISM: MOV 2(SP),@SP ;GET RETURN ADDRESS ... MOV @#P.STAT,2(SP) ;... & REPLACE WITH STATUS SUB #12,SP ;'SAVE' REGS 1 THRU 5 MOV R0,-(SP) ;CORRECTLY SAVE R0 MOV R4,PC ;... & EVB #136,R0 ;ECHO ^ THIS TIME CMPB -(R4),-(R4) ;MOVE STRING POINTER BACK ... ; 2) HORIZONTAL TAB: ; (ALSO RUBOUT \ ECHO) KB.OS2: INC R4 ;GO TO LF IN STRING TST R5 ;TAB UNDER DELETION? BEQ KB.OS3 ;IF SO GO AND SIT MOVB R1,(R5)+ ;OTHERWISE USE DELETE SIT ; 3) FORM FEED: KB.OS3: MOV R2,R3 ;AS WELL AS NORMAL SIT DEC KB.OCT ;... BY ADJUST CNT & PTR BR KB.OG3 ; 4) LINE-FEED: KB.OS4: INC KB.LCT ;IF AT PAGE-END ... BLE KB.OG5 MOV #-7.,KB.LCT ;... RESET LINE COUNT BR KB.OG5 ;R ;_ .BYTE 276 ;> .BYTE 77 ;? .BYTE 132 ;Z ; .BYTE 55 ;- .BYTE 312 ;J .BYTE 113 ;K .BYTE 314 ;L .BYTE 115 ;M .BYTE 116 ;N .BYTE 317 ;O .BYTE 120 ;P .BYTE 321 ;Q .BYTE 240 ;EMPTY .BYTE 335 ;] .BYTE 44 ;$ .BYTE 252 ;* .BYTE 251 ;) .BYTE 273 ;; .BYTE 336 ;^ .BYTE 322 ;R ; .BYTE 246 ;& .BYTE 101 ;A .BYTE 102 ;B .BYTE 303 ;C .BYTE 104 ;D .BYTE 305 ;E .BYTE 306 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 240 ;EMPTY .BYTE 333 XIT ; 3) COMMON SET-UP FOR TT: ; CALLED BY JSR R1,TT.OIC WITH ARGS FOLLOWING ; EXITS WITH THESE CORRECTLY SET-UP ; PROVIDED THAT REQUIRED DRIVER SECTION IS FREE ; (IF NOT TREATS AS FATAL ERROR - MORE THAN 1 USER) ; IF CORRESPONDING SIDE OF KB IS BUSY ; ALLOWS IT TO FINISH MOV R4,@R5 ;ALLOW INT TEMPORARILY TT.OIC: MOV R0,@SP ;SAVE DDB ADDRESS MOVB @PC,@R5 ;... &STOP INT AGAIN TST @R1 ;CHECK IF SECTION BUSY BEQ TT.OIG ;IF NOT CONTINUE BPL .+4 ;MAYBE SAME D/S AFTER RESTART COM ETURN TO RESET TAB STOP ; 5) CARRIAGE RETURN: KB.OS5: TST @SP ;TRUE PRINT? BMI KB.OG5 BICB @SP,KB.PSP ;IF SO, REMOVE LINE SUPPRESS BR KB.OG5 ; 6) INPUT CTRL/U - RESTORE CARRIAGE: KB.OS6: MOVB -(R4),@R2 ;REPLACE ^U WITH LF MOVB -(R4),-(R2) ;... & PREV SLOT WITH CR CMP KB.IPY,KB.ILE ;LINE ALREADY U/W? BNE .+6 ;IF SO LEAVE END PTR MOV R3,KB.ILE ;OTHERWISE RESET IT ... MOV R3,KB.IPY ;... & RELEASE INPUT BUFFER CMPB (R4)+,(R4)+ ;RESET STRING PTR DEC KB.OCT ;ADJUST CNT FOR 1 CHAR .;[ .BYTE 56 ;. .BYTE 74 ;< .BYTE 50 ;( .BYTE 53 ;+ .BYTE 41 ;! .BYTE 311 ;I .BYTE 173 ;LEFT CURLY BRACKET .BYTE 175 ;RIGHT CURLY BRACKET .ENDC ;PARITY ASCII CONVERSION TABLE FOR 026 PUNCH: .IFNDF ONLY29 .BYTE 240 ;SPACE .BYTE 261 ;1 .BYTE 262 ;2 .BYTE 63 ;3 .BYTE 264 ;4 .BYTE 65 ;5 .BYTE 66 ;6 .BYTE 267 ;7 .BYTE 270 ;8 .BYTE 240 ;EMPTY .BYTE 137 ;_ .BYTE 275 ;= .BYTE 300 ;@ .BYTE 336 ;^ .BYTE 47 ;' .BYTE 134 ;\ .BYTE 71 ;9 ;@SP ;SO ALLOW FOR IN WAIT STATE CMP @R1,@SP ;... & CHECK BEQ TT.OIC-2 MOV @R0,@SP ;OTHERWISE GIVE EVIDENCE MOV #TT.MER,-(SP) ;CALL ERROR DIAG PRT ... IOT ;... & IT'S FATAL! TT.OIG: MOV R0,(R1)+ ;SET BUSY FLAG CLR TT ;... & 'FREE' DRIVER MOV R3,(R1)+ ;STORE BUFFER POINTER MOV R2,(R1)+ ;... & BYTE COUNT MOV R4,@R5 ;DROP PRIORITY MOV (R1)+,(SP)+ ;KB SIDE BUSY? BNE TT.OIX ;IF SO WAIT FOR NOW JSR R4,KT.ISM ;OTHERWISE SIMULATE INT ADD @R1,PC ;...& GO TO INT RTN TT.OIX: COM -.. BR KB.OD4 ;USE ANOTHER SPECIAL LOOP ;... TO ADJ. FOR OTHER & RESET ;SUBSIDIARY SUB-ROUTINES: ; 1) CHECK TRANSFER DIRECTION ON SET-UP ENTRY: ; CALLED BY JSR R4,TT.DCK OR KB.DCK ; RETURNS CALL+2 FOR INPUT, CALL+4 FOR OUTPUT ; WITH TRANSFER CONTROLS IN REGS. & ; SAVED PRIORITY IN R4 (FOR TT ONLY). TT.DCK: MOV @R5,@SP ;PREVENT INTERRUPT FOR NOW MOVB #340,@R5 KB.DCK: MOV R0,R1 ;SET MOVING POINTER ADD #6,R1 MOV (R1)+,R2 ;GET BUFFER ADDRESS MOV (R1)+,R3 ;... & WORD COUNT ASL .BYTE 60 ;0 .BYTE 257 ;/ .BYTE 123 ;S .BYTE 324 ;T .BYTE 125 ;U .BYTE 126 ;V .BYTE 327 ;W .BYTE 330 ;X .BYTE 131 ;Y .BYTE 240 ;EMPTY .BYTE 273 ;; .BYTE 254 ;, .BYTE 50 ;( .BYTE 42 ;" .BYTE 243 ;# .BYTE 245 ;% .BYTE 132 ;Z ; .BYTE 55 ;- .BYTE 312 ;J .BYTE 113 ;K .BYTE 314 ;L .BYTE 115 ;M .BYTE 116 ;N .BYTE 317 ;O .BYTE 120 ;P .BYTE 321 ;Q .BYTE 240 ;EMPTY .BYTE 72 ;: .BYTE 44 ;$ .BYTE 252 ;* .BYTE 333 ;[ .BYTE10(R1) ;FOR WAIT, CVT BUSY FLAG RTS PC ;... & RETURN MONITOR P.STAT=177776 TT.MER=1420 ; 4) SET INTERNAL BUFFER POINTERS: ; CALLED BY JSR PC,KB.IGP ; ON FIRST ENTRY (FROM EITHER PROGRAM TFR REQUEST OR ; KBD INTERRUPT) ESTABLISHES ABSOLUTE VALUES ; FOR POINTERS & CONTROLS. AS THEN THESE ; WILL NOT CHANGE UNTIL DRIVER IS RELEASED, ; IT EFFECTIVELY REMOVES ROUTINE THAT DOES SO. ; THEREAFTER ENABLES SETTING OF POINTERS WITH LATEST ; VALUES AS FOLLOWS:- ; ; R1:= CHARACTER STORAGE POIN R3 ;... AS BYTES BIT #2,(R1)+ ;CHECK TRANSFER FUNC BEQ .+4 ;IF READ TAKE 1ST EXIT TST (R4)+ ;IF WRITE TAKE 2ND RTS R4 ;... WITH R1 AT COMP RTN ; 2) SIMULATE INTERRUPT: ; CALLED BY JSR R4,KT.ISM ; WITH RETURN ON TOP OF STACK ; EXITS WITH SIM. INT CALL BELOW 'SAVED' REGS ON ; STACK (R0 CORRECTLY SAVED) KT.ISM: MOV 2(SP),@SP ;GET RETURN ADDRESS ... MOV @#P.STAT,2(SP) ;... & REPLACE WITH STATUS SUB #12,SP ;'SAVE' REGS 1 THRU 5 MOV R0,-(SP) ;CORRECTLY SAVE R0 MOV R4,PC ;... & E 276 ;> .BYTE 246 ;& .BYTE 322 ;R ; .BYTE 53 ;+ .BYTE 101 ;A .BYTE 102 ;B .BYTE 303 ;C .BYTE 104 ;D .BYTE 305 ;E .BYTE 306 ;F .BYTE 107 ;G .BYTE 110 ;H .BYTE 240 ;EMPTY .BYTE 77 ;? .BYTE 56 ;. .BYTE 251 ;) .BYTE 335 ;] .BYTE 74 ;< .BYTE 41 ;! .BYTE 311 ;I .BYTE 173 ;LEFT CURLY BRACKET .BYTE 175 ;RIGHT BURLY BRACKET .ENDC ;INTERNAL BUFFER FOR BINARY STORAGE: .IFDF BINARY CR.BUF: .IFNDF MARKS CR.BSZ=120. .ENDC .IFDF MARKS CR.BSZ=6TER (KB.IPX) ; R2:= CHARACTER REMOVAL POINTER (KB.IPY) ; R3:= LINE SCAN POINTER (KB.ECP) ; N.B. BUFFER OPERATES IN CIRCULAR FASHION BETWEEN KB.IBS ; & KB.IBE. IT IS EMPTY WHEN R1=R2 & FULL WHEN ; R1-R2(-SIZE)=-1 (LEAVING ODD SPACE FOR JIGGERY-POKERY) ; CHARACTERS BEING PROCESSED REMAIN IN BUFFER BETWEEN ; KB.IPY AND KB.ILE UNTIL REQUIRED ECHO & LINE SCAN ; HAVE BEEN COMPLETED AND ARE REMOVED ONLY WHEN GIVEN ; TO THE MONITOR OR SUBSEQUENT ^U HAS BEEN OUTPUT. KB.IGP: BR KB.IGI ;CHANGED TO BR .XIT ; 3) COMMON SET-UP FOR TT: ; CALLED BY JSR R1,TT.OIC WITH ARGS FOLLOWING ; EXITS WITH THESE CORRECTLY SET-UP ; PROVIDED THAT REQUIRED DRIVER SECTION IS FREE ; (IF NOT TREATS AS FATAL ERROR - MORE THAN 1 USER) ; IF CORRESPONDING SIDE OF KB IS BUSY ; ALLOWS IT TO FINISH MOV R4,@R5 ;ALLOW INT TEMPORARILY TT.OIC: MOV R0,@SP ;SAVE DDB ADDRESS MOVB @PC,@R5 ;... &STOP INT AGAIN TST @R1 ;CHECK IF SECTION BUSY BEQ TT.OIG ;IF NOT CONTINUE BPL .+4 ;MAYBE SAME D/S AFTER RESTART COM 0. .ENDC .=.+CR.BSZ .ENDC .END +2 AT 1ST ENTRY JSR R5,KB.ISP ;SETS REGS AS REQD ALWAYS. KB.IPX: .WORD 0 ;USING THESE VARIABLES ... KB.IPY: .WORD 0 ;... STORED HERE INITIALLY KB.ECP: .WORD 0 RTS PC ;NORMAL EXIT KB.ILE: .WORD 0 ;CONTROLS ALSO SET AT START KB.IBS: .WORD 0 ; KB.IGI: JSR R5,@PC ;INITIALISING ROUTINE: CLRB KB.IGP ;STOP ENTRY HERE HEREAFTER MOV PC,R1 ;GET ABS ADDR OF BUFFER ADD #KB.IBF-.,R1 MOV #22,R2 ;SET ROTATION COUNT TST -(R5) ;SET POINTER TO STORAGE AREA MOV R1,-(R5) ;STORE ABS VALUE AS RE@SP ;SO ALLOW FOR IN WAIT STATE CMP @R1,@SP ;... & CHECK BEQ TT.OIC-2 MOV @R0,@SP ;OTHERWISE GIVE EVIDENCE MOV #TT.MER,-(SP) ;CALL ERROR DIAG PRT ... IOT ;... & IT'S FATAL! TT.OIG: MOV R0,(R1)+ ;SET BUSY FLAG CLR TT ;... & 'FREE' DRIVER MOV R3,(R1)+ ;STORE BUFFER POINTER MOV R2,(R1)+ ;... & BYTE COUNT MOV R4,@R5 ;DROP PRIORITY MOV (R1)+,(SP)+ ;KB SIDE BUSY? BNE TT.OIX ;IF SO WAIT FOR NOW JSR R4,KT.ISM ;OTHERWISE SIMULATE INT ADD @R1,PC ;...& GO TO INT RTN TT.OIX: COM -QD ASR R2 BCC .-4 ;GO TO NEXT STORE BNE .-10 ;... BUT MUST MISS RTS PC KB.ISP: MOV (R5)+,R1 ;SET VARIABLE PTRS MOV (R5)+,R2 MOV (R5)+,R3 RTS R5 ;... & TAKE NORMAL EXIT ; 5) CHECK IF POINTER AT BUFFER END: ; CALLED BY JSR R3,KB.PCK WHERE R3 IS PTR FOR CHK KB.PCK: SUB #KB.IBZ,@SP ;RESET POINTER AS REQD. CMP @SP,KB.IBS BEQ .+6 ADD #KB.IBZ,@SP RTS R3 ;... & EXIT ;DATA STORAGE AREAS: ; 1) INPUT CHECK STRING: KB.ICS: .BYTE 200,25,177,175,33,15,12 ; 2) OUTPUT CHECK STRING: 10(R1) ;FOR WAIT, CVT BUSY FLAG RTS PC ;... & RETURN MONITOR P.STAT=177776 TT.MER=1420 ; 4) SET INTERNAL BUFFER POINTERS: ; CALLED BY JSR PC,KB.IGP ; ON FIRST ENTRY (FROM EITHER PROGRAM TFR REQUEST OR ; KBD INTERRUPT) ESTABLISHES ABSOLUTE VALUES ; FOR POINTERS & CONTROLS. AS THEN THESE ; WILL NOT CHANGE UNTIL DRIVER IS RELEASED, ; IT EFFECTIVELY REMOVES ROUTINE THAT DOES SO. ; THEREAFTER ENABLES SETTING OF POINTERS WITH LATEST ; VALUES AS FOLLOWS:- ; ; R1:= CHARACTER STORAGE POIN KB.OCS: .BYTE 177,200,13,11,14,12,7,30 .EVEN ; 3) INTERNAL BUFFER: KB.IBF: KB.IBZ=KB+1200.-. .=.+KB.IBZ .END TER (KB.IPX) ; R2:= CHARACTER REMOVAL POINTER (KB.IPY) ; R3:= LINE SCAN POINTER (KB.ECP) ; N.B. BUFFER OPERATES IN CIRCULAR FASHION BETWEEN KB.IBS ; & KB.IBE. IT IS EMPTY WHEN R1=R2 & FULL WHEN ; R1-R2(-SIZE)=-1 (LEAVING ODD SPACE FOR JIGGERY-POKERY) ; CHARACTERS BEING PROCESSED REMAIN IN BUFFER BETWEEN ; KB.IPY AND KB.ILE UNTIL REQUIRED ECHO & LINE SCAN ; HAVE BEEN COMPLETED AND ARE REMOVED ONLY WHEN GIVEN ; TO THE MONITOR OR SUBSEQUENT ^U HAS BEEN OUTPUT. KB.IGP: BR KB.IGI ;CHANGED TO BR .+2 AT 1ST ENTRY JSR R5,KB.ISP ;SETS REGS AS REQD ALWAYS. KB.IPX: .WORD 0 ;USING THESE VARIABLES ... KB.IPY: .WORD 0 ;... STORED HERE INITIALLY KB.ECP: .WORD 0 RTS PC ;NORMAL EXIT KB.ILE: .WORD 0 ;CONTROLS ALSO SET AT START KB.IBS: .WORD 0 ; KB.IGI: JSR R5,@PC ;INITIALISING ROUTINE: CLRB KB.IGP ;STOP ENTRY HERE HEREAFTER MOV PC,R1 ;GET ABS ADDR OF BUFFER ADD #KB.IBF-.,R1 MOV #22,R2 ;SET ROTATION COUNT TST -(R5) ;SET POINTER TO STORAGE AREA MOV R1,-(R5) ;STORE ABS VALUE AS REQD ASR R2 BCC .-4 ;GO TO NEXT STORE BNE .-10 ;... BUT MUST MISS RTS PC KB.ISP: MOV (R5)+,R1 ;SET VARIABLE PTRS MOV (R5)+,R2 MOV (R5)+,R3 RTS R5 ;... & TAKE NORMAL EXIT ; 5) CHECK IF POINTER AT BUFFER END: ; CALLED BY JSR R3,KB.PCK WHERE R3 IS PTR FOR CHK KB.PCK: SUB #KB.IBZ,@SP ;RESET POINTER AS REQD. CMP @SP,KB.IBS BEQ .+6 ADD #KB.IBZ,@SP RTS R3 ;... & EXIT ;DATA STORAGE AREAS: ; 1) INPUT CHECK STRING: KB.ICS: .BYTE 200,25,177,175,33,15,12 ; 2) OUTPUT CHECK STRING: KB.OCS: .BYTE 177,200,13,11,14,12,7,30 .EVEN ; 3) INTERNAL BUFFER: KB.IBF: KB.IBZ=KB+1200.-. .=.+KB.IBZ .END