;FRED protection system ;~~~~~~~~~~~~~~~~~~~~~~ ;(c) 1992 Simon Cooke ;Protection system commissioned by FRED software. This copier written over ;the period of about a week, and protection designed for it. The actual game ;was protected in a 24 hour nonstop stint of programming, for release at a ;show -- bugged copies had been sent to me, so I had to work hard as the show ;was next day!!! ;Requires a 1Mb expansion to run ORG &8000 DUMP &8000 DI LD BC,&0FF8 ;clear palette to total blackness blank.loop: DEFB &ED,&71 ;OUT (C),0 DJNZ blank.loop DEFB &ED,&71 IN A,(&FA) ;Store BASIC LD (low.page+1),A ;information LD (sp.store+1),SP IN A,(&FC) LD (scr.page+1),A LD SP,0 ;page in screen, set new stack LD A,4+96 OUT (&FC),A LD HL,installed ;clear installed game name to blank LD DE,installed+1 LD BC,9 LD (HL)," " LDIR CALL clear.map ;clear the copy progress map. LD HL,ecopypalette CALL movecolours CALL fadein ;Fade in E-Copy screen LD A,3+32 OUT (&FA),A CALL test.meg ;Test for 1Mb - error if not ;plugged in... XOR A CALL system_mess ;print copyright/version messages and CALL wait.key ;wait for a key between presses. LD A,1 CALL system_mess CALL wait.key LD A,2 CALL system_mess CALL wait.key LD A,3 CALL system_mess CALL wait.key LD A,32 CALL system_mess ;Main system loop ;~~~~~~~~~~~~~~~~ main.routine: CALL print.disc ;print installed software name in its box LD A,&7F ;check for symbol key to return to basic. IN A,(&FE) RRA RRA JP NC,exit.basic LD A,&DF ;check for F0 key IN A,(&F9) ;(f0 is duplicate) BIT 7,A JP NZ,not.f0 LD A,(install.stat) ;if a game has not been installed, don't OR A ;duplicate it. JP NZ,okay.dupe LD A,5 ;print the error "No game installed" JP error_handle okay.dupe: LD A,R ;print a random message saying "copy in AND 7 ;progress" ADD A,22 CALL system_mess CALL format_disc ;format the disc to the protection specs LD A,3+32 OUT (&FA),A CALL copy_from_meg ;copy the Meg to the disc. XOR A JP error_handle ;send an OK error message not.f0: LD A,&FE ;F1 -- install game IN A,(&F9) BIT 5,A JP NZ,main.routine ;loop if no key pressed LD A,R ;print a random "installing game" message AND 7 ADD A,14 CALL system_mess LD HL,installing.m ;copy "installing" file name to the area LD DE,installed LD BC,10 LDIR CALL print.disc ;print the name in its box XOR A ;set installed status to zero -- not LD (install.stat),A;installed (in case of an error during LD HL,installed ;installation procedure) LD DE,installed+1 LD BC,9 LD (HL)," " LDIR CALL copy_to_meg ;read disc into the meg. LD A,1 LD (install.stat),A;set status to "game installed" LD A,35 OUT (&FA),A CALL installed.name ;put installed name in its box XOR A JP error_handle ;OK message ;Formatter routine ;~~~~~~~~~~~~~~~~~ ;Formats a disc to the specifications laid down by the protection sector map. ;(c)1992 Simon Cooke (modified from Steve's Software one) format_disc: XOR A LD (c.track+1),A LD IX,sector.map LD A,3+32 OUT (&FA),A LD IY,sect1.map CALL clear.map LD C,%00000011 ;send RESTORE To TRACK 0 code to drive CALL sendcommand IN A,(224) ;check status of write protect BIT 6,A JP NZ,wprot main.loop: LD A,&F7 ;check if ESC pressed. If so, abort. IN A,(&F9) BIT 5,A JP NZ,c.track abort_form: LD A,4 ;"Operation aborted" message JP error_handle c.track: LD D,&00 CALL set.ports LD HL,format.data CALL create.map BIT 7,D JP Z,check.1 LD A,(maxside2) ;has side 2 finished being formatted? LD E,A LD A,D CP E JP NC,next.track JP right.track check.1: LD A,(maxside1) ;has side 1 finished being formatted? LD E,A LD A,D CP E JP NC,next.track right.track: CALL get.track ;move disc heads to track LD C,0 ;red bar - formatting this CALL put.bar ;track..... LD B,5 ;10 attempts to format... format.track: PUSH BC LD A,&F7 IN A,(&F9) BIT 5,A JP Z,abort_form LD C,%11110010 ;write track command CALL precomp ;calculate precompensation CALL sendcommand LD HL,format.data ;write format data to disk CALL write.data OR A ;if no error, then verify sectors JP Z,not.loop POP BC ;check for write protect BIT 6,A JP Z,wprot DJNZ format.track ;try formatting again, as error has ;occurred baddy: LD A,2 ;"Bad disc" JP error_handle wprot: LD A,1 ;"Disc is write protected" JP error_handle not.loop: POP BC ;verify written sectors IN A,(225) ;check track. LD (lo.track+1),A PUSH BC ;read sector -- allows for "misaligned" PUSH HL ;sectors as used by protection scheme -- PUSH DE ;sectors with an incorrect address that LD B,(IY) ;have to be loaded by putting the incorrect INC IY ;track in the track register. sectorr.loop: PUSH BC LD A,(IY) INC IY BIT 7,A JR Z,hi.track AND 127 OUT (226),A LD A,&80 OUT (225),A JR sector hi.track: AND 127 OUT (226),A lo.track: LD A,&00 OUT (225),A sector: BIT 7,D JP NZ,routine2 LD C,227 LD A,%10000000 OUT (224),A LD B,20 DJNZ $ JR data.r1 data.r2: IN A,(C) data.r1: IN A,(224) BIT 1,A JP NZ,data.r2 RRCA JP C,data.r1 AND %00001110 JP NZ,baddy JP next.sectorr routine2: LD C,227+4 LD A,%10000000 OUT (228),A LD B,20 DJNZ $ JR data.r3 data.r4: IN A,(C) data.r3: IN A,(228) BIT 1,A JP NZ,data.r4 RRCA JP C,data.r3 AND %00001110 JP NZ,baddy next.sectorr: POP BC DJNZ sectorr.loop POP DE POP HL POP BC LD A,(lo.track+1) OUT (225),A JP next.2 next.track: LD C,2 ;blue bar - unused track here CALL put.bar ;(ie this track is blank) next.2: LD A,(c.track+1) INC A LD (c.track+1),A BIT 7,A JP NZ,side2 CP 84 JP NZ,main.loop ;reached end of format? LD A,128 LD IY,sect2.map LD (c.track+1),A JP main.loop side2: CP 212 JP NZ,main.loop RET get.track: PUSH DE ;move disc head (step in/out) to correct RES 7,D ;track for formatting... gettr2: IN A,(224) BIT 0,A JP NZ,gettr2 tr: IN A,(225) CP D JP Z,exit.track LD A,%01111011 JP NC,stepout LD A,%01011011 stepout: OUT (224),A LD B,20 DJNZ $ JP gettr2 exit.track: POP DE RET precomp: ;calculate write precompensation. LD B,64 LD A,D AND 127 CP 84 JP Z,prec1 SRL B prec1: LD A,D AND B RET Z RES 1,C RET sendcommand: ;send command to disk controller IN A,(224) BIT 0,A JP NZ,sendcommand LD A,C DI comm1: OUT (224),A LD B,20 DJNZ $ RET write.data: ;output data to disc controller LD C,227 JR wrdata write.it: OUTI wrdata: IN A,(224) BIT 1,A JR NZ,write.it BIT 0,A JR NZ,wrdata AND 68 RET ;Create track format data ;~~~~~~~~~~~~~~~~~~~~~~~~ ;Creates the 8k or so of data necessary for a single track on a ;double density 3.5" disk. ;Uses the sector map to decide on misaligned/whatever sectors. create.map: LD A,(IX) INC IX OR A JP Z,set.wfm LD A,1 DEC IX set.wfm: LD (wfm+1),A LD BC,&204E CALL wfm LD B,(IX) INC IX nextsecmap: PUSH BC LD A,(IX) INC IX LD (len2+1),A PUSH HL PUSH DE LD HL,length.table LD E,A LD D,0 ADD HL,DE LD A,(HL) POP DE POP HL LD (len+1),A LD BC,&03F5 CALL wfm LD BC,&01FE CALL wfm BIT 7,(IX) JP NZ,misaligned LD A,D AND 127 LD C,A LD B,1 CALL wfm JP sider misaligned: LD BC,&0180 CALL wfm sider: LD A,D AND 128 RLCA LD C,A LD B,1 CALL wfm sectorr: LD A,(IX) AND 127 LD C,A LD B,1 CALL wfm len2: LD BC,&0103 CALL wfm LD BC,&01F7 CALL wfm LD BC,&164E CALL wfm LD BC,&0C00 CALL wfm LD BC,&03F5 CALL wfm LD BC,&01FB CALL wfm len: LD B,0 length: PUSH BC LD BC,0 CALL wfm POP BC DJNZ length LD BC,&01F7 CALL wfm LD BC,&184E CALL wfm LD BC,&0800 CALL wfm POP BC INC IX DEC B JP NZ,nextsecmap LD BC,&004E CALL wfm CALL wfm CALL wfm CALL wfm wfm: LD A,1 ;wipe track? does if A=1... AND A JR NZ,wfmloop LD C,&00 wfmloop: LD (HL),C INC HL DJNZ wfmloop RET set.ports: LD A,224 BIT 7,D JR Z,side1er LD A,228 side1er: LD (comm1+1),A LD (wrdata+1),A LD (sendcommand+1),A LD (gettr2+1),A LD (stepout+1),A INC A LD (tr+1),A INC A INC A LD (write.data+1),A RET ;Max tracks per side ;~~~~~~~~~~~~~~~~~~~ maxside1: DEFB 82 maxside2: DEFB 210 ;Sector length conversion table: ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ length.table: DEFB 1,1,2,4 ;sectors 128 long cannot be ;formatted using this ;routine... ;Put track bar ;~~~~~~~~~~~~~ ;C=0 - red bar ;C=1 - green bar ; =2 - blue bar ; =3 - grey bar ;Gives visual indication of installation/copying progress. put.bar: LD A,D LD B,bary BIT 7,A JR Z,not.side22 LD B,bary+7 not.side22: AND 127 ADD A,A ADD A,44 LD L,A LD H,B LD A,C OR A JP Z,red.bar CP 1 JP Z,green.bar CP 2 JP Z,blue.bar CP 3 JP Z,grey.bar RET ;Clear.map - makes a line of grey bars 84 across by 2 deep ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clear.map: LD B,84 LD L,44 LD DE,128 clear.loop: LD H,bary CALL grey.bar LD H,bary+7 CALL grey.bar INC L INC L DJNZ clear.loop RET ;Mini-bar put routines for format/read status bar... ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;Speedy. Who knows why they have to be? :) grey.bar: IN A,(&FA) PUSH AF IN A,(&FC) AND 31 OR 32 OUT (&FA),A LD A,H PUSH HL PUSH DE SRL H RR L LD DE,128 LD (HL),&33 ADD HL,DE LD (HL),&32 ADD HL,DE LD (HL),&32 ADD HL,DE LD (HL),&32 ADD HL,DE LD (HL),&32 ADD HL,DE LD (HL),&22 POP DE POP HL POP AF OUT (&FA),A RET red.bar: IN A,(&FA) PUSH AF IN A,(&FC) AND 31 OR 32 OUT (&FA),A LD A,H PUSH HL PUSH DE SRL H RR L LD DE,128 LD (HL),&BB ADD HL,DE LD (HL),&BA ADD HL,DE LD (HL),&BA ADD HL,DE LD (HL),&BA ADD HL,DE LD (HL),&BA ADD HL,DE LD (HL),&AA POP DE POP HL POP AF OUT (&FA),A RET green.bar: IN A,(&FA) PUSH AF IN A,(&FC) AND 31 OR 32 OUT (&FA),A LD A,H PUSH HL PUSH DE SRL H RR L LD DE,128 LD (HL),&99 ADD HL,DE LD (HL),&98 ADD HL,DE LD (HL),&98 ADD HL,DE LD (HL),&98 ADD HL,DE LD (HL),&98 ADD HL,DE LD (HL),&88 POP DE POP HL POP AF OUT (&FA),A RET blue.bar: IN A,(&FA) PUSH AF IN A,(&FC) AND 31 OR 32 OUT (&FA),A LD A,H PUSH HL PUSH DE SRL H RR L LD DE,128 LD (HL),&EE ADD HL,DE LD (HL),&EC ADD HL,DE LD (HL),&EC ADD HL,DE LD (HL),&EC ADD HL,DE LD (HL),&EC ADD HL,DE LD (HL),&CC POP DE POP HL POP AF OUT (&FA),A RET ;Format data - track info... ;~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;If sector > 127 then write misaligned sector (track set to 128 no matter ;what track the sector really is positioned on) ;Each track in turn... sector.map: ;Side 1 ;No' sectors, {sector length (0-3), sector no'} DEFB 5,2,1,3,132,3,130,3,133,3,131 ; 0 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 1 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 2 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 3 DEFB 5,3,1,3,132,3,130,3,133,3,131 ; 4 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 5 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 6 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 7 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 8 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 9 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 10 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 11 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 12 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 13 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 14 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 15 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 16 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 17 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 18 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 19 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 20 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 21 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 22 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 23 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 24 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 25 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 26 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 27 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 28 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 29 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 30 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 31 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 32 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 33 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 34 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 35 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 36 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 37 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 38 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 39 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 40 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 41 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 42 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 43 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 44 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 45 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 46 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 47 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 48 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 49 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 50 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 51 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 52 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 53 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 54 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 55 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 56 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 57 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 58 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 59 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 60 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 61 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 62 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 63 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 64 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 65 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 66 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 67 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 68 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 69 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 70 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 71 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 72 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 73 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 74 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 75 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 76 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 77 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 78 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 79 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 80 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 81 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 82 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 83 ;side 2 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 0 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 1 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 2 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 3 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 4 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 5 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 6 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 7 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 8 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 9 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 10 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 11 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 12 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 13 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 14 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 15 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 16 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 17 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 18 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 19 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 20 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 21 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 22 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 23 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 24 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 25 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 26 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 27 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 28 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 29 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 30 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 31 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 32 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 33 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 34 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 35 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 36 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 37 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 38 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 39 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 40 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 41 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 42 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 43 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 44 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 45 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 46 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 47 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 48 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 49 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 50 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 51 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 52 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 53 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 54 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 55 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 56 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 57 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 58 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 59 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 60 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 61 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 62 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 63 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 64 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 65 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 66 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 67 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 68 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 69 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 70 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 71 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 72 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 73 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 74 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 75 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 76 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 77 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 78 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 79 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 80 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 81 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 82 DEFB 5,3,129,3,132,3,130,3,133,3,131 ; 83 format.data: DEFS &2000 ;System font ;~~~~~~~~~~~ font: MDAT "copyfont" ;System messages ;~~~~~~~~~~~~~~~ ; ------------------------------- message0: DEFM "FRED Copy System Version 001.4d" ;0 - welcome DEFM "Coded by Cookie - 1992 Entropy" ;1 - messages DEFM "Are you sitting comfortably ???" ;2 DEFM " Then we'll begin... " ;3 DEFM "No Meg on the back of this SAM!" ;4 - no meg DEFM "Chuck a disc in that hole, man!" ;5 - no disc DEFM " Operation aborted...... " ;6 - ESC pressed DEFM "Write enable the disc, chum !!!" ;7 - write protect DEFM " No game in memory, no dupe... " ;8 - no game DEFM "I need a game in meg to copy it" ;9 installed DEFM "Uh-oh, FORMAT error - bad disc!" ;10 - format error DEFM "Chuck that disc in the bin, bud" ;11 DEFM "Bad disc, naughty disc... Out!!" ;12 DEFM "Nasty piece of work, that disc!" ;13 DEFM " Installing game - Please Wait " ;14 -installation DEFM "Reading the disc - hold ya hoss" ;15 of game is in DEFM "Slurping that data off the disc" ;16 progress.. DEFM "Grabbing lots of lovely game..." ;17 DEFM "Nicking your prize possession! " ;18 DEFM "Reading the data from the disc " ;19 DEFM "Installing the game in the meg!" ;20 DEFM "Grabbing data from the drive..." ;21 DEFM "Duplicating disc - please wait." ;22 - copying of DEFM "Copying that nasty little game!" ;23 game is in DEFM " Squirting it to the drive ... " ;24 progress. DEFM " Filling the disc with crap... " ;25 DEFM " Throwing up all over the disc " ;26 DEFM "Putting da sectors on now, sir." ;27 DEFM "Cramming data on the disc......" ;28 DEFM " Duping as ordered. " ;29 DEFM " That went well!!! " ;30 - OK message DEFM " Okey Dokey! " ;31 (no errors) DEFM " O.K.! " ;32 DEFM " Yippppeeee! It worked!!!! " ;33 ;Print disc name in INSTALLED DISC box ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ print.disc: LD HL,&5BD7 LD (text.addr+1),HL LD HL,installed LD (text.pos+1),HL LD A,10 LD (text.len+1),A CALL text RET ;Print system message in INFO box ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;A=message (0-34) system_mess: LD HL,&3A82 LD (text.addr+1),HL LD L,A LD H,0 PUSH HL POP DE ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL AND A SBC HL,DE LD DE,message0 ADD HL,DE LD (text.pos+1),HL LD A,31 LD (text.len+1),A CALL text RET ;Text printer ;~~~~~~~~~~~~ text: IN A,(&FA) PUSH AF IN A,(&FC) AND 31 OR 32 OUT (&FA),A text.len: LD B,0 text.pos: LD HL,message0 text.loop: PUSH HL PUSH BC LD L,(HL) LD H,0 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL LD DE,font-1024 ADD HL,DE LD (sp.text+1),SP LD SP,HL text.addr: LD HL,0 LD BC,125 POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D ADD HL,BC POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D ADD HL,BC POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D ADD HL,BC POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D ADD HL,BC POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D ADD HL,BC POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D ADD HL,BC POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D ADD HL,BC POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D sp.text: LD SP,&0000 LD HL,(text.addr+1) LD DE,4 ADD HL,DE LD (text.addr+1),HL POP BC POP HL INC HL DJNZ text.loop POP AF OUT (&FA),A RET ;Fade in colours ;~~~~~~~~~~~~~~~ fadein: LD B,9 LD D,8 fadein1: LD C,16 LD HL,palette EXX LD HL,temppalette EXX fadein2: PUSH DE LD A,(HL) INC D DEC D JP Z,nofadein fadein3: PUSH DE CALL dropdown POP DE DEC D JP NZ,fadein3 nofadein: INC HL EXX LD (HL),A INC HL EXX POP DE DEC C JP NZ,fadein2 EXX LD B,10 fadeinfly: IN A,(&F9) BIT 3,A JP NZ,fadeinfly DJNZ fadeinfly LD HL,temppalette+15 LD BC,&10F8 OTDR EXX DEC D DJNZ fadein1 RET dropdown: OR A RET Z XOR 8 BIT 3,A RET Z dropblue: LD D,A AND 17 JP NZ,nextdown1 LD A,D JP dropred nextdown1: AND 1 JP Z,drophighblue LD A,D AND 126 JP dropred drophighblue: LD A,D AND 111 OR 1 dropred: LD D,A AND 34 JP NZ,nextdown2 LD A,D JP dropgreen nextdown2: AND 2 JP Z,drophighred LD A,D AND 125 JP dropgreen drophighred: LD A,D AND 127-32 OR 2 dropgreen: LD D,A AND 68 JP NZ,nextdown3 LD A,D RET nextdown3: AND 4 JP Z,drophighgreen LD A,D AND 123 RET drophighgreen: LD A,D AND 63 OR 4 RET movecolours: LD DE,palette LD BC,16 LDIR RET palette: DEFS 16 temppalette: DEFS 16 ;Screen palette ;~~~~~~~~~~~~~~ ecopypalette: DEFB 0,8,7,15,112,120,119,127,64,68,32,34,17,96 DEFB 23,31 ;Return to BASIC ;~~~~~~~~~~~~~~~ exit.basic: low.page: LD A,0 OUT (&FA),A sp.store: LD SP,&0000 scr.page: LD A,0 OUT (&FC),A EI RET ;Currently installed game's name ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ installed: DEFM " " installing.m: DEFM "Installing" install.stat: DEFB 0 ;Error handler ;~~~~~~~~~~~~~ error_handle: LD SP,&0000 OR A JP Z,no.error CP 1 JP Z,write.prot CP 2 JP Z,bad.disc CP 3 JP Z,no.disc CP 4 JP Z,abort CP 5 JP Z,non.install CP 6 JP NZ,main.routine LD A,4 CALL system_mess CALL flash LD A,(low.page+1) ;Reset if no Meg is in back OUT (&FA),A ;of SAM RST 0 no.error: LD A,R AND 1 ADD A,31 CALL system_mess CALL clear.map JP main.routine write.prot: LD A,7 CALL system_mess CALL flash JP no.error no.disc: LD A,5 CALL system_mess CALL flash JP no.error bad.disc: LD A,R AND 3 ADD A,10 CALL system_mess CALL flash JP no.error non.install: LD A,R AND 1 ADD A,8 CALL system_mess CALL flash JP no.error abort: LD A,6 CALL system_mess CALL flash JP no.error flash: CALL wait.nokey ;wait until no key is pressed. LD E,32 LD BC,&00F8 flash.2: ;flash screen RED LD D,12 ;and wait for a key to be pressed. flash.1: IN A,(&F9) BIT 3,A JP NZ,flash.1 XOR A IN A,(&FE) AND 31 LD H,A XOR A IN A,(&F9) AND 224 OR H CPL OR A JP NZ,wait.nokey DEC D JP NZ,flash.1 OUT (C),E LD A,E XOR 32 LD E,A JP flash.2 ;Wait for key press ;~~~~~~~~~~~~~~~~~~ wait.key: XOR A IN A,(&FE) AND 31 LD E,A XOR A IN A,(&F9) AND 224 OR E CPL OR A JP Z,wait.key wait.nokey: XOR A IN A,(&FE) AND 31 LD E,A XOR A IN A,(&F9) AND 224 OR E CPL OR A JP NZ,wait.nokey OUT (&F8),A ;blank palette 0 RET ;Main copy screen ;~~~~~~~~~~~~~~~~ ORG &8000 ;Merge in main screen DUMP 4,0 MDAT "e-copy" ;Routines using the Meg all sit here: ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ORG 0 DUMP 3,0 ;Test for presence of a meg on the back of the SAM test.meg: LD (sp.meg+1),SP LD SP,&4000 CALL set.external LD E,0 ;meg 0 present? CALL test.page OR A JP NZ,okay.meg LD E,64 ;meg 1 present? CALL test.page OR A JP NZ,okay.meg LD E,128 ;meg 2 present? CALL test.page OR A JP NZ,okay.meg LD E,192 ;meg 3 present? CALL test.page OR A JP NZ,okay.meg CALL set.internal sp.meg: LD SP,&0000 LD A,6 JP error_handle ; oops! - no meg present! okay.meg: LD A,E ;meg has been found. LD (meg.pages),A exit.meg: CALL set.internal ;return, no error. LD SP,(sp.meg+1) RET ;write a byte to external memory, read it back in 20ms later. If the two ;values are not equal, no meg is present. test.page: LD A,E OUT (&80),A LD B,0 test.data: LD A,B LD (32768),A PUSH BC LD B,20 DJNZ $ POP BC LD A,(32768) CP B JP NZ,no.meg DJNZ test.data OR A RET no.meg: XOR A RET ;This variable is the top 2 bits for the page addresses using ;the Meg. meg.pages: DEFB 0 ;Set internal memory paging ;~~~~~~~~~~~~~~~~~~~~~~~~~~ set.internal: PUSH AF IN A,(&FB) AND 31 OUT (&FB),A POP AF RET ;Set external memory paging ;~~~~~~~~~~~~~~~~~~~~~~~~~~ set.external: PUSH AF IN A,(&FB) OR 128 OUT (&FB),A POP AF RET ;Put installed disc name in high memory ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ installed.name: LD (sp.meg+1),SP LD SP,&4000 CALL set.external LD A,(meg.pages) OUT (&80),A LD HL,32768+210 LD A,(HL) OR A JP Z,samdos2.head LD DE,name.buffer LD BC,10 LDIR move.high: CALL set.internal LD HL,name.buffer sam2.head: LD DE,installed LD BC,10 LDIR JP exit.meg samdos2.head: CALL set.internal LD HL,samdos2.name JP sam2.head ;Read all sectors into Meg ;~~~~~~~~~~~~~~~~~~~~~~~~~ ;Uses misaligned sector map to read sectors -- ie reads the protected discs ;with no trouble at all. copy_to_meg: LD (sp.meg+1),SP LD SP,&4000 CALL set.internal LD A,(maxside1) LD (maxmeg1+1),A LD A,(maxside2) LD (maxmeg2+1),A LD A,&E0 LD (port3+1),A LD (port4+1),A LD A,&E3 LD (porta2+1),A LD D,&00 ;first track = 0 LD IX,sect1.map LD HL,32768 ;address to read to LD (meg.address+1),HL XOR A LD (meg.page+1),A ;initial Meg page... meg.track: CALL get.track CALL read.sectors CALL set.internal LD (sp.storer+1),SP LD SP,(sp.meg+1) LD C,1 ;progress of read. CALL put.bar sp.storer: LD SP,&0000 LD A,D INC A LD D,A BIT 7,A JP NZ,maxmeg2 maxmeg1: CP 82 JP C,meg.track LD IX,sect2.map LD D,128 LD A,&E4 LD (port3+1),A LD (port4+1),A LD A,&E7 LD (porta2+1),A JP meg.track maxmeg2: CP 210 JP C,meg.track JP exit.meg ;Read sectors into 1Mb depending on sector map status ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ read.sectors: IN A,(224) ;wait not buzy BIT 0,A JP NZ,read.sectors CALL set.internal side1.reader: LD B,(IX) ;number of sectors INC IX sector.readl1: PUSH BC LD A,D AND 127 OUT (225),A LD A,(IX) ;get sector number INC IX ;and misaligned data BIT 7,A JP Z,not.misread1 PUSH AF LD A,&80 ;set track register to OUT (225),A ;128... (misaligned) POP AF not.misread1: AND 127 ;set sector to read OUT (226),A sect.read: CALL read.sect POP BC DJNZ sector.readl1 LD A,D AND 127 OUT (225),A CALL set.internal RET ;Read side 1 sector into meg ;~~~~~~~~~~~~~~~~~~~~~~~~~~~ read.sect: CALL set.external wait.not.bzy1: IN A,(224) RRA JP C,wait.not.bzy1 LD B,5 ;5 attempted sector reads reads1.loop: PUSH BC LD A,&F7 IN A,(&F9) BIT 5,A JP NZ,meg.address CALL set.internal LD A,4 JP error_handle meg.address: LD HL,&0000 meg.page: LD E,&00 LD A,(meg.pages) XOR E OUT (&80),A ;set C,D external sections INC A OUT (&81),A porta2: LD BC,&00E3 LD A,%10001000 port4: OUT (224),A LD B,20 ;wait approx 20ms DJNZ $ JR reads1.2 reads1.1: INI reads1.2: port3: IN A,(224) BIT 1,A JR NZ,reads1.1 RRCA JR C,reads1.2 AND %00001110 JP Z,okay.reads1 POP BC DJNZ reads1.loop CALL set.internal LD A,2 ;failed sector read JP error_handle okay.reads1: POP BC BIT 6,H JP Z,not.inc.page1 LD A,(meg.page+1) INC A AND 63 LD (meg.page+1),A RES 6,H not.inc.page1: LD (meg.address+1),HL CALL set.internal RET ;Write all sectors to disc ;~~~~~~~~~~~~~~~~~~~~~~~~~ copy_from_meg: LD (sp.meg+1),SP LD SP,&4000 CALL set.internal LD A,(maxside1) LD (maxmeg1w+1),A LD A,(maxside2) LD (maxmeg2w+1),A LD A,&E0 LD (port1+1),A LD (port2+1),A LD A,&E3 LD (porta1+1),A LD D,&00 ;first track = 0 LD IX,sect1.map LD HL,32768 ;address to read to LD (meg.address+1),HL XOR A LD (meg.page+1),A ;initial Meg page... meg.trackw: CALL get.track CALL write.sectors CALL set.internal LD (sp.storer2+1),SP LD SP,(sp.meg+1) LD C,1 CALL put.bar sp.storer2: LD SP,&0000 LD A,D INC A LD D,A BIT 7,A JP NZ,maxmeg2w maxmeg1w: CP 82 JP C,meg.trackw LD IX,sect2.map LD A,&E4 LD (port1+1),A LD (port2+1),A LD A,&E7 LD (porta1+1),A LD D,128 JP meg.trackw maxmeg2w: CP 210 JP C,meg.trackw JP exit.meg ;Write sectors to disc depending on sector map status ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ write.sectors: IN A,(224) ;wait not buzy BIT 0,A JP NZ,write.sectors CALL set.internal side1.writer: LD B,(IX) ;number of sectors INC IX sector.write1: PUSH BC LD A,D AND 127 OUT (225),A LD A,(IX) ;get sector number INC IX ;and misaligned data BIT 7,A JP Z,not.miswrit1 PUSH AF LD A,&80 ;set track register to OUT (225),A ;128... (misaligned) POP AF not.miswrit1: AND 127 ;set sector to read OUT (226),A sect.write: CALL write.sect POP BC DJNZ sector.write1 LD A,D AND 127 OUT (225),A CALL set.internal RET ;Write side 1 sector to disc ;~~~~~~~~~~~~~~~~~~~~~~~~~~~ write.sect: CALL set.external not.buzwr1: ;wait not buzy IN A,(224) RRA JP C,not.buzwr1 LD B,5 ;5 attempted sector writes write1.loop: PUSH BC LD A,&F7 IN A,(&F9) BIT 5,A JP NZ,meg.addres2 CALL set.internal LD A,4 JP error_handle meg.addres2: LD HL,(meg.address+1) LD A,(meg.page+1) LD E,A LD A,(meg.pages) XOR E OUT (&80),A ;set C,D external sections INC A OUT (&81),A CALL set.internal LD C,%10101010 CALL precomp CALL set.external LD A,C porta1: LD BC,&00E3 port1: OUT (224),A LD B,20 ;wait approx 20ms DJNZ $ JR write1.2 write1.1: OUTI write1.2: port2: IN A,(224) BIT 1,A JR NZ,write1.1 RRCA JR C,write1.2 AND %00101110 JP Z,okay.write1 POP BC DJNZ write1.loop BIT 5,A JP NZ,wrprotc CALL set.internal LD A,2 ;failed sector write JP error_handle wrprotc: CALL set.internal LD A,1 JP error_handle okay.write1: POP BC BIT 6,H JP Z,not.inc.pagw1 LD A,(meg.page+1) INC A AND 63 LD (meg.page+1),A RES 6,H not.inc.pagw1: LD (meg.address+1),HL CALL set.internal RET ;Sector read/write map ;~~~~~~~~~~~~~~~~~~~~~ sect1.map: DEFB 5,1,130,131,132,133 ;0 DEFB 5,129,130,131,132,133 ;1 DEFB 5,129,130,131,132,133 ;2 DEFB 5,129,130,131,132,133 ;3 DEFB 5,1,130,131,132,133 ;4 DEFB 5,129,130,131,132,133 ;5 DEFB 5,129,130,131,132,133 ;6 DEFB 5,129,130,131,132,133 ;7 DEFB 5,129,130,131,132,133 ;8 DEFB 5,129,130,131,132,133 ;9 DEFB 5,129,130,131,132,133 ;10 DEFB 5,129,130,131,132,133 ;11 DEFB 5,129,130,131,132,133 ;12 DEFB 5,129,130,131,132,133 ;13 DEFB 5,129,130,131,132,133 ;14 DEFB 5,129,130,131,132,133 ;15 DEFB 5,129,130,131,132,133 ;16 DEFB 5,129,130,131,132,133 ;17 DEFB 5,129,130,131,132,133 ;18 DEFB 5,129,130,131,132,133 ;19 DEFB 5,129,130,131,132,133 ;20 DEFB 5,129,130,131,132,133 ;21 DEFB 5,129,130,131,132,133 ;22 DEFB 5,129,130,131,132,133 ;23 DEFB 5,129,130,131,132,133 ;24 DEFB 5,129,130,131,132,133 ;25 DEFB 5,129,130,131,132,133 ;26 DEFB 5,129,130,131,132,133 ;27 DEFB 5,129,130,131,132,133 ;28 DEFB 5,129,130,131,132,133 ;29 DEFB 5,129,130,131,132,133 ;30 DEFB 5,129,130,131,132,133 ;31 DEFB 5,129,130,131,132,133 ;32 DEFB 5,129,130,131,132,133 ;33 DEFB 5,129,130,131,132,133 ;34 DEFB 5,129,130,131,132,133 ;35 DEFB 5,129,130,131,132,133 ;36 DEFB 5,129,130,131,132,133 ;37 DEFB 5,129,130,131,132,133 ;38 DEFB 5,129,130,131,132,133 ;39 DEFB 5,129,130,131,132,133 ;40 DEFB 5,129,130,131,132,133 ;41 DEFB 5,129,130,131,132,133 ;42 DEFB 5,129,130,131,132,133 ;43 DEFB 5,129,130,131,132,133 ;44 DEFB 5,129,130,131,132,133 ;45 DEFB 5,129,130,131,132,133 ;46 DEFB 5,129,130,131,132,133 ;47 DEFB 5,129,130,131,132,133 ;48 DEFB 5,129,130,131,132,133 ;49 DEFB 5,129,130,131,132,133 ;50 DEFB 5,129,130,131,132,133 ;51 DEFB 5,129,130,131,132,133 ;52 DEFB 5,129,130,131,132,133 ;53 DEFB 5,129,130,131,132,133 ;54 DEFB 5,129,130,131,132,133 ;55 DEFB 5,129,130,131,132,133 ;56 DEFB 5,129,130,131,132,133 ;57 DEFB 5,129,130,131,132,133 ;58 DEFB 5,129,130,131,132,133 ;59 DEFB 5,129,130,131,132,133 ;60 DEFB 5,129,130,131,132,133 ;61 DEFB 5,129,130,131,132,133 ;62 DEFB 5,129,130,131,132,133 ;63 DEFB 5,129,130,131,132,133 ;64 DEFB 5,129,130,131,132,133 ;65 DEFB 5,129,130,131,132,133 ;66 DEFB 5,129,130,131,132,133 ;67 DEFB 5,129,130,131,132,133 ;68 DEFB 5,129,130,131,132,133 ;69 DEFB 5,129,130,131,132,133 ;70 DEFB 5,129,130,131,132,133 ;71 DEFB 5,129,130,131,132,133 ;72 DEFB 5,129,130,131,132,133 ;73 DEFB 5,129,130,131,132,133 ;74 DEFB 5,129,130,131,132,133 ;75 DEFB 5,129,130,131,132,133 ;76 DEFB 5,129,130,131,132,133 ;77 DEFB 5,129,130,131,132,133 ;78 DEFB 5,129,130,131,132,133 ;79 DEFB 5,129,130,131,132,133 ;80 DEFB 5,129,130,131,132,133 ;81 DEFB 5,129,130,131,132,133 ;82 DEFB 5,129,130,131,132,133 ;83 sect2.map: DEFB 5,129,130,131,132,133 ;0 DEFB 5,129,130,131,132,133 ;1 DEFB 5,129,130,131,132,133 ;2 DEFB 5,129,130,131,132,133 ;3 DEFB 5,129,130,131,132,133 ;4 DEFB 5,129,130,131,132,133 ;5 DEFB 5,129,130,131,132,133 ;6 DEFB 5,129,130,131,132,133 ;7 DEFB 5,129,130,131,132,133 ;8 DEFB 5,129,130,131,132,133 ;9 DEFB 5,129,130,131,132,133 ;10 DEFB 5,129,130,131,132,133 ;11 DEFB 5,129,130,131,132,133 ;12 DEFB 5,129,130,131,132,133 ;13 DEFB 5,129,130,131,132,133 ;14 DEFB 5,129,130,131,132,133 ;15 DEFB 5,129,130,131,132,133 ;16 DEFB 5,129,130,131,132,133 ;17 DEFB 5,129,130,131,132,133 ;18 DEFB 5,129,130,131,132,133 ;19 DEFB 5,129,130,131,132,133 ;20 DEFB 5,129,130,131,132,133 ;21 DEFB 5,129,130,131,132,133 ;22 DEFB 5,129,130,131,132,133 ;23 DEFB 5,129,130,131,132,133 ;24 DEFB 5,129,130,131,132,133 ;25 DEFB 5,129,130,131,132,133 ;26 DEFB 5,129,130,131,132,133 ;27 DEFB 5,129,130,131,132,133 ;28 DEFB 5,129,130,131,132,133 ;29 DEFB 5,129,130,131,132,133 ;30 DEFB 5,129,130,131,132,133 ;31 DEFB 5,129,130,131,132,133 ;32 DEFB 5,129,130,131,132,133 ;33 DEFB 5,129,130,131,132,133 ;34 DEFB 5,129,130,131,132,133 ;35 DEFB 5,129,130,131,132,133 ;36 DEFB 5,129,130,131,132,133 ;37 DEFB 5,129,130,131,132,133 ;38 DEFB 5,129,130,131,132,133 ;39 DEFB 5,129,130,131,132,133 ;40 DEFB 5,129,130,131,132,133 ;41 DEFB 5,129,130,131,132,133 ;42 DEFB 5,129,130,131,132,133 ;43 DEFB 5,129,130,131,132,133 ;44 DEFB 5,129,130,131,132,133 ;45 DEFB 5,129,130,131,132,133 ;46 DEFB 5,129,130,131,132,133 ;47 DEFB 5,129,130,131,132,133 ;48 DEFB 5,129,130,131,132,133 ;49 DEFB 5,129,130,131,132,133 ;50 DEFB 5,129,130,131,132,133 ;51 DEFB 5,129,130,131,132,133 ;52 DEFB 5,129,130,131,132,133 ;53 DEFB 5,129,130,131,132,133 ;54 DEFB 5,129,130,131,132,133 ;55 DEFB 5,129,130,131,132,133 ;56 DEFB 5,129,130,131,132,133 ;57 DEFB 5,129,130,131,132,133 ;58 DEFB 5,129,130,131,132,133 ;59 DEFB 5,129,130,131,132,133 ;60 DEFB 5,129,130,131,132,133 ;61 DEFB 5,129,130,131,132,133 ;62 DEFB 5,129,130,131,132,133 ;63 DEFB 5,129,130,131,132,133 ;64 DEFB 5,129,130,131,132,133 ;65 DEFB 5,129,130,131,132,133 ;66 DEFB 5,129,130,131,132,133 ;67 DEFB 5,129,130,131,132,133 ;68 DEFB 5,129,130,131,132,133 ;69 DEFB 5,129,130,131,132,133 ;70 DEFB 5,129,130,131,132,133 ;71 DEFB 5,129,130,131,132,133 ;72 DEFB 5,129,130,131,132,133 ;73 DEFB 5,129,130,131,132,133 ;74 DEFB 5,129,130,131,132,133 ;75 DEFB 5,129,130,131,132,133 ;76 DEFB 5,129,130,131,132,133 ;77 DEFB 5,129,130,131,132,133 ;78 DEFB 5,129,130,131,132,133 ;79 DEFB 5,129,130,131,132,133 ;80 DEFB 5,129,130,131,132,133 ;81 DEFB 5,129,130,131,132,133 ;82 DEFB 5,129,130,131,132,133 ;83 ;Buffer space ;~~~~~~~~~~~~ name.buffer: DEFS 10 samdos2.name: DEFM " SAMDOS 2 " ;Equates ;~~~~~~~ bary: EQU 80 ;yposition for format bars...