mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 09:24:19 +00:00
735 lines
10 KiB
NASM
735 lines
10 KiB
NASM
title 'MP/M II V2.0 Terminal Message Processor & Submit'
|
||
name 'tmpsub'
|
||
dseg
|
||
@@tmpsub:
|
||
public @@tmpsub
|
||
cseg
|
||
;tmp:
|
||
@tmpsub:
|
||
public @tmpsub
|
||
;do;
|
||
|
||
;$include (copyrt.lit)
|
||
;/*
|
||
; Copyright (C) 1979,1980,1981
|
||
; Digital Research
|
||
; P.O. Box 579
|
||
; Pacific Grove, CA 93950
|
||
;
|
||
; Revised:
|
||
; 14 Sept 81 by Thomas Rolander
|
||
;*/
|
||
;$include (common.lit)
|
||
;$nolist
|
||
;$include (proces.lit)
|
||
;$nolist
|
||
;$include (queue.lit)
|
||
;$nolist
|
||
;$include (xdos.lit)
|
||
;$nolist
|
||
;$include (fcb.lit)
|
||
;$nolist
|
||
;$include (xdos.ext)
|
||
;$nolist
|
||
;$include (bdos.ext)
|
||
;$nolist
|
||
;$include (datapg.ext)
|
||
;$nolist
|
||
|
||
; xbdos:
|
||
; extrn xbdos
|
||
; procedure (func,info) address external;
|
||
; declare func byte;
|
||
; declare info address;
|
||
; end xbdos;
|
||
|
||
sysdatadr:
|
||
dw $-$
|
||
|
||
tmp$entry$point:
|
||
jmp tmp
|
||
|
||
bdos:
|
||
xdos:
|
||
lhld bdosadr
|
||
pchl
|
||
|
||
co:
|
||
mvi c,2
|
||
jmp bdos
|
||
|
||
dseg
|
||
;/*
|
||
; TMP Data Segment
|
||
;*/
|
||
|
||
bdosadr:
|
||
ds 2
|
||
|
||
; declare rlradr address;
|
||
rlradr:
|
||
ds 2
|
||
|
||
; declare rlrpd based rlr process$descriptor;
|
||
|
||
|
||
; declare subflgadr address;
|
||
subflgtbladr:
|
||
ds 2
|
||
; declare subflg based subflgadr (1) byte;
|
||
|
||
cseg
|
||
; declare cli$name (8) byte data ('c'+80h,'li ');
|
||
cliname:
|
||
db 'c'+80h,'li '
|
||
|
||
; declare submit$fcb (16) byte data (1,'$$$ SUB',
|
||
; 0,0,0,0);
|
||
submitfcb:
|
||
db $-$
|
||
db '$$$ SUB'
|
||
db 0,0,0,0
|
||
|
||
dskerr:
|
||
db 'Disk error during submit file read.'
|
||
db 0dh,0ah
|
||
db '$'
|
||
|
||
startup:
|
||
db 0dh,0ah
|
||
db 'Start up command: '
|
||
db '$'
|
||
|
||
;/*
|
||
; tmp:
|
||
;*/
|
||
|
||
; tmp:
|
||
tmp:
|
||
lhld sysdatadr
|
||
mvi l,245
|
||
mov e,m
|
||
inx h
|
||
mov d,m
|
||
xchg
|
||
shld bdosadr
|
||
LXI H,0FF49H
|
||
DAD SP
|
||
SPHL
|
||
; procedure reentrant public;
|
||
; declare buf(129) byte;
|
||
; declare fcb fcb$descriptor;
|
||
; declare submit$user byte;
|
||
; declare console byte;
|
||
; declare tmp$user byte;
|
||
; declare ret byte;
|
||
; declare CLIQ (2) address;
|
||
; declare pname (10) byte;
|
||
|
||
lhld sysdatadr
|
||
push h
|
||
lxi d,252
|
||
dad d
|
||
mov e,m
|
||
inx h
|
||
mov d,m
|
||
lxi h,5
|
||
dad d
|
||
shld rlradr
|
||
mov e,m
|
||
inx h
|
||
mov d,m
|
||
; console = rlrpd.console;
|
||
LXI h,0EH
|
||
DAD d
|
||
MOV A,M
|
||
pop d
|
||
LXI H,0A6H ; CONSOLE
|
||
DAD SP
|
||
MOV M,A
|
||
; subflgadr = xdos (system$data$adr,0) + 128;
|
||
lxi h,123 ;offset to system file drive
|
||
dad d
|
||
mov a,m
|
||
sta submitfcb
|
||
LXI h,80H
|
||
DAD D
|
||
SHLD SUBFLGTBLADR
|
||
; subflg(console) = false;
|
||
call subflgadr
|
||
MVI M,0H
|
||
; submit$flag = false;
|
||
call lclsubflgadr
|
||
xra a
|
||
mov m,a
|
||
dcx h
|
||
mov m,a
|
||
; pname(0) = console;
|
||
LXI H,0A6H ; CONSOLE
|
||
DAD SP
|
||
MOV A,M
|
||
LXI H,0ADH ; PNAME
|
||
DAD SP
|
||
MOV M,A
|
||
; call move (8,.cli$name,.pname(1));
|
||
INX H
|
||
XCHG
|
||
LXI B,CLINAME
|
||
MVI L,8H
|
||
LDAX B
|
||
STAX D
|
||
INX B
|
||
INX D
|
||
DCR L
|
||
JNZ $-5H
|
||
; pname(9) = 0;
|
||
XCHG
|
||
MOV M,E
|
||
; call set$dma (.buf(1));
|
||
LXI H,1H ; BUF+1H
|
||
DAD SP
|
||
xchg
|
||
|
||
;
|
||
; Temporarily swap stack pointers to avoid TMP process
|
||
; descriptor destruction.
|
||
;
|
||
; lxi h,00a2h
|
||
; dad sp
|
||
; sphl
|
||
|
||
mvi c,26
|
||
call bdos
|
||
; ret = xdos (attach,0);
|
||
MVI C,92H
|
||
CALL XDOS
|
||
; call print$b (.ver);
|
||
lhld sysdatadr
|
||
mvi l,11 ;offset to xdos base
|
||
mov d,m
|
||
mvi e,063h ;offset from base of ver module
|
||
mvi c,9
|
||
call bdos
|
||
|
||
; call move (16,.submit$fcb,.fcb.et);
|
||
LXI H,81H ; FCB
|
||
DAD SP
|
||
XCHG
|
||
LXI B,SUBMITFCB
|
||
MVI L,10H
|
||
LDAX B
|
||
STAX D
|
||
INX B
|
||
INX D
|
||
DCR L
|
||
JNZ $-5H
|
||
; fcb.fn(1) = console + '0';
|
||
MVI A,30H
|
||
LXI H,0A6H ; CONSOLE
|
||
DAD SP
|
||
ADD M
|
||
LXI H,83H ; FCB+2H
|
||
DAD SP
|
||
MOV M,A
|
||
lxi d,11-2
|
||
dad d
|
||
mvi m,'P'
|
||
; if open (.fcb) <> 0ffh then
|
||
LXI H,81H ; FCB
|
||
DAD SP
|
||
xchg
|
||
mvi c,15
|
||
call bdos
|
||
INR A
|
||
jz @2
|
||
lxi h,81h
|
||
dad sp
|
||
xchg
|
||
lxi h,32
|
||
dad d
|
||
mvi m,0 ;fcb.cr = 0;
|
||
mvi c,20
|
||
call bdos
|
||
inr a
|
||
push psw
|
||
lxi h,81h+2
|
||
dad sp
|
||
xchg
|
||
mvi c,16
|
||
call bdos
|
||
pop psw
|
||
jz @2
|
||
lxi h,1h
|
||
dad sp
|
||
mvi b,-1
|
||
@2a:
|
||
inr b
|
||
mov a,m
|
||
cpi 0dh
|
||
inx h
|
||
jnz @2a
|
||
mvi m,0
|
||
mov c,b
|
||
inr c
|
||
@2b:
|
||
dcr c
|
||
jz @2c
|
||
dcx h
|
||
dcx h
|
||
mov a,m
|
||
inx h
|
||
mov m,a
|
||
jmp @2b
|
||
@2c:
|
||
dcx h
|
||
mov m,b
|
||
mvi c,9
|
||
lxi d,startup
|
||
call bdos
|
||
jmp @7c
|
||
@2:
|
||
; ret = xdos (detach,0);
|
||
MVI C,93H
|
||
CALL XDOS
|
||
|
||
; lxi h,-00a2h
|
||
; dad sp
|
||
; sphl
|
||
|
||
; do forever;
|
||
@17:
|
||
; ret = xdos (attach,0);
|
||
MVI C,92H
|
||
CALL XDOS
|
||
; call crlf;
|
||
mvi e,0dh
|
||
call co
|
||
mvi e,0ah
|
||
call co
|
||
; i = rlrpd.disk$slct and 0fh;
|
||
LHLD rlradr
|
||
mov c,m
|
||
inx h
|
||
mov b,m
|
||
lxi h,16h
|
||
DAD B
|
||
MOV A,M
|
||
PUSH PSW
|
||
ANI 0FH
|
||
; if (i:=i-10) < 15 then
|
||
SUI 10
|
||
JC @TMP0
|
||
; call co ('1');
|
||
PUSH PSW
|
||
MVI e,'1'
|
||
call co
|
||
POP PSW
|
||
SUI 10
|
||
; call co (i + 10 + '0');
|
||
@TMP0:
|
||
ADI 10+'0'
|
||
mov e,a
|
||
call co
|
||
; call co (shr(rlrpd.disk$slct,4) + 'A');
|
||
POP PSW
|
||
ANI 0f8h
|
||
RAR
|
||
RAR
|
||
RAR
|
||
RAR
|
||
ADI 41H
|
||
mov e,a
|
||
call co
|
||
; call co ('>');
|
||
MVI e,3EH
|
||
call co
|
||
; buf(0) = 100;
|
||
LXI H,0H ; BUF
|
||
DAD SP
|
||
MVI M,100
|
||
; if not submit$flag then
|
||
call lclsubflgadr
|
||
jnz @1
|
||
; do;
|
||
; if subflg(console) then
|
||
call subflgadr
|
||
jz @6
|
||
; do;
|
||
; call move (16,.submit$fcb,.fcb.et);
|
||
lhld sysdatadr
|
||
lxi d,196 ;offset to temp file drive
|
||
dad d
|
||
mov a,m
|
||
LXI H,81H ; FCB
|
||
DAD SP
|
||
XCHG
|
||
LXI B,SUBMITFCB
|
||
stax b ;set drive to current temp file drive
|
||
MVI L,10H
|
||
LDAX B
|
||
STAX D
|
||
INX B
|
||
INX D
|
||
DCR L
|
||
JNZ $-5H
|
||
; fcb.fn(1) = console + '0';
|
||
MVI A,30H
|
||
LXI H,0A6H ; CONSOLE
|
||
DAD SP
|
||
ADD M
|
||
LXI H,83H ; FCB+2H
|
||
DAD SP
|
||
MOV M,A
|
||
; if open (.fcb) <> 0ffh then
|
||
LXI H,81H ; FCB
|
||
DAD SP
|
||
xchg
|
||
mvi c,15
|
||
call bdos
|
||
INR A
|
||
jnz @3
|
||
; subflg(console) = false;
|
||
call subflgadr
|
||
mvi m,0
|
||
jmp @6
|
||
; do;
|
||
; submit$flag = true;
|
||
@3:
|
||
lxi h,0081h
|
||
dad sp
|
||
xchg
|
||
mvi c,35
|
||
call bdos ;compute file size
|
||
mvi c,32
|
||
mvi e,0ffh
|
||
call bdos ;get user number
|
||
lxi h,00a5h
|
||
dad sp
|
||
mov m,a
|
||
; end;
|
||
; end;
|
||
; end;
|
||
@1:
|
||
; if submit$flag and subflg(console) then
|
||
call subflgadr
|
||
jz @10a
|
||
; do;
|
||
; use buffer area as temporary stack
|
||
; lxi h,0081h
|
||
; dad sp
|
||
; sphl
|
||
; if bdos (11,0) then
|
||
MVI C,0BH
|
||
call bdos
|
||
RAR
|
||
JNC @5
|
||
; do;
|
||
; ret = ci;
|
||
mvi c,1
|
||
call bdos
|
||
; call bdos (19,.fcb);
|
||
; submit$flag = false;
|
||
; end;
|
||
; lxi h,-0081h
|
||
; dad sp
|
||
; sphl
|
||
JMP @10A
|
||
@5:
|
||
; lxi h,-0081h
|
||
; dad sp
|
||
; sphl
|
||
; else
|
||
; do;
|
||
; fcb.nr = fcb.rc - 1;
|
||
call lclsubflgadr
|
||
mov d,m
|
||
dcx h
|
||
mov e,m
|
||
dcx d
|
||
mov m,e
|
||
inx h
|
||
mov m,d
|
||
; if readbf (.fcb) = 0ffh then
|
||
call submituser
|
||
LXI H,81H ; FCB
|
||
DAD SP
|
||
xchg
|
||
mvi c,33
|
||
call bdos
|
||
INR A
|
||
JNZ @7
|
||
call tmpuser
|
||
; do;
|
||
; call bdos (19,.fcb); /* delete file */
|
||
; submit$flag = false;
|
||
; call print$b (.(
|
||
LXI d,dskerr
|
||
mvi c,9
|
||
call bdos
|
||
; 'Disk error during submit file read.','$'));
|
||
; call crlf;
|
||
; end;
|
||
JMP @10a
|
||
@7:
|
||
call tmpuser
|
||
call lclsubflgadr
|
||
mov d,m
|
||
dcx h
|
||
mov e,m
|
||
inx d
|
||
mov m,e
|
||
inx h
|
||
mov m,d
|
||
; else
|
||
; do;
|
||
; i = 2;
|
||
@7c:
|
||
LXI H,2H ; BUF+2H
|
||
DAD SP
|
||
; do while buf(i) <> 0;
|
||
@7A:
|
||
mov a,m
|
||
ora a
|
||
jz @7B
|
||
mov e,a
|
||
; call co (.buf(i));
|
||
push h
|
||
call co
|
||
pop h
|
||
; i = i + 1;
|
||
inx h
|
||
; end;
|
||
jmp @7A
|
||
; call co (0dh);
|
||
@7B:
|
||
mvi e,0dh
|
||
call co
|
||
JMP @9
|
||
; end;
|
||
; end;
|
||
; end;
|
||
; if not submit$flag then
|
||
; do;
|
||
@6:
|
||
; call read$bu (.buf);
|
||
LXI H,0H ; BUF
|
||
DAD SP
|
||
mvi m,80h
|
||
xchg
|
||
;
|
||
; The following stack swap is done to prevent destruction
|
||
; of the TMP process descriptor by the stack. The stack used
|
||
; during read$bu overlays the TMP fcb and the end of the
|
||
; line buffer. Note that the line buffer length is reduced
|
||
; from 128 to 100 bytes.
|
||
;
|
||
; lxi h,00a2h
|
||
; dad sp
|
||
; sphl
|
||
mvi c,10
|
||
call bdos
|
||
; lxi h,-00a2h
|
||
; dad sp
|
||
; sphl
|
||
|
||
; end;
|
||
@9:
|
||
; if (buf(1) <> 0) and
|
||
LXI H,1H ; BUF+1H
|
||
DAD SP
|
||
MOV A,M
|
||
ORA A
|
||
JZ @10
|
||
MOV B,A
|
||
INX H
|
||
MOV A,M
|
||
CPI ';'
|
||
JZ @10
|
||
MOV C,A
|
||
; (buf(2) <> ';') then
|
||
; do;
|
||
; if (buf(1) = 2) and (buf(3) = ':') then
|
||
MOV A,B
|
||
CPI 2
|
||
JNZ @11
|
||
INX H
|
||
MOV A,M
|
||
CPI ':'
|
||
JNZ @11
|
||
; do;
|
||
; i = (buf(2) and 101$1111b) - 'A';
|
||
MVI A,5FH
|
||
ANA C
|
||
SUI 'A'
|
||
; if i < 16
|
||
CPI 10H
|
||
JNC @13
|
||
; then call bdos (14,i);
|
||
MOV E,A
|
||
MVI C,0EH
|
||
call bdos
|
||
; end;
|
||
JMP @13
|
||
@11:
|
||
; else
|
||
; do;
|
||
; buf(buf(1)+2) = 0;
|
||
LXI H,1H ; BUF+1H
|
||
DAD SP
|
||
MOV C,M
|
||
MVI B,0
|
||
LXI H,2H ; BUF+2H
|
||
DAD SP
|
||
DAD B
|
||
MVI M,0H
|
||
; call co (0ah);
|
||
MVI e,0AH
|
||
call co
|
||
; buf(0) = rlrpd.disk$slct;
|
||
LHLD rlradr
|
||
mov c,m
|
||
inx h
|
||
mov b,m
|
||
lxi h,16h
|
||
DAD B
|
||
MOV A,M
|
||
LXI H,0H ; BUF
|
||
DAD SP
|
||
MOV M,A
|
||
; buf(1) = rlrpd.console;
|
||
XCHG
|
||
lhld rlradr
|
||
mov c,m
|
||
inx h
|
||
mov b,m
|
||
lxi h,0eh
|
||
dad b
|
||
mov a,m
|
||
INX D
|
||
STAX D
|
||
; ret = assign (.pname);
|
||
LXI H,0ADH ; PNAME
|
||
DAD SP
|
||
MOV d,H
|
||
MOV e,L
|
||
mvi c,149
|
||
call xdos
|
||
; ret = xdos (send$cli$command,.CLIQ);
|
||
LXI H,0 ; buf
|
||
DAD SP
|
||
XCHG
|
||
MVI C,150
|
||
CALL XDOS
|
||
; end;
|
||
@13:
|
||
; end;
|
||
@10:
|
||
; if submit$flag then
|
||
call lclsubflgadr
|
||
jz @17
|
||
; do;
|
||
; if fcb.nr = 1 then
|
||
mov d,m
|
||
dcx h
|
||
mov e,m
|
||
dcx d
|
||
mov m,e
|
||
inx h
|
||
mov m,d
|
||
mov a,d
|
||
ora e
|
||
jnz @17
|
||
@10A:
|
||
; do;
|
||
; call mon1 (19,.fcb); /* delete file */
|
||
; submit$flag = false;
|
||
; call close (.fcb);
|
||
call submituser
|
||
LXI H,81H ; FCB
|
||
DAD SP
|
||
xchg
|
||
mvi c,16
|
||
call bdos
|
||
; call mon1 (19,.fcb); /* delete file */
|
||
LXI H,81H ; FCB
|
||
DAD SP
|
||
XCHG
|
||
MVI C,13H
|
||
call bdos
|
||
call tmpuser
|
||
; submit$flag = false;
|
||
call lclsubflgadr
|
||
xra a
|
||
mov m,a
|
||
dcx h
|
||
mov m,a
|
||
call subflgadr
|
||
mvi m,0
|
||
; /* free drive */
|
||
; call bdos (39,0ffffh);
|
||
mvi c,39
|
||
lxi d,0ffffh
|
||
call bdos
|
||
; end;
|
||
JMP @17
|
||
; else
|
||
; do;
|
||
; fcb.rc = fcb.rc - 1;
|
||
; call close (.fcb);
|
||
; end;
|
||
; end;
|
||
; end;
|
||
; end tmp;
|
||
;end tmp;
|
||
|
||
subflgadr:
|
||
; ret = .subflg(console);
|
||
lxi h,0a6h+2 ; console
|
||
dad sp
|
||
mov c,m
|
||
mvi b,0
|
||
lhld subflgtbladr
|
||
dad b
|
||
mov a,m
|
||
ora a
|
||
ret ;HL = .subflg(console), B = 0
|
||
|
||
lclsubflgadr:
|
||
; ret = submit$flag;
|
||
lxi h,081h+33+2 ; submitflag
|
||
dad sp
|
||
mov a,m
|
||
inx h
|
||
ora m
|
||
ret ;HL = submitflag
|
||
|
||
submituser:
|
||
;
|
||
mvi c,32
|
||
mvi e,0ffh
|
||
call bdos
|
||
lxi h,00a5h+2
|
||
dad sp
|
||
mov e,m
|
||
inx h
|
||
inx h
|
||
mov m,a
|
||
mvi c,32
|
||
jmp bdos
|
||
|
||
tmpuser:
|
||
;
|
||
lxi h,00a7h+2
|
||
dad sp
|
||
mov e,m
|
||
mvi c,32
|
||
jmp bdos
|
||
|
||
patch:
|
||
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||
|
||
END
|
||
|