opt pag,nol lib sysdef ttl Install Utility opt lis pag info UniFLEX Install Utility ifc &a,"tsc" info TSC Internal Version - Not for distribution endif info Version 1.01; Released September 3, 1982 info Copyright (c) 1982 by info Technical Systems Consultants, Inc. info All rights reserved. * Install Utility * Equates ifnc &b,"pennywise" MAPdate equ $5000 Pointer to Install Date MAPkey equ $5004 Pointer to Install key else MAPdate equ $4000 Pointer to Install Date MAPkey equ $4004 Pointer to Install key endif * UNIdate equ $9030 Old version date address UNIkey equ $902B Old version key byte inst ldd 0,s get arg count cmpd #2 lbne synerr error? ldd 4,s get file name std iopn2 set up open call sys ind,iopn open uniflex file lbes err1 error? std fd save file descriptor sys read,bhdr,24 read in header record lbes err2 error? ldd bhdr get 1st 2 bytes cmpd #$212 is it binary file? lbne err3 ifnc &a,"tsc" * Special code -- just to screw up the hacks! sys cpint,12,catch funny here! ldx #$5555 aslb rora * ldd 0,x ldu #$100 tfr u,y pshs y ldy $10 puls y sys gtid get task id sys spint,12 send interrupt swi fcb 3,44,11,199,33,233,11,9,76,88,55,29,86,146,222,76 fcb 44,76,82,34,125,167,23,251,222,76,33,22,11,23,100 cont endif * ldd #2 check UniFLEX type (old vs. configurable) ldx #MAPdate jsr findrec bes 99f jump if error lda 0,x check for old version UniFLEX cmpa #$16 used to be a long branch bne 0f isn't - assume configurable inc OLD_UniFLEX ldx #UNIkey go get key byte bra 1f 0 ldx #MAPkey get pointer to key byte ldd #2 read key address jsr findrec bes 99f ldx 0,x get pointer 1 ldd #1 read 1 byte jsr findrec bes 99f lda 0,x get key byte lbne err3 already installed! ifnc &a,"tsc" lda #123 set key byte value else lda #0 set key byte value endif sta 0,x ldd #1 rewrite 1 byte jsr putrec bes 99f * tst OLD_UniFLEX Old version of UniFLEX? beq 0f no - continue ldx #UNIdate yes - fix up address bra 1f 0 ldd #2 read 2 bytes ldx #MAPdate jsr findrec bes 99f ldx 0,x 1 ldd #4 read 4 bytes of time jsr findrec bes 99f sys time,sbuf get current time ldd sbuf copy date info std 0,x ldd sbuf+2 std 2,x ldd #4 rewrite 4 bytes jsr putrec rewrite record bes 99f * ldd fd get file desc sys close close the file sys update ldd #0 set status sys term exit * 99 lbra err2 go report I/O error * * findrec * * Locate the data record which contains the * address (X). Return with (X) pointing into * the data record for the desired item. * findrec pshs d,x,y,u save registers ldd fd reposition file sys seek,0,24,0 just past binary header bes 90f 10 ldd fd read next "record" info sys read,rechdr,4 bes 90f cmpd #0 end of file? beq 90f ldd rechdr+2 get record address cmpd 2,s check if record contains desired address bhi 20f jump if not addd rechdr compute end of record cmpd 2,s bls 20f jump if not found * Found appropriate record - seek to desired data ldd 2,s compute relative position subd rechdr+2 std isk2 set up for seek ldd fd sys ind,isk seek to data bes 90f ldd 0,s get number of characters desired std ird2 ldd fd read data sys ind,ird bes 90f ldx #buf set up return parameters stx 2,s bra 95f jump - successful exit * Current record not the one we want - go to next one 20 ldd rechdr set to seek past record std isk2 ldd fd sys ind,isk seek past record bes 90f bra 10b continue 90 std 0,s set up return value sec return - failure exit bra 99f 95 clc return - success exit 99 puls d,x,y,u,pc return * * putrec * * Rewrite a portion of the file. * (X) - Buffer address of changed portion * (D) - Number of bytes altered * putrec pshs d,x,y,u save registers std iwrt2 set up for write coma comb addd #1 compute -(D) std sk_back2 set up seek call ldd fd reposition file sys ind,sk_back bes 90f ldd fd rewrite data sys ind,iwrt bes 90f bra 95f exit 90 std 0,s return error code sec return - failure bra 99f 95 clc return - success 99 puls d,x,y,u,pc ifnc &a,"tsc" * more junk fcb 11,22,65,77,55,34,99,87,23,44,56,77,123,43 fcb 44,33,65,77,21,76,87,34,23,87,65,87,123,11 catch ldd #cont std 10,s reset pc rti return fcb 1,33,55,66,88,97,65,123,234,251,218,23,87,108 endif * * Error routines * synerr ldd #2 set file desc sys write,E0,S0 ldd #$ff set status sys term err1 pshs d ldd #2 sys write,E1,S1 puls d sys term err2 pshs d ldd #2 sys write,E2,S2 puls d sys term err3 ldd #2 sys write,E3,S3 ldd #$ff set status sys term * messages E0 fcc 'Command syntax error.',$d S0 equ *-E0 E1 fcc "Can't open the specified file.",$d S1 equ *-E1 E2 fcc 'File read error.',$d S2 equ *-E2 E3 fcc 'Bad file!',$d S3 equ *-E3 * storage iopn fcb open open call iopn2 fdb 0,2 isk fcb seek seek call fdb 0 isk2 fdb 0,1 sk_back fcb seek seek backward in file fdb -1 sk_back2 fdb 0,1 ird fcb read read data fdb buf buffer address ird2 fdb 0 buffer size iwrt fcb write write data fdb buf iwrt2 fdb 0 buffer size fd fdb 0 OLD_UniFLEX fcb 0 Old UniFLEX file being installed rechdr fdb 0,0 Absolute Load record header sbuf rzb 32 status buffer bhdr rzb 32 header record buffer buf rmb 512 space for data record end inst