 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
