AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  1                 ;-------------------------------------------------------------;                 ; IDIOT/4 MONITOR FOR THE 1802   WRITTEN: 6/23/82 BY LEE HART ;                 ; COPYRIGHT 1982-85 BY TMSI     LAST MOD: 3/28/86 BY LEE HART ;                 ;                                                             ;                 ; This program may be used for any noncommercial use free of  ;                 ; charge. Contact information: Lee A. Hart, 814 8th Ave N,    ;                 ; Sartell MN 56377, email            ;                 ;-------------------------------------------------------------;                 ;                 ; REGISTER ASSIGNMENTS:                 ;                 ;               1 - INTERRUPT PROGRAM COUNTER (FOR BREAKPOINTS)                 ;               2 - STACK POINTER                 ;               3 - NORMAL PROGRAM COUNTER                 ;               4 - MONITOR: RAM PAGE0 POINTER                 ;                   BASIC:   SCRT "CALL" PC                 ;               5 - MONITOR: MAIN PC                 ;                   BASIC:   SCRT "RETURN" PC                 ;               8 - MONITOR: ?M VS. !M SWITCH                 ;              10 - MONITOR: MEMORY POINTER  000C           DELAY   EQU    12 ; PC FOR DELAY SUBROUTINE  000D           HEXX    EQU    13 ; MONITOR: HEX ADDRESS ACCUMULATOR  000E           BAUD    EQU    14 ; RE.1=BAUD RATE CONSTANT                 ;                   RE.0=USED FOR READ, TYPE  000F           ASCII   EQU    15 ; RF.1=ASCII I/O CHARACTER                 ;                   RF.0=USED FOR READ, TYPE                 ;                 ; EQUATES                 ;  00D3           TYPA    EQU     0D3H            ; TYPE CHARACTER MACRO                 ;                 ;  0000 71        RESET   DIS                     ; DISABLE INTERRUPTS  0001 00                DC      0  0002 F8FF      FINDRAM LDI     0FFH            ; FIND RAM, STARTING AT FFFF  0004 B4                PHI     R4  0005 F8FF      TRYAGAIN LDI    0FFH            ; REPEAT...  0007 A4                PLO     R4              ; - TEST TOP BYTE ON PAGE  0008 54                STR     R4              ; - STORE 'FF'  0009 04                LDN     R4              ;   READ IT BACK,  000A FBFF              XRI     0FFH            ;   COMPARE  000C C6                LSNZ                    ; - IF OK, STORE ALL 0'S,  000D 54                STR     R4              ;   READ BACK,  000E 04                LDN     R4              ;   COMPARE  000F 321A              BZ      RAMFOUND        ; - IF OK, THEN RAM FOUND  0011 94                GHI     R4              ; - IF NO MORE PAGES TO TEST,  0012 32DD              BZ      NORAM           ;      THEN GO TO NORAM  0014 A4                PLO     R4              ;      ELSE DEC. PAGE NUMBER  0015 24                DEC     R4  0016 84                GLO     R4  0017 B4                PHI     R4              ; ...UNTIL DONE AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  2  0018 3005              BR      TRYAGAIN  001A F8DF      RAMFOUND LDI    0DFH            ; RAM FOUND:  001C A4                PLO     R4              ; SAVE CPU REGISTERS  001D E4                SEX     R4                 ;                 ; SAVE REGISTERS:  SAVES A COPY OF ALL CPU REGISTERS & I/O BITS                 ;       IN RAM. MUST BE ENTERED WITH P=R0 OR R1, X=R4.  SAVES                 ;       ALL REGISTERS CORRECTLY EXCEPT P, X, D, R(P), AND R4.                 ;  001E 8F        SAVER   GLO     RF              ; SAVE REGISTERS R0-RF IN RAM  001F 73                STXD  0020 9F                GHI     RF              ; RF 1ST, R0 LAST,  0021 73                STXD                    ; WITH HI BYTE IN LOWER ADDRESS  0022 8E                GLO     RE  0023 73                STXD  0024 9E                GHI     RE  0025 73                STXD                    ; THE REGISTERS BEING USED FOR PROGRAM  0026 8D                GLO     RD              ; COUNTER AND RAM POINTER ARE CHANGING  0027 73                STXD                    ; DURING EXECUTION, SO THEIR STORED VALUES  0028 9D                GHI     RD              ; WILL BE FIXED LATER.  0029 73                STXD  002A 8C                GLO     RC  002B 73                STXD  002C 9C                GHI     RC  002D 73                STXD  002E 8B                GLO     RB  002F 73                STXD  0030 9B                GHI     RB  0031 73                STXD  0032 8A                GLO     RA  0033 73                STXD  0034 9A                GHI     RA  0035 73                STXD  0036 89                GLO     R9  0037 73                STXD  0038 99                GHI     R9  0039 73                STXD  003A 88                GLO     R8  003B 73                STXD  003C 98                GHI     R8  003D 73                STXD  003E 87                GLO     R7  003F 73                STXD  0040 97                GHI     R7  0041 73                STXD  0042 86                GLO     R6  0043 73                STXD  0044 96                GHI     R6  0045 73                STXD  0046 85                GLO     R5  0047 73                STXD AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  3  0048 95                GHI     R5  0049 73                STXD  004A 73                STXD                    ; DON'T BOTHER TO SAVE R4 (SAVES 2 BYTES)  004B 73                STXD  004C 83                GLO     R3  004D 73                STXD  004E 93                GHI     R3  004F 73                STXD  0050 82                GLO     R2  0051 73                STXD  0052 92                GHI     R2  0053 73                STXD  0054 81                GLO     R1  0055 73                STXD  0056 91                GHI     R1  0057 73                STXD  0058 80                GLO     R0  0059 73                STXD  005A 90                GHI     R0  005B 73                STXD  005C F800              LDI     0               ; LOAD 0 (& SAVE A COPY FOR LATER)  005E B3                PHI     R3  005F 3F63              BN4     $+4             ; PACK STATUS OF EF4 & EF3 INTO 1 BYTE  0061 F904              ORI     004H            ; AND PUSH INTO RAM  0063 3E67              BN3     $+4             ;   X4 - EF4 ACTIVE  0065 F930              ORI     030H            ;   3X - EF3 ACTIVE  0067 73                STXD  0068 93                GHI     R3              ; PACK STATUS OF EF2 & EF1 INTO 1 BYTE  0069 3D6D              BN2     $+4             ; AND PUSH INTO RAM  006B F902              ORI     002H            ;   X2 - EF2 ACTIVE  006D 3C71              BN1     $+4             ;   1X - EF1 ACTIVE  006F F910              ORI     010H  0071 73                STXD  0072 93                GHI     R3              ; PUSH STATUS OF Q INTO RAM  0073 C5                LSNQ                    ;   1 - Q ACTIVE  0074 F901              ORI     1               ;   0 - Q INACTIVE  0076 73                STXD  0077 F801              LDI     1               ; PUSH STATUS OF IE INTO RAM  0079 CC                LSIE                    ;   1 - ENABLED  007A F800              LDI     0               ;   0 - DISABLED  007C 73                STXD  007D 93                GHI     R3              ; PUSH D(=0) TO RAM (DUMMY VALUE)  007E 73                STXD  007F 7C00              ADCI    0               ; PUSH DF INTO RAM  0081 73                STXD  0082 78                SAV                     ; PUSH T INTO RAM  0083 24                DEC     R4  0084 F8C5              LDI     LOW IFINT       ; IF CALLED VIA INTERRUPT, RETURN  0086 A1                PLO     R1  0087 90                GHI     R0              ; ELSE CALLED VIA RESET,  0088 B1                PHI     R1              ;      SET RP=R1 AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  4  0089 F88D              LDI     $+4  008B A1                PLO     R1  008C D1                SEP     R1  008D F800              LDI     0               ; PUSH STATUS=0  008F 54                STR     R4                 ;  0090 F8CA      CONTINIT LDI    LOW CHANGE      ; COPY CODE THAT CHANGES TO THE DESIRED PC  0092 A5                PLO     R5              ; FOR A $R COMMAND. THE CODE GOES TO 35 BYTES  0093 91                GHI     R1              ; BEFORE "SAVEREG" MEMORY  0094 FC03              ADI     3  0096 B5                PHI     R5  0097 F8A0              LDI     0A0H  0099 A4                PLO     R4  009A F818              LDI     24  009C A3                PLO     R3  009D 45        INITLOOP LDA    R5              ; LOOP AND MOVE THE BYTES  009E 54                STR     R4  009F 14                INC     R4  00A0 23                DEC     R3              ; R4 WILL END UP POINTING TO XXB8  00A1 83                GLO     R3  00A2 3A9D              BNZ     INITLOOP  00A4 94                GHI     R4              ; INITIALIZE R2 (STACK POINTER)  00A5 B2                PHI     R2  00A6 F8C3              LDI     0C3H            ; CORRECT STORED VALUE OF R1  00A8 A4                PLO     R4  00A9 F8BB              LDI     LOW INTERUPT  00AB 73                STXD  00AC 91                GHI     R1  00AD 73                STXD  00AE 91                GHI     R1              ; LOAD R5 WITH ADDRESS OF "ENTRY"  00AF FC01              ADI     1  00B1 B5                PHI     R5  00B2 F8F8              LDI     LOW ENTRY  00B4 A5                PLO     R5  00B5 F8FE              LDI     0FEH            ; POINT R3 TO TIMALC  00B7 A3                PLO     R3  00B8 91                GHI     R1  00B9 B3                PHI     R3              ; CALL TIMALC; IT RETURNS WITH "SEP R5",  00BA D3                SEP     R3              ; SO IT WILL RETURN TO "ENTRY"                          ; SO IT WILL RET                 URN TO "ENTRY"                 ;                 ; INTERUPT:  INTERRUPT HANDLER FOR IDIOT MONITOR. HARDWARE INTERRUPT                 ;       SAVES ALL REGISTERS EXCEPT T CORRECTLY. A SOFTWARE INTERRUPT                 ;       (D1=SEP R1) SAVES ALL BUT P AND X CORRECTLY. R2 MUST POINT TO                 ;       A STACK WITH AT LEAST 4 FREE BYTES TO SAVE D AND R4 CORRECTLY.                 ;  00BB E2        INTERUPT SEX    R2              ; ENTRY: OLD P AND X DESTROYED  00BC 22                DEC     R2              ; DEC. STACK POINTER TO FREE LOCATION  00BD 73                STXD                    ; PUSH D  00BE 94                GHI     R4              ; PUSH R4  00BF 73                STXD AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  5  00C0 84                GLO     R4  00C1 52                STR     R2  00C2 E4                SEX     R4              ; SET X=R4 AND GO TO SAVE REGISTERS  00C3 3002              BR      FINDRAM  00C5 F810      IFINT   LDI     010H            ; RETURN HERE:  00C7 73                STXD                    ; PUSH STATUS=10  00C8 F8C9              LDI     0C9H            ; CORRECT STORED CONTENTS OF R4  00CA A4                PLO     R4  00CB 42                LDA     R2  00CC 73                STXD  00CD 42                LDA     R2  00CE 73                STXD  00CF F8BB              LDI     0BBH            ; CORRECT STORED CONTENTS OF D  00D1 A4                PLO     R4  00D2 42                LDA     R2  00D3 54                STR     R4  00D4 F8C5              LDI     0C5H            ; CORRECT STORED VALUE OF STACK POINTER  00D6 A4                PLO     R4              ; TO ACTUAL VALUE AT TIME OF INTERRUPT  00D7 82                GLO     R2  00D8 73                STXD  00D9 92                GHI     R2  00DA 73                STXD  00DB 3090              BR      CONTINIT        ; GO CONTINUE INITIALIZATION                 ;  00DD 90        NORAM   GHI     R0              ; NO RAM: CAN'T SAVE REGISTERS  00DE FC01              ADI     1  00E0 B3                PHI     R3  00E1 F8F8              LDI     LOW ENTRY       ; CHANGE PROGRAM COUNTER TO R3  00E3 A3                PLO     R3  00E4 E2                SEX     R2              ; STACK POINTER TO R2  00E5 D3                SEP     R3              ; GO TO IDIOT/2                 ;                 ; DELAY SUBROUTINE: USED BY THE READ AND TYPE ROUTINES TO GENERATE A                 ;       TIME DELAY PROPORTIONAL TO THE BAUD RATE. THE LENGTH OF THE DELAY                 ;       (IN MACHINE CYCLES) IS SPECIFIED BY:                 ;                 ;               DELAY = 4 + 4(BAUD)(#BITS + 3)                 ;                 ;       WHERE "#BITS" IS AN IN-LINE BYTE FROM THE CALLING PROGRAM                 ;       AND "BAUD" IS THE BAUD RATE TIMING CONSTANT FROM THE UPPER 7 BITS                 ;       OF RE.1 (BAUD.1). "DELAY" USES RC AS ITS DEDICATED PROGRAM COUNTER,                 ;       AND RETURNS VIA A "SEP R3" WITH DF=1, D=0, AND RE.0=0.                 ;  00EE                   ORG     00EEH  00EE D3                SEP     R3              ; RETURN TO CALLER  00EF 9E        DELAY1  GHI     BAUD            ; GET BAUD CONSTANT  00F0 F6                SHR                     ; REMOVE ECHO FLAG  00F1 AE                PLO     BAUD            ; REPEAT...  00F2 2E                DEC     BAUD            ; - DECREMENT BAUD  00F3 43                LDA     R3              ; - GET #BITS,  00F4 FF01              SMI     1               ;   DECREMENT UNTIL ZERO AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  6  00F6 3AF4              BNZ     $-2  00F8 8E                GLO     BAUD            ; ...UNTIL BAUD=0  00F9 32EE              BZ      $-11            ; GO TO RETURN  00FB 23                DEC     R3  00FC 30F2              BR      $-10                 ;                 ; TIMALC:  CALCULATES THE BAUD RATE AND SETS THE ECHO FLAG BASED ON THE                 ;       1ST CHARACTER RECEIVED:  CARRIAGE RETURN SELECTS FULL DUPLEX (ALL                 ;       INPUTS ECHOED); LINE FEED SELECTS HALF DUPLEX (NO ECHO). "TIMALC"                 ;       SETS UP RC AS PC FOR THE "DELAY" ROUTINE AND LOADS A CONSTANT                 ;       PROPORTIONAL TO THE BAUD RATE IN THE UPPER 7 BITS OF "BAUD" (RE.1),                 ;       WITH THE LEAST SIGNIFICANT BIT=0 FOR ECHO, OR =1 FOR NO ECHO.                 ;  00FE                   ORG     00FEH  00FE 93        TIMALC  GHI     R3              ; POINT RC TO "DELAY"  00FF BC                PHI     DELAY  0100 F8EF              LDI     LOW DELAY1  0102 AC                PLO     DELAY  0103 F800              LDI     0               ; LET BAUD=0  0105 AE                PLO     BAUD  0106 AF                PLO     ASCII           ; LET ASCII=0  0107 3707              B4      $               ; WAIT FOR START BIT  0109 3F09              BN4     $               ; WAIT FOR 1ST NON-0 DATA BIT  010B F803              LDI     3               ; WAIT 14 MACHINE CYCLES  010D FF01      TC      SMI     1  010F 3A0D              BNZ     $-2  0111 8F                GLO     ASCII  0112 3A17              BNZ     ZTO1            ; MEASURE LENGTH OF 1ST ZERO BIT AFTER START  0114 3719              B4      INCR            ; BIT (SAME FOR BOTH AND )  0116 1F                INC     ASCII  0117 371E      ZTO1    B4      DAUX  0119 1E        INCR    INC     BAUD  011A F807              LDI     7  011C 300D              BR      TC  011E 2E        DAUX    DEC     BAUD            ; BAUD = #LOOPS IN 2 BIT TIMES  011F 2E                DEC     BAUD  0120 8E                GLO     BAUD  0121 F901              ORI     1  0123 BE                PHI     BAUD  0124 DC                SEP     DELAY           ; WAIT 1.5 BIT TIMES  0125 0C                DC      00CH  0126 3F2C              BN4     WAIT            ; IF BIT=1, IS LF  0128 9E                GHI     BAUD            ;    THEN SET LSB BAUD=1  0129 FAFE              ANI     0FEH  012B BE                PHI     BAUD            ;    ELSE LSB BAUD=0,  012C DC        WAIT    SEP     DELAY           ;         WAIT FOR END OF CHARACTER  012D 26                DC      026H  012E D5                SEP     R5              ; RETURN                 ;                 ; READ: READS A SERIAL CHARACTER VIA EF4 AND RETURNS WITH ITS ASCII CODE IN                 ;       ASCII.1 AND D (BUT D WILL BE LOST IF SCRT CALL & RETURN IS USED). AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  7                 ;       EXPECTS P=3; ALTERS DF, ASCII, & BAUD.0; AND RETURNS WITH SEP R5.                 ;                 ; TTYRED:  SAME AS "READ", BUT FIRST DOES AN "OUT 7" X'80' TO TURN ON                 ;       A SERIAL INPUT DEVICE SUCH AS A TAPE RECORDER. ONCE A CHARACTER HAS                 ;       STARTED, AN "OUT 7" X'40' IS USED TO TURN IT OFF AGAIN.                 ;                 ; READAH:  SAME AS "READ", BUT IF A HEX CHARACTER (0-9, A-F), IT IS ALSO                 ;       SHIFTED INTO THE LOW 4 BITS OF "HEXX" & DF=1 IS RETURNED; IF NOT                 ;       HEX, RETURNS DF=0, "READAH" USES P=R3, ALTERS D, DF, RF, RE.0, &                 ;       RETURNS WITH A "SEP R5" AND R3 POINTING TO "READAH" ENTRY POINT.                 ;                 ; NOTE:  THE READ ROUTINES EXIT AT THE BEGINNING OF THE ECHOED STOP BIT,                 ;       & SET BAUD.0 (RE.0) >0 AS A DELAY FLAG FOR THE "TYPE" ROUTINES. THE                 ;       "TYPE" ROUTINES CHECK THIS FLAG BEFORE TYPING THE NEXT BYTE, & IF                 ;       SET, WILL FIRST SEND 2 STOP BITS. TAKE CARE NOT TO RESET THIS FLAG                 ;       (BY USING THE DELAY ROUTINE OR RE.0) UNTIL ENOUGH TIME HAS PASSED                 ;       SO NO FURTHER DELAY IS NEEDED.                 ;  012F                   ORG     012FH  012F FC07      CKDEC   ADI     7               ; IF CHARACTER IS 0-9 OR A-F,  0131 3337              BDF     NFND  0133 FC0A              ADI     00AH            ;    THEN SHIFT IT IN  0135 3388              BDF     FND             ;    ELSE IS NON-HEX,  0137 FC00      NFND    ADI     0               ;       SET DF=0  0139 9F        REXIT   GHI     ASCII           ; PUT CHARACTER IN D  013A D5                SEP     R5              ; RETURN WITH ENTRY FLAG SET:  013B F880      READAH  LDI     080H            ;   =80 IF VIA READAH  013D 38                SKP  013E 83        READ    GLO     R3              ;   =3F IF VIA READ  013F C8                LSKP  0140 F800      TTYRED  LDI     0               ;   =00 IF VIA TTYRED  0142 AF                PLO     ASCII           ; SAVE ENTRY FLAG  0143 F880      READ2   LDI     080H            ; SET #BITS IN CHARACTER=7  0145 BF                PHI     ASCII           ; (TAKES 7 SHIFTS TO CHANGE '80' INTO '01')  0146 E3                SEX     R3  0147 8F                GLO     ASCII           ; GET ENTRY FLAG  0148 C6                LSNZ                    ; IF TTYRED,  0149 67                OUT     7               ;    TURN READER ON  014A 80                DC      080H  014B 3F4B              BN4     $               ; WAIT IF A STOP BIT  014D 374D      TTY1    B4      $               ; FIND A START BIT:  014F DC                SEP     DELAY           ; - DELAY 1/2 BIT TIME, TEST AGAIN  0150 02                DC      2  0151 374D              B4      TTY1            ; - REPEAT IF GONE  0153 8F                GLO     ASCII  0154 C6                LSNZ                    ; - IF TTYRED, TURN READER OFF  0155 67                OUT     7  0156 40                DC      040H                 ;                 ; BEGIN SERIAL INPUT (DELAY+44 MC./LOOP)                 ; AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  8  0157 E2        NOBIT   SEX     R2              ; EQUALIZE DELAYS  0158 E2                SEX     R2  0159 9E        BIT     GHI     BAUD  015A F6                SHR  015B 3362              BDF     NOECHO          ; IF ECHO=YES,  015D 3761              B4      OUTBIT  015F 7B                SEQ                     ;    SET Q IF BIT=1  0160 C8                LSKP                    ;    RESET Q IF BIT=0  0161 7A        OUTBIT  REQ  0162 C4        NOECHO  NOP                     ; EQUALIZE DELAYS  0163 C7                LSNF  0164 E2                SEX     R2  0165 E2                SEX     R2  0166 E2                SEX     R2  0167 C4                NOP  0168 C4                NOP  0169 DC                SEP     RC              ; WAIT 1 BIT TIME  016A 07                DC      7  016B 1E                INC     BAUD            ; SET DELAY FLAG =1  016C 9F                GHI     ASCII           ; SHIFT ASCII CHARACTER 1 BIT  016D F6                SHR  016E BF                PHI     ASCII  016F 3378              BDF     STOP            ; IF MORE BITS TO GO,  0171 F980              ORI     080H            ;    THEN MASK CURRENT BIT INTO CHARACTER  0173 3F57              BN4     NOBIT  0175 BF                PHI     ASCII           ;       CONTINUE LOOP  0176 3059              BR      BIT  0178 7A        STOP    REQ                     ;    ELSE SET STOP BIT  0179 3243              BZ      READ2           ; REPEAT IF 00=NULL  017B 8F                GLO     ASCII           ; IF READ OR TTYRED,  017C FE                SHL                     ;    THEN GO TO EXIT  017D 3B39              BNF     REXIT           ;    ELSE IS READAH:  017F 9F                GHI     ASCII           ; IF CHARACTER < "A",  0180 FF41              SMI     041H            ;    THEN GO CHECK FOR A NUMBER (0-9)  0182 3B2F              BNF     CKDEC  0184 FF06              SMI     006H            ;    ELSE CHECK FOR LETTERS A-F  0186 3337              BDF     NFND  0188 FE        FND     SHL                     ; CHARACTER IS HEX:  0189 FE                SHL  018A FE                SHL                     ;   SHIFT IT INTO THE LOWEST 4 BITS OF HEXX,  018B FE                SHL                     ;   1 BIT AT A TIME  018C FC08              ADI     8  018E FE                SHL  018F AE        FND1    PLO     BAUD            ; REPEAT FOUR TIMES...  0190 8D                GLO     HEXX            ; - SHIFT BIT INTO HEXX.0  0191 7E                SHLC  0192 AD                PLO     HEXX  0193 9D                GHI     HEXX            ; - SHIFT CARRY BIT INTO HEXX.1  0194 7E                SHLC  0195 BD                PHI     HEXX  0196 8E                GLO     BAUD            ; - GET NEXT BIT AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE  9  0197 FE                SHL                     ; ...UNTIL DONE  0198 3A8F              BNZ     FND1  019A 3039              BR      REXIT           ; EXIT WITH DELAY FLAG SET                 ;                 ; TYPE5: TYPES THE BYTE AT THE MEMORY LOCATION POINTED TO BY R5, & THEN                 ;       INCREMENTS R5. IF DELAY FLAG IS SET (BAUD.0>1), "TYPE5" 1ST WAITS                 ;       2 BIT-TIMES SO ANY PREVIOUS READ OPERATIONS END, TYPES THE BYTE,                 ;       AND THEN RESETS THE DELAY FLAG=0 SO FURTHER TYPES ARE NOT DELAYED.                 ;                 ; TYPE6: SAME, BUT USES & INCREMENTS R6.                 ;                 ; TYPE:  SAME, BUT TYPES ASCII.1 (RF.1)                 ;                 ; TYPE5D: SAME AS "TYPE5", BUT ALWAYS WAITS 2 BIT-TIMES.                 ;                 ; TYPE2:  SAME AS "TYPE5", BUT TYPES THE CONTENTS OF ASCII.1 (RF.1)                 ;       AS TWO HEX DIGITS (0-9, A-F).                 ;                 ;       ALL TYPE ROUTINES USE P=R3, EXIT VIA "SEP R5", & CAN USE THE SCRT                 ;       CALL & RETURN.  THE SERIAL OUTPUT USES "Q",WITH 1 START, 8 DATA, &                 ;       2 STOP BITS. LINE FEEDS ARE FOLLOWED BY 3 NULLS (=0) IN CASE                 ;       THE TERMINAL NEEDS TIME FOR THE SEQUENCE.  Q=0 IS "MARK"                 ;       OR STOP BIT; Q=1 IS A "SPACE" OR START BIT.  THE DELAY ROUTINE                 ;       DETERMINES THE BAUD RATE.  ALL "TYPE" ROUTINES ALTER D,DF,X,RD.0,                 ;       RE.0, RF.0, & EXIT WITH R3 AT "TYPE5".                 ;                 ;   BAUD.0 = DELAY FLAG: =0 NO DELAY                 ;                        >0 DELAY 2 BITS                 ;  ASCII.0 = (LO 4 BITS) #BITS/CHARACTER                 ;          = (HI 4 BITS) 0= BYTE OUTPUT                 ;                        1= 1ST HEX OUT                 ;                        2= LAST HEX OUT                 ;                        5= OUTPUT  019C                   ORG     019CH  019C 9E        TYPE5D  GHI     BAUD            ; IF TYPE5D,  019D AE                PLO     BAUD            ;    THEN SET DELAY FLAG TRUE (>0)  019E 38                SKP  019F D5        TYPEXIT SEP     R5  01A0 45        TYPE5   LDA     R5              ; IF TYPE5, GET BYTE VIA R5, THEN INC. R5  01A1 38                SKP  01A2 46        TYPE6   LDA     R6              ; IF TYPE6, GET BYTE VIA R6, THEN INC. R6  01A3 38                SKP  01A4 9F        TYPE    GHI     ASCII           ; IF TYPE, GET BYTE IN ASCII.1  01A5 AD                PLO     RD                 ;                 ; DETERMINE CODE BYTE                 ;  01A6 FB0A              XRI     00AH            ; IF LINE FEED,  01A8 3ABE              BNZ     TY2             ;    THEN SET CODE=, 11 BITS  01AA F85B              LDI     05BH  01AC 30C0              BR      TY3 AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 10  01AE 9F        TYPE2   GHI     ASCII           ;       IF TYPE2,  01AF F6                SHR                     ;          THEN GET ASCII.1  01B0 F6                SHR                     ;               EXTRACT UPPER 4 BITS  01B1 F6                SHR  01B2 F6                SHR  01B3 FCF6              ADI     0F6H            ;               CONVERT TO HEX:  01B5 C7                LSNF                    ;               IF "A" OR MORE, ADD 37  01B6 FC07              ADI     7  01B8 FFC6              SMI     0C6H            ;                  ELSE ADD 30  01BA AD                PLO     RD  01BB F81B              LDI     01BH            ;               CODE=HEX, 11 BITS  01BD C8                LSKP  01BE F80B      TY2     LDI     00BH            ;   ELSE SET CODE=BYTE, 11 BITS  01C0 AF        TY3     PLO     ASCII           ;       SAVE CODE BYTE                 ;                 ; BEGIN SERIAL OUTPUT (DELAY + 44 MACHINE CYCLES PER LOOP)                 ;  01C1 8E        BEGIN   GLO     BAUD            ; IF DELAY FLAG > 0,  01C2 CE                LSZ                     ;    WAIT 2 BIT-TIMES IN CASE  01C3 DC                SEP     DELAY           ;    PREVIOUS READ NOT DONE  01C4 17                DC      23  01C5 7B                SEQ                     ; BEGIN START BIT  01C6 DC        NEXTBIT SEP     RC              ; REPEAT...  01C7 07                DC      7               ; - WAIT 1 BIT-TIME  01C8 C4                NOP                     ;   (RETURNS WITH D=0)  01C9 C4                NOP  01CA C4                NOP  01CB C4                NOP  01CC C4                NOP  01CD C4                NOP  01CE 2F                DEC     ASCII           ; - DECREMENT #BITS  01CF F5                SD                      ; - SET DF=1  01D0 8D                GLO     RD              ; - GET NEXT BIT OF CHARACTER  01D1 76                SHRC  01D2 AD                PLO     RD  01D3 CF                LSDF                    ; - IF BIT=0,  01D4 7B                SEQ                     ;      SET Q=1="SPACE"  01D5 C8                LSKP  01D6 7A                REQ                     ; - IF BIT=1,  01D7 C4                NOP                     ;      SET Q=0="MARK"  01D8 8F                GLO     ASCII           ; ...UNTIL #BITS=0  01D9 FA0F              ANI     00FH  01DB 3AC6              BNZ     NEXTBIT  01DD 8F        NXCHAR  GLO     ASCII           ; GET CODE BYTE;  01DE FCFB              ADI     0FBH            ; DECREMENT CODE,  01E0 AF                PLO     ASCII           ; SET #BITS=11  01E1 3B9F              BNF     TYPEXIT         ; IF NO MORE, EXIT!                 ;                 ; TEST CODE BYTE TO SEE WHAT TO DO NEXT                 ;  01E3 FF1B              SMI     01BH            ; IF CODE=1, AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 11  01E5 329F              BZ      TYPEXIT         ;    THEN WAS LAST NULL: EXIT  01E7 F800              LDI     0               ; IF CODE>1,  01E9 33F5              BDF     HX22            ;    THEN GET NULL & GO TYPE IT                 ;                               ; IF CODE=0,  01EB 9F        HEX2    GHI     ASCII           ;    GET BYTE  01EC FA0F              ANI     00FH            ;    MASK LOWER 4  01EE FCF6              ADI     0F6H            ;    CONVERT TO HEX  01F0 C7                LSNF                    ;    IF "A" OR MORE,  01F1 FC07              ADI     7               ;       THEN ADD 37  01F3 FFC6              SMI     0C6H            ;       ELSE ADD 30  01F5 AD        HX22    PLO     RD              ;    LOAD BYTE  01F6 30C1              BR      BEGIN           ;    BEGIN TYPING IT                 ;                 ; "IDIOT" MONITOR:  UTILITY PROGRAM TO EXAMINE & CHANGE REGISTERS OR MEMORY,                 ;       AND EXECUTE PROGRAMS WITH BREAKPOINTS. AN ASTERISK (*) INDICATES                 ;       "IDIOT" IS READY FOR A COMMAND. ALL COMMANDS CONSIST OF PUNCTUATION                 ;       (?!$) FOLLOWED BY A LETTER (M,P,R). ALL OTHER INPUTS ARE IGNORED.                 ;       NUMBERS ARE HEXADECIMAL, AND LEADING ZEROS ARE UNNECESSARY. SPACES,                 ;       LINE FEEDS, & CARRIAGE RETURNS CAN BE USED BETWEEN NUMBERS FOR                 ;       READABILITY. THE COMMANDS ARE:                 ;                 ;  !M - CHANGE MEMORY                 ;         EXAMPLE:  !MA00 11 22 33                 ;       WRITES HEX BYTES (11,22,33) INTO MEMORY, STARTING AT THE SPECIFIED                 ;       ADDRESS (0A00).                 ;                 ;  ?M - EXAMINE MEMORY                 ;         EXAMPLE:  ?MA00 3                 ;           TYPES:  0A00 1122 33                 ;       TYPE THE SPECIFIED ADDRESS (0A00) AND THE CONTENTS OF THE SPECIFIED                 ;       NUMBER OF BYTES OF MEMORY (3). LONG LISTINGS CAN BE ABORTED BY                 ;       TYPING A "BREAK".                 ;                 ;     - MOVE MEMORY                 ;         EXAMPLE:  ?MA00 3 !M800                 ;       MOVES A SPECIFIED NUMBER OF BYTES IN MEMORY (3) FROM ONE ADDRESS                 ;       (0A00) TO ANOTHER (0800).  THE BLOCKS CAN OVERLAP WITHOUT ERROR.                 ;                 ;  ?R - EXAMINE CPU REGISTERS                 ;         EXAMPLE:  ?R                 ;           TYPES:  10B8 ID T  DF D  IE Q  EF1234                 ;                   10C0 R0 R1 R2 R3 R4 R5 R6 R7                 ;                   10D0 R8 R9 RA RB RC RD RE RF                 ;       TYPES CONTENTS OF CPU REGISTERS SAVED AFTER THE LAST INTERRUPT,                 ;       BREAKPOINT, OR RESET. "10B8" ETC. IS THE ADDRESS IN RAM WHERE THIS                 ;       DATA IS STORED. REGISTER CONTENTS CAN BE CHANGED WITH A !M COMMAND,                 ;       AND RESTORED WITH A $R COMMAND.                 ;                 ;  $P - RUN PROGRAM                 ;         EXAMPLE:  $PA00                 ;       BEGINS PROGRAM EXECUTION AT THE ADDRESS SPECIFIED (0A00) WITH AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 12                 ;       P=X=R0 AND INTERRUPTS ENABLED.                 ;                 ;  $R - RUN REGISTERS                 ;         EXAMPLE:  $R23                 ;       BEGINS PROGRAM EXECUTION WITH THE CPU REGISTERS SET TO THE CONTENTS                 ;       OF RAM LOCATIONS 10BA-10EF, AND X & P SET TO THE SPECIFIED VALUES                 ;       (X=2, P=3).                 ;  01F8 95        ENTRY   GHI     R5              ; SET A POINTER TO TYPE5D  01F9 B3                PHI     R3  01FA F89C              LDI     LOW TYPE5D  01FC A3                PLO     R3              ; TYPE "SIGNON" MESSAGE:  01FD D30D              DC      TYPA,13         ;  01FF D30A              DC      TYPA,10         ;  0201 D349              DC      TYPA,'I'        ;  0203 D344              DC      TYPA,'D'        ;  0205 D349              DC      TYPA,'I'        ;  0207 D34F              DC      TYPA,'O'        ;  0209 D354              DC      TYPA,'T'        ;  020B D32F              DC      TYPA,'/'        ;  020D D334              DC      TYPA,'4'        ; <4>  020F 95        RESTART GHI     R5  0210 FF01              SMI     1  0212 B3                PHI     R3  0213 F89C              LDI     LOW TYPE5D  0215 A3                PLO     R3              ; TYPE "PROMPT" MESSAGE:  0216 D30D              DC      TYPA,13         ;  0218 D30A              DC      TYPA,10         ;  021A D32A              DC      TYPA,'*'        ; <*>  021C F800      IGNORE  LDI     0  021E BD                PHI     HEXX            ; SET HEXX=0  021F AD                PLO     HEXX  0220 F83B              LDI     LOW READAH      ; REPEAT...  0222 A3                PLO     R3  0223 D3                SEP     R3              ; - GET A KEY  0224 FB24              XRI     '$'             ; - IF "$",  0226 32CC              BZ      DOLLAR          ;       GO TO DOLLAR  0228 FB05              XRI     005H            ; - IF "!",  022A A8                PLO     R8              ;       SET SWITCH=0  022B CE                LSZ                     ; - IF "?",  022C FB1E              XRI     01EH            ;       LEAVE SWITCH>0  022E 3A1C              BNZ     IGNORE          ; ...UNTIL ONE FOUND                 ;                 ; GET ADDRESS FOR ?M, !M, OR ?R COMMAND                 ;  0230 D3                SEP     R3              ; GET NEXT KEY  0231 FB52              XRI     'R'             ; IF "R",  0233 3A40              BNZ     RDARGS  0235 F8B8              LDI     0B8H            ;    SET ADDRESS TO SAVED REGISTERS  0237 AA                PLO     RA  0238 92                GHI     R2 AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 13  0239 BA                PHI     RA  023A F828              LDI     40              ;    SET #BYTES=40  023C AD                PLO     HEXX  023D D3                SEP     R3              ;    GET NEXT KEY  023E 305C              BR      RD3             ;    GO TYPE IT  0240 FB1F      RDARGS  XRI     01FH            ; IF "M",  0242 3A1C              BNZ     IGNORE  0244 D3        RD1     SEP     R3              ;    IGNORE LEADING NON-HEX CHARACTERS  0245 3B44              BNF     $-1  0247 D3                SEP     R3              ;    ASSEMBLE HEX CHAR.INTO ADDRESS  0248 3347              BDF     $-1  024A FB20              XRI     020H            ;    IF NEXT KEY NOT "SPACE",  024C 3AC1              BNZ     SYNERR          ;       GO TO SYNTAX ERROR  024E 9D                GHI     HEXX  024F BA                PHI     RA              ;    LET ADDRESS POINTER=HEXX  0250 8D                GLO     HEXX  0251 AA                PLO     RA              ; IF SWITCH=0,  0252 88                GLO     R8              ;    IS "!M" COMMAND;  0253 32AB              BZ      EX1             ;    GO TO EX1                 ;                 ; ?M COMMAND:  GET #BYTES TO TYPE                 ;  0255 F800              LDI     0               ; SET HEXX=0  0257 AD                PLO     HEXX  0258 BD                PHI     HEXX  0259 D3        RD2     SEP     R3              ; GET KEYS & ASSEMBLE INTO HEX  025A 3359              BDF     $-1                 ;                 ; DETERMINE IF TYPE OR MOVE COMMAND                 ;  025C 8D        RD3     GLO     HEXX            ; SET #BYTES=HEXX  025D A8                PLO     R8  025E 9D                GHI     HEXX  025F B8                PHI     R8  0260 9F                GHI     ASCII           ; GET LAST KEY  0261 FB21      RD5     XRI     '!'             ; IF "!",  0263 32FA              BZ      BRMOVE          ;    GO TO MOVE DATA  0265 FB01              XRI     001H            ; IF "SPACE",  0267 3A6C              BNZ     $+5             ;    IGNORE IT,  0269 D3                SEP     R3              ;    GET ANOTHER KEY  026A 3061              BR      RD5             ;    REPEAT  026C FB2D              XRI     02DH            ; IF , GO TO TYPE  026E 3AC1              BNZ     SYNERR          ;    ELSE SYNTAX ERROR                 ;                 ; TYPE SPECIFIED DATA                 ;  0270 F89C      RD4     LDI     LOW TYPE5D  0272 A3                PLO     R3  0273 D3        NXLINE  SEP     R3              ; TYPE  0274 0A                DC      00AH  0275 3FC1              BN4     SYNERR          ; IF "BREAK", GO TO SYNTAX ERROR AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 14  0277 9A        LINE1   GHI     RA              ; TYPE ADDRESS OF POINTER:  0278 BF                PHI     ASCII  0279 F8AE              LDI     LOW TYPE2  027B A3                PLO     R3  027C D3                SEP     R3              ; UPPER BYTE  027D 8A                GLO     RA  027E BF                PHI     ASCII  027F F8AE              LDI     LOW TYPE2  0281 A3                PLO     R3  0282 D3                SEP     R3              ; LOWER BYTE  0283 D3                SEP     R3              ; TYPE A "SPACE"  0284 20                DC      ' '  0285 4A        TLOOP   LDA     RA              ; GET BYTE @ POINTER, & ADVANCE POINTER  0286 BF                PHI     ASCII  0287 F8AE              LDI     LOW TYPE2       ; TYPE BYTE  0289 A3                PLO     R3  028A D3                SEP     R3  028B 28                DEC     R8              ; DECREMENT #BYTES  028C 88                GLO     R8  028D 3A92              BNZ     TL3             ; IF #BYTES=0,  028F 98                GHI     R8              ;    GO TO RESTART  0290 320F              BZ      RESTART  0292 8A        TL3     GLO     RA              ; IF LINE IS FULL (I.E. ADDRESS ENDS IN XXX0),  0293 FA0F              ANI     00FH  0295 3A9D              BNZ     TL2  0297 D3                SEP     R3              ;    TYPE <;>  0298 3B                DC      ';'  0299 D3                SEP     R3              ;    TYPE  029A 0D                DC      00DH  029B 3073              BR      NXLINE          ;    GO TO NEXT LINE  029D F6        TL2     SHR                     ; IF ODD ADDRESS,  029E 3385              BDF     TLOOP           ;    THEN TYPE NEXT BYTE  02A0 3083              BR      TLOOP-2         ;    ELSE GO TYPE A "SPACE" FIRST                 ;                 ; !M COMMAND:  WRITES BYTES INTO MEMORY                 ;  02A2 D3        EX3     SEP     R3              ; GET KEYS UNTIL HEX  02A3 3BA2              BNF     $-1  02A5 D3        EX2     SEP     R3              ; GET 2ND HEX KEY  02A6 3BC1              BNF     SYNERR          ; IF NOT HEX, SYNTAX ERROR  02A8 8D                GLO     HEXX            ; STORE BYTE AT ADDRESS,  02A9 5A                STR     RA              ; INCREMENT ADDRESS  02AA 1A                INC     RA  02AB D3        EX1     SEP     R3              ; GET NEXT KEY  02AC 33A5              BDF     EX2             ; IF HEX, ASSEMBLE INTO ADDRESS AND REPEAT  02AE FB0D              XRI     00DH            ; IF ,  02B0 320F              BZ      RESTART         ;    DONE: GO TO RESTART  02B2 FB21      EX4     XRI     021H            ; IF <,>,  02B4 32A2              BZ      EX3             ;    CONTINUE ON NEW LINE  02B6 FB17              XRI     017H            ; IF <;>, CONTINUE  02B8 3AAB              BNZ     EX1             ;    ELSE IGNORE KEY & REPEAT AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 15  02BA D3                SEP     R3              ; IF <:>,  02BB FB0D              XRI     00DH            ;    IGNORE FURTHER KEYS UNTIL  02BD 3ABA              BNZ     $-3  02BF 3044              BR      RD1             ; THEN CONTINUE ON NEW LINE WITH A NEW ADDRESS                 ;                 ; SYNTAX ERROR                 ;  02C1 F89C      SYNERR  LDI     LOW TYPE5D      ; POINT TO TYPE5D  02C3 A3                PLO     R3  02C4 D3                SEP     R3              ; TYPE  02C5 0D                DC      00DH  02C6 D3                SEP     R3              ;  02C7 0A                DC      00AH  02C8 D3                SEP     R3              ;  02C9 3F                DC      '?'  02CA 300F              BR      RESTART         ; AND RESTART                 ;                 ; $P AND $R COMMANDS                 ;  02CC D3        DOLLAR  SEP     R3              ; GET KEY  02CD FB52              XRI     'R'             ; IF "R",  02CF A8                PLO     R8              ;    SET SWITCH=0  02D0 CE                LSZ                     ; IF "P",  02D1 FB02              XRI     002H            ;    LEAVE SWITCH>0  02D3 3A1C              BNZ     IGNORE          ; IGNORE ALL ELSE                 ;                 ; GET NUMBER FOR $R OR $P COMMAND                 ;  02D5 D3        D1      SEP     R3              ; GET NEXT KEY  02D6 33D5              BDF     $-1             ; IF HEX, ASSEMBLE ADDRESS & REPEAT  02D8 FB0D              XRI     00DH            ; IF NOT ,  02DA 3AC1              BNZ     SYNERR          ;    GO TO SYNTAX ERROR  02DC 9D                GHI     HEXX            ; PUT NUMBER IN R0  02DD B0                PHI     R0  02DE 8D                GLO     HEXX  02DF A0                PLO     R0  02E0 F89C              LDI     LOW TYPE5D      ; TYPE  02E2 A3                PLO     R3  02E3 D3                SEP     R3  02E4 0A                DC      00AH  02E5 88                GLO     R8              ; IF SWITCH>0,  02E6 32FE              BZ      RESTORE         ;    IS "$P" COMMAND; CONTINUE                 ;                 ; $P COMMAND:  BEGIN EXECUTION AT SPECIFIED ADDRESS WITH P=X=0, IE=1                 ;  02E8 F8BB              LDI     LOW INTERUPT    ; SET R1 FOR BREAKPOINT INTERRUPT  02EA A1                PLO     R1  02EB 95                GHI     R5  02EC FF02              SMI     2  02EE B1                PHI     R1  02EF E5                SEX     R5              ; EXECUTE AT ADDRESS IN R0! AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 16  02F0 70                RET  02F1 00                DC      0  02F2 30FF              BR      02FFH           ; BRANCH OVER PAGE JUMPS  02F4                   ORG     02F4H           ; PAGE JUMPS: ALLOW RELOCATABLE BRANCH TO PAGE 3  02F4 30C1              BR      SYNERR  02F6 C4                NOP  02F7 C4                NOP  02F8 300F              BR      RESTART  02FA 95        BRMOVE  GHI     R5              ; GO TO "MOVE" JUMP ON PAGE 3  02FB FC01              ADI     1  02FD B5                PHI     R5                 ;                 ; $R COMMAND:  RESTORE ALL CPU REGISTERS (EXCEPT "T") TO THE VALUES SAVED                 ;       IN RAM, & EXECUTE WITH THE SPECIFIED VALUES OF X AND P.                 ;                 ;       NOTE: REGISTER NAMES IN PARENTHESES INDICATE THE VALUE IN RAM TO                 ;       BE RESTORED TO THAT REGISTER.                 ;  02FE 92        RESTORE GHI     R2              ; R2=POINTER TO RAM WHERE INITIALIZATION  02FF B3                PHI     R3              ; PROGRAM WILL BE ASSEMBLED  0300 F8BF              LDI     0B8H+7  0302 A2                PLO     R2  0303 E2                SEX     R2  0304 F8C1              LDI     0B8H+9          ; START ASSEMBLING LBR INSTRUCTION  0306 52                STR     R2  0307 80                GLO     R0              ; ASSEMBLE LBR(R(P)) AS LAST OPCODE  0308 AD                PLO     HEXX  0309 FA0F              ANI     00FH            ; - GET (P)  030B FE                SHL                     ; - SET POINTER TO (R(P))  030C F4                ADD  030D A3                PLO     R3  030E 03                LDN     R3              ; - ASSEMBLE (R(P)) INTO INIT. PROGRAM  030F 73                STXD  0310 F8A8              LDI     0A8H            ; - CHANGE ORIGINAL (R(P)) TO POINT TO XX9E  0312 53                STR     R3              ;   SO EXECUTION CAN CONTINUE WHEN (P)=>P  0313 23                DEC     R3  0314 03                LDN     R3  0315 73                STXD  0316 92                GHI     R2  0317 53                STR     R3  0318 F0                LDX                     ; - RESTORE (Q) TO Q  0319 CE                LSZ                     ;   IF (Q)=1,  031A 7B                SEQ                     ;       THEN SET Q  031B 38                SKP                     ;       ELSE RESET Q  031C 7A                REQ  031D F8C0              LDI     0C0H            ; - FINISH TEMPLATE LBR INSTRUCTION  031F 73                STXD                 ;                 ; ASSEMBLE LDI OPCODE TO INITIALIZE (D)                 ;  0320 F0                LDX                     ; GET (IE) & SAVE FOR LATER AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 17  0321 BD                PHI     HEXX  0322 22                DEC     R2              ; ASSMBLE LDI OPCODE TO INITIALIZE D  0323 72                LDXA  0324 73                STXD                    ; - ASSEMBLE (D)  0325 F8F8              LDI     0F8H            ; - ASSEMBLE LDI  0327 73                STXD  0328 F0                LDX                     ; RESTORE (DF) TO DF  0329 F6                SHR  032A F8A2              LDI     0A2H            ; ASSEMBLE PLO R2 TO INITIALIZE R2.0  032C 73                STXD  032D F8C5              LDI     0B8H+13  032F A3                PLO     R3              ; - ASSEMBLE (R2.0)  0330 03                LDN     R3  0331 73                STXD  0332 F8F8              LDI     0F8H            ; - ASSEMBLE LDI  0334 73                STXD                 ;                 ; NOW RESTORE ALL R'S EXCEPT R2 & R5                 ;  0335 F8C0              LDI     0B8H+8          ; SET R2 TO (R0)  0337 A2                PLO     R2  0338 F0                LDX                     ; (R0)=>R0  0339 B0                PHI     R0  033A 9D                GHI     HEXX            ; GET (IE) & SAVE IN (R0.1)  033B 52                STR     R2  033C 12                INC     R2  033D F0                LDX  033E A0                PLO     R0  033F 8D                GLO     HEXX            ; GET (XP) & SAVE IN (R0.0)  0340 52                STR     R2  0341 12                INC     R2  0342 72                LDXA                    ; (R1)=>R1  0343 B1                PHI     R1  0344 72                LDXA  0345 A1                PLO     R1  0346 60                IRX                     ; SKIP (R2)  0347 60                IRX  0348 72                LDXA                    ; (R3)=>R3  0349 B3                PHI     R3  034A 72                LDXA  034B A3                PLO     R3  034C 72                LDXA                    ; (R4)=>R4  034D B4                PHI     R4  034E 72                LDXA  034F A4                PLO     R4  0350 60                IRX                     ; SKIP (R5)  0351 60                IRX  0352 72                LDXA                    ; (R6)=>R6  0353 B6                PHI     R6  0354 72                LDXA  0355 A6                PLO     R6 AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 18  0356 72                LDXA                    ; (R7)=>R7  0357 B7                PHI     R7  0358 72                LDXA  0359 A7                PLO     R7  035A 72                LDXA                    ; (R8)=>R8  035B B8                PHI     R8  035C 72                LDXA  035D A8                PLO     R8  035E 72                LDXA                    ; (R9)=>R9  035F B9                PHI     R9  0360 72                LDXA  0361 A9                PLO     R9  0362 72                LDXA                    ; (RA)=>RA  0363 BA                PHI     RA  0364 72                LDXA  0365 AA                PLO     RA  0366 72                LDXA                    ; (RB)=>RB  0367 BB                PHI     RB  0368 72                LDXA  0369 AB                PLO     RB  036A 72                LDXA                    ; (RC)=>RC  036B BC                PHI     RC  036C 72                LDXA  036D AC                PLO     RC  036E 72                LDXA                    ; (RD)=>RD  036F BD                PHI     RD  0370 72                LDXA  0371 AD                PLO     RD  0372 72                LDXA                    ; (RE)=>RE  0373 BE                PHI     RE  0374 72                LDXA  0375 AE                PLO     RE  0376 72                LDXA                    ; (RF)=>RF  0377 BF                PHI     RF  0378 F0                LDX  0379 AF                PLO     RF                 ;                 ; CHANGE PROGRAM COUNTER TO DESIRED REGISTER                 ;  037A 309E              BR      BRCHANGE        ; THIS IS LOCATION FOR A RELOCATABLE                 ;                                 "BR" TO PAGE WHERE THE PC IS LOCATED                 ;                 ; BLOCK MOVE COMMAND  (?MXXXX XX !MXXXX)                 ;  037C D3        MOVE    SEP     R3              ; GET NEXT KEY  037D FB4D              XRI     'M'             ; IF "M",  037F 3A86              BNZ     $+7             ;    THEN CLEAR HEXX  0381 BD                PHI     HEXX            ;    ELSE SYNTAX ERROR  0382 AD                PLO     HEXX  0383 D3                SEP     R3              ; GET HEX ADDRESS OF DESTINATION  0384 3383              BDF     $-1 AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 19  0386 FB0D              XRI     00DH            ; IF NOT ,  0388 3AF0              BNZ     BRSYNERR        ;    GO TO SYNTAX ERROR                 ;                 ; TEST IF MOVE UP/MOVE DOWN (TRICKY WITHOUT RAM)                 ;  038A 9A                GHI     RA              ; COPY SOURCE ADDRESS INTO R3  038B B3                PHI     R3  038C 8A                GLO     RA  038D A3                PLO     R3  038E 9D                GHI     HEXX            ; COPY DESTINATION INTO RF  038F BF                PHI     RF  0390 8D                GLO     HEXX  0391 AF                PLO     RF  0392 93        UPDOWN  GHI     R3              ; - IF SOURCE=0,  0393 3A96              BNZ     $+3             ;       SOURCEDESTINATION; MOVE DATA DOWN  039C 8F                GLO     RF  039D C8                LSKP                    ; SKIP TO CONTINUE                 ;-------------------------                 ; THE FOLLOWING LOCATION IS NEEDED FOR THE RELOCATABLE BRANCH TO THE                 ; PC CHANGE ROUTINE, WHICH HAS BEEN MOVED TO THE SAME PAGE AS REGISTER                 ; SAVE AREA.                 ;  039E 92        BRCHANGE GHI    R2              ; GO TO PAGE THAT PROGRAM IS ON  039F B5                PHI     R5                 ;-------------------------                 ;  03A0 2F                DEC     RF              ; DECREMENT DESTINATION  03A1 3A92              BNZ     UPDOWN          ; DATA DOWN                 ;                 ; SOURCE > DESTINATION:  MOVE DATA DOWN                 ;  03A3 98        MOVEDN  GHI     R8              ; REPEAT...  03A4 3AA7              BNZ     $+3             ; ...UNTIL #BYTES=0  03A6 88                GLO     R8  03A7 32F4              BZ      BRRESTRT        ; THEN RESTART  03A9 4A                LDA     RA              ; - LOAD VIA SOURCE  03AA 5D                STR     HEXX            ; - STORE VIA DESTINATION  03AB 1D                INC     HEXX            ; - INCREMENT POINTERS  03AC 28                DEC     R8              ; - DECREMENT #BYTES  03AD 30A3              BR      MOVEDN                 ;                 ; SOURCE <= DESTINATION:  MOVE DATA UP                 ;  03AF 98        MOVEUP  GHI     R8              ; COPY #BYTES INTO R3  03B0 B3                PHI     R3  03B1 88                GLO     R8 AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 20  03B2 A3                PLO     R3  03B3 C8                LSKP                    ; SET POINTERS TO HIGH END OF DATA  03B4 1A        UP      INC     RA              ; REPEAT...  03B5 1D                INC     HEXX  03B6 23                DEC     R3              ; - INC. SOURCE  03B7 93                GHI     R3              ; - INC. DESTINATION  03B8 3AB4              BNZ     UP              ; - DEC. #BYTES  03BA 83                GLO     R3  03BB 3AB4              BNZ     UP              ; ...UNTIL #BYTES=0  03BD ED                SEX     HEXX            ; REPEAT TO MOVE FROM TOP DOWN...  03BE 98        MUP     GHI     R8              ; ...UNTIL #BYTES=0  03BF 3AC2              BNZ     $+3  03C1 88                GLO     R8  03C2 32F4              BZ      BRRESTRT        ; THEN RESTART  03C4 0A                LDN     RA              ; - LOAD VIA SOURCE  03C5 73                STXD                    ; - STORE VIA DESTINATION  03C6 2A                DEC     RA              ; - DECREMENT POINTERS  03C7 28                DEC     R8  03C8 30BE              BR      MUP                 ;                 ; THE FOLLOWING ROUTINE CHANGES THE PROGRAM COUNTER TO THE ONE DESIRED                 ; IN A $R COMMAND. IT IS COPIED INTO RAM.                 ;  03CA F8C0      CHANGE  LDI     0B8H+8          ; SET POINTER TO SAVED (IE)  03CC A2                PLO     R2  03CD 72                LDXA                    ; GET (IE)  03CE CE                LSZ                     ; IF (IE)=1,  03CF 70                RET                     ;    THEN SET IE=1  03D0 38                SKP                     ;       (P)=>P, (X)=>X  03D1 71                DIS                     ;    ELSE SET IE=0                 ;                 ; NOW SET UP R5 (IF NOT PC), R2, & D                 ;  03D2 15        RHERE   INC     R5              ; IF R5 IS NOT THE PROGRAM COUNTER,  03D3 C8                LSKP                    ; THIS WILL GIVE CORRECT "BR" ADDRESS  03D4 30B3              BR      03B3H           ; TO "R5PC" AFTER IT IS MOVED TO XXA0  03D6 F8CA              LDI     0B8H+18         ; - SET POINTER TO (R5)  03D8 A2                PLO     R2  03D9 42                LDA     R2              ; - (R5)=>R5  03DA B5                PHI     R5  03DB 02                LDN     R2  03DC A5                PLO     R5  03DD F8C4      R5PC    LDI     0C4H            ; - (R2.1)=>R2.1  03DF A2                PLO     R2  03E0 02                LDN     R2  03E1 B2                PHI     R2                 ;                 ; SAMPLE TEMPLATE PROGRAM CREATED IN RAM                 ;                 ;       ORG     0XXB8H                 ;       LDI     (R2.0)          ; (R2.0)=>R2.0 AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 21                 ;       PLO     R2                 ;       LDI     (D)             ; (D)=>D                 ;       LBR     (R(P))          ; GO TO USER PROGRAM  03F0                   ORG     03F0H           ; PAGE JUMPS: ALLOWS RELOCATABLE LONG BRANCH                 ;                               ; TO PAGE 2.                 ;  03F0 95        BRSYNERR GHI    R5              ; BR TO SYNEER  03F1 FF01              SMI     1  03F3 B5                PHI     R5  03F4 95        BRRESTRT GHI    R5              ; BR TO RESTART  03F5 FF01              SMI     1  03F7 B5                PHI     R5  03FE                   ORG     03FEH  03FE 307C              BR      MOVE                 ;  0000                   END AVOCET SYSTEMS 1802 FAMILY ASSEMBLER -  VERSION 1.55M  SERIAL #00199 SOURCE FILE NAME: IDIOT4.ASM                                                                                PAGE 22 ---- SYMBOL TABLE ---- ASCII    000F          FINDRAM  0002          NXCHAR   01DD          RD3      025C          TLOOP    0285 BAUD     000E          FND      0188          NXLINE   0273          RD4      0270          TRYAGAIN 0005 BEGIN    01C1          FND1     018F          OUTBIT   0161          RD5      0261          TTY1     014D BIT      0159          HEX2     01EB          R0       0000          RDARGS   0240          TTYRED   0140 BRCHANGE 039E          HEXX     000D          R1       0001          RE       000E          TY2      01BE BRMOVE   02FA          HX22     01F5          R2       0002          READ     013E          TY3      01C0 BRRESTRT 03F4          IFINT    00C5          R3       0003          READ2    0143          TYPA     00D3 BRSYNERR 03F0          IGNORE   021C          R4       0004          READAH   013B          TYPE     01A4 CHANGE   03CA          INCR     0119          R5       0005          RESET    0000          TYPE2    01AE CKDEC    012F          INITLOOP 009D          R5PC     03DD          RESTART  020F          TYPE5    01A0 CONTINIT 0090          INTERUPT 00BB          R6       0006          RESTORE  02FE          TYPE5D   019C D1       02D5          LINE1    0277          R7       0007          REXIT    0139          TYPE6    01A2 DAUX     011E          MOVE     037C          R8       0008          RF       000F          TYPEXIT  019F DELAY    000C          MOVEDN   03A3          R9       0009          RHERE    03D2          UP       03B4 DELAY1   00EF          MOVEUP   03AF          RA       000A          SAVER    001E          UPDOWN   0392 DOLLAR   02CC          MUP      03BE          RAMFOUND 001A          STOP     0178          WAIT     012C ENTRY    01F8          NEXTBIT  01C6          RB       000B          SYNERR   02C1          ZTO1     0117 EX1      02AB          NFND     0137          RC       000C          TC       010D EX2      02A5          NOBIT    0157          RD       000D          TIMALC   00FE EX3      02A2          NOECHO   0162          RD1      0244          TL2      029D EX4      02B2          NORAM    00DD          RD2      0259          TL3      0292 ***** NO ERRORS DETECTED *****