home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug040.ark / PGEN.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  4.2 KB  |  247 lines

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