home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / sysutl / sgen2.lbr / SGEN.MZC / SGEN.MAC
Encoding:
Text File  |  1987-08-29  |  9.8 KB  |  349 lines

  1. ;
  2. ;
  3. ;
  4. ;=============================================================
  5. ;  <SGEN> - CP/M MULTI-TRACK SYSTEM GENERATION UTILITY       =
  6. ;           USED FOR NORMAL OR LARGE ( > 2 SYSTEM TRACKS)    =
  7. ;           SYSTEM GENERATION.  MAY BE USED IN PLACE OF      =
  8. ;           SYSGEN.                                          =
  9. ;  DONALD E. KILLEN    REV 1.00    19 NOV 80                 =
  10. ;=============================================================
  11. ;
  12. ;  MENU / PROMPT DRIVEN, SIMILAR TO SYSGEN, EXCEPT THAT SGEN
  13. ;  WILL ASK USER FOR THE NUMBER OF SYSTEM TRACKS TO WRITE.
  14. ;
  15. ;  NOTE:  REMEMBER TO TELL XBOOTXX.HEX HOW MANY TOTAL SECTORS
  16. ;         ARE IN THE SYSTEM, NOT INCLUDING THE BOOT ITSELF
  17. ;         (WHICH IS 1 SECTOR LONG).
  18. ;
  19. ;============================================================
  20. ;
  21.     TITLE S G E N  -  REV 1.00 - 19 NOV 1980
  22.     .Z80
  23.     .XLIST
  24.       INCLUDE  CLIB
  25.       INCLUDE  MACROZ
  26.     .LIST
  27.     .Z80
  28. ;
  29. NSECTS    EQU    26D        ; NO. SECTORS ON A TRACK..
  30. DMASTART EQU    900H        ; BEGINNING DMA ADDRESS.
  31. ;
  32.     CSEG
  33. ;
  34. ;
  35. START:    SWIN  OLDSP,NEWSP  ; SAVE ALL REG & SETUP OWN STACK.
  36. ;
  37. RESTART: PRINT    <CR,LF,'S G E N  1.00 OF 19 NOV 80',CR,LF>
  38.     PRINT    'ENTER NUMBER OF SYSTEM TRACKS 1-9 (CR=2): '
  39.     CALL    GETCH    ; GET KEYBOARD CHAR (ASCII IN -A-,
  40.             ;  AND BINARY IN -B- )
  41.     LD    E,A    ; TEMP STASH ASCII VALUE IN E.
  42.     LD    (NTRKS),A  ; STASH ASCII # TRACKS
  43.     STORE   NTRKSB,B   ;  .. & BINARY.
  44.     LD    A,E    ; RESTORE ASCII VALUE IN A.
  45.     CP    CR    ; IF CAR. RET., IT IS 2 TRACK SYSTEM.
  46.     JR    Z,TWOTRK
  47.     CP    '2'    ; CHECK IF 2 TRACKS.
  48.     JR    Z,TWOTRK
  49.     CP    '3'    ; CHECK IF GE THREE TRACKS.
  50.     JP    M,NTRK    ; LESS THAN THREE, GO ON
  51.     PRINT    <CR,LF,'ARE YOU SURE - 3 OR MORE TRACKS ? '>
  52.     CHARIN        ; GET RESPONSE
  53.     CP    'Y'    ; IS IT UC 'Y' ?
  54.     JR    Z,YESY    ; HOP IF YES.
  55.     SUB    20H    ; SEE IF IT MIGHT BE LC 'Y'
  56.     CP    'Y'
  57.     JP    NZ,RESTART  ; USER UNSURE, SO START OVER.
  58. YESY:    JR    NTRK    ; GO DO IT.
  59. TWOTRK:    PRINT    <CR,LF,'DOING STANDARD TWO-TRACK SYSTEM **'>
  60.     JR    GOTOIT    ; GO DO IT...
  61. ;
  62. NTRK:    PRINT     <CR,LF,'DOING NON-STANDARD '>
  63.     PRINT    NTRKS,1,A    ; PRINT # TRACKS.
  64.     PRINT    ' TRACK SYSTEM **'
  65. ;
  66. GOTOIT:
  67.     PRINT    <CR,LF,'ENTER SOURCE DRIVE (CR IF IN MEMORY): '>
  68.     CALL    GETCH        ; GET SOURCE DRIVE OR CODE.
  69.     LD    E,A        ; TEMP STASH ASCII DRIVE CODE.
  70.     LD    (SCA),A        ; ASCII SOURCE DRIVE # TO MEM
  71.     STORE    SOURCE,B    ; & BINARY VALUE.
  72.     LD    A,E        ; & RESTORE ASCII IN A.
  73.     CP    CR        ; IF CR, SYSTEM CODE IS IN MEM.
  74.     JR    Z,INMEM        ; -- SO HOP TO IT.
  75.     CALL    CHKALPHA    ; SEE IF IT IS AN ALPHA CHAR.
  76.     JR    NZ,GOTOIT    ; & ASK AGAIN IF NOT.
  77. ;
  78. ; ASSUMING IT IS ON A DISK, GET IT IN MEMORY.
  79. ;
  80.     PRINT    <CR,LF,'SOURCE ON '>
  81.     PRINT    SCA,1,A        ; PRINT SOURCE DRIVE NAME
  82.     PRINT    ' , TYPE CR TO READ *'
  83.     CALL    GETCH        ; GET USER RESPONSE.
  84.     CP    CR
  85.     JP    NZ,RESTART    ; HEY, IF USER DOESN'T
  86. ;                                 TYPE IN A CR, HE MUST WANT SOMETHING.
  87. ;
  88.     CALL    GETSYS        ; GET SYSTEM TO MEMORY AT 900H.
  89. ;
  90. ; WAS IN MEMORY, OR ELSE IT IS AFTER CALL TO GETSYS:
  91.  
  92. ;
  93. INMEM:    PRINT    <CR,LF,'SOURCE IS IN MEMORY ***'>
  94. WR1:    PRINT    <CR,LF,'DESTINATION DRIVE: (CR TO EXIT TO CP/M) '>
  95.     CALL    GETCH        ; GET DEST DRIVE LETTER.. OR CR.
  96.     LD    E,A        ; TEMP STASH ASCII VALUE
  97.     LD    (DCA),A        ; PUT ASCII IN MEM
  98.     STORE    DEST,B        ; & BINARY,
  99.     LD    A,E        ; & RESTORE ASCII IN A.
  100.     CP    CR        ; IS IT A CR ?
  101.     JP    Z,NOWRIT    ; IF SO, REBOOT CP/M.
  102.     CALL    CHKALPHA    ; SEE IF IT IS REALLY ALPHA.
  103.     JR    NZ,WR1        ; & ASK AGAIN IF NOT.
  104. ;
  105. ; HERE WE HAVE SYSTEM IN MEMORY - WRITE TO DESTINATION.
  106. ;
  107. WR2:    PRINT    <CR,LF,'DESTINATION = DRIVE '>
  108.     PRINT    DCA,1,A        ; PRINT DEST. DRIVE LETTER.
  109.     PRINT    ', TYPE CR TO WRITE, TAB TO REBOOT **'
  110.     PRINT            ; CR,LF
  111.     CALL    GETCH        ; GET THE DECISION
  112.     CP    TAB        ; IS IT TAB KEY ?
  113.     JR    Z,REBOOT    ; IF YES, HOP TO BOOT (WARM)
  114.     CP    CR        ; CHECK - IS IT A CR ?
  115.     JR    NZ,WR2        ; NO ? .. MUST WANT TO CHANGE MIND.
  116. ;
  117.     CALL    PUTSYS        ; WRITE SYSTEM ON DESTINATION.
  118. ;
  119.     PRINT    <CR,LF,'SYSTEM WRITTEN ON DRIVE '>
  120.     PRINT    DCA,1,A        ; PRINT DESTINATION DRIVE LTR.
  121.     PRINT    ', - CR TO DO AGAIN, TAB TO REBOOT: '
  122.     CALL    GETCH        ; GET DECISION
  123.     CP    CR        ; IS IT A CR ?
  124.     JP    Z,WR1        ; YES, SEE IF HE WANTS SAME DRIVE.
  125.     CP    TAB        ; IS IT A TAB ?
  126.     JR    Z,REBOOT    ; DO WARM BOOT IF YES.
  127.     JP    RESTART        ; , OTHERWISE START ALL OVER.
  128. ;
  129. ; TIME TO REBOOT CP/M HERE:
  130. ;
  131. NOWRIT:
  132. REBOOT: SWOT OLDSP,NEWSP    ; RESTORE CP/M REG & STACK..
  133.     CALLBIOS    DWBOOT    ; & DO A WARM BOOT FUNCTION.
  134. ;
  135. ; SHOULD NEVER GET HERE.
  136. ;
  137.     JP    0000        ; DISASTER - DO COLD BOOT.
  138. ;
  139. ;============================================================
  140. ;  SUBROUTINES:  
  141. ;
  142. ;  GETSYS:  USES <SOURCE> - READS SYSTEM TO MEMORY.
  143. ;  PUTSYS   USES <DEST>   - WRITES SYSTEM TO DISK.
  144. ;
  145. ;    BOTH USE <NTRKSB> = BINARY # TRACKS.
  146. ;
  147. ;    BOTH USE CBIOS AND / OR BDOS (2.2) FUNCTIONS.
  148. ;
  149. ;============================================================
  150. ;
  151. ;  GET SYSTEM FROM TRACK 0, SECTOR 1 THRU SECTOR 26 OF LAST
  152. ;  TRACK   -  TO MEMORY STARTING AT 900H.
  153. ;
  154. GETSYS:    PUSHALL
  155.     CALL    INITRW        ; INITIALIZE TRK, SEC, DMAADR.
  156.     LD    HL,SOURCE
  157.     LD    C,(HL)
  158.     CALLBIOS DSELDSK    ; SELECT SOURCE DRIVE.
  159. ;
  160. GET1:    LD    HL,CURTRK
  161.     LD    C,(HL)
  162.     CALLBIOS DSETTRK    ; SELECT TRACK
  163. ;
  164. GET2:    LD    HL,CURSEC
  165.     LD    C,(HL)
  166.     CALLBIOS DSETSEC    ; SELECT SECTOR TO READ.
  167. ;
  168.     LD    BC,(DMAADR)
  169.     CALLBIOS DSETDMA    ; SET TRANSFER ADDRESS.
  170. ;
  171.     CALLBIOS DREAD        ; READ THE SECTOR.
  172. ;
  173.     CALL    NXS        ; NEXT SECTOR UNLESS LAST,
  174.     JP    Z,NXRDTK    ; .. HOP IF LAST ON THIS TRACK.
  175.     JP    GET2        ; OTHERWISE DO THE NEXT ONE.
  176. ;
  177. NXRDTK:    CALL    NXT        ; GO TO NEXT TRACK UNLESS LAST.
  178.     JP    Z,DONE        ; HOP IF LAST TRACK,
  179.     JP    GET1        ; OTHERWISE DO NEXT TRACK.
  180. ;
  181. DONE:    POPALL            ; & RESTORE REGISTERS..
  182.     RET
  183. ;
  184. ; BUMP THE DMA ADDRESS BY 128:
  185. ;
  186. BUMP:    LD    HL,(DMAADR)
  187.     LD    DE,128D
  188.     ADD    HL,DE
  189.     LD    (DMAADR),HL
  190.     RET
  191. ;
  192. ;  NXT  -- GO TO NEXT TRACK UNLESS LAST, IN WHICH CASE RET Z.
  193. ;
  194. NXT:    LD    A,(CURTRK)    ; GET CURRENT TRACK NO.
  195.     LD    E,A        ; TEMP STASH...
  196.     LD    HL,NTRKSB
  197.     LD    A,(HL)        ; GET NO. OF LAST TRACK TO DO.
  198.     SUB    1        ; DOING NTRKSB - 1 (FIRST IS 0)..
  199.     CP    E        ; DID WE JUST FINISH LAST ONE ?
  200.     JR    Z,DONET        ; HOP IF YES.
  201.     LD    A,E        ; GET CURRENT TRK BACK &
  202.     INC    A        ; OTHERWISE INCR. TRACK NO.
  203.     LD    (CURTRK),A    ; & PUT IT IN MEM.
  204.     LD    A,1        ; SET CURRENT SECTOR
  205.     LD    (CURSEC),A    ;  .. EQUALS 1.
  206.     CALL    BUMP        ; & INCR. DMA ADDRESS BY 128.
  207.     BIT    0,A        ; FORCE Z FLAG OFF.
  208. DONET:    RET            ; & RETURN...
  209. ;
  210. ;  NXS  -- GO TO NEXT SECTOR UNLESS LAST, IN WHICH CASE RET Z.
  211. ;
  212. NXS:    LD    A,(CURSEC)    ; GET CURRENT SECTOR NO.
  213.     LD    B,NSECTS    ; GET NO. SECTORS PER TRACK..
  214.     CP    B        ; DID WE JUST DO THE LAST ONE ?
  215.     JR    Z,DONES        ; HOP IF YES.
  216.     INC    A        ; OTHERWISE INCR. SECTOR NO.
  217.     LD    (CURSEC),A    ; & PUT IT IN MEM.
  218.     CALL    BUMP        ; & INCR. DMA ADDRESS BY 128.
  219.     LD    B,0FFH
  220.     BIT    0,B        ; FORCE Z FLAG OFF.
  221. DONES:    RET            ; & RETURN.
  222. ;
  223. ;  INITIALIZE PARAMETERS FOR ENTRY TO PUTSYS & GETSYS -
  224. ;
  225. INITRW:    XOR    A        ; GET A ZERO
  226.     LD    (CURTRK),A    ; SET CURRENT (FIRST) TRACK #
  227.     LD    A,1
  228.     LD    (CURSEC),A    ; SET FIRST SECTOR NO.
  229.     LD    BC,DMASTART    ; GET STARTING DMA ADDRESS.
  230.     LD    (DMAADR),BC    ; & PUT IT IN MEM.
  231.     RET
  232. ;
  233. ;
  234. ;
  235. ;============================================================
  236. ;
  237. ;  PUTSYS  - JUST THE INVERSE OF GETSYS.
  238. ;
  239. PUTSYS:    PUSHALL            ; SAVE REGISTERS.
  240.     CALL    INITRW        ; INITIALIZE TRK, SEC, DMAADR
  241.     LD    HL,DEST
  242.     LD    C,(HL)
  243.     CALLBIOS DSELDSK    ; SELECT DESTINATION DRIVE.
  244. ;
  245. PUT1:    LD    HL,CURTRK    ;
  246.     LD    C,(HL)        ; SELECT TRACK
  247.     CALLBIOS DSETTRK    ; SELECT TRACK.
  248. ;
  249. PUT2:    LD    HL,CURSEC
  250.     LD    C,(HL)
  251.     CALLBIOS DSETSEC    ; SELECT SECTOR.
  252. ;
  253.     LD    BC,(DMAADR)
  254.     CALLBIOS DSETDMA    ; SET TRANSFER ADDRESS.
  255. ;
  256.     CALLBIOS DWRITE        ; WRITE THE SECTOR.
  257. ;
  258.     CALL    NXS        ; DO NEXT SECTOR UNLESS LAST.
  259.     JP    Z,NXWRTK    ;  HOP IF IT WAS LAST ON TRACK.
  260.     JP    PUT2        ; OTHERWISE, DO NEXT SECTOR.
  261. ;
  262. NXWRTK:    CALL    NXT        ; DO NEXT TRACK UNLESS LAST.
  263.     JP    Z,DONE        ; HOP (RETURN) IF LAST,
  264.     JP    PUT1        ; OTHERWISE, WRITE NEXT TRACK.
  265. ;
  266. ;  SUBROUTINE TO GET CHARACTER FROM KEYBOARD AND TEST FOR
  267. ;  VALIDITY (A-O) OR CONTROL CHARACTER (CR, TAB).
  268. ;
  269. ;  RETURNS ASCII CHARACTER IN -A- AND
  270. ;         BINARY EQUIVALENT IN -B- ; IF NOT (UC OR LC) A-O,
  271. ;         THEN RETURNS B = 0FFH.
  272. ;
  273. GETCH:    CHARIN        ; GET CHARACTER TO -A-
  274.     LD    E,A    ; STASH IT IN <E>
  275.     CP    CR    ; IS IT A CR ?
  276.     JR    Z,CONT    ; HOP IF YES.
  277.     CP    TAB    ; IS IT TAB KEY ?
  278.     JR    Z,CONT    ; HOP IF YES.
  279.     CP    3AH    ; IS IT NUMERIC ?
  280.     JP    M,NUMBR    ; HOP IF YES.
  281.     CP    60H    ; IS IT LOWER-CASE ?
  282.     JP    M,UCASE    ; HOP IF UPPER CASE.
  283.     SUB    20H    ; CONVERT LC TO UC.
  284.     LD    E,A    ; MODIFY <E> STASH.
  285. UCASE:    CP    41H    ; IS IT (LESS THAN) 'A' ?
  286.     JP    M,TRYAGN ; IF YES, ILLEGAL CHAR, DO OVER.
  287.     CP    4FH    ; IS IT (GREATER THAN) 'O' ?
  288.     JP    P,TRYAGN ; IF YES, ILLEGAL, DO OVER.
  289.     SUB    41H    ; IS UC A-O; MAKE IT BINARY.
  290.     JR    OVER1
  291. NUMBR:    SUB    30H    ; CONVERT NUMERIC TO BINARY.
  292. OVER1:    LD    B,A    ; PUT BINARY IN <B>
  293.     LD    A,E    ; & RESTORE ASCII TO -A-
  294.     RET
  295. ;
  296. TRYAGN:    PRINT    <CR,LF,'** USE DRIVE A-O ** RE-ENTER NAME: '>
  297.     JR    GETCH    ; TRY AGAIN...
  298. ;
  299. CONT:    LD    B,0FFH    ; WE HAVE CONTROL CHAR, SET B = FFH.
  300.     RET        ; & RETURN WITH ASCII IN -A-.
  301. ;
  302. ;  CHECK <A> FOR VALID UC OR LC ALPHA CHAR.
  303. ;  PRESERVE <A>.  SET Z IF VALID ALPHA, NZ IF NOT.
  304. ;
  305. CHKALPHA: LD    E,A    ; PRESERVE <A>
  306.     CP    41H    ; IS IT UC 'A' OR ABOVE ?
  307.     JP    M,BADA    ; NO (IT IS PROB. NUMERIC)
  308.  
  309.     CP    5BH    ; IS IT UC & BETWEEN A & Z ?
  310.     JP    M,OK2
  311.     CP    61H    ; IS IT LC 'A' OR ABOVE ?
  312.     JP    M,BADA    ; BETWEEN UC 'Z' & LC 'A' - DON'T USE.
  313.     CP    7BH    ; IS IT ABOVE LC 'Z' ?
  314.     JP    M,OK2    ; IF NOT, USE IT.
  315. BADA:    CP    0FFH    ; FORCE NZ FLAG.
  316. CHKEX:    LD    A,E    ;  RESTORE VALUE TO A.
  317.     RET        ;   & RETURN.
  318. ;
  319. OK2:    CP    A    ; SET THE Z FLAG,
  320.     JR    CHKEX    ;  & GO RETURN..
  321. ;
  322. ;
  323. ;==========================================================
  324. ;
  325. ;  DATA SEGMENT:
  326. ;
  327.     DSEG
  328. ;
  329. SOURCE:    DS    1    ; SOURCE DRIVE, BINARY
  330. SCA:    DS    1    ; SOURCE DRIVE, ASCII
  331. DEST:    DS    1    ; DESTINATION DRIVE, BINARY
  332. DCA:    DS    1    ; DESTINATION DRIVE, ASCII
  333. NTRKS:    DS    1    ; NO. TRACKS, ASCII
  334. NTRKSB:    DS    1    ; NO. TRACKS, BINARY
  335. CURTRK:    DS    1    ; CURRENT TRACK
  336. CURSEC:    DS    1    ; CURRENT SECTOR
  337. DMAADR:    DS    2    ; DISK MEM. ADDRESS (TRANSFER)
  338. ;
  339. OLDSP:    DS    2    ; CALLER'S STACK POINTER TEMP.
  340. NEWSP:    DW    STACK    ; NEW STACK POINTER...
  341. TSPO:    DS    2    ; TEMP OLD SP
  342. TSPN:    DS    2    ; TEMP NEW SP
  343. ;
  344.     DS    128D    ; <SGEN> STACK
  345. STACK    EQU    $
  346. ;
  347.     END
  348. ;
  349. ;
  350.