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 / FORTH-83 / NIT4TH.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  6KB  |  262 lines

  1. ;       INIT4TH Version 1.0 as of December 13, 1981
  2. ;                By: Kelly Smith, CP/M-Net
  3. ;      The purpose of INIT4TH,  came about from the flagrant 
  4. ; destruction  of Fig-Forth screens that were co-resident on 
  5. ; my CP/M diskettes...I would forget that the screens DO NOT 
  6. ; appear  in the CP/M directory,  and as such are  prone  to 
  7. ; eminent  destruction (due totally to my stupidity) by  the 
  8. ; CP/M "PIP" command.  What to do? Well, I also got tired of 
  9. ; clearing  out  screens  that  were  full  of  "e5's"  from 
  10. ; formatting,  and  decided  to  kill  two  birds  with  one 
  11. ; stone...
  12. ;      INIT4TH  will  allow retention of all  relevant  CP/M 
  13. ; files (such as FORTH itself) on a CP/M and FORTH diskette, 
  14. ; initialize  all sectors NOT occupied by the resident  CP/M 
  15. ; files, and RESERVE all remaining sectors as available disk 
  16. ; area  for FORTH screens.  How is it  done?  Well,  INIT4TH 
  17. ; creats  one  "super  file"  called  RESERVED.4TH  that  is 
  18. ; nothing  but  blanks  (actually ASCII "space"  code)  that 
  19. ; aquires all CP/M groups remaining after the resident  CP/M 
  20. ; files...once    your   quasi   CP/M-FORTH   diskette    is 
  21. ; initialized,  it's  FULL  as far as CP/M is concerned  for 
  22. ; further PIPing,  and ready for whatever you want to  place 
  23. ; into  the  available  Fig-Forth screen  area  (my  version 
  24. ; starts  with a blank screen number 17,  up to  249).  It's 
  25. ; best,  if you PIP all the CP/M files to a blank  formatted 
  26. ; diskette first to make them contiguous on the diskette (no 
  27. ; "holes"),  and  then  run INIT4TH on it  to  "take-up-the-
  28. ; slack".
  29. ;      But  WARNING...do  not  run this on a  diskette  that 
  30. ; already  has screens that you want to  preserve...this  is 
  31. ; ONLY  for diskette INITIALIZATION of FORTH  screens...copy 
  32. ; from  another  diskette as you normally do to  place  your 
  33. ; "treasured" screens on it.
  34. ;      A  conditional assembly equate "SYS" is used to  make 
  35. ; RESERVED.4TH  invisible  in the directory (if you want  it 
  36. ; that way).
  37. ;      I  hope this is of some use to you,  and if you  make 
  38. ; any  changes,  I  would appreciate it,  if you  modem  the 
  39. ; program to CP/M-Net (805) 527-9321 as INIT4TH.NEW...
  40. ;      P.S.  I have learned many new WORDs using FORTH,  but 
  41. ; none are repeatable here...
  42. ;                         Best regards: Kelly Smith CP/M-Net
  43. ;
  44. ;
  45. ;
  46. ; define TRUE/FALSE assembly parameters
  47. ;
  48. true    equ    -1    ; define TRUE
  49. false    equ    not true; define FALSE
  50. sys    equ    true    ; define SYS (make RESERVED.4TH a $SYS file)
  51. ;
  52. ;
  53. ; BDOS entry point and function codes
  54. base    equ    0    ; base address of "standard" CP/M system
  55. bdos    equ    base+5    ; CP/M BDOS entry address
  56. msgfc    equ    9    ; message function
  57. resdsk    equ    13    ; reset disk system
  58. offc    equ    15    ; open file
  59. cffc    equ    16    ; close file
  60. wrfc    equ    21    ; write record
  61. mffc    equ    22    ; make file
  62. sdma    equ    26    ; set dma address
  63. ; secondary FCB field definitions
  64. fn    equ    1    ; file name field (rel)
  65. ft    equ    9    ; file type field (rel)
  66. ex    equ    12    ; file extent field (rel)
  67. frc    equ    15    ; file record count (rel)
  68. nr    equ    32    ; next record field (rel)
  69. ; ASCII control characters
  70. cr    equ    0dh    ; carriage return
  71. lf    equ    0ah    ; line feed
  72. bel    equ    07h    ; bell signal
  73. ;
  74. ;
  75.     org    base+100h
  76. ;
  77.     lxi    h,0    ; save old stack pointer
  78.     dad    sp
  79.     shld    oldstk
  80.     lxi    sp,stack; make a new stack pointer
  81.     lxi    d,initmsg    ; Forth Screen initialization in progress
  82.     mvi    c,msgfc
  83.     call    bdos
  84.     call    reset    ; reset disk in case it's R/O
  85. init4th:call    open    ; attempt to open RESERVED.4TH
  86.     inr    a    ; check CP/M return code
  87.     jnz    makeok    ; RESERVED.4TH already exist?
  88.     call    make    ; make new file
  89.     inr    a    ; check CP/M return code
  90.     jnz    makeok
  91.     lxi    d,dirful; oops...disk directory is full
  92. exit:    mvi    c,msgfc
  93.     call    bdos
  94.     lhld    oldstk    ; get old CP/M stack pointer
  95.     sphl
  96.     ret
  97. ;
  98. ; RESERVED.4TH exists, so set the FCB entry for next append to file
  99. ;
  100. makeok:        
  101. ;
  102.     lxi    d,active; indicate disk activity with "."
  103.     mvi    c,msgfc
  104.     call    bdos
  105.     call    setdma    ; set dma for record to write
  106.     call    write    ; write it out...
  107.     push    psw    ; save possible error code
  108.     lda    fcb+frc    ; get record count
  109.     sta    fcb+nr    ; make next record
  110.     pop    psw    ; get possible error code
  111.     ora    a    ; disk full yet, all available records?
  112.     jz    makeok    ; do more records, if not
  113.     call    close    ; close-up shop, and go home
  114.     lxi    d,dskful; Forth Screens are now initialized...
  115.     jmp    exit    ; exit to CP/M
  116. ;  reset - reset disk
  117. ;
  118. reset:        
  119.     push    h
  120.     push    d
  121.     push    b
  122.     mvi    c,resdsk
  123.     call    bdos
  124.     pop    b
  125.     pop    d
  126.     pop    h
  127.     ret
  128. ; open - open disk file
  129. open:        
  130.     push    h
  131.     push    d
  132.     push    b
  133.     lxi    d,fcb
  134.     mvi    c,offc
  135.     call    bdos
  136.     pop    b
  137.     pop    d
  138.     pop    h
  139.     ret
  140. ;
  141. ; setdma - set dma for record
  142. ;
  143. setdma:
  144.     push    h
  145.     push    d
  146.     push    b
  147.     lxi    d,dbuf
  148.     mvi    c,sdma
  149.     call    bdos
  150.     pop    b
  151.     pop    d
  152.     pop    h
  153.     ret
  154. ;
  155. ; write - write record
  156. ;
  157. write:
  158.     push    h
  159.     push    d
  160.     push    b
  161.     lxi    d,fcb
  162.     mvi    c,wrfc
  163.     call    bdos
  164.     pop    b
  165.     pop    d
  166.     pop    h
  167.     ret
  168. ; close - close disk file
  169. close:        
  170.     push    h
  171.     push    d
  172.     push    b
  173.     lxi    d,fcb
  174.     mvi    c,cffc
  175.     call    bdos
  176.     pop    b
  177.     pop    d
  178.     pop    h
  179.     ret
  180. ; make - make new disk file
  181. make:        
  182.     push    h
  183.     push    d
  184.     push    b
  185.     lxi    d,fcb
  186.     mvi    c,mffc
  187.     call    bdos
  188.     pop    b
  189.     pop    d
  190.     pop    h
  191.     ret
  192. ;
  193.  
  194. initmsg:db    cr,lf,'Forth Screen initialization in progress',cr,lf,'$'
  195. ;
  196. active:    db    '.$'
  197. ;
  198. dirful:    db    cr,lf,'Oops, this diskette is already full!$'
  199. ;
  200. dskful:    db    cr,lf,lf,'Forth Screen initialization completed'
  201.  
  202.     if    SYS
  203.     db    ' as (RESERVED.4TH)$'
  204.     endif        ; SYS
  205.  
  206.     if    not SYS
  207.     db    ' as RESERVED.4TH$'
  208.     endif        ; SYS
  209.  
  210. ;
  211. fcb:    db    2    ; initialize diskette in B: drive
  212.  
  213.     if    SYS
  214.     db    'RESERVED4','T'+80H,'H'
  215.     endif        ; SYS
  216.  
  217.     if    not SYS
  218.     db    'RESERVED4TH'
  219.     endif        ; SYS
  220.  
  221.     db    0,0,0,0,0,0,0,0,0,0
  222. ;
  223. ; data area
  224.     ds    128    ; 64 level stack
  225. stack    equ    $    ;local stack
  226. ;
  227. oldstk        
  228.     ds    2    ; storage for old CP/M stack pointer
  229. ;
  230. dbuf:    db    '                '    ; use blanks for initialization data
  231.     db    '                '
  232.     db    '                '
  233.     db    '                '
  234.     db    '                '
  235.     db    '                '
  236.     db    '                '
  237.     db    '                '
  238. ;
  239.     end
  240.