home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / EXTRA-ST / CPM-80-E / CPM-0.2 / CPM-0 / cpm-0.2 / z80-sources / libutl / libutl.mac < prev    next >
Encoding:
Text File  |  1994-06-06  |  6.3 KB  |  292 lines

  1. ;************************************************************************
  2. ;*        LIBUTL ver 1.0                        *
  3. ;*        02.06.1986 by M.Bischoff                *
  4. ;*        zerlegt M80-Files in Einzelteile zum            *
  5. ;*        Aufbau von platzsparenden Libraries            *
  6. ;************************************************************************
  7.  
  8. files        equ 3            ;
  9.         maclib MYLIB.MLB    ;
  10.         maclib FILEIO.MLB    ;
  11.  
  12.         if1            ;
  13.           .printx $ Assembling LIBUTL.MAC ver1.0 vom 19.05.1986 $
  14.         else            ;
  15.           .printx $ Pass 2 $    ;
  16.         endif            ;
  17.  
  18. entry:        init            ;
  19.         call collect_up        ; search all inputfiles
  20.         create 2,"LIBTMP.SUB"    ; open Job-Control file
  21.         dma 2,_maxmem##        ; DMA for .SUB file
  22.  
  23.         ld hl,_maxmem##+256    ;
  24. main_loop:    move 11,deffcb+1    ; Dateinamen kopieren
  25.         push hl            ;
  26.         xor a            ;
  27.         ld (de),a        ;
  28.         move 20,deffcb+13,deffcb+12
  29.         call process_file    ; und zerwursten
  30.         pop hl            ;
  31.         ld a,(hl)        ;
  32.         or a            ;
  33.         jr nz,main_loop        ;
  34.         ld a,ctrl_z        ; write end of file
  35.         call subwrite        ; to .SUB-File
  36.         close 2            ; .SUB-File
  37.         ld sp,(ccpstack)    ; ins CCP, Wert Z/NZ }bergeben
  38.         xor a            ; set TRUE status
  39.         ret            ;
  40.  
  41. ;************************************************************************
  42. ;*        eine Zeile vom Source einlesen                *
  43. ;************************************************************************
  44.  
  45.         dseg            ;
  46. line_buffer:    ds 256            ;
  47. current_file:    dw 0            ;
  48. file_name:    ds 13            ; 8*name+'.'+3*ext+0
  49. eof_1:        db 0            ;
  50. linenr:        dw 0            ;
  51.         cseg            ;
  52.  
  53. read_line:    incw linenr        ;
  54.         ld a,(eof_1)        ;
  55.         or a            ;
  56.         ret nz            ;
  57.         ld a,0ffh        ;
  58.         ld (line_buffer+250),a    ;
  59. read_line_00:    readc 1            ;
  60.         ret nz            ;
  61.         and 7fh            ;
  62.         cp ctrl_z        ;
  63.         jr z,ende_input        ;
  64.         cp cr            ;
  65.         jr z,read_line_00    ;
  66.         ld hl,line_buffer    ;
  67. read_line_01:    ld (hl),a        ;
  68.         cp lf            ; Ende der Zeile?
  69.         jr z,eofline        ; dann Schlu~!
  70.         inc hl            ;
  71.         ld a,(hl)        ;
  72.         inc a            ;
  73.         jr z,too_long        ;
  74. read_line_02:    push hl            ;
  75.         readc 1            ;
  76.         pop hl            ;
  77.         jr nz,mark_eof        ;
  78.         and 7fh            ;
  79.         cp cr            ;
  80.         jr z,read_line_02    ; ignore cr
  81.         cp ctrl_z        ;
  82.         jr nz,read_line_01    ;
  83. mark_eof:    ld a,ctrl_z        ;
  84.         ld (eof_1),a        ;
  85. eofline:    ld (hl),0        ;
  86.         xor a            ;
  87.         ret            ;
  88. ende_input:    or 0ffh            ;
  89.         ret            ;
  90.  
  91. too_long:    push hl            ;
  92.         printf stdout,"line %D too long. truncated to 250 chars.\n",(linenr)
  93.         pop hl            ;
  94. too_long_01:    push hl            ;
  95.         readc 1            ;
  96.         pop hl            ;
  97.         jr nz,mark_eof        ;
  98.         cp ctrl_z        ;
  99.         jr z,mark_eof        ;
  100.         cp cr            ;
  101.         jr z,too_long_01    ;
  102.         sub lf            ;
  103.         jr nz,too_long_01    ;
  104.         ld (hl),a        ;
  105.         ret            ;
  106.  
  107. ;************************************************************************
  108. ;*        alle Files sammeln                    *
  109. ;************************************************************************
  110.  
  111. collect_up:    bdos srch_for_first,deffcb
  112.         cp 4            ;
  113.         exit nc,"LIBUTL: no file";
  114.         ld de,_maxmem##+256    ;
  115. collect_files:    rrca            ;
  116.         rrca            ;
  117.         rrca            ;
  118.         index defdma+1        ; Zieladresse
  119.         move 11            ; kopiere Namen
  120.         push de            ;
  121.         bdos srch_for_next    ;
  122.         pop de            ;
  123.         cp 4            ;
  124.         jr c,collect_files    ;
  125.         xor a            ;
  126.         ld (de),a        ;
  127.         inc de            ;
  128.         ld (commonstring),de    ;
  129.         ret            ;
  130.  
  131.         dseg            ;
  132. commonstring:    dw 0            ;
  133. modules:    dw 0            ;
  134. nmodules:    dw 0            ;
  135.         cseg            ;
  136.  
  137. ;************************************************************************
  138. ;*        ein File bearbeiten                    *
  139. ;************************************************************************
  140.  
  141. process_file:    ld hl,deffcb        ;
  142.         call _fileout##        ; gib Namen aus
  143.         ld hl,deffcb        ;
  144.         open 1            ; versuche, Datei zu |ffnen
  145.         jp nz,open_error    ;
  146.         print <cr,lf>        ;
  147.         ld hl,0            ;
  148.         ld (linenr),hl        ;
  149.         xor a            ;
  150.         ld (eof_1),a        ; end of file
  151.         ld de,(commonstring)    ;
  152. next_line:    push de            ; baue init-String auf
  153.         call read_line        ;
  154.         pop de            ;
  155.         jp nz,end_of_file    ;
  156.         ld a,(line_buffer)    ;
  157.         cp '#'            ; file?
  158.         jr z,first_module    ;
  159.         ld hl,line_buffer    ;
  160.         call strcopy        ;
  161.         ld a,cr            ;
  162.         ld (de),a        ;
  163.         inc de            ;
  164.         ld a,lf            ;
  165.         ld (de),a        ;
  166.         inc de            ;
  167.         ld hl,-512        ;
  168.         add hl,sp        ; enough space?
  169.         cmp16            ; c=no!
  170.         jr nc,next_line        ;
  171.         print "not enough space for common lines. file ignored."
  172.         jp end_of_file        ;
  173.  
  174. first_module:    xor a            ; beende init-strings
  175.         ld (de),a        ;
  176.         inc de            ;
  177.         ld (modules),de        ; start of module names
  178.         ld hl,1            ;
  179. next_module:    ld (nmodules),hl    ;
  180.         ld hl,line_buffer+1    ;
  181.         ld bc,8ffh
  182. copy_name:    ld a,(hl)
  183.         cp tab
  184.         jr z,name_ends
  185.         and not ' '
  186.         jr z,name_ends
  187.         ld a,(hl)
  188.         call stdout
  189.         ldi
  190.         djnz copy_name
  191. name_ends:    ld (hl),0
  192.         ldi
  193.         push de            ;
  194.         call one_module        ;
  195.         pop de            ;
  196.         jr nz,no_more_mods    ;
  197.         ld a,','
  198.         call stdout
  199.         ld a,' '
  200.         call stdout
  201.         ld hl,(nmodules)    ;
  202.         inc hl            ;
  203.         jr next_module        ;
  204. no_more_mods:    xor a            ;
  205.         ld (de),a        ; beende Tabelle der Module
  206.         printf subwrite,"xsub\nlib80\n"
  207.         ld hl,deffcb+1        ;
  208.         ld a,(hl)        ;
  209.         ld b,8            ;
  210. libname:    call subwrite        ;
  211.         inc hl            ;
  212.         ld a,(hl)        ;
  213.         cp ' '            ;
  214.         jr z,early_end        ;
  215.         djnz libname        ;
  216. early_end:    printf ,"=\n"        ;
  217.         ld hl,(modules)        ;
  218.         ld a,(hl)        ;
  219. modname_out:    call subwrite        ;
  220.         inc hl            ;
  221.         ld a,(hl)        ;
  222.         or a            ;
  223.         jr nz,modname_out    ;
  224.         ld a,cr            ;
  225.         call subwrite        ;
  226.         ld a,lf            ;
  227.         call subwrite        ;
  228.         inc hl            ;
  229.         ld a,(hl)        ;
  230.         or a            ;
  231.         jr nz,modname_out    ;
  232.         printf subwrite,"/e\nunix\n"    ; SPECIAL for LINUX
  233. end_of_file:    print <cr,lf>        ;
  234.         close 1            ; da MACLIB die FCBs verwaltet
  235.         ret            ;
  236.  
  237. open_error:    print <" cannot open",cr,lf>
  238.         ret            ;
  239.  
  240. strcopy:    ld c,0            ;
  241.         ld a,(hl)        ;
  242.         or a            ;
  243.         ret z            ;
  244.         ldi            ;
  245.         jr strcopy+2        ;
  246.  
  247.         dseg            ;
  248. mac_ext:    db '.MAC',0        ;
  249.         cseg            ;
  250.  
  251.  
  252. one_module:    ld hl,line_buffer+1    ;
  253.         ld de,file_name        ;
  254.         call strcopy        ;
  255.         ld hl,mac_ext        ;
  256.         ld bc,5            ;
  257.         ldir            ;
  258.         ld hl,file_name        ;
  259.         create 3        ;
  260.         exit nz,"Directory full";
  261.         dma 3,_maxmem##+128    ;
  262.         printf macwrite,"%s",(commonstring); common lines
  263. module_loop:    call read_line        ;
  264.         jr nz,eomacf        ;
  265.         ld hl,line_buffer    ;
  266.         ld a,(hl)        ;
  267.         cp '#'            ; next module?
  268.         jr z,eomacf        ;
  269.         push hl            ;
  270.         printf macwrite,"%s\n"    ;
  271.         jr module_loop        ;
  272. eomacf:        push af            ;
  273.         printf macwrite,"^I^Iend\n^Z"
  274.         close 3            ;
  275.         printf subwrite,"m80 =%s\nera %s\n",file_name,file_name
  276.         pop af            ;
  277.         ret            ;
  278.  
  279. subwrite:    save            ;
  280.         ld c,a            ;
  281.         writec 2        ;
  282.         restore            ;
  283.         ret z            ;
  284.         exit ,"Disk full"    ;
  285. macwrite:    save            ;
  286.         ld c,a            ;
  287.         writec 3        ;
  288.         restore            ;
  289.         ret z            ;
  290.         exit ,"Disk full"    ;
  291.         end entry        ;
  292.