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 / BEEHIVE / UTILITYS / C10CPM.ARC / CPM1.Z80 < prev   
Text File  |  1990-07-21  |  10KB  |  299 lines

  1. ; CPM RSX program for the Cromemco C-10 running CDOS vers 3.07
  2. ; written by Brett and John Hunter.
  3. ;         
  4. ; Version :- 1.02
  5. ;            13/07/86
  6.  
  7. DEST:     EQU    0E100H    ;Destination    
  8. DEST1:  EQU     0E1H    ;
  9.  
  10. ; The Destination should be about 200H less than the bottom of Cdos.
  11. ; The bottom of Cdos can easily be found by looking at bytes 6 and 7.
  12. ;
  13. ; Dest1 is just the first byte of Dest, and is used in the system
  14. ; call 151 (changing the bottom of Cdos)
  15. ;
  16.  
  17. CDOS:    EQU    0005H
  18. WARMBT: EQU     0000H
  19. CDOSC:  EQU     0E409H  ; CDOS call routine location (1st jump in cdos)
  20.  
  21. ; Cdosc is the address found at the first and third jumps of the
  22. ; jump table (the beginning of the jump table is pointed by bytes 6 & 7)
  23. ; And for all Cdos users that think Cdos has a jump table like the
  24. ; CP/M jump table, you are totally wrong. The Cdos jump table consists
  25. ; of only three jumps in the form
  26. ;                  JP CDOSC
  27. ;                  JP CDOSB
  28. ;                  JP CDOSC
  29. ;
  30.  
  31. CDOSB:  EQU     0E418H  ; CDOS warm boot routine (2nd jump in cdos table)
  32. CDOSR:  EQU     CDOSB-1 ; CDOS RET (just before warm boot routine)
  33.  
  34. ; Cdosr is the address of the "RET" of Cdos. ie. this is the RET that
  35. ; returns the system call to the calling program (the users program).
  36. ; Its location can be found by the fact that the system calling routines
  37. ; finish just before the warm boot routines. This is why it is Cdosb-1.
  38. ; We intercept the "RET" so we can fix up the returning parameters of certain
  39. ; system calls.  We do this by changing the RET to a RST (it must be
  40. ; 1 byte only). We have chosen RST 10H since we think that this location is
  41. ; not used by any (or few) programs. If a program does use locations 10H-12H
  42. ; then I suggest that you change first part of this program so that you
  43. ; load the jump in at, say 18H etc, and so that it is a RST 18H, etc.
  44.  
  45. LF:    EQU    0AH
  46. CR:    EQU    0DH
  47.  
  48.     ORG    100H
  49.  
  50. BEGIN:    LD    DE,MESSAGE    ; Print overlay message.
  51.         LD    C,09        ;
  52.     CALL    CDOS        ;
  53.           LD    C,97H             ; Change bottom of Cdos with call 151 (97H)
  54.     LD    E,DEST1         ; The new bottom is now (DEST1 00H)
  55.     CALL    CDOS            ;
  56.     LD    A,195           ; loading location 10H with "JP"
  57.         LD    (10H),A         ; 
  58.     LD    HL,MODS         ; loading location 11-12H with the location
  59.     LD    (11H),HL     ; of the "call modification routines".
  60.         LD    A,215        ;
  61.         LD      (CDOSR),A       ; changing the RET to a RST 10H in high cdos.
  62.  
  63. ; you can change LD (10H),A to LD (18H),A  and  LD (11H),HL to LD (19H),HL
  64. ; and LD A,215 (D7H)  to LD A,0DFH if you want the "interceptor" jump at
  65. ; another location other than 10H. (in this example 18H)
  66.  
  67.  
  68.  
  69. MOVEUP:    LD    BC,PEND-START+1    ;number of bytes to move
  70.      LD    HL,DEST+PEND-START+1;end of moved code
  71.      LD    DE,SOURCE+PEND-START;end of source code
  72.  
  73. MVLP:    LD    A,(DE)        ;get byte
  74.      DEC    HL        ;bump pointers
  75.      LD    (HL),A        ;new home
  76.      DEC    DE
  77.       DEC    BC        ;bump byte count
  78.      LD    A,B        ;check if zero
  79.      OR    C
  80.      JP    NZ,MVLP        ;if not, do some more
  81.  
  82. ; You could possibly change this to an LDDR, but I am not sure. 
  83.  
  84. SOURCE:    EQU    $     
  85. OFFSET:    EQU    DEST-SOURCE
  86.  
  87. START:  EQU     $+OFFSET
  88.         JP    FIRSTJ         ;Change the jump table to redivert a system
  89.         JP      CDOSB         ;call
  90.         JP    FIRSTJ          ; No adjustments on warm boot, so let it pass.
  91. ;
  92. ; System call 151 puts a new 3 Jp jump table in at locations DEST1 00 to 
  93. ; DEST1 09. We now overlay this jump table with our own jump table. In fact
  94. ; the entire process of changing the bottom of cdos can be done by
  95. ; locating where Cdos stores the old and new bottom of cdos and changing the
  96. ; bytes of the new bottom of cdos to your own and then putting in your jump
  97. ; table. We opted for the system call 151 since it was easier and smaller.
  98. ; The location of where cdos stores the locations of CDOS OLD and CDOS NEW
  99. ; can be found by using system call 81H and then adding 7 to the DE register
  100. ; to get .SYSBOT (NEW BOTTOM OF CDOS) and 9 to the DE to get .SYSBOL (Old)
  101. ; If no relocating of Cdos has occurred then OLD=NEW.
  102.  
  103. FIRSTJ: EQU    $+OFFSET
  104.         LD    (STCAL),BC    ;stores the system call for later retrival.
  105.     PUSH    AF        ;
  106.     LD    A,C        ; if the system call is 20H (set/change user
  107.     CP    20H        ; area) then go to our own routines and not    
  108.     JP    Z,USERC        ; Cdos's.
  109.         CP      1AH 
  110.         JP      Z,SETBUF    ; if call is 1AH (set file buf) then go to
  111.                 ; routine to store where they are setting
  112.                 ; the buffer at. (needed for user areas)
  113.     POP    AF
  114.     JP    CDOSC        ; now let the call continue on its way to
  115.                 ; CDOS.
  116.  
  117.  
  118. SETBUF:    EQU    $+OFFSET    ; keep a record of where the file buffer
  119.         LD      (SDMA),DE    ; is kept, since we need it later.
  120.         POP     AF
  121.         JP      CDOSC 
  122.  
  123. USERC:    EQU    $+OFFSET
  124.     LD    A,E        ; if E contains FF then load A with the
  125.         CP    0FFH        ; value store at UCODE, else if E is not
  126.     JP    NZ,USERC2    ; FF then store E at the address UCODE.
  127.     POP    AF
  128.     LD    A,(UCODE)
  129.     RET
  130.  
  131. USERC2:    EQU    $+OFFSET
  132.     LD    (UCODE),A
  133.     POP    AF        ;.return to the calling program (NOTE: this
  134.     RET            ; call never goes to CDOS since CDOS does
  135.                 ; not do anything with it)
  136.  
  137. MODS:   EQU     $+OFFSET
  138.         LD      (TEMP),HL    ;fixs the stack, because of RST instead of
  139.         POP     HL        ;the normal RET
  140.         LD      HL,(TEMP)    ; (could be a simplier way to do it)
  141.         JP      PUSHER        ;saves all registers.
  142. ;
  143. ; The code MODS is needed since when the Z80 does a "call" it pushs the
  144. ; address of where it was on the stack. Since the program calls CDOS
  145. ; and we have no RET, then there is an extra address on the stack.
  146. ; MODS merely gets rid of it. We do not know if this is proper or not
  147. ; but it works. If anyone has any suggestions or comments please send
  148. ; us them at the address in the DOC file
  149. ;
  150.  
  151. MOD2:   EQU     $+OFFSET
  152.         LD      BC,(STCAL)    ; has just returned from the system call and
  153.     LD      A,C        ; we now look what call it was.  
  154.  
  155.         CP      15              ;.is it call 15? If yes then go to M15
  156.         JP      Z,M15           ; (not sure if these calls (15,16) need
  157.         CP      16              ; to be fixed) (wont hurt)
  158.         JP      Z,M15
  159.  
  160.         CP      17              ;.if 17 then also go to M18 (this is
  161.         JP      Z,M18        ; a very important fix for call 17)
  162.  
  163.         CP      18        ;.if 18 then go to M18, a special mod.
  164.         JP      Z,M18        ; for this call (to include user areas)
  165.  
  166.         CP      22              ;.possibly  needs to be fixed, it wont hurt
  167.         JP      Z,M15           ; even if it doesn't (insurance)
  168.  
  169.         CP      27              ;.if call=27 then go to routine to fix it.
  170.         JP      Z,M27        ; (this is the allocation map call)
  171.  
  172.      POP     AF              ;.if it was not any of the above calls
  173.         POP     HL              ; then restore all the registers and 
  174.         POP     DE              ; return to the calling program.
  175.         POP     BC
  176.  
  177. ; Cdos calls and all other calls not specified above are not changed in any way
  178. ; and thus should not effect the program in any way. So the system calls
  179. ; 128 (80H) to 164 (A4H) still function as usual.
  180.  
  181.         RET            ;returns to user program
  182.  
  183. M15:    EQU     $+OFFSET        ; fix up calls                      
  184.         POP     AF              ; 15,16,21.
  185.         CP      255             ; if 255 (FF) then don't do anything
  186.         JP      Z,POPER+1
  187.         AND     03              ; else (and 3) and return to user program.
  188.     JP    POPER+1
  189.  
  190. M18:    EQU     $+OFFSET        ; fix up calls 17,18               
  191.         POP     AF              ;          
  192.         CP      255             ; if 255 (FF) then don't do anything
  193.         JP      Z,POPER+1
  194.         AND     03              ; else (and 3)                            
  195.     PUSH    AF        ; We now find out where the FCB's are and
  196.         CP      00        ; which one we are pointing at. (in the
  197.         CALL    Z,M18A          ; file buff)
  198.         CP      01        ;
  199.     CALL    Z,M18B
  200.     CP    02
  201.     CALL    Z,M18C
  202.     CP    03
  203.     CALL    Z,M18D
  204.  
  205. ; NOTE: Cdos has no user codes and thus we are using the attribute bits
  206. ; (eg USER,WRITE,READ,SYS) as our "user areas" (ie by changing the attr
  207. ; bits we can change the files user code.)
  208. ; This is a bit crude but is useful in BBS programs such as ROS that need
  209. ; user areas to seperate files. It is useless in most other applications.
  210. ; This is explained more in the DOC file.
  211.  
  212.     EX    DE,HL
  213.     LD    HL,UCODE
  214.           LD    A,(DE)        ; We get the first byte of the FCB
  215.     RRCA            ; and rotate it so the attribute bits
  216.     RRCA            ; are now the first four bits
  217.     RRCA     
  218.     RRCA
  219.     AND    00001111B    ; we (and) out the drive code.
  220.     CP    (HL)
  221.     JP      NZ,MORE
  222.     POP    AF
  223.         JP      POPER+1
  224.  
  225. M18A:    EQU    $+OFFSET
  226.     LD    HL,(SDMA)
  227.     RET
  228.  
  229. M18B:    EQU    $+OFFSET
  230.     LD    HL,32
  231.     LD    DE,(SDMA) 
  232.     ADD    HL,DE
  233.     RET
  234.  
  235. M18C:    EQU    $+OFFSET
  236.     LD    HL,64
  237.     LD    DE,(SDMA) 
  238.     ADD    HL,DE
  239.     RET
  240.  
  241. M18D:    EQU    $+OFFSET
  242.     LD    HL,96
  243.     LD    DE,(SDMA)
  244.         ADD    HL,DE
  245.     RET
  246.  
  247. MORE:    EQU    $+OFFSET
  248.     POP    AF
  249.     POP    BC
  250.     POP    DE
  251.     POP    HL
  252.      LD    C,18        ; if the user code is not that of the file then
  253.     CALL    0005        ; go do the call again.
  254.  
  255. ; If the file has its attribute bits that corresponds to the current User area
  256. ; then the call is finished, but if they don't we do the system call again
  257. ; until we either find a file or the dir is exhausted.
  258.  
  259. M27:    EQU    $+OFFSET        ; pop back the registers but in the 
  260.     POP    AF              ; wrong order, as so to swap BC and HL
  261.     POP    BC        ; So CDOS is now like the proper thing
  262.     POP    DE        ; except it returns more values that CPM
  263.     POP    HL        ; does.    
  264.         RET
  265.  
  266. PUSHER: EQU     $+OFFSET
  267.         PUSH    BC
  268.         PUSH    DE
  269.         PUSH    HL
  270.         PUSH    AF
  271.         JP      MOD2
  272.  
  273. POPER:  EQU     $+OFFSET
  274.         POP     AF
  275.         POP     HL
  276.         POP     DE
  277.         POP     BC
  278.         RET
  279.  
  280. STCAL:  EQU    $+OFFSET
  281.     DEFW    0
  282.  
  283. UCODE:  EQU    $+OFFSET    ; storage area for current user area
  284.     DEFB    0
  285.  
  286. SDMA:    EQU    $+OFFSET    ; storage area for file buff address
  287.     DEFW    80H,00          ; defaults to 80H
  288.  
  289. TEMP:    EQU    $+OFFSET    ; trash collection
  290.     DEFW    0
  291.  
  292. PEND:    EQU    $+OFFSET
  293.     JP    WARMBT
  294.  
  295. MESSAGE    DEFB    'CP/M OVERLAY for CROMEMCO C-10.  Vers 1.02',CR,LF
  296.         DEFB    'Copyrighted by Brett and John Hunter 13/7/86',CR,LF,'$'
  297.  
  298.         END    BEGIN
  299.