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
/
FELIX.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
4KB
|
170 lines
;8 SEPT 79 : DELETE DOUBLE QUOTE MARK.
;
; FELIX.COM - THIS PROGRAM READS IN FELIX.OBJ AFTER
; VERIFYING THAT THERE IS MEMORY FOR IT TO READ INTO.
; IT ALSO READS IN THE SIN:COSINE TABLE 'SINCOS.OBJ'.
; IT THEN CLEARS OUT ALL 16 OBJECTS VIA CALLING
; 'OBJNULL' AND SIGNS ON,IDENTIFYING THE VERSION AND
; SIZE OF THIS FELIX SYSTEM.
;
; NOTE THAT A CHECK IS MADE OF LOCATION 'VERSION'
; (5095H IN 'TABLE') AND A MESSAGE PRINTED IF THE
; FELIX.COM IS A DIFFERENT VERSION THAN THIS FELIX.OBJ
; MODULE.
;
; VERSION 2.1 OF 14 AUG.79 HAS VERSION-NUMBER 0.
; EACH REVISION WILL HAVE NEXT NR.SEE FIRST LINE
; OF THIS HEADER FOR CURRENT VERSION.
VERSION EQU 5095H
VER$NR EQU 0 ;2.1 OF 14 AUG.79 IS VERSION 0.
MEMSIZE EQU 32 ;SIZE NEEDED IN KBYTES.
BIOS EQU 5
CPM EQU 0
OBJW EQU 5009H
TABST EQU 4000H
FLXST EQU 5000H
ORG 100H
;
; FIRST WE CHECK TO SEE IF WE HAVE ENOUGH MEMORY
;
FELIX: LXI H,1024*MEMSIZE-10
MOV B,M ;STASH SOME OF IT
MVI M,0AAH ;AND TRY WRITING MEMORY
MOV A,M ;AND READING BACK
MOV M,B ;AND FIXING THE TEST-SPOT.
CPI 0AAH ;DID IT WRITE AND READ?
JZ OK
;
; NOT ENOUGH RAM IN THIS MACHINE FOR THIS SYSTEM.
;
LXI D,BADMSG
CALL PRINT
JMP CPM
;
BADMSG: DB 'THIS MACHINE HASNT ENOUGH MEMORY FOR THIS'
DB ' 32K VERSION OF FELIX.SORRY.',0DH,0AH,'$'
;
OK: LXI SP,TABST
LXI D,TABFCB
LXI H,TABST
CALL DSKRD
LXI D,FLXFCB
LXI H,FLXST
CALL DSKRD
CALL OBJNULL
;
; NOW WE CHECK THAT WE LOADED CORRECT VERSION OF
; 'FELIX.OBJ'.
;
LDA VERSION
CPI VER$NR
JZ GOODLOG
;
;WE DIDN'T; VERSION NRS DON'T MATCH.
;
LXI D,NOTMATCH
CALL PRINT
JMP CPM
;
NOTMATCH:DB 'WARNING:FELIX UTILITY ROUTINES'
DB ' ARE NOT VERSION 2.1 (14 AUG 79).GOOD LUCK.'
DB 0DH,0AH,'$'
;
GOODLOG:LXI D,SIGNON
CALL PRINT
JMP CPM
;
SIGNON: DB 'FELIX VERSION 2.1 (14 AUG 79). WELCOME.',0DH,0AH,'$'
TABFCB DB 0,'SINCOS ','OBJ',0,0,0,0
ORG TABFCB+32
DB 0
FLXFCB DB 0,'FELIX ','OBJ',0,0,0,0
ORG FLXFCB+32
DB 0
OBJNULL: PUSH D ! PUSH PSW
MVI E,4 ;1ST X-COORD TO BE
MVI A,0FFH ;SPECIAL CODE
CALL OBALLW ;FOR ALL OBJECTS
INR E ;SPECIAL CODE
MVI A,80H ;TO BE END-OF-OBJECT MARKER
CALL OBALLW ;FOR ALL OBJECTS
XRA A ;ZERO COLOR (BLACK)
MOV E,A
CALL OBALLW
INR E ;AND ORIENTATION BYTES
CALL OBALLW ;FOR ALL OBJECTS
POP PSW ! POP D
RET
* PUT DESIRED VALUE (A) IN DESIRED BYTE (E) OF EACH OF THE
* 16 LEGAL OBJECTS
OBALLW: PUSH D
MVI D,15 ;ALL 16 OBJECTS (0-15)
OWLOOP: CALL OBJW ;WRITE DESIRED BYTE
DCR D
JNZ OWLOOP ;NEXT OBJECT
CALL OBJW ;OBJECT ZERO
POP D
RET
BUFSIZ EQU 128
DEFBUF EQU 80H
CR EQU 0DH
LF EQU 0AH
STOP EQU '$'
* SPECIAL VERSION OF "DSKRD". SEE FELIX SYSTEM ROUTINE FOR COMMENTS
DSKRD: LXI B,BUFSIZ ;GET SIZE OF DMA BUFFERS
CALL OPEN ;OPEN DISK FILE WHOSE FCB IS POINTED TO BY DE
CPI 255 ;DOES IT EXIST?
JZ OPENERR ;NO--PRINT ERROR MESSAGE AND REBOOT
* READ BUFFERS FROM DISK UNTIL THERE AREN'T ANY MORE LEFT
RDLOOP: XCHG ;GET CURRENT READ BUFFER @ INTO DE
CALL DMASET ;TELL CP/M TO WRITE DISK DATA THERE
XCHG ;RETURN FCB @ TO DE
CALL READ ;GET THE NEXT 128 BYTES
ORA A ;ARE WE FINISHED (OR FOUND AN ERROR)?
JNZ NODATA ;YES--FIND OUT WHICH AND TAKE CARE OF IT
DAD B ;POINT HL TO NEXT BUFFER TO WRITE TO
JMP RDLOOP
NODATA: CPI 3 ;IS RETURN VALUE FROM "READ" 3 OR MORE?
JNC RDERROR ;YES--ERROR FOUND
CALL CLOSE ;NO--WE'RE FINISHED SO WE CLOSE THE FILE
CPI 255 ;HAS SOMETHING HAPPENED TO THE FILE?
JZ CLOSERR ;YES--TELL ABOUT IT AND REBOOT
LXI D,DEFBUF
CALL DMASET ;RESET READ BUFFER TO CP/M DEFAULT
RET
OPENERR: LXI D,MESS1 ;PRINT ERROR MESSAGE & REBOOT
CALL PRINT
JMP 0
MESS1 DB 'FELIX ERROR IN OPENING FILE',CR,LF,STOP
CLOSERR: LXI D,MESS2 ;DITTO
CALL PRINT
JMP 0
MESS2 DB 'FELIX FILE CLOSE ERROR',CR,LF,STOP
RDERROR: LXI D,MESS3 ;SAME HERE
CALL PRINT
JMP 0
MESS3 DB 'FELIX READ ERROR',CR,LF,STOP
OPEN PUSH B ! PUSH D ! PUSH H
MVI C,15
CALL 5
POP H ! POP D ! POP B
RET
CLOSE PUSH B ! PUSH D ! PUSH H
MVI C,16
CALL 5
POP H ! POP D ! POP B
RET
READ PUSH B ! PUSH D ! PUSH H
MVI C,20
CALL 5
POP H ! POP D ! POP B
RET
DMASET PUSH B ! PUSH D ! PUSH H
MVI C,26
CALL 5
POP H ! POP D ! POP B
RET
PRINT: MVI C,9
JMP BIOS
END