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
/
CPMUG008.ARK
/
MAC4.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
9KB
|
465 lines
TITLE MACADPT
;
; VERSION 1.2 11 APR 77
; VERSION 1.3 20 SEP 77
; VERSION 1.4 17 OCT 77
;
; BY JEFFREY W. SHOOK
; PO BOX 185
; ROCKY POINT, NY 11778
;
; THIS PROGRAM ADAPTS THE TDL MACROASSEMBLER
; TO WORK UNDER CP/M.
;
;***********************************;
; CP/M STANDARD EQUATES ;
;***********************************;
BOOT EQU 0000H ;WARM START ADDRESS
TFCB EQU 005CH ;DEFAULT FCB ADDRESS
TBUF EQU 0080H ;DEFAULT BUFFER ADDRESS
TBASE EQU 0100H ;TRANSIENT PROGRAM BASE
CBASE EQU 2900H ;CCP BASE ADDRESS
BDOS EQU 0005H ;BDOS ENTRY POINT
CONIN EQU 03E09H ;CONSOLE INPUT SUBROUTINE
CONOUT EQU 03E0CH ;CONSOLE OUTPUT ROUTINE
;***********************************;
; CP/M FUNCTION CODES ;
;***********************************;
SRSET EQU 00 ;SYSTEM RESET
RCON EQU 01 ;READ CONSOLE
WCON EQU 02 ;WRITE CONSOLE
RRDR EQU 03 ;READ READER
WPUN EQU 04 ;WRITE PUNCH
WLST EQU 05 ;WRITE LIST
ISTAT EQU 07 ;GET IOSTATUS
SSTAT EQU 08 ;SET IOSTATUS
WCONB EQU 09 ;WRITE CONSOLE BUFFER
RCONB EQU 10 ;READ CONSOLE BUFFER
CSTAT EQU 11 ;CHECK CONSOLE STATUS
LHEAD EQU 12 ;LIFT DISK HEAD
RSDSK EQU 13 ;RESET DISK SYSTEM
SDISK EQU 14 ;SELECT DISK
OPEN EQU 15 ;OPEN FILE
CLOSE EQU 16 ;CLOSE FILE
SFRST EQU 17 ;SEARCH FIRST
SNEXT EQU 18 ;SEARCH NEXT
FDELT EQU 19 ;DELETE FILE
READ EQU 20 ;READ RECORD
WRITE EQU 21 ;WRITE RECORD
CREATE EQU 22 ;CREATE FILE
RENAM EQU 23 ;RENAME FILE
LOGIN EQU 24 ;GET LOGIN
IDISK EQU 25 ;GET DISK NUMBER
SDMA EQU 26 ;SET DMA VECTOR
IALLOC EQU 27 ;GET ALLOCATION VECTOR
;
;
EOF: EQU 1AH ; CP/M END OF FILE CHAR
;
;
ORG 100H ; LET CP/M FIND US
JMP MACAD
;
;
; TRANSIENT PROGRAM STORAGE
; DEFINITIONS
;
;
;
CSTSF: DS 1 ; CONSOLE STATUS FLAG
PASSP: DS 2 ; PASS TABLE POINTER
SRCPTR: DS 2 ; SOURCE BUFFER POINTER
LSTPTR: DS 2 ; LISTING BUFFER POINTER
HEXPTR: DS 2 ; HEX OBJECT FILE POINTER
SRCFCB: DS 36 ; SOURCE FILE CONTROL BLOCK
SRCBUF: DS 128 ; SOURCE FILE BUFFER
LSTFCB: DS 36 ; LISTING FILE CONTROL BLOCK
LSTBUF: DS 128 ; LISTING FILE BUFFER
HEXFCB: DS 36 ; OBJECT FILE CONTROL BLOCK
HEXBUF: DS 128 ; OBJECT FILE BUFFER
;
;
;
;
MACAD: LXI SP,MACRX+16EH ; SET TEMP STACK
LXI H,AZM ; INSERT FILETYPE
LXI D,TFCB+9
LXI B,3 ; IN TRANSIENT FCB
CALL LDIR ; MOVE FILETYPE
LXI D,TFCB; CHECK DIRECTORY
MVI C,SFRST ; TO SEE IF FILE EXISTS
CALL BDOS
CPI 0FFH
CZ ERROR
LXI H,TFCB ; MOVE FILE NAME TO SRCFCB
LXI D,SRCFCB
LXI B,12
CALL LDIR ; MOVE BLOCK
MVI C,OPEN ; OPEN SOURCE FILE
LXI D,SRCFCB
CALL BDOS
CPI 0FFH
CZ ERROR
LXI D,LSTFCB; CREATE LISTING FILE
LXI B,PRN
CALL MAKEF
LXI D,HEXFCB; CREATE OBJECT FILE
LXI B,HXR
CALL MAKEF
LXI H,PASST ; INITIALZE PASS COUNT
SHLD PASSP
LXI H,LSTBUF; INITALIZE LISTING POINTER
SHLD LSTPTR
LXI H,HEXBUF; INITIALIZE HEX POINTER
SHLD HEXPTR
MVI A,0 ; INITIALIZE CONSOLE STATUS FLAG
STA CSTSF
JMP MACRX ; GO ASSEMBLE
;
; TABLE OF FILETYPES
;
AZM: DB 'AZM'
PRN: DB 'PRN'
HXR: DB 'HXR'
;
;
; END OF ASSEMBLY
;
TRPSIM: MVI C,EOF ; EMPTY LIST BUFFER
CALL LOSIM
JNC TRPSIM
TRPS1: CALL POSIM ; EMPTY HEX BUFFER
JNC TRPS1
CLOSAL: MVI C,CLOSE ; CLOSE ALL FILES
LXI D,LSTFCB
CALL BDOS
MVI C,CLOSE
LXI D,HEXFCB
CALL BDOS
JMP BOOT
;
;
;
; SIMULATE CONSOLE INPUT FOR PASS
; CONTROL OF ASSEMBLER.
; PASS 1 = SYMBOL TABLE
; PASS 2 = LISTING
; PASS 3 = HEX OBJECT FILE
;
CISIM: PUSH H ; SAVE ASSEMBLER REGISTERS
PUSH D
PUSH B
MVI A,0 ; SET NEXT RECORD POINTER TO ZERO
STA SRCFCB+32
STA CSTSF ; CLEAR CONSOLE STATUS FLAG
LXI H,SRCBUF+128
SHLD SRCPTR ; SET SRC PTR TO END OF BUFFER
POP B ; RESTORE ASM REGISTERS
POP D
LHLD PASSP ; LOAD POINTER TO PASS #
MOV A,M ; GET PASS
INX H
SHLD PASSP
POP H
RET
;
;
; TABLE OF PASS NUMBERS
;
PASST: DB '1230'
;
; CHARACTER INPUT SUBROUTINE
;
; CREATE A SOURCE BUFFER AND LOAD
; IT FROM THE DISK. AT EACH CALL
; SUPPLY ONE CHARCTER IN A REG.
; IF BUFFER EMPTY, CALL BDOS TO
; FILL IT. SET CARRY IF EOF IS
; FOUND IN FILE.
;
RISIM: PUSH H ; SAVE ASSM HL,DE
PUSH D
LXI D,SRCFCB; GET FCB ADDRESS
LHLD SRCPTR ; GET BUFFER POINTER
CALL BUFIN ; READ A BYTE
SHLD SRCPTR ; SAVE BUFFER POINTER
POP D ; RESTORE HL,DE
POP H
CPI EOF ; CHECK FOR EOF CHAR
STC ; SET EOF FLAG IN CARRY
RZ
CMC ; NOT EOF, ERASE MARK
RET
;
; LIST CHARACTER OUTPUT
;
; CREATE AN OUTPUT BUFFER AND
; PUT EACH CHAR IN UNTIL FULL.
; THEN WRITE CONTENTS TO DISK
; FILE AND RESET POINTER.
;
LOSIM: PUSH D
PUSH H
LHLD LSTPTR
LXI D,LSTFCB
CALL BUFOUT
SHLD LSTPTR
POP H
POP D
MOV A,C
RET
;
;
; PUNCH CHARACTER OUTPUT
;
; SIMILAR TO LIST OUTPUT
;
POSIM: PUSH D
PUSH H
LHLD HEXPTR
LXI D,HEXFCB
CALL BUFOUT
SHLD HEXPTR
POP H
POP D
MOV A,C
RET
;
;
; SOURCE BUFFER CONTROL
;
; REFILL BUFFER IF EMPTY, PUT NEXT CHARACTER IN A
;
; ENTER WITH FCB ADDRESS IN DE, BUFFER POINTER IN HL
;
; SAVES BC, RETURNS WITH CHAR IN A, BUFFER POINTER IN HL
;
BUFIN: MOV A,E ; COMPUTE END OF BUFFER
ADI SRCBUF+128-SRCFCB
CMP L
JNZ SRCB1
PUSH B
MVI C,READ
CALL REFILL
ANI 0FEH ; CHECK FOR GOOD READ
CPI 0
POP B
CNZ ERROR
SRCB1: MOV A,M
INX H
RET
;
;
; OUTPUT BUFFER CONTROL
;
; IF BUFFER FULL, WRITE CONTENTS TO DISK,
; PUT CHAR FROM C IN BUFFER.
;
; ENTER WITH FCB ADDR IN DE, BUFFER PTR IN HL,
; AND CHAR IN C.
; RETURN WITH BUFFER PTR IN HL,SAVE BC,SET CARRY AFTER
; BUFFER REFILL.
;
BUFOUT: MOV A,E ; COMPUTE END OF BUFFER
ADI 164
CMP L ; FULL?
STC ; CLEAR CARRY
CMC
JNZ BUFOU1 ; NOT FULL, STORE CHAR
PUSH B ; FULL, SAVE CHAR
MVI C,WRITE
CALL REFILL
CPI 0 ; GOOD WRITE?
POP B
CNZ ERROR
STC ; MARK REFILL
BUFOU1: MOV M,C ; STORE CHAR IN BUFFER
INX H ; MOVE PTR TO NEXT CHAR
RET
;
;
; BUFFER I/O ROUTINE
;
; ENTER WITH CP/M READ OR WRITE CODE
; IN BC AND FCB ADDRESS IN DE.
; RETURN WITH INITIALIZED BUFFER
; POINTER IN HL.
;
REFILL: LXI H,36 ; CALC START OF BUFFER
DAD D
PUSH H ; SAVE START OF BUFFER
PUSH D ; SAVE FCB ADDRESS
XCHG
PUSH B ; SAVE CP/M CODE
MVI C,SDMA
CALL BDOS ; SET DMA ADDRESS
POP B ; GET CP/M CODE
POP D ; GET FCB ADDRESS
CALL BDOS ; READ OR WRITE BUFFER
POP H ; SET PTR TO START OF BUFFER
RET
;
;
; CREATE AND OPEN A FILE WITH SAME NAME AS DEFAULT FCB
;
; ENTER WITH ADDRESS OF FCB IN DE, AND
; ADDRESS OF FILETYPE STRING IN BC.
;
MAKEF: LXI H,TFCB
PUSH D
PUSH B
LXI B,9
CALL LDIR ; MOVE FILENAME
POP H
LXI B,3
CALL LDIR ; MOVE FILETYPE
MVI C,FDELT
POP D
PUSH D
CALL BDOS ; DELETE FILE
MVI C,CREATE
POP D
PUSH D
CALL BDOS ; CREATE FILE
CPI 0FFH
CZ ERROR
MVI C,OPEN
POP D
PUSH D
CALL BDOS ; OPEN FILE
CPI 0FFH
CZ ERROR
POP D ; SET NEXT RECORD PTR IN FCB TO ZERO
LXI H,33
DAD D
MVI M,0
RET
;
;
; BLOCK MOVE (Z-80 LDIR INST)
;
LDIR: MOV A,M
STAX D
INX H
INX D
DCX B
XRA A
CMP C
JNZ LDIR
CMP B
JNZ LDIR
RET
;
; MEMORY SIZE TEST
;
MEMSIM: PUSH H
LHLD BDOS+1
MOV A,L
MOV B,H
POP H
RET
;
;
; CONSOLE STATUS CHECK
CSTSIM: LDA CSTSF ; CHECK CONSOLE STATUS
RET
; IOCHECK
;
IOSIM: MVI A,0A8H
RET
;
;
; ERROR HANDLER
;
ERROR: PUSH PSW
LXI D,ERRMES
MVI C,WCONB
CALL BDOS ; WRITE ERROR MESS
POP PSW
POP H ; GET ADDRESS OF CALLER
PUSH PSW
CALL OUTHHL ; GOTO CP/M AND PRINT IT
MVI C,'.'
CALL CO
POP PSW
CALL OUT2H ; PRINT ERROR TYPE
JMP CLOSAL ; CLEAN UP THE MESS
;
ERRMES: DB 'MACROASSEMBLER ERROR $'
;
;++++++++++++++++++++++++++++++++++++++++++++++
;
; HEXIDECIMAL REGISTER OUTPUT
;
; HEXOUT.LIB - VERSION 0.2 - 12 SEP 77
;
;++++++++++++++++++++++++++++++++++++++++++++++
; FUNCTIONS AVAILABLE:
;
; OUT2H PRINT 2 HEX DIGITS FROM A
; OUTHHL PRINT HL
OUTHHL: MOV A,H ; PRINT HL
CALL OUT2H
MOV A,L
OUT2H: PUSH PSW
CALL OUTHL
POP PSW
JMP OUTHR
OUTHL: RRC
RRC
RRC
RRC
OUTHR: ANI 0FH
ADI '0'
CPI '9'+1
JC OUTHR1
ADI '@'-'9'
OUTHR1: JMP OUTCH
CO: MOV A,C ; CHECK FOR PASS REQUEST
CPI '='
JNZ CO1
MVI A,0FFH ; SET CONSOLE STATUS
STA CSTSF
CO1: MOV A,C ; SIMULATE TDL CO
OUTCH: PUSH PSW ; CONSOLE OUTPUT
PUSH B
PUSH D
PUSH H
MVI C,WCON
MOV E,A
CALL BDOS
POP H
POP D
POP B
POP PSW
RET
; NEW MACROASSEMBLER I/O VECTOR TABLE
; TO OVERWRITE PRESENT ASSEMBLER VECTOR TABLE
ORG 0800H
MACRX: DS 6
JMP CISIM
JMP RISIM
JMP CO
JMP POSIM
JMP LOSIM
JMP CSTSIM
JMP IOSIM
JMP MEMSIM
JMP TRPSIM
END