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

  1. ; 12 SEPT 79
  2. ; LOADPROG: FELIX UTILITY FOR 'TRIMMING' .FEX FILES
  3. ;
  4. ; MOSHELL 12 SEPT 79
  5. ;
  6. ; THIS PROGRAM OFFERS OPTIONS: JUST-FEX-CODE,THAT PLUS
  7. ; OBJECTS, THAT PLUS BACKGROUND, OR THAT ALL PLUS THE
  8. ; EXEC MODULE. THE REQUESTED AMOUNT OF A GIVEN FILENAME
  9. ; IS LOADED INTO MEMORY (TYPICALLY AFTER OBJECTS/BACKGROUND
  10. ; HAVE BEEN SET UP) AND THE WHOLE MESS SAVED. 
  11. ;
  12. ; USE:   A>TRIMPROG FILENAME (CR)  -.FEX IS ASSUMED.
  13. ;
  14. CR    EQU    0DH
  15. LF    EQU    0AH
  16. MOV2K    EQU    503CH
  17. PRINT    EQU    502DH
  18. CHARIN    EQU    5027H
  19. SYSFCB EQU    5CH
  20. FCBMOV    EQU    5051H
  21. BIOS    EQU    5H
  22. DSKRD    EQU    5039H
  23. DISPHL    EQU    5045H
  24. CPM    EQU    0H
  25. CRLF    EQU    5024H
  26. ;
  27.     ORG    100H
  28. LOADPROG:LXI    SP,4000H    ;SAFELY UP IN 'ONBUF'.
  29.     CALL    SURVIVAL
  30.     LXI    H,RUNLOC    ;MOVE THE PROGRAM
  31.     LXI    D,GETLOC    ;TO SAFE SPOT
  32.     CALL    MOV2K        ;WE MOVE TOO MUCH,BUT NO
  33.     JMP    RUNLOC        ;BIG DEAL....
  34. ;
  35. ; THIS CHECKS TO SEE THAT BASE ROUTINES ARE THERE.CRASHES
  36. ; BACK TO CPM IF THEY AREN'T.
  37. ;
  38. SURVIVAL:LDA    5000H
  39.     CPI    0C3H
  40.     JNZ    BAD
  41.     LDA    5003H
  42.     CPI    0C3H
  43.     RZ        ;BOTH JUMPS THERE,PROLLY NO PROBLEM.
  44. BAD:    LXI    D,TEXT
  45.     MVI    C,9
  46.     CALL    BIOS
  47.     JMP    CPM
  48. TEXT:    DB    'PLEASE LOAD THE FELIX UTILITIES BY '
  49.     DB    ' TYPING "FELIX" FIRST.',CR,LF,'$'
  50. GETLOC    EQU    $    ;WE'LL DDT THE OBJECT CODE DOWN TO HERE.
  51. ;
  52.     ORG    3000H
  53. RUNLOC:    LXI    H,SYSFCB+9
  54.     MVI    M,'F'    ;SETUP FOR .FEX FILE.
  55.     INX    H
  56.     MVI    M,'E'
  57.     INX    H
  58.     MVI    M,'X'
  59.     LXI    H,MENU    !CALL    PRINT
  60.     CALL    CHARIN
  61.     CPI    'P'    ;PROGRAM ONLY?
  62.     JNZ    MAYBE$O
  63. ;
  64. ; WE SELECT ONE OPTION,SET CORRESPONDING LIMIT.
  65. ;
  66.     LXI    H,(0-1000H)
  67.     SHLD    LIMIT
  68.     JMP    GETPROG
  69. MAYBE$O:CPI    '0'    ;ZERO,MAYBE FOR O?
  70.     JZ    YEP$O
  71.     CPI    'O'    ;THE REAL O?
  72.     JNZ    MAYBE$B
  73. YEP$O:    LXI    H,(0-2000H)
  74.     SHLD    LIMIT
  75.     JMP    GETPROG
  76. MAYBE$B:LXI    H,(0-2800H); 'B' OR 'E' BOTH NEED
  77.     SHLD    LIMIT    ;THIS VALUE
  78.     CPI    'E'
  79.     JNZ    GETPROG
  80.     STA    EFLAG    ;IF 'E',REMEMBER THAT.
  81. GETPROG:CALL    CRLF
  82.     LXI    H,100H    ;WHERE TO PUT IT?
  83.     CALL    LDSKRD    ;READ FILE UP TO LIMIT.
  84.     LDA    EFLAG    ;HOW 'BOUT EXEC.OBJ?
  85.     ORA    A
  86.     JZ    WINDUP
  87. ;
  88. ; READ IN EXEC.OBJ AT 2800H.
  89. ;
  90.     LXI    H,EXECFCB
  91.     LXI    D,SYSFCB
  92.     CALL    FCBMOV
  93.     LXI    H,2800H
  94.     CALL    DSKRD    ;VANILLA ONE THIS TIME.
  95.     LXI    H,3000H
  96.     SHLD    LIMIT
  97. WINDUP:    LXI    H,ENDMSG
  98.     CALL    PRINT
  99.     LHLD    LIMIT
  100.     CALL    DISPHL
  101.     CALL    CRLF
  102.     JMP    CPM    ;SIMPLE,HUH?
  103. ;
  104. MENU:    DB    'SELECT ONE:',CR,LF
  105.     DB    'KEEP:PROGRAM  (P)',CR,LF
  106.     DB    '    :+OBJECTS (O)',CR,LF
  107.     DB    '    :+BACKGRND(B)',CR,LF
  108.     DB    'AND ADD EXEC  (E)',CR,LF,'$'
  109. ;
  110. ENDMSG:    DB    'LAST LOCATION: $'
  111. EXECFCB:DB    0,'EXEC    OBJ',0,0,0,0
  112.     ORG    EXECFCB+32
  113.     DB    0
  114. LIMIT:    DW    0
  115. EFLAG:    DB    0
  116. ;
  117. ;
  118. ; 1 AUG 79; MOD TO REDUCE BY 1 SECTOR THE READING (IT IS 
  119. ; OVERREADING NOW. MOSHELL)
  120. ;
  121. * THIS ROUTINE READS A SPECIFIED DISK FILE INTO A SPECIFIED MEMORY AREA.
  122. * THE STARTING ADDRESS OF THE MEMORY AREA IS PASSED BY THE CALLER IN
  123. * HL AND THE DISK FILE IS SPECIFIED BY A PROPERLY FORMED FCB IN THE  CP/M
  124. * DEFAULT FCB AREA (CURRENTLY HEX 5C).  THE READ IS DONE BY RE-SPECIFYING
  125. * THE READ BUFFER EACH TIME WE HAVE A SUCCESSFUL READ.  THUS THE BUFFER
  126. * IS FIRST AT THE DESIRED START ADDRESS AND IS CONTINUALLY INCREMENTED
  127. * IN BLOCKS OF "BUFLEN" (# OF BYTES READ IN EACH DISK READ OPERATION) UNTIL
  128. * THE ENTIRE FILE IS READ IN.
  129. * ALL REGISTERS (EXCEPT A) ARE SAVED.
  130. OPEN    EQU    500CH
  131. CLOSE    EQU    500FH
  132. READBF    EQU    5012H
  133. DMASET    EQU    5036H
  134. DEFFCB    EQU    05CH
  135. BUFLEN    EQU    080H
  136. DEFBUF    EQU    080H
  137. STOP    EQU    '$'
  138. LDSKRD:    PUSH    B ! PUSH D ! PUSH H
  139.     LXI    B,DEFBUF    ;GET @ OF DEFAULT BUFFER INTO B
  140.     LXI    D,DEFFCB    ;WE WILL WORK WITH THE DEFAULT FCB
  141.     CALL    OPEN    ;OPEN THE SPECIFIED FILE
  142.     CPI    0FFH    ;DOES IT EXIST?
  143.     JZ    OPENERR    ;NO--PRINT ERROR MESSAGE AND REBOOT
  144. * READ BUFFERS FROM DISK UNTIL THERE AREN'T ANY MORE LEFT
  145. RDLOOP:    LXI    D,DEFFCB
  146.     CALL    READBF
  147.     ORA    A
  148.     JNZ    NODATA    ;FINISHED,OR ERROR
  149.     LXI    B,DEFBUF;GET DEFAULT BUFF.ADDR
  150.     MVI    D,BUFLEN ;COUNTER FOR TRANSFER
  151. MOVELOOP: LDAX    B
  152.     MOV    M,A    ;STORE A BYTE
  153.     INX    H
  154.     CALL    CHECKLIM
  155.     JZ    OKEND
  156.     INX    B
  157.     DCR    D
  158.     JNZ    MOVELOOP
  159.     JMP    RDLOOP
  160. NODATA:    CPI    3    ;IS RETURN VALUE FROM READ THREE OR MORE?
  161.     JNC    RDERROR    ;YES--WE HAVE UNKNOWN RETURN VALUE:   THEREFORE--ERROR!
  162.     CALL    CLOSE    ;NO--WE'RE FINISHED AND WE CLOSE THE FILE
  163.     CPI    0FFH    ;HAS SOMETHING HAPPENED TO THE FILE?
  164.     JZ    CLOSERR    ;YES--TELL ABOUT IT  AND REBOOT
  165. OKEND:    SHLD    LIMIT
  166.     POP    H ! POP D ! POP B
  167.     RET
  168. OPENERR: LXI    H,MESS1    ;PRINT AN ERROR MESSAGE
  169.     CALL    PRINT
  170.     CALL    CRLF
  171.     JMP    0    ;REBOOT
  172. MESS1    DB    'WE HAVE NO FILE BY THAT NAME',STOP
  173. CLOSERR: LXI    H,MESS2    ;PRINT ERROR MESSAGE
  174.     CALL    PRINT
  175.     CALL    CRLF
  176.     JMP    0    ;REBOOT
  177. MESS2    DB    'CANNOT CLOSE FILE',STOP
  178. RDERROR: LXI    H,MESS3    ;PRINT ERROR MESSAGE AND REBOOT
  179.     CALL    PRINT
  180.     CALL    CRLF
  181.     JMP    0
  182. MESS3    DB    'FILE READ ERROR',STOP
  183. ;
  184. ; THIS  COMPARES HL TO 'LIMIT' IN MEMORY,SETS ZERO FLAG
  185. ; ACCORDINGLY.
  186. ;
  187. CHECKLIM:PUSH    D!PUSH    H
  188.     XCHG
  189.     LHLD    LIMIT
  190.     DAD    D
  191.     MOV    A,H
  192.     ORA    L    ;Z-FLAG NOW SET RIGHTLY.
  193.     POP    H!POP    D
  194.     RET
  195.