home *** CD-ROM | disk | FTP | other *** search
- ;************************************************************************
- ;* LIBUTL ver 1.0 *
- ;* 02.06.1986 by M.Bischoff *
- ;* zerlegt M80-Files in Einzelteile zum *
- ;* Aufbau von platzsparenden Libraries *
- ;************************************************************************
-
- files equ 3 ;
- maclib MYLIB.MLB ;
- maclib FILEIO.MLB ;
-
- if1 ;
- .printx $ Assembling LIBUTL.MAC ver1.0 vom 19.05.1986 $
- else ;
- .printx $ Pass 2 $ ;
- endif ;
-
- entry: init ;
- call collect_up ; search all inputfiles
- create 2,"LIBTMP.SUB" ; open Job-Control file
- dma 2,_maxmem## ; DMA for .SUB file
-
- ld hl,_maxmem##+256 ;
- main_loop: move 11,deffcb+1 ; Dateinamen kopieren
- push hl ;
- xor a ;
- ld (de),a ;
- move 20,deffcb+13,deffcb+12
- call process_file ; und zerwursten
- pop hl ;
- ld a,(hl) ;
- or a ;
- jr nz,main_loop ;
- ld a,ctrl_z ; write end of file
- call subwrite ; to .SUB-File
- close 2 ; .SUB-File
- ld sp,(ccpstack) ; ins CCP, Wert Z/NZ }bergeben
- xor a ; set TRUE status
- ret ;
-
- ;************************************************************************
- ;* eine Zeile vom Source einlesen *
- ;************************************************************************
-
- dseg ;
- line_buffer: ds 256 ;
- current_file: dw 0 ;
- file_name: ds 13 ; 8*name+'.'+3*ext+0
- eof_1: db 0 ;
- linenr: dw 0 ;
- cseg ;
-
- read_line: incw linenr ;
- ld a,(eof_1) ;
- or a ;
- ret nz ;
- ld a,0ffh ;
- ld (line_buffer+250),a ;
- read_line_00: readc 1 ;
- ret nz ;
- and 7fh ;
- cp ctrl_z ;
- jr z,ende_input ;
- cp cr ;
- jr z,read_line_00 ;
- ld hl,line_buffer ;
- read_line_01: ld (hl),a ;
- cp lf ; Ende der Zeile?
- jr z,eofline ; dann Schlu~!
- inc hl ;
- ld a,(hl) ;
- inc a ;
- jr z,too_long ;
- read_line_02: push hl ;
- readc 1 ;
- pop hl ;
- jr nz,mark_eof ;
- and 7fh ;
- cp cr ;
- jr z,read_line_02 ; ignore cr
- cp ctrl_z ;
- jr nz,read_line_01 ;
- mark_eof: ld a,ctrl_z ;
- ld (eof_1),a ;
- eofline: ld (hl),0 ;
- xor a ;
- ret ;
- ende_input: or 0ffh ;
- ret ;
-
- too_long: push hl ;
- printf stdout,"line %D too long. truncated to 250 chars.\n",(linenr)
- pop hl ;
- too_long_01: push hl ;
- readc 1 ;
- pop hl ;
- jr nz,mark_eof ;
- cp ctrl_z ;
- jr z,mark_eof ;
- cp cr ;
- jr z,too_long_01 ;
- sub lf ;
- jr nz,too_long_01 ;
- ld (hl),a ;
- ret ;
-
- ;************************************************************************
- ;* alle Files sammeln *
- ;************************************************************************
-
- collect_up: bdos srch_for_first,deffcb
- cp 4 ;
- exit nc,"LIBUTL: no file";
- ld de,_maxmem##+256 ;
- collect_files: rrca ;
- rrca ;
- rrca ;
- index defdma+1 ; Zieladresse
- move 11 ; kopiere Namen
- push de ;
- bdos srch_for_next ;
- pop de ;
- cp 4 ;
- jr c,collect_files ;
- xor a ;
- ld (de),a ;
- inc de ;
- ld (commonstring),de ;
- ret ;
-
- dseg ;
- commonstring: dw 0 ;
- modules: dw 0 ;
- nmodules: dw 0 ;
- cseg ;
-
- ;************************************************************************
- ;* ein File bearbeiten *
- ;************************************************************************
-
- process_file: ld hl,deffcb ;
- call _fileout## ; gib Namen aus
- ld hl,deffcb ;
- open 1 ; versuche, Datei zu |ffnen
- jp nz,open_error ;
- print <cr,lf> ;
- ld hl,0 ;
- ld (linenr),hl ;
- xor a ;
- ld (eof_1),a ; end of file
- ld de,(commonstring) ;
- next_line: push de ; baue init-String auf
- call read_line ;
- pop de ;
- jp nz,end_of_file ;
- ld a,(line_buffer) ;
- cp '#' ; file?
- jr z,first_module ;
- ld hl,line_buffer ;
- call strcopy ;
- ld a,cr ;
- ld (de),a ;
- inc de ;
- ld a,lf ;
- ld (de),a ;
- inc de ;
- ld hl,-512 ;
- add hl,sp ; enough space?
- cmp16 ; c=no!
- jr nc,next_line ;
- print "not enough space for common lines. file ignored."
- jp end_of_file ;
-
- first_module: xor a ; beende init-strings
- ld (de),a ;
- inc de ;
- ld (modules),de ; start of module names
- ld hl,1 ;
- next_module: ld (nmodules),hl ;
- ld hl,line_buffer+1 ;
- ld bc,8ffh
- copy_name: ld a,(hl)
- cp tab
- jr z,name_ends
- and not ' '
- jr z,name_ends
- ld a,(hl)
- call stdout
- ldi
- djnz copy_name
- name_ends: ld (hl),0
- ldi
- push de ;
- call one_module ;
- pop de ;
- jr nz,no_more_mods ;
- ld a,','
- call stdout
- ld a,' '
- call stdout
- ld hl,(nmodules) ;
- inc hl ;
- jr next_module ;
- no_more_mods: xor a ;
- ld (de),a ; beende Tabelle der Module
- printf subwrite,"xsub\nlib80\n"
- ld hl,deffcb+1 ;
- ld a,(hl) ;
- ld b,8 ;
- libname: call subwrite ;
- inc hl ;
- ld a,(hl) ;
- cp ' ' ;
- jr z,early_end ;
- djnz libname ;
- early_end: printf ,"=\n" ;
- ld hl,(modules) ;
- ld a,(hl) ;
- modname_out: call subwrite ;
- inc hl ;
- ld a,(hl) ;
- or a ;
- jr nz,modname_out ;
- ld a,cr ;
- call subwrite ;
- ld a,lf ;
- call subwrite ;
- inc hl ;
- ld a,(hl) ;
- or a ;
- jr nz,modname_out ;
- printf subwrite,"/e\nunix\n" ; SPECIAL for LINUX
- end_of_file: print <cr,lf> ;
- close 1 ; da MACLIB die FCBs verwaltet
- ret ;
-
- open_error: print <" cannot open",cr,lf>
- ret ;
-
- strcopy: ld c,0 ;
- ld a,(hl) ;
- or a ;
- ret z ;
- ldi ;
- jr strcopy+2 ;
-
- dseg ;
- mac_ext: db '.MAC',0 ;
- cseg ;
-
-
- one_module: ld hl,line_buffer+1 ;
- ld de,file_name ;
- call strcopy ;
- ld hl,mac_ext ;
- ld bc,5 ;
- ldir ;
- ld hl,file_name ;
- create 3 ;
- exit nz,"Directory full";
- dma 3,_maxmem##+128 ;
- printf macwrite,"%s",(commonstring); common lines
- module_loop: call read_line ;
- jr nz,eomacf ;
- ld hl,line_buffer ;
- ld a,(hl) ;
- cp '#' ; next module?
- jr z,eomacf ;
- push hl ;
- printf macwrite,"%s\n" ;
- jr module_loop ;
- eomacf: push af ;
- printf macwrite,"^I^Iend\n^Z"
- close 3 ;
- printf subwrite,"m80 =%s\nera %s\n",file_name,file_name
- pop af ;
- ret ;
-
- subwrite: save ;
- ld c,a ;
- writec 2 ;
- restore ;
- ret z ;
- exit ,"Disk full" ;
- macwrite: save ;
- ld c,a ;
- writec 3 ;
- restore ;
- ret z ;
- exit ,"Disk full" ;
- end entry ;