From b4a0031f9d406386b5f38e54b595e364479b43d2 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 29 May 2021 20:54:07 -0400 Subject: [PATCH] Modified NSC driver for use with Ultrawarp --- No_Slot_Clock/README.md | 40 ++ No_Slot_Clock/build_nsc | 5 + nsc.s => No_Slot_Clock/nsc.s | 20 +- No_Slot_Clock/nsc_ultrawarp.po | Bin 0 -> 143360 bytes No_Slot_Clock/nsc_ultrawarp.s | 790 +++++++++++++++++++++++++++++++++ sortdir.po | Bin 143360 -> 143360 bytes 6 files changed, 846 insertions(+), 9 deletions(-) create mode 100644 No_Slot_Clock/README.md create mode 100755 No_Slot_Clock/build_nsc rename nsc.s => No_Slot_Clock/nsc.s (98%) create mode 100644 No_Slot_Clock/nsc_ultrawarp.po create mode 100644 No_Slot_Clock/nsc_ultrawarp.s diff --git a/No_Slot_Clock/README.md b/No_Slot_Clock/README.md new file mode 100644 index 0000000..0d5d1aa --- /dev/null +++ b/No_Slot_Clock/README.md @@ -0,0 +1,40 @@ +#`NS.CLOCK.SYSTEM` +##No Slot Clock Driver for ProDOS + +`nsc.s` is the original No Slot Clock driver written by SMT, which has been +disassembled and commented by Github user mgcaret. I took it from [here] +(https://gist.github.com/mgcaret/ae2860c754fd029d2640107c4fe0bffd). + +The RM Ultrawarp Apple II accelerator card has some sort of bug in the +banking of ROMs. As a result of this problem, the original `NS.CLOCK.SYSTEM` +does not work on a system with Ultrawarp, unless the accelerator card is +completely disabled. The symptom is that the NSC is detected and the ProDOS +driver is installed, but the time returned is all zeroes. It does not appear +to be a problem related to the 13MHz clock speed of the Ultrawarp accelerator +because it also manifests if the Ultrawarp is active but with 1MHz clock. + +`nsc_ultrawarp.s` is a modified version of nsc.s which includes a workaround +for this problem. It has the following differences compared to `nsc.s`: + + - The original code searches for an NSC installed under peripheral card + ROMs in each of the Apple II slots, and only then searches for a NSC + installed in the normal place, which is underneath the CE or CX ROM on + an Apple //e, or the Monitor ROM on an original Apple II or plus. I + removed the search through the slots, and now only look for an NSC + installed under the CE/CX ROM or Monitor ROM. + - In the original code, the driver code itself is modified in place to + work with the NSC in the location where it was detected. This is no + longer required, so I removed the self-modifying code. This makes the + code easier to read, and also makes the clock driver a few bytes shorter, + which is critical, as there was no space to add any additional code. + - Added an additional instruction `LDA $C00B` at the beginning of the clock + driver. This causes the driver to work properly with the Ultrawarp + active, either at full speed (13MHz) or 1MHz. The reason adding this one + read fixes the erroneous behaviour is not well understood. It seems that + the additional instruction causes the CE/CX ROM to be banked in. Without + this extra instruction, it seems the ROM was not banked in when running + with the Ultrawarp. This appears to be a hardware bug in the Ultrawarp. + +Bobbi +May 29, 2021 + diff --git a/No_Slot_Clock/build_nsc b/No_Slot_Clock/build_nsc new file mode 100755 index 0000000..9d4d48c --- /dev/null +++ b/No_Slot_Clock/build_nsc @@ -0,0 +1,5 @@ +ca65 nsc_ultrawarp.s +ld65 nsc_ultrawarp.o -t none -o ns.clock.system\#ff0000 +cadius createvolume nsc_ultrawarp.po NSC.UW 140KB +cadius addfile nsc_ultrawarp.po /NSC.UW ns.clock.system\#ff0000 +scp nsc_ultrawarp.po pi@pi-eth:~/virtual-1.po diff --git a/nsc.s b/No_Slot_Clock/nsc.s similarity index 98% rename from nsc.s rename to No_Slot_Clock/nsc.s index 9984fdd..7b3e9ef 100644 --- a/nsc.s +++ b/No_Slot_Clock/nsc.s @@ -565,6 +565,7 @@ MyName: .byte $0F,"NS.CLOCK.SYSTEM" ; overwritten in the usual case ClockDrv: php sei + lda $C00B ; Workaround for Ultrawarp bug lda C8OFF CDRdSwL = * - 2 ; may modify to read INTCXROM state CDRdSwH = * - 1 @@ -597,27 +598,28 @@ CDUnlck = * - 1 ; may be patched to a different bne ubytlp ldx #$08 ; loop counter to read 8 bytes of clock data rbytlp: ldy #$08 ; loop counter to read 8 bits of clock data -rbitlp: lda SLOT3ROM+$04 ; get data bit (NSC clocks reads off of A2) +rbitlp: pha + lda SLOT3ROM+$04 ; get data bit (NSC clocks reads off of A2) CDRdClk = * - 1 ; may be patched for different loc ror a ; put into carry - ror INBUF-1,x ; and then rotate into relative input buffer loc + pla + ror a ; then rotate into relative i/p buffer loc dey bne rbitlp ; next bit - lda INBUF-1,x ; now BCD->Binary + pha ; now BCD->Binary lsr a lsr a lsr a lsr a tay - beq notens ; no tens digit - lda INBUF-1,x + pla and #$0F clc ; repeated addition for tens -: adc #$0A - dey +: dey + bmi notens ; no tens digit + adc #$0A bne :- - sta INBUF-1,X ; update value to binary equiv -notens: dex +notens: sta INBUF-1,X ; update value to binary equiv bne rbytlp ; next byte ; put values into ProDOS time locations lda INBUF+4 diff --git a/No_Slot_Clock/nsc_ultrawarp.po b/No_Slot_Clock/nsc_ultrawarp.po new file mode 100644 index 0000000000000000000000000000000000000000..2dc3b66782a4a26d2499c43e1c2b6fd5d1e63506 GIT binary patch literal 143360 zcmeI$eQXxq9%diMD(C6Dh=GQM#Gks6>;AWGop^Zcla!AU+IxsrR>)#{r0O*S;c21V8KMVzyv=8TEu>)%)b&aI8 zc3vUTf<%ep?YE}?fu8cN=X$LC+$rgZ3CF}-ttET(+cuRN)5Q(8yXjUOz? z$E8YZrK8f3_1NL@p+Z96>{oj2d)=+~Dm&Y!o~*9QdMmvt_vzkt`GBPF49nk?tc%)n z$z8s+?WcEDC&Ip=>Y|_^aF>8bEN$=IvSH8X?>aW#_R&>h(An0B6Rk}yQ7^)-joW)S zY>DsK(zBuW3%$FyJyB~A9`RR?a4yTwUKIZf+;_D?_}~k;h4;blBt5)m0v=I!&)TNp z2Va0+|ARk9_q2zP*ZxplDs6X$;IX z2g+4X+#j%4mziUO?&|7Frd;)n54yWI`mK3Q6ffKH@ZQkLOlsjrdqeN6|9-*fROdWK zK%Mt=>*|8X_^JGtTj|=%YGXlNS&(16Eg!rsCvVFem(w3HTu1uyhA3M%j7haGZ@!d| z3|V!?AJun*PVA~aYOkl|mxHP`H??$Sc5z-iF+F?nnpT>bU$`(mJ$31oAE+Y!vlh)W zmdX#ev^Y!d4>`4#mf=+1uHE_i#H@LCdUoN?wQ`+fpV z6XxOk{-~MCN89WYX_oUr;}$B_?k0Z*4CVU zZg0ry7_yeyzwvZPx9_u6(NpfqNM%$XEj6WHH{D_NX3+G6)xQOsZU(EH?7a3o7&W}_ z<%<8RW&P8kz$s^5toZk=SafDZPCqi}wkO5n3xn?Xa?lw=RXwV`J#*pD(^J~QtX8=) zb4i<-y0M^*9y@#P>|3XPJ!&7b&mC38`ar=Hg}}1CkDm_?DEfdhV);uKQl3w|8?>1! zx@C9Mxkc-$J`&aSXd<00`BM#7{Fh7q?9J$(vQ_UP$5YDM+eA$k`L9j|MdHq%9J@NW z7|gCscoHJ)7Iw9`Bb0r}+#OP%3fZ;to=|p$y+8Biko{0h$k999KdNabugqW5PR-5D z&S|fT0r~g0>{FU{^glZ78Fbq#Wv@%fwVDtvA?~b|n?JC2_C0H^D44a$s47mF-VMain1 + sta SOFTEV+1 + eor #$A5 + sta SOFTEV+2 + lda #$95 ; control code + jsr COUT ; to quit 80-column firmware + ldx #$FF ; reset + txs ; stack pointer + ; get video & keyboard I/O to known state + sta CLR80VID + sta CLRALTCHAR + jsr SETVID + jsr SETKBD + jsr SETNORM + jsr INIT + ; initialize memory map + ldx #$17 ; there are $18 bytes total + lda #$01 ; last byte gets $01 (protect global page) +: sta MEMTABL,x + lda #$00 ; all but first byte get $00 (no protection) + dex + bne :- + lda #$CF ; first byte protect ZP, stack, text page 1 + sta MEMTABL + lda MACHID + and #$88 ; mask in bits indicating machine with lower case + bne :+ ; has lower case, skip over next few instructions + lda #$DF ; mask value + sta CaseCv ; to make print routine convert to upper case +: lda MACHID + and #$01 ; mask in clock bit + beq FindClock ; no clock yet, proceed + jsr HOME + jsr iprint + .byte $8D ; CR + hasc "Previous Clock Installed!" + .byte $87,$8D,$00 ; BELL, CR, done + jmp NextSys +.endproc +; go hunting for clock +.proc FindClock + ldy #$03 ; save old date and time +: lda DATELO,y ; because we are going to overwrite + sta DTSave,y ; during our probes + dey + bpl :- + + jmp InstallDriver +.endproc +.proc NoClock + ldy #$03 ; restore old date/time because +: lda DTSave,y ; we didn't find clock anywhere + sta DATELO,y + dey + bpl :- + jsr HOME + jsr iprint + .byte $8D + hasc "No-Slot Clock Not Found." ; typo in original fixed + .byte $8D, $8D + hasc "Clock Not Installed!" + .byte $87, $8D, $00 + ; launch next .system file + jmp NextSys +.endproc +DTSave: .byte $00,$00,$00,$00 ; Saved ProDOS Date/Time values +; install driver, this does it the right way and looks at the vector +; and puts the driver there +.proc InstallDriver + ; this code corrects reference to DS121x unlock sequence + lda CLKENTRY+1 + sta POINTER + clc + adc #(DSUnlk-ClockDrv) + sta CDULSqL + lda CLKENTRY+2 + sta POINTER+1 + adc #$00 + sta CDULSqH + ; done correcting + lda LCBank1 ; make LC RAM writable + lda LCBank1 + ldy #DrvSize ; copy driver +: lda ClockDrv,y + sta (POINTER),y + dey + bpl :- + lda MACHID ; current MACHID + ora #$01 ; set clock installed bit + sta MACHID ; and put back + lda #$4C ; JMP + sta CLKENTRY ; into clock driver entry point + jsr CLKENTRY ; may as well give it a whirl + bit ROMIn2 ; LC write protect + jsr HOME + jsr iprint + .byte $8d + hasc "No-Slot Clock Installed " + .byte $00 + ; print today's date + lda DATEHI + ror a + pha + lda DATELO + pha + rol a + rol a + rol a + rol a + and #$0F + jsr PrDec + lda #$AF + jsr COUT + pla + and #$1F + jsr PrDec + lda #$AF + jsr COUT + pla + jsr PrDec + jsr CROUT +.endproc +; This starts the process of finding & launching next system file +; unfortunately it also uses block reads and can't be run from an AppleShare +; volume. +.proc NextSys + ; set reset vector to DoQUit + lda #DoQuit + sta SOFTEV+1 + eor #$A5 + sta SOFTEV+2 + lda DEVNUM ; last unit number accessed + sta PL_READ_BLOCK+1 ; put in parameter list + jsr GetBlock ; get first volume directory block + lda BLOCKBUF+$23 ; get entry_length + sta SMENTL ; modify code + lda BLOCKBUF+$24 ; get entries_per_block + sta SMEPB ; modify code + lda #$01 ; + sta ENTNUM ; init current entry number as second (from 0) + lda #<(BLOCKBUF+$2B) ; set pointer to that entry + sta POINTER ; making assumptions as we go + lda #>(BLOCKBUF+$2B) + sta POINTER+1 + ; loop to examine file entries... +FEntLp: ldy #$10 ; offset of file_type + lda (POINTER),y + cmp #$FF ; SYS? + bne NxtEnt ; nope.. + ldy #$00 ; offset of storage_type & name_length + lda (POINTER),y + and #$30 ; mask interesting bits of storage_type + beq NxtEnt ; if not 1-3 (standard file organizations) + lda (POINTER),y ; get storage_type and name_length again + and #$0F ; mask in name_length + sta LENGTH ; save for later + tay ; and use as index for comparison + ; comparison loop + ldx #$06 ; counter for size of ".SYSTEM" +: lda (POINTER),y ; get file name byte + cmp system,x ; compare to ".SYSTEM" + bne NxtEnt ; no match + dey + dex + bpl :- + ; if we got here, have ".SYSTEM" file + ldy MyName ; length of our own file name + cpy LENGTH ; matches? + bne CkExec ; nope, see if we should exec + ; loop to check if this is our own name +: lda (POINTER),y + cmp MyName,y + bne CkExec ; no match, see if we should exec + dey + bne :- + ; if we got here, we have found our own self + sec + ror FdSelf ; flag it + ; go to next entry +NxtEnt: lda POINTER ; low byte of entry pointer + clc ; ready for addition + adc #$27 ; add entry length that is +SMENTL = * - 1 ; self-modifed + sta POINTER ; save it + bcc :+ ; no need to do high byte if no carry + inc POINTER+1 ; only increment if carry +: inc ENTNUM ; next entry number + lda ENTNUM ; and get it + cmp #$0D ; check against number of entries that is +SMEPB = * - 1 ; self-modified + bcc FEntLp ; back to main search if not done with this block + lda BLOCKBUF+$02 ; update PL_BLOCK_READ for next directory block + sta PL_READ_BLOCK+4 + lda BLOCKBUF+$03 + sta PL_READ_BLOCK+5 + ora PL_READ_BLOCK+4 ; see if pointer is $00 + beq NoSys ; error if we hit the end and found nothing.. + jsr GetBlock ; get next volume directory block + lda #$00 + sta ENTNUM ; update current entry number + lda #<(BLOCKBUF+$04) ; and reset pointer + sta POINTER + lda #>(BLOCKBUF+$04) + sta POINTER+1 + jmp FEntLp ; go back to main loop +CkExec: bit FdSelf ; did we find our own name yet? + bpl NxtEnt ; nope... go to next entry + ldx PATHBUF ; get length of path in path buffer + beq CpyNam ; skip looking for / if zero +: dex ; + beq CpyNam ; done if zero + lda PATHBUF,x ; + eor #$2F ; is '/'? + asl a ; in roundabout way + bne :- ; no slash + ; copy file name onto path, x already has position +CpyNam: ldy #$00 +: iny ; next source byte offset + inx ; next dest byte offset + lda (POINTER),y ; get filename char + sta PATHBUF,x ; put in path + cpy LENGTH ; copied all the chars? + bcc :- ; nope + stx PATHBUF ; update length of path + jmp LaunchSys ; try to launch it! +NoSys: jsr iprint + .byte $8D, $8D, $8D + hasc "* Unable to find next '.SYSTEM' file *" + .byte $8D, $00 + ; wait for keyboard then quit to ProDOS + bit KBDSTR +: lda KBD + bpl :- + bit KBDSTR + jmp DoQuit +.endproc +; ---------------------------------------------------------------------------- +; inline print routine +; print chars after JSR until $00 encountered +; converts case via CaseCv ($FF = no conversion, $DF = to upper) +.proc iprint + pla + sta POINTER + pla + sta POINTER+1 + bne next +: cmp #$E1 + bcc noconv + and CaseCv +noconv: jsr COUT +next: inc POINTER + bne nohi + inc POINTER+1 +nohi: ldy #$00 + lda (POINTER),y + bne :- + lda POINTER+1 + pha + lda POINTER + pha + rts +.endproc +; ---------------------------------------------------------------------------- +; print one or two decimal digits +.proc PrDec + ldx #$B0 ; tens digit + cmp #$0A + bcc onedig +: sbc #$0A ; repeated subtraction, carry is already set + inx + cmp #$0A ; less than 10 yet? + bcs :- ; nope +onedig: pha + cpx #$B0 + beq nozero ; skip printing leading zero + txa + jsr COUT +nozero: pla + ora #$B0 + jsr COUT + rts +.endproc +CaseCv: .byte $FF ; default case conversion byte = none +; ---------------------------------------------------------------------------- +.proc DoQuit + jsr PRODOS + .byte $65 ; MLI QUIT + .word PL_QUIT + brk ; crash into monitor if QUIT fails + rts ; (!) if that doesn't work, go back to caller +PL_QUIT: + .byte $04 ; param count + .byte $00 ; quit type - $00 is only type + .word $0000 ; reserved + .byte $00 ; reserved + .word $0000 ; reserved +.endproc +.proc GetBlock + jsr PRODOS + .byte $80 ; READ_BLOCK + .word PL_READ_BLOCK + bcs LaunchFail + rts +.endproc +PL_READ_BLOCK: + .byte $03 + .byte $60 ; unit number + .word BLOCKBUF + .word $0002 ; first volume directory block +; ---------------------------------------------------------------------------- +; launch next .SYSTEM file +.proc LaunchSys + jsr PRODOS + .byte $C8 ; OPEN + .word PL_OPEN + bcs LaunchFail + lda PL_OPEN+$05 ; copy ref number + sta PL_READ+$01 ; into READ parameter list + jsr PRODOS + .byte $CA ; READ + .word PL_READ + bcs LaunchFail + ; bug the first: Close should be done every time the OPEN call is successful + ; but only done when the READ succeeds + ; bug the second: Others may not consider this a bug, but we close all open + ; files, even if we didn't open them. That's not very polite. + jsr PRODOS + .byte $CC ; CLOSE + .word PL_CLOSE + bcs LaunchFail + jmp SYSEXEC +.endproc +; ---------------------------------------------------------------------------- +; failed to launch next .SYSTEM file +.proc LaunchFail + pha + jsr iprint + .byte $8D, $8D, $8D + hasc "** Disk Error $" + .byte $00 + pla + jsr PRBYTE + jsr iprint + hasc " **" + .byte $8D, $00 + ; wait for keyboard, then quit to ProDOS + bit KBDSTR +: lda KBD + bpl :- + bit KBDSTR + jmp DoQuit +.endproc +; ---------------------------------------------------------------------------- +PL_OPEN: + .byte $03 + .word PATHBUF + .word BLOCKBUF + .byte $01 ; ref num (default 1 wtf?) +PL_READ: + .byte $04 + .byte $01 ; ref num + .word SYSEXEC ; data buffer + .word $FFFF ; request count + .word $0000 ; transfer count +PL_CLOSE: + .byte $01 + .byte $00 ; ref num $00 = all files +; ---------------------------------------------------------------------------- +FdSelf: .byte $00 ; bit 7 set if we found our name in volume dir +system: .byte ".SYSTEM" +MyName: .byte $0F,"NS.CLOCK.SYSTEM" ; overwritten in the usual case +; actual clock driver follows +ClockDrv: + php + sei + lda $C00B ; Workaround for Ultrawarp bug - Bobbi + lda $CFFF + pha + sta $C300 + lda $C304 + ldx #$08 +ubytlp: lda DSUnlk,X +CDULSqL = * - 2 ; to be patched later when relocated into ProDOS +CDULSqH = * - 1 + sec ; bit 7 of a is going to be set + ror a ; first bit in byte of unlock seq in carry & b7 = 1 +ubitlp: pha ; remaining bits are in a, so save it + lda #$00 + rol a ; move unlock bit into low bit + tay ; put into y + lda $C300,Y ; NSC looks for unlock on A0 line + pla ; restore unlock seq in progress + lsr a ; next bit into cary + bne ubitlp ; do again until that 1 bit we set above rolls off + dex ; next byte of unlock sequence + bne ubytlp + ldx #$08 ; loop counter to read 8 bytes of clock data +rbytlp: ldy #$08 ; loop counter to read 8 bits of clock data +rbitlp: lda $C304 ; get data bit (NSC clocks reads off of A2) + ror a ; put into carry + ror INBUF-1,x ; and then rotate into relative input buffer loc + dey + bne rbitlp ; next bit + lda INBUF-1,x ; now BCD->Binary + lsr a + lsr a + lsr a + lsr a + tay + beq notens ; no tens digit + lda INBUF-1,x + and #$0F + clc ; repeated addition for tens +: adc #$0A + dey + bne :- + sta INBUF-1,X ; update value to binary equiv +notens: dex + bne rbytlp ; next byte + ; put values into ProDOS time locations + lda INBUF+4 + sta TIMEHI + lda INBUF+5 + sta TIMELO + lda INBUF+1 + asl a + asl a + asl a + asl a + asl a + ora INBUF+2 + sta DATELO + lda INBUF + rol a + sta DATEHI + pla + ;;bmi :+ + ;;sta INTCXROMOFF +: plp + rts +; Dallas unlock sequence +DSUnlk = * - 1 + .byte $5C, $A3, $3A, $C5, $5C, $A3, $3A, $C5 +DrvSize = * - ClockDrv +.assert DrvSize < CLKCODEMAX, error, "NS CLOCK driver too big" + +; ---------------------------------------------------------------------------- +; the rest of this looks like junk that was accidentally saved with the file +; there are no references from the previous code. Didn't feel like disassembling. + +.if IncludeJunk + .setcpu "6502" + +BASWARM := $D43F ; warm start BASIC +FNDLIN := $D61A ; BASIC search for line +SETPTRS := $D665 +L008D := $008D +L0EA1 := $0EA1 +L161F := $161F +L2020 := $2020 +L434F := $434F +L522F := $522F +L9A17 := $9A17 +LAC08 := $AC08 +LAC0D := $AC0D +LAC1F := $AC1F +LAC6B := $AC6B +LAD50 := $AD50 +LAFD3 := $AFD3 +LAFD7 := $AFD7 +LB1D3 := $B1D3 +LB531 := $B531 +LBE70 := $BE70 +LFFFF := $FFFF + + .byte $00 + stz $F5,x ; 147C 74 F5 t. + .byte $D3 ; 147E D3 . + adc $8DB3 ; 147F 6D B3 8D m.. + lsr $BE,x ; 1482 56 BE V. + jmp L2020 ; 1484 4C 20 20 L +; ---------------------------------------------------------------------------- + bbr2 $43,L14DE ; 1487 2F 43 54 /CT + rol $2031 ; 148A 2E 31 20 .1 + sta $AE00 ; 148D 8D 00 AE ... + lda $CABB,x ; 1490 BD BB CA ... + stx $74 ; 1493 86 74 .t + jsr LAC0D ; 1495 20 0D AC .. + ldx $20A9 ; 1498 AE A9 20 .. + bbr2 $48,L14DF ; 149B 2F 48 41 /HA + eor ($44) ; 149E 52 44 RD + and ($20),y ; 14A0 31 20 1 + sta $A400 ; 14A2 8D 00 A4 ... + lda #$00 ; 14A5 A9 00 .. + beq L14BE ; 14A7 F0 15 .. + lda #$00 ; 14A9 A9 00 .. + sta $BE44 ; 14AB 8D 44 BE .D. + jsr L522F ; 14AE 20 2F 52 /R + eor ($4D,x) ; 14B1 41 4D AM + jsr L008D ; 14B3 20 8D 00 .. + jsr LAC08 ; 14B6 20 08 AC .. + bcs L150B ; 14B9 B0 50 .P + jsr SETPTRS ; 14BB 20 65 D6 e. +L14BE: sta $D8 ; 14BE 85 D8 .. + jsr L0EA1 ; 14C0 20 A1 0E .. + bbr2 $4E,L1515 ; 14C3 2F 4E 4F /NO + rol $4C53 ; 14C6 2E 53 4C .SL + bbr4 $54,L14FA ; 14C9 4F 54 2E OT. + .byte $43 ; 14CC 43 C + jmp L434F ; 14CD 4C 4F 43 LOC + +; ---------------------------------------------------------------------------- + .byte $4B ; 14D0 4B K + jsr L008D ; 14D1 20 8D 00 .. + lda #$FF ; 14D4 A9 FF .. + jsr L522F ; 14D6 20 2F 52 /R + eor ($4D,x) ; 14D9 41 4D AM + jsr L008D ; 14DB 20 8D 00 .. +L14DE: .byte $76 ; 14DE 76 v +L14DF: bbs1 $4C,L1525 ; 14DF 9F 4C 43 .LC + tay ; 14E2 A8 . + jsr LAC08 ; 14E3 20 08 AC .. + bcs L150B ; 14E6 B0 23 .# + jsr SETPTRS ; 14E8 20 65 D6 e. + jsr L9A17 ; 14EB 20 17 9A .. + lda #$00 ; 14EE A9 00 .. + sta $24 ; 14F0 85 24 .$ + jmp BASWARM ; 14F2 4C 3F D4 L?. + +; ---------------------------------------------------------------------------- + jsr LB531 ; 14F5 20 31 B5 1. + bcs L150B ; 14F8 B0 11 .. +L14FA: jsr LAC1F ; 14FA 20 1F AC .. + bcs L150B ; 14FD B0 0C .. + sty $6B ; 14FF 84 6B .k + sty $69 ; 1501 84 69 .i + sty $6D ; 1503 84 6D .m + stx $6C ; 1505 86 6C .l + stx $6A ; 1507 86 6A .j + stx $6E ; 1509 86 6E .n +L150B: rts ; 150B 60 ` + +; ---------------------------------------------------------------------------- + lda #$01 ; 150C A9 01 .. + ldx #$FC ; 150E A2 FC .. + jsr LB1D3 ; 1510 20 D3 B1 .. + bcs L150B ; 1513 B0 F6 .. +L1515: lda #$D1 ; 1515 A9 D1 .. + jsr LBE70 ; 1517 20 70 BE p. + bcs L150B ; 151A B0 EF .. + lda $67 ; 151C A5 67 .g + sta $BED7 ; 151E 8D D7 BE ... + adc $BEC8 ; 1521 6D C8 BE m.. + .byte $8D ; 1524 8D . +L1525: cli ; 1525 58 X + ldx $68A5,y ; 1526 BE A5 68 ..h + sta $BED8 ; 1529 8D D8 BE ... + adc $BEC9 ; 152C 6D C9 BE m.. + sta $BE59 ; 152F 8D 59 BE .Y. + bcs L1536 ; 1532 B0 02 .. + cmp $74 ; 1534 C5 74 .t +L1536: lda #$0E ; 1536 A9 0E .. + bcs L150B ; 1538 B0 D1 .. + ldx $BEC8 ; 153A AE C8 BE ... + ldy $BEC9 ; 153D AC C9 BE ... + jsr LAFD7 ; 1540 20 D7 AF .. + bcs L150B ; 1543 B0 C6 .. + jsr LAFD3 ; 1545 20 D3 AF .. + bcs L150B ; 1548 B0 C1 .. + jsr LAC6B ; 154A 20 6B AC k. + ldx $BE59 ; 154D AE 59 BE .Y. + ldy $BE58 ; 1550 AC 58 BE .X. + stx $B0 ; 1553 86 B0 .. + sty $AF ; 1555 84 AF .. + rts ; 1557 60 ` + +; ---------------------------------------------------------------------------- + sec ; 1558 38 8 + lda $67 ; 1559 A5 67 .g + sbc $BEB9 ; 155B ED B9 BE ... + sta $3C ; 155E 85 3C .< + lda $68 ; 1560 A5 68 .h + sbc $BEBA ; 1562 ED BA BE ... + sta $3D ; 1565 85 3D .= + ora $3C ; 1567 05 3C .< + clc ; 1569 18 . + beq L15B1 ; 156A F0 45 .E + ldx $67 ; 156C A6 67 .g + lda $68 ; 156E A5 68 .h +L1570: stx $3A ; 1570 86 3A .: + sta $3B ; 1572 85 3B .; + ldy #$01 ; 1574 A0 01 .. + lda ($3A),y ; 1576 B1 3A .: + dey ; 1578 88 . + ora ($3A),y ; 1579 11 3A .: + beq L15B1 ; 157B F0 34 .4 + lda ($3A),y ; 157D B1 3A .: + adc $3C ; 157F 65 3C e< + tax ; 1581 AA . + sta ($3A),y ; 1582 91 3A .: + iny ; 1584 C8 . + lda ($3A),y ; 1585 B1 3A .: + adc $3D ; 1587 65 3D e= + sta ($3A),y ; 1589 91 3A .: + clc ; 158B 18 . + bcc L1570 ; 158C 90 E2 .. + lda $BE57 ; 158E AD 57 BE .W. + and #$08 ; 1591 29 08 ). + clc ; 1593 18 . + beq L15B1 ; 1594 F0 1B .. + lda $BE68 ; 1596 AD 68 BE .h. + sta $50 ; 1599 85 50 .P + lda $BE69 ; 159B AD 69 BE .i. + sta $51 ; 159E 85 51 .Q + jsr FNDLIN ; 15A0 20 1A D6 .. + clc ; 15A3 18 . + lda $9B ; 15A4 A5 9B .. + adc #$FF ; 15A6 69 FF i. + sta $B8 ; 15A8 85 B8 .. + lda $9C ; 15AA A5 9C .. + adc #$FF ; 15AC 69 FF i. + sta $B9 ; 15AE 85 B9 .. + clc ; 15B0 18 . +L15B1: rts ; 15B1 60 ` + +; ---------------------------------------------------------------------------- + bcc L15D6 ; 15B2 90 22 ." + lda #$FC ; 15B4 A9 FC .. + sta $BE6A ; 15B6 8D 6A BE .j. + sta $BEB8 ; 15B9 8D B8 BE ... + lda #$C3 ; 15BC A9 C3 .. + sta $BEB7 ; 15BE 8D B7 BE ... + lda $67 ; 15C1 A5 67 .g + sta $BEA5 ; 15C3 8D A5 BE ... + sta $BEB9 ; 15C6 8D B9 BE ... + lda $68 ; 15C9 A5 68 .h + sta $BEA6 ; 15CB 8D A6 BE ... + sta $BEBA ; 15CE 8D BA BE ... + jsr LAD50 ; 15D1 20 50 AD P. + bcs L161F ; 15D4 B0 49 .I +L15D6: lda #$02 ; 15D6 A9 02 .. + ldx #$FC ; 15D8 A2 FC .. + jsr LB1D3 ; 15DA 20 D3 B1 .. + bcs L161F ; 15DD B0 40 .@ + lda $AF ; 15DF A5 AF .. + sec ; 15E1 38 8 + sbc $67 ; 15E2 E5 67 .g + tax ; 15E4 AA . + sta $BEC8 ; 15E5 8D C8 BE ... + lda $B0 ; 15E8 A5 B0 .. + sbc $68 ; 15EA E5 68 .h + tay ; 15EC A8 . + sta $BEC9 ; 15ED 8D C9 BE ... + lda #$00 ; 15F0 A9 00 .. + sta $BECA ; 15F2 8D CA BE ... + lda $67 ; 15F5 A5 67 .g + sta $BED7 ; 15F7 8D D7 BE ... + lda $68 ; 15FA A5 68 .h + sta $BED8 ; 15FC 8D D8 BE ... + .byte $20 ; 15FF 20 +.endif diff --git a/sortdir.po b/sortdir.po index e4d947a5c255ab1e2e0abd3b13498bc8f35e298a..91441b4bc80022b01fcc60d195bd31a11018ef92 100644 GIT binary patch delta 24311 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 RZTDU7aPln2zAR_Y{{tI{p*;Wq delta 30146 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 G$o~aBoEUTf