********************************************************************************
* AppleVision, by Bob Bishop. *
* Copyright 1978 Apple Computer, Inc. *
********************************************************************************
* The main program is written in Integer BASIC, and uses a trick to embed *
* machine-language code. *
* *
* This was distributed on cassette tape, and was included on the DOS 3.3 *
* System Master disk. *
********************************************************************************
* Disassembly by Andy McFadden, using 6502bench SourceGen v1.5. *
* Last updated 2020/04/25 *
********************************************************************************
MON_CH .eq $24 ;cursor horizontal displacement
MON_CV .eq $25 ;cursor vertical displacement
SPKR .eq $c030 ;RW toggle speaker
TXTCLR .eq $c050 ;RW display graphics
MIXCLR .eq $c052 ;RW display full screen
HIRES .eq $c057 ;RW display hi-res graphics
MON_COUT1 .eq $fdf0
.org $07d2
;
; Initial Integer BASIC program:
;
; 0 LOMEM:1800
; 1 HIMEM:8192: POKE 202,165: POKE 203,27:LOMEM:6144:CLR : GOTO 0
;
; The HIMEM: statement causes the code to be relocated. It ends up on the text
; page, and is wiped out when the program starts running.
;
; The POKEs set the Integer BASIC start-of-program pointer ($CA) to $1BA5.
;
07d2: 08 00 00 11+ .bulk 08000011b108070126010010b800200364b2ca0065b1a5000364b2cb0065b21b
+ 000311b60018030c035fb0000001
********************************************************************************
* Plot a pixel on the hi-res screen. *
* *
* (called from BASIC -- 2048) *
* *
* On entry: *
* $10: X coordinate (0-139) *
* $11: Y coordinate (0-191) *
* $12: X coord odd/even flag (0 or 1) *
********************************************************************************
]hptr .var $14 {addr/2}
0800: 98 PlotPoint tya
0801: 48 pha
0802: 20 26 08 jsr GetPixelAddr ;set up hptr, pixel mask in A-reg
0805: 11 14 ora (]hptr),y ;blend with screen contents
0807: 91 14 sta (]hptr),y
0809: 68 pla
080a: a8 tay
080b: 60 rts
080c: 98 Unused1 tya ;this erases a pixel
080d: 48 pha
080e: 20 26 08 jsr GetPixelAddr
0811: 49 ff eor #$ff
0813: 31 14 and (]hptr),y
0815: 91 14 sta (]hptr),y
0817: 68 pla
0818: a8 tay
0819: 60 rts
081a: 98 Unused2 tya ;this reads a pixel and returns zero/non-zero in $13
081b: 48 pha
081c: 20 26 08 jsr GetPixelAddr
081f: 31 14 and (]hptr),y
0821: 85 13 sta $13
0823: 68 pla
0824: a8 tay
0825: 60 rts
;
; Gets the address of a pixel on the hi-res screen.
;
; On entry:
; $10: X coordinate (0-139)
; $11: Y coordinate (0-191)
; $12: X coord odd/even flag (0 or 1)
;
; On exit:
; $14/15: address of byte
; A-reg: pixel mask
; Y-reg: zero
;
]col_num .var $16 {addr/1} ;0-39
]pixel_num .var $17 {addr/1} ;0-6
0826: 20 47 08 GetPixelAddr jsr LineAddrCalc ;get line address in $14/15
0829: 20 6d 08 jsr ColumnCalc ;get column in $16/17
082c: a5 14 lda ]hptr
082e: 18 clc
082f: 65 16 adc ]col_num
0831: 90 02 bcc :NoInc
0833: e6 15 inc ]hptr+1 ;shouldn't happen?
0835: 85 14 :NoInc sta ]hptr
0837: a4 17 ldy ]pixel_num ;convert pixel index to bit mask
0839: b9 40 08 lda pixel_table,y
083c: a0 00 ldy #$00
083e: 60 rts
083f: ea .junk 1
;
; Table of hi-res pixel values.
;
0840: 01 02 04 08+ pixel_table .bulk 01020408102040
;
; Calculates a hi-res row address.
;
; On entry:
; $11: line number
;
; On exit:
; $14/15: address
;
• Clear variables
]yc .var $11 {addr/1}
]hptr .var $14 {addr/2}
0847: a5 11 LineAddrCalc lda ]yc ;same purpose as Applesoft HPOSN, but very
0849: 0a asl A ; different implementation
084a: 0a asl A
084b: 29 1c and #$1c
084d: 85 15 sta ]hptr+1
084f: a5 11 lda ]yc
0851: 6a ror A
0852: 6a ror A
0853: 6a ror A
0854: 6a ror A
0855: 29 03 and #$03
0857: 05 15 ora ]hptr+1
0859: 09 20 ora #$20 ;hi-res page 1
085b: 85 15 sta ]hptr+1
085d: a5 11 lda ]yc
085f: 6a ror A
0860: 29 e0 and #$e0
0862: 85 14 sta ]hptr
0864: 6a ror A
0865: 6a ror A
0866: 29 18 and #$18
0868: 05 14 ora ]hptr
086a: 85 14 sta ]hptr
086c: 60 rts
;
; Calculates a pixel position within a line. Divides by 7, leaving the quotient
; in $16 and the remainder in $17.
;
; On entry:
; $10: X coordinate (0-139)
; $12: odd/even flag (0 or 1)
;
; On exit:
; $16: byte offset (0-39)
; $17: pixel offset (0-6)
;
]xc .var $10 {addr/1}
]odd_even .var $12 {addr/1}
]byte_offset .var $16 {addr/1}
]pixel_offset .var $17 {addr/1}
]tmp .var $18 {addr/2}
086d: a9 00 ColumnCalc lda #$00
086f: 85 16 sta ]byte_offset
0871: a9 e0 lda #$e0
0873: 85 18 sta ]tmp
0875: a9 20 lda #$20
0877: 85 19 sta ]tmp+1
0879: a5 10 lda ]xc ;get X coordinate
087b: 85 17 sta ]pixel_offset
087d: a0 06 ldy #$06
087f: a5 17 :Loop lda ]pixel_offset
0881: c5 18 cmp ]tmp
0883: 90 0b bcc :Lt
0885: e5 18 sbc ]tmp
0887: 85 17 sta ]pixel_offset
0889: a5 16 lda ]byte_offset
088b: 05 19 ora ]tmp+1
088d: 85 16 sta ]byte_offset
088f: 18 clc
0890: 66 18 :Lt ror ]tmp
0892: 66 19 ror ]tmp+1
0894: 88 dey
0895: d0 e8 bne :Loop
0897: 06 16 asl ]byte_offset
0899: a5 17 lda ]pixel_offset ;factor in the odd/even flag
089b: 0a asl A
089c: 05 12 ora ]odd_even
089e: c9 07 cmp #$07 ;did we hit 7?
08a0: 90 04 bcc :Ne7 ;no, branch
08a2: e9 07 sbc #$07 ;yes, zero the pixel offset
08a4: e6 16 inc ]byte_offset ; and inc the byte offset
08a6: 85 17 :Ne7 sta ]pixel_offset
08a8: 60 rts
********************************************************************************
* Clear hi-res page 1 to black. *
* *
* (called from from BASIC -- 2217) *
********************************************************************************
08a9: 8a ClearScreen txa ;preserve X/Y
08aa: 48 pha
08ab: 98 tya
08ac: 48 pha
08ad: a9 00 lda #$00 ;set pointer to hi-res page 1 ($2000)
08af: 85 14 sta ]hptr
08b1: a2 20 ldx #$20 ;$20 is also used as a counter
08b3: 86 15 stx ]hptr+1
08b5: a8 tay
08b6: 91 14 :Loop sta (]hptr),y
08b8: c8 iny
08b9: d0 fb bne :Loop
08bb: e6 15 inc ]hptr+1
08bd: ca dex ;have we hit $4000?
08be: d0 f6 bne :Loop ;not yet
08c0: 68 pla ;restore X/Y
08c1: a8 tay
08c2: 68 pla
08c3: aa tax
08c4: 60 rts
08c5: 00 00 00 .junk 3
;
; Animation randomization limiter.
;
; Determines which frames can randomly replace which other frames.
;
; See the BASIC program, lines 540-590.
;
08c8: 00 00 00 00+ anim_random .bulk 0000000000000000010101010101010001010001000101000001000101010000
+ 000100010001000000010101000100000001000100010000
0900: 00 1c 22 2a+ font_glyphs .bulk 001c222a3a1a023c00081422223e2222001e22221e22221e001c22020202221c
+ 001e22222222221e003e02021e02023e003e02021e020202003c02020232223c
+ 002222223e222222001c08080808081c002020202020221c0022120a060a1222
+ 000202020202023e0022362a2a222222002222262a322222001c22222222221c
+ 001e22221e020202001c2222222a122c001e22221e0a1222001c22021c20221c
+ 003e080808080808002222222222221c0022222222221408002222222a2a3622
+ 00222214081422220022221408080808003e20100804023e003e06060606063e
+ 000002040a122000003e30303030303e0000000814220000000000000000003e
+ 0000000000000000000808080808000800141414000000000014143e143e1414
+ 00083c0a1c281e08000626100804323000040a0a042a122c0008080800000000
+ 0008040202020408000810202020100800082a1c081c2a08000008083e080800
+ 0000000000080804000000003e00000000000000000000080000201008040200
+ 001c22322a26221c00080c080808081c001c22201804023e003e20101820221c
+ 00101814123e1010003e021e2020221c003804021e22221c003e201008040404
+ 001c22221c22221c001c22223c20100e00000008000800000000000808000804
+ 00100804020408100000003e003e00000004081020100804001c221008080008
********************************************************************************
* Hi-res character generator output function. *
* *
* CSWL/CSWH ($36/37) is pointed here. *
********************************************************************************
]font_ptr .var $0e {addr/2}
]line_num .var $11 {addr/1}
]hptr .var $14 {addr/2}
0b00: 48 CharOutput pha ;save char to print
0b01: 8d 50 c0 sta TXTCLR ;make sure we're in hi-res mode
0b04: 8d 52 c0 sta MIXCLR
0b07: 8d 57 c0 sta HIRES
0b0a: c9 8d cmp #$8d ;carriage return?
0b0c: f0 3b beq :Skip ;yup, nothing to output on hi-res
0b0e: 29 3f and #$3f ;reduce to 0-63
0b10: 0a asl A ;multiply by 8
0b11: 0a asl A
0b12: 0a asl A
0b13: 85 0e sta ]font_ptr
0b15: a9 09 lda #>font_glyphs
0b17: 69 00 adc #$00
0b19: 85 0f sta ]font_ptr+1
0b1b: a5 25 lda MON_CV ;current text line
0b1d: 0a asl A ;multiply by 8 (font height)
0b1e: 0a asl A
0b1f: 0a asl A
0b20: 85 11 sta ]line_num
0b22: 8a txa ;preserve X/Y
0b23: 48 pha
0b24: 98 tya
0b25: 48 pha
0b26: a2 08 ldx #$08 ;glyphs are 8 rows high
0b28: a0 00 ldy #$00 ;just need this for index
0b2a: 20 47 08 :Loop jsr LineAddrCalc ;compute address of start of line
0b2d: 18 clc
0b2e: a5 14 lda ]hptr ;add current horizontal text position
0b30: 65 24 adc MON_CH
0b32: 85 14 sta ]hptr
0b34: a5 15 lda ]hptr+1
0b36: 69 00 adc #$00
0b38: 85 15 sta ]hptr+1
0b3a: b1 0e lda (]font_ptr),y ;read from the glyph
0b3c: 91 14 sta (]hptr),y ;write to the hi-res screen
0b3e: e6 11 inc ]line_num ;advance to next line
0b40: e6 0e inc ]font_ptr ; and next byte in glyph
0b42: ca dex ;done 8?
0b43: d0 e5 bne :Loop ;not yet
0b45: 68 pla ;restore A/X/Y
0b46: a8 tay
0b47: 68 pla
0b48: aa tax
0b49: 68 :Skip pla
0b4a: 4c f0 fd jmp MON_COUT1 ;let the ROM routine do its thing (updates CV/CH)
********************************************************************************
* Show musical animation. *
* *
* (called from BASIC -- 2893) *
********************************************************************************
• Clear variables
]src_ptr .var $0c {addr/2}
]anim_ptr .var $0e {addr/2}
]pitch .var $10 {addr/1}
]yc .var $11 {addr/1}
]row_counter .var $12 {addr/1}
]counter .var $13 {addr/1}
]dst_ptr .var $14 {addr/2}
0b4d: 8a ShowAnimation txa ;preserve X/Y
0b4e: 48 pha
0b4f: 98 tya
0b50: 48 pha
0b51: a9 ff lda #<anim_data-1
0b53: 85 0e sta ]anim_ptr
0b55: a9 0c lda #>anim_data-$100
0b57: 85 0f sta ]anim_ptr+1
0b59: a0 00 ldy #$00 ;must be zero
0b5b: 20 cf 0b :MainLoop jsr GetAnimIndex ;get index of next animation frame
0b5e: f0 35 beq :CheckSound ;zero, no change to visual
0b60: 10 05 bpl :DoVisual ;draw if not negative
0b62: 68 pla ;restore X/Y
0b63: a8 tay
0b64: 68 pla
0b65: aa tax
0b66: 60 rts
0b67: 18 :DoVisual clc ;given index 1-8
0b68: 69 0f adc #>shape_data-$100 ;shape data starts at $1000, 256 bytes each
0b6a: 85 0d sta ]src_ptr+1
0b6c: a9 00 lda #$00
0b6e: 85 0c sta ]src_ptr
0b70: a9 56 lda #86 ;start drawing at line 86
0b72: 85 11 sta ]yc
0b74: a9 24 lda #36 ;36 lines high
0b76: 85 12 sta ]row_counter
0b78: 20 47 08 :DrawLoop jsr LineAddrCalc
0b7b: e6 11 inc ]yc
0b7d: 18 clc
0b7e: a5 14 lda ]dst_ptr
0b80: 69 0b adc #11 ;start at column 11
0b82: 85 14 sta ]dst_ptr
0b84: a2 07 ldx #7 ;7 bytes wide
0b86: b1 0c :DrawRowLoop lda (]src_ptr),y
0b88: 91 14 sta (]dst_ptr),y
0b8a: e6 0c inc ]src_ptr
0b8c: e6 14 inc ]dst_ptr
0b8e: ca dex
0b8f: d0 f5 bne :DrawRowLoop
0b91: c6 12 dec ]row_counter
0b93: d0 e3 bne :DrawLoop
; Play a sound if desired.
0b95: 20 cf 0b :CheckSound jsr GetAnimIndex ;get sound value
0b98: d0 16 bne PlaySound
0b9a: 20 cf 0b jsr GetAnimIndex ;no sound; get duration
0b9d: f0 bc beq :MainLoop ;no duration, loop
; Sleep quietly for a bit.
0b9f: aa tax
0ba0: a9 10 :SleepLoop1 lda #$10
0ba2: 85 13 sta ]counter
0ba4: 88 :SleepLoop2 dey
0ba5: d0 fd bne :SleepLoop2
0ba7: c6 13 dec ]counter
0ba9: d0 f9 bne :SleepLoop2
0bab: ca dex
0bac: d0 f2 bne :SleepLoop1
0bae: f0 ab beq :MainLoop
0bb0: 85 10 PlaySound sta ]pitch
0bb2: 20 cf 0b jsr GetAnimIndex ;get duration
0bb5: a8 tay
0bb6: a9 08 :OuterLoop lda #$08 ;sustain for 8 iterations
0bb8: 85 13 sta ]counter
0bba: a6 10 :PlayLoop ldx ]pitch
0bbc: 48 :IntraClick pha ;burn a few cycles
0bbd: 68 pla
0bbe: 48 pha
0bbf: 68 pla
0bc0: ca dex
0bc1: d0 f9 bne :IntraClick
0bc3: 8e 30 c0 stx SPKR ;click
0bc6: c6 13 dec ]counter
0bc8: d0 f0 bne :PlayLoop
0bca: 88 dey ;end of duration?
0bcb: d0 e9 bne :OuterLoop ;not yet
0bcd: f0 8c beq :MainLoop ;yes, go back to work
;
; Advances the animation pointer and returns the value found.
;
; On entry:
; $0e/0f: animation pointer
; Y-reg: 0
;
; On exit:
; $0e/0f: incremented
; A-reg: value at ($0e)
;
0bcf: e6 0e GetAnimIndex inc ]anim_ptr
0bd1: d0 02 bne :NoInc
0bd3: e6 0f inc ]anim_ptr+1
0bd5: b1 0e :NoInc lda (]anim_ptr),y
0bd7: 60 rts
0bd8: ff ff 00 00+ .align $0100 (40 bytes)
;
; Values used by code at line 460 in the BASIC program. Each entry is
; X0,Y0,X1,Y1, and defines the lines that are drawn pixel-by-pixel.
;
; Only vertical, horizontal, and diagonal lines are possible.
;
0c00: 00 00 8b 00 .bulk 00008b00
0c04: 8b 00 8b bf .bulk 8b008bbf
0c08: 8b bf 00 bf .bulk 8bbf00bf
0c0c: 00 bf 00 00 .bulk 00bf0000
0c10: 52 14 75 14 .bulk 52147514
0c14: 75 14 75 34 .bulk 75147534
0c18: 75 34 52 34 .bulk 75345234
0c1c: 52 34 52 14 .bulk 52345214
0c20: 5f 14 63 10 .bulk 5f146310
0c24: 68 14 64 10 .bulk 68146410
0c28: 1f 4b 4f 4b .bulk 1f4b4f4b
0c2c: 4f 4b 4f 89 .bulk 4f4b4f89
0c30: 4f 89 1f 89 .bulk 4f891f89
0c34: 1f 89 1f 4b .bulk 1f891f4b
0c38: 21 4e 43 4e .bulk 214e434e
0c3c: 43 4e 43 81 .bulk 434e4381
0c40: 43 81 21 81 .bulk 43812181
0c44: 21 81 21 4e .bulk 2181214e
0c48: 1f 4b 1a 46 .bulk 1f4b1a46
0c4c: 1a 46 1a 84 .bulk 1a461a84
0c50: 1a 84 1f 89 .bulk 1a841f89
0c54: 1a 46 4a 46 .bulk 1a464a46
0c58: 4a 46 4f 4b .bulk 4a464f4b
0c5c: 34 48 20 34 .bulk 34482034
0c60: 34 48 48 34 .bulk 34484834
0c64: 1a 7f 0b 7f .bulk 1a7f0b7f
0c68: 0b 7f 1f 93 .bulk 0b7f1f93
0c6c: 1f 93 63 93 .bulk 1f936393
0c70: 63 93 4f 7f .bulk 63934f7f
0c74: 0b 7f 0b 82 .bulk 0b7f0b82
0c78: 0b 82 1f 96 .bulk 0b821f96
0c7c: 1f 96 63 96 .bulk 1f966396
0c80: 63 96 63 93 .bulk 63966393
0c84: 1f 93 1f 96 .bulk 1f931f96
0c88: 0f 87 0f ac .bulk 0f870fac
0c8c: 4d 97 4d ac .bulk 4d974dac
0c90: 21 97 21 bf .bulk 219721bf
0c94: 5f 97 5f bf .bulk 5f975fbf
0c98: 00 75 1a 75 .bulk 00751a75
0c9c: 4f 75 7d 75 .bulk 4f757d75
0ca0: 7d 75 7d 00 .bulk 7d757d00
0ca4: 7d 75 8b 83+ .align $0100 (92 bytes)
;
; Animation definition. Each entry has 3 bytes:
;
; +00: animation frame (1-8), or 0 if we don't want to change it
; +01/02: sound pitch and duration
;
; If $01 is zero, no sound will be played (but it will still pause briefly).
;
; A negative value for the animation frame ends the sequence.
;
; There are 92 frames.
;
0d00: 02 00 40 anim_data .bulk 020040
0d03: 07 4d 0c .bulk 074d0c
0d06: 02 57 0b .bulk 02570b
0d09: 05 62 0a .bulk 05620a
0d0c: 03 68 09 .bulk 036809
0d0f: 05 62 0a .bulk 05620a
0d12: 03 57 0b .bulk 03570b
0d15: 05 62 0a .bulk 05620a
0d18: 07 83 07 .bulk 078307
0d1b: 03 9d 06 .bulk 039d06
0d1e: 07 94 06 .bulk 079406
0d21: 02 83 07 .bulk 028307
0d24: 03 76 08 .bulk 037608
0d27: 05 83 07 .bulk 058307
0d2a: 02 9d 06 .bulk 029d06
0d2d: 08 83 0f .bulk 08830f
0d30: 06 62 0a .bulk 06620a
0d33: 08 57 0b .bulk 08570b
0d36: 04 4d 19 .bulk 044d19
0d39: 02 4d 19 .bulk 024d19
0d3c: 06 4d 0c .bulk 064d0c
0d3f: 04 57 0b .bulk 04570b
0d42: 02 62 0a .bulk 02620a
0d45: 08 57 0b .bulk 08570b
0d48: 04 4d 19 .bulk 044d19
0d4b: 02 57 16 .bulk 025716
0d4e: 08 57 16 .bulk 085716
0d51: 02 4d 0c .bulk 024d0c
0d54: 08 57 0b .bulk 08570b
0d57: 02 62 0a .bulk 02620a
0d5a: 07 68 09 .bulk 076809
0d5d: 05 62 0a .bulk 05620a
0d60: 03 57 0b .bulk 03570b
0d63: 05 62 0a .bulk 05620a
0d66: 07 83 07 .bulk 078307
0d69: 02 9d 06 .bulk 029d06
0d6c: 07 94 06 .bulk 079406
0d6f: 02 83 07 .bulk 028307
0d72: 07 76 08 .bulk 077608
0d75: 05 83 07 .bulk 058307
0d78: 03 9d 06 .bulk 039d06
0d7b: 07 83 0f .bulk 07830f
0d7e: 02 62 0a .bulk 02620a
0d81: 06 57 0b .bulk 06570b
0d84: 04 4d 19 .bulk 044d19
0d87: 03 41 1e .bulk 03411e
0d8a: 04 41 0f .bulk 04410f
0d8d: 02 4d 0c .bulk 024d0c
0d90: 05 62 0a .bulk 05620a
0d93: 03 57 0b .bulk 03570b
0d96: 02 4d 19 .bulk 024d19
0d99: 08 57 16 .bulk 085716
0d9c: 02 62 28 .bulk 026228
0d9f: 04 4d 0c .bulk 044d0c
0da2: 02 41 1e .bulk 02411e
0da5: 07 4d 0c .bulk 074d0c
0da8: 02 41 1e .bulk 02411e
0dab: 03 41 1e .bulk 03411e
0dae: 07 4d 0c .bulk 074d0c
0db1: 02 41 1e .bulk 02411e
0db4: 08 4d 0c .bulk 084d0c
0db7: 02 41 3d .bulk 02413d
0dba: 07 4a 0d .bulk 074a0d
0dbd: 03 3a 22 .bulk 033a22
0dc0: 05 4a 0d .bulk 054a0d
0dc3: 07 3a 22 .bulk 073a22
0dc6: 05 3a 22 .bulk 053a22
0dc9: 03 4a 0d .bulk 034a0d
0dcc: 04 3a 22 .bulk 043a22
0dcf: 06 4a 0d .bulk 064a0d
0dd2: 04 3a 33 .bulk 043a33
0dd5: 08 34 13 .bulk 083413
0dd8: 06 31 28 .bulk 063128
0ddb: 02 31 28 .bulk 023128
0dde: 04 41 1e .bulk 04411e
0de1: 03 41 1e .bulk 03411e
0de4: 07 4d 19 .bulk 074d19
0de7: 05 4d 19 .bulk 054d19
0dea: 03 57 16 .bulk 035716
0ded: 02 62 0a .bulk 02620a
0df0: 08 57 0b .bulk 08570b
0df3: 02 4d 19 .bulk 024d19
0df6: 07 41 0f .bulk 07410f
0df9: 05 3a 11 .bulk 053a11
0dfc: 07 41 0f .bulk 07410f
0dff: 05 4d 0c .bulk 054d0c
0e02: 03 62 0a .bulk 03620a
0e05: 02 57 0b .bulk 02570b
0e08: 08 4d 19 .bulk 084d19
0e0b: 04 57 16 .bulk 045716
0e0e: 02 62 28 .bulk 026228
0e11: 01 00 00 .bulk 010000 ;blank frame to erase dancer
0e14: ff a0 19 .bulk ffa019 ;frame=-1 to end list
0e17: 08 78 21 07+ .align $0100 (233 bytes)
; Looks like 256 bytes of nothing useful here.
0f00: 20 08 9b 15+ .junk 256
;
; Animation shape data starts here. The index (1-8) is added to $0f00.
;
; Each shape is 7x36.
;
1000: 00 00 00 00+ shape_data .fill 256,$00
1100: 00 00 00 00+ .bulk 00000000000000000000060000000000000f0000000000000f0000000000000f
+ 00000000000006000000000000060000000000603f0000000000707f00000000
+ 00707f0100000000787f0100000000385f0100000000185f03000000001c1f03
+ 000000000c1f0700000000061f0600000000021f0c00000000023f1800000000
+ 433f3000000000413f2000000000413f0000000000403f0000000000403b0000
+ 000000403b0000000000403b0000000000403100000000004031000000000040
+ 3100000000004031000000000040310000000000403100000000004031000000
+ 0000402000000000004020000000000060600000000000304001000000000000
1200: 00 00 00 00+ .bulk 00000000200000000000183000000000003c1800000000003c0800000000003c
+ 0c000000000018060000000000180700000000007f0300000000407f01000000
+ 00607f0100000000787e01000000003c7c01000000000f7c0000000070017c00
+ 00000010007c0000000000007e0000000000007e0000000000007e0000000000
+ 007f0000000000007f0100000000007701000000000077010000000000670100
+ 0000000067010000000000670100000000006301000000004063010000000040
+ 6301000000004061000000000040610000000000406100000000004060000000
+ 0000604000000000006040000000000020600000000000204001000000000000
1300: 00 20 00 00+ .bulk 0020000000000000604001000000004061030000000000610300000000006303
+ 0000000000460100000000004e0100000000007c0f0000000000781f00000000
+ 00783f0000000000787701000000007863030000000070030f0000000070033c
+ 0000000070032000000000700700000000007007000000000070070000000000
+ 700f0000000000780f0000000000780e0000000000780e0000000000380e0000
+ 000000380e0000000000380e0000000000380c0000000000381c000000000038
+ 1c00000000003018000000000030180000000000301800000000003010000000
+ 0000103000000000001030000000000030200000000000182000000000000000
1400: 00 00 00 00+ .bulk 0000000000000000000030000000000000780000000000007800000000000078
+ 00000000000030000000000000300000000000407f1f00000000707f7f000000
+ 007c7f7f010000000c7c43010000000678010300000003780102000000017801
+ 020000000378010200000001780103000000007e0302000000407f0300000000
+ 707f0700000000787f0700000000386007000000003060070000000030600700
+ 0000007060030000000060400300000000604003000000004040030000000070
+ 4003000000000040010000000000600100000000006000000000000060000000
+ 00000060000000000000600000000000003000000000000038000000ffff0000
1500: 00 00 00 00+ .bulk 000000000000000000180000000000003c0000000000003c0000000000003c00
+ 000000000018000000000000180000000000707f07000000007c7f1f00000000
+ 7e7f7f00000000067f6000000000033e4001000000013e0003000000013e0002
+ 000000013e0003000000033e0002000000017f0100000000007f070000000040
+ 7f1f00000000407f3f00000000400f3800000000400f1800000000400f180000
+ 0000000f1c0000000000070c0000000000070c00000000000704000000000007
+ 1c0000000000060000000000000e0000000000000c0000000000000c00000000
+ 00000c0000000000000c00000000000018000000000000380000000000000000
1600: 00 00 00 00+ .bulk 0000000000000000000060000000000000700100000000007001000000000070
+ 01000000000060000000000000600000000000007c0700000000007f0f000000
+ 00407f1f00000000607f3f000000007079790000000060786101000000407961
+ 00000000007b3100000000007e1900000000007c0d0000000000780900000000
+ 00780100000000007c0300000000007c0700000000007e0700000000005f0700
+ 000000004f070000000000070700000000000f0700000000001e030000000000
+ 7c03000000000070070000000000400f00000000004039000000000060300000
+ 00000060100000000000600000000000004000000000000040000000ffff0000
1700: 00 00 00 00+ .bulk 0000000000000000004001000000000060030000000000600300000000006003
+ 00000000004001000000000040010000000000780f00000000007c3f00000000
+ 007e7f00000000007f7f01000000406767030000006061470100000040616700
+ 0000000063370000000000661f00000000006c0f000000000064070000000000
+ 60070000000000700f0000000000780f0000000000781f0000000000783e0000
+ 000000783c000000000038380000000000383c0000000000301e000000000070
+ 0f0000000000780300000000007c000000000000670000000000004301000000
+ 00004201000000000040010000000000400000000000004000000000ffff0000
;
; This has some text strings and other stuff, most likely left over from program
; execution while testing. Integer puts its variables at LOMEM, and the program
; set its LOMEM to $1800.
;
1800: c1 40 00 39+ Lomem .junk 933
;
; Main Integer BASIC program.
;
1ba5: 37 00 00 5d+ MainProgram .bulk 3700005da0aaaaaaa0c1d0d0ccc5add6c9d3c9cfcea0aaaaaaa0a0a0a0a0a0a0
+ d7d2c9d4d4c5cea0c2d9a0d2aecaaea0c2c9d3c8cfd0010c14004ec14022b533
+ 0072013c1e00c1407028a0a0a0a0a0a0a0c2cfc2a0c2c9d3c8cfd0a0d0d2c5d3
+ c5ced4d3a0aeaeaea0c1d0d0ccc5add6c9d3c9cfcea1a0a0a0a0a0a0a0290109
+ 28004d36b9a803012532006fb10a000350b10a00036128aaaaaaa0c1d0d0ccc5
+ add6c9d3c9cfcea0aaaaaa29013437006fb214000350b30300036128c3cfd0d9
+ d2c9c7c8d4a0b1b9b7b8a0c1d0d0ccc5a0c3cfcdd0d5d4c5d2aca0c9cec3ae29
+ 01113c0055cb56b1010057b2c4090359cb010946004d36b9a803012650004db2
+ a908036436b1a93f65b00000036436b1ae3f65b00000036436b1b03f65b00000
+ 010d5a005cb2cc01035cb272010111640055cb56b1010057b1e8030359cb010e
+ 6e0055cb56b1010057b42d00010d78006fb10d000350b10c000110820061c140
+ 2acb23cb12b606007201118c0055ca56b1010057b74b000359ca0106960059cb
+ 0111a00055cb56b1010057b1e8030359cb0108aa004db24d0b0111b40055cb56
+ b1010057b5f4010359cb0114be006fb10d000350b10d00036128d4c8c529010f
+ c80050b10f00036128c5cec4290111d20055cb56b1010057b1dc050359cb0114
+ dc006fb10d000350b10d00036128a0a0a029010fe60050b10f00036128a0a0a0
+ 290111f00055cb56b1010057b4a00f0359cb0108fa005cb31c02010804015fb1
+ 6e0001050e015101111801c4d871c313c103c4d971c413c201282201c4c5ccd4
+ c171313fc4d8720360313fc4d97219313fc4d87225c4c5ccd4c171313fc4d972
+ 01212c01d871c103d971c203c9cec3d871303fc4d87203c9cec3d971303fc4d9
+ 720114360155cc56b1010057c4c5ccd4c112b101000111400164b1100065d803
+ 64b1110065d901114a0164b1120065b00000034db200080111540164b1120065
+ b10100034db2000801155e01d871d812c9cec3d803d971d912c9cec3d9010868
+ 0159cc035b0115720164b5360065b000000364b5370065b10b0001087c016fb4
+ 04000110860150b21900036128c8cfcdc5290111900150b21b00036128d3d7c5
+ c5d42901109a0150b31e00036128c8cfcdc5290113a4016fb10b000350b21500
+ 036128cfcf290113ae016fb10f000350b21500036128a7a7290113b8016fb110
+ 000350b21500036128aeae290105c2015b0114cc0155cccfc356b3000c57b3a4
+ 0c58b40400010cd601c1712e3fcccfc3720110e001c2712e3fcccfc312b10100
+ 720110ea01c3712e3fcccfc312b20200720110f401c4712e3fcccfc312b30300
+ 720108fe015cb118010108080259cccfc3010512025b01191c02cccfc371b303
+ 0d03d3d4712e3fcccfc313b303007201112602602e3fcccfc37216b10100255b
+ 010e3002d4d2d9712f3fb707007201223a02602e3fb7070014d3d413b10e0012
+ d4d2d912b2cf087216b0000024b3300201164402d3d471d4d2d912b202000364
+ cccfc365d3d401144e02cccfc371cccfc312b30300035fb3260201