home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol017 / npgen.asm < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  442 lines

  1. ;        NEW BIOS BOOT MAINTENENCE PROGRAM
  2. ;
  3. ;PURPOSE
  4. ;        THIS PROGRAM PROVIDES THE MEANS TO SYSGEN A NEW
  5. ;    BIOS CP/M SYSTEM.  IT WRITES THE BOOT, BDOS AND BIOS TO
  6. ;    THE SYSTEM TRACKS OF DISK B.  IT CAN BE USED FOR MULTIPLE
  7. ;    GENERATIONS WITH AN OPTIONAL SYSTEM OBTAINED FROM DRIVE
  8. ;    A.
  9. ;DATE WRITTEN
  10. ;    MAY 23, 1980 WITH THE HELP OF S.J. SINGER'S PGEN PROGRAM
  11. ;OUTLINE
  12. ;    TO GENERATE A NEW SYSTEM, DO THE FOLLOWING:
  13. ;        DDT CPMXX.COM<RETURN>   (XX = MEMORY SIZE)
  14. ;        -M1180,1F80,980
  15. ;        -I21BIOS.HEX
  16. ;        -H1780,NNNN        (NNNN = START OF BIOS,
  17. ;                        SEE ASSEMBLY LISTING.)
  18. ;          XXXX YYYY
  19. ;        -RYYYY            (LOADS BIOS)
  20. ;        -^C
  21. ;        NPGEN<RETURN>
  22. ;        GET SYSTEM (Y/N)? N
  23. ;        PUT SYSTEM (Y/N)? Y
  24. ;         ETC.
  25. ;    TOGENERATE FROM AN OLD SYSTEM, JUST RUN NPGEN TELLING
  26. ;    IT TO GET THE SYSTEM FROM DRIVE A.
  27. ;
  28. ;
  29.     MACLIB    MACRO            ;INCLUDE MACROS
  30. FALSE    EQU    00H
  31. TRUE    EQU    NOT FALSE
  32. ;
  33. SPOOL    EQU    FALSE            ;TRUE FOR KLH SPOOLER
  34. ;
  35. ;
  36. MSIZE    EQU    61            ;MEMORY SIZE IN KBYTES
  37. CBASE    EQU    (MSIZE-20)*1024
  38. CPMB    EQU    CBASE+3400H        ;START OF CP/M
  39. BDOS    EQU    CPMB+0800H        ;START OF BDOS (ROUNDED TO
  40. ;                     EVEN SECTOR BOUNDARY)
  41. BIOS    EQU    CPMB+1600H        ;START OF BIOS
  42.     IF    SPOOL
  43. JMPDSP    EQU    033H+9    ;DISPLACEMENT TO SPECIAL BIOS JUMPS
  44.     ENDIF
  45.     IF    NOT SPOOL
  46. JMPDSP    EQU    033H    ;DISPLACEMENT TO SPECIAL BIOS JUMPS
  47.     ENDIF
  48. TPA    EQU    100H
  49. RDCON    EQU    1
  50. WRBUF    EQU    9
  51. START    EQU    900H
  52. FBYTE    EQU    97FH            ;DISK FORMAT BYTE LOCATION
  53. ;
  54. ;
  55. ;
  56.     ORG    TPA
  57. ;
  58. ;
  59.     LXI    H,0            ;ZERO HL
  60.     DAD    SP            ;GET OLD STACK POINTER
  61.     SHLD    OLDSTK            ;AND SAVE IT
  62.     LHLD    1
  63.     SHLD    SAVADR
  64.     LXI    SP,STACK
  65. MAIN:    PRINT    <CR,LF,LF,'      NEW BIOS SYSGEN PROGRAM VERS 2.0'>
  66.     PRINT    <CR,LF,LF>
  67.     CALL    GET$BOOTER
  68.     CALL    PUT$BOOTER
  69.     JMP    REBOOT
  70. ;
  71. ;
  72. SELDSK:                ;SELECT DISK
  73.     PUSH    H
  74.     LHLD    1
  75.     MVI    L,00H+JMPDSP
  76.     XTHL
  77.     RET
  78. ;
  79. ;
  80. HOME:                ;HOME DISK
  81.     PUSH    H
  82.     LHLD    1
  83.     MVI    L,03H+JMPDSP
  84.     XTHL
  85.     RET
  86. ;
  87. ;
  88. SEEK:                ;SEEK TRACK
  89.     PUSH    H
  90.     LHLD    1
  91.     MVI    L,06H+JMPDSP
  92.     XTHL
  93.     RET
  94. ;
  95. ;
  96. READ:                ;READ A SECTOR
  97.     PUSH    H
  98.     LHLD    1
  99.     MVI    L,09H+JMPDSP
  100.     XTHL
  101.     RET
  102. ;
  103. WRITE:                ;WRITE A SECTOR
  104.     PUSH    H
  105.     LHLD    1
  106.     MVI    L,0CH+JMPDSP
  107.     XTHL
  108.     RET
  109. ;
  110. ;
  111. GET$BOOTER:            ;MAYBE A BOOTER COMES IN
  112.     PRINT    <CR,LF,LF,'GET SYSTEM (Y/N) '>
  113.     CHARIN
  114.     CPI    'Y'
  115.     RNZ            ;RETURN IF NOT YES
  116.     PRINT    <CR,LF,'READING SYSTEM FROM DRIVE A, TYPE RETURN '>
  117.     CHARIN
  118.     CPI    3        ;IS IT CONTROL C
  119.     JZ    MAIN
  120.     MVI    A,0FFH
  121.     STA    RDFLG        ;SET FLAG
  122.     CALL    DO$READ
  123.     RET            ;DONE
  124. ;
  125. ;
  126. PUT$BOOTER:            ;DOES THE BOOTER GO OUT?
  127.     PRINT    <CR,LF,'PUT SYSTEM (Y/N) '>
  128.     CHARIN
  129.     CPI    3        ;CONTROL C
  130.     JZ    MAIN
  131.     CPI    'Y'
  132.     RNZ            ;EXIT IF NO
  133. PUT$AGAIN:            ;ELSE START TO PUT
  134.     PRINT    <CR,LF,'WRITING SYSTEM TO DRIVE B, TYPE RETURN '>
  135.     CHARIN
  136.     CPI    3        ;CHECK FOR CONTROL C
  137.     JZ    MAIN
  138.     CALL    READ$FMT        ;READ T 0 S 1 FROM DESTINATION DISK
  139.     CALL    MOVE$BOOT
  140.     PRINT    <CR,LF,'THE DESTINATION DISK FORMAT IS - '>
  141.     CALL    WRITE$FMT
  142.     LDA    FMFLG        ;CHECK IF KNOWN FORMAT
  143.     ORA    A
  144.     CNZ    GET$FORMAT
  145. ;        *** TEMPORARY ***
  146.     LDA    FBYTE        ;MUST BE SINGLE DENSITY
  147.     CPI    020H        ;128-BYTE SECTORS.
  148.     JNZ    FMT$ERR        
  149. ;        *** END OF TEMPORARY ***
  150.     CALL    DO$WRITE    ;NOW PUT IT OUT
  151.     PRINT    <CR,LF,LF,'AGAIN (Y/N) '>
  152.     CHARIN
  153.     CPI    'Y'
  154.     JZ    PUT$AGAIN    ;WRITE IT AGAIN
  155.     RET            ;ALL DONE
  156. ;        *** TEMPORARY ***
  157. FMT$ERR:
  158.     PRINT    <CR,LF,'*** FORMAT MUST BE SD 128... ***'>
  159.     RET
  160. ;        *** TEMPORARY ***
  161. ;
  162. ;
  163. REBOOT:                ;PULL BACK CP/M
  164.     PRINT    <CR,LF,LF,'REBOOTING CP/M, TYPE RETURN '>
  165.     CHARIN
  166.     MVI    C,0
  167.     CALL    SELDSK        ;SELECT DRIVE 0
  168.     LHLD    SAVADR
  169.     SHLD    1
  170.     LHLD    OLDSTK        ;RECOVER ORIGINAL STACK POINTER
  171.     SPHL            ;RESTORE IT
  172.     JMP    0
  173.  
  174.  
  175.  
  176. ;************************************************
  177. ;*    READ IN ALL SYSTEM TRACKS ASSUMING    *
  178. ;*    SD 128-BYTE SECTORS FOR ALL.        *
  179. ;************************************************
  180.  
  181. DO$READ:            ;READ IN THE BOOTER
  182.     MVI    C,0        ;SELECT DISK
  183.     CALL    SELDSK
  184.     CALL    TIME
  185.     CALL    HOME        ;MAKE SURE IT'S INITIALIZED
  186.     LXI    B,1        ;B=TRK C=SECTOR
  187.     LXI    H,START        ;START OF AREA.
  188. DR$LOOP:                ;THEN PUT IT OUT
  189.     PUSH    B
  190.     PUSH    H
  191.     PUSH    B
  192.     MOV    C,B        ;SEEK TRACK.
  193.     CALL    SEEK
  194.     POP    B
  195.     POP    H        ;RESTORE BUFFER PTR.
  196.     PUSH    H
  197.     CALL    READ        ;READ A SECTOR.
  198.     POP    H
  199.     POP    B
  200.     LXI    D,128        ;BUMP BUFFER PTR.
  201.     DAD    D
  202.     INR    C        ;BUMP SECTOR PTR.
  203.     MOV    A,C        ;END OF TRACK?
  204.     CPI    26+1
  205.     JC    DR$LOOP        ;...NO.
  206.     MVI    C,1        ;RESET SECTOR.
  207.     INR    B        ;BUMP TRACK PTR.
  208.     MOV    A,B        ;END OF SYSTEM TRACKS?
  209.     CPI    1+1
  210.     JC    DR$LOOP        ;...NO.
  211.     RET
  212.  
  213.  
  214.  
  215. ;************************************************
  216. ;*    WRITE OUT ALL SYSTEM TRACKS ASSUMING    *
  217. ;*    SD 128-BYTE SECTORS FOR ALL.        *
  218. ;************************************************
  219.  
  220. DO$WRITE:            ;READ IN THE BOOTER
  221.     MVI    C,1        ;SELECT DISK
  222.     CALL    SELDSK
  223.     CALL    TIME
  224.     CALL    HOME        ;MAKE SURE IT'S INITIALIZED
  225.     LXI    B,1        ;B=TRK C=SECTOR
  226.     LXI    H,START        ;START OF AREA.
  227. DW$LOOP:                ;THEN PUT IT OUT
  228.     PUSH    B
  229.     PUSH    H
  230.     PUSH    B
  231.     MOV    C,B        ;SEEK TRACK.
  232.     CALL    SEEK
  233.     POP    B
  234.     POP    H        ;RESTORE BUFFER PTR.
  235.     PUSH    H
  236.     CALL    WRITE        ;READ A SECTOR.
  237.     POP    H
  238.     POP    B
  239.     LXI    D,128        ;BUMP BUFFER PTR.
  240.     DAD    D
  241.     INR    C        ;BUMP SECTOR PTR.
  242.     MOV    A,C        ;END OF TRACK?
  243.     CPI    26+1
  244.     JC    DW$LOOP        ;...NO.
  245.     MVI    C,1        ;RESET SECTOR.
  246.     INR    B        ;BUMP TRACK PTR.
  247.     MOV    A,B        ;END OF SYSTEM TRACKS?
  248.     CPI    1+1
  249.     JC    DW$LOOP        ;...NO.
  250.     RET
  251. ;
  252. ;
  253. MOVE$BOOT:            ;MOVE BOOT CODE TO 900H
  254.     LXI    H,900H        ;POINT TO MEMORY
  255.     LXI    D,BOOT        ;POINT TO BOOT CODE
  256.     MVI    C,ENDBOOT-BOOT    ;LENGTH OF CODE
  257. MLOOP:    LDAX    D        ;GET A BYTE
  258.     MOV    M,A        ;STORE IT
  259.     INX    H
  260.     INX    D        ;INCR POINTERS
  261.     DCR    C        ;BYTE COUNT
  262.     JNZ    MLOOP
  263.     MVI    A,0C7H        ;RESTART ZERO INSTRUCTION
  264.     STA    97DH        ;PUT IT IN BUFFER TOO
  265.     RET
  266. ;
  267. GET$FORMAT:            ;READ DISK FORMAT FROM CONSOLE AND SET FBYTE
  268.     PRINT    <CR,LF,'DO YOU WISH TO WRITE A FMT CODE ON THE DISK? (Y/N) '>
  269.     CHARIN
  270.     CPI    'Y'
  271.     RNZ
  272. GF1:    PRINT    <CR,LF,'IS DISK SINGLE DENSITY? (Y/N) '>
  273.     CHARIN
  274.     CPI    'Y'
  275.     MVI    A,20H        ;SINGLE DENSITY CODE
  276.     JZ    GF2
  277.     MVI    A,10H        ;DOUBLE DENSITY CODE
  278. GF2:    STA    FBYTE        ;SAVE IN FBYTE
  279.     PRINT    <CR,LF,'DOES DISK HAVE 128 BYTE SECTORS? (Y/N) '>
  280.     CHARIN
  281.     CPI    'Y'
  282.     MVI    B,0        ;128 BYTE CODE
  283.     JZ    GFE
  284.     PRINT    <CR,LF,'DOES DISK HAVE 256 BYTE SECTORS? (Y/N) '>
  285.     CHARIN
  286.     CPI    'Y'
  287.     MVI    B,1        ;256 BYTE CODE
  288.     JZ    GFE
  289.     PRINT    <CR,LF,'DOES DISK HAVE 512 BYTE SECTORS? (Y/N) '>
  290.     CHARIN
  291.     CPI    'Y'
  292.     MVI    B,2        ;512 BYTE CODE
  293.     JZ    GFE
  294.     PRINT    <CR,LF,'DOES DISK HAVE 1024 BYTE SECTORS? (Y/N) '>
  295.     CHARIN
  296.     CPI    'Y'
  297.     MVI    B,3        ;1024 BYTE CODE
  298.     JZ    GFE
  299.     PRINT    <CR,LF,'*** DEFAULTING TO 128 BYTE SECTORS.'>
  300.     MVI    B,0
  301. GFE:    LDA    FBYTE
  302.     ORA    B        ;OR IN THE BYTE CODE
  303.     STA    FBYTE
  304.     RET
  305. ;
  306. READ$FMT:            ;READ FORMAT CODE FROM DESTINATION DISK
  307.     MVI    C,1        ;SELECT THE DISK
  308.     CALL    SELDSK
  309.     CALL    TIME
  310.     CALL    HOME
  311.     CALL    TIME
  312.     LXI    H,START
  313.     MVI    C,1
  314.     CALL    READ        ;READ DRIVE B TRACK 0 SECTOR 1
  315.     RET
  316. ;
  317. WRITE$FMT:            ;DECODE FORMAT BYTE AND DISPLAY
  318.     MVI    A,0FFH
  319.     STA    FMFLG        ;SET FLAG TO KNOWN FORMAT
  320.     LDA    FBYTE
  321.     CPI    20H
  322.     JNZ    WF2
  323.     PRINT    <'SINGLE DENSITY 128 BYTE SECTORS',CR,LF>
  324.     RET
  325. WF2:    CPI    22H
  326.     JNZ    WF3
  327.     PRINT    <'SINGLE DENSITY 512 BYTE SECTORS',CR,LF>
  328.     RET
  329. WF3:    CPI    23H
  330.     JNZ    WF4
  331.     PRINT    <'SINGLE DENSITY 1024 BYTE SECTORS',CR,LF>
  332.     RET
  333. WF4:    CPI    10H
  334.     JNZ    WF5
  335.     PRINT    <'DOUBLE DENSITY 128 BYTE SECTORS',CR,LF>
  336.     RET
  337. WF5:    CPI    11H
  338.     JNZ    WF6
  339.     PRINT    <'DOUBLE DENSITY 256 BYTE SECTORS',CR,LF>
  340.     RET
  341. WF6:    CPI    12H
  342.     JNZ    WF7
  343.     PRINT    <'DOUBLE DENSITY 512 BYTE SECTORS',CR,LF>
  344.     RET
  345. WF7:    CPI    13H
  346.     JNZ    WF8
  347.     PRINT    <'DOUBLE DENSITY 1024 BYTE SECTORS',CR,LF>
  348.     RET
  349. WF8:    PRINT    <'NO FORMAT CODE ON DISK',CR,LF>
  350.     XRA    A
  351.     STA    FMFLG        ;SET FLAG FOR NO FORMAT
  352.     RET
  353. ;
  354. TIME:    LXI    B,3000H        ;TIMING DELAY
  355. DELAY:    DCX    B
  356.     MOV    A,B
  357.     ORA    C
  358.     JNZ    DELAY
  359.     RET
  360. ;
  361. OLDSTK:    DW    0        ;STORAGE FOR OLD STACK POINTER
  362. SAVADR:    DW    0
  363. RDFLG    DB    0            ;INDICATES BOOTER READ FROM DISK
  364. FMFLG    DB    0            ;INDICATES FORMAT FLAG ON DEST DISK
  365. ;
  366. ;
  367. ;
  368. ;        BDOS/BIOS BOOT LOADER
  369. ;
  370. ;THIS IS A MODIFICATION OF TARBELL'S BOOT LOADER DESIGNED TO RUN AT 0H
  371. ;THE CODE IS MOVED TO 900H BY PGEN WITH THE PROPER FORMAT CODE IN THE
  372. ;LAST BYTE FOR WRITING ON THE SYSTEM TRACK OF A PASCAL DISK.
  373. ;THE PROGRAM LOADS 51 SECTORS FROM DISK WHEN EXECUTED STARTING WITH
  374. ;TRACK 0 SECTOR 2.
  375. ;
  376. ;
  377. DISK    EQU    0F8H        ;BASE ADDR FOR DISK I/O PORTS
  378. DCOM    EQU    DISK
  379. DSTAT   EQU    DISK
  380. TRACK   EQU    DISK+1
  381. SECT    EQU    DISK+2
  382. DDATA   EQU    DISK+3
  383. WAIT    EQU    DISK+4
  384. NS    EQU    51        ;NUMBER OF SECTORS TO LOAD
  385. ;
  386. OFFSET    EQU    00H        ;BOOT OFFSET 
  387. ;
  388. ;
  389. ;
  390. BOOT:
  391.     MVI    E,10
  392. BLOOP:
  393.     LXI    SP,100H
  394.      MVI    D,NS        ;D CONTAINS SECTOR COUNT
  395.     LXI    H,BDOS        ;STARTING LOAD ADDR FOR PROGRAM
  396.     MVI    C,2        ;SECTOR NUMBER.
  397. RNTRK:    MVI    B,4        ;FOR HEAD LOAD.
  398. RNSEC:    CALL    BREAD-BOOT+OFFSET ;READ A SECTOR.
  399.     DCR    D        ;IF DONE.
  400.     JZ    BIOS        ;GO TO CP/M.
  401.     MVI    B,0        ;FOR NO HEAD LOAD.
  402.     INR    C        ;INCR TRACK COUNT.
  403.     MOV    A,C        ;DONE WITH
  404.     CPI    26+1        ;THIS TRACK?
  405.     JC    RNSEC-BOOT+OFFSET ;...NO.
  406.     MVI    A,053H        ;ISSUE STEP COMMAND.
  407.     OUT    DCOM
  408.     IN    WAIT        ;WAIT UNTIL DONE.
  409.     MVI    C,1        ;RESET SECTOR NUMBER.
  410.     JMP    RNTRK-BOOT+OFFSET
  411. ;
  412. BREAD:
  413.     MOV    A,C        ;SET SECTOR.
  414.     OUT    SECT
  415.     MVI    A,088H        ;GET READ CMD.
  416.     ORA    B        ;GET HEAD LOAD BIT.
  417.     OUT    DCOM        ;ISSUE IT.
  418. RLOOP:
  419.     IN    WAIT        ;WAIT FOR DRQ
  420.     ORA    A
  421.     JP    CHECK-BOOT+OFFSET ;JUMP IF DONE
  422.     IN    DDATA
  423.     MOV    M,A
  424.     INX    H
  425.     JMP    RLOOP-BOOT+OFFSET
  426. ;
  427. CHECK:
  428.     IN    DSTAT        ;READ STATUS.
  429.     ANI    09DH
  430.     RZ
  431.     DCR    E
  432.     JNZ    BLOOP-BOOT+OFFSET
  433.     STA    EC-BOOT+OFFSET
  434. HERE:
  435.     JMP    HERE-BOOT+OFFSET
  436. ;
  437. EC:    DS    1
  438. ENDBOOT:
  439.     DS    128        ;LOTS OF SPACE FOR STACK
  440. STACK:    EQU    $
  441.     END
  442.