home *** CD-ROM | disk | FTP | other *** search
- ; 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
-