Можно подробней?
Вариант Patrona справно выдаёт каталог диска )))
Если например команду пользователь будет вбивать, там длину легко поймать, только
вот как её в ассемблере класть-слать в 510, а самое главное в каком месте - тут я уже увы (((
Вид для печати
The .EXIT request enables a user program to pass command lines to KMON in the chain information area (locations 500-777) for execution after the job exits. This is performed under the following conditions:
- The word (not byte) location 510 must contain the total number of bytes of command lines to be passed to KMON.
- The command lines are stored, beginning at location 512. The lines must be .ASCIZ strings with no embedded carriage return or line feed. For example:
The user program must set SPXIT$ or CHNIF$ in the Job Status Word beforeКод:.TITLE EEXIT1.MAC
XIT.NU =: 510 ;(.XITDF) char count
XIT.AS =: 512 ;(.XITDF) .Asciz command(s)
.=XIT.NU
.WORD B-A
.=XIT.AS
A: .ASCIZ /COPY A.MAC B.MAC/
.ASCIZ /DELETE A.MAC/
B:
doing an .EXIT, which must be issued with R0 = 0.
Действительно, пишут, что ТАК НАДО! )))
первоисточник (откуда у меня эта шпора и кто её писал история умалчивает)
вариант патрона - рабочий (!)Код:командная строка из программы: !!!
.RADIX 8
MOV #ENDC-STARTC, R1 - вот та самая попытка положить длину???
MOV #STARTC, R1 - а вот эта строка тогда зачем ???
MOV #ENDC-STARTC, R2
MOV #512, R3 - остальное это надо уже систему знать
PUK: MOVB (R1)+, (R3)+
SOB R2, PUK
BIS #4000, @#44
CLR R0
EMT 350
STARTC: .ASCIZ "DIR/FU/VOL/BL DK:"
ENDC: .EVEN
Код:Рабочий вариант выглядит так:
Код:
;
.MCall .Exit
START:
Mov #CMD, R3
Mov #512, R1
1$:
MovB (R3)+,(R1)+
BNE 1$
Sub #512, R1
Mov R1, @#510
BiS #4000, @#44
Clr R0
.Exit
CMD: .ASCIZ \$Dir/Fu/Bl/Vol\
.End START
Легко заметить, что в рабочем варианте в ячейку 510 заносится длина строки.
В нерабочем варианте нужно строку
заменить наКод:MOV #ENDC-STARTC, R1
Код:MOV #ENDC-STARTC, @#510
---------- Post added at 16:00 ---------- Previous post was at 15:33 ----------
Продвинутый вариант - выполняет введённую с клавиатуры команду и снова запускает сам себя ( файл CMD2.MAC ):
Код:;
.MCall .Exit, .TTYIN, .Print
START:
.Print #Prompt
Mov #512, R1
1$:
.TTYIN
CmpB R0, #15
BEq 2$
CmpB R0, #40
BLt 1$
CmpB R0, #177
BEq 1$
MovB R0, (R1)+
Br 1$
2$:
Cmp R1, #512
BNE 3$
.Print #Help
Br START
3$:
ClrB (R1)+
Mov #CMD, R3
MovB (R3)+,(R1)+
BNE .-2.
Sub #512, R1
Mov R1, @#510
.Print #CrLf
BiS #4000, @#44
Clr R0
.Exit
;===========================================================
Prompt: .ASCII <015><012><016>\Введите команду >\<017><200>
Help: .ASCII <015><012><016>\Исполнитель команд \<017>\v1.0\
CrLf: .Byte 0
CMD: .ASCIZ \$RU CMD2\
.End START
;
Вариант с .GTLIN ( файл CMD3.MAC )
Код:;
.MCall .Exit, .GtLin, .Print
START:
.Print #CrLf
Mov #512, R1
Mov #CmdBuf, R3
.GtLin R3, #Prompt
TstB (R3)
BNE 1$
.Print #Help
Br START
1$:
MovB (R3)+,(R1)+
BNE .-2.
Mov #CMD, R3
MovB (R3)+,(R1)+
BNE .-2.
Sub #512, R1
Mov R1, @#510
.Print #CrLf
BiS #4000, @#44
Clr R0
.Exit
;===========================================================
Prompt: .ASCII <015><016>\Введите команду >\<017><200>
Help: .ASCII <015><012><016>\Исполнитель команд \<017>\v2.0\
CrLf: .Byte 0
CMD: .ASCIZ \$RU CMD3\
CmdBuf:
.End START
;