home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / text / examples.arc / REMOVE.A < prev    next >
Encoding:
Text File  |  1989-12-01  |  10.2 KB  |  250 lines

  1. ;remove.asm
  2. ;========================================
  3. ; Command: remove a RAM resident command
  4. ;========================================
  5. ; Last changed: 07March88
  6.                                   
  7. zrimg       = $0060               ; Shell's copy of REU command register
  8. z128        = $0061               ; Shell's copy of $DF02
  9. zrda        = $0063               ; Shell's copy of $DF04
  10. zxfer       = $0066               ; Shell's copy of $DF05
  11. poker       = $0016               ; Zero page pointer
  12. index1      = $0024               ; Zero page pointer
  13. index2      = $0026               ; Zero page pointer
  14. int04       = $1704               ; Get 1st char of parameter .x
  15. int05       = $1705               ; Get next char after int04
  16. int0e       = $170e               ; Program terminate
  17. int21       = $1721               ; Function interrupt
  18. rflag       = $1bf0               ; Bit 7=1 if ramdisk is in the 1750
  19. primm       = $ff7d               ; Print immediate
  20. chrout      = $ffd2               
  21. rdmax       = $1bf1               ; Last address or page used by ramdisk
  22. rdadr       = $1bf5               ; First address or page used by ramdisk
  23. rdbnk       = $1bf3               ; Bank ramdisk starts in
  24. tx          = $1bfe               ; Bit 6=1 if ramdisk is enabled
  25. getcfg      = $ff6b               ; Convert bank to CR
  26.                                   
  27. star        = $0b00               
  28.             .wor star
  29.             * = star              
  30.  
  31.             jmp Remove
  32.             dw  Date
  33.                 
  34. Remove      lda #13
  35.             jsr chrout            
  36.             bit tx                ; First make sure ramdisk is enabled
  37.             bvs remove            ; it is
  38.             jsr primm             
  39.             .asc "RAM disk isn't installed.",13,0
  40. exit1       lda #1                
  41.             jmp int0e             
  42.                                   
  43. remove      ldx #1                ; start with %1 and work up
  44.             stx parm              
  45. rm0         ldx parm              
  46.             jsr int04             ; confirm that parameter exists
  47.             bcc rm1               ; ok. go on its there
  48. exit0       lda #0                
  49.             jmp int0e             ; all done
  50.                                   
  51. rm1         ldy #6                ; find %x in ramdisk
  52.             jsr int21             ; 'zrda' points to file header if found
  53.             php                   ; save found flag
  54.             ldy #2                ; get ready for echo
  55.             bcc rm2               ; name at $1b60 if found
  56.             ldx parm              ; otherwise echo parameter
  57.             jsr int04             
  58. gc          jsr chrout            
  59.             iny                   
  60.             jsr int05             
  61.             bcc gc                
  62.             bcs rm3               
  63.                                   
  64. rm2         lda $1b60,y           ; echo filename
  65.             beq rm3               
  66.             jsr chrout            
  67.             iny                   
  68.             bne rm2               
  69.                                   
  70. rm3         lda #" "              ; tab(16)
  71.             jsr chrout            
  72.             iny                   
  73.             cpy #18               
  74.             bne rm3               
  75.             plp                   ; was it found?
  76.             bcc rm4               ; yes. remove it
  77.             jsr primm             
  78.             .asc "Not found.",13,0
  79. rmnx        inc parm              
  80.             jmp rm0               
  81.                                   
  82. rm4         jsr remit             ; remove it
  83.             bcc done              
  84.             jsr primm             
  85.             .asc "RAM disk corrupt. Can't remove",13,0
  86. exit4       lda #4                
  87.             jmp int0e             
  88.                                   
  89. done        jsr primm             
  90.             .asc "Removed.",13,0
  91.             jmp rmnx              
  92.                                   
  93.                                   
  94. ;------------------------------------------------
  95. ; Subroutine: remove file at $1b60 from RAM disk
  96. ;------------------------------------------------
  97.                                   
  98. ; SEC = error, CLC = file removed
  99.                                   
  100. remit       ldy #9                ; Save this file's starting address
  101. rmi0        lda zrimg,y           ; This will be the destination of the move
  102.             sta destn,y           
  103.             dey                   
  104.             bpl rmi0              
  105.             ldy #7                ; bump to next file
  106.             jsr int21             ; (adds current file's length to 'zrda')
  107.             bcc rmi1              ; OK
  108. rmi3        rts                   ; Error, better quit
  109.                                   
  110. rmi1        ldy #9                
  111. rmi2        lda zrimg,y           ; save source of move
  112.             sta source,y          
  113.             dey                   
  114.             bpl rmi2              
  115.             ldy #8                ; and get highest address to move
  116.             jsr int21             ; 'zrda' points to end of RAM disk
  117.             bcs rmi3              ; Error
  118.             bit rflag             ; In RAM or 1750?
  119.             bmi in1750            
  120.             lda source+3          ; In RAM we need zero page
  121.             sta index1            
  122.             lda source+4          
  123.             sta index1+1          
  124.             lda destn+3           
  125.             sta index2            
  126.             lda destn+4           
  127.             sta index2+1          
  128.             ldy #0                
  129.             lda rdbnk+1
  130.             sta $ff00             
  131. loop        lda (index1),y        
  132.             sta (index2),y        
  133.             inc index1            
  134.             bne loop1             
  135.             inc index1+1          
  136. loop1       inc index2            
  137.             bne loop2             
  138.             inc index2+1          
  139. loop2       lda index1+1          
  140.             cmp rdmax+1           
  141.             bne loop              
  142.             lda index1            
  143.             cmp rdmax             
  144.             bne loop2             
  145.             sty $ff00             
  146.             clc                   
  147.             rts                   
  148.                                   
  149. in1750      lda #<$1600           ; Set 1 page buffer at $1600
  150.             sta source+1          
  151.             sta destn+1           
  152.             lda #>$1600
  153.             sta source+2          
  154.             sta destn+2           
  155.             lda #<256             
  156.             sta source+6          
  157.             sta destn+6           
  158.             lda #>256             
  159.             sta source+7          
  160.             sta destn+7           
  161.             lda #%10010000        ; Adjust control register for 128->REU
  162.             sta destn             
  163.             clc                   ; Last address is this plus two
  164.             lda zrda              
  165.             adc #2                
  166.             sta zrda              
  167.             bcc jjj               
  168.             inc zrda+1            
  169.             bne jjj               
  170.             inc zrda+2            
  171. jjj         jsr pgdn              ; Move one page down
  172.             bcs jjj               ; Still more
  173.             clc                   ; Else done
  174.             rts                   
  175.                                   
  176. pgdn        sec                   ; if (end of disk)-source <256 then change xfer length
  177.             lda zrda              ;    to the difference
  178.             sbc source+3          
  179.             sta temp              
  180.             lda zrda+1            
  181.             sbc source+4          
  182.             sta temp+1            
  183.             lda zrda+2            
  184.             sbc source+5          
  185.             ora temp+1            
  186.             bne use256            
  187.             sta source+7          
  188.             sta destn+7           
  189.             lda temp              
  190.             sta source+6          
  191.             sta destn+6           
  192.             ora temp+1            ; Length=0?
  193.             bne use256            ; No..go on
  194.             clc                   
  195.             rts                   
  196. use256      ldy #9                ; fetch page
  197.             lda $d030             
  198.             pha                   
  199.             and #%11111110        
  200.             sta $d030             
  201.             bit $df00             ; Clear flags
  202. l1          lda source,y          ; Fetch page
  203.             sta $df01,y           
  204.             dey                   
  205.             bpl l1                
  206. wait        bit $df00             ; wait for completion
  207.             bvc wait              
  208.             ldy #9                
  209. l2          lda destn,y           ; Store it back at lower address
  210.             sta $df01,y           
  211.             dey                   
  212.             bpl l2                
  213. wait2       bit $df00             ; Wait for completion
  214.             bvc wait2             
  215.             pla                   
  216.             sta $d030             
  217.             clc                   
  218.             lda source+3          ; Adjust source
  219.             adc source+6          
  220.             sta source+3          
  221.             lda source+4          
  222.             adc source+7          
  223.             sta source+4          
  224.             bcc l3                
  225.             inc source+5          
  226. l3          clc                   
  227.             lda destn+3           ; Adjust destination
  228.             adc destn+6           
  229.             sta destn+3           
  230.             lda destn+4           
  231.             adc destn+7           
  232.             sta destn+4           
  233.             bcc ll3               
  234.             inc destn+5           
  235. ll3         sec                   ; Check if done
  236.             lda zrda              
  237.             sbc source+3          
  238.             lda zrda+1            
  239.             sbc source+4          
  240.             lda zrda+2            
  241.             sbc source+5          
  242.             rts                   ; SEC=still more, CLC=done
  243.                                   
  244. source      *=*+10                
  245. destn       *=*+10                
  246. temp        *=*+2                 
  247. parm        *=*+2                 
  248.                                   
  249.             .end                  
  250.