; ------------------------------------------------------------
; Mad Pascal Compiler version 1.6.4 [2020/03/01] for 6502
; ------------------------------------------------------------

STACKWIDTH	= 16
CODEORIGIN	= $2000

TRUE		= 1
FALSE		= 0

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

	org $80

fxptr	.ds 2						; VBXE pointer
psptr	.ds 2						; PROGRAMSTACK Pointer

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
zpend

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

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

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

RUNLIB
	icl 'cpu6502.asm'

.print 'ZPAGE: ',fxptr,'..',zpend

.print 'RUNLIB: ',RUNLIB,'..',*

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

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

	mwa #PROGRAMSTACK-1 psptr

	ldx #$0f					; DOS II+/D ParamStr
	mva:rpl $340,x MAIN.IOCB@COPY,x-

	inx						; X = 0
	stx bp						; BP = 0

	stx audctl					; reset POKEY
	lda #3
	sta skctl

	dex						; X = 255

	UNITINITIALIZATION

.local	MAIN						; PROCEDURE

	jmp l_0007

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

.local	SYSTEM						; UNIT

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

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
PALNTS	= $0062
RAMTOP	= $006A
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 048  ---------------------

	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-1 #@VarDataSize
	eif

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

RESULT	= DATAORIGIN+$000C

@VarData	= RESULT
@VarDataSize	= 1

	rts						; ret
.endl

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

TEXTATTR	= DATAORIGIN+$000B
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	WAIT						; PROCEDURE

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

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

; optimize OK (hello.pas), line = 8

	lda FRAMES
	add RTCLOCK
	sta FRAMES

; --- WhileProlog
l_0057

; optimize OK (hello.pas), line = 9

	lda FRAMES
	cmp RTCLOCK
	jne l_0057

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

FRAMES	= DATAORIGIN+$000D

@VarData	= FRAMES
@VarDataSize	= 1

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

; optimize FAIL ('WAIT', hello.pas), line = 13
	inx
	mva #$0A :STACKORIGIN,x
	jsr WAIT

	jsr CRT.READKEY					; call Entry

	dex						; sub bx, 1

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

RTCLOCK	= $0014
@exit

@halt	ldx #0
	txs

	rts

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

IOCB@COPY	:16 brk

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

.local	@DEFINES
ATARI
.endl

.endl							; MAIN

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

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

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

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

DATAORIGIN
.by  $28 $00 $18 $00 $2D $0C

VARINITSIZE	= *-DATAORIGIN
VARDATASIZE	= 14

PROGRAMSTACK	= DATAORIGIN+VARDATASIZE

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

	run START

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

.macro	STATICDATA
.endm

	end
