home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpmug
/
cpmug035.ark
/
CLEAR.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
8KB
|
265 lines
; 8 SEPT 79; COMBINED CLEAR,BKGND,DSKIO,HEXOUT,DSKRD,
; OBJNULL FILES. GOT RID OF A FEW EQUATES.
;
* THIS ROUTINE TAKEES A COLOR IN THE LO-NYB OF A AND FILLS THE BACKGROUND
* BUFFER WITH IT
ORG 5170H
BAKBUF EQU 5092H
HICNT EQU 08H
CLEAR: PUSH B ;THIS ROUTINE DESTROYS BC
PUSH H ;AND HL REGISTER PAIRS
PUSH PSW
LHLD BAKBUF ;GET @ OF BUFFER TO FILL
ANI 0FH ;WE ONLY WANT THE LO-NYBBLE
MOV B,A
RLC ;MAKE HI-NYB = LO-NYB
RLC
RLC
RLC
ORA B
MOV B,A ;AND KEEP "TWINNED" BYTE IN B
MOV A,H
ADI HICNT
CLRLP: MOV M,B ;STORE BACKGND BYTE
INX H ;AT EACH SUCCESSIVE @
CMP H ;UNTIL WE'VE FILLED THE
JNZ CLRLP ;WHOLE VIDEO-BUFFER
POP PSW
POP H
POP B
RET
;30 AUG 79 : CORRECT HEADER COMMENT.
;
* THIS ROUTINE PUTS THE CURRENT BACKGROUND PICTURE INTO THE
* CURRENT WORKING BUFFER. IT IS ASSUMED THAT THE ADDRESS OF THE
* WORKING BUFFER ("ONBUF") IS IN THE WORD AT LOC. 5090H AND
* THE ADDRESS OF THE BACKGROUND BUFFER ("BAKBUF") IS IN THE WORD
* AT LOC. 5092H. NO REGISTERS ARE AFFECTED.
ORG 518CH
ONBUF EQU 5090H
BKGND: PUSH PSW ! PUSH D ! PUSH H
LHLD BAKBUF ;GET BACKGROUND ADDR INTO DE
XCHG
LHLD ONBUF ;GET WORKING BUFFER ADDR INTO HL
CALL MOV2K ;MOVE BACKGROUND TO WORKING BUFFER
POP H ! POP D ! POP PSW
RET
* THIS ROUTINE MOVES 2K BYTES FROM THE ADDRESS CONTAINED IN DE TO
* THE ADDRESS CONTAINED IN HL. HL AND DE BOTH END UP POINTING
* ONE BYTE PAST THEIR RESPECTIVE 2K BUFFERS. B AND C ARE UNAFFECTED.
*
MOV2K: PUSH B
MVI B,8 ;WE MOVE 8 SINGLE BUFFERS
PAGELP: MVI C,0 ;OF 256 BYTES EACH
BYTELP: LDAX D ;GET "FROM" BYTE
MOV M,A ;SEND IT TO "TO" POSITION
INX D
INX H ;INCREMENT BUFFER POINTERS
DCR C ;HAVE WE FINISHED SINGLE PAGE BUFFER?
JNZ BYTELP ;NO--MOVE NEXT BYTE
DCR B ;YES--HAVE WE FINISHED COMPLETELY?
JNZ BYTELP ;NO--GET NEXT SINGLE PAGE BUFFER
;(REMEMBER--LAST "DCR C" GAVE US ZERO IN C)
POP B
RET
* THE FOLLOWING ROUTINES ARE ALL DISK INPUT/OUTPUT ROUTINES FOR A CP/M
* SYSTEM.
*
* THE FIRST FOUR ROUTINES ALL TAKE ONE PARAMETER: THE ADDRESS OF THE
* DESIRED FCB IN THE DE REGISTER PAIR. SEE THE CPM MANUAL FOR A
* DESCRIPTION OF AN FCB.
BDOS EQU 05H
*THIS ROUTINE "OPENS" THE SPECIFIED FILE FOR DISK I/O.
*IF NO SUCH FILE EXISTS, A HEX FF IS RETURNED IN REGISTER A.
ORG 51B0H
OPEN: PUSH B ! PUSH D ! PUSH H
MVI C,15
CALL BDOS
POP H ! POP D ! POP B
RET
*
* THIS ROUTINE CLOSES THE SPECIFIED FILE. HEX FF IS RETURNED IN A
* IF NO SUCH FILE EXISTS.
CLOSE: PUSH B ! PUSH D ! PUSH H
MVI C,16
CALL BDOS
POP H ! POP D ! POP B
RET
*
* THIS ROUTINE READS THE NEXT 128 BYTES FROM THE SPECIFIED FILE INTO
* A BUFFER AREA. THE CP/M DEFAULT BUFFER AREA IS AT HEX 80, BUT
* THIS ADDRESS CAN BE CHANGED BY USE OF "DMASET" BELOW.
* IF THE READ WAS SUCCESSFUL, A ZERO IS RETURNED IN A;
* IF WE JUST READ PAST THE END-OF-FILE, A ONE IS RETURNED
* IF WE JUST READ AN EMPTY RECORD (IN RANDDOM ACCESS), A TWO IS RETURNED
READBF: PUSH B ! PUSH D ! PUSH H
MVI C,20
CALL BDOS
POP H ! POP D ! POP B
RET
*
* THIS ROUTINE WRITES THE 128 BYTES IN THE CURRENT BUFFER AREA TO THE
* SPECIFIED DISK FILE. THE BUFFER AREA ADDRESS SPECIFICATION IS THE SAME AS
* IN "READBF" ABOVE. THE RETURN VALUES (IN A) MEAN THE FOLLOWING:
* 0--SUCCESSFUL WRITE; 1--ERROR IN EXTEENDING FILE; 2--END OF DISK DATA;
* 255--FO MORE DIRECTORY SPACE.
WRTEBF: PUSH B ! PUSH D ! PUSH H
MVI C,21
CALL BDOS
POP H ! POP D ! POP B
RET
*
*THIS LAST ROUTINE IS USED TO CHANGE THE ADDRESS OF THE 128 BYTE BUFFER
* TO BE READ FROM OR WRITTEN TO. THE DESIRED BUFFER ADDRESS IS
* PASSED IN DE. THAT'S ALL THERE IS TO IT!
DMASET: PUSH B ! PUSH D ! PUSH H
MVI C,26
CALL BDOS
POP H ! POP D ! POP B
RET
ORG 51ECH
* THE FOLLOWING TWO ROUTINES ARE USED TO DISPLAY HEX NUMBERS
* ON THE CRT SCREEN. THE FIRST PRINTS TWO DIGITS FROM THE BYTE IN
* REGISTER A. THE SECOND PRINTS FOUR DIGITS FROM THE WORD IN
* THE HL PAIR.
*
* THIS ROUTINE TAKES A NUMBER IN A, PRINTS IT AS HEXADECIMAL.
* -THANKS TO PHIL BUTLER FOR ALGORITHM
CO EQU 502AH
HEXPRT: PUSH PSW
PUSH PSW ;SAVE A COPY OF NUMBER
RRC
RRC
RRC
RRC ;SLIDE HI-NYBBLE TO RIGHT 4 BITS
ANI 0FH ;STRIP OFF OTHER NYBBLE
CALL HCHOUT ;PRINT LEFT NYBBLE
POP PSW ;GET COPY BACK
ANI 0FH
CALL HCHOUT ;PRINT RIGHT NYBBLE
POP PSW
RET
*
HCHOUT: CPI 0AH ;HAVE WE A DIGIT (0-9) OR ALPHA?
JP ALPHA
ADI 30H
CALL CO ;WE MADE AN ASCII AND PRINTED IT
RET
ALPHA: ADI 37H
CALL CO ;WE MMADE AN ALPHABETIC ASCII & PRINTED IT
RET
*
* THIS ROUTINE TAKES A NUMBER IN HL AND PRINTS IT AS A FOUR
* DIGIT HEXADECIMAL NUMBER.
DISPHL: PUSH PSW
MOV A,H ;GET HI-BYTE
CALL HEXPRT ;PRINT IT
MOV A,L ;GET LO-BYTE
CALL HEXPRT ;PPRINT IT
POP PSW
RET
*
* THIS NEXT ROUTINE REALLY DOES NOT BELONG WITH THE OTHER TWO,
* BUT IT WOULD BE A CRIME TO PUT IT IN A FILE BY ITSELF. THEREFORE
* IT IS INCLUDED HERE FOR YOUR READING PLEASURE.
*
* "CONSTAT"
*
* THIS ROUTINE USES THE CP/M BUILT-IN-FUNCTION #11 TO INTERROGATE
* THE STATUS OF THE TTY. THE A REGISTER IS RETURNED WITH THE
* LEAST SIGNIFICANT BYTE = 1 IF THERE IS AN INPUT CHARACTER WAITING
* FROM THE KEYBOARD.
CONSTAT: PUSH B ! PUSH D ! PUSH H !
MVI C,11
CALL BDOS
POP H ! POP D ! POP B
RET
; 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.
ORG 5227H
PRINT EQU 502DH
CRLF EQU 5024H
DEFFCB EQU 05CH
BUFLEN EQU 080H
DEFBUF EQU 080H
STOP EQU '$'
DSKRD: 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
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
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
OBJW EQU 5009H
ORG 52DAH
* THIS ROUTINE USES A ROUTINE CALLED "OBALLW" (SEE BELOW) TO MAKE
* ALL THE FELIX OBJECTS NULL. IN OTHER WORDS, THE COLOR AND ORIENTATION
* ARE ZERO-ED OUT AND FF-80 IS STORED AS THE FIRST X-Y COORDINATE PAIR,
* THUS MARKING THE OBJECT HAS HAVING NO EXISTANCE.
OBJNULL: PUSH D ! PUSH PSW
MVI E,4 ;1ST X-COORD TO BE
MVI A,0FFH ;SPECIAL CODE MARKER
CALL OBALLW ;FOR ALL OBJECTS
INR E ;SPECIAL CODE TO BE
MVI A,80H ;END-OF-OBJECT
CALL OBALLW ;FOR ALL OBJECTS
XRA A ;COLOR => BLACK
MOV E,A
CALL OBALLW
INR E ;ZERO ORIENTAITON (NO SPIN)
CALL OBALLW ;FOR ALL OBJECTS
POP PSW ! POP D
RET
* THIS ROUTINE PUTS THE DESIRED VALUE (A) INTO THE DESIRED BYTE (E)
* OF EACH OF THE 16 LEGAL OBJECTS (0-15)
OBALLW: MVI D,15 ;OBJECTS 0-15
OWLOOP: CALL OBJW ;WRITE DESIRED BYTE
DCR D
JNC OWLOOP ;NEXT OBJECT
RET