ASMB,L,R,C,Q HED RW$UB * NAME: RW$UB * SOURCE: 92067-18143 * RELOC: 92067-16125 * PGMR: G.A.A.,N.J.S. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM RW$UB,7 92067-16125 REV.1903 781003 EXT RWND$, R/W$, RFLG$ EXT EXEC, P.PAS EXT .DAD, .DMP, .DDI, .DNG ENT RW$UB, $KIP, NX$EC SUP * * * * RW$UB READS AND WRITES A WORD OR BLOCK OF WORDS ON A RTE FILE * * CALLING SEQUENCE: * * SET E=1 FOR READ * E=0 FOR WRITE * LDA DCB SET A TO DCB ADDRESS * LDB COUNT SET B TO THE NO OF WORDS TO BE XFERED * JSB RW$UB CALL * DEF BUF BUFFER CONTAING (WRITE) OR RECIEVING (READ) * JMP ERROR ERROR RETURN CODE IN A * --- NORMAL RETURN * * * RW$UB NOP ENTRY CMB,INB,SZB,RSS SET NEGATIVE SKIP IF NOT ZERO JMP ZER0 ZERO GO RETURN STB COUNT NEGATIVE CLB,SEZ,RSS COUNTER LDB RSS SET READ/WRITE SWITCH STB NEXTW RSS IF WRITE, ELSE NOP JSB PRAM GO GET THE PRAMETERS ADA BUFA CALCULATE CMA,INA THE # ADA BUFPT,I OF REMAINING STA LEFT WORDS AND SET LDB BUFPT,I GET THE POINTER TO B LDA RW$UB GET USER BUFFER LDA A,I GET ADDRESS RAL,CLE,SLA,ERA IF INDIRECT JMP *-2 TRY AGAIN ISZ RW$UB STEP RETURN STA PTR SET USER POINTER NEXTW RSS NOP IF READ RSS IF WRITE JMP READ DO READ THING LDA PTR,I WRITE; GET WORD STA B,I SET IT IN DCB RDW ISZ PTR STEP POINTER INB STEP DCB ADDRESS ISZ LEFT ANY ROOM LEFT? RSS RSS YES; SKIP JMP ENDBL NO; GO WRITE IT OUT CONT ISZ COUNT STEP WORD COUNT-DONE? JMP NEXTW NO; DO NEXT WORD STB BUFPT,I RESET THE BUFFER POINTER LDA FLAG,I IF LDB NEXTW WRITE CCE THEN SZB SET THE RAR,ELA WRITTEN- STA FLAG,I ON FLAG EX ISZ RW$UB STEP THE RETURN ADDRESS JMP RW$UB,I RETURN * * ZER0 ISZ RW$UB STEP FOR GOOD RETURN JMP EX EXIT * * ENDBL LDB TYPE,I IF TYPE TWO CPB .2 THEN LDB COUNT IF COUNT IS INB,SZB,RSS EXAUSTED JMP CONT JUST CONTINUE LDA FLAG,I GET DCB WRITTEN-ON FLAG LDB NEXTW GET THE READ\WRITE FLAG CCE IF WRITING SZB THEN SET RAR,ELA THE DCB STA FLAG,I WRITTEN ON FLAG CLA SET TO GET NEXT BLOCK CLB,INB (SENDING DOUBLE WORD BLOCK #) JSB NX$EC GO GET IT JMP RW$UB,I ERROR - RETURN LDB BLKLN OK - CMB,INB RESET STB LEFT LEFT COUNTER LDB BUFA AND BUFFER POINTER JMP CONT AND CONTINUE * READ LDA B,I GET THE WORD STA PTR,I SET IN USER BUFFER JMP RDW RETURN TO WRITE CODE * * COUNT BSS 2 BUFA NOP * * * ENTRY A = DCB ADDRESS * B = # WORDS TO SKIP * * $KIP NOP SKIP ENTRY STB COUNT+1 MAKE THE WORD COUNT SSB A DOUBLE WORD INTEGER CCB,RSS TAKING INTO ACCOUNT CLB WHETHER IT IS POSITIVE STB COUNT OR NEGATIVE JSB PRAM GO SET THE PRAMS LDB BUFA COMPUTE CMB,INB THE ADB BUFPT,I BUFFER CLA OFFSET JSB .DAD ADD THE DOUBLE DEF COUNT WORD COUNT SWP DIV BLKLN DIVIDE BY BLOCK LENGTH SSB SKIP IF POSITIVE ADA N1 ELSE ADDJUST THE BLOCK SSB IF NEGATIVE ADB BLKLN ADJUST TO POSITIVE ADB BUFA COMPUTE THE NEW BUFFER ADDRESS STB TMP SAVE NEW BUFFER ADDRESS SZA,RSS IF RELATIVE BLOCK IS ZERO, JMP SK1 THEN GO EXIT LSL 16 SSB CCA JSB NX$EC GO GET THE CORRECT BLOCK JMP $KIP,I ERROR RETURN SK1 LDA TMP STA BUFPT,I SET THE BUFFER ADDRESS IN THE DCB ISZ $KIP SET TO NORMAL RETURN JMP $KIP,I MAKE NORMAL RETURN * * * ENTRY A CONTAINS DCB ADDRESS * * EXIT A CONTAINS DCB BLOCK LENGTH IN WORDS * * PRAM NOP FETCH DCB ADDRESS SUBROUTINE CLB,CLE SET UP JSB P.PAS AND DEC -16 FETCH DCB NOP DCB TMP NOP TYPE NOP TR NOP SEC NOP #SEC NOP TMP1 NOP FLAG NOP SEC/T NOP LEFT NOP USED AS LOCAL ONLY CTRK NOP CSEC NOP BUFPT NOP PTR NOP USED AS LOCAL BLKLN NOP EXT# NOP STA BUFA SAVE BUFFER ADDRESS LDA FLAG,I GET THE BLOCK LENGTH WORD AND BLMSK MASK TO BITS 14 - 7 STA BLKLN SET THE BLOCK LENGTH JMP PRAM,I RETURN TO CALLER SKP * NX$EC COMPUTES THE ADDRESS OF THE NEXT SECTOR * FOR ALL READ/WRITE ACCESSES AND FOR * SEQUENTIAL POSITIONING. * * CALLING SEQUENCE: * * DLD RELATIVE BLOCK NO. * JSB NX$EC * DISCERR/EOF RETURN (ON EXTENDABLE FILES EODISC) * NORMAL RETURN * * NX$EC WRITES THE CURRENT SECTOR BUT DOES NOT * SET THE RELATIVE POSITION POINTERS * THE TARGET BLOCK IS READ. * IF RFLG$ IS NON 0. * * * NX$EC NOP DST SECOF SAVE THE RELATIVE BLOCK NUMBER CLA CONVERT BLOCKS (A BLOCK LDB BLKLN IS AN ENTIRE DCB JSB .DMP BUFFER IN THIS CASE) DEF SECOF TO LOGICAL SECTORS SWP ASR 6 SWP DST SECOF RELATIVE SECTOR OFFSET * CLE SET E TO INDICATE WRITE LDB DCB GO WRITE THE JSB R/W$ CURRENT BLOCK JMP NX$EC,I IF ERROR, RETURN P+1 * CLB LDA #SEC,I GET FILE SIZE IN +SECTORS OR -TRACKS SSA,RSS +SECTORS ALREADY? JMP NX1 YES CMA,INA NO - CONVERT LSL 8 TO SECTORS NX1 SWP GET TO A,B REGISTERS DST SIZE AND SAVE * LDA TR,I COMPUTE THE RELATIVE CMA,INA SECTOR ADDRESS IN ADA CTRK,I THE FILE MPY SEC/T,I SWP JSB .DAD (TR - CTRK)SEC/T + DEF SECOF RELATIVE SECTOR OFFSET DST SECOF * LDB SEC,I CMB,INB ADB CSEC,I CLA RELATIVE SECTOR OFFSET + SSB (TAKE INTO ACCOUNT THAT CCA THIS COULD BE NEGATIVE) JSB .DAD ((TR - CTRK)SEC/T) + (CSEC - SEC)) DEF SECOF DST SECOF * JSB .DDI DIVIDE BY FILE (EXTENT) SIZE DEF SIZE RELATIVE EXTENT IN A,B STB TMP1 SAVE IT (KNOW < 256 EXTENTS/FILE) JSB .DMP MANIPULATE TO GET REMAINDER DEF SIZE MULTIPLY BY SIZE AND JSB .DNG SUBTRACT FROM ORIGINAL JSB .DAD DIVIDEND. DEF SECOF A,B = SECOF - (SECOF/SIZE)*SIZE DST SECOF SAVE RELATIVE SECTOR OFFSET * SSA,RSS IF REMAINDER IS POSITIVE JMP NX2 THEN SKIP JSB .DAD CORRECT SECTOR DEF SIZE OFFSET IN FILE DST SECOF AND SAVE LDB TMP1 CORRECT THE ADB N1 EXTENT # STB TMP1 NX2 LDB TMP1 IF DIFFERENT SZB EXTENT GO GET JMP EXTND ITS ADDRESS * NX$E1 CLA COMPUTE LDB SEC,I THE NEW JSB .DAD TRACK AND DEF SECOF SECTOR SWP ADDRESS DIV SEC/T,I ADA TR,I STA CTRK,I SET THEM STB CSEC,I IN THE DCB * LDA RFLG$ IF READ FLAG IS CCE,SZA,RSS CLEARED THEN JMP NORD DON'T READ LDB DCB SET UP TO READ JSB R/W$ GO DO IT JMP NX$EC,I ERROR RETURN NORD ISZ NX$EC STEP TO P+2 JMP NX$EC,I AND RETURN * * * * * EXTND ADB EXT#,I ADD CURRENT EXTENT NUMBER LDA TYPE,I GET THE TYPE SSB,RSS IF EXTENT IS LESS THAN ZERO CPA .2 OR IF TYPE 2 THEN JMP SOF END OF FILE LDA B GO SET LDB DCB UP THE JSB RWND$ EXTENT JMP NX$EC,I ERROR RETURN JMP NX$E1 GO COMPUTE NEW TRACK\SECTOR ADDRESS SOF LDA N12 ELSE EOF JMP NX$EC,I RETURN * * BLMSK OCT 77600 N1 OCT -1 N12 DEC -12 * .2 DEC 2 * SECOF BSS 2 SIZE BSS 2 * A EQU 0 B EQU 1 * END EQU * * END