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