; -----------------------------------------------------------
; Mad Pascal Compiler version 1.6.3 [2019/11/19] for 6502
; -----------------------------------------------------------

STACKWIDTH	= 16
CODEORIGIN	= $2000

TRUE		= 1
FALSE		= 0

; -----------------------------------------------------------

	org $80

fxptr	.ds 2

eax	.ds 4						;8 bytes (aex + edx) -> divREAL
edx	.ds 4
ecx	.ds 4
bp	.ds 2
bp2	.ds 2

ztmp
ztmp8	.ds 1
ztmp9	.ds 1
ztmp10	.ds 1
ztmp11	.ds 1

TMP	.ds 2

STACKORIGIN	.ds STACKWIDTH*4

.print 'ZPFREE: $0000..',fxptr-1,' ; ',*,'..',$ff

; -----------------------------------------------------------

ax	= eax
al	= eax
ah	= eax+1

cx	= ecx
cl	= ecx
ch	= ecx+1

dx	= edx
dl	= edx
dh	= edx+1

	org eax

FP1MAN0	.ds 1
FP1MAN1	.ds 1
FP1MAN2	.ds 1
FP1MAN3	.ds 1

	org ztmp8

FP1SGN	.ds 1
FP1EXP	.ds 1

	org edx

FP2MAN0	.ds 1
FP2MAN1	.ds 1
FP2MAN2	.ds 1
FP2MAN3	.ds 1

	org ztmp10

FP2SGN	.ds 1
FP2EXP	.ds 1

	org ecx

FPMAN0	.ds 1
FPMAN1	.ds 1
FPMAN2	.ds 1
FPMAN3	.ds 1

	org bp2

FPSGN	.ds 1
FPEXP	.ds 1

; -----------------------------------------------------------

	org CODEORIGIN

	STATICDATA

START
	tsx
	stx MAIN.@halt+1

	.ifdef fmulinit
	fmulinit
	eif

VLEN	= VARDATASIZE-VARINITSIZE
VADR	= DATAORIGIN+VARINITSIZE

	ift VADR > $BFFF
	ert 'Invalid memory address range ',VADR
	eli (VLEN>0) && (VLEN<=256)
	ldx #256-VLEN
	lda #0
	sta:rne VADR+VLEN-256,x+
	eli VLEN>0
	@fill #VADR #VLEN #0
	eif

	ldx #$0f
	mva:rpl $340,x MAIN.IOCB@COPY,x-

	inx		; X = 0 !!!
	stx bp		; lo BP = 0

	UNITINITIALIZATION

.local	MAIN						; PROCEDURE

	jmp l_0032

; -----------------------------------------------------------

.local	SYSTEM						; UNIT

.local	PEEK						; FUNCTION | ASSEMBLER | REGISTER

; -----------------------------------------------------------

; Generate Assignment for WORD / SMALLINT / SHORTREAL / POINTER
; as Pointer
	mva :STACKORIGIN,x A
	mva :STACKORIGIN+STACKWIDTH,x A+1
	dex						; sub bx, 1

; ---------------------  ASM Block 004  ---------------------

	ldy #0
	mva (edx),y Result

@exit

; -----------------------------------------------------------

; Push BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer

	inx						; add bx, 1
	mva RESULT :STACKORIGIN,x

	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif

; -----------------------------------------------------------

A	= edx
RESULT	= DATAORIGIN+$000B

@VarData	= RESULT
@VarDataSize	= 1

	rts						; ret
.endl

.local	DPEEK						; FUNCTION | ASSEMBLER | REGISTER

; -----------------------------------------------------------

; Generate Assignment for WORD / SMALLINT / SHORTREAL / POINTER
; as Pointer
	mva :STACKORIGIN,x A
	mva :STACKORIGIN+STACKWIDTH,x A+1
	dex						; sub bx, 1

; ---------------------  ASM Block 005  ---------------------

	ldy #0
	mva (edx),y Result
	iny
	mva (edx),y Result+1

@exit

; -----------------------------------------------------------

; Push WORD / SMALLINT / SHORTREAL / POINTER
; as Pointer

	inx						; add bx, 1
	mva RESULT :STACKORIGIN,x
	mva RESULT+1 :STACKORIGIN+STACKWIDTH,x

	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif

; -----------------------------------------------------------

A	= edx
RESULT	= DATAORIGIN+$000C

@VarData	= RESULT
@VarDataSize	= 2

	rts						; ret
.endl

.local	POKE						; PROCEDURE | ASSEMBLER | REGISTER

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x VALUE
	dex						; sub bx, 1

; -----------------------------------------------------------

; Generate Assignment for WORD / SMALLINT / SHORTREAL / POINTER
; as Pointer
	mva :STACKORIGIN,x A
	mva :STACKORIGIN+STACKWIDTH,x A+1
	dex						; sub bx, 1

; ---------------------  ASM Block 021  ---------------------

	ldy #0
	mva value (edx),y


; -----------------------------------------------------------

A	= edx
VALUE	= ecx
@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

; -----------------------------------------------------------

M_PI_2	= $0648
D_PI_2	= $0192
D_PI_180	= $0004
MGTIA	= $0000
MVBXE	= $0080
VBXE_XDLADR	= $0000
VBXE_BCBADR	= $0100
VBXE_MAPADR	= $1000
VBXE_OVRADR	= $5000
VBXE_WINDOW	= $B000
IDLI	= $0000
IVBL	= $0001
CH_DELCHR	= $00FE
CH_ENTER	= $009B
CH_ESC	= $001B
CH_CURS_UP	= $001C
CH_CURS_DOWN	= $001D
CH_CURS_LEFT	= $001E
CH_CURS_RIGHT	= $001F
CH_TAB	= $007F
CH_EOL	= $009B
CH_CLR	= $007D
CH_BELL	= $00FD
CH_DEL	= $007E
CH_DELLINE	= $009C
CH_INSLINE	= $009D
COLOR_BLACK	= $0000
COLOR_WHITE	= $000E
COLOR_RED	= $0032
COLOR_CYAN	= $0096
COLOR_VIOLET	= $0068
COLOR_GREEN	= $00C4
COLOR_BLUE	= $0074
COLOR_YELLOW	= $00EE
COLOR_ORANGE	= $0028
COLOR_BROWN	= $00E4
COLOR_LIGHTRED	= $003C
COLOR_GRAY1	= $0004
COLOR_GRAY2	= $0006
COLOR_GRAY3	= $000A
COLOR_LIGHTGREEN	= $00CC
COLOR_LIGHTBLUE	= $007C
FMOPENREAD	= $0004
FMOPENWRITE	= $0008
FMOPENAPPEND	= $0009
FMOPENREADWRITE	= $000C
SCREENWIDTH	= DATAORIGIN+$0000
SCREENHEIGHT	= DATAORIGIN+$0002
DATESEPARATOR	= DATAORIGIN+$0004
TVSYSTEM	= $D014
adr.PALETTE	= $02C0
.var PALETTE	= adr.PALETTE .word
adr.HPALETTE	= $D012
.var HPALETTE	= adr.HPALETTE .word
FILEMODE	= DATAORIGIN+$0005
SCREENMODE	= DATAORIGIN+$0006
IORESULT	= DATAORIGIN+$0007
EOLN	= DATAORIGIN+$0008
RNDSEED	= DATAORIGIN+$0009

.endl							; UNIT SYSTEM

; -----------------------------------------------------------

.local	ATARI						; UNIT

; -----------------------------------------------------------

RTCLOK	= $0012
ATRACT	= $004D
LMARGIN	= $0052
RMARGIN	= $0053
ROWCRS	= $0054
COLCRS	= $0055
DINDEX	= $0057
SAVMSC	= $0058
VDSLST	= $0200
SDLSTL	= $0230
TXTROW	= $0290
TXTCOL	= $0291
TINDEX	= $0293
TXTMSC	= $0294
SDMCTL	= $022F
GPRIOR	= $026F
CRSINH	= $02F0
CHACT	= $02F3
CHBAS	= $02F4
CH	= $02FC
PCOLR0	= $02C0
PCOLR1	= $02C1
PCOLR2	= $02C2
PCOLR3	= $02C3
COLOR0	= $02C4
COLOR1	= $02C5
COLOR2	= $02C6
COLOR3	= $02C7
COLOR4	= $02C8
COLBAKS	= $02C8
HPOSP0	= $D000
HPOSP1	= $D001
HPOSP2	= $D002
HPOSP3	= $D003
HPOSM0	= $D004
HPOSM1	= $D005
HPOSM2	= $D006
HPOSM3	= $D007
SIZEP0	= $D008
SIZEP1	= $D009
SIZEP2	= $D00A
SIZEP3	= $D00B
SIZEM	= $D00C
GRAFP0	= $D00D
GRAFP1	= $D00E
GRAFP2	= $D00F
GRAFP3	= $D010
GRAFM	= $D011
P0PF	= $D004
PAL	= $D014
COLPM0	= $D012
COLPM1	= $D013
COLPM2	= $D014
COLPM3	= $D015
COLPF0	= $D016
COLPF1	= $D017
COLPF2	= $D018
COLPF3	= $D019
COLBK	= $D01A
PRIOR	= $D01B
GRACTL	= $D01D
HITCLR	= $D01E
AUDF1	= $D200
AUDC1	= $D201
AUDF2	= $D202
AUDC2	= $D203
AUDF3	= $D204
AUDC3	= $D205
AUDF4	= $D206
AUDC4	= $D207
AUDCTL	= $D208
SKSTAT	= $D20F
PORTB	= $D301
DMACTL	= $D400
CHACTL	= $D401
DLISTL	= $D402
HSCROL	= $D404
VSCROL	= $D405
PMBASE	= $D407
CHBASE	= $D409
WSYNC	= $D40A
VCOUNT	= $D40B
PENH	= $D40C
PENV	= $D40D
NMIEN	= $D40E

.endl							; UNIT ATARI

; -----------------------------------------------------------

.local	CRT						; UNIT

.local	READKEY						; FUNCTION | ASSEMBLER

; ---------------------  ASM Block 047  ---------------------

	txa:pha

	@GetKey

	sta Result

	pla:tax

@exit

; -----------------------------------------------------------

; Push BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer

	inx						; add bx, 1
	mva RESULT :STACKORIGIN,x

	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif

; -----------------------------------------------------------

RESULT	= DATAORIGIN+$000F

@VarData	= RESULT
@VarDataSize	= 1

	rts						; ret
.endl

; -----------------------------------------------------------

TEXTATTR	= DATAORIGIN+$000E
CONSOL	= $D01F
CN_START_SELECT_OPTION	= $0000
CN_SELECT_OPTION	= $0001
CN_START_OPTION	= $0002
CN_OPTION	= $0003
CN_START_SELECT	= $0004
CN_SELECT	= $0005
CN_START	= $0006
CN_NONE	= $0007
BW40	= $0000
CO40	= $0001
BW80	= $0002
CO80	= $0003
MONO	= $0007
C40	= $0001
C80	= $0003
BLACK	= $0000
BLUE	= $0001
GREEN	= $0002
CYAN	= $0003
RED	= $0004
MAGENTA	= $0005
BROWN	= $0006
LIGHTGRAY	= $0007
DARKGRAY	= $0008
LIGHTBLUE	= $0009
LIGHTGREEN	= $000A
LIGHTCYAN	= $000B
LIGHTRED	= $000C
LIGHTMAGENTA	= $000D
YELLOW	= $000E
WHITE	= $000F
BLINK	= $0080

.endl							; UNIT CRT

; -----------------------------------------------------------

.local	TYPES						; UNIT

; -----------------------------------------------------------

.endl							; UNIT TYPES

; -----------------------------------------------------------

.local	GRAPH						; UNIT

.local	INITGRAPH_0082					; PROCEDURE | OVERLOAD

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x MODE
	dex						; sub bx, 1

; optimize OK (GRAPH), line = 66

	mva #$00 GRAPHRESULT

; optimize OK (GRAPH), line = 68

	mva MODE SYSTEM.SCREENMODE

; ---------------------  ASM Block 058  ---------------------


	txa:pha

	mva #$2c @putchar.vbxe

	lda mode
	and #$0f
	tay

	ldx #$60	; 6*16
	lda mode	; %00010000 with text window
	and #$10
	eor #$10
	ora #2		; read

	.nowarn @graphics

; Fox/TQA

dindex	equ $57
tmccn	equ $ee7d
tmrcn	equ $ee8d

	ldx dindex
	lda tmccn,x
	ldy tmrcn,x
	ldx #0
	cmp #<320
	sne:inx
    
; X:A = horizontal resolution
; Y = vertical resolution

	sta MAIN.SYSTEM.ScreenWidth
	stx MAIN.SYSTEM.ScreenWidth+1
	
	sty MAIN.SYSTEM.ScreenHeight
	lda #0
	sta MAIN.SYSTEM.ScreenHeight+1

	pla:tax


; -----------------------------------------------------------

MODE	= DATAORIGIN+$002A

@VarData	= MODE
@VarDataSize	= 1

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

.local	SETCOLOR					; PROCEDURE | ASSEMBLER

; -----------------------------------------------------------

; Generate Assignment for BYTE / CHAR / SHORTINT / BOOLEAN
; as Pointer
	mva :STACKORIGIN,x COLOR
	dex						; sub bx, 1

; ---------------------  ASM Block 060  ---------------------

	mva color @COMMAND.colscr
	sta GetColor


; -----------------------------------------------------------

COLOR	= DATAORIGIN+$002B

@VarData	= COLOR
@VarDataSize	= 1

@exit
	.ifdef @new
	@FreeMem #@VarData #@VarDataSize
	eif
	rts						; ret
.endl

; -----------------------------------------------------------

CURRENTDRIVER	= $FFFFFF80
DETECT	= $0000
CGA	= $0001
MCGA	= $0002
EGA	= $0003
EGA64	= $0004
EGAMONO	= $0005
LOWRES	= $0006
HERCMONO	= $0007
VGA	= $0009
VESA	= $000A
D1BIT	= $000B
D2BIT	= $000C
D4BIT	= $000D
D6BIT	= $000E
D8BIT	= $000F
D12BIT	= $0010
M640X400	= $0018
M640X480	= $0018
GROK	= $0000
GRNOINITGRAPH	= $FFFFFFFF
GRNOTDETECTED	= $FFFFFFFE
GRFILENOTFOUND	= $FFFFFFFD
GRINVALIDDRIVER	= $FFFFFFFC
GRNOLOADMEM	= $FFFFFFFB
GRNOSCANMEM	= $FFFFFFFA
GRNOFLOODMEM	= $FFFFFFF9
GRFONTNOTFOUND	= $FFFFFFF8
GRNOFONTMEM	= $FFFFFFF7
GRINVALIDMODE	= $FFFFFFF6
GRERROR	= $FFFFFFF5
GRIOERROR	= $FFFFFFF4
GRINVALIDFONT	= $FFFFFFF3
GRINVALIDFONTNUM	= $FFFFFFF2
GRINVALIDVERSION	= $FFFFFFEE
CGAC0	= $0000
CGAC1	= $0001
CGAC2	= $0002
CGAC3	= $0003
CGAHI	= $0004
MCGAC0	= $0000
MCGAC1	= $0001
MCGAC2	= $0002
MCGAC3	= $0003
MCGAMED	= $0004
MCGAHI	= $0005
EGALO	= $0000
EGAHI	= $0001
EGA64LO	= $0000
EGA64HI	= $0001
EGAMONOHI	= $0003
VGALO	= $000A
VGAMED	= $001F
VGAHI	= $0018
WIN_LEFT	= DATAORIGIN+$0010
WIN_RIGHT	= DATAORIGIN+$0012
WIN_TOP	= DATAORIGIN+$0014
WIN_BOTTOM	= DATAORIGIN+$0016
GRAPHRESULT	= DATAORIGIN+$0018
GETCOLOR	= DATAORIGIN+$0019
adr.LASTARCCOORDS	= DATAORIGIN+$001A
.var LASTARCCOORDS	= adr.LASTARCCOORDS .word
LASTARCCOORDS.X	= DATAORIGIN+$001A
LASTARCCOORDS.Y	= DATAORIGIN+$001C
LASTARCCOORDS.XSTART	= DATAORIGIN+$001E
LASTARCCOORDS.YSTART	= DATAORIGIN+$0020
LASTARCCOORDS.XEND	= DATAORIGIN+$0022
LASTARCCOORDS.YEND	= DATAORIGIN+$0024
CURRENTX	= DATAORIGIN+$0026
CURRENTY	= DATAORIGIN+$0028

.endl							; UNIT GRAPH
l_0032

; optimize FAIL ('GRAPH.INITGRAPH_0082', /tmp/80col.pas), line = 47
	inx
	mva #$08 :STACKORIGIN,x
	jsr GRAPH.INITGRAPH_0082

; optimize OK (/tmp/80col.pas), line = 48

	lda $0058
	sta BA
	lda $0058+1
	sta BA+1

; optimize OK (/tmp/80col.pas), line = 49

	lda BA
	sub #$01
	sta TBA
	lda BA+1
	sbc #$00
	sta TBA+1

; optimize FAIL ('GRAPH.SETCOLOR', /tmp/80col.pas), line = 50
	inx
	mva #$01 :STACKORIGIN,x
	jsr GRAPH.SETCOLOR

; optimize OK (/tmp/80col.pas), line = 52

	mva #$01 COL

; optimize OK (/tmp/80col.pas), line = 53

	sta ROW

; optimize FAIL (100, /tmp/80col.pas), line = 55
	@printSTRING #CODEORIGIN+$0000
	@printEOL

; --- RepeatUntilProlog
l_00E8

; optimize FAIL ('CRT.READKEY', /tmp/80col.pas), line = 58
	jsr CRT.READKEY
	lda :STACKORIGIN,x
	sub #$61
	sta PRESSEDKEY
	dex

; optimize OK (/tmp/80col.pas), line = 59

	lda PRESSEDKEY
	asl @
	tay
	lda adr.FOR_BIT_CHARS,y
	sta CHARTODRAW
	lda adr.FOR_BIT_CHARS+1,y
	sta CHARTODRAW+1

; optimize FAIL (100, /tmp/80col.pas), line = 61
	inx
	mva COL :STACKORIGIN,x
	jsr @printBYTE
	dex
	@printSTRING #CODEORIGIN+$0020
	inx
	mva PRESSEDKEY :STACKORIGIN,x
	inx
	mva #$61 :STACKORIGIN,x
	jsr @expandToCARD1.BYTE
	jsr @expandToCARD.BYTE
	jsr addEAX_ECX
	dex
	@printCHAR
	dex
	@printSTRING #CODEORIGIN+$0024
	inx
	mva PRESSEDKEY :STACKORIGIN,x
	inx
	mva #$61 :STACKORIGIN,x
	jsr @expandToCARD1.BYTE
	jsr @expandToCARD.BYTE
	jsr addEAX_ECX
	dex
	jsr @printCARD
	dex
	@printEOL

; optimize OK (/tmp/80col.pas), line = 63

	ldy #1
	lda PRESSEDKEY
	cmp #$00
	bcs @+
	dey
@
	sty :STACKORIGIN+9
	ldy #1
	lda PRESSEDKEY
	cmp #$08
	bcc @+
	dey
@
	tya
	and :STACKORIGIN+9
	jeq l_013C

; optimize OK (/tmp/80col.pas), line = 64

	lda COL
	and #1
	sta IFTMP_0051
	jeq l_0149

; optimize FAIL (0, /tmp/80col.pas), line = 65
	inw TBA

; optimize OK (/tmp/80col.pas), line = 66

	mva #$F0 EVEN
l_0149

; Restore conditional expression
	lda IFTMP_0051

; else condition
	jne l_015B

; optimize OK (/tmp/80col.pas), line = 67

	mva #$0F EVEN
l_015B
; --- For

; optimize OK (/tmp/80col.pas), line = 68

	mva #$00 I0B

; optimize OK (/tmp/80col.pas), line = 68

; --- To
l_0168

; --- ForToDoCondition

; optimize OK (/tmp/80col.pas), line = 68

	lda I0B
	cmp #$04
	scc
	jne l_0176

; optimize OK (/tmp/80col.pas), line = 69

	lda TBA+1
	sta :bp+1
	ldy TBA
	lda (:bp),y
	sta :STACKORIGIN+10
	lda CHARTODRAW+1
	sta :bp+1
	ldy CHARTODRAW
	lda (:bp),y
	and EVEN
	ora :STACKORIGIN+10
	sta :STACKORIGIN+10
	lda TBA+1
	sta :bp+1
	ldy TBA
	lda :STACKORIGIN+10
	sta (:bp),y

; optimize OK (/tmp/80col.pas), line = 70

	lda TBA
	add #$28
	sta TBA
	scc
	inc TBA+1

; optimize FAIL (0, /tmp/80col.pas), line = 70
	inw CHARTODRAW

; --- ForToDoEpilog
	inc I0B						; inc ptr byte [CounterAddress]

	jne l_0168

l_0176

; optimize OK (/tmp/80col.pas), line = 72

	lda TBA
	sub #$C8
	sta TBA
	scs
	dec TBA+1

; optimize FAIL (0, /tmp/80col.pas), line = 72
	inc COL

; optimize OK (/tmp/80col.pas), line = 73

	lda COL
	cmp #$51
	jne l_01A9

; optimize OK (/tmp/80col.pas), line = 74

	lda TBA
	add #$C8
	sta TBA
	scc
	inc TBA+1

; optimize FAIL (0, /tmp/80col.pas), line = 74
	inc ROW

; optimize OK (/tmp/80col.pas), line = 75

	mva #$01 COL
l_01A9
l_013C

; optimize OK (/tmp/80col.pas), line = 78

	lda #$00
	jeq l_00E8

; -----------------------------------------------------------

adr.CHAR_A	= CODEORIGIN+$002B
.var CHAR_A	= adr.CHAR_A .word
adr.CHAR_B	= CODEORIGIN+$0030
.var CHAR_B	= adr.CHAR_B .word
adr.CHAR_C	= CODEORIGIN+$0035
.var CHAR_C	= adr.CHAR_C .word
adr.CHAR_D	= CODEORIGIN+$003A
.var CHAR_D	= adr.CHAR_D .word
adr.CHAR_E	= CODEORIGIN+$003F
.var CHAR_E	= adr.CHAR_E .word
adr.CHAR_F	= CODEORIGIN+$0044
.var CHAR_F	= adr.CHAR_F .word
adr.CHAR_G	= CODEORIGIN+$0049
.var CHAR_G	= adr.CHAR_G .word
adr.CHAR_H	= CODEORIGIN+$004E
.var CHAR_H	= adr.CHAR_H .word
adr.CHAR_SPACE	= CODEORIGIN+$0053
.var CHAR_SPACE	= adr.CHAR_SPACE .word
adr.FOR_BIT_CHARS	= CODEORIGIN+$0058
.var FOR_BIT_CHARS	= adr.FOR_BIT_CHARS .word
BA	= DATAORIGIN+$002C
TBA	= DATAORIGIN+$002E
COL	= DATAORIGIN+$0030
ROW	= DATAORIGIN+$0031
I0B	= DATAORIGIN+$0032
EVEN	= DATAORIGIN+$0033
PRESSEDKEY	= DATAORIGIN+$0034
CHARTODRAW	= DATAORIGIN+$0035
IFTMP_0051	= DATAORIGIN+$0037
@FORTMP_0165	= $0004
@exit

@halt	ldx #0
	txs

	rts

IOCB@COPY	:16 brk

.local	@DEFINES
ATARI
.endl

.endl

; -----------------------------------------------------------

	icl 'cpu6502.asm'

; -----------------------------------------------------------

.macro UNITINITIALIZATION

	.ifdef MAIN.SYSTEM.@UnitInit
	jsr MAIN.SYSTEM.@UnitInit
	eif

	.ifdef MAIN.ATARI.@UnitInit
	jsr MAIN.ATARI.@UnitInit
	eif

	.ifdef MAIN.CRT.@UnitInit
	jsr MAIN.CRT.@UnitInit
	eif

	.ifdef MAIN.TYPES.@UnitInit
	jsr MAIN.TYPES.@UnitInit
	eif

	.ifdef MAIN.GRAPH.@UnitInit
	jsr MAIN.GRAPH.@UnitInit
	eif
.endm

	ift .SIZEOF(MAIN.SYSTEM) > 0
	.print 'SYSTEM: ',MAIN.SYSTEM,'..',MAIN.SYSTEM+.SIZEOF(MAIN.SYSTEM)-1
	eif

	ift .SIZEOF(MAIN.ATARI) > 0
	.print 'ATARI: ',MAIN.ATARI,'..',MAIN.ATARI+.SIZEOF(MAIN.ATARI)-1
	eif

	ift .SIZEOF(MAIN.CRT) > 0
	.print 'CRT: ',MAIN.CRT,'..',MAIN.CRT+.SIZEOF(MAIN.CRT)-1
	eif

	ift .SIZEOF(MAIN.TYPES) > 0
	.print 'TYPES: ',MAIN.TYPES,'..',MAIN.TYPES+.SIZEOF(MAIN.TYPES)-1
	eif

	ift .SIZEOF(MAIN.GRAPH) > 0
	.print 'GRAPH: ',MAIN.GRAPH,'..',MAIN.GRAPH+.SIZEOF(MAIN.GRAPH)-1
	eif

	.print 'CODE: ',CODEORIGIN,'..',*-1

DATAORIGIN
.by  $28 $00 $18 $00 $2D $0C $00 $00  $00 $00 $00 $00 $00 $00 $00 $00  $00 $00 $9F $00 $00 $00 $BF

VARINITSIZE	= *-DATAORIGIN
VARDATASIZE	= 56

PROGRAMSTACK	= DATAORIGIN+VARDATASIZE

	.print 'DATA: ',DATAORIGIN,'..',PROGRAMSTACK

	run START

; -----------------------------------------------------------

.macro	STATICDATA
.by  $1E $53 $74 $61 $72 $74 $20 $74  $79 $70 $69 $6E $67 $20 $61 $2C  $62 $2C $63 $2C $64 $2C $65 $2C
.by  $66 $2C $67 $20 $2E $2E $2E $00  $02 $2E $20 $00 $05 $20 $2D $2D  $3E $20 $00 $EE $AA $EE $AA $AA
.by  $CC $AA $EE $AA $EE $EE $88 $88  $88 $EE $CC $AA $AA $AA $CC $EE  $88 $EE $88 $EE $EE $88 $EE $88
.by  $88 $EE $88 $AA $AA $EE $AA $AA  $EE $AA $AA $00 $00 $00 $00 $00  $2B $20 $30 $20 $35 $20 $3A $20
.by  $3F $20 $44 $20 $49 $20 $4E $20
.endm

	end
