home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv025.ark / SGEN.MAC < prev    next >
Text File  |  1984-04-29  |  10KB  |  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. INMEM:    PRINT    <CR,LF,'SOURCE IS IN MEMORY ***'>
  93. WR1:    PRINT    <CR,LF,'DESTINATION DRIVE: (CR TO EXIT TO CP/M) '>
  94.     CALL    GETCH        ; GET DEST DRIVE LETTER.. OR CR.
  95.     LD    E,A        ; TEMP STASH ASCII VALUE
  96.     LD    (DCA),A        ; PUT ASCII IN MEM
  97.     STORE    DEST,B        ; & BINARY,
  98.     LD    A,E        ; & RESTORE ASCII IN A.
  99.     CP    CR        ; IS IT A CR ?
  100.     JP    Z,NOWRIT    ; IF SO, REBOOT CP/M.
  101.     CALL    CHKALPHA    ; SEE IF IT IS REALLY ALPHA.
  102.     JR    NZ,WR1        ; & ASK AGAIN IF NOT.
  103. ;
  104. ; HERE WE HAVE SYSTEM IN MEMORY - WRITE TO DESTINATION.
  105. ;
  106. WR2:    PRINT    <CR,LF,'DESTINATION = DRIVE '>
  107.     PRINT    DCA,1,A        ; PRINT DEST. DRIVE LETTER.
  108.     PRINT    ', TYPE CR TO WRITE, TAB TO REBOOT **'
  109.     PRINT            ; CR,LF
  110.     CALL    GETCH        ; GET THE DECISION
  111.     CP    TAB        ; IS IT TAB KEY ?
  112.     JR    Z,REBOOT    ; IF YES, HOP TO BOOT (WARM)
  113.     CP    CR        ; CHECK - IS IT A CR ?
  114.     JR    NZ,WR2        ; NO ? .. MUST WANT TO CHANGE MIND.
  115. ;
  116.     CALL    PUTSYS        ; WRITE SYSTEM ON DESTINATION.
  117. ;
  118.     PRINT    <CR,LF,'SYSTEM WRITTEN ON DRIVE '>
  119.     PRINT    DCA,1,A        ; PRINT DESTINATION DRIVE LTR.
  120.     PRINT    ', - CR TO DO AGAIN, TAB TO REBOOT: '
  121.     CALL    GETCH        ; GET DECISION
  122.     CP    CR        ; IS IT A CR ?
  123.     JP    Z,WR1        ; YES, SEE IF HE WANTS SAME DRIVE.
  124.     CP    TAB        ; IS IT A TAB ?
  125.     JR    Z,REBOOT    ; DO WARM BOOT IF YES.
  126.     JP    RESTART        ; , OTHERWISE START ALL OVER.
  127. ;
  128. ; TIME TO REBOOT CP/M HERE:
  129. ;
  130. NOWRIT:
  131. REBOOT: SWOT OLDSP,NEWSP    ; RESTORE CP/M REG & STACK..
  132.     CALLBIOS    DWBOOT    ; & DO A WARM BOOT FUNCTION.
  133. ;
  134. ; SHOULD NEVER GET HERE.
  135. ;
  136.     JP    0000        ; DISASTER - DO COLD BOOT.
  137. ;
  138. ;============================================================
  139. ;  SUBROUTINES:  
  140. ;
  141. ;  GETSYS:  USES <SOURCE> - READS SYSTEM TO MEMORY.
  142. ;  PUTSYS   USES <DEST>   - WRITES SYSTEM TO DISK.
  143. ;
  144. ;    BOTH USE <NTRKSB> = BINARY # TRACKS.
  145. ;
  146. ;    BOTH USE CBIOS AND / OR BDOS (2.2) FUNCTIONS.
  147. ;
  148. ;============================================================
  149. ;
  150. ;  GET SYSTEM FROM TRACK 0, SECTOR 1 THRU SECTOR 26 OF LAST
  151. ;  TRACK   -  TO MEMORY STARTING AT 900H.
  152. ;
  153. GETSYS:    PUSHALL
  154.     CALL    INITRW        ; INITIALIZE TRK, SEC, DMAADR.
  155.     LD    HL,SOURCE
  156.     LD    C,(HL)
  157.     CALLBIOS DSELDSK    ; SELECT SOURCE DRIVE.
  158. ;
  159. GET1:    LD    HL,CURTRK
  160.     LD    C,(HL)
  161.     CALLBIOS DSETTRK    ; SELECT TRACK
  162. ;
  163. GET2:    LD    HL,CURSEC
  164.     LD    C,(HL)
  165.     CALLBIOS DSETSEC    ; SELECT SECTOR TO READ.
  166. ;
  167.     LD    BC,(DMAADR)
  168.     CALLBIOS DSETDMA    ; SET TRANSFER ADDRESS.
  169. ;
  170.     CALLBIOS DREAD        ; READ THE SECTOR.
  171. ;
  172.     CALL    NXS        ; NEXT SECTOR UNLESS LAST,
  173.     JP    Z,NXRDTK    ; .. HOP IF LAST ON THIS TRACK.
  174.     JP    GET2        ; OTHERWISE DO THE NEXT ONE.
  175. ;
  176. NXRDTK:    CALL    NXT        ; GO TO NEXT TRACK UNLESS LAST.
  177.     JP    Z,DONE        ; HOP IF LAST TRACK,
  178.     JP    GET1        ; OTHERWISE DO NEXT TRACK.
  179. ;
  180. DONE:    POPALL            ; & RESTORE REGISTERS..
  181.     RET
  182. ;
  183. ; BUMP THE DMA ADDRESS BY 128:
  184. ;
  185. BUMP:    LD    HL,(DMAADR)
  186.     LD    DE,128D
  187.     ADD    HL,DE
  188.     LD    (DMAADR),HL
  189.     RET
  190. ;
  191. ;  NXT  -- GO TO NEXT TRACK UNLESS LAST, IN WHICH CASE RET Z.
  192. ;
  193. NXT:    LD    A,(CURTRK)    ; GET CURRENT TRACK NO.
  194.     LD    E,A        ; TEMP STASH...
  195.     LD    HL,NTRKSB
  196.     LD    A,(HL)        ; GET NO. OF LAST TRACK TO DO.
  197.     SUB    1        ; DOING NTRKSB - 1 (FIRST IS 0)..
  198.     CP    E        ; DID WE JUST FINISH LAST ONE ?
  199.     JR    Z,DONET        ; HOP IF YES.
  200.     LD    A,E        ; GET CURRENT TRK BACK &
  201.     INC    A        ; OTHERWISE INCR. TRACK NO.
  202.     LD    (CURTRK),A    ; & PUT IT IN MEM.
  203.     LD    A,1        ; SET CURRENT SECTOR
  204.     LD    (CURSEC),A    ;  .. EQUALS 1.
  205.     CALL    BUMP        ; & INCR. DMA ADDRESS BY 128.
  206.     BIT    0,A        ; FORCE Z FLAG OFF.
  207. DONET:    RET            ; & RETURN...
  208. ;
  209. ;  NXS  -- GO TO NEXT SECTOR UNLESS LAST, IN WHICH CASE RET Z.
  210. ;
  211. NXS:    LD    A,(CURSEC)    ; GET CURRENT SECTOR NO.
  212.     LD    B,NSECTS    ; GET NO. SECTORS PER TRACK..
  213.     CP    B        ; DID WE JUST DO THE LAST ONE ?
  214.     JR    Z,DONES        ; HOP IF YES.
  215.     INC    A        ; OTHERWISE INCR. SECTOR NO.
  216.     LD    (CURSEC),A    ; & PUT IT IN MEM.
  217.     CALL    BUMP        ; & INCR. DMA ADDRESS BY 128.
  218.     LD    B,0FFH
  219.     BIT    0,B        ; FORCE Z FLAG OFF.
  220. DONES:    RET            ; & RETURN.
  221. ;
  222. ;  INITIALIZE PARAMETERS FOR ENTRY TO PUTSYS & GETSYS -
  223. ;
  224. INITRW:    XOR    A        ; GET A ZERO
  225.     LD    (CURTRK),A    ; SET CURRENT (FIRST) TRACK #
  226.     LD    A,1
  227.     LD    (CURSEC),A    ; SET FIRST SECTOR NO.
  228.     LD    BC,DMASTART    ; GET STARTING DMA ADDRESS.
  229.     LD    (DMAADR),BC    ; & PUT IT IN MEM.
  230.     RET
  231. ;
  232. ;
  233. ;
  234. ;============================================================
  235. ;
  236. ;  PUTSYS  - JUST THE INVERSE OF GETSYS.
  237. ;
  238. PUTSYS:    PUSHALL            ; SAVE REGISTERS.
  239.     CALL    INITRW        ; INITIALIZE TRK, SEC, DMAADR
  240.     LD    HL,DEST
  241.     LD    C,(HL)
  242.     CALLBIOS DSELDSK    ; SELECT DESTINATION DRIVE.
  243. ;
  244. PUT1:    LD    HL,CURTRK    ;
  245.     LD    C,(HL)        ; SELECT TRACK
  246.     CALLBIOS DSETTRK    ; SELECT TRACK.
  247. ;
  248. PUT2:    LD    HL,CURSEC
  249.     LD    C,(HL)
  250.     CALLBIOS DSETSEC    ; SELECT SECTOR.
  251. ;
  252.     LD    BC,(DMAADR)
  253.     CALLBIOS DSETDMA    ; SET TRANSFER ADDRESS.
  254. ;
  255.     CALLBIOS DWRITE        ; WRITE THE SECTOR.
  256. ;
  257.     CALL    NXS        ; DO NEXT SECTOR UNLESS LAST.
  258.     JP    Z,NXWRTK    ;  HOP IF IT WAS LAST ON TRACK.
  259.     JP    PUT2        ; OTHERWISE, DO NEXT SECTOR.
  260. ;
  261. NXWRTK:    CALL    NXT        ; DO NEXT TRACK UNLESS LAST.
  262.     JP    Z,DONE        ; HOP (RETURN) IF LAST,
  263.     JP    PUT1        ; OTHERWISE, WRITE NEXT TRACK.
  264. ;
  265. ;  SUBROUTINE TO GET CHARACTER FROM KEYBOARD AND TEST FOR
  266. ;  VALIDITY (A-O) OR CONTROL CHARACTER (CR, TAB).
  267. ;
  268. ;  RETURNS ASCII CHARACTER IN -A- AND
  269. ;         BINARY EQUIVALENT IN -B- ; IF NOT (UC OR LC) A-O,
  270. ;         THEN RETURNS B = 0FFH.
  271. ;
  272. GETCH:    CHARIN        ; GET CHARACTER TO -A-
  273.     LD    E,A    ; STASH IT IN <E>
  274.     CP    CR    ; IS IT A CR ?
  275.     JR    Z,CONT    ; HOP IF YES.
  276.     CP    TAB    ; IS IT TAB KEY ?
  277.     JR    Z,CONT    ; HOP IF YES.
  278.     CP    3AH    ; IS IT NUMERIC ?
  279.     JP    M,NUMBR    ; HOP IF YES.
  280.     CP    60H    ; IS IT LOWER-CASE ?
  281.     JP    M,UCASE    ; HOP IF UPPER CASE.
  282.     SUB    20H    ; CONVERT LC TO UC.
  283.     LD    E,A    ; MODIFY <E> STASH.
  284. UCASE:    CP    41H    ; IS IT (LESS THAN) 'A' ?
  285.     JP    M,TRYAGN ; IF YES, ILLEGAL CHAR, DO OVER.
  286.     CP    4FH    ; IS IT (GREATER THAN) 'O' ?
  287.     JP    P,TRYAGN ; IF YES, ILLEGAL, DO OVER.
  288.     SUB    41H    ; IS UC A-O; MAKE IT BINARY.
  289.     JR    OVER1
  290. NUMBR:    SUB    30H    ; CONVERT NUMERIC TO BINARY.
  291. OVER1:    LD    B,A    ; PUT BINARY IN <B>
  292.     LD    A,E    ; & RESTORE ASCII TO -A-
  293.     RET
  294. ;
  295. TRYAGN:    PRINT    <CR,LF,'** USE DRIVE A-O ** RE-ENTER NAME: '>
  296.     JR    GETCH    ; TRY AGAIN...
  297. ;
  298. CONT:    LD    B,0FFH    ; WE HAVE CONTROL CHAR, SET B = FFH.
  299.     RET        ; & RETURN WITH ASCII IN -A-.
  300. ;
  301. ;  CHECK <A> FOR VALID UC OR LC ALPHA CHAR.
  302. ;  PRESERVE <A>.  SET Z IF VALID ALPHA, NZ IF NOT.
  303. ;
  304. CHKALPHA: LD    E,A    ; PRESERVE <A>
  305.     CP    41H    ; IS IT UC 'A' OR ABOVE ?
  306.     JP    M,BADA    ; NO (IT IS PROB. NUMERIC)
  307.  
  308.     CP    5BH    ; IS IT UC & BETWEEN A & Z ?
  309.     JP    M,OK2
  310.     CP    61H    ; IS IT LC 'A' OR ABOVE ?
  311.     JP    M,BADA    ; BETWEEN UC 'Z' & LC 'A' - DON'T USE.
  312.     CP    7BH    ; IS IT ABOVE LC 'Z' ?
  313.     JP    M,OK2    ; IF NOT, USE IT.
  314. BADA:    CP    0FFH    ; FORCE NZ FLAG.
  315. CHKEX:    LD    A,E    ;  RESTORE VALUE TO A.
  316.     RET        ;   & RETURN.
  317. ;
  318. OK2:    CP    A    ; SET THE Z FLAG,
  319.     JR    CHKEX    ;  & GO RETURN..
  320. ;
  321. ;
  322. ;==========================================================
  323. ;
  324. ;  DATA SEGMENT:
  325. ;
  326.     DSEG
  327. ;
  328. SOURCE:    DS    1    ; SOURCE DRIVE, BINARY
  329. SCA:    DS    1    ; SOURCE DRIVE, ASCII
  330. DEST:    DS    1    ; DESTINATION DRIVE, BINARY
  331. DCA:    DS    1    ; DESTINATION DRIVE, ASCII
  332. NTRKS:    DS    1    ; NO. TRACKS, ASCII
  333. NTRKSB:    DS    1    ; NO. TRACKS, BINARY
  334. CURTRK:    DS    1    ; CURRENT TRACK
  335. CURSEC:    DS    1    ; CURRENT SECTOR
  336. DMAADR:    DS    2    ; DISK MEM. ADDRESS (TRANSFER)
  337. ;
  338. OLDSP:    DS    2    ; CALLER'S STACK POINTER TEMP.
  339. NEWSP:    DW    STACK    ; NEW STACK POINTER...
  340. TSPO:    DS    2    ; TEMP OLD SP
  341. TSPN:    DS    2    ; TEMP NEW SP
  342. ;
  343.     DS    128D    ; <SGEN> STACK
  344. STACK    EQU    $
  345. ;
  346.     END
  347. ;
  348. ;
  349.