!***************************************************************************!
!                                                                           !
!                                SYSGEN.BAS                                 !
!          Automatic System Initialization File Generation Program          !
!                                                                           !
!***************************************************************************!
!Written @LMS Technical Services, Inc. by David F. Pallmann.

       PROGRAM SYSGEN,1.0

IO'SPACE:
       MAP1 PORT'120, F, 6, 4          !I/O port address - AM120 board
       MAP1 PORT'210, F, 6, 240        !I/O port address - AM210 board
       MAP1 PORT'300, F, 6, 248        !I/O port address - AM300 board
       MAP1 PORT'300'2, F, 6, 232      !I/O port address - AM300 board #2
       MAP1 PORT'300'3, F, 6, 216      !I/O port address - AM300 board #3
       MAP1 PORT'300'4, F, 6, 104      !I/O port address - AM300 board #4
       MAP1 PORT'300'5, F, 6, 96       !I/O port address - AM300 board #5
       MAP1 PORT'310, F, 6, 176        !I/O port address - AM310 board
       MAP1 PORT'310'2, F, 6, 180      !I/O port address - AM310 board #2
       MAP1 PORT'310'3, F, 6, 184      !I/O port address - AM310 board #3
       MAP1 PORT'320, F, 6, 194        !I/O port address - AM320 board
       MAP1 PORT'330, F, 6, 133        !I/O port address - AM330 board
       MAP1 PORT'415, F, 6, 208        !I/O port address - AM415 board
       MAP1 PORT'420, F, 6, 196        !I/O port address - AM420 board
       MAP1 PORT'500, F, 6, 192        !I/O port address - AM500 board
       MAP1 PORT'600, F, 6, 160        !I/O port address - AM600 board
       MAP1 PORT'610, F, 6, 212        !I/O port address - AM610 board
       MAP1 PORT'620, F, 6, 103        !I/O port address - AM620 (AM120) port

MAPS:   MAP1 MEMORY, F, 6, 0            !amount of memory detected
       MAP1 JOBS, F, 6, 0              !number of jobs to allocate
       MAP1 PART, F, 6                 !partion size
       MAP1 MISSING, F, 6, 255         !means board is missing
       MAP1 I, F, 6                    !temporary
       MAP1 ADDR, F, 6                 !address
       MAP1 TEXT, S, 80                !text string
       MAP1 PORT, F, 6                 !port number
       MAP1 TRM, F, 6                  !current terminal number
       MAP1 BASE, F, 6                 !base port number
       MAP1 AM210, F, 6, 0             !set if an AM210 is present
       MAP1 AM300, F, 6, 0             !set if any AM300s are present
       MAP1 COUNT'300, F, 6, 0         !number of AM300s detected
       MAP1 AM310, F, 6, 0             !set if any AM310s are present
       MAP1 COUNT'310, F, 6, 0         !number of AM310s detected
       MAP1 AM320, F, 6, 0             !set if an AM320 is present
       MAP1 AM330, F, 6, 0             !set if an AM330 is present
       MAP1 AM410, F, 6, 0             !set if an AM410 is present
       MAP1 AM415, F, 6, 0             !set if an AM415 is present
       MAP1 AM420, F, 6, 0             !set if an AM420 is present
       MAP1 AM500, F, 6, 0             !set if an AM500 is present
       MAP1 AM600, F, 6, 0             !set if an AM600 is present
       MAP1 AM610, F, 6, 0             !set if an AM610 is present
       MAP1 AM620, F, 6, 0             !set if an AM620 is present

START:  PRINT "Generating SYSTEM.INI.";
       OPEN #1, "SYSTEM.INI", OUTPUT
       PRINT "."; : CALL MAP'IO
       PRINT "."; : CALL HEADER
       PRINT "."; : CALL JOBS
       PRINT "."; : CALL TRMDEF
       PRINT "."; : CALL DEVTBL
       PRINT "."; : CALL BITMAP
       PRINT "."; : CALL QUEUE
       PRINT "."; : CALL SYSTEM
       PRINT "."; : CALL SETUPS
       PRINT "."; : CALL END
       PRINT "."; : CLOSE #1
       PRINT "."
       END

MAP'IO: IF IO(PORT'210)<>MISSING THEN AM210 = 1
       IF IO(PORT'300)<>MISSING THEN AM300 = 1 : COUNT'300 = 1
       IF IO(PORT'300'2)<>MISSING THEN COUNT'300 = 2
       IF IO(PORT'300'3)<>MISSING THEN COUNT'300 = 3
       IF IO(PORT'300'4)<>MISSING THEN COUNT'300 = 4
       IF IO(PORT'300'5)<>MISSING THEN COUNT'300 = 5
       IF IO(PORT'310)<>MISSING THEN AM310 = 1 : COUNT'310 = 1
       IF IO(PORT'310'2)<>MISSING THEN COUNT'310 = 2
       IF IO(PORT'310'3)<>MISSING THEN COUNT'310 = 3
       IF IO(PORT'320)<>MISSING THEN AM320 = 1
       IF IO(PORT'330)<>MISSING THEN AM330 = 1
       IF IO(PORT'415)<>MISSING THEN AM415 = 1
       IF IO(PORT'420)<>MISSING THEN AM420 = 1
       IF IO(PORT'500)<>MISSING THEN AM500 = 1
       IF IO(PORT'600)<>MISSING THEN AM600 = 1
       IF IO(PORT'610)<>MISSING THEN AM610 = 1
       IF IO(PORT'620)<>MISSING THEN AM620 = 1
       MEMORY = WORD(1040)*2^6
       JOBS = (COUNT'300*6)+(COUNT'310*4)+2
       RETURN

HEADER: PRINT #1, ":T"
       PRINT #1, ";System Initialization by SYSGEN version 1"
       PRINT #1, ";"
       PRINT #1, ";Configuration:"
       PRINT #1, ";"
       PRINT #1, ";     1 - AM100L CPU"
       PRINT #1, ";       - "; STR(MEMORY); "K bytes of memory"
       IF AM210=1 THEN PRINT #1, ";     1 - AM210 floppy disk"
       IF AM300=1 THEN PRINT #1, ";    "; COUNT'300; "- AM300 6-port serial I/O"
       IF AM310=1 THEN PRINT #1, ";    "; COUNT'310; "- AM310 4-port serial I/O"
       IF AM320=1 THEN PRINT #1, ";     1 - AM320 line printer interface"
       IF AM330=1 THEN PRINT #1, ";     1 - AM330 communications board"
       IF AM410=1 THEN PRINT #1, ";     1 - AM410 Phoenix disk controller"
       IF AM415=1 THEN PRINT #1, ";     1 - AM415 Fujitsu disk controller"
       IF AM420=1 THEN PRINT #1, ";     1 - AM420 Priam disk controller"
       IF AM500=1 THEN PRINT #1, ";     1 - AM500 Hawk disk controller"
       IF AM600=1 THEN PRINT #1, ";     1 - AM600 magtape interface"
       IF AM610=1 THEN PRINT #1, ";     1 - AM610 VCR interface"
       IF AM620=1 THEN PRINT #1, ";     1 - AM620 streamer tape drive"
       RETURN

JOBS:   PRINT #1, "JOBS "; STR(JOBS)
       FOR I = 1 TO JOBS-1
           IF I=1 THEN GOTO NEW'JOBALC
           IF I/10=INT(I/10) THEN GOTO NEW'JOBALC
           PRINT #1, ",JOB"; STR(I);
           GOTO JOB'NEXT

NEW'JOBALC: PRINT #1
           PRINT #1, "JOBALC JOB"; STR(I);

JOB'NEXT:   NEXT I
       PRINT #1
       PRINT #1, "JOBALC SPOOL"
       PRINT #1
       RETURN

TRMDEF: PRINT #1, "TRMDEF TRM1,AM100L=0:9600,ALPHA,100,100,100"
       TRM = 1
       CALL AM120
       CALL AM300'1
       CALL AM300'2
       CALL AM300'3
       CALL AM300'4
       CALL AM300'5
       CALL AM310'1
       CALL AM310'2
       CALL AM310'3
       PRINT #1, "TRMDEF PRINTR,AM100L=1:9600,TELTYP,2,2,25"
       PRINT #1, "TRMDEF PSEUDO,PSEUDO,NULL,100,100,100"
       PRINT #1
       RETURN

       AM120:  FOR PORT = 0 TO 1
                   TRM = TRM+1
                   PRINT #1, "TRMDEF TRM"; STR(TRM); ",AM120="; STR(PORT);
                   PRINT #1, ":9600,ALPHA,100,100,100"
                   NEXT PORT
               RETURN

       AM300'1:
               BASE = 1
               CALL AM300
               RETURN

       AM300'2:
               IF COUNT'300<2 THEN RETURN
               BASE = 11
               CALL AM300
               RETURN

       AM300'3:
               IF COUNT'300<3 THEN RETURN
               BASE = 21
               CALL AM300
               RETURN

       AM300'4:
               IF COUNT'300<4 THEN RETURN
               BASE = 31
               CALL AM300
               RETURN

       AM300'5:
               IF COUNT'300<5 THEN RETURN
               BASE = 41
               CALL AM300
               RETURN

       AM300:  FOR PORT = 0 TO 5
                   TRM = TRM+1
                   PRINT #1, "TRMDEF TRM"; STR(TRM); ",AM300="; STR(BASE+PORT);
                   PRINT #1, ":9600,ALPHA,100,100,100"
                   NEXT PORT
               RETURN

       AM310'1:
               BASE = 0
               CALL AM310
               RETURN

       AM310'2:
               IF COUNT'310<2 THEN RETURN
               BASE = 4
               CALL AM310
               RETURN

       AM310'3:
               IF COUNT'310<3 THEN RETURN
               BASE = 10
               CALL AM310
               RETURN

       AM310:  FOR PORT = 0 TO 3
                   TRM = TRM+1
                   PRINT #1, "TRMDEF TRM"; STR(TRM); ",AM310="; STR(BASE+PORT);
                   PRINT #1, ":9600,ALPHA,100,100,100"
                   NEXT PORT
               RETURN

DEVTBL: IF AM410=1 THEN PRINT #1, "DEVTBL DSK1,DSK2,DSK3,DSK4,DSK5"
       IF AM415=1 THEN PRINT #1, "DEVTBL DSK1,DSK2"
       IF AM420=1 THEN PRINT #1, "DEVTBL DSK1,DSK2"
       PRINT #1, "DEVTBL TRM,RES,MEM"
       IF AM320=1 THEN PRINT #1, "DEVTBL /LPR0"
       IF AM600=1 THEN PRINT #1, "DEVTBL /MTU0"
       IF AM610=1 THEN PRINT #1, "DEVTBL /VCR0"
       IF AM620=1 THEN PRINT #1, "DEVTBL /STR0"
       PRINT #1
       RETURN

BITMAP: CALL BITMAP'PHOENIX
       CALL BITMAP'FUJI
       CALL BITMAP'PRIAM
       PRINT #1
       RETURN

BITMAP'PHOENIX:
       IF AM410=0 THEN RETURN
       FOR I = 0 TO 5
           PRINT #1, "BITMAP DSK,1818,"; STR(I)
           NEXT I
       RETURN

BITMAP'FUJI:
       IF AM415=0 THEN RETURN
       FOR I = 0 TO 2
           PRINT #1, "BITMAP DSK,3702,"; STR(I)
           NEXT I
       RETURN

BITMAP'PRIAM:
       IF AM420=0 THEN RETURN
       FOR I = 0 TO 2
           PRINT #1, "BITMAP DSK,1288,"; STR(I)
           NEXT I
       RETURN

QUEUE:  PRINT #1, "QUEUE "; STR(JOBS*5+20)
       PRINT #1
       RETURN

SYSTEM: RETURN

SETUPS: PRINT #1, "ATTACH PSEUDO,SPOOL"
       PRINT #1, "KILL SPOOL"
       PRINT #1, "FORCE SPOOL"
       PRINT #1, "MEMORY 6K"
       PRINT #1, "LOG SYS:"
       PRINT #1, "LPTINI PRINTR.INI"
       PRINT #1
       PRINT #1, "WAIT SPOOL"
       PRINT #1, "ATTACH PRINTR,SPOOL"
       PRINT #1
       PART = INT((MEMORY-6)/JOBS)
       FOR I = 2 TO JOBS-1
           PRINT #1, "ATTACH TRM"; STR(I); ",JOB"; STR(I)
           PRINT #1, "KILL JOB"; STR(I)
           PRINT #1, "FORCE JOB"; STR(I)
           PRINT #1, "MEMORY "; STR(PART); "K"
           PRINT #1, "VER"
           PRINT #1
           PRINT #1, "WAIT JOB"; STR(I)
           PRINT #1
           NEXT I
       RETURN

END:    PRINT #1, "MEMORY 0"
       RETURN

       END