; INTELLEC8/MOD 80 MONITOR Version 3.0 ; ; COPYRIGHT (C) 1973, 1974, 1975 ; INTEL CORPORATION ; 3065 BOWERS AVENUE ; SANTA CLARA, CALIFORNIA 95051 ; ; ::= ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ::= A= ; ::= B, ; ::= C ; ::= D, ; ::= E ; ::= F,, ; ::= G,, ; ::= H, ; ::= L, ; ::= M,, ; ::= N ; ::= P,, ; ::= R ; ::= S ; ::= T ; ::= W, ; ::= X ::= CONSOLE!READER!LIST!PUNCH ; ::= CRT!TTY!PTR!PTP!BATCH!!!2 ; ::= A!B!C!D!E!F!H!L!M!P!S ; ::= ; ; ::= 0!1!2!3!4!5!6!7!8!9!A!B!C!D!E!F ; ; SYSTEM SIGNS ON WITH <.> ; VER EQU 30 ; VERSION 3.0 TITLE " INTELLEC 8/MOD 80 MONITOR, VERSION 3.0, 14 APRIL 1975 " ; ; I/O DEVICE OUTPUT COMMAND PORT 1 (TTC) BIT VALUES ; ; BIT REST MNEMONIC DESCRIPTION ; ; 0 0 RBIT TTY READER GO/NO GO ; 1 0 PCMD PTP GO/NO GO ; 2 0 RCMD PTR GO/NO GO ; 3 1 DSB PROM ENABLE/DISABLE. DSB=1 ; 4 0 DATA IN T/C ; 5 0 DATA OUT T/C ; 6 0 PBIT 1702 PROM PROG. GO/NO GO ; 7 0 PBITA 1702A PROM PROG. GO/NO GO ; ; I/O DEVICE INPUT STATUS PORT 1 (TTS) BIT VALUES ; ; BIT REST MNEMONIC DESCRIPTION ; ; 0 1 TTYDA IF TTYDA = 0, INPUT IS READY ; 1 1 OVERRUN ERROR ; 2 0 TTYBE IF TTYBE = 0, OUTPUT IS READY ; 3 1 FRAMING ERROR ; 4 1 PARITY ERROR ; 5 0 PTRDA IF PTRDA = 1, PTR HAS CHAR ; 6 1 PRDY IF PRDY = 1, PTP IS READY ; 7 UNASSIGNED ; ; I/O DEVICE OUTPUT COMMAND PORT 5 (CRTS) BIT VALUES ; ; BIT REST MNEMONIC DESCRIPTION ; ; 0 1 CRTDA IF CRTDA = 0, INPUT IS READY ; 1 1 OVERRUN ERROR ; 2 0 CRTBE IF CRTBE = 0, OUTPUT IS READY ; 3 1 FRAMING ERROR ; 4 1 PARITY ERROR ; 5 UNASSIGNED ; 6 UNASSIGNED ; 7 UNASSIGNED ; ; I/O COMMAND CONSTANTS ; RBIT EQU 1 PCMD EQU 2 RCMD EQU 4 DSB EQU 8 PBITA EQU 80H ; ; TTY I/O CONSTANTS ; TTI EQU 0 ;TTY INPUT DATA PORT TTO EQU 0 ;TTY OUTPUT DATA PORT TTS EQU 1 ;TTY INPUT STATUS PORT TTC EQU 1 ;TTY OUTPUT COMMAND PORT TTYGO EQU RBIT OR DSB ;START TTY READER TTYNO EQU DSB ;STOP TTY READER TTYDA EQU 1 ;DATA AVAILABLE TTYBE EQU 4 ;TRANSMIT BUFFER EMPTY ; ; CRT I/O CONSTANTS ; CRTI EQU 4 ;CRT INPUT DATA PORT CRTS EQU 5 ;CRT INPUT STATUS PORT CRTO EQU 4 ;CRT OUTPUT DATA PORT CRTDA EQU 1 ;DATA AVAILABLE CRTBE EQU 4 ;TRANSMIT BUFFER EMPTY ; ; PTR I/O CONSTANTS ; PTRI EQU 3 ;PTR INPUT DATA PORT (NOT INVERTED) PTRS EQU TTS ;PTR INPUT STATUS PORT PTRC EQU TTC ;PTR OUTPUT COMMAND PORT PTRGO EQU RCMD OR DSB ;START PTR PTRNO EQU TTYNO ;STOP PTR PTRDA EQU 20H ;PTR DATA AVAILABLE ; ; PTP I/O CONSTANTS ; PTPO EQU 3 ;PTP OUTPUT DATA PORT PTPS EQU TTS ;PTP INPUT STATUS PORT PTPC EQU TTC ;PTP OUTPUT COMMAND PORT PRDY EQU 40H ;PUNCH READY STATUS PTPGO EQU PCMD OR DSB ;PTP START PUNCH PTPNO EQU TTYNO ;STOP PUNCH ; ; PROM PROGRAMMER I/O CONSTANTS ; PAD EQU 2 ;PROM ADDRES OUTPUT PORT PDO EQU PTPO ;PROM DATA OUTPUT PORT PDI EQU 2 ;PROM DATA INPUT PORT PROMC EQU TTC ;PROGRAMMING PULSE OUTPUT PORT PROGO EQU PBITA ;START PROGRAMMING PRONO EQU 0 ;STOP PROGRAMMING ENB EQU 0 ;ENABLE PROGRAMMER ; ; CONDITIONAL ASSEMBLY SWITCHES ; FALSE EQU 0 TRUE EQU ~FALSE DEBUG EQU FALSE ;DEBUG MODE - ;MODIFY CERTAIN CODE SECTIONS ;SO THAT VERSION 2.0 MAY BE DEBUGGED ;BY VERSION 1.0 ; ; GLOBAL CONSTANTS ; TOUT EQU 250 ;250 MS. COUNTER FOR READER TIMEOUT LDLY EQU 20 ;COUNTER FOR 20 MS DELAY IF DEBUG DLY EQU 111 ;COUNTER FOR 1.0 MS DELAY IN RAM ENDIF IF ~DEBUG DLY EQU 84 ;COUNTER FOR 1.O MS DELAY IN PROM ENDIF CR EQU 0DH LF EQU 0AH ; ; MACRO DEFINITIONS ; ;FETCH MACRO VALUE ;FETCH ADDRESS OF A VALUE ; LXI H,VALUE ;IN THE STACK ; DAD SP ; ENDM ; ; I/O STATUS BYTE MASKS AND VALUES ; CMSK EQU 11111100B ;MASK FOR CONSOLE I/O RMSK EQU 11110011B ;MASK FOR READER INPUT PMSK EQU 11001111B ;MASK FOR PUNCH OUTPUT LMSK EQU 00111111B ;MASK FOR LIST OUTPUT ; CTTY EQU 00000000B ;CONSOLE I/O = TTY CCRT EQU 00000001B ;CONSOLE I/O = CRT BATCH EQU 00000010B ;BATCH MODE, ;INPUT = READER, OUTPUT = LIST CUSE EQU 00000011B ;USER DEFINED CONSOLE I/O RTTY EQU 00000000B ;READER = TTY RPTR EQU 00000100B ;READER = PTR RUSE1 EQU 00001000B ;USER DEFINED READER (1) RUSE2 EQU 00001100B ;USER DEFINED READER (2) PTTY EQU 00000000B ;PUNCH = TTY PPTP EQU 00010000B ;PUNCH = PTP PUSE1 EQU 00100000B ;USER DEFINED PUNCH (1) PUSE2 EQU 00110000B ;USER DEFINED PUNCH (2) LTTY EQU 00000000B ;LIST = TTY LCRT EQU 01000000B ;LIST = CRT LUSE1 EQU 10000000B ;LIST = LPT LUSE2 EQU 11000000B ;USER DEFINED LIST ; ; USER DEFINED DEVICE ENTRY POINTS ; CILOC EQU 03700H ;USER CONSOLE INPUT COLOC EQU 03703H ;USER CONSOLE OUTPUT R1LOC EQU 03706H ;USER READER 1 R2LOC EQU 03709H ;USER READER 2 P1LOC EQU 0370CH ;USER PUNCH 1 P2LOC EQU 0370FH ;USER PUNCH 2 L1LOC EQU 03712H ;USER LIST 1 L2LOC EQU 03715H ;USER LIST 2 CSLOC EQU 03718H ;USER CONSOLE STATUS ; IF DEBUG ORG 800H ;LOCATE IN RAM FOR DEBUG ENDIF ; IF ~DEBUG ORG 03800H ;LOCATE IN TOP 8 ROMS IN 16K ENDIF ; ; BRANCH TABLE FOR I/O SYSTEM ; JMP BEGIN ;RESET ENTRY POINT JMP CI ;CONSOLE INPUT JMP RI ;READER INPUT JMP CO ;CONSOLE OUTPUT JMP PO ;PUNCH OUTPUT JMP LO ;LIST OUTPUT JMP CSTS ;CONSOLE INPUT STATUS JMP IOCHK ;I/O SYSTEM STATUS JMP IOSET ;SET I/O CONFIGURATION JMP MEMCK ;COMPUTE SIZE OF MEMORY ; ; POINTERS TO RAM ; RS1 EQU 8 ; ; STATUS BYTE FOR I/O SYSTEM IF ~DEBUG IOBYT EQU 3 ;USE LOCATIOB 0003H ENDIF IF DEBUG IOBYT EQU 4 ;USE LOCATION 0004H ENDIF INIT EQU 0 ;INITIALLY, ;CONSOLE = TTY, ;READER = TTY, ;PUNCH = TTY, ;LIST = TTY ; ;*********************************************** VERS DB CR, LF, "8080 V" IF ~DEBUG DB VER/10+'0', '.',VER MOD 10+'0' ENDIF ; IF DEBUG DB "X.X" ENDIF LVER EQU $-VERS ;LENGTH OF SIGNON MESSAGE ;*********************************************** ; ; PROGRAM ENTRY POINT. ; ; COMPUTE THE TOP OF RASM MEMORY AVAILABLE IN THIS SYSTEM ; AND LOCATE THE USER REGISTER SAVE AREA, EXIT TEMPLATE, AND ; MONITOR STACK AT THE TOP OF RAM. ; BEGIN LXI H,IOBYT ;CLEAR I/O BYTE MVI M,INIT ;382C-36 00 MVI L,0FFH ;FIND BOTTOM OF MEMORY BG0 DCR H ;STEP DOWN TO TOP MEMORY PAGE MOV A,M ;RAM? CMA ;3832-2F MOV M,A ;3833-77 CMP M ;3834-BE CMA ;3835-2F MOV M,A ;3836-77 JNZ BG0 ;NO, CONTINUE TO LOOK INX H ;TOP OF RAM MVI B,ENDX-EXIT ;COPY 18 BYTES BACKWARDS FROM ACTBL LXI D,ACTBL ;TO TOP OF RAM BG1 DCX D ;DEC ROM POINTER LDAX D ;GET BYTE FROM ROM DCX H ;DEC RAM POINTER MOV M,A ;STORE BYTE TO RAM DCR B ;DONE? JNZ BG1 ;NO, CONTINUE SPHL ;SET SP BELOW LOADED RAM LXI H,100H ;3849-21 00 01 * PUSH H ;384C-E5 MVI H,000H ;384D-26 00 PUSH H ;384F-E5 PUSH H ;3850-E5 PUSH H ;3851-E5 MVI A,0C3H ;SET JUMP VECTOR AT 0008H STA RS1 ;3854-32 08 00 * LXI H,RESTART ;3857-21 08 3F * SHLD RS1+1 ;385A-22 09 00 * ; ; TYPE SIGNON ; LXI H,VERS ;OUTPUT VERS MESSAGE MVI D,00BH ;BYTE COUNT OF MESSAGE VER0 MOV C,M ;3862-4E INX H ;3863-23 CALL CO ;3864-CD 55 3C * DCR D ;3867-15 JNZ VER0 ;3868-C2 62 38 * ; ; MAIN COMMAND LOOP ; ; THIS LOOP IS THE STARTING POINT OF ALL COMMAND SEQUENCES. ; IN THIS CODE INTERRUPTS ARE ENABLED, ALL I/O DEVICES ; ARE INITIALIZED, A CARRIAGE RETURN AND LINE FEED ARE TYPED, ; ALONG WITH THE PROMPT CHARACTER '.'. WHEN A CHARACTER IS ; ENTERED FROM THE CONSOLE KEYBOARD, IT IS CHECKED FOR VALIDITY, ; THEN A BRANCH TO THE PROPER PROCESSING ROUTINE IS COMPUTED. ; START EI ;386B-FB MVI A,TTYNO ;386C-3E 08 OUT TTS ;386E-D3 01 CALL CRLF ;OUTPUT PROMPT MVI C,'.' ;3873-0E 2E CALL CO ;3875-CD 55 3C * CALL TI ;GET NEXT CHAR SUI 'A' ;387B-D6 41 JM START ;INVALID COMMAND CPI 'X'-'A'+1 ;24 CMDS IN CMDTAB JP LER ;INVALID COMMAND ADD A ;MULTIPLY BY 2, CMDTAB SIZE LXI H,TBL ;GET TABLE OFFSET ADD L ;3889-85 MOV L,A ;388A-6F MOV A,M ;GET TABLE ENTRY INX H ;388C-23 MOV H,M ;388D-66 MOV L,A ;388E-6F MVI C,2 ;??? PCHL ;GO DO IT ;*********************************************** ; COMMAND BRANCH TABLE ; ; THIS TABLE CONTAINS THE ADDRESSES OF THE ENTRY POINTS OF ; ALL THE COMMAND PROCESSING ROUTINES. NOTE THAT AN ENTRY TO 'LER' ; IS AN ERROR CONDITION, I.E., NO COMMAND CORRESPONDING TO THAT ; CHARACTER EXISTS. ; TBL DW ASSIGN ;'A' DW BNPF ;'B' DW COMP ;'C' DW DISP ;'D' DW EOF ;'E' DW FILL ;'F' DW GOTO ;'G' DW HEXN ;'H' DW LER ;'I' DW LER ;'J' DW LER ;'K' DW LOAD ;'L' DW MOVE ;'M' DW NULL ;'N' DW LER ;'O' DW PROG ;'P' DW LER ;'Q' DW READ ;'R' DW SUBS ;'S' DW TRAN ;'T' DW LER ;'U' DW LER ;'V' DW WRITE ;'W' DW X ;'X' ;*********************************************** ; ; PROCESS I/O DEVICE ASSIGNMENT COMMANDS ; ; THIS ROUTINE MAPS SYMBOLIC DEVICE IDENTIFIERS TO BITS ; IN THE I/O STATUS BYTE (IOBYT) TO ALLOW FOR CONSOLE ; MODIFICATION OF SYSTEM I/O CONFIGURATION ; ASSIGN CALL TI ;GET NEXT CHAR LXI H,LTBL ;TABLE ADDR MVI C,4 ;4 ENTRIES AS0 CMP M ;FOUND IT? INX H ;38CB-23 JZ AS1 ;YES INX H ;STEP TO NEXT ENTRY INX H ;38D0-23 INX H ;38D1-23 DCR C ;DONE? JNZ AS0 ;NO, CONTINUE JMP LER ;INVALID ENTRY AS1 MOV B,M ;GET ADDR FROM LTBL INX H ;38DA-23 MOV E,M ;38DB-5E INX H ;38DC-23 MOV D,M ;GET ??? FROM LTBL XCHG ;38DE-EB AS2 CALL TI ;GET NEXT CHAR CPI '=' ;'='? JNZ AS2 ;NO, WAIT FOR '=' AS3 CALL TI ;GET NEXT CHAR CPI ' ' ;SPACE? JZ AS3 ;YES, WAIT FOR NON-SPACE MVI C,4 ;38EF-0E 04 AS4 CMP M ;38F1-BE INX H ;38F2-23 JZ AS5 ;38F3-CA FE 38 * INX H ;38F6-23 DCR C ;38F7-0D JNZ AS4 ;38F8-C2 F1 38 * JMP LER ;38FB-C3 43 3C * AS5 CALL TI ;GET NEXT CHAR CPI CR ;3901-FE 0D JNZ AS5 ;3903-C2 FE 38 * MOV C,M ;3906-4E LXI H,IOBYT ;3907-21 03 00 * MOV A,M ;390A-7E ANA B ;390B-A0 ORA C ;390C-B1 MOV M,A ;390D-77 JMP START ;390E-C3 6B 38 * ;*********************************************** ; ; PUNCH A BNPF TAPE ; ; THIS ROUTINE EXPECTS TWO HEXADECIMAL PARAMETERS TO BE ; ENTERED FROM THE KEYBOARD AND INTERPRETS THEM AS ; THE BOUNDS OS A MEMORY AREA TO BE PUNCHED ON THE ; ON THE ASSIGNED PUNCH DEVICE IN BPNF FORMAT. THE TAPE ; PRODUCED IS FORMATTED WITH 4 BPNF 8-BIT WORDS PER ; LINE, WITH A REFERENCE ADDRESS IN DECIMAL PRECEDING ; EACH LINE. ; BNPF CALL EXPR ;3911-CD 70 3D * CALL CRLF ;3914-CD CD 3C * CALL LEAD ;3917-CD D7 3D * POP D ;391A-D1 POP H ;391B-E1 BN0 PUSH H ;391C-E5 PUSH D ;391D-D5 CALL PEOL ;391E-CD 5B 3E * MVI B,' ' ;3921-06 20 LXI D,10000 ;3923-11 10 27 * CALL DIGIT ;3926-CD 2E 3D * LXI D,1000 ;3929-11 E8 03 * CALL DIGIT ;392C-CD 2E 3D * LXI D,100 ;392F-11 64 00 * CALL DIGIT ;3932-CD 2E 3D * MVI E,10 ;3935-1E 0A CALL DIGIT ;3937-CD 2E 3D * MVI E,1 ;393A-1E 01 MVI B,'0' ;393C-06 30 CALL DIGIT ;393E-CD 2E 3D * MVI C,' ' ;3941-0E 20 CALL PO ;3943-CD 7D 3E * POP D ;3946-D1 POP H ;3947-E1 BN1 CALL ENCODE ;3948-CD 4D 3D * CALL HILO ;394B-CD A4 3D * JC NULL ;394E-DA 72 3A * MOV A,L ;3951-7D ANI 003H ;3952-E6 03 JNZ BN1 ;3954-C2 48 39 * JMP BN0 ;3957-C3 1C 39 * ;*********************************************** ; ; COMPARE PROM WITH MEMORY ; ; THIS ROUTINE EXPECTS ONE HEXADECIMAL PARAMETER WHICH ; IT INTERPRETS AS A MEMORY ADDRESS. THE ROUTINE ; COMPARES THE PROM IN THE FRONT PANEL SOCKET WITH A ; 256 BYTE AREA OF MEMORY POINTED TO BY THE INPUT PARAMETER. ; ALL DIFFERENCES BETWEEN THE PROM AND THE MEMORY AREA ; ARE DISPLAYED IN THE FOLLOWING FORMAT: ; ; ; COMP DCR C ;395A-0D CALL EXPR ;395B-CD 70 3D * POP H ;395E-E1 MVI E,0 ;395F-1E 00 CM0 MVI A,ENB ;3961-3E 00 OUT PROMC ;3963-D3 01 MOV A,E ;3965-7B CMA ;3966-2F OUT PAD ;3967-D3 02 CALL DELAY ;3969-CD 25 3D * IN PDI ;396C-DB 02 CMA ;396E-2F CMP M ;396F-BE JZ CM1 ;3970-CA 88 39 * PUSH PSW ;3973-F5 CALL CRLF ;3974-CD CD 3C * CALL LADR ;3977-CD BF 3D * CALL BLK ;397A-CD 53 3C * MOV A,M ;397D-7E CALL LBYTE ;397E-CD C7 3D * CALL BLK ;3981-CD 53 3C * POP PSW ;3984-F1 CALL LBYTE ;3985-CD C7 3D * CM1 INX H ;3988-23 INR E ;3989-1C JNZ CM0 ;398A-C2 61 39 * JMP START ;398D-C3 6B 38 * ;*********************************************** ; ; DISPLAY MEMORY IN HEX ON CONSOLE DEVICE. ; ; THIS ROUTINE EXPECTS TWO HGEXADECIMAL PARAMETERS SPECIFYING ; THE BOUNDS OF THE MEMORY AREA TO BE DISPLAYED ON THE ; CONSOLE DEVICE. THE MEMORY AREA IS DISPLAYED 16 BYTES ; PER LINE, WITH THE MEMORY ADDRESS OF THE FIRST BYTE ; PRINTED FOR REFERENCE. ALL LINES ARE BLOCKED INTO INTEGRAL ; MULTIPLES OF 16 FOR CLARITY, SO THAT THE FIRST AND LAST ; LINES MAY BE LESS THAN 16 BYTES IN ORDER TO SYNCRONIZE THE ; DISPLAY. ; DISP CALL EXPR ;3990-CD 70 3D * POP D ;3993-D1 POP H ;3994-E1 DI0 CALL CRLF ;3995-CD CD 3C * CALL LADR ;3998-CD BF 3D * DI1 CALL BLK ;399B-CD 53 3C * MOV A,M ;399E-7E CALL LBYTE ;399F-CD C7 3D * CALL HILO ;39A2-CD A4 3D * JC START ;39A5-DA 6B 38 * MOV A,L ;39A8-7D ANI 00FH ;39A9-E6 0F JNZ DI1 ;39AB-C2 9B 39 * JMP DI0 ;39AE-C3 95 39 * ;*********************************************** ; ; END OF FILE COMMAND. ; ; THIS ROUTINE PRODUCES A TERMINATION RECORD WHICH PROPERLY ; COMPLETES A HEXADECIMAL FILE CREATED BY 'W' COMMANDS. IT ; EXPESTS ONE HEXADECIMAL PARAMETER WHICH IS ENCODED IN THE ; TERMINATION RECORD IN THE LOAD ADDRESS FIELD AND SPECIFIES ; THE ENTRY POINT OF THE FILE CREATED. A SUBSEQUENT 'R' COMMAND ; WILL LOAD THE FILE CREATED AND TRANSFER CONTROL TO THE ; ENTRY POINT SPECIFIED IF IT IS NON-ZERO. ; EOF DCR C ;39B1-0D CALL EXPR ;39B2-CD 70 3D * CALL PEOL ;39B5-CD 5B 3E * MVI C,':' ;39B8-0E 3A CALL PO ;39BA-CD 7D 3E * XRA A ;39BD-AF MOV D,A ;39BE-57 CALL PBYTE ;39BF-CD 30 3E * POP H ;39C2-E1 CALL PADR ;39C3-CD 28 3E * MVI A,1 ;39C6-3E 01 CALL PBYTE ;39C8-CD 30 3E * XRA A ;39CB-AF SUB D ;39CC-92 CALL PBYTE ;39CD-CD 30 3E * JMP NULL ;39D0-C3 72 3A * ;*********************************************** ; ; FILL RAM MEMORY BLOCK WITH CONSTANT ; ; THIS ROUTINE EXPECTS THREE HEXADECIMAL PARAMETERS, THE ; FIRST AND SECOND (16 BITS) ARE INTERPRETED AS THE BOUNDS ; OF A MEMORY AREA TO BE INITIALIZED TO A CONSTANT VALUE, ; THE THIRD PARAMETER (8 BITS) IS THAT VALUE. ; FILL INR C ;39D3-0C CALL EXPR ;39D4-CD 70 3D * POP B ;39D7-C1 POP D ;39D8-D1 POP H ;39D9-E1 FI0 MOV M,C ;39DA-71 CALL HILO ;39DB-CD A4 3D * JNC FI0 ;39DE-D2 DA 39 * JMP START ;39E1-C3 6B 38 * ;*********************************************** ; ; GO TO
, OPTIONALLY SET BREAKPOINTS. ; ; THE G COMMAND IS USED FOR TRANSFERING CONTROL FROM THE ; MONITOR TO A USER PROGRAM. IT HAS SEVERAL MODES OF ; OPERATION. ; ; IF ONE HEXADECIMAL PARAMETER IS ENTERED, IT IS INTERPRETED ; AS THE ENTRY POINT OF THE USER PROGRAM AND A TRANSFER TO ; THAT LOCATION IS EXECUTED. ; ; IF ADDITIONAL (UP TO 2) PARAMETERS ARE ENTERED, THESE ARE ; CONSIDERED 'BREAKPOINTS', I.E., LOCATIONS WHERE ; CONTROL IS TO BE RETURNED TO THE MONITOR, IF THEY ARE ; ENCOUNTERED. ; ; IF THE FIRST PARAMETER IS NOT ENTERED, THE STORED VALUE ; OF THE USER'S PROGRAM COUNTER (REGISTER P) IS USED AS ; THE USER PROGRAM ENTRY POINT. ; GOTO CALL PCHK ;39E4-CD 4B 3E * JC GO3 ;39E7-DA 26 3A * JZ GO0 ;39EA-CA FE 39 * CALL EXF ;39ED-CD 9C 3D * POP D ;39F0-D1 LXI H,PLOC ;39F1-21 13 00 * DAD SP ;39F4-39 MOV M,D ;39F5-72 DCX H ;39F6-2B MOV M,E ;39F7-73 MOV A,B ;39F8-78 CPI CR ;39F9-FE 0D JZ GO3 ;39FB-CA 26 3A * GO0 MVI D,2 ;39FE-16 02 LXI H,TLOC ;3A00-21 14 00 * DAD SP ;3A03-39 GO1 PUSH H ;3A04-E5 MVI C,1 ;3A05-0E 01 CALL EXPR ;3A07-CD 70 3D * MOV E,B ;3A0A-58 POP B ;3A0B-C1 POP H ;3A0C-E1 MOV A,B ;3A0D-78 ORA C ;3A0E-B1 JZ GO2 ;3A0F-CA 1C 3A * MOV M,C ;3A12-71 INX H ;3A13-23 MOV M,B ;3A14-70 INX H ;3A15-23 LDAX B ;3A16-0A MOV M,A ;3A17-77 INX H ;3A18-23 MVI A,0CFH ;3A19-3E CF STAX B ;3A1B-02 GO2 MOV A,E ;3A1C-7B CPI CR ;3A1D-FE 0D JZ GO3 ;3A1F-CA 26 3A * DCR D ;3A22-15 JNZ GO1 ;3A23-C2 04 3A * GO3 CALL CRLF ;3A26-CD CD 3C * LXI H,00008H ;3A29-21 08 00 * DAD SP ;3A2C-39 PCHL ;3A2D-E9 ;*********************************************** ; ; COMPUTE HEXADECIMAL SUM AND DIFFERENCE ; ; THIS ROUTINE EXPECTS TWO HEXADECIMAL PARAMETERS. ; IT COMPUTS THE SUM AND DIFFERENCE OF THE TWO VALUES ; AND DISPLAYES THEM ON THE CONSOLE DEVICE AS FOLLOWS: ; ; ; HEXN CALL EXPR ;3A2E-CD 70 3D * POP D ;3A31-D1 POP H ;3A32-E1 CALL CRLF ;3A33-CD CD 3C * PUSH H ;3A36-E5 DAD D ;3A37-19 CALL LADR ;3A38-CD BF 3D * CALL BLK ;3A3B-CD 53 3C * POP H ;3A3E-E1 MOV A,L ;3A3F-7D SUB E ;3A40-93 MOV L,A ;3A41-6F MOV A,H ;3A42-7C SBB D ;3A43-9A MOV H,A ;3A44-67 CALL LADR ;3A45-CD BF 3D * JMP START ;3A48-C3 6B 38 * ;*********************************************** ; ; LOAD A BPNF TAPE INTO RAM MEMORY. ; ; THIS ROUTINE EXPECTS TWO HEXADECIMAL PARAMETERS AND ; INTERPRETS THEM AS BOUNDS FOR A MEMORY AREA TO BE ; LOADED BY BPNF DATA TO BE READ FROM THE READER. ; IT IS ASSUMED THAT ENOUGH DATA IS AVAILABLE IN THE ; TAPE TO BE READ TO SATISFY THE MEMORY BOUNDS ENTERED. ; IF END OF TAPE IS ENCOUNTERED BEFORE THE MEMORY BOUNDS ; ARE SATISFIED, THIS ROUTINE WILL TERMINATE ON AN ERROR ; CONDITION (SEE RIX), BUT ALL DATA READ BEFORE THE END ; OF TAPE WAS ENCOUNTERED WILL BE LOADED. ; LOAD CALL EXPR ;3A4B-CD 70 3D * CALL CRLF ;3A4E-CD CD 3C * POP D ;3A51-D1 POP H ;3A52-E1 LO0 CALL DECODE ;3A53-CD FC 3C * CALL HILO ;3A56-CD A4 3D * JNC LO0 ;3A59-D2 53 3A * JMP START ;3A5C-C3 6B 38 * ;*********************************************** ; ; MOVE A BLOCK OF MEMORY ; ; THIS ROUTINE EXPECTS THREE HEXADECIMAL PARAMETERS FROM THE ; CONSOLE. THE FIRST AND SECOND PARAMETERS ARE THE BOUNDS OF ; THE MEMORY AREA TO BE MOVED, THE THIRD PARAMETER IS THE ; STARTING ADDRESS OF THE DESTINATION AREA. ; MOVE INR C ;3A5F-0C CALL EXPR ;3A60-CD 70 3D * POP B ;3A63-C1 POP D ;3A64-D1 POP H ;3A65-E1 MV0 MOV A,M ;3A66-7E STAX B ;3A67-02 INX B ;3A68-03 CALL HILO ;3A69-CD A4 3D * JNC MV0 ;3A6C-D2 66 3A * JMP START ;3A6F-C3 6B 38 * ;*********************************************** ; ; PUNCH LEADER OR TRAILER ; ; THIS ROUTINE PUNCHES 60 NULL CHARACTERS ON THE DEVICE ASSIGNED ; AS THE PUNCH. iT IS BRANCHED TO BY THE 'B' AND 'E' COMMANDS ; AS WELL AS BEING INVOKED BY THE 'N' COMMAND. ; NULL CALL LEAD ;3A72-CD D7 3D * JMP START ;3A75-C3 6B 38 * ;*********************************************** ; ; PROGRAM A 1702A PROM WITH FAST ALGORITHM. ; (20.48 TO 409.6 SECONDS) ; ; THIS ROUTINE EXPECTS THREE HEXADECIMAL PARAMETERS FROM THE CONSOLE. ; THE FIRST AND SECOND ARE THE BOUNDS OF A MEMORY AREA TO BE ; REPRODUCED IN THE 1702a PROM IN THE FRONT PANEL SOCKET. THE THIRD ; PARAMETER IS THE ADDRESS IN THE PROM (8 BITS) WHERE THE DUPLICATION ; IS TO COMMENCE. THE ALGORITHM USED IN THIS ROUTINE TAKES ADVANTAGE ; OF THE FACT THAT MOST PROMS MAY BE PROGRAMMED IN A SMALL FRACTION ; OF THE TIME IT WOULD TAKE UNDER WORST CASE CONDITIONS, THEREFORE ; GREATLY REDUCING PROGRAMMING TIME FOR MOSTR PROMS. THE WIDE VARIATION ; IN TIMES QUOTED IS DUE TO THE ALLOWABLE RANGE BETWEEN BEST AND WORST ; CASE PROGRAMMING TIMES. ; PROG INR C ;3A78-0C CALL EXPR ;3A79-CD 70 3D * CALL CRLF ;3A7C-CD CD 3C * POP B ;3A7F-C1 POP D ;3A80-D1 POP H ;3A81-E1 PR0 MVI A,ENB ;3A82-3E 00 OUT PROMC ;3A84-D3 01 MOV A,C ;3A86-79 OUT 0FFH ;3A87-D3 FF CMA ;3A89-2F OUT PAD ;3A8A-D3 02 IN PDI ;3A8C-DB 02 CMA ;3A8E-2F CMP M ;3A8F-BE JZ PR4 ;3A90-CA C1 3A * MVI B,-16 ;3A93-06 F0 PR1 CALL PGRM ;3A95-CD 65 3E * IN PDI ;3A98-DB 02 CMA ;3A9A-2F CMP M ;3A9B-BE JZ PR2 ;3A9C-CA B4 3A * INR B ;3A9F-04 JNZ PR1 ;3AA0-C2 95 3A * PUSH B ;3AA3-C5 MVI C,'$' ;3AA4-0E 24 CALL CO ;3AA6-CD 55 3C * CALL BLK ;3AA9-CD 53 3C * POP B ;3AAC-C1 MOV A,C ;3AAD-79 CALL LBYTE ;3AAE-CD C7 3D * JMP LER ;3AB1-C3 43 3C * PR2 MOV A,B ;3AB4-78 ADI 17 ;3AB5-C6 11 ADD A ;3AB7-87 ADD A ;3AB8-87 MOV B,A ;3AB9-47 PR3 CALL PGRM ;3ABA-CD 65 3E * DCR B ;3ABD-05 JNZ PR3 ;3ABE-C2 BA 3A * PR4 INR C ;3AC1-0C CALL HILO ;3AC2-CD A4 3D * JNC PR0 ;3AC5-D2 82 3A * JMP START ;3AC8-C3 6B 38 * ;*********************************************** ; ; READ ROUTINE. ; ; THIS ROUIINE READS A HEXADECIMAL FILE FRUM THE ASSIGNED ; READER DEVICE AND LOADS IT INTO MEMORY. ONE HEXADECIMAL ; PARAMETER IS EXPECTED. THIS PARAMETER IS A BIAS ADDRESS ; TO BE ADDED TO THE MEMORY ADDRES5 OF EACH DATA BYTE ENCOUNTERED. ; IN THIS WAY, HEXADECIMAL FILES MAY BE LOADED INTO MEMORY ; IN AREAS OTHER THAN THAT FOR WHICH THEY WERE ASSEMBLED OR COMPILED. ; ALL RECORDS READ ARE CHECKSUMMED AND COMPARED AGAINST THE ; CHECKSUM IN THE RECORD. IF A CHECKSUM ERROR (OR TAPE READ ERROR) ; OCCURS, THE ROUTINE TAKES AN ERROR EXIT. NORMAL LOADING IS ; TERMINATED WHEN A RECORD OF LENGTH 0 IS ENCOUNTERED. THIS IS ; INTERPRETED AS AN END OF FILE RECORD AND THE LOAD ADDRESS ; FIELD OF THAT RECURD IS TAKEN TO BE THE ENTRY POINT OF THE ; PROGRAM (IF IT IS NON-ZERO). ; READ DCR C ;3ACB-0D CALL EXPR ;3ACC-CD 70 3D * RED0 POP H ;3ACF-E1 PUSH H ;3AD0-E5 CALL RIX ;3AD1-CD FF 3E * MVI B,03AH ;3AD4-06 3A SUB B ;3AD6-90 JNZ RED0 ;3AD7-C2 CF 3A * MOV D,A ;3ADA-57 CALL BYTE ;3ADB-CD 82 3C * JZ RED2 ;3ADE-CA 01 3B * MOV E,A ;3AE1-5F CALL BYTE ;3AE2-CD 82 3C * PUSH PSW ;3AE5-F5 CALL BYTE ;3AE6-CD 82 3C * POP B ;3AE9-C1 MOV C,A ;3AEA-4F DAD B ;3AEB-09 CALL BYTE ;3AEC-CD 82 3C * RED1 CALL BYTE ;3AEF-CD 82 3C * MOV M,A ;3AF2-77 INX H ;3AF3-23 DCR E ;3AF4-1D JNZ RED1 ;3AF5-C2 EF 3A * CALL BYTE ;3AF8-CD 82 3C * JNZ LER ;3AFB-C2 43 3C * JMP RED0 ;3AFE-C3 CF 3A * RED2 CALL BYTE ;3B01-CD 82 3C * MOV H,A ;3B04-67 CALL BYTE ;3B05-CD 82 3C * MOV L,A ;3B08-6F ORA H ;3B09-B4 JZ RED3 ;3B0A-CA 0E 3B * PCHL ;3B0D-E9 RED3 POP H ;3B0E-E1 JMP START ;3B0F-C3 6B 38 * ;*********************************************** ; ; SUBSTITUTE MEMORY CONTENTS ROUTINE. ; ; THIS ROUTINE EXPECTS ONE PARAMETER fROM THE CONSOLE, FOLLOWED ; BY A SPACE. THE PARAMETER IS INTERPRETED AS A MEMORY LOCATION ; AND THE ROUTINE WILL DISPLAY THE CONTENTS OR THAT LOCATION, ; FOLLOWED BY A DASH (-). TO MODIFY MEMORY, TYPE IN THE NEW DATA ; FOLLOWED BY A SPACE OR A CARRIAGE RETURN. IF NO MODIFICATION ; OF THE LOCATION IS REQUIRED, TYPE ONLY A SPACE OR CARRIAGE RETURN. ; IF A SPACE WAS LAST TYPED, THE NEXT MEMORY LOCATION WILL BE DISPLAYED ; AND MODIFICATION OF IT IS ALLOWED. IF A CARRIAGE RETURN WAS ENTERED, ; THE COMMAND IS TERMINATED. ; SUBS DCR C ;3B12-0D CALL EXPR ;3B13-CD 70 3D * CALL P2C ;3B16-CD 4E 3E * JC LER ;3B19-DA 43 3C * POP H ;3B1C-E1 SU0 MOV A,M ;3B1D-7E CALL LBYTE ;3B1E-CD C7 3D * MVI C,'-' ;3B21-0E 2D CALL CO ;3B23-CD 55 3C * CALL PCHK ;3B26-CD 4B 3E * JC START ;3B29-DA 6B 38 * JZ SU1 ;3B2C-CA 3C 3B * PUSH H ;3B2F-E5 CALL EXF ;3B30-CD 9C 3D * POP D ;3B33-D1 POP H ;3B34-E1 MOV M,E ;3B35-73 MOV A,B ;3B36-78 CPI CR ;3B37-FE 0D JZ START ;3B39-CA 6B 38 * SU1 INX H ;3B3C-23 JMP SU0 ;3B3D-C3 1D 3B * ;*********************************************** ; ; TRANSFER CONTENTS OF A PROM TO MEMORY. ; ; THIS ROUTINE EXPECTS ONE HEXADECIMAL PARAMETER WHICH ; IT INTERPRETS AS THE LOCATION IN MEMORY WHERE A COPY OF THE ; PROM IN THE FRONT PANEL IS TO BE STORED. THIS COPY IS ALWAYS ; 256 BYTES IN LENGTH. ; TRAN DCR C ;3B40-0D CALL EXPR ;3B41-CD 70 3D * POP H ;3B44-E1 MVI E,0 ;3B45-1E 00 TR0 MVI A,ENB ;3B47-3E 00 OUT PROMC ;3B49-D3 01 MOV A,E ;3B4B-7B CMA ;3B4C-2F OUT PAD ;3B4D-D3 02 CALL DELAY ;3B4F-CD 25 3D * IN PDI ;3B52-DB 02 CMA ;3B54-2F MOV M,A ;3B55-77 INX H ;3B56-23 INR E ;3B57-1C JNZ TR0 ;3B58-C2 47 3B * JMP START ;3B5B-C3 6B 38 * ;*********************************************** ; ; WRITE ROUTINE. ; ; THIS ROUTINE EXPECTS TWO HEXADECIMAL PARAMETERS WHICH ARE ; INTERPRETED AS THE BOUNDS OF A MEMORY AREA TO BE ENCODED ; INTO HEXADECIMAL FORMAT AND PUNCHED ON THE ASSIGNED PUNCH ; DEVICE. ; WRITE CALL EXPR ;3B5E-CD 70 3D * CALL CRLF ;3B61-CD CD 3C * POP D ;3B64-D1 POP H ;3B65-E1 WRI0 MOV A,L ;3B66-7D ADI 16 ;3B67-C6 10 MOV C,A ;3B69-4F MOV A,H ;3B6A-7C ACI 0 ;3B6B-CE 00 MOV B,A ;3B6D-47 MOV A,E ;3B6E-7B SUB C ;3B6F-91 MOV C,A ;3B70-4F MOV A,D ;3B71-7A SBB B ;3B72-98 JC WRI1 ;3B73-DA 7B 3B * MVI A,16 ;3B76-3E 10 JMP WRI2 ;3B78-C3 7E 3B * WRI1 MOV A,C ;3B7B-79 ADI 17 ;3B7C-C6 11 WRI2 ORA A ;3B7E-B7 JZ START ;3B7F-CA 6B 38 * PUSH D ;3B82-D5 MOV E,A ;3B83-5F MVI D,0 ;3B84-16 00 CALL PEOL ;3B86-CD 5B 3E * MVI C,':' ;3B89-0E 3A CALL PO ;3B8B-CD 7D 3E * MOV A,E ;3B8E-7B CALL PBYTE ;3B8F-CD 30 3E * CALL PADR ;3B92-CD 28 3E * XRA A ;3B95-AF CALL PBYTE ;3B96-CD 30 3E * WRI3 MOV A,M ;3B99-7E INX H ;3B9A-23 CALL PBYTE ;3B9B-CD 30 3E * DCR E ;3B9E-1D JNZ WRI3 ;3B9F-C2 99 3B * XRA A ;3BA2-AF SUB D ;3BA3-92 CALL PBYTE ;3BA4-CD 30 3E * POP D ;3BA7-D1 JMP WRI0 ;3BA8-C3 66 3B * ;*********************************************** ; ; EXAMINE AND MODIFY CPU REGISTERS ; ; THIS ROUTINE ALLOWS THE OPERATOR TO EXAMINE AND/OR MODIFY ; THE CONTENTS OF THE USER PROGRAM'S REGISTERS. THE REGISTER ; VALUES WERE STORED AS A RESULT OF A PREVIOUS BREAKPOINT AND ; WILL BE RESTORED TO THE USER PROGRAM DURING A SUBSEQUENT 'G' ; COMMAND. ; X CALL TI ;GET REGISTER LETTER LXI H,ACTBL ;REGISTER TABLE ADDRESS CPI CR ;CR = DUMP ALL? JZ X6 ;YES X0 CMP M ;FIND SELECTED REGISTER JZ X1 ;FOUND IT PUSH PSW ;SAVE A MOV A,M ;3BBB-7E ORA A ;3BBC-B7 JM LER ;3BBD-FA 43 3C * INX H ;STEP TO NEXT ENTRY INX H ;3BC1-23 INX H ;3BC2-23 POP PSW ;RESTORE A JMP X0 ;CONTINUE X1 CALL BLK ;PRINT SPACE X2 INX H ;GET REGISTER STACK OFFSET MOV A,M ;3BCB-7E XCHG ;SAVE HL MOV L,A ;GET REG OFFSET MVI H,0 ;3BCE-26 00 DAD SP ;3BD0-39 XCHG ;RESTORE HL INX H ;GET REGISTER LENGTH MOV B,M ;3BD3-46 INX H ;3BD4-23 LDAX D ;GET REGISTER LOW VALUE CALL LBYTE ;OUTPUT IT DCR B ;1 BYTE? JZ X3 ;YES DCX D ;3BDD-1B LDAX D ;GET REGISTER HIGH VALUE CALL LBYTE ;OUTPUT IT X3 INR B ;3BE2-04 MVI C,'-' ;3BE3-0E 2D CALL CO ;3BE5-CD 55 3C * CALL PCHK ;3BE8-CD 4B 3E * JC START ;3BEB-DA 6B 38 * JZ X5 ;3BEE-CA 06 3C * PUSH H ;3BF1-E5 PUSH B ;3BF2-C5 CALL EXF ;3BF3-CD 9C 3D * POP H ;3BF6-E1 POP PSW ;3BF7-F1 PUSH B ;3BF8-C5 PUSH PSW ;3BF9-F5 MOV A,L ;3BFA-7D STAX D ;3BFB-12 POP B ;3BFC-C1 DCR B ;3BFD-05 JZ X4 ;3BFE-CA 04 3C * INX D ;3C01-13 MOV A,H ;3C02-7C STAX D ;3C03-12 X4 POP B ;3C04-C1 POP H ;3C05-E1 X5 MOV A,M ;3C06-7E ORA A ;3C07-B7 JM START ;3C08-FA 6B 38 * MOV A,B ;3C0B-78 CPI CR ;3C0C-FE 0D JZ START ;3C0E-CA 6B 38 * JMP X2 ;3C11-C3 CA 3B * X6 CALL CRLF ;3C14-CD CD 3C * X7 CALL BLK ;3C17-CD 53 3C * MOV A,M ;3C1A-7E INX H ;3C1B-23 ORA A ;3C1C-B7 JM START ;3C1D-FA 6B 38 * MOV C,A ;3C20-4F CALL CO ;3C21-CD 55 3C * MVI C,'=' ;3C24-0E 3D CALL CO ;3C26-CD 55 3C * MOV A,M ;3C29-7E INX H ;3C2A-23 XCHG ;3C2B-EB MOV L,A ;3C2C-6F MVI H,000H ;3C2D-26 00 DAD SP ;3C2F-39 XCHG ;3C30-EB MOV B,M ;3C31-46 INX H ;3C32-23 LDAX D ;3C33-1A CALL LBYTE ;3C34-CD C7 3D * DCR B ;3C37-05 JZ X7 ;3C38-CA 17 3C * DCX D ;3C3B-1B LDAX D ;3C3C-1A CALL LBYTE ;3C3D-CD C7 3D * JMP X7 ;3C40-C3 17 3C * ;*********************************************** ; ; ERROR EXIT. ; ; THIS ABNORMAL EXIT IS EXECUTED FOR ALL MONITOR ERROR CONDITIONS. ; THE STACK POINTER VALUE IS RECOMPUTED BECAUSE OF THE UNKNOWN STATE ; OF THE PROCESSOR AS A RESULT OF A COMMAND OR DATA ERROR. ; LER CALL MEMSIZ ;3C43-CD 01 3E * LXI D,-8 ;3C46-11 F8 FF * DAD D ;3C49-19 SPHL ;3C4A-F9 MVI C,'*' ;3C4B-0E 2A CALL CO ;3C4D-CD 55 3C * JMP START ;3C50-C3 6B 38 * ;*********************************************** ; ; SUBROUTINES. ; ; BLK - OUTPUT A SPACE ; BLK MVI C,' ' ;3C53-0E 20 ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; CONSOLE OUTPUT CODE. VALUE EXPECTED IN C ; A, FLAGS, C MODIFIED ; STACK USAGE: 2 BYTES ; CO LDA IOBYT ;3C55-3A 03 00 * ANI ~CMSK ;3C58-E6 03 JNZ CO0 ;3C5A-C2 69 3C * ; IOBYT == XXXXXX00 - SER0 TTYOUT IN TTS ;CHAR READY? ANI TTYBE ;3C5F-E6 04 JNZ TTYOUT ;NO, LOOP MOV A,C ;GET CHAR CMA ;INVERT IT? OUT TTO ;ECHO IT RET ;3C68-C9 CO0 CPI CCRT ;3C69-FE 01 JNZ CO1 ;3C6B-C2 7A 3C * ; IOBYT == XXXXXX01 - SER1 CRTOUT IN CRTS ;CHAR READY? ANI CRTBE ;3C70-E6 04 JNZ CRTOUT ;NO, LOOP MOV A,C ;GET CHAR CMA ;INVERT IT? OUT CRTO ;ECHO IT RET ;3C79-C9 CO1 CPI BATCH ;3C7A-FE 02 JZ LO ;3C7C-CA E3 3D * JMP COLOC ;EXTERNAL ROM ; ; READ TWO ASCII CHARACTERS, DECODE INTO 8 BITS BINARY ; ; IOBYT == XXXXXX11 BYTE CALL RIX ;3C82-CD FF 3E * CALL NIBBLE ;3C85-CD 16 3E * RLC ;3C88-07 RLC ;3C89-07 RLC ;3C8A-07 RLC ;3C8B-07 MOV C,A ;3C8C-4F CALL RIX ;3C8D-CD FF 3E * CALL NIBBLE ;3C90-CD 16 3E * ORA C ;3C93-B1 MOV C,A ;3C94-4F ADD D ;3C95-82 MOV D,A ;3C96-57 MOV A,C ;3C97-79 RET ;3C98-C9 ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; CONSOLE INPUT CODE, VALUE RETURNED IN A ; A, FLAGS MODIFIED ; STACK USAGE: 2 BYTES ; CI LDA IOBYT ;3C99-3A 03 00 * ANI ~CMSK ;3C9C-E6 03 JNZ CI1 ;3C9E-C2 AC 3C * ; IOBYT == XXXXXX00 - SER0 TTYIN IN TTS ;3CA1-DB 01 ANI TTYDA ;3CA3-E6 01 JNZ TTYIN ;3CA5-C2 A1 3C * IN TTI ;3CA8-DB 00 CI0 CMA ;3CAA-2F RET ;3CAB-C9 CI1 CPI CCRT ;3CAC-FE 01 JNZ CI2 ;3CAE-C2 BD 3C * ; IOBYT == XXXXXX01 - SER1 CRTIN IN CRTS ;3CB1-DB 05 ANI CRTDA ;3CB3-E6 01 JNZ CRTIN ;3CB5-C2 B1 3C * IN CRTI ;3CB8-DB 04 JMP CI0 CI2 CPI BATCH ;3CBD-FE 02 JZ RI ;3CBF-CA A5 3E * JMP CILOC ;3CC2-C3 00 37 * ;*********************************************** ; ; CONVERT 4 BIT HEX VALUE TO ASCII CHARACTER ; INPUT = 0...0FH ; OUTPUT = '0...9, A-F' ; CONV ADI 090H ;3CC5-C6 90 DAA ;3CC7-27 ACI 040H ;3CC8-CE 40 DAA ;3CCA-27 MOV C,A ;3CCB-4F RET ;3CCC-C9 ;*********************************************** ; TYPE CR AND LF ON CONSOLE CRLF MVI C,CR ;3CCD-0E 0D CALL CO ;3CCF-CD 55 3C * MVI C,LF ;3CD2-0E 0A JMP CO ;3CD4-C3 55 3C * ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; CONSOLE INPUT STATUS CODE ; A, FLAGS MODIFIED ; STACK USAGE: 2 BYTES ; CSTS LDA IOBYT ;3CD7-3A 03 00 * ANI ~CMSK ;3CDA-E6 03 JNZ CS0 ;3CDC-C2 E4 3C * ; IOBYT == XXXXXX00 IN TTS ;3CDF-DB 01 JMP CS1 ;3CE1-C3 EB 3C * CS0 CPI CCRT ;3CE4-FE 01 JNZ CS3 ;3CE6-C2 F2 3C * ; IOBYT == XXXXXX01 IN CRTS ;3CE9-DB 05 CS1 ANI TTYDA ;3CEB-E6 01 MVI A,FALSE ;3CED-3E 00 CS2 RNZ ;3CEF-C0 CMA ;3CF0-2F RET ;3CF1-C9 CS3 CPI BATCH ;3CF2-FE 02 MVI A,TRUE ;3CF4-3E FF JZ CS2 ;3CF6-CA EF 3C * JMP CSLOC ;3CF9-C3 18 37 * ;*********************************************** ; ; READ BPNF TAPE RECORD, BUILD BYTE, STORE IN MEMORY ; IF ERROR, ABORT COMMAND ; DECODE CALL RIX ;3CFC-CD FF 3E * CPI 'B' ;3CFF-FE 42 JNZ DECODE ;3D01-C2 FC 3C * MVI M,1 ;3D04-36 01 DC0 CALL RIX ;3D06-CD FF 3E * CPI 'N' ;3D09-FE 4E JNZ DC2 ;3D0B-C2 1D 3D * DC1 MOV A,M ;3D0E-7E RAL ;3D0F-17 MOV M,A ;3D10-77 JNC DC0 ;3D11-D2 06 3D * CALL RIX ;3D14-CD FF 3E * CPI 'F' ;3D17-FE 46 JNZ LER ;3D19-C2 43 3C * RET ;3D1C-C9 DC2 ADI -'P' ;3D1D-C6 B0 JNZ LER ;3D1F-C2 43 3C * JMP DC1 ;3D22-C3 0E 3D * ;*********************************************** ; ; 1.0 MS DELAY ; DELAY PUSH B ;SAVE BC MVI B,84 ;LOAD COUNTER DL0 DCR B ;DONE? JNZ DL0 ;NO, LOOP POP B ;RESTORE BC RET ;3D2D-C9 ;*********************************************** ; ; CONVERT BINARY NUMBER TO A STRING OF ASCII DIGITS ; HL - BINARY NUMBER ; DE - DIVISOR (DECENDING POWERS OF 10) ; B - LEADING ZERO SUPPRESSION CHARACTER ; A,C - TEMPORARIES ; DIGIT MVI C,'0' ;3D2E-0E 30 DG0 MOV A,L ;3D30-7D SUB E ;3D31-93 MOV L,A ;3D32-6F MOV A,H ;3D33-7C SBB D ;3D34-9A MOV H,A ;3D35-67 JC DG1 ;3D36-DA 3D 3D * INR C ;3D39-0C JMP DG0 ;3D3A-C3 30 3D * DG1 DAD D ;3D3D-19 MOV A,C ;3D3E-79 CPI '0' ;3D3F-FE 30 JNZ DG3 ;3D41-C2 48 3D * MOV C,B ;3D44-48 DG2 JMP PO ;3D45-C3 7D 3E * DG3 MVI B,'0' ;3D48-06 30 JMP DG2 ;3D4A-C3 45 3D * ;*********************************************** ; ; ENCODE A BPNF WORD AND PUNCH IT ; ENCODE MVI C,'B' ;3D4D-0E 42 CALL PO ;3D4F-CD 7D 3E * MVI B,8 ;3D52-06 08 MOV A,M ;3D54-7E EN0 RLC ;3D55-07 PUSH PSW ;3D56-F5 MVI A,0 ;3D57-3E 00 RAL ;3D59-17 RAL ;3D5A-17 ADI 'N' ;3D5B-C6 4E MOV C,A ;3D5D-4F CALL PO ;3D5E-CD 7D 3E * POP PSW ;3D61-F1 DCR B ;3D62-05 JNZ EN0 ;3D63-C2 55 3D * MVI C,'F' ;3D66-0E 46 CALL PO ;3D68-CD 7D 3E * MVI C,' ' ;3D6B-0E 20 JMP PO ;3D6D-C3 7D 3E * ;*********************************************** ; ; EVALUATE EXPRESSION: ,, ; ; THE C REGISTER CONTAINS THE NUMBER OF PARAMETERS REQUIRED ; (1, 2, OR 3). PARAMETERS ARE RETURNED ON THE STACK ; EXPR LXI H,0 ;CLEAR HL EX0 CALL TI ;GET NEXT CHAR EX1 MOV B,A ;SAVE CHAR CALL NIBBLE ;3D77-CD 16 3E * JC EX2 ;3D7A-DA 86 3D * DAD H ;3D7D-29 DAD H ;3D7E-29 DAD H ;3D7F-29 DAD H ;3D80-29 ORA L ;3D81-B5 MOV L,A ;3D82-6F JMP EX0 ;3D83-C3 73 3D * EX2 XTHL ;3D86-E3 PUSH H ;3D87-E5 MOV A,B ;3D88-78 CALL P2C ;3D89-CD 4E 3E * JNC EX3 ;3D8C-D2 94 3D * DCR C ;3D8F-0D JNZ LER ;3D90-C2 43 3C * RET ;3D93-C9 EX3 JNZ LER ;3D94-C2 43 3C * DCR C ;3D97-0D JNZ EXPR ;3D98-C2 70 3D * RET ;3D9B-C9 EXF MVI C,1 ;3D9C-0E 01 LXI H,0 ;3D9E-21 00 00 * JMP EX1 ;3DA1-C3 76 3D * ;*********************************************** ; ; COMPARE HL WITH DE: ; IF HL < DE THEN CARRY = 0; ; IF HL = DE THEN CARRY = 0; ; IF HL > DE THEN CARRY = 1; ; HILO INX H ;3DA4-23 MOV A,H ;3DA5-7C ORA L ;3DA6-B5 STC ;3DA7-37 RZ ;3DA8-C8 MOV A,E ;3DA9-7B SUB L ;3DAA-95 MOV A,D ;3DAB-7A SBB H ;3DAC-9C RET ;3DAD-C9 ;*********************************************** ; ; CONVERT NIBBLE IN A-REGISTER TO ASCII IN A-REGISTER ; AND PRINT ON CONSOLE DEVICE ; RXD CALL CONV ;3DAE-CD C5 3C * JMP CO ;3DB1-C3 55 3C * ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; I/O SYSTEM STATUS CODE ; STATUS BYTE RETURNED IN A ; STACK USAGE: 2 BYTES ; IOCHK LDA IOBYT ;3DB4-3A 03 00 * RET ;3DB7-C9 ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; SET I/O CONFIGURATION ; VALUE EXPECTED IN C ; STACK USAGE: 2 BYTES ; IOSET PUSH H ;3DB8-E5 LXI H,IOBYT ;3DB9-21 03 00 * MOV M,C ;3DBC-71 POP H ;3DBD-E1 RET ;3DBE-C9 ;*********************************************** ; ; PRINT CONTENTS OF HL IN HEX ON CONSOLE DEVICE ; LADR MOV A,H ;3DBF-7C CALL LBYTE ;3DC0-CD C7 3D * MOV A,L ;3DC3-7D JMP LBYTE ;3DC4-C3 C7 3D * ;*********************************************** ; ; LIST A BYTE AS 2 ASCII CHARACTERS ; LBYTE PUSH PSW ;3DC7-F5 RRC ;3DC8-0F RRC ;3DC9-0F RRC ;3DCA-0F RRC ;3DCB-0F ANI 00FH ;3DCC-E6 0F CALL RXD ;3DCE-CD AE 3D * POP PSW ;3DD1-F1 ANI 00FH ;3DD2-E6 0F JMP RXD ;3DD4-C3 AE 3D * ;*********************************************** ; ; PUNCH 6 INCHES OF LEADER ; LEAD MVI B,60 ;60 NULLS IN HDR LE0 MVI C,0 ;NULL CALL PO ;3DDB-CD 7D 3E * DCR B ;DONE? JNZ LE0 ;NO, LOOP RET ;3DE2-C9 ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; LIST OUTPUT CODE ; VALUE EXPECTED IN C, A AND FLAGS MODIFIED ; STACK USAGE: 2 BYTES ; ; IOBYT == XXXXXX10 - PAR02 LO LDA IOBYT ;3DE3-3A 03 00 * ANI ~LMSK ;3DE6-E6 C0 JZ TTYOUT ;3DE8-CA 5D 3C * CPI LCRT ;3DEB-FE 40 JZ CRTOUT ;3DED-CA 6E 3C * CPI LUSE1 ;3DF0-FE 80 JZ L1LOC ;3DF2-CA 12 37 * JMP L2LOC ;3DF5-C3 15 37 * ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; RETURN ADDRESS OF END OF MEMORY TO USER ; VALUE RETURNED IN BC ; STACK USAGE: 8 BYTES ; MEMCK PUSH H ;3DF8-E5 CALL MEMSIZ ;3DF9-CD 01 3E * MOV B,H ;3DFC-44 MVI A,0C0H ;3DFD-3E C0 POP H ;3DFF-E1 RET ;3E00-C9 ;*********************************************** ; ; FIND END OF MEMORY, SET STACK ; MEMSIZ PUSH B ;SAVE BC LXI H,0FFH ;TOP OF PAGE 0 MEM0 DCR H ;STEP DOWN A PAGE MOV A,M ;IS IT RAM? CMA MOV M,A CMP M CMA MOV M,A JNZ MEM0 ;YES, CONTINUE INX H ;STEP TO LAST RAM ; LXI B,EXIT-ENDA ;??? LXI B,0FFEEH DAD B POP B ;RESTORE BC RET ;*********************************************** ; ; DECODE ASCII CHAR IN A-REGISTER INTO HEX DIGIT IN A-REGISTER ; FILTER OUT ALL CHARACTERS NOT IN THE SEQUENCE (0...9,A...F). ; RETURN CARRY = 1 FOR ILLEGAL CHARACTERS. ; NIBBLE SUI '0' ;3E16-D6 30 RC ;3E18-D8 ADI '0'-'G' ;3E19-C6 E9 RC ;3E1B-D8 ADI 6 ;3E1C-C6 06 JP NI0 ;3E1E-F2 24 3E * ADI 7 ;3E21-C6 07 RC ;3E23-D8 NI0 ADI 10 ;3E24-C6 0A ORA A ;3E26-B7 RET ;3E27-C9 ;*********************************************** ; ; PUNCH CONTENTS OF HL IN HEX ON PUNCH DEVICE ; PADR MOV A,H ;3E28-7C CALL PBYTE ;3E29-CD 30 3E * MOV A,L ;3E2C-7D JMP PBYTE ;3E2D-C3 30 3E * ;*********************************************** ; ; PUNCH A BYTE AS 2 ASCII CHARACTERS ; PBYTE PUSH PSW ;3E30-F5 RRC ;3E31-0F RRC ;3E32-0F RRC ;3E33-0F RRC ;3E34-0F ANI 00FH ;3E35-E6 0F CALL CONV ;3E37-CD C5 3C * CALL PO ;3E3A-CD 7D 3E * POP PSW ;3E3D-F1 PUSH PSW ;3E3E-F5 ANI 00FH ;3E3F-E6 0F CALL CONV ;3E41-CD C5 3C * CALL PO ;3E44-CD 7D 3E * POP PSW ;3E47-F1 ADD D ;3E48-82 MOV D,A ;3E49-57 RET ;3E4A-C9 ;*********************************************** ; ; TEST FOR NULL INPUT PARAMETER ; PCHK CALL TI ;GET NEXT CHAR P2C CPI ' ' ;3E4E-FE 20 RZ ;3E50-C8 CPI ',' ;3E51-FE 2C RZ ;3E53-C8 CPI CR ;3E54-FE 0D STC ;3E56-37 CMC ;3E57-3F RNZ ;3E58-C0 STC ;3E59-37 RET ;3E5A-C9 ;*********************************************** ; ; PUNCH CR, LF ; PEOL MVI C,CR ;3E5B-0E 0D CALL PO ;3E5D-CD 7D 3E * MVI C,LF ;3E60-0E 0A JMP PO ;3E62-C3 7D 3E * ;*********************************************** ; ; PULSE A PROM LOCATION ; HL POINTS TO DATA IN MEMORY ; PROM ADDRESS IS ALREADY SET ; PGRM MOV A,M ;3E65-7E CMA ;3E66-2F OUT PTPO ;3E67-D3 03 MVI A,080H ;3E69-3E 80 OUT TTS ;3E6B-D3 01 MVI A,000H ;3E6D-3E 00 OUT TTS ;3E6F-D3 01 PUSH B ;3E71-C5 MVI B,014H ;3E72-06 14 PG0 CALL DELAY ;3E74-CD 25 3D * DCR B ;3E77-05 JNZ PG0 ;3E78-C2 74 3E * POP B ;3E7B-C1 RET ;3E7C-C9 ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; PUNCH OUTPUT CODE, VALUE EXPECTED IN C ; A, FLAGS, AND C MODIFIED ; STACK USAGE: 2 BYTES ; PO LDA IOBYT ;3E7D-3A 03 00 * ANI ~PMSK ;3E80-E6 30 JZ TTYOUT ;3E82-CA 5D 3C * CPI PPTP ;3E85-FE 10 JNZ PO1 ;3E87-C2 9D 3E * ; IOBYT == XX01XXXX PO0 IN PTPS ;3E8A-DB 01 ANI PRDY ;3E8C-E6 40 JZ PO0 ;3E8E-CA 8A 3E * MOV A,C ;3E91-79 OUT PTPO ;3E92-D3 03 MVI A,PTPGO ;3E94-3E 0A OUT TTS ;3E96-D3 01 MVI A,PTPNO ;3E98-3E 08 OUT TTS ;3E9A-D3 01 RET ;3E9C-C9 PO1 CPI PUSE1 ;3E9D-FE 20 JZ P1LOC ;3E9F-CA 0C 37 * JMP P2LOC ;3EA2-C3 0F 37 * ;*********************************************** ; ; EXTERNALLY REFERENCED ROUTINE ; READER INPUT CODE ; VALUE RETURNED IN A, A, AND FLAGS MODIFIED ; STACK USAGE: 8 BYTES ; ; IOBYT == XXXXXX10 - RDR? RI PUSH H ;SAVE HL LXI H,IOBYT ;GET IOBYT MOV A,M ;3EA9-7E ANI ~RMSK ;LST DEFINED? JNZ RI3 ;YES ; IOBYT == XXXX00XX MVI A,TTYGO ;3EAF-3E 09 OUT TTC ;3EB1-D3 01 MVI A,TTYNO ;3EB3-3E 08 OUT TTC ;3EB5-D3 01 MVI H,TOUT ;3EB7-26 FA RI0 IN TTS ;3EB9-DB 01 ANI TTYDA ;3EBB-E6 01 JZ RI2 ;3EBD-CA CB 3E * CALL DELAY ;3EC0-CD 25 3D * DCR H ;3EC3-25 JNZ RI0 ;3EC4-C2 B9 3E * RI1 XRA A ;3EC7-AF STC ;3EC8-37 POP H ;3EC9-E1 RET ;3ECA-C9 RI2 IN TTI ;3ECB-DB 00 CMA ;3ECD-2F ORA A ;3ECE-B7 POP H ;3ECF-E1 RET ;3ED0-C9 RI3 CPI RPTR ;3ED1-FE 04 JNZ RI6 ;3ED3-C2 F6 3E * ; IOBYT == XXXX01XX MVI A,PTRGO ;3ED6-3E 0C OUT TTS ;3ED8-D3 01 MVI A,PTRNO ;3EDA-3E 08 OUT TTS ;3EDC-D3 01 MVI H,TOUT ;3EDE-26 FA RI4 IN PTRS ;3EE0-DB 01 ANI PTRDA ;3EE2-E6 20 JNZ RI5 ;3EE4-C2 F1 3E * CALL DELAY ;3EE7-CD 25 3D * DCR H ;3EEA-25 JNZ RI4 ;3EEB-C2 E0 3E * JMP RI1 ;3EEE-C3 C7 3E * RI5 IN PTRI ;3EF1-DB 03 ORA A ;3EF3-B7 POP H ;3EF4-E1 RET ;3EF5-C9 RI6 POP H ;3EF6-E1 CPI RUSE1 ;3EF7-FE 08 ; IOBYT == XXXX10XX JZ R1LOC ;EXTERNAL ROM ; IOBYT == XXXX11XX JMP R2LOC ;EXTERNAL ROM ;*********************************************** ; ; GET CHARACTER FROM READER, MASK OFF PARITY BIT ; RIX CALL RI ;3EFF-CD A5 3E * JC LER ;3F02-DA 43 3C * ANI 07FH ;3F05-E6 7F RET ;3F07-C9 ;*********************************************** ; ; RESTART 1 CODE, (PROGRAMMED BREAKPOINT) ; ; THIS ROUTINE IS ENTERED VIA AND RESTART 1 (RST 1) INSTRUCTION ; THE INSTRUCTION IS ENCOUNTERED EITHER IN THE USER PROGRAM (AS ; A BREAKPOINT) OR IS INPUT VIA A CONSOLE INTERRUPT. THIS ; ROUTINE SAVES THE STATE OF THE CALLING PROCESS AND TURNS CONTROL ; OVER TO THE MONITOR. ; RESTART PUSH H ;SAVE ALL PUSH D ;3F09-D5 PUSH B ;3F0A-C5 PUSH PSW ;3F0B-F5 CALL MEMSIZ ;3F0C-CD 01 3E * XCHG ;3F0F-EB LXI H,10 ;3F10-21 0A 00 * DAD SP ;3F13-39 MVI B,4 ;3F14-06 04 XCHG ;3F16-EB RST0 DCX H ;3F17-2B MOV M,D ;3F18-72 DCX H ;3F19-2B MOV M,E ;3F1A-73 POP D ;3F1B-D1 DCR B ;3F1C-05 JNZ RST0 ;3F1D-C2 17 3F * POP B ;3F20-C1 DCX B ;3F21-0B SPHL ;3F22-F9 LXI H,TLOC ;3F23-21 14 00 * DAD SP ;3F26-39 MOV A,M ;3F27-7E SUB C ;3F28-91 INX H ;3F29-23 JNZ RST1 ;3F2A-C2 32 3F * MOV A,M ;3F2D-7E SUB B ;3F2E-90 JZ RST3 ;3F2F-CA 40 3F * RST1 INX H ;3F32-23 INX H ;3F33-23 MOV A,M ;3F34-7E SUB C ;3F35-91 JNZ RST2 ;3F36-C2 3F 3F * INX H ;3F39-23 MOV A,M ;3F3A-7E SUB B ;3F3B-90 JZ RST3 ;3F3C-CA 40 3F * RST2 INX B ;3F3F-03 RST3 LXI H,LLOC ;3F40-21 0F 00 * DAD SP ;3F43-39 MOV M,E ;3F44-73 INX H ;3F45-23 MOV M,D ;3F46-72 INX H ;3F47-23 INX H ;3F48-23 MOV M,C ;3F49-71 INX H ;3F4A-23 MOV M,B ;3F4B-70 PUSH B ;3F4C-C5 MVI C,'*' ;3F4D-0E 2A CALL CO ;3F4F-CD 55 3C * POP H ;3F52-E1 CALL LADR ;3F53-CD BF 3D * LXI H,TLOC ;3F56-21 14 00 * DAD SP ;3F59-39 MVI D,2 ;3F5A-16 02 RST4 MOV C,M ;3F5C-4E MVI M,0 ;3F5D-36 00 INX H ;3F5F-23 MOV B,M ;3F60-46 MVI M,0 ;3F61-36 00 INX H ;3F63-23 MOV A,C ;3F64-79 ORA B ;3F65-B0 JZ RST5 ;3F66-CA 6B 3F * MOV A,M ;3F69-7E STAX B ;3F6A-02 RST5 INX H ;3F6B-23 DCR D ;3F6C-15 JNZ RST4 ;3F6D-C2 5C 3F * JMP START ;3F70-C3 6B 38 * ;*********************************************** ; ; INPUT FROM CONSOLE, ECHOED AND RETURNED IN A ; TI CALL CI ;GET A CHARACTER ANI 07FH ;REMOVE PARITY PUSH B ;SAVE BC MOV C,A ;ECHO CHAR CALL CO ;3F7A-CD 55 3C * MOV A,C ;RESTORE CHAR POP B ;RESTORE BC RET ;3F7F-C9 ;*********************************************** ; ; MASTER I/O DEVICE TABLE ; 4 BYTES/ENTRY ; ; BYTE 0 = IDENTIFYING CHARACTER ; BYTE 1 = LOGICAL DEVICE MASK ; BYTE 2,3 = SUBORDINATE PHYSICAL DEVICE TABLE LTBL DB 'C', 0FCH DW ACT DB 'R', 0F3H DW ART DB 'P', 0CFH DW APT DB 'L', '?' DW ALT ; ; I/O SYSTEM PHYSICAL DEVICE TABLES ; 2 BYTES/ENTRY ; ; BYTE 0 = IDENTIFYING CHARACTER ; BYTE 1 = DEVICE SELECT BIT PATTERN ; ACT DB 'T', CTTY ;CONSOLE = TTY DB 'C', CCRT ;CONSOLE = CRT DB 'B', BATCH ;BATCH MODE CONSOLE = READ, LIST DB '1', CUSE ;USER DEFINED CONSOLE DEVICE ART DB 'T', RTTY ;READER = TTY DB 'P', RPTR ;READER = PTR DB '1', RUSE1 ;USER DEFINED READER DEVICE 1 DB '2', RUSE2 ;USER DEFINED READER DEVICE 1 APT DB 'T', PTTY ;PUNCH = TTY DB 'P', PPTP ;PUNCH = PTP DB '1', PUSE1 ;USER DEFINED PUNCH DEVICE 1 DB '2', PUSE2 ;USER DEFINED PUNCH DEVICE 2 ALT DB 'T', LTTY ;CONSOLE = TTY DB 'C', LCRT ;CONSOLE = CRT DB '1', LUSE1 ;USER DEFINED LIST DEVICE 1 DB '2', LUSE2 ;USER DEFINED LIST DEVICE 2 ; ; EXIT CODE TEMPLATE, TO BE EXECUTED IN RAM ; EXIT ;MONITOR STACK ORIGIN POP D ;RESTORE DE POP B ;RESTORE BC POP PSW ;RESTORE AF POP H ;RESTORE ORIGINAL STACK VALUE SPHL EI ;ENABLE INTERRUPTS LXI H,$-$ ;RESTORE HL HLX EQU $-2 JMP $-$ ;RETURN TO INTERRUPTED CODE PCX EQU $-2 TIA DW 0 ;TRAP 1 ADDRESS DB 0 ;TRAP 1 VALUE DW 0 ;TRAP 2 ADDRESS DB 0 ;TRAP 2 VALUE ENDX ; ; DISPLACEMENT OF REGISTER LOCATION FROM SP (LEVEL 0) ; ALOC EQU 5 BLOC EQU 3 CLOC EQU 2 DLOC EQU 1 ELOC EQU 0 FLOC EQU 4 HLOC EQU HLX-EXIT+9 LLOC EQU HLX-EXIT+8 PLOC EQU PCX-EXIT+9 SLOC EQU 7 TLOC EQU TIA-EXIT+8 ; ; TABLE FOR ACCESSING REGISTERS ; TABLE CONTAINS: ; (1) REGISTER IDENTIFIER ; (2) STACK POINTER DISPLACEMENT ; (3) PRECISION ; ACTBL DB 'A', ALOC, 1 DB 'B', BLOC, 1 DB 'C', CLOC, 1 DB 'D', DLOC, 1 DB 'E', ELOC, 1 DB 'F', FLOC, 1 DB 'H', HLOC, 1 DB 'L', LLOC, 1 DB 'M', HLOC, 2 DB 'P', PLOC, 2 DB 'S', SLOC, 2 DB -1 ; ; END OF PROGRAM ; END