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
/
CPM
/
SUBMIT
/
NEWBAT3.LBR
/
NEWBAT3.AZM
/
NEWBAT3.ASM
Wrap
Assembly Source File
|
2000-06-30
|
6KB
|
293 lines
;NEWBATCH.ASM
;
;01/18/88 REVISED TO VERSION 3 VIA DISASSEMBLY OF VERSION 2.
; REMOVED ^Z AT START OF SIGN ON MESSAGE, FIXED ERROR
; HANDLING IN CASE OF DISK/DIRECTORY FULL. TAH
;
BDOS EQU 0005
FCB EQU 005CH
CR EQU 0DH
LF EQU 0AH
;
;
ORG 100H
;
LXI SP,STACK
LDA FCB+1
CPI '@' ;ANY FILE NAME SPECIFIED?
JP L0116
MVI C,9 ;NO, GIVE MESSAGE AND QUIT
LXI D,NFNMSG
CALL BDOS
JMP EXIT
L0116:
MVI C,0FH
LXI D,FCB
CALL BDOS ;SEE IF FILE ALREADY EXISTS
INR A
JZ NOFILE
MVI C,9 ;QUIT IF IT DOES.
LXI D,EXISTMSG
CALL BDOS
JMP EXIT
;FIRST DELETE ANY PRE-EXISTING .COM FILE
NOFILE:
MVI C,13H ;NOT NECESSARY SINCE
LXI D,FCB ;WE WOULD NOT GET HERE
CALL BDOS ;IF IT DID EXIST.
;NOW CREATE IT
MVI C,16H
LXI D,FCB
CALL BDOS
LXI D,DIMSG
INR A
JZ EXIT1 ;QUIT IF NO SPACE
;SET DMA
MVI C,1AH
LXI D,STACK
PUSH D
CALL BDOS
;COPY HEADER INTO .COM FILE
;(THE PORTION THAT CREATES THE $$$.SUB FILE)
;HERE WE ONLY WRITE OUT 2 SECTORS HENCE THE LENGTH TEST LATER ON.
;
MVI C,15H ;WRITE
LXI D,FCB
CALL BDOS
LXI D,DAMSG
ORA A
JNZ EXIT1 ;DISK FULL IF NOT ZERO
;FINISH LAST PORTION
POP D
LXI H,128
DAD D
XCHG ;POINT TO NEXT SECTOR
MVI C,1AH ;SET DMA ADDRESS
CALL BDOS
MVI C,15H ;AND WRITE IT
LXI D,FCB
CALL BDOS
MVI C,9
LXI D,SOMSG ;NOW SIGN ON
CALL BDOS
L0165:
LXI H,SUBBUF
MVI B,80H
CLRLOOP:
MVI M,0 ;CLEAR 128 BYTES OF MEMORY
INX H
DCR B
JNZ CLRLOOP
;
MVI A,50H ;MAX CHARACTER COUNT
STA COUNT
MVI C,0AH
LXI D,COUNT
CALL BDOS ;GET SUBMIT COMMAND LINE FROM CONSOLE
LDA SUBBUF
ORA A ;EMPTY LINE?
JZ L01B2 ;YES, FINISH UP
MOV E,A ;LINE LENGTH TO E
MVI D,0 ;CLEAR D
LXI H,SUB1
DAD D ;POINT TO END OF LINE
MVI M,0 ;TERMINATE WITH 00
INX H
MVI M,'$' ;FOLLOWED BY '$'
INX H
MVI M,CR
INX H
MVI M,LF ;AND A CRLF
MVI C,1AH
LXI D,SUBBUF
CALL BDOS
MVI C,15H
LXI D,FCB
CALL BDOS ;NOW WRITE IT TO DISK.
LXI D,DATMSG ;PREPARE FOR ERROR
ORA A
JNZ EXIT1 ;WRITE ERROR.
MVI C,9
LXI D,CRLF
CALL BDOS ;SEND A CRLF TO THE CONSOLE
JMP L0165 ;AND GET ANOTHER LINE.
L01B2:
MVI A,0FFH ;FILE TERMINATOR
STA STACK
MVI C,1AH
LXI D,STACK
CALL BDOS
MVI C,15H
LXI D,FCB
CALL BDOS ;WRITE OUT TERMINATOR
MVI C,10H ;CLOSE .COM FILE
LXI D,FCB
CALL BDOS
LXI D,DIMSG
INR A
JZ EXIT ;CLOSE ERROR
MVI C,9
LXI D,ENDMSG
CALL BDOS ;SIGN OFF
EXIT:
MVI C,0
JMP BDOS
;
EXIT1:
MVI C,9
CALL BDOS ;DISPLAY MESSAGE
LXI D,FCB
MVI C,13H
CALL BDOS ;DELETE FILE
JMP EXIT
CRLF:
DB CR,LF,'$'
SOMSG:
DB CR,LF,'********************** '
DB 'NEWBATCH v3 ***********************'
DB CR,LF,LF,' A program '
DB 'for creating SUBMIT-type '
DB 'BATCH COMmand files.',0DH
DB CR,LF,' A revision '
DB 'of MAKBATCH by E. Helliwell'
DB CR,LF,' with thanks '
DB 'to Castle Oaks Computer '
DB 'Services.',CR,LF,LF,'Enter '
DB 'the desired COMMAND lines '
DB 'below.',CR,LF,LF,'Enter '
DB '<CR> ALONE to Terminate '
DB 'Input:',CR,LF,LF,'*************'
DB '**********************************'
DB '************',CR,LF,LF
DB '$'
ENDMSG:
DB CR,LF,LF,'NEWBATCH COMmand '
DB 'File has been written to '
DB 'disk.',CR,LF,'$'
NFNMSG:
DB 7,CR,LF,'No filename given.'
DB CR,LF,'Include filename '
DB '(including COM filetype) '
DB 'in command line.',CR,LF
DB 'Example: NEWBATCH START.COM'
DB CR,LF,'$'
EXISTMSG:
DB 7,CR,LF,'File already exists. '
DB ' Choose another name and '
DB 'start over.',CR,LF,'$'
DB '*********************',0DH
DB 0AH,0AH,'$'
;
;THE FOLLOWING ARE THE FIRST TWO SECTORS OF THE FILE THAT THIS
;PROGRAM CREATES. THIS MUST BE ASSEMBLED WITH AN OFFSET BECAUSE,
;ALTHOUGH IT RESIDES AT THE CURRENT ADDRESS, IT WILL ACTUALLY
;EXECUTE WITH AN ORIGIN ADDRESS OF 0100H AND ASM.COM LACKS
;THE PHASE/DEPHASE PSEUDO-OP OF M80.COM
;
OFFSET EQU $-100H
SUBDAT EQU 0200H ;SUBMIT COMMANDS START HERE
STK EQU SUBDAT-2
;
STACK:
LXI SP,STK
LXI D,SUBFCB
MVI C,13H ;DELETE FILE
CALL BDOS
LXI D,SUBFCB
MVI C,16H ;MAKE FILE
CALL BDOS
LXI D,DIRMSG
INR A
JZ EXIT2 ;QUIT IF NO SPACE
LXI H,SUBDAT
SHLD WRTADR
MVI B,0
;
L0122 EQU $-OFFSET ;LOCATE LAST COMMAND
INR B
MOV A,M
CPI 0FFH ;TERMINATOR?
JZ L0136 ;YES, WRITE COMMANDS TO $$$.SUB
LXI D,0080H
LHLD WRTADR
DAD D
SHLD WRTADR
JMP L0122 ;NO, LOOP BACK
;
L0136 EQU $-OFFSET
ADD B
JZ L0162 ;DONE ALL COMMANDS, FINISH UP
PUSH B
LHLD WRTADR
LXI D,-128 ;WRITE COMMANDS IN REVERSE ORDER
DAD D
SHLD WRTADR
XCHG
MVI C,1AH ;SET DMA
CALL BDOS
LXI D,SUBFCB
MVI C,15H ;WRITE NEXT LINE
CALL BDOS
LXI D,DATMSG
ORA A ;DISK FULL IF NOT ZERO
JNZ EXIT2
POP B
DCR B
MOV A,B
CPI 1
JNZ L0136 ;DO NEXT LINE
;
L0162 EQU $-OFFSET
LXI D,SUBFCB
MVI C,10H ;CLOSE FILE
CALL BDOS
LXI D,DIRMSG
INR A
JZ EXIT2 ;CLOSE ERROR
;
;
MVI C,0 ;SYSTEM RESET
JMP BDOS ;AND DONE.
;
EXIT2 EQU $-OFFSET
MVI C,9
CALL BDOS ;DISPLAY MESSAGE
LXI D,SUBFCB
MVI C,13H ;DELETE FILE IF ERROR
CALL BDOS
JMP 0000 ;WARM START
;
;
WRTADR EQU $-OFFSET
WADR: DW 0000 ;POINTER FOR NEXT SECTOR OF DATA
;
;THE NEXT TWO MESSAGES ARE EACH DEFINED WITH TWO LABELS SO THAT BOTH
;THIS PROGRAM AND THE ONE IT CREATES CAN REFERENCE THEM.
DIRMSG EQU $-OFFSET
DIMSG: DB 'No directory space',21H,'$'
;
DATMSG EQU $-OFFSET
DAMSG: DB 'Out of data space',21H,'$'
;
SUBFCB EQU $-OFFSET
DB 01 ;01=DRIVE A:
DB '$$$ SUB'
DB 0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0
DB 0,0,0,0,0,0
;
LENGTH EQU $-STACK
;
IF (256 - LENGTH) SHR 15 ;ERROR IF > 2 SECTORS LENGTH
ERROR EQU 1/0 ;! .COM HEADER OVERFLOW
ENDIF
;
;DATA BUFFER FOR COMMANDS TO BE SUBMITTED
;
COUNT EQU 4FFH
SUBBUF EQU 500H
SUB1 EQU 501H
END