PR0 =: ^O<0*40> PR1 =: ^O<1*40> PR2 =: ^O<2*40> PR3 =: ^O<3*40> PR4 =: ^O<4*40> PR5 =: ^O<5*40> PR6 =: ^O<6*40> PR7 =: ^O<7*40> V.TR4 =: ^O< 4> V.TR10 =: ^O< 10> V.BPT =: ^O< 14> V.IOT =: ^O< 20> V.PWFL =: ^O< 24> V.EMT =: ^O< 30> V.TRAP =: ^O< 34> V.PET =: ^O<114> V.MMU =: ^O<250> ; MMU SSR0 =: ^O<177572> ; SSR0 Control and status ; 15 Non-resident ; 14 Length ; 13 Read-only ; 12 Trap ; 11 - 10 Unused ; 9 Enable Trap ; 8 Maintenance ; 7 Instruction Completed ; 6 - 5 CPU Mode ; 4 I/D ; 3 - 1 Page ; 0 - Enable MM0.EN =: ^O<1> SSR1 =: ^O<177574> ; SSR1 Register increment/descrement record ; 15 - 11 Change ; 10 - 8 Register ; 7 - 3 Change ; 2 0 Register SSR2 =: ^O<177576> ; Virtual address associated with the fault (usually the instruction address) SSR3 =: ^O<172516> ; D-space enable/disable (per mode) ; 15 - 6 Unused ; 5 Enable UNIBUS Map MM3.UN =: ^O<40> ; 4 Enable 22-bit MM3.22 =: ^O<20> ; 3 Unused ; 2 Kernel MM3.KD =: ^O<4> ; 1 Supervisor MM3.SD =: ^O<2> ; 0 User MM3.UD =: ^O<1> ; PDR ; 15 Don't Cache ; 14 - 8 Length ; 7 Trapped ; 6 Written ; 5 - 4 Unused ; 3 Direction ; 2 - 0 Access Control ; 0 Non-resident - abort all accesses ; 1 Read-only watched - abort on write, trap on read ; 2 Read-only - abort on write ; 3 Unused, reserved - abort all accesses ; 4 Read/write all watched - trap on read or write ; 5 Read/write watched - trap on write ; 6 Read/write - none ; 7 Unused, reserved - abort all accesses P.NCH =: ^O<100000> P.LNM =: ^O<177>*^O<400> P.AA2 =: ^O<7> ; 111 abort all accesses P.RW =: ^O<6> ; 110 none P.RWT =: ^O<5> ; 101 trap on write P.AT =: ^O<4> ; 100 trap on read or write P.AA1 =: ^O<3> ; 011 abort all accesses P.RWA =: ^O<2> ; 010 abort on write P.RTWA =: ^O<1> ; 001 abort on write, trap on read P.NONE =: ^O<0> ; 000 abort all accesses SISDR0 =: ^O<172200> ; 172200 - 172216 SISDx Supervisor I-Space PDR #x SISDR1 =: ^O<172202> SISDR2 =: ^O<172204> SISDR3 =: ^O<172206> SISDR4 =: ^O<172210> SISDR5 =: ^O<172212> SISDR6 =: ^O<172214> SISDR7 =: ^O<172216> SDSDR0 =: ^O<172220> ; 172220 - 172236 SDSDx Supervisor D-Space PDR #x SDSDR1 =: ^O<172222> SDSDR2 =: ^O<172224> SDSDR3 =: ^O<172226> SDSDR4 =: ^O<172230> SDSDR5 =: ^O<172232> SDSDR6 =: ^O<172234> SDSDR7 =: ^O<172236> SISAR0 =: ^O<172240> ; 172240 - 172256 SISAx Supervisor I-Space PAR #x SISAR1 =: ^O<172242> SISAR2 =: ^O<172244> SISAR3 =: ^O<172246> SISAR4 =: ^O<172250> SISAR5 =: ^O<172252> SISAR6 =: ^O<172254> SISAR7 =: ^O<172256> SDSAR0 =: ^O<172260> ; 172260 - 172276 SDSAx Supervisor D-Space PAR #x SDSAR1 =: ^O<172262> SDSAR2 =: ^O<172264> SDSAR3 =: ^O<172266> SDSAR4 =: ^O<172270> SDSAR5 =: ^O<172272> SDSAR6 =: ^O<172274> SDSAR7 =: ^O<172276> KISDR0 =: ^O<172300> ; 172300 - 172316 KISDx Kernel I-Space PDR #x KISDR1 =: ^O<172302> KISDR2 =: ^O<172304> KISDR3 =: ^O<172306> KISDR4 =: ^O<172310> KISDR5 =: ^O<172312> KISDR6 =: ^O<172314> KISDR7 =: ^O<172316> KDSDR0 =: ^O<172320> ; 172320 - 172336 KDSDx Kernel D-Space PDR #x KDSDR1 =: ^O<172322> KDSDR2 =: ^O<172324> KDSDR3 =: ^O<172326> KDSDR4 =: ^O<172330> KDSDR5 =: ^O<172332> KDSDR6 =: ^O<172334> KDSDR7 =: ^O<172336> KISAR0 =: ^O<172340> ; 172340 - 172356 KISAx Kernel I-Space PAR #x KISAR1 =: ^O<172342> KISAR2 =: ^O<172344> KISAR3 =: ^O<172346> KISAR4 =: ^O<172350> KISAR5 =: ^O<172352> KISAR6 =: ^O<172354> KISAR7 =: ^O<172356> KDSAR0 =: ^O<172360> ; 172360 - 172376 KDSAx Kernel D-Space PAR #x KDSAR1 =: ^O<172362> KDSAR2 =: ^O<172364> KDSAR3 =: ^O<172366> KDSAR4 =: ^O<172370> KDSAR5 =: ^O<172372> KDSAR6 =: ^O<172374> KDSAR7 =: ^O<172376> UISDR0 =: ^O<177600> ; 177600 - 177616 UISDx User I-Space PDR #x UISDR1 =: ^O<177602> UISDR2 =: ^O<177604> UISDR3 =: ^O<177606> UISDR4 =: ^O<177610> UISDR5 =: ^O<177612> UISDR6 =: ^O<177614> UISDR7 =: ^O<177616> UDSDR0 =: ^O<177620> ; 177620 - 177636 UDSDx User D-Space PDR #x UDSDR1 =: ^O<177622> UDSDR2 =: ^O<177624> UDSDR3 =: ^O<177626> UDSDR4 =: ^O<177630> UDSDR5 =: ^O<177632> UDSDR6 =: ^O<177634> UDSDR7 =: ^O<177636> UISAR0 =: ^O<177640> ; 177640 - 177656 UISAx User I-Space PAR #x UISAR1 =: ^O<177642> UISAR2 =: ^O<177644> UISAR3 =: ^O<177646> UISAR4 =: ^O<177650> UISAR5 =: ^O<177652> UISAR6 =: ^O<177654> UISAR7 =: ^O<177656> UDSAR0 =: ^O<177660> ; 177660 - 177676 UDSAx User D-Space PAR #x UDSAR1 =: ^O<177662> UDSAR2 =: ^O<177664> UDSAR3 =: ^O<177666> UDSAR4 =: ^O<177670> UDSAR5 =: ^O<177672> UDSAR6 =: ^O<177674> UDSAR7 =: ^O<177676> ; ; В старших версиях ВМ3 - на шине всегда есть PARH2 по виртуальному адресу 172512, ; но в некоторых документах говорится и про доступный PARH3 (логично предположить, что по адресу 172514) ; ; PARH0, PARH1 и PARH3 ; ; Для поддержки пультового режима в диспетчер памяти введены четыре дополнительных регистра, ; три из них имеют постоянные значения, а один доступен по чтению и записи по адресу 172512 (виртуальному, в HALT-моде). ; ; Если в режиме HALT процессор обращается к младшей половине памяти, то виртуальный адрес транслируется ; в физический без изменений, при этом одновременно с физическим адресом выдается сигнал SEL. ; ; Если в этом режиме процессор обращается к четверти памяти, начинающейся с виртуального адреса 100000, ; для получения физического адреса виртуальный адрес складывается с содержимым программно-доступного регистра PARH2 ; с (виртуальным) адресом 172512, сдвинутым влево на 6 разрядов. ; ; Адресация области регистров внешних устройств в физическом адресном пространстве происходит аналогично через ; программно-доступный регистр PARH3, в который предварительно заносится (процессором) код 177600 ; ; В справочнике Шахнова за 1988 год прямо сказано, что PARH0 инициализируется константой 170000, а PARH1 - константой 167600. ; ;PARH0 =: ^O<> ;PARH1 =: ^O<> PARH2 =: ^O<172512> ;PARH3 =: ^O<172514> N$WNDW =: ^O<100000> ; Базовый адрес окна доступа ко всей памяти в HALT режиме ; PS =: ^O<177776> ; ; Вектора регистры устройств ; ; Clock V.LTC =: ^O<100> ; Консольный терминал V.TKB =: ^O< 60> V.TPS =: ^O< 64> TKS =: ^O<177560> TKB =: ^O<177562> TPS =: ^O<177564> TPB =: ^O<177566> ; Clock LCCSR =: ^O<177546> ; Line printer LPS =: ^O<177514> LPB =: ^O<177516> ; CF and ZF card ; high-order byte | low-order byte ; ; +----------------------------------------+ ;+0 | Reserved | Adapter CSR | ; |----------------------------------------| ;+2 | Reserved for DMA co-adapter CSR | ; |----------------------------------------| ;+4 | Reserved for DMA address register | ; |----------------------------------------| ;+6 | Reserved for DMA word count | ; |----------------------------------------| ;+10 | Reserved | ; |----------------------------------------| ;+12 | Reserved | ; |----------------------------------------| ;+14 | Reserved | Alternate status (r/o) | ; | Reserved | Device control (w/o) | ; |----------------------------------------| ;+16 | Reserved | ; |----------------------------------------| ;+20 | Data (r/w) | ; |----------------------------------------| ;+22 | Reserved | Error (r/o) | ; | Reserved | Features (w/o) | ; |----------------------------------------| ;+24 | Reserved | Sector Count (r/w) | ; |----------------------------------------| ;+26 | Reserved | Sector Number (r/w) | ; |----------------------------------------| ;+30 | Reserved | Cylinder Low (r/w) | ; |----------------------------------------| ;+32 | Reserved | Cylinder High (r/w) | ; |----------------------------------------| ;+34 | Reserved | Device/Head (r/w) | ; |----------------------------------------| ;+36 | Reserved | Status (r/o) | ; | Reserved | Command (w/o) | ; +----------------------------------------+ ;1 2 CS0# CS1# DA2 DA1 DA0 ; ; 1 1 x x x Нет обращения (шина данных в третьем состоянии) ; ; 0 0 x x x Недопустимый адрес (шина данных в третьем состоянии) ; ; ; ;3FX 37Х Control Block Registers — блок управляющих регистров ; ; 1 0 0 X x Не используется (шина данных в третьем состоянии) ; ; 1 0 1 0 x Не используется (шина данных в третьем состоянии) ; ;3F6 376 1 0 1 1 0 R: Alternate Status (AS) — альтернативный регистр состояния ;3F6 376 1 0 1 1 0 W: Device Control (DC) — регистр управления устройством ; ;3F7 377 1 0 1 1 1 R: Drive Address (DA) — регистр адреса (не используется)? ; ; ; ;1FX 17Х Command Block Registers — блок командных регистров ; ;1F0 170 0 1 0 0 0 R/W: Data (DR) — регистр данных ; ;1F1 171 0 1 0 0 1 R: Error (ER) — регистр ошибок ;1F1 171 0 1 0 0 1 W: Features (FR) — регистр свойств ; ;1F2 172 0 1 0 1 0 R/W: Sector Count (SC) — регистр счетчика секторов ; ;1F3 173 0 1 0 1 1 R/W: Sector Number (SN) — регистр номера сектора/LBA[7:0]? ; ;1F4 174 0 1 1 0 0 R/W: Cylinder Low (CL) — регистр младшего байта номера цилиндра LBA[15:8]? ; ;1F5 175 0 1 1 0 1 R/W: Cylinder High (CH) — регистр старшего байта номера цилиндра/LBA[23:16]? ; ;1F6 176 0 1 1 1 0 R/W: Device/Head (D/H) — регистр номера устройства и головки/LBA[27:24]? ; ;1F7 177 0 1 1 1 1 R: Status (SR) — регистр состояния ;1F7 177 0 1 1 1 1 W: Command (CR) — регистр команд .MACRO PATA BNAME, BADDR, BVEC, BPRI 'BNAME'BASE =: 'BADDR' P$CSR =: ^O<00> ; 000000 'BNAME'CSR =: 'BNAME'BASE+P$CSR ; adapter CSR AC.INT =: ^O<200> ; interrupt request AC.IE =: ^O<100> ; interrupt enable AC.DTM =: ^O< 40> ; dead time indicator AC.NDM =: ^O< 20> ; DMA co-adapter not installed AC.PC =: ^O< 10> ; Running on IBM PC Firmware-11/386 AC.MD1 =: ^O< 1> ; Use PIO mode 1 P$CSR2 =: ^O<14> ; 001100 'BNAME'CSR2 =: 'BNAME'BASE+P$CSR2 ; alt status (r) | device control (w/o) DC.STA =: ^O< 10> ; statically set bit DC.SRS =: ^O< 4> ; software reset DC.NIE =: ^O< 2> ; negative interrupt buffer enable ; 001110 drive address (r) ;----------------------------------------------- P$DBUF =: ^O<20> ; 010000 'BNAME'DBUF =: 'BNAME'BASE+P$DBUF ; data buffer i/o P$ERR =: ^O<22> ; 010010 P$FR =: ^O<22> ; 010010 'BNAME'ERR =: 'BNAME'BASE+P$ERR ; error register (r/o) Feature Register (w) ER.BBK =: ^O<200> ; bad block detected ER.UNC =: ^O<100> ; uncorrectable data error ER.MC =: ^O< 40> ; media changed ER.IDN =: ^O< 20> ; ID not found ER.MCR =: ^O< 10> ; media change requested ER.ABR =: ^O< 4> ; aborted command ER.TK0 =: ^O< 2> ; track 0 not found ER.AMN =: ^O< 1> ; address mark not found P$SCNT =: ^O<24> ; 010100 'BNAME'SCNT =: 'BNAME'BASE+P$SCNT ; sector count P$SNUM =: ^O<26> ; 010110 'BNAME'SNUM =: 'BNAME'BASE+P$SNUM ; sector number P$CYLL =: ^O<30> ; 011000 'BNAME'CYLL =: 'BNAME'BASE+P$CYLL ; cylinder low P$CYLH =: ^O<32> ; 011010 'BNAME'CYLH =: 'BNAME'BASE+P$CYLH ; cylinder high P$DH =: ^O<34> ; 011100 'BNAME'DH =: 'BNAME'BASE+P$DH ; drive/head DH.STA =: ^O<240> ; statically set bits DH.LBA =: ^O<100> ; address mode select (0=CHS,1=LBA) DH.DRV =: ^O< 20> ; drive select number DH.HS =: ^O< 17> ; head select DH.FIX =: DH.STA!DH.LBA ; fixed bits DH.PRM =: DH.FIX ; Primary device DH.SLV =: DH.FIX!DH.DRV ; Secondary device P$STAT =: ^O<36> ; 011110 'BNAME'STAT =: 'BNAME'BASE+P$STAT ; status CS.BSY =: ^O<200> ; busy CS.DRD =: ^O<100> ; drive ready CS.DWF =: ^O< 40> ; drive write fault CS.DSC =: ^O< 20> ; drive seek complete CS.DRQ =: ^O< 10> ; data request CS.COR =: ^O< 4> ; corrected data error CS.IDX =: ^O< 2> ; index pulse CS.ERR =: ^O< 1> ; error P$CMD =: ^O<36> ; 011110 'BNAME'CMD =: 'BNAME'BASE+P$CMD ; command CS.RD =: ^O< 41> ; read (w/o retry) CS.WT =: ^O< 61> ; write (w/o retry) CS.RVF =: ^O<101> ; read verify (w/o retry) CS.REC =: ^O< 20> ; recalibrate CS.RDM =: ^O<304> ; Read Multiply CS.WTM =: ^O<305> ; Write Multiply CS.SMM =: ^O<306> ; Set Multiply Mode CS.INF =: ^O<354> ; get info CS.DGN =: ^O<220> ; execute drive diagnostic CS.SF =: ^O<357> ; Set Features FR.STM =: ^O< 3> ; -> P$FR MD.PIO =: ^O< 10+000> ; -> P$SCNT FR.APM =: ^O< 5> ; -> P$FR (254) ; 17761024 <- 1? (? - PIO mode) ; 17761022 <- 3 ; 17761036 <- 357 ; #define ATA_CMD_READ_PIO 0x20 ; #define ATA_CMD_READ_PIO_EXT 0x24 ; #define ATA_CMD_READ_DMA 0xC8 ; #define ATA_CMD_READ_DMA_EXT 0x25 ; #define ATA_CMD_WRITE_PIO 0x30 ; #define ATA_CMD_WRITE_PIO_EXT 0x34 ; #define ATA_CMD_WRITE_DMA 0xCA ; #define ATA_CMD_WRITE_DMA_EXT 0x35 ; #define ATA_CMD_CACHE_FLUSH 0xE7 ; #define ATA_CMD_CACHE_FLUSH_EXT 0xEA ; #define ATA_CMD_PACKET 0xA0 ; #define ATA_CMD_IDENTIFY_PACKET 0xA1 ; #define ATA_CMD_IDENTIFY 0xEC 'BNAME'VEC =: 'BVEC' ; Interrupt vector 'BNAME'PRI =: 'BPRI' .ENDM PATA PATA WQ <^O<177120>> <^O<204>> <^O<5>> ; For WQ IDE and CF controller PATA WS <^O<177120>> <^O<204>> <^O<5>> ; For WQ IDE and CF controller PATA ZA <^O<161000>> <^O<350>> <^O<4>> ; For ZF CF controller PATA ZB <^O<161040>> <^O<354>> <^O<4>> ; For ZF CF controller PATA ZC <^O<161100>> <^O<360>> <^O<4>> ; For ZF CF controller PATA ZD <^O<161140>> <^O<364>> <^O<4>> ; For ZF CF controller PATA ZE <^O<161200>> <^O<370>> <^O<4>> ; For ZF CF controller PATA ZF <^O<161240>> <^O<374>> <^O<4>> ; For ZF CF controller MSVCSR =: ^O<172100> ; ?? CSTR =: ^O<177520> ; Control/Status Register PCR =: ^O<177520> ; Page Control Register CDR =: ^O<177524> ; Configuration and Display Register MSER =: ^O<177744> ; Memory system error register MS.PE =: ^O<100000> ; Parity error abort MS.PEH =: ^O< 200> ; Parity error high MS.PEL =: ^O< 100> ; Parity error low MS.PET =: ^O< 40> ; Parity error tag CCR =: ^O<177746> ; Cache Control Register CC.wTP =: ^O<2000> ; Write wrong parity CC.BP =: ^O<1000> ; Cache bypass CC.FL =: ^O< 400> ; Flush cache CC.EPA =: ^O< 200> ; Enable parity error abort CC.WWP =: ^O< 100> ; Write wrong parity CC.FM1 =: ^O< 10> ; Force miss bit 1 CC.FM0 =: ^O< 4> ; Force miss bit 0 CC.DM =: ^O< 2> ; Diagnostic mode CC.DPI =: ^O< 1> ; Disable cache parity interrupt CPUMR =: ^O<177750> ; Maintenance register CM.B15 =: ^O<100000> ; User Boot bit 15 Address CM.B14 =: ^O< 40000> ; User Boot bit 14 Address CM.B13 =: ^O< 20000> ; User Boot bit 13 Address CM.B12 =: ^O< 10000> ; User Boot bit 12 Address CM.FPA =: ^O< 400> ; Floating Point Accelerator present CM.ID3 =: ^O< 200> ; Module ID bit 3 CM.ID2 =: ^O< 100> ; Module ID bit 2 On J11 - 0001 CM.ID1 =: ^O< 40> ; Module ID bit 1 CM.ID0 =: ^O< 20> ; Module ID bit 0 CM.HLT =: ^O< 10> ; HALT enabling CM.PW1 =: ^O< 4> ; Power On bit 1 option 00 - PC from 24, PS from 26 01 - MicroODT, PS = 0 CM.PW0 =: ^O< 2> ; Power On bit 0 option 10 - PC = 173000, PS = 0 11 - PC = USer Boot + "0000", PS = 0 CM.POK =: ^O< 1> ; Power OK CHMR =: ^O<177752> ; Cache hit/miss register CPUERR =: ^O<177766> ; CPU Error Register CE.HLT =: ^O<200> ; Illegal HALT CE.ADR =: ^O<100> ; Address errkr CE.NXM =: ^O< 40> ; Non-Existing memory CE.IO =: ^O< 20> ; I/O bus timeout CE.YSP =: ^O< 10> ; Yellow stack violation CE.RSP =: ^O< 4> ; Red stack violation PIRQ =: ^O<177772> ; Program interrupt Request IR.PR7 =: ^O<100000> IR.PR6 =: ^O< 40000> IR.PR5 =: ^O< 20000> IR.PR4 =: ^O< 10000> IR.PR3 =: ^O< 4000> IR.PR2 =: ^O< 2000> IR.PR1 =: ^O< 1000> IR.PR0 =: ^O< 400>