home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / ccp / autoboot.lbr / AUTOBOOT.AZM / AUTOBOOT.ASM
Assembly Source File  |  1987-03-07  |  5KB  |  237 lines

  1. ;    AUTOBOOT.ASM
  2. ;
  3. ;    INSTALL OR REMOVE AUTO BOOT SEQUENCE   3/4/80
  4. ;
  5. ;    WRITTEN BY JOHN MOORHEAD
  6. ;
  7. ;    THIS PROGRAM WILL INSTALL OR REMOVE AN AUTO BOOT
  8. ;    MESSAGE OR COMMAND FILE NAME.  THIS MODIFICATION
  9. ;    IS PERMANANTLY STORED ON THE CURRENTLY LOGGED DISK.
  10. ;
  11. ;    THIS PROGRAM WORKS WITH BOTH CP/M VERSIONS 1.4 AND 2.X.
  12. ;    IT LOADS THE FIRST 128 BYTES OF THE CP/M CCP MODULE
  13. ;    INTO RAM AT 80 HEX.  THIS IS ASSUMED TO BE ON TRACK
  14. ;    0, LOGICAL SECTOR 1.  IF THE USER TYPES 'I' TO
  15. ;    INSTALL THE AUTO BOOT FILE NAME OR COMMAND, THE PROGRAM
  16. ;    WILL PROMPT THE USER FOR SAID ITEM.  THE PROGRAM WILL
  17. ;    INSERT THAT TEXT STRING INTO THE CCP CONSOLE BUFFER
  18. ;    ALONG WITH THE LENGTH.    IT THEN WRITES THIS MODIFIED
  19. ;    SECTOR OF THE CCP BACK TO THE DISK.  'REMOVE' WORKS
  20. ;    THE SAME WAY, EXCEPT THAT IT SETS THE LENGTH OF THE
  21. ;    INPUT BUFFER STRING TO 0 AT HEX 87, AND WRITES 16
  22. ;    HEX 20'S STARTING AT 88 HEX.  THIS IS THEN RE-WRITTEN
  23. ;    OUT TO THE DISK.
  24. ;
  25. ;    WHEN CP/M WARM BOOTS IT CHECKS THE CONSOLE BUFFER TO
  26. ;    SEE IF IT HAS ANYTHING IN IT.  IF IT DOES, CP/M READS
  27. ;    IT AND PERFORMS THE FUNCTION.
  28. ;
  29. ;    MODIFICATION LOG
  30. ;
  31. ;    5/21/84 LRB
  32. ;
  33. ;    MODIFIED PROGRAM TO ACCESS LOGICAL SECTOR 1.
  34. ;    ALSO, THE PROGRAM SETS THE TRACK AND SECTOR
  35. ;    JUST BEFORE THE WRITE IN THE INSTALL
  36. ;    AND REMOVE ROUTINES.  SEEMS TO WORK WITH AND NOT
  37. ;    WITHOUT THIS CODE.
  38. ;
  39. ;
  40. BDOS    EQU    5
  41. CR    EQU    0DH    ;ASCII CARRIAGE RETURN
  42.  
  43.     ORG 100H
  44.  
  45.     JMP    START
  46.  
  47. ;THE CBIOS JUMP TABLE IS MOVED HERE
  48.  
  49. BOOT:    DS    3
  50. WBOOT:    DS    3
  51. CONST:    DS    3
  52. CONIN:    DS    3
  53. CONOUT:    DS    3
  54. LIST:    DS    3
  55. PUNCH:    DS    3
  56. READER:    DS    3
  57. HOME:    DS    3
  58. SELDSK:    DS    3
  59. SETTRK:    DS    3
  60. SETSEC:    DS    3
  61. SETDMA:    DS    3
  62. READ:    DS    3
  63. WRITE:    DS    3
  64. LISTST:    DS    3    ;ABOVE 15 FOR CP/M 1.4; LAST 2 FOR
  65. SECTRAN:DS    3    ;CP/M 2.X COMPATIBILITY.
  66.  
  67. START:    LXI    SP,STACK
  68.     LHLD    1    ;GET WARM BOOT ADDRESS
  69.     DCX    H
  70.     DCX    H
  71.     DCX    H
  72.     LXI    D,BOOT    ;DESTINATION ADDRESS
  73.     MVI    B,17*3    ;NUMBER OF BYTES TO MOVE
  74.     CALL    MOVE    ;MOVE THE CBIOS JUMP TABLE
  75.     LXI    B,80H
  76.     CALL    SETDMA    ;SET DMA ADDRESS TO 80H
  77.     MVI    C,0
  78.     CALL    SETTRK    ;SET TRACK TO 0
  79.     MVI    C,1
  80.     CALL    SETSEC    ;SET SECTOR TO 1
  81.     CALL    READ    ;READ IN FIRST SECTOR OF CPM
  82.  QQ:    CALL    CRLF
  83.     CALL    PRINT
  84.     DB    'INSTALL OR REMOVE AUTO BOOT SEQUENCE ON',CR
  85.     CALL    PRINT
  86.     DB    'CURRENTLY LOGGED DISK? (I OR R)',CR
  87.     CALL    CRLF
  88.     CALL    PRINT
  89.     DB    'NOTE - IT IS IMPOSSIBLE TO INSTALL A',CR
  90.     CALL    PRINT
  91.     DB    'SUBMIT COMMAND, AS THE SUBMIT PROGRAM',CR
  92.     CALL    PRINT
  93.     DB    'WILL LOOK AT THE BUFFER AND RE-SUBMIT',CR
  94.     CALL    PRINT
  95.     DB    'ITSELF AD-INFINITUM...',CR
  96.     CALL    CRLF
  97.     CALL    INPUT    ;GET REPLY
  98.     CPI    'I'
  99.     JZ    INSTALL
  100.     CPI    'R'
  101.     JZ    REMOVE
  102.     JMP    QQ
  103.  
  104. ;CONSOLE INPUT ROUTINE
  105.  
  106. INPUT:    PUSH    H
  107.     PUSH    D
  108.     PUSH    B
  109.     MVI    C,1    ;GET CONSOLE INPUT
  110.     CALL    5
  111.     CPI    60H
  112.     JC    IN1
  113.     SUI    20H    ;CONVERT TO UPPER CASE
  114. IN1:    POP    B
  115.     POP    D
  116.     POP    H
  117.     RET
  118.  
  119. CRLF:    CALL    PRINT
  120.     DB    CR
  121.     RET
  122.  
  123. ;PRINTS ASCII STRINGS POINTED TO BY TOP OF STACK
  124. ;TO CONSOLE.
  125.  
  126. PRINT:    XTHL        ;GET STRING POINTER
  127.     PUSH    PSW
  128.     PUSH    B
  129. PO1:    MOV    A,M
  130.     INX    H
  131.     CPI    '@'    ;NO CR IF @ IS END OF STRING
  132.     JZ    NOCR
  133.     CALL    COUT
  134.     CPI    CR    ;CARRIAGE RET?
  135.     JZ    THEEND
  136.     JMP    PO1
  137. THEEND:
  138.     CALL    PRINT
  139.     DB    0AH,'@'
  140. NOCR:    POP    B
  141.     POP    PSW
  142.     XTHL
  143.     RET
  144.  
  145. ;CONSOLE OUTPUT ROUTINE
  146.  
  147. COUT:    PUSH    PSW
  148.     PUSH    B
  149.     PUSH    D
  150.     PUSH    H
  151.     MOV    E,A
  152.     MVI    C,2    ;WRITE CONSOLE
  153.     CALL    5
  154.     POP    H
  155.     POP    D
  156.     POP    B
  157.     POP    PSW
  158.     RET
  159.  
  160. ;GENERAL PURPOSE MEMORY TO MEMORY BLOCK MOVE ROUTINE
  161. ;HL POINT TO THE SOURCE,  DE POINT TO THE DESTINATION
  162. ;THE B REGISTER HAS THE COUNT.
  163.  
  164. MOVE:    MOV    A,M
  165.     STAX    D
  166.     INX    H
  167.     INX    D
  168.     DCR    B
  169.     JNZ    MOVE
  170.     RET
  171.  
  172. ;THIS ROUTINE GETS THE TEXT STRING FOR THE AUTO BOOT
  173. ;SEQUENCE AND THEN MOVES IT INTO THE CCP CONSOLE BUFFER.
  174.  
  175. INSTALL:
  176.     CALL    CRLF
  177.     CALL    CRLF
  178.     CALL    PRINT
  179.     DB    'ENTER COMMAND STRING YOU WISH TO AUTO EXECUTE'
  180.     DB    CR
  181.     CALL    PRINT
  182.     DB    'EXACTLY AS DESIRED - NO BACKSPACES ALLOWED!'
  183.     DB    CR
  184.     CALL    CRLF
  185.     LXI    H,INSTL    ;LOCATION OF ENTERED STRING
  186.     MVI    B,0    ;COUNT FOR MOVE ROUTINE
  187. INST1:    CALL    INPUT
  188.     CPI    CR
  189.     JZ    INST2
  190.     MOV    M,A
  191.     INX    H
  192.     INR    B
  193.     JMP    INST1    ;DIDN'T TYPE CR YET, SO GET MORE STUFF
  194. INST2:    MVI    M,0    ;WAS A CR, SO LAST BYTE IS A 00
  195.     INR    B
  196.     MOV    A,B
  197.     STA    87H    ;INDICATE LENGTH OF STRING
  198.     LXI    D,88H
  199.     LXI    H,INSTL    ;MOVE TYPED TEXT STRING TO 88H
  200.     CALL    MOVE
  201.     MVI    C,0
  202.     CALL    SETTRK
  203.     MVI    C,1
  204.     CALL    SETSEC
  205.     CALL    WRITE    ;WRITE SECTOR TO DISK
  206.     CALL    CRLF
  207.     CALL    CRLF
  208.     CALL    PRINT
  209.     DB    'CP/M AUTO BOOT SEQUENCE INSTALLED',CR
  210.     JMP    0
  211.  
  212. ;THIS ROUTINE CLEARS THE CCP CONSOLE BUFFER
  213.  
  214. REMOVE:    LXI    H,REMV
  215.     LXI    D,87H
  216.     MVI    B,11H
  217.     CALL    MOVE
  218.     MVI    C,0
  219.     CALL    SETTRK
  220.     MVI    C,1
  221.     CALL    SETSEC
  222.     CALL    WRITE
  223.     CALL    CRLF
  224.     CALL    CRLF
  225.     CALL    PRINT
  226.     DB    'CP/M AUTO BOOT SEQUENCE REMOVED',CR
  227.     JMP    0
  228.  
  229. ;THESE ARE THE STRINGS WHICH ARE PUT IN TH
  230. ;CCP CONSOLE BUFFER
  231.  
  232. INSTL:    DS    16
  233. REMV:    DB    0,'                '
  234.     DS    256
  235. STACK:
  236.     END    100H
  237.