home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR33 / S-Z / ZBGQ11.LBR / ZBGQ11.ZZ0 / ZBGQ11.Z80
Text File  |  2000-06-30  |  6KB  |  212 lines

  1. ; Program:    ZBGQUIK
  2. ; Author:    Jay Sage
  3. ; Date:        October 26, 1987
  4. ; Derivation:    BGQUICK by unknown author
  5.  
  6. version    equ    11
  7.  
  8. ; Version 1.0  October 26, 1987
  9. ;
  10. ; This program builds a complete image of the operating system in memory, from
  11. ; the bottom of BGii (determined from the address of the DOS vector in page 0)
  12. ; through the first page of memory up to 100h.  The image, together with a
  13. ; loader constructed by the program, is stored in a new file by a user-entered
  14. ; SAVE command.
  15. ;
  16. ; One refinement is added here to the original code by XXXXXX XXXXXXXX.  We
  17. ; do not want the ZCPR3 multiple command line to be overwritten.  The current
  18. ; contents should be copied into the correct location before the reload is
  19. ; performed.
  20.  
  21. ; Version 1.1  October 27, 1987
  22. ;
  23. ; Added code to preserve additional blocks of memory, such as those that
  24. ; contain time and date buffers or DateStamper code.  There is a list of blocks
  25. ; at the beginning of the code that can be patched in using ZPATCH or a
  26. ; debugger.  Each entry has two words: the starting address in the real
  27. ; operating system and the number of bytes to preserve.  The table ends with
  28. ; a starting address or a length of 0.
  29. ;
  30. ; A second change was to make the image buffer overlie the library code to
  31. ; keep the saved program file shorter.  The library routines are only needed
  32. ; during the operation of ZBGQUIK, not when the saved program is run.
  33.  
  34.     extrn    z3init,print,pa2hc,getcl1
  35.  
  36. cr    defl    13
  37. lf    defl    10
  38. tab    defl    09
  39.  
  40. ; Standard ZCPR3 header
  41.  
  42.     jp    start
  43.     defb    'Z3ENV',1        ; ZCPR3 type-1 environment
  44. envaddr:
  45.     defw    0            ; Filled in by CCP
  46.  
  47. ; Table of real addresses not to reload.  Put clock routines here, for
  48. ; example, so that reloading BGii does not set the time back to the value
  49. ; when ZBGQUIK was run.
  50.  
  51.     defb    'SAVE TABLE:'
  52. savetbl:
  53. block0:
  54.     defw    0ff00h            ; Filled in with address and
  55.     defw    208            ; ..length of command line buffer
  56. block1:
  57.     defw    0            ; Address of block 1
  58.     defw    0            ; Length of block1
  59. block2:
  60.     defw    0            ; Address of block2
  61.     defw    0            ; Length of block2
  62. block3:
  63.     defw    0            ; Space for expansion
  64.     defw    0
  65. block4:
  66.     defw    0            ; Space for expansion
  67.     defw    0
  68. block5:
  69.     defw    0            ; Space for expansion
  70.     defw    0
  71. block6:
  72.     defw    0            ; Space for expansion
  73.     defw    0
  74.  
  75.     defw    0            ; End of blocks (if not sooner)
  76.  
  77.  
  78. ; Beginning of code
  79.  
  80. start:
  81.     ld    sp,100h            ; Set up a local stack
  82.  
  83. ; This code performs two functions.  One is to capture the memory the image.
  84. ; The second is to perform the reloading when the saved image is invoked
  85. ; later.  The value in FLAG determines which function is performed.  When
  86. ; ZBGQUIK is loaded, FLAG has the value FFH so that CAPTURE is run.  The
  87. ; program resets FLAG to 0 so that the saved program will run RELOAD.
  88.  
  89.     ld    a,(flag)
  90.     or    a
  91.     jr    nz,capture
  92.  
  93.  
  94. ; This code will be run after the flag has been set to zero.  The entire BGii
  95. ; memory environment will be restored by this code.
  96.  
  97. reload:
  98.  
  99. ; First we save the contents of any memory buffers in the table at the
  100. ; beginning of the program.  The data for the multiple command line buffer
  101. ; was filled in by the CAPTURE code.
  102.  
  103.     ld    hl,savetbl        ; Point to table of blocks
  104. saveloop:
  105.     ld    e,(hl)            ; Get starting address of block
  106.     inc    hl            ; ..into DE
  107.     ld    d,(hl)
  108.     ld    a,d            ; See if end of table
  109.     or    e
  110.     jr    z,loadmem        ; If so, branch to load memory
  111.  
  112.     inc    hl
  113.     ld    c,(hl)            ; Load length of block to save
  114.     inc    hl
  115.     ld    b,(hl)
  116.     ld    a,b            ; See if length of block is 0
  117.     or    c
  118.     jr    z,loadmem        ; If so, branch to load memory
  119.  
  120.     inc    hl
  121.     push    hl            ; Save table pointer
  122.     ld    hl,(offset)        ; Get offset value
  123.     add    hl,de            ; Calculate destination in image
  124.     ex    de,hl            ; Switch source and destination
  125.     ldir                ; Copy the block
  126.     pop    hl            ; Get table pointer back
  127.     jr    saveloop        ; Back for any more blocks
  128.  
  129. ; Now we copy the image of the BGii memory environment into the real system.
  130.  
  131. loadmem:
  132.     ld    de,(imagebeg)        ; Destination for memory image
  133.     ld    hl,imagebuf        ; Source for memory image
  134.     ld    bc,(imagesiz)        ; Size of memory image
  135.     ldir                ; Restore the BGii environment in toto
  136.     jp    0            ; Warm boot
  137.  
  138. ; Here we copy a complete image of the operating system to the end of this
  139. ; program and display a message to the user telling him how big a file to
  140. ; save.
  141.  
  142. capture:
  143.     ld    hl,(envaddr)
  144.     call    z3init            ; Initialize for ZCPR3
  145.  
  146.     call    getcl1            ; Set HL to command line buffer
  147.     ld    (block0),hl        ; Save as save block 0
  148.     ld    l,a            ; Move length into HL
  149.     ld    h,0
  150.     ld    bc,5            ; Overhead bytes
  151.     add    hl,bc
  152.     ld    (block0+2),hl        ; Save length to save
  153.  
  154.     ld    hl,(6)            ; Bottom of BGii
  155.     ld    (imagebeg),hl        ; Save for use by quick loader
  156.     ex    de,hl            ; Switch it into DE
  157.     ld    hl,imagebuf        ; Get address where image is saved
  158.     xor    a            ; Clear carry flag
  159.     sbc    hl,de            ; Get offset from real address to
  160.     ld    (offset),hl        ; ..image and save it
  161.  
  162.     ld    hl,0100h        ; End of page 1
  163.     xor    a            ; Clear carry flag
  164.     ld    (flag),a        ; ..and set flag to run quick loader
  165.     sbc    hl,de            ; Compute bytes to store
  166.     ld    (imagesiz),hl        ; Save for use by quick loader
  167.     ld    b,h            ; Put count in BC
  168.     ld    c,l
  169.     ex    de,hl            ; Source (HL) is bottom of BGii
  170.     ld    de,imagebuf        ; Destination
  171.     push    hl            ; Save all the pointers
  172.     push    de
  173.     push    bc            ; Save size
  174.  
  175.     call    print
  176.     defb    cr,lf
  177.     defb    'ZBGQUIK, Version '
  178.     defb    version/10 +'0','.',version mod 10 + '0'
  179.     defb    cr,lf
  180.     defb    '  Save length is ',0
  181.  
  182.     pop    hl            ; Get size of image into HL
  183.     push    bc
  184.     ld    de,imagebuf        ; Starting address of buffer
  185.     add    hl,de            ; Ending address in HL
  186.     ld    a,h            ; Number of pages to A
  187.     call    pa2hc            ; Print number of hex pages
  188.  
  189.     call    print
  190.     db    'H pages.',cr,lf,0
  191.  
  192.     pop    bc            ; Restore pointers
  193.     pop    de
  194.     pop    hl
  195.     ldir                ; Copy operating system to image
  196.  
  197.     jp 0                ; Warm boot out
  198.  
  199. flag:
  200.     defb    0ffh            ; Initial value of flag is 0FFH
  201.  
  202. offset:
  203.     defs    2
  204. imagebeg:
  205.     defs    2
  206. imagesiz:
  207.     defs    2
  208.  
  209. imagebuf:                ; Memory image goes here
  210.  
  211.     end
  212.