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.
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