; Disassembly of DISPLAY.COM
;
; Version list - most recent version first
;
;26/Jul/82 Included conditional assembly for Keith Petersens patch that
; will not accept wild-cards, distribution-tagged files, SYS files,
; and files with '#' as the last character of the file type.
; Compatible with CP/M 1.4 or 2.x. Added on line command help
; display if "?" entered in response to command prompt. Bill Bolton
;
WBOOT EQU 00000H
BDOS EQU 00005H
FCB EQU 05CH ;CP/M file control block
OPEN EQU 15
;
ALF EQU 0AH
ACR EQU 0DH
EOF EQU 01AH
;
VERS EQU 11
;
FALSE EQU 0
TRUE EQU NOT FALSE
;
RCPM EQU TRUE ;True for RCPM restricted version
;
ORG 100H
;
JMP START
;
DB 'Display Ver. '
DB VERS/10 + '0','.',VERS MOD 10 + '0'
DB ', 24/Jul/1982$'
;
;Check for ambiguous file names
;
START:
if rcpm
LXI H,FCB ;POINT TO FCB
MVI B,11 ;NO. OF CHARS TO CHECK
;
LOOP:
INX H ;POINT TO NEXT CHAR
MOV A,M ;GET CHAR
CPI '?' ;WAS IT A '?'
JZ WERROR ;YES, EXIT WITH ERROR MSG
DCR B ;ONE LESS TO CHECK
JNZ LOOP ;NOT DONE, GO GET MORE
;
;Check for private file type
;
CPI '#' ;WAS LAST CHARACTER A '#' ?
JZ OPENOT ;YES, PRINT ERROR AND EXIT
;
;Check for .COM file, which can't be printed
;
CPI 'M' ;WAS LAST CHAR AN 'M'?
JNZ OBJCHK ;IF NOT, CHK FOR '.OBJ' TYPE
DCX H
MOV A,M ;CHK NEXT
CPI 'O' ;AN 'O'?
JNZ OPENFIL ;IF NOT, GO OPEN FILE
DCX H
MOV A,M ;WAS 'O', CHK NEXT CHAR
CPI 'C' ; 'C' AS IN '.COM'?
JNZ OPENFIL ;IF NOT, GO OPEN FILE
CALL ERXIT ;EXIT W/MESSAGE
DB '++CAN''T DISPLAY .COM FILES$'
;
;Check for .OBJ file, which can't be printed
;
OBJCHK:
CPI 'J' ;WAS LAST CHAR AN 'J' THEN?
JNZ ALLCHK ;IF NOT, CHECK FOR '.ALL' TYPE
DCX H
MOV A,M ;MIGHT BE '.OBJ', CHK NEXT CHR
CPI 'B' ;IS IT A 'B'?
JNZ OPENFIL ;IF NOT, GO OPEN FILE
DCX H
MOV A,M ;WAS, CHK FIRST CHAR
CPI 'O' ; 'O' AS IN '.OBJ'?
JNZ OPENFIL ;IF NOT, GO OPEN FILE
CALL ERXIT ;EXIT W/MESSAGE
DB '++CAN''T DISPLAY .OBJ FILES$'
;
;Check for .ALL file, which can always be displayed
;
ALLCHK:
CPI 'L' ;WAS LAST CHAR AN 'L'?
JNZ OPENFIL ;IF NOT, TRY AN OPEN
DCX H
MOV A,M ;CHK NEXT
CPI 'L' ;AN 'L'?
JNZ OPENFIL ;IF NOT, GO OPEN FILE
DCX H
MOV A,M ;WAS 'L', CHK NEXT CHAR
CPI 'A' ; 'A' AS IN '.ALL'?
JNZ OPENFIL ;IF NOT, GO OPEN FILE
STA ALLFLAG
;
;Open the file to get attributes into FCB
;
OPENFIL:
LXI D,FCB ;POINT TO FILE
MVI C,OPEN ;GET FUNCTION
CALL BDOS ;OPEN IT
INR A ;OPEN OK?
JZ ENTRY ;..NO, LET DISPLAY GIVE ERROR MSG
;
;Check for SYS file
;
LDA FCB+10 ;GET SYS ATTRIBUTE
ANI 80H ;ISOLATE ATTR BIT
JNZ OPENOT ;IT'S SYS, EXIT
;
;Check for distribution-protected (tagged) file
;
LDA FCB+2 ;FIRST CHAR OF FILE NAME
ANI 80H ;CHECK BIT 7
JZ ENTRY ;IT WAS OFF, EXIT TO DISPLAY
LDA ALLFLAG
ORA A ;IS AN '.ALL' FILE
JNZ ENTRY ;DISPLAY '.ALL' FILES EVEN IF TAGGED
;
OPENOT:
CALL ERXIT ;EXIT W/MESSAGE
DB '++FILE IS NOT FOR DISTRIBUTION, SORRY$'
;
WERROR:
CALL ERXIT
DB '++CAN''T USE WILD CARDS$'
;
;
;Exit with error message
;
ERXIT:
POP D ;GET MSG ADRS
MVI C,9
JMP BDOS ;PRINT IT THEN RETURN TO CCP
;
endif ;rcpm
;
ENTRY:
LXI SP,BUF$START ;Set up a stack (pointing to top)
MVI L,021H
LXI D,DFCB
LXI B,FCB
FCBLOOP:
LDAX B
STAX D
INX B
INX D
DCR L
JNZ FCBLOOP
A0134:
CALL INIT ;Set up data areas
LXI B,DFCB
CALL OPEN$FILE
LDA BDOS$VAL
CPI 0FFH ;Succesful open?
JNZ A014E ;Yes
LXI B,NOT$FOUND$MSG ;No
CALL DISP$STRING ;Tell the user
CALL TO$WBOOT ;*** PERMANENT EXIT ***
;
A014E:
LHLD D077A
MOV B,H
MOV C,L
CALL A0387
CALL A0567
A0159:
CALL A06C3
LDA D0774
CPI ACR
JNZ A016D
CALL A0567
JMP A0159
;
; >> NO EXECUTION PATH TO HERE <<
JMP A0185
;
A016D:
MVI C,'B'
CALL A06EF
RAR
JNC A0179
JMP A0134
;
A0179:
MVI C,'E'
CALL A06EF
RAR
JNC QUERY
CALL TO$WBOOT ;*** PERMANENT EXIT ***
;
QUERY:
MVI C,'?'
CALL A06EF
RAR
JNC A0185
LXI B,HELP$MSG
CALL DISP$STRING
JMP A0159
;
A0185:
LXI H,D0777
MVI M,0
LXI H,1
SHLD D0784
LDA D0774
CPI '-'
JNZ A01A0
LXI H,D0777
MVI M,1
CALL A069F
A01A0:
LDA D0774
SUI '0'
STA D0778
MOV C,A
MVI A,9
CMP C
JC A01E7
LHLD D0778
MVI H,0
SHLD D0784
CALL A069F
A01BA:
LDA D0774
SUI '0'
STA D0778
MOV C,A
MVI A,9
CMP C
JC A01E7
LHLD D0784
DAD H
DAD H
DAD H
PUSH H
LHLD D0784
DAD H
POP B
DAD B
PUSH H
LHLD D0778
MVI H,0
POP B
DAD B
SHLD D0784
CALL A069F
JMP A01BA
;
A01E7:
LDA D0774
CPI 'L'
JNZ A01FD
LHLD D0777
MOV C,L
LHLD D0784
XCHG
CALL A0450
JMP A024D
;
A01FD:
LDA D0774
CPI 'P'
JNZ A0237
MVI A,0
LXI D,D0784
CALL A0750
ORA L
JZ A022B
LXI D,017H
LHLD D0784
CALL A072F
SHLD D0784
LHLD D0777
MOV C,L
LHLD D0784
XCHG
CALL A0450
JMP A0234
;
A022B:
LHLD D077A
SHLD D077E
SHLD D0786
A0234:
JMP A024D
;
A0237:
LDA D0774
CPI 'D'
JNZ A024A
LHLD D0784
MOV B,H
MOV C,L
CALL A0595
JMP A024D
;
A024A:
JMP A0253
;
A024D:
CALL A0567
JMP A0159
;
A0253:
LXI B,ILLEGAL$MSG
CALL DISP$STRING
JMP A0159
;
; >> NO EXECUTION PATH TO HERE <<
EI
HLT
LXI D,0
MVI C,1 ;Console input
CALL TO$BDOS
RET
;
PUT$CHAR:
LXI H,D075C
MOV M,C
LHLD D075C
MVI H,0
XCHG ;E <---- C
MVI C,2 ;Console output
CALL TO$BDOS
RET
;
; >> NO EXECUTION PATH TO HERE <<
LXI H,D075D
MOV M,C
LHLD D075D
MVI H,0
XCHG
MVI C,5 ;List output
CALL TO$BDOS
RET
;
A0287:
LXI H,T075F
MOV M,B
DCX H
MOV M,C
LHLD D075E
XCHG
MVI C,10 ;Read console buffer
CALL TO$BDOS
RET
;
OPEN$FILE:
LXI H,T0761
MOV M,B
DCX H
MOV M,C
LHLD D0760
XCHG ;DE <---- BC
MVI C,15 ;Open file
CALL TO$BDOS
STA BDOS$VAL ;Keep the result
RET
;
; >> NO EXECUTION PATH TO HERE <<
LXI H,T0763
MOV M,B
DCX H
MOV M,C
LHLD D0762
XCHG
MVI C,16 ;Close file
CALL TO$BDOS
STA BDOS$VAL
RET
;
; >> NO EXECUTION PATH TO HERE <<
LXI H,T0765
MOV M,B
DCX H
MOV M,C
LHLD D0764
XCHG
MVI C,17 ;Search first
CALL TO$BDOS
SUI 0FFH
ADI 0FFH
SBB A
RET
;
; >> NO EXECUTION PATH TO HERE <<
LXI H,T0767
MOV M,B
DCX H
MOV M,C
LHLD D0766
XCHG
MVI C,19 ;Delete file
CALL TO$BDOS
RET
;
A02E2:
LXI H,T0769
MOV M,B
DCX H
MOV M,C
LHLD D0768
XCHG
MVI C,20 ;Read sequential
CALL TO$BDOS
STA BDOS$VAL
RET
;
; >> NO EXECUTION PATH TO HERE <<
LXI H,T076B
MOV M,B
DCX H
MOV M,C
LHLD D076A
XCHG
MVI C,21 ;Write sequential
CALL TO$BDOS
STA BDOS$VAL
RET
;
; >> NO EXECUTION PATH TO HERE <<
LXI H,T076D
MOV M,B
DCX H
MOV M,C
LHLD D076C
XCHG
MVI C,22 ;Make file
CALL TO$BDOS
RET
;
; >> NO EXECUTION PATH TO HERE <<
LXI D,0
MVI C,23 ;Rename file
CALL TO$BDOS
RET
;
; >> NO EXECUTION PATH TO HERE <<
LXI H,D076E
MOV M,C
LHLD D076E
MVI H,0
XCHG
MVI C,14 ;Select disk
CALL TO$BDOS
RET
;
A0331:
LXI H,T0770
MOV M,B
DCX H
MOV M,C
LHLD D076F
XCHG
MVI C,26 ;Set DMA
CALL TO$BDOS
RET
;
NEW$LINE:
MVI C,ALF
CALL PUT$CHAR
MVI C,ACR
CALL PUT$CHAR
RET
;
DISP$STRING:
LXI H,T0772
MOV M,B
DCX H
MOV M,C
LHLD D0771
XCHG ;DE <---- BC
MVI C,9 ;Print string
CALL TO$BDOS
CALL NEW$LINE
RET
;
INIT:
LXI H,D0773
MVI M,0
LXI H,BUF$START
SHLD D077A
SHLD D077E
SHLD D0780
LHLD D077A
SHLD D0786
LXI H,T0794
MVI M,0
LXI H,T07A8
MVI M,0
LHLD BDOS+1
SHLD D077C
RET
;
A0387:
LXI H,Y082B
MOV M,B
DCX H
MOV M,C
LDA D0773
RAR
JC A044F
LHLD Y082A
SHLD Y082C
LXI D,D077C
CALL A0753
XCHG
LXI H,00080H
CALL A0710
XCHG
SHLD Y082E
LXI H,BDOS$VAL
MVI M,000H
A03B0:
MVI A,0
LXI D,Y082E
CALL A0750
ORA L
ADI 0FFH
SBB A
PUSH PSW
LDA BDOS$VAL
SUI 000H
SUI 001H
SBB A
POP B
MOV C,B
ANA C
RAR
JNC A03EE
LHLD Y082C
MOV B,H
MOV C,L
CALL A0331
LXI B,DFCB
CALL A02E2
LXI D,00080H
LHLD Y082C
DAD D
SHLD Y082C
LHLD Y082E
DCX H
SHLD Y082E
JMP A03B0
;
A03EE:
LDA BDOS$VAL
CPI 0
JZ A03FB
LXI H,D0773
MVI M,0FFH
A03FB:
LHLD Y082C
SHLD D0780
LXI B,00080H
CALL A0331
LDA D0773
RAR
JNC A042F
LXI B,100H
LXI D,Y082C
CALL A0748
XCHG
DCX H
MOV M,E
INX H
MOV M,D
A041C:
LHLD Y082C
MOV A,M
CPI EOF
JZ A042F
LHLD Y082C
INX H
SHLD Y082C
JMP A041C
;
A042F:
LHLD Y082C
DCX H
SHLD Y082C
A0436:
LHLD Y082C
MOV A,M
CPI 00AH
JZ A0449
LHLD Y082C
DCX H
SHLD Y082C
JMP A0436
;
A0449:
LHLD Y082C
SHLD D0782
A044F:
RET
;
A0450:
LXI H,Y0832
MOV M,D
DCX H
MOV M,E
DCX H
MOV M,C
LDA Y0830
CPI 0
JNZ A049B
A0460:
MVI A,0
LXI D,Y0831
CALL A0750
ORA L
ADI 0FFH
SBB A
LXI B,D0782
LXI D,D077E
PUSH PSW
CALL A0743
SBB A
POP B
MOV C,B
ANA C
RAR
JNC A0498
LHLD D077E
MOV A,M
CPI ALF
JNZ A048E
LHLD Y0831
DCX H
SHLD Y0831
A048E:
LHLD D077E
INX H
SHLD D077E
JMP A0460
;
A0498:
JMP A04ED
;
A049B:
LHLD Y0831
INX H
SHLD Y0831
A04A2:
MVI A,0
LXI D,Y0831
CALL A0750
ORA L
ADI 0FFH
SBB A
LXI D,D077A
LXI B,D077E
PUSH PSW
CALL A0743
SBB A
POP B
MOV C,B
ANA C
RAR
JNC A04DA
LHLD D077E
MOV A,M
CPI ALF
JNZ A04D0
LHLD Y0831
DCX H
SHLD Y0831
A04D0:
LHLD D077E
DCX H
SHLD D077E
JMP A04A2
;
A04DA:
LXI D,D077A
LXI B,D077E
CALL A0743
JNC A04ED
LHLD D077E
INX H
SHLD D077E
A04ED:
LHLD D077E
SHLD D0786
RET
;
A04F4:
LXI H,Y0834
MVI M,0
LXI B,D0782
LXI D,D077E
CALL A0743
JNC A0566
A0505:
LHLD D077E
MOV A,M
STA Y0833
CPI ALF
JZ A055A
LDA Y0833
CPI 009H
JZ A0527
LHLD Y0833
MOV C,L
CALL PUT$CHAR
LXI H,Y0834
INR M
JMP A0550
;
A0527:
LDA Y0834
ANI 007H
MOV C,A
MVI A,7
SUB C
STA Y0836
LXI H,Y0835
MVI M,0
A0538:
LDA Y0836
LXI H,Y0835
CMP M
JC A0550
MVI C,' '
CALL PUT$CHAR
LXI H,Y0834
INR M
INX H
INR M
JNZ A0538
A0550:
LHLD D077E
INX H
SHLD D077E
JMP A0505
;
A055A:
LHLD D077E
INX H
SHLD D077E
MVI C,ALF
CALL PUT$CHAR
A0566:
RET
;
A0567:
LHLD D0786
SHLD Y0838
SHLD D077E
LXI H,Y0837
MVI M,1
A0575:
MVI A,017H
LXI H,Y0837
CMP M
JC A0588
CALL A04F4
LXI H,Y0837
INR M
JNZ A0575
A0588:
LHLD D077E
SHLD D0786
LHLD Y0838
SHLD D077E
RET
;
A0595:
LXI H,Y083B
MOV M,B
DCX H
MOV M,C
MVI A,0
LXI D,Y083A
CALL A0750
ORA L
JNZ A05BC
LXI B,D077E
LXI D,D0780
CALL A0743
SHLD Y0840
LHLD D077E
SHLD Y083E
JMP A062B
;
A05BC:
LHLD D077A
SHLD Y083C
A05C2:
MVI A,0
LXI D,Y083A
CALL A0750
ORA L
JZ A0619
LXI H,00017H
SHLD Y0842
A05D4:
MVI A,0
LXI D,Y0842
CALL A0750
ORA L
JZ A060F
LHLD Y083C
MOV A,M
CPI ALF
JNZ A05F0
LHLD Y0842
DCX H
SHLD Y0842
A05F0:
LHLD Y083C
INX H
SHLD Y083C
LXI D,D0782
CALL A0753
JNC A060C
LXI H,0
SHLD Y0842
LXI H,1
SHLD Y083A
A060C:
JMP A05D4
;
A060F:
LHLD Y083A
DCX H
SHLD Y083A
JMP A05C2
;
A0619:
LXI B,Y083C
LXI D,D0780
CALL A0743
SHLD Y0840
LHLD Y083C
SHLD Y083E
A062B:
LHLD Y0840
PUSH H
LHLD Y083E
MOV B,H
MOV C,L
LHLD D077A
XCHG
POP H
A0639:
LDAX B
STAX D
INX B
INX D
DCX H
MOV A,H
ORA L
JNZ A0639
LXI B,D077A
LXI D,Y083E
CALL A0743
XCHG
INX H
MOV M,E
INX H
MOV M,D
LXI D,Y083E
LXI B,D077E
CALL A0743
JNC A066E
LXI B,Y0840
LXI D,D077E
CALL A0743
XCHG
DCX H
MOV M,E
INX H
MOV M,D
JMP A0674
;
A066E:
LHLD D077A
SHLD D077E
A0674:
LHLD D077E
SHLD D0786
LXI B,Y0840
LXI D,D0780
CALL A0743
XCHG
DCX H
MOV M,E
INX H
MOV M,D
LXI B,Y0840
LXI D,D0782
CALL A0743
XCHG
DCX H
MOV M,E
INX H
MOV M,D
LHLD D0780
MOV B,H
MOV C,L
CALL A0387
RET
;
A069F:
LHLD D0775
MVI H,0
LXI B,T07A9
DAD B
MOV A,M
STA D0774
MOV C,A
MVI A,'Z'
CMP C
JNC A06BB
LDA D0774
ANI 0DFH
STA D0774
A06BB:
LDA D0775
INR A
STA D0775
RET
;
A06C3:
MVI C,'*'
CALL PUT$CHAR
LXI B,T07A9
CALL A0287
MVI C,ALF
CALL PUT$CHAR
LDA D07AA
STA D0776
CPI 0
JNZ A06E6
LXI H,D0774
MVI M,ACR
JMP A06EE
;
A06E6:
LXI H,D0775
MVI M,2
CALL A069F
A06EE:
RET
;
A06EF:
LXI H,Y0844
MOV M,C
LXI H,Y0844
LDA D0774
SUB M
SUI 1
SBB A
PUSH PSW
LDA D0776
SUI 1
SUI 1
SBB A
POP B
MOV C,B
ANA C
RET
;
TO$BDOS:
JMP BDOS
;
TO$WBOOT:
JMP WBOOT
;
A0710:
MOV B,H
MOV C,L
LXI H,0
MVI A,010H
A0717:
PUSH PSW
DAD H
XCHG
SUB A
DAD H
XCHG
ADC L
SUB C
MOV L,A
MOV A,H
SBB B
MOV H,A
INX D
JNC A0729
DAD B
DCX D
A0729:
POP PSW
DCR A
JNZ A0717
RET
;
A072F:
MOV B,H
MOV C,L
LXI H,0
MVI A,010H
A0736:
DAD H
XCHG
DAD H
XCHG
JNC A073E
DAD B
A073E:
DCR A
JNZ A0736
RET
;
A0743:
MOV L,C
MOV H,B
MOV C,M
INX H
MOV B,M
A0748:
LDAX D
SUB C
MOV L,A
INX D
LDAX D
SBB B
MOV H,A
RET
;
A0750:
MOV L,A
MVI H,0
A0753:
LDAX D
SUB L
MOV L,A
INX D
LDAX D
SBB H
MOV H,A
RET
;
;
ALLFLAG DB 0 ;'.ALL' file type flag
BDOS$VAL:
DB 06EH
D075C: DB 006H
D075D: DB 001H
D075E: DB 040H
T075F: DB 008H
D0760: DB 011H
T0761: DB 07EH
D0762: DB 007H
T0763: DB 0CDH
D0764: DB 043H
T0765: DB 007H
D0766: DB 0EBH
T0767: DB 02BH
D0768: DB 073H
T0769: DB 023H
D076A: DB 072H
T076B: DB 0C3H
D076C: DB 074H
T076D: DB 006H
D076E: DB 02AH
D076F: DB 07AH
T0770: DB 007H
D0771: DB 022H
T0772: DB 07EH
D0773: DB 007H
D0774: DB 02AH
D0775: DB 07EH
D0776: DB 007H
D0777: DB 022H
D0778: DW 0
D077A: DW 0
D077C: DW 0
D077E: DW 0
D0780: DW 0
D0782: DW 0
D0784: DW 0
D0786: DW 0
DFCB: DB 0,0,0,0,0,0,0,0,0,0 ;Internal FCB
DB 0,0
T0794: DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
T07A8: DB 07EH
T07A9: DB 080H
D07AA: DB 000H
;
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0
;
NOT$FOUND$MSG:
DB ' FILE NOT FOUND$'
;
ILLEGAL$MSG:
DB ' ILLEGAL COMMAND$'
;
HELP$MSG:
DB 'DISPLAY Version '
DB VERS/10 + '0','.',VERS MOD 10 + '0'
DB ' HELP SUMMARY',ACR,ALF,ACR,ALF
DB 'Command: Operation performed:',ACR,ALF
DB '======= ===================',ACR,ALF
DB 'B Move pointer to beginning of file and display page.',ACR,ALF,ACR,ALF
DB '-nP Move pointer minus n pages and display page.',ACR,ALF
DB 'nP Move pointer plus n pages and display page.',ACR,ALF
DB '0P Move pointer to beginning of buffer and display page',ACR,ALF,ACR,ALF
DB '-nL Move pointer minus n lines and display page.',ACR,ALF
DB 'nL Move pointer plus n lines and display page.',ACR,ALF
DB 'nD Discard n pages, refill buffer and display the',ACR,ALF
DB ' current page.',ACR,ALF
DB '0D Discard all data up to the current pointer, refill',ACR,ALF
DB ' buffer and display the first page.',ACR,ALF,ACR,ALF
DB 'E Exit DISPLAY and return to CP/M.',ACR,ALF
DB '^C Control-C, exit DISPLAY and return to CP/M.',ACR,ALF,ACR,ALF
DB '<cr> Move pointer to next page and display',ACR,ALF
DB '$'
;
Y082A DB 0
Y082B DB 0
Y082C DW 0
Y082E DW 0
Y0830 DB 0
Y0831 DB 0
Y0832 DB 0
Y0833 DB 0
Y0834 DB 0
Y0835 DB 0
Y0836 DB 0
Y0837 DB 0
Y0838 DW 0
Y083A DB 0
Y083B DB 0
Y083C DW 0
Y083E DW 0
Y0840 DW 0
Y0842 DW 0
Y0844 DW 0
;
DS 32
;
BUF$START EQU $
;
END