home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG035.ARK
/
LOADPROG.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
5KB
|
195 lines
; 12 SEPT 79
; LOADPROG: FELIX UTILITY FOR 'TRIMMING' .FEX FILES
;
; MOSHELL 12 SEPT 79
;
; THIS PROGRAM OFFERS OPTIONS: JUST-FEX-CODE,THAT PLUS
; OBJECTS, THAT PLUS BACKGROUND, OR THAT ALL PLUS THE
; EXEC MODULE. THE REQUESTED AMOUNT OF A GIVEN FILENAME
; IS LOADED INTO MEMORY (TYPICALLY AFTER OBJECTS/BACKGROUND
; HAVE BEEN SET UP) AND THE WHOLE MESS SAVED.
;
; USE: A>TRIMPROG FILENAME (CR) -.FEX IS ASSUMED.
;
CR EQU 0DH
LF EQU 0AH
MOV2K EQU 503CH
PRINT EQU 502DH
CHARIN EQU 5027H
SYSFCB EQU 5CH
FCBMOV EQU 5051H
BIOS EQU 5H
DSKRD EQU 5039H
DISPHL EQU 5045H
CPM EQU 0H
CRLF EQU 5024H
;
ORG 100H
LOADPROG:LXI SP,4000H ;SAFELY UP IN 'ONBUF'.
CALL SURVIVAL
LXI H,RUNLOC ;MOVE THE PROGRAM
LXI D,GETLOC ;TO SAFE SPOT
CALL MOV2K ;WE MOVE TOO MUCH,BUT NO
JMP RUNLOC ;BIG DEAL....
;
; THIS CHECKS TO SEE THAT BASE ROUTINES ARE THERE.CRASHES
; BACK TO CPM IF THEY AREN'T.
;
SURVIVAL:LDA 5000H
CPI 0C3H
JNZ BAD
LDA 5003H
CPI 0C3H
RZ ;BOTH JUMPS THERE,PROLLY NO PROBLEM.
BAD: LXI D,TEXT
MVI C,9
CALL BIOS
JMP CPM
TEXT: DB 'PLEASE LOAD THE FELIX UTILITIES BY '
DB ' TYPING "FELIX" FIRST.',CR,LF,'$'
GETLOC EQU $ ;WE'LL DDT THE OBJECT CODE DOWN TO HERE.
;
ORG 3000H
RUNLOC: LXI H,SYSFCB+9
MVI M,'F' ;SETUP FOR .FEX FILE.
INX H
MVI M,'E'
INX H
MVI M,'X'
LXI H,MENU !CALL PRINT
CALL CHARIN
CPI 'P' ;PROGRAM ONLY?
JNZ MAYBE$O
;
; WE SELECT ONE OPTION,SET CORRESPONDING LIMIT.
;
LXI H,(0-1000H)
SHLD LIMIT
JMP GETPROG
MAYBE$O:CPI '0' ;ZERO,MAYBE FOR O?
JZ YEP$O
CPI 'O' ;THE REAL O?
JNZ MAYBE$B
YEP$O: LXI H,(0-2000H)
SHLD LIMIT
JMP GETPROG
MAYBE$B:LXI H,(0-2800H); 'B' OR 'E' BOTH NEED
SHLD LIMIT ;THIS VALUE
CPI 'E'
JNZ GETPROG
STA EFLAG ;IF 'E',REMEMBER THAT.
GETPROG:CALL CRLF
LXI H,100H ;WHERE TO PUT IT?
CALL LDSKRD ;READ FILE UP TO LIMIT.
LDA EFLAG ;HOW 'BOUT EXEC.OBJ?
ORA A
JZ WINDUP
;
; READ IN EXEC.OBJ AT 2800H.
;
LXI H,EXECFCB
LXI D,SYSFCB
CALL FCBMOV
LXI H,2800H
CALL DSKRD ;VANILLA ONE THIS TIME.
LXI H,3000H
SHLD LIMIT
WINDUP: LXI H,ENDMSG
CALL PRINT
LHLD LIMIT
CALL DISPHL
CALL CRLF
JMP CPM ;SIMPLE,HUH?
;
MENU: DB 'SELECT ONE:',CR,LF
DB 'KEEP:PROGRAM (P)',CR,LF
DB ' :+OBJECTS (O)',CR,LF
DB ' :+BACKGRND(B)',CR,LF
DB 'AND ADD EXEC (E)',CR,LF,'$'
;
ENDMSG: DB 'LAST LOCATION: $'
EXECFCB:DB 0,'EXEC OBJ',0,0,0,0
ORG EXECFCB+32
DB 0
LIMIT: DW 0
EFLAG: DB 0
;
;
; 1 AUG 79; MOD TO REDUCE BY 1 SECTOR THE READING (IT IS
; OVERREADING NOW. MOSHELL)
;
* THIS ROUTINE READS A SPECIFIED DISK FILE INTO A SPECIFIED MEMORY AREA.
* THE STARTING ADDRESS OF THE MEMORY AREA IS PASSED BY THE CALLER IN
* HL AND THE DISK FILE IS SPECIFIED BY A PROPERLY FORMED FCB IN THE CP/M
* DEFAULT FCB AREA (CURRENTLY HEX 5C). THE READ IS DONE BY RE-SPECIFYING
* THE READ BUFFER EACH TIME WE HAVE A SUCCESSFUL READ. THUS THE BUFFER
* IS FIRST AT THE DESIRED START ADDRESS AND IS CONTINUALLY INCREMENTED
* IN BLOCKS OF "BUFLEN" (# OF BYTES READ IN EACH DISK READ OPERATION) UNTIL
* THE ENTIRE FILE IS READ IN.
* ALL REGISTERS (EXCEPT A) ARE SAVED.
OPEN EQU 500CH
CLOSE EQU 500FH
READBF EQU 5012H
DMASET EQU 5036H
DEFFCB EQU 05CH
BUFLEN EQU 080H
DEFBUF EQU 080H
STOP EQU '$'
LDSKRD: PUSH B ! PUSH D ! PUSH H
LXI B,DEFBUF ;GET @ OF DEFAULT BUFFER INTO B
LXI D,DEFFCB ;WE WILL WORK WITH THE DEFAULT FCB
CALL OPEN ;OPEN THE SPECIFIED FILE
CPI 0FFH ;DOES IT EXIST?
JZ OPENERR ;NO--PRINT ERROR MESSAGE AND REBOOT
* READ BUFFERS FROM DISK UNTIL THERE AREN'T ANY MORE LEFT
RDLOOP: LXI D,DEFFCB
CALL READBF
ORA A
JNZ NODATA ;FINISHED,OR ERROR
LXI B,DEFBUF;GET DEFAULT BUFF.ADDR
MVI D,BUFLEN ;COUNTER FOR TRANSFER
MOVELOOP: LDAX B
MOV M,A ;STORE A BYTE
INX H
CALL CHECKLIM
JZ OKEND
INX B
DCR D
JNZ MOVELOOP
JMP RDLOOP
NODATA: CPI 3 ;IS RETURN VALUE FROM READ THREE OR MORE?
JNC RDERROR ;YES--WE HAVE UNKNOWN RETURN VALUE: THEREFORE--ERROR!
CALL CLOSE ;NO--WE'RE FINISHED AND WE CLOSE THE FILE
CPI 0FFH ;HAS SOMETHING HAPPENED TO THE FILE?
JZ CLOSERR ;YES--TELL ABOUT IT AND REBOOT
OKEND: SHLD LIMIT
POP H ! POP D ! POP B
RET
OPENERR: LXI H,MESS1 ;PRINT AN ERROR MESSAGE
CALL PRINT
CALL CRLF
JMP 0 ;REBOOT
MESS1 DB 'WE HAVE NO FILE BY THAT NAME',STOP
CLOSERR: LXI H,MESS2 ;PRINT ERROR MESSAGE
CALL PRINT
CALL CRLF
JMP 0 ;REBOOT
MESS2 DB 'CANNOT CLOSE FILE',STOP
RDERROR: LXI H,MESS3 ;PRINT ERROR MESSAGE AND REBOOT
CALL PRINT
CALL CRLF
JMP 0
MESS3 DB 'FILE READ ERROR',STOP
;
; THIS COMPARES HL TO 'LIMIT' IN MEMORY,SETS ZERO FLAG
; ACCORDINGLY.
;
CHECKLIM:PUSH D!PUSH H
XCHG
LHLD LIMIT
DAD D
MOV A,H
ORA L ;Z-FLAG NOW SET RIGHTLY.
POP H!POP D
RET