!***************************************************************************!
!                                                                           !
!                            AM-1092-M SIMULATOR                            !
!                                                                           !
!***************************************************************************!
!Copyright (C) 1986 by UltraSoft.  All Rights Reserved.
!
!Written by: David Pallmann
!
!Edit History:
!04-Jul-86 created. /DFP

       MAP1 I,F
       MAP1 J,F
       MAP1 COMMAND,S,1
       MAP1 TEXT,S,80
       MAP1 COVER,F
       MAP1 CPU,F
       MAP1 MEM1,F
       MAP1 MEM2,F
       MAP1 AM415,F
       MAP1 VCR,F
       MAP1 DISK,F
       MAP1 AM600,F
       MAP1 TAPE,F
       MAP1 AM316,F
       MAP1 TERM,F

INIT:   COVER = -1
       CPU = -1
       MEM1 = -1
       MEM2 = -1
       AM415 = -1
       VCR = -1
       DISK = -1
       AM600 = -1
       TAPE = -1
       AM316 = -1
       TERM = -1

SCREEN: PRINT TAB(-1,0);
       PRINT "UltraSoft AM1092M simulator";
       PRINT TAB(3,56); "B       - boot system";
       PRINT TAB(4,56); "R COVER - remove  cover";
       PRINT TAB(5,56); "R CPU   - remove  AM100L";
       PRINT TAB(6,56); "R MEM1  - remove  AM720 1";
       PRINT TAB(7,56); "R MEM2  - remove  AM720 2";
       PRINT TAB(8,56); "R 415   - remove  AM415";
       PRINT TAB(9,56); "R VCR   - remove  AM610";
       PRINT TAB(10,56); "R DISK  - remove  drive";
       PRINT TAB(11,56); "R 600   - remove  AM600";
       PRINT TAB(12,56); "R TAPE  - remove  magtape";
       PRINT TAB(13,56); "R 316   - remove  AM316";
       PRINT TAB(14,56); "R TERM  - remove  CRT";
       PRINT TAB(15,56); "W TAPE  - warm boot AM600";
       PRINT TAB(16,56); "W VCR   - warm boot AM610";
       PRINT TAB(17,56); "Q       - quit";
       PRINT TAB(-1,23);
       CALL PRINT'DISK
       CALL PRINT'TAPE
       CALL PRINT'TERM

DRAW:   PRINT TAB(-1,23);
       IF COVER THEN CALL PRINT'COVER : GOTO SELECT
       CALL PRINT'BUS
       IF CPU THEN CALL PRINT'CPU
       IF MEM1 THEN CALL PRINT'MEM1
       IF MEM2 THEN CALL PRINT'MEM2
       IF AM415 THEN CALL PRINT'AM415
       IF VCR THEN CALL PRINT'VCR
       IF AM600 THEN CALL PRINT'AM600
       IF AM316 THEN CALL PRINT'AM316

SELECT: PRINT TAB(-1,28);
       PRINT TAB(-1,24);
       PRINT TAB(20,56); ">"; TAB(-1,9);
       INPUT LINE TEXT
       PRINT TAB(-1,23);
       PRINT TAB(-1,10);
       IF TEXT="" THEN GOTO SELECT
       TEXT = UCS(TEXT)
       PRINT TAB(22,56);
       COMMAND = LEFT(TEXT,1)
       TEXT = RIGHT(TEXT,LEN(TEXT)-2)
       IF COMMAND="B" THEN GOTO BOOT
       IF COMMAND="R" THEN GOTO REMOVE
       IF COMMAND="Q" THEN GOTO FINISH
       IF COMMAND="W" THEN GOTO WARM

WHAT:   PRINT TAB(-1,24); "What?" TAB(-1,23);
       GOTO SELECT

WARM:   IF TEXT="VCR" THEN GOTO WARM'VCR
       IF TEXT="610" THEN GOTO WARM'VCR
       IF TEXT="AM610" THEN GOTO WARM'VCR
       IF TEXT="TAPE" THEN GOTO WARM'TAPE
       IF TEXT="600" THEN GOTO WARM'TAPE
       IF TEXT="AM600" THEN GOTO WARM'TAPE
       GOTO WHAT

WARM'VCR:
       PRINT TAB(-1,29);
       PRINT TAB(-1,24);
       FOR I = 7 TO 11
           PRINT TAB(I,32); SPACE(13);
           NEXT I
       IF COVER PRINT TAB(14,18); " "; : CALL WAIT : CALL WAIT
       IF CPU ELSE GOTO NO'BOOT
       IF MEM1 ELSE GOTO NO'BOOT
       IF VCR ELSE GOTO NO'BOOT
       GOTO BOOTUP

WARM'TAPE:
       PRINT TAB(-1,29);
       PRINT TAB(-1,24);
       FOR I = 7 TO 11
           PRINT TAB(I,32); SPACE(13);
           NEXT I
       IF COVER PRINT TAB(14,18); " "; : CALL WAIT : CALL WAIT
       IF CPU ELSE GOTO NO'BOOT
       IF MEM1 ELSE GOTO NO'BOOT
       IF AM600 ELSE GOTO NO'BOOT
       IF TAPE ELSE GOTO NO'BOOT
       GOTO BOOTUP

BOOT:   PRINT TAB(-1,29);
       PRINT TAB(-1,24);
       FOR I = 7 TO 11
           PRINT TAB(I,32); SPACE(13);
           NEXT I
       IF COVER PRINT TAB(14,18); " "; : CALL WAIT : CALL WAIT
       IF CPU ELSE GOTO NO'BOOT
       IF MEM1 ELSE GOTO NO'BOOT
       IF COVER PRINT TAB(14,18); "b"; : CALL WAIT : CALL WAIT

BOOTUP: PRINT TAB(-1,24);
       IF COVER PRINT TAB(14,18); "F"; : CALL WAIT : CALL WAIT
       IF NOT(DISK) AND COVER THEN PRINT TAB(14,18); "3"; : CALL WAIT : CALL WAIT
       IF NOT(DISK) THEN GOTO NO'BOOT
       IF NOT(AM415) AND COVER THEN PRINT TAB(14,18); "3"; : CALL WAIT : CALL WAIT
       IF NOT(AM415) THEN GOTO NO'BOOT
       PRINT TAB(14,18); " "; : CALL WAIT : CALL WAIT
       IF NOT(AM316) THEN PRINT TAB(22,56); "Terminal Dead"; : GOTO SELECT
       IF NOT(TERM) THEN PRINT TAB(22,56); "Terminal Dead"; : GOTO SELECT
       PRINT TAB(7,32); ".TRMDEF";
       PRINT TAB(8,32); ".DEVTBL"; : CALL WAIT
       PRINT TAB(9,32); ".BITMAP";
       PRINT TAB(10,32); ".SYSTEM"; : CALL WAIT
       PRINT TAB(11,32); ".MEMORY 0";
       PRINT TAB(22,56); "System Up";
       PRINT TAB(23,56);
       IF MEM1 AND MEM2 THEN PRINT "1024K"; ELSE PRINT "512K";
       PRINT " memory present";
       GOTO SELECT

NO'BOOT:
       PRINT TAB(8,36); "X"; TAB(8,40); "X";
       PRINT TAB(10,35); "_______";
       PRINT TAB(-1,24); TAB(22,56); "** NO BOOT **";
       GOTO SELECT

REMOVE: IF TEXT="COVER" THEN GOTO R'COVER
       IF TEXT="CPU" THEN GOTO R'CPU
       IF TEXT="MEM" THEN GOTO R'MEM
       IF TEXT="720" THEN GOTO R'MEM
       IF TEXT="MEM1" THEN GOTO R'MEM1
       IF TEXT="MEM2" THEN GOTO R'MEM2
       IF TEXT="AM415" THEN GOTO R'AM415
       IF TEXT="415" THEN GOTO R'AM415
       IF TEXT="VCR" THEN GOTO R'VCR
       IF TEXT="610" THEN GOTO R'VCR
       IF TEXT="AM610" THEN GOTO R'VCR
       IF TEXT="DISK" THEN GOTO R'DISK
       IF TEXT="AM600" THEN GOTO R'AM600
       IF TEXT="600" THEN GOTO R'AM600
       IF TEXT="TAPE" THEN GOTO R'TAPE
       IF TEXT="MAGTAPE" THEN GOTO R'TAPE
       IF TEXT="AM316" THEN GOTO R'AM316
       IF TEXT="316" THEN GOTO R'AM316
       IF TEXT="TERM" THEN GOTO R'TERM
       IF TEXT="TRM" THEN GOTO R'TERM
       IF TEXT="CRT" THEN GOTO R'TERM
       GOTO WHAT

R'COVER:
       IF COVER ELSE GOTO REPLACE'COVER

REMOVE'COVER:
       PRINT TAB(-1,24); "Cover removed"; TAB(4,66); "replace"; TAB(-1,23);
       COVER = 0
       FOR I = 10 TO 15
           PRINT TAB(I,1); SPACE(23);
           NEXT I
       GOTO DRAW

REPLACE'COVER:
       PRINT TAB(-1,24); "Cover replaced"; TAB(4,66); "remove "; TAB(-1,23);
       COVER = -1
       GOTO DRAW

R'TERM: IF TERM ELSE GOTO REPLACE'TERM

REMOVE'TERM:
       PRINT TAB(-1,24); "Terminal removed";
       PRINT TAB(14,66); "replace";
       TERM = 0
       FOR I = 6 TO 13
           PRINT TAB(I,29); SPACE(19);
           NEXT I
       GOTO SELECT

REPLACE'TERM:
       PRINT TAB(-1,24); "Terminal replaced";
       PRINT TAB(14,66); "remove ";
       TERM = -1
       CALL PRINT'TERM
       GOTO SELECT

R'DISK: IF DISK ELSE GOTO REPLACE'DISK

REMOVE'DISK:
       PRINT TAB(-1,24); "Drive removed";
       PRINT TAB(10,66); "replace";
       DISK = 0
       FOR I = 17 TO 23
           PRINT TAB(I,1); SPACE(23);
           NEXT I
       GOTO SELECT

REPLACE'DISK:
       PRINT TAB(-1,24); "Drive replaced";
       PRINT TAB(10,66); "remove ";
       DISK = -1
       PRINT TAB(-1,23);
       CALL PRINT'DISK
       GOTO SELECT

R'AM600:
       IF COVER THEN GOTO FIRST
       IF AM600 ELSE GOTO REPLACE'AM600

REMOVE'AM600:
       PRINT TAB(-1,24); "AM600 removed";
       PRINT TAB(11,66); "replace";
       AM600 = 0
       FOR I = 10 TO 14
           PRINT TAB(I,11); " ";
           NEXT I
       GOTO SELECT

REPLACE'AM600:
       PRINT TAB(-1,24); "AM600 replaced";
       PRINT TAB(11,66); "remove ";
       AM600 = -1
       PRINT TAB(-1,23);
       CALL PRINT'AM600
       GOTO DRAW

R'TAPE: IF TAPE ELSE GOTO REPLACE'TAPE

REMOVE'TAPE:
       PRINT TAB(-1,24); "Tape Drive removed";
       PRINT TAB(12,66); "replace";
       TAPE = 0
       FOR I = 6 TO 8
           PRINT TAB(I,1); SPACE(23);
           NEXT I
       GOTO SELECT

REPLACE'TAPE:
       PRINT TAB(-1,24); "Tape Drive replaced";
       PRINT TAB(12,66); "remove ";
       TAPE = -1
       PRINT TAB(-1,23);
       CALL PRINT'TAPE
       GOTO SELECT

R'CPU:  IF COVER THEN GOTO FIRST
       IF CPU ELSE GOTO REPLACE'CPU

REMOVE'CPU:
       PRINT TAB(-1,24); "CPU removed"; TAB(5,66); "replace"; TAB(-1,23);
       CPU = 0
       FOR I = 10 TO 14
           PRINT TAB(I,1); " ";
           NEXT I
       GOTO SELECT

REPLACE'CPU:
       PRINT TAB(-1,24); "CPU replaced"; TAB(5,66); "remove "; TAB(-1,23);
       CPU = -1
       CALL PRINT'CPU
       GOTO SELECT

R'MEM:  IF COVER THEN GOTO FIRST
       IF MEM1 THEN GOTO R'MEM1
       IF MEM2 THEN GOTO R'MEM2
       GOTO R'MEM1

R'MEM2: IF COVER THEN GOTO FIRST
       IF MEM2 ELSE GOTO REPLACE'MEM2

REMOVE'MEM2:
       PRINT TAB(-1,24); "Memory #2 removed"; TAB(7,66); "replace";
       MEM2 = 0
       FOR I = 10 TO 14
           PRINT TAB(I,5); " ";
           NEXT I
       GOTO SELECT

REPLACE'MEM2:
       PRINT TAB(-1,24); "Memory #2 replaced"; TAB(7,66); "remove ";
       MEM2 = -1
       GOTO DRAW

R'MEM1: IF COVER THEN GOTO FIRST
       IF MEM1 ELSE GOTO REPLACE'MEM1

REMOVE'MEM1:
       PRINT TAB(-1,24); "Memory #1 removed"; TAB(6,66); "replace";
       MEM1 = 0
       FOR I = 10 TO 14
           PRINT TAB(I,3); " ";
           NEXT I
       GOTO SELECT

REPLACE'MEM1:
       PRINT TAB(-1,24); "Memory #1 replaced"; TAB(6,66); "remove";
       MEM1 = -1
       GOTO DRAW

R'AM415:
       IF COVER THEN GOTO FIRST
       IF AM415 ELSE GOTO REPLACE'AM415

REMOVE'AM415:
       PRINT TAB(-1,24); "AM415 removed"; TAB(8,66); "replace";
       AM415 = 0
       FOR I = 10 TO 14
           PRINT TAB(I,7); " ";
           NEXT I
       GOTO SELECT

REPLACE'AM415:
       PRINT TAB(-1,24); "AM415 replaced"; TAB(8,66); "remove ";
       AM415 = -1
       GOTO DRAW

R'VCR:  IF COVER THEN GOTO FIRST
       IF VCR ELSE GOTO REPLACE'VCR

REMOVE'VCR:
       PRINT TAB(-1,24); "AM610 removed"; TAB(9,66); "replace";
       VCR = 0
       FOR I = 10 TO 14
           PRINT TAB(I,9); " ";
           NEXT I
       GOTO SELECT

REPLACE'VCR:
       PRINT TAB(-1,24); "AM610 replaced"; TAB(9,66); "remove ";
       VCR = -1
       GOTO DRAW

R'AM316:
       IF COVER THEN GOTO FIRST
       IF AM316 ELSE GOTO REPLACE'AM316

REMOVE'AM316:
       PRINT TAB(-1,24); "AM316 removed"; TAB(13,66); "replace";
       AM316 = 0
       FOR I = 10 TO 14
           PRINT TAB(I,13); " ";
           NEXT I
       GOTO SELECT

REPLACE'AM316:
       PRINT TAB(-1,24); "AM316 replaced"; TAB(13,66); "remove ";
       AM316 = -1
       GOTO DRAW

FIRST:  PRINT TAB(-1,24); "Remove cover first";
       GOTO SELECT

FINISH: PRINT TAB(-1,24);
       PRINT TAB(24,1);
       END

PRINT'COVER:
       FOR I = 10 TO 15
           PRINT TAB(I,1);
           FOR J = 1 TO 23
               PRINT TAB(-1,49);
               NEXT J
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(12,8); " AM-1092 ";
       PRINT TAB(14,18); "  ";
       PRINT TAB(-1,23);
       RETURN

PRINT'DISK:
       FOR I = 17 TO 19
           PRINT TAB(I,1);
           FOR J = 1 TO 23
               PRINT TAB(-1,49);
               NEXT J
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(18,8); "   DISK  ";
       PRINT TAB(-1,23);
       RETURN

PRINT'BUS:
       FOR I = 1 TO 22 STEP 2
           PRINT TAB(15,I); TAB(-1,45); TAB(-1,46);
           NEXT I
       PRINT TAB(-1,45);
       RETURN

PRINT'CPU:
       FOR I = 10 TO 14
           PRINT TAB(I,1); TAB(-1,47);
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(11,1); "C";
       PRINT TAB(12,1); "P";
       PRINT TAB(13,1); "U";
       PRINT TAB(-1,23);
       RETURN

PRINT'MEM1:
       FOR I = 10 TO 14
           PRINT TAB(I,3); TAB(-1,47);
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(11,3); "M";
       PRINT TAB(12,3); "E";
       PRINT TAB(13,3); "M";
       PRINT TAB(-1,23);
       RETURN

PRINT'MEM2:
       FOR I = 10 TO 14
           PRINT TAB(I,5); TAB(-1,47);
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(11,5); "M";
       PRINT TAB(12,5); "E";
       PRINT TAB(13,5); "M";
       PRINT TAB(-1,23);
       RETURN

PRINT'AM415:
       FOR I = 10 TO 14
           PRINT TAB(I,7); TAB(-1,47);
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(11,7); "4";
       PRINT TAB(12,7); "1";
       PRINT TAB(13,7); "5";
       PRINT TAB(-1,23);
       RETURN

PRINT'VCR:
       FOR I = 10 TO 14
           PRINT TAB(I,9); TAB(-1,47);
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(11,9); "6";
       PRINT TAB(12,9); "1";
       PRINT TAB(13,9); "0";
       PRINT TAB(-1,23);
       RETURN

PRINT'AM600:
       FOR I = 10 TO 14
           PRINT TAB(I,11); TAB(-1,47);
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(11,11); "6";
       PRINT TAB(12,11); "0";
       PRINT TAB(13,11); "0";
       PRINT TAB(-1,23);
       RETURN

PRINT'TAPE:
       FOR I = 6 TO 8
           PRINT TAB(I,1);
           FOR J = 1 TO 23
               PRINT TAB(-1,49);
               NEXT J
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(7,8); "  TAPE  ";
       PRINT TAB(-1,23);
       RETURN

PRINT'AM316:
       FOR I = 10 TO 14
           PRINT TAB(I,13); TAB(-1,47);
           NEXT I
       PRINT TAB(-1,24);
       PRINT TAB(11,13); "3";
       PRINT TAB(12,13); "1";
       PRINT TAB(13,13); "6";
       PRINT TAB(-1,23);
       RETURN

PRINT'TERM:
       PRINT TAB(-1,23);
       PRINT TAB(6,30); TAB(-1,38);
       FOR I = 1 TO 15 : PRINT TAB(-1,46); : NEXT I
       PRINT TAB(-1,39);
       FOR I = 7 TO 11
           PRINT TAB(I,30); TAB(-1,47); TAB(I,46); TAB(-1,47);
           PRINT TAB(I,45); TAB(-1,33); TAB(I,31); TAB(-1,32);
           NEXT I
       PRINT TAB(12,30); TAB(-1,40);
       FOR I = 1 TO 15 : PRINT TAB(-1,46); : NEXT I
       PRINT TAB(-1,41);
       PRINT TAB(13,29); TAB(-1,40);
       FOR I = 1 TO 17 : PRINT TAB(-1,46); : NEXT I
       PRINT TAB(-1,41);
       PRINT TAB(12,29); TAB(-1,38); TAB(12,47); TAB(-1,39);
       PRINT TAB(-1,23);
       RETURN

WAIT:   FOR I = 1 TO 1500
           NEXT I
       RETURN