ASMB,A,B,L,C HED HP 7900/7905 DISC INITIALIZATION (DSN 011000) * ORG 100B SUP A EQU 0 B EQU 1 SC EQU 0 INTP EQU 0 SWREG EQU 1 DMA2 EQU 2 DMA6 EQU 6 * * * LINK TABLE * START JMP 130B,I GO TO START OF PROGRAM DRI BSS 1 DATA RECORD INPUT COD BSS 1 CONSOLE OUTPUT DRIVER LPD BSS 1 LINE PRINTER DRIVER CID BSS 1 CONSOLE INPUT DRIVER FWA DEF FWAA FIRST WORD OF AVBL. MEMORY LWA BSS 1 LAST WORD OF AVBL. MEMORY BSS 1 DIAG. LOADER PROGRAM BSS 1 1 MILSEC. TIME COUNT DRISC BSS 1 DATA RECORD INPUT SELECT CODE CODSC BSS 1 CONSOLE OUTPUT SELECT CODE LPDSC BSS 1 LINE PRINTER SELECT CODE CIDSC BSS 1 CONSOLE INPUT SELECT CODE CTO BSS 1 COMPUTER TYPE/OPTIONS NOP USER CARD TYPE AND SELECT CODE MEM BSS 1 MEMORY SIZE BSS 1 GO TO DIAG. LOADER PROGRAM WAIT BSS 1 1 MILL SEC TIMER ROUTINE SWRC BSS 1 CHECK SWITCH REG D2AS BSS 1 DECIMAL TO ASCII CONVERSION O2AS BSS 1 OCTAL TO ASCII CONVERSION AS2N BSS 1 ASCII TO BINARY CONVERSION DSN OCT 011000 SERIAL NUMBER FMTO BSS 1 FORMATTED OUTPUT * DEF DI SKP * OUTPUT MESSAGE + CALL FOR INPUT * MSG NOP CLA,CLE LDB MSG,I OUTPUT MESSAGE ELB,CLE,ERB CLEAR BIT 15 SZB SKIP OUTPUT IF NO MESSAGE JSB FMTO,I LDB MSG,I IS THIS A MESSAGE ONLY SSB ? JMP MSGX YES - EXIT LDA DN10 CLEAR LDB IBUFD BUFFER STB TMP0 CLB STB TMP0,I ISZ TMP0 INA,SZA JMP *-3 LDA D20 CALL FOR INPUT LDB IBUFD JSB CID,I SZA,RSS IF NO INPUT TRY AGAIN JMP MSG+1 LDA IBUFD SET POINTER RAL FOR GET BLOCK (GETB) STA IBUFP MSGX ISZ MSG JMP MSG,I RETURN SKP * GET 4 ASCII CHARACTERS (FROM CONSOLE INPUT BUFFER) * IN A & B REG. THEN SKIP TO COMMA OR EOL * GETA NOP CLA CLEAR CHARACTERS FIRST STA SVA STA SVB JSB GETCH FIRST CHARACTER JMP GETAE ALF,ALF STA SVA JSB GETCH SECOND CHARACTER JMP GETAE IOR SVA STA SVA JSB GETCH THIRD CHARACTER JMP GETAE ALF,ALF STA SVB JSB GETCH FOURTH CHARACTER JMP GETAE IOR SVB STA SVB JSB GETCH WAIT FOR COMMA OR EOL RSS JMP *-2 GETAE LDA SVA GET THE FOUR CHARACTERS LDB SVB JMP GETA,I RETURN * GETCH NOP LDB IBUFP CLE,ERB LDA B,I SEZ,RSS ALF,ALF AND B177 SZA,RSS EOL? JMP GETCH,I YES ISZ IBUFP NO MOVE TO NEXT CHARACTER CPA COMA COMMA? RSS YES ISZ GETCH ADJUST RETURN IF NOT A COMMA OR EOL JMP GETCH,I SKP * CONVERT SELECT CODE * CVSC NOP JSB GETA GET ASCII INPUT SZB IF MORE THAN 2 JMP CVSC,I THEN ERROR SZA,RSS IF NO INPUT JMP CVSC,I THEN ERROR ALF,ALF JSB CVSCC CHECK IT JMP CVSC,I NOT A NUMBER RAL,RAL OK RAL SAVE IT SZA,RSS CAN'T BE ZERO JMP CVSC,I STA CVSCT LDA SVA JSB CVSCC CONVERT SECOND NUMBER JMP CVSC,I NOT A NUMBER IOR CVSCT ADD FIRST NUMBER ISZ CVSC ADJUST GOOD RETURN JMP CVSC,I RETURN * CVSCC NOP STA B AND B170 CPA B60 MUST BE A NUMBER RSS JMP CVSCC,I NOT SO RETURN WITH ERROR LDA B AND B7 ISZ CVSCC ADJUST RETURN JMP CVSCC,I RETURN * CVSCT NOP SKP * INITIALIZE SELECT CODE * ISC NOP STB ISCA SAVE LIST POINTER LDB ISCA,I GET AN ADDRESS CPB M1 END OF LIST? JMP ISC,I YES CPB M2 INCREMENT SELECT CODE ISCF RSS SET TO 0 IF 7905 JMP *+3 NO ISZ ISCT YES JMP *+5 BUT SKIP UPDATE OF M2 LDA B,I GET I/O INSTRUCTION AND ISCM MASK OFF OLD SELECT CODE ADA ISCT ADD NEW ONE STA B,I PUT IT BACK IN PLACE ISZ ISCA MOVE TO NEXT ONE JMP ISC+2 ISCA NOP ISCT NOP ISCM OCT 177700 * * OUTPUT MESSAGE AND CHECK ANSWER (YES OR NO) * YES? NOP LDA YES?,I ISZ YES? STA *+2 JSB MSG OUTPUT QUESTION NOP LDA IBUF CPA AYE JMP *+6 CPA ANO RSS JMP *-7 ISZ YES? ANSWER = NO RETURN P+3 JMP YES?,I LDA IBUF+1 ALF,ALF AND B177 CPA AS DID HE ADD THE "S" JMP YES?,I YES - RETURN P+2 JMP YES?+4 NO SKP * TABLE SEARCH ROUTINE * CNTS NOP JSB GETA GET FOUR CHARACTERS LDB CNTS,I ISZ CNTS CNTS0 LDA B,I START SEARCH CPA M1 END OF LIST? JMP CNTS,I YES-ERROR RETURN CPA SVA DO THE FIRST TWO CHR'S COMPAR? JMP *+5 YES INB NO MOVE TO CNTS1 INB NEXT BLOCK INB JMP CNTS0 INB LDA B,I CPA SVB DO THE NEXT TWO CHR'S COMPARE? JMP *+2 JMP CNTS1 NO INB YES LDA B,I GET NEXT WORD ISZ CNTS RETURN P+3 JMP CNTS,I SKP * MOVE DRIVER INTO LOCATION * (WILL UPDATE SELECT CODE) * MVDVR NOP STA FROM SAVE FROM LOCATION STB TO SAVE TO LOCATION LDA MVDVR,I GET NUMBER OF ISZ MVDVR WORDS TO BE MOVED STA MVCNT MVDV0 LDA FROM,I GET WORD LDB FROM,I CPB IOGM3 IS IT SWR REF? JMP MVDV1 YES - SKIP SC AND IOGM0 SZA,RSS IS IT A HALT JMP MVDV1 YES - SKIP SELECT CODE LDA FROM,I AND IOGM1 CPA IOGM2 IS IT AN IO INSTRUCTION ADB .SC YES - ADD SELECT CODE MVDV1 STB TO,I PUT IT IN PLACE ISZ FROM INCREMENT ADDRESSES ISZ TO FOR NEXT WORD ISZ MVCNT ALL WORDS MOVED? JMP MVDV0 NO JMP MVDVR,I * * IOGM0 OCT 700 IOGM1 OCT 172076 IOGM2 OCT 102000 IOGM3 LIA 1,C TO NOP FROM NOP MVCNT NOP SKP DINDM ASC 15,INPUT DEVICE (NO.,SC)........_ * DINDT EQU * ASC 2,2748 OCT 0 ASC 2,2758 OCT 0 ASC 2,2737 OCT 0 ASC 2,7970 OCT 1 ASC 2,7900 OCT 2 ASC 2,7901 OCT 2 ASC 2,7905 OCT 3 ASC 2,7920 OCT 3 ASC 2,2644 OCT 4 ASC 2,2645 OCT 4 DEC -1 * LDVRY ASC 17,READY INPUT DEVICE, PRESS RETURN_ * DINDD DEF *+1 DEF PT PAPER TAPE READER DEF MG MAG TAPE DEF DS 7900/1 DISC DEF DF 7905 DISC DEF CT 2644 CARTRIDGE TAPE SKP * TABLES-CONSTANTS-STORAGE-MESSAGES * B2 OCT 2 B3 OCT 3 B5 OCT 5 B7 OCT 7 B77 OCT 77 B700 OCT 700 DN10 DEC -10 D20 DEC 20 B177 OCT 177 BIT2 OCT 4 BIT5 OCT 40 BIT15 OCT 100000 SVA NOP SVB NOP .SC NOP TYPE NOP TMP0 NOP IBUFD DEF IBUF IBUFP NOP IBUF BSS 10 NOP END-OF-BUFFER M1 DEC -1 M2 DEC -2 M3 DEC -3 M10 OCT -10 B170 OCT 170 B60 OCT 60 ANO ASC 1,NO AYE ASC 1,YE AS OCT 123 COMA OCT 54 SKP DISC NOP DICY NOP DIHS NOP DICYS NOP DIHSS NOP DISTA NOP DISTC NOP DISTX NOP DICNT NOP DIADD NOP DICKM NOP DIDTA NOP DIFWA NOP DISN NOP DIMSK OCT 177077 DI126 OCT 126 COMMA OCT 54 DIBF BSS 129 DI203 DEC -203 7900 MAX CYLINDER NUMBER DI411 DEC -411 7905 MAX CYLINDER NUMBER DIMXC NOP MAX CYLINDER FOR SELECTED DRIVE DIFC NOP DIAD OCT 2050 DILDV DEF LDVR DILSC NOP * DISNM DEF *+1 ASC 03,DSN #/ DIMHD ASC 15,CARTRIDGE DISC INITIALIZATION/ DIMCY ASC 15,FIRST, LAST CYLINDER NUMBER.._ DICSE ASC 15,CHECKSUM ERROR, ABORT?......._ DIERM ASC 15,OVER LAST CYLINDER, ABORTED!!/ DIMEL ASC 15,END OF LOAD?................._ DIMTS ASC 15,DISC DEVICE (NO.,SC)........._ * DISCT EQU * ASC 2,7900 OCT 0 ASC 2,7901 OCT 0 ASC 2,7905 OCT 1 ASC 2,7920 OCT 1 ASC 2,VRFY OCT 7 DEC -1 SKP * DISC RESIDENT BOOT FOR THE CONFIGURATOR * ORG 2011B * ASC 2,LBDG DIAG. LABEL OCT 0 SYSTEM GEN CODE ASC 3,DIAG. DISC LABEL * DRBIO DEF DB0 START OF SELECT CODE UPDATE DRBEN DEF DRBEX END OF " " " DRBMK OCT 172076 I/O INSTRUCTION MASK DRBIN OCT 102000 I/O INSTRUCTION RESULT AFTER MASK DB0SK OCT 30000 7900 SEEK COMMAND DB0RC OCT 20000 7900 READ COMMAND DB5SK OCT 1000 7905 SEEK COMMAND DB5RC OCT 2400 7905 READ COMMAND DRBCW OCT 100000 DMA CONTROL WORD DRBSC OCT 0 DRBSX OCT 17 SECTOR 15 DRBMS OCT 77 SELECT CODE MASK DRBWC ABS 2011B-DLLDE DMA WORD COUNT FOR BOOT DRBSD OCT 102011 LOADING ADDRESS FOR SYS. BOOT DRBID DEF DLLDR STARTING ADDRESS FOR SYS. BOOT DRBJI JMP 3B,I FOR SYSTEM BOOT OCT 0,0,0,0,0,0,0,0,0 SPACE HOLDERS DRBCS NOP CHECKSUM FOR DOS IIIB ONLY OCT 0,0,0,0 SPACE HOLDERS DEF DRB START OF BOOT OCT 0 SKP DRB NOP BOOT ENTRY POINT STF DMA6 TURN OFF DMA CLA LDA DRB,I GET SC IN LOADER AREADMA SZA,RSS DID I GET IT? HLT 33B NO WAIT FOR OPERATOR TO ENTER IT AND DRBMS MASK OFF UPPER BITS STA DRBSC SAVE IT LDB DRBIO UPDATE I/O INSTRUCTIONS DRBC0 LDA B,I GET INSTRUCTION CPB DRBEN END OF UPDATE? JMP DRBC1 YES AND DRBMK MASK INSTRUCTION CPA DRBIN IS IT AN I/O INSTRUCTION? RSS JMP *+4 NO - SKIP UPDATE LDA B,I RESTORE INSTRUCTION ADA DRBSC ADD SELECT CODE STA B,I PUT IT BACK IN PLACE INB MOVE TO NEXT ONE JMP DRBC0 AND DO IT DRBC1 LDA DRBID SET INDIRECT ADD FOR SYSTEM STA 3B LDA DRBJI AND JMP 3B,I STA 2B JMP *+4 NOP DATAFOR DOS IIIB ONLY NOP NOP LDA DRBCW SET UP DMA IOR DRBSC ADD SELECT CODE OTA DMA6 CLC DMA2 LDA DRBSD ADDRESS 2011 OTA DMA2 STC DMA2 LDA DRBWC WORD COUNT OTA DMA2 DRB05 RSS SET TO NOP IF 7905 JMP DB5 7905 BOOT DRIVER JMP DB0 7900 BOOT DRIVER NOP SPACE HOLDER SKP * 7900 BOOT DRIVER * DB0 CCA GET CYLINDER -1 ADA DRBCY OTA SC STC SC,C LDA DB0SK GET SEEK COMMAND OTA SC+1 STC SC+1,C SFS SC WAIT FOR COMPLETION JMP *-1 LDA DRBSX GET HEAD SECTOR OTA SC STC SC,C DB0SF SFS SC+1 JMP *-1 CLC SC,C CLC SC+1,C LDA DB0RC GET READ COMMSND OTA SC+1 STC SC,C STC DMA6,C STC SC+1,C LDA DB0SF GET FLAG CHECK FOR COMPLETION JMP DRBEX WAIT FOR COMPLETION * * 7905 BOOT DRIVER * DB5 LDA DB5SK GET SEEK COMMAND CLC SC SET TO OUTPUT COMMAND OTA SC,C SFS SC WAIT FOR ACCEPTANCE JMP *-1 CCA ADA DRBCY GET CYLINDER -1 OTA SC,C SFS SC WAIT FOR COMPLETION JMP *-1 LDA DRBSX GET HEAD SECTOR OTA SC,C STC SC DB5SF SFS SC JMP *-1 LDA DB5RC GET READ COMMAND CLC SC OTA SC,C STC DMA6,C LDA DB5SF GET FLAG CHECK DRBEX LDB *+1 JMP 0 WAIT FOR COMPLETION OF LOAD * DILC OCT 0 LAST CYLINDER FOR INITIALIZATION DRBCY OCT 0 FIRST CYLINDER +1 OCT 0 SKP DLLDR CLC 0,C TURN OFF ALL I O LIB 1 GET SWITCH REGISTER RBR,RBR GET SYSTEM BIT RBR,SLB RSS JMP 2055B,I GO TO SYSTEM BOOT AND DLB77 MASK SELECT CODE ADA DLM1 SUBTRACT 1 FROM SC STA DLCY SAVE SELECT CODE LDB DLSCL GET POINTER TO I/O LIST STB DLHS SAVE IT DLLP0 LDB DLHS,I GET ADDRESS OF I/O INSTRUCTION CPB DLM2 DO SECOND SELECT CODE? RSS JMP *+3 ISZ DLCY YES MOVE UP ONE JMP *+7 CPB DLM1 END OF LIST? JMP *+7 LDA B,I GET THE I/O INSTRUCTION AND DLM00 MASK OFF OLD SC ADA DLCY ADD SELECT CODE STA B,I PUT IT BACK ISZ DLHS MOVE TO NEXT INSTRUCTION JMP DLLP0 DO IT CLA CALCULATE MEMORY SIZE STA 3B CLEAR WRAPAROUND LDB DL8K START WITH 8 K DLM0 STB B,I STORE ADDRESS CPB 3B DID IT WRAPAROUND JMP DLJ1 YES - THAT'S ALL FOLKS CPB B,I DID IT STORE? RSS JMP DLJ1 NO - THAT'S ALL FOLKS STB A SAVE CURRENT MEMORY SIZE CPB DL32K END OF BASE MEMORY? JMP DLJ1 YES ADB DL10K MOVE TO NEXT 4K JMP DLM0 TRY IT DLJ1 LDB DLMXA GET CURRENT LOCATION STB DLLAD AND DLDMC MASK OFF THE THREE LDB DLRW UPDATE ROUTINE POINTER ADB A STB DLRW IOR DLMXA MAKE NEW LOCATION STA DLLTM SAVE IT STA DLMXA LDB DLMC GET MOVE COUNT LDA DLLAD,I MOVE IT STA DLLTM,I ISZ DLLAD ISZ DLLTM INB,SZB JMP *-5 JMP DLMXA,I GO TO NEW LOCATION SKP DLLDS EQU * CLA CLEAR HEAD AND SECTOR STA DLCY STA DLHS JSB DLRD READ FIRST HEAD AND SECTOR JSB DLW GET CYLINDER JSB DLW GET NEST HEAD AND SECTOR JSB DLW GET MAX ADDRESS * * LOAD AN ABSOLUTE BINARY FILE * DLRR JSB DLW READ FIRST RECORD SZA EOF JMP *+3 NO - LOAD RECORD HLT 77B YES JMP 100B GO START PROGRAM ALF,ALF RETURN IS A = COUNT CMA,INA MAKE IT NEGATIVE STA DLLC SAVE COUNT JSB DLW READ ADDRESS STA DLLAD THIS WORD IS THE STORE ADDRESS STA DLTCS INITIALIZE CHECKSUM DLRL JSB DLW READ A WORD STA DLLTM SAVE WORD ADA DLTCS ADD WORD STA DLTCS TO CHECKSUM LDA DLLAD IS THE ADDRESS CMA,INA IN THE ADA DLMXA PROTECTED AREA SSA,RSS ? JMP *+3 HLT 55B JMP DLLDR YES - TRY AGAIN LDA DLLTM GET CONTENTS FOR MEMORY STA DLLAD,I PUT IT IN MEMORY ISZ DLLAD MOVE TO NEXT LOCATION ISZ DLLC IS THAT ALL? JMP DLRL NO JSB DLW READ CHECKSUM FROM FILE CPA DLTCS DOES CHECKSUM AGREE? JMP DLRR READ NEXT RECORD HLT 11B TELL OPERATOR OF CHECKSUM ERROR JMP DLLDR TRY AGAIN * DLW NOP LDA DLDA READ NEW SECTOR? CPA DLMXA ? JSB DLRD YES LDA DLDA,I NOW GET WORD ISZ DLDA MOVE POINTER TO NEXT ONE JMP DLW,I SKP DLB7 OCT 7 DLB77 OCT 77 DLM1 OCT -1 DLM2 OCT -2 DLM00 OCT 177700 DL1.5 OCT 100000 DLMC ABS DLLDR-DLLDE DL32K OCT 70003 DL8K OCT 10003 DL10K OCT 10000 DLTCS NOP DLLC NOP DLLTM NOP DLLAD NOP DLCY NOP DLHS NOP DLSA NOP DLSB NOP DLSN NOP DLDA NOP DLSCL NOP SPC 5 DLRD NOP LDA DLMXA SET ADDRESS POINTERS ADA DLDMC STA DLDA POINTER FOR DLW IOR DL1.5 STA DLDMC-1 READ POINTER LDA DLCY GET CYLINDER LDB DLHS AND HEAD SECTOR JSB DLRW,I READ IT NOP TO BUFFER DLDMC DEC -128 OF 128 WORDL STA DLCY SET NEXT CYLINDER STB DLHS AND HEAD SECTOR LDA DLSA CHECK IF BOOT WAS READ IOR DLSB SZA JMP DLRD,I NO - RETURN STA DLHS CLEAR SECTOR LDA DLLDS-2 GET STARTING CYLINDER STA DLCY JMP DLRD+1 TRY AGAIN * DLRW NOP SKP D0RW NOP STA DLSA SAVE CYLINDER STB DLSB AND HEAD SECTOR JSB D0SK GIVE SEEK LDA D0CW1 GIVE DMA THE SELECT CODE OTA DMA6 CLC DMA2 LDA D0RW,I BUFFER ADDRESS ISZ D0RW OTA DMA2 STC DMA2 LDB D0RW,I BUFFER COUNT ISZ D0RW OTB DMA2 SSA READ OR WRITE JMP D0R READ D0D01 STC DC WRITE - TRANSFER FIRST WORD D0D02 STF DC FROM DMA STC DMA6,C LDA D0WC GET WRITE COMMAND D0C01 OTA CC D0C02 STC CC,C JMP D0CMP WAIT FOR COMPLETION D0R LDA D0RC GET READ COMMAND D0C04 OTA CC D0D03 STC DC,C STC DMA6,C D0C05 STC CC,C