Re: M65C02A Core
Posted: Fri Sep 21, 2018 10:24 pm
I have almost achieved my goals for the M65C02A soft-core processor.
I have a model for the Py65 environment that implements the desired features. I am beginning the task of testing the 2013 distinct instructions consisting of the base instruction set of the Rockwell 65C02 plus 8 prefix instructions, 24 Forth-oriented instructions, five stack-related instructions, and a block move instruction. Remaining to implement is a co-processor and instructions to support fixed-point multiplies / divides.
In recent weeks, I've been focused on the Pascal Compiler and Assembler for the M65C02A core. I developed a generator for the instruction tables that the assembler uses to generate the object file. That instruction table generator outputs 2013 distinct encodings for 142 distinct instructions that support up to 49 separate addressing modes. If the various accumulator and implicit addressing modes are treated as a single addressing mode, then there are 46 distinct addressing modes.
Many of the addressing modes may not be particularly useful, but they are a result of the way I've built the logic in the M65C02A to support swapping index registers and the accumulator. For example, applying the OAY and the OSX+SIZ+IND (OIS) prefix instruction to the SBC (zp),Y instruction yields the SBC.yw ((zp,S)),A instruction. This instruction performs a double indirection post-indexed by A using the address found on the top of the stack and performs a 16-bit subtraction using the Y register as left source operand and the destination. So far, I've not been able to come up with an algorithm that would require such contortions, but one can never tell. However, the instruction is the natural result of applying two of the 8 prefix instructions: OAY (0xFB) - swap A and Y, and OIS (0xDB) - apply stack-relative addressing plus promote the operation to 16 bits and add indirection.
I have cleaned up the Pascal Compiler and will now be starting its verification using the assembler and the Py65 processor model. Instead of writing the run-time library at this time, I am going to take a short cut and change all subroutine calls to run-time library elements into COP (co-processor) instructions. These instructions will be trapped by the Py65 processor model and simulated in that environment. Once all of the instructions and logic of the compiler are verified, I'll move forward on the run-time library. At the present time, I am leaning toward implementing a co-processor to handle multiplies and divides for both integers (16-bits) and basic floating point operations: fadd, fsub, fmul, and fdiv. I may also support type conversions using the co-processor: ftoi, itof, etc.
The following is a print listing from the most recent assembler for one of the Pascal Compiler's test programs:
I have a model for the Py65 environment that implements the desired features. I am beginning the task of testing the 2013 distinct instructions consisting of the base instruction set of the Rockwell 65C02 plus 8 prefix instructions, 24 Forth-oriented instructions, five stack-related instructions, and a block move instruction. Remaining to implement is a co-processor and instructions to support fixed-point multiplies / divides.
In recent weeks, I've been focused on the Pascal Compiler and Assembler for the M65C02A core. I developed a generator for the instruction tables that the assembler uses to generate the object file. That instruction table generator outputs 2013 distinct encodings for 142 distinct instructions that support up to 49 separate addressing modes. If the various accumulator and implicit addressing modes are treated as a single addressing mode, then there are 46 distinct addressing modes.
Many of the addressing modes may not be particularly useful, but they are a result of the way I've built the logic in the M65C02A to support swapping index registers and the accumulator. For example, applying the OAY and the OSX+SIZ+IND (OIS) prefix instruction to the SBC (zp),Y instruction yields the SBC.yw ((zp,S)),A instruction. This instruction performs a double indirection post-indexed by A using the address found on the top of the stack and performs a 16-bit subtraction using the Y register as left source operand and the destination. So far, I've not been able to come up with an algorithm that would require such contortions, but one can never tell. However, the instruction is the natural result of applying two of the 8 prefix instructions: OAY (0xFB) - swap A and Y, and OIS (0xDB) - apply stack-relative addressing plus promote the operation to 16 bits and add indirection.
I have cleaned up the Pascal Compiler and will now be starting its verification using the assembler and the Py65 processor model. Instead of writing the run-time library at this time, I am going to take a short cut and change all subroutine calls to run-time library elements into COP (co-processor) instructions. These instructions will be trapped by the Py65 processor model and simulated in that environment. Once all of the instructions and logic of the compiler are verified, I'll move forward on the run-time library. At the present time, I am leaning toward implementing a co-processor to handle multiplies and divides for both integers (16-bits) and basic floating point operations: fadd, fsub, fmul, and fdiv. I may also support type conversions using the co-processor: ftoi, itof, etc.
The following is a print listing from the most recent assembler for one of the Pascal Compiler's test programs:
Code: Select all
( 1) ; ; 1: PROGRAM eratosthenes(output);
( 2) ; .stk 1024
( 3) ; .cod 512
( 4) ; STATIC_LINK .equ +5
( 5) ; RETURN_VALUE .equ -3
( 6) ; HIGH_RETURN_VALUE .equ -1
( 7) ; _start
( 8) 0200 ABBA ; tsx.w
( 9) 0202 CBA21D10 ; lds.w #_stk_top
( 10) 0206 9C4204 ; stz _bss_start
( 11) 0209 ABA24204 ; ldx.w #_bss_start
( 12) 020D ABA04304 ; ldy.w #_bss_start+1
( 13) 0211 ABA91D10 ; lda.w #_stk_top
( 14) 0215 38 ; sec
( 15) 0216 ABE94204 ; sbc.w #_bss_start
( 16) 021A 540F ; mov #15
( 17) 021C 4C1F02 ; jmp _pc65_main
( 18) ; ; 2:
( 19) ; ; 3: CONST
( 20) ; ; 4: max = 1000;
( 21) ; ; 5:
( 22) ; ; 6: VAR
( 23) ; ; 7: sieve : ARRAY [1..max] OF BOOLEAN;
( 24) ; ; 8: i, j, limit, prime, factor : INTEGER;
( 25) ; ; 9:
( 26) ; ; 10: BEGIN
( 27) ; _pc65_main .sub
( 28) 021F ABDA ; phx.w
( 29) 0221 ABBA ; tsx.w
( 30) ; ; 11: limit := max DIV 2;
( 31) 0223 ABE2E803 ; psh.w #1000
( 32) ; pha.w
( 33) 0227 ABE20200 ; psh.w #2
( 34) ; pha.w
( 35) 022B 20FFFF ; jsr _idiv
( 36) 022E C204 ; adj #4
( 37) 0230 AB8D170C ; sta.w limit_005
( 38) ; ; 12: sieve[1] := FALSE;
( 39) 0234 ABE24304 ; psh.w #sieve_002
( 40) 0238 A901 ; lda #1
( 41) 023A AB3A ; dec.w a
( 42) 023C AB0A ; asl.w a
( 43) 023E 18 ; clc
( 44) 023F CB7501 ; adc.w 1,S
( 45) 0242 CB9501 ; sta.w 1,S
( 46) 0245 A900 ; lda #0
( 47) 0247 6B ; pli
( 48) 0248 AB8300 ; sta.w 0,I++
( 49) ; ; 13:
( 50) ; ; 14: FOR i := 2 TO max DO
( 51) 024B A902 ; lda #2
( 52) 024D AB8D130C ; sta.w i_003
( 53) ; L_008
( 54) 0251 ABA9E803 ; lda.w #1000
( 55) 0255 ABCD130C ; cmp.w i_003
( 56) 0259 AB5003 ; bge L_009
( 57) 025C 4C7F02 ; jmp L_010
( 58) ; L_009
( 59) ; ; 15: sieve[i] := TRUE;
( 60) 025F ABE24304 ; psh.w #sieve_002
( 61) 0263 ABAD130C ; lda.w i_003
( 62) 0267 AB3A ; dec.w a
( 63) 0269 AB0A ; asl.w a
( 64) 026B 18 ; clc
( 65) 026C CB7501 ; adc.w 1,S
( 66) 026F CB9501 ; sta.w 1,S
( 67) 0272 A901 ; lda #1
( 68) 0274 6B ; pli
( 69) 0275 AB8300 ; sta.w 0,I++
( 70) 0278 ABEE130C ; inc.w i_003
( 71) 027C 4C5102 ; jmp L_008
( 72) ; L_010
( 73) 027F ABCE130C ; dec.w i_003
( 74) ; ; 16:
( 75) ; ; 17: prime := 1;
( 76) 0283 A901 ; lda #1
( 77) 0285 AB8D190C ; sta.w prime_006
( 78) ; ; 18:
( 79) ; ; 19: REPEAT
( 80) ; L_011
( 81) ; ; 20: prime := prime + 1;
( 82) 0289 ABAD190C ; lda.w prime_006
( 83) 028D AB48 ; pha.w
( 84) 028F A901 ; lda #1
( 85) 0291 18 ; clc
( 86) 0292 CB7501 ; adc.w 1,S
( 87) 0295 C202 ; adj #2
( 88) 0297 AB8D190C ; sta.w prime_006
( 89) ; ; 21: WHILE NOT sieve[prime] DO
( 90) ; L_013
( 91) 029B ABE24304 ; psh.w #sieve_002
( 92) 029F ABAD190C ; lda.w prime_006
( 93) 02A3 AB3A ; dec.w a
( 94) 02A5 AB0A ; asl.w a
( 95) 02A7 18 ; clc
( 96) 02A8 CB7501 ; adc.w 1,S
( 97) 02AB CB9501 ; sta.w 1,S
( 98) 02AE 6B ; pli
( 99) 02AF ABA300 ; lda.w 0,I++
( 100) 02B2 4901 ; eor #1
( 101) 02B4 ABC90100 ; cmp.w #1
( 102) 02B8 F003 ; beq L_014
( 103) 02BA 4CD202 ; jmp L_015
( 104) ; L_014
( 105) ; ; 22: prime := prime + 1;
( 106) 02BD ABAD190C ; lda.w prime_006
( 107) 02C1 AB48 ; pha.w
( 108) 02C3 A901 ; lda #1
( 109) 02C5 18 ; clc
( 110) 02C6 CB7501 ; adc.w 1,S
( 111) 02C9 C202 ; adj #2
( 112) 02CB AB8D190C ; sta.w prime_006
( 113) 02CF 4C9B02 ; jmp L_013
( 114) ; L_015
( 115) ; ; 23:
( 116) ; ; 24: factor := 2*prime;
( 117) 02D2 ABE20200 ; psh.w #2
( 118) ; pha.w
( 119) 02D6 ABAD190C ; lda.w prime_006
( 120) 02DA AB48 ; pha.w
( 121) 02DC 20FFFF ; jsr _imul
( 122) 02DF C204 ; adj #4
( 123) 02E1 AB8D1B0C ; sta.w factor_007
( 124) ; ; 25:
( 125) ; ; 26: WHILE factor <= max DO BEGIN
( 126) ; L_016
( 127) 02E5 ABAD1B0C ; lda.w factor_007
( 128) 02E9 AB48 ; pha.w
( 129) 02EB ABA9E803 ; lda.w #1000
( 130) 02EF CB4401 ; xma.w 1,S
( 131) 02F2 CBD501 ; cmp.w 1,S
( 132) 02F5 C202 ; adj #2
( 133) 02F7 08 ; php
( 134) 02F8 A901 ; lda #1
( 135) 02FA 28 ; plp
( 136) 02FB AB3002 ; ble L_019
( 137) 02FE A900 ; lda #0
( 138) ; L_019
( 139) 0300 ABC90100 ; cmp.w #1
( 140) 0304 F003 ; beq L_017
( 141) 0306 4C3903 ; jmp L_018
( 142) ; L_017
( 143) ; ; 27: sieve[factor] := FALSE;
( 144) 0309 ABE24304 ; psh.w #sieve_002
( 145) 030D ABAD1B0C ; lda.w factor_007
( 146) 0311 AB3A ; dec.w a
( 147) 0313 AB0A ; asl.w a
( 148) 0315 18 ; clc
( 149) 0316 CB7501 ; adc.w 1,S
( 150) 0319 CB9501 ; sta.w 1,S
( 151) 031C A900 ; lda #0
( 152) 031E 6B ; pli
( 153) 031F AB8300 ; sta.w 0,I++
( 154) ; ; 28: factor := factor + prime;
( 155) 0322 ABAD1B0C ; lda.w factor_007
( 156) 0326 AB48 ; pha.w
( 157) 0328 ABAD190C ; lda.w prime_006
( 158) 032C 18 ; clc
( 159) 032D CB7501 ; adc.w 1,S
( 160) 0330 C202 ; adj #2
( 161) 0332 AB8D1B0C ; sta.w factor_007
( 162) ; ; 29: END
( 163) ; ; 30: UNTIL prime > limit;
( 164) 0336 4CE502 ; jmp L_016
( 165) ; L_018
( 166) 0339 ABAD190C ; lda.w prime_006
( 167) 033D AB48 ; pha.w
( 168) 033F ABAD170C ; lda.w limit_005
( 169) 0343 CB4401 ; xma.w 1,S
( 170) 0346 CBD501 ; cmp.w 1,S
( 171) 0349 C202 ; adj #2
( 172) 034B 08 ; php
( 173) 034C A901 ; lda #1
( 174) 034E 28 ; plp
( 175) 034F AB1002 ; bgt L_020
( 176) 0352 A900 ; lda #0
( 177) ; L_020
( 178) 0354 ABC90100 ; cmp.w #1
( 179) 0358 F003 ; beq L_012
( 180) 035A 4C8902 ; jmp L_011
( 181) ; L_012
( 182) ; ; 31:
( 183) ; ; 32: writeln('Sieve of Eratosthenes');
( 184) 035D ABE22D04 ; psh.w #S_021
( 185) 0361 ABE20000 ; psh.w #0
( 186) 0365 ABE21500 ; psh.w #21
( 187) 0369 20FFFF ; jsr _swrite
( 188) 036C C206 ; adj #6
( 189) 036E 20FFFF ; jsr _writeln
( 190) ; ; 33: writeln;
( 191) 0371 20FFFF ; jsr _writeln
( 192) ; ; 34:
( 193) ; ; 35: i := 1;
( 194) 0374 A901 ; lda #1
( 195) 0376 AB8D130C ; sta.w i_003
( 196) ; ; 36: REPEAT
( 197) ; L_022
( 198) ; ; 37: FOR j := 0 TO 19 DO BEGIN
( 199) 037A A900 ; lda #0
( 200) 037C AB8D150C ; sta.w j_004
( 201) ; L_024
( 202) 0380 A913 ; lda #19
( 203) 0382 ABCD150C ; cmp.w j_004
( 204) 0386 AB5003 ; bge L_025
( 205) 0389 4CEA03 ; jmp L_026
( 206) ; L_025
( 207) ; ; 38: prime := i + j;
( 208) 038C ABAD130C ; lda.w i_003
( 209) 0390 AB48 ; pha.w
( 210) 0392 ABAD150C ; lda.w j_004
( 211) 0396 18 ; clc
( 212) 0397 CB7501 ; adc.w 1,S
( 213) 039A C202 ; adj #2
( 214) 039C AB8D190C ; sta.w prime_006
( 215) ; ; 39: IF sieve[prime] THEN
( 216) 03A0 ABE24304 ; psh.w #sieve_002
( 217) 03A4 ABAD190C ; lda.w prime_006
( 218) 03A8 AB3A ; dec.w a
( 219) 03AA AB0A ; asl.w a
( 220) 03AC 18 ; clc
( 221) 03AD CB7501 ; adc.w 1,S
( 222) 03B0 CB9501 ; sta.w 1,S
( 223) 03B3 6B ; pli
( 224) 03B4 ABA300 ; lda.w 0,I++
( 225) 03B7 ABC90100 ; cmp.w #1
( 226) 03BB F003 ; beq L_027
( 227) 03BD 4CD203 ; jmp L_028
( 228) ; L_027
( 229) ; ; 40: write(prime:3)
( 230) 03C0 ABAD190C ; lda.w prime_006
( 231) 03C4 AB48 ; pha.w
( 232) 03C6 ABE20300 ; psh.w #3
( 233) ; pha.w
( 234) 03CA 20FFFF ; jsr _iwrite
( 235) 03CD C204 ; adj #4
( 236) ; ; 41: ELSE
( 237) 03CF 4CE303 ; jmp L_029
( 238) ; L_028
( 239) ; ; 42: write(' ');
( 240) 03D2 ABE22A04 ; psh.w #S_030
( 241) 03D6 ABE20000 ; psh.w #0
( 242) 03DA ABE20300 ; psh.w #3
( 243) 03DE 20FFFF ; jsr _swrite
( 244) 03E1 C206 ; adj #6
( 245) ; L_029
( 246) ; ; 43: END;
( 247) 03E3 ABEE150C ; inc.w j_004
( 248) 03E7 4C8003 ; jmp L_024
( 249) ; L_026
( 250) 03EA ABCE150C ; dec.w j_004
( 251) ; ; 44: writeln;
( 252) 03EE 20FFFF ; jsr _writeln
( 253) ; ; 45: i := i + 20
( 254) 03F1 ABAD130C ; lda.w i_003
( 255) 03F5 AB48 ; pha.w
( 256) 03F7 A914 ; lda #20
( 257) ; ; 46: UNTIL i > max
( 258) 03F9 18 ; clc
( 259) 03FA CB7501 ; adc.w 1,S
( 260) 03FD C202 ; adj #2
( 261) 03FF AB8D130C ; sta.w i_003
( 262) 0403 ABAD130C ; lda.w i_003
( 263) 0407 AB48 ; pha.w
( 264) ; ; 47: END.
( 265) 0409 ABA9E803 ; lda.w #1000
( 266) 040D CB4401 ; xma.w 1,S
( 267) 0410 CBD501 ; cmp.w 1,S
( 268) 0413 C202 ; adj #2
( 269) 0415 08 ; php
( 270) 0416 A901 ; lda #1
( 271) 0418 28 ; plp
( 272) 0419 AB1002 ; bgt L_031
( 273) 041C A900 ; lda #0
( 274) ; L_031
( 275) 041E ABC90100 ; cmp.w #1
( 276) 0422 F003 ; beq L_023
( 277) 0424 4C7A03 ; jmp L_022
( 278) ; L_023
( 279) 0427 ABFA ; plx.w
( 280) 0429 60 ; rts
( 281) ; .end _pc65_main
( 282) ;
( 283) ; .dat
( 284) ;
( 285) 042A 202020 ; S_030 .str " "
( 286) 042D 53696576 ; S_021 .str "Sieve of Eratosthenes"
0431 65206F6620457261746F737468656E6573
( 287) 0442 00 ; _bss_start .byt 1
( 288) 0443 00000000 ; sieve_002 .byt 2000
0447 0000000000000000000000000000000000000000000000000000000000000000
0467 0000000000000000000000000000000000000000000000000000000000000000
0487 0000000000000000000000000000000000000000000000000000000000000000
04A7 0000000000000000000000000000000000000000000000000000000000000000
04C7 0000000000000000000000000000000000000000000000000000000000000000
04E7 0000000000000000000000000000000000000000000000000000000000000000
0507 0000000000000000000000000000000000000000000000000000000000000000
0527 0000000000000000000000000000000000000000000000000000000000000000
0547 0000000000000000000000000000000000000000000000000000000000000000
0567 0000000000000000000000000000000000000000000000000000000000000000
0587 0000000000000000000000000000000000000000000000000000000000000000
05A7 0000000000000000000000000000000000000000000000000000000000000000
05C7 0000000000000000000000000000000000000000000000000000000000000000
05E7 0000000000000000000000000000000000000000000000000000000000000000
0607 0000000000000000000000000000000000000000000000000000000000000000
0627 0000000000000000000000000000000000000000000000000000000000000000
0647 0000000000000000000000000000000000000000000000000000000000000000
0667 0000000000000000000000000000000000000000000000000000000000000000
0687 0000000000000000000000000000000000000000000000000000000000000000
06A7 0000000000000000000000000000000000000000000000000000000000000000
06C7 0000000000000000000000000000000000000000000000000000000000000000
06E7 0000000000000000000000000000000000000000000000000000000000000000
0707 0000000000000000000000000000000000000000000000000000000000000000
0727 0000000000000000000000000000000000000000000000000000000000000000
0747 0000000000000000000000000000000000000000000000000000000000000000
0767 0000000000000000000000000000000000000000000000000000000000000000
0787 0000000000000000000000000000000000000000000000000000000000000000
07A7 0000000000000000000000000000000000000000000000000000000000000000
07C7 0000000000000000000000000000000000000000000000000000000000000000
07E7 0000000000000000000000000000000000000000000000000000000000000000
0807 0000000000000000000000000000000000000000000000000000000000000000
0827 0000000000000000000000000000000000000000000000000000000000000000
0847 0000000000000000000000000000000000000000000000000000000000000000
0867 0000000000000000000000000000000000000000000000000000000000000000
0887 0000000000000000000000000000000000000000000000000000000000000000
08A7 0000000000000000000000000000000000000000000000000000000000000000
08C7 0000000000000000000000000000000000000000000000000000000000000000
08E7 0000000000000000000000000000000000000000000000000000000000000000
0907 0000000000000000000000000000000000000000000000000000000000000000
0927 0000000000000000000000000000000000000000000000000000000000000000
0947 0000000000000000000000000000000000000000000000000000000000000000
0967 0000000000000000000000000000000000000000000000000000000000000000
0987 0000000000000000000000000000000000000000000000000000000000000000
09A7 0000000000000000000000000000000000000000000000000000000000000000
09C7 0000000000000000000000000000000000000000000000000000000000000000
09E7 0000000000000000000000000000000000000000000000000000000000000000
0A07 0000000000000000000000000000000000000000000000000000000000000000
0A27 0000000000000000000000000000000000000000000000000000000000000000
0A47 0000000000000000000000000000000000000000000000000000000000000000
0A67 0000000000000000000000000000000000000000000000000000000000000000
0A87 0000000000000000000000000000000000000000000000000000000000000000
0AA7 0000000000000000000000000000000000000000000000000000000000000000
0AC7 0000000000000000000000000000000000000000000000000000000000000000
0AE7 0000000000000000000000000000000000000000000000000000000000000000
0B07 0000000000000000000000000000000000000000000000000000000000000000
0B27 0000000000000000000000000000000000000000000000000000000000000000
0B47 0000000000000000000000000000000000000000000000000000000000000000
0B67 0000000000000000000000000000000000000000000000000000000000000000
0B87 0000000000000000000000000000000000000000000000000000000000000000
0BA7 0000000000000000000000000000000000000000000000000000000000000000
0BC7 0000000000000000000000000000000000000000000000000000000000000000
0BE7 0000000000000000000000000000000000000000000000000000000000000000
0C07 000000000000000000000000
( 289) 0C13 0000 ; i_003 .wrd 1
( 290) 0C15 0000 ; j_004 .wrd 1
( 291) 0C17 0000 ; limit_005 .wrd 1
( 292) 0C19 0000 ; prime_006 .wrd 1
( 293) 0C1B 0000 ; factor_007 .wrd 1
( 294) 0C1D 00 ; _bss_end .byt 1
( 295) 0C1E 00000000 ; _stk .byt 1023
0C22 0000000000000000000000000000000000000000000000000000000000000000
0C42 0000000000000000000000000000000000000000000000000000000000000000
0C62 0000000000000000000000000000000000000000000000000000000000000000
0C82 0000000000000000000000000000000000000000000000000000000000000000
0CA2 0000000000000000000000000000000000000000000000000000000000000000
0CC2 0000000000000000000000000000000000000000000000000000000000000000
0CE2 0000000000000000000000000000000000000000000000000000000000000000
0D02 0000000000000000000000000000000000000000000000000000000000000000
0D22 0000000000000000000000000000000000000000000000000000000000000000
0D42 0000000000000000000000000000000000000000000000000000000000000000
0D62 0000000000000000000000000000000000000000000000000000000000000000
0D82 0000000000000000000000000000000000000000000000000000000000000000
0DA2 0000000000000000000000000000000000000000000000000000000000000000
0DC2 0000000000000000000000000000000000000000000000000000000000000000
0DE2 0000000000000000000000000000000000000000000000000000000000000000
0E02 0000000000000000000000000000000000000000000000000000000000000000
0E22 0000000000000000000000000000000000000000000000000000000000000000
0E42 0000000000000000000000000000000000000000000000000000000000000000
0E62 0000000000000000000000000000000000000000000000000000000000000000
0E82 0000000000000000000000000000000000000000000000000000000000000000
0EA2 0000000000000000000000000000000000000000000000000000000000000000
0EC2 0000000000000000000000000000000000000000000000000000000000000000
0EE2 0000000000000000000000000000000000000000000000000000000000000000
0F02 0000000000000000000000000000000000000000000000000000000000000000
0F22 0000000000000000000000000000000000000000000000000000000000000000
0F42 0000000000000000000000000000000000000000000000000000000000000000
0F62 0000000000000000000000000000000000000000000000000000000000000000
0F82 0000000000000000000000000000000000000000000000000000000000000000
0FA2 0000000000000000000000000000000000000000000000000000000000000000
0FC2 0000000000000000000000000000000000000000000000000000000000000000
0FE2 0000000000000000000000000000000000000000000000000000000000000000
1002 000000000000000000000000000000000000000000000000000000
( 296) 101D 00 ; _stk_top .byt 1
( 297) ;
( 298) ; .end