Цитата:
TPARK.MAC
.TITLE PARK2016.MAC
.MCALL .PRINT, .EXIT, .MTPS, .TRPSET ;используемые вызовы библиотеки
$JSX =: 4 ;EXTENDED JOB STATUS WORD
NOVBG$ =: 100 ;DISABLE VBGEXE BIT
$JSW =: 44 ;JOB STATUS WORD
TTSPC$ =: 10000 ;SPECIAL MODE TERMINAL BIT
TCBIT$ =: 100 ;INHIBIT TERMINAL WAIT BIT
$SYPTR =: 54 ;POINTER TO RMON
$CNFG1 =: 300 ;SYSTEM CONFIG WORD
FJOB$ =: 200 ;FOREGROUND LOADED BIT
$SYSGE =: 372 ;SYSGEN FEATURE WORD
RTEM$ =: 10 ;RTEM-11 SYSTEM
.ASECT
.=$JSX
.WORD NOVBG$ ;DISABLE VBGEXE
.=$JSW
.WORD TTSPC$!TCBIT$ ;SET TERMINAL MODE
.=034
.WORD TRAPZEROHANDLER ;адрес нового обработчика
.WORD 340 ;уровень привилегий 7
.PSECT
STARTF:
MOV @#$SYPTR,R0 ;R0 -> RMON
BIT #RTEM$,$SYSGE(R0) ;RTEM-11?
BNE 1$ ;YES, EXIT
TSTB $CNFG1(R0) ;FOREGROUND LOADED?
BPL 5$ ;IF PL NO, OK
.PRINT #FLOAD ;FOREGROUND LOADED ERROR
1$: .EXIT ;EXIT
5$: .TRPSET #AREA, #CNTRLRNOTFOUND ; переназначить 4 и 10 вектора на наш
обработчик на случай отсутствия регистра 174000 на шине
CMP @#174000, #401 ;сравнить содержимое регистра идентификации 174000 с
кодом 401(восьмеричное)
BNE CNTRLRNOTFOUND ;контроллер не обнаружен, выходим
10$: BIT #100000, @#174020 ;проверка занятости
BEQ 10$ ;занят, ждем
BIS #8., @#174020 ;начальная установка с выводом головок на нулевой трек
20$: BIT #100000, @#174020
BEQ 20$ ;занят, ждем
30$: BIT #1, @#174020
BNE 30$ ;ждем, пока операция не будет завершена
MOV LANDZONE, @#174012 ;поместить в регистр адреса цилиндра 174012
номер цилиндра для парковки
MOV #7, @#174006 ;сектор 7 (любой до 16)
MOV #0, @#174014 ;поверхность 0 (любая из доступных, 0 и 1 точно есть у
каждого диска)
MOV #40, @#174016 ;команда чтения сектора
.PRINT #SHUTDOWNMSG ;сообщение об отключении питания
INC @#PASSWORD ;введем пароль на разрешение останова
TRAP 0 ;трапнем для перехода в режим ядра и исполнения HALT
CNTRLRNOTFOUND:
.PRINT #NOTFOUNDMSG ;сообщение об отсутствии контроллера на шине
.EXIT
TRAPZEROHANDLER: ;обработчик трапа 0 и всех других номеров трапов - прерывание
перехвачено
BIT #1, @#PASSWORD ;вызов из нашей программы?
BNE 100$ ;нет, выходим
HALT ;останов машины
100$: RTI
FLOAD: ASCIZ /FOREGROUND TASK LOADED, DO NOT OFF THE POWER/
NOTFOUNDMSG: .ASCIZ /MFM CONTROLLER NOT FOUND/
SHUTDOWNMSG: .ASCIZ /TURN THE POWER OFF/
LANDZONE: .WORD 1230 ;664 цилиндр у моего HDD парковочный, на
других хдд он другой
AREA: .WORD 0, 0 ; или AREA: .BLKW 2 - параметры для EMT трапсета
PASSWORD: .WORD 0 ;для проверки права на останов
.END STARTF
Будет ли работать такой Франкенштейн?