ASMB,R,L,C * NAME: PCIBF * SOURCE: 92067-18560 * RELOC: 92067-16185 * PGMR: D.L.B. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. 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. * * *************************************************************** * HED "PCIBF" ROUTINE TO PUT BUFFER IN FMGR'S BUFFER LIST 7-78 (DLB) NAM PCIBF,8 92067-16185 REV.2026 800428 ENT PCIBF EXT .ENTR EXT TPSK.,NXTK.,EDSK.,CRSK. SPC 1 A EQU 0 B EQU 1 TOPSK EQU TPSK. ADDRESS OF TOP OF BUFFER LIST BUFFER NXTSK EQU NXTK. NEXT AVAILABLE WORD IN BUFFER LIST BUFFER ENDSK EQU EDSK. END + 0 WORD OF BUFFER LIST BUFFER CURSK EQU CRSK. CURRENT DISPLAY POINTER SPC 1 * PURPOSE: TO PUT CALLERS BUFFER (FMGR COMMAND) INTO THE * FMGR BUFFER LIST. * CALLED: * JSB PCIBF * DEF *+3 * DEF BUFFER * DEF BUFFERLENGTH * WHERE: * BUFFER = ADDRESS OF THE BUFFER TO PUT. * BUFFERLENGTH = LENGTH OF BUFFER IN WORDS. * NOTES: * BUFFER WILL HAVE LITTLE USE UNLESS IT IS A LEGAL FMGR * COMMAND WITHOUT THE LEADING ":". SPC 1 PCIBA NOP TEMP FROM BUFFER ADDRESS POINTER PCIBB NOP TEMP NEG. FROM BUFFER LENGTH (WORDS) SPC 1 PCIBC NOP BUFFER ADDRESS PCIBD NOP BUFFER LENGTH IN WORDS PCIBF NOP ENTRY TO PUT A BUFFER INTO BUFFER LIST JSB .ENTR GET BUFFER ADDRESS AND LENGTH DEF PCIBC TOP OF ADDRESS STACK SPC 1 * 1ST SEARCH WHOLE LIST FOR MATCHING BUFFER & DELETE IF MATCH. SPC 1 LDB TOPSK GET THE 1ST BUFFER ADDRESS STB CURSK AND SAVE CURRENT BUFFER POINTER NEXT0 LDA PCIBC GET CALLERS BUFFER ADDRESS STA PCIBA AND SAVE AS POINTER FOR SEARCH LDA CURSK,I GET 1ST BUFFER LENGTH AND O377 MASK TO JUST FORWARD LENGTH POINTER CPA PCIBD,I CHECK IF MATCHES CALLERS LENGTH? CMA,INA,SZA,RSS YES, NEGATE & CHECK FOR NON-ZERO. JMP NEXT2 NO MATCH LENGTH, TRY NEXT BUFFER IN LIST. STA PCIBB SAVE NEGATED LENGTH OF BUFFER LDB CURSK GET ADDRESS-1 OF BUFFER IN LIST NEXT1 INB BUMP TO DIRECT ADDRESS LDA B,I GET THE CONTENTS OF BUFFER CPA PCIBA,I CHECK IF MATCHES CALLERS? RSS YES, CONTINUE JMP NEXT2 NO, TRY NEXT BUFFER IN LIST ISZ PCIBA BUMP TO NEXT WORD IN CALLERS BUFFER ISZ PCIBB CHECK IF ALL WORDS CHECKED? JMP NEXT1 NO, KEEP ON TRUCKING SPC 1 * MATCHING BUFFER, DELETE BUFFER IN THE BUFFER LIST SPC 1 LDA CURSK GET ADDRESS OF BUFFER TO DELETE JSB DELIN AND TAKE IT OUT OF THE BUFFER LIST JMP NEXT0 AND GO TRY NEXT BUFFER IN THE BUFFER LIST SPC 1 * BUFFER DOES NOT MATCH, ADVANCE THE CURRENT BUFFER LIST POINTER & CONT. SPC 1 NEXT2 JSB ADVSK MOVE "CURSK" POINTER TO NEXT BUFFER JMP PCIBY REACHED END, NOW DO THE MOVE JMP NEXT0 GO TRY NEXT BUFFER IN THE BUFFER LIST SPC 1 * NOW CHECK IF ENOUGH ROOM FOR BUFFER TO BE PUT INTO BUFFER LIST SPC 1 PCIBZ LDA TOPSK DELETE OLDEST ENTRY OFF BUFFER LIST JSB DELIN POP BUFFER LIST FOR MORE ROOM PCIBY LDA PCIBD,I GET THE BUFFER LENGTH AND O77 CHECK LENGTH IS KOSHER CPA PCIBD,I (1-63 WORDS) SZA,RSS AVOID PUTTING ZERO LENGTH JMP PCIBF,I RECORDS IN STACK ADA NXTSK CHECK IF OVERFLOWS THE BUFFER LIST BUFFER CMA NEGATE - 1 ADA ENDSK AND CHECK IF OVERFLOWS BUFFER LIST SSA IF OVERFLOW, POP OLDEST ENTRY & TRY AGAIN JMP PCIBZ OVERFLOW, GO MAKE MORE ROOM SPC 1 * NOW PUT CALLERS BUFFER INTO THE BUFFER LIST SPC 1 LDA NXTSK,I GET THE LENGTH WORD OF THE "TO" BUFFER IOR PCIBD,I MERGE IN THE LENGTH OF CALLERS BUFFER STA NXTSK,I AND PUT BACK AND O377 GET THE BUFFER LENGTH CMA,INA NEGATE STA PCIBB SAVE AS COUNTER FOR MOVE LDA NXTSK SET UP THE CURRENT STACK POINTER STA CURSK WHEN ADDING NEW BUFFER ISZ NXTSK BUMP TO WHERE TO PUT BUFFER NEXT3 LDA PCIBC,I GET NEXT WORD OF "FROM" BUFFER STA NXTSK,I AND MOVE INTO BUFFER LIST ISZ PCIBC BUMP FROM ADDRESS WORD ISZ NXTSK BUMP TO ADDRESS WORD ISZ PCIBB AND BUMP COUNTER JMP NEXT3 GO TRY NEXT WORD LDA PCIBD,I GET BUFFER LENGTH ALF,ALF POSITION STA NXTSK,I AND SET THE END WORD IN BUFFER LIST JMP PCIBF,I AND EXIT TO CALLER SPC 1 * IF THE FOLLOWING THREE LINES WERE ADDED TO BUFFER LIST * IT WOULD LOOK LIKE THIS: * (1) MESSAGE * (2) TWO * (3) THREE * * BIT !15!14!13!12!11!10! 9! 8! 7! 6! 5! 4! 3! 2! 1! 0! * TOPSK ! (0) ! (4) ! * ! M ! E ! * ! S ! S ! * ! A ! G ! * ! E ! (SPACE) ! * ! (4) ! (2) ! * ! T ! W ! * ! O ! (SPACE) ! * CURSK ** ! (2) ! (3) ! * ! T ! H ! * ! R ! E ! * ! E ! (SPACE) ! * NXTSK ** ! (3) ! (0) ! * ! THIS IS BEYOND THE END OF THE BUFFER ! * ! LIST AND WILL CONTAIN GARBAGE DATA ! * ENDSK ! THIS IS LAST WORD IN BUFFER LIST BUFFER ! * * ** THESE WORDS ARE DYNAMIC POINTERS INTO LIST BUFFER SPC 1 * TAKE BUFFER POINTED TO BY A-REG OUT OF BUFFER LIST SPC 1 DELIA NOP "FROM" POINTER DELIB NOP "TO" POINTER DELIN NOP ENTRY TO DELETE A BUFFER FROM BUFFER LIST STA DELIB SAVE POINTER TO BUFFER TO DELETE CPA NXTSK CHECK IF AT END? JMP DELIN,I YES, IGNORE DELETE REQUEST LDA DELIB,I GET THE OFFSET VALUE AND O377 MASK TO OFFSET BITS STA B SAVE IN B-REG THE DELETE BUFFER LENGTH BLF,BLF POSITION TO HIGH BITS ADB A B-REG = DELETE BUFFER LENGTH IN HI & LO-BITS ADA DELIB BUMP TO LENGTH WORD OF NEXT BUFFER-1 INA BUMP TO LENGTH WORD OF NEXT BUFFER STA DELIA SAVE "FROM" ADDRESS FOR MOVE LDA DELIA,I GET LENGTH WORD AT END-CURR/BEG-NEXT BUFFER XOR DELIB,I WITH BEG-CURR/END OF PREVIOUS BUFFER LENGTH XOR B TAKE OUT DELETE BUFFER LENGTHS LDB NXTSK GET END ADDRESS OF LAST BUFFER LENGTH WORD DELI1 STA DELIB,I AND PUT HIGHER IN BUFFER LIST CPB DELIA CHECK IF FINISHED PACKING MOVE? JMP DELI2 YES, EXIT ISZ DELIA BUMP "FROM" BUFFER ADDRESS ISZ DELIB BUMP "TO" BUFFER ADDRESS LDA DELIA,I GET NEXT WORD TO MOVE UP JMP DELI1 CONTINUE TO NEXT WORD SPC 1 DELI2 LDA DELIB MOVE THE NXTSK POINTER STA NXTSK TO ITS NEW VALUE JMP DELIN,I AND EXIT P+1 SPC 1 * ADVANCE CURRENT DISPLAY POINTER * CALLED: JSB ADVSK * * SPC 1 SAVA NOP A-REG SAVE FOR BOTTOM SUBROUTINES ADVSK NOP GET CURRENT DISPLAY BUFFER STA SAVA SAVE A-REG FOR RETURN LDA CURSK,I GET THE LENGTH AND O377 MASK TO LENGTH SZA CHECK IF AT END? INA BUMP ONE FOR GOOD MEASURE ADA CURSK SET NEW DISPLAY BUFFER POINTER CPA NXTSK CHECK IF AT END OF BUFFER LIST? JMP ADVS1 YES, SKIP ADVANCE STA CURSK FOR NEXT TIME ISZ ADVSK P+2 EXIT >> MOVED ADVS1 LDA SAVA RESTORE A-REG JMP ADVSK,I YES, EXIT SPC 1 SPC 1 O77 OCT 77 O377 OCT 377 END