ASMB,A,B,L * 13037/7906 bootext that boots HP-IPL/OS Last mod 2/22/07 * Converted to ASMB format 7/9/05 (EXTASMB 10/2/07) * * The boot loader loads 2011-16010 (octal) from cylinder 0 * and JSB's to address contained in location 2055. * After being started by the boot-rom this code relocates the * first 256 words of itself to 76011 and runs from there to * load in HP-IPL/OS (or any 31K binary starting at 2) from disk. * The binary is loaded to the range of 2-76001 from the 8KW mark. * * This code contains a routine that writes this bootext to * cylinder 0, run from 2012 with the following SR settings... * SR BITS 6-11 = disk controller slot (or 0 for no patch) * SR BIT 15 = set for fixed, clear for removeable * Only drive 0 is supported, afaict only drive 0 can be booted. * * Use HP-IPL/OS' DGEN command to write the 2-76001 boot image. * ORG 2011B DC EQU 16B HLT 33B error! JMP WBEXT ENTRY TO LAY BOOTEXT TO DISK JMP KLOOP ENTRY TO RUN UP HIGH AND BOOT CW1A OCT 120016 DMA PROGRAM CONTROL WORD (DC=16) CW2B OCT 100002 DMA STARTING ADDRESS CW3A OCT 176000 DMA LENGTH -1024 DEC RDCMD OCT 002400 READ COMMAND SKCMD OCT 001200 SEEK COMMAND STCMD OCT 001400 STATUS CHECK COMMAND CYLNO OCT 000000 CYLINDER NUMBER HDSEC OCT 000420 hpos image HEAD/SECTOR, 1420 FOR FIXED * HDSEC bits 8,9 = head, bits 0-5 = sector C1000 OCT 1000 MASK FOR BIT 9 C400 OCT 400 MASK FOR BIT 8 C40 OCT 40 Mask for bit 5 CSLEN OCT 177741 COMPLEMENTARY "SECTOR" LENGTH = -31 SESIZ OCT 2000 "SECTOR" SIZE = 1KW RSINC DEC 8 NUMBER OF REAL SECTORS IN A "SECTOR" * note.. real disk sectors = 128 words.. hpiplos sectors = 1K * will dma in 1K at a time, bumping start adr by CSSIZ and sector by RSINC WRAP1 OCT 60 WRAP HDSEC 60 TO 400 WRAP2 OCT 460 WRAP HDSEC 460 TO 0 AND INC CYLNO WRAPM OCT 477 100111111 HEAD/SECTOR MASK (IGNORE B9) * ADR1 OCT 2011 LOADED ADDRESS ADR2 OCT 76011 DESTINATION ADDRESS CCSIZ OCT 177400 COMP. COPY SIZE - 256 WORDS BADR OCT 76013 ADDRESS TO JUMP TO BOOT * RELOC JSB PATCH patch slot addresses to SR 6-11 RLOOP LDA ADR1,I GET LOCATION STA ADR2,I STORE UP HIGH ISZ ADR1 BUMP ISZ ADR2 POINTERS ISZ CCSIZ MORE TO COPY? JMP RLOOP NO. COPY MORE JMP BADR,I START RUNNING UP HIGH * ORG 2055B DEF *+1 NOP BOOT-ROM JSB ENTRY JMP RELOC RELOCATE TO 76011 * KLOOP JSB SEEK MOVE HEAD TO DESIRED CYLINDER P1 CLC DC ENSURE CONTROL SIGNALS ARE RESET ON P2 CLF DC LDA CW1A GET FIRST DMA CONTROL WORD OTA 6 OUTPUT TO DMA CHANNEL CLC 2 PREPARE DMA FOR DMA CONTROL WORD 2 LDA CW2B GET DMA CONTROL WORD 2 OTA 2 OUTPUT TO DMA CHANNEL STC 2 PREPARE DMA FOR DMA CONTROL WORD 3 LDA CW3A GET DMA CONTROL WORD 3 OTA 2 OUTPUT TO DMA CHANNEL LDA RDCMD GET INTERFACE READ COMMAND WORD STC 6,C ACTIVATE DMA P3 OTA DC,C INITIATE READ OPERATION P4 SFS DC IS READ OPERATION COMPLETE JMP *-1 NO. WAIT. ISZ CSLEN YES. CHECK FOR NEXT SECTOR. JMP NXTSE MORE. JUMP TO NEXT SECTOR. CLF 6 DMA OFF P5 CLC DC data channel off P6 CLF DC that too LIA 1 get sr settings AND C40 isolate bit 5 SZA skip if A is zero JMP CFGH jump to config halt if bit 5 of SR set JMP *+1,I FAR JUMP TO LOC. 2 OCT 2 CFGH LDA 355B config halt - get current TTY OTA 1 display on switches HLT 77B halt 77 - now select SR and modify JMP *+1,I far jump to 70 to autoconfig OCT 70 NXTSE JSB INCSE CALL SUB TO SET UP FOR NEXT SECTOR JMP KLOOP LOOP TO LOAD NEXT SECTOR * INCSE NOP SUB ENTRY LDA CW2B GET DMA ADDRESS ADA SESIZ ADD 2000, 1K "SECTOR" STA CW2B WRITE IT BACK LDA HDSEC GET HEAD/SECTOR ADA RSINC ADD 8 TO GET TO NEXT "SECTOR" STA HDSEC WRITE IT BACK AND WRAPM CPA WRAP1 CHECK FOR WRAP TO ODD HEAD JMP WRODD YES. JUMP CPA WRAP2 CHECK FOR WRAP TO NEXT CYLINDER JMP WRCYL YES. JUMP JMP INCSE,I RETURN WRODD LDA HDSEC WRAP ODD - GET HEAD/SECTOR AND C1000 KEEP BIT 9, REST 0 IOR C400 MAKE x400 STA HDSEC WRITE IT BACK JMP INCSE,I RETURN WRCYL LDA HDSEC WRAP CYLINDER - GET HEAD/SECTOR AND C1000 KEEP BIT 9, REST 0 STA HDSEC WRITE IT BACK ISZ CYLNO INCREMENT CYLINDER JMP INCSE,I RETURN * SEEK NOP SUBROUTINE ENTRY P7 CLC DC P8 CLF DC LDA SKCMD P9 OTA DC P10 SFS DC JMP *-1 LDA CYLNO P11 STF DC P12 OTA DC P13 SFS DC JMP *-1 LDA HDSEC P14 STF DC P15 OTA DC P16 SFS DC JMP *-1 JMP SEEK,I RETURN * Patch subroutine * slot in bits 6-11 of switch register PATCH NOP LIA 1 get switch settings AND C7700 keep just slot bits SZA,RSS skip if not zero JMP PATCH,I exit sub if clear (no patch) ARS,ARS ARS,ARS ARS,ARS shift A right 6 times STA CHAN save in chan LDA PLADR get patch list adr STA PPTR save in patch pointer PLOOP LDB PPTR,I get address to patch SZB,RSS skip if not zero JMP PATCH,I if zero exit sub, done LDA 1,I get instruction AND C1777 zero low 6 bits IOR CHAN or with slot# STA 1,I put it back ISZ PPTR increment patch ptr JMP PLOOP loop to patch next location HLT 66B should never get here C7700 OCT 7700 mask for bits 6-11 (slot) CHAN OCT 0 PPTR OCT 0 C1777 OCT 177700 PLADR DEF *+1 list of points to patch... DEF CW1A DEF CW1W DEF P1 DEF P2 DEF P3 DEF P4 DEF P5 DEF P6 DEF P7 DEF P8 DEF P9 DEF P10 DEF P11 DEF P12 DEF P13 DEF P14 DEF P15 DEF P16 DEF P17 DEF P18 DEF P19 DEF P20 DEF P21 DEF P22 DEF P23 DEF P24 DEF P25 DEF P26 DEF P27 DEF P28 DEF P29 DEF P30 DEF P31 DEF P32 OCT 0 * * INITIALIZATION CODE - WRITE BOOTEXT TO CYLINDER 0 * SR bits 6-11 = controller slot (0 for no-patch) * SR bit 15 set for fixed platter * CW1W OCT 100016 DMA CONTROL WORD FOR WRITE, SLOT 16 CW2 OCT 002011 START ADDRESS (WRITE) CW3 OCT 164000 -6144 IN OCTAL WRCMD OCT 004000 WRITE COMMAND WORD HDSE2 OCT 000000 form h/s for writing bootext WBEXT JSB PATCH patch if SR 6-11 <> 0 LIA 1 get switches SSA,RSS skip if bit 15 set JMP DOWRT if bit 15 clear do write LDA C1000 bit 9 set STA HDSE2 SET BIT 9 IF FIXED PLATTER LDA HDSEC IOR HDSE2 STA HDSEC SET BIT 9 IN HDSEC TOO IF FIXED DOWRT CLC 0 TURN OFF INTERRUPTS IN CASE ON P17 CLC DC RESET CONTROL SIGNAL P18 CLF DC LDA SKCMD GET SEEK COMMAND WORD P19 OTA DC send seek command P20 SFS DC JMP *-1 CLA CLEAR A P21 STF DC P22 OTA DC send cylinder = 0 P23 SFS DC JMP *-1 LDA HDSE2 P24 STF DC P25 OTA DC send hdsec 0 for rem, 1000 for fixed P26 SFS DC JMP *-1 P27 CLC DC P28 CLF DC LDA CW1W GET FIRST DMA CONTROL WORD OTA 6 OUTPUT TO DMA CHANNEL CLC 2 PREPARE FOR CONTROL WORD 2 LDA CW2 GET WRITE START ADDRESS OTA 2 OUTPUT TO DMA CHANNEL STC 2 PREPARE FOR CONTROL WORD 3 LDA CW3 GET COMP. LENGTH OTA 2 OUTPUT TO DMA CHANNE: LDA WRCMD GET INTERFACE WRITE COMMAND STC 6,C ACTIVATE DMA P29 OTA DC send write command P30 SFS DC JMP *-1 wait till done CLF 6 DMA OFF P31 CLC DC slot off P32 CLF DC HLT 44B HALT WITH CODE 44 - WRITE complete JMP *-1 * set bit 5 of SR first to halt after loading hpiplos ASC 8, 6/20/05 WTN * END OF SOURCE END