├── .gitignore ├── Makefile ├── README.md ├── addfil.s ├── addrel.s ├── block.s ├── close.s ├── common.s ├── copall.s ├── copset.s ├── dos.cfg ├── dos.s ├── dskint.sf.s ├── duplct.s ├── equate.sf.s ├── erproc.s ├── fndrel.s ├── frets.s ├── getact.s ├── i_odef.sf.s ├── idle...sf.s ├── irq.s ├── jobs...sf.s ├── lcc.bingcr.s ├── lcc.cntrl.s ├── lcc.conhdr.s ├── lcc.end.s ├── lcc.fmt1.s ├── lcc.fmt2.s ├── lcc.fmt3.s ├── lcc.fmt4.s ├── lcc.gcrbin.s ├── lcc.i_o.s ├── lcc.init.s ├── lcc.read.s ├── lcc.seek.s ├── lcc.util.s ├── lcc.var.s ├── lcc.wrt.s ├── leds.s ├── lookup.s ├── lstdir.s ├── map.s ├── memrw.s ├── new.s ├── newss.s ├── nulbuf.s ├── opchnl.s ├── open.s ├── parsex.s ├── ramvar.sf.s ├── record.s ├── rel1.s ├── rel2.s ├── rel3.s ├── rel4.s ├── rename.s ├── rom....sf.s ├── romtbl.sf.s ├── scrtch.s ├── ser.atn.s ├── ser.listn.s ├── ser.talk.s ├── setdrv.s ├── ssend.s ├── sstest.s ├── ssutil.s ├── system.s ├── trnsfr.s ├── tst2.s ├── tst3.s ├── tst4.s ├── tstflg.s ├── tstfnd.s ├── tsutil.s ├── utlodr.s ├── vector.s └── verdir.s /.gitignore: -------------------------------------------------------------------------------- 1 | *.bin 2 | *.map 3 | *.o 4 | *.lbl 5 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | ca65 -g dos.s 3 | ld65 -C dos.cfg -o dos.bin dos.o -Ln dos.lbl -m dos.map 4 | 5 | clean: 6 | rm dos.o dos.bin 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Commodore 1541 DOS ROM Source Code 2 | 3 | This is based on the [reconstruction](https://github.com/mist64/cbmsrc) of the Comodore 1541 DOS ROM. The source has been adapted to work with the cc65/ca65 assembler. All original symbols and comments are intact. 4 | 5 | The history of the repository contains all versions from the 1540 to the 1541-II: 6 | 7 | | Revision | Part Numbers | Description | 8 | |----------|----------------------|----------------------------| 9 | | 1371125 | 325302-01, 325303-01 | 1540 | 10 | | 1b7ccc4 | 325302-01, 901229-01 | 1541 (original) | 11 | | 11fa875 | 325302-01, 901229-02 | 1541 (update) | 12 | | 1109aa1 | 325302-01, 901229-03 | 1541 (update) | 13 | | bfaf45a | 325302-01, 901229-05 | 1541 (short board) | 14 | | bd9aae0 | 325302-01, 901229-06 | 1541 (short board, update) | 15 | | 543e4b0 | 251968-01 | 1541C (original) | 16 | | cd67762 | 251968-02 | 1541C (updated) | 17 | | HEAD | 251968-03 | 1541-II | 18 | 19 | All versions build into the exact ROM images, except for checksum and signature bytes. 20 | 21 | This makes this repository not just a great base for custom 1541 DOS ROMs, but also a great resource to research ROM differences. 22 | 23 | ## Building 24 | 25 | * Use `make` to build. 26 | * Requires [cc65](https://github.com/cc65/cc65). 27 | * The resulting file `dos.bin` is the full `$C000`-`$FFFF` image. 28 | * The only differences are the checksum bytes at `$C000` and `$FEE6` and the signature byte at `$FFE5`. 29 | 30 | ## Credits 31 | 32 | This version is maintained by Michael Steil , [www.pagetable.com](https://www.pagetable.com/) -------------------------------------------------------------------------------- /addfil.s: -------------------------------------------------------------------------------- 1 | ; add file to directory 2 | addfil lda sa ;save variables 3 | pha 4 | lda lindx 5 | pha 6 | lda sector 7 | pha 8 | lda track 9 | pha 10 | lda #irsa 11 | sta sa 12 | jsr curblk ;use last accessed search 13 | lda type 14 | pha 15 | lda fildrv 16 | and #1 17 | sta drvnum 18 | ldx jobnum 19 | eor lstjob,x 20 | lsr a 21 | bcc af08 ;same drive as required 22 | ldx #1 23 | stx delind ;look for deleted entry 24 | jsr srchst 25 | beq af15 ;all full, new sector 26 | bne af20 ;found one 27 | af08 lda delsec 28 | beq af10 ;deleted entry not located 29 | cmp sector 30 | beq af20 ;sector is resident 31 | sta sector 32 | jsr drtrd ;read sector in 33 | jmp af20 34 | af10 lda #1 ;find deleted entry 35 | sta delind 36 | jsr search 37 | bne af20 38 | af15 jsr nxdrbk ;all full, new sector 39 | lda sector 40 | sta delsec 41 | lda #2 42 | sta delind 43 | af20 lda delind 44 | jsr setpnt 45 | pla 46 | sta type ;set type 47 | cmp #reltyp 48 | bne af25 49 | ora #$80 50 | af25 51 | jsr putbyt 52 | pla 53 | sta filtrk ;...table & entry 54 | jsr putbyt 55 | pla 56 | sta filsec ;set sector link in... 57 | jsr putbyt ;...table & entry 58 | jsr getact 59 | tay 60 | lda filtbl 61 | tax 62 | lda #16 63 | jsr trname ;transfer name 64 | ldy #16 65 | lda #0 ;clear # of blocks &... 66 | af30 sta (dirbuf),y ;...& replace links 67 | iny 68 | cpy #27 69 | bcc af30 70 | lda type ;a relative file ? 71 | cmp #reltyp 72 | bne af50 ;no 73 | ldy #16 ;yes 74 | lda trkss ;get ss track 75 | sta (dirbuf),y ;put in directory 76 | iny 77 | lda secss ;get ss sector 78 | sta (dirbuf),y ;put in 79 | iny 80 | lda rec ;get record size 81 | sta (dirbuf),y 82 | af50 jsr drtwrt ;write it out 83 | pla 84 | sta lindx 85 | tax 86 | pla 87 | sta sa 88 | lda delsec 89 | sta entsec 90 | sta dsec,x 91 | lda delind 92 | sta entind 93 | sta dind,x 94 | lda type 95 | sta pattyp 96 | lda drvnum 97 | sta fildrv 98 | rts 99 | ; 100 | -------------------------------------------------------------------------------- /addrel.s: -------------------------------------------------------------------------------- 1 | ;********************************* 2 | ;* addrel: add blocks to relative* 3 | ;* file. * 4 | ;* vars: * 5 | ;* regs: * 6 | ;* * 7 | ;********************************* 8 | ; 9 | addrel 10 | jsr setdrn 11 | jsr ssend ;set up end of file 12 | jsr posbuf 13 | jsr dbset 14 | lda ssind 15 | sta r1 ;save ss index 16 | lda ssnum 17 | sta r0 ;save ss number 18 | lda #0 19 | sta r2 ;clear flag for one block 20 | ; 21 | lda #0 ;clear for calculation... 22 | sta recptr ;...to 1st byte in record 23 | jsr fndrel ;calc ss ptrs 24 | addr1 ; entry for rel record fix 25 | jsr numfre ;calc available... 26 | ; 27 | ldy lindx ;record span? 28 | ldx rs,y 29 | dex 30 | txa 31 | clc 32 | adc relptr 33 | bcc ar10 ;no span 34 | ; 35 | inc ssind ;inc ss ptrs & check 36 | inc ssind ;inc ss ptrs & check 37 | bne ar10 38 | inc ssnum 39 | lda #ssioff 40 | sta ssind 41 | ar10 42 | lda r1 43 | clc 44 | adc #2 45 | jsr setssp 46 | ; 47 | lda ssnum 48 | cmp #nssl 49 | bcc ar25 ;valid range 50 | ; 51 | ar20 52 | lda #bigfil 53 | jsr cmderr ;too many ss's 54 | ar25 55 | lda ssind ;calc # blocks needed... 56 | sec ;...& check against avail. 57 | sbc r1 58 | bcs ar30 59 | sbc #ssioff-1 60 | clc 61 | ar30 62 | sta t3 ;# ss indices 63 | lda ssnum 64 | sbc r0 65 | sta t4 ;# ss needed 66 | ; 67 | ldx #0 ;clear accum. 68 | stx t1 69 | stx t2 70 | tax ;.x=# ss 71 | jsr sscalc ;calc # of blocks needed 72 | ; 73 | lda t2 74 | bne ar35 75 | ldx t1 76 | dex 77 | bne ar35 78 | ; 79 | inc r2 80 | ar35 81 | cmp nbtemp+1 82 | bcc ar40 ;ok!! 83 | bne ar20 84 | lda nbtemp 85 | cmp t1 86 | bcc ar20 ;not enuf blocks 87 | ar40 88 | lda #1 89 | jsr drdbyt ;look at sector link 90 | clc 91 | adc #1 ;+1 is nr 92 | ldx lindx 93 | sta nr,x 94 | jsr nxtts ;get next block... 95 | jsr setlnk ;...& set link. 96 | lda r2 97 | bne ar50 ;add one block 98 | ; 99 | jsr wrtout ;write current last rec 100 | ar45 101 | jsr dblbuf ;switch bufs 102 | jsr sethdr ;set hdr from t & s 103 | jsr nxtts ;get another 104 | jsr setlnk ;set up link 105 | jsr nulbuf ;clean it out 106 | jmp ar55 107 | ar50 108 | jsr dblbuf ;switch bufs 109 | jsr sethdr ;set hdr from t & s 110 | jsr nulbuf ;clean buffer 111 | jsr nullnk ;last block =0,lstchr 112 | ar55 113 | jsr wrtout ;write buffer 114 | jsr getlnk ;get t&s from link 115 | lda track 116 | pha ;save 'em 117 | lda sector 118 | pha 119 | jsr gethdr ;now get hdr t&s 120 | lda sector 121 | pha ;save 'em 122 | lda track 123 | pha 124 | jsr gsspnt ;check ss ptr 125 | tax 126 | bne ar60 127 | ; 128 | jsr newss ;need another ss 129 | lda #ssioff 130 | jsr setssp ;.a=bt val 131 | inc r0 ;advance ss count 132 | ar60 133 | pla 134 | jsr putss ;record t&s... 135 | pla 136 | jsr putss ;...in ss. 137 | pla ;get t&s from link 138 | sta sector 139 | pla 140 | sta track 141 | beq ar65 ;t=0: that's all!! 142 | ; 143 | lda r0 144 | cmp ssnum 145 | bne ar45 ;not even done yet 146 | ; 147 | jsr gsspnt 148 | cmp ssind 149 | bcc ar45 ;almost done 150 | beq ar50 ;one more block left 151 | ar65 152 | jsr gsspnt 153 | pha 154 | lda #0 155 | jsr ssdir 156 | lda #0 157 | tay 158 | sta (dirbuf),y 159 | iny 160 | pla 161 | sec 162 | sbc #1 163 | sta (dirbuf),y 164 | jsr wrtss ;write ss 165 | jsr watjob 166 | jsr mapout 167 | jsr fndrel 168 | jsr dblbuf ;get back to leading buffer 169 | jsr sspos 170 | bvs ar70 171 | jmp positn 172 | ar70 173 | lda #lrf 174 | jsr setflg 175 | lda #norec 176 | jsr cmderr 177 | ; jsr dblbuf 178 | -------------------------------------------------------------------------------- /block.s: -------------------------------------------------------------------------------- 1 | ; rom 1.1 additions 2 | ; user commands 3 | user ldy cmdbuf+1 4 | cpy #'0 5 | bne us10 ;0 resets pntr 6 | usrint lda #ublock 9 | sta usrjmp+1 10 | rts 11 | us10 jsr usrexc ;execute code by table 12 | jmp endcmd 13 | usrexc dey ;entry is(((index-1)and$f)*2) 14 | tya 15 | and #$f 16 | asl a 17 | tay 18 | lda (usrjmp),y 19 | sta ip 20 | iny 21 | lda (usrjmp),y 22 | sta ip+1 23 | jmp (ip) 24 | ; open direct access buffer 25 | ; from open "#" 26 | opnblk lda lstdrv 27 | sta drvnum 28 | lda sa ;sa is destroyed by this patch 29 | pha 30 | jsr autoi ;init disk for proper channel assignment 31 | pla ;restore sa 32 | sta sa 33 | ldx cmdsiz 34 | dex 35 | bne ob10 36 | lda #1 ;get any buffer 37 | jsr getrch 38 | jmp ob30 39 | ob05 lda #nochnl 40 | jmp cmderr 41 | ob10 ldy #1 ;buffer # is requested 42 | jsr bp05 43 | ldx filsec 44 | cpx #bfcnt ;must be less than 13. 45 | bcs ob05 46 | lda #0 47 | sta temp 48 | sta temp+1 49 | sec 50 | ob15 51 | rol temp 52 | rol temp+1 53 | dex 54 | bpl ob15 55 | lda temp 56 | and bufuse 57 | bne ob05 ;buffer is used 58 | lda temp+1 59 | and bufuse+1 60 | bne ob05 ;buf is used 61 | lda temp 62 | ora bufuse ;set buffer as used 63 | sta bufuse 64 | lda temp+1 65 | ora bufuse+1 66 | sta bufuse+1 67 | lda #0 ;set up channel 68 | jsr getrch 69 | ldx lindx 70 | lda filsec 71 | sta buf0,x 72 | tax 73 | lda drvnum 74 | sta jobs,x 75 | sta lstjob,x 76 | ob30 ldx sa 77 | lda lintab,x ;set lindx table 78 | ora #$40 79 | sta lintab,x 80 | ldy lindx 81 | lda #$ff 82 | sta lstchr,y 83 | lda #rndrdy 84 | sta chnrdy,y ;set channel ready 85 | lda buf0,y 86 | sta chndat,y ;buffer # as 1st char 87 | asl a 88 | tax 89 | lda #1 90 | sta buftab,x 91 | lda #dirtyp+dirtyp 92 | sta filtyp,y ;set direct file type 93 | jmp endcmd 94 | ; block commands 95 | block ldy #0 96 | ldx #0 97 | lda #'- ;"-" separates cmd from subcmd 98 | jsr parse ;locate sub-cmd 99 | bne blk40 100 | blk10 lda #badcmd 101 | jmp cmderr 102 | blk30 lda #badsyn 103 | jmp cmderr 104 | blk40 txa 105 | bne blk30 106 | ldx #nbcmds-1 ;find command 107 | lda cmdbuf,y 108 | blk50 cmp bctab,x 109 | beq blk60 110 | dex 111 | bpl blk50 112 | bmi blk10 113 | blk60 114 | txa 115 | ora #$80 116 | sta cmdnum 117 | jsr blkpar ;parse parms 118 | lda cmdnum 119 | asl a 120 | tax 121 | lda bcjmp+1,x 122 | sta temp+1 123 | lda bcjmp,x 124 | sta temp 125 | jmp (temp) ;goto command 126 | bctab .byt "AFRWEP" 127 | nbcmds =*-bctab 128 | bcjmp .word blkalc ;block-allocate 129 | .word blkfre ;block-free 130 | .word blkrd ;block-read 131 | .word blkwt ;block-write 132 | .word blkexc ;block-execute 133 | .word blkptr ;block-pointer 134 | blkpar ldy #0 ;parse block parms 135 | ldx #0 136 | lda #': 137 | jsr parse 138 | bne bp05 ;found ":" 139 | ldy #3 ;else char #3 is beginning 140 | bp05 lda cmdbuf,y 141 | cmp #' ' 142 | beq bp10 143 | cmp #29 ;skip character 144 | beq bp10 145 | cmp #', 146 | bne bp20 147 | bp10 iny 148 | cpy cmdsiz 149 | bcc bp05 150 | rts ;that's all 151 | bp20 jsr aschex 152 | inc f1cnt 153 | ldy f2ptr 154 | cpx #mxfils-1 155 | bcc bp10 156 | bcs blk30 ;bad syntax 157 | ; convert ascii to hex (binary) 158 | ; & store conversion in tables 159 | ; .y= ptr into cmdbuf 160 | aschex lda #0 161 | sta temp 162 | sta temp+1 163 | sta temp+3 164 | ldx #$ff 165 | ah10 lda cmdbuf,y ;test for dec # 166 | cmp #$40 167 | bcs ah20 ;non-numeric terminates 168 | cmp #$30 169 | bcc ah20 ;non-numeric 170 | and #$f 171 | pha 172 | lda temp+1 ;shift digits (*10) 173 | sta temp+2 174 | lda temp 175 | sta temp+1 176 | pla 177 | sta temp 178 | iny 179 | cpy cmdsiz 180 | bcc ah10 ;still in string 181 | ah20 sty f2ptr ;convert digits to... 182 | clc ;...binary by dec table 183 | lda #0 184 | ah30 inx 185 | cpx #3 186 | bcs ah40 187 | ldy temp,x 188 | ah35 dey 189 | bmi ah30 190 | adc dectab,x 191 | bcc ah35 192 | clc 193 | inc temp+3 194 | bne ah35 195 | ah40 pha 196 | ldx f1cnt 197 | lda temp+3 198 | sta filtrk,x ;store result in table 199 | pla 200 | sta filsec,x 201 | rts 202 | dectab .byt 1,10,100 ;decimal table 203 | ;block-free 204 | blkfre jsr blktst 205 | jsr frets 206 | jmp endcmd 207 | ;block-allocate 208 | lda #1 209 | sta wbam 210 | blkalc 211 | jsr blktst 212 | ba10 213 | lda sector 214 | pha 215 | jsr getsec 216 | beq ba15 ;none greater on this track 217 | pla 218 | cmp sector 219 | bne ba30 ;requested sector not avail 220 | jsr wused 221 | jmp endcmd 222 | ; 223 | ba15 224 | pla ;pop stack 225 | ba20 226 | lda #0 227 | sta sector 228 | inc track 229 | lda track 230 | cmp maxtrk 231 | bcs ba40 ;gone all the way 232 | ; 233 | jsr getsec 234 | beq ba20 235 | ba30 236 | lda #noblk 237 | jsr cmder2 238 | ba40 239 | lda #noblk 240 | jsr cmderr ;t=0,s=0 :none left 241 | ; 242 | ; block read subs 243 | blkrd2 jsr bkotst ;test parms 244 | jmp drtrd 245 | getsim jsr getpre ;get byte w/o inc 246 | lda (buftab,x) 247 | rts 248 | ; block read 249 | blkrd3 jsr blkrd2 250 | lda #0 251 | jsr setpnt 252 | jsr getsim ;y=lindx 253 | 254 | sta lstchr,y 255 | lda #rndrdy 256 | sta chnrdy,y 257 | rts 258 | blkrd 259 | jsr blkrd3 260 | jsr rnget1 261 | jmp endcmd 262 | ;user direct read, lstchr=$ff 263 | ublkrd 264 | jsr blkpar 265 | jsr blkrd3 266 | lda lstchr,y 267 | sta chndat,y 268 | lda #$ff 269 | sta lstchr,y 270 | jmp endcmd ;(rts) 271 | ;block-write 272 | blkwt jsr bkotst 273 | jsr getpnt 274 | tay 275 | dey 276 | cmp #2 277 | bcs bw10 278 | ldy #1 279 | bw10 lda #0 ;set record size 280 | jsr setpnt 281 | tya 282 | jsr putbyt 283 | txa 284 | pha 285 | bw20 jsr drtwrt ;write block 286 | pla 287 | tax 288 | ; 289 | ; jsr rnget2 290 | jsr ptch15 ; fix for block read *rom ds 01/22/85* 291 | ; 292 | jmp endcmd 293 | ;user dirct write, no lstchr 294 | ublkwt jsr blkpar 295 | jsr bkotst 296 | jsr drtwrt 297 | jmp endcmd 298 | ;in .file vector: 299 | ;*=$fffa-6 ;user direct access 300 | ;ublock .word ublkrd 301 | ; .word ublkwt 302 | ;block-execute 303 | blkexc 304 | jsr killp ;kill protect 305 | jsr blkrd2 ;read block & execute 306 | lda #0 307 | be05 sta temp 308 | ldx jobnum 309 | lda bufind,x 310 | sta temp+1 311 | jsr be10 ;indirect jsr 312 | jmp endcmd 313 | be10 jmp (temp) 314 | ;buffer-pointer, set buffer pointer 315 | blkptr jsr buftst 316 | lda jobnum 317 | asl a 318 | tax 319 | lda filsec+1 320 | sta buftab,x 321 | jsr getpre 322 | jsr rnget2 ;set up get 323 | jmp endcmd 324 | ;test for allocated buffer.. 325 | ; ..related to sa 326 | buftst ldx f1ptr 327 | inc f1ptr 328 | lda filsec,x 329 | tay 330 | dey 331 | dey 332 | cpy #$c ; set limit to # of sas 333 | bcc bt20 334 | bt15 lda #nochnl 335 | jmp cmderr 336 | bt20 sta sa 337 | jsr fndrch 338 | bcs bt15 339 | jsr getact 340 | sta jobnum 341 | rts 342 | ;test block operation parms 343 | bkotst jsr buftst 344 | ; 345 | ;test for legal block &.. 346 | ; ..set up drv, trk, sec 347 | blktst ldx f1ptr 348 | lda filsec,x 349 | and #1 350 | sta drvnum 351 | lda filsec+2,x 352 | sta sector 353 | lda filsec+1,x 354 | sta track 355 | bt05 356 | jsr tschk 357 | jmp setlds ;(rts) 358 | ; rsr 1/19/80 add autoi to #cmd 359 | -------------------------------------------------------------------------------- /close.s: -------------------------------------------------------------------------------- 1 | ; close the file associated with sa 2 | ; 3 | close 4 | lda #0 5 | sta wbam 6 | lda sa 7 | bne cls10 ; directory close 8 | lda #0 9 | sta dirlst ;clear dir list 10 | jsr frechn 11 | cls05 12 | jmp freich 13 | cls10 14 | cmp #$f 15 | beq clsall ; close cmd chanl 16 | jsr clschn ;close channel 17 | lda sa 18 | cmp #2 19 | bcc cls05 20 | ; 21 | lda erword 22 | bne cls15 ; last command had an error 23 | jmp endcmd 24 | cls15 25 | jmp scren1 26 | ; 27 | clsall 28 | lda #14 29 | sta sa 30 | cls20 31 | jsr clschn 32 | dec sa 33 | bpl cls20 34 | lda erword 35 | bne cls25 ; last command had an error 36 | jmp endcmd 37 | cls25 38 | jmp scren1 39 | ; 40 | clschn 41 | ldx sa 42 | lda lintab,x 43 | cmp #$ff 44 | bne clsc28 45 | rts 46 | clsc28 47 | and #$f 48 | sta lindx 49 | ; 50 | jsr typfil 51 | cmp #dirtyp 52 | beq clsc30 ;direct channel 53 | cmp #reltyp 54 | beq clsrel 55 | ; 56 | jsr fndwch ;look for write channel 57 | bcs clsc31 58 | ; 59 | jsr clswrt ;close seq write 60 | jsr clsdir ;close directory 61 | clsc30 62 | jsr mapout ;write bam 63 | clsc31 64 | jmp frechn 65 | ; 66 | clsrel 67 | jsr scrub 68 | jsr dblbuf 69 | jsr ssend 70 | ldx ssnum 71 | stx t4 72 | inc t4 73 | lda #0 74 | sta t1 75 | sta t2 76 | lda ssind 77 | sec 78 | sbc #ssioff-2 79 | sta t3 80 | jsr sscalc 81 | ldx lindx 82 | lda t1 83 | sta nbkl,x 84 | lda t2 85 | sta nbkh,x 86 | lda #dyfile 87 | jsr tstflg 88 | beq clsr1 89 | jsr clsdir 90 | clsr1 jmp frechn 91 | ; 92 | ; close a write chanl 93 | ; 94 | clswrt ;close seq write file 95 | ldx lindx 96 | lda nbkl,x 97 | ora nbkh,x 98 | bne clsw10 ;at least 1 block written 99 | ; 100 | jsr getpnt 101 | cmp #2 102 | bne clsw10 ;at least 1 byte written 103 | ; 104 | lda #cr 105 | jsr putbyt 106 | clsw10 107 | jsr getpnt 108 | cmp #2 109 | bne clsw20 ;not mt buffer 110 | ; 111 | jsr dblbuf ;switch bufs 112 | ; 113 | ldx lindx 114 | lda nbkl,x 115 | bne clsw15 116 | dec nbkh,x 117 | clsw15 118 | dec nbkl,x 119 | ; 120 | lda #0 121 | clsw20 122 | sec 123 | sbc #1 ;back up 1 124 | pha ;save it 125 | lda #0 126 | jsr setpnt 127 | jsr putbyt ;tlink=0 128 | pla ;lstchr count 129 | jsr putbyt 130 | ; 131 | jsr wrtbuf ;write out last buffer 132 | jsr watjob ;finish job up 133 | jmp dblbuf ;make sure both bufs ok 134 | ;rts 135 | ; 136 | ; directory close on open write file 137 | ; 138 | clsdir ldx lindx ;save lindx 139 | stx wlindx ;&sa 140 | lda sa 141 | pha 142 | lda dsec,x ;get directory sector 143 | sta sector 144 | lda dind,x ;get sector offset 145 | sta index 146 | lda filtyp,x ;drv # in filtyp 147 | and #1 148 | sta drvnum 149 | lda dirtrk 150 | sta track 151 | jsr getact ;allocate a buffer 152 | pha 153 | sta jobnum 154 | jsr drtrd ;read directory sector 155 | ldy #0 156 | lda bufind,x ;.x is job# 157 | sta r0+1 158 | lda index 159 | sta r0 160 | lda (r0),y 161 | and #$20 162 | beq clsd5 163 | jsr typfil 164 | cmp #reltyp 165 | beq clsd6 166 | ; 167 | lda (r0),y 168 | and #$8f ;replace file 169 | sta (r0),y 170 | iny 171 | lda (r0),y 172 | sta track 173 | sty temp+2 174 | ldy #27 ;extract replacement link 175 | lda (r0),y ; to last sector 176 | pha 177 | dey 178 | lda (r0),y 179 | bne clsd4 180 | sta track 181 | pla 182 | sta sector 183 | lda #$67 184 | jsr cmder2 185 | clsd4 186 | pha 187 | lda #0 188 | sta (r0),y 189 | iny 190 | sta (r0),y 191 | pla 192 | ldy temp+2 193 | sta (r0),y 194 | iny 195 | lda (r0),y 196 | sta sector 197 | pla 198 | sta (r0),y 199 | jsr delfil ;delete old file 200 | jmp clsd6 ;set close bit 201 | clsd5 202 | lda (r0),y 203 | and #$f 204 | ora #$80 205 | sta (r0),y 206 | clsd6 ldx wlindx 207 | ldy #28 ;set # of blocks 208 | lda nbkl,x 209 | sta (r0),y 210 | iny 211 | lda nbkh,x 212 | sta (r0),y 213 | pla 214 | tax 215 | lda #write ;write directory sector 216 | ora drvnum 217 | jsr doit 218 | pla 219 | sta sa 220 | jmp fndwch ;restore lindx 221 | ; 222 | ; 223 | -------------------------------------------------------------------------------- /common.s: -------------------------------------------------------------------------------- 1 | ;********************************************** 2 | ;* * 3 | ;* commodore business machines software * 4 | ;* * 5 | ;********************************************** 6 | ; 7 | ;********************************************** 8 | ;* * 9 | ;* disk operating system and * 10 | ;* controller routines * 11 | ;* for the following cbm models: * 12 | ;* vs170 serial disk * 13 | ;* with single sa390 drive * 14 | ;* released as: * 15 | ;* 901636-01 $c000-$dfff * 16 | ;* 904637-01 $e000-$ffff * 17 | ;* copyright (c) 1981 by * 18 | ;* commodore business machines (cbm) * 19 | ;* * 20 | ;********************************************** 21 | ; ****listing date --10:00 06 may 1981 **** 22 | ;********************************************** 23 | ;* this software is furnished for use in * 24 | ;* the single drive floppy disk unit only. * 25 | ;* * 26 | ;* copies thereof may not be provided or * 27 | ;* made available for use on any other * 28 | ;* system. * 29 | ;* * 30 | ;* the information in this document is * 31 | ;* subject to change without notice. * 32 | ;* * 33 | ;* no responsibility is assumed for * 34 | ;* reliability of this software. rsr * 35 | ;* * 36 | ;********************************************** 37 | ; common area defines 38 | .segment "S0000" : zeropage 39 | jobs .res 6 ; job que 40 | hdrs .res 12 ; job headers 41 | dskid .res 4 ;master copy of disk id 42 | header .res 5 ;image of last header 43 | actjob .res 1 ;controller's active job 44 | wpsw .res 2 ;write protect change flag 45 | lwpt .res 2 ;last state of wp switch 46 | ; 47 | ; 48 | ; rsr 49 | -------------------------------------------------------------------------------- /copall.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; set up subroutine 3 | ; 4 | pups1 lda #0 5 | sta rec 6 | sta drvcnt 7 | sta filtrk 8 | sta filtrk+1 9 | lda fildrv+1 ;get drive number 10 | and #1 ;only 11 | sta drvnum 12 | ora #1 13 | sta delsec ;nonzero 14 | lda filtbl+1 ;fn1=fn2 15 | sta filtbl 16 | rts 17 | .if 0 18 | ; 19 | ; 20 | ; copy disk to disk routines 21 | ; 22 | cpydtd lda filtbl+1 ;save in temp 23 | sta temp 24 | ldy #40 ;40 char buffer 25 | ldx cmdsiz ;prep to move 26 | sty cmdsiz ;end of filename2 27 | movlp1 dey 28 | dex 29 | lda cmdbuf,x ;mov fn lifo 30 | sta cmdbuf,y 31 | cpx temp ;actual f2 val 32 | bne movlp1 33 | sty filtbl+1 ;pointer to f2 34 | movlp2 jsr optsch 35 | jsr pups1 ;setup first pass 36 | jsr ffst ;first match 37 | bpl fixit ;entry found? 38 | bmi endit ;no 39 | ; 40 | exlp0 pla ;pull needed vars 41 | sta dirsec 42 | pla 43 | sta filtbl+1 44 | pla 45 | sta lstbuf 46 | pla 47 | sta filcnt 48 | pla 49 | sta index 50 | pla 51 | sta found 52 | pla 53 | sta delind 54 | pla 55 | sta drvflg 56 | ; 57 | exlp1 jsr pups1 ;set up vars 58 | jsr ffre ;next match 59 | bpl fixit ;found one? 60 | endit jmp endcmd ;no! so bye 61 | ; 62 | fixit lda drvflg ;push needed vars 63 | pha 64 | lda delind 65 | pha 66 | lda found 67 | pha 68 | lda index 69 | pha 70 | lda filcnt 71 | pha 72 | lda lstbuf 73 | pha 74 | lda filtbl+1 75 | pha 76 | lda dirsec 77 | pha 78 | ; 79 | exlp2 jsr trfnme ;transfer name 80 | lda #1 ;fake out lookup 81 | sta f1cnt 82 | sta f2cnt 83 | jsr lookup 84 | lda #1 85 | sta f1cnt 86 | lda #2 ;real 87 | sta f2cnt 88 | jsr cy ;copy it 89 | jmp exlp0 ;next one folks 90 | ; 91 | ; transfer name (dirbuf) to cmdbuf 92 | ; 93 | trfnme ldy #3 ;both indexes 94 | sty filtbl ;begining of filename1 95 | trf0 lda (dirbuf),y ;move it 96 | sta cmdbuf,y 97 | iny 98 | cpy #19 ;all 16 chars passed? 99 | bne trf0 100 | rts 101 | .endif 102 | -------------------------------------------------------------------------------- /copset.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; dskcpy check for type 3 | ; and parses special case 4 | ; 5 | dskcpy 6 | lda #$e0 ;kill bam buffer 7 | sta bufuse 8 | jsr clnbam ;clr tbam 9 | jsr bam2x ;get bam lindx in .x 10 | lda #$ff 11 | sta buf0,x ;mark bam out-of-memory 12 | lda #$0f 13 | sta linuse ;free all lindxs 14 | jsr prscln ;find ":" 15 | bne dx0000 16 | jmp duplct ;bad command error, cx=x not allowed 17 | ; 18 | ;jsr prseq 19 | ; 20 | ;lda #'* ;cpy all 21 | ;ldx #39 ;put at buffer end 22 | ;stx filtbl+1 23 | ;sta cmdbuf,x ;place * 24 | ;inx 25 | ;stx cmdsiz 26 | ;ldx #1 ;set up cnt's 27 | ;stx f1cnt 28 | ;inx 29 | ;stx f2cnt 30 | ;jmp movlp2 ;enter routine 31 | ; 32 | dx0000 jsr tc30 ;normal parse 33 | dx0005 jsr alldrs ;put drv's in filtbl 34 | lda image ;get parse image 35 | and #%01010101 ;val for patt copy 36 | bne dx0020 ;must be concat or normal 37 | ldx filtbl ;chk for * 38 | lda cmdbuf,x 39 | cmp #'* 40 | bne dx0020 41 | ;ldx #1 ;set cnt's 42 | ; no pattern matching allowed 43 | ;stx f1cnt 44 | ;inx 45 | ;stx f2cnt 46 | ;jmp cpydtd ;go copy 47 | dx0010 lda #badsyn ;syntax error 48 | jmp cmderr 49 | dx0020 lda image ;chk for normal 50 | and #%11011001 51 | bne dx0010 52 | jmp copy 53 | .if 0 54 | prseq 55 | lda #'= ;special case 56 | jsr parse 57 | bne x0020 58 | x0015 lda #badsyn 59 | jmp cmderr 60 | x0020 lda cmdbuf,y 61 | jsr tst0v1 62 | bmi x0015 63 | sta fildrv+1 ;src drv 64 | dey 65 | dey 66 | lda cmdbuf,y 67 | jsr tst0v1 68 | bmi x0015 69 | cmp fildrv+1 ;cannot be equal 70 | beq x0015 71 | sta fildrv ;dest drv 72 | rts 73 | .endif 74 | -------------------------------------------------------------------------------- /dos.cfg: -------------------------------------------------------------------------------- 1 | MEMORY { 2 | S0000: start = $0000, size = $0103; 3 | S0200: start = $0200, size = $0100; 4 | S1800: start = $1800, size = $0100; 5 | S1C00: start = $1C00, size = $0100; 6 | SC000: start = $C000, size = $3FE6, fill=yes, fillval=$AA; 7 | SFFE6: start = $FFE6, size = $0014, fill=yes, fillval=$AA; 8 | SFFFA: start = $FFFA, size = $0006, fill=yes, fillval=$AA; 9 | } 10 | 11 | SEGMENTS { 12 | S0000: load = S0000, type = zp; 13 | S0200: load = S0200, type = zp; 14 | S1800: load = S1800, type = zp; 15 | S1C00: load = S1C00, type = zp; 16 | SC000: load = SC000, type = ro; 17 | SFFE6: load = SFFE6, type = ro; 18 | SFFFA: load = SFFFA, type = ro; 19 | } 20 | -------------------------------------------------------------------------------- /dos.s: -------------------------------------------------------------------------------- 1 | .feature labels_without_colons, pc_assignment, missing_char_term 2 | 3 | .include "common.s" 4 | .include "lcc.var.s" 5 | .include "equate.sf.s" 6 | .include "ramvar.sf.s" 7 | .include "i_odef.sf.s" 8 | .include "lcc.i_o.s" 9 | .include "rom....sf.s" 10 | .include "leds.s" 11 | .include "parsex.s" 12 | .include "setdrv.s" 13 | .include "lookup.s" 14 | .include "trnsfr.s" 15 | .include "scrtch.s" 16 | .include "duplct.s" 17 | .include "copset.s" 18 | .include "copall.s" 19 | .include "rename.s" 20 | .include "memrw.s" 21 | .include "block.s" 22 | .include "fndrel.s" 23 | .include "tst2.s" 24 | .include "tst3.s" 25 | .include "tst4.s" 26 | .include "jobs...sf.s" 27 | .include "addfil.s" 28 | .include "open.s" 29 | .include "close.s" 30 | .include "opchnl.s" 31 | .include "tstflg.s" 32 | .include "tsutil.s" 33 | .include "ssutil.s" 34 | .include "sstest.s" 35 | .include "getact.s" 36 | .include "rel1.s" 37 | .include "rel2.s" 38 | .include "rel3.s" 39 | .include "rel4.s" 40 | .include "ssend.s" 41 | .include "record.s" 42 | .include "nulbuf.s" 43 | .include "addrel.s" 44 | .include "newss.s" 45 | .include "erproc.s" 46 | .include "utlodr.s" 47 | .include "ser.atn.s" 48 | .include "ser.talk.s" 49 | .include "ser.listn.s" 50 | .include "dskint.sf.s" 51 | .include "idle...sf.s" 52 | .include "lstdir.s" 53 | .include "verdir.s" 54 | .include "new.s" 55 | .include "map.s" 56 | .include "frets.s" 57 | .include "tstfnd.s" 58 | .include "system.s" 59 | .include "lcc.init.s" 60 | .include "lcc.cntrl.s" 61 | .include "lcc.seek.s" 62 | .include "lcc.read.s" 63 | .include "lcc.wrt.s" 64 | .include "lcc.bingcr.s" 65 | .include "lcc.gcrbin.s" 66 | .include "lcc.conhdr.s" 67 | .include "lcc.util.s" 68 | .include "lcc.end.s" 69 | .include "lcc.fmt1.s" 70 | .include "lcc.fmt2.s" 71 | .include "lcc.fmt3.s" 72 | .include "lcc.fmt4.s" 73 | .include "irq.s" 74 | .include "romtbl.sf.s" 75 | .include "vector.s" 76 | -------------------------------------------------------------------------------- /dskint.sf.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; error display routine 3 | ; blinks the (error #)+1 in all three leds 4 | ; 5 | pezro ldx #0 ;error #1 for zero page 6 | .byte $2c ;skip next two bytes 7 | perr ldx temp ;get error # 8 | txs ;use stack as storage reg. 9 | pe20 tsx ;restore error # 10 | pe30 lda #led0+led1 11 | ora ledprt 12 | jmp pea7a ;turn on led !!!!patch so ddrb led is output!!!! 13 | rea7d tya ;clear inner ctr !!!!patch return!!!! 14 | pd10 clc 15 | pd20 adc #1 ;count inner ctr 16 | bne pd20 17 | dey ;done ? 18 | bne pd10 ;no 19 | ; 20 | lda ledprt 21 | and #$ff-led0-led1 22 | sta ledprt ;turn off all leds 23 | pe40 ;wait 24 | tya ;clear inner ctr 25 | pd11 clc 26 | pd21 adc #1 ;count inner ctr 27 | bne pd21 28 | dey ;done ? 29 | bne pd11 ;no 30 | ; 31 | dex ;blinked # ? 32 | bpl pe30 ;no - blink again 33 | cpx #$fc ;waited between counts ? 34 | bne pe40 ;no 35 | beq pe20 ;always - all again 36 | dskint 37 | sei 38 | cld 39 | ldx #$ff 40 | jmp patch5 ; *** rom ds 8/18/83 *** 41 | dkit10 inx ; fill 42 | ; 43 | ; 44 | ;********************************* 45 | ; 46 | ; power up diagnostic 47 | ; 48 | ;********************************* 49 | ; 50 | ldy #0 51 | ldx #0 52 | pu10 txa ;fill z-page accend pattern 53 | sta $0,x 54 | inx 55 | bne pu10 56 | pu20 txa ;check pattern by inc... 57 | cmp $0,x ;...back to orig # 58 | bne pezro ;bad bits 59 | pu30 60 | inc $0,x ;bump contents 61 | iny 62 | bne pu30 ;not done 63 | ; 64 | cmp $0,x ;check for good count 65 | bne pezro ;something's wrong 66 | ; 67 | sty $0,x ;leave z-page zeroed 68 | lda $0,x ;check it 69 | bne pezro ;wrong 70 | ; 71 | inx ;next! 72 | bne pu20 ;not all done 73 | ; 74 | ; 75 | ; test two 64k-bit roms 76 | ; 77 | ; enter x=start page 78 | ; exit if ok 79 | ; 80 | rm10 inc temp ;next error # 81 | stx ip+1 ;save page, start x=0 82 | lda #0 83 | sta ip ;zero lo indirect 84 | tay 85 | ldx #32 ;32 pages in 8k rom 86 | clc 87 | rt10 dec ip+1 ;do it backwards 88 | rt20 adc (ip),y ;total checksum in a 89 | iny 90 | bne rt20 91 | dex 92 | bne rt10 93 | adc #0 ;add in last carry 94 | tax ;save lower page in x 95 | cmp ip+1 ;correct ? 96 | bne perr2 ;no - show error number 97 | ; 98 | cpx #$c0 ;done both roms ? 99 | bne rm10 ;no 100 | ; test all common ram 101 | ; 102 | cr20 lda #$01 ;start of 1st block 103 | cr30 sta ip+1 ;save page # 104 | inc temp ;bump error # 105 | ; enter x=# of pages in block 106 | ; ip ptr to first page in block 107 | ; exit if ok 108 | ; 109 | ramtst ldx #7 ;save page count 110 | ra10 tya ;fill with adr sensitive pattern 111 | clc 112 | adc ip+1 113 | sta (ip),y 114 | iny 115 | bne ra10 116 | inc ip+1 117 | dex 118 | bne ra10 119 | ldx #7 ;restore page count 120 | ra30 dec ip+1 ;check pattern backwards 121 | ra40 dey 122 | tya ;gen pattern again 123 | clc 124 | adc ip+1 125 | cmp (ip),y ;ok ? 126 | bne perr2 ;no - show error # 127 | eor #$ff ;yes - test inverse pattern 128 | sta (ip),y 129 | eor (ip),y ;ok ? 130 | sta (ip),y ;leave memory zero 131 | bne perr2 ;no - show error # 132 | tya 133 | bne ra40 134 | dex 135 | bne ra30 136 | ; 137 | beq diagok 138 | ; 139 | perr2 jmp perr 140 | ; 141 | diagok 142 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 143 | ; 144 | jmp ptch31 ; *** rom ds 05/01/85 *** 145 | ; ldx #topwrt 146 | ; txs 147 | ; 148 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 149 | ; 150 | rtch31 lda ledprt ;clear leds 151 | and #$ff-led0-led1 152 | sta ledprt 153 | ; 154 | lda #1 ; neg edge of atn 155 | sta pcr1 156 | lda #%10000010 157 | sta ifr1 158 | sta ier1 159 | lda pb ;compute primary addr 160 | and #%01100000 ;pb5 and pb6 are unused line 161 | asl a ;shift to lower 162 | rol a 163 | rol a 164 | rol a 165 | ora #$48 ;talk address 166 | sta tlkadr 167 | eor #$60 ;listen address 168 | sta lsnadr 169 | ; 170 | ; initialize buffer pntr table 171 | ; 172 | inttab ldx #0 173 | ldy #0 174 | intt1 lda #0 175 | sta buftab,x 176 | inx 177 | lda bufind,y 178 | sta buftab,x 179 | inx 180 | iny 181 | cpy #bfcnt 182 | bne intt1 183 | ; 184 | lda #cmdbuf 188 | sta buftab,x 189 | inx 190 | lda #errbuf 194 | sta buftab,x 195 | ; 196 | lda #$ff 197 | ldx #maxsa 198 | dskin1 sta lintab,x 199 | dex 200 | bpl dskin1 201 | ; 202 | ldx #mxchns-1 203 | dskin2 204 | sta buf0,x ;set buffers as unused 205 | sta buf1,x 206 | sta ss,x 207 | dex 208 | bpl dskin2 209 | ; 210 | lda #bfcnt ;set buffer pointers 211 | sta buf0+cmdchn 212 | lda #bfcnt+1 213 | sta buf0+errchn 214 | lda #$ff 215 | sta buf0+blindx 216 | sta buf1+blindx 217 | lda #errchn 218 | sta lintab+errsa 219 | lda #cmdchn+$80 220 | sta lintab+cmdsa 221 | lda #lxint ;lindx 0 to 5 free 222 | sta linuse 223 | lda #rdylst 224 | sta chnrdy+cmdchn 225 | lda #rdytlk 226 | sta chnrdy+errchn 227 | lda #$e0 228 | sta bufuse 229 | lda #$ff 230 | sta bufuse+1 231 | lda #1 232 | sta wpsw 233 | sta wpsw+1 234 | jsr usrint ;init user jmp 235 | jsr lruint 236 | ; 237 | ;********************************** 238 | ; 239 | ; controller initialization 240 | ; 241 | ;********************************** 242 | ; 243 | jsr cntint 244 | ; set indirect vectors 245 | lda #diagok 248 | sta vnmi+1 249 | ; 250 | lda #10 ;set up sector offset 251 | sta secinc 252 | lda #5 253 | sta revcnt ;set up recovery count 254 | ;* 255 | ;******************************* 256 | ;* 257 | ;* seterr 258 | ;* set up power on error msg 259 | ;* 260 | ;* cbm dos v2.0 (c)1979 261 | ;* 262 | ;******************************* 263 | ;* 264 | ;* 265 | ; 266 | seterr lda #$73 267 | jsr errts0 268 | ; 269 | ; 270 | ;must be contiguous to .file idle 271 | ; 272 | ;******************************** 273 | ; init the serial bus 274 | ; 275 | ;******************************** 276 | ; 277 | ;-------rom -05 8/18/83----------------- 278 | lda #$00 ; data hi, clock hi,atna hi 279 | sta pb 280 | lda #%00011010 ; atna,clkout,datout 281 | sta ddrb1 282 | ;--------------------------------------- 283 | jsr boot 284 | ; 285 | -------------------------------------------------------------------------------- /duplct.s: -------------------------------------------------------------------------------- 1 | ; duplicate disk 2 | duplct 3 | lda #badcmd 4 | jmp cmderr 5 | ; transfer format code to buffer 0 6 | ; & start controller formatting 7 | format 8 | lda #$4c 9 | sta bufs+$300 10 | lda #formt 13 | sta bufs+$302 14 | ; 15 | lda #3 16 | jsr seth 17 | lda drvnum 18 | ora #exec 19 | sta jobs+3 20 | fmt105 lda jobs+3 21 | bmi fmt105 22 | cmp #2 23 | bcc fmt110 24 | lda #3 25 | ldx #0 26 | jmp error 27 | fmt110 rts 28 | ; 29 | ; 30 | -------------------------------------------------------------------------------- /equate.sf.s: -------------------------------------------------------------------------------- 1 | ;****************************** 2 | ;* equates 3 | ;****************************** 4 | ; 5 | rom =$c000 ;first rom address 6 | ; 7 | lrf =$80 ;last record flag 8 | dyfile =$40 ;dirty flag for rr file 9 | ovrflo =$20 ;rr print overflow 10 | nssl =6 ;# of side-sector links 11 | ssioff =4+nssl+nssl ;offset into ss for data block ptrs 12 | nssp =120 ;# of ptrs in ss 13 | mxchns =6 ;max # channels in system 14 | maxsa =18 ;max sa # +1 15 | vererr =7 ;controller verify error 16 | cr =$0d ; carriage return 17 | bfcnt =5 ;available buffer count 18 | cbptr =bfcnt+bfcnt ;command buffer ptr 19 | errchn =mxchns-1 ;error channel # 20 | errsa =16 ;error channel sa # 21 | cmdchn =mxchns-2 ;command channel # 22 | lxint =%00001111 ;power up linuse (logical index usage 23 | blindx =6 ;bam lindx for floating bams 24 | cmdsa =15 ;command channel sa # 25 | apmode =2 ;open append mode 26 | mdmode =3 ;open modify mode 27 | rdmode =0 ;open read mode 28 | wtmode =1 ;open write mode 29 | reltyp =4 ;open relative type 30 | dirtyp =7 ;open direct type 31 | seqtyp =1 ;open sequential type 32 | prgtyp =2 ;open program type 33 | usrtyp =3 ;open user type 34 | typmsk =7 ;mask for type bits 35 | irsa =17 ;internal read sa # 36 | iwsa =18 ;internal write sa # 37 | dosver =2 ;dos version 38 | fm2030 =$42 ;2030 format version 39 | fm4040 =$41 ;4040 format version 40 | ;controller job types 41 | read =$80 42 | write =$90 43 | wverfy =$a0 44 | seek =$b0 45 | secsek =seek+8 46 | bump =$c0 47 | jumpc =$d0 48 | exec =$e0 49 | mxfils =5 ; max # filenames in string 50 | dirlen =24 ;directory length used 51 | nbsiz =27 ;nambuf text size 52 | cmdlen =41 ;length of command buffer 53 | -------------------------------------------------------------------------------- /fndrel.s: -------------------------------------------------------------------------------- 1 | ;******************************** 2 | ;* 3 | ;* find relative file 4 | ;* 5 | ;* version 2.5 6 | ;* 7 | ;* 8 | ;* inputs 9 | ;* recl - 1byte=lo record # 10 | ;* rech - 1byte=hi record # 11 | ;* rs - 1byte=record size 12 | ;* recptr - 1byte=first byte 13 | ;* wanted from record 14 | ;* 15 | ;* outputs 16 | ;* ssnum - 1byte=side sector # 17 | ;* ssind - 1byte=index into ss 18 | ;* relptr - 1byte=ptr to first 19 | ;* byte wanted 20 | ;* 21 | ;******************************** 22 | ; 23 | ; 24 | ; 25 | ; 26 | ; 27 | ; 28 | fndrel jsr mulply ;result=rn*rs+rp 29 | jsr div254 ;divide by 254 30 | lda accum+1 ;save remainder 31 | sta relptr 32 | jsr div120 ;divide by 120 33 | inc relptr 34 | inc relptr 35 | lda result ;save quotient 36 | sta ssnum 37 | lda accum+1 ;save remainder 38 | asl a ;calc index into ss 39 | clc 40 | adc #16 ;skip link table 41 | sta ssind 42 | rts 43 | ; 44 | ; 45 | ; 46 | ; multiply 47 | ; 48 | ; result=recnum*rs+recptr 49 | ; 50 | ; destroys a,x 51 | ; 52 | mulply jsr zerres ;result=0 53 | sta accum+3 ;a=0 54 | ldx lindx ;get index 55 | lda recl,x 56 | sta accum+1 57 | lda rech,x 58 | sta accum+2 59 | bne mul25 ;adjust for rec #1 &... 60 | lda accum+1 ;...#0 = 1st rec 61 | beq mul50 62 | mul25 lda accum+1 63 | sec 64 | sbc #1 65 | sta accum+1 66 | bcs mul50 67 | dec accum+2 68 | mul50 69 | lda rs,x ;copy recsiz 70 | sta temp 71 | mul100 lsr temp ;do an add ? 72 | bcc mul200 ;no 73 | jsr addres ;result=result+accum+1,2,3 74 | mul200 jsr accx2 ;2*(accum+1,2,3) 75 | lda temp ;done ? 76 | bne mul100 ;no 77 | lda recptr ;add in last bit 78 | clc 79 | adc result 80 | sta result 81 | bcc mul400 ;skip no carry 82 | inc result+1 83 | bne mul400 84 | inc result+2 85 | mul400 rts 86 | ; 87 | ; 88 | ; 89 | ; divide 90 | ; 91 | ; result=quotient ,accum+1=remainder 92 | ; 93 | ; destroys a,x 94 | ; 95 | div254 lda #254 ;divide by 254 96 | .byte $2c ;skip two bytes 97 | div120 lda #120 ;divide by 120 98 | sta temp ;save divisor 99 | ldx #3 ;swap accum+1,2,3 with 100 | div100 lda accum,x ; result,1,2 101 | pha 102 | lda result-1,x 103 | sta accum,x 104 | pla 105 | sta result-1,x 106 | dex 107 | bne div100 108 | jsr zerres ;result=0 109 | div150 ldx #0 110 | div200 lda accum+1,x ;divide by 256 111 | sta accum,x 112 | inx 113 | cpx #4 ;done ? 114 | bcc div200 ;no 115 | lda #0 ;zero hi byte 116 | sta accum+3 117 | bit temp ;a div120 ? 118 | bmi div300 ;no 119 | asl accum ;only divide by 128 120 | php ;save carry 121 | lsr accum ;normalize 122 | plp ;restore carry 123 | jsr acc200 ;2*(x/256)=x/128 124 | div300 jsr addres ;total a quotient 125 | jsr accx2 ;a=2*a 126 | bit temp ;a div120 ? 127 | bmi div400 ;no 128 | jsr accx4 ;a=4*(2*a)=8*a 129 | div400 lda accum ;add in remainder 130 | clc 131 | adc accum+1 132 | sta accum+1 133 | bcc div500 134 | inc accum+2 135 | bne div500 136 | inc accum+3 137 | div500 lda accum+3 ;test < 256 138 | ora accum+2 139 | bne div150 ;crunch some more 140 | lda accum+1 ;is remainder < divisor 141 | sec 142 | sbc temp 143 | bcc div700 ;yes 144 | inc result ;no - fix result 145 | bne div600 146 | inc result+1 147 | bne div600 148 | inc result+2 149 | div600 sta accum+1 ;new remainder 150 | div700 rts 151 | ; 152 | ; 153 | ; 154 | ; zero result 155 | ; 156 | zerres lda #0 157 | sta result 158 | sta result+1 159 | sta result+2 160 | rts 161 | ; 162 | ; 163 | ; 164 | ; multiply accum by 4 165 | ; 166 | accx4 jsr accx2 167 | ; 168 | ; multiply accum by 2 169 | ; 170 | accx2 clc 171 | acc200 rol accum+1 172 | rol accum+2 173 | rol accum+3 174 | rts 175 | ; 176 | ; 177 | ; 178 | ; add accum to result 179 | ; 180 | ; result=result+accum+1,2,3 181 | ; 182 | addres clc 183 | ldx #$fd 184 | add100 lda result+3,x 185 | adc accum+4,x 186 | sta result+3,x 187 | inx 188 | bne add100 189 | rts 190 | ; 191 | ; 192 | ; 193 | ; 194 | -------------------------------------------------------------------------------- /frets.s: -------------------------------------------------------------------------------- 1 | ; mark a track,sector as free in bam 2 | wfree 3 | jsr fixbam 4 | ; 5 | frets 6 | jsr freuse ;calc index into bam 7 | frets2 8 | sec ;flag for no action 9 | bne frerts ;free already 10 | lda (bmpnt),y ;not free, free it 11 | ora bmask,x 12 | sta (bmpnt),y 13 | jsr dtybam ;set dirty flag 14 | ldy temp 15 | clc 16 | lda (bmpnt),y ;add one 17 | adc #1 18 | sta (bmpnt),y 19 | lda track 20 | cmp dirtrk 21 | beq use10 22 | ; 23 | inc ndbl,x 24 | bne fre10 25 | inc ndbh,x 26 | fre10 27 | frerts rts 28 | ; 29 | dtybam 30 | ldx drvnum 31 | lda #1 32 | sta mdirty,x ;set dirty flag 33 | rts 34 | ; 35 | ; mark track,sector,(bmpnt) as used 36 | ; 37 | wused 38 | jsr fixbam 39 | ; 40 | usedts ;calc in dex into bam 41 | jsr freuse ;calc in dex into bam 42 | beq userts ;used, no action 43 | lda (bmpnt),y ;get bits 44 | eor bmask,x ;mark sec used 45 | sta (bmpnt),y 46 | jsr dtybam 47 | ldy temp 48 | lda (bmpnt),y ;get count 49 | sec 50 | sbc #1 ; dec one (c=0) 51 | sta (bmpnt),y ;save it 52 | lda track 53 | cmp dirtrk 54 | beq use20 55 | ; 56 | lda ndbl,x 57 | bne use10 58 | dec ndbh,x 59 | use10 60 | dec ndbl,x 61 | use20 62 | lda ndbh,x 63 | bne userts 64 | lda ndbl,x 65 | ; 66 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 67 | ; 68 | jmp ptch66 ; *** rom ds 04/25/86 *** 69 | nop ; fill 70 | ; cmp #3 71 | ; bcs userts 72 | ; 73 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 74 | ; 75 | lda #dskful 76 | jsr errmsg 77 | userts rts 78 | ; 79 | ; calculates index into bam 80 | ; for frets and usedts 81 | ; 82 | freuse 83 | jsr setbam 84 | tya 85 | freus2 86 | sta temp ;save index 87 | freus3 88 | lda sector ;a=sector/8 89 | lsr a 90 | lsr a 91 | lsr a ;for which of three bytes 92 | sec 93 | adc temp ;calc index 94 | tay 95 | lda sector ;bit in that byte 96 | and #7 97 | tax 98 | lda (bmpnt),y ;get the byte 99 | and bmask,x ;test it 100 | rts ;z=1=used,z=0=free 101 | ; 102 | ; 103 | bmask .byte 1,2,4,8,16,32,64,128 104 | ; 105 | fixbam ;write the bam according to wbam flag 106 | lda #$ff 107 | bit wbam 108 | beq fbam10 ;test flags 109 | bpl fbam10 110 | bvs fbam10 111 | ; 112 | lda #0 113 | sta wbam ;clear flag 114 | jmp dowrit 115 | ; 116 | fbam10 117 | rts 118 | ; 119 | ; 120 | ; clear the bam area 121 | ; 122 | clrbam 123 | jsr setbpt 124 | ldy #0 125 | tya 126 | clb1 127 | sta (bmpnt),y 128 | iny 129 | bne clb1 130 | rts 131 | ; 132 | setbam ;set bam image in memory 133 | lda t0 ;save temps 134 | pha 135 | lda t1 136 | pha 137 | ; 138 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 139 | ; 140 | jmp ptch52 ; *** rom ds 05/01/85 *** 141 | nop ; fill 142 | ; ldx drvnum 143 | ; lda nodrv,x 144 | rtch52 ; ret address 145 | ; 146 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 147 | ; 148 | beq sbm10 149 | ; 150 | lda #nodriv ;no drive 151 | jsr cmder3 152 | sbm10 153 | jsr bam2a 154 | sta t0 ;t0:= index into buf0 155 | txa 156 | asl a 157 | sta t1 ;t1:= 2*drvnum 158 | tax 159 | lda track 160 | cmp tbam,x ;check bam table for track 161 | beq sbm30 ;it's in 162 | ; 163 | inx 164 | stx t1 ;check next entry 165 | cmp tbam,x 166 | beq sbm30 ;it's in 167 | ; 168 | jsr swap ;swap track bam in table 169 | sbm30 170 | lda t1 171 | ldx drvnum 172 | sta ubam,x ;set last used ptr 173 | asl a 174 | asl a 175 | clc 176 | adc #bam 179 | adc #0 180 | sta bmpnt+1 181 | ldy #0 182 | pla 183 | sta t1 184 | pla 185 | sta t0 186 | rts 187 | ; 188 | ; 189 | swap ;swap images of bam 190 | ldx t0 191 | jsr redbam ;read bam if not in 192 | lda drvnum 193 | tax 194 | asl a 195 | ora ubam,x ;swap out least used image 196 | eor #1 197 | and #3 198 | sta t1 199 | jsr putbam ;put to bam 200 | lda jobnum 201 | asl a 202 | tax 203 | lda track 204 | asl a 205 | asl a 206 | sta buftab,x ;set ptr 207 | lda t1 208 | asl a 209 | asl a 210 | tay 211 | swap3 ;transfer bam to mem image 212 | lda (buftab,x) 213 | sta bam,y 214 | lda #0 215 | sta (buftab,x) ;clear bam 216 | inc buftab,x 217 | iny 218 | tya 219 | and #3 220 | bne swap3 221 | ; 222 | ldx t1 223 | lda track 224 | sta tbam,x ;set track # for image 225 | ; 226 | lda wbam 227 | bne swap4 ;don't write now 228 | jmp dowrit 229 | swap4 230 | ora #$80 ;set pending write flag 231 | sta wbam 232 | rts 233 | ; 234 | putbam ;put mem image to bam 235 | tay 236 | lda tbam,y 237 | beq swap2 ;no image here 238 | ; 239 | pha ;save track # 240 | lda #0 241 | sta tbam,y ;clear track flag 242 | lda jobnum 243 | asl a 244 | tax 245 | pla 246 | asl a 247 | asl a 248 | sta buftab,x ;set ptr in bam 249 | tya 250 | asl a 251 | asl a 252 | tay 253 | swap1 ;transfer image to bam 254 | lda bam,y 255 | sta (buftab,x) 256 | lda #0 257 | sta bam,y ;clear image 258 | inc buftab,x 259 | iny 260 | tya 261 | and #3 262 | bne swap1 263 | swap2 264 | rts 265 | ; 266 | ; 267 | clnbam ;clean track # for images 268 | lda drvnum 269 | asl a 270 | tax 271 | lda #0 272 | sta tbam,x 273 | inx 274 | sta tbam,x 275 | rts 276 | ; 277 | ; 278 | ; 279 | redbam ;read in bam if not present 280 | lda buf0,x 281 | cmp #$ff 282 | bne rbm20 ;it is in memory 283 | txa 284 | pha ;save channel ptr 285 | jsr getbuf ;go find a buffer 286 | tax 287 | bpl rbm10 288 | ; 289 | lda #nochnl ;no buffers around 290 | jsr cmderr 291 | rbm10 292 | stx jobnum ;save jobnum assigned 293 | pla 294 | tay 295 | txa 296 | ora #$80 297 | sta buf0,y ;set as inactive for stealing 298 | ;read in bam 299 | asl a 300 | tax 301 | lda dirtrk 302 | sta hdrs,x 303 | lda #0 304 | sta hdrs+1,x 305 | jmp doread 306 | rbm20 307 | and #$f ;set bam's jobnum 308 | sta jobnum 309 | rts 310 | ; 311 | ;set bam pointer in buf0/1 tables 312 | ; 313 | bam2a ;leave in .a 314 | lda #blindx 315 | ldx drvnum 316 | bne b2x10 317 | ; 318 | clc 319 | adc #mxchns+1 320 | b2x10 321 | rts 322 | ; 323 | bam2x ;leave in .x 324 | jsr bam2a 325 | tax 326 | rts 327 | ; 328 | ; 329 | -------------------------------------------------------------------------------- /getact.s: -------------------------------------------------------------------------------- 1 | ;********************************* 2 | ;* getact: get active buffer # * 3 | ;* vars: buf0,buf1,lindx * 4 | ;* regs: out: .a= act buffer # * 5 | ;* .x= lindx * 6 | ;* flags: .n=1: no act-buf * 7 | ;********************************* 8 | ; 9 | getact 10 | ldx lindx 11 | lda buf0,x 12 | bpl ga1 13 | lda buf1,x 14 | ga1 15 | and #$bf ; strip dirty bit 16 | rts 17 | ; 18 | ;********************************* 19 | ;* gaflg: get active buffer #; * 20 | ;* set lbused & flags. * 21 | ;* regs: out: .a= act buffer # * 22 | ;* .x= lindx * 23 | ;* flags: .n=1: no act-buf * 24 | ;* .v=1: dirty buf * 25 | ;********************************* 26 | ; 27 | gaflgs 28 | ldx lindx 29 | ga2 stx lbused ;save buf # 30 | lda buf0,x 31 | bpl ga3 32 | ; 33 | txa 34 | clc 35 | adc #mxchns+1 36 | sta lbused 37 | lda buf1,x 38 | ga3 39 | sta t1 40 | and #$1f 41 | bit t1 42 | rts 43 | ; 44 | ;****************************** 45 | ;****************************** 46 | ; 47 | ; get channels inactive 48 | ; buffer number. 49 | ; 50 | ; input parameters: 51 | ; lindx - channel # 52 | ; 53 | ; output parameters: 54 | ; a <== inactive buffer # 55 | ; or 56 | ; a <== $ff if no 57 | ; inactive buffer. 58 | ; 59 | ;****************************** 60 | ; 61 | getina ldx lindx 62 | lda buf0,x 63 | bmi gi10 64 | lda buf1,x 65 | gi10 cmp #$ff 66 | rts 67 | ; 68 | ;***************************** 69 | ;********** p u t i n a **** 70 | ;***************************** 71 | ; 72 | ; put inactive buffer 73 | ; 74 | ; input paramters: 75 | ; a = buffer # 76 | ; 77 | ; output paramters: 78 | ; none 79 | ; 80 | ;***************************** 81 | ; 82 | putina ldx lindx 83 | ora #$80 84 | ldy buf0,x 85 | bpl pi1 86 | sta buf0,x 87 | rts 88 | pi1 sta buf1,x 89 | rts 90 | ; 91 | -------------------------------------------------------------------------------- /i_odef.sf.s: -------------------------------------------------------------------------------- 1 | ;***************************** 2 | ;* i/o definitions * 3 | ;***************************** 4 | ; 5 | unlsn =$3f ; ieee unlisten command 6 | untlk =$5f ; ieee untalk command 7 | notrdy =$0 ; not ready 8 | talker =$80 ; ieee talker flag 9 | lisner =1 ; ieee listener flag 10 | eoiout =$80 ; talk with eoi 11 | eoisnd =$08 ; not(eoi) to send 12 | eoi =$08 ; not(eoi) to send 13 | rdytlk =$88 ; talk no eoi 14 | rdylst =$1 ; ready to listen 15 | rndrdy =rdytlk+rdylst ; random chnrdy 16 | rndeoi =eoiout+rdylst ; random w/ eoi 17 | ;i/o registers 18 | ; mos 6522-a 19 | .segment "S1800" 20 | ;ieee control port 21 | pb .res 1 ; serial port 22 | pa1 .res 1 ; unused port 23 | ddrb1 .res 1 24 | ddra1 .res 1 ;ieee data dir 25 | t1lc1 .res 1 ; timer 1 low counter 26 | t1hc1 .res 1 ; timer 1 hi counter 27 | t1ll1 .res 1 ; timer 1 low latch 28 | t1hl1 .res 1 ; timer 1 hi latch 29 | t2lc1 .res 1 ; timer 2 low counter 30 | t2hc1 .res 1 ; timer 2 hi counter 31 | sr1 .res 1 ; shift reg 32 | acr1 .res 1 ; aux control reg 33 | pcr1 .res 1 34 | ifr1 .res 1 35 | ier1 .res 1 36 | pota1 .res 1 ; bit 0: track 0 sense, 1=trk0 37 | ; 38 | ; 39 | ; 40 | ; bits for serial handshake 41 | ; 42 | datin =$1 ;data in line 43 | datout =$2 ; data out 44 | clkin =$4 ;clock in 45 | clkout =$8 ;clock out 46 | atna =$10 ;atna ack 47 | atn =$80 ; atn in 48 | ; 49 | ; 50 | led0 =8 ; act led 51 | led1 =0 ; no led 52 | ledprt=$1c00 ; on pb of $1c00 53 | ledout=$1c02 ; ddrb of $1c00 for output-led 54 | ; 55 | ; 56 | -------------------------------------------------------------------------------- /idle...sf.s: -------------------------------------------------------------------------------- 1 | ; idle loop, waiting for something to do 2 | idle 3 | cli 4 | ; release all bus lines 5 | lda pb ;clock and data high 6 | ; data high,atna hi 7 | and #$e5 ; clock high 8 | sta pb 9 | ; 10 | lda cmdwat ; test for pending command 11 | beq idl1 ; no command waiting 12 | lda #0 13 | sta cmdwat 14 | sta nmiflg ;clear debounce 15 | jsr parsxq ; parse and xeq command 16 | idl1 cli ;test for drive running or openfile 17 | lda atnpnd 18 | beq idl01 19 | ; 20 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 21 | ; 22 | jmp ptch30 ; *rom ds 02/04/85* 23 | ; jmp atnsrv ; service atn irq 24 | ; 25 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 26 | ; 27 | idl01 28 | cli 29 | lda #14 30 | sta temp+3 31 | lda #0 ;if file open, turn on act led 32 | sta temp 33 | sta temp+1 34 | idl2 ldx temp+3 ;look thru lintab 35 | lda lintab,x ;for active file 36 | cmp #$ff 37 | beq idl3 38 | and #$3f 39 | sta lindx 40 | jsr getact 41 | tax 42 | lda lstjob,x ;determine which drv it is on 43 | and #1 44 | tax 45 | inc temp,x 46 | idl3 dec temp+3 ;set flag indicating drv 47 | bpl idl2 ;has file open 48 | ldy #bfcnt-1 ;look thru job que for 49 | idl4 lda jobs,y ; for jobs still running 50 | bpl idl5 51 | and #1 52 | tax 53 | inc temp,x ;set flag indicating drive 54 | idl5 dey ;is active 55 | bpl idl4 56 | sei ; dont allow irq when reading ledprt ********************** 57 | lda ledprt 58 | and #$ff-led0 59 | pha 60 | lda drvnum 61 | sta r0 62 | lda #0 63 | sta drvnum 64 | lda temp 65 | beq idl7 66 | lda wpsw 67 | beq idl6 68 | jsr cldchn 69 | idl6 70 | pla ;turn on led if drive flag 71 | ora #led0 ; if not 0 72 | pha 73 | idl7 74 | inc drvnum 75 | lda temp+1 76 | beq idl9 77 | lda wpsw+1 78 | beq idl8 79 | jsr cldchn 80 | idl8 81 | pla 82 | ora #led1 83 | pha 84 | idl9 85 | lda r0 86 | sta drvnum 87 | pla 88 | ldx erword 89 | beq idl12 ;no error flashing 90 | ; 91 | lda ledprt ;use current leds 92 | cpx #$80 93 | bne idl10 ;not ist time 94 | ; 95 | ;pha 96 | ;beep here************** 97 | ;pla 98 | jmp idl11 99 | ; 100 | idl10 101 | ldx timer1 102 | bmi idl12 ;still timing 103 | ; 104 | ldx #$a0 ;count 8 msec 105 | stx timer1 106 | idl11 107 | dec erword ;count units of 8 msec 108 | bne idl12 ;keep counting 109 | ; 110 | eor erled ;toggle led 111 | ldx #16 ;count 16 units 112 | stx erword 113 | idl12 114 | sta ledprt ;set leds 115 | jmp idl1 ;back to top of lop 116 | ; 117 | -------------------------------------------------------------------------------- /irq.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | sysirq pha ; save .a,.x,.y 5 | txa 6 | pha 7 | tya 8 | pha 9 | ; 10 | ; 11 | lda ifr1 ; test if atn 12 | and #2 13 | beq irq10 ; not atn 14 | ; 15 | jsr atnirq ; handle atn request 16 | ; 17 | ; 18 | irq10 lda ifr2 ; test if timer 19 | asl a 20 | bpl irq20 ; not timer 21 | ; 22 | jsr lcc ; goto controller 23 | ; 24 | irq20 pla ; restore .y,.x,.a 25 | tay 26 | pla 27 | tax 28 | pla 29 | rti 30 | ; 31 | ; 32 | ; 33 | -------------------------------------------------------------------------------- /jobs...sf.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; use lastjob for drive # 3 | ; cmd is used for job command 4 | ; 5 | setljb 6 | lda lstjob,x 7 | and #1 8 | ora cmd 9 | ; 10 | ; set job up and check t&s 11 | ; .a=command for jobs 12 | ; .x=job number 13 | ; 14 | setjob 15 | pha 16 | stx jobnum 17 | txa 18 | ;asl a ;4/12***************** 19 | ;asl a 20 | asl a 21 | tax 22 | lda hdrs+1,x ;4/12*********** 23 | sta cmd ;save sector 24 | lda hdrs,x ;4/12*********** 25 | beq tserr 26 | ; 27 | cmp maxtrk 28 | bcs tserr ;track too large 29 | ; 30 | tax 31 | pla ;check for write 32 | pha 33 | and #$f0 34 | cmp #write 35 | bne sjb1 ;not write,skip check 36 | pla 37 | pha 38 | lsr a 39 | bcs sjb2 ;drive 1 40 | ; 41 | lda dskver ;get version # 42 | bcc sjb3 43 | sjb2 44 | lda dskver+1 ;get drive 1 ver# 45 | sjb3 46 | beq sjb4 ;no # is ok, too 47 | cmp vernum 48 | bne vnerr ;not same vernum # 49 | ; 50 | sjb4 51 | txa ;restore track # 52 | jsr maxsec 53 | cmp cmd 54 | beq tserr 55 | bcs sjb1 ;sector is ok! 56 | ; 57 | ; 58 | ; illegal track and sector 59 | ; 60 | tserr 61 | jsr hed2ts 62 | tser1 63 | lda #badts 64 | jmp cmder2 65 | ; 66 | ; 67 | hed2ts 68 | lda jobnum 69 | ; asl a ;4/12************* 70 | ; asl a 71 | asl a 72 | tax 73 | lda hdrs,x ;4/12*********** 74 | sta track 75 | lda hdrs+1,x ;4/12*********** 76 | sta sector 77 | rts 78 | ; 79 | ; 80 | tschk 81 | lda track 82 | beq tser1 83 | cmp maxtrk 84 | bcs tser1 85 | ; 86 | jsr maxsec 87 | cmp sector 88 | beq tser1 89 | bcc tser1 90 | rts 91 | ; 92 | vnerr 93 | jsr hed2ts 94 | lda #cbmv2 ;write to wrong version 95 | jmp cmder2 96 | ; 97 | sjb1 98 | ldx jobnum 99 | pla 100 | sta cmd 101 | sta jobs,x 102 | sta lstjob,x 103 | rts 104 | ; 105 | ; 106 | ; do job in .a, set up error count 107 | ; and lstjob. return when job done ok 108 | ; jmp to error if error returns 109 | ; 110 | doread 111 | lda #read 112 | bne dojob ;bra 113 | dowrit 114 | lda #write 115 | dojob 116 | ora drvnum 117 | ldx jobnum 118 | ; 119 | doit sta cmd 120 | doit2 lda cmd 121 | jsr setjob 122 | ; jmp watjob 123 | ; 124 | ; wait until job(.x) is done 125 | ; return when done 126 | ; 127 | watjob jsr tstjob 128 | bcs watjob 129 | pha ;clr jobrtn flag 130 | lda #0 131 | sta jobrtn 132 | pla 133 | rts 134 | ; 135 | ; 136 | ;test if job(.x) is done yet 137 | ;if not done return 138 | ;if ok then return else redo it 139 | ; 140 | tstjob lda jobs,x 141 | bmi notyet 142 | cmp #2 143 | bcc ok 144 | ; 145 | cmp #8 ;check for wp switch on 146 | beq tj10 147 | ; 148 | cmp #11 ;check for id mismatch 149 | beq tj10 150 | ; 151 | cmp #$f ;check for nodrive 152 | bne recov 153 | tj10 bit jobrtn 154 | bmi ok 155 | jmp quit2 156 | ; 157 | ok clc ;c=0 finished ok or quit 158 | rts 159 | ; 160 | notyet sec ;c=1 not yet 161 | rts 162 | ; 163 | ; 164 | recov 165 | tya ;save .y 166 | pha 167 | lda drvnum ;save drive # 168 | pha 169 | lda lstjob,x 170 | and #1 171 | sta drvnum ;set active drive # 172 | ; 173 | tay 174 | lda ledmsk,y 175 | sta erled 176 | ; 177 | jsr dorec 178 | cmp #2 179 | bcs rec01 180 | jmp rec95 181 | rec01 182 | ; 183 | lda lstjob,x ;original job 184 | and #$f0 ;mask job code 185 | pha ;save it 186 | cmp #write 187 | bne rec0 ;not a write 188 | ; 189 | lda drvnum 190 | ora #secsek ;replace w/ sector seek... 191 | sta lstjob,x ;... during recovery 192 | rec0 193 | bit revcnt 194 | bvs rec5 ;no track offset 195 | ; 196 | lda #0 197 | sta eptr ;clr offset table ptr 198 | sta toff ;clr total offset 199 | rec1 200 | ldy eptr 201 | lda toff 202 | sec 203 | sbc offset,y 204 | sta toff ;keep track of all offsets 205 | lda offset,y 206 | jsr hedoff 207 | inc eptr ;bump table ptr 208 | jsr dorec ;do the recovery 209 | cmp #2 ;error code < 2? 210 | bcc rec3 ;job worked 211 | ; 212 | ldy eptr 213 | lda offset,y 214 | bne rec1 ;null indicates end 215 | rec3 216 | lda toff 217 | jsr hedoff 218 | lda jobs,x 219 | cmp #2 220 | bcc rec9 ;no error 221 | rec5 222 | bit revcnt ;check bump-on flag 223 | bpl rec7 ;no bump 224 | ; 225 | quit 226 | pla 227 | cmp #write ;check original job 228 | bne quit2 229 | ; 230 | ora drvnum 231 | sta lstjob,x ;must restore original 232 | quit2 233 | lda jobs,x ;.a= error # 234 | jsr error 235 | rec7 236 | pla 237 | bit jobrtn 238 | bmi rec95 ;return job error 239 | pha 240 | ; 241 | ;do the bump 242 | lda #bump 243 | ora drvnum 244 | sta jobs,x 245 | rec8 246 | lda jobs,x 247 | bmi rec8 ;wait 248 | ; 249 | jsr dorec ;try one last set 250 | cmp #2 251 | bcs quit ;it clearly ain't gonna work 252 | rec9 253 | pla ;check original job for write 254 | cmp #write 255 | bne rec95 ;original job worked 256 | ; 257 | ora drvnum 258 | sta lstjob,x ;set write job back 259 | jsr dorec ;try last set of writes 260 | cmp #2 ;check error code 261 | bcs quit2 ;error 262 | rec95 263 | pla 264 | sta drvnum ;restore drive # 265 | pla 266 | tay ;restore .y 267 | lda jobs,x 268 | clc ;ok! 269 | rts 270 | ; 271 | hedoff ;.a=offset 272 | cmp #0 273 | beq hof3 ;no offset 274 | bmi hof2 ;steps are inward 275 | hof1 276 | ldy #1 ;step out 1 track 277 | jsr movhed 278 | sec 279 | sbc #1 280 | bne hof1 ;not finished 281 | beq hof3 282 | hof2 283 | ldy #$ff ;step in 1 track 284 | jsr movhed 285 | clc 286 | adc #1 287 | bne hof2 ; not finished 288 | hof3 289 | rts 290 | ; 291 | movhed 292 | pha ;save .a 293 | tya ;put phase in .a 294 | ldy drvnum 295 | sta phase,y 296 | mh10 297 | cmp phase,y 298 | beq mh10 ;wait for controller 299 | ;to change it 300 | lda #0 301 | sta phase,y ;clear it out 302 | pla ;restore 303 | rts 304 | ; 305 | ; 306 | dorec ;do last job recovery 307 | lda revcnt ;re-try job revcnt... 308 | and #$3f ;...# of times 309 | tay 310 | dorec1 311 | lda erled 312 | eor ledprt 313 | sta ledprt 314 | lda lstjob,x ;set last job 315 | sta jobs,x 316 | dorec2 317 | lda jobs,x ;wait 318 | bmi dorec2 319 | cmp #2 320 | bcc dorec3 ;it worked 321 | ; 322 | dey 323 | bne dorec1 ;keep trying 324 | dorec3 325 | pha 326 | lda erled ;leave drive led on 327 | ora ledprt 328 | sta ledprt 329 | pla 330 | rts ;finished 331 | ; 332 | ; set header of active buffer of the 333 | ; current lindx to track,sector,id 334 | ; 335 | sethdr jsr getact 336 | seth 337 | ; asl a ;4/12***************** 338 | ; asl a 339 | asl a 340 | tay 341 | lda track 342 | sta hdrs,y ;4/12*********** ;set track 343 | lda sector 344 | sta hdrs+1,y ;4/12*********** ;set sector 345 | lda drvnum ;get proper id(drvnum) 346 | asl a 347 | tax 348 | ; lda dskid,x 349 | ; sta hdrs,y ;4/12*********** 350 | ; lda dskid+1,x 351 | ; sta hdrs+1,y ;4/12*********** 352 | rts 353 | ; 354 | -------------------------------------------------------------------------------- /lcc.bingcr.s: -------------------------------------------------------------------------------- 1 | ; fast binary to gcr 2 | ; 3 | ; 4 | put4bg lda #0 ; clear table 5 | sta gtab+1 6 | sta gtab+4 7 | ; 8 | ldy gcrpnt 9 | ; 10 | lda btab 11 | and #$f0 12 | lsr a 13 | lsr a 14 | lsr a 15 | lsr a 16 | tax 17 | lda bgtab,x 18 | ; 19 | asl a 20 | asl a 21 | asl a 22 | sta gtab 23 | ; 24 | lda btab 25 | and #$0f 26 | tax 27 | lda bgtab,x 28 | ; 29 | ror a 30 | ror gtab+1 31 | ror a 32 | ror gtab+1 33 | ; 34 | and #$07 35 | ora gtab 36 | sta (bufpnt),y 37 | ; 38 | iny 39 | ; 40 | lda btab+1 41 | and #$f0 42 | lsr a 43 | lsr a 44 | lsr a 45 | lsr a 46 | tax 47 | lda bgtab,x 48 | ; 49 | asl a 50 | ora gtab+1 51 | sta gtab+1 52 | ; 53 | ; 54 | lda btab+1 55 | and #$0f 56 | tax 57 | lda bgtab,x 58 | ; 59 | rol a 60 | rol a 61 | rol a 62 | rol a 63 | sta gtab+2 64 | ; 65 | rol a 66 | and #1 67 | ora gtab+1 68 | sta (bufpnt),y 69 | ; 70 | iny 71 | ; 72 | lda btab+2 73 | and #$f0 74 | lsr a 75 | lsr a 76 | lsr a 77 | lsr a 78 | tax 79 | lda bgtab,x 80 | ; 81 | clc 82 | ror a 83 | ora gtab+2 84 | sta (bufpnt),y 85 | iny 86 | ; 87 | ror a 88 | and #$80 89 | sta gtab+3 90 | ; 91 | lda btab+2 92 | and #$0f 93 | tax 94 | lda bgtab,x 95 | asl a 96 | asl a 97 | and #$7c 98 | ora gtab+3 99 | sta gtab+3 100 | ; 101 | lda btab+3 102 | and #$f0 103 | lsr a 104 | lsr a 105 | lsr a 106 | lsr a 107 | tax 108 | lda bgtab,x 109 | ; 110 | ror a 111 | ror gtab+4 112 | ror a 113 | ror gtab+4 114 | ror a 115 | ror gtab+4 116 | ; 117 | and #$03 118 | ora gtab+3 119 | sta (bufpnt),y 120 | iny 121 | bne bing35 122 | ; 123 | lda savpnt+1 124 | sta bufpnt+1 125 | ; 126 | ; 127 | bing35 lda btab+3 128 | and #$0f 129 | tax 130 | lda bgtab,x 131 | ora gtab+4 132 | sta (bufpnt),y 133 | iny 134 | sty gcrpnt 135 | rts 136 | ; 137 | ; 138 | ; 139 | bgtab .byte $0a 140 | .byte $0b 141 | .byte $12 142 | .byte $13 143 | .byte $0e 144 | .byte $0f 145 | .byte $16 146 | .byte $17 147 | .byte $09 148 | .byte $19 149 | .byte $1a 150 | .byte $1b 151 | .byte $0d 152 | .byte $1d 153 | .byte $1e 154 | .byte $15 155 | ; 156 | ; 157 | ; 158 | ;****************************** 159 | ;* 160 | ;* 161 | ;* binary to gcr conversion 162 | ;* 163 | ;* 164 | ;* does inplace conversion of 165 | ;* buffer to gcr using overflow 166 | ;* block 167 | ;* 168 | ;* 169 | ;* creates write image 170 | ;* 171 | ;* 1 block id char 172 | ;* 256 data bytes 173 | ;* 1 check sum 174 | ;* 2 off bytes 175 | ;* --- 176 | ;* 260 binary bytes 177 | ;* 178 | ;* 260 binary bytes >> 325 gcr 179 | ;* 180 | ;* 325 = 256 + 69 overflow 181 | ;* 182 | ;* 183 | ;******************************** 184 | ;* 185 | bingcr lda #0 ; init pointers 186 | sta bufpnt 187 | sta savpnt 188 | sta bytcnt 189 | ; 190 | lda #256-topwrt 191 | sta gcrpnt ; start saving gcr here 192 | ; 193 | sta gcrflg ; buffer converted flag 194 | ; 195 | lda bufpnt+1 ; save buffer pointer 196 | sta savpnt+1 197 | ; 198 | lda #>ovrbuf ; point at overflow 199 | sta bufpnt+1 200 | ; 201 | lda dbid ; store data block id 202 | sta btab ; and next 3 data bytes 203 | ; 204 | ldy bytcnt 205 | ; 206 | lda (savpnt),y 207 | sta btab+1 208 | iny 209 | ; 210 | lda (savpnt),y 211 | sta btab+2 212 | iny 213 | ; 214 | lda (savpnt),y 215 | sta btab+3 216 | iny 217 | ; 218 | bing07 sty bytcnt ; next byte to get 219 | ; 220 | jsr put4bg ; convert and store 221 | ; 222 | ldy bytcnt 223 | ; 224 | lda (savpnt),y 225 | sta btab 226 | iny 227 | beq bing20 228 | ; 229 | lda (savpnt),y 230 | sta btab+1 231 | iny 232 | ; 233 | lda (savpnt),y 234 | sta btab+2 235 | iny 236 | ; 237 | lda (savpnt),y 238 | sta btab+3 239 | iny 240 | ; 241 | bne bing07 ; jmp 242 | ; 243 | ; 244 | bing20 lda chksum ; store chksum 245 | sta btab+1 246 | ; 247 | lda #0 ; store 0 off byte 248 | sta btab+2 249 | sta btab+3 250 | ; 251 | jmp put4bg ; convert and store and return 252 | ; 253 | ; 254 | ; 255 | -------------------------------------------------------------------------------- /lcc.cntrl.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | ; *contrl 5 | ; 6 | ; main controller loop 7 | ; 8 | ; scans job que for jobs 9 | ; 10 | ; finds job on current track 11 | ; if it exists 12 | ; 13 | lcc 14 | ; 15 | tsx ; save current stack pointer 16 | stx savsp 17 | ; 18 | lda t1lc2 ;reset irq flag 19 | ; 20 | lda pcr2 ; enable s.o. to 6502 21 | ora #$0e ; hi output 22 | sta pcr2 23 | ; 24 | ; 25 | ; 26 | top ldy #numjob-1 ; pointer into job que 27 | ; 28 | cont10 29 | lda jobs,y ; find a job (msb set) 30 | bpl cont20 ; not one here 31 | ; 32 | cmp #jumpc ; test if its a jump command 33 | bne cont30 34 | ; 35 | tya ; put job num in .a 36 | jmp ex2 37 | ; 38 | ; 39 | cont30 40 | and #1 ; get drive # 41 | beq cont35 42 | ; 43 | sty jobn 44 | lda #$0f ;bad drive # error 45 | jmp errr 46 | ; 47 | cont35 tax 48 | sta drive 49 | ; 50 | cmp cdrive ; test if current drive 51 | beq cont40 52 | ; 53 | jsr turnon ; turn on drive 54 | lda drive 55 | sta cdrive 56 | jmp end ; go clean up 57 | ; 58 | ; 59 | cont40 lda drvst ; test if motor up to speed 60 | bmi cont50 61 | ; 62 | asl a ; test if stepping 63 | bpl que ; not stepping 64 | ; 65 | cont50 jmp end 66 | ; 67 | cont20 dey 68 | bpl cont10 69 | ; 70 | jmp end 71 | ; 72 | ; 73 | ; 74 | ; 75 | que lda #$20 ; status=running 76 | sta drvst 77 | ; 78 | ldy #numjob-1 79 | sty jobn 80 | ; 81 | que10 jsr setjb 82 | bmi que20 83 | ; 84 | que05 dec jobn 85 | bpl que10 86 | ; 87 | ; 88 | ldy nxtjob 89 | jsr setjb1 90 | ; 91 | lda nxtrk 92 | sta steps 93 | asl steps ; steps*2 94 | ; 95 | lda #$60 ; set status=stepping 96 | sta drvst 97 | ; 98 | ; 99 | ; 100 | lda (hdrpnt),y ; get dest track # 101 | sta drvtrk 102 | fin jmp end 103 | ; 104 | ; 105 | que20 and #1 ; test if same drive 106 | cmp drive 107 | bne que05 108 | ; 109 | lda drvtrk 110 | beq gotu ; uninit. track # 111 | ; 112 | sec ; calc distance to track 113 | sbc (hdrpnt),y 114 | beq gotu ; on track 115 | ; 116 | eor #$ff ; 2's comp 117 | sta nxtrk 118 | inc nxtrk 119 | ; 120 | lda jobn ; save job# and dist to track 121 | sta nxtjob 122 | ; 123 | jmp que05 124 | ; 125 | ; 126 | ; 127 | ; 128 | gotu ldx #4 ; set track and sectr 129 | lda (hdrpnt),y 130 | sta tracc 131 | ; 132 | gotu10 cmp trknum-1,x 133 | dex 134 | bcs gotu10 135 | ; 136 | lda numsec,x 137 | sta sectr 138 | ; 139 | txa ; set density 140 | asl a 141 | asl a 142 | asl a 143 | asl a 144 | asl a 145 | sta work 146 | ; 147 | lda dskcnt 148 | and #$9f ; clear density bits 149 | ora work 150 | sta dskcnt 151 | ; 152 | ldx drive ; drive num in .x 153 | ; 154 | lda job ; yes, go do the job 155 | cmp #bumpc ; test for bump 156 | beq bmp 157 | ; 158 | ; 159 | exe cmp #execd ; test if execute 160 | beq ex 161 | ; 162 | jmp seak ; do a sector seek 163 | ; 164 | ex lda jobn ; jump to buffer 165 | ex2 clc 166 | adc #>bufs 167 | sta bufpnt+1 168 | lda #0 169 | sta bufpnt 170 | ex3 jmp (bufpnt) 171 | ; 172 | ; 173 | bmp 174 | lda #$60 ; set status=stepping 175 | sta drvst 176 | ; 177 | lda dskcnt 178 | and #$ff-$03 ; set phase a 179 | sta dskcnt 180 | ; 181 | ; 182 | ; 183 | lda #256-92 ; step back 45 traks 184 | sta steps 185 | ; 186 | lda #1 ; drvtrk now 1 187 | sta drvtrk 188 | ; 189 | jmp errr ; job done return 1 190 | ; 191 | ; 192 | ; 193 | ; 194 | ; 195 | setjb ldy jobn 196 | setjb1 lda jobs,y 197 | pha 198 | bpl setj10 ; no job here 199 | ; 200 | and #$78 201 | sta job 202 | tya 203 | asl a 204 | adc #bufs 209 | sta bufpnt+1 210 | ; 211 | ; 212 | setj10 ldy #0 213 | sty bufpnt 214 | ; 215 | pla 216 | rts 217 | ; 218 | ; 219 | ; 220 | -------------------------------------------------------------------------------- /lcc.conhdr.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | ; *conhdr 5 | ; 6 | ; convert header 7 | ; into gcr search image 8 | ; and place in stab 9 | ; 10 | ; image contains : 11 | ; 12 | ; 00 id id tr sc cs hbid 13 | ; 14 | ; 15 | conhdr lda bufpnt+1 ;save buffer pointer 16 | sta savpnt+1 17 | ; 18 | lda #>stab 19 | sta bufpnt+1 20 | ; 21 | lda #short 95 | sta nxtst+1 96 | bne dostep 97 | ; 98 | inac20 ; calc the # of run steps 99 | sbc as 100 | sbc as 101 | sta rsteps 102 | ; 103 | lda as 104 | sta aclstp ; set # of accel steps 105 | lda #ssacl 108 | sta nxtst+1 109 | ; 110 | dostep lda steps 111 | bpl stpin 112 | ; 113 | stpout inc steps 114 | ldx dskcnt 115 | dex 116 | jmp stp 117 | ; 118 | short lda steps 119 | bne dostep 120 | ; 121 | lda #setle 124 | sta nxtst+1 125 | lda #5 ; settle time 126 | sta aclstp 127 | jmp end33 128 | ; 129 | setle dec aclstp 130 | bne end33 131 | ; 132 | lda drvst 133 | and #$ff-$40 134 | sta drvst 135 | ; 136 | lda #inact 139 | sta nxtst+1 140 | jmp end33 141 | ; 142 | stpin dec steps 143 | ldx dskcnt 144 | inx 145 | ; 146 | stp txa 147 | and #3 148 | sta tmp 149 | lda dskcnt 150 | and #$ff-$03 ; mask out old 151 | ora tmp 152 | sta dskcnt 153 | jmp end33 154 | ; 155 | ssacl ; sub acel factor 156 | sec 157 | lda t1hl2 158 | sbc af 159 | sta t1hc2 160 | ; 161 | dec aclstp 162 | bne ssa10 163 | ; 164 | lda as 165 | sta aclstp 166 | ; 167 | lda #ssrun 170 | sta nxtst+1 171 | ; 172 | ssa10 jmp dostep 173 | ; 174 | ssrun dec rsteps 175 | bne ssa10 176 | ; 177 | lda #ssdec 180 | sta nxtst+1 181 | bne ssa10 182 | ; 183 | ssdec ; decel 184 | lda t1hl2 185 | clc 186 | adc af 187 | sta t1hc2 188 | ; 189 | dec aclstp 190 | bne ssa10 191 | ; 192 | lda #setle 195 | sta nxtst+1 196 | ; 197 | lda #5 198 | sta aclstp ; settle timer 199 | ; 200 | ; 201 | end33 lda pcr2 ; disable s.o. to 6502 202 | and #$ff-$02 203 | sta pcr2 204 | ; 205 | rts 206 | ; 207 | ; 208 | ; 209 | -------------------------------------------------------------------------------- /lcc.fmt1.s: -------------------------------------------------------------------------------- 1 | ; 2 | fmtvar =$620 ; put format vars in jump buffer 3 | cnt = fmtvar 4 | num = fmtvar+1 5 | trys = fmtvar+3 6 | tral = fmtvar+4 7 | dtrck= fmtvar+6 8 | remdr= fmtvar+7 9 | sect = fmtvar+8 10 | ; 11 | ; 12 | ; 13 | ;* format routine for lcc 14 | ;* 15 | ;* 16 | ;* 17 | ; 18 | ; 19 | ; 20 | code 21 | formt lda ftnum ; test if formatting begun 22 | bpl l213 ; yes 23 | ; 24 | ldx drive ; no,start up by bumping 25 | lda #$60 ; status=stepping 26 | sta drvst,x 27 | ; 28 | lda #1 ; drive track =1 29 | sta drvtrk,x 30 | sta ftnum ; start on track 1 31 | ; 32 | lda #256-92 ; bump back 45 steps 33 | sta steps 34 | ; 35 | lda dskcnt ;set phase a 36 | and #$ff-$03 37 | sta dskcnt 38 | ; 39 | ; 40 | lda #10 ; 10 errors allowed 41 | sta cnt 42 | ; 43 | lda #<4000 ; first guess at track size 44 | sta num 45 | lda #>4000 46 | sta num+1 47 | ; 48 | jmp end ; back to controller 49 | ; 50 | ; 51 | ; 52 | l213 ldy #0 ; test if on right track number 53 | cmp (hdrpnt),y 54 | beq l214 55 | ; 56 | sta (hdrpnt),y ; goto right track 57 | jmp end 58 | ; 59 | ; 60 | l214 lda dskcnt ; test for write protect 61 | and #$10 62 | bne topp ; its ok 63 | ; 64 | lda #8 ; write protect error 65 | jmp fmterr 66 | ; 67 | topp jsr synclr ; erase track with sync 68 | ; 69 | jsr wrtnum ; write out num syncs 70 | ; 71 | lda #$55 ; write out num non sync 72 | sta data2 73 | ; 74 | jsr wrtnum 75 | ; 76 | jsr kill ; kill write 77 | ; 78 | jsr sync ; find sync 79 | ; 80 | lda #$40 ; set timer mode 81 | ora acr1 82 | sta acr1 83 | ; 84 | lda #100-2 ; set up 100us timer 85 | sta t1ll1 ; cont mode timer 86 | lda #0 87 | sta t1hl1 ; hi latch 88 | sta t1hc1 ; get attention of '22 89 | ; 90 | ; 91 | ; 92 | ldy #0 ; time the sync and nonsync segments 93 | ldx #0 94 | ; 95 | fwait bit dskcnt ; wait for sync 96 | bmi fwait 97 | ; 98 | fwait2 bit dskcnt ; wait for no sync 99 | bpl fwait2 100 | ; 101 | f000 lda t1lc1 ; reset ifr 102 | ; 103 | f001 bit dskcnt ; time nonsync area 104 | bpl f005 ; time until sync found 105 | ; 106 | lda ifr1 ; test for time out 107 | asl a 108 | bpl f001 ; not yet 109 | ; 110 | inx ; .x is lsb 111 | bne f000 112 | iny ; .y is msb 113 | bne f000 114 | ; 115 | lda #tolong ; cant find sync 116 | jmp fmterr 117 | ; 118 | f005 stx t2 ; save time 119 | sty t2+1 120 | ; 121 | ldx #0 ; time sync area 122 | ldy #0 123 | ; 124 | f006 lda t1lc1 ; reset ifr 125 | ; 126 | f007 bit dskcnt ; test for no sync 127 | bmi f009 128 | ; 129 | lda ifr1 ; test for time out 130 | asl a 131 | bpl f007 132 | ; 133 | inx ; count up another 100us 134 | bne f006 135 | iny ; msb 136 | bne f006 137 | ; 138 | lda #tolong ; cant be this long 139 | jmp fmterr 140 | ; 141 | ; 142 | ;* now calc the difference between 143 | ;* sync and nonsync and adjust 144 | ;* num accordingly 145 | ; 146 | f009 sec ; t1-t2 147 | txa 148 | sbc t2 149 | tax 150 | sta t1 151 | ; 152 | tya 153 | sbc t2+1 154 | tay 155 | sta t1+1 156 | ; 157 | bpl f013 ; get abs(t1-t2) 158 | ; 159 | eor #$ff ; make + 160 | tay 161 | txa 162 | eor #$ff 163 | tax 164 | inx 165 | bne f013 166 | iny 167 | ; 168 | f013 tya ; test if abs(t1-t2)<4, that is close enough 169 | bne f014 ; msb must be 0 170 | ; 171 | cpx #4 ; test lsb < 4 172 | bcc count ; its there 173 | ; 174 | f014 asl t1 ; num=num+(diff/2) 175 | rol t1+1 176 | ; 177 | clc 178 | lda t1 179 | adc num 180 | sta num 181 | ; 182 | lda t1+1 183 | adc num+1 184 | sta num+1 185 | ; 186 | jmp topp ; try again sam 187 | ; 188 | ; 189 | count ldx #0 ; now count #bytes in data segment 190 | ldy #0 191 | clv 192 | ; 193 | cnt10 lda dskcnt ; test for sync 194 | bpl cnt20 ; found sync 195 | bvc cnt10 ; test if byte time 196 | ; 197 | clv ; yes, count it 198 | inx 199 | bne cnt10 ; keep counting 200 | iny 201 | bne cnt10 ; to many ? 202 | ; 203 | lda #tomany ; tomany counts 204 | jmp fmterr 205 | ; 206 | cnt20 txa ; #bytes=count*2 207 | asl a 208 | sta tral+1 209 | ; 210 | tya 211 | rol a 212 | sta tral 213 | ; 214 | lda #$ff-$40 ; clear cont mode 215 | and acr1 216 | sta acr1 217 | ; 218 | ; 219 | -------------------------------------------------------------------------------- /lcc.fmt2.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | ds08 lda #$66 ; min block size 282*5/4 -256=85 5 | ; 6 | sta dtrck 7 | ; 8 | ldx sectr ; total bytes= min*#secors 9 | ldy #0 10 | tya 11 | ; 12 | ds10 clc ; min*#sectors 13 | adc dtrck 14 | bcc ds14 15 | ; 16 | iny ; 17 | ; 18 | ds14 iny 19 | dex 20 | bne ds10 21 | ; 22 | eor #$ff ; get 2s comp 23 | sec 24 | adc #0 25 | ; 26 | clc 27 | adc tral+1 28 | bcs ds15 29 | ; 30 | dec tral 31 | ; 32 | ds15 tax 33 | tya 34 | eor #$ff 35 | sec 36 | adc #0 37 | clc 38 | adc tral 39 | ; 40 | bpl ds17 41 | ; 42 | lda #tobig ; not enough space 43 | jmp fmterr 44 | ; 45 | ds17 tay 46 | txa 47 | ldx #0 48 | ; 49 | ds20 sec 50 | sbc sectr 51 | bcs ds22 52 | ; 53 | dey 54 | bmi ds30 55 | ; 56 | ds22 inx 57 | bne ds20 58 | ; 59 | ds30 stx dtrck 60 | cpx #gap2 ; test for min size 61 | bcs ds32 62 | ; 63 | lda #tosmal ; gap2 to small 64 | jmp fmterr 65 | ; 66 | ds32 clc 67 | adc sectr 68 | sta remdr ; get remaider size 69 | ; 70 | ; 71 | ; 72 | ; 73 | ; 74 | ; create header images 75 | ; 76 | ; 77 | lda #0 78 | sta sect 79 | ; 80 | ldy #0 81 | ldx drive 82 | ; 83 | mak10 lda hbid ; hbid cs s t id id 0f 0f 84 | sta buff0,y 85 | iny 86 | ; 87 | iny ; skip checksum 88 | ; 89 | lda sect ; store sector # 90 | sta buff0,y 91 | iny 92 | ; 93 | lda ftnum ; store track # 94 | sta buff0,y 95 | iny 96 | ; 97 | lda dskid+1,x ; store id low 98 | sta buff0,y 99 | iny 100 | ; 101 | lda dskid,x ; store id hi 102 | sta buff0,y 103 | iny 104 | ; 105 | lda #$0f ; store gap1 bytes 106 | sta buff0,y 107 | iny 108 | sta buff0,y 109 | iny 110 | ; 111 | lda #0 ;create checksum 112 | eor buff0-6,y 113 | eor buff0-5,y 114 | eor buff0-4,y 115 | eor buff0-3,y 116 | ; 117 | sta buff0-7,y ; store checksum 118 | ; 119 | ; 120 | inc sect ; goto next sector 121 | ; 122 | lda sect ; test if done yet 123 | cmp sectr 124 | bcc mak10 ; more to do 125 | ; 126 | tya ; save block size 127 | pha 128 | ; 129 | ; 130 | ; 131 | ; 132 | ; create data block of zero 133 | ; 134 | inx ; .x=0 135 | txa 136 | ; 137 | crtdat sta buff2,x 138 | inx 139 | bne crtdat 140 | ; 141 | ; 142 | ; convert header block to gcr 143 | ; 144 | lda #>buff0 145 | sta bufpnt+1 ; point at buffer 146 | ; 147 | jsr fbtog ; convert to gcr with no bid char 148 | ; 149 | pla ; restore block size 150 | tay ; move buffer up 79 bytes 151 | dey ; for i=n-1 to 0:mem[i+69]:=mem[i]:next 152 | jsr movup ;move buf0 up 69 bytes 153 | ; 154 | jsr movovr ; move ovrbuf up to buffer 155 | ; 156 | ; 157 | ; 158 | ; convert data block to gcr 159 | ; write image 160 | ; 161 | ; leave it in ovrbuf and buffer 162 | ; 163 | ; 164 | lda #>buff2 ; point at buffer 165 | sta bufpnt+1 166 | ; 167 | ; 168 | jsr chkblk ; get block checksum 169 | sta chksum 170 | jsr bingcr 171 | ; 172 | ; 173 | ; 174 | ; start the format now 175 | ; 176 | ; write out sync header gap1 177 | ; data block 178 | ; 179 | ; 180 | ; 181 | lda #0 ; init counter 182 | sta hdrpnt 183 | ; 184 | jsr clear ; clear disk 185 | ; 186 | wrtsyn lda #$ff ; write sync 187 | sta data2 188 | ; 189 | ldx #numsyn ; write 4 sync 190 | ; 191 | wrts10 bvc * 192 | clv 193 | ; 194 | dex 195 | bne wrts10 196 | ; 197 | ldx #10 ; write out header 198 | ldy hdrpnt 199 | ; 200 | wrts20 bvc * 201 | clv 202 | ; 203 | lda buff0,y ; get header data 204 | sta data2 205 | ; 206 | iny 207 | dex 208 | bne wrts20 209 | ; 210 | ; 211 | ; * write out gap1 212 | ; 213 | ldx #gap1-2 ; write gcr bytes 214 | ; 215 | wrts30 bvc * 216 | clv 217 | ; 218 | lda #$55 219 | sta data2 220 | ; 221 | dex 222 | bne wrts30 223 | ; 224 | ; 225 | ; 226 | ; * write out data block 227 | ; 228 | lda #$ff ; write data block sync 229 | ; 230 | ldx #numsyn 231 | ; 232 | dbsync bvc * 233 | clv 234 | ; 235 | sta data2 236 | ; 237 | dex 238 | bne dbsync 239 | ; 240 | ldx #256-topwrt ; write out ovrbuf 241 | ; 242 | wrts40 bvc * 243 | clv 244 | ; 245 | lda ovrbuf,x 246 | sta data2 247 | ; 248 | inx 249 | bne wrts40 250 | ; 251 | ; 252 | ldy #0 253 | ; 254 | wrts50 bvc * 255 | clv 256 | ; 257 | lda (bufpnt),y 258 | sta data2 259 | ; 260 | iny 261 | bne wrts50 262 | ; 263 | lda #$55 ; write gap2(dtrck) 264 | ldx dtrck 265 | ; 266 | wgp2 bvc * 267 | clv 268 | ; 269 | sta data2 270 | dex 271 | bne wgp2 272 | ; 273 | ; ldx #20 ; write erase trail gap 274 | ;wgp3 bvc * 275 | ; clv 276 | ; dex 277 | ; bne wgp3 278 | ; 279 | lda hdrpnt ; advance header pointer 280 | clc 281 | adc #10 282 | sta hdrpnt 283 | ; 284 | ; 285 | ; 286 | ; done writing sector 287 | ; 288 | dec sect ; go to next on 289 | bne wrtsyn ; more to do 290 | ; 291 | bvc * ; wait for last one to write 292 | clv 293 | ; 294 | bvc * 295 | clv 296 | ; 297 | jsr kill ; goto read mode 298 | ; 299 | ; 300 | ; 301 | -------------------------------------------------------------------------------- /lcc.fmt3.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | ;* format done, now verify it 5 | ; 6 | ; 7 | ; 8 | lda #200 ; look at 200 syncs 9 | sta trys 10 | ; 11 | comp lda #0 ; pointer into headers 12 | sta bufpnt 13 | ; 14 | lda #>buff0 ; 15 | sta bufpnt+1 16 | ; 17 | lda sectr ; sector counter 18 | sta sect 19 | ; 20 | cmpr10 jsr sync ; find sync 21 | ; 22 | ldx #10 23 | ldy #0 24 | ; 25 | cmpr15 bvc * ; get header byte 26 | clv 27 | ; 28 | lda data2 29 | cmp (bufpnt),y ; compare gcr 30 | ; 31 | bne cmpr20 ;error 32 | ; 33 | iny 34 | dex 35 | bne cmpr15 ; test all bytes 36 | ; 37 | clc ; update headr pointer 38 | lda bufpnt 39 | adc #10 40 | sta bufpnt 41 | ; 42 | jmp tstdat ; now test data 43 | ; 44 | cmpr20 dec trys ; test if too many errors 45 | bne comp 46 | ; 47 | lda #notfnd ; too many error 48 | jmp fmterr 49 | ; 50 | tstdat jsr sync ; find data sync 51 | ; 52 | ldy #256-topwrt ; 53 | ; 54 | tst05 bvc * 55 | clv 56 | ; 57 | lda data2 ; compare gcr 58 | cmp ovrbuf,y 59 | ; 60 | bne cmpr20 ; error 61 | ; 62 | iny 63 | bne tst05 ; do all ovrbuf 64 | ; 65 | ldx #255-3 ; now do buffer, dont test off bytes 66 | ; 67 | tst10 bvc * 68 | clv 69 | ; 70 | lda data2 71 | cmp buff2,y 72 | bne cmpr20 73 | ; 74 | iny 75 | dex 76 | bne tst10 77 | ; 78 | ; 79 | dec sect ; more sectors to test? 80 | bne cmpr10 ; yes 81 | ; 82 | ; 83 | ; all sectors done ok 84 | ; 85 | inc ftnum ; goto next track 86 | lda ftnum 87 | cmp #36 ; #tracks max 88 | bcs fmtend 89 | ; 90 | jmp end ; more to do 91 | ; 92 | ; 93 | fmtend lda #$ff ; clear ftnum 94 | sta ftnum 95 | ; 96 | lda #$0 ; clear gcr buffer flag 97 | sta gcrflg 98 | ; 99 | lda #1 ; return ok code 100 | jmp errr 101 | ; 102 | ; 103 | ; 104 | -------------------------------------------------------------------------------- /lcc.fmt4.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | synclr lda pcr2 ; write entire track with sync 5 | and #$ff-$e0 6 | ora #$c0 7 | sta pcr2 8 | ; 9 | lda #$ff ; output mode ddr 10 | sta ddra2 11 | ; 12 | sta data2 ; sync char 13 | ; 14 | ldx #$28 ; $28*256 bytes 15 | ldy #0 16 | ; 17 | syc10 bvc * 18 | clv 19 | ; 20 | dey 21 | bne syc10 22 | ; 23 | dex 24 | bne syc10 25 | ; 26 | rts ; leave write on 27 | ; 28 | ; 29 | ; 30 | wrtnum ldx num ; write out num bytes 31 | ldy num+1 32 | ; 33 | wrtn10 bvc * 34 | clv 35 | ; 36 | dex 37 | bne wrtn10 38 | ; 39 | dey 40 | bpl wrtn10 41 | ; 42 | rts 43 | ; 44 | ; 45 | ; 46 | fmterr dec cnt ; test for retry 47 | beq fmte10 48 | ; 49 | jmp end 50 | ; 51 | fmte10 52 | ; 53 | ldy #$ff 54 | sty ftnum ; clear format 55 | ; 56 | iny 57 | sty gcrflg 58 | ; 59 | jmp errr 60 | ; 61 | ; 62 | ; 63 | movup lda buff0,y ; move up 69 bytes 64 | sta buff0+69,y ; move from top down 65 | dey 66 | bne movup 67 | ; 68 | lda buff0 ; do last byte 69 | sta buff0+69 70 | rts 71 | ; 72 | ; 73 | ; 74 | ; 75 | movovr ldy #68 ; move ovrbuf into (buffer) 76 | ; 77 | movo10 lda ovrbuf+256-topwrt,y 78 | sta (bufpnt),y 79 | ; 80 | dey 81 | bpl movo10 82 | ; 83 | rts 84 | ; 85 | ; 86 | ; 87 | kill lda pcr2 ; disable write 88 | ora #$e0 89 | sta pcr2 90 | lda #$00 ; make port input now 91 | sta ddra2 92 | ; 93 | rts 94 | ; 95 | ; 96 | ; 97 | xclear lda pcr2 ; enable write 98 | and #$ff-$e0 99 | ora #$c0 100 | sta pcr2 101 | ; 102 | lda #$ff ; make port an output 103 | sta ddra2 104 | ; 105 | lda #$55 ; write a 1f pattern 106 | sta data2 107 | ; 108 | ldx #$28 ; $28*256 chars 109 | ldy #00 110 | xcler10 bvc * 111 | clv 112 | dey 113 | bne xcler10 114 | ; 115 | dex 116 | bne xcler10 117 | ; 118 | rts 119 | ; 120 | ;***************************** 121 | ;* 122 | ;* 123 | ;* fbtog 124 | ;* format binary to gcr conversion 125 | ;* 126 | ;* converts buffer to gcr with out hbid 127 | ;* 128 | ;*************************** 129 | ; 130 | fbtog lda #0 ; point at buffer 131 | sta bufpnt 132 | sta savpnt 133 | sta bytcnt 134 | ; 135 | lda #256-topwrt ; put gcr in ovrflow buffer 136 | sta gcrpnt 137 | ; 138 | lda bufpnt+1 ; save buffer pointer 139 | sta savpnt+1 140 | ; 141 | lda #>ovrbuf 142 | sta bufpnt+1 ; store in overbuf 143 | ; 144 | fbg10 ldy bytcnt ; get pointer 145 | ; 146 | lda (savpnt),y 147 | sta btab 148 | iny 149 | ; 150 | lda (savpnt),y 151 | sta btab+1 152 | iny 153 | ; 154 | lda (savpnt),y 155 | sta btab+2 156 | iny 157 | ; 158 | lda (savpnt),y 159 | sta btab+3 160 | iny 161 | beq fbg15 ; test if done 162 | ; 163 | sty bytcnt ; save pointer 164 | ; 165 | jsr put4bg ; convert and store 166 | ; 167 | jmp fbg10 168 | ; 169 | fbg15 jmp put4bg ; done, return 170 | ; 171 | -------------------------------------------------------------------------------- /lcc.gcrbin.s: -------------------------------------------------------------------------------- 1 | mask1=$f8 2 | mask2=$07 3 | mask2x=$c0 4 | mask3=$3e 5 | mask4=$01 6 | mask4x=$f0 7 | mask5=$0f 8 | mask5x=$80 9 | mask6=$7c 10 | mask7=$03 11 | mask7x=$e0 12 | mask8=$1f 13 | ; 14 | ; 15 | ; 16 | ; 17 | ; 18 | ; fast gcr to binary conversion 19 | ; 20 | ; 21 | get4gb ldy gcrpnt 22 | ; 23 | lda (bufpnt),y 24 | and #mask1 25 | lsr a 26 | lsr a 27 | lsr a 28 | sta gtab ; hi nibble 29 | ; 30 | lda (bufpnt),y 31 | and #mask2 32 | asl a 33 | asl a 34 | sta gtab+1 35 | ; 36 | iny ; next byte 37 | bne xx05 ; test for next buffer 38 | lda nxtbf 39 | sta bufpnt+1 40 | ldy nxtpnt 41 | ; 42 | xx05 lda (bufpnt),y 43 | and #mask2x 44 | rol a 45 | rol a 46 | rol a 47 | ora gtab+1 48 | sta gtab+1 49 | ; 50 | lda (bufpnt),y 51 | and #mask3 52 | lsr a 53 | sta gtab+2 54 | ; 55 | lda (bufpnt),y 56 | and #mask4 57 | asl a 58 | asl a 59 | asl a 60 | asl a 61 | sta gtab+3 62 | ; 63 | iny ; next 64 | ; 65 | lda (bufpnt),y 66 | and #mask4x 67 | lsr a 68 | lsr a 69 | lsr a 70 | lsr a 71 | ora gtab+3 72 | sta gtab+3 73 | ; 74 | lda (bufpnt),y 75 | and #mask5 76 | asl a 77 | sta gtab+4 78 | ; 79 | iny ; next byte 80 | ; 81 | lda (bufpnt),y 82 | and #mask5x 83 | clc 84 | rol a 85 | rol a 86 | and #1 87 | ora gtab+4 88 | sta gtab+4 89 | ; 90 | lda (bufpnt),y 91 | and #mask6 92 | lsr a 93 | lsr a 94 | sta gtab+5 95 | ; 96 | lda (bufpnt),y 97 | and #mask7 98 | asl a 99 | asl a 100 | asl a 101 | sta gtab+6 102 | ; 103 | iny ; test for overflow during write to binary conversion 104 | bne xx06 105 | lda nxtbf 106 | sta bufpnt+1 107 | ldy nxtpnt 108 | ; 109 | xx06 lda (bufpnt),y 110 | and #mask7x 111 | rol a 112 | rol a 113 | rol a 114 | rol a 115 | ora gtab+6 116 | sta gtab+6 117 | ; 118 | lda (bufpnt),y 119 | and #mask8 120 | sta gtab+7 121 | iny 122 | ; 123 | sty gcrpnt 124 | ; 125 | ; 126 | ldx gtab 127 | lda gcrhi,x 128 | ldx gtab+1 129 | ora gcrlo,x 130 | sta btab 131 | ; 132 | ldx gtab+2 133 | lda gcrhi,x 134 | ldx gtab+3 135 | ora gcrlo,x 136 | sta btab+1 137 | ; 138 | ldx gtab+4 139 | lda gcrhi,x 140 | ldx gtab+5 141 | ora gcrlo,x 142 | sta btab+2 143 | ; 144 | ldx gtab+6 145 | lda gcrhi,x 146 | ldx gtab+7 147 | ora gcrlo,x 148 | sta btab+3 149 | ; 150 | rts 151 | ; 152 | ; 153 | ; 154 | gcrhi .byte $ff ;error 155 | .byte $ff ;error 156 | .byte $ff ;error 157 | .byte $ff ;error 158 | .byte $ff ;error 159 | .byte $ff ;error 160 | .byte $ff ;error 161 | .byte $ff ;error 162 | .byte $ff ;error 163 | .byte $80 164 | .byte $00 165 | .byte $10 166 | .byte $ff ;error 167 | .byte $c0 168 | .byte $40 169 | .byte $50 170 | .byte $ff ;error 171 | .byte $ff ;error 172 | .byte $20 173 | .byte $30 174 | .byte $ff ;error 175 | .byte $f0 176 | .byte $60 177 | .byte $70 178 | .byte $ff ;error 179 | .byte $90 180 | .byte $a0 181 | .byte $b0 182 | .byte $ff ;error 183 | .byte $d0 184 | .byte $e0 185 | .byte $ff ;error 186 | ; 187 | ; 188 | ; 189 | gcrlo .byte $ff ;error 190 | .byte $ff ;error 191 | .byte $ff ;error 192 | .byte $ff ;error 193 | .byte $ff ;error 194 | .byte $ff ;error 195 | .byte $ff ;error 196 | .byte $ff ;error 197 | .byte $ff ;error 198 | .byte 8 199 | .byte $00 200 | .byte 1 201 | .byte $ff ;error 202 | .byte $c 203 | .byte 4 204 | .byte 5 205 | .byte $ff ;error 206 | .byte $ff ;error 207 | .byte 2 208 | .byte 3 209 | .byte $ff ;error 210 | .byte $f 211 | .byte 6 212 | .byte 7 213 | .byte $ff ;error 214 | .byte 9 215 | .byte $a 216 | .byte $b 217 | .byte $ff ;error 218 | .byte $d 219 | .byte $e 220 | .byte $ff ;error 221 | ; 222 | ; 223 | gcrbin lda #0 ; setup pointers 224 | sta gcrpnt 225 | sta savpnt 226 | sta bytcnt 227 | ; 228 | lda #>ovrbuf 229 | sta nxtbf 230 | ; 231 | lda #255-toprd 232 | sta nxtpnt 233 | ; 234 | lda bufpnt+1 235 | sta savpnt+1 236 | ; 237 | jsr get4gb 238 | ; 239 | lda btab 240 | sta bid ; get header id 241 | ; 242 | ldy bytcnt 243 | lda btab+1 244 | sta (savpnt),y 245 | iny 246 | ; 247 | lda btab+2 248 | sta (savpnt),y 249 | iny 250 | ; 251 | lda btab+3 252 | sta (savpnt),y 253 | iny 254 | ; 255 | gcrb10 sty bytcnt 256 | ; 257 | jsr get4gb 258 | ; 259 | ldy bytcnt 260 | ; 261 | lda btab 262 | sta (savpnt),y 263 | iny 264 | beq gcrb20 ; test if done yet 265 | ; 266 | lda btab+1 267 | sta (savpnt),y 268 | iny 269 | ; 270 | lda btab+2 271 | sta (savpnt),y 272 | iny 273 | ; 274 | lda btab+3 275 | sta (savpnt),y 276 | iny 277 | ; 278 | bne gcrb10 ; jmp 279 | ; 280 | gcrb20 281 | lda btab+1 282 | sta chksum 283 | lda savpnt+1 ;restore buffer pointer 284 | sta bufpnt+1 285 | ; 286 | rts 287 | ; 288 | ; 289 | ; 290 | -------------------------------------------------------------------------------- /lcc.i_o.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | ; 5 | ; defs for low cost controller 6 | ; 7 | ; 8 | ; written by glenn stark 9 | ; 4/1/80 10 | ; 11 | ; 12 | ; (c) commodore business machines 13 | ; 14 | timer1 =$1805 ; timer 1 counter 15 | ; 16 | ; 17 | ; 18 | ; mos 6522 19 | ; address $1c00 20 | ; 21 | .segment "S1C00" 22 | ; 23 | dskcnt .res 1 ; port b 24 | ; disk i/o control lines 25 | ; bit 0: step in 26 | ; bit 1: step out 27 | ; bit 2: -motor on 28 | ; bit 3: act led 29 | ; bit 4: write protect sense 30 | ; bit 5: density select 0 31 | ; bit 6: density select 1 32 | ; bit 7: sync detect 33 | ; 34 | ; 35 | data2 .res 1 ; port a 36 | ; gcr data input and output port 37 | ; 38 | ddrb2 .res 1 ; data direction control 39 | ddra2 .res 1 ; data direction control 40 | ; 41 | t1lc2 .res 1 ; timer 1 low counter 42 | t1hc2 .res 1 ; timer 1 hi countr 43 | ; 44 | t1ll2 .res 1 ; timer 1 low latch 45 | t1hl2 .res 1 ; timer 1 hi latch 46 | ; 47 | t2ll2 .res 1 ; timer two low latch 48 | t2lh2 .res 1 ; timer two hi latch 49 | ; 50 | sr2 .res 1 ; shift register 51 | ; 52 | acr2 .res 1 53 | ; 54 | pcr2 .res 1 55 | ; 56 | ifr2 .res 1 57 | ; 58 | ier2 .res 1 59 | ; 60 | ; 61 | ; 62 | ; 63 | ; 64 | -------------------------------------------------------------------------------- /lcc.init.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | ; initialization of controller 5 | ; 6 | ; 7 | ; 8 | cntint lda #%01101111 ; data direction 9 | sta ddrb2 10 | and #$ff-$08-$04-$03 ; turn motor off,set phase a, led off 11 | sta dskcnt 12 | ; 13 | ; 14 | lda pcr2 ; set edge and latch mode 15 | and #$ff-$01 ; neg edge please 16 | ; 17 | ; 18 | ; ca2: soe output hi disable s.o. into 6502 19 | ; 20 | ora #$0e 21 | ; 22 | ; 23 | ; cb1 input only 24 | ; 25 | ; cb2 mode control r/w 26 | ; 27 | ora #$e0 28 | sta pcr2 29 | ; 30 | ; 31 | lda #$41 ; cont irq, latch mode 32 | sta acr2 33 | ; 34 | ;--------9/25 rom05-bc------------- 35 | lda #0 36 | sta t1ll2 37 | lda #tim ; / 15 ms /irq 38 | sta t1hl2 39 | sta t1hc2 ; get 6522's attention 40 | ;---------------------------------- 41 | ; 42 | lda #$7f ; clear all irq sources 43 | sta ier2 44 | ; 45 | lda #$80+$40 46 | sta ifr2 ; clear bit 47 | sta ier2 ; enable irq 48 | ; 49 | ; 50 | lda #$ff ; no current drive 51 | sta cdrive 52 | sta ftnum ; init format flag 53 | ; 54 | lda #$08 ; header block id 55 | sta hbid 56 | ; 57 | lda #$07 ; data block id 58 | sta dbid 59 | ; 60 | lda #inact 63 | sta nxtst+1 64 | ; 65 | lda #200 66 | sta minstp 67 | ; 68 | lda #4 69 | sta as 70 | ; 71 | lda #$4 72 | sta af 73 | ; 74 | -------------------------------------------------------------------------------- /lcc.read.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | ; 5 | ; 6 | ; *read 7 | ; 8 | ; read in track,sector specified 9 | ; in header 10 | ; 11 | ; 12 | reed cmp #0 ; test if read job 13 | beq read01 ; go test if write 14 | jmp wright 15 | ; 16 | read01 jsr dstrt ; find header and start reading data 17 | ; 18 | read11 bvc * ; wait for byte 19 | clv 20 | ; 21 | lda data2 ; store away data 22 | sta (bufpnt),y ; in data buffer 23 | iny 24 | bne read11 25 | ; 26 | ldy #255-toprd ; store rest in overflow buffer 27 | ; 28 | read20 bvc * 29 | clv 30 | ; 31 | lda data2 32 | sta ovrbuf,y 33 | iny 34 | bne read20 35 | ; 36 | jsr gcrbin ; convert buffer to binary 37 | ; 38 | lda bid ; test if its a data block 39 | cmp dbid 40 | beq read28 41 | ; 42 | lda #4 ; not a data block 43 | jmp errr 44 | ; 45 | read28 jsr chkblk ; calc checksum 46 | ; 47 | cmp chksum 48 | beq read40 49 | ; 50 | lda #5 ; data block checksum error 51 | .byte skip2 52 | ; 53 | read40 lda #1 ; read data block ok 54 | jmp errr 55 | ; 56 | ; 57 | ; 58 | dstrt jsr srch ; find header 59 | jmp sync ; and then data block sync 60 | ; 61 | ; 62 | srch lda drive ; create header image 63 | asl a 64 | tax 65 | ; 66 | lda dskid,x ; get master id for the drive 67 | sta header 68 | lda dskid+1,x 69 | sta header+1 70 | ; 71 | ldy #0 ; get track,sector 72 | lda (hdrpnt),y 73 | sta header+2 74 | iny 75 | lda (hdrpnt),y 76 | sta header+3 77 | ; 78 | lda #0 79 | ;create header checksum 80 | eor header 81 | eor header+1 82 | eor header+2 83 | eor header+3 84 | ; 85 | sta header+4 ; store the checksum 86 | ; 87 | jsr conhdr ; convert header to gcr 88 | ; 89 | ldx #90 ; search 90 sync chars 90 | ; 91 | srch20 jsr sync ; find sync 92 | ; 93 | ldy #0 ; test 8 gcr bytes 94 | ; 95 | srch25 bvc * 96 | clv ; wait for byte 97 | ; 98 | lda data2 99 | cmp stab,y ; test if the same 100 | bne srch30 ; nope 101 | ; 102 | iny 103 | cpy #8 104 | bne srch25 105 | ; 106 | rts 107 | ; 108 | ; 109 | srch30 dex ;try again 110 | bne srch20 111 | ; 112 | lda #2 ; cant find this header 113 | err jmp errr 114 | ; 115 | ; 116 | ; 117 | ; 118 | sync 119 | ; 120 | lda #$80+80 ; wait 20 ms for sync max 121 | sta timer1 122 | ; 123 | lda #3 ; error code for no sync 124 | ; 125 | sync10 bit timer1 ; test for time out 126 | bpl err 127 | bit dskcnt ; test for sync 128 | bmi sync10 129 | ; 130 | ; 131 | lda data2 ; reset pa latch 132 | clv 133 | ldy #0 ; clear pointer 134 | rts 135 | ; 136 | ; 137 | ; 138 | -------------------------------------------------------------------------------- /lcc.seek.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | seak ldx #90 ; search 90 headers 5 | stx tmp 6 | ; 7 | ldx #0 ;read in 8 gcr bytes 8 | ; 9 | lda #$52 ; header block id 10 | sta stab 11 | ; 12 | seek10 jsr sync ; find sync char 13 | ; 14 | bvc * ; wait for block id 15 | clv 16 | ; 17 | lda data2 18 | cmp stab ; test if header block 19 | bne seek20 ; not header 20 | ; 21 | seek15 bvc * 22 | clv ; read in gcr header 23 | ; 24 | lda data2 25 | sta stab+1,x 26 | ; 27 | inx 28 | cpx #7 29 | bne seek15 30 | ; 31 | jsr cnvbin ; convert header in stab to binary in header 32 | ; 33 | ldy #4 ; compute checksum 34 | lda #0 35 | ; 36 | seek30 eor header,y 37 | dey 38 | bpl seek30 39 | ; 40 | cmp #0 ; test if ok 41 | bne cserr ; nope, checksum error in header 42 | ; 43 | ldx cdrive ; update drive track# 44 | lda header+2 45 | sta drvtrk,x 46 | ; 47 | lda job ; test if a seek job 48 | cmp #$30 49 | beq eseek 50 | ; 51 | lda cdrive 52 | asl a ; test if correct id 53 | tay 54 | lda dskid,y 55 | cmp header 56 | bne badid 57 | lda dskid+1,y 58 | cmp header+1 59 | bne badid 60 | ; 61 | jmp wsect ; find best sector to service 62 | ; 63 | ; 64 | seek20 dec tmp ; search more? 65 | bne seek10 ;yes 66 | ; 67 | lda #2 ; cant find a sector 68 | jsr errr 69 | ; 70 | ; 71 | eseek lda header ;harris fix.... 72 | sta dskid ;.... 73 | lda header+1 ;.... 74 | sta dskid+1 ;.... 75 | ; 76 | done lda #1 ; return ok code 77 | .byte skip2 78 | ; 79 | badid lda #11 ; disk id mismatch 80 | .byte skip2 81 | ; 82 | cserr lda #9 ; checksum error in header 83 | jmp errr 84 | ; 85 | ; 86 | ; 87 | wsect lda #$7f ; find best job 88 | sta csect 89 | ; 90 | lda header+3 ; get upcoming sector # 91 | clc 92 | adc #2 93 | cmp sectr 94 | bcc l460 95 | ; 96 | sbc sectr ;wrap around 97 | ; 98 | l460 sta nexts ; next sector 99 | ; 100 | ldx #numjob-1 101 | stx jobn 102 | ; 103 | ldx #$ff 104 | ; 105 | l480 jsr setjb 106 | bpl l470 107 | ; 108 | sta work 109 | and #1 110 | cmp cdrive ; test if same drive 111 | bne l470 ; nope 112 | ; 113 | ldy #0 ; test if same track 114 | lda (hdrpnt),y 115 | cmp tracc 116 | bne l470 117 | ; 118 | lda job ; test if execute job 119 | cmp #execd 120 | beq l465 121 | ; 122 | ldy #1 123 | sec 124 | lda (hdrpnt),y 125 | sbc nexts 126 | bpl l465 127 | ; 128 | clc 129 | adc sectr 130 | ; 131 | l465 cmp csect 132 | bcs l470 133 | ; 134 | pha ; save it 135 | lda job 136 | beq tstrdj ; must be a read 137 | ; 138 | pla 139 | cmp #wrtmin ; [if(csect<9)return; 140 | bcc l470 ; [if(csect>12)return; 141 | ; 142 | cmp #wrtmax 143 | bcs l470 144 | ; 145 | doitt sta csect ;its better 146 | lda jobn 147 | tax 148 | adc #>bufs 149 | sta bufpnt+1 150 | ; 151 | bne l470 152 | ; 153 | tstrdj pla 154 | cmp #rdmax ; if(csect>6)return; 155 | bcc doitt 156 | ; 157 | ; 158 | l470 dec jobn 159 | bpl l480 160 | ; 161 | txa ; test if a job to do 162 | bpl l490 163 | ; 164 | jmp end ; no job found 165 | ; 166 | l490 stx jobn 167 | jsr setjb 168 | lda job 169 | jmp reed 170 | ; 171 | ; 172 | ; 173 | ; 174 | cnvbin lda bufpnt 175 | pha 176 | lda bufpnt+1 177 | pha ; save buffer pntr 178 | ; 179 | lda #stab 182 | sta bufpnt+1 183 | ; 184 | lda #0 185 | sta gcrpnt 186 | ; 187 | jsr get4gb ; convert 4 bytes 188 | ; 189 | lda btab+3 190 | sta header+2 191 | ; 192 | lda btab+2 193 | sta header+3 194 | ; 195 | lda btab+1 196 | sta header+4 197 | ; 198 | ; 199 | jsr get4gb ; get 2 more 200 | ; 201 | lda btab ; get id 202 | sta header+1 203 | lda btab+1 204 | sta header 205 | ; 206 | pla 207 | sta bufpnt+1 ;restore pointer 208 | pla 209 | sta bufpnt 210 | ; 211 | rts 212 | ; 213 | ; 214 | ; 215 | ; 216 | ; 217 | ; 218 | ; 219 | -------------------------------------------------------------------------------- /lcc.util.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; * utiliy routines 4 | ; 5 | ; 6 | errr ldy jobn ; return job code 7 | sta jobs,y 8 | ; 9 | lda gcrflg ; test if buffer left gcr 10 | beq errr10 ; no 11 | ; 12 | jsr wtobin ; convert back to binary 13 | ; 14 | errr10 15 | jsr trnoff ; start timeout on drive 16 | ; 17 | ldx savsp 18 | txs ; reset stack pointer 19 | ; 20 | jmp top ; back to the top 21 | ; 22 | ; 23 | ; 24 | turnon lda #$a0 ; turn on drive 25 | ; drvst=acel and on 26 | sta drvst 27 | ; 28 | ; 29 | lda dskcnt ; turn motor on and select drive 30 | ora #$04 ; turn motor on 31 | sta dskcnt 32 | ; 33 | lda #60 ; delay 1.5 sec 34 | sta acltim 35 | ; 36 | rts 37 | ; 38 | ; 39 | ; 40 | trnoff ldx cdrive ; start time out of current drive 41 | lda drvst ;status=timeout 42 | ora #$10 43 | sta drvst 44 | ; 45 | lda #255 ; 255*.025s time out 46 | sta acltim 47 | ; 48 | rts 49 | ; 50 | ; 51 | ; 52 | -------------------------------------------------------------------------------- /lcc.var.s: -------------------------------------------------------------------------------- 1 | ; 2 | drvst .res 2 3 | drvtrk .res 2 4 | stab .res 10 5 | ; variables 6 | ; 7 | ; pointers 8 | savpnt .res 2 9 | bufpnt .res 2 10 | hdrpnt .res 2 11 | ; 12 | ; 13 | gcrpnt .res 1 14 | gcrerr .res 1 ; indicates gcr decode error 15 | bytcnt .res 1 16 | bitcnt .res 1 17 | bid .res 1 18 | hbid .res 1 19 | chksum .res 1 20 | hinib .res 1 21 | byte .res 1 22 | drive .res 1 23 | cdrive .res 1 24 | jobn .res 1 25 | tracc .res 1 26 | nxtjob .res 1 27 | nxtrk .res 1 28 | sectr .res 1 29 | work .res 1 30 | job .res 1 31 | ctrack .res 1 32 | dbid .res 1 ; data block id 33 | acltim .res 1 ; acel time delay 34 | savsp .res 1 ; save stack pointer 35 | steps .res 1 ; steps to desired track 36 | tmp .res 1 37 | csect .res 1 38 | nexts .res 1 39 | nxtbf .res 1 ; pointer at next gcr source buffer 40 | nxtpnt .res 1 ; and next gcr byte location in buffer 41 | gcrflg .res 1 ; buffer in gcr image 42 | ftnum .res 1 ; current format track 43 | btab .res 4 44 | gtab .res 8 45 | ; 46 | as .res 1 ; # of steps to acel 47 | af .res 1 ; acel. factor 48 | aclstp .res 1 ; steps to go 49 | rsteps .res 1 ; # of run steps 50 | nxtst .res 2 51 | minstp .res 1 ; min reqired to acel 52 | ; 53 | ; 54 | ; 55 | ; constants 56 | ; 57 | ovrbuf =$0100 ; top of stack 58 | numjob =6 ; number of jobs 59 | jmpc =$50 ; jump command 60 | bumpc =$40 ; bump command 61 | execd =$60 ; execute command 62 | bufs =$0300 ; start of buffers 63 | buff0 =bufs 64 | buff1 =bufs+$100 65 | buff2 =bufs+$200 66 | tolong =$2 ; format errors 67 | tomany =$3 68 | tobig =$4 69 | tosmal =$5 70 | notfnd =$6 71 | skip2 =$2c ; bit abs 72 | toprd =69 ; top of read overflo buffer on a read 73 | topwrt =69 ; top of write overflo buffer on a write 74 | numsyn = 5 ; gcr byte count for size of sync area 75 | gap1 = 11 ; gap after header to clear erase in gcr bytes 76 | gap2 = 4 ; gap after data block min size 77 | rdmax = 6 ; sector distance wait 78 | wrtmin = 9 79 | wrtmax = 12 80 | tim =58 ;irq rate for 15ms 81 | ; 82 | ; 83 | ; 84 | ; 85 | ; 86 | ; 87 | -------------------------------------------------------------------------------- /lcc.wrt.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | ; * write job 5 | ; 6 | ; write out data buffer 7 | ; 8 | ; 9 | wright cmp #$10 ; test if write 10 | beq wrt05 11 | ; 12 | jmp vrfy 13 | ; 14 | wrt05 jsr chkblk ; get block checksum 15 | sta chksum 16 | ; 17 | lda dskcnt ; test for write protect 18 | and #$10 19 | bne wrt10 ; not protected 20 | ; 21 | lda #8 ; write protect error 22 | jmp errr 23 | ; 24 | wrt10 jsr bingcr ; convert buffer to write image 25 | ; 26 | jsr srch ; find header 27 | ; 28 | ldx #gap1-2 ; wait out header gap 29 | ; 30 | wrt20 bvc * 31 | clv 32 | ; 33 | dex ; test if done yet 34 | bne wrt20 35 | ; 36 | lda #$ff ; make output $ff 37 | sta ddra2 38 | ; 39 | lda pcr2 ; set write mode 40 | and #$ff-$e0 41 | ora #$c0 42 | sta pcr2 43 | ; 44 | lda #$ff ; write 5 gcr sync 45 | ldx #numsyn ; 46 | sta data2 47 | clv 48 | ; 49 | wrtsnc bvc * 50 | ; 51 | clv 52 | dex 53 | bne wrtsnc 54 | ; 55 | ldy #256-topwrt ; write out overflow buffer 56 | ; 57 | wrt30 lda ovrbuf,y ; get a char 58 | bvc * ; wait until ready 59 | clv 60 | ; 61 | sta data2 ; stuff it 62 | iny 63 | bne wrt30 ; do next char 64 | ; 65 | ; write rest of buffer 66 | ; 67 | wrt40 lda (bufpnt),y ; now do buffer 68 | bvc * ; wait until ready 69 | clv 70 | ; 71 | sta data2 ; stuff it again 72 | iny 73 | ; test if done 74 | bne wrt40 ; do the whole thing 75 | ; 76 | bvc * ; wait for last char to write out 77 | ; 78 | ; 79 | lda pcr2 ; goto read mode 80 | ora #$e0 81 | sta pcr2 82 | ; 83 | lda #0 ; make data2 input $00 84 | sta ddra2 85 | ; 86 | jsr wtobin ; convert write image to binary 87 | ; 88 | ldy jobn ; make job a verify 89 | lda jobs,y 90 | eor #$30 91 | sta jobs,y 92 | ; 93 | jmp seak ; scan job que 94 | ; 95 | ; 96 | chkblk lda #0 ; get eor checksum 97 | tay 98 | ; 99 | chkb10 eor (bufpnt),y 100 | iny 101 | bne chkb10 102 | ; 103 | rts ; return checksum in .a 104 | ; 105 | ; 106 | ; 107 | ; 108 | ; * wtobin 109 | ; 110 | ; convert write image back to 111 | ; binary data 112 | ; 113 | ; 114 | wtobin lda #0 ; init pointer 115 | sta savpnt 116 | sta bufpnt ; lsb 117 | sta nxtpnt 118 | ; 119 | lda bufpnt+1 ;goto buffer next 120 | sta nxtbf 121 | ; 122 | lda #>ovrbuf ; use overflow first 123 | sta bufpnt+1 124 | sta savpnt+1 125 | ; 126 | lda #256-topwrt 127 | sta gcrpnt ; get here first 128 | sta bytcnt ; store here 129 | ; 130 | jsr get4gb ; get first four- id and 3 data 131 | ; 132 | lda btab ; save bid 133 | sta bid 134 | ; 135 | ldy bytcnt 136 | ; 137 | lda btab+1 138 | sta (savpnt),y 139 | iny 140 | ; 141 | lda btab+2 142 | sta (savpnt),y 143 | iny 144 | ; 145 | lda btab+3 146 | sta (savpnt),y 147 | iny 148 | ; 149 | sty bytcnt 150 | ; 151 | wtob14 jsr get4gb ;do rest of overflow buffer 152 | ; 153 | ldy bytcnt 154 | ; 155 | lda btab 156 | sta (savpnt),y 157 | iny 158 | ; 159 | lda btab+1 160 | sta (savpnt),y 161 | iny 162 | beq wtob50 163 | ; 164 | lda btab+2 165 | sta (savpnt),y 166 | iny 167 | ; 168 | lda btab+3 169 | sta (savpnt),y 170 | iny 171 | ; 172 | sty bytcnt 173 | bne wtob14 ; jmp 174 | ; 175 | wtob50 176 | ; 177 | lda btab+2 178 | sta (bufpnt),y 179 | iny 180 | ; 181 | lda btab+3 182 | sta (bufpnt),y 183 | iny 184 | ; 185 | sty bytcnt 186 | ; 187 | wtob53 jsr get4gb 188 | ; 189 | ldy bytcnt 190 | ; 191 | lda btab 192 | sta (bufpnt),y 193 | iny 194 | ; 195 | lda btab+1 196 | sta (bufpnt),y 197 | iny 198 | ; 199 | lda btab+2 200 | sta (bufpnt),y 201 | iny 202 | ; 203 | lda btab+3 204 | sta (bufpnt),y 205 | iny 206 | ; 207 | sty bytcnt 208 | cpy #187 209 | bcc wtob53 210 | ; 211 | wtob52 lda #69 ; move buffer up 212 | sta savpnt 213 | ; 214 | lda bufpnt+1 215 | sta savpnt+1 216 | ; 217 | ldy #256-topwrt-1 218 | ; 219 | wtob55 lda (bufpnt),y 220 | sta (savpnt),y 221 | ; 222 | dey 223 | bne wtob55 224 | ; 225 | lda (bufpnt),y 226 | sta (savpnt),y 227 | ; 228 | ldx #256-topwrt ; move overflow over to buffer 229 | ; 230 | wtob57 lda ovrbuf,x 231 | sta (bufpnt),y 232 | ; 233 | iny 234 | inx 235 | bne wtob57 236 | ; 237 | stx gcrflg ; clear buffer gcr flag 238 | ; 239 | ; 240 | rts 241 | ; 242 | ; 243 | ; 244 | ; 245 | ; 246 | ; * verify data block 247 | ; 248 | ; convert to gcr verify image 249 | ; 250 | ; test against data block 251 | ; 252 | ; convert back to binary 253 | ; 254 | ; 255 | vrfy cmp #$20 ; test if verify 256 | beq vrf10 257 | ; 258 | jmp sectsk 259 | ; 260 | vrf10 261 | ; 262 | jsr chkblk ; get block checksum 263 | sta chksum 264 | ; 265 | jsr bingcr ; convert to verify image 266 | ; 267 | jsr dstrt 268 | ; 269 | ldy #256-topwrt 270 | vrf15 lda ovrbuf,y ; get char 271 | bvc * 272 | clv 273 | ; 274 | eor data2 ; test if same 275 | bne vrf20 ;verify error 276 | ; 277 | iny 278 | bne vrf15 ; next byte 279 | ; 280 | ; 281 | vrf30 lda (bufpnt),y ; now do buffer 282 | ; 283 | bvc * 284 | clv ; wait for char 285 | ; 286 | eor data2 ; test if same 287 | bne vrf20 ; error 288 | ; 289 | iny 290 | cpy #$fd ; dont test off bytes 291 | bne vrf30 292 | ; 293 | ; 294 | jmp done ; verify ok 295 | ; 296 | vrf20 lda #7 ; verify error 297 | jmp errr 298 | ; 299 | ; 300 | sectsk jsr srch ; sector seek 301 | jmp done 302 | ; 303 | ; 304 | -------------------------------------------------------------------------------- /leds.s: -------------------------------------------------------------------------------- 1 | ; 2 | ;turn on activity led specified 3 | ; by drvnum 4 | ; 5 | setlds sei 6 | lda #$ff-led1-led0 7 | and ledprt 8 | pha 9 | lda drvnum 10 | beq leds0 11 | pla 12 | ora #led1 13 | bne leds1 14 | leds0 15 | pla 16 | ora #led0 17 | leds1 18 | sta ledprt 19 | cli 20 | rts 21 | ; 22 | ledson sei 23 | lda #led1+led0 24 | ora ledprt 25 | sta ledprt 26 | cli 27 | rts 28 | ; 29 | erroff 30 | lda #0 31 | sta erword 32 | sta erled 33 | rts 34 | ; 35 | erron sei 36 | txa 37 | pha ;save .x 38 | lda #80 39 | sta erword 40 | ldx #0 41 | ;lda drvnum ;for 2 drives 42 | ;and #1 43 | ;tax 44 | lda ledmsk,x 45 | sta erled 46 | ora ledprt ;set led on 47 | sta ledprt 48 | pla 49 | tax ;restore .x 50 | cli 51 | rts 52 | -------------------------------------------------------------------------------- /lstdir.s: -------------------------------------------------------------------------------- 1 | ; start the directory loading function 2 | ; get the buffer and get it started 3 | ; 4 | stdir lda #0 5 | sta sa 6 | lda #1 ;allocate chanl and 1 bufefer 7 | jsr getrch 8 | lda #0 9 | jsr setpnt 10 | ldx lindx 11 | lda #0 12 | sta lstchr,x 13 | jsr getact 14 | tax 15 | lda drvnum 16 | sta lstjob,x 17 | lda #1 ; put sal in buffer 18 | jsr putbyt 19 | lda #4 ;put sah in buffer 20 | jsr putbyt 21 | lda #1 ;insert fhoney links (0101) 22 | jsr putbyt 23 | jsr putbyt 24 | lda nbtemp 25 | jsr putbyt ;put in drvnum 26 | lda #0 27 | jsr putbyt 28 | jsr movbuf ;get disk name 29 | jsr getact 30 | asl a 31 | tax 32 | dec buftab,x 33 | dec buftab,x 34 | lda #0 ;end of this line 35 | jsr putbyt 36 | dir1 lda #1 ;insert fhoney links ($0101) 37 | jsr putbyt 38 | jsr putbyt 39 | jsr getnam ;get #bufrs and file name 40 | bcc dir3 ;test if last entry 41 | lda nbtemp 42 | jsr putbyt 43 | lda nbtemp+1 44 | jsr putbyt 45 | jsr movbuf 46 | lda #0 ;end of entry 47 | jsr putbyt 48 | bne dir1 49 | dir10 jsr getact 50 | asl a 51 | tax 52 | lda #0 53 | sta buftab,x 54 | lda #rdytlk 55 | ldy lindx 56 | sta dirlst 57 | sta chnrdy,y ; directory list buffer full 58 | lda data 59 | rts 60 | ; 61 | ; 62 | dir3 lda nbtemp ; this is end of load 63 | jsr putbyt 64 | lda nbtemp+1 65 | jsr putbyt 66 | jsr movbuf 67 | jsr getact 68 | asl a 69 | tax 70 | dec buftab,x 71 | dec buftab,x 72 | lda #0 ; end of listing (000) 73 | jsr putbyt 74 | jsr putbyt 75 | jsr putbyt 76 | jsr getact 77 | asl a 78 | tay 79 | lda buftab,y 80 | ldx lindx 81 | sta lstchr,x 82 | dec lstchr,x 83 | jmp dir10 84 | ; 85 | ; 86 | ; 87 | ; 88 | ; transfer file name to listing buffer 89 | ; 90 | movbuf ldy #0 91 | movb1 lda nambuf,y 92 | jsr putbyt 93 | iny 94 | cpy #27 95 | bne movb1 96 | rts 97 | ; 98 | ; 99 | ; get char for directory loading 100 | ; 101 | getdir jsr getbyt 102 | beq getd3 103 | rts 104 | getd3 sta data 105 | ldy lindx 106 | lda lstchr,y 107 | beq gd1 108 | lda #eoiout 109 | sta chnrdy,y 110 | lda data 111 | rts 112 | gd1 113 | pha 114 | jsr dir1 115 | pla 116 | rts 117 | ; 118 | -------------------------------------------------------------------------------- /map.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; build a new map on diskette 3 | ; 4 | newmap 5 | newmpv 6 | jsr clnbam 7 | ldy #0 8 | lda #18 ;set link to 18.1 9 | sta (bmpnt),y 10 | iny 11 | tya 12 | sta (bmpnt),y 13 | iny 14 | iny 15 | iny ;.y=4 16 | nm10 17 | lda #0 ;clear track map 18 | sta t0 19 | sta t1 20 | sta t2 21 | ; 22 | tya 23 | lsr a 24 | lsr a ;.a=track # 25 | jsr maxsec 26 | sta (bmpnt),y 27 | iny 28 | tax 29 | nm20 30 | sec ;set map bits 31 | rol t0 32 | rol t1 33 | rol t2 34 | dex 35 | bne nm20 36 | nm30 ;.x=0 37 | lda t0,x 38 | sta (bmpnt),y 39 | iny 40 | inx 41 | cpx #3 42 | bcc nm30 43 | cpy #$90 ;end of bam 44 | bcc nm10 45 | jmp nfcalc ;calc # free sectors 46 | ; 47 | ; 48 | ; 49 | ; 50 | ; write out the bit map to 51 | ; the drive in lstjob(active) 52 | ; 53 | mapout jsr getact 54 | tax 55 | lda lstjob,x 56 | mo10 and #1 57 | sta drvnum ;check bam before writing 58 | ; 59 | ; write bam according to drvnum 60 | ; 61 | scrbam 62 | ldy drvnum 63 | lda mdirty,y 64 | bne sb10 65 | rts ;not dirty 66 | sb10 67 | lda #0 ;set to clean bam 68 | sta mdirty,y 69 | jsr setbpt ;set bit map ptr 70 | lda drvnum 71 | asl a 72 | pha 73 | ;put memory images to bam 74 | jsr putbam 75 | pla 76 | clc 77 | adc #1 78 | jsr putbam 79 | ; verify the bam block count 80 | ; matches the bits 81 | ; 82 | lda track 83 | pha ;save track var 84 | lda #1 85 | sta track 86 | sb20 87 | asl a 88 | asl a 89 | sta bmpnt 90 | jsr avck ;check available blocks 91 | inc track 92 | lda track 93 | cmp maxtrk 94 | bcc sb20 95 | pla ;restore track var 96 | sta track 97 | ; 98 | jmp dowrit ;write it out 99 | ; 100 | ; set bit map ptr, read in bam if nec. 101 | ; 102 | setbpt 103 | jsr bam2a 104 | tax 105 | jsr redbam ;read bam if not in 106 | ldx jobnum 107 | lda bufind,x ;set the ptr 108 | sta bmpnt+1 109 | lda #0 110 | sta bmpnt 111 | rts 112 | ; 113 | ; calc the number of free blocks on drvnum 114 | ; 115 | numfre 116 | ldx drvnum 117 | lda ndbl,x 118 | sta nbtemp 119 | lda ndbh,x 120 | sta nbtemp+1 121 | rts 122 | -------------------------------------------------------------------------------- /memrw.s: -------------------------------------------------------------------------------- 1 | ; memory access commands 2 | ; "-" must be 2nd char 3 | mem lda cmdbuf+1 4 | cmp #'- 5 | bne memerr 6 | ; 7 | lda cmdbuf+3 ;set address in temp 8 | sta temp 9 | lda cmdbuf+4 10 | sta temp+1 11 | ; 12 | ldy #0 13 | lda cmdbuf+2 14 | cmp #'R 15 | beq memrd ;read 16 | jsr killp ;kill protect 17 | cmp #'W 18 | beq memwrt ;write 19 | cmp #'E 20 | bne memerr ;error 21 | ; execute 22 | memex jmp (temp) 23 | memrd 24 | lda (temp),y 25 | sta data 26 | lda cmdsiz 27 | cmp #6 28 | bcc m30 29 | ; 30 | ldx cmdbuf+5 31 | dex 32 | beq m30 33 | txa 34 | clc 35 | adc temp 36 | inc temp 37 | sta lstchr+errchn 38 | lda temp 39 | sta cb+2 40 | lda temp+1 41 | sta cb+3 42 | jmp ge20 43 | m30 44 | jsr fndrch 45 | jmp ge15 46 | memerr lda #badcmd ;bad command 47 | jmp cmderr 48 | memwrt ;write 49 | m10 lda cmdbuf+6,y 50 | sta (temp),y ;transfer from cmdbuf 51 | iny 52 | cpy cmdbuf+5 ;# of bytes to write 53 | bcc m10 54 | rts 55 | -------------------------------------------------------------------------------- /new.s: -------------------------------------------------------------------------------- 1 | ;new: initialize a disk, disk is 2 | ; soft-sectored, bit avail. map, 3 | ; directory, & 1st block are all inited 4 | new jsr onedrv 5 | lda fildrv ;set up drive # 6 | bpl n101 7 | lda #badfn ;bad drive # given 8 | jmp cmderr 9 | n101 and #1 10 | sta drvnum 11 | ; 12 | ; jsr setlds 13 | jsr ptch11 ; clr nodrv ***rom ds 01/21/85*** 14 | ; 15 | lda drvnum 16 | asl a 17 | tax 18 | ldy filtbl+1 ;get disk id 19 | cpy cmdsiz ;?is this new or clear? 20 | beq n108 ;end of cmd string 21 | lda cmdbuf,y ;format disk**** 22 | sta dskid,x ;store in proper drive 23 | lda cmdbuf+1,y ;(y=0) 24 | sta dskid+1,x 25 | jsr clrchn ;clear all channels when formatting 26 | lda #1 ;...in track, track=1 27 | sta track 28 | 29 | ;--------- patch7 for format bug 10/17/83--- 30 | ; jsr format ; transfer format to ram 31 | jsr patch7 ; set format flag 32 | ;------------------------------------------- 33 | 34 | jsr clrbam ;zero bam 35 | jmp n110 36 | n108 jsr initdr ;clear directory only 37 | ldx drvnum 38 | lda dskver,x ;use current version # 39 | cmp vernum 40 | beq n110 41 | jmp vnerr ;wrong version # 42 | n110 43 | jsr newmap ;new bam 44 | lda jobnum 45 | tay 46 | asl a 47 | tax 48 | lda dsknam ;set ptr to disk name 49 | sta buftab,x 50 | ldx filtbl 51 | lda #27 52 | jsr trname ;transfer cmd buf to bam 53 | ldy #$12 54 | ldx drvnum 55 | lda vernum ;set dos's current format type 56 | sta dskver,x 57 | txa 58 | asl a 59 | tax 60 | lda dskid,x ;write directory's i.d. 61 | sta (dirbuf),y 62 | iny 63 | lda dskid+1,x 64 | sta (dirbuf),y 65 | iny 66 | iny 67 | lda #dosver+$30 ;write directory dos version 68 | sta (dirbuf),y 69 | iny 70 | lda vernum ;write directory format type 71 | sta (dirbuf),y 72 | ; 73 | ldy #2 74 | sta (bmpnt),y ;write diskette's format type 75 | lda dirtrk 76 | sta track 77 | jsr usedts ;set bam block used 78 | lda #1 79 | sta sector 80 | jsr usedts ;set 1st dir block used 81 | jsr scrbam ;scrub the bam 82 | jsr clrbam ;set to all 0's 83 | ldy #1 84 | lda #$ff ;set end link 85 | sta (bmpnt),y 86 | jsr drtwrt ;clear directory 87 | dec sector 88 | jsr drtrd ;read bam back 89 | jmp endcmd 90 | -------------------------------------------------------------------------------- /newss.s: -------------------------------------------------------------------------------- 1 | ;********************************* 2 | ;* newss: generate new ss & fix * 3 | ;* old ss's to reflect it.* 4 | ;* vars: * 5 | ;* regs: * 6 | ;* * 7 | ;********************************* 8 | ; 9 | newss 10 | jsr nxtts ;get t&s based on hdr 11 | jsr dblbuf ;use inactive buffer 12 | jsr scrub 13 | jsr getact 14 | pha 15 | jsr clrbuf 16 | ldx lindx 17 | lda ss,x ;set regs for transfer 18 | tay 19 | pla 20 | tax 21 | lda #ssioff ;# of chars 22 | jsr b0tob0 ;transfer at buf(0) 23 | ; 24 | lda #0 25 | jsr ssdir 26 | ldy #2 27 | lda (dirbuf),y ;get ss # 28 | pha 29 | lda #0 30 | jsr setpnt 31 | pla 32 | clc 33 | adc #1 34 | sta (dirbuf),y ;put ss # in new ss 35 | asl a 36 | adc #4 37 | sta r3 ;save position 38 | tay 39 | sec 40 | sbc #2 41 | sta r4 42 | lda track 43 | sta r1 ;save for ss update 44 | sta (dirbuf),y ;put track in ss 45 | iny 46 | lda sector 47 | sta r2 ;save for ss update 48 | sta (dirbuf),y ;put sector in ss 49 | ldy #0 50 | tya 51 | sta (dirbuf),y ;null link 52 | iny 53 | lda #ssioff+1 ;ptr to last byte 54 | sta (dirbuf),y 55 | ; 56 | lda #ssioff 57 | jsr setpnt 58 | jsr wrtab 59 | jsr watjob 60 | ; 61 | ns20 62 | ldx lindx 63 | lda ss,x ;get ss buffer # 64 | pha 65 | jsr gaflgs 66 | ldx lindx 67 | sta ss,x ;swap act-buf & ss 68 | pla 69 | ldx lbused 70 | sta buf0,x 71 | ; 72 | lda #0 73 | jsr setpnt ;set link to new ss 74 | ldy #0 75 | lda track 76 | sta (dirbuf),y 77 | iny 78 | lda sector 79 | sta (dirbuf),y 80 | jmp ns50 81 | ns40 82 | jsr getact 83 | ldx lindx 84 | jsr ibrd ;read next ss 85 | lda #0 86 | jsr setpnt ;ptr=0 87 | ns50 88 | dec r4 89 | dec r4 90 | ldy r3 ;get new ss link ptr 91 | lda r1 92 | sta (dirbuf),y ;put track in 93 | iny 94 | lda r2 95 | sta (dirbuf),y ;put sector in 96 | ; 97 | jsr wrtout ;write it back... 98 | jsr watjob ;...& wait 99 | ldy r4 100 | cpy #3 101 | bcs ns40 ;more ss to update! 102 | ; 103 | jmp dblbuf ;reset active buffer 104 | -------------------------------------------------------------------------------- /nulbuf.s: -------------------------------------------------------------------------------- 1 | ;********************************* 2 | ;* nulbuf: set null records in * 3 | ;* act-buf for extention * 4 | ;* vars: nr,rs,lx,act-buf * 5 | ;* in: nr= last record * 6 | ;* position in previous * 7 | ;* buffer. * 8 | ;* out: nr= last record * 9 | ;* position in buffer * 10 | ;* for next nulbuf or * 11 | ;* to set lstchr. * 12 | ;********************************* 13 | ; 14 | nulbuf 15 | jsr set00 ;set indirect ptr 16 | ldy #2 17 | lda #0 18 | nb10 19 | sta (dirbuf),y ;clear buffer 20 | iny 21 | bne nb10 22 | ; 23 | jsr addnr ;advance nr 24 | nb20 25 | sta nr,x 26 | tay 27 | lda #$ff 28 | sta (dirbuf),y ;init record w/ cr 29 | jsr addnr 30 | bcc nb20 ;not done 31 | ; 32 | bne nb30 33 | lda #0 34 | sta nr,x 35 | nb30 36 | rts 37 | ; 38 | ; add rs & nr, leave in accum 39 | ; c=1: cross buffer boundary 40 | ; 41 | addnr 42 | ldx lindx 43 | lda nr,x 44 | sec 45 | beq an05 46 | ; 47 | clc 48 | adc rs,x 49 | bcc an10 50 | bne an05 51 | lda #2 52 | bit er00 53 | rts 54 | ; 55 | an05 56 | adc #1 ;adjust for link 57 | sec 58 | an10 59 | rts 60 | ; 61 | ; 62 | -------------------------------------------------------------------------------- /opchnl.s: -------------------------------------------------------------------------------- 1 | ; opchnl 2 | ; 3 | ; open a read chanl with 2 buffers 4 | ; will insert sa in lintab 5 | ; and inits all pointers. 6 | ; relative ss and ptrs are set. 7 | ; 8 | opnrch lda #1 ;get one data buffer 9 | jsr getrch 10 | jsr initp ;clear pointers 11 | lda type 12 | pha 13 | asl a 14 | ora drvnum 15 | sta filtyp,x ;set file type 16 | jsr strrd ;read 1st one or two blocks 17 | ldx lindx 18 | lda track 19 | bne or10 20 | ; 21 | lda sector 22 | sta lstchr,x ;set last char ptr 23 | or10 24 | pla 25 | cmp #reltyp 26 | bne or30 ;must be sequential stuff 27 | ; 28 | ldy sa 29 | lda lintab,y ;set channel as r/w 30 | ora #$40 31 | sta lintab,y 32 | ; 33 | ; 34 | lda rec 35 | sta rs,x ;set record size 36 | ; 37 | jsr getbuf ;get ss buffer 38 | bpl or20 39 | jmp gberr ;no buffer 40 | or20 41 | ldx lindx 42 | sta ss,x 43 | ldy trkss ;set ss track 44 | sty track 45 | ldy secss ;set ss sector 46 | sty sector 47 | jsr seth ;set ss header 48 | jsr rdss ;read it in 49 | jsr watjob 50 | orow 51 | ; 52 | ldx lindx 53 | lda #2 54 | sta nr,x ;set for nxtrec 55 | ; 56 | lda #0 57 | jsr setpnt ;set first data byte 58 | ; 59 | jsr rd40 ;set up 1st record 60 | jmp gethdr ;restore t&s 61 | ; 62 | or30 63 | jsr rdbyt ;sequential set up 64 | ldx lindx 65 | sta chndat,x 66 | lda #rdytlk 67 | sta chnrdy,x 68 | rts 69 | ; 70 | ; initialize variables for open chanl 71 | ; lstjob,sets active buffer#,lstchr, 72 | ; buffer pointers in buftab=2 73 | ; 74 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 75 | ; 76 | initp ldx lindx 77 | lda buf0,x 78 | asl a 79 | bmi initp1 ; *** rom ds 02/27/85 *** 80 | ; 81 | tay 82 | lda #2 83 | sta buftab,y 84 | ; 85 | initp1 lda buf1,x 86 | ora #$80 87 | sta buf1,x 88 | asl a 89 | bmi initp2 ; *** rom ds 02/27/85 *** 90 | ; 91 | tay 92 | lda #2 93 | sta buftab,y 94 | initp2 lda #0 95 | sta nbkl,x 96 | ; 97 | jmp ptch41 ; *** rom ds 02/27/85 *** 98 | nop ; fill 99 | ; 100 | ; sta nbkh,x 101 | ; lda #0 102 | ; sta lstchr,x 103 | ; rts 104 | ; 105 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 106 | ; 107 | ; 108 | ; open a write chanl with 2 buffers 109 | opnwch jsr intts ;get first track,sector 110 | lda #1 111 | jsr getwch ;get 1 buffers for writing 112 | jsr sethdr ;set up buffer headers 113 | jsr initp ;zropnt 114 | ldx lindx 115 | lda type 116 | pha 117 | asl a 118 | ora drvnum 119 | sta filtyp,x ;set filtyp=seq 120 | pla 121 | cmp #reltyp 122 | beq ow10 123 | lda #rdylst ; active listener 124 | sta chnrdy,x 125 | rts 126 | ; 127 | ow10 128 | ldy sa 129 | lda lintab,y 130 | and #$3f 131 | ora #$40 132 | sta lintab,y ;set channel as r/w 133 | ; 134 | lda rec 135 | sta rs,x ;set record size 136 | ; 137 | jsr getbuf ;get ss buffer 138 | bpl ow20 139 | jmp gberr ;no buffer 140 | ow20 141 | ldx lindx 142 | sta ss,x 143 | jsr clrbuf 144 | ; 145 | jsr nxtts 146 | lda track 147 | sta trkss ;save ss t&s 148 | lda sector 149 | sta secss 150 | ; 151 | ldx lindx 152 | lda ss,x 153 | jsr seth ;set ss header 154 | lda #0 155 | jsr setssp 156 | lda #0 ;set null link 157 | jsr putss 158 | lda #ssioff+1 ;set last char 159 | jsr putss 160 | lda #0 ;set this ss # 161 | jsr putss 162 | lda rec ;record size 163 | jsr putss 164 | lda track 165 | jsr putss 166 | lda sector 167 | jsr putss 168 | lda #ssioff 169 | jsr setssp 170 | jsr gethdr ;get first t&s 171 | lda track 172 | jsr putss 173 | lda sector 174 | jsr putss 175 | ; 176 | jsr wrtss ;write it out 177 | jsr watjob 178 | lda #2 179 | jsr setpnt 180 | ; 181 | ldx lindx ;set nr for null buffer 182 | sec 183 | lda #0 184 | sbc rs,x 185 | sta nr,x 186 | ; 187 | jsr nulbuf ;null records 188 | jsr nullnk 189 | jsr wrtout 190 | jsr watjob 191 | jsr mapout 192 | jmp orow 193 | ; 194 | ;* 195 | ;* 196 | ;*********************** 197 | ;* 198 | ;* putss 199 | ;* 200 | ;* put byte into side sector 201 | ;* 202 | ;*********************** 203 | ;* 204 | ;* 205 | putss pha 206 | ldx lindx 207 | lda ss,x 208 | jmp putb1 209 | ; 210 | -------------------------------------------------------------------------------- /open.s: -------------------------------------------------------------------------------- 1 | ;open channel from ieee 2 | ; parses the input string that is 3 | ; sent as an open data channel, 4 | ; load, or save. channels are allocated 5 | ; and the directory is searched for 6 | ; the filename contained in the string. 7 | open 8 | lda sa 9 | sta tempsa 10 | jsr cmdset ;initiate cmd ptrs 11 | stx cmdnum 12 | ldx cmdbuf 13 | lda tempsa 14 | bne op021 15 | cpx #'* ;load last? 16 | bne op021 17 | lda prgtrk 18 | beq op0415 ;no last prog, init 0 19 | op02 ;load last program 20 | sta track 21 | lda prgdrv 22 | sta drvnum 23 | sta fildrv 24 | lda #prgtyp 25 | sta pattyp 26 | lda prgsec 27 | sta sector 28 | jsr setlds ; make sure led gets turned on!! 29 | jsr opnrch 30 | lda #prgtyp+prgtyp 31 | ora drvnum 32 | endrd ldx lindx 33 | sta filtyp,y 34 | jmp endcmd 35 | op021 cpx #'$ 36 | bne op041 37 | lda tempsa ;load directory 38 | bne op04 39 | jmp loadir 40 | op04 jsr simprs ;open dir as seq file 41 | lda dirtrk 42 | sta track 43 | lda #0 44 | sta sector 45 | jsr opnrch 46 | lda drvnum 47 | ora #seqtyp+seqtyp 48 | jmp endrd 49 | op041 cpx #'# ;"#" is direct access 50 | bne op042 51 | jmp opnblk 52 | op0415 lda #prgtyp ;program type 53 | sta typflg 54 | lda #0 55 | sta drvnum 56 | sta lstdrv 57 | jsr initdr 58 | op042 59 | jsr prscln ;look for ":" 60 | bne op049 61 | ldx #0 62 | beq op20 ;bra 63 | op049 64 | txa 65 | beq op10 66 | op05 lda #badsyn ;something amiss 67 | jmp cmderr 68 | op10 dey ;back up to ":" 69 | beq op20 ;1st char is ":" 70 | dey 71 | op20 sty filtbl ;save filename ptr 72 | lda #$8d ;look for cr-shifted 73 | jsr parse 74 | inx 75 | stx f2cnt 76 | jsr onedrv 77 | jsr optsch 78 | jsr ffst ;look for file entry 79 | ldx #0 80 | stx rec 81 | stx mode ;read mode 82 | stx type ;deleted 83 | inx 84 | cpx f1cnt 85 | bcs op40 ;no parameters 86 | ; 87 | jsr cktm ;check for type & mode 88 | inx 89 | cpx f1cnt 90 | bcs op40 ;only one parameter 91 | ; 92 | cpy #reltyp 93 | beq op60 ;set record size 94 | ; 95 | jsr cktm ;set type/mode 96 | op40 97 | ldx tempsa 98 | stx sa ;set sa back 99 | cpx #2 100 | bcs op45 ;not load or save 101 | ; 102 | stx mode ;mode=sa 103 | lda #$40 104 | sta wbam 105 | lda type 106 | bne op50 ;type from parm 107 | ; 108 | lda #prgtyp 109 | sta type ;use prg 110 | op45 111 | lda type 112 | bne op50 ;type from parm 113 | ; 114 | lda pattyp 115 | and #typmsk 116 | sta type ;type from file 117 | ; 118 | lda filtrk 119 | bne op50 ;yes, it exists 120 | ; 121 | lda #seqtyp 122 | sta type ;default is seq 123 | op50 124 | lda mode 125 | cmp #wtmode 126 | beq op75 ;go write 127 | ; 128 | jmp op90 129 | ; 130 | op60 131 | ldy filtbl,x ;get record size 132 | lda cmdbuf,y 133 | sta rec 134 | lda filtrk 135 | bne op40 ;it's here, read 136 | ; 137 | lda #wtmode ;use write to open 138 | sta mode 139 | bne op40 ;(bra) 140 | ; 141 | op75 142 | lda pattyp 143 | and #$80 144 | tax 145 | bne op81 146 | op77 lda #$20 ;open write 147 | bit pattyp 148 | beq op80 149 | jsr deldir ;created 150 | jmp opwrit 151 | op80 lda filtrk 152 | bne op81 153 | jmp opwrit ;not found, ok! 154 | op81 lda cmdbuf 155 | cmp #'@ ;check for replace 156 | beq op82 157 | txa 158 | bne op815 159 | lda #flexst 160 | jmp cmderr 161 | op815 162 | lda #badfn 163 | jmp cmderr 164 | ;********* check for bug here****** 165 | op82 166 | lda pattyp ;replace 167 | and #typmsk 168 | cmp type 169 | bne op115 170 | cmp #reltyp 171 | beq op115 172 | ; 173 | jsr opnwch 174 | lda lindx 175 | sta wlindx 176 | lda #irsa ;internal chan 177 | sta sa 178 | jsr fndrch 179 | lda index 180 | jsr setpnt 181 | ldy #0 182 | lda (dirbuf),y 183 | ora #$20 ;set replace bit 184 | sta (dirbuf),y 185 | ; 186 | ldy #26 187 | lda track 188 | sta (dirbuf),y 189 | iny 190 | lda sector 191 | sta (dirbuf),y 192 | ldx wlindx 193 | lda entsec 194 | sta dsec,x 195 | lda entind 196 | sta dind,x 197 | jsr curblk 198 | jsr drtwrt 199 | jmp opfin 200 | ;********************************** 201 | ; 202 | op90 lda filtrk ;open read (& load) 203 | bne op100 204 | op95 205 | lda #flntfd ;track not recorded 206 | jmp cmderr ;not found 207 | op100 208 | lda mode 209 | cmp #mdmode 210 | beq op110 211 | lda #$20 212 | bit pattyp 213 | beq op110 214 | lda #filopn 215 | jmp cmderr 216 | op110 lda pattyp 217 | and #typmsk ;type is in index table 218 | cmp type 219 | beq op120 220 | op115 lda #mistyp ;type mismatch 221 | jmp cmderr 222 | op120 ;everything is ok! 223 | ldy #0 224 | sty f2ptr 225 | ldx mode 226 | cpx #apmode 227 | bne op125 228 | cmp #reltyp 229 | beq op115 230 | ; 231 | lda (dirbuf),y 232 | and #$4f 233 | sta (dirbuf),y 234 | lda sa 235 | pha 236 | lda #irsa 237 | sta sa 238 | jsr curblk 239 | jsr drtwrt 240 | pla 241 | sta sa 242 | op125 243 | jsr opread 244 | lda mode 245 | cmp #apmode 246 | bne opfin 247 | ; 248 | jsr append 249 | jmp endcmd 250 | ; 251 | ;********************** 252 | opread 253 | ldy #19 254 | lda (dirbuf),y 255 | sta trkss 256 | iny 257 | lda (dirbuf),y 258 | sta secss 259 | iny 260 | lda (dirbuf),y 261 | ldx rec 262 | sta rec 263 | txa 264 | beq op130 265 | cmp rec 266 | beq op130 267 | lda #norec 268 | jsr cmderr 269 | op130 270 | ldx f2ptr 271 | lda filtrk,x 272 | sta track 273 | lda filsec,x 274 | sta sector 275 | jsr opnrch 276 | ldy lindx ;open a read chnl 277 | ldx f2ptr 278 | lda entsec,x 279 | sta dsec,y 280 | lda entind,x 281 | sta dind,y 282 | rts 283 | ; 284 | opwrit 285 | lda fildrv 286 | and #1 287 | sta drvnum 288 | jsr opnwch 289 | jsr addfil ;add to directory 290 | opfin 291 | lda sa 292 | cmp #2 293 | bcs opf1 294 | ; 295 | jsr gethdr 296 | lda track 297 | sta prgtrk 298 | ; 299 | lda drvnum 300 | sta prgdrv 301 | ; 302 | lda sector 303 | sta prgsec 304 | opf1 305 | jmp endsav 306 | cktm 307 | ldy filtbl,x ;get ptr 308 | lda cmdbuf,y ;get char 309 | ldy #nmodes 310 | ckm1 311 | dey 312 | bmi ckm2 ;no valid mode 313 | ; 314 | cmp modlst,y 315 | bne ckm1 316 | sty mode ;mode found 317 | ckm2 318 | ldy #ntypes 319 | ckt1 320 | dey 321 | bmi ckt2 ;no valid type 322 | ; 323 | cmp tplst,y 324 | bne ckt1 325 | sty type ;type found 326 | ckt2 327 | rts 328 | ; 329 | append 330 | jsr gcbyte 331 | lda #lrf 332 | jsr tstflg 333 | beq append 334 | ; 335 | jsr rdlnk 336 | ldx sector 337 | inx 338 | txa 339 | bne ap30 340 | jsr wrt0 ;get another block 341 | lda #2 342 | ap30 343 | jsr setpnt 344 | ldx lindx 345 | lda #rdylst 346 | sta chnrdy,x 347 | lda #$80 ;chnl bit 348 | ora lindx 349 | ldx sa 350 | sta lintab,x 351 | rts 352 | ; 353 | ; 354 | ; load directory 355 | loadir 356 | lda #ldcmd 357 | sta cmdnum 358 | lda #0 ;load only drive zero 359 | ldx cmdsiz 360 | dex 361 | beq ld02 362 | ld01 dex ;load by name 363 | bne ld03 364 | lda cmdbuf+1 365 | jsr tst0v1 366 | bmi ld03 367 | ld02 ;load dir with a star 368 | sta fildrv 369 | inc f1cnt 370 | inc f2cnt 371 | inc filtbl 372 | lda #$80 373 | sta pattyp 374 | lda #'* 375 | sta cmdbuf ;cover both cases 376 | sta cmdbuf+1 377 | bne ld10 ;(branch) 378 | ld03 379 | jsr prscln 380 | bne ld05 ;found ":" 381 | ;search by name on both drives 382 | jsr cmdrst 383 | ldy #3 384 | ld05 dey 385 | dey 386 | sty filtbl 387 | jsr tc35 ;parse & set tables 388 | jsr fs1set 389 | jsr alldrs 390 | ld10 jsr optsch ;new directory 391 | jsr newdir 392 | jsr ffst 393 | ld20 jsr stdir ;start directory 394 | jsr getbyt ;set 1st byte 395 | ldx lindx 396 | sta chndat,x 397 | lda drvnum 398 | sta lstdrv 399 | ora #4 400 | sta filtyp,x 401 | lda #0 402 | sta buftab+cbptr 403 | rts 404 | -------------------------------------------------------------------------------- /parsex.s: -------------------------------------------------------------------------------- 1 | ;parse & execute string in cmdbuf 2 | parsxq 3 | lda #0 4 | sta wbam 5 | lda lstdrv 6 | sta drvnum 7 | jsr okerr 8 | lda orgsa 9 | bpl ps05 10 | and #$f 11 | cmp #$f 12 | beq ps05 13 | jmp open 14 | ps05 jsr cmdset ;set variables,regs 15 | lda (cb),y 16 | sta char 17 | ldx #ncmds-1 ;search cmd table 18 | ps10 lda cmdtbl,x 19 | cmp char 20 | beq ps20 21 | dex 22 | bpl ps10 23 | lda #badcmd ;no such cmd 24 | jmp cmderr 25 | ps20 stx cmdnum ;x= cmd # 26 | cpx #pcmd ;cmds not parsed 27 | bcc ps30 28 | jsr tagcmd ;set tables, pointers &patterns 29 | ps30 ldx cmdnum 30 | lda cjumpl,x 31 | sta temp 32 | lda cjumph,x 33 | sta temp+1 34 | jmp (temp) ;command table jump 35 | ; successful command termination 36 | endcmd 37 | lda #0 38 | sta wbam 39 | endsav 40 | lda erword 41 | bne cmderr 42 | ; 43 | ldy #0 44 | tya 45 | sty track 46 | scrend sty sector ;scratch entry 47 | sty cb 48 | jsr errmsg 49 | jsr erroff 50 | scren1 51 | lda drvnum 52 | sta lstdrv 53 | tax 54 | 55 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 56 | 57 | jmp ptch43 ; *** rom ds 05/01/85 *** 58 | nop ; fill 59 | ; lda #0 60 | ; sta nodrv,x 61 | rtch43 62 | 63 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 64 | 65 | jsr clrcb 66 | jmp freich ;free internal channel 67 | ; 68 | clrcb 69 | ldy #cmdlen-1 70 | lda #0 71 | clrb2 72 | sta cmdbuf,y 73 | dey 74 | bpl clrb2 75 | rts 76 | ; 77 | ; command level error processing 78 | cmderr ldy #0 79 | sty track 80 | sty sector 81 | jmp cmder2 82 | simprs ldx #0 ;simple parser 83 | stx filtbl 84 | lda #': 85 | jsr parse 86 | beq sp10 87 | dey 88 | dey 89 | sty filtbl 90 | sp10 jmp setany ;set drive # 91 | prscln 92 | ldy #0 93 | ldx #0 94 | lda #': 95 | jmp parse ;find pos'n of ":" 96 | ; 97 | ;tag command string 98 | ; set up cmd structure 99 | ; image & file stream ptrs 100 | ; 101 | tagcmd 102 | jsr prscln 103 | bne tc30 104 | tc25 lda #nofile ;none, no files 105 | jmp cmderr 106 | tc30 dey 107 | dey 108 | sty filtbl ;":"-1 starts fs1 109 | txa 110 | bne tc25 ;err: "," before ":" 111 | tc35 lda #'= ;search: "=" 112 | jsr parse 113 | txa ;?file count= 1-1? 114 | beq tc40 115 | lda #%01000000 ;g1-bit 116 | tc40 ora #%00100001 ;e1,^e2-bits 117 | sta image ;fs structure 118 | inx 119 | stx f1cnt 120 | stx f2cnt ;init for no fs2 121 | lda patflg 122 | beq tc50 123 | lda #%10000000 ;p1-bit 124 | ora image 125 | sta image 126 | lda #0 127 | sta patflg ;clear pattern flag 128 | tc50 tya ;ptr to fs2 129 | beq tc75 ; fs2 not here 130 | sta filtbl,x 131 | lda f1cnt ;fs2 is here now,... 132 | sta f2ptr ;...now set f2 ptr 133 | lda #$8d ;find cr-shifted 134 | jsr parse ;parse rest of cmd string 135 | inx ;advance filtbl ptr to end 136 | stx f2cnt ;save it 137 | dex ;restore for test 138 | lda patflg ;save last pattern 139 | beq tc60 ;?any patterns? 140 | lda #%1000 ;yes, p2-bit 141 | tc60 cpx f1cnt ;?f2cnt=f1cnt+1? 142 | beq tc70 143 | ora #%0100 ;g2-bit 144 | tc70 ora #%0011 ;e2-bit,^e2-bit 145 | eor image ;eor clears ^e2-bit 146 | sta image 147 | tc75 148 | lda image 149 | ldx cmdnum 150 | and struct,x ;match cmd template 151 | bne tc80 152 | rts 153 | tc80 sta erword ;**could be warning 154 | lda #badsyn ;err: bad syntax 155 | jmp cmderr 156 | ;parse string 157 | ; looks for special chars, 158 | ; returning when var'bl char 159 | ; is found 160 | ; a: var'bl char 161 | ; x: in,out: index, filtbl+1 162 | ; y: in: index, cmdbuf 163 | ; out: new ptr, =0 if none 164 | ; (z=1) if y=0 165 | parse sta char ;save var'bl char 166 | pr10 cpy cmdsiz ;stay in string 167 | bcs pr30 168 | lda (cb),y ;match char 169 | iny 170 | cmp char 171 | beq pr35 ;found char 172 | cmp #'* ;match pattern chars 173 | beq pr20 174 | cmp #'? 175 | bne pr25 176 | pr20 inc patflg ;set pattern flag 177 | pr25 cmp #', ;match file separator 178 | bne pr10 179 | tya 180 | sta filtbl+1,x ;put ptrs in table 181 | lda patflg ;save pattern for ea file 182 | and #$7f 183 | beq pr28 184 | lda #$80 ;retain pattern presence... 185 | sta pattyp,x 186 | sta patflg ;...but clear count 187 | pr28 inx 188 | cpx #mxfils-1 189 | bcc pr10 ;no more than mxfils 190 | pr30 ldy #0 ;y=0 (z=1) 191 | pr35 lda cmdsiz 192 | sta filtbl+1,x 193 | lda patflg 194 | and #$7f 195 | beq pr40 196 | lda #$80 197 | sta pattyp,x 198 | pr40 tya ;z is set 199 | rts 200 | ;initialize command tables, ptrs, etc. 201 | cmdset ldy buftab+cbptr 202 | beq cs08 203 | dey 204 | beq cs07 205 | lda cmdbuf,y 206 | cmp #cr 207 | beq cs08 208 | dey 209 | lda cmdbuf,y 210 | cmp #cr 211 | beq cs08 212 | iny 213 | cs07 iny 214 | cs08 sty cmdsiz ;set cmd string size 215 | cpy #cmdlen+1 216 | ldy #$ff 217 | bcc cmdrst 218 | sty cmdnum 219 | lda #longln ;long line error 220 | jmp cmderr 221 | ; clear variables,tables 222 | cmdrst 223 | ldy #0 224 | tya 225 | sta buftab+cbptr 226 | sta rec 227 | sta type 228 | sta typflg 229 | sta f1ptr 230 | sta f2ptr 231 | sta f1cnt 232 | sta f2cnt 233 | sta patflg 234 | sta erword 235 | ldx #mxfils 236 | cs10 sta filtbl-1,x 237 | sta entsec-1,x 238 | sta entind-1,x 239 | sta fildrv-1,x 240 | sta pattyp-1,x 241 | sta filtrk-1,x 242 | sta filsec-1,x 243 | dex 244 | bne cs10 245 | rts 246 | -------------------------------------------------------------------------------- /ramvar.sf.s: -------------------------------------------------------------------------------- 1 | ;permanent address variables 2 | ; 3 | ; 4 | vnmi .res 2 ;indirect for nmi 5 | nmiflg .res 1 6 | autofg .res 1 7 | secinc .res 1 ;sector inc for seq 8 | revcnt .res 1 ; error recovery count 9 | ;bufs = $300 ; start of data bufs 10 | fbufs = bufs ;format download image 11 | ;* 12 | ;********************************* 13 | ;* 14 | ;* zero page variables 15 | ;* 16 | ;********************************* 17 | ;* 18 | usrjmp .res 2 ; user jmp table ptr 19 | bmpnt .res 2 ; bit map pointer 20 | temp .res 6 ; temp work space 21 | ip .res 2 ; indirect ptr variable 22 | lsnadr .res 1 ; listen address 23 | tlkadr .res 1 ;talker address 24 | lsnact .res 1 ; active listener flag 25 | tlkact .res 1 ; active talker flag 26 | adrsed .res 1 ; addressed flag 27 | atnpnd .res 1 ;attention pending flag 28 | atnmod .res 1 ;in atn mode 29 | prgtrk .res 1 ;last prog accessed 30 | drvnum .res 1 ;current drive # 31 | track .res 1 ;current track 32 | sector .res 1 ;current sector 33 | lindx .res 1 ;logical index 34 | sa .res 1 ;secondary address 35 | orgsa .res 1 ;original sa 36 | data .res 1 ; temp data byte 37 | ;* 38 | ;* 39 | t0 =temp 40 | t1 =temp+1 41 | t2 =temp+2 42 | t3 =temp+3 43 | t4 =temp+4 44 | r0 .res 1 45 | r1 .res 1 46 | r2 .res 1 47 | r3 .res 1 48 | r4 .res 1 49 | result .res 4 50 | accum .res 5 51 | dirbuf .res 2 52 | icmd .res 1 ;ieee cmd in 53 | mypa .res 1 ; my pa flag 54 | cont .res 1 ; bit counter for ser 55 | ;* 56 | ;********************* 57 | ;* 58 | ;* zero page array 59 | ;* 60 | ;*********************** 61 | ;* 62 | buftab .res cbptr+4 ; buffer byte pointers 63 | cb=buftab+cbptr 64 | buf0 .res mxchns+1 65 | buf1 .res mxchns+1 66 | nbkl 67 | recl .res mxchns 68 | nbkh 69 | rech .res mxchns 70 | nr .res mxchns 71 | rs .res mxchns 72 | ss .res mxchns 73 | f1ptr .res 1 ; file stream 1 pointer 74 | ; 75 | ;*********************** 76 | ; $4300 vars moved to zp 77 | ; 78 | recptr .res 1 79 | ssnum .res 1 80 | ssind .res 1 81 | relptr .res 1 82 | entsec .res mxfils ; sector of directory entry 83 | entind .res mxfils ; index of directory entry 84 | fildrv .res mxfils ; default flag, drive # 85 | pattyp .res mxfils ; pattern,replace,closed-flags,type 86 | filtyp .res mxchns ; channel file type 87 | chnrdy .res mxchns ; channel status 88 | eoiflg .res 1 ; temp eoi 89 | jobnum .res 1 ; current job # 90 | lrutbl .res mxchns-1 ;least recently used table 91 | nodrv .res 2 ; no drive flag 92 | ;XXXdskver .res 2 ; disk version from 18.0 93 | dskver=$101 94 | zpend=* 95 | .segment "S0200" 96 | cmdbuf .res cmdlen+1 97 | cmdnum .res 1 ; command # 98 | lintab .res maxsa+1 ; sa:lindx table 99 | chndat .res mxchns ; channel data byte 100 | lstchr .res mxchns ; channel last char ptr 101 | type .res 1 ; active file type 102 | ; 103 | ;* 104 | ;******************* 105 | ;* 106 | ;* ram variables in $4300 107 | ;* 108 | ;******************* 109 | ;* 110 | ; *=$4300 111 | strsiz .res 1 112 | ;zp: recptr .res 1 113 | ;zp: ssnum .res 1 114 | ;zp: ssind .res 1 115 | ;zp: relptr .res 1 116 | tempsa .res 1 ; temporary sa 117 | ;zp: eoiflg .res 1 ; temp eoi 118 | cmd .res 1 ; temp job command 119 | lstsec .res 1 ; 120 | bufuse .res 2 ; buffer allocation 121 | ;zp: jobnum .res 1 ; current job # 122 | mdirty .res 2 ;bam 0 & 1 dirty flags 123 | entfnd .res 1 ;dir-entry found flag 124 | dirlst .res 1 ;dir listing flag 125 | cmdwat .res 1 ;command waiting flag 126 | linuse .res 1 ;lindx use word 127 | lbused .res 1 ;last buffer used 128 | rec .res 1 129 | trkss .res 1 130 | secss .res 1 131 | ;* 132 | ;******************************** 133 | ;* 134 | ;* ram array area 135 | ;* 136 | ;******************************** 137 | ;* 138 | lstjob .res bfcnt ; last job 139 | ;zp: lintab .res maxsa+1 ; sa:lindx table 140 | ;zp: chndat .res mxchns ; channel data byte 141 | dsec .res mxchns ; sector of directory entry 142 | dind .res mxchns ; index of directory entry 143 | erword .res 1 ; error word for recovery 144 | erled .res 1 ; error led mask for flashing 145 | prgdrv .res 1 ; last program drive 146 | prgsec .res 1 ; last program sector 147 | wlindx .res 1 ; write lindx 148 | rlindx .res 1 ; read lindx 149 | nbtemp .res 2 ; # blocks temp 150 | cmdsiz .res 1 ; command string size 151 | char .res 1 ; char under parser 152 | limit .res 1 ; ptr limit in compar 153 | f1cnt .res 1 ; file stream 1 count 154 | f2cnt .res 1 ; file stream 2 count 155 | f2ptr .res 1 ; file stream 2 pointer 156 | ; parser tables 157 | filtbl .res mxfils+1 ; filename pointer 158 | ;zp: filent .res mxfils ; directory entry 159 | ;zp: fildat .res mxfils ; drive #, pattern 160 | filtrk .res mxfils ; 1st link/track 161 | filsec .res mxfils ; /sector 162 | ; channel tables 163 | ;zp: filtyp .res mxchns; channel file type 164 | ;zp: chnrdy .res mxchns ; channel status 165 | ;zp: lstchr .res mxchns ; channel last char ptr 166 | patflg .res 1 ; pattern presence flag 167 | image .res 1 ; file stream image 168 | drvcnt .res 1 ; number of drv searches 169 | drvflg .res 1 ; drive search flag 170 | lstdrv .res 1 ; last drive w/o error 171 | found .res 1 ; found flag in dir searches 172 | dirsec .res 1 ; directory sector 173 | delsec .res 1 ; sector of 1st avail entry 174 | delind .res 1 ; index " 175 | lstbuf .res 1 ; =0 if last block 176 | index .res 1 ; current index in buffer 177 | filcnt .res 1 ; counter, file entries 178 | typflg .res 1 ; match by type flag 179 | mode .res 1 ; active file mode (r,w) 180 | ;zp: type .res 1 ; active file type 181 | jobrtn .res 1 ;job return flag 182 | eptr .res 1 ;ptr for recovery 183 | toff .res 1 ;total track offset 184 | ubam .res 2 ; last bam update ptr 185 | tbam .res 4 ; track # of bam image 186 | bam .res 16 ; bam images 187 | ;* 188 | ;***************************************** 189 | ;* 190 | ;* output buffers 191 | ;* 192 | ;******************************************** 193 | ;* 194 | ; *=$4400-36-36 195 | nambuf .res 36 ; directory buffer 196 | errbuf .res 36 ; error msg buffer 197 | wbam .res 1 ; don't-write-bam flag 198 | ndbl .res 2 ; # of disk blocks free 199 | ndbh .res 2 200 | phase .res 2 201 | ramend=* 202 | -------------------------------------------------------------------------------- /record.s: -------------------------------------------------------------------------------- 1 | ;********************************* 2 | ;* record: position relative * 3 | ;* pointers to given * 4 | ;* record number or to * 5 | ;* last record if out of * 6 | ;* range. * 7 | ;********************************* 8 | ; 9 | record 10 | jsr cmdset ;init tables, ptrs 11 | lda cmdbuf+1 12 | sta sa 13 | jsr fndrch 14 | bcc r20 ;got channel's lindex 15 | ; 16 | lda #nochnl ;no valid channel 17 | jsr cmderr 18 | r20 19 | lda #lrf+ovrflo 20 | jsr clrflg 21 | jsr typfil ;get file type 22 | beq r30 ;it is relative file 23 | ; 24 | lda #mistyp ;wrong type 25 | jsr cmderr 26 | r30 27 | lda filtyp,x 28 | and #1 29 | sta drvnum 30 | lda cmdbuf+2 31 | sta recl,x ;get record # 32 | lda cmdbuf+3 33 | sta rech,x 34 | ldx lindx ;clear chnrdy to rndrdy 35 | lda #rndrdy 36 | sta chnrdy,x 37 | ; 38 | lda cmdbuf+4 ;get offset 39 | beq r40 40 | sec 41 | sbc #1 42 | beq r40 43 | cmp rs,x 44 | bcc r35 45 | ; 46 | lda #recovf 47 | sta erword 48 | lda #0 49 | r35 50 | r40 51 | sta recptr ;set offset 52 | jsr fndrel ;calc ss stuff 53 | jsr sspos ;set ss ptrs 54 | bvc r50 55 | ; 56 | lda #lrf ;beyond the end 57 | jsr setflg ;set last rec flag 58 | jmp rd05 59 | r50 60 | jsr positn ;position to record 61 | lda #lrf 62 | jsr tstflg 63 | beq r60 64 | jmp rd05 65 | r60 66 | jmp endcmd ;that's all 67 | ; 68 | ;********************************* 69 | ;* positn: position relative * 70 | ;* data block into active* 71 | ;* buffer & next block * 72 | ;* into inactive buffer. * 73 | ;********************************* 74 | ; 75 | positn 76 | ; jsr restor ;restore buffer areas 77 | jsr posbuf ;position buffers 78 | lda relptr 79 | jsr setpnt ;set ptr from fndrel 80 | ; 81 | ldx lindx 82 | lda rs,x 83 | sec ;calc the offset 84 | sbc recptr 85 | bcs p2 86 | jmp break ;should not be needed 87 | p2 88 | clc 89 | adc relptr 90 | bcc p30 91 | adc #1 92 | sec 93 | p30 94 | jsr nxout ;set nr 95 | jmp rd15 96 | lda #recovf 97 | jsr cmderr 98 | ;* posbuf: position proper data * 99 | ;* blocks into buffers * 100 | ;********************************* 101 | ; 102 | posbuf 103 | lda dirbuf 104 | sta r3 105 | lda dirbuf+1 106 | sta r4 107 | jsr bhere ;is buffer in? 108 | bne p10 ;yes! 109 | rts 110 | p10 111 | jsr scrub ;clean buffer 112 | jsr getlnk 113 | lda track 114 | beq p80 115 | jsr bhere2 116 | bne p75 117 | jsr dblbuf 118 | jmp freiac 119 | p75 120 | jsr freiac 121 | ; 122 | p80 123 | ldy #0 ;get proper block 124 | lda (r3),y 125 | sta track 126 | iny 127 | lda (r3),y 128 | sta sector 129 | jmp strdbl ;get next block, too. 130 | ;rts 131 | ; 132 | bhere 133 | jsr gethdr ;get the header 134 | bhere2 135 | ldy #0 136 | lda (r3),y 137 | cmp track 138 | beq bh10 ;test sector, too. 139 | rts 140 | bh10 141 | iny 142 | lda (r3),y 143 | cmp sector ;set .z 144 | rts 145 | ; 146 | -------------------------------------------------------------------------------- /rel1.s: -------------------------------------------------------------------------------- 1 | ;*********************************** 2 | ;* 3 | ;* routine: nxtrec 4 | ;* 5 | ;* 6 | ;* 7 | ;* 8 | ;* 9 | ;*********************************** 10 | nxtrec 11 | lda #ovrflo 12 | jsr clrflg 13 | ; 14 | lda #lrf 15 | jsr tstflg 16 | bne nxtr40 17 | ; 18 | ldx lindx 19 | inc recl,x ; goto next record # 20 | bne nxtr15 21 | inc rech,x 22 | ; 23 | nxtr15 24 | ldx lindx 25 | lda nr,x 26 | beq nxtr45 ;there is a nr 27 | ; 28 | jsr getpnt ; get pointer 29 | ldx lindx ;test if same buffer 30 | cmp nr,x 31 | bcc nxtr20 ; yes, btverdir,>intdrv,>duplct 22 | .byt >mem,>block,>user 23 | .byt >record 24 | .byt >utlodr 25 | .byt >dskcpy 26 | .byt >rename,>scrtch,>new 27 | ; *=cjumph+ncmds 28 | val=0 ;validate (verify) cmd # 29 | ; structure images for cmds 30 | pcmd =9 31 | .byt %01010001 ; dskcpy 32 | struct =*-pcmd ; cmds not parsed 33 | .byt %11011101 ; rename 34 | .byt %00011100 ; scratch 35 | .byt %10011110 ; new 36 | ldcmd =*-struct ; load cmd image 37 | .byt %00011100 ; load 38 | ; --- --- 39 | ; pgdrpgdr 40 | ; fs1 fs2 41 | ; bit reps: not pattern 42 | ; not greater than one file 43 | ; not default drive(s) 44 | ; required filename 45 | modlst .byt "RWAM" ; mode table 46 | nmodes =*-modlst 47 | ;file type table 48 | tplst .byt "DSPUL" 49 | typlst .byt "DSPUR" ;del, seq, prog, user, relative 50 | ntypes =*-typlst 51 | tp1lst .byt "EERSE" 52 | tp2lst .byt "LQGRL" 53 | ledmsk .byt led0,led1 54 | ; 55 | ; error flag vars for bit 56 | ; 57 | er00 .byt 0 58 | er0 .byt $3f 59 | er1 .byt $7f 60 | er2 .byt $bf 61 | er3 .byt $ff 62 | ; 63 | numsec ;(4) sectors/track 64 | .byte 17,18,19,21 65 | vernum .byt fm4040 ;format type 66 | nzones .byt 4 ;# of zones 67 | maxtrk ;maximum track # +1 68 | trknum ;zone boundaries track numbers 69 | .byte 36,31,25,18 70 | offset ;for recovery 71 | .byte 1,$ff,$ff,1,0 72 | ; 73 | bufind 74 | .byte $03,$04,$05,$06,$07,$07 75 | ; 76 | -------------------------------------------------------------------------------- /scrtch.s: -------------------------------------------------------------------------------- 1 | ; scratch file(s) 2 | scrtch jsr fs1set ;set up for 1 stream 3 | jsr alldrs 4 | jsr optsch 5 | lda #0 6 | sta r0 ;used as file count 7 | jsr ffst 8 | bmi sc30 9 | sc15 jsr tstchn ;is it active ? 10 | bcc sc25 ;yes - dont scratch 11 | ldy #0 12 | lda (dirbuf),y 13 | and #$40 ;lock bit 14 | bne sc25 ;it's locked 15 | ; 16 | jsr deldir ;delete directory 17 | ldy #19 ;is this a relative ? 18 | lda (dirbuf),y ;has a ss ? 19 | beq sc17 ;no 20 | sta track ;yes - save track 21 | iny 22 | lda (dirbuf),y ;get sector 23 | sta sector 24 | jsr delfil ;delete by links 25 | sc17 ldx entfnd 26 | lda #$20 27 | and pattyp,x 28 | bne sc20 ;created, not closed 29 | lda filtrk,x ;delete by links 30 | sta track 31 | lda filsec,x 32 | sta sector 33 | jsr delfil 34 | sc20 inc r0 35 | sc25 jsr ffre 36 | bpl sc15 37 | sc30 lda r0 ;finished, set 38 | sta track ; file count 39 | lda #1 40 | ldy #0 41 | jmp scrend ;end of scratch 42 | delfil jsr frets ;delete file by links 43 | jsr opnird ;update bam 44 | jsr bam2x 45 | lda buf0,x 46 | cmp #$ff 47 | beq del10 48 | lda wbam 49 | ora #$40 50 | sta wbam 51 | del10 52 | del2 lda #0 53 | jsr setpnt 54 | jsr rdbyt 55 | sta track 56 | jsr rdbyt 57 | sta sector 58 | lda track 59 | bne del1 60 | jsr mapout 61 | jmp frechn 62 | del1 jsr frets 63 | jsr nxtbuf 64 | jmp del2 65 | deldir ldy #0 ;delete dir entry 66 | tya 67 | sta (dirbuf),y 68 | jsr wrtout 69 | jmp watjob 70 | -------------------------------------------------------------------------------- /ser.atn.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | atnirq lda pa1 ; clear irq (ca1) 5 | lda #1 6 | sta atnpnd 7 | rts 8 | ; 9 | atnsrv sei 10 | ; 11 | lda #0 ; clear pending flag 12 | sta atnpnd 13 | sta lsnact ; clear address flags 14 | sta tlkact 15 | ; 16 | ldx #topwrt ; reset stack 17 | txs 18 | ; 19 | lda #$80 ; set atn mode flag for acpt routine 20 | sta eoiflg ;reset eoi flag to non-eoi state 21 | sta atnmod 22 | ; 23 | jsr clkhi 24 | jsr datlow ; set data line low as response 25 | ; 26 | lda pb ; set atn ack to get hardware controll of data line 27 | ora #atna 28 | sta pb 29 | ; 30 | atns15 lda pb ; test atn still here 31 | bpl atns20 ; gone ! 32 | and #clkin ; clock still low 33 | bne atns15 34 | ; 35 | ; 36 | atn30 jsr acptr ; get a command byte 37 | ; 38 | cmp #unlsn 39 | bne atn35 40 | ; 41 | lda #0 ; general unlisten command 42 | sta lsnact 43 | beq atn122 ; jmp 44 | ; 45 | atn35 cmp #untlk 46 | bne atn40 47 | ; 48 | lda #0 49 | sta tlkact ; untalk now 50 | beq atn122 ; jmp 51 | ; 52 | atn40 cmp tlkadr ; our talk address? 53 | bne atn45 ; nope 54 | ; 55 | lda #1 ; yes 56 | sta tlkact ; set active talker flag 57 | lda #0 58 | sta lsnact ; unlisten 59 | beq atn95 ;jump 60 | ; 61 | atn45 cmp lsnadr ; out listen address? 62 | bne atn50 ; nope 63 | ; 64 | lda #1 ; yes 65 | sta lsnact 66 | lda #0 67 | sta tlkact 68 | beq atn95 ;jump 69 | ; 70 | atn50 tax ; test if sa 71 | and #$60 72 | cmp #$60 ; sa = $60 + n 73 | bne atn120 ;did not get a valid command 74 | ; 75 | ; 76 | txa ; a sa for me 77 | sta orgsa 78 | and #$0f ; strip junk 79 | sta sa 80 | ; 81 | lda orgsa ; test if close 82 | and #$f0 83 | cmp #$e0 84 | bne atn122 ; no 85 | ; 86 | cli 87 | jsr close ; close the file 88 | sei 89 | ; 90 | ; warning:::close doesn't return in time for atn122::: 91 | ; 92 | atn95 bit pb ; test atn still here 93 | bmi atn30 94 | ; 95 | ; 96 | ; atn gone , do what we where told to do 97 | ; 98 | ; 99 | atns20 lda #0 ; clear atn mode 100 | sta atnmod 101 | ; 102 | lda pb ; atn gone , release atn ack 103 | and #$ff-atna 104 | sta pb 105 | ; 106 | lda lsnact ; listen ? 107 | beq atn100 108 | ; 109 | jsr listen 110 | jmp idle 111 | ; 112 | atn100 lda tlkact ; talk? 113 | beq atn110 114 | ; 115 | jsr dathi ; release data line 116 | jsr clklow ; pull clock low 117 | ; 118 | jsr talk 119 | atn110 jmp ilerr ; release all lines and go to idle 120 | ; 121 | ; fix so (device not present) errors reported 122 | ; 123 | atn120 lda #$10 ;kill all but atnak 124 | sta pb 125 | atn122 bit pb 126 | bpl atns20 ;exit out same way after atn done 127 | bmi atn122 ;jmp 128 | ; 129 | ; rsr 12/8/80 fix inverted logic 130 | ; rsr 12/16/80 fix bad logic 131 | ; rsr 12/31/80 fix eoiflg and logic 132 | -------------------------------------------------------------------------------- /ser.listn.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | acptr lda #8 ; set byte bit count 5 | sta cont 6 | ; 7 | acp00a jsr tstatn 8 | jsr debnc 9 | and #clkin 10 | bne acp00a 11 | ; 12 | jsr dathi ; make data line hi 13 | ; 14 | lda #1 ; wait 255 us 15 | ; 16 | ;------rom -05 8/18/83------------- 17 | jmp patch6 18 | ;---------------------------------- 19 | ; 20 | acp00 jsr tstatn 21 | lda ifr1 22 | and #$40 ; test if time out 23 | bne acp00b ; ran out,its an eoi 24 | ; 25 | jsr debnc ; test clock low 26 | and #clkin 27 | beq acp00 ; no 28 | bne acp01 ; yes 29 | ; 30 | acp00b jsr datlow ; set data line low as response 31 | ; 32 | ldx #10 ; delay for talker turnaround 33 | acp02 dex 34 | bne acp02 35 | ; 36 | jsr dathi ; set data line hi 37 | ; 38 | acp02a jsr tstatn 39 | jsr debnc ; wait for low clock 40 | and #clkin 41 | beq acp02a 42 | ; 43 | lda #0 ; set eoi received 44 | sta eoiflg 45 | ; 46 | acp01 47 | acp03 lda pb ; wait for clock high 48 | eor #01 ; complement datain 49 | lsr a ; shift into carry 50 | and #$02 ; clkin/2 51 | bne acp03 52 | ; 53 | nop ; fill space left by speed-up 54 | nop ; to fix pal vc20 55 | nop ; 901229-02 rom 56 | ror data 57 | ; 58 | acp03a jsr tstatn 59 | jsr debnc 60 | and #clkin ; wait for clock low 61 | beq acp03a 62 | ; 63 | dec cont ; more to do? 64 | bne acp03 65 | ; 66 | jsr datlow ; set data line low 67 | lda data 68 | rts 69 | ; 70 | ; 71 | ; 72 | listen sei 73 | ; 74 | jsr fndwch ; test if active write channel 75 | bcs lsn15 76 | ; 77 | lda chnrdy,x 78 | ror a 79 | bcs lsn30 80 | ; 81 | lsn15 lda orgsa ; test if open 82 | and #$f0 83 | cmp #$f0 84 | beq lsn30 ; its an open 85 | ; 86 | jmp ilerr ; not active channel 87 | ; 88 | lsn30 jsr acptr ; get a byte 89 | ; 90 | cli 91 | jsr put ; put(data,eoiflg,sa) 92 | ; 93 | jmp listen ; and keep on listen 94 | ; 95 | ; 96 | frmerr 97 | iterr 98 | ilerr lda #00 ; release all bus lines 99 | sta pb 100 | jmp idle 101 | ; 102 | ; 103 | ; 104 | atnlow jmp atnsrv 105 | ; 106 | ; 107 | ; tstatn() 108 | ; [ 109 | ; if(atnmod) 110 | ; [ 111 | ; if(pb & $80) atns20(); 112 | ; else return ; 113 | ; ] 114 | ; else 115 | ; [ 116 | ; if(pb&$80) return; 117 | ; else atnsrv(); 118 | ; ] 119 | ; ] 120 | ; 121 | ; 122 | tstatn lda atnmod ; test if in atn mode 123 | beq tsta50 ; no 124 | ; 125 | lda pb ; in atnmod 126 | bpl tatn20 ; atn gone,do what we are told to do 127 | tstrtn rts ; still in atn mode 128 | ; 129 | tsta50 lda pb ; not atnmode 130 | bpl tstrtn ; no atn present 131 | ; 132 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 133 | ; 134 | jmp ptch30 ; *** rom ds 03/12/85 *** 135 | ; jmp atnsrv ; do atn command 136 | ; 137 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 138 | ; 139 | tatn20 jmp atns20 140 | ; 141 | ; 142 | ; 143 | -------------------------------------------------------------------------------- /ser.talk.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; 4 | talk sei ; find if open channel 5 | jsr fndrch 6 | bcs notlk ; no one home 7 | ; 8 | talk1 ldx lindx 9 | lda chnrdy,x 10 | bmi tlk05 11 | ; 12 | notlk rts 13 | ; 14 | ; code added to correct verify error 15 | tlk05 jsr tstatn ;test for atn 16 | jsr debnc ;check for clock gone (must be 80us+ from jmp talk1) 17 | and #datin 18 | php 19 | jsr clkhi ;set clock line hi 20 | plp ;see if verify error... 21 | beq tlk02 ;yes...data line low, eoi !!!! 22 | ; 23 | talk2 jsr tstatn ; test atn gone 24 | jsr debnc ; test data line now low 25 | and #datin 26 | bne talk2 ; did not respond 27 | ; 28 | ; 29 | ldx lindx ; prepare to send eoi if needed 30 | lda chnrdy,x 31 | and #eoi 32 | bne noeoi ; no eoi 33 | ; 34 | tlk02 jsr tstatn 35 | jsr debnc ; send an eoi 36 | and #datin ; test if data line is low 37 | bne tlk02 ; yes, wait till hi 38 | ; 39 | tlk03 jsr tstatn 40 | jsr debnc ; wait for data line to go low 41 | and #datin 42 | beq tlk03 43 | ; 44 | noeoi jsr clklow ; set clock low 45 | jsr tstatn 46 | jsr debnc ; wait for data line hi 47 | and #datin 48 | bne noeoi 49 | ; 50 | lda #8 ; set up bit counter 51 | sta cont 52 | ; 53 | isr01 jsr debnc ; let port settle 54 | ; 55 | and #datin ; test that data line is now high before we send 56 | bne frmerx 57 | ; 58 | isr02 ldx lindx ; get byte to send 59 | lda chndat,x 60 | ror a 61 | sta chndat,x 62 | ; 63 | bcs isrhi ; send a 1 64 | ; 65 | jsr datlow ; send a 0 66 | bne isrclk ; and clock it 67 | ; 68 | isrhi jsr dathi 69 | ; 70 | isrclk jsr clkhi ; rising edge clock 71 | ; 72 | lda drvtrk+1 ; check speed flag 73 | bne isr03 ; no slow down 74 | ; 75 | jsr slowd ; slow down 76 | isr03 jsr clkdat ; pull clock low and release data 77 | ; 78 | dec cont ; more bits? 79 | bne isr01 ; yes 80 | ; 81 | isr04 jsr tstatn 82 | jsr debnc 83 | and #datin 84 | beq isr04 85 | ; 86 | cli ; get next byte to send 87 | jsr get 88 | sei 89 | ; 90 | jmp talk1 ; keep on talkin 91 | ; 92 | frmerx jmp frmerr 93 | ; 94 | ; 95 | dathi lda pb ; set data out hi 96 | and #$ff-datout 97 | sta pb 98 | rts 99 | ; 100 | ; 101 | ; 102 | datlow lda pb 103 | ora #datout 104 | sta pb 105 | rts 106 | ; 107 | ; 108 | ; 109 | clklow lda pb 110 | ora #clkout 111 | sta pb 112 | rts 113 | ; 114 | ; 115 | ; 116 | clkhi lda pb 117 | and #$ff-clkout 118 | sta pb 119 | rts 120 | ; 121 | ; 122 | ; 123 | debnc lda pb 124 | cmp pb 125 | bne debnc 126 | rts 127 | ; 128 | ; additions after code sent to japan. 129 | ; rsr 3/30/81 add verify error correction 130 | ; rsr 3/31/81 change ordering to detect verify error 131 | -------------------------------------------------------------------------------- /setdrv.s: -------------------------------------------------------------------------------- 1 | ;set 1st drive and table pointers 2 | onedrv lda f2cnt 3 | sta f1cnt 4 | lda #1 5 | sta f2cnt 6 | sta f2ptr 7 | ;set up all drives from f2cnt 8 | alldrs ldy lstdrv ;set up drive #'s... 9 | ldx #0 ;...into file entry table... 10 | ad10 stx f1ptr ;...on sector ptr byte 11 | lda filtbl,x 12 | jsr setdrv 13 | ldx f1ptr 14 | sta filtbl,x ;incr ptr past ":" 15 | tya ;bits rep drives 16 | sta fildrv,x ;bit7: default 17 | inx ;bit0: drive # 18 | cpx f2cnt 19 | bcc ad10 20 | rts 21 | ;set drive number 22 | ; determines drive # from text or 23 | ; uses default (-d) 24 | ; a: in,out: index, cmdbuf 25 | ; y: in: default drive!!!!!!!!!!!!!!!!!!!!!!!!!!!! 26 | ; out: drive number, - if default 27 | setdrv tax ;x= cmdbuf index 28 | ldy #0 ;set default drive to zero!!!!!!!!!!!!!!!!!!!!! 29 | lda #': 30 | cmp cmdbuf+1,x ;for xxx:file 31 | beq sd40 ; ^ 32 | cmp cmdbuf,x ;for xxx:file 33 | bne sd50 ; ^ 34 | inx ;found ":", so... 35 | sd20 tya ;drive= default 36 | sd22 and #1 ;convert to numeric 37 | sd24 tay ;restore drive 38 | txa ;a=index & xxxxfile 39 | rts ; ^ 40 | sd40 lda cmdbuf,x 41 | inx ; xxx:file 42 | inx ; --^ 43 | cmp #'0 ;for xx0:file 44 | beq sd22 ; ^ 45 | cmp #'1 ;for xx1:file 46 | beq sd22 ; ^ 47 | bne sd20 ;cmd:file or xx,:file 48 | sd50 =* ; ^ ^ 49 | tya ;for xxx,file or xx=file 50 | ora #$80 ; ^ ^ 51 | and #$81 ;drive= -default 52 | bne sd24 ;finish testing 53 | ;set drive from any config. 54 | setany lda #0 55 | sta image 56 | ldy filtbl 57 | sa05 lda (cb),y 58 | jsr tst0v1 59 | bpl sa20 60 | iny 61 | cpy cmdsiz 62 | bcs sa10 63 | ldy cmdsiz 64 | dey 65 | bne sa05 66 | sa10 dec image 67 | lda #0 ;default to zero!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 68 | sa20 and #1 69 | sta drvnum 70 | jmp setlds 71 | ;toggle drvnum 72 | togdrv lda drvnum 73 | eor #1 74 | and #1 75 | sta drvnum 76 | rts 77 | ;set ptrs to one file stream & chk type 78 | fs1set ldy #0 79 | lda f1cnt 80 | cmp f2cnt 81 | beq fs15 82 | dec f2cnt 83 | ldy f2cnt 84 | lda filtbl,y 85 | tay 86 | lda (cb),y 87 | ldy #ntypes-1 88 | fs10 cmp typlst,y 89 | beq fs15 90 | dey 91 | bne fs10 92 | fs15 tya 93 | sta typflg 94 | rts 95 | ;test char in accum for "0" or "1" 96 | tst0v1 cmp #'0 97 | beq t0v1 98 | cmp #'1 99 | beq t0v1 100 | ora #$80 101 | t0v1 and #$81 102 | rts 103 | -------------------------------------------------------------------------------- /ssend.s: -------------------------------------------------------------------------------- 1 | ;********************************* 2 | ;* ssend: position ss & buftab * 3 | ;* to end of last record. * 4 | ;* vars: * 5 | ;********************************* 6 | ; 7 | ssend 8 | jsr ssset 9 | sta ssnum 10 | lda #4 11 | sta dirbuf 12 | ldy #ssioff-6 13 | bne se20 14 | se10 15 | dey 16 | dey 17 | bmi break 18 | se20 19 | lda (dirbuf),y ;look for last ss # 20 | beq se10 ;t=0: not yet 21 | tya 22 | lsr a 23 | cmp ssnum ;check ss # 24 | beq se30 ;this is last ss 25 | ; 26 | sta ssnum 27 | ldx lindx 28 | lda ss,x 29 | jsr ibrd ;read last ss 30 | se30 31 | ldy #0 ;set ssind 32 | sty dirbuf 33 | lda (dirbuf),y ;debug 34 | bne break 35 | iny 36 | lda (dirbuf),y 37 | tay ;back up to track 38 | dey 39 | sty ssind 40 | tya 41 | jmp setssp 42 | ; 43 | break 44 | lda #$67 45 | jsr cmder2 46 | -------------------------------------------------------------------------------- /sstest.s: -------------------------------------------------------------------------------- 1 | ;********************************* 2 | ;* sstst: test ssnum & ssind for * 3 | ;* residence & range. * 4 | ;* vars: ssnum,ssind,dirbuf * 5 | ;* * 6 | ;* flags: .n rng .v res er * 7 | ;* 0 ok 0 yes er0 * 8 | ;* 0 maybe 1 no er1 * 9 | ;* 1 no 0 yes er2 * 10 | ;* 1 no 1 no er3 * 11 | ;********************************* 12 | ; 13 | sstest 14 | jsr ssset ;set pointer & ss # 15 | cmp ssnum 16 | bne st20 ;not this ss 17 | ; 18 | ldy ssind 19 | lda (dirbuf),y 20 | beq st10 21 | bit er0 ;ok, resident 22 | rts 23 | st10 24 | bit er2 ;out of range, res 25 | rts 26 | st20 27 | lda ssnum 28 | cmp #nssl 29 | bcs st30 30 | asl a 31 | tay 32 | lda #4 33 | sta dirbuf 34 | lda (dirbuf),y 35 | bne st40 36 | st30 37 | bit er3 ;way out of range 38 | rts 39 | st40 40 | bit er1 ;not res, range??? 41 | rts 42 | -------------------------------------------------------------------------------- /ssutil.s: -------------------------------------------------------------------------------- 1 | ;********************************* 2 | ;* b0tob0: transfer bytes from * 3 | ;* one buf to other. * 4 | ;* reg: in: .a= # bytes * 5 | ;* .y= source buf # * 6 | ;* .x= destin buf # * 7 | ;********************************* 8 | ; 9 | b0tob0 10 | pha 11 | lda #0 12 | sta temp 13 | sta temp+2 14 | lda bufind,y 15 | sta temp+1 16 | lda bufind,x 17 | sta temp+3 18 | pla 19 | tay 20 | dey 21 | b02 22 | lda (temp),y 23 | sta (temp+2),y 24 | dey 25 | bpl b02 26 | rts 27 | ; 28 | ;********************************* 29 | ;* clrbuf: clear buffer given * 30 | ;* reg: in: .a= buffer # * 31 | ;* out: .y,.a =0 * 32 | ;********************************* 33 | ; 34 | clrbuf 35 | tay 36 | lda bufind,y 37 | sta temp+1 38 | lda #0 39 | sta temp 40 | tay 41 | cb10 42 | sta (temp),y 43 | iny 44 | bne cb10 45 | rts 46 | ; 47 | ; 48 | ;********************************* 49 | ;* ssset: set ss pntr to 0 * 50 | ;* reg: out: .a= ss number * 51 | ;********************************* 52 | ; 53 | ssset 54 | lda #0 55 | jsr ssdir 56 | ldy #2 57 | lda (dirbuf),y 58 | rts 59 | ; 60 | ;********************************* 61 | ;* ssdir: set dirbuf with current* 62 | ;* ss pointer. * 63 | ;* regs: in: .a= low byte * 64 | ;********************************* 65 | ; 66 | ssdir 67 | sta dirbuf 68 | ldx lindx 69 | lda ss,x 70 | tax 71 | lda bufind,x 72 | sta dirbuf+1 73 | rts 74 | ; 75 | ;********************************* 76 | ;* setssp: set dirbuf & buftab * 77 | ;* with current ss ptr. * 78 | ;* regs: in: .a= low byte * 79 | ;********************************* 80 | ; 81 | setssp 82 | pha 83 | jsr ssdir 84 | pha 85 | txa 86 | asl a 87 | tax 88 | pla 89 | sta buftab+1,x 90 | pla 91 | sta buftab,x 92 | rts 93 | ; 94 | ;********************************* 95 | ;* sspos: position ss & buftab * 96 | ;* to ssnum ssind. * 97 | ;* flag: .v=0: ok * 98 | ;* .v=1: out of range * 99 | ;********************************* 100 | ; 101 | sspos 102 | jsr sstest 103 | bmi ssp10 ;out of range 104 | bvc ssp20 ;er0:ok, in range 105 | ; 106 | ldx lindx ;er1: possibly in range 107 | lda ss,x 108 | jsr ibrd ;read ss in 109 | jsr sstest ;test again 110 | bpl ssp20 111 | ssp10 112 | jsr ssend ;not in range,set end 113 | bit er1 114 | rts 115 | ssp20 116 | lda ssind ;ok, set ptr w/ index 117 | jsr setssp 118 | bit er0 119 | rts 120 | ; 121 | ;********************************* 122 | ;* ibrd: indirect block read & * 123 | ;* ibwt: write. * 124 | ;* regs: in: .a= buf # for r/w * 125 | ;* .x= lindx * 126 | ;* (dirbuf),y points to * 127 | ;* t&s to be r/w. * 128 | ;********************************* 129 | ; 130 | ibrd 131 | sta jobnum 132 | lda #read 133 | bne ibop 134 | ibwt 135 | sta jobnum 136 | lda #write 137 | ibop 138 | pha 139 | lda filtyp,x 140 | and #1 141 | sta drvnum 142 | pla 143 | ora drvnum 144 | sta cmd 145 | ; 146 | lda (dirbuf),y 147 | sta track 148 | iny 149 | lda (dirbuf),y 150 | sta sector 151 | lda jobnum 152 | jsr seth 153 | ldx jobnum 154 | jmp doit2 155 | ; 156 | ; 157 | ;* 158 | ;***************************** 159 | ;* 160 | ;* gsspnt 161 | ;* 162 | ;***************************** 163 | ;* 164 | gsspnt ldx lindx 165 | lda ss,x 166 | jmp gp1 167 | ; 168 | scal1 169 | lda #nssp 170 | jsr addt12 ;add (#ss needed)*120 171 | sscalc 172 | dex 173 | bpl scal1 174 | ; 175 | lda t3 ;add (# ss indices needed) 176 | lsr a 177 | jsr addt12 178 | lda t4 ;add (# ss blocks needed) 179 | ; jmp addt12 180 | ; 181 | addt12 182 | clc ;add .a to t1,t2 183 | adc t1 184 | sta t1 185 | bcc addrts 186 | inc t2 187 | addrts 188 | rts 189 | ; 190 | -------------------------------------------------------------------------------- /system.s: -------------------------------------------------------------------------------- 1 | killp ;kill protection 2 | ; pha 3 | ; lda #1 4 | ; sta cflg2 ;tell contoller 5 | ;killp2 6 | ; lda cflg2 ;wait until he's got it 7 | ; bne killp2 8 | ; 9 | ; pla 10 | rts 11 | ; 12 | -------------------------------------------------------------------------------- /trnsfr.s: -------------------------------------------------------------------------------- 1 | ;transfer filename from cmd to buffer 2 | ; a: string size 3 | ; x: starting index in cmdbuf 4 | ; y: buffer # 5 | trname pha 6 | jsr fndlmt 7 | jsr trcmbf 8 | pla 9 | sec 10 | sbc strsiz 11 | tax 12 | beq tn20 13 | bcc tn20 14 | lda #$a0 15 | tn10 sta (dirbuf),y 16 | iny 17 | dex 18 | bne tn10 19 | tn20 rts 20 | ;transfer cmd buffer to other buffer 21 | ; uses current buffer ptr 22 | ; limit: ending index+1 in cmd buf 23 | ; x: starting index in cmd buf 24 | ; y: buffer # 25 | trcmbf tya 26 | asl a 27 | tay 28 | lda buftab,y 29 | sta dirbuf 30 | lda buftab+1,y 31 | sta dirbuf+1 32 | ldy #0 33 | ; 34 | tr10 lda cmdbuf,x 35 | sta (dirbuf),y 36 | iny 37 | beq tr20 38 | inx 39 | cpx limit 40 | bcc tr10 41 | tr20 rts 42 | ; 43 | ; 44 | ;find the limit of the string in cmdbuf 45 | ; pointed to by x 46 | fndlmt lda #0 47 | sta strsiz 48 | txa 49 | pha 50 | fl05 51 | lda cmdbuf,x 52 | cmp #', 53 | beq fl10 54 | cmp #'= 55 | beq fl10 56 | inc strsiz 57 | inx 58 | lda #15 59 | cmp strsiz 60 | bcc fl10 61 | cpx cmdsiz 62 | bcc fl05 63 | fl10 stx limit 64 | pla 65 | tax 66 | rts 67 | ; get file entry from directory 68 | ; called by stdir, getdir 69 | getnam lda sa ;save variables 70 | pha 71 | lda lindx 72 | pha 73 | jsr gnsub 74 | pla ;restore variables 75 | sta lindx 76 | pla 77 | sta sa 78 | rts 79 | gnsub lda #irsa 80 | sta sa 81 | jsr fndrch 82 | jsr getpnt 83 | lda entfnd 84 | bpl gn05 ;more files 85 | lda drvflg 86 | bne gn050 87 | jsr msgfre ;send blocks free 88 | clc ;(c=0): end 89 | rts ;terminate 90 | gn05 lda drvflg ;(drvflg=0): 91 | beq gn10 ; send file name 92 | gn050 93 | dec drvflg ;(drvflg=-1):new dir 94 | bne gn051 95 | dec drvflg ;(drvflg=-1): 96 | jsr togdrv ; send blocks free 97 | jsr msgfre 98 | sec 99 | jmp togdrv 100 | gn051 lda #0 101 | sta nbtemp+1 102 | sta drvflg ;reset flag 103 | jsr newdir 104 | sec 105 | rts 106 | gn10 ldx #dirlen ;set number blocks 107 | ldy #29 ; & adjust spacing 108 | lda (dirbuf),y 109 | sta nbtemp+1 110 | beq gn12 111 | ldx #dirlen-2 112 | gn12 dey 113 | lda (dirbuf),y 114 | sta nbtemp 115 | cpx #dirlen-2 116 | beq gn14 117 | cmp #10 118 | bcc gn14 119 | dex 120 | cmp #100 121 | bcc gn14 122 | dex 123 | gn14 jsr blknb ;clear name buffer 124 | lda (dirbuf),y ;set type chars 125 | pha 126 | asl a ;(used in bcs) 127 | bpl gn15 128 | lda #'< 129 | sta nambuf+1,x 130 | gn15 131 | pla 132 | and #$f 133 | tay 134 | lda tp2lst,y 135 | sta nambuf,x 136 | dex 137 | lda tp1lst,y 138 | sta nambuf,x 139 | dex 140 | lda typlst,y 141 | sta nambuf,x 142 | dex 143 | dex 144 | bcs gn20 ;(from asl) 145 | lda #'* ;file not closed 146 | sta nambuf+1,x 147 | gn20 lda #$a0 148 | sta nambuf,x 149 | dex 150 | ldy #18 151 | gn22 lda (dirbuf),y 152 | sta nambuf,x 153 | dex 154 | dey 155 | cpy #3 156 | bcs gn22 157 | lda #'" ;send name in quotes 158 | sta nambuf,x 159 | gn30 inx 160 | cpx #$20 161 | bcs gn35 162 | lda nambuf,x 163 | cmp #'" 164 | beq gn35 165 | cmp #$a0 166 | bne gn30 167 | gn35 lda #'" 168 | sta nambuf,x 169 | gn37 inx 170 | cpx #$20 171 | bcs gn40 172 | lda #$7f 173 | and nambuf,x 174 | sta nambuf,x 175 | bpl gn37 176 | gn40 jsr fndfil 177 | sec 178 | gn45 rts 179 | blknb ldy #nbsiz ;blank nambuf 180 | lda #$20 181 | blknb1 sta nambuf-1,y 182 | dey 183 | bne blknb1 184 | rts 185 | ;new directory in listing 186 | newdir 187 | jsr bam2x 188 | jsr redbam 189 | jsr blknb 190 | lda #$ff 191 | sta temp 192 | ldx drvnum 193 | stx nbtemp 194 | lda #0 195 | sta nbtemp+1 196 | ldx jobnum 197 | lda bufind,x 198 | sta dirbuf+1 199 | lda dsknam 200 | sta dirbuf 201 | ldy #22 202 | nd10 lda (dirbuf),y 203 | cmp #$a0 204 | bne nd20 205 | lda #'1 ;version # 1 206 | .byte $2c 207 | nd15 208 | lda (dirbuf),y 209 | cmp #$a0 210 | bne nd20 211 | ; 212 | lda #$20 213 | nd20 214 | sta nambuf+2,y 215 | dey 216 | bpl nd15 217 | lda #$12 218 | sta nambuf 219 | lda #'" 220 | sta nambuf+1 221 | sta nambuf+18 222 | lda #$20 223 | sta nambuf+19 224 | rts 225 | msgfre jsr blknb 226 | ldy #msglen-1 227 | msg1 lda fremsg,y 228 | sta nambuf,y 229 | dey 230 | bpl msg1 231 | jmp numfre 232 | fremsg .byte "BLOCKS FREE." 233 | msglen =*-fremsg 234 | -------------------------------------------------------------------------------- /tst3.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; 3 | ; .a=#buffers needed 4 | ; sets up buffer # and allocates lindx 5 | getwch 6 | sec ;set .c=1 indicate write 7 | bcs getr2 8 | getrch 9 | clc ;set .c=0 indicate read 10 | getr2 11 | php ;save r/w flag (.c) 12 | sta temp ;save #bufs needed 13 | jsr frechn ;free any channels 14 | jsr fndlnx ; get next lindx open 15 | sta lindx 16 | ldx sa 17 | plp 18 | bcc getr55 19 | getr52 ora #$80 20 | getr55 sta lintab,x ;save lindx in lintab 21 | getbf 22 | and #$3f 23 | tay ;now get the buffers 24 | lda #$ff 25 | sta buf0,y 26 | sta buf1,y 27 | sta ss,y 28 | getr3 dec temp 29 | bmi getr4 30 | jsr getbuf 31 | bpl getr5 32 | gberr jsr relbuf ; error ,rel bufs 33 | lda #nochnl 34 | jmp cmderr 35 | getr5 sta buf0,y 36 | dec temp 37 | bmi getr4 38 | jsr getbuf 39 | bmi gberr 40 | sta buf1,y 41 | getr4 rts 42 | ; 43 | ; free chanl associated with sa 44 | ; free read and write chanls 45 | ; dont free chanl 15 46 | frechn lda sa 47 | cmp #$f 48 | bne freco 49 | rts 50 | freco 51 | frerd 52 | frewrt ldx sa 53 | lda lintab,x 54 | cmp #$ff 55 | beq fre25 56 | and #$3f 57 | sta lindx 58 | lda #$ff 59 | sta lintab,x 60 | ldx lindx 61 | lda #0 62 | sta chnrdy,x 63 | jsr relbuf 64 | ; 65 | ; release the lindx 66 | ; 67 | relinx ldx lindx 68 | lda #1 69 | rel15 dex 70 | bmi rel10 71 | asl a 72 | bne rel15 73 | rel10 ora linuse ;1=free 0=used 74 | sta linuse 75 | fre25 rts 76 | ; given sa , free its read chanl 77 | ; 78 | ; 79 | ; release buffers (lindx) 80 | ; 81 | relbuf ldx lindx 82 | lda buf0,x 83 | cmp #$ff 84 | beq rel1 85 | pha 86 | lda #$ff 87 | sta buf0,x 88 | pla 89 | jsr frebuf 90 | rel1 ldx lindx 91 | lda buf1,x 92 | cmp #$ff 93 | beq rel2 94 | pha 95 | lda #$ff 96 | sta buf1,x 97 | pla 98 | jsr frebuf 99 | rel2 ldx lindx 100 | lda ss,x 101 | cmp #$ff 102 | beq rel3 103 | pha 104 | lda #$ff 105 | sta ss,x 106 | pla 107 | jsr frebuf 108 | rel3 rts 109 | ; 110 | ; get a free buffer # 111 | ; 112 | ; regs destroyed: .a .x 113 | ; out: .a,.x= buf # or $ff if failed 114 | ; .n= 1 if failed 115 | ; 116 | ; if successful init jobs & lstjob 117 | ; 118 | getbuf 119 | tya ;save .y 120 | pha 121 | ldy #1 122 | jsr fndbuf 123 | bpl gbf1 ;found one 124 | ; 125 | dey 126 | jsr fndbuf 127 | bpl gbf1 ;found one 128 | ; 129 | jsr stlbuf ;steal one 130 | tax ;test it 131 | bmi gbf2 ;didn't find one 132 | gbf1 133 | lda jobs,x 134 | bmi gbf1 ;wait for job free 135 | lda drvnum 136 | sta jobs,x ;clear job queue 137 | sta lstjob,x 138 | txa 139 | asl a 140 | tay 141 | lda #2 142 | sta buftab,y 143 | gbf2 144 | pla 145 | tay ;restore .y 146 | txa ;exit with buf # in .a & cc set 147 | rts 148 | ; 149 | ; 150 | ; find a free buf # & set bit in bufuse 151 | ; all regs used 152 | ; in: .y= index into bufuse 153 | ; out: .x= buf # or $ff if failed 154 | ; .n= 1 if failed 155 | ; 156 | fndbuf 157 | ldx #7 158 | fb1 159 | lda bufuse,y ;search bufuse 160 | and bmask,x 161 | beq fb2 ;found a free one 162 | ; 163 | dex 164 | bpl fb1 ;until all bits are tested 165 | ; 166 | rts 167 | fb2 ;set it used 168 | lda bufuse,y 169 | eor bmask,x ;set bit 170 | sta bufuse,y 171 | txa 172 | dey 173 | bmi fb3 ;if .y then... 174 | clc ;...add 8 more 175 | adc #8 176 | fb3 177 | tax ;leave in .x 178 | fri20 179 | rts 180 | ; 181 | freiac ;free inactive buffer 182 | ldx lindx 183 | lda buf0,x 184 | bmi fri10 185 | ; 186 | txa 187 | clc 188 | adc #mxchns+1 189 | tax 190 | lda buf0,x 191 | bpl fri20 192 | fri10 193 | cmp #$ff 194 | beq fri20 195 | ; 196 | pha 197 | lda #$ff 198 | sta buf0,x 199 | pla 200 | ; jmp frebuf 201 | ; 202 | ; 203 | ; 204 | frebuf and #$f 205 | tay 206 | iny 207 | ldx #16 208 | freb1 ror bufuse+1 209 | ror bufuse 210 | dey 211 | bne freb2 212 | clc 213 | freb2 dex 214 | bpl freb1 215 | rts 216 | ; 217 | ; 218 | clrchn lda #14 219 | sta sa 220 | clrc1 jsr frechn 221 | dec sa 222 | bne clrc1 223 | rts 224 | ; 225 | cldchn lda #14 226 | sta sa 227 | clsd ldx sa 228 | lda lintab,x 229 | cmp #$ff 230 | beq cld2 231 | and #$3f 232 | sta lindx 233 | jsr getact 234 | tax 235 | lda lstjob,x 236 | and #1 237 | cmp drvnum 238 | bne cld2 239 | jsr frechn 240 | cld2 dec sa 241 | bpl clsd 242 | rts 243 | ; 244 | ;******************************** 245 | ;*********** s t l b u f ****** 246 | ;******************************** 247 | ; 248 | ; steal a buffer 249 | ; 250 | ; this rtn searches the channels 251 | ; in order of least recently used 252 | ; and steals the first inactive 253 | ; buffer it finds. 254 | ; 255 | ; input paramters: 256 | ; lrutbl - least recentyl 257 | ; used table 258 | ; 259 | ; output paramters: 260 | ; a <== buffer # 261 | ; 262 | ; register usage: 263 | ; x - channel index 264 | ; y - lrutbl index 265 | ; 266 | ;******************************* 267 | ; 268 | stlbuf 269 | lda t0 270 | pha ;save t0 271 | ldy #0 272 | stl05 273 | ldx lrutbl,y 274 | lda buf0,x 275 | bpl stl10 ;active 276 | ; 277 | cmp #$ff 278 | bne stl30 ;it's inactive 279 | stl10 280 | txa 281 | clc 282 | adc #mxchns+1 283 | tax 284 | lda buf0,x 285 | bpl stl20 286 | cmp #$ff 287 | bne stl30 288 | stl20 289 | iny 290 | cpy #mxchns-1 291 | bcc stl05 292 | ldx #$ff ;set failure 293 | bne stl60 ;bra 294 | stl30 ;steal the buffer if no error 295 | stx t0 296 | and #$3f 297 | tax 298 | stl40 299 | lda jobs,x 300 | bmi stl40 ;wait till done 301 | 302 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 303 | 304 | jmp ptch54 ; *** rom ds 06/18/85 *** 305 | nop 306 | ; cmp #2 ; errors? 307 | ; bcc stl50 ; ok 308 | 309 | rtch54 ; return 310 | 311 | ;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> 312 | 313 | ldx t0 314 | cpx #mxchns+1 315 | bcc stl10 ;check opposite slot 316 | bcs stl20 ;check another channel 317 | ; 318 | ; found one, so lets steal it 319 | ; 320 | stl50 321 | ldy t0 322 | lda #$ff 323 | sta buf0,y ;clear slot 324 | stl60 325 | pla 326 | sta t0 327 | txa ;buf # in .a & set cc's 328 | rts 329 | ; 330 | ; 331 | ; 332 | ; find a free lindx to use 333 | ; mark as used in linuse 334 | ; 335 | fndlnx ldy #0 336 | lda #1 337 | fnd10 bit linuse ;1=free 0=used 338 | bne fnd30 339 | iny 340 | asl a 341 | bne fnd10 342 | lda #nochnl ;no free lindx available 343 | jmp cmderr 344 | fnd30 eor #$ff ;toggle bit mask 345 | and linuse ;mark bit used 346 | sta linuse 347 | tya ;return lindx in .a 348 | rts 349 | -------------------------------------------------------------------------------- /tst4.s: -------------------------------------------------------------------------------- 1 | ; 2 | ; get next char from a chanl 3 | ; 4 | gbyte ;get through internal channel 5 | jsr fndrch 6 | jsr setlds 7 | jsr get 8 | ldx lindx 9 | lda chndat,x 10 | rts 11 | ; 12 | ; 13 | get ldx lindx 14 | jsr typfil ;get file type 15 | bne get00 16 | ; 17 | jmp rdrel 18 | get00 19 | lda sa 20 | cmp #$f 21 | beq geterc 22 | ; 23 | lda chnrdy,x ;was last char just sent 24 | and #eoisnd ; just sent eoi 25 | bne get1 ;nope not this time 26 | ; 27 | jsr typfil 28 | cmp #dirtyp 29 | bne get0 ;not direct type 30 | ; 31 | lda #rndrdy ; direct file remains active 32 | sta chnrdy,x ;talker listener noeoi 33 | jmp rndget ; prepare the next char 34 | ; 35 | get0 lda #notrdy ;lst char sent,not ready 36 | sta chnrdy,x 37 | rts 38 | ; 39 | ; 40 | get1 lda sa ;test if a load 41 | beq get6 ;its a load sa of 0 42 | ; 43 | get2 jsr typfil ; tst for rnd file 44 | cmp #4 45 | bcc seqget ;seq file char get 46 | ; 47 | rndget jsr getpre ;direct file get 48 | lda buftab,x 49 | cmp lstchr,y ;up to lst char yet 50 | bne rnget1 ;not yet 51 | ; 52 | lda #0 ;read the whole thing 53 | sta buftab,x ;wrap pntr to 0 54 | rnget1 55 | inc buftab,x ;get the next char 56 | rnget2 57 | lda (buftab,x) 58 | rnget4 59 | sta chndat,y ;save char in 60 | lda buftab,x 61 | cmp lstchr,y 62 | bne rnget3 63 | ; 64 | lda #rndeoi 65 | sta chnrdy,y ;this is last char 66 | rnget3 rts ;send eoi with it 67 | ; 68 | ; 69 | seqget jsr rdbyt ;read the next byte 70 | get3 ldx lindx 71 | sta chndat,x ;store in chndat 72 | rts 73 | ; 74 | ; 75 | get6 lda dirlst ;test if dir lsting 76 | beq seqget ;no, its not 77 | jsr getdir ;yes it is,get dir char 78 | jmp get3 79 | ; 80 | geterc 81 | jsr getpnt 82 | cmp #errbuf 86 | bne ge10 87 | ; 88 | lda #cr 89 | sta data 90 | jsr erroff 91 | lda #0 92 | jsr errts0 93 | dec cb+2 94 | lda #eoiout 95 | bne ge30 ;(jump) 96 | ; 97 | ge10 98 | jsr getbyt 99 | sta data 100 | bne ge20 101 | ge15 102 | lda #errbuf 105 | sta buftab+1,x 106 | ge20 107 | lda #rdytlk 108 | ge30 109 | sta chnrdy+errchn 110 | lda data 111 | sta chndat+errchn 112 | rts 113 | ; 114 | ; 115 | ; read next buffer of a file 116 | ; follow links in first two bytes 117 | ; end of file if 1st byte=0 118 | ; 2nd char length 119 | ; 120 | nxtbuf jsr getact 121 | asl a 122 | tax 123 | lda #0 124 | sta buftab,x 125 | lda (buftab,x) 126 | beq nxtb1 127 | dec buftab,x 128 | jmp rdbyt 129 | nxtb1 rts 130 | ; 131 | ; direct block read 132 | ; 133 | ; 134 | drtrd lda #read 135 | bne drt 136 | ; direct block write 137 | ; 138 | ; direct block write 139 | drtwrt lda #write 140 | drt ora drvnum 141 | sta cmd 142 | lda jobnum 143 | jsr seth 144 | ldx jobnum 145 | jmp doit2 146 | ; open internal read chanl (sa=16) 147 | ; 148 | opnird 149 | lda #1 150 | opntyp 151 | sta type 152 | lda #irsa 153 | sta sa 154 | jsr opnrch 155 | lda #2 156 | jmp setpnt 157 | ; open internal write chanl (sa=16) 158 | ; 159 | ; 160 | opniwr lda #iwsa 161 | sta sa 162 | jmp opnwch 163 | ; 164 | ; allocate next directory block on 18 165 | ; and mark as used in bam 166 | ; 167 | nxdrbk jsr curblk 168 | lda #1 169 | sta temp 170 | lda secinc 171 | pha 172 | lda #3 ; incr sector by 3 in directory 173 | sta secinc 174 | jsr nxtds 175 | pla 176 | sta secinc 177 | lda #0 178 | jsr setpnt 179 | lda track 180 | jsr putbyt 181 | lda sector 182 | jsr putbyt 183 | jsr wrtbuf 184 | jsr watjob 185 | lda #0 186 | jsr setpnt 187 | nxdb1 jsr putbyt 188 | bne nxdb1 189 | jsr putbyt 190 | lda #$ff 191 | jmp putbyt 192 | ; 193 | ; 194 | ; .a=new pntr value 195 | ; 196 | setpnt sta temp 197 | jsr getact 198 | asl a 199 | tax 200 | lda buftab+1,x 201 | sta dirbuf+1 202 | lda temp 203 | sta buftab,x 204 | sta dirbuf 205 | rts 206 | ; 207 | ; 208 | ; 209 | ; free the internal chanl (sa=16) 210 | ; 211 | freich lda #irsa 212 | sta sa 213 | jsr frechn 214 | lda #iwsa 215 | sta sa 216 | jmp frechn 217 | ; 218 | ; read the active buffer pointer 219 | ; 220 | getpnt jsr getact 221 | setdir 222 | gp1 asl a 223 | tax 224 | lda buftab+1,x 225 | sta dirbuf+1 226 | lda buftab,x 227 | sta dirbuf 228 | rts 229 | ; 230 | ; direct read byte, .a=byte# to read 231 | ; 232 | drdbyt sta temp+2 233 | jsr getact 234 | tax 235 | lda bufind,x 236 | sta temp+3 237 | ldy #0 238 | lda (temp+2),y 239 | rts 240 | ; index table containing high 241 | ; byte address of buffers 242 | ; 243 | -------------------------------------------------------------------------------- /tstflg.s: -------------------------------------------------------------------------------- 1 | ;* 2 | ;* 3 | ;********************************** 4 | ;* 5 | ;* scflg 6 | ;* setflg 7 | ;* clrflg 8 | ;* tstflg 9 | ;* 10 | ;********************************* 11 | ;* 12 | ;* 13 | scflg bcc clrflg 14 | ; 15 | setflg ldx lindx 16 | ora filtyp,x 17 | bne clrf10 18 | ; 19 | clrflg ldx lindx 20 | eor #$ff 21 | and filtyp,x 22 | clrf10 sta filtyp,x 23 | rts 24 | ; 25 | ; 26 | tstflg ldx lindx 27 | and filtyp,x 28 | rts 29 | ; 30 | ;* 31 | ;* 32 | ;****************************** 33 | ;* 34 | ;* 35 | ;* tstwrt 36 | ;* 37 | ;****************************** 38 | ;* 39 | ;* 40 | tstwrt jsr getact 41 | tax 42 | lda lstjob,x 43 | and #$f0 44 | cmp #$90 45 | rts 46 | ;* 47 | ;* 48 | ; 49 | ; test for active files from 50 | ; lindx table 51 | ; 52 | ; c=1 file not active x=18,y=?,a=? 53 | ; c=0 file active x=entfnd,y=lindx,a=? 54 | ; 55 | ; 56 | tstchn ldx #0 ;start search at top 57 | tstc20 stx temp+2 ;save to look on 58 | lda lintab,x ;get lindx 59 | cmp #$ff 60 | bne tstc40 ;if plus test it 61 | tstc30 ldx temp+2 ;not active 62 | inx 63 | cpx #maxsa-2 ;searched all 64 | bcc tstc20 ;no 65 | tstrts rts ;yes 66 | ; 67 | ; 68 | tstc40 stx temp+2 ;save x 69 | and #$3f 70 | tay ;use lindx as index 71 | lda filtyp,y ;right drive # ? 72 | and #1 73 | sta temp+1 74 | ldx entfnd ;index entry found 75 | lda fildrv,x 76 | and #1 77 | cmp temp+1 ;same drive # ? 78 | bne tstc30 ;no 79 | lda dsec,y ;yes - same dir. entry ? 80 | cmp entsec,x 81 | bne tstc30 ;no 82 | lda dind,y 83 | cmp entind,x 84 | bne tstc30 ;no 85 | clc ;set flag 86 | rts 87 | ; 88 | ; 89 | ; 90 | -------------------------------------------------------------------------------- /tstfnd.s: -------------------------------------------------------------------------------- 1 | ; next track & sector 2 | ; returns next available track & sector 3 | ; given current t & s 4 | ; 5 | ; allocation is from track 18 6 | ; towards 1 & 35, by full tracks 7 | nxtts 8 | jsr gethdr 9 | lda #3 10 | sta temp 11 | lda #1 ;set no write bam 12 | ora wbam 13 | sta wbam 14 | nxtds 15 | nxt1 16 | lda temp 17 | pha ;save temp 18 | jsr setbam 19 | pla 20 | sta temp ;restore temp 21 | lda (bmpnt),y 22 | bne fndnxt 23 | lda track 24 | cmp dirtrk 25 | beq nxterr 26 | bcc nxt2 27 | inc track 28 | lda track 29 | cmp maxtrk 30 | bne nxt1 31 | ldx dirtrk 32 | dex 33 | stx track 34 | lda #0 35 | sta sector 36 | dec temp 37 | bne nxt1 38 | nxterr lda #dskful 39 | jsr cmderr 40 | nxt2 dec track 41 | bne nxt1 42 | ldx dirtrk 43 | inx 44 | stx track 45 | lda #0 46 | sta sector 47 | dec temp 48 | bne nxt1 49 | beq nxterr 50 | ; 51 | ; find the next optimum sector 52 | ; next sector=current sector+n 53 | ; 54 | fndnxt lda sector 55 | clc 56 | adc secinc 57 | sta sector 58 | lda track 59 | jsr maxsec 60 | sta lstsec 61 | sta cmd 62 | cmp sector 63 | bcs fndn0 64 | sec 65 | lda sector 66 | sbc lstsec 67 | sta sector 68 | beq fndn0 69 | dec sector 70 | fndn0 71 | jsr getsec 72 | beq fndn2 73 | fndn1 74 | jmp wused 75 | fndn2 76 | lda #0 77 | sta sector 78 | jsr getsec 79 | bne fndn1 80 | jmp derr 81 | ; 82 | ; 83 | ; returns optimum initial track,sector 84 | ; 85 | intts 86 | lda #1 87 | ora wbam 88 | sta wbam 89 | lda r0 90 | pha ;save temp var 91 | ;r0:= 1 92 | lda #1 93 | sta r0 94 | its1 ;track:= dirtrk-r0 95 | lda dirtrk 96 | sec 97 | sbc r0 98 | sta track 99 | ;if t>0 100 | bcc its2 101 | beq its2 102 | ;then begin 103 | jsr setbam ;set the bam pointer 104 | ;if @b[.y] then goto fndsec 105 | lda (bmpnt),y 106 | bne fndsec 107 | ;end 108 | its2 ;track:= dirtrk+r0 109 | lda dirtrk 110 | clc 111 | adc r0 112 | sta track 113 | ;r0:= r0+1 114 | inc r0 115 | ;if track >=maxtrk then cmder2(systs) 116 | cmp maxtrk 117 | bcc its3 118 | ; 119 | lda #systs 120 | jsr cmder2 121 | its3 122 | jsr setbam ;set ptr 123 | ;if @b[.y]=0 then goto its1 124 | lda (bmpnt),y 125 | beq its1 126 | fndsec 127 | pla 128 | sta r0 ;restore r0 129 | lda #0 130 | sta sector 131 | jsr getsec 132 | beq fnd2 133 | jmp wused 134 | ; 135 | fnd2 136 | derr 137 | lda #direrr 138 | jsr cmder2 139 | ; 140 | ; 141 | ; set bam and find available sector 142 | ; starting at sector 143 | ; 144 | getsec 145 | jsr setbam 146 | tya 147 | pha ;save .y 148 | jsr avck ;check bits & count 149 | ; 150 | lda track 151 | jsr maxsec 152 | sta lstsec ;save max sector # 153 | pla 154 | sta temp ;temp:= old .y for freus3 155 | gs10 156 | lda sector 157 | cmp lstsec 158 | bcs gs20 159 | ; 160 | jsr freus3 161 | bne gs30 162 | ; 163 | inc sector 164 | bne gs10 ;bra 165 | gs20 166 | lda #0 167 | gs30 168 | rts ;(z=1): used 169 | ;bit map validity check 170 | avck 171 | lda temp 172 | pha ;save temp 173 | lda #0 174 | sta temp ;temp:=0 175 | ;for .y:=bamsiz to 1 do; 176 | ldy bamsiz 177 | dey 178 | ac10 ;for .x:=7 to 0 do; 179 | ldx #7 ;count the bits 180 | ac20 ;if @b[.y] & bmask[x] 181 | ; then temp:=temp+1 182 | lda (bmpnt),y 183 | and bmask,x 184 | beq ac30 185 | inc temp 186 | ac30 ;end .x 187 | dex 188 | bpl ac20 189 | ;end .y 190 | dey 191 | bne ac10 192 | ;if @b[.y] <> temp 193 | ; then cmder2(direrr); 194 | lda (bmpnt),y 195 | cmp temp 196 | bne ac40 ;counts do not match 197 | ; 198 | pla 199 | sta temp ;restore temp 200 | rts 201 | ac40 202 | lda #direrr 203 | jsr cmder2 204 | ; .a=track # ,returns #sectors on this track 205 | maxsec ldx nzones 206 | max1 cmp trknum-1,x 207 | dex 208 | bcs max1 209 | lda numsec,x 210 | rts 211 | ; 212 | -------------------------------------------------------------------------------- /tsutil.s: -------------------------------------------------------------------------------- 1 | ;* 2 | ;* 3 | ;********************************* 4 | ;* 5 | ;* scrub 6 | ;* 7 | ;* write out buffer if dirty 8 | ;* 9 | ;********************************* 10 | ;* 11 | ;* 12 | scrub 13 | jsr gaflgs 14 | bvc scr1 ;not dirty 15 | ; 16 | jsr wrtout 17 | jsr watjob 18 | scr1 rts 19 | ;* 20 | ;* 21 | ;********************************* 22 | ;* 23 | ;* setlnk 24 | ;* 25 | ;* put track,sector into buffer 26 | ;* 27 | ;********************************* 28 | ;* 29 | ;* 30 | setlnk jsr set00 31 | ; 32 | lda track 33 | sta (dirbuf),y 34 | iny 35 | lda sector 36 | sta (dirbuf),y 37 | jmp sdirty 38 | ; 39 | ;* 40 | ;* 41 | ;******************************** 42 | ;* 43 | ;* getlnk 44 | ;* 45 | ;* get link from buffer into 46 | ;* track and sector 47 | ;* 48 | ;******************************** 49 | ;* 50 | ;* 51 | getlnk jsr set00 52 | ; 53 | lda (dirbuf),y 54 | sta track 55 | iny 56 | lda (dirbuf),y 57 | sta sector 58 | rts 59 | ;* 60 | ;* 61 | ;******************************** 62 | ;* 63 | ;* nullnk 64 | ;* 65 | ;* set track link=0 & sector 66 | ;* link=last non-zero char. 67 | ;* 68 | ;********************************* 69 | ;* 70 | ;* 71 | nullnk 72 | jsr set00 73 | lda #0 74 | sta (dirbuf),y 75 | iny 76 | ldx lindx 77 | lda nr,x 78 | tax 79 | dex 80 | txa 81 | sta (dirbuf),y 82 | rts 83 | ; 84 | ;* 85 | ;* 86 | ;******************************* 87 | ;* 88 | ;* set00 89 | ;* 90 | ;* setup up pointer to buffer 91 | ;* 92 | ;******************************* 93 | ;* 94 | ;* 95 | set00 jsr getact 96 | asl a 97 | tax 98 | lda buftab+1,x 99 | sta dirbuf+1 100 | lda #0 101 | sta dirbuf 102 | ldy #0 103 | rts 104 | ; 105 | ;* 106 | ;* 107 | ;******************************* 108 | ;* 109 | ;* gethdr 110 | ;* 111 | ;* read track,setor from header 112 | ;* 113 | ;******************************* 114 | ;* 115 | ;* 116 | curblk jsr fndrch 117 | gethdr jsr getact 118 | sta jobnum 119 | asl a 120 | tay 121 | lda hdrs,y ;4/12************** 122 | sta track 123 | lda hdrs+1,y ;4/12************** 124 | sta sector 125 | rts 126 | ; 127 | ;* 128 | ;* 129 | ;****************************** 130 | ;* 131 | ;* wrtab,rdab wrtout,rdin 132 | ;* wrtss,rdss 133 | ;* 134 | ;****************************** 135 | ;* 136 | ;* 137 | wrtab lda #write 138 | sta cmd 139 | bne sj10 140 | ; 141 | rdab lda #read 142 | sta cmd 143 | bne sj10 144 | ; 145 | wrtout lda #write 146 | sta cmd 147 | bne sj20 148 | ; 149 | rdin lda #read 150 | sta cmd 151 | bne sj20 152 | ; 153 | wrtss lda #write 154 | sta cmd 155 | bne rds5 156 | ; 157 | rdss lda #read 158 | rds5 sta cmd 159 | ldx lindx 160 | lda ss,x 161 | tax 162 | bpl sj30 ;was...bne sj30 163 | ; 164 | sj10 jsr sethdr 165 | jsr getact 166 | tax 167 | lda drvnum 168 | sta lstjob,x 169 | sj20 jsr cdirty 170 | jsr getact 171 | tax 172 | sj30 jmp setljb 173 | ;* 174 | ;* 175 | ;* 176 | ;*************************** 177 | ;* 178 | ;* rdlnk 179 | ;* 180 | ;*************************** 181 | ;* 182 | ;* 183 | rdlnk lda #0 184 | jsr setpnt 185 | jsr getbyt 186 | sta track 187 | jsr getbyt 188 | sta sector 189 | rts 190 | ; 191 | -------------------------------------------------------------------------------- /utlodr.s: -------------------------------------------------------------------------------- 1 | ;******************************** 2 | ;*utlodr-utility loader used to 3 | ; load user programs or system 4 | ; utilities from disk and 5 | ; execute them. 6 | ; 7 | ; this loader is designed to be 8 | ; incorporated into the 1540 dos 9 | ; system (serial bus interface). 10 | ; 11 | ; hardware reqired : 12 | ; connect data and clock line to 13 | ; ground. (2-4-5 on connector) 14 | ; 15 | ;******************************** 16 | ;*on entry- 17 | ; only requirement is that the 18 | ; filename of the file to be 19 | ; loaded be the first specified 20 | ; name in cmdbuf (the command 21 | ; buffer). 22 | ; 23 | ; registers: ignored 24 | ; 25 | ;*on exit- 26 | ; if the file existed on disk and 27 | ; could be found, and no checksum 28 | ; errors were encountered while 29 | ; loading it, it is now loaded 30 | ; into memory, ready to execute. 31 | ; 32 | ; registers: all destroyed 33 | ; 34 | ; execution of the loaded program 35 | ; is started at the first byte 36 | ; loaded. 37 | ; 38 | ; cmdbuf contains the parameter 39 | ; string for the freshly loaded 40 | ; utility or user program. 41 | ; 42 | ;******************************** 43 | ;******************************** 44 | ; 45 | ;*first writing- 46 | ; 25-jan-80 47 | ; by ron stephens 48 | ; 49 | ;-------------------------------- 50 | ; 51 | ;*revision list- 52 | ; 28-feb-80 s. patterson - add parser interface 53 | ; 09-apr-81 rsr - change for serial bus 54 | ; 55 | ;******************************** 56 | ;******************************** 57 | ; 58 | ;*routines external to this 59 | ; module that are used: 60 | ; 61 | ; lookup- 62 | ; function-finds first name 63 | ; specified in cmdbuf in the 64 | ; disk directory on the specified 65 | ; drive. 66 | ; 67 | ; inputs from utlodr-none 68 | ; outputs to utlodr-none 69 | ; 70 | ; chkin- 71 | ; function-checks if name was 72 | ; found by lookup. error if not 73 | ; found. exits to 8050 error 74 | ; routine. 75 | ; 76 | ; inputs from utlodr-none 77 | ; outputs to utlodr-none 78 | ; 79 | ; gibyte- 80 | ; function-fetches next byte 81 | ; from open file. also sets 82 | ; eoiflg zero if end of file 83 | ; condition detected. 84 | ; 85 | ; inputs from utlodr-none 86 | ; outputs to utlodr-variable 'data' contains 87 | ; the data byte. 88 | ; 89 | ; opntyp- 90 | ; function-opens file previously 91 | ; "looked up" by lookup above. 92 | ; calls error routine if 93 | ; type doesn't match that specified 94 | ; 95 | ; inputs from utlodr-.a=file type 96 | ; (5 in our case) 97 | ; outputs to utlodr-none 98 | ; 99 | ; cmder2- 100 | ; function-places error message 101 | ; specified into error buffer. 102 | ; 103 | ; inputs from utlodr-.a=error number 104 | ; outputs to utlodr-none 105 | ; 106 | ;******************************** 107 | boot2 108 | rts ;exit 109 | ; 110 | ;***rom -05 fix 8/18/83 111 | boot ;power-on diag sense loader 112 | ;lda pb ;get port data 113 | ;tax ;save for later 114 | ;and #clkin ;check for clk to gnd 115 | ;beq boot2 ;no...exit 116 | ;txa 117 | ;and #datin ;check for data to gnd 118 | ;beq boot2 ;no...exit 119 | ;cli ;so backgnd will run! 120 | ; 121 | ;boot clip must be on 122 | boot3 123 | ;lda pb 124 | ;and #clkin+datin 125 | ;bne boot3 ;wait untill removed? 126 | ; 127 | ;inc f2cnt ;set # files 128 | ;inc cmdsiz ;set # of chars 129 | ;lda #'* 130 | ;sta cmdbuf ;set filename for any match 131 | ;jmp boot4 132 | ;---------rom -05 fix 8/18/83--------------- 133 | .byte $ea,$ea,$ea,$ea,$ea,$ea,$ea,$ea 134 | .byte $ea,$ea,$ea,$ea,$ea,$ea,$ea,$ea 135 | .byte $ea,$ea,$ea,$ea,$ea,$ea,$ea,$ea 136 | .byte $ea,$ea,$ea,$ea,$ea,$ea,$ea,$ea 137 | .byte $ea,$ea,$60 138 | ;-------------------------------------------- 139 | ; 140 | ; 141 | ;*entry point 142 | ; 143 | utlodr 144 | lda #$8d 145 | jsr parse 146 | boot4 147 | jsr killp ;kill protect 148 | lda f2cnt 149 | pha ;save file count for utility 150 | lda #1 151 | sta f2cnt 152 | lda #$ff ;init firstbyte flag 153 | sta r0 ;r0 is flag 154 | ; 155 | jsr lookup ;locate filename on disk 156 | ; 157 | lda filtrk ;check if found. err if not 158 | bne utld00 159 | lda #nocfil 160 | jsr cmderr 161 | utld00 162 | pla 163 | sta f2cnt ;restore file count 164 | ; 165 | lda filtrk ;init trk, sctr for open 166 | sta track 167 | lda filsec 168 | sta sector 169 | ; 170 | lda #usrtyp ;open system type file( 5 ) 171 | jsr opntyp ;open 172 | ; 173 | ;******************************** 174 | ; 175 | ;*file record fetch loop 176 | utld10 lda #$00 ;init checksum 177 | sta r1 ;calc. chksum resides in r1 178 | ; 179 | jsr gtabyt ;fetch load address lo 180 | sta r2 181 | jsr addsum ;add into checksum 182 | ; 183 | jsr gtabyt ;fetch load address hi 184 | sta r3 185 | jsr addsum 186 | ; 187 | lda r0 ;is this the firstbyte address? 188 | beq utld20 ;br if not 189 | lda r2 ;sav away this addr. in2 stack 190 | pha ;lo first 191 | lda r3 192 | pha ;hi next 193 | lda #$00 ;clear flag 194 | sta r0 ;firstbyte flag 195 | ; 196 | utld20 jsr gtabyt ;fetch data byte count 197 | sta r4 ;save in r4 198 | jsr addsum ;add into checksum 199 | ; 200 | ;******************************** 201 | ; 202 | ;*byte store loop 203 | utld30 jsr gtabyt ;fetch data byt 204 | ldy #$00 ;init index 205 | sta (r2),y ;store byte at desired address 206 | jsr addsum ;add into checksum 207 | ; 208 | lda r2 ;pointer:=pointer+1 209 | clc 210 | adc #$01 211 | sta r2 212 | bcc utld35 213 | inc r3 ;add in carry 214 | ; 215 | utld35 dec r4 ;update byte counter 216 | bne utld30 ;if nonzero, continue 217 | ;*end of byte store loop 218 | ; 219 | ;******************************** 220 | ; 221 | jsr gibyte ;get a byte without check for eoi 222 | lda data 223 | cmp r1 ;last byte fetched was chksum 224 | beq utld50 ;if same...everything ok 225 | jsr gethdr 226 | lda #norec ;show record overflow 227 | jsr cmder2 ;and leave to error exit 228 | ; 229 | utld50 lda eoiflg ;check for end of file 230 | bne utld10 ;if nonzero, not done 231 | ;*end of record load loop 232 | ; 233 | ;******************************** 234 | ; 235 | pla ;xfer cntrl to 1st byte addr. 236 | sta r3 237 | pla 238 | sta r2 239 | jmp (r2) 240 | ;******************************** 241 | ; 242 | ;*local routines used by utlodr 243 | ; 244 | ;******************************** 245 | ; 246 | ;*gtabyt-fetches a byte from the 247 | ; file open on the internal 248 | ; channel. checks if this 249 | ; was the last byte in the 250 | ; file. error if it was. 251 | ; show a 'pter' (premature 252 | ; termination error). 253 | ; 254 | ;******************************** 255 | ; 256 | ;*entry point 257 | ; 258 | gtabyt jsr gibyte ;fetch a byte to data loc 259 | lda eoiflg ;check if eof exists 260 | bne gtabye ;ok if nonzero 261 | jsr gethdr 262 | lda #recovf ;record size error 263 | jsr cmder2 ;call 8050 error routine 264 | ; 265 | gtabye lda data 266 | rts 267 | ;******************************** 268 | ; 269 | ;*addsum-adds up checksum into 270 | ; location r1. algorithm: 271 | ; newsum:=oldsum+newbyte+ 272 | ; carry 273 | ; 274 | ; inputs: expects newbyte in .a 275 | ; outputs: r1=newsum, .a destroyed 276 | ; 277 | ;******************************** 278 | ; 279 | ;*entry point 280 | ; 281 | addsum clc 282 | adc r1 ;.a=.a+r1 283 | adc #$00 ;.a=.a+carry 284 | sta r1 ;save new checksum 285 | rts 286 | ; 287 | -------------------------------------------------------------------------------- /vector.s: -------------------------------------------------------------------------------- 1 | echksm .byt 0 ;$e-$f checksum 2 | nmi jmp (vnmi) 3 | ; 4 | patch ;patch area 5 | pea7a sta ledprt ;patch for power-on errors 6 | sta ledout ;turn ddrb to output 7 | jmp rea7d ;return to led blink code 8 | ; 9 | ;--------------------------------------------------- 10 | ; patch area for 1541 disk with slow serial receive 11 | ; 12 | slowd txa ; only affect .a 13 | ldx #5 ; insert 40us of delay with this routine 14 | slowe dex 15 | bne slowe 16 | tax 17 | rts 18 | ; 19 | ;--------------------------------------------------- 20 | ; 21 | clkdat jsr clklow ; new clock low and... 22 | jmp dathi ; data hi for patch area 23 | ; 24 | ;--------------------------------------------------- 25 | ; 26 | nnmi lda cmdbuf+2 ; new nmi routine check for 27 | cmp #'-' 28 | beq nnmi10 ; if ui- then no delay 29 | sec 30 | sbc #'+' 31 | bne nmi ; if not ui+ then must be a real ui command 32 | nnmi10 sta drvtrk+1 33 | rts 34 | ; 35 | ; 36 | ;--------------------------------------------------- 37 | ; patch 5 *rom-05 8/18/83* 38 | ; 39 | ;clock line hi on pwr on 40 | ; 41 | patch5 stx ddra1 ; set direction 42 | lda #$02 ; set clock high 43 | ; 44 | sta pb 45 | ; 46 | ptch22r lda #$1a ; set ddra reg b 47 | sta ddrb1 48 | jmp dkit10 ; return 49 | ; 50 | ; 51 | ;--------------------------------------------------- 52 | ; patch 6 *rom ds 8/18/83* 53 | ; 54 | ;fix eoi timing to wait all devices 55 | ; 56 | ; 57 | patch6 lda pb ; test data line 58 | and #$01 ; every one rdy ? 59 | bne patch6 60 | lda #$01 ; wait 255 usec 61 | sta t1hc1 ; set timer 62 | jmp acp00 ; return 63 | ; 64 | ; 65 | ;--------------------------------------------------- 66 | ; patch 7 *** rom ds 03/15/85 *** 67 | ; 68 | ; 69 | patch7 lda #$ff ; clear format flags 70 | sta ftnum ; 71 | jmp format ; transfer format to ram 72 | ; 73 | ; 74 | ;---------------------------------------------------- 75 | ; patch 11 *rom ds 01/21/85* 76 | ; 77 | ptch11 sta nodrv ; clr nodrv 78 | jmp setlds ; set leds 79 | ; 80 | ; 81 | ;---------------------------------------------------- 82 | ; 83 | ; patch 54 84 | ; 85 | ptch54 cmp #2 ; error ? 86 | bcc pth541 87 | ; 88 | cmp #15 ; no drv condition ? 89 | beq pth541 90 | ; 91 | jmp rtch54 ; bad, try another 92 | pth541 jmp stl50 ; ok 93 | ; 94 | ; 95 | ;---------------------------------------------------- 96 | ; 97 | ; patch 31 98 | ; 99 | ptch31 sei 100 | ldx #topwrt ; set stack pointer 101 | txs 102 | jmp rtch31 103 | ; 104 | ; 105 | ;---------------------------------------------------- 106 | ; 107 | ; patch 30 108 | ; 109 | ptch30 bit pa1 110 | jmp atnsrv 111 | 112 | ; 113 | ; 114 | ;---------------------------------------------------- 115 | ; 116 | ; patch 50 117 | ; 118 | ptch50 lda a:nodrv,x 119 | rts 120 | ; 121 | ;---------------------------------------------------- 122 | ; 123 | ; patch 52 124 | ; 125 | ptch52 ldx drvnum ; get offset 126 | lda a:nodrv,x 127 | jmp rtch52 128 | ; 129 | ; 130 | ;---------------------------------------------------- 131 | ; 132 | ; patch 43 133 | ; 134 | ; 135 | ptch43 lda #0 ; clr nodrv 136 | sta a:nodrv,x 137 | jmp rtch43 138 | ; 139 | ; 140 | ;---------------------------------------------------- 141 | ; 142 | ; patch 44 143 | ; 144 | ; 145 | ptch44 tya ; set/clr nodrv 146 | sta a:nodrv,x 147 | jmp rtch44 148 | ; 149 | ; 150 | ;---------------------------------------------------- 151 | ; 152 | ; patch 51 153 | ; 154 | ptch51 sta wpsw,x ; clr wp switch 155 | sta a:nodrv,x 156 | jmp rtch51 157 | 158 | ; 159 | ;default table for user command 160 | ; 161 | .segment "SFFE6" 162 | .word format 163 | .word trnoff 164 | ublock .word ublkrd 165 | .word ublkwt 166 | .word $0500 ;links to buffer #2 167 | .word $0503 168 | .word $0506 169 | .word $0509 170 | .word $050c 171 | .word $050f 172 | .segment "SFFFA" 173 | .word nnmi 174 | .word dskint 175 | .word sysirq 176 | -------------------------------------------------------------------------------- /verdir.s: -------------------------------------------------------------------------------- 1 | ; validate files with bam 2 | ; create new bam according to 3 | ; contents of files entered in dir 4 | verdir 5 | valdat 6 | ;validate is soft-load 7 | jsr simprs ;extract drive # 8 | jsr initdr 9 | lda #$40 10 | sta wbam 11 | jsr newmpv ;set new bam 12 | lda #0 13 | sta delind 14 | jsr srchst ;search for first file 15 | bne vd25 ;found one 16 | vd10 lda #0 ;set directory sectors... 17 | sta sector ;...in bam 18 | lda dirtrk 19 | sta track 20 | jsr vmkbam 21 | lda #0 22 | sta wbam 23 | jsr scrbam ;write out bams 24 | jmp endcmd 25 | vd15 iny 26 | lda (dirbuf),y 27 | pha ;save track 28 | iny 29 | lda (dirbuf),y 30 | pha ;save sector 31 | ldy #19 ;get ss track 32 | lda (dirbuf),y ;is this relative ? 33 | beq vd17 ;no 34 | sta track ;yes - save track 35 | iny 36 | lda (dirbuf),y ;get ss sector 37 | sta sector 38 | jsr vmkbam ;validate ss by links 39 | vd17 pla 40 | sta sector ;now do data blocks 41 | pla 42 | sta track 43 | jsr vmkbam ;set bit used in bam 44 | vd20 jsr srre ;search for more 45 | beq vd10 ;no more files 46 | vd25 47 | ldy #0 48 | lda (dirbuf),y 49 | bmi vd15 50 | jsr deldir ;not closed delete dir 51 | jmp vd20 52 | ; 53 | vmkbam ;mark bam with file sectors 54 | jsr tschk 55 | jsr wused 56 | jsr opnird 57 | mrk2 lda #0 58 | jsr setpnt 59 | jsr getbyt 60 | sta track 61 | jsr getbyt 62 | sta sector 63 | lda track 64 | bne mrk1 65 | jmp frechn 66 | mrk1 jsr wused 67 | jsr nxtbuf 68 | jmp mrk2 69 | ; 70 | --------------------------------------------------------------------------------