mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
Upload
Digital Research
This commit is contained in:
214
CPM OPERATING SYSTEMS/CPM 2.X/CPM 2.2/CPM 2.2 SOURCE/DUMP.ASM
Normal file
214
CPM OPERATING SYSTEMS/CPM 2.X/CPM 2.2/CPM 2.2 SOURCE/DUMP.ASM
Normal file
@@ -0,0 +1,214 @@
|
||||
; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX
|
||||
;
|
||||
; COPYRIGHT (C) 1975, 1976, 1977, 1978
|
||||
; DIGITAL RESEARCH
|
||||
; BOX 579, PACIFIC GROVE
|
||||
; CALIFORNIA, 93950
|
||||
;
|
||||
ORG 100H
|
||||
BDOS EQU 0005H ;DOS ENTRY POINT
|
||||
CONS EQU 1 ;READ CONSOLE
|
||||
TYPEF EQU 2 ;TYPE FUNCTION
|
||||
PRINTF EQU 9 ;BUFFER PRINT ENTRY
|
||||
BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY)
|
||||
OPENF EQU 15 ;FILE OPEN
|
||||
READF EQU 20 ;READ FUNCTION
|
||||
;
|
||||
FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS
|
||||
BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS
|
||||
;
|
||||
; NON GRAPHIC CHARACTERS
|
||||
CR EQU 0DH ;CARRIAGE RETURN
|
||||
LF EQU 0AH ;LINE FEED
|
||||
;
|
||||
; FILE CONTROL BLOCK DEFINITIONS
|
||||
FCBDN EQU FCB+0 ;DISK NAME
|
||||
FCBFN EQU FCB+1 ;FILE NAME
|
||||
FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS)
|
||||
FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER
|
||||
FCBRC EQU FCB+15 ;FILE'S RECORD COUNT (0 TO 128)
|
||||
FCBCR EQU FCB+32 ;CURRENT (NEXT) RECORD NUMBER (0 TO 127)
|
||||
FCBLN EQU FCB+33 ;FCB LENGTH
|
||||
;
|
||||
; SET UP STACK
|
||||
LXI H,0
|
||||
DAD SP
|
||||
; ENTRY STACK POINTER IN HL FROM THE CCP
|
||||
SHLD OLDSP
|
||||
; SET SP TO LOCAL STACK AREA (RESTORED AT FINIS)
|
||||
LXI SP,STKTOP
|
||||
; READ AND PRINT SUCCESSIVE BUFFERS
|
||||
CALL SETUP ;SET UP INPUT FILE
|
||||
CPI 255 ;255 IF FILE NOT PRESENT
|
||||
JNZ OPENOK ;SKIP IF OPEN IS OK
|
||||
;
|
||||
; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN
|
||||
LXI D,OPNMSG
|
||||
CALL ERR
|
||||
JMP FINIS ;TO RETURN
|
||||
;
|
||||
OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END
|
||||
MVI A,80H
|
||||
STA IBP ;SET BUFFER POINTER TO 80H
|
||||
; HL CONTAINS NEXT ADDRESS TO PRINT
|
||||
LXI H,0 ;START WITH 0000
|
||||
;
|
||||
GLOOP:
|
||||
PUSH H ;SAVE LINE POSITION
|
||||
CALL GNB
|
||||
POP H ;RECALL LINE POSITION
|
||||
JC FINIS ;CARRY SET BY GNB IF END FILE
|
||||
MOV B,A
|
||||
; PRINT HEX VALUES
|
||||
; CHECK FOR LINE FOLD
|
||||
MOV A,L
|
||||
ANI 0FH ;CHECK LOW 4 BITS
|
||||
JNZ NONUM
|
||||
; PRINT LINE NUMBER
|
||||
CALL CRLF
|
||||
;
|
||||
; CHECK FOR BREAK KEY
|
||||
CALL BREAK
|
||||
; ACCUM LSB = 1 IF CHARACTER READY
|
||||
RRC ;INTO CARRY
|
||||
JC FINIS ;DON'T PRINT ANY MORE
|
||||
;
|
||||
MOV A,H
|
||||
CALL PHEX
|
||||
MOV A,L
|
||||
CALL PHEX
|
||||
NONUM:
|
||||
INX H ;TO NEXT LINE NUMBER
|
||||
MVI A,' '
|
||||
CALL PCHAR
|
||||
MOV A,B
|
||||
CALL PHEX
|
||||
JMP GLOOP
|
||||
;
|
||||
FINIS:
|
||||
; END OF DUMP, RETURN TO CCP
|
||||
; (NOTE THAT A JMP TO 0000H REBOOTS)
|
||||
CALL CRLF
|
||||
LHLD OLDSP
|
||||
SPHL
|
||||
; STACK POINTER CONTAINS CCP'S STACK LOCATION
|
||||
RET ;TO THE CCP
|
||||
;
|
||||
;
|
||||
; SUBROUTINES
|
||||
;
|
||||
BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO)
|
||||
PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED
|
||||
MVI C,BRKF
|
||||
CALL BDOS
|
||||
POP B! POP D! POP H; ENVIRONMENT RESTORED
|
||||
RET
|
||||
;
|
||||
PCHAR: ;PRINT A CHARACTER
|
||||
PUSH H! PUSH D! PUSH B; SAVED
|
||||
MVI C,TYPEF
|
||||
MOV E,A
|
||||
CALL BDOS
|
||||
POP B! POP D! POP H; RESTORED
|
||||
RET
|
||||
;
|
||||
CRLF:
|
||||
MVI A,CR
|
||||
CALL PCHAR
|
||||
MVI A,LF
|
||||
CALL PCHAR
|
||||
RET
|
||||
;
|
||||
;
|
||||
PNIB: ;PRINT NIBBLE IN REG A
|
||||
ANI 0FH ;LOW 4 BITS
|
||||
CPI 10
|
||||
JNC P10
|
||||
; LESS THAN OR EQUAL TO 9
|
||||
ADI '0'
|
||||
JMP PRN
|
||||
;
|
||||
; GREATER OR EQUAL TO 10
|
||||
P10: ADI 'A' - 10
|
||||
PRN: CALL PCHAR
|
||||
RET
|
||||
;
|
||||
PHEX: ;PRINT HEX CHAR IN REG A
|
||||
PUSH PSW
|
||||
RRC
|
||||
RRC
|
||||
RRC
|
||||
RRC
|
||||
CALL PNIB ;PRINT NIBBLE
|
||||
POP PSW
|
||||
CALL PNIB
|
||||
RET
|
||||
;
|
||||
ERR: ;PRINT ERROR MESSAGE
|
||||
; D,E ADDRESSES MESSAGE ENDING WITH "$"
|
||||
MVI C,PRINTF ;PRINT BUFFER FUNCTION
|
||||
CALL BDOS
|
||||
RET
|
||||
;
|
||||
;
|
||||
GNB: ;GET NEXT BYTE
|
||||
LDA IBP
|
||||
CPI 80H
|
||||
JNZ G0
|
||||
; READ ANOTHER BUFFER
|
||||
;
|
||||
;
|
||||
CALL DISKR
|
||||
ORA A ;ZERO VALUE IF READ OK
|
||||
JZ G0 ;FOR ANOTHER BYTE
|
||||
; END OF DATA, RETURN WITH CARRY SET FOR EOF
|
||||
STC
|
||||
RET
|
||||
;
|
||||
G0: ;READ THE BYTE AT BUFF+REG A
|
||||
MOV E,A ;LS BYTE OF BUFFER INDEX
|
||||
MVI D,0 ;DOUBLE PRECISION INDEX TO DE
|
||||
INR A ;INDEX=INDEX+1
|
||||
STA IBP ;BACK TO MEMORY
|
||||
; POINTER IS INCREMENTED
|
||||
; SAVE THE CURRENT FILE ADDRESS
|
||||
LXI H,BUFF
|
||||
DAD D
|
||||
; ABSOLUTE CHARACTER ADDRESS IS IN HL
|
||||
MOV A,M
|
||||
; BYTE IS IN THE ACCUMULATOR
|
||||
ORA A ;RESET CARRY BIT
|
||||
RET
|
||||
;
|
||||
SETUP: ;SET UP FILE
|
||||
; OPEN THE FILE FOR INPUT
|
||||
XRA A ;ZERO TO ACCUM
|
||||
STA FCBCR ;CLEAR CURRENT RECORD
|
||||
;
|
||||
LXI D,FCB
|
||||
MVI C,OPENF
|
||||
CALL BDOS
|
||||
; 255 IN ACCUM IF OPEN ERROR
|
||||
RET
|
||||
;
|
||||
DISKR: ;READ DISK FILE RECORD
|
||||
PUSH H! PUSH D! PUSH B
|
||||
LXI D,FCB
|
||||
MVI C,READF
|
||||
CALL BDOS
|
||||
POP B! POP D! POP H
|
||||
RET
|
||||
;
|
||||
; FIXED MESSAGE AREA
|
||||
SIGNON: DB 'FILE DUMP VERSION 1.4$'
|
||||
OPNMSG: DB CR,LF,'NO INPUT FILE PRESENT ON DISK$'
|
||||
|
||||
; VARIABLE AREA
|
||||
IBP: DS 2 ;INPUT BUFFER POINTER
|
||||
OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP
|
||||
;
|
||||
; STACK AREA
|
||||
DS 64 ;RESERVE 32 LEVEL STACK
|
||||
STKTOP:
|
||||
;
|
||||
END
|
Reference in New Issue
Block a user