* this code loads and runs a system binary from a 7900 drive * last mod 1/10/04 * entry: IRQ/DMS off, parms in locations... (octal) * 246 - block address (high block not supported) * 250 - drive number, 0-3 removeable 4-7 fixed * DC EQU 16B CC EQU 17B BLOCK EQU 246B DRVNM EQU 250B ORG 77500B * LDA BLOCK GET BLOCK ADDRESS TO BOOT FROM STA BLADR STORE IN BLOCK ADDRESS VARIABLE LDA DRVNM AND DNC3 STA DRIVE LDA DRVNM AND DNC4 CLB SZA LDB DNCB9 STB PLATT KLOOP JSB LSEEK MOVE HEAD TO DESIRED BLOCK ADDRESS CLC DC INSURE CONTROL SIGNALS ARE RESET ON CLC CC DATA AND COMMAND CHANNELS 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 IOR DRIVE combine with drive number OTA CC OUTPUT TO COMMAND CHANNEL STC DC,C PREPARE DATA CHANNEL FOR READ OPERATION STC 6,C ACTIVATE DMA STC CC,C INITIATE READ OPERATION SFS CC 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 JMP *+1,I FAR JUMP TO RUN ADDRESS OCT 2 start at location 2 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 ISZ BLADR NEXT BLOCK ADDRESS JMP INCSE,I RETURN * LSEEK NOP * each cylinder contains 48 sectors, 24 on the top * and 24 on the bottom. Head is indicated by bit 8 * of HDSEC, bits 0-4 are sector, 0-23. Each 1K logical * sector = 8 real sectors. Formulas... * Cylinder = int(BlockAddress / 6) * HeadSector = (BlockAddress MOD 6) * 8 * If HeadSector >= 24 Then * HeadSector = HeadSector - 24 * Set bit 8 to indicate head 1 LDA BLADR CLB * DIV OCT 100400 DEF C6 STA CYLNO cyl=block / 6 LDA 1 get remainder * MPY OCT 100200 DEF C8 STA HDSEC hdsec = block mod 6 * 8 ADA CM24 A = hdsec - 24 SSA skip if sign clear (hdsec>=24) JMP SEEK ready to seek IOR CB8 set bit 8 STA HDSEC hdsec = hdsec - 24 with bit 8 set SEEK CLC DC CLC CC LDA CYLNO get cylinder OTA DC STC DC,C output to data channel LDA SKCMD get seek command IOR DRIVE STC DC,C output to data channel OTA CC output to command channel STC CC,C initiate seek SFS DC first address word accepted? JMP *-1 no, wait LDA HDSEC get head/sector IOR PLATT OTA DC STC DC,C output to data channel SFS CC seek complete? JMP *-1 no, wait JMP LSEEK,I exit subroutine * CW1A OCT 120016 DMA PROGRAM CONTROL WORD (DC=16) CW3A OCT 176000 DMA LENGTH -1024 DEC RDCMD OCT 020000 READ COMMAND SKCMD OCT 030000 SEEK COMMAND DNC3 OCT 3 DNC4 OCT 4 DNCB9 OCT 1000 * HDSEC bits 8,9 = head, bits 0-4 = sector C3 OCT 3 MASK FOR BITS 0,1 C6 OCT 6 C8 DEC 8 CM24 DEC -24 CB8 OCT 000400 CB9 OCT 001000 SESIZ OCT 2000 BLOCK SIZE CSLEN DEC -31 COMPLEMENTARY #BLOCKS CW2B OCT 100002 DMA STARTING ADDRESS CYLNO OCT 0 CYLINDER NUMBER HDSEC OCT 0 HEAD/SECTOR BLADR OCT 0 BLOCK ADDRESS DRIVE OCT 0 PLATT OCT 0 *