home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol008 / pgen.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  3.4 KB  |  218 lines

  1. BIOSSZ    EQU    512
  2. ;
  3. TPA    EQU    100H
  4. ;
  5. ;
  6. ;    PASCAL BOOT MAINTENCE PROGRAM
  7. ;
  8. ;        BOOTER MAY BE READ IN FROM CURRENT PASCAL DISK AND MOVED
  9. ;        ONTO ANY NUMBER OF NEW DISKETTES
  10. ;
  11. ;    THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC.
  12. ;
  13. ;
  14. BOOT    EQU    0
  15. BDOS    EQU    5
  16. RDCON    EQU    1
  17. WRBUF    EQU    9
  18. START    EQU    900H
  19. ENDPT    EQU    START+128+256+768+BIOSSZ    ;BOOT+PINIT+SPARE+BIOS
  20. NSECTS    EQU    (ENDPT-START)/128
  21. FSTSCT    EQU    1
  22. ;
  23. CR    EQU    0DH
  24. LF    EQU    0AH
  25. EOM    EQU    '$'
  26. ;
  27. ;
  28. ;
  29.     ORG    TPA
  30. ;
  31. ;
  32.     LXI    SP,STACK
  33. MAIN:
  34.     CALL    SAY$TITLE
  35.     CALL    GET$BOOTER
  36.     CALL    PUT$BOOTER
  37.     JMP    REBOOT
  38. ;
  39. ;
  40. HOME:                ;HOME DISK
  41.     LHLD    BOOT+1
  42.     MVI    L,18H
  43.     PCHL
  44. ;
  45. SELDSK:                ;SELECT DISK
  46.     LHLD    BOOT+1
  47.     MVI    L,1BH
  48.     PCHL
  49. ;
  50. SETTRK:                ;SET TRACK
  51.     LHLD    BOOT+1
  52.     MVI    L,1EH
  53.     PCHL
  54. ;
  55. SETSEC:                ;SET SECTOR
  56.     LHLD    BOOT+1
  57.     MVI    L,21H
  58.     PCHL
  59. ;
  60. SETDMA:                ;SET DMA ADDRESS
  61.     LHLD    BOOT+1
  62.     MVI    L,24H
  63.     PCHL
  64. ;
  65. READ:                ;READ A SECTOR
  66.     LHLD    BOOT+1
  67.     MVI    L,27H
  68.     PCHL
  69. ;
  70. WRITE:                ;WRITE A SECTOR
  71.     LHLD    BOOT+1
  72.     MVI    L,2AH
  73.     PCHL
  74. ;
  75. ;
  76. SAY$TITLE:            ;JUST SAY WHO WE ARE
  77.     MVI    C,WRBUF
  78.     LXI    D,HELLO$MSG
  79.     CALL    BDOS
  80.     RET
  81. ;
  82. ;
  83. GET$BOOTER:            ;MAYBE A BOOTER COMES IN
  84.     MVI    C,WRBUF
  85.     LXI    D,GET$MSG
  86.     CALL    BDOS
  87.     CALL    CK$YES
  88.     RC            ;THAT'S ALL FOR HERE
  89.     MVI    C,WRBUF
  90.     LXI    D,READ$MSG    ;SAY HEY
  91.     CALL    BDOS
  92.     CALL    WAIT$FOR$RET    ;AND WAIT
  93.     CALL    DO$READ
  94.     RET            ;DONE
  95. ;
  96. ;
  97. PUT$BOOTER:            ;DOES THE BOOTER GO OUT?
  98.     MVI    C,WRBUF        ;ASK
  99.     LXI    D,PUT$MSG
  100.     CALL    BDOS
  101.     CALL    CK$YES        ;IF THE ANSWER IS NOT YES
  102.     RC            ;LEAVE
  103. PUT$AGAIN:            ;ELSE START TO PUT
  104.     MVI    C,WRBUF
  105.     LXI    D,WRITE$MSG
  106.     CALL    BDOS        ;DO ANOTHER CONFIRM MSG
  107.     CALL    WAIT$FOR$RET    ;AND HOLD UP
  108.     CALL    DO$WRITE    ;NOW PUT IT OUT
  109.     MVI    C,WRBUF        ;IS THIS A LOOP?
  110.     LXI    D,AGAIN$MSG
  111.     CALL    BDOS
  112.     CALL    CK$YES
  113.     JNC    PUT$AGAIN    ;GUESS SO
  114.     RET            ;ALL DONE
  115. ;
  116. ;
  117. REBOOT:                ;PULL BACK CP/M
  118.     MVI    C,WRBUF
  119.     LXI    D,REBOOT$MSG
  120.     CALL    BDOS
  121.     CALL    WAIT$FOR$RET
  122.     JMP    BOOT
  123. ;
  124. ;
  125. CK$YES:                ;CHECK FOR A YES RESPONSE
  126.     MVI    C,RDCON
  127.     CALL    BDOS
  128.     CPI    03H        ;DON'T FORGET ^C
  129.     JZ    BOOT
  130.     CPI    'Y'        ;UPPER CASE
  131.     RZ
  132.     CPI    79H        ;AND LOWER
  133.     RZ
  134.     STC            ;NOT THERE
  135.     RET
  136. ;
  137. ;
  138. WAIT$FOR$RET:            ;HANG AROUND
  139.     MVI    C,RDCON
  140.     CALL    BDOS
  141.     CPI    03H        ;TEST FOR REBOOT REQUEST
  142.     JZ    BOOT
  143.     CPI    CR        ;LEAVE WHEN READY
  144.     JNZ    WAIT$FOR$RET
  145.     RET
  146. ;
  147. ;
  148. DO$READ:            ;READ IN THE BOOTER
  149.     MVI    C,0        ;SELECT DISK
  150.     CALL    SELDSK
  151.     CALL    HOME        ;MAKE SURE IT'S INITIALIZED
  152.     LXI    B,START        ;SET WHERE WE START IN RAM
  153.     LXI    D,NSECTS SHL 8 + FSTSCT ;SIZE AND THE FIRST SECTOR
  154. DR$LOOP:                ;THEN PUT IT OUT
  155.     PUSH    B
  156.     PUSH    D
  157.     CALL    SETDMA
  158.     POP    D
  159.     MOV    C,E
  160.     PUSH    D
  161.     CALL    SETSEC
  162.     CALL    READ
  163.     POP    D
  164.     POP    B
  165.     LXI    H,128
  166.     DAD    B
  167.     MOV    B,H
  168.     MOV    C,L
  169.     INR    E
  170.     DCR    D
  171.     JNZ    DR$LOOP
  172.     RET
  173. ;
  174. ;
  175. DO$WRITE:            ;WRITE OUT THE BOOTER
  176.     MVI    C,0        ;SELECT THE DISK
  177.     CALL    SELDSK
  178.     CALL    HOME
  179.     LXI    B,START
  180.     LXI    D,NSECTS SHL 8 + FSTSCT
  181. DW$LOOP:            ;ALL PARAMS SET - RUN IT OUT
  182.     PUSH    B
  183.     PUSH    D
  184.     CALL    SETDMA
  185.     POP    D
  186.     MOV    C,E
  187.     PUSH    D
  188.     CALL    SETSEC
  189.     CALL    WRITE
  190.     POP    D
  191.     POP    B
  192.     LXI    H,128
  193.     DAD    B
  194.     MOV    B,H
  195.     MOV    C,L
  196.     INR    E
  197.     DCR    D
  198.     JNZ    DW$LOOP
  199.     RET
  200. ;
  201. ;
  202. ;
  203. HELLO$MSG:    DB    CR,LF,'Pgen Version 1.0',CR,LF,EOM
  204. GET$MSG:    DB    CR,LF,'Get Booter?(y/n)',eom
  205. READ$MSG:    DB    CR,LF,'Reading Booter from drive A, type return ',eom
  206. PUT$MSG:    DB    CR,LF,LF,'Put Booter?(y/n)',eom
  207. WRITE$MSG:    DB    CR,LF,'Writing Booter to drive A, type return ',eom
  208. AGAIN$MSG:    DB    CR,LF,'Again?(y/n)',eom
  209. REBOOT$MSG:    DB    CR,LF,LF,'Rebooting CP/M, type return ',eom
  210. ;
  211. ;
  212.     DS    256
  213. STACK    EQU    $
  214. ;
  215. ;
  216. ;
  217.     END    TPA
  218.