File TSKBLD.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/******* TOPS-8 TASK LIBRARY BUILDER *******

/THIS PROGRAM BUILDS A MODULE LIBRARY FOR TOPS-8
/IN A FILE ON THE SYSTEM DEVICE.
/THE PROGRAM IS INTENDED TO BE USED WHEN
/GETTING A SYSTEM OFF THE GROUND: MODULES CAN BE LOADED
/AS REGULAR OS8 BINARY FILES. THE RESULTING FILE
/CAN BE SAVED FOR LATER USE.
/IN ORDER TO BE ABLE TO ADD MODULES TO AN EXISTING
/LIBRARY, THERE IS A DISKMAP, AND ALL THE SYSTEM TABLES
/OF TOPS-8 ARE SAVED THERE TOO. THE DISKMAP CONTAINS
/256 (1 BLOCK) ENTRIES, GOOD FOR 256 BLOCKS.

/9 FILES CAN BE LOADED IN ONE SINGLE COMMAND LINE.
/ONE SINGLE FILE MAY CONTAIN MORE THAN 1 MODULE.
/THE /Z OPTION ZEROES THE DISKMAP AND RESETS INTERNAL
/TABLES.IT WORKS ONLY WHEN LOADED TOGETHER WITH TOPS-8.

/WHEN ASSEMBLING THIS PROGRAM, THE FILE MS.PA
/(MADE WITH GLOBL.SV FROM THE SYMBOLTABLE OF TOPS-8)
/MUST BE SUPPLIED, IN ORDER TO ADAPT IT PROPERLY TO
/CONFIGURATION PARAMETERS OF TOPS-8.

/.R PAL8
/*TSKBLD<MS,TSKBLD
/.R ABSLDR
/*TOPS8.BN,TSKBLD.BN$
/.SAVE SYS TSKBLD;MONFLD0200
/.R TSKBLD
/*FILE1.BN,.......FILE9.BN/Z
/*.......ETC.$
/.R TOPS8	/STARTS THE MONITOR 'COLD-START'.

/OPTIONS:
/	/Z	ZERO THE DISKMAP. MUST BE DONE EVERY TIME
/		TOPS-8 (AND TSKBLD) IS CONFIGURATED AGAIN.
/	/L	LIST THE NAMES OF INSERTED MODULES

/CREATE A FILE WITH ENOUGH BLOCKS FOR ALL MODULES.
/THE TRICK OF THIS PROGRAM IS, THAT IT PERFORMS A LOT
/OF PREPARATORY FUNCTIONS FOR TOPS-8. HOWEVER, THE 
/FINAL 'POWER-UP' IS PERFORMED BY A ONCE ONLY CODE
/IN TOPS-8. THIS CODE PICKS UP THE PREPARED TABLES
/IN THE LIBRARY.

VERSION="3

/CORE ALLOCATION /FIELD 0 O=ZPC;O=ZNUM /PAGE 0 VARIABLES O=C2;O=M1 /PAGE 0 CONSTANTS O=CONN;O=CONN+4 /PAGE 0 VARIABLES /NO PAGE ZERO LITTERALS UNTIL NOW, MAYBE LATER. O=XLOAD;O=XLCOR-1 /THE ACTUAL EXTERNAL LOADER O=XLCOR;O=XLCOR+377 /2 PAGE INPUT HANDLER (OS8) O=BUFIN;O=BLOKIN^400+BUFIN-1 /INPUT BUFFER OF PS8IN O=DSKMAP;O=DSKMAP+377 /DISK MAP ;ONE WORD FOR EACH BLOCK O=DATORG;O=COREND /TOPS-8 LISTS AND TABLES /FIELD 1 O=XLOLIM;O=XUPLIM /LOAD AREA FOR EACH MODULE O=PS8IN;O=PS8IN+177 /PS8IN:READS FROM OS8 BYTE BY BYTE /DISK ALLOCATION IN RELATIVE BLOCKS O=0 /THE DISKMAP O=1;O=COREND-DATORG%400+O /LISTS AND TABLES O=O+1 /FROM HERE ON THE MODULES.
ZERO=MONFLD%10;ONE=ZERO+1;FZERO=ZERO^10;FONE=ONE^10 DSKMAP=DATORG-400 SYSHNDLR=7607 XLOLIM=200 /WHERE THE BUFFER BEGINS XUPLIM=7377 /WHERE THE BUFFER ENDS BATOUT=7400 /BATCH OUTPUT ROUTINE FIELD ZERO /PAGE 0 VARIABLES ZPC=X /LOAD POINTER ZNAME=ZTEM1 /MODULE'S NAME ZLENG=ZTEM2 /LENGTH IN PAGES ZWC=ZTEM3 /LENGTH OF MODULE IN WORDS ZCNT=ZTEM4 /TEMPORARY COUNTER ZTEM=ZTEM5 /TEMPORARY STORAGE ZBLK=ZTEM6 /RELATIVE STARTING BLOCK ZADDR=ZTEM7 /STARTING ADDRESS WITHIN THE MODULE ZNUM=BASE /OFFSET IN NAMLST CONN=MONITOR /'CONNECT' FLAG: 1 IF SET *CONN+1 TSKLIB, FILENAME TSKLIB.M8
*200 XLOAD, JMS I (TSKBLD /TEST FOR BATCH & PRINT INITIAL MESAGE AC0001 /SYS:=1 CIF 10 JMS I C7700 2 /LOOKUP OFSET, TSKLIB /THE FILE TSKLIB.M8 ON SYS: FLENG, 0 /V3 OVERLAID BY LENGTH OF TSKLIB.M8 JMP I (XLER11 /*TSKLIB,M8 NOT FOUND* RSTRT, JMS I (HSREAD /READ CHAR FROM PS8IN:CALL CD JMP I (BLDEND /V3 NO INPUT FILES, TEST ALTMODE AC2000 /IGNORE THE LEADER/TRAILER CHAR CDF 10 AND I (7645 /OPTION Z SPECIFIED? CDF FZERO SNA CLA JMP XL1 /NO /HERE COMES THE INITIALIZATION CODE, ACTIVATED BY THE /Z OPTION. CORE RESIDENT MODULES ARE INCLUDED INTO /THE INTERNAL TABLES AND NAMLST AND ASSLST. /THE FIRST ITEM OF EACH BLOCKLET IS THE MODULE'S NAME. /FIRST RESERVE ROOM FOR INTERNAL TABLES IN DISKMAP OPTZ, TAD (-COREND+DATORG-1%400+7760-1 /SET UP COUNTER DCA ZCNT TAD (DSKMAP-1 DCA AUTO17 ACM1 /SET FIRST ENTRIES TO -1 (MONITOR) DCA I AUTO17 ISZ ZCNT JMP .-3 TAD (COREND-DATORG%400+2-400 /V3 SET UP COUNTER DCA ZCNT /V3 DCA I AUTO17 /V3 CLEAR REST OF DSKMAP ISZ ZCNT /V3 JMP .-2 /V3 /ACTIVATE THE PRE-ASSEMBLED CORE-RESIDENT TASKS. TAD (NAMLST-1 /SET UP POINTERS DCA AUTO16 TAD (TCBTAB OPTLUP, DCA ZTEM TAD I ZTEM /FIRST ITEM IS NAME OR 00 SNA JMP XL4 /ZERO IS TERMINATOR DCA I AUTO16 DCA I ZTEM /CLEAR THE BACKLINK!! TAD ZTEM /MOVE ONE BLOCKLET FURTHER TAD (10 JMP OPTLUP
/NO OPTION MEANS:LOAD BEHIND EXISTING MODULES. /READ THE DISK BITMAP AND THE TABLES INTO CORE. XL1, TAD OFSET DCA OFSET1 CIF 0 JMS I (SYSHNDLR COREND-DATORG+600&7600%2+FZERO DSKMAP OFSET1, 0 JMP I (XLERR0 /READ ERR /START LOADING ALL FILES, ONE BEHIND THE OTHER XL4, CDF FZERO /V2 ISZ I (FILNUM /NEXT FILE TAD I (FILNUM /ARRANGE DECIMAL OVERFLOW AND C77 TAD (-72 SNA CLA TAD (100-12 /RESTORE LOW ORDER DIGIT TAD I (FILNUM /AND INC HIGH ORDER DIGIT DCA I (FILNUM XL41, DCA CONN /CLEAR 'CONNECT' FLAG TAD (XLOLIM-1 /V2 DCA AUTO10 /V2 TAD (XLOLIM-XUPLIM /V2 DCA ZTEM /V2 CDF FONE /V2 DCA I AUTO10 /V2 CLEAR LOADER AREA ISZ ZTEM /V2 JMP .-2 /V2 CDF FZERO /V2 CLA CMA /RESET TO LEADER PHASE XL5, JMS I (BINL /READ FIRST FRAME AND SO ON JMP I (XLEND /CTRL/Z DETECTED JMP XL6 /CHECKSUM DETECTED TAD I (BINPC /AC=0;INSPECT BEFORE LOADING TAD (-XLOLIM SNL /V3 JMP I (XLERR3 /LOAD UNDER LOWER LIMIT TAD (XLOLIM-XUPLIM-1 /V3 SNL /V3 JMP I (XLERR4 /LOAD OVER UPPERLIMIT TAD (XUPLIM+1+XLOLIM-200 /V3 XLOLIM=200 DCA ZPC /FOR LEGAL INDIRECT TAD I (BINAC CDF FONE /ALL MODULES LOAD IN FIELD FONE DCA I ZPC // CDF FZERO JMP XL5 /READ NEXT FRAME
XL6, SZA CLA /CHECKSUM IN AC JMP I (XLERR5 /CHECKSUM UNEQ TO ZERO /FETCH NAME AND LENGTH FROM MODULE HEADER. /ALSO COMPUTE THE RELATIVE STARTING ADDRESS CLL STA RAR /AC3777 CDF FONE AND I (XLOLIM // SNA //V2 JMP XL4 //V2 EMPTY BINARY, SKIP IT JMP I (XL7 /JUMP INTO NEXT PAGE PAGE
XL7, DCA ZNAME // TAD I (XLOLIM+1 // AND C7600 //MAKE CORRECT WORDCOUNT DCA ZWC // TAD I (XLOLIM+1 //FIND CORRECT STARTING ADDR. AND C77 //MODULE CONNECTED? SZA // ISZ CONN //Y;SET FLAG CLL RAL //# OF WORDS FOR 'CONNECT' IN AC TAD (XLOLIM+1 //SKIP THEM DCA ZADDR // TAD I ZADDR //NOW SCAN THE RELOCATE POINTERS ISZ ZADDR // SZA CLA // JMP .-3 // CDF FZERO IFNZRO XLOLIM-200 < TAD (200-XLOLIM /MAKE ORIGINAL ORIGIN TAD ZADDR DCA ZADDR / > TAD ZWC /SAVE ALSO LENGTH IN # OF PAGES IFZERO PDPTYP-PDP8E < CLL RAR BSW > IFNZRO PDPTYP-PDP8E < CLL RTL RTL RTL > DCA ZLENG TAD ZNAME /DECODE THE NAME AND SAVE FOR AND (40 SNA CLA TAD M100 TAD M200 TAD ZNAME DCA I (FILNAM /LOADED BEYOND LENGTH OF MODULE? TAD ZWC TAD (XLOLIM CIA CLL TAD I (BINPC /BINPC FROM 200 UP SZL CLA JMP I (XLERR6 /BEYOND SPECIFIED LENGTH
/MAKE A TASK-CONTROL BLOCKLET /FIRST OF ALL:SEARCH A FREE ENTRY IN NAMLST. /SEARCH NAMLST FROM BEGINNING EACH TIME JUST INCASE /THE MODULE ALREADY EXISTS. THEN CHECK WHETHER THE /NEW VERSION CAN BE DROPPED INTO THE SAME HOLE. TAD (-MAXNAM /TEST FOR MAX NUMBER OF ENTRIES DCA ZCNT TAD (NAMLST DCA ZTEM DCA ZNUM /COUNTS OFFSET IN LIST XL9, TAD I ZTEM SNA JMP XL75 CIA TAD ZNAME /SAME NAME? SNA CLA JMP I (XL91 /Y ISZ ZTEM /NEXT ENTRY ISZ ZNUM ISZ ZCNT JMP XL9 JMP I (XLERR8 /NAMLST EXHAUSTED /SEARCH A HOLE IN DISKMAP. ALL ROOM IS USED,SO THE /FIRST HOLE (0000) COMING UP MUST BE ALRIGHT. XL75, TAD (DSKMAP DCA AUTO10 TAD M400 /COUNTS ONE BLOCK DCA ZCNT ISZ ZCNT SKP JMP I (XLERR7 /DSKMAP FULL? TAD I AUTO10 SZA CLA JMP .-5 /LOOP TAD AUTO10 /SAVE POSITION IN DISKMAP TAD (-DSKMAP /RELATIVE BLOCK# DCA ZBLK /WE FOUND A HOLE BUT IS IT LARGE ENOUGH? TAD ZLENG CLL IAC RAR /CONVERT PAGES TO BLOCKS TAD AUTO10 TAD (-DSKMAP-401 /V3 SMA /V3 JMP I (XLERR7 /HOLE NOT LARGE ENOUGH TAD (400 /V3 CLL /V3 TAD I (FLENG /V3 SZL CLA /V3 JMP I (XLER13 /V3 TSKLIB.M8 NOT LARGE ENOUGH
/FILL IN THE DISKMAP TAD ZLENG /COUNTS # OF PAGES STL CIA RAR /V3 CONVERT TO -# OF BLOCKS DCA ZCNT ACM1 /MOVE PTR ONE BACK TAD AUTO10 DCA AUTO10 TAD ZNAME /NAME MUST BE UNEQ 0 DCA I AUTO10 ISZ ZCNT JMP .-3 CDF 10 //V3 TAD I (7643 //V3 CDF FZERO /V3 RAR /V3 SNL CLA /V3 OPTION L SET ? JMP I (XL10 /V3 N JMS I (MESG;TEXT /INSERT / JMP I (PRNAME /V3 PRINT NAME PAGE
/PRINT WHAT WE ARE DOING AND CHECK THE LENGTH OF THE /TWO MODULES. XL91, JMS I (MESG;TEXT /REPLACE / TAD ZNUM CLL RAL /^10 RTL /FIND PLACE IN TCBTAB TAD (TCBTAB+4 DCA ZTEM TAD I ZTEM /CLL.LLL.FFF.SSS WHERE L=LENGTH CLL RAL /MAKE WORDCOUNT TAD C200 /BUT ROUND-OFF TO BLOCKS AND C7400 CIA TAD ZWC /IF WC LARGER: SMA SZA CLA JMP I (XLER10 /OVERLAY ERROR ACM1 /MAKE PNTR TO REL. BLK# TAD ZTEM DCA ZTEM TAD I ZTEM DCA ZBLK PRNAME, TAD I (FILNAM /PRINT THE TASKNAME DCA FILNM0 JMS I (MESG /V3 AND THE BLOCK NUMBER FILNM0, 0 /V3 TEXT / IN BLOCK / /V3 TAD ZBLK /V3 JMS I (PRINTD /V3 PRINT RELATIVE BLOCK NR. JMS I (CRLF /V3
/START FILLING IN THE PARAMETERS: XL10, TAD ZNUM /MAKE POINTER IN TCBTAB CLL RAL /^10 RTL TAD (TCBTAB+1 /PNTS TO THREAD-WORD DCA AUTO11 TAD ZADDR /STARTING ADDRESS FROM *200 ON AND C177 /V3 MAKE IT PAGE ZERO DCA I AUTO11 /RELATIVE STARTING ADDRESS TAD ZBLK DCA I AUTO11 /RELATIVE BLOCK NUMBER TAD CONN /MAKE LINK=CONNECT BIT CLL RAR TAD ZWC /LENGTH,FIELD AND ONDISK BIT RAR TAD (FIELDS^10+MONFLD+1 /V3 SET ONDISK BIT, DCA I AUTO11 /RELATE TO HIGHEST+1 FG-FIELD TAD (CDF%2 DCA I AUTO11 /UPDATE NAMLST. ZNUM CONTAINS THE MODULE'S /POSITION IN NAMLST. TAD ZNUM TAD (NAMLST /PUT NAME DIRECTLY IN NAMLST DCA ZTEM TAD ZNAME DCA I ZTEM /WRITE MODULE ONTO DISK TAD ZWC /MAKE FUNCTIONWORD STL RAR /WRITE; WLL.LLL.FFF.000 TAD (FONE DCA XLDTV TAD I (OFSET /BLOCK# ON DISK TAD ZBLK DCA XLDTV+2 CIF 0 /SYSHANDLER ALWAYS IN FIELD 0 JMS I (SYSHNDLR XLDTV, 0 /FUNCTION WORD XLOLIM /ADDRESS IN CORE 0 /BLOCK # ON DISK JMP I (XLERR9 /SYSTEM WRITE ERROR JMP I (XL4 /ALL INPUT FILES HAVE BEEN LOADED:SAVE DSKMAP AND THE TABLES. XLEND, TAD I (OFSET DCA OFSET3 CIF 0 JMS I (SYSHNDLR COREND-DATORG&7600+600%2+FZERO+4000 DSKMAP OFSET3, 0 JMP I (XLERR9 /SYS WRITE ERROR
/NOW PRINT HOW MANY BLOCKS THE LIBRARY AREA CONTAINS. XLMON, TAD (DSKMAP /V3 DCA AUTO15 /V3 FIND OUT WHERE DSKMAP ENDS TAD I AUTO15 /V3 SZA CLA /V3 JMP .-2 /V3 TAD AUTO15 /V3 POINTS TO FIRST BLANK TAD (-DSKMAP /V3 JMS I (PRINTD /PRINT DECIMAL JMS I (MESG;TEXT / BLOCKS/ /MAKE RESTARTABLE AND TEST ALTMODE BIT BLDEND, JMS I (CRLF KCC /V3 DON'T PASS ^O TO COMM. DEC. TAD (PSIJOB&177+5200 /V3 JMP PSIJOB CDF PSFLD /V3 DCA I (PSINST /V3 MAKE PS8IN RESTARTABLE TAD I (7642 /V3 CDF FZERO /V3 SMA CLA /V3 ALTMODE SET ? XLERSW, JMP I (RSTRT /V3 NO (CLEARED WHEN ERROR) OS8MON, CDF CIF 0 /YES, THAT MAKES IT THE END JMP I C7600 /BYE, BYE PAGE
/BINARY LOADER SUBROUTINE /THIS BINARY LOADER IS MUCH DIFFERENT FROM THE STANDARD /ONE . IT WAS DESIGNED ON THE CONCEPT OF A MECHANISM /THAT FREES THE PROGRAMMER FROM THE CUMBERSOME BINARY /FORMAT PECULIARITIES.THE PROGRAM READS BINARY 'TAPE' /FROM AN INPUT DEVICE AND PRODUCES 3 PARAMETERS OF /INTEREST:THE LOAD POINTER 'BINPC', THE LOAD FIELD 'BINFLD' /AND THE CONTENTS OF THE DATA 'BINAC'. THE USER CAN /TEST FORMATS AND BOUNDARIES, AND HAS TO DEPOSIT THE /DATA HIMSELF. /DURING LEADER PHASE THE ROUTINE IGNORES LEADER /CODE. A JMS TO BINL WITH AC UNEQ 0 ALSO /RESETS ALL PARAMETERS AND RETURNS TO LEADER MODE. /HOW TO USE THE ROUTINE AS A STANDARD BINARY LOADER /START, JMS BINL / HLT /EOT RETURN;AC=0 / HLT /READY RETURN;AC=DIFFERENCE IN CHECKSUMS / TAD BINFLD /AC=0;NORMAL RETURN / DCA TEM / TAD BINAC /TEM, 0 / DCA I BINPC / JMP START BINL, .-. /AC UNEQ 0 =RESET PARAMETERS SZA CLA JMP BINIT /RESET TAD BINSW /WHERE TO START ? SZA CLA JMP BINCHX /START AFTER NORMAL RETURN /OF PREVIOUS CALL BIN2, JMS BINGG /START AFTER CHECKSUM RETURN /OF PREVIOUS CALL JMP .-1 /IGNORE LEADER BINGO, DCA BINSUM /CLEAR OR ADD TO CHECKSUM TAD BINTEM /SET FIELD DCA BINFLD TAD BINCHR DCA BINW1 JMS HSREAD /LOOK AHEAD JMP I BINL /END OF TAPE DCA BINW2 JMS BINGG /READ NEXT JMP BINEND /TRAILER= END JMS BINASS /ASSEMBLE WORD1 AND WORD2 SNL /ORIGIN ? JMP BINOUT /NO: NORMAL RETURN DCA BINPC /YES:SET ORIGIN SKP /DON'T UPDATE POINTER
BINCHX, ISZ BINPC /UPDATE POINTER TAD BINW1 /UPDATE CHECKSUM TAD BINW2 TAD BINSUM JMP BINGO BINGG, .-. /READ AND TEST FRAMES JMS HSREAD JMP I BINL /END OF TAPE DCA BINCHR /SAVE FRAME TAD BINCHR TAD M200 /200 ? SPA /YES ISZ BINGG /DATA OR ORIGIN SPA SNA CLA JMP I BINGG /DATA, ORIGIN OR L/T TAD BINCHR TAD (-300 SMA /IS IT REALLY A BINARY FILE ? AND C7 SZA CLA JMP XLER12 /NO, PROBABLY ASCII ! TAD BINCHR /FIELD SETTING AND C70 /GET FIELD BITS TAD C6201 /MAKE A CDF DCA BINTEM /SAVE JMP BINGG+1 /CONTINUE INPUT BINOUT, DCA BINAC /SAVE DATA CLL CLA CMA /SET PROGRAM SWITCH DCA BINSW ISZ BINL /NORMAL RETURN ISZ BINL / CHECKSUM RETURN JMP I BINL BINASS, .-. /ASSEMBLE 2 FRAMES TAD BINW1 CLL RTL /SWAP BYTES RTL RTL TAD BINW2 JMP I BINASS /RETURN BINIT, TAD C6201 /INITIALIZE DCA BINTEM /FIELDS TAD BINTEM DCA BINFLD DCA BINSW /CLEAR PROGRAM SWITCH JMP BIN2 /CONTINUE PROGRAM
BINEND, DCA BINSW /CLEAR PROGRAM SWITCH CLA CMA TAD BINPC DCA BINPC /BACKUP BINPC JMS BINASS /FOR CHECKSUM CIA TAD BINSUM JMP BINOUT+4 /CHECKSUM RETURN BINSW, 0 /PROGRAM SWITCH BINFLD, CDF 0 /DATAFIELD BINAC, 0 /DATA BINPC, 0 /POINTER BINTEM, CDF 0 /NEXT FIELD SETTING BINCHR, 0 /LAST READ CHAR. BINW1, 0 /FIRST FRAME BINW2, 0 /SECOND FRAME BINSUM, 0 /CHECKSUM /READ FROM OS8 / CLA / JMS READ OR JMS HSREAD / EOT RETURN /AC=0 / NORMAL RETURN /AC=NEXT CHARACTER READ, HSREAD, .-. CIF 10 /FOR PS8IN JMS I (PS8IN TAD (-232 /IS IT CTRL/Z ? SNA JMP I READ /YES:END OF TAPE TAD (232 /N;EXIT WITH CHAR IN AC ISZ READ JMP I READ XLER12, JMS I (MESG;TEXT /BAD BINARY/;JMP I (XLERR PAGE
/ROUTINE TO CONVERT A BINARY WORD TO DECIMAL AND TYPE IT. /VALID FOR NUMBERS 0-4095. NO SIGN. / / TAD WORD / JMS PRINTD / RETURN /AC=0 PRINTD, 0 /ENTER WITH WORD IN AC DCA PRTEM TAD M4 /SET UP COUNT DCA PRCNT DCA PRSWIT /CLEAR SWITCH TO SUPPRESS LEADING ZERO'S PRNEXT, DCA PRBCD /CLEAR BCD PRNXT1, TAD PRTAD /FETCH CURR. CONV. CONST. TAD PRCNT /BY ADDING COUNT TO TAD DCA .+1 HLT /TAD (-CONSTANT CLL TAD PRTEM /VALUE - CONSTANT SNL /OVERFLOW? JMP PRTYP /NO,TYPE IT ISZ PRBCD /YES,NEXT TRY DCA PRTEM JMP PRNXT1 PRTYP, CLA PRTAD, TAD PRBCD /USED FOR CONV. CONSTANTS SNA CLA /V3 JMP .+4 /V3 TAD C260 DCA PRSWIT /V3 TAD PRBCD /V3 TAD PRSWIT /V3 SZA /V3 JMS I (TYPE ISZ PRCNT JMP PRNEXT /NEXT DIGIT JMP I PRINTD PRTEM, 0 /TO SAVE A CHAR DECIMAL -1000 /CONVERSION CONSTANTS -100 -10 -1 OCTAL PRBCD, 0 /MUST BE JUST BEHIND TABLE PRSWIT, 0 /0 OR 260
/ERROR MESSAGES XLERR0, JMS I (MESG;TEXT /READ/;JMP XLERR XLERR3, JMS I (MESG;TEXT /UNDERLOAD/;JMP XLERR XLERR4, JMS I (MESG;TEXT /OVERLOAD/;JMP XLERR XLERR5, JMS I (MESG;TEXT /CHECKSUM/;JMP XLERR XLERR6, JMS I (MESG;TEXT /LENGTH/;JMP XLERR XLERR7, JMS I (MESG;TEXT /DISK/;JMP XLER10 XLERR8, JMS I (MESG;TEXT /NAMLST/ XLER10, JMS I (MESG;TEXT / FULL /;JMP XLERR
XLERR9, JMS I (MESG;TEXT /WRITE/ XLERR, JMS I (MESG;TEXT / ERR;FILE#/;*.-1 FILNUM, 6060 /NUMBER OF LOADED MODULE FILNAM, 4040 /NAME OF LOADED MODULE PRCNT, 0 XLREND, DCA I (XLERSW /V3 FORCE ALTMODE ON JMS I (CRLF JMP I (XLMON XLER11, TAD (1000 /V3 SET NOT RESTARTABLE CDF 0 /V3 DCA I (7746 /V3 CDF FZERO /V3 JMS I (MESG;TEXT /TSKLIB.M8 NOT FOUND/ JMP XLREND PAGE
/TEXT TYPER / JMS MESG / TEXT /ABC/ MESG, .-. CLA TAD I MESG IFZERO PDPTYP-PDP8E < BSW > IFNZRO PDPTYP-PDP8E < CLL RTR RTR RTR > JMS CHTYP /TYPE LEFT CHAR. TAD I MESG JMS CHTYP /TYPE RIGHT CHAR. ISZ MESG JMP MESG+2 CHTYP, 0 /PRINT 6-BIT ASCII AND C77 SNA JMP MESGND /IF ZERO END OF MESG TAD C240 AND C77 TAD C240 /TRICK TO MAKE 8-BIT ASCII JMS TYPE JMP I CHTYP MESGND, ISZ MESG /END OF MESSAGE, SET RETURN JMP I MESG CRLF, 0 /PRINT CRLF TAD C215 JMS TYPE TAD C212 JMS TYPE JMP I CRLF TYPE, .-. /FOR BATCH OVERLAYED BY: TYPCIF, DCA TYPTEM/ CIF BATFLD TYPJMS, KRS / JMS I (BATOUT TYPJMP, TAD (-203 / JMP I TYPE SNA /V3 ^C ? JMP I (OS8MON /V3 TAD (203-217 /V3 ^O ? SNA CLA /V3 JMP I TYPE /V3 GO ON WITHOUT TYPING TAD TYPTEM /V3 GET CHARACTER IN AC TLS TSF JMP .-1 CLA TYPJM1, JMP I TYPE TYPTEM, 0
TSKBLD, 0 /HERE WE START CDF 0 TAD I C7777 CDF FZERO RAL SMA /BATCH FLAG SET ? JMP NOBATCH /NO RAR AND C70 TAD (CIF /FORM "CIF BATFLD" DCA TYPCIF TAD (JMS I C7400 /BATCH OUTPUT ROUTINE DCA TYPJMS TAD TYPJM1 DCA TYPJMP NOBATCH,JMS MESG;TEXT /TOPS-8 TASKBUILDER V/ *.-1 VERSION^100 /END OF MESSAGE ! JMS CRLF TAD (XLCOR-1 /MOVE PS8IN TO 17400-17577 DCA AUTO14 TAD (PS8IN-1 DCA AUTO15 TAD M200 DCA ZTEM INPLUP, TAD I AUTO14 CDF PSFLD // DCA I AUTO15 // CDF FZERO ISZ ZTEM /200 TIMES JMP INPLUP /THAT'S STILL FASTER THAN AN EXTRA JMP I TSKBLD /DISKTRANSFER
XLER13, JMS MESG;TEXT /TSKLIB.M8 NOT LARGE ENOUGH/;JMP I (XLERR XLER14, JMS MESG;TEXT /HANDLER FETCH ERR/;JMP I (XLERR /V3 XLER15, JMS MESG;TEXT /INPUT ERROR/;JMP I (XLERR /V3 PAGE XLCOR=.
/ PS/8 INPUT ROUTINE /LOADS IN 01600, RUNS IN 17400 / /*************************************************** / USER EQUATES /*************************************************** / INTPAG=1 /1 IF 2-PAGEHANDLER IS ALLOWED BUFIN=XLCOR+400 /STARTADDRESS OF INPUTBUFFER BLOKIN=DSKMAP-XLCOR-400%400 /NUMBER OF INPUT BLOCKS IFNZRO BLOKIN-1&4000 <NOBUF,XERROR> HANDIN=XLCOR /STARTADDRESS OF DEVICE HANDLER /RIGHT BEHIND XLOAD PSEXT=0216 / .BN=0216 / .AS=0123 / .PA=2001 / .LS=1423 / .DA=0401 / /******************************************************** / PROGRAM EQUATES /****************************************************** / PSFLD=10 /FIELD OF PROGRAM IS 1 BUFIFD=00 /FIELD OF INPUTBUFFER / /**************************************************** / /FIELD PSFLD%10 RELOC 7400 /USER DEFINED STARTINGADDRESS /
/ /************************************************** / MAIN FRAME OF PS8-INPUT ROUTINE /************************************************** / PS8IN, 0 /ENTRYPOINT PSIMON, 7600 /CLEAR AC /RDF /GET FIELD OF USER PROGRAM /TAD PSICIF /SET UP FOR EXIT /DCA PSIEXT+1 / PSINST, JMP PSIJOB /INITIALIZE, ONCE ONLY CODE / AFTER INIT. CDF BUFIFD / IS STORED HERE / /*************************************************** / GETCH, WRITTEN AS A SUBROUTINE, / NOW PART OF MAIN FRAME /*************************************************** / ROUTINE TO GET A CHARACTER FROM A STRING / PACKED IN A BUFFER / POINTERS ARE: / INPTR: ADDRESSPOINTER / INPKSW=0 : 8 LEAST SIGN. BITS OF [POINTER] / =-2: 4 MOST SIGN.BITS OF [POINTER-1] / AND [POINTER] / / UPON EXIT FROM GETCH, INPTR AND INPKSW / POINT TO NEXT CHARACTER / / WHEN BUFFER END IS DETECTED, A BUFFER / READ IS PERFORMED / GETCH TESTS THE NUMBER OF BLOCKS TO BE READ / WHEN NO MORE BLOCKS ARE AVAILABLE / A JUMP IS PERFORMED TO INITIALIZE NEXT FILE /***************************************************** /
TAD INPKSW /TEST PACKSWITCH SZA CLA JMP INPKON /JUMP IF -2 / TAD I INPTR /GET INFO.WORD AND PSI377 /KILL BIT 0-3 DCA INCHAR /SAVE TEMP / TAD INPTR /IS POINTER EVEN? CLL RAR SNL CLA /SKIP IF NO JMP .+4 /YES, JUMP / CLL CLA CMA RAL /SET PACKSWITCH TO -2 DCA INPKSW / SKP /NO INCREMENT ISZ INPTR /INCREMENT POINTER JMP GETEX /EXIT / INPKON, DCA INCHAR /MAKE TEMP.LOC ZERO TAD I INPTR /GET WORD PSI377, AND PS7400 /KILL BIT 4-11 TAD INCHAR CLL RTR RTR DCA INCHAR /SAVE TEMP / CLA CMA TAD INPTR /DECREMENT POINTER DCA INPTR / ISZ INPKSW /INCR.PACKSWITCH JMP INPKON+1 /AGAIN IF NONZERO CLA CLL CML IAC RAL TAD INPTR /SET POINTER TO NEXT WORD DCA INPTR / ISZ PTR2 /INCREMENT WORDPOINTER JMP GETEX /NOT ZERO, EXIT TAD PSIMON /RESTORE POINTER DCA PTR2 / ISZ PSINUM /INCR.NEG.BLOCKCOUNT SKP /NOT ZERO, MORE BLOCKS AVAILABLE JMP PSCTRZ /INITIALIZE NEXT FILE / TAD INLIM /TEST ON BUFFER END CLL TAD INPTR SZL CLA /SKIP IF BUFFER END JMS PSREAD /READ NEXT PART OF INPUT FILE /
/ /**************************************************** / LAST PART OF MAINFRAME /**************************************************** / TEST ON CONTROL/Z / GETEX, TAD INCHAR TAD PSI232 /WAS IT CTRL/Z? SNA CLA /SKIP IF NO JMP PSCTRZ /YES, GET NEW DEVICE OR FILE PSIEXT, TAD INCHAR /CHAR IN AC CDF CIF FZERO /RESTORE FIELD JMP I PS8IN /RETURN / PSIEND, TAD PS232 /END OF ALL FILES,GET CTRL/Z JMP PSIEXT+1 / AND RETURN / PSICIF, CIF CDF 0 /V3 INPTR, 0 /V3 INPKSW, 0 /V3 PTR2, 0 /V3 PSINUM, 0 /V3 INCHAR, 0 /V3 CCDBUF, CDF BUFIFD /V3 C7616, 7616 /V3 / /************************************************ / INITIALIZATION PART /************************************************ / SOME LOCATIONS ARE OVERWRITTEN / BY POINTERS AND SAVE LOCATIONS. /************************************************ / PSIJOB, CDF PSFLD /SET TO PROGRAM FIELD TAD CCDBUF /V3 DCA PSINST /AND STORE IN MAINPART / PSCD, JMS I PSIUSR /CALL COMMAND DECODER 5 /FUNCTION CODE PSEXT /EXTENSION BY DEFAULT 0 TAD C7616 /V3 DCA PSINDV /V3 RESET POINTER TO POINTER TO INPUT /
/ /********************************************** / ROUTINE TO LOAD DEVICE HANDLER /********************************************** / PSCTRZ, CDF PSFLD ISZ PSINDV /SET TO NEXT INPUT FILE TAD HANDAD /SET UP STARTING ADDR. DCA PSIHND / OF DEVICE HANDLER TAD I PSINDV /GET DEVICE NUMBER SNA /ZERO? JMP PSIEND /YES, INPUT END / JMS I PSIUSR /LOAD DEVICE HANDLER 1 /FUNCTION CODE PSIHND, 0 /ENTRYPOINT JMP INER1 /ERROR RETURN / TAD I PSINDV /GET NEGATIVE BLOCKCOUNT AND PSIRD+2 /KILL BIT 8-11 CLL RTR /V3 RTR /SHIFT 4 POS. TO RIGHT TAD PS7400 /INSERT BIT 0-3 DCA PSINUM /SAVE NUMBER OF BLOCKS / ISZ PSINDV /SET POINTER TO START.BLOCKNR. TAD I PSINDV /GET START.BLOCKNUMBER DCA PSIRD /STORE AT READ ROUTINE JMS PSREAD /READ NEXT PART IN BUFFER JMP PSINST /RETURN TO MAINFRAME / HANDAD, HANDIN+INTPAG / /************************************************ / ERROR PART /************************************************ / INER1, CDF CIF FZERO /V3 JMP I .+1 /V3 XLER14 /V3 HANDLER FETCH ERROR INER2, CDF CIF FZERO /V3 JMP I .+1 /V3 XLER15 /V3 INPUT ERROR /
/ /*********************************************** / ROUTINE TO READ FROM DEVICE /************************************************ / BLOKIN PSREAD, 0 /V3 CDF PSFLD CIF 0 /DEV.HANDLER IN FIELD 0! JMS I PSIHND /CALL DEVICE HANDLER BLOKIN^200+BUFIFD PSIBUF, BUFIN /BUFFER ADDRESS PSIRD, 1000 /STARTING BLOCKADDRESS PSIUSR, SMA CLA /ERROR RETURN, SKIP IF FATAL 7760 /SKIP IF AC 0 AND CONSTANT JMP INER2 /FATAL ERROR, DO NOT RETURN / TAD PSREAD-1 /UPDATE STARTING BLOCKNUMBER TAD PSIRD DCA PSIRD / TAD PSIBUF /RESET INPUT POINTER DCA INPTR DCA INPKSW /RESET PACKSWITCH TAD PSIMON /RESET BLOCKPOINTER DCA PTR2 / JMP I PSREAD /RETURN / / /*********************************************** / CONSTANTS AND VARIABLES /************************************************ / PS232, 232 PSI232, -232 PS7746, 7746 PSINDV, 7616 / INLIM, -BLOKINN^400-BUFIN / *PS8IN+177 PS7400, 7400 /DON'T MOVE THIS CONSTANT!! RELOC $$$$$$$



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search