;----------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"