From 695afe66cc889ea1deab5395f927187e23502e30 Mon Sep 17 00:00:00 2001 From: Egan Ford Date: Sat, 22 Apr 2017 20:13:22 -0600 Subject: [PATCH] animated loading bar -b option --- Makefile | 24 +++++- README.md | 5 +- asm/bar.s | 167 +++++++++++++++++++++++++++++++++++++++ bin/c2d | Bin 156936 -> 156984 bytes bin/c2d.exe | Bin 185082 -> 185100 bytes bin/page2text.exe | Bin 28529 -> 28529 bytes bin/text2page.exe | Bin 28370 -> 28370 bytes c2d.c | 51 ++++++++---- c2d.h | 194 +++++++++++++++++++++++++++++++++++++++++++++- c2d.h.0 | 3 +- makeheader | 1 + 11 files changed, 427 insertions(+), 18 deletions(-) create mode 100644 asm/bar.s diff --git a/Makefile b/Makefile index 9fa6203..73e6c67 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ windows: bin/c2d.exe bin/text2page.exe bin/page2text.exe dist: all windows -c2d.h: c2d.h.0 asm/loader.s makeheader +c2d.h: c2d.h.0 asm/loader.s asm/bar.s makeheader ./makeheader bin/c2d: c2d.c c2d.h holes.h @@ -42,6 +42,28 @@ gameserverclient.text: Makefile text="CASSETTE PORT FTW! ---- ASCIIEXPRESS.NET"; printf "%*s\n" $$((($${#text}+40)/2)) "$$text"; \ ) | tail -24 >$@ +barloader.text: Makefile + ( \ + echo; \ + figlet -c -w 40 -f poison "c2d"; \ + echo; \ + text="C2D (CODE TO DISK) BUILT-IN LOADER"; printf "%*s\n" $$((($${#text}+40)/2)) "$$text"; \ + echo; \ + text="LOADING GAME SERVER CLIENT ..."; printf "%*s\n" $$((($${#text}+40)/2)) "$$text"; \ + echo; \ + text="________________________________________"; printf "%*s\n" $$((($${#text}+40)/2)) "$$text"; \ + text="________________________________________"; printf "%*s\n" $$((($${#text}+40)/2)) "$$text"; \ + echo; \ + echo; \ + text="HTTPS://GITHUB.COM/DATAJERK/C2D/"; printf "%*s\n" $$((($${#text}+40)/2)) "$$text"; \ + ) | tail -24 >$@ + +barloader.textpage: barloader.text bin/text2page + bin/text2page <$< >$@ + +gameserverclientbar.dsk: barloader.textpage gameserverclient bin/c2d + bin/c2d -b -t $< gameserverclient,800 $@ + fulltest: gameserverclient gameserverclient.mon gameserverclient.text dist EMU=1 WIN=1 ./test.sh diff --git a/README.md b/README.md index 8c27036..0393ffa 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Windows/MinGW: ``` usage: c2d [-vh?] - c2d [-mu] [-t filename] [-s start address override] input[.mon],[load_address] output.dsk + c2d [-bum] [-t filename] [-s start address override] input[.mon],[load_address] output.dsk -h|? this help -m jump to monitor after booting @@ -59,6 +59,7 @@ usage: c2d [-vh?] -t filename, where filename is a 1K $400-$7FF text page splash screen The splash screen will display while the binary is loading -u do not patch screen holes + -b animated loading bar (experimental) -v print version number and exit Input without a .mon extension is assumed to be a binary with a 4 byte header. @@ -104,7 +105,7 @@ Yes. No input checking. Big Endian untested. ### The Ugly Stuff -c2d, Code to Disk, Version 0.53 +c2d, Code to Disk, Version 0.54 (c) 2012,2017 All Rights Reserved, Egan Ford (egan@sense.net) diff --git a/asm/bar.s b/asm/bar.s new file mode 100644 index 0000000..fde56c7 --- /dev/null +++ b/asm/bar.s @@ -0,0 +1,167 @@ +;bar.s +; +; moves itself to another page memory, +; then reads binary from disk using params at end, +; then jumps to binary +; + +; apple params/vectors + +warm = $FF69 ; back to monitor +bell = $FBDD ; ding +preg = $48 ; mon p reg +ch = $24 ; cursor horizontal +movecur = $FB5B ; move cursor to ch,a +cout = $FDED ; character out sub + +; dos params/vectors + +rwtsprm = $B7E8 ; looked at dos 3.3 disk, not using $3E3 to find +rwts = $B7B5 ; rwts jsr + +; vars + +stage1 = $800 +stage2 = $300 ; $300 looks open +invsp = $20 ; inverse space for draw +;;;run time +trkcnt = $00 ; track counter +segcnt = $01 ; loop var +buffer = $02 ; MSB of RWTS buffer +secnum = $03 ; loop var +trknum = $04 ; loop var +barcnt = $05 ; bar counter +barptr = $06 ; bar pointer + + + .org stage1 +init: + lda #0 ; reset pointer and counter + sta barcnt + sta barptr + + lda #1 ; read(1)/write(2) command + ldy #$0C ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + + lda #0 ; buffer LSB + ldy #8 ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + + lda #2 + sta trknum ; start with track 2 + +start: + ldx #0 ; move code to stage2 +move: + lda moved,x + sta loader,x + inx + cpx #$D0 + bne move ; move 208 bytes + jmp loader + +moved: + .org stage2 + +loader: + lda loadpage ; where to dump the tracks + sta buffer + + ldx lasttrack + dex ; because data starts at track 2 + dex + stx trkcnt ; number of complete and partial tracks + +;;;begin track loop +trkloop: + lda trknum ; track number + ldy #4 ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + +;;;begin sector loop (16), backwards is faster, much faster + lda trkcnt ; check if last track + bne fulltrack ; if not then full track + lda lastsector ; if so, get last sector number + bpl subtrack +fulltrack: + lda #$F +subtrack: + sta secnum +secloop: + lda secnum ; sector number + ldy #5 ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + + lda buffer ; buffer MSB + clc + adc secnum ; compute page load address + ldy #9 ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + + ldy #rwtsprm + jsr rwts ; do it! + bcs diskerror + lda #0 + sta preg ; fix p reg so mon is happy + +;;;draw code + inc barcnt ; sectors read + ldx barptr ; get current pointer value + lda bar,x + cmp barcnt ; is bar,x = barcnt? + bne nodraw ; if bar,x = barcnt draw bar + lda barptr ; get position + ;clc + ;adc #5 ; intend + sta ch + lda #19 ; row 19 + jsr movecur + lda #invsp + jsr cout + inc barptr ; move pointer to next bar position +nodraw: +;;;end draw code + + dec secnum + bpl secloop +;;;end sector loop + + lda buffer ; buffer += $10 + clc + adc #$10 + sta buffer + + inc trknum ; next track + dec trkcnt ; + bpl trkloop ; 0, all done with tracks +;;;end track loop + +done: + jmp (nextjump) ; down with load, run it + +diskerror: + jmp warm + +lasttrack: + .org *+1 +lastsector: + .org *+1 +loadpage: + .org *+1 +nextjump: + .org *+2 +bar: + .org *+40 +;;; used for debug +;trkcnt: +; .org *+1 +;segcnt: +; .org *+1 +;buffer: +; .org *+1 +;secnum: +; .org *+1 +;trknum: +; .org *+1 diff --git a/bin/c2d b/bin/c2d index 351713089b620f65b343a773976e1e289f5d832f..8e9a04b0e4e9e6a62843e691a0fd0cb4050b6218 100755 GIT binary patch delta 4710 zcmcIoeN=T811#xJ${?C-hvMmVSb=#RbU z-1m8(@8@}+=Xozf@Oa{ZejIjh-@I)-nohh*<>cq%so!I@{=ef!}?)H@C zF*@TRoz9w-ja*6U1%tZNpk5fGe8BxOWm|?W{7r&R-=^g9B`M9f>r~s2iN`_RV^Ad{ zj6M6>c^{XwvXIxrB9Io8xd~&H9^S0fmV16jb zo*$82gFGL`I~VUAJ}fvNtSs6)7>m&fYRE@GaJ>Jzg)v7PQBb9}`?M;lrDzXn<6Be# zr#!G^siWMn)bX&Rq60^phU1jNMYj?N2~Q1EFD{Izv5}0Oe+y2gYfij_$RA=A!^BV+ zR5SXJ?!OeALsZ+s%TlOV<>A>VC!{RVdm!bIJ7J;#f=>C&omRQquW}%mKtM~0o69gl zZSc#~Al5ly^I7a!Y2g==Tw{0HT%j7_68W6ulFv%vCOh>E;rX-Wx6Y?EJH%G!U2JNB zH^UJ$7fAkNoJ+napI7T)Oq#4daa!^pk4f$hP?blM@~nH&WYBRHv2X)V#8;9s9{%Sr zq6tLFeL3i|S4#59zTMK5lM;7Qn*6o6scD#)c}T1(UTpp_F@ap9Bxl?^ZWu9PNVobX z-4mk!SHr|cknYmtj3rsah?XJU=(Mjo zK*f;4>+H*n%62-<%b0qQf{>3%p>_6rHFyn;5r{}~hj${{sScNqBzLJYWC9Vf=>;18 za8bENKCRXpWS@2?Kp(sWcu}*#kOIC4N+~uSL?fUv)~Aqe(n4zDP`M^MU)!TWCHZ6Z z5`vY&PWxk$d|E;Y42S2VBsC}<%x zdLZHuoyYuB?Myy;U{wqOIFFVFsP${8O)o3t@@s>Fxrk8f@1o6kVka%h3gXwB7I`{Q8Io6 zI(@Y5WJqvv-)9QMl|20dIrg~U$f}^I`EzHC8yliDU5}- zt9`)Y3>Kwg8x)erTu3+wWd!lQb})2AQ#7L(RZ#x}s@R%zC>3_ZR$+fC^Fe2UJ>L~_ z2?NkxN7~xSnun=Pq?QTSki=6={XzhywVBv7miBVHR>LD~60W-NGzqpbz#WRRPeOb3MS?jVXW^yaUa8jj(Ulo3$#e{ylPK8D?L-nqMmLoiibIR+K zywn0;7fIS6QiX5}Bh)X`AmWd3V$;8AV&KwNcv+hnwTzVggE8+^F-H@Qy5wun&4n&$ znn-gX=KU+Wr<^V=e+L&Vjo~h{FPS>hyJc!p<2&a!^%*8>UK&gpbt@x2@XPDFtONN@)dQjSrOCHeW&nEb;*6uacIX)^;!hQXy(;e z%n5VOQn_CW)!3!zAHSsooYq>x8{ZanG6`NBhz$+V5k@}4(|(@=|GC&xQrF?zzs^3L zHBJEQB3PK%a8WY#s`96_OdpuHF)`4q-44RcpD}i@5hv$pqZN{SNmB0m=C$SGMfCI? z9n{lXF#N7?Q99bCG`xZEcdozY;^(7IG>1 z+d0X9HNUYJ{h5gmwAM`?gBVQe?vIh? zA&AqVZl+3UbLLy5-M_+NaKYFK2BoPpr+|lMv{Dk>DV&~`Mk=L|q^oVx)wV(nN7${a znMmyx9G)wi{!*xdO#4*}tZy4~+e07hkT7eM4?)r2ot?ra6xs!$*C5m>tOW+p0AK{O zTUSYkwV}JVMWgAL%NFS2a(ObBu~}lPUdo#;mroG49-td)(TA>6NBeO5!0Bp)9KH8) zEY|6?FJtKX=)36b12D;=yJ&}IVbND;2T2xvo_4Upq9NMhf@0B)v_mQ^`ULH8%dluI z?J!#`>ZTngoJAL7hrwNHLv6+*fAsn`tcc=HI!*NYj%fM~3T`10zlQ7ROZ|ikS(HM! zs9j5Y0Sz>b>p!%$6)Vkqb~-kW`LR49Q7O!LJ@p#4TY)KylmTD`(nRatM#_pEu$Q@^U#v)Wr(GhyGgv7hn$rKs}p?dvCQ_!1f7 z`R-RDGgB)hTc734RM+Ip%_f~<3!BZnvMFaA=Tmm&lq7aXb;U9GMK{a$t?}zI!T7mo zHDHzj?FO7^z+wZ=FrdqTiwwBTfR7l^Yrype3>uKm5RdYvZLVV%3kZRPU0loP?dtwr zti?ir513zNhx08jF_YTU-QDkErZ?(M0e<&mrsKyqu^r|XGsJeVZsCo`mC3obX?Men z)GO>vINWGDCUjeOBn0fc(rinv@3Psxy3w1^X|i_g;4@cQ1AMQ!lUZM_X)w9yFClvT zgSKY|ZQTAr8~^kqE`R^Vx%}y*7nbn}{J@$0mSy}L&UfDmkJq!t%jPsTRIc!_2Wl%< zt!7JB*420#*s?0-p}KkM-F4L-_9T_U#3CtJ_M~x|S`%kt-DyO1;8$~{F4$O8x%yG& zGqDXbz-gIDixVHN7V1syiKJZOY}oNMnj(kK2_Bjy)QyRlP?oFXIREUc;jhHue~!c7jKlZejQd#I%>>pJhrb_(e;S9Mjl;i+!~5fK zT$0*PCu!aEkP_J0S)rc>q9@lt^^w!Y`)@BH}>iQ8C3 fMeWK8&l-=r(d(&L>7njp6}UC11-E8b^I!fC1T(Sh delta 4240 zcmcIoeNa@_6~FJnlZAi}RFG)+N*4zet!Qc0s<^VW53@0f+Qy2?r((sADx{iH7hG)i zb+bhKCXr;Cj7<|eZK`$Z6wySwfP9opT1?W8sj+_4sc%KA;;3LuUVrDl2kK7xSEq00 z-gD3AJ?GqW?t8n1Wb zV3NOQQdzfFC*+K>k2R?WEUJC1_929OEpqz^%Z8RF=EOB7o5HD~_nm=fzbU-)kNk*Bw`*2uwbDc(O8bq}F#0gek@!T6SPYmy zlJ@QDFfCw{#oQR}lx?#Zh}ITFZgs~qrugQzeM>yBl4 zS(lb8>g}b9KdA%;mAb1oc&hlM3^LH=v{MueaJ~g;d)CDd2vl-{DgO8qu&=29cBjgt$mGg&LZI!-5*bw}~d z)E7aYd<221IKtq3h&j|QY?T8^r+Q^_tlI0*1rQQIK>f%Ki_tHCgd)>FLVGUshf{`F zUe+~5t+c1Qd{xp71;(bi)N6{r-p=O0HzH)@s~vp_a>{(>kekA%&dIDwbalNuQFhc0#aCm`(BHg=+S?sa)b^^WsHFgSirS^0f$7}=x&Afk za)0(gPClofw8$Rb{LlyQSsaYM84Q@oS3BkUOzei5XhbO~{+Pc}0s9KM=-ae*`%s;V z`geT+>G+-YEsA;eMlP)ctprG`trd7QUN z>*Z)g=u-UB>v1q8bm;=LkqrHe=|TcrK%J_ez|ANMfws=kdra=2Y}G0%SAP#QAF6zJ zz#%(3JT<6$wXJ!*0T-NYdAl#6@Tm#p-7jk;@{{h^etCuTm63>i5fuC7*k$%uf35&( zd_1WAavVCR-zjIF_e$@NVr;FP(dP7~AH!0A!qjltZBF$fRO9<%C=uDK;e5ZG8R(Y_ z+sOQKaHqjo>ph#vKLNf|9dN4m zI;Fj^=V~3WIlXheSb8N7<<2Ml1#ZKMBS!U00 z`CQTfw0}n0lwG~xA+;LHxxbPme$4dg#NnkT*RKo5T5aXW*uwCpRQz*W;6C0n`c#rr z&*}Fe6WmGlNtFsO{))uuS4ne@RcgNu1LBh?<+x+A&L}?kgrXbAH_lEPI&=L5v>d24 z!Ks#Mv*R+|CrLCFMh{`PtN<0wPa)$82y#6Y9_^W$b%)=F`fH@^F^npQoKjC08rKNA z)Qd1s0RyD|6sZpwRR>T;g>-Lu+68Z(AvZbgE9XR2y)-AL`cHi-(id=rIdkkY=_>V0 zZ^89^ecq+tj7rgN{lmvD%SQiEf0@lE&DvY9wW?d_9n-UIl+L@zpLz>wVj;xBBHt z?NrZA=zjeZ+#JW~ql7A*6p(SRbOR>T)34qggeTmY)LJ=Y5F5`aw9_ zDNR7R#JbTI(pm_2O3A>-bV_+hDEcrnfC7IV@}1I5P-L&v00d2d()UWc$&gQanZG%y zYL}B+c!?3!4eD`hL0fI0obbfX;8&hh0w($htXg96%S=xMkFF<*M>vfb(8DXF09}lI z0=Jn-JNdJ#p#$G~O_LW)UMx3x(cyO`8Iailnbtw8b6ZT2Yl!eTebRMGFCw)ri0y({ zr{s161>6B(sk~^aybBfnCZ^kMC#RXcycLS*<=RxUmv;d2wi#+=O1)@CL0=&G;(9O7ShHwB4dwU5b5iI+y4>z@Od5BUoCUdHFOe6Ha0_xW7O=S_Ux!so4guHy4^eBRFI=lNX2 z=be~w^8Tc=$em-Uk^TYT9_@a@ui|E~sPt`7QLJkAa~msiw#}~A{xEjwk%+|0Ld4V0 zEXrT@Oo4X$@r;NC`HLI{E0|^xR&FjX zE8kkWxvZR3lvEaP+Q2qaI>K0BG^WGx0$1G{#(Lw4=)hFFfTmpBqqV<`gxtQKVlmlW zn`ZuKOoFzIVx((PMW#8TsF~waQLVh6xZwSF(3Blh8!4HJsheGhCNAVKY@+g6I zhTtEE;Gc%zmqPHXA$a7zo2BC9i6|TX+xv0AaTwz<@XV*HX$%H_*fRWOz)bO&N5uC{ PDHF%FIyn!_Is6 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 delta 4546 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 diff --git a/bin/page2text.exe b/bin/page2text.exe index 77bd009f9ad5d89071a08ffe2d4d7fefa499c5c1..e5c0926bdb13944408f69258edbbfe5a07b13434 100755 GIT binary patch delta 23 fcmex(kMZL@#t9wF>b!p@cKb4iy=B;Vds-d7_U diff --git a/bin/text2page.exe b/bin/text2page.exe index 7b2781d7e009dea5516045b02a691340c849fcde..f53779a63565620dedb2c32949650c2719d3c359 100755 GIT binary patch delta 23 fcmca~m+{hF#t9wF>b!p@cKb4WN-=J{{XG`|fQJff delta 23 fcmca~m+{hF#t9wFt*yT&cKb3fpTw~7_V-)>krWIT diff --git a/c2d.c b/c2d.c index e9a8f60..76e203e 100644 --- a/c2d.c +++ b/c2d.c @@ -1,6 +1,6 @@ /* -c2d, Code to Disk, Version 0.53 +c2d, Code to Disk, Version 0.54 (c) 2012,2017 All Rights Reserved, Egan Ford (egan@sense.net) @@ -43,7 +43,7 @@ Bugs: #include "c2d.h" #include "holes.h" -#define VERSION "Version 0.53" +#define VERSION "Version 0.54" #define INFILE argv[argc-2] #define OUTFILE argv[argc-1] #define BINARY 0 @@ -57,13 +57,13 @@ int main(int argc, char **argv) { FILE *ifp, *ofp; int c, i, j, k, start = 0, loadaddress, inputtype, warm = 0, filesize = 0, unpatch = 0; - int loaderstart, loader = 0, loadersize = 0, textpagesize = 0; + int loaderstart, loader = 0, loadersize = 0, loaderbasesize = 0, textpagesize = 0, bar = 0; struct stat st; char *filetypes[] = { "BINARY", "MONITOR" }; char *ext, filename[256], load_address[10], *textpage = NULL; opterr = 1; - while ((c = getopt(argc, argv, "t:vmh?s:u")) != -1) + while ((c = getopt(argc, argv, "t:vmh?s:ub")) != -1) switch (c) { case 't': // load a splash page while loading binary loader = 1; @@ -83,6 +83,9 @@ int main(int argc, char **argv) case 'u': unpatch = 1; break; + case 'b': + bar = 1; + break; case 'h': // help case '?': usage(); @@ -218,8 +221,7 @@ int main(int argc, char **argv) fclose(ifp); // patch holes - if(!unpatch) - { + if(!unpatch) { uint64_t *p = (uint64_t *)&blank.track[1].sector[0].byte[0]; // set to start of splash page uint64_t *h = (uint64_t *)&holes; // holes are 64-bits int i; @@ -232,13 +234,26 @@ int main(int argc, char **argv) } } - if ((loadersize = sizeof(loadercode)) > 256) { - fprintf(stderr, "Loader code size %d > 256\n\n", loadersize); - return 1; - } + if(!bar) { + loaderbasesize = sizeof(loadercode); + if ((loadersize = sizeof(loadercode)) > 256) { + fprintf(stderr, "Loader code size %d > 256\n\n", loadersize); + return 1; + } - for (i = 0; i < loadersize; i++) - blank.track[1].sector[4].byte[i] = loadercode[i]; + for (i = 0; i < loadersize; i++) + blank.track[1].sector[4].byte[i] = loadercode[i]; + } + else { + loaderbasesize = sizeof(barcode); + if ((loadersize = sizeof(barcode)) > 256) { + fprintf(stderr, "Loader code size %d > 256\n\n", loadersize); + return 1; + } + + for (i = 0; i < loadersize; i++) + blank.track[1].sector[4].byte[i] = barcode[i]; + } // loader args // lasttrack @@ -252,6 +267,16 @@ int main(int argc, char **argv) // program start MSB blank.track[1].sector[4].byte[loadersize + 4] = start >> 8; + //bar code, pre compute status bar table + if(bar) { + int num_sectors = (int) ceil((filesize + (loadaddress & 0xFF)) / 256.0); + int bar_length = 40; + int i; + + for(i = 1; i <= bar_length; i++) + blank.track[1].sector[4].byte[loadersize + 4 + i] = i * num_sectors / bar_length; + } + loaderstart = 0x400; // temp hack to effect the sound of the drive, i.e. to make consistent @@ -278,7 +303,7 @@ int main(int argc, char **argv) fprintf(stderr, "After boot, jump to: $%04X\n", loaderstart); fprintf(stderr, "\n"); - fprintf(stderr, "Writing %s to T:02/S:00 - T:%02d/S:%02d on %s\n\n", filename, blank.track[1].sector[4].byte[sizeof(loadercode)], blank.track[1].sector[4].byte[sizeof(loadercode) + 1], OUTFILE); + fprintf(stderr, "Writing %s to T:02/S:00 - T:%02d/S:%02d on %s\n\n", filename, blank.track[1].sector[4].byte[sizeof(loadercode)], blank.track[1].sector[4].byte[loaderbasesize + 1], OUTFILE); } if ((ofp = fopen(OUTFILE, "wb")) == NULL) { diff --git a/c2d.h b/c2d.h index 631728c..93cb1a4 100644 --- a/c2d.h +++ b/c2d.h @@ -13,7 +13,7 @@ typedef struct d { const char *usagetext="\n\ usage: c2d [-vh?]\n\ - c2d [-mu] [-t filename] [-s start address override] input[.mon],[load_address] output.dsk\n\ + c2d [-bum] [-t filename] [-s start address override] input[.mon],[load_address] output.dsk\n\ \n\ -h|? this help\n\ -m jump to monitor after booting\n\ @@ -21,6 +21,7 @@ usage: c2d [-vh?]\n\ -t filename, where filename is a 1K $400-$7FF text page splash screen\n\ The splash screen will display while the binary is loading\n\ -u do not patch screen holes\n\ + -b animated loading bar (experimental)\n\ -v print version number and exit\n\ \n\ Input without a .mon extension is assumed to be a binary with a 4 byte header.\n\ @@ -9165,3 +9166,194 @@ unsigned char loadercode[] = { 0x02,0xE6,0x04,0xC6,0x00,0x10,0xBD,0x6C, 0x6A,0x03,0x4C,0x69,0xFF }; +/* +;bar.s +; +; moves itself to another page memory, +; then reads binary from disk using params at end, +; then jumps to binary +; + +; apple params/vectors + +warm = $FF69 ; back to monitor +bell = $FBDD ; ding +preg = $48 ; mon p reg +ch = $24 ; cursor horizontal +movecur = $FB5B ; move cursor to ch,a +cout = $FDED ; character out sub + +; dos params/vectors + +rwtsprm = $B7E8 ; looked at dos 3.3 disk, not using $3E3 to find +rwts = $B7B5 ; rwts jsr + +; vars + +stage1 = $800 +stage2 = $300 ; $300 looks open +invsp = $20 ; inverse space for draw +;;;run time +trkcnt = $00 ; track counter +segcnt = $01 ; loop var +buffer = $02 ; MSB of RWTS buffer +secnum = $03 ; loop var +trknum = $04 ; loop var +barcnt = $05 ; bar counter +barptr = $06 ; bar pointer + + + .org stage1 +init: + lda #0 ; reset pointer and counter + sta barcnt + sta barptr + + lda #1 ; read(1)/write(2) command + ldy #$0C ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + + lda #0 ; buffer LSB + ldy #8 ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + + lda #2 + sta trknum ; start with track 2 + +start: + ldx #0 ; move code to stage2 +move: + lda moved,x + sta loader,x + inx + cpx #$D0 + bne move ; move 208 bytes + jmp loader + +moved: + .org stage2 + +loader: + lda loadpage ; where to dump the tracks + sta buffer + + ldx lasttrack + dex ; because data starts at track 2 + dex + stx trkcnt ; number of complete and partial tracks + +;;;begin track loop +trkloop: + lda trknum ; track number + ldy #4 ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + +;;;begin sector loop (16), backwards is faster, much faster + lda trkcnt ; check if last track + bne fulltrack ; if not then full track + lda lastsector ; if so, get last sector number + bpl subtrack +fulltrack: + lda #$F +subtrack: + sta secnum +secloop: + lda secnum ; sector number + ldy #5 ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + + lda buffer ; buffer MSB + clc + adc secnum ; compute page load address + ldy #9 ; offset in RWTS + sta rwtsprm,y ; write it to RWTS + + ldy #rwtsprm + jsr rwts ; do it! + bcs diskerror + lda #0 + sta preg ; fix p reg so mon is happy + +;;;draw code + inc barcnt ; sectors read + ldx barptr ; get current pointer value + lda bar,x + cmp barcnt ; is bar,x = barcnt? + bne nodraw ; if bar,x = barcnt draw bar + lda barptr ; get position + ;clc + ;adc #5 ; intend + sta ch + lda #19 ; row 19 + jsr movecur + lda #invsp + jsr cout + inc barptr ; move pointer to next bar position +nodraw: +;;;end draw code + + dec secnum + bpl secloop +;;;end sector loop + + lda buffer ; buffer += $10 + clc + adc #$10 + sta buffer + + inc trknum ; next track + dec trkcnt ; + bpl trkloop ; 0, all done with tracks +;;;end track loop + +done: + jmp (nextjump) ; down with load, run it + +diskerror: + jmp warm + +lasttrack: + .org *+1 +lastsector: + .org *+1 +loadpage: + .org *+1 +nextjump: + .org *+2 +bar: + .org *+40 +;;; used for debug +;trkcnt: +; .org *+1 +;segcnt: +; .org *+1 +;buffer: +; .org *+1 +;secnum: +; .org *+1 +;trknum: +; .org *+1 +*/ +unsigned char barcode[] = { + 0xA9,0x00,0x85,0x05,0x85,0x06,0xA9,0x01, + 0xA0,0x0C,0x99,0xE8,0xB7,0xA9,0x00,0xA0, + 0x08,0x99,0xE8,0xB7,0xA9,0x02,0x85,0x04, + 0xA2,0x00,0xBD,0x28,0x08,0x9D,0x00,0x03, + 0xE8,0xE0,0xD0,0xD0,0xF5,0x4C,0x00,0x03, + 0xAD,0x72,0x03,0x85,0x02,0xAE,0x70,0x03, + 0xCA,0xCA,0x86,0x00,0xA5,0x04,0xA0,0x04, + 0x99,0xE8,0xB7,0xA5,0x00,0xD0,0x05,0xAD, + 0x71,0x03,0x10,0x02,0xA9,0x0F,0x85,0x03, + 0xA5,0x03,0xA0,0x05,0x99,0xE8,0xB7,0xA5, + 0x02,0x18,0x65,0x03,0xA0,0x09,0x99,0xE8, + 0xB7,0xA0,0xE8,0xA9,0xB7,0x20,0xB5,0xB7, + 0xB0,0x33,0xA9,0x00,0x85,0x48,0xE6,0x05, + 0xA6,0x06,0xBD,0x75,0x03,0xC5,0x05,0xD0, + 0x10,0xA5,0x06,0x85,0x24,0xA9,0x13,0x20, + 0x5B,0xFB,0xA9,0x20,0x20,0xED,0xFD,0xE6, + 0x06,0xC6,0x03,0x10,0xC3,0xA5,0x02,0x18, + 0x69,0x10,0x85,0x02,0xE6,0x04,0xC6,0x00, + 0x10,0xA2,0x6C,0x73,0x03,0x4C,0x69,0xFF + +}; diff --git a/c2d.h.0 b/c2d.h.0 index bd3c82a..1ba0e6c 100644 --- a/c2d.h.0 +++ b/c2d.h.0 @@ -13,7 +13,7 @@ typedef struct d { const char *usagetext="\n\ usage: c2d [-vh?]\n\ - c2d [-mu] [-t filename] [-s start address override] input[.mon],[load_address] output.dsk\n\ + c2d [-bum] [-t filename] [-s start address override] input[.mon],[load_address] output.dsk\n\ \n\ -h|? this help\n\ -m jump to monitor after booting\n\ @@ -21,6 +21,7 @@ usage: c2d [-vh?]\n\ -t filename, where filename is a 1K $400-$7FF text page splash screen\n\ The splash screen will display while the binary is loading\n\ -u do not patch screen holes\n\ + -b animated loading bar (experimental)\n\ -v print version number and exit\n\ \n\ Input without a .mon extension is assumed to be a binary with a 4 byte header.\n\ diff --git a/makeheader b/makeheader index 3c3d029..5cc45c8 100755 --- a/makeheader +++ b/makeheader @@ -38,6 +38,7 @@ make ( header loader loadercode 8 +header bar barcode 8 ) > ../c2d.h.1 cd ..