.nolist #include "asm.inc" .list .org $9D93 .db $BB,$6D #define VarLen saferam1+1 #define CurLen saferam1+3 #define tempchecksum saferam1+5 #define temppos saferam1+7 #define VarType saferam1+10 #define VarNameLen saferam1+11 #define VarName saferam1+12 xor a jr nc,start title: .db "X-Link v0.01",0 start: set fullscrndraw,(iy+apiflg4) call DrawMenus ld hl,57*256+7 ld (pencol),hl ld hl,main_86_label bcall(_vputs) ld hl,0 ld (currow),hl ld hl,title bcall(_puts) MainMenuLoop: ei \ halt bcall(_getcsc) or a jr z,MainMenuLoop cp skYEqu jr z,Menu86 cp skMode ret z jr MainMenuLoop Menu86: call DrawMenus ld hl,57*256+3 ld (pencol),hl ld hl,lbl86_menu_send bcall(_vputs) ld a,21 ld (pencol),a ld hl,lbl86_menu_receive bcall(_vputs) ld a,42 ld (pencol),a ld hl,lbl86_menu_control bcall(_vputs) Menu86Loop: ei \ halt bcall(_getcsc) or a jr z,Menu86Loop cp skYEqu jp z,SendTo86 cp skWindow jp z,ReceiveFrom86 cp skMode jr z,start jr Menu86Loop DrawMenus: bcall(_clrscrnfull) ld h,1 ld bc,7 ld de,95*256+7 bcall(_iline) ld bc,8 ld e,8 bcall(_iline) ld bc,19*256+6 ld de,19*256 bcall(_iline) ld b,0 ld d,b bcall(_iline) inc b inc d bcall(_iline) ld b,95 ld d,b bcall(_iline) dec b dec d bcall(_iline) ld b,38 ld d,b bcall(_iline) ld b,57 ld d,b bcall(_iline) ld b,76 ld d,b bcall(_iline) ret SendTo86: bcall(_clrscrnfull) bcall(_zeroop1) ld a,AppVarObj ld (op1),a bcall(_findalphaup) jp c,Menu86 ld hl,0 ld (currow),hl ld hl,OP1+1 bcall(_puts) FindAppVarToSendLoop: ei \ halt bcall(_getcsc) or a jr z,FindAppVarToSendLoop cp skLeft jr z,MoveAppVarLeft cp skRight jr z,MoveAppVarRight cp skMode jp z,Menu86 cp sk2nd jr z,TransferTo86 cp skEnter jr z,TransferTo86 jr FindAppVarToSendLoop jp Menu86 MoveAppVarLeft: bcall(_findalphadn) ld hl,0 ld (currow),hl ld hl,OP1+1 bcall(_puts) ld hl,spaces bcall(_puts) jr FindAppVarToSendLoop MoveAppVarRight: bcall(_findalphaup) ld hl,0 ld (currow),hl ld hl,OP1+1 bcall(_puts) ld hl,spaces bcall(_puts) jr FindAppVarToSendLoop TransferTo86: ld hl,0 ld (tempchecksum),hl bcall(_chkfindsym) ex de,hl ld e,(hl) inc hl ld d,(hl) ld (VarLen),de inc hl ld (temppos),hl bcall(_chkfindsym) ld de,-6 add hl,de ld a,(hl) ld (VarNameLen),a ld a,$86 bcall(_SendAByte) ld a,$06 bcall(_SendAByte) ld a,(VarNameLen) add a,4 bcall(_SendAByte) xor a bcall(_SendAByte) ld a,(VarLen) ld hl,(tempchecksum) ld d,0 ld e,a add hl,de ld (tempchecksum),hl bcall(_SendAByte) ld a,(VarLen+1) ld hl,(tempchecksum) ld d,0 ld e,a add hl,de ld (tempchecksum),hl bcall(_SendAByte) ld a,$12 ld de,$12 ld hl,(tempchecksum) add hl,de ld (tempchecksum),hl ld a,(VarNameLen) ld d,0 ld e,a ld hl,(tempchecksum) add hl,de ld (tempchecksum),hl bcall(_SendAByte) ld hl,OP1+1 ld a,(VarNameLen) ld b,a sendnameloop: push bc ld a,(hl) push hl ld hl,(tempchecksum) ld d,0 ld e,a add hl,de ld (tempchecksum),hl bcall(_SendAByte) pop hl inc hl pop bc djnz sendnameloop ld a,(tempchecksum+1) bcall(_SendAByte) ld a,(tempchecksum) bcall(_SendAByte) bcall(_RecAByteIO) ;skip past acknowledge bcall(_RecAByteIO) ;" bcall(_RecAByteIO) ;" bcall(_RecAByteIO) ;" bcall(_RecAByteIO) ;skip past $86 bcall(_RecAByteIO) ;Continue? cp $09 jp nz,Menu86 bcall(_RecAByteIO) ;skip past 0s bcall(_RecAByteIO) ;" ld a,$86 ;Send acknowledge back bcall(_SendAByte) ld a,$56 bcall(_SendAByte) xor a bcall(_SendAByte) xor a bcall(_SendAByte) ld a,$86 ;Start of data packet! bcall(_SendAByte) ld a,$15 bcall(_SendAByte) ld hl,(VarLen) ld de,2 add hl,de push hl ld a,l bcall(_SendAByte) pop hl ld a,h bcall(_SendAByte) ld a,(VarLen) ld d,0 ld e,a ld (tempchecksum),de bcall(_SendAByte) ld a,(VarLen+1) ld hl,(tempchecksum) ld d,0 ld e,a add hl,de ld (tempchecksum),hl bcall(_SendAByte) ;Finished packet & program length ld hl,(temppos) ld bc,(VarLen) dataloopsend: push bc ld a,(hl) push hl ld hl,(tempchecksum) ld d,0 ld e,a add hl,de ld (tempchecksum),hl bcall(_SendAByte) pop hl inc hl pop bc dec bc ld a,b or c jr nz,dataloopsend ld hl,(tempchecksum) push hl ld a,l bcall(_SendAByte) ;Send checksum! pop hl ld a,h bcall(_SendAByte) bcall(_RecAByteIO) ;4 byte acknowledge bcall(_RecAByteIO) bcall(_RecAByteIO) bcall(_RecAByteIO) ld a,$86 ;Send EOT bcall(_SendAByte) ld a,$92 bcall(_SendAByte) xor a bcall(_SendAByte) xor a bcall(_SendAByte) bcall(_RecAByteIO) ;Get acknowledge bcall(_RecAByteIO) bcall(_RecAByteIO) bcall(_RecAByteIO) jp Menu86 ;We're done! GetChecksum: ex de,hl ld hl,0 checksum_loop: ld a,(de) push de ld d,0 ld e,a add hl,de pop de inc de dec bc ld a,b or c jr nz,checksum_loop ret ReceiveFrom86: bcall(_clrscrnfull) ld hl,0 ld (currow),hl ld hl,lbl86_link_waiting bcall(_puts) bcall(_newline) bcall(_Rec1stByteNC) ;Is it a 86? cp $86 ret nz bcall(_RecAByteIO) ;Make sure it's a variable cp $06 ret nz ld hl,lbl86_link_receiving bcall(_puts) bcall(_RecAByteIO) ;Skip past garbage :) bcall(_RecAByteIO) bcall(_RecAByteIO) bcall(_RecAByteIO) bcall(_RecAByteIO) ;Get variable type ld (VarType),a bcall(_RecAByteIO) ;Get name length ld (VarNameLen),a ld b,a ld hl,VarName nameloop: push bc push hl bcall(_RecAByteIO) pop hl pop bc ld (hl),a inc hl djnz nameloop bcall(_RecAByteIO) bcall(_RecAByteIO) ld a,$86 bcall(_SendAByte) ld a,$56 bcall(_SendAByte) xor a bcall(_SendAByte) xor a bcall(_SendAByte) ld a,$86 bcall(_SendAByte) bcall(_zeroop1) ld hl,VarName ld de,op1+1 ld b,0 ld a,(VarNameLen) ld c,a ldir ld a,AppVarObj ld (op1),a ld a,$09 bcall(_SendAByte) xor a bcall(_SendAByte) xor a bcall(_SendAByte) bcall(_RecAByteIO) ;it acknowledged bcall(_RecAByteIO) bcall(_RecAByteIO) bcall(_RecAByteIO) bcall(_RecAByteIO) ;receive data packet bcall(_RecAByteIO) bcall(_RecAByteIO) ;whole data length bcall(_RecAByteIO) bcall(_RecAByteIO) ;length of string ld c,a push bc bcall(_RecAByteIO) pop bc ld b,a ld (VarLen),bc ld (CurLen),bc bcall(_chkfindsym) jr c,appvar86noexist bcall(_delvararc) appvar86noexist: ld hl,(VarLen) bcall(_createappvar) ex de,hl inc hl \ inc hl dataloop: push hl bcall(_RecAByteIO) pop hl ld (hl),a inc hl ld bc,(CurLen) dec bc ld (CurLen),bc ld a,b or c jr nz,dataloop bcall(_RecAByteIO) bcall(_RecAByteIO) ld a,$86 bcall(_SendAByte) ld a,$56 bcall(_SendAByte) xor a bcall(_SendAByte) xor a bcall(_SendAByte) bcall(_RecAByteIO) bcall(_RecAByteIO) bcall(_RecAByteIO) bcall(_RecAByteIO) ld a,$86 bcall(_SendAByte) ld a,$56 bcall(_SendAByte) xor a bcall(_SendAByte) xor a bcall(_SendAByte) jp Menu86 main_86_label: .db "86",0 lbl86_menu_send: .db "SEND",0 lbl86_menu_receive: .db "RECV",0 lbl86_link_waiting: .db "Waiting...",0 lbl86_link_receiving: .db "Receiving...",0 spaces: .db " ",0 lbl86_sending: .db "Sending...",0 lbl86_menu_control: .db "RMTE",0 .end