Thursday, February 27, 2020

PC/370 Hangman Simulation



On Monday my daughter told me about her latest high school Computer Science lab assignment - a simulation of the "Hangman" game. As kids we all played it on scraps of paper or a chalk board. For those not familiar it closely resembles "Wheel of Fortune" - taking turns guessing a letter to solve the puzzle. Each time you guess wrong a piece of the hangman is drawn until the head, torso, arms & legs are revealed - 6 errors - then you're dead! A bit macabre but still an interesting game...

Of course, I was compelled to create my own version in preparation for any questions or issues my daughter may have. Again, PC/370 was the perfect tool - I wanted something flexible & quick. I had the evening free on Tuesday (02/25) so I sat down in the kitchen & got started. With my laptop in front of me, a full glass of Paisano ($14.99/gallon) & an episode of Columbo playing on my phone I got to work.

NOTE - This is merely a fun & relaxing exercise. There are multiple approaches & this by no means is an Assembler "purity" test. This is 370 emulation on a PC - it accesses DOS Interrupts via SVC calls. Screen handling, keyboard control, etc. is exclusively for the PC. I am leveraging that capability to build this application.

Incidently, there's a line in one of Colombo's episodes (Exercise in Fatality) that relates perfectly to "Hangman":

"You tried to create the perfect alibi, and it's your perfect alibi that's going to hang you."
 

Back to business. First, I hashed out the screen display on scrap paper - then decided to have each puzzle phrase contained in an input text file. Up to 20 seemed reasonable - and they can be easily changed. I'd like to track all letters selected as well as counts of total moves, matches & errors. I thought control keys for Exit, New Game & Solving the Puzzle would be reasonable. Oh, and somehow creating the little hangman guy would be fitting. A few hours & another glass of Paisano later it was complete. Assembled, Linked & Tested...

INITIAL SCREEN - Let the fun begin...

All letters in the phrase are displayed as underscores.


Selecting Letters - Closer to solving the puzzle (Of course, I already know the answers).

As letters are selected an asterisk tags them in the alphabet list & are revealed in the phrase.




WINNER - The puzzle is solved.

When the phrase is complete the WINNER message is displayed.




Another Example - Losing at Hangman

Pressing the <F1> key stages the next puzzle. Let's intentionally fail this time. A mismatch will add to the error count & build another piece of the little hangman guy - he's in the bottom right corner. If you get 6 errors you lose - just as the message indicates!


Pressing the <F10> "Solve Puzzle" Key

You can reveal the phrase at any time with the <F10> key. Just a fun option...


Everything works exactly as planned...

INPUT File - TDHANG.TXT

This is the input that is read & placed into a puzzle array. Each phrase has 3 lines & will be displayed exactly as it is exists in the file. There is no special formatting for indentation or arranging characters.

LINE1:
LINE2:                         HELLO WORLD
LINE3:
LINE1:     THE ASSEMBLER LANGUAGE IS THE SYMBOLIC PROGRAMMING LANGUAGE
LINE2:            THAT LIES CLOSEST TO THE MACHINE LANGUAGE
LINE3:                      IN FORM AND CONTENT
LINE1:
LINE2:                  GO AHEAD, MAKE MY DAY, PUNK!
LINE3:
LINE1:
LINE2:              WE ARE GOING TO NEED A BIGGER BOAT!
LINE3:
LINE1:              NEITHER A BORROWER NOR A LENDER BE.
LINE2:                DO NOT FORGET, STAY OUT OF DEBT
LINE3:
LINE1:              
LINE2:                          LOST AND FOUND
LINE3:
LINE1:              
LINE2:                    PREPARE FOR SOMETHING AMAZING!
LINE3:
LINE1:              
LINE2:                        IMPRACTICAL JOKERS
LINE3:
LINE1:              
LINE2:                        LIEUTENANT COLUMBO
LINE3:



Designing the Screen Layout - 24x80

After designing the screen on paper I built a matrix in Notepad - I can easily plot the X,Y coordinates of all the screen elements. This is similar to my design methodology when creating CICS Maps with fields, text labels & attributes.

  |....5...10...15...20...25...30...35...40...45...50...55...60...65...70...75...80
==|================================================================================|
01|********************************************************************************|
02|*                                                                              *|
03|*                                                                              *|
04|*               T D H A N G . A L C   -   HANGMAN SIMULATION                   *|
05|*                                                                              *|
06|*                                                                              *|
07|*     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$  *|
08|*                                                                              *|
09|*     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$  *|
10|*                                                                              *|
11|*     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$  *|
12|*                                                                              *|
13|*                                                                              *|
14|*                                                                              *|
15|*     LETTERS:  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z $          *|
16|*               *       *       *           *           *           $          *|
17|*                                                                              *|
18|*                                                                       *****  *|
19|*     MOVES: 999      MATCHES: 999      ERRORS: 999                     *      *|
20|*                                                                       0      *|
21|*                                                                      -|-     *|
22|*     <ESC> EXIT      <F1> NEW GAME     <F10> SOLVE PUZZLE             / \     *|
23|*                                                                              *|
24|********************************************************************************|
==|================================================================================
  |....5...10...15...20...25...30...35...40...45...50...55...60...65...70...75...80


Main Processing Logic

Very simple. I read the file containing the puzzle phrases & load them into a table via the PARSE routine. From there the execution of the puzzle process begins. The initial puzzle is selected (SELECT) then a loop is performed that builds the SCREEN & processes keys (functions/letters).

***********************************************************************
*        MAINLINE PROCEDURE                                           *
***********************************************************************
         PRINT NOGEN
         SVC   @TRACE                        ISSUE SUPERVISOR CALL
         DC    CL4'IOF '                     KEYBOARD INTERRUPT OFF
*
         XFILI STDWKI                        OPEN INPUT  FILE
*
         LA    9,MAIN                        LOAD MAIN ADDRESS
GETI     EQU   *
         XREAD IREC,80                       READ INPUT RECORD
         BNZ   EOFI                          EOF - EXIT ROUTINE
*
         BAL   6,PARSE                       PARSE INPUT RECORD
*
         B     GETI                          READ NEXT RECORD
EOFI     EQU   *
         MVI   0(9),X'FF'                    MARK END OF TABLE
TOP      EQU   *
         BAL   6,SELECT                      SELECT CURRENT PUZZLE
*
LOOP     EQU   *
         BAL   6,SCREEN                      BUILD SCREEN
*
         CLI   KEY,@K#ESC                    KEY = ESCAPE ???
         BE    LOOPX                         YES - EXIT PLEASE
         CLI   KEY,@K#F1                     KEY = F1 ???
         BE    LOOPF1                        YES - NEW PUZZLE
         CLI   KEY,@K#F10                    KEY = F10 ???
         BE    LOOPF10                       YES - SOLVE PUZZLE
*
         BAL   6,SEARCH                      SEARCH FOR LETTER
         BAL   6,ERRORS                      BUILD HANGMAN GUY
         BAL   6,SOLVED                      CHECK IF SOLVED
*
         B     LOOP                          DISPLAY SCREEN AGAIN
LOOPF10  EQU   *
         MVI   COMPLETE,C'Y'                 COMPLETE = 'Y'
         MVC   SCRMSG+20(L'ALTMSG),ALTMSG    MOVE ALTERNATE MESSAGE
         MVC   STAGE2,STAGE1                 SOLVE PUZZLE DISPLAY
         B     LOOP                          DISPLAY SCREEN AGAIN
LOOPF1   EQU   *
         LA    9,210(,9)                     BUMP MAIN POINTER
         CLI   0(9),X'FF'                    END OF MAIN TABLE?
         BNE   *+8                           NO  - CONTINUE PLEASE
         LA    9,MAIN                        YES - POINT TO TOP
         ST    9,MAINPTR                     SAVE MAIN POINTER
         B     TOP                           SELECT NEW PUZZLE
LOOPX    EQU   *
         B     RETURN                        EXIT PROGRAM PLEASE
***********************************************************************


The keystrokes are entered within the SCREEN routine. A call is then made to KBGET to read keyboard input (this is contained in the TDKBD.CPY copybook). The only keys that are processed are <ESC>, <F1>, <F10> and lowercase a thru z. I convert to uppercase myself to avoid using CAPS LOCK or Shift Key. All other keystrokes are ignored.

Searching for a Letter

When a letter key is pressed I first examine the character list - if it is used I ignore it. If it hasn't been selected yet I tag it (it appears on the screen with an asterisk) then search for it within the puzzle phrase. If it's found the letter is revealed & the match count is updated. If it's not in the phrase the error count is updated.

***********************************************************************
*        SEARCH FOR LETTER                                            *
***********************************************************************
         DC    F'0'                          RETURN ADDRESS SAVE AREA
SEARCH   EQU   *
         ST    6,*-4                         SAVE RETURN ADDRESS
*
         LA    8,TABX1                       LOAD ALPHABET TABLE
         LA    7,TABX2                       LOAD TRACKER TABLE
SEARCHL1 EQU   *
         CLI   0(8),C'$'                     END OF TABLE???
         BE    SEARCHX                       YES - EXIT ROUTINE
*
         CLC   CHAR,0(8)                     ALPHABET MATCH???
         BE    *+16                          YES - CHECK IF REPEAT
         LA    8,2(,8)                       BUMP TO NEXT LETTER
         LA    7,2(,7)                       BUMP TO NEXT POSITION
         B     SEARCHL1                      TEST NEXT LETTER
*
         CLI   0(7),C'*'                     REPEAT CHARACTER???
         BE    SEARCHX                       YES - EXIT ROUTINE
*
         AP    CTRT,=P'1'                    ADD TO COUNT - TOTAL
         MVI   0(7),C'*'                     TRACK LETTER PRESSED
*
         ZAP   MATCH,=P'0'                   INIT INCREMENT MATCH
         LA    8,STAGE1                      LOAD PHRASE ADDRESS
         LA    7,STAGE2                      LOAD DISPLAY ADDRESS
SEARCHL2 EQU   *
         CLI   0(8),X'FF'                    END OF TABLE??
         BE    SEARCHLX                      YES - UPDATE COUNTS
         CLC   CHAR,0(8)                     CHARACTER MATCH??
         BNE   SEARCHLB                      NO  - BUMP POINTER
         AP    MATCH,=P'1'                   ADD TO MATCH COUNT
         MVC   0(1,7),CHAR                   REVEAL CHARACTER
SEARCHLB EQU   *  
         LA    8,1(,8)                       BUMP TABLE POINTER
         LA    7,1(,7)                       BUMP DISPLAY POINTER
         B     SEARCHL2                      TEST NEXT POSITION
SEARCHLX EQU   *
         CP    MATCH,=P'0'                   MATCHES FOUND???
         BE    *+14                          NO  - ADD TO ERROR
         AP    CTRM,=P'1'                    ADD COUNT - MATCH
         B     SEARCHX                       EXIT ROUTINE PLEASE
*
         AP    CTRE,=P'1'                    ADD COUNT - ERROR
SEARCHX  EQU   *
         L     6,SEARCH-4                    RESTORE LINK REGISTER
         BR    6                             BRANCH ON LINK REGISTER
***********************************************************************


That's the basic premise of the game. The full source code is below. The copybooks will be posted at a later time. I wrote these years ago - they control all screen handling & keyboard control. In general, they map SVC calls to DOS Interrupts - naturally, they perform functions that may only be relevant to the PC & not transferrable to a mainframe. Video, color, keystrokes, etc...

Full Source Code - TDHANG.ALC (Excluding Copybooks):

         TITLE 'TDHANG   - PC/370 4.2 // DELIA'
***********************************************************************
*                                                                     *
*        MODULE:  TDHANG.                                             *
*        AUTHOR:  TONY DELIA.                                         *
*          DATE:  02/25/2020.                                         *
*          DESC:  PC/370 HANGMAN SIMULATION.                          *
*          NOTE:  PC/370 RELEASE 4.2                                  *
*                                                                     *
***********************************************************************
         EJECT
***********************************************************************
*        T  D  H  A  N  G           P  R  O  G  R  A  M               *
***********************************************************************
TDHANG   START 0                             START PROGRAM
         STM   14,12,12(13)                  SAVE REGISTERS
         LR    12,15                         LOAD PROGRAM ENTRY POINT
         USING TDHANG+0*4096,12              BASE REGISTER 1
         L     11,BASE2                      LOAD BASE REGISTER 2
         USING TDHANG+1*4096,11              TELL ASSEMBLER ABOUT BASE2
         L     10,BASE3                      LOAD BASE REGISTER 3
         USING TDHANG+2*4096,10              TELL ASSEMBLER ABOUT BASE3
         ST    13,SAVE+4                     SAVE EXTERNAL SAVE ADDRESS
         LR    14,13                         XFER ADDRESS TO TEMP R14
         LA    13,SAVE                       LOAD INTERNAL SAVE ADDRESS
         ST    13,8(14)                      SAVE IN EXTERNAL SAVE AREA
         B     GO                            BRANCH TO PROCESSING RTN
***********************************************************************
RETURN   EQU   *                             TIME TO RETURN
         L     13,SAVE+4                     RESTORE REGISTER 13
         LM    14,12,12(13)                  RESTORE REMAINING REGS
         SR    15,15                         CLEAR RETURN CODE
         BR    14                            BRANCH TO CALLING PROGRAM
***********************************************************************
SAVE     DC    18F'0'                        S A V E   A R E A
***********************************************************************
BASE2    DC    A(TDHANG+1*4096)              BASE2 DISPLACEMENT
BASE3    DC    A(TDHANG+2*4096)              BASE3 DISPLACEMENT
***********************************************************************
GO       EQU   *                             BEGIN PROCESSING ...
***********************************************************************
         EJECT
***********************************************************************
*        MAINLINE PROCEDURE                                           *
***********************************************************************
         PRINT NOGEN
         SVC   @TRACE                        ISSUE SUPERVISOR CALL
         DC    CL4'IOF '                     KEYBOARD INTERRUPT OFF
*
         XFILI STDWKI                        OPEN INPUT  FILE
*
         LA    9,MAIN                        LOAD MAIN ADDRESS
GETI     EQU   *
         XREAD IREC,80                       READ INPUT RECORD
         BNZ   EOFI                          EOF - EXIT ROUTINE
*
         BAL   6,PARSE                       PARSE INPUT RECORD
*
         B     GETI                          READ NEXT RECORD
EOFI     EQU   *
         MVI   0(9),X'FF'                    MARK END OF TABLE
TOP      EQU   *
         BAL   6,SELECT                      SELECT CURRENT PUZZLE
*
LOOP     EQU   *
         BAL   6,SCREEN                      BUILD SCREEN
*
         CLI   KEY,@K#ESC                    KEY = ESCAPE ???
         BE    LOOPX                         YES - EXIT PLEASE
         CLI   KEY,@K#F1                     KEY = F1 ???
         BE    LOOPF1                        YES - NEW PUZZLE
         CLI   KEY,@K#F10                    KEY = F10 ???
         BE    LOOPF10                       YES - SOLVE PUZZLE
*
         BAL   6,SEARCH                      SEARCH FOR LETTER
         BAL   6,ERRORS                      BUILD HANGMAN GUY
         BAL   6,SOLVED                      CHECK IF SOLVED
*
         B     LOOP                          DISPLAY SCREEN AGAIN
LOOPF10  EQU   *
         MVI   COMPLETE,C'Y'                 COMPLETE = 'Y'
         MVC   SCRMSG+20(L'ALTMSG),ALTMSG    MOVE ALTERNATE MESSAGE
         MVC   STAGE2,STAGE1                 SOLVE PUZZLE DISPLAY
         B     LOOP                          DISPLAY SCREEN AGAIN
LOOPF1   EQU   *
         LA    9,210(,9)                     BUMP MAIN POINTER
         CLI   0(9),X'FF'                    END OF MAIN TABLE?
         BNE   *+8                           NO  - CONTINUE PLEASE
         LA    9,MAIN                        YES - POINT TO TOP
         ST    9,MAINPTR                     SAVE MAIN POINTER
         B     TOP                           SELECT NEW PUZZLE
LOOPX    EQU   *
         B     RETURN                        EXIT PROGRAM PLEASE
***********************************************************************
         EJECT
***********************************************************************
*        PARSE RECORD                        R9=MAIN                  *
***********************************************************************
         DC    F'0'                          RETURN ADDRESS SAVE AREA
PARSE    EQU   *
         ST    6,*-4                         SAVE RETURN ADDRESS
*
         CLI   0(9),X'FF'                    MAIN TABLE FULL??
         BE    PARSEX                        YES - EXIT ROUTINE
*
         CLC   IREC(6),=C'LINE1:'            LINE 1 DATA???
         BNE   PARSE2                        NO  - CONTINUE PLEASE
         MVC   0(70,9),IREC+6                STORE LINE 1 DATA
         B     PARSEX                        EXIT ROUTINE
PARSE2   EQU   *
         CLC   IREC(6),=C'LINE2:'            LINE 2 DATA???
         BNE   PARSE3                        NO  - CONTINUE PLEASE
         MVC   70(70,9),IREC+6               STORE LINE 2 DATA
         B     PARSEX                        EXIT ROUTINE
PARSE3   EQU   *
         CLC   IREC(6),=C'LINE3:'            LINE 3 DATA???
         BNE   PARSEX                        NO  - CONTINUE PLEASE
         MVC   140(70,9),IREC+6              STORE LINE 3 DATA
         LA    9,210(,9)                     BUMP TABLE POINTER
PARSEX   EQU   *
         L     6,PARSE-4                     RESTORE LINK REGISTER
         BR    6                             BRANCH ON LINK REGISTER
***********************************************************************
         EJECT
***********************************************************************
*        SELECT PUZZLE                                                *
***********************************************************************
         DC    F'0'                          RETURN ADDRESS SAVE AREA
SELECT   EQU   *
         ST    6,*-4                         SAVE RETURN ADDRESS
*
         L     9,MAINPTR                     LOAD MAIN POINTER
         MVC   STAGE1,0(9)                   LOAD MAIN PHRASE
         MVC   STAGE2,0(9)                   LOAD MAIN DISPLAY
         TR    STAGE2,TRTAB1                 TRANSLATE DISPLAY
*
         MVI   TABX2,C' '                    MOVE BLANK TO TRACKER
         MVC   TABX2+1(L'TABX2-1),TABX2      CLEAR TRACKER STRING
*
         MVI   SCRMSG,C' '                   MOVE BLANK TO MESSAGE
         MVC   SCRMSG+1(L'SCRMSG-1),SCRMSG   CLEAR MESSAGE STRING
*
         MVC   ERR1,=CL3' '                  CLEAR ERROR LINE 1
         MVC   ERR2,=CL3' '                  CLEAR ERROR LINE 2
         MVC   ERR3,=CL3' '                  CLEAR ERROR LINE 3
*
         ZAP   CTRT,=P'0'                    INIT COUNTER - TOTAL
         ZAP   CTRM,=P'0'                    INIT COUNTER - MATCH
         ZAP   CTRE,=P'0'                    INIT COUNTER - ERROR
*
         MVI   COMPLETE,C'N'                 COMPLETE = 'N'  
SELECTX  EQU   *
         L     6,SELECT-4                    RESTORE LINK REGISTER
         BR    6                             BRANCH ON LINK REGISTER
***********************************************************************
         EJECT
***********************************************************************
*        SEARCH FOR LETTER                                            *
***********************************************************************
         DC    F'0'                          RETURN ADDRESS SAVE AREA
SEARCH   EQU   *
         ST    6,*-4                         SAVE RETURN ADDRESS
*
         LA    8,TABX1                       LOAD ALPHABET TABLE
         LA    7,TABX2                       LOAD TRACKER TABLE
SEARCHL1 EQU   *
         CLI   0(8),C'$'                     END OF TABLE???
         BE    SEARCHX                       YES - EXIT ROUTINE
*
         CLC   CHAR,0(8)                     ALPHABET MATCH???
         BE    *+16                          YES - CHECK IF REPEAT
         LA    8,2(,8)                       BUMP TO NEXT LETTER
         LA    7,2(,7)                       BUMP TO NEXT POSITION
         B     SEARCHL1                      TEST NEXT LETTER
*
         CLI   0(7),C'*'                     REPEAT CHARACTER???
         BE    SEARCHX                       YES - EXIT ROUTINE
*
         AP    CTRT,=P'1'                    ADD TO COUNT - TOTAL
         MVI   0(7),C'*'                     TRACK LETTER PRESSED
*
         ZAP   MATCH,=P'0'                   INIT INCREMENT MATCH
         LA    8,STAGE1                      LOAD PHRASE ADDRESS
         LA    7,STAGE2                      LOAD DISPLAY ADDRESS
SEARCHL2 EQU   *
         CLI   0(8),X'FF'                    END OF TABLE??
         BE    SEARCHLX                      YES - UPDATE COUNTS
         CLC   CHAR,0(8)                     CHARACTER MATCH??
         BNE   SEARCHLB                      NO  - BUMP POINTER
         AP    MATCH,=P'1'                   ADD TO MATCH COUNT
         MVC   0(1,7),CHAR                   REVEAL CHARACTER
SEARCHLB EQU   *  
         LA    8,1(,8)                       BUMP TABLE POINTER
         LA    7,1(,7)                       BUMP DISPLAY POINTER
         B     SEARCHL2                      TEST NEXT POSITION
SEARCHLX EQU   *
         CP    MATCH,=P'0'                   MATCHES FOUND???
         BE    *+14                          NO  - ADD TO ERROR
         AP    CTRM,=P'1'                    ADD COUNT - MATCH
         B     SEARCHX                       EXIT ROUTINE PLEASE
*
         AP    CTRE,=P'1'                    ADD COUNT - ERROR
SEARCHX  EQU   *
         L     6,SEARCH-4                    RESTORE LINK REGISTER
         BR    6                             BRANCH ON LINK REGISTER
***********************************************************************
         EJECT
***********************************************************************
*        SOLVED                                                       *
***********************************************************************
         DC    F'0'                          RETURN ADDRESS SAVE AREA
SOLVED   EQU   *
         ST    6,*-4                         SAVE RETURN ADDRESS
*
         CLI   COMPLETE,C'Y'                 PUZZLE SOLVED???
         BE    SOLVEDX                       YES - EXIT ROUTINE
*
         LA    8,STAGE2                      LOAD STAGING ADDRESS
SOLVEDL1 EQU   *
         CLI   0(8),X'FF'                    END OF TABLE???
         BE    SOLVEDYY                      YES - PUZZLE SOLVED
         CLI   0(8),C'_'                     UNSOLVED POSITION??
         BE    SOLVEDX                       YES - EXIT ROUTINE
         LA    8,1(,8)                       BUMP STAGING POINTER
         B     SOLVEDL1                      TEST NEXT POSITION
SOLVEDYY EQU   *
         MVI   COMPLETE,C'Y'                 COMPLETE = 'Y'
         MVC   SCRMSG+20(L'WINMSG),WINMSG    MOVE WINNER MESSAGE
         CP    CTRE,=P'6'                    MAXIMUM ERRORS??
         BL    SOLVEDX                       NO  - KEEP THE WIN
         MVC   SCRMSG+20(L'ALTMSG),ALTMSG    MOVE ALTERNATE MESSAGE
SOLVEDX  EQU   *
         L     6,SOLVED-4                    RESTORE LINK REGISTER
         BR    6                             BRANCH ON LINK REGISTER
***********************************************************************
         EJECT
***********************************************************************
*        ERRORS - BUILD HANGMAN GUY                                   *
***********************************************************************
         DC    F'0'                          RETURN ADDRESS SAVE AREA
ERRORS   EQU   *
         ST    6,*-4                         SAVE RETURN ADDRESS
*
         CLI   COMPLETE,C'Y'                 PUZZLE SOLVED?
         BE    ERRORSX                       YES - EXIT ROUTINE
*
         CP    CTRE,=P'0'                    ERROR COUNT = 0??
         BE    ERRORSX                       YES - EXIT ROUTINE
*
         CP    CTRE,=P'1'                    ERROR COUNT = 1??
         BE    ERRX1                         YES - BUILD HANGMAN
         CP    CTRE,=P'2'                    ERROR COUNT = 2??
         BE    ERRX2                         YES - BUILD HANGMAN
         CP    CTRE,=P'3'                    ERROR COUNT = 3??
         BE    ERRX3                         YES - BUILD HANGMAN
         CP    CTRE,=P'4'                    ERROR COUNT = 4??
         BE    ERRX4                         YES - BUILD HANGMAN
         CP    CTRE,=P'5'                    ERROR COUNT = 5??
         BE    ERRX5                         YES - BUILD HANGMAN
*
         MVC   SCRMSG+20(L'ERRMSG),ERRMSG    MOVE HANGMAN MESSAGE
*
ERRX6    MVI   ERR3+2,C'\'                   ERROR 6 - RIGHT LEG
ERRX5    MVI   ERR3,C'/'                     ERROR 5 - LEFT LEG
ERRX4    MVI   ERR2+2,C'-'                   ERROR 4 - RIGHT ARM
ERRX3    MVI   ERR2,C'-'                     ERROR 3 - LEFT ARM
ERRX2    MVI   ERR2+1,C'|'                   ERROR 2 - TORSO
ERRX1    MVI   ERR1+1,C'O'                   ERROR 1 - HEAD
*
ERRORSX  EQU   *
         L     6,ERRORS-4                    RESTORE LINK REGISTER
         BR    6                             BRANCH ON LINK REGISTER
***********************************************************************
         EJECT
***********************************************************************
*        BUILD SCREEN                                                 *
***********************************************************************
         DC    F'0'                          RETURN ADDRESS SAVE AREA
SCREEN   EQU   *
         ST    6,*-4                         SAVE RETURN ADDRESS
*
         MVI   VBITS,@BKWT                   SET BG(BLACK)/FG(WHITE)
         BAL   6,VRESET                      CHANGE SCREEN ATTRIBUTES
*
*        DISPLAY SINGLE BOX
*
         MVC   VBX,VBOX2                     LOAD BOX FRAME
         MVC   VBXRC,BXTAB                   LOAD BOX COORDINATES
         BAL   6,VBOX                        DISPLAY BOX FRAME
*
*        DISPLAY SCREEN TEXT
*
         MVC   SCR02,STAGE2                  MOVE STAGE DISPLAY
         MVC   SCR03,STAGE2+70               MOVE STAGE DISPLAY
         MVC   SCR04,STAGE2+140              MOVE STAGE DISPLAY
         MVC   SCR06A2,=X'40202120'          MOVE EDIT PATTERN
         ED    SCR06A2,CTRT                  EDIT COUNT - TOTAL
         MVC   SCR06B2,=X'40202120'          MOVE EDIT PATTERN
         ED    SCR06B2,CTRM                  EDIT COUNT - MATCHES
         MVC   SCR06C2,=X'40202120'          MOVE EDIT PATTERN
         ED    SCR06C2,CTRE                  EDIT COUNT - ERRORS
*
         LA    5,SCTAB                       LOAD TABLE ADDRESS
SC1LP    EQU   *
         CLI   0(5),X'FF'                    END OF TABLE ???
         BE    SC1LPX                        YES - EXIT LOOP PLEASE
*
         MVC   VXYS,0(5)                     MOVE CURSOR POSITION
         BAL   6,VXYSET                      SET CURSOR POSITION
         L     2,4(5)                        LOAD MESSAGE ADDRESS
         SVC   @WTO                          ISSUE SUPERVISOR CALL
*
         LA    5,8(,5)                       BUMP TABLE POINTER
         B     SC1LP                         TEST NEXT TABLE ENTRY
SC1LPX   EQU   *
*
*        ACCEPT KEYSTROKE
*
         BAL   6,KBGET                       READ KEYBOARD INPUT
         MVC   KEY,KBCHR                     STORE KEYSTROKE
*
         CLI   KEY,@K#ESC                    KEY = ESCAPE ???
         BE    SC2LPX                        YES - EXIT ROUTINE
         CLI   KEY,@K#F1                     KEY = F1 ???
         BE    SC2LPX                        YES - EXIT ROUTINE
         CLI   KEY,@K#F10                    KEY = F10 ???
         BE    SC2LPX                        YES - EXIT ROUTINE
*
         CLI   KEY,@K#LCA                    LOWERCASE A
         BL    SC1LPX                        LO  - BACK TO KEYBOARD
         CLI   KEY,@K#LCZ                    LOWERCASE Z
         BH    SC1LPX                        HI  - BACK TO KEYBOARD
*
         MVC   HALF,=X'0000'                 INITIALIZE HALFWORD
         MVC   HALF+1(1),KEY                 MOVE KEYSTROKE
         LH    6,HALF                        LOAD KEY VALUE
         SH    6,=Y(32)                      CONVERT TO UPPERCASE
         STH   6,HALF                        STORE NEW VALUE
         MVC   KEY,HALF+1                    REPLACE KEYSTROKE
*
         MVC   CHAR,KEY                      STORE KEYSTROKE
         LA    1,CHAR                        LOAD CHARACTER ADDRESS
         LA    2,1                           LOAD CHARACTER LENGTH
         SVC   @ASCEBC                       ISSUE SUPERVISOR CALL
SC2LPX   EQU   *
         MVI   VBITS,@BKWT                   SET BG(BLACK)/FG(WHITE)
         BAL   6,VRESET                      CHANGE SCREEN ATTRIBUTES
SCREENX  EQU   *
         L     6,SCREEN-4                    RESTORE LINK REGISTER
         BR    6                             BRANCH ON LINK REGISTER
***********************************************************************
         EJECT
***********************************************************************
*        WORKING STORAGE                                              *
***********************************************************************
DUBB     DC    D'0'                          DOUBLEWORD
FULL     DC    F'0'                          FULLWORD
MAINPTR  DC    A(MAIN)                       MAIN TABLE POINTER
HALF     DC    H'0'                          HALFWORD
KEY      DC    CL1' '                        KEY STROKE (@RDKEY)
CHAR     DC    CL1' ',C'$'                   KEY CHARACTER
@YES     EQU   C'Y'                          YES
@NO      EQU   C'N'                          NO
@ESC     EQU   27                            ESCAPE KEY
@CR      EQU   13                            CARRIAGE RETURN
@LF      EQU   10                            LINE FEED
@KEYLO   EQU   32                            ASCII KEY - LO VALUE
@KEYHI   EQU   126                           ASCII KEY - HI VALUE
***********************************************************************
*        DATA CONTROL BLOCK SET UP                                    *
***********************************************************************
STDWKI   DC    CL64'C:\PC370\TDHANG.TXT'
***********************************************************************
*        INPUT RECORD AREA                                            *
***********************************************************************
IREC     DC    CL80' '                       INPUT RECORD
***********************************************************************
         LTORG                               LITERAL POOL
***********************************************************************
*        COPYBOOKS                                                    *
***********************************************************************
         COPY  CPY/TDBOX.CPY                 COPYBOOK - BOX DISPLAY
         COPY  CPY/TDVID.CPY                 COPYBOOK - VIDEO UTILITY
         COPY  CPY/TDKBD.CPY                 COPYBOOK - KEYBOARD INPUT
         COPY  CPY/TDKEY.CPY                 COPYBOOK - KEYSTROKES
         COPY  CPY/TDCLR.CPY                 COPYBOOK - COLORS
         COPY  CPY/TDSVC.CPY                 COPYBOOK - SUPERVISOR
***********************************************************************
*        BOX COMPONENTS (COORDINATES/FRAME)                           *
***********************************************************************
BXTAB    DS    0F
         DC    AL1(0,0,23,79)                BOX COORDINATES/FRAME
***********************************************************************
*        SCREEN DISPLAY COMPONENTS                                    *
***********************************************************************
SCTAB    DS    0F
         DC    AL1(0,0,3,16),A(SCR01)        SCREEN COORDINATES/MSG
         DC    AL1(0,0,6,6),A(SCR02)         SCREEN COORDINATES/MSG
         DC    AL1(0,0,8,6),A(SCR03)         SCREEN COORDINATES/MSG
         DC    AL1(0,0,10,6),A(SCR04)        SCREEN COORDINATES/MSG
         DC    AL1(0,0,12,6),A(SCRMSG)       SCREEN COORDINATES/MSG
         DC    AL1(0,0,14,7),A(SCR05)        SCREEN COORDINATES/MSG
         DC    AL1(0,0,14,16),A(TABX1)       SCREEN COORDINATES/MSG
         DC    AL1(0,0,15,16),A(TABX2)       SCREEN COORDINATES/MSG
         DC    AL1(0,0,18,6),A(SCR06A)       SCREEN COORDINATES/MSG
         DC    AL1(0,0,18,13),A(SCR06A2)     SCREEN COORDINATES/MSG
         DC    AL1(0,0,18,22),A(SCR06B)      SCREEN COORDINATES/MSG
         DC    AL1(0,0,18,31),A(SCR06B2)     SCREEN COORDINATES/MSG
         DC    AL1(0,0,18,41),A(SCR06C)      SCREEN COORDINATES/MSG
         DC    AL1(0,0,18,48),A(SCR06C2)     SCREEN COORDINATES/MSG
         DC    AL1(0,0,21,6),A(SCR99A)       SCREEN COORDINATES/MSG
         DC    AL1(0,0,21,22),A(SCR99B)      SCREEN COORDINATES/MSG
         DC    AL1(0,0,21,40),A(SCR99C)      SCREEN COORDINATES/MSG
         DC    AL1(0,0,17,71),A(HANG1)       SCREEN COORDINATES/MSG
         DC    AL1(0,0,18,71),A(HANG2)       SCREEN COORDINATES/MSG
         DC    AL1(0,0,19,71),A(ERR1)        SCREEN COORDINATES/MSG
         DC    AL1(0,0,20,71),A(ERR2)        SCREEN COORDINATES/MSG
         DC    AL1(0,0,21,71),A(ERR3)        SCREEN COORDINATES/MSG
         DC    XL1'FF'                       END OF TABLE
***********************************************************************
SCR01    DC    C'T D H A N G . A L C   -   HANGMAN SIMULATION',C'$'
SCR02    DC    CL70' ',C'$'
SCR03    DC    CL70' ',C'$'
SCR04    DC    CL70' ',C'$'
SCRMSG   DC    CL70' ',C'$'
SCR05    DC    CL8'LETTERS:',C'$'
SCR06A   DC    CL6'MOVES:',C'$'
SCR06A2  DC    CL4' ',C'$'
SCR06B   DC    CL8'MATCHES:',C'$'
SCR06B2  DC    CL4' ',C'$'
SCR06C   DC    CL7'ERRORS:',C'$'
SCR06C2  DC    CL4' ',C'$'
SCR99A   DC    CL10'<ESC> EXIT',C'$'
SCR99B   DC    CL13'<F1> NEW GAME',C'$'
SCR99C   DC    CL18'<F10> SOLVE PUZZLE',C'$'
HANG1    DC    CL6' *****',C'$'
HANG2    DC    CL2' *',C'$'
ERR1     DC    CL3' ',C'$'
ERR2     DC    CL3' ',C'$'
ERR3     DC    CL3' ',C'$'
***********************************************************************
*        MAIN TABLE                                                   *
***********************************************************************
         CNOP  0,4                           FULLWORD ALIGNMENT
*
TABX1    DC    CL26'A B C D E F G H I J K L M '  TABLE X1 - A THRU M
         DC    CL26'N O P Q R S T U V W X Y Z '  TABLE X1 - N THRU Z
         DC    CL1'$'
TABX2    DC    CL52' ',C'$'                      TABLE X2 - TRACKING
***********************************************************************
*        HANGMAN STAGING AREA                                         *
***********************************************************************
         CNOP  0,4                           FULLWORD ALIGNMENT
STAGE1   DC    CL210' ',X'FF'                STAGING AREA - PHRASE
STAGE2   DC    CL210' ',X'FF'                STAGING AREA - DISPLAY
CTRT     DC    PL2'0'                        COUNTER - TOTAL
CTRM     DC    PL2'0'                        COUNTER - MATCH
CTRE     DC    PL2'0'                        COUNTER - ERROR
MATCH    DC    PL2'0'                        MATCHES PER LETTER
COMPLETE DC    CL1'N'                        PUZZLE COMPLETE
ERRMSG   DC    CL22'**HANGMAN! YOU LOSE!**'  ERROR MESSAGE
WINMSG   DC    CL22'  ** W I N N E R **'     WINNER MESSAGE
ALTMSG   DC    CL22'** C O M P L E T E **'   ALTERNATE MESSAGE
***********************************************************************
*        TRANSLATION TABLES                                           *
***********************************************************************
         CNOP  0,4                           FULLWORD ALIGNMENT
TRTAB1   DC    CL256' '
         ORG   TRTAB1+C'!'
         DC    CL1'!'                        EXCLAMATION POINT
         ORG   TRTAB1+X'50'
         DC    XL1'50'                       AMPERSAND
         ORG   TRTAB1+X'60'
         DC    XL1'60'                       HYPHEN
         ORG   TRTAB1+X'6F'
         DC    XL1'6F'                       QUESTION MARK
         ORG   TRTAB1+X'7D'
         DC    XL1'7D'                       SINGLE QUOTE
         ORG   TRTAB1+X'7F'
         DC    XL1'7F'                       DOUBLE QUOTE
         ORG   TRTAB1+C','
         DC    CL1','                        COMMA
         ORG   TRTAB1+C'.'
         DC    CL1'.'                        PERIOD
         ORG   TRTAB1+C'A'
         DC    CL9'_________'                A-I UNDERSCORES
         ORG   TRTAB1+C'J'
         DC    CL9'_________'                J-R UNDERSCORES
         ORG   TRTAB1+C'S'
         DC    CL8'________'                 S-Z UNDERSCORES
         ORG
***********************************************************************
*        HANGMAN PUZZLES                                              *
***********************************************************************
         CNOP  0,4                           FULLWORD ALIGNMENT
MAIN     DC    20CL210' '                    UP TO 20 GAMES STORED
         DC    XL1'FF'                       END OF WORD SEARCH LIST
***********************************************************************
         END   TDHANG



Just one more thing... I don't watch much TV but Columbo is my favorite show. Seasons 1 through 7 are on Amazon Prime Video for free - it's always queued up on my phone. I can relate to him on many levels (except the cigar) - Italian, cheap wine, chili, attention to detail, tenacious, underestimated, dirty car, wrinkled clothes/scuffed shoes (sometimes), always talking about his wife, loves his dog, unimpressed by celebrity, always in control of the case (project), strong moral character, the list goes on & on... He notices the smallest details to solve a case - jingling keys, shoelaces, broken hearing aid, watercolors, etc. I have no doubt he would have been a good Assembler programmer.


From Season 1 Episode 4 - "Suitable For Framing" - Closing Scene CLICK HERE