;----------Includes/Defines----------

if .p

t "TopSym+"

t "TopMac"

t "Sym128.erg"

t "CMDSym"

:mmubase = $ff00

:mmuram = $d506

:BANK1_IO = %o######o

endif

;----------Programmdaten----------

a "Holger G. Heimes"

c "geoConnect V1.0"

f APPLICATION

o $1000

p start

z $c0

n "geoConnect"

;----------NMI Routine----------

;(in Bank 0 und 1 ab $1000)

:NMI_Rout

php

sei ;IRQ sperren

pha

txa

pha

tya

pha

lda mmubase

pha ;MMUconfig sichern

lda BANK1_IO

sta mmubase ;Bank1 und I/O enblenden

lda mmuram

pha

and #%####oooo ;kein gemeinsamer Bereich

sta mmuram

jsr HandleNMI ;NMI verarbeiten

pla

sta mmuram

pla

sta mmubase ;alte MMUconfig herstellen

pla

tay

pla

tax

pla

plp

rti

:NMI_End

;----------Initialization----------

:start

LoadW BRKVector,EnterDeskTop

LoadW r11,0

LoadB r1H,8

LoadW r0,Icontxt

jsr PutString

jsr IconInit

jsr Wait

LoadW r11,0

LoadB r1H,16

LoadW r0,Buffertxt

jsr PutString

jsr BufferInit

jsr Wait

LoadW r11,0

LoadB r1H,24

LoadW r0,NMItxt

jsr PutString

jsr NMIInit

jsr Wait

LoadW r11,0

LoadB r1H,32

LoadW r0,SLtxt

jsr PutString

jsr SLInit

jsr Wait

LoadW r11,0

LoadB r1H,40

LoadW r0,Screentxt

jsr PutString

jsr ScreenInit

jsr Wait

LoadW r11,0

LoadB r1H,48

LoadW r0,Tasttxt

jsr PutString

jsr TastInit

jsr Wait

LoadW r11,0

LoadB r1H,56

LoadW r0,Maintxt

jsr PutString

jsr MainInit

jsr Wait

rts

:Maintxt b "Main ...",NULL

:Tasttxt b "Tastatur ...",NULL

:Screentxt b "Screen ...",NULL

:SLtxt b "Swiftlink ...",NULL

:NMItxt b "NMI ...",NULL

:Buffertxt b "Puffer ...",NULL

:Icontxt b "Icons ...",NULL

:Wait

ldx #0

::loopx ldy #0

::loopy dey

bne :loopy

dex

bne :loopx

rts

;----------Icon Initialization----------

:IconInit

LoadW r0,DummyIconTab

jsr DoIcons

rts

:DummyIconTab

b 1

w $0000

b 0

w $0000

b 0,0

b 1,1

w $0000

;----------Initializes in/out buffers----------

:inbuf = $0400 ;circular input buffer 256 b

:outbuf = $0500 ;circular output buffer 256 b

:inhead = $0600 ;ptr to next byte to remove

:intail = $0601 ;ptr to next free byte

:incount = $0602 ;counts bytes in inbuf

:outhead = $0603

:outtail = $0604

:outcount = $0605

:BufferInit lda #0

sta inhead

sta intail

sta incount

sta outhead

sta outtail

sta outcount

rts

;----------NMI Initialization----------

:NMIInit

LoadW r0,NMI_Rout ;von Adr.

LoadW r1,NMI_Rout ;nach Adr.

LoadW r2,NMI_End - NMI_Rout ;wieviel

LoadB r3L,1 ;von Bank

LoadB r3H,0 ;nach Bank

jsr MoveBData ;NMIRoutine nach Bank 0

:PointNMI

php

sei

MoveW NMI_VECTOR,OldNMI_1

LoadW NMI_VECTOR,NMI_Rout

lda mmuram

pha

ora #%oooo#ooo ;oberer gemeinsam

sta mmuram

MoveW NMI_VECTOR,OldNMI_0

LoadW NMI_VECTOR,NMI_Rout

pla

sta mmuram

plp

rts

:RestoreNMI

php

sei

MoveW OldNMI_1,NMI_VECTOR

lda mmuram

pha

ora #%oooo#ooo

sta mmuram ;oberer gemeinsam

MoveW OldNMI_0,NMI_VECTOR

pla

sta mmuram

plp

rts

:OldNMI_1 w 0

:OldNMI_0 w 0

;----------SL Initialization----------

:slsperr = $0610

:SLInit

LoadW a5,$de00

php

sei

ldy #2

sta (a5),y ;SL Reset

ldy #0

lda (a5),y ;Data entleeren

;Control Register

ldy #3

lda #%oooooooo

;0xxxxxxx = 1 Stop Bit

;x00xxxxx = 8 Bit laenge

ora #%ooo#oooo ;xxx1xxxx = onchip baudgen.

ora #%oooo###o ;xxxx1110 = 19200 Baud

sta (a5),y ;=00011110

;Command Register

dey ; = 2

lda (a5),y

and #%oooo1111

;000xxxxx = no parity

;xxx0xxxx = normal echo

sta (a5),y

jsr DTRlow

jsr RTSlow

jsr NMIenable

plp

rts

:RTS = $0606

:DTR = $0607

:NMI = $0608

:DTRlow

ldy #2

lda (a5),y

ora #%ooooooo#

sta (a5),y

LoadB DTR,$80

rts

:DTRhigh

ldy #2

lda (a5),y

and #%#######o

sta (a5),y

LoadB DTR,$00

rts

:RTSlow

ldy #2

lda (a5),y

ora #%oooo#ooo

sta (a5),y

LoadB RTS,$80

rts

:RTShigh

ldy #2

lda (a5),y

and #%####oo##

sta (a5),y

LoadB RTS,$00

rts

:NMIenable

ldy #2

lda (a5),y

and #%######o#

sta (a5),y

LoadW NMI,$80

rts

:NMIdisable

ldy #2

lda (a5),y

ora #%oooooo#o

sta (a5),y

LoadW NMI,$00

rts

;----------Screen Initialization----------

:ScreenInit

jsr i_GraphicsString

b MOVEPENTO

w 0

b 3*8

b NEWPATTERN

b 0

b RECTANGLETO

w 639

b 199

b NULL

LoadW lastr11,0 ;x-koord text

LoadB lastr1H,5+3*8 ;baseline text

LoadB windowTop,3*8

LoadB windowBottom,199

LoadW leftMargin,0

LoadW rightMargin,639

LoadW StringFaultVec,StringFault_Rout

LoadW r0,USFont

jsr LoadCharSet

rts

jsr i_MoveData

w cursicon

w spr1pic

w $40 ;textcursor

LoadB obj1Pointer,$40

LoadW stringX,0

LoadB stringY,3*8

jsr PromptOn ;textcursor einschalten

rts

:StringFault_Rout

LoadW lastr11,0

lda lastr1H

clc

adc #8

pha

bcc :ok

jsr Scroll

::ok pla

sta lastr1H

sta r1H

MoveW lastr11,r11

rts

:cursicon b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %########,%########,%########

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b %oooooooo,%oooooooo,%oooooooo

b NULL

;----------Keyboard Initialization----------

:TastInit

php

sei

LoadW keyVector,TastAbfrage

plp

rts

;----------Keyboard Scanning----------

:TastAbfrage

ldy keyData

bmi :commo ;>=128 ist C=

cpy #" "

blt :sonst

jmp SendIt

::sonst tya

asl ; * 2

tay

lda keytab+1,y

beq :ende ;Key n. belegt (Highbyte=0)

pha

lda keytab,y

pha

rts ;Sprung zur Routine, die

;auf den Stack liegt

::commo tya

and #%o####### ; - 128

asl ; * 2

tay

lda commotab+1,y

beq :ende ;Key n. belegt (Highbyte=0)

pha

lda commotab,y

pha

rts ;Sprung zur Routine, die

;auf den Stack liegt

::ende rts

;----------Scancode Table----------

:keytab w 0 ;nix, niente, tipota - 0

w 0 ;F1 / CTRL A

w 0 ;F2 / CTRL B

w 0 ;F3 / CTRL C

w 0 ;F4 / CTRL D

w 0 ;F5 / CTRL E

w 0 ;F6 / CTRL F

w 0 ;NO SCROLL / CTRL G

w SendDel ;CRSR links / CTRL H

w SendTab ;TAB / CTRL I

w SendLF ;LINE FEED / CTRL J - 10

w SendLF ;ENTER Block / CTRL K

w 0 ;CTRL L

w SendLF ;ENTER / CTRL M

w 0 ;F7 / CTRL N

w 0 ;F8 / CTRL O

w 0 ;CRSR UP / CTRL P

w SendIt ;CRSR DOWN / CTRL Q

w 0 ;HOME / CTRL R

w SendIt ;CLR / CTRL S

w 0 ;ARROW / CTRL T - 20

w 0 ;CTRL U

w 0 ;RUN STOP / CTRL V

w 0 ;SHFT RUN STOP /CTRL W

w 0 ;CTRL X

w Help ;HELP / CTRL Y

w 0 ;ALT / CTRL Z

w Quit ;ESC

w 0 ;INST

w SendDel ;DEL

w 0 ;CRSR RIGHT - 30

w 0 ;

:commotab w 0 ; C=

s 31*2 ;nichtdarstellbare mit C=

s (97-32)*2 ; alles < C= a

w 0 ; C= a

w 0 ; C= b

w 0 ; C= c

w 0 ; C= d

w 0 ; C= e

w 0 ; C= f

w 0 ; C= g

w Help ; C= h

w Info ; C= i

w 0 ; C= j

w 0 ; C= k

w 0 ; C= l

w 0 ; C= m

w 0 ; C= n

w 0 ; C= o

w 0 ; C= p

w Quit ; C= q

w 0 ; C= r

w 0 ; C= s

w 0 ; C= t

w 0 ; C= u

w 0 ; C= v

w 0 ; C= w

w 0 ; C= x

w 0 ; C= y

w 0 ; C= z

s 5*2 ;rest

;----------Div. Keycode Routines----------

:SendDel

ldy #$08

jmp SendIt

:SendTab ldx #8

stx :count

::loop ldy #" "

jsr SendIt

dec :count

bne :loop

rts

::count b 0

:SendLF

ldy #$0d

jsr SendIt

ldy #$0a

jmp SendIt

:Help

rts

:Info

rts

;----------Quit Program----------

:Quit

php

sei

jsr MyInitForIO

jsr NMIdisable

jsr RTShigh

jsr DTRhigh

dey

lda (a5),y ;Status

dey

lda (a5),y ;Data

jsr MyDoneWithIO

plp

jsr RestoreNMI

; jsr UseSystemFont

jmp EnterDeskTop

:MyInitForIO

lda mmubase

sta mmusave

lda #BANK1_IO

sta mmubase

rts

:MyDoneWithIO

lda mmusave

sta mmubase

rts

:mmusave b 0

;----------Send Routine----------

:SendIt

sty :sendbyte

php

sei

jsr MyInitForIO

ldy #1

lda (a5),y

and #%ooo#oooo

beq :voll

dey

lda :sendbyte

sta (a5),y

jsr MyDoneWithIO

plp

ldx #0

rts

::voll

jsr MyDoneWithIO

plp

ldy :sendbyte

ldx #$80

rts

::sendbyte b 0

;----------Mainloop Initialization----------

:MainInit

LoadW r0,protab

lda #1

jsr InitProcesses

ldx #0

jsr RestartProcess

rts

:protab

w Buffer_Rout

w 1

;----------Serve Buffers----------

:Buffer_Rout

ldx incount

beq :out

ldy inhead

lda inbuf,y

inc inhead

dec incount

bit RTS

bmi :disp ;$80 bei RTSlow

ldx incount

cpx #240

bgt :disp

pha

php

sei

jsr MyInitForIO

jsr RTSlow

jsr MyDoneWithIO

plp

pla

::disp jsr DisplayIt

::out

::ende

rts

;----------Serve NMI----------

:DSR = $0609

:DCD = $060a

:HandleNMI ;IRQ gesperrt, IO eingeblendet

ldy #1

lda (a5),y

and #%oooo#ooo ;Receiver

beq :ende

dey ; = 0

lda (a5),y

ldy intail

sta inbuf,y

inc intail

inc incount

ldx incount

cpx #255

blt :ende

jsr RTShigh

::ende

rts

;----------Display Routine for 1 Byte----------

:DisplayIt

pha ;Zeichen zum ausgeben

MoveW lastr11,r11

MoveB lastr1H,r1H

pla

jsr PutChar

MoveW r11,lastr11

MoveB r1H,lastr1H

rts

:lastr11 w 0

:lastr1H b 0

:Scroll jsr InitForIO

jsr SaveVDC

LoadW a0,$0280

LoadW StartAdd,$0280 * 4

LoadW UpdateAdd,$0280 * 3

lda #24

sta $d600

jsr WaitVDC

lda $d601

ora #%10000000

tax

lda #24

sta $d600

jsr WaitVDC

stx $d601 ;copy-bit setzen

::loop lda #18

sta $d600

jsr WaitVDC

lda UpdateAdd+1

sta $d601 ;updateadresse high

lda #19

sta $d600

jsr WaitVDC

lda UpdateAdd

sta $d601 ;updateadresse low

lda #32

sta $d600

jsr WaitVDC

lda StartAdd+1

sta $d601 ;startadresse high

lda #33

sta $d600

jsr WaitVDC

lda StartAdd

sta $d601 ;startadresse low

lda #30

sta $d600

jsr WaitVDC

lda #160 ;2 Zeilen

sta $d601

AddVW $a0,StartAdd

AddVW $a0,UpdateAdd

CmpWI StartAdd,$3e80

bge :endcopy

jmp :loop

::endcopy jsr RestoreVDC

jsr DoneWithIO

lda #0

jsr SetPattern

jsr i_Rectangle

b 192,199

w 0,639

rts

:StartAdd w $0280

:UpdateAdd w 0

:WaitVDC bit $d600

bpl WaitVDC

rts

:SaveVDC lda #24

sta $d600

jsr WaitVDC

MoveB $d601,Save24

lda #18

sta $d600

jsr WaitVDC

MoveB $d601,Save18

lda #19

sta $d600

jsr WaitVDC

MoveB $d601,Save19

lda #32

sta $d600

jsr WaitVDC

MoveB $d601,Save32

lda #33

sta $d600

jsr WaitVDC

MoveB $d601,Save33

lda #30

sta $d600

jsr WaitVDC

MoveB $d601,Save30

rts

:RestoreVDC lda #24

sta $d600

jsr WaitVDC

MoveB Save24,$d601

lda #18

sta $d600

jsr WaitVDC

MoveB Save18,$d601

lda #19

sta $d600

jsr WaitVDC

MoveB Save19,$d601

lda #32

sta $d600 ;copy-bit setzen

jsr WaitVDC

MoveB Save32,$d601

lda #33

sta $d600

jsr WaitVDC

MoveB Save33,$d601

lda #30

sta $d600

jsr WaitVDC

MoveB Save30,$d601

rts

:Save18 b 0

:Save19 b 0

:Save24 b 0

:Save30 b 0

:Save32 b 0

:Save33 b 0

:USFont

v 7,"ViewFont"