home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug035.ark / CLEAR.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  8KB  |  265 lines

  1. ; 8 SEPT 79; COMBINED CLEAR,BKGND,DSKIO,HEXOUT,DSKRD,
  2. ; OBJNULL FILES. GOT RID OF A FEW EQUATES.
  3. ;
  4. * THIS ROUTINE TAKEES  A COLOR IN THE LO-NYB OF A AND FILLS THE BACKGROUND
  5. *  BUFFER WITH IT
  6.     ORG    5170H
  7. BAKBUF    EQU    5092H
  8. HICNT    EQU    08H
  9. CLEAR:    PUSH    B        ;THIS ROUTINE DESTROYS BC
  10.     PUSH    H        ;AND HL REGISTER PAIRS
  11.     PUSH    PSW
  12.     LHLD    BAKBUF        ;GET @ OF BUFFER TO FILL
  13.     ANI    0FH        ;WE ONLY WANT THE LO-NYBBLE
  14.     MOV    B,A
  15.     RLC            ;MAKE HI-NYB = LO-NYB
  16.     RLC
  17.     RLC
  18.     RLC
  19.     ORA    B
  20.     MOV    B,A        ;AND KEEP "TWINNED" BYTE IN B
  21.     MOV    A,H
  22.     ADI    HICNT
  23. CLRLP:    MOV    M,B        ;STORE BACKGND BYTE
  24.     INX    H        ;AT EACH SUCCESSIVE @
  25.     CMP    H        ;UNTIL WE'VE FILLED THE
  26.     JNZ    CLRLP        ;WHOLE VIDEO-BUFFER
  27.     POP    PSW
  28.     POP    H
  29.     POP    B
  30.     RET
  31. ;30 AUG 79 : CORRECT HEADER COMMENT.
  32. ;
  33. * THIS ROUTINE PUTS THE CURRENT BACKGROUND PICTURE INTO THE
  34. * CURRENT WORKING BUFFER.  IT IS ASSUMED THAT THE ADDRESS OF THE
  35. * WORKING BUFFER ("ONBUF") IS IN THE WORD AT LOC. 5090H AND
  36. * THE ADDRESS OF THE BACKGROUND BUFFER  ("BAKBUF") IS IN THE WORD
  37. * AT LOC. 5092H.  NO REGISTERS ARE AFFECTED.
  38.     ORG    518CH
  39. ONBUF    EQU    5090H
  40. BKGND:    PUSH    PSW ! PUSH  D ! PUSH  H
  41.     LHLD    BAKBUF    ;GET BACKGROUND  ADDR  INTO DE
  42.     XCHG
  43.     LHLD    ONBUF    ;GET WORKING  BUFFER ADDR INTO HL
  44.     CALL    MOV2K    ;MOVE BACKGROUND TO WORKING BUFFER
  45.     POP    H ! POP D !  POP PSW
  46.     RET
  47. * THIS ROUTINE MOVES 2K BYTES FROM THE ADDRESS CONTAINED IN DE TO
  48. * THE ADDRESS CONTAINED  IN HL.  HL AND DE BOTH END UP POINTING
  49. * ONE BYTE PAST THEIR RESPECTIVE 2K BUFFERS.   B AND C ARE UNAFFECTED.
  50. *
  51. MOV2K:    PUSH    B
  52.     MVI    B,8    ;WE MOVE 8 SINGLE BUFFERS
  53. PAGELP:    MVI    C,0    ;OF 256 BYTES EACH
  54. BYTELP:    LDAX    D    ;GET "FROM" BYTE
  55.     MOV    M,A    ;SEND  IT TO "TO" POSITION
  56.     INX    D
  57.     INX    H    ;INCREMENT BUFFER POINTERS
  58.     DCR    C    ;HAVE WE FINISHED SINGLE PAGE BUFFER?
  59.     JNZ    BYTELP    ;NO--MOVE NEXT BYTE
  60.     DCR    B    ;YES--HAVE WE FINISHED COMPLETELY?
  61.     JNZ    BYTELP    ;NO--GET NEXT SINGLE PAGE BUFFER
  62.             ;(REMEMBER--LAST "DCR C" GAVE US ZERO IN C)
  63.     POP    B
  64.     RET
  65. * THE FOLLOWING ROUTINES ARE ALL DISK INPUT/OUTPUT ROUTINES FOR A CP/M
  66. * SYSTEM.
  67. *
  68. * THE FIRST FOUR ROUTINES ALL TAKE ONE PARAMETER:  THE ADDRESS OF THE
  69. * DESIRED FCB IN THE DE REGISTER PAIR.  SEE THE CPM MANUAL FOR A
  70. * DESCRIPTION OF AN FCB.
  71. BDOS    EQU    05H
  72. *THIS ROUTINE "OPENS" THE SPECIFIED FILE FOR DISK I/O.
  73. *IF NO SUCH FILE EXISTS, A HEX FF IS RETURNED IN REGISTER A.
  74.     ORG    51B0H
  75. OPEN:    PUSH    B ! PUSH D ! PUSH H
  76.     MVI    C,15
  77.     CALL    BDOS
  78.     POP    H ! POP D ! POP B
  79.     RET
  80. *
  81. * THIS ROUTINE  CLOSES THE SPECIFIED FILE.   HEX FF IS RETURNED IN A
  82. * IF NO SUCH FILE EXISTS.
  83. CLOSE:    PUSH    B ! PUSH D ! PUSH H
  84.     MVI    C,16
  85.     CALL    BDOS
  86.     POP    H ! POP D ! POP B
  87.     RET
  88. *
  89. * THIS ROUTINE READS THE NEXT 128 BYTES FROM THE SPECIFIED FILE INTO
  90. * A BUFFER AREA.  THE CP/M DEFAULT BUFFER AREA IS AT HEX 80, BUT
  91. * THIS ADDRESS CAN  BE CHANGED BY USE OF "DMASET" BELOW.
  92. * IF THE READ WAS SUCCESSFUL, A ZERO IS RETURNED IN A;
  93. * IF WE JUST READ PAST THE END-OF-FILE, A ONE IS RETURNED
  94. * IF WE JUST READ AN  EMPTY RECORD (IN RANDDOM ACCESS), A TWO IS RETURNED
  95. READBF:    PUSH    B ! PUSH D ! PUSH H
  96.     MVI    C,20
  97.     CALL    BDOS
  98.     POP    H ! POP D ! POP B
  99.     RET
  100. *
  101. * THIS ROUTINE WRITES THE 128 BYTES IN THE CURRENT BUFFER AREA TO  THE
  102. * SPECIFIED DISK FILE.  THE BUFFER AREA ADDRESS SPECIFICATION IS THE SAME AS
  103. * IN "READBF" ABOVE.  THE RETURN VALUES (IN A) MEAN THE FOLLOWING:
  104. * 0--SUCCESSFUL WRITE; 1--ERROR IN EXTEENDING FILE; 2--END OF DISK DATA;
  105. * 255--FO MORE DIRECTORY SPACE.
  106. WRTEBF:    PUSH    B ! PUSH D ! PUSH H
  107.     MVI    C,21
  108.     CALL    BDOS
  109.     POP    H ! POP D ! POP B
  110.     RET
  111. *
  112. *THIS LAST ROUTINE IS USED TO CHANGE THE ADDRESS OF THE 128 BYTE BUFFER
  113. * TO BE READ FROM OR WRITTEN TO.  THE DESIRED BUFFER ADDRESS IS
  114. * PASSED IN DE.   THAT'S ALL THERE IS TO IT!
  115. DMASET:    PUSH    B ! PUSH D ! PUSH H
  116.     MVI    C,26
  117.     CALL    BDOS
  118.     POP    H ! POP D ! POP B
  119.     RET
  120.     ORG    51ECH
  121. * THE FOLLOWING TWO ROUTINES ARE USED TO DISPLAY HEX NUMBERS
  122. * ON THE CRT SCREEN.  THE FIRST PRINTS TWO DIGITS FROM THE BYTE IN
  123. * REGISTER A.  THE SECOND PRINTS FOUR DIGITS FROM THE WORD IN
  124. * THE HL PAIR.
  125. *
  126. * THIS ROUTINE TAKES A NUMBER IN A, PRINTS IT AS HEXADECIMAL.
  127. *        -THANKS TO PHIL BUTLER FOR ALGORITHM
  128. CO    EQU    502AH
  129. HEXPRT:    PUSH    PSW
  130.     PUSH    PSW    ;SAVE A  COPY OF NUMBER
  131.     RRC
  132.     RRC
  133.     RRC
  134.     RRC        ;SLIDE HI-NYBBLE TO RIGHT 4 BITS
  135.     ANI    0FH    ;STRIP OFF OTHER NYBBLE
  136.     CALL    HCHOUT    ;PRINT LEFT NYBBLE
  137.     POP    PSW    ;GET COPY BACK
  138.     ANI    0FH
  139.     CALL    HCHOUT    ;PRINT RIGHT NYBBLE
  140.     POP    PSW
  141.     RET
  142. *
  143. HCHOUT:    CPI    0AH    ;HAVE WE A DIGIT (0-9) OR ALPHA?
  144.     JP    ALPHA
  145.     ADI    30H
  146.     CALL    CO    ;WE MADE AN ASCII AND PRINTED IT
  147.     RET
  148. ALPHA:    ADI    37H
  149.     CALL    CO    ;WE MMADE AN ALPHABETIC ASCII & PRINTED IT
  150.     RET
  151. *
  152. * THIS ROUTINE TAKES A NUMBER IN HL AND PRINTS IT AS A FOUR
  153. * DIGIT HEXADECIMAL NUMBER.
  154. DISPHL:    PUSH    PSW
  155.     MOV    A,H    ;GET HI-BYTE
  156.     CALL    HEXPRT    ;PRINT IT
  157.     MOV    A,L    ;GET LO-BYTE
  158.     CALL    HEXPRT    ;PPRINT IT
  159.     POP    PSW
  160.     RET
  161. *
  162. * THIS NEXT ROUTINE REALLY DOES NOT BELONG WITH THE OTHER TWO,
  163. * BUT IT WOULD BE A CRIME TO PUT IT IN A FILE BY ITSELF.  THEREFORE
  164. * IT IS INCLUDED HERE FOR YOUR READING PLEASURE.
  165. *
  166. * "CONSTAT"
  167. *
  168. * THIS ROUTINE USES THE CP/M BUILT-IN-FUNCTION #11 TO INTERROGATE
  169. * THE STATUS OF THE TTY.  THE A REGISTER IS RETURNED WITH THE
  170. * LEAST SIGNIFICANT BYTE = 1 IF THERE IS AN INPUT CHARACTER WAITING
  171. * FROM THE KEYBOARD.
  172. CONSTAT: PUSH    B ! PUSH D ! PUSH H !
  173.     MVI    C,11
  174.     CALL    BDOS
  175.     POP    H ! POP D ! POP B
  176.     RET
  177. ; 1 AUG 79; MOD TO REDUCE BY 1 SECTOR THE READING (IT IS 
  178. ; OVERREADING NOW. MOSHELL)
  179. ;
  180. * THIS ROUTINE READS A SPECIFIED DISK FILE INTO A SPECIFIED MEMORY AREA.
  181. * THE STARTING ADDRESS OF THE MEMORY AREA IS PASSED BY THE CALLER IN
  182. * HL AND THE DISK FILE IS SPECIFIED BY A PROPERLY FORMED FCB IN THE  CP/M
  183. * DEFAULT FCB AREA (CURRENTLY HEX 5C).  THE READ IS DONE BY RE-SPECIFYING
  184. * THE READ BUFFER EACH TIME WE HAVE A SUCCESSFUL READ.  THUS THE BUFFER
  185. * IS FIRST AT THE DESIRED START ADDRESS AND IS CONTINUALLY INCREMENTED
  186. * IN BLOCKS OF "BUFLEN" (# OF BYTES READ IN EACH DISK READ OPERATION) UNTIL
  187. * THE ENTIRE FILE IS READ IN.
  188. * ALL REGISTERS (EXCEPT A) ARE SAVED.
  189.     ORG    5227H
  190. PRINT    EQU    502DH
  191. CRLF    EQU    5024H
  192. DEFFCB    EQU    05CH
  193. BUFLEN    EQU    080H
  194. DEFBUF    EQU    080H
  195. STOP    EQU    '$'
  196. DSKRD:    PUSH    B ! PUSH D ! PUSH H
  197.     LXI    B,DEFBUF    ;GET @ OF DEFAULT BUFFER INTO B
  198.     LXI    D,DEFFCB    ;WE WILL WORK WITH THE DEFAULT FCB
  199.     CALL    OPEN    ;OPEN THE SPECIFIED FILE
  200.     CPI    0FFH    ;DOES IT EXIST?
  201.     JZ    OPENERR    ;NO--PRINT ERROR MESSAGE AND REBOOT
  202. * READ BUFFERS FROM DISK UNTIL THERE AREN'T ANY MORE LEFT
  203. RDLOOP:    LXI    D,DEFFCB
  204.     CALL    READBF
  205.     ORA    A
  206.     JNZ    NODATA    ;FINISHED,OR ERROR
  207.     LXI    B,DEFBUF;GET DEFAULT BUFF.ADDR
  208.     MVI    D,BUFLEN ;COUNTER FOR TRANSFER
  209. MOVELOOP: LDAX    B
  210.     MOV    M,A    ;STORE A BYTE
  211.     INX    H
  212.     INX    B
  213.     DCR    D
  214.     JNZ    MOVELOOP
  215.     JMP    RDLOOP
  216. NODATA:    CPI    3    ;IS RETURN VALUE FROM READ THREE OR MORE?
  217.     JNC    RDERROR    ;YES--WE HAVE UNKNOWN RETURN VALUE:   THEREFORE--ERROR!
  218.     CALL    CLOSE    ;NO--WE'RE FINISHED AND WE CLOSE THE FILE
  219.     CPI    0FFH    ;HAS SOMETHING HAPPENED TO THE FILE?
  220.     JZ    CLOSERR    ;YES--TELL ABOUT IT  AND REBOOT
  221.     POP    H ! POP D ! POP B
  222.     RET
  223. OPENERR: LXI    H,MESS1    ;PRINT AN ERROR MESSAGE
  224.     CALL    PRINT
  225.     CALL    CRLF
  226.     JMP    0    ;REBOOT
  227. MESS1    DB    'WE HAVE NO FILE BY THAT NAME',STOP
  228. CLOSERR: LXI    H,MESS2    ;PRINT ERROR MESSAGE
  229.     CALL    PRINT
  230.     CALL    CRLF
  231.     JMP    0    ;REBOOT
  232. MESS2    DB    'CANNOT CLOSE FILE',STOP
  233. RDERROR: LXI    H,MESS3    ;PRINT ERROR MESSAGE AND REBOOT
  234.     CALL    PRINT
  235.     CALL    CRLF
  236.     JMP    0
  237. MESS3    DB    'FILE READ ERROR',STOP
  238. OBJW    EQU    5009H
  239.     ORG    52DAH
  240. * THIS ROUTINE USES A ROUTINE CALLED "OBALLW" (SEE BELOW) TO MAKE
  241. * ALL THE FELIX OBJECTS NULL.  IN OTHER WORDS, THE COLOR AND ORIENTATION
  242. * ARE ZERO-ED OUT AND FF-80 IS STORED AS THE FIRST X-Y COORDINATE PAIR,
  243. * THUS MARKING THE OBJECT HAS HAVING NO EXISTANCE.
  244. OBJNULL: PUSH    D ! PUSH PSW
  245.     MVI    E,4    ;1ST X-COORD TO BE
  246.     MVI    A,0FFH    ;SPECIAL CODE MARKER
  247.     CALL    OBALLW    ;FOR ALL OBJECTS
  248.     INR    E    ;SPECIAL CODE TO BE
  249.     MVI    A,80H    ;END-OF-OBJECT
  250.     CALL    OBALLW    ;FOR ALL OBJECTS
  251.     XRA    A    ;COLOR => BLACK
  252.     MOV    E,A
  253.     CALL    OBALLW
  254.     INR    E    ;ZERO ORIENTAITON (NO SPIN)
  255.     CALL    OBALLW    ;FOR ALL OBJECTS
  256.     POP    PSW    ! POP D
  257.     RET
  258. * THIS ROUTINE PUTS THE DESIRED VALUE (A) INTO THE DESIRED BYTE (E)
  259. * OF EACH OF THE 16 LEGAL OBJECTS (0-15)
  260. OBALLW:    MVI    D,15    ;OBJECTS 0-15
  261. OWLOOP:    CALL    OBJW    ;WRITE DESIRED BYTE
  262.     DCR    D
  263.     JNC    OWLOOP    ;NEXT OBJECT
  264.     RET
  265.