/DSKACP CURRENT EDIT DATE = 12/08/83 / / 035 KMD 26-Sep-85 Spanish & Dutch Xlations / 034 EMcD 11-Sep-85 Add Nordic translations / conditionalised / 033 MART 30-apr-85 Restore Startup code before execute / / ----------- all below are V2.0 mods or earlier ---------------- / / 032 DFB 21-DEC-84 FIX ALLOC BUG / 031 DFB 12-DEC-84 Fix conflict where / WPFILS and ACP use X0 / 030 DFB 17-OCT-84 Allow add. retries if error / 029 DFB 10-SEP-84 Pass unit # to VERIFY on warm start / 028 DFB 19-AUG-84 Pass unit # to VERIFY on warm start / 027 DFB 18-AUG-84 Fix to set warm start on error / 026 DFB 09-AUG-84 Fix=don't write alloc block on / .... err and force Gold Menu to verify / 025 DFB 13-MAR-84 Fix to reboot winnie after error halt / 024 DFB 21-FEB-84 Fix to winnie-clear den table / dev 1 only if sys dev rx / 023 DFB 17-JAN-84 Fix Winnie ifdefs for non winnie compatability / 022 DFB 08-DEC-83 Add winnie update function / 021 DFB 01-NOV-83 Add boot sys vol function / 020 DFB 27-SEP-83 FIXES TO WINNIE / 019 DFB 23-SEP-83 WINNIE SUPPORT / 018 WCE 03-SEP-83 Changed FIELD instructions to / standard instructions / 017 DFB 15-JUN-83 WINNIE SUPPORT / 016 DFB 07-JAN-82 Fix to write out dir/alloc blk if / return not specified for error / 015 MJS 16-JUN-82 Bugfix within 'acallo' to set the / contents of 'rxqblk'=0 if no more / blocks to allocate / 014 DFB 28-APR-82 Rx50 changes/,condor switches added / /********COPIED FROM DSKACP VER 13**** WITH RX50 ADDED************ / 013 DFB 05-APR-82 Clr err cd for write dir/alloc blk / 012 DFB 26-MAR-82 Prevent alloc block from being / written after each alloc/dealloc / 011 DFB 16-MAR-82 Set #free blocks return in spc / /created err in version 10 / 010 DFB 06-MAR-82 Set return error on get den / .......and fix return err code on get free blk / 009 DFB 01-MAR-82 Print "write" correctly for I/O err msge / 008 GDH 28-FEB-82 Changed assemble field to 2 so / that DSKACP can be written out / with WPFILS. / 007 DFB 26-FEB-82 Fix to allow gold menu after err. / 006 DFB 18-FEB-82 Fix to allow verify after write / logical and physical / 005 DFB 21-DEC-81 Fix to print corrrect drive # / on error / 004 DFB 18-DEC-81 Fix to return error code / 003 GDH 12-NOV-81 Bug fix to return the # of free / blocks on an rxeal call. / 002 DFB 11-11-81 Add error hndler/gold menu ret. / 001 DFB 10-29-81 /******************************************************************** / COPYRIGHT (C) 1983 BY / DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED / ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE / INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER / COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY / OTHER PERSON. NO TITLE TO AND OWNERSHIP TO THE SOFTWARE IS HEREBY / TRANSFERRED. / / THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT / NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL / EQUIPMENT CORPORATION. / / DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY / OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. / / /******************************************************************* / / / THE FOLLOWING CODE IS USED TO WRITE THE ACP AND RX02 HANDLER TO / DISC. IT IS REPEATED IN BOTH MODULES TO ALLOW FOR A SEPARATION / OF THESE MODULES AT A LATER DATE. OBVIOUSLY WHEN DOING SO / THE PARAMETERS (DLRXLD, LFRXLD AND STRT ADDR.) WOULD HAVE TO BE REPLACED / WITH THE CORRECT BLOCK NUMBERS,LENGTH AND STARTING ADDRESS. / / /********************************************************************* /008 DSKACP is not written out with (and read in with) WPFILS which /008 loads from 0 to 5600 (field 7 at run time). DSKACP loads into /008 5600 to 7000 (field 7 at run time). Both modules assemble into /008 field 2 for write-out purposes. /D008; FIELD 0 /D008; *200 /D008; JMP I .+3 /WRITE BLOCK /D008; JMP I .+1 /EXIT /D008; 7600 /D008; RXLOAD /D008; /D008; *RXLDLS /D008; RXEWT /WRITE CODE /D008; 0 /DEVICE NUM /D008; RXQBLK /#BLOCKS /D008; . /LIST PNTR-1 /D008; DLACLD /BLOCK NUM /D008; ACPLDP /START ADDRESS OF ACP /D008; CDF FIELD4 /FIELD FOR WRITE IS 4 /D008; -DSACLD /BLOCK COUNT /D008; 0 /END BLOCK /********************************************************************* EJECT / **** ANCILLARY CONTROL PROCESSOR FOR WPS. **** /********************************************************************* / / DEVICE ANCILLARY CONTROL PROCESSOR / / CALLING SEQUENCE: / / AFTER PLACING THE PROPER PARAMETERS IN THE Q-BLOCK / EXECUTE THE FOLLOWING INSTRUCTIONS: / CIFSYS / CHANGE TO SYSTEM FIELD / ENQUE / ENQUEUE THE Q-BLOCK / ADDRESS OF Q-BLOCK / WAIT, CIFSYS / CHANGE TO SYSTEM FIELD AGAIN / JWAIT / WAIT FOR I-O COMPLETION / TAD Q-BLOCK+RXQCOD / IS CODE STILL 0? / SNA / IF NOT 0, THEN DONE / JMP WAIT / GO WAIT S'MORE / OTHERWISE CONTINUE PROCESSING - YOU'VE GOT WHAT YOU / ASKED FOR OR YOU'VE GOT AN ERROR PASSED BACK TO YOU. / ### / / PARAMETERS PASSED AND RETURNED: / / THE Q-BLOCK IS THE AREA IN WHICH THE USER PASSES THE INFORMATION / THAT THE ACP NEEDS IN ORDER TO PROCESS HIS REQUEST. THE Q-BLOCK / IS BIGGER THAN IT NEEDS TO BE FOR THIS APPLICATION AND THEREFORE / THERE ARE WORDS IN IT THAT ARE NOT USED BY THE ACP AND WILL BE / IGNORED HERE. THERE ARE A SET OF POINTERS THAT EXIST IN THE / PREFIX FILE WHICH CAN BE USED TO POINT TO THE VARIOUS WORDS / OF THE Q-BLOCK, AND THEY ARE DEFINED BELOW: / / POINTER MEANING / RXQCOD STATUS CODE / RXQFNC FUNCTION CODE (TELLS ACP WHAT TO DO) / RXQFNO FILE NUMBER TO BE PROCESSED / RXQSPC SPACE ON DISKETTE (RETURN ONLY) / RXQDRV DRIVE NUMBER / RXQBLK BLOCK NUMBER PASSED OR RETURNED / RXQBAD BUFFER ADDRESS / RXQBFD CDF TO BUFFER FIELD / RXQTRK TRACK OR NUMBER OF BLOCKS TO TRANSFER / RXQSEC SECTOR NUMBER / / / THE TABLE BELOW TELLS WHAT SHOULD BE PASSED (N FOR NEEDED), WHAT / WILL BE RETURNED (R), AND WHAT IS NOT USED (-) FOR EACH OF THE / FUNCTIONS. THE FUNCTION CODES ARE GIVEN UNDER THE HEADING 'FNC' / AND MUST BE PASSED AS SHOWN (IN OCTAL). THE RETURN CODE IS / ALWAYS RETURNED BY THE ACP AS SHOWN UNDER THE HEADING 'COD'. / IN GENERAL, THE HEADINGS ARE OBTAINED BY DROPPING THE 'RXQ' FROM / THE POINTER MNEMONICS. THE NUMBERS ABOVE THE HEADINGS REFER / (IN OCTAL) TO THE RELATIVE POSITION IN THE Q-BLOCK OF THE / PARAMETER AND ARE THE VALUES OF THE POINTER MNEMONICS, I.E. / RXQCOD = 0, RXQFNC = 1, ETC. / / / / OFFSETS TO WORDS IN Q-BLOCK. THESE MUST BE PREFIXED BY RXQ / FUNCTION 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 / DESCRIPTION COD FNC DN1 DN2 FNO ID1 SPC CTL DRV BLK RS1 BAD BFD TRK SEC /REWRITE DIR/ALOC BLK R 0 - - - - - - N - - - - - - /READ PHYSICAL 8BIT R 1 - - - - - - N N - N N N N /WRIT PHYSICAL 8BIT R 2 - - - - - - N N - N N N N /READ LOGICAL R 3 - - - - - - N N - N N - - /WRITE LOGICAL R 4 - - - - - - N N - N N - - /ALLOCATE A BLOCK R 5 - - - - - - N R - - - - - /DEALLOCATE A BLOCK R 6 - - - - - - N N - - - - - /GET HDR BLOCK R 7 - - N - - - N R - - - - - /SET HEADER BLOCK R 10 - - N - - - N N - - - - - /GET # FREE BLOCKS R 11 - - - - R - N - - - - - - /GET DENSITY R 12 - - - - R - N - - - - - - /READ PHYSICAL 12BIT R 13 - - - - - - N N - N N N N /WRIT PHYSICAL 12BIT R 14 - - - - - - N N - N N N N /FORMAT SD R 15 - - - - - - N - - - - - - /FORMAT DD R 16 - - - - - - N - - - - - - /MOUNT VOLUME R 17 - - - - - - N - - N N - - /DISMOUNT VOLUME R 20 - - - - - - N - - - - - - /GET VOLUME DATA R 21 - - - - - - N N - N N - - /GET DIRECTORY DATA R 22 - - - - - - N - - N N - - /MOUNT BOOT VOLUME R 23 - - - - - - N - - N N - - /UPDATE VOLUME DIR R 24 - - - - - - N - - N N - - /READ STATUS REG R 25 - - - - - - N - - N N - - / / / ERRORS REPORTED: / / THE ACP WILL RETURN ERROR STATUS IN THE USER'S Q-BLOCK / AT RXQCOD, I.E. THE FIRST WORD OF THE Q-BLOCK. AT FIRST, / THIS WORD IS SET TO ZERO, INDICATING THAT THE DRIVER IS / STILL PROCESSING THE REQUEST PREVIOUSLY MADE. THIS IS / NECESSARY BECAUSE THIS TASK OPERATES ASYNCHRONOUSLY. / WHEN I/O IS COMPLETE, EITHER THE BLOCK WAS GOTTEN OR AN / ERROR HAS OCCURRED. IF THE BLOCK WAS GOTTEN, THEN A +1 / IS PUT IN THE Q-BLOCK AT RXQCOD. IF AN ERROR HAS OCCURRED, / THEN EITHER A -1, -2 OR -3 ARE PUT IN THE Q-BLOCK AT RXQCOD. / A -1 MEANS A 'SOFT' ERROR HAS OCCURRED (CYCLIC REDUNDANCY) / A -2 MEANS A DENSITY CHANGE HAS OCCURRED (SHOULDN'T HAPPEN) / A -3 MEANS A 'HARD' ERROR I.E. DOOR OPEN, DRIVE PROBLEM ETC. / ### / / /D018 QUEFIL=CIF FIELD0 ACPBUF=INTBUF /INTERNAL BUFFER /********************************************************************* FIELD 2 /FOR WRITE DISK ONLY / FIELD 7 /ACTUAL LOAD FIELD *5600 /ACPLDP /LOAD ADDRESS FOR ACP /M018 ACENTR, JMP ACPSYS / DRIVER ENTRY POINT. /*********DENSYS MUST BE LOCATED AT ACPLDP+1*********** /************AS REFERENCED BY ACPDV0 ********************** DENSYS, /POINTER TO SYSTEM DRIVE DENSITY /------------------------------------------------------------- / /************** UNIT DENSITY TABLE ************************** /**************BIT 3 CONTAINS 0=SD************************** /************** 400=DD************************** /************** 1400=RX50************************ /************** 0001=WINNIE********************** / /------------------------------------------------------------- DRVDEN, IFDEF WINNIE < 0 /SYSTEM DRIVE IF WINNIE /A017 > /END IFDEF WINNIE IFDEF CONDOR < 0 /UNIT 1 DRIVE 0 SIDE 0 DEVICE# 0 0 /UNIT 1 DRIVE 1 SIDE 0 DEVICE# 1 0 /UNIT 2 DRIVE 0 SIDE 0 DEVICE# 2 0 /UNIT 2 DRIVE 1 SIDE 0 DEVICE# 3 0 /UNIT 1 DRIVE 0 SIDE 1 DEVICE# 4 0 /UNIT 1 DRIVE 1 SIDE 1 DEVICE# 5 0 /UNIT 2 DRIVE 0 SIDE 1 DEVICE# 6 0 /UNIT 2 DRIVE 1 SIDE 1 DEVICE# 7 0 /RX50 DEV 9 FOR VER 2.0 /A024 > /A014 / IFNDEF CONDOR < 0 /CONTROL 5 UNIT 1 0 / 5 UNIT 2 0 / 6 UNIT 1 0 / 6 UNIT 2 > /A014 / / **** PRIMARY CONTROL LOOP**** /--------------------------------------------------------------------- / / THE FOLLOWING ROUTINE IS THE MAIN PROCESSING LOOP. / WHENEVER THERE IS WORK FOR A HANDLER TO DO IT IS / ENTERED AND THE SPECIFIED OPERATION EXECUTED, ELSE / THE HANDLER IS RELEASED. / THIS ROUTINE WILL ALSO PUT A VALUE OF ZERO IN THE USER'S Q-BLOCK / TO INDICATE THAT I/O IS IN PROGRESS. WHEN I/O IS COMPLETE, EITHER / A PLUS 1 (GOOD RETURN) OR A NEGATIVE NUMBER (SOME ERROR) IS PUT / INTO THIS LOCATION TO SIGNAL THE USER WHAT HAPPENED. / THE ERROR VALUES ARE PASSED BACK HERE BY THE DRIVER. / /--------------------------------------------------------------------- ACEXIT, CIFSYS /M018 JEXIT / EXIT UNTIL AWAKENED. ACPSYS, CIFSYS /CIF QUEUE FIELD /M018 DEQUE / ANY REQUEST IN,... DSKQUE / ...IN THE DISK QUEUE ? JMP ACEXIT / NO - LET OTHERS RUN. DCA ACQCDF / YES - SAVE THE "CDF" INSTRUCTION. CDFSYS / CHANGE TO FIELD 0 /M018 TAD I RX0PTR /POINTER TO INDEX CDFFIO /CHANGE BACK TO MY FIELD /M018 IAC / X0 POINTS TO THE ONE BEFORE DCA ACQADR / SAVE USER'S Q-BLOCK ADDRESS /D026 DCA ACPALS /CLEAR ACP ALLOC WRITE SW /A016 DCA ACSAVE /CLEAR ERR RET /A013 IFDEF WINNIE < DCA WINISW /A017 > /END IFDEF WINNIE JMS ACPUTQ / SIGNAL USER I/O IN PROGRESS RXQCOD / LOCATION IN Q-BLOCK TO PUT CODE JMS ACPARG / CALL THE GET PARAM RTNE JMS SETPTR /SET DENSITY ADDRESS PTR TAD ACPFCT /LOAD FUNCTION CODE /A024 JMS ACPFUN / CALL THE FUNCTION PROCESSOR. TAD ACSAVE / GET RETURN CODE PASSED BY DRIVER SMA CLA / IF NEG FALL THRU /C030 JMP ACPOR0 / GO PROCESS NORMAL RETURN TAD ACPSVF /GET FUNCTION CODE /A017 SMA CLA /REQUEST ERROR RET? /A017 JMP NORETN /NO /A017 TAD ACSAVE /RETURN ERROR IN COD /M030 JMS ACPUTQ / GO PUT VALUE INTO USER'S Q-BLOCK/M030 RXQSPC / OFFSET TO PUT INTO Q-BLOCK /M030 TAD ACSAVE /RETURN ERROR IN COD /A004 JMP ACPPTQ / GO PUT RETURN CODE INTO Q-BLOCK ACPOR0, / IF POSITIVE, THEN RETURN INFO /D011 JMS ACPUTQ / GO PUT INFO INTO Q-BLOCK /D011 RXQSPC / OFFSET TO INFO RETURN IN Q-BLOCK ACZERO, AC0001 / SIGNAL GOOD RETURN ACPPTQ, JMS ACPUTQ / PUT CODE INTO Q-BLOCK RXQCOD / OFFSET TO CODE IN Q-BLOCK CDFSYS /SET SIGNAL FIELD /M018 DCA I SIGPTR /"SIGNAL" WAKE UP "JWAIT". CDFFIO / RESET /M018 JMP ACPSYS / LOOK FOR MORE TO DO. IFDEF WINNIE < WINISW, 0 /WINNIE SW=-#devices STORED ON WINNIE /A017 > /END IFDEF WINNIE ACQADR, 0 / HOLDS ADDRESS OF Q-BLOCK RX0PTR, X0 /POINTER TO INDEX IN OTHER FIELD SIGPTR, 3 /LOCATION OF SIGNAL / **** ROUTINE TO GET PARAMETERS PASSED BY CALLER**** /--------------------------------------------------------------------- / / THIS ROUTINE GETS THE PARAMETERS PASSED TO THE ACP / BY THE CALLER AND SAVES THOSE PARAMETERS IN THIS MODULE / FOR FUTURE USE IN CALLING THE DRIVER / /---------------------------------------------------------------------- ACPARG, 0 / RETURN ADDRESS TAD (ACPFNC-ACPGTQ) / LOAD NEGATIVE ELEMENT COUNT FOR LOOP CONTROL DCA ACPACT / SAVE NEGATIVE ARGUMENT COUNT. JMS ACPGTQ / LOAD POINTER TO Q-BLOCK ELEMENT OFFSETS ACPFNC, RXQFNC / OFFSET TO FUNCTION CODE (CALLER'S) RXQFNO / OFFSET TO FILE NUMBER RXQBAD / OFFSET TO BUFFER ADDRESS RXQBFD / OFFSET TO THE BUFFER FIELD RXQDRV / OFFSET TO DRIVE NUMBER RXQBLK / OFFSET TO STARTING BLOCK NUMBER RXQRS1 / OFFSET TO TRANSFER BLOCK COUNT RXQTRK / TRACK NO FOR PHYSICAL IO RXQSEC /ADDRESS OF SECTRO TOBE PROCESSED ACPGTQ, 0 / POINTER INTO Q-BLOCK OFFSET TABLE JMS ACPSVQ / LOAD POINTER TO TABLE OF LOCAL ADRESSES ACPFCT / ADDRESS FOR FUNCTION CODE (IN THIS MODULE) ACPFNO / ADDRESS FOR FILE NUMBER ACBADR / ADDRESS FOR BUFFER ADDRESS ACBFLD / ADDRESS FOR BUFFER FIELD ACUNIT / ADDRESS FOR DRIVE NUMBER ACBLKN / ADDRESS FOR STARTING BLOCK NUMBER RXDCNT / ADDRESS FOR TRANSFER BLOCK COUNT ACTRAK /ADDR OF TRACK TO BE PROCESSED ACSECT /ADDRESS OF SECTOR TO BE PROCESSED ACPSVQ, 0 / POINTER TO ADDRESSES OF SAVE AREAS IN THIS MODULE ACPSV1, TAD I ACPSVQ / LOAD ADDRESS OF SAVE AREA THIS MODULE DCA RXDDPB / ...AND SAVE IT. ISZ ACPSVQ / UPDATE POINTER TO NEXT SAVE AREA ADDRESS TAD I ACPGTQ / LOAD OFFSET OF ELEMENT IN Q-BLOCK TAD ACQADR / ... ADD IN ADDRESS OF Q-BLOCK,... DCA ACPPAR / ......AND SAVE IT. ISZ ACPGTQ / UPDATE POINTER INTO Q-BLOCK OFFSET TABLE. ACQCDF, CDFSYS / REACH INTO QUEUE FIELD,... /M018 TAD I ACPPAR / ...LOAD PARAMETER,... CDFFIO / ......CHANGE BACK TO CURRENT FIELD,.../M018 DCA I RXDDPB / .... AND PUT PARAMETER INTO THIS MODULE ISZ ACPACT / ALL ARGUMENTS PROCESSED? JMP ACPSV1 / NO - PROCESS NEXT ARG CLA CLL CML RTR /=2000 VERIFY BIT /A006 AND ACPFCT /ISOLATE VERIFY BIT /A006 DCA ACPVFY /SAVE /A006 TAD ACPFCT /GET FUNCTION CODE DCA ACPSVF /SAVE H/O BITS WITH F.C. TAD ACPFCT /GET FUNCTION CODE AND M377 /MASK OUT OLD FUNCTION BITS DCA ACPFCT /RESET JMP I ACPARG / ALL DONE - GOBACK / / /IO SETS UP SECTOR FOR PHYSICAL I/O FOR NON WINNIE /FOR WINNIE --PHYSIO USED ONLY FOR 8 OR 12 BIT READ BUT USES / --BLOCK NUMBER NOT TRACK SECTOR / /FOLLOWING ADDED ************** VERSION 019 *********** ACPIOL, 0 TAD ACXDIR /FUNCTION CODE SPA /IS =PHYSIO CMA /YES--SET POS CLL RAR /L/O BIT SET= WINNIE SZL CLA /IS IT WINNIE? JMP I ACPIOL /YES TAD ACSECT /NO--SET SECTOR FOR DSKHND DCA ACPSCT /=ACBLKN JMP I ACPIOL / / ACPACT, 0 / POINTER TO Q-BLOCK OFFSETS (FOR LOOP CONTROL) ACPPAR, 0 / ADDRESS OF Q-BLOCK PARAMETER (FOR INDIRECT USE) RXDDPB, 0 / INDIRECT ADDRESS FOR PARAM ADDRESSES ACPFCT, 0 / AREA TO SAVE FUNCTION PASSED BY USER ACPFNO, 0 / AREA TO SAVE FILE NUMBER ACSECT, 0 /AREA TO SAVE SECTOR ACPSVF, 0 /SAVE INPUT FUNCTION CODE M377, 377 /MASK PAGE / / ****ROUTINE TO ALLOCATE A BLOCK ON A DISKETTE**** /--------------------------------------------------------------------- / / THIS ROUTINE WILL READ IN THE ALLOCATION BLOCK, FIND THE FIRST / FREE BLOCK ON THE DISKETTE, MARK IT AS BEING IN USE (BIT OFF), / AND RETURN THE BLOCK NUMBER TO THE USER IN HIS Q-BLOCK. / THE ALLOCATION BLOCK IS THEN RE-WRITTEN TO THE DISKETTE. / /--------------------------------------------------------------------- /ACALLO - ALLOCATE A BLOCK ACALLO, 0 JMS ACUPIN / GO GET ALLOCATION BLOCK RXBALC / TELL ACUPIN WE WANT ALLOCATION BLOCK / GET NUMBER OF ALLOCATED WORDS TAD ACPBUF+4 DCA ACDAL5 / SAVE FOR COUNTING TAD (ACPBUF+5-1) / GET ADDR OF FIRST WORD DCA ACDAL7 / SAVE IT JMS ACPUTQ / SET A ZERO INTO 'RXQBLK' /a015 RXQBLK / /a015 ACDAL2, ISZ ACDAL5 / ANY MORE TO CHECK? SKP JMP I ACALLO / NO - OUT OF ROOM - FATAL ERROR ISZ ACDAL7 TAD I ACDAL7 / GET NEXT WORD SNA CLA / ANY FREE BLOCKS (1 BITS)? JMP ACDAL2 / NO - TRY NEXT WORD TAD ACDAL7 TAD (-ACPBUF-5) CLL RTL / AND MULT BY 8 CLL RAL DCA ACDAL5 / SAVE AS UPDATED COUNT TAD (ACBCON-1 / GET ADDR OF BIT MASK CONSTANTS DCA ACDFR3 / SAVE /C031 ACDAL3, ISZ ACDFR3 /INC TST BIT POINTER /A032 ISZ ACDAL5 / INCR COUNT OF BLOCK THAT IS FREE TAD I ACDAL7 / GET ALLOC INFO WORD AND I ACDFR3 / TEST THE BIT /C031 SNA JMP ACDAL3 / NOT ON - TRY NEXT BIT CMA / TURN ONLY THAT BIT OFF AND I ACDAL7 / IN ALLOC INFO WORD DCA I ACDAL7 / AND SAVE IT AC7777 / DECR COUNT TAD ACDAL5 / AND THAT'S THE BLOCK NUMBER JMS ACPUTQ / SAVE FOR USER RXQBLK AC7777 / DECR COUNT OF FREE TAD ACPBUF+3 DCA ACPBUF+3 /D012 JMS ACUPOT / GO PUT OUT UPDATED ALLOCATION BLOCK/M003 JMS ACDSP1 / SET FREE BLOCK COUNT IN QBLK /M003 JMS ACSETF /SET UPDATE SW /A012 JMP I ACALLO / RETURN ACDAL7, 0 / ****ROUTINE TO FREE UP A BLOCK ON A DISKETTE**** /-------------------------------------------------------------------- / / THIS ROUTINE WILL DE-ALLOCATE A BLOCK ON THE DISKETTE. / THE ROUTINE READS IN THE ALLOCATION BLOCK, TURNS ON THE / IN-USE BIT FOR THE BLOCK NUMBER PASSED TO IT BY THE / USER, INCREMENTS THE NUMBER OF FREE BLOCKS ON THE DISKETTE / UPDATES THAT VALUE IN THE ALLOCATION BLOCK, AND THEN / RE-WRITES THE ALLOCATION BLOCK BACK OUT ON THE DISKETTE. / /-------------------------------------------------------------------- ACDEAL, 0 TAD ACBLKN / GET BLOCK NUMBER TO DEALLOCATE DCA ACDFR3 / SAVE IT TO FREE UP AC JMS ACUPIN / GO GET ALLOCATION BLOCK RXBALC / TELL ACUPIN WE WANT ALLOCATION BLOCK TAD ACDFR3 / GET BLOCK NUMBER CLL RAR / DIV BY 8 TO GET WORD OFFSET CLL RAR CLL RAR TAD (ACPBUF+5) / MAKE INTO ADDR IN ALLOC INFO BLOCK IN MEMORY DCA ACDFR4 / SAVE TAD ACDFR3 / GET BLOCK NUMBER AGAIN AND (7) / GET LOW ORDER BITS - BIT OFFSET TO CLEAR TAD (ACBCON) / ADD TABLE ADDR DCA ACDFR3 / SAVE AS ADDR OF MASK WORD TAD I ACDFR3 / GET MASK WORD MQL / SAVE FOR "OR" TAD I ACDFR4 / ADD ALLOC WORD - THIS TURNS ON PROPER BIT MQA / BY "OR"ING WITH MASK WORD DCA I ACDFR4 / SAVE UPDATED WORD IN MEMORY ISZ ACPBUF+3 / INCR COUNT OF FREE BLOCKS JMS ACDSP1 / COPY COUNT TO QBLK /D012 JMS ACUPOT / GO PUT OUT THE ALLOCATION BLOCK JMS ACSETF /A012 JMP I ACDEAL / DONE - RETURN TO CALLER ACDFR3, 0 SVBLKN, /SAVE FIRST BLOCK NUMBER /M022 ACDAL5, /USE FOR ALLOCATE-NO CONFLICT WITH DEALLOCATE /M031 ACDFR4, 0 / ****ROUTINE TO SET THE FIRST BLOCK NUMBER OF A FILE**** /------------------------------------------------------------------ / / THIS ROUTINE WILL SET THE FIRST BLOCK (THE HEADER BLOCK) / OF A FILE. THE FILE NUMBER AND THE BLOCK NUMBER MUST / BE PASSED TO IT IN THE USER'S Q-BLOCK. / THE ROUTINE WILL READ IN THE DIRECTORY BLOCK (HOME BLOCK), / AND STUFF THE BLOCK NUMBER PASSED TO IT IN THE Q-BLOCK / INTO THE HOME BLOCK'S LIST OF POINTERS TO THE HEADER BLOCKS. / THE FILE NUMBER PASSED TO IT IN THE USER'S Q-BLOCK IS / USED TO FIND THE LOCATION IN THE HOME BLOCK TO STUFF THE / FIRST BLOCK NUMBER. THE HOME BLOCK IS THEN RE-WRITTEN TO / THE DISKETTE. / THE ENTRY POINT ADDRESS OF THIS ROUTINE IS USED BY 'ACBGET' ROUTINE / TO PUT ADDRESSES INTO IT FOR INDIRECT USE WHEN THIS ROUTINE IS NOT / BEING USED / /------------------------------------------------------------------- /ACBSET - SET BLOCKNO OF FIRST BLOCK OF FILE ACBGID, / LOCATION FOR INDIRECT ADDRESS FOR ACBGET ROUTINE ACBSET, 0 TAD ACBLKN DCA SVBLKN /SAVE TEMP JMS ACRDIR / GO GET DIRECTORY BLOCK /C024 TAD ACPFNO / GET FILE NUMBER TAD (ACPBUF+RXPDRI / ADD TO START OF DIR IN MEMORY DCA ACBSID / AND SAVE TO BE INDIRECTED THROUGH TAD SVBLKN / GET BLOCK NUMBER TO SET IT TO DCA I ACBSID / AND SET IT JMS ACSETF /SET UPDATE SW /A012 JMS ACUPOT / GO RE-WRITE DIRECTORY BLOCK JMP I ACBSET / AND RETURN / ****ROUTINE TO GET AND RETURN THE FIRST BLOCK NUMBER OF A FILE**** /--------------------------------------------------------------------------- / / THIS ROUTINE WILL GET AND RETURN THE FIRST BLOCK OF A FILE (THE / HEADER BLOCK NUMBER). THE USER MUST PASS THE FILE NUMBER TO IT / IN THE Q-BLOCK. THE ROUTINE WILL RETURN THE FIRST BLOCK NUMBER / OF THE FILE IN THE Q-BLOCK. THE ROUTINE READS THE DIRECTORY BLOCK / (I.E. THE HOME BLOCK), AND USES THE FILE NUMBER PASSED TO IT TO / FIND THE FIRST BLOCK NUMBER, STUFFS THAT NUMBER INTO THE USER'S / Q-BLOCK, AND THEN RETURNS. / THE ENTRY POINT ADDRESS OF THIS ROUTINE IS USED AS A LOCATION TO PUT / ADDRESSES FOR INDIRECT USE BY THE 'ACBSET' ROUTINE WHEN THIS ROUTINE / IS NOT IN USE. / /-------------------------------------------------------------------------- /ACBGET - GET BLOCK NO OF FIRST BLOCK OF FILE ACBSID, / LOCATION FOR INDIRECT ADDRESSES FOR ACBSET ROUTINE ACBGET, 0 JMS ACRDIR / GO GET DIRECTORY BLOCK /C024 TAD ACPFNO / GET FILE NUMBER TAD (ACPBUF+RXPDRI / ADD TO START OF DIR IN MEMORY DCA ACBGID / SAVE TAD I ACBGID / GET BLOCK NUMBER JMS ACPUTQ / AND PUT WHERE CALLER CAN GET IT RXQBLK / TELL ACPUTQ WHERE TO RETURN BLOCK # IN Q-BLOCK JMP I ACBGET / RETURN SIZE=.-ACBGET / /*****SPACE WARS MOVE AND SPLIT***** VER 017 /A017 FUNTBL, ACPDIR / ACPR08 / READ PHYSICAL FUNCTION 8BIT. ACPW08 / WRITE PHYSICAL FUNCTION 8BIT. ACREAD / READ LOGICAL. ACWRIT / WRITE LOGICAL. ACALLO / ALLOCATE A BLOCK. ACDEAL / DE-ALLOCATE A BLOCK. ACBGET / GET 1ST BLK. # OF 1ST BLK. OF FILE. ACBSET / SET 1ST BLK. # OF 1ST BLK. OF FILE. ACFREE / GET # OF FREE BLOCKS ON ACPICE. RZTYPE / GET DENSITY AND SET FOR SPECIFIED UNIT ACPR12 /READ PHYSICAL FUNCTION 12BIT. ACPW12 /WRIT PHYSICAL FUNCTION 12BIT. ACFMTS /FORMAT SD DISKETTE ACFMTD /FORMAT DD IFDEF WINNIE < ACMNT /MOUNT VOLUME /A017 ACDMNT /DISMOUNT VOLUME /A017 ACGETV /GET VOLUME DATA /A017 ACGETD /GET DIRECTORY DATA /A017 ACMNTS / MOUNT SYSTEM VOLUME /A017/C021 ACUPDD /UPDATE DIRECTORY /A022 ACGETS /GET STATUS /A024 > /END IFDEF WINNIE /A023 /*****MOVED TO HERE SPACE WARS WHEN WINNIE CODE ADDED VER. 017 ****** SPARE=.+177&7600-. PAGE / / / / *****ROUTINE TO READ HOME AND ALLOCATION BLOCKS**** / /---------------------------------------------------------------------- / / THIS ROUTINE IS USED INTERNALLY BY THE ACP ONLY. / IT SETS UP THE PROPER CALLING SEQUENCE FOR THE DRIVER / IN ORDER TO READ THE ALLOCATION OR HOME (DIRECTORY) BLOCK / INTO AN INTERNAL BUFFER. / IT IS ALSO USED IN PHYSICAL READS AND WRITES. / /---------------------------------------------------------------------- / / THIS ROUTINE CHECKS TO SEE IF BLOCK IS ALREADY IN MEMORY /A012 / IF NOT IT CALLS ACUPOT TO WRITE OUT IF NECESSARY /A012 / THEN READS IT IN. /A012 /----------------------------------------------------------------------- / ACUPIN - READ IN BLOCK INTO ACPBUF / JMS ACUPIN / BLOCK NUMBER TO BE READ / RETURN POINT ACUPIN, 0 TAD I ACUPIN / GET BLOCK NUMBER TO BE READ CIA /CHECK IS LAST BLOCK READ /A012 TAD LSTBLK /A012 SZA CLA /A012 JMP ACPIC /NO /A012 TAD ACUNIT /SAME DRIVE /A012 CIA TAD LSTDRV /LAST DRIVE READ FROM /A012 SNA CLA /A012 JMP ACPRT2 /YES BLOCK ALREADY IN BUFFER /A012 ACPIC, JMS ACUPOT /CHECK SEE IF BUFFER SHOULD BE WRITTEN OUT/A012 TAD I ACUPIN /BLK READ /A012 DCA ACBLKN / PASS BLOCK NO TO DRIVER IN CALL LIST TAD (ACPBUF) / GET ADDRESS OF INTERNAL BUFFER DCA ACBADR /PUT INTERNAL BUFFER ADDRESS INTO DRIVER CALL LIST TAD ACDFLD / GET CDF OF THIS FIELD DCA ACBFLD / PUT CDF OF THIS FIELD INTO DRIVER CALL LIST AC7777 / SET UP TRANSFER COUNT DCA RXDCNT / PUT TRANSFER COUNT INTO DRIVER CALL LIST JMS ACREAD / GO DO A READ OPERATION TAD ACSAVE /READ ERROR? /A012 SPA CLA /A012 JMP ACPRET /IGNORE REST AND RETURN FROM FUNCTION CODE/A012 TAD I ACUPIN /BLK READ /A012 DCA LSTBLK /SAVE /A012 TAD ACUNIT /UNIT TO BE READ /A012 DCA LSTDRV /LAST DRIVE READ /A012 ACPRT2, ISZ ACUPIN / BUMP UP RETURN ADDRESS JMP I ACUPIN / DONE / ACDFLD, CDFFIO /CDF ACP FIELD /M018 / ****ROUTINE TO WRITE OUT THE ALLOCATION OR HOME BLOCKS**** /------------------------------------------------------------------- / / THIS ROUTINE IS USED INTERNALLY BY THE ACP ONLY. / THE ROUTINE WILL WRITE OUT AN ALLOCATION OR HOME (DIRECTORY) / BLOCK THAT WAS PREVIOUSLY GOTTEN AND UPDATED. / IT IS ALSO USED IN PHYSICAL WRITES. /------------------------------------------------------------------- /ACUPOT - WRITE OUT ACPBUF ONTO DEVICE ACUPOT, 0 TAD ACUPDT /GET UPDATE MODE SW /A012 SNA CLA /IS IT SET /A012 JMP I ACUPOT /NO /A012 /D012 CLA CLL / CLEAR AC. TAD ACBLKN /SAVE BLOCK NUM TEMP /A012 DCA SVBLK1 /A012 TAD ACUNIT /SAVE DRIVE NO TEMP /A012 DCA SVUNI1 /A012 TAD LSTBLK /GET BLOCK NUM TO BE WRITTEN /A012 DCA ACBLKN /SET IT /A012 TAD LSTDRV /GET DRIVE BLOCK CAME FROM /A012 DCA ACUNIT /A012 TAD (ACPBUF) / GET ADDRESS OF INTERNAL BUFFER DCA ACBADR / PUT IT INTO DRIVER CALL LIST TAD ACDFLD / GET CDF TO THIS FIELD DCA ACBFLD / PUT IT INTO DRIVER CALL LIST AC7777 / SET UP TRANSFER COUNT DCA RXDCNT / PUT TRANSFER COUNT INTO DRIVER ALL LIST JMS SETPTR /SET DENSITY IN CASE DEV DIF. /A012 TAD ACPVFY /SAVE VERIFY SW..MAY NOT BE NEC /A012 DCA SAVVFY /...... /A012 CLA CLL CML RTR /2000=VERIFY BIT /A012 DCA ACPVFY /SET IT /A012 JMS ACWRIT / GO WRITE OUT THE BLOCK TAD SVBLK1 /GET BLK NUM /A012 DCA ACBLKN /RESET /A012 TAD SVUNI1 /DRIVE NUM /A012 DCA ACUNIT /RESET /A012 TAD SAVVFY /RESTORE VFY SW /A012 DCA ACPVFY /A012 TAD ACSAVE /CHECK ERROR /A012 SPA CLA /IS IT ERR? /A012 JMP ACPRET /YES EXIT /A012 DCA ACUPDT /CLEAR MODE SW FLAG USED TO DETERMINE/A012 /...WHETHER TO WRITE OUT BUFFER OR NOT/A012 /A012 JMS SETPTR /RESET DENSITY /A012 JMP I ACUPOT / DONE SVUNI1, 0 /TEMP SAVE WHILE DIR/ALLOC BLK WRITTEN /A012 SVBLK1, 0 /TEMP SAVE DRIVE /A012 SAVVFY, 0 /SAVE VERIFY SW /A012 / ****ROUTINE TO PUT VALUES INTO USER'S Q-BLOCK**** / /------------------------------------------------------------- / / THIS ROUTINE WILL PUT VALUES FROM THE AC INTO THE / Q-BLOCK THE USER PASSES TO THIS MODULE. / / CALLING SEQUENCE: / JMS ACPUTQ / OFFSET TO THE ENTRY IN QUEUE / RETURN POINT / VALUE MUST BE PASSED IN AC. / /------------------------------------------------------------- ACPUTQ, 0 DCA ACSAV1 / SAVE VALUE PASSED TO FREE AC /C010 TAD ACQADR / GET QUEUE BLOCK ADDRESS TAD I ACPUTQ / ADD IN THE OFFSET TO ELEMENT ISZ ACPUTQ / BUMP UP TO RETURN POINT DCA ACPTQ2 / STUFF ADDRESS FOR INDIRECT USE TAD ACQCDF / GET CDF INSTRUCTION OF Q-BLOCK FIELD DCA .+2 / STORE IT TO EXECUTE NEXT INSTRUCTION TAD ACSAV1 / GET VALUE PASSED*IS IN DIFF PAGE**CAUTION/C010 CDFSYS / CDF INSTRUCTION LOCATION /M018 DCA I ACPTQ2 / STUFF VALUE INTO Q-BLOCK CDFFIO / CDF BACK TO THIS FIELD /M018 JMP I ACPUTQ / RETURN TO CALLER ACPTQ2, 0 ACSAV1, 0 /SAVE TEMP /A010 / ****ROUTINE TO GET NUMBER OF FREE BLOCKS ON DISKETTE**** /------------------------------------------------------------------- / / THIS ROUTINE WILL READ IN THE ALLOCATION BLOCK, GET / THE NUMBER OF FREE BLOCKS ON THE DISKETTE AND PASS / THAT NUMBER BACK TO THE USER'S Q-BLOCK / /------------------------------------------------------------------- ACFREE, /SERVICE "# FREE BLOCKS" COMMAND 0 JMS ACUPIN / GO GET ALLOCATION BLOCK /C024 RXBALC / TELL ACUPIN WE WANT ALLOCATION BLOCK /C024 JMS ACDSP1 / COPY # TO QBLK JMP I ACFREE / RETURN /---------------- / /GET DIRECTORY BLOCK-----SPACE WARS MOVE----VER 024----- / ACRDIR, 0 /A024 JMS ACUPIN / GO GET DIRECTORY BLOCK /M024 RXBDIR / TELL ACUPIN WE WANT DIRECTORY BLOCK JMP I ACRDIR /A024 /--------------------------------------------------------------------- / / THE FOLLOWING SUBROUTINE DETERMINES THE FUNCTION TO BE / PERFORMED BY THE SPECIFIED DEVICE AND DISPATCHES TO THE / ROUTINE THAT SETS UP THE PARAMETERS AND CALLS THE / DRIVER. / /--------------------------------------------------------------------- ACPFUN, 0 / ENTRY POINT TO FUNCTION PROCESSOR. /D024 TAD ACPFCT / LOAD THE FUNCTION CODE /D017 JMS ACFNCT / ......AND THE TABLE HEAD. TAD ACFNCT / BUILD ADDRESS,... DCA ACPUTQ / ...OF CORRECT PROCESSOR,... TAD I ACPUTQ DCA ACPUTQ JMS I ACPUTQ / ......AND GO DO FUNCTION,... ACPRET, JMP I ACPFUN / RETURN TO CALLER. /C012 ACFNCT, FUNTBL /PTR TO FUNCTION TABLE /A017 /D024ACJTMP, 0 /TEMP /A017 SIZE=.-ACPFUN / /******SPACE WARS MOVE VER 024 ******* / LSTBLK, 0 /BLOCK CONTAINED IN ACP BUFFER /A012 LSTDRV, 0 /DRIVE BLOCK READ FROM /A012 /------------------------------------------------------------------- / THESE ARE THE BIT MASK CONSTANTS USED BY THE ALLOCATE AND / DE-ALLOCATE ROUTINES TO TURN THE IN-USE BITS ON OR OFF. / AN 'ON' IN-USE BIT MEANS THAT THE BLOCK IT REFERS TO IS / AVAILABLE FOR ALLOCATION (THIS IS PERVERSE---I KNOW, BUT...). / AN 'OFF' IN-USE BIT MEANS THAT THE BLOCK IT REFERS TO IS IN USE. / /--------------------------------------------------------------------- /ACBCON - BIT MASK CONSTANTS FOR ACALLO AND ACFREE ACBCON, 200 100 040 020 010 004 002 001 PAGE EJECT PGTOP=. / TOP OF THE PAGE /A035 /------------------------------------------------------------- / / THIS ROUTINE MOVES THE NUMBER OF FREE BLOCKS FROM THE / ALLOCATION BLOCK TO THE USER'S Q-BLOCK. / /--------------------------------------------------------------- ACDSP1, / COPY # FREE BLOCKS TO QBLK 0 TAD ACPBUF+3 / FROM ALLOC BLOCK JMS ACPUTQ / GO PUT VALUE INTO USER'S Q-BLOCK RXQSPC / TELL ACPUTQ WHERE IN Q-BLOCK VALUE MUST GO JMP I ACDSP1 / RETURN / **** ROUTINES TO PROCESS READ, WRITE. **** /--------------------------------------------------------------------- / / THE FOLLOWING ROUTINES PROCESS THE READ AND WRITE / FUNCTIONS. / /--------------------------------------------------------------------- ACREAD, 0 / ENTRY POINT TO "ACREAD". AC0002 / SET THE "READ" FUNCTION,... JMS ACWRIT / ...AND CALL THE COMMON IO ROUTINE. JMP I ACREAD / RETURN TO CALLER. / / / ACWRIT, 0 / ENTRY POINT TO 'ACWRIT' JMS DENADD /ADD DENSITY BIT TO IO OPERATION(AC) TAD ACPVFY /ILLEGAL FOR READ LOGICAL BUT IGNORED IN HNDLER/A006 DCA ACXDIR / PUT OPERATION INTO DRIVER CALL LIST JMS ACPIOC / GO DO THE I/O JMP I ACWRIT / RETURN TO CALLER. / ACPVFY, 0 /VERIFY BIT ILLEG.FOR READ LOGICALAND WRITE PHYSICAL BUT/A006 /......IGNORED IN HNDLER. /A006 /_____________________________________________________________________ / / PHYSICAL I/O ROUTINES / / ACPR08 READ 8 BIT MODE / ACPW08 WRITE 8 BIT MODE / ACPR12 READ 12 BIT MODE / ACPW12 WRITE 12 BIT MODE / / RXQTRK CONTAINS PHYSICAL TRACK TO BE READ / RXQSEC CONTAINS PHYSICAL SECTOR TO BE READ / / / ONLY 1 SECTOR TO BE PROCESSED AT THIS TIME / / /________________________________________________________________________ / ACPR08, 0 CLA CLL CML RTL /READ CODE = 2 TAD ACPVFY /VERIFY SW /A006 JMS ACPW08 /ADD MODE BIT AND COMPLEMENT JMP I ACPR08 /EXIT / / ACPW08, 0 TAD ACP100 /8 BIT MODE JMS DENADD /ADD DENSITY BIT TO CMND CMA /SET PHYSICAL I/O FUNCTION DCA ACXDIR /SAVE JMS ACPIOL /GET TRACK AND SECTOR JMS ACPIOC /CALL HNDLER JMP I ACPW08 /RETURN / ACP100, 100 /SD MODE BIT RZFMTD, 4 /FORMAT DISK FUNCTION CODE RZDDBT, 400 /DOUBLE DENSITY BIT / ACPR12, 0 CLA CLL CML RTL /2=READ CODE TAD ACPVFY /VERIFY BIT /A006 JMS ACPW12 /ADD MODE AND SET PHYSICAL FUNCTION JMP I ACPR12 /EXIT / ACPW12, 0 JMS DENADD /ADD DENSITY BIT TO CMND CMA DCA ACXDIR /SAVE JMS ACPIOL /GET TRACK AND SECTOR JMS ACPIOC /DO FUNCTION JMP I ACPW12 /EXIT / / /D019ACPIOL, 0 /D019 TAD ACSECT /D019 DCA ACPSCT /SAVEIN BLK NM /D019 JMP I ACPIOL / /ACFMTS FORMAT DISKETTE SD / ACFMTS, 0 CLA IAC BSW /=100 JMS ACFMTE /COMPL AND DO IT JMS SETPTR /SET DENSITY PTR DCA I DENADR /SAVE DENSITY /C042 JMP I ACFMTS /RETURN / /ACFMTD FORMAT DD / ACFMTD, 0 TAD RZDDBT /DOUBLE DENSITY JMS ACFMTE /COMPL AND DO IT JMS SETPTR /SET DD PTR CLA CLL CML RTR /SET BIT 3=1 DD RTR DCA I DENADR /SAVE DENSITY /C042 JMP I ACFMTD / ACFMTE, 0 TAD RZFMTD /ADD FUNCTION CODE CMA DCA ACXDIR /STORE FUNCTION JMS ACPIOC /DO IT JMP I ACFMTE /EXIT / /-------------------------------------------------------------- / /************** ADD DENSITY TO CURRENT CODE IN AC************** / /-------------------------------------------------------------- DENADD, 0 TAD I DENADR AND K3777 /CLEAR WINNIE MOUNTED BIT IF SET /A020 JMP I DENADD /IS HERE BECAUSE OF FULL PAGES K3777, 3777 / /-------------------------------------------------------------- / /*************** SETS THE DENSITY POINTER TO CURRENT UNIT****** / /-------------------------------------------------------------- SETPTR, 0 TAD ACUNIT /GET CURRENT UNIT NO TAD TBLPTR /ADD ADDRESS POINTER DCA DENADR /SAVE POINTER TAD DENADR /SET 2ND PTR ON DIF PAGE /A019 DCA DENPT2 /A019 JMP I SETPTR / TBLPTR, DRVDEN /POINTER TO TABLE DENADR, 0 /ADDRESS OF CURRENT UNIT DENSITY /------------------------------------------------------------------------ / / THIS CODE IS TO MAKE THE ACP COMPATIBLE WITH EXISTING CODE FOR / BASE LEVEL 1.1 ONLY. THE FORCE DIRECTORY BLOCK OUT ROUTINE / WAS NECESSARY BECAUSE THE RX HANDLER WOULD UPDATE THE / DIRECTORY/ALLOCATION BLOCKS WITHOUT WRITING THEM OUT EACH TIME / IT CHANGED THEM. IF THIS ROUTINE WASN'T CALLED, THERE WAS A DANGER / THAT THE CHANGED BLOCK WOULD NOT GET WRITTEN OUT. / THIS ROUTINE WILL GO AWAY FOR OTHER BASE LEVELS. / /-------------------------------------------------------------------------- ACPDIR, 0 / ENSURE THAT DIR/ALLOC BLOCK IS WRITTEN OUT JMS ACUPOT /WRITE OUT BLOCK IF NECESSARY /A012 DCA LSTBLK /CLEAR LAST BLOCK READ /A012 JMP I ACPDIR / GO BACK /______________________________________________________________________ / SET MODE SWITCH 1=BUFFER CONTAINS BLOCK # READ / AND DRIVE READ FROM... / KEPT IN LSTDRV, LSTBLK / /_______________________________________________________________________ ACSETF, 0 /SET MODE SW CLA CLL IAC /1 /A012 DCA ACUPDT /A012 JMP I ACSETF /RETURN /A012 / / ACUPDT, 0 /STOREAGE AREA FOR BUFFER MODE SW /A012 / /*******SPACE WARS MOVE VER 028 ******** / MSGCMD, TEXT /^P!E^P^S!D^S^S^P^S^P^S!D^P^S^P^S/ /C030 MSGRD, IFDEF ENGLSH /M030 IFDEF SPANISH IFDEF DUTCH IFDEF ITALIAN IFDEF V30NOR /A034 MSGWRT, IFDEF ENGLSH IFDEF SPANISH IFDEF DUTCH IFDEF ITALIAN /M030 IFDEF V30NOR /A034 / /*******SPACE WARS MOVE VER 024 ******** / DRVTBL, 0000 /0=SD /A017 0400 /1=DD /A017 1400 /2=RX50 SINGLE SIDE /A017 1400 /3=RX50 DBLE SIDED /A017 WINCOD, 4001 /4=WINNIE /A017 /--------------- PAGE IFNZRO .-PGTOP-200 /A035 EJECT /------------------------------------------------------------------------- / / THE ROUTINE BELOW WILL GET THE DENSITY OF THE DISKETTE OF THE / DRIVE PASSED TO IT BY THE USER IN THE Q-BLOCK / / / RETURNS 0=SD RX01/RX02 / 1=DD RX02 / 2=RX50 SINGLE SIDED / 3=RX50 DOUBLE SIDED / 4=WINNIE /A017 /----------------------------------------------------------------------- / RZTYPE, 0 / GET DENSITY OF DISK DRIVE CLA CLL CML IAC RTL /6 = READ STATUS CMA /PHYS I/O DCA ACXDIR /SET CODE JMS ACPIOC /DO IT TAD ACSAVE /GET RETURN CODE SPA CLA /IS IT ERROR? /C010 JMP I RZTYPE /YES DON'T SET DENSITY TAD ACSAVE /A010 TAD DRTPTR /DRIVE TYPE TABLE PTR /A017 DCA DRVTMP /TMP PTR /A017 TAD I DRVTMP /GET VALUE /A017 SETDNA, DCA I DENPT2 /SET TO CURRENT UNIT TAD ACSAVE /GET DENSITY /A011 JMS ACPUTQ /PUT INT SPC AT THIS POINT /A011 RXQSPC /A011 JMP I RZTYPE / GO BACK TO CALLER DENPT2, 0 /TEMP ADDR PTR DRTPTR, DRVTBL /PNTR TO DRIVER TYPE TABLE /A017 DRVTMP, 0 /TEMP POINTER /A017 /-------------------- / **** COMMON I/O REQUEST ROUTINE **** /--------------------------------------------------------------------- / / THE FOLLOWING ROUTINE IS THE COMMON I/O ROUTINE, DOING / REQUESTS AS REQUIRED BY THE Q-BLOCK ENTRIES, OR / INTERNAL ANCILLARY CONTROL PROCESSOR FUNCTIONS. / THE CALLING SEQUENCE IS: / JMS ACPIOC / THE USER MUST INITIALIZE THE CONSTANTS IMMEDIATELY / FOLLOWING THE JMS I DRIVER INSTRUCTION BEFORE ENTERING / THIS ROUTINE. (SEE BELOW). / /--------------------------------------------------------------------- ACPIOC, 0 / ENTRY POINT TO "ACPIOC". ACPCNT, /A017 TAD RETFLD /SET RETURN FLD IN AC CIFSYS /SET TO DRIVER FLD /M018 CALLDR, JMS I DRIVER / .........AND CALL DRIVER. ACUNIT, 0 / DEVICE UNIT NUMBER. ACPSCT, /SECTOR NO FOR PHYSICAL I/O ACBLKN, 0 / STARTING BLOCK NUMBER. ACBFLD, 0 / BUFFER FIELD "CDF". ACBADR, 0 / BUFFER FIELD ADDRESS. RXDCNT, 0 / DEVICE BLOCK COUNT TO TRANSFER. ACTRAK, 0 /TRACK NO PHYSICAL IO ACXDIR, 0 / CODE FOR READ/WRITE (R=2,W=0) SYSRET, /A017 DCA ACSAVE / SAVE THE AC JUST RETURNED JMP I ACPIOC / GO BACK TO CALLER ACSAVE, 0 / SPOT TO SAVE RETURN CODE DRIVER, RX2SYS / ADDRESS OF DEVICE HANDLER RETFLD, CDIFIO /RETURN FLD /M018 RX2SYS=RXDLDP /DRIVER START SIZE=.-ACPIOC EJECT / /THE FOLLOWING IS CODE TO ADDRESS THE WINNIE /A017 / IFDEF WINNIE < MNTVOL=6 /6=MOUNT VOLUME DMTVOL=10 /10=DISMOUNT VOLUME GTVOL=12 /12=GET VOLUME DATA RDDIR=14 /14=READ DIR DATA VOLUPD=16 /16=UPDATE VOLUME DATA GTDEVS=20 /20=GET DEVICE STATUS /A024 / /MOUNT WINNIE VOLUME-- / UNIT NUMBER IN ACUNIT / VOLUME NAME POINTER IN ACBADR / VOLUME NAME FLD IN ACBFLD / ACMNT, 0 CLA IAC /CHECK IF DEVICE MOUNTED /C022 AND I DENPT2 / /C022 SZA CLA /A022 JMP I ACMNT /IS MOUNTED RETURN /A019 JMS ACCHKV /YES MOUNT IT -MNTVOL /MOUNT VOLUME COMMAND WITH WINNIE BIT<11> TAD ACSAVE /ERROR? /A020 SPA CLA /A020 JMP I ACMNT /YES /A020 TAD WINCOD /NO (4001) /A020 DCA I DENPT2 /SET MOUNTED WINNIE CODE IN TABLE /A020 JMP I ACMNT /RETURN / / / /DISMOUNT COMMAND / UNIT NUMBER IN ACUNIT / ACDMNT, 0 CLA IAC /CHECK IF DEVICE MOUNTED /C022 AND I DENPT2 / /C022 SNA CLA /C022 JMP ACDMTE /NOT MOUNTED JMS ACCHKV /IS MOUNTED -DMTVOL /DISMOUNT COMMAND WITH WINNIE BIT<11> TAD ACSAVE /A020 SPA CLA /ERROR? /A020 JMP I ACDMNT /YES EXIT /A020 TAD DRVDEN /DEV 0 DEN CODE /A024 SPA CLA /IS 0=WINNIE /A024 JMP ACDMNV /YES /A024 CLA CMA /-1 TAD ACUNIT /DRIVE # SZA CLA /=DRIVE 1? ACDMNV, /A024 CLA CLL CML RAR /NO RESET WINNIE BIT(4000) DCA I DENPT2 /CLEAR MOUNT BIT JMP I ACDMNT /RETURN / ACDMTE, /C022 CLA CMA /-1 /A022 DCA ACSAVE /SET ERROR RET /A022 JMP I ACDMNT /RET / / /GET VOLUME DATA / UNIT NUMBER IN ACUNIT / ACGETV, 0 JMS ACCHKV /CHECK VOL AND EXEC COMMAND -GTVOL /GET VOLUME DATA CMND WITH WINNIE BIT<11> JMP I ACGETV / /GET DIRECTORY DATA / ACGETD, 0 JMS ACCHKV /CHECK VOL AND EXEC COMMAND -RDDIR /GET DIRECTORY DATA CMND WITH WINNIE BIT<11> JMP I ACGETD / ACUPDD, 0 /UPDATE VOLUME JMS ACCHKV /CHECK VOLUME AND UPDATE COMMAND /A022 -VOLUPD /UPDATE VOLUME /A022 JMP I ACUPDD /RET /A022 /D022 CHKMNT, 0 /CHECK VOLUME MOUNTED /D022 CLA IAC /CHECK IF DEVICE MOUNTED /D022 AND I DENPT2 / /D022 SZA CLA /D022 ISZ CHKMNT /MOUNTED /D022 JMP I CHKMNT /NOT MOUNTED / ACCHKV, 0 TAD I ACCHKV /GET COMMAND DCA ACXDIR /SET IT JMS ACPIOC /DO IT ACCHKX, ISZ ACCHKV JMP I ACCHKV /RET / /D022 ACSETE, 0 /D022 CLA CMA /-1 /D022 DCA ACSAVE /SET ERROR RET /D022 JMP I ACSETE / > /END ENDIF WINNIE /A017 / EJECT / / / /MOUNT SYSTEM BOOTABLE VOLUME / IFDEF WINNIE < ACMNTS, 0 TAD (20 /SET UNIT 0 START UP VOLUME BIT /A021 DCA ACUNIT /SET IT /A021 JMS ACMNT /DO IT /A021 JMP I ACMNTS /RET /A021 / / /RDGTST ROUTINE GETS STATUS OF LAST BLOCK READ /A024 / AND RETURNS IN WORD 1 BIT 5--1IF PHYSICAL CYLNDER 0 /A024 / BIT 6--IF WRITE FAULT LAST DSK OP /A024 / BIT 7--IF SELECTED UNIT DEFINED /A052 / BIT 8--UNDEFINED /A024 / BIT 9--IF SEEK COMPLETE /A024 / BIT10--IF UNIT 1 SELECTED /A024 / BIT11--IF UNIT 0 SELECTED /A024 / / WORD 2 =CYLINDER NUMBER /A024 / WORD 3 =HEAD NUMBER /A024 / WORD 4 =SECTOR NUMBER /A024 / WORD 5 =CONTROLLER VERSION NUMBER /A024 / ACGETS, 0 /A024 JMS ACCHKV /CHECK VOLUME AND EXEC CMND /A024 -GTDEVS /GET DEVICE STATUS /A024 JMP I ACGETS /RET /A024 > /END IFDEF WINNIE /A023 / NORETN, /A017 /M017 TAD ACUPDT /UPDATE SW(HOME OR ALLOC BLK) /A026 SNA CLA /HOME OR ALLOC BLOCK TO BE UPDATED?/A026 JMP NORET1 /NO...SET TO VERIFY DEVICE WITH ERROR/A026 TAD (LSTDRV /POINTER TO DRIVE NEEDING UPDATE/A026 SKP /A026 NORET1, TAD (ACUNIT /POINTER TO UNIT WITH ERROR /A026 DCA PTR7 /SET POINTER /A026 TAD ACXDIR /GET COMMAND /A026 SPA /IS IT PHYSICAL I/O /A026 CMA /YES -SET COMMAND BITS /A026 AND CON2 /MASK READ/WRITE /A026 SNA CLA /0=WRITE 2=READ /A026 JMP NORET3 /=WRITE /A026 TAD (MSGRD /POINTER TO READ /A026 SKP /A026 NORET3, TAD (MSGWRT /POINTER TO WRITE /A026 JMP NORET5 /CONTINUE NEXT PAGE /A026 CON2, 2 /A026 /-------------------- PAGE EJECT /***************************************************************** / /------------------ ACP ERROR HANDLER ---------------------------- /----------THIS ROUTINE CHECKS THE ERROR CODES-------------------- /----------PRINTS THE APPROPRIATE MSGS, THEN---------------------- /----------RETURNS TO THE CALLING PROGRAM IF THE ----------------- /----------BIT 0 OF THE FUNCTION CODE WAS SET--------------------- /----------ELSE IT SETS THE RETURN CODE TO 0---------------------- /----------TO PREVENT ANY MORE CALLS TO THE I/O------------------- /----------THIS ROUTINE MAY BE REPLACED BY A CALL----------------- /----------TO THE LOAD ROUTINE IN THE HANDLER -------------------- /---------- TO REBOOT THE SYSTEM TO GET BACK TO------------------- /---------- MAIN MENU. THIS IS BECAUSE MAIN--------------------- /---------- MENU CODE MAY NOT BE IN CORE WHEN I/O----------------- /------------ IS CALLED. ---------------------- / / /---------- IF ERROR PROCESSING DOES NOT CHANGE------------------- /---------- SIGNIFICANTLY FROM CURRENT STATUS ------------------- /----------- THEN THIS ROUTINE CAN HANDLE ALL ------------------- /----------- ERRORS THE SAME. IE...NO NEED FOR------------------- /----------- BITS 1-3 TO REPRESENT ERR TYPES. ------------------- /----------- CHANGES TO HANDLER COULD ALSO BE -------------------- /----------- MADE.............................-------------------- /***************************************************************** NORET5, /A017 /C026 DCA PTR4 /SET IT /A026 CIFMNU /A026 JMS I IOACAL /PRINT MESSAGE /A026 0 /A026 PTR0, MSGCMD /MESSAGE COMMAND STRING /A026 0000 /A026 1015 /LINE 10- COL 15 /C027 PTR1, MSGA /"ERROR ON UNIT #" /A026 PTR2, ACUNIT /UNIT # /A026 PTR3, MSGB /"WHILE TRYING TO " /A026 PTR4, MSGRD /READ-WRITE /A026 1215 /LINE 12- COL 15 /C027 MSGRTR /"CR TO RETRY." /A030 1415 /LINE 14- COL 15 /A030 PTR6, MSGC /"OR PRESS GOLD MENU TO VERIFY UNIT # /C030 PTR7, ACUNIT /UNIT NUMBER /A026 1725 /LINE 17- COL 25 /C030 MSGD /" WARNING /A026 2220 /LINE 22- COL 15 /C030 MSGE /FAILURE TO VERIFY WILL CAUSE DOC ERRS /A026 /d033 JMP GETGLD /GET GOLD HALT GETGLD, CIFSYS XLTIN JMP GETGLD /WAIT TAD (-EDNWLN) /IS IT CRET? /A030 SNA /A030 JMP ACPCNT /YES RETRY FUNCTION /A030 TAD (EDNWLN-EDMENU) /IS IT GOLD MENU? SZA CLA JMP GETGLD /NO CDFSYS /SET TO SYSTEM FIELD /A027 TAD I WRMSTR /GET DATE TO SAVE FOR WARM RESTART /C027 CMA / /C027 DCA I WRMSTR /SAVE IT /C027 JMS I BHOOK / jump to the blastr via BHOOK in WPFILS/a033 -FALBEN / replace startup from panel mem /a033 IOF /TURN OFF INT. FOR CALL TO WPSYS /A007 CLA CLL CML RAR /4000 /A028 CDFFIO /RESET MYFIELD /A029 TAD I PTR7 /UNIT NUMBER /C029 /d033 CDFSYS /SET TO HANDLER FIELD /A028 CDISYS /SET TO DRIVER FIELD /m033 /M018 DCA I VFYPTR /SAVE IT /A028 JMP I DRVPTR /START UP SYSTEM DRVPTR, RXDRIN+1 /START OF DRIVER LOAD-IGNORE BOOT CODE(ALREADY SET)/C025 WRMSTR, DAMNTH /SWITCH TO SET TYPE START 0=COLD 1=WARM /A027 VFYPTR, SVFVFY-CLOCK+RANDOM /SET POINTER TO LAST LOC IN STRING/A028 BHOOK, FBHOOK / link to real BHOOK in WPFILS see WPF1 /a033 / SET ERROR DRIVE NO INTO TEXT STRING /----------------AFTER AN ERROR WITH NO RET SET/A016 / / MSGA, IFDEF ENGLSH /C027 IFDEF SPANISH /C027 IFDEF DUTCH /C027 IFDEF ITALIAN IFDEF V30NOR /A034 MSGB, IFDEF ENGLSH /A026 IFDEF SPANISH IFDEF DUTCH IFDEF ITALIAN IFDEF V30NOR /A034 MSGC, IFDEF ENGLSH /C027 IFDEF SPANISH /C027 IFDEF DUTCH IFDEF ITALIAN IFDEF V30NOR /A034 MSGRTR, IFDEF ENGLSH /A030 IFDEF SPANISH IFDEF DUTCH IFDEF ITALIAN IFDEF V30NOR /A034 MSGD, IFDEF ENGLSH /A026 IFDEF SPANISH IFDEF DUTCH IFDEF ITALIAN / IFDEF V30NOR /A034 MSGE, IFDEF ENGLSH < TEXT /&FAILURE TO VERIFY WILL LEAD TO CORRUPTED DOCUMENTS/> /A026 IFDEF SPANISH < TEXT /&EL FRASCO DE LA VERIFICACI\SN = CORRUPCI\SN DE DOCS/> IFDEF DUTCH < TEXT /&NON-VERIFICATIE LEIDT TOT VERMINKTE DOCS./> /A026 IFDEF ITALIAN < TEXT /&ERRORE IN VERIFICA SIGNIFICA DOCUMENTI PERSI/ > IFDEF V30NOR < TEXT '&UTEN VERIFISERING BLIR DOK. \XDELAGT' > /A046 / PAGE INTBUF, 0 /INTERNAL BUFFER THIS PAGE / EJECT /THIS CODE WAS DELETED IN VERSION 026.... BUT TO SHOW WHAT CODE WAS /AND TO MAKE NEW CODE LEGIBLE THE CODE IS SHOWN AS FOLLOWS.. /D026/ /D026/FOLLOWING CODE DUE TO SPACE WARS***VER 017****** /D026/ /D026/ /D026ACSETD, 0 /D026 TAD ACUNIT /GET DRIVE # /D005 SZA CLA /IS IT DRIVE 0? /D005 IAC /NO IT IS DRIVE 1 /D026 TAD ACDRVC /ADD DRIVE CONSTANT /D026 DCA ACDRVT /SET DRIVE TEXT /D026 TAD ACXDIR /GET FUNCTION CODE /D026 SPA /PHYSIO? /D026 CMA /YES SET LOG /D026 AND CON2 /CHECK READ BIT /D017 SNA CLA /IS IT READ? /D017 CLA CLL IAC RTL /NO SET 4 /C009 /D026 CLL RTL /IF READ SET TO 4 ELSEIS= 0 /A017 /D026 TAD ACPRPT /YES GET READ POINTER****+3 =WRT PTR /D026 DCA X5 /SET AOUT INDEX /D026 TAD ACPIPT /PTR TO I/O CONSTANT /D026 DCA X4 /SET /D026 TAD I X5 /GET 1ST OF 3 WORDS /D026 DCA I X4 /SET /D026 TAD I X5 /D026 DCA I X4 /D026 TAD I X5 /D026 DCA I X4 /D026 JMP I ACSETD /RET /D026ACPRPT, ACRDCN-1 /PTR TO READ CONST /D026ACPIPT, ACDRIO-1 /PTR TO I/O CONST. /D026CON2, 2 /D026NORETN, /A017 /D026 JMS ACSETD /SET DRIVE NO IN TEXT /D026 TAD ACPALS /GET ACP ALLOC SW /A016 /D026 SZA CLA /WAS ERROR ON WRITE ALLOC/DIR /A016 /D026 JMP WRALER /YES ERROR ON WRITE ALLOC/DIR /A016 /D026 ISZ ACPALS /NO.. TRY TO WRITE ALLOC/DIR BLK/A016 /D026 JMS ACPDIR /A016 /D026WRALER, /A016 /D026 /D026 IOF /TURN OF INTERUPTS FOR PRINT..JWAIT SHOULD RESET /D026 TAD (MSG0 /ADDRESS CLEAR SCREENAND ERROR MSG /D026 JMS TTY /PRINT /D026 TAD (ACCRLF-1 /D026 JMS TTY /CR LF /D026 TAD (MSG1 /D026 JMS TTY /D026ACPALS, 0 /WRITE ALLOC/DIR SW. SET WHEN TRYING TO WRITE /A016 /D026TTY, 0 /D026 DCA X5 /D026ACNXT, CLA CLL CMA RAL /-2 /D026 DCA ACTMP2 /D026 TAD I X5 /GET WORD /D026 DCA ACTMP3 /D026 TAD ACTMP3 /GET WORD /D026ACLOOP, AND M7700 /D026 JMS ACCHCK /CHECK CHAR /D026 JMP ACSKIP /IS 77...GET NEXT CHAR /D026 JMP ACPRNT /PRINT CHAR AS IS /D026 SNA /D026 JMP I TTY /RETURN /D026 TAD NEG40 /SET TO ASCII /D026 SPA /D026 TAD CON100 /D026 TAD CON40 /D026ACPRNT, TLS /PRINT /D026 TSF /D026 JMP .-1 /WAIT DONE /D026ACSKIP, CLA /D026 TAD ACTMP3 /D026 BSW /D026 ISZ ACTMP2 /DONE TWICE /D026 JMP ACLOOP /NO /D026 JMP ACNXT /YES NEXT CHAR /D026/ /D026/ THIS ROUTINE DETERMINES WHETHER THE CHAR TO BE DISPLAYED IS A /D026/ 77 OR NOT. IF A 77 IS DETECTED IT IS IGNORED AND A SWITCH IS /D026/ SET TO PRINT THE NEXT CHAR IN THE BUFFER. IF UPON ENTRY THE SW /D026/ IS SET THE SW IS CLEARED AND RETURN IS MADE TO THE CALL+2 (PRINT) /D026/ IF NOT 77 AND NOT SW SET RETURN IS MADE TO CALL+3 TO CONTINUE /D026/ /D026ACCHCK, 0 /D026 DCA ACSVCH /SAVE AC /D026 TAD ACISSW /SKIP SWITCH SET TO PRINT AS IS /D026 SZA CLA /D026 JMP ACASIS /PRINT AS IS /D026 TAD ACSVCH /D026 TAD CON100 /WAS CHAR=77 /D026 SZA CLA /D026 JMP ACCONT /NO CONTINUE /D026 ISZ ACISSW /YES SET SW /D026 JMP I ACCHCK /RETURN CALL+1(SKIP-GET NEXT) /D026ACCONT, ISZ ACCHCK /SET RETURN = CALL+3 /D026ACASIS, ISZ ACCHCK /SET RETURN +2 PRINT CHAR AS IS /D026 DCA ACISSW /CLEAR SW /D026 TAD ACSVCH /GET CHAR /D026 BSW /D026 JMP I ACCHCK /RET /D026ACISSW, 0 /SW TO DETERMINE IF LAST CHAR WAS 77 /D026ACSVCH, 0 /SAVE CHAR WHILE PROCESSING /D026CON100, 100 / /D026/ ALL ERRORS PRINT SAME MESSAGES AT THIS TIME /D026/ BUT HOOKS ARE IN THERE TO PRINT DIFFERENT MESSAGES /D026/ WHEN DESIRED....... IF ONLY ONE MESSAGE /D026/ WILL BE ON FINAL VERSION CLEAN UP CAN SAVE CODE TO DO THIS /D026/ IN ORDER TO MODIFY MIDDLE OF TEXT MESSAGE /D026/ THIS MODULE IS ASSEMBLED WITH THE /F OPTION /D026/ TO ELIMINATE A 6 BIT 0 PLACED AT END OF EACH /D026/ TEXT STATEMENT......THIS IS ONLY TEMPORARY /D026/ A SUBROUTINE WILL BE WRITTEN TO PRINT SEVERAT LINES /D026/ OF TEXT THUS ELIMINATING THE NEED FOR THIS OPTION /D026// /D026MSG0=.-1 /D026/ ?=77 [=33 ?[[J=CLEAR SCREEN ?[[H=SET HOME POSITION /D026/ /D026/ TEXT /?[[J?[[M/ IS IN OCTAL TO AVOID 0 CHAR AFTER TEXT FOR 1 MSG. /D026 7733 /?[ /D026 3310 /[H /D026 7733 /?[ /D026 3312 /[J /D026ACDRVT=MSGA+12 /PTR TO DRIVE # /D026 ACDRIO=.-4 /TO OVERLAY FUNCTION /D026/ TEXT /BLOCK NO. / /D026/ACBKNO, TEXT /----/ /D026ACCRLF, 7712 /CARRIAGE RET /D026 7715 /LINE FEED /D026 0 /TERMINATOR /D026MSG1=.-1 /D026/D024ACEND, 0 /END TEXT /D026MSG2=MSG0 /D026MSG3=MSG0 /D026M7700, 7700 /D026NEG40, -40 /D026CON40, 40 /D026/D024ACTMP0, 0 /D026/D024ACTMP1, 0 /PTR TO PRINT STRING /D026ACTMP2, 0 /CHARACTER COUNT /D026ACTMP3, 0 /WORD TO BE PROCESSED /D026/D024AC3400, 3400 /D026/D024ACERSV, 0 /SAVE ERROR BITS IN L/O BITS /D026ACDRVC, 4060 /DRIVE CONSTANT=" 0"