diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..752883d --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Assembly build artifacts +asm/** +!asm/*.s +!asm/*.inc +!asm/Makefile + +# Generated at build time but being kept upstream +# c2t.h +# Ephemeral build artifacts (when makeheader barfs) +c2t.h.[123] + +# Linux/BSD/*nix built binaries without platform identifiers +bin/** +# but keep Windows binaries checked-in (at least for now) +# TODO: use releases instead of this? +!bin/*.exe + +# Annoying macOS Finder state detritus +.DS_Store + +# Visual Studio Code workspace, settings +.vscode + +# Installed at build time, not a distributed artifact +cc65* diff --git a/Makefile b/Makefile index dd631f8..c2e6980 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ WIN32GCC = /usr/local/local.x86_64/gcc-4.8.0-qt-4.8.4-for-mingw32/win32-gcc/bin/i586-mingw32-gcc +CCWARN = -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -Wno-misleading-indentation all: nix @@ -20,30 +21,30 @@ clean: testclean # nix bin/c2t: c2t.c c2t.h - $(CC) -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -I. -O3 -o bin/c2t c2t.c -lm + $(CC) $(CCWARN) -I. -O3 -o bin/c2t c2t.c -lm bin/c2t-96h: c2t-96h.c c2t.h - $(CC) -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -I. -O3 -o bin/c2t-96h c2t-96h.c -lm + $(CC) $(CCWARN) -I. -O3 -o bin/c2t-96h c2t-96h.c -lm # macos universal bin/c2t_x86: c2t.c c2t.h - $(CC) -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -I. -O3 -target x86_64-apple-macos10.12 -o $@ c2t.c -lm + $(CC) $(CCWARN) -I. -O3 -target x86_64-apple-macos10.12 -o $@ c2t.c -lm bin/c2t-96h_x86: c2t-96h.c c2t.h - $(CC) -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -I. -O3 -target x86_64-apple-macos10.12 -o $@ c2t-96h.c -lm + $(CC) $(CCWARN) -I. -O3 -target x86_64-apple-macos10.12 -o $@ c2t-96h.c -lm bin/c2t_arm: c2t.c c2t.h - $(CC) -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -I. -O3 -target arm64-apple-macos11 -o $@ c2t.c -lm + $(CC) $(CCWARN) -I. -O3 -target arm64-apple-macos11 -o $@ c2t.c -lm bin/c2t-96h_arm: c2t-96h.c c2t.h - $(CC) -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -I. -O3 -target arm64-apple-macos11 -o $@ c2t-96h.c -lm + $(CC) $(CCWARN) -I. -O3 -target arm64-apple-macos11 -o $@ c2t-96h.c -lm # windows bin/c2t.exe: c2t.c c2t.h - $(WIN32GCC) -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -I. -O3 -o bin/c2t.exe c2t.c + $(WIN32GCC) $(CCWARN) -I. -O3 -o bin/c2t.exe c2t.c bin/c2t-96h.exe: c2t-96h.c c2t.h - $(WIN32GCC) -Wall -Wno-strict-aliasing -Wno-unused-value -Wno-unused-function -I. -O3 -o bin/c2t-96h.exe c2t-96h.c + $(WIN32GCC) $(CCWARN) -I. -O3 -o bin/c2t-96h.exe c2t-96h.c cc65-sources-2.13.3.tar.bz2: curl -sLO https://github.com/mrdudz/cc65-old/raw/master/cc65-sources-2.13.3.tar.bz2 @@ -52,7 +53,7 @@ cc65-2.13.3/bin/cl65: cc65-sources-2.13.3.tar.bz2 bunzip2 -c cc65-sources-2.13.3.tar.bz2 | tar xf - (cd cc65-2.13.3; /usr/bin/sed 's!/usr/local!'${PWD}'/cc65-2.13.3!' Makefile; make -j4 bins || make bins && make install || true) -c2t.h: c2t.h.0 makeheader mon/dos33.boot1.mon mon/dos33.boot2.mon asm/autoload.s asm/diskload2.s asm/diskload3.s asm/diskload8000.s asm/diskload9600.s asm/fastload8000.s asm/fastload9600.s asm/fastloadcd.s asm/inflate.s cc65-2.13.3/bin/cl65 +c2t.h: c2t.h.0 makeheader mon/dos33.rwts.mon asm/*.inc asm/autoload.s asm/diskload2.s asm/diskload3.s asm/diskload8000.s asm/diskload9600.s asm/fastload8000.s asm/fastload9600.s asm/fastloadcd.s asm/inflate.s cc65-2.13.3/bin/cl65 ./makeheader test: bin/c2t-96h bin/c2t-96h.exe tests/test.md diff --git a/asm/Makefile b/asm/Makefile index 425c212..6a6c889 100644 --- a/asm/Makefile +++ b/asm/Makefile @@ -2,6 +2,7 @@ CL = cl65 CL_FLAGS = -t none --listing --list-bytes 100 ASRC = $(shell echo *.s) +AINC = $(wildcard *.inc) AOBJ = $(ASRC:%.s=%.o) ALST = $(ASRC:%.s=%.lst) AMON = $(ASRC:%.s=%.mon) @@ -12,5 +13,5 @@ all: $(ABIN) clean: -rm -f $(ABIN) $(AOBJ) $(ALST) $(AMON) -%: %.s +%: %.s $(AINC) $(CL) $(CL_FLAGS) $< diff --git a/asm/apple2.inc b/asm/apple2.inc new file mode 100644 index 0000000..f48f150 --- /dev/null +++ b/asm/apple2.inc @@ -0,0 +1,47 @@ +; apple2.inc +; Apple II Monitor entry points, ZP locations, and I/O + +; ZP Monitor vars +CH := $24 ; Cursor horizontal position +CV := $25 ; Cursor vertical position +BASL := $28 ; Text base address low +BASH := $29 ; Text base address high +INVFLG := $32 ; Normal/inverse(/flash) +PROMPT := $33 ; Used by GETLN +CSW := $36 ; Character out soft-link +KSW := $38 ; Keyboard in soft-link +ACC := $45 ; Monitor BRK A register save location +XREG := $46 ; Monitor BRK X register save location +YREG := $47 ; Monitor BRK Y register save location +STATUS := $48 ; Monitor BRK MPU status (P) register save location +SPNT := $49 ; Monitor BRK stack pointer (S) register save location + +; Page 3 stuff +BRKV := $03F0 ; Break (BRK) vector +SOFTEV := $03F2 ; Vector for warm start +PWREDUP := $03F4 ; This must be = EOR #$A5 of SOFTEV+1 +AMPERV := $03F5 ; Thunk vector for & commands +USRADR := $03F8 ; Thunk vector for Monitor user commands +NMI := $03FB ; NMI handler thunk +IRQLOC := $03FE ; IRQ handler vector + +; I/O addresses +IOBASE := $C000 ; base of all I/O +TAPEIN := $C060 ; read tape interface + +; Monitor routines +COUT := $FDED ; character out sub +CROUT := $FD8E ; CR out sub +CLREOP := $FC42 ; clear to end of screen +CR := $FC58 ; clear screen +TABV := $FB5B ; move cursor to ch,a +PRBYTE := $FDDA ; print a byte in hex + +RESET := $FA62 ; reset Mon routine +PWRUP := $FAA6 ; cold-start reset routine +BELL1 := $FBD9 ; ding +BELL2 := $FBDD ; ding +RDKEY := $FD0C ; read key +READ := $FEFD ; read a block from tape +MON := $FF65 ; Monitor EP with a bell +MONZ := $FF69 ; Monitor EP w/o a bell diff --git a/asm/autoload.inc b/asm/autoload.inc new file mode 100644 index 0000000..a3ca815 --- /dev/null +++ b/asm/autoload.inc @@ -0,0 +1,4 @@ +; autoload.inc +; Autoload bootstrapper object config + +autoload_org = $BF00 ; origin, should be $BF00 for now diff --git a/asm/autoload.s b/asm/autoload.s index 732729f..640b5de 100644 --- a/asm/autoload.s +++ b/asm/autoload.s @@ -1,18 +1,21 @@ ;autoload.s -org = $BF00 ; should be $BF00 -cout = $FDED ; character out sub -crout = $FD8E ; CR out sub -prbyte = $FDDA -warm = $FF69 ; back to monitor -readblk = $FEFD +.include "apple2.inc" +.include "inflate.inc" +.include "autoload.inc" + +cout = COUT ; character out sub +crout = CROUT ; CR out sub +prbyte = PRBYTE ; print byte in hex +warm = MONZ ; back to monitor +readblk = READ ; read a block from tape + pointer = $06 endbas = $80C ;target = $1000 target = $801 chksum = $00 -inflate = $BA00 -inf_zp = $0 +;inf_zp = $0 ; see inflate.inc start: .org endbas @@ -24,7 +27,7 @@ move1: lda moved,x bne move1 ; move 256 bytes jmp load moved: - .org org + .org autoload_org load: lda #loadm @@ -49,21 +52,21 @@ inf: jsr print lda inf_src ;src lsb - sta inf_zp+0 + sta inflate_zp+0 lda inf_src+1 ;src msb - sta inf_zp+1 + sta inflate_zp+1 lda inf_dst ;dst lsb - sta inf_zp+2 + sta inflate_zp+2 lda inf_dst+1 ;dst msb - sta inf_zp+3 + sta inflate_zp+3 jsr inflate lda inf_end ;dst end +1 lsb - cmp inf_zp+2 + cmp inflate_zp+2 bne error lda inf_end+1 ;dst end +1 msb - cmp inf_zp+3 + cmp inflate_zp+3 bne error runit: lda warm_flag ; if warm_flag = 1 warm boot diff --git a/asm/disk2.inc b/asm/disk2.inc new file mode 100644 index 0000000..e5b003b --- /dev/null +++ b/asm/disk2.inc @@ -0,0 +1,23 @@ +; disk2.inc +; Disk II controller and drive I/O + +; $C080 - C087 are the 4 stepper phases +phase0clr := $C080 +phase0set := $C081 +phase1clr := $C082 +phase1set := $C083 +phase2clr := $C084 +phase2set := $C085 +phase3clr := $C086 +phase3set := $C087 + +motoroff := $C088 ; Turn drive motor off +motoron := $C089 ; Turn drive motor on +drv1sel := $C08A ; Select drive 1 +drv2sel := $C08B ; Select drive 2 +sequencer := $C08C ; Activate sequencer +rdshifter := $C08C ; Read shifter +wrshifter := $C08D ; Load shifter for write +wrprot := $C08E ; Read write-protected status +rdmode := $C08E ; Set read mode / sequencer to idle +wrreq := $C08F ; Set write mode / load shifter for write diff --git a/asm/diskload1.inc b/asm/diskload1.inc new file mode 100644 index 0000000..b51ebbc --- /dev/null +++ b/asm/diskload1.inc @@ -0,0 +1,9 @@ +; diskload1.inc +; Diskload bootstrapper object config + +diskload1_org = $9000 ; origin, should be $9000 for now +diskload1_zp = $00 ; object's ZP usage + +;--END-OF-H ; ends C header file + +diskload1 = diskload1_org ; Entry point diff --git a/asm/diskload2.inc b/asm/diskload2.inc new file mode 100644 index 0000000..7e1e6db --- /dev/null +++ b/asm/diskload2.inc @@ -0,0 +1,14 @@ +; diskload2.inc +; Diskload object config + +diskload2_org = $AE00 ; origin; 7 pages +diskload2_data = $1000 ; sector data start + +; NB: Currently ends at $A9FF, but diskload3 inflate_data segment ($AB00-ADFF) can +; also be reused. The two buffers are not used at the same time. +nybbdata_org = $9200 ; Nybblized track data +nybbdata_size = $1800 ; 16*1.5=24 pages + +;--END-OF-H ; ends C header file + +diskload2 = diskload2_org ; Entry point diff --git a/asm/diskload2.s b/asm/diskload2.s index 4041303..5783341 100644 --- a/asm/diskload2.s +++ b/asm/diskload2.s @@ -1,72 +1,65 @@ ;diskload2.s -; apple vectors - -cout = $FDED ; character out sub -crout = $FD8E ; CR out sub -prbyte = $FDDA ; print byte in hex -tapein = $C060 ; read tape interface -warm = $FF69 ; back to monitor -clear = $FC58 ; clear screen -movecur = $FB5B ; move cursor to ch,a -dos = $9D84 -asrom = $9D72 -locrpl = $3E3 ; locate RWTS paramlist jsr -rwts = $3D9 ; RWTS jsr -cleos = $FC42 ; clear to end of screen -init = $A54F -motoroff= $C088 ; Turn drive motor off -motoron = $C089 ; Turn drive motor on -reboot = $FAA6 ; reboot machine -bell = $FBDD ; ding -rdkey = $FD0C ; read key +.include "apple2.inc" +.include "disk2.inc" +.include "dos33.inc" +.include "diskload1.inc" +.include "diskload2.inc" +.include "diskload3.inc" + +cout = COUT ; character out sub +crout = CROUT ; CR out sub +prbyte = PRBYTE ; print byte in hex +warm = MONZ ; back to monitor +clear = CR ; clear screen +movecur = TABV ; move cursor to ch,a +cleos = CLREOP ; clear to end of screen (page) +reboot = PWRUP ; reboot machine +bell = BELL2 ; ding +rdkey = RDKEY ; read key + +rwts = DOSRWTSEP ; RWTS direct entry point ; my vectors -;print = $90CE ; from diskload.s -readtape= $9000 -inflate = $9B00 +readtape= diskload1 ; zero page parameters -begload = $00 ; begin load location LSB/MSB -endload = $02 ; end load location LSB/MSB -chksum = $04 ; checksum location +begload = diskload1_zp+0 ; begin load location LSB/MSB +endload = diskload1_zp+2 ; end load location LSB/MSB +chksum = diskload1_zp+4 ; checksum location + +frtinp = diskload1_zp+0 ; input pointer (reuses diskload1 space) +frtoutp = diskload1_zp+2 ; output pointer (reuses diskload1 space) + +; TODO: continue diskload1_zp+X allocations here? secnum = $05 ; loop var trknum = $06 ; loop var segcnt = $07 ; loop var buffer = $08 ; MSB of RWTS buffer trkcnt = $09 ; track counter (0-6) -pointer = $0A ; pointer LSB/MSB +iobptr = $0A ; RWTS IOB pointer LSB/MSB +romptr = $0A ; (overload) CX00 slot ROM ptr for Disk II detection prtptr = $0C ; pointer LSB/MSB -fmptr = $0E ; file manager pointer -inf_zp = $10 ; inflate vars (10) +;inf_zp = $10 ; inflate vars (10); see diskload3.inc temp = $1E ; temp var -ch = $24 ; cursor horizontal -preg = $48 ; mon p reg +ch = CH ; cursor horizontal +preg = STATUS ; mon p reg ; other vars -org = $9700 ; should be $9700 invsp = $60 ; inverse space for draw -data = $1000 ; 7 track dump from inflate -boot1o = $96D0 ; tape loaded boot 1 location -boot1 = $3D0 ; target boot 1 location +data = diskload2_data ; 7 track dump from inflate cmpbuf = $9200 ; buffer for sector check count = $900 - .org org - - ldx #0 ; move 9cd0 to 3d0 -move1: - lda boot1o,x - sta boot1,x - inx - cpx #48 - bne move1 ; branch on positive (0-127) -patch: - lda #$B3 ; hack since chksum could not be written to C000 - sta $BFFF ; chksum was written do BFFF +defd2sl = 6 ; default Disk II slot (not detected) +d2drvno = 1 ; for now, presume drive 1 +volnum = 254 ; volume number we will use (unlikely to ever change) + + .org diskload2_org + start: jsr clear ; clear screen lda #left jsr print -setupiob: - jsr locrpl ; locate rwts paramlist - sty pointer ; and save pointer - sta pointer+1 - - lda #1 ; table type - ldy #0 ; offset in RWTS - sta (pointer),y ; write it to RWTS - - lda #6 * 16 ; slot 6 - ldy #1 ; offset in RWTS - sta (pointer),y ; write it to RWTS - - lda #1 ; drive number - ldy #2 ; offset in RWTS - sta (pointer),y ; write it to RWTS - - lda #254 ; volume number - ldy #3 ; offset in RWTS - sta (pointer),y ; write it to RWTS - -format: ; format the diskette - lda infdata+20 ; check noformat flag - bne endformat ; if not 0 jump to endformat +detectdisk: ; detect Disk II controller + lda #0 ; using IIe firmware protocol + sta romptr ; init the slot ROM pointer + ldx #0-1 ; first slot index; -1 for INX +dslotloop: + inx ; next slot in order + lda d2sltord,x ; get next slot# + beq notdetected ; the end; controller not found + ora #>IOBASE ; to slot ROM page + sta romptr+1 ; set the ROM ptr page + ldy #8-1 ; 8-byte ROM sig, last byte +dsigloop: + lda (romptr),y ; read slot ROM byte + cmp d2romsig,y ; compare to ROM signature + bne dslotloop ; mismatch, try next slot + dey + dey ; compare every other byte + bpl dsigloop ; until y<0 +detected: + lda d2sltord,x ; get detected slot# + sta d2detect ; detection flag + bne saveslot ; always; and "slot 0" guard for free +notdetected: + lda #defd2sl ; use default slot# +saveslot: + sta d2slot ; save slot# + asl ; A*=$10 + asl ; convert to slot I/O ofs + asl + asl + sta d2slotio ; save slot I/O ofs - jsr status - lda #<formatm ; print formatting - ldy #>formatm +printdisk: ; display disk target + lda #12 ; col 12 (0-based) + sta ch + lda #20 ; row 20 (0-based) + jsr movecur + lda #<diskm ; print "DISK:" + ldy #>diskm jsr print -;;; RWTS format (issues) -; lda #4 ; format(4) command -; ldy #$0C ; offset in RWTS -; sta (pointer),y ; write it to RWTS - -; jsr locrpl ; locate rwts paramlist -; jsr rwts ; do it! -; bcs formaterror -; lda #0 -; sta preg ; fix p reg so mon is happy -; jmp endformat - -;;; file manager format (works!) - jsr $3DC ; load up Y and A - sty fmptr - sta fmptr+1 - - lda #$0B ; init command - ldy #0 - sta (fmptr),y - - lda #$9D ; DOS location - ldy #1 - sta (fmptr),y - - lda #254 ; volume number - ldy #4 - sta (fmptr),y - - lda #$01 ; drive number - ldy #5 - sta (fmptr),y - - lda #$06 ; slot number - ldy #6 - sta (fmptr),y - - lda #$00 ; scratch area LSB - ldy #$0C - sta (fmptr),y + lda d2slot ; inject slot# into "Sx,Dy" msg + clc + adc #'0' ; to ascii digit + sta diskm2+1 ; inject digit + lda #d2drvno ; inject drive# into "Sx,Dy" msg + adc #'0' ; to ascii digit + sta diskm2+4 ; inject digit + lda #<diskm2 ; print "Sx,Dy" + ldy #>diskm2 + jsr inv - lda #$92 ; scratch area MSB - ldy #$0D - sta (fmptr),y + lda d2detect ; Disk II detection flag + beq prdsknot ; was not detected + lda #<diskdetm ; print "DETECTED" + ldy #>diskdetm + bne prdskdet ; always (y=page) +prdsknot: + lda #<disknotm ; print "NOT DETECTED" + ldy #>disknotm +prdskdet: + jsr print - jsr $3D6 ; doit! +initdos: + ; Init some non-obvious DOS locations so we start in guaranteed known state, + ; since none of boot 1 or boot 2 executed, and data could be anything. + ldy d2slot + lda #40*2 ; head position just beyond max (track 80) + sta RWTSD1CURTRK,y ; init drive 1 head pos for slot + sta RWTSD2CURTRK,y ; init drive 2 head pos for slot + ; Init the otherwise untouched RWTS spin-up delay counter LSB to + ; ensure deterministic timing from this point on. + lda #1 ; delay counter LSB=1 + sta RWTSDLY ; set delay counter LSB (uninited by RWTS) - ldy #$0A ; return code - lda (fmptr),y - beq endformat -formaterror: - jmp diskerror -endformat: +setupiob: + ldy #<DOSDEFIOB ; Equivalent to DOSRWTSIOB call + lda #>DOSDEFIOB + sty iobptr ; and save pointer + sta iobptr+1 + + lda #1 ; IOB version, must be 1 + ldy #IOB::ver ; offset in IOB + sta (iobptr),y ; write it to IOB + + lda d2slotio ; disk II slot I/O offset (slot# * $10) + ldy #IOB::slotio ; slot to access in IOB + sta (iobptr),y ; write it to IOB + ; Must init; presume no drive was actually accessed in last 2 seconds. + ; set to the slot we want to use to suppress slot switch logic in RWTS + ldy #IOB::lstslot ; last slot accessed in IOB + sta (iobptr),y ; write it to IOB + + lda #d2drvno ; drive number + ldy #IOB::drvnum ; drive to access in IOB + sta (iobptr),y ; write it to IOB + ; Must init; presume no drive was actually accessed in last 2 seconds. + ; set to the drive we want to use to suppress drive switch logic in RWTS + ldy #IOB::lstdrv ; last drive accessed in IOB + sta (iobptr),y ; write it to IOB + + lda #volnum ; volume number + ldy #IOB::volnum ; volume to access in IOB + sta (iobptr),y ; write it to IOB + ; Must init; presume no drive was actually accessed in last 2 seconds. + ; TODO: last volume number should actually be set by RWTS. When not formatting, + ; the last volume number will be set by issuing a read(1) over track 0. + ldy #IOB::lstvol ; last volume accessed in IOB + sta (iobptr),y ; write it to IOB -;;;begin segment loop (5) lda #0 ; 256 bytes/sector - ldy #$0b ; offset in RWTS - sta (pointer),y ; write it to RWTS + ldy #IOB::secsize ; sector size in IOB + sta (iobptr),y ; write it to IOB +;;;begin segment loop (5) lda #0 ; buffer LSB - ldy #8 ; offset in RWTS - sta (pointer),y ; write it to RWTS + ldy #IOB::bufptr ; offset in IOB + sta (iobptr),y ; write it to IOB lda #0 sta trknum ; start with track 0 @@ -212,7 +231,7 @@ segloop: ; sta $9091 ;;;; end hack ; lda #18 -; sta $24 ; horiz +; sta ch ; horiz ; lda #22 ; vert ; jsr movecur ; move cursor to $24,a; 0 base ; jsr cleos @@ -261,15 +280,15 @@ second: lda infdata+1,x ; store begin location MSB sta begload+1 - lda #$00 ; store end location LSB + lda #<diskload1_org ; store end location LSB sta endload - lda #$90 ; store end location MSB + lda #>diskload1_org ; store end location MSB sta endload+1 jsr readtape ; get the code inf: ; turn motor on to save 1-2 sec - ldx #$60 ; slot #6 + ldx d2slotio ; slot# * $10 lda motoron,x ; turn it on jsr status @@ -279,27 +298,37 @@ inf: ldx temp lda infdata+0,x ;src lsb - sta inf_zp+0 + sta inflate_zp+0 lda infdata+1,x ;src msb - sta inf_zp+1 + sta inflate_zp+1 lda #<data ;dst lsb - sta inf_zp+2 + sta inflate_zp+2 lda #>data ;dst msb - sta inf_zp+3 + sta inflate_zp+3 jsr inflate lda #$00 ;dst end +1 lsb - cmp inf_zp+2 - bne error + cmp inflate_zp+2 + bne inferror lda #$80 ;dst end +1 msb - cmp inf_zp+3 - bne error + cmp inflate_zp+3 + beq infend +inferror: + jmp error +infend: ;;;begin track loop (7) jsr status + lda infdata+20 ; check noformat flag + beq prformat ; if 0, print "format" version lda #<writem ; print writing ldy #>writem + bne prwrtmsg ; always; y=page +prformat: + lda #<formatm ; print "format" version + ldy #>formatm +prwrtmsg: jsr print lda #>data @@ -308,60 +337,57 @@ inf: sta trkcnt ; do 7 tracks/segment trkloop: lda trknum ; track number - ldy #4 ; offset in RWTS - sta (pointer),y ; write it to RWTS - -; lda #0 ; seek(0) command -; ldy #$0C ; offset in RWTS -; sta (pointer),y ; write it to RWTS + ldy #IOB::trknum ; offset in IOB + sta (iobptr),y ; write it to IOB -; jsr locrpl ; locate rwts paramlist -; jsr rwts ; do it! -; bcs diskerror + lda infdata+20 ; check noformat flag + bne persecwr ; if not 0, use per-sector writing + ; formriting variant (write entire formatted tracks) + jsr convtrack ; nibblize the entire track + jsr writetrack ; formrite the entire track + bcs diskerror + ; fall through and draw the written track +persecwr: ;;;begin sector loop (16), backwards is faster, much faster lda #$F sta secnum secloop: ;jsr draw_w ; write sector from buffer to disk jsr draw_s ; write sector from buffer to disk + lda infdata+20 ; check noformat flag + beq skipsecwr ; if 0, skip per-sector writing; just draw + lda secnum ; sector number - ldy #5 ; offset in RWTS - sta (pointer),y ; write it to RWTS + ldy #IOB::secnum ; offset in IOB + sta (iobptr),y ; write it to IOB lda buffer ; buffer MSB clc adc secnum - ldy #9 ; offset in RWTS - sta (pointer),y ; write it to RWTS + ldy #IOB::bufptr+1 ; offset in IOB + sta (iobptr),y ; write it to IOB - lda #2 ; read(1)/write(2) command - ldy #$0C ; offset in RWTS - sta (pointer),y ; write it to RWTS - - jsr locrpl ; locate rwts paramlist - jsr rwts ; do it! + lda #IOBCMD::write ; write(2) command + jsr rwtscall ; do it! bcs diskerror lda #0 sta preg ; fix p reg so mon is happy ;jsr draw_r ; read sector from disk to compare addr ;lda #>cmpbuf ; compare MSB - ;ldy #9 ; offset in RWTS - ;sta (pointer),y ; write it to RWTS - - ;lda #1 ; read(1)/write(2) command - ;ldy #$0C ; offset in RWTS - ;sta (pointer),y ; write it to RWTS + ;ldy #IOB::bufptr+1 ; offset in IOB + ;sta (iobptr),y ; write it to IOB - ;jsr locrpl ; locate rwts paramlist - ;jsr rwts ; do it! + ;lda #IOBCMD::read ; read(1) command + ;jsr rwtscall ; do it! ;bcs diskerror ;lda #0 ;sta preg ; fix p reg so mon is happy ;;; compare code +skipsecwr: ;jsr draw_s ; draw a space in the grid if OK dec secnum @@ -394,7 +420,7 @@ done: jmp reboot error: ; turn motor off, just in case left on - ldx #$60 ; slot #6 + ldx d2slotio ; slot# * $10 lda motoroff,x ; turn it off lda #<errorm ; print error @@ -411,10 +437,19 @@ diskerror: jmp warm status: lda #0 - sta $24 ; horiz + sta ch ; horiz lda #22 ; vert jsr movecur ; move cursor to $24,a; 0 base jmp cleos + +rwtscall: ; in: A=RWTS command + ldy #IOB::command ; offset in IOB + sta (iobptr),y ; write command to IOB + ldy iobptr ; load IOB pointer + lda iobptr+1 ; IOB MSB + jsr rwts ; call RWTS + rts + draw_w: ; print a 'W' in the grid clc lda #4 @@ -442,7 +477,7 @@ draw_s: ; print a ' ' in the grid adc trknum ldx #invsp draw: ; a=horiz, y=vert, x=letter - sta $24 ; horiz + sta ch ; horiz tya jsr movecur txa @@ -491,6 +526,43 @@ print1: ora #$80 lda (prtptr),y bne print1 rts + +convtrack: ; nibblize a track worth of data + lda #0 + sta frtinp ; sector data LSB + sta frtoutp ; nibblized data LSB + lda buffer ; buffer MSB + sta frtinp+1 ; input sector data MSB + lda #>nybbdata_org ; nibble buffer MSB + sta frtoutp+1 ; output nibblized data MSB + jsr nibbtrack ; nibblize the track + rts + +writetrack: ; write entire track while formatting + ; seek to track now and fail early + ; RWTS will take care of motor spin-up, and + ; it will still be running when we begin writing + lda #IOBCMD::seek ; seek(0) command + jsr rwtscall ; invoke RWTS + bcs wrtrkret ; return with error (carry=1) + + lda #<nybbdata_org ; nibblized buffer LSB + ldy #IOB::bufptr ; offset in IOB + sta (iobptr),y ; store in IOB + lda #>nybbdata_org ; nibblized buffer MSB + iny ; offset in IOB + sta (iobptr),y ; store in IOB + + lda #IOBCMD::frmrite ; custom; for bug detection + ldy #IOB::command ; offset in IOB + sta (iobptr),y ; write command to IOB + + ldy iobptr ; load IOB pointer + lda iobptr+1 ; IOB MSB + jsr formritep ; formrite the track +wrtrkret: + rts + title: .asciiz "INSTA-DISK" errorm: @@ -508,7 +580,7 @@ loadm2: secm: .asciiz " SEC. " formatm: - .asciiz "FORMATTING DISK " + .asciiz "FORMRITING DATA " waitm: .asciiz "WAITING FOR DATA: " writem: @@ -536,6 +608,31 @@ left: .byte " D|",$0D .byte " E|",$0D .byte " F|",$0D,0 +diskm: + .asciiz "DISK: " +diskm2: + .asciiz "S6,D1" +diskdetm: + .asciiz " (DETECTED)" +disknotm: + .asciiz " (ASSUMED)" +d2detect: ; Disk II detection flag + .byte 0 ; presume not detected +d2slot: + .byte 6 ; presume slot 6 +d2slotio: + .byte 6 * $10 ; presume slot 6 I/O offset +d2romsig: ; Disk II ROM values used in firmware protocol + ; every other byte, offs 1,3,5,7 + .byte $FF, $20, $FF, $00, $FF, $03, $FF, $3C +d2sltord: ; Disk II customizable slot scan order + ; XXX: IIe starts at 7; safer to start at 6 + .byte 6, 5, 4 ; conservative scan +; .byte 6, 5, 4, 7 ; alternate; 7 scanned last + .byte 0 ; 0-terminated + +.include "formrite.inc" + infdata: ;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec ;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec @@ -543,3 +640,8 @@ infdata: ;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec ;.byte 0,0,0,0 ; LSB/MSB start, ETA in sec ;.byte 0 ; format flag, 1 = no format + +.assert * + (4*5 + 1) <= diskload3_org, warning, "diskload2 too large; overruns diskload3" +.assert inflate_data + $300 <= diskload2_org, warning, "diskload3 inflate_data overruns diskload2" +.assert nybbdata_org + nybbdata_size <= diskload2_org, warning, "nybbdata segment overruns diskload2" +.assert <nybbdata_org = $00, error, "nybbdata segment must be page-aligned" diff --git a/asm/diskload3.inc b/asm/diskload3.inc new file mode 100644 index 0000000..40fe8e0 --- /dev/null +++ b/asm/diskload3.inc @@ -0,0 +1,11 @@ +; diskload3.inc +; Diskload Inflate object config + +diskload3_org = $B500 ; origin; 2 pages; DOS begins at $B700 +diskload3_zp = $10 + +;--END-OF-H ; ends C header file + +inflate = diskload3_org ; Entry point +inflate_zp = diskload3_zp +inflate_data = $AB00 ; 3 pages (rounded up); diskload2 at $AE00 diff --git a/asm/diskload3.s b/asm/diskload3.s index 9202a9b..350cd9d 100644 --- a/asm/diskload3.s +++ b/asm/diskload3.s @@ -17,13 +17,11 @@ ; changes +.include "diskload3.inc" + ;EFF .define equ = -inflate = $9B00 -inflate_zp = $10 -inflate_data = $9200 - ; Pointer to compressed data inputPointer equ inflate_zp ; 2 bytes @@ -491,6 +489,12 @@ inflateDynamicBlock_headerBits: inflateDynamicBlock_headerBase: .byte 3,0,0 ; second byte is modified at runtime! + ; ca65 v2.13 .align does not work properly here + ;.align 256 + .res 3, 0 ; round out block + +.assert * = diskload3_org + $200, warning, "diskload3 size mismatch; must be $200 bytes" + .org inflate_data ; Data for building trees @@ -519,6 +523,4 @@ codeToLiteralSymbol: codeToControlSymbol: .org *+CONTROL_SYMBOLS - .byte 0,0,0 ; round out block - END: diff --git a/asm/diskload8000.s b/asm/diskload8000.s index ce2dadc..58a8209 100644 --- a/asm/diskload8000.s +++ b/asm/diskload8000.s @@ -1,20 +1,24 @@ ;diskload8000.s -org = $9000 ; should be $9000 -cout = $FDED ; character out sub -crout = $FD8E ; CR out sub -prbyte = $FDDA ; print byte in hex -tapein = $C060 ; read tape interface -warm = $FF69 ; back to monitor -clear = $FC58 ; clear screen +.include "apple2.inc" +.include "diskload1.inc" +.include "diskload2.inc" +.include "diskload3.inc" +.include "dosrwts.inc" + +cout = COUT ; character out sub +crout = CROUT ; CR out sub +prbyte = PRBYTE ; print byte in hex +tapein = TAPEIN ; read tape interface +warm = MONZ ; back to monitor +clear = CR ; clear screen endbas = $80C -target = $1000 ; zero page parameters -begload = $00 ; begin load location LSB/MSB -endload = $02 ; end load location LSB/MSB -chksum = $04 ; checksum location +begload = diskload1_zp+0 ; begin load location LSB/MSB +endload = diskload1_zp+2 ; end load location LSB/MSB +chksum = diskload1_zp+4 ; checksum location pointer = $0C ; LSB/MSB pointer start: @@ -34,24 +38,24 @@ phase1: ldy #>loadm jsr print ; diskload2 ORG - lda #$D0 ; store begin location LSB + lda #<diskload2_org ; store begin location LSB sta begload - lda #$96 ; store begin location MSB + lda #>diskload2_org ; store begin location MSB sta begload+1 ; end of DOS + 1 for comparison - lda #$00 ; store end location LSB + lda #<(dosrwts_end+1) ; store end location LSB sta endload - lda #$C0 ; store end location MSB + lda #>(dosrwts_end+1) ; store end location MSB sta endload+1 jsr readtape ; get the code - jmp $9700 ; run it + jmp diskload2 ; run it loadm: .byte "LOADING INSTA-DISK, ETA " loadsec: ; 10 bytes for "XX SEC. ",$00 .byte 0,0,0,0,0,0,0,0,0,0 moved: - .org org ; $9000 + .org diskload1_org ; $9000 for now readtape: lda begload ; load begin LSB location sta store+1 ; store it @@ -115,31 +119,32 @@ sumcheck: lda #0 sta pointer - lda begload+1 - sta pointer+1 + ldx begload+1 + stx pointer+1 lda #$ff ; init checksum ldy begload sumloop: eor (pointer),y - + ;last page? - - ldx pointer+1 cpx endload+1 beq last iny bne sumloop - inc pointer+1 + inx + stx pointer+1 + ; is it the last page now? (endload=$xx00 edge case) + cpx endload+1 bne sumloop + beq last2 last: iny +last2: cpy endload bcc sumloop - ldy #0 - eor (endload),y -; sta chksum -; lda chksum + sta chksum + lda chksum bne error jmp ok ; return to caller error: @@ -166,3 +171,5 @@ chkm: .asciiz "CHKSUM " okm: .asciiz "OK" errm: .asciiz "ERROR" end: + +.assert * <= inflate_data, warning, "diskload1 too large; overruns inflate data segment" diff --git a/asm/diskload9600.s b/asm/diskload9600.s index ca01639..509acc4 100644 --- a/asm/diskload9600.s +++ b/asm/diskload9600.s @@ -1,20 +1,24 @@ ;diskload9600.s -org = $9000 ; should be $9000 -cout = $FDED ; character out sub -crout = $FD8E ; CR out sub -prbyte = $FDDA ; print byte in hex -tapein = $C060 ; read tape interface -warm = $FF69 ; back to monitor -clear = $FC58 ; clear screen +.include "apple2.inc" +.include "diskload1.inc" +.include "diskload2.inc" +.include "diskload3.inc" +.include "dosrwts.inc" + +cout = COUT ; character out sub +crout = CROUT ; CR out sub +prbyte = PRBYTE ; print byte in hex +tapein = TAPEIN ; read tape interface +warm = MONZ ; back to monitor +clear = CR ; clear screen endbas = $80C -target = $1000 ; zero page parameters -begload = $00 ; begin load location LSB/MSB -endload = $02 ; end load location LSB/MSB -chksum = $04 ; checksum location +begload = diskload1_zp+0 ; begin load location LSB/MSB +endload = diskload1_zp+2 ; end load location LSB/MSB +chksum = diskload1_zp+4 ; checksum location pointer = $0C ; LSB/MSB pointer start: @@ -34,24 +38,24 @@ phase1: ldy #>loadm jsr print ; diskload2 ORG - lda #$D0 ; store begin location LSB + lda #<diskload2_org ; store begin location LSB sta begload - lda #$96 ; store begin location MSB + lda #>diskload2_org ; store begin location MSB sta begload+1 ; end of DOS + 1 for comparison - lda #$00 ; store end location LSB + lda #<(dosrwts_end+1) ; store end location LSB sta endload - lda #$C0 ; store end location MSB + lda #>(dosrwts_end+1) ; store end location MSB sta endload+1 jsr readtape ; get the code - jmp $9700 ; run it + jmp diskload2 ; run it loadm: .byte "LOADING INSTA-DISK, ETA " loadsec: ; 10 bytes for "XX SEC. ",$00 .byte 0,0,0,0,0,0,0,0,0,0 moved: - .org org ; $9000 + .org diskload1_org ; $9000 for now readtape: lda begload ; load begin LSB location sta store+1 ; store it @@ -69,7 +73,7 @@ pre: lda #1 ; Load sentinel bit ldx #0 ; Clear data index clc ; Clear carry (byte complete flag) data: bcc waitlo ; Skip if byte not complete -store: sta target,x ; Store data byte +store: sta store+1,x ; Store data byte eor chksum ; compute checksum sta chksum ; store checksum @@ -172,3 +176,5 @@ chkm: .asciiz "CHKSUM " okm: .asciiz "OK" errm: .asciiz "ERROR" end: + +.assert * <= inflate_data, warning, "diskload1 too large; overruns inflate data segment" diff --git a/asm/dos33.inc b/asm/dos33.inc new file mode 100644 index 0000000..77e41f1 --- /dev/null +++ b/asm/dos33.inc @@ -0,0 +1,156 @@ +; dos33.inc +; DOS 3.3 vectors, routines, ZP locations, etc. + +; DOS ZP locations +RWTSTMP1 := $26 ; RWTS scratch register; used all over +RWTSTMP2 := $27 ; Sector addr checksum scratch register while RWTS is reading +RWTSTMP3 := $2A ; Current track scratch register while RWTS is seeking +RWTSTMP4 := $2B ; Current slot I/O ofs scratch register while RWTS is seeking +RWTSRDCHKS := $2C ; Sector addr checksum while RWTS is reading +RWTSRDSECN := $2D ; Sector addr sector# while RWTS is reading +RWTSRDTRKN := $2E ; Sector addr track# while RWTS is reading +RWTSRDVOLN := $2F ; Sector addr volume# while RWTS is reading + +RWTSTMP6 := $35 ; Current drive scratch register while in RWTS +RWTSDCTPTR := $3C ; Device Charateristics Table (DCT) pointer while in RWTS +RWTSUSRBUF := $3E ; 256-byte user buffer pointer for sector read/write while in RWTS +RWTSTMP8 := $3E ; Sector addr mask scratch register while RWTS is formatting + +RWTSWRSECN := $3F ; Sector addr sector# while RWTS is formatting +RWTSWRVOLN := $41 ; Sector addr volume# while RWTS is formatting +RWTSWRTRKN := $44 ; Sector addr track# while RWTS is formatting +RWTSSECPAD := $45 ; Inter-sector sync padding size while RWTS is formatting + ; NB: Padding is determined during track 0 format + ; and remains the same for the rest of the disk. + +RWTSDLY := $46 ; Spin-up/track switch delay counter LSB + ; NB: DOS 3.3 RWTS does *not* initialize it; 0 after first wait. + ; The first RWTS call after entering Monitor thus has a + ; near-random delay component. +RWTSDLYH := $47 ; Spin-up/track switch delay counter MSB +RWTSIOBPTR := $48 ; IOB pointer while in RWTS. Rumor has it this should be cleared + ; to 0 after calling RWTS, and before reentering Mon. +; TODO: more + +; DOS page 3 vectors +DOSP3VECS := $03D0 ; DOS vectors location in page 3 +DOSWARM := $03D0 ; DOS warm start thunk +DOSCOLD := $03D3 ; DOS cold start thunk +DOSFMCALL := $03D6 ; DOS File Manager thunk entry point +DOSRWTSCALL := $03D9 ; DOS RWTS thunk entry point +DOSFMPRMLIST := $03DC ; DOS get File Manager paramlist pointer +DOSRWTSIOB := $03E3 ; DOS get RWTS IOB pointer + +DOSP3VECSIZE = $30 ; All page 3 vectors installed by DOS, all through IRQ vec + +; DOS RWTS video hole steals (belongs to slots) +RWTSCURTRK := $0478 ; RWTS: current head position (steals slot 0 hole) +RWTSD1CURTRK := $0478 ; RWTS: + slot# (starting at 1); current head position on slot/drive 1 +RWTSMAXSEEK := $04F8 ; RWTS: max track seek retries (steals slot 0 hole) +RWTSD2CURTRK := $04F8 ; RWTS: + slot# (starting at 1); current head position on slot/drive 2 +RWTSRETRIES := $0578 ; RWTS: max number of I/O retries (steals slot 0 hole) +RWTSSLOTIO1 := $05F8 ; RWTS: temp I/O offset (slot# * $10) of current slot (steals slot 0 hole) +RWTSSLOTIO2 := $0678 ; RWTS WRDATA: temp I/O offset (slot# * $10) of current slot (steals slot 0 hole) + ; NB: non-ZP location used for timing: produces 4-cycle load instruction +RWTSMAXRECAL := $06F8 ; RWTS: max recalibration retries (steals slot 0 hole) + + +; DOS locations at highest load range +DOSBOOT2HI := $9D00 ; Boot 2 high load location + +; DOS RWTS locations at highest load range +DOSFMPRMPTR := $9D0E ; File Manager Paramlist pointer (see FMPL); returned by DOSFMPRMLIST +DOSFMPRMBUF := $B5BB ; File Manager Paramlist actual (see FMPL); pointed to by DOSFMPRMPTR +DOSFMEP := $AAFD ; File Manager entry point (has X=0 check) +DOSIOBPTR := $AAC1 ; RWTS default IOB pointer (see IOB); returned by DOSRWTSIOB +DOSDEFIOB := $B7E8 ; Default RWTS IOB (see IOB); can be used by anyone; pointed to by DOSIOBPTR +DOSDEFDCT := $B7FB ; Default RWTS DCT; can be used by anyone; referenced by DOSDEFIOB +DOSRWTSEP := $B7B5 ; RWTS entry point; disables interrupts +DOSENCSEC := $B800 ; RWTS encode sector (nibblize); into HI/LO buffers +DOSWRSECDAT := $B82A ; RWTS write sector data routine; from nibblized HI/LO buffers +DOSDECSEC := $B8C2 ; RWTS decode sector (denibblize); from nibblized HI/LO buffers +DOSRDSECDAT := $B8DC ; RWTS read sector data routine; into HI/LO buffers; waits up to $20 nybbles for sector data +DOSRDSECADR := $B944 ; RWTS read sector address routine; waits up to $304 nybbles for sector addr +DOSSEEKTRK := $B9A0 ; RWTS seek to track routine +DOSENYBTBL := $BA29 ; RWTS encode disk nybble table; 64 bytes +DOSDNYBTBL := $BA96 ; RWTS decode disk nybble table; 106 bytes ($96-$FF) +DOSNIBHIBUF := $BB00 ; RWTS nibblized sector data high bits (6/byte); $100 bytes +DOSNIBLOBUF := $BC00 ; RWTS nibblized sector data low bits (2/byte); $56 bytes +DOSWRSECADR := $BC56 ; RWTS write sector address routine; only used when formatting +DOSRWTSNAKED := $BD00 ; Actual RWTS; naked and alone +DOSSETTRK := $BE5A ; RWTS set track routine; calls DOSSEEKTRK +DOSFMTDSK := $BEAF ; RWTS format disk routine; calls DOSFMTTRK +DOSFMTTRK := $BF0D ; RWTS format track routine; calls DOSWRSECADR, DOSWRSECDAT, DOSRDSECADR, DOSRDSECDAT +DOSVFYTBL := $BFA8 ; RWTS sector verify status table during formatting; 16 bytes +DOSINTLTBL := $BFB8 ; RWTS sector interleave table; 16 bytes +; TODO: more + +; DOS structures and enums + +.struct IOB ; RWTS I/O Control Block + ver .byte ; 00: must be $01 + slotio .byte ; 01: Slot I/O offset: slot# * $10 + drvnum .byte ; 02: drive number, 1 or 2 + volnum .byte ; 03: volume number expected; $00 = any + trknum .byte ; 04: Track number; 0-35 + secnum .byte ; 05: Sector number; 0-15 + dctptr .word ; 06: Device Characteristics Table pointer + bufptr .word ; 08: Pointer to 256 bytes of data for read/write + _resrv1 .res 1 ; 0A: Reserved; not used, set to 0 + secsize .byte ; 0B: $00 for 256-byte sector + command .byte ; 0C: See IOBCMD; 0=seek, 1=read, 2=write, 4=format + result .byte ; 0D: Return code: $00=OK, $08=init error, $10=write protected, + ; $20=volume mismatch, $40=drive error, $80=read error + lstvol .byte ; 0E: Last-accessed volume number (must init or RWTS will barf) + lstslot .byte ; 0F: Last-accessed slot I/O offset (must init for RWTS) + lstdrv .byte ; 10: Last-accessed drive number (must init for RWTS) + ; NB: Last slot and drive *must* be inited before the first + ; RWTS call. Unpredictable RWTS slot/drive switch behavior + ; may result if left uninited (e.g. hangs). +.endstruct +.assert .sizeof(IOB) = $11, error, "DOS IOB must be $11 bytes long" + +.enum IOBCMD ; RWTS I/O Control Block command + seek = 0 + read = 1 + write = 2 + format = 4 + frmrite = format+write ; NB: custom command; for bug detection +.endenum + +.struct DCT ; RWTS Device Characteristics Table + devtyp .byte ; 00: Device type; 0 for Disk II + trkphc .byte ; 01: Phases per track - 1; 1 for Disk II + _ignr1 .byte ; 02: DOS 3.3 RWTS does not use this (set to $EF) + mtrdly .byte ; 03: Motor spin-up delay count; $D8 for Disk II +.endstruct +.assert .sizeof(DCT) = 4, error, "DOS DCT must be 4 bytes long" + +.struct FMPL ; File Manager Parameter List + command .byte ; 00: See FMPLCMD + cmdprm .byte ; 01: Command parameter for read/write + params .res 8 ; 02-09: Command-specific params + result .byte ; 0A: Return code: $00=OK, $02=bad call, $04=write protected, + ; $06=file not found, $07=volume mismatch, $08=disk i/o error, etc. + _resrv1 .res 1 ; 0B: Reserved; not used + wrkaptr .word ; 0C: FileMan workarea buffer (45 bytes) pointer; preserve between calls + tslptr .word ; 0E: Track/Sector List buffer (256 bytes) pointer; preserve between calls + bufptr .word ; 10: Sector data buffer (256 bytes) pointer +.endstruct +.assert .sizeof(FMPL) = $12, error, "DOS FMPL must be $12 bytes long" + +.enum FMPLCMD ; FileMan Parameter List command + noop = 0 + open = 1 + close = 2 + read = 3 + write = 4 + delete = 5 + catalog = 6 + lock = 7 + unlock = 8 + rename = 9 + position= 10 + init = 11 ; Disk init: format, write catalog, write DOS image + verify = 12 +.endenum diff --git a/asm/dosrwts.inc b/asm/dosrwts.inc new file mode 100644 index 0000000..b1dcf2e --- /dev/null +++ b/asm/dosrwts.inc @@ -0,0 +1,5 @@ +; dosrwts.inc +; DOS 3.3 RWTS rip object config + +dosrwts_org = $B700 ; origin, should be $B700 +dosrwts_end = $BFD0 ; end of object diff --git a/asm/fastload.inc b/asm/fastload.inc new file mode 100644 index 0000000..b73e9b0 --- /dev/null +++ b/asm/fastload.inc @@ -0,0 +1,4 @@ +; fastload.inc +; Fastload object config + +fastload_org = $BE80 ; origin, should be $BE80 for now diff --git a/asm/fastload8000.s b/asm/fastload8000.s index 58768c1..15c4359 100644 --- a/asm/fastload8000.s +++ b/asm/fastload8000.s @@ -1,18 +1,21 @@ ;fastload8000.s -org = $BE80 ; should be $BE80 -cout = $FDED ; character out sub -crout = $FD8E ; CR out sub -prbyte = $FDDA -warm = $FF69 ; back to monitor -tapein = $C060 +.include "apple2.inc" +.include "inflate.inc" +.include "fastload.inc" + +cout = COUT ; character out sub +crout = CROUT ; CR out sub +prbyte = PRBYTE ; print byte in hex +warm = MONZ ; back to monitor +tapein = TAPEIN ; read tape interface + pointer = $06 endbas = $80C ;target = $1000 target = $801 chksum = $00 -inflate = $BA00 -inf_zp = $0 +;inf_zp = $0 ; see inflate.inc start: .org endbas @@ -29,7 +32,7 @@ move2: lda moved+256,x bpl move2 ; only 128 bytes to move jmp fast moved: - .org org + .org fastload_org fast: lda #<loadm ldy #>loadm @@ -91,24 +94,27 @@ endcheck: ; check for match of expected length sumcheck: lda #0 sta pointer - lda ld_beg+1 - sta pointer+1 + ldx ld_beg+1 + stx pointer+1 lda #$ff ; init checksum ldy ld_beg sumloop: eor (pointer),y ;last page? - - ldx pointer+1 cpx ld_end+1 beq last iny bne sumloop - inc pointer+1 + inx + stx pointer+1 + ; is it the last page now? (ld_end=$xx00 edge case) + cpx ld_end+1 bne sumloop + beq last2 last: iny +last2: cpy ld_end bcc sumloop @@ -126,21 +132,21 @@ inf: jsr print lda inf_src ;src lsb - sta inf_zp+0 + sta inflate_zp+0 lda inf_src+1 ;src msb - sta inf_zp+1 + sta inflate_zp+1 lda inf_dst ;dst lsb - sta inf_zp+2 + sta inflate_zp+2 lda inf_dst+1 ;dst msb - sta inf_zp+3 + sta inflate_zp+3 jsr inflate lda inf_end ;dst end +1 lsb - cmp inf_zp+2 + cmp inflate_zp+2 bne error lda inf_end+1 ;dst end +1 msb - cmp inf_zp+3 + cmp inflate_zp+3 bne error runit: lda warm_flag ; if warm_flag = 1 warm boot diff --git a/asm/fastload9600.s b/asm/fastload9600.s index 5b7cc1c..1541b37 100644 --- a/asm/fastload9600.s +++ b/asm/fastload9600.s @@ -1,18 +1,21 @@ ;fastload9600.s -org = $BE80 ; should be $BE80 -cout = $FDED ; character out sub -crout = $FD8E ; CR out sub -prbyte = $FDDA -warm = $FF69 ; back to monitor -tapein = $C060 +.include "apple2.inc" +.include "inflate.inc" +.include "fastload.inc" + +cout = COUT ; character out sub +crout = CROUT ; CR out sub +prbyte = PRBYTE ; print byte in hex +warm = MONZ ; back to monitor +tapein = TAPEIN ; read tape interface + pointer = $06 endbas = $80C ;target = $1000 target = $801 chksum = $00 -inflate = $BA00 -inf_zp = $0 +;inf_zp = $0 ; see inflate.inc start: .org endbas @@ -29,7 +32,7 @@ move2: lda moved+256,x bpl move2 ; only 128 bytes to move jmp fast moved: - .org org + .org fastload_org fast: lda #<loadm ldy #>loadm @@ -132,21 +135,21 @@ inf: jsr print lda inf_src ;src lsb - sta inf_zp+0 + sta inflate_zp+0 lda inf_src+1 ;src msb - sta inf_zp+1 + sta inflate_zp+1 lda inf_dst ;dst lsb - sta inf_zp+2 + sta inflate_zp+2 lda inf_dst+1 ;dst msb - sta inf_zp+3 + sta inflate_zp+3 jsr inflate lda inf_end ;dst end +1 lsb - cmp inf_zp+2 + cmp inflate_zp+2 bne error lda inf_end+1 ;dst end +1 msb - cmp inf_zp+3 + cmp inflate_zp+3 bne error runit: lda warm_flag ; if warm_flag = 1 warm boot diff --git a/asm/fastloadcd.s b/asm/fastloadcd.s index 9d4db18..adf2965 100644 --- a/asm/fastloadcd.s +++ b/asm/fastloadcd.s @@ -1,18 +1,21 @@ ;fastloadcd.s -org = $BE80 ; should be $BE80 -cout = $FDED ; character out sub -crout = $FD8E ; CR out sub -prbyte = $FDDA -warm = $FF69 ; back to monitor -tapein = $C060 +.include "apple2.inc" +.include "inflate.inc" +.include "fastload.inc" + +cout = COUT ; character out sub +crout = CROUT ; CR out sub +prbyte = PRBYTE ; print byte in hex +warm = MONZ ; back to monitor +tapein = TAPEIN ; read tape interface + pointer = $06 endbas = $80C ;target = $1000 target = $801 chksum = $00 -inflate = $BA00 -inf_zp = $0 +;inf_zp = $0 ; see inflate.inc start: .org endbas @@ -29,7 +32,7 @@ move2: lda moved+256,x bpl move2 ; only 128 bytes to move jmp fast moved: - .org org + .org fastload_org fast: lda #<loadm ldy #>loadm @@ -134,21 +137,21 @@ inf: jsr print lda inf_src ;src lsb - sta inf_zp+0 + sta inflate_zp+0 lda inf_src+1 ;src msb - sta inf_zp+1 + sta inflate_zp+1 lda inf_dst ;dst lsb - sta inf_zp+2 + sta inflate_zp+2 lda inf_dst+1 ;dst msb - sta inf_zp+3 + sta inflate_zp+3 jsr inflate lda inf_end ;dst end +1 lsb - cmp inf_zp+2 + cmp inflate_zp+2 bne error lda inf_end+1 ;dst end +1 msb - cmp inf_zp+3 + cmp inflate_zp+3 bne error runit: lda warm_flag ; if warm_flag = 1 warm boot diff --git a/asm/formrite.inc b/asm/formrite.inc new file mode 100644 index 0000000..be3f61e --- /dev/null +++ b/asm/formrite.inc @@ -0,0 +1,502 @@ +; formrite.s +; Format tracks with final data in one pass. +; Much of this code is adapted from DOS 3.3 RWTS. + +; zero page parameters +inptr = frtinp ; input pointer (reuses diskload1 space) +outptr = frtoutp ; output pointer (reuses diskload1 space) + +hibptr = RWTSTMP3 ; HI nibble output ptr (work register; reuses DOS scratch regs) +lobptr = RWTSDCTPTR ; LO nibble output ptr (work register; reuses DOS DCT ptr) +tmpreg1 = RWTSTMP1 ; scratch register 1 (reuses DOS scratch reg) +tmpreg2 = RWTSTMP2 ; scratch register 2 (reuses DOS scratch reg) + +rwtsiobp= RWTSIOBPTR ; RWTS standard IOB pointer; reused +;isecpad= RWTSSECPAD ; Inter-sector sync padding size while RWTS is formatting (aka gap 3) + ; NB: Padding is (mostly) determined during track 0 format and + ; must be preserved track to track. It *might* be subsequently + ; reduced by other tracks (i.e. drive speed changes). + +; other vars +lonbuf = DOSNIBLOBUF ; LO nibble encoding space (RWTS secondary buffer; safe to use) + + +; * Nibblize a track worth of data. Converts 16 secors to encoded +; * HI/LO nibble buffers semi-ready for writing to disk. +; * HI buffers: outptr, $1000 bytes (16 sectors, $100 each) +; * LO buffers: outptr + $1000, $800 bytes (16 sectors, $80 each) +; * In: inptr=data pointer; outptr=HI/LO buffers pointer +; * Out: nothing +; * Destroys: A,X,Y,flags,inptr +.proc nibbtrack + lda #0 + sta hibptr ; buffer ptr LSB (assume page-aligned) + sta tmpreg1 ; encode sectors 0-15 + +secloop: + tax ; sector index + lda DOSINTLTBL,x ; xlat logical sector# to disk sector + sta tmpreg2 ; disk sector# + clc ; hibptr = outptr + sector# * $100 + adc outptr+1 ; calc HI buf output MSB + sta hibptr+1 ; store HI buf output MSB + + lda #2 ; lobptr = outptr + $1000 + sector# * $80 + 1 + ; NB: +1 so that disk writing code does not cross page boundaries + sta lobptr ; 2 -> LO buffer ptr LSB (will be shifted by 1) + lda tmpreg2 ; disk sector# + lsr a ; A=sector# / 2; odd sector# -> carry + ror lobptr ; odd sector# -> $80 LSB; carry=0 after + adc #16 ; A = $10 (LO offset) + sector# / 2 + adc outptr+1 ; A = outptr MSB + $10 + sector# / 2 + sta lobptr+1 ; store LO buf output MSB + + jsr nibbsector ; nibblize sector + + inc inptr+1 ; next sector page + inc tmpreg1 + lda tmpreg1 + cmp #16 ; 0-15 done? + bcc secloop ; ... more to go + rts +.endproc + +; * Nibblize sector routine. Converts 256 bytes of data to encoded 6-bit +; * HI/LO nibble buffers semi-ready for writing to disk. +; * In: inptr=data; hibptr=HI buffer pointer; lobptr=LO buffer pointer +; * Out: nothing +; * Destroys: A,X,Y,flags,RWTS LO buffer +.proc nibbsector + ; split 256 data bytes into HI bits ($100 bytes) and LO bits ($56 bytes) + ; two low bits are shifted out from each of the data bytes and shifted into + ; the circular LO buffer. + ; resulting data is nibblized 6 bits per byte ($00..3F) + ldx #0 ; secondary buffer index + ldy #2 ; user data index. start with data byte $01 (y immediately decremented). + ; mind-bending trick: $56*3=102, starving the secondary buffer by 2*2 bits. + ; to use all of the secondary buffer bits, and make disk nybble encoding deterministic + ; (one to one with data), lower bit pairs of data bytes $00.01 are shifted into secondary buffer twice. + ; the first of the two shifted bit pairs is never used when reading. +splitloop: + dey ; proceed backwards; $01, $00, $ff, $fe... + lda (inptr),y ; get next data byte + lsr a ; lower bit -> carry + rol lonbuf,x ; carry -> LO buffer + lsr a ; lower bit -> carry + rol lonbuf,x ; carry -> LO buffer + sta (hibptr),y ; 6 upper bits -> HI buffer + inx ; next LO index + cpx #$56 ; circular; rolls over $56 -> $00 + bcc splitloop ; ... not yet + ldx #0 ; continue LO bits from start + tya ; until indexes line up: x=y=0 + bne splitloop ; ... not yet + + ; $3F mask pass over the LO buffer + ; discard 2 upper bits from LO buffer (because it was not inited) + ; and tranfer to the output + ldy #$55 ; LO buf index, $55..00 +maskloop: + lda lonbuf,y + and #$3F ; clear 2 upper bits + sta (lobptr),y ; and store in the output + dey ; next nibble + bpl maskloop ; while y>=0 + + rts +.endproc + + +; * Track formriting entry point. Writes an entire track while formatting it. +; * In: A/Y=IOB pointer (like RWTS); IOB::bufptr=nibblized track data (see nibbtrack) +; * Out: carry 0=ok, 1=error +; * Destroys: A,X,Y,flags,several DOS ZP locations +.proc formritep + php ; save flags + sei ; .. and disable interrupts + jsr formrite_act ; call actual + bcs failure +success: + plp ; restore flags, incl. interrupts + clc ; 0 -> carry, success + rts +failure: + plp ; restore flags, incl. interrupts + sec ; 1 -> carry, failure + rts +.endproc + +; * Track formriting actual. Do not call directly. See formritep. +; * Sets up DOS ZP vars like standard RWTS. +; * Out: carry 0=ok, 1=error +; * Destroys: everything; sets drive on fire +.proc formrite_act + sty rwtsiobp ; store passed in + sta rwtsiobp+1 ; .. IOB pointer + ldy #IOB::slotio ; slot I/O offset: slot# * $10 + lda (rwtsiobp),y ; get slot I/O offset + tax + + ; not necessary atm + ;stx RWTSSLOTIO1 ; save slot I/O offset in temp + + ; here, assume that slot/drive switching, volume, motor spin-up delay, etc, + ; were all taken care of by the prior RWTS seek call. + ; just verify it is still the same slot. + ldy #IOB::lstslot ; last-accessed slot I/O offset + cmp (rwtsiobp),y + beq slotok ; same slot, good to go + + lda #$20 ; pretend it is a volume mismatch + bne failure ; (always) go fail + +slotok: + lda motoron,x ; keep motor on + + ; for safety, check the command + ldy #IOB::command ; command in IOB + lda (rwtsiobp),y ; get the command + cmp #IOBCMD::frmrite + beq frmrcmd ; yep, go ahead + + lda #$08 ; init error + bne failure ; (always) go fail + +frmrcmd: + jsr formtrack ; go formrite! + lda #$08 ; init error (speculative) + bcs failure ; fail when error (carry=1) +success: + clc ; all good + bcc return ; go return ok +failure: + sec ; error indicator + ldy #IOB::result + sta (rwtsiobp),y ; return error code +return: + lda motoroff,x ; turn motor off, done + rts +.endproc ; formrite_act + + +; * Track formriting routine. Writes an entire track while formatting it. +; * This is a modified DOS 3.3 RWTS track format routine ($BF0D). +; * In: Standard RWTS IOB; X=slot I/O offset +; * IOB::bufptr=nibblized track data (see nibbtrack) +; * Out: carry 0=ok, 1=error +; * Modifies: $45 (RWTSSECPAD) +; * Destroys: A,Y,flags,$27,$3E,$3F,$41,$44 +.proc formtrack + ; init volume/track/sector values needed by DOSWRSECADR routine + ldy #IOB::volnum ; volume# in IOB + lda (rwtsiobp),y ; get volume# requested + sta RWTSWRVOLN ; store volume# for write proc (NB: DOSWRSECADR needs this) + + ldy #IOB::trknum ; track# in IOB + lda (rwtsiobp),y ; get track# requested + sta RWTSWRTRKN ; store track# for write proc (NB: DOSWRSECADR needs this) + bne nextgap1 ; when not track 0, leave the inter-sector padding alone + + lda #40 ; initial inter-sector sync padding; will be reduced in case of overrun + sta RWTSSECPAD ; store initial inter-sector sync padding + ; (determined mostly during track 0 format; might be reduced by other tracks) +nextgap1: + lda #0 + sta RWTSWRSECN ; 0 -> current sector# (NB: DOSWRSECADR needs this) + + ; initialize the HI/LO buffer pointers + sta hibptr ; 0 -> HI ptr LSB (assume page-aligned) + sta lobptr ; 0 -> LO ptr LSB (starts page-aligned) + ldy #IOB::bufptr+1 ; nybblized track data MSB + lda (rwtsiobp),y ; get track data MSB + sta hibptr+1 ; HI ptr MSB (starts at buffer) + clc + adc #16 ; A = data MSB + $10 (LO offset) + sta lobptr+1 ; LO ptr MSB (data + $1000) + + lda #$AA ; sector address even mask + sta RWTSTMP8 ; even mask ($AA) -> $3E + ; NB: DOSWRSECADR needs this to make ORA a 3-cycle instruction + + ; TODO: write 200+ sync nybbles for slower drives? Should be safe to do so. + ldy #128 ; initial 129 sync/AGC nybbles (gap 1), mostly overwritten by last sector + bne initgap1 ; (always) gap 1 padding + +secloop: + ; DOS timing spec: + ; * 67=32+32+3 cycles from last sector addr outro nybble to first data sync nybble + ; * 67=32+32+3 cycles from last sector data outro nybble to first inter-sector sync nybble + ; For timing accuracy, secloop should not cross page boundaries. + ; NB: here, wrsecdata has advanced the HI/LO buffer pointers for next sector + + ldy RWTSSECPAD ; 3 - get current inter-sector padding +initgap1: + ; now: +47 cycles from sector data outro nybble + jsr DOSWRSECADR ; 6 - write gap (Y+1 sync nybbles), then sector address + ; NB: performs write-prot check. + ; now: +31 cycles from last outro nybble + bcs return ; 2 (ok); bail when carry=1 (error) + jsr wrsecdata ; 6 - write 5 sync nybbles, then nybblized sector data + ; now: +29 cycles from last outro nybble + bcs return ; 2 (ok); bail when carry=1 (error) + inc RWTSWRSECN ; 5 - next sector + lda RWTSWRSECN ; 3 - current sector# + cmp #16 ; 2 - all sectors done? + bcc secloop ; 3 - not yet, do next +endsecloop: + + ldy #15 ; reset sector counter for verify + sty RWTSWRSECN ; sector count to verify + + lda #48 ; standard number of attempts + sta RWTSRETRIES + +clrvfyloop: ; clear sector verify table + sta DOSVFYTBL,y ; clear sector + dey + bpl clrvfyloop ; until Y<0 + + ; ensure padding between sectors 15 and 0 (gap 1) is of sufficient size -- + ; bigger than inter-sector (gap 3) + ; XXX: I do not know why DOS insists that the gap between sectors 15 and 0 + ; must be 25% larger than the rest. Perhaps some timing requirement for inter-leave? + ldy RWTSSECPAD ; wait padding * 50 cycles +waitgap1: + jsr return ; 12 - waste time + jsr return ; 12 - waste time + jsr return ; 12 - waste time + pha ; 3 - waste time + pla ; 4 - waste time + nop ; 2 - waste time + dey ; 2 - count + bne waitgap1 ; 3 - branch; 50 cycles * sector spacing + + jsr DOSRDSECADR ; find next sector address + bcs findsec15 ; not found in time; try sector 15 + lda RWTSRDSECN ; sector addr found; get sector# + beq foundsec ; found sector 0; not overrun and in good location; good gap size + lda #16 + cmp RWTSSECPAD ; carry=0 when padding > 16 + lda RWTSSECPAD + sbc #1 ; reduce padding by 2 when > 16, otherwise by 1 + sta RWTSSECPAD ; save new padding size + cmp #5 ; when padding <= 5 ... + bcs findsec15 ; (padding >= 5: ok) + sec ; ... fail format + rts + +vfysecloop: ; verify all 15 sectors + jsr DOSRDSECADR ; find and read next sector addr + bcs nextsec +foundsec: ; sector addr found, check data + jsr DOSRDSECDAT ; verify sector data + bcc goodsec ; good, go mark it +nextsec: ; keep trying + dec RWTSRETRIES ; until retries exceeded + bne vfysecloop +findsec15: ; locate sector 15 + jsr DOSRDSECADR ; find and read next sector addr + bcs retry15 + lda RWTSRDSECN ; which sector# did we find? + cmp #15 ; is it sector 15? + bne retry15 + jsr DOSRDSECDAT ; verify sector data + bcs retry15 ; could not read, retry + + jmp nextgap1 ; sector 15 is good; padding was too large -- redo + ; (padding was already adjusted) +retry15: ; retry locating sector 15 + dec RWTSRETRIES + bne findsec15 ; until retries exceeded + sec ; indicate error +return: + rts +goodsec: + ldy RWTSRDSECN ; last found sector# (from sec addr) + lda DOSVFYTBL,y ; did we find it once before? + bmi nextsec ; found it before; does not count + lda #$FF ; sector verified flag + sta DOSVFYTBL,y ; mark sector verified + dec RWTSWRSECN ; one less sector to verify + bpl vfysecloop ; until all 16 sectors are found + + ; see if we need to adjust the inter-sector padding + lda RWTSWRTRKN ; current track# + bne success ; not track 0; do not mess with padding + lda RWTSSECPAD ; current inter-sector sync padding + cmp #16 ; NB: formatting track 0 (mostly) determines the sector spacing + ; (inter-sector padding) for the entire disk. + bcc return ; When the experimentally-picked padding is less than 16 nybbles + ; (rpms too high), keep it as is. (carry=0 - return ok) + dec RWTSSECPAD ; When >=16, reduce the padding by 2. + dec RWTSSECPAD ; .. just in case, because it is safe to do so. +success: + clc ; all good + rts +.assert >(endsecloop-1) = >(secloop), warning, "formtrack.secloop should not cross page boundaries" +.endproc ; formtrack + + +; * Write nibblized sector data routine. +; * (!) Time-critical; MUST NOT cross page boundaries. +; * This is a modified DOS 3.3 RWTS sector data write routine ($B82A). +; * In: Standard DOS RWTS tables; hibptr/lobptr setup; X=slot I/O offset +; * Out: carry 0=ok, 1=error +; * Modifies: hibptr/lobptr pointers +; * Destroys: A,Y,flags,$27 +; alternative 1: .align $100 ; do not cross page boundaries +; alternative 2: .org diskload2_org + $600 ; force page alignment + .res <($100-(<*)) ; ca65 ".align $100" without silly warnings +.proc wrsecdata + ; DOS spec: +39 cycles since last sector address nybble write + sec ; 2 - preemptive error indicator + stx RWTSTMP2 ; 3 - save I/O offset for later 3-cycle reload + + lda wrshifter,x ; 4 - write-prot test + lda wrprot,x ; 4 - read write-prot; sequencer to idle + bpl wrtok ; 3 (branch); ok to write + jmp return ; abort on write-prot (BMI cannot reach it now) + +wrtok: + ; hack to reproduce the number of silence cycles between sectors per DOS spec: + ; use time-wasted code locations to copy pointers + lda lobptr ; 3 - waste time + lda lobptr ; 3 - copy LO buf ptr LSB + sta loa1+1 ; 4 - .. to abs access location + + ; write 5 auto-sync nybbles + ; auto-sync nybbles are $FF (32 cycles) followed by two 0 bits (8 cycles) + lda #$FF ; 2 - (sync/AGC-norm nybble) + sta wrreq,x ; 5 - write mode; load shifter + ; ([!] 67=32+32+3 cycles since last sector address outro nybble; DOS spec) + ora sequencer,x ; 4 - shift out (A=FF; ORA only effects N/Z flags) + + ; use time-wasted code locations to copy pointers (hack) + lda lobptr+1 ; 3 - copy LO buf ptr MSB + sta loa1+2 ; 4 - .. to abs access location + lda #$FF ; 2 - reload sync nybble + + ldy #4 ; 2 - (4 more sync nybbles) +syncloop: + jsr wr14nyb15 ; 35=6+14+15 - write sync nybble + ; (32+8 cycles to/per sync nybble) + dey ; 2 - next sync nybble + bne syncloop ; 3 (branch) or 2 (fall through) + + ; use time-wasted code locations to copy pointers (hack) + lda hibptr+1 ; 3 - copy HI buf ptr MSB + sta hia1+2 ; 4 - .. to abs access location + + ; write sector data intro sequence + lda #$D5 ; 2 - intro nybble + jsr wr2nyb15 ; 23=6+2+15 - write intro nybble + ; [!] (32+4 cycles to first intro nybble; DOS spec) + lda #$AA ; 2 - intro nybble + jsr wr9nyb15 ; 30=6+9+15 - write intro nybble + ; (32 cycles to nybble) + lda #$AD ; 2 - intro nybble + jsr wr9nyb15 ; 30=6+9+15 - write intro nybble + ; (32 cycles to nybble) + + ; write LO buffer; $56 nybbles + ; the buffers were pre-nibblized by nibbsector. + tya ; 2 - A=0, EOR chain seed + ldy #$56 ; 2 - $56 LO nybbles + ; now: +19 cycles from intro nybble + + ; NB: this wait is now artificial to reproduce [+4] DOS spec. + ; disks would work fine without it (with perfect 32-cycle) + nop ; 2 - waste time (for +4 nybble DOS spec) + nop ; 2 - waste time (for +4 nybble DOS spec) + +lonloop: ; (loop: +19 cycles from nybble) +loa1: eor $2000,y ; 4 (no page cross) - chain to next LO nibble + ; XXX: the address will be patched (code above) + tax ; 2 + lda DOSENYBTBL,x ; 4 - 6-bit -> disk nybble + ldx RWTSTMP2 ; 3 - reload I/O offset + sta wrshifter,x ; 5 - load for write + ; [!] (32+4 cycles to first data nybble; DOS spec) + ; (32 cycles per nybble) + lda sequencer,x ; 4 - shift out + lda (lobptr),y ; 5 (no page cross) - get current LO nibble + dey ; 2 - next, in reverse order + bne lonloop ; 3 (branch) or 2 (fall through) + + ; write HI buffer; $100 nybbles; last nybble is checksum + ; the buffers were pre-encoded for disk by nybbsector. +hinloop: ; (loop: +18 cycles from nybble) + eor (hibptr),y ; 5 (no page cross) - chain to next HI nibble + tax ; 2 + lda DOSENYBTBL,x ; 4 - 6-bit -> disk nybble + ldx RWTSTMP2 ; 3 - reload I/O offset + sta wrshifter,x ; 5 - load for write + ; (32 cycles to/per nybble) + lda sequencer,x ; 4 - shift out +hia1: lda $1000,y ; 4 (no page cross) - get current HI nibble + ; XXX: the address will be patched (code above) + iny ; 2 - next, in forward order + bne hinloop ; 3 (branch) or 2 (fall through) + + ; write data checksum + tax ; 2 - checksum to index + lda DOSENYBTBL,x ; 4 - 6-bit -> disk nybble + ldx RWTSTMP2 ; 3 - reload I/O offset (X was destroyed) + jsr wr0nyb15 ; 21=6+0+15 - write checksum nybble + ; (32 cycles to nybble) + + ; NB: at this point, the HI/LO pointers have served their purpose + ; and can now be staged for the next sector + ; use time-wasted code locations to advance pointers (constant-time math) + inc hibptr+1 ; 5 - next sector HI page + lda lobptr ; 3 - get LO ptr LSB + tay ; 2 - .. and stash in Y (now free) + eor #$80 ; 2 - advance one half page + sta lobptr ; 3 - LO ptr LSB += $80 + + ; write sector data outro sequence + lda #$DE ; 2 - outro nybble + sta wrshifter,x ; 5 - load for write + ; (32 cycles to nybble) + lda sequencer,x ; 4 - shift out + + ; use time-wasted code locations to advance pointers (constant-time math) + tya ; 2 - unstash old LO ptr LSB + asl a ; 2 - $80 -> carry, 0 -> A + adc lobptr+1 ; 3 - A = LO ptr MSB + carry + sta lobptr+1 ; 3 - LO ptr MSB += carry + + lda #$AA ; 2 - outro nybble + jsr wr5nyb15 ; 26=6+5+15 - write outro nybble + ; (32 cycles to nybble) + lda #$EB ; 2 - outro nybble + jsr wr9nyb15 ; 30=6+9+15 - write outro nybble + ; (32 cycles to nybble) + lda #$FF ; 2 - post-outro sync nybble + jsr wr9nyb15 ; 30=6+9+15 - write outro sync nybble + ; (32 cycles to nybble) + + lda rdmode,x ; 4 - read mode; sequencer to idle + +return: + lda sequencer,x ; 4 - reset shifter + rts ; 6 + +wr14nyb15: + clc ; 2 - waste time + clear carry for BCC + bcc wr9nyb15 ; 3 - branch +wr9nyb15: + clc ; 2 - waste time / ok for last write and rts +wr7nyb15: + nop ; 2 - waste time +wr5nyb15: + bit $FF ; 3 - waste time; kills N/Z/V flags +wr2nyb15: + nop ; 2 - waste time +wr0nyb15: + sta wrshifter,x ; 5 - load for write + ora sequencer,x ; 4 - shift out; + ; NB: opcode sets N/Z flags depending on loaded value; + rts ; 6 +.endproc ; wrsecdata +.assert >(*-1) = >wrsecdata, warning, "wrsecdata routine is time-critical and must not cross page boundaries" diff --git a/asm/inflate.inc b/asm/inflate.inc new file mode 100644 index 0000000..b15ff63 --- /dev/null +++ b/asm/inflate.inc @@ -0,0 +1,11 @@ +; inflate.inc +; Autoload Inflate object config + +autoload3_org = $BA00 ; origin, should be $BA00 for now +autoload3_zp = $0 + +;--END-OF-H ; ends C header file + +inflate = autoload3_org +inflate_zp = autoload3_zp +inflate_data = $BC00 diff --git a/asm/inflate.s b/asm/inflate.s index fe81ff4..36a21d0 100644 --- a/asm/inflate.s +++ b/asm/inflate.s @@ -15,13 +15,11 @@ ; changes +.include "inflate.inc" + ;EFF .define equ = -inflate = $BA00 -inflate_zp = $0 -inflate_data = $BC00 - ; Pointer to compressed data inputPointer equ inflate_zp ; 2 bytes diff --git a/bin/c2t b/bin/c2t deleted file mode 100755 index e9f1600..0000000 Binary files a/bin/c2t and /dev/null differ diff --git a/bin/c2t-96h b/bin/c2t-96h deleted file mode 100755 index 900a285..0000000 Binary files a/bin/c2t-96h and /dev/null differ diff --git a/bin/c2t-96h.exe b/bin/c2t-96h.exe index 7956720..255ab9c 100755 Binary files a/bin/c2t-96h.exe and b/bin/c2t-96h.exe differ diff --git a/bin/c2t.exe b/bin/c2t.exe index 112ee32..fbc5f72 100755 Binary files a/bin/c2t.exe and b/bin/c2t.exe differ diff --git a/c2t-96h.c b/c2t-96h.c index edb09c3..44755a8 100644 --- a/c2t-96h.c +++ b/c2t-96h.c @@ -321,11 +321,15 @@ int main(int argc, char **argv) inputtype = DSK; } -//TODO: Windows needs "rb", check UNIX/Linux - - if ((ifp = fopen(segments[numseg].filename, "rb")) == NULL) { - fprintf(stderr,"Cannot read: %s\n\n",segments[numseg].filename); - return 1; + { + const char* mode = "r"; + // Windows needs "b" for binary files; Linux/BSD will simply ignore "b" (see fopen(3)) + if(inputtype != MONITOR) + mode = "rb"; + if ((ifp = fopen(segments[numseg].filename, mode)) == NULL) { + fprintf(stderr,"Cannot read: %s\n\n",segments[numseg].filename); + return 1; + } } fprintf(stderr,"Reading %s, type %s, segment %d, start: ",segments[numseg].filename,filetypes[inputtype],numseg+1); @@ -364,7 +368,7 @@ int main(int argc, char **argv) int j, k, l; //segments[numseg].start=i*(140 * 1024 / 5); - segments[numseg].start=0x1000; + segments[numseg].start = diskload2_data; /* old version while(fread(&b, 1, 1, ifp) == 1 && segments[numseg].length < (140 * 1024 / 5)) @@ -546,7 +550,11 @@ int main(int argc, char **argv) ofp=stdout; if(fileoutput) { - if ((ofp = fopen(OUTFILE, "w")) == NULL) { + const char* mode = "w"; + // Windows needs "b" for binary files; Linux/BSD will simply ignore "b" (see fopen(3)) + if(outputtype == AIFF || outputtype == WAVE) + mode = "wb"; + if ((ofp = fopen(OUTFILE, mode)) == NULL) { fprintf(stderr,"\nCannot write: %s\n\n",OUTFILE); return 1; } @@ -692,6 +700,7 @@ int main(int argc, char **argv) unsigned long cmp_ones=0, cmp_zeros=0; double inflate_time = 0; unsigned int endj; + const unsigned int simaddr = 0xBF00; cmp_data = tdefl_compress_mem_to_heap(segments[0].data, segments[0].length, &cmp_len, TDEFL_MAX_PROBES_MASK); @@ -719,33 +728,41 @@ int main(int argc, char **argv) } //compute inflate time + const unsigned int dataorg = autoload3_org - cmp_len; //load up inflate data checksum = 0xff; for(j=0;j<cmp_len;j++) { - ram[0xBA00 - cmp_len + j] = cmp_data[j]; + ram[dataorg + j] = cmp_data[j]; checksum ^= cmp_data[j]; } //load up inflate code for(j=0;j<sizeof(inflatecode)/sizeof(char);j++) { - ram[0xBA00 + j] = inflatecode[j]; + ram[autoload3_org + j] = inflatecode[j]; checksum ^= inflatecode[j]; } - ram[0xBA00 + j] = checksum; - endj = 0xBA00 + j + 1; + ram[autoload3_org + j] = checksum; + endj = autoload3_org + j + 1; if(k8) { - for(j=(0x823 - 0x80C);j<sizeof(fastload8000)/sizeof(char);j++) - ram[0xBE80 - (0x823 - 0x80C) + j] = fastload8000[j]; - ram[0xBE80 - (0x823 - 0x80C) + j++] = (0xBA00 - cmp_len) & 0xFF; - ram[0xBE80 - (0x823 - 0x80C) + j++] = (0xBA00 - cmp_len) >> 8; - ram[0xBE80 - (0x823 - 0x80C) + j++] = endj & 0xFF; - ram[0xBE80 - (0x823 - 0x80C) + j++] = endj >> 8; - ram[0x00] = 0xFF; - ram[0xBF09] = 0x00; //BRK + const unsigned int flmofs = 0x823 /*moved:*/ - 0x80C /*move:*/; + for(j=flmofs;j<sizeof(fastload8000)/sizeof(char);j++) + ram[fastload_org - flmofs + j] = fastload8000[j]; + ram[fastload_org - flmofs + j++] = dataorg & 0xFF; + ram[fastload_org - flmofs + j++] = dataorg >> 8; + ram[fastload_org - flmofs + j++] = endj & 0xFF; + ram[fastload_org - flmofs + j++] = endj >> 8; + ram[0x00] = 0xFF; // chksum initial value + + if(ram[fastload_org + 0x008D] != 0xA5 /*LDA zp*/) + fprintf(stderr,"WARNING: unexpected opcode ($%02X) at 0x%04X. Verify fastload8000 object\n",ram[fastload_org+0x008D],fastload_org+0x008D); + ram[fastload_org + 0x008D] = 0x00; // BRK @ LDA $00 [chksum] + + if(ram[fastload_org + 0x0063] != 0xA9 /*LDA #imm*/) + fprintf(stderr,"WARNING: unexpected opcode ($%02X) at 0x%04X. Verify fastload8000 object\n",ram[fastload_org+0x0063],fastload_org+0x0063); reset6502(); - exec6502(0xBEE3); + exec6502(fastload_org + 0x0063); // addr of sumcheck: LDA #0 if(ram[0x00] != 0) fprintf(stderr,"WARNING: simulated checksum failed: %02X\n",ram[0x00]); @@ -754,28 +771,28 @@ int main(int argc, char **argv) } //zero page src - ram[0x0] = (0xBA00 - cmp_len) & 0xFF; - ram[0x1] = (0xBA00 - cmp_len) >> 8; + ram[autoload3_zp + 0] = dataorg & 0xFF; + ram[autoload3_zp + 1] = dataorg >> 8; //zero page dst - ram[0x2] = (segments[0].start) & 0xFF; - ram[0x3] = (segments[0].start) >> 8; + ram[autoload3_zp + 2] = (segments[0].start) & 0xFF; + ram[autoload3_zp + 3] = (segments[0].start) >> 8; //setup JSR - ram[0xBF00] = 0x20; // JSR $9B00 - ram[0xBF01] = 0x00; - ram[0xBF02] = 0xBA; - ram[0xBF03] = 0x00; //BRK to stop simulation + ram[simaddr + 0] = 0x20; // JSR autoload3 inflate + ram[simaddr + 1] = autoload3_org & 0xFF; + ram[simaddr + 2] = autoload3_org >> 8; + ram[simaddr + 3] = 0x00; //BRK to stop simulation //run it reset6502(); - exec6502(0xBF00); + exec6502(simaddr); //compare (just to be safe) for(j=0;j<segments[0].length;j++) if(ram[segments[0].start + j] != segments[0].data[j]) { - fprintf(stderr,"WARNING: simulated inflate failed at %04X\n",j+0x1000); + fprintf(stderr,"WARNING: simulated inflate failed at %04X\n",segments[0].start+j); break; } inflate_time += clockticks6502/1023000.0; - fprintf(stderr,"start: 0x%04X, length: %5d, deflated: %.02f%%, data time:%.02f, inflate time:%.02f\n",(unsigned int)(0xB9FF - cmp_len),(unsigned int)cmp_len,100.0*(1-cmp_len/(float)segments[0].length),cmp_ones/(float)freq1 + cmp_zeros/(float)freq0,inflate_time); + fprintf(stderr,"start: 0x%04X, length: %5d, deflated: %.02f%%, data time:%.02f, inflate time:%.02f\n",dataorg,(unsigned int)cmp_len,100.0*(1-cmp_len/(float)segments[0].length),cmp_ones/(float)freq1 + cmp_zeros/(float)freq0,inflate_time); if((ones/(float)freq1 + zeros/(float)freq0) < inflate_time + (cmp_ones/(float)freq1 + cmp_zeros/(float)freq0)) { fprintf(stderr,"WARNING: compression disabled: no significant gain (%.02f)\n",ones/(float)freq1 + zeros/(float)freq0); @@ -860,7 +877,7 @@ int main(int argc, char **argv) // write out move and load code if(compress) { - unsigned int cmp_start = 0xBA00 - segments[0].length; + unsigned int cmp_start = autoload3_org - segments[0].length; //load start table[0] = cmp_start & 0xff; @@ -1124,8 +1141,9 @@ int main(int argc, char **argv) } } - // compute pad length, assuming 4 pages max for code - zeros += 8*(4 * 256 - sizeof(diskloadcode2)/sizeof(char)); + // compute pad length; pad to end of last page + // XXX: This ignores the trailing infdata table appended later; not a problem for time estimates + zeros += 8*(((sizeof(diskloadcode2)/sizeof(char) + 0xFF) & 0xFF00) - sizeof(diskloadcode2)/sizeof(char)); for(j=0;j<sizeof(diskloadcode3)/sizeof(char);j++) { byte=diskloadcode3[j]; @@ -1138,19 +1156,8 @@ int main(int argc, char **argv) } } - for(j=0;j<sizeof(dosboot1)/sizeof(char);j++) { - byte=dosboot1[j]; - for(i=0;i<8;i++) { - if(byte & 0x80) - ones++; - else - zeros++; - byte <<= 1; - } - } - - for(j=0;j<sizeof(dosboot2)/sizeof(char);j++) { - byte=dosboot2[j]; + for(j=0;j<sizeof(dosrwts)/sizeof(char);j++) { + byte=dosrwts[j]; for(i=0;i<8;i++) { if(byte & 0x80) ones++; @@ -1227,11 +1234,8 @@ int main(int argc, char **argv) appendtone(&buf,6000,0.25,0); } + // reset checksum for stage 2 checksum = 0xff; - for(i=0;i<sizeof(dosboot1)/sizeof(char);i++) { - WRITEBYTE(dosboot1[i]); - checksum ^= dosboot1[i]; - } // time to compress and compute start location and length // patch loadcode2 with start locations and ETA @@ -1239,74 +1243,82 @@ int main(int argc, char **argv) int k, err; double orig_len; unsigned char checksum=0xff; + const unsigned int dataend = diskload1_org; // cmp data loaded just below diskload1 object + const unsigned int datachkaddr = dataend - 1; // loaded chksum location inflate_times[i] = 0; cmp_data = tdefl_compress_mem_to_heap(segments[i].data, segments[i].length, &cmp_len, TDEFL_MAX_PROBES_MASK); //compute inflate time + const unsigned int dataorg = datachkaddr - cmp_len; //load up inflate code for(j=0;j<sizeof(diskloadcode3)/sizeof(char);j++) - ram[0x9B00 + j] = diskloadcode3[j]; + ram[diskload3_org + j] = diskloadcode3[j]; //load up inflate data for(j=0;j<cmp_len;j++) { - ram[0x8FFF - cmp_len + j] = cmp_data[j]; + ram[dataorg + j] = cmp_data[j]; checksum ^= cmp_data[j]; } - ram[0x8FFF] = checksum; + ram[dataorg + j] = checksum; //compute chksum time if(k8) { - for(j=(0x859 - 0x80C);j<diskloadcode_len;j++) - ram[0x9000 - (0x859 - 0x80C) + j] = diskloadcode[j]; - ram[0x00] = (0x8FFF - cmp_len) & 0xFF; - ram[0x01] = (0x8FFF - cmp_len) >> 8; - ram[0x02] = 0x00; - ram[0x03] = 0x90; - ram[0x04] = 0xFF; - ram[0x9089] = 0x85; //STA - ram[0x908A] = 0x04; //zero page $04 - ram[0x908B] = 0x00; //BRK + const unsigned int dlmofs = 0x859 /*moved:*/ - 0x80C /*move:*/; + for(j=dlmofs;j<diskloadcode_len;j++) + ram[diskload1_org - dlmofs + j] = diskloadcode[j]; + ram[diskload1_zp + 0] = dataorg & 0xFF; + ram[diskload1_zp + 1] = dataorg >> 8; + ram[diskload1_zp + 2] = dataend & 0xFF; + ram[diskload1_zp + 3] = dataend >> 8; + ram[diskload1_zp + 4] = 0xFF; // chksum initial value + + if(ram[diskload1_org + 0x008A] != 0xA5 /*LDA zp*/) + fprintf(stderr,"WARNING: unexpected opcode ($%02X) at 0x%04X. Verify diskload8000 object\n",ram[diskload1_org+0x008A],diskload1_org+0x008A); + ram[diskload1_org + 0x008A] = 0x00; // BRK @ LDA $04 [chksum] + + if(ram[diskload1_org + 0x0065] != 0xA9 /*LDA #imm*/) + fprintf(stderr,"WARNING: unexpected opcode ($%02X) at 0x%04X. Verify diskload8000 object\n",ram[diskload1_org+0x0065],diskload1_org+0x0065); reset6502(); - exec6502(0x9065); + exec6502(diskload1_org + 0x0065); // addr of LDA #0 below sumcheck: - if(ram[0x04] != 0) + if(ram[diskload1_zp + 4] != 0) fprintf(stderr,"WARNING: simulated checksum failed: %02X\n",ram[0x04]); inflate_times[i] += clockticks6502/1023000.0; } //zero page src - ram[0x10] = (0x8FFF - cmp_len) & 0xFF; - ram[0x11] = (0x8FFF - cmp_len) >> 8; + ram[diskload3_zp + 0] = dataorg & 0xFF; + ram[diskload3_zp + 1] = dataorg >> 8; //zero page dst - ram[0x12] = 0x00; - ram[0x13] = 0x10; - //setup JSR - ram[0x9000] = 0x20; // JSR $9B00 - ram[0x9001] = 0x00; - ram[0x9002] = 0x9B; - ram[0x9003] = 0x00; //BRK to stop simulation + ram[diskload3_zp + 2] = diskload2_data & 0xFF; + ram[diskload3_zp + 3] = diskload2_data >> 8; + //setup JSR (overwrites diskload1 object which is no longer needed) + ram[diskload1_org + 0] = 0x20; // JSR diskload3 inflate + ram[diskload1_org + 1] = diskload3_org & 0xFF; + ram[diskload1_org + 2] = diskload3_org >> 8; + ram[diskload1_org + 3] = 0x00; //BRK to stop simulation //run it reset6502(); - exec6502(0x9000); + exec6502(diskload1_org); //compare (just to be safe) err=0; for(j=0;j<7 * 4096;j++) - if(ram[0x1000 + j] != segments[i].data[j]) { + if(ram[diskload2_data + j] != segments[i].data[j]) { err = 1; break; } if(err) - fprintf(stderr,"WARNING: simulated inflate failed at %04X\n",j+0x1000); + fprintf(stderr,"WARNING: simulated inflate failed at %04X\n",diskload2_data+j); inflate_times[i] += clockticks6502/1023000.0; free(segments[i].data); segments[i].data = cmp_data; orig_len = segments[i].length; segments[i].length = cmp_len; - segments[i].start = 0x8FFF - segments[i].length; + segments[i].start = dataorg; // compress ? // need to see what is faster, defaulting to compress for now @@ -1358,7 +1370,9 @@ int main(int argc, char **argv) checksum ^= start_table[i]; } - for(i=0;i<4*256 - sizeof(diskloadcode2)/sizeof(char) - start_table_len;i++) { + // pad diskload2 to the end of last page + const int diskload2pad = ((sizeof(diskloadcode2)/sizeof(char) + start_table_len + 0xFF) & 0xFF00) - (sizeof(diskloadcode2)/sizeof(char) + start_table_len); + for(i=0;i<diskload2pad;i++) { WRITEBYTE(0x00); checksum ^= 0x00; } @@ -1368,9 +1382,9 @@ int main(int argc, char **argv) checksum ^= diskloadcode3[i]; } - for(i=0;i<sizeof(dosboot2)/sizeof(char);i++) { - WRITEBYTE(dosboot2[i]); - checksum ^= dosboot2[i]; + for(i=0;i<sizeof(dosrwts)/sizeof(char);i++) { + WRITEBYTE(dosrwts[i]); + checksum ^= dosrwts[i]; } WRITEBYTE(checksum); @@ -1387,15 +1401,8 @@ int main(int argc, char **argv) //appendtone(&buf,6000,1,0); //timing - if(i==0) { - if(!noformat) { - registerevent(events,buf.length,"Format Disk Delay (2000 Hz)"); - j=28; - } - else - j=0; - } - else { + j=0; + if(i>0) { //j = 6 + ceil(inflate_times[i-1]); // 6 = write track time, may need to make it 7 // disk ][ verified (format and no-format) // Virtual ][ emulator verified (format and no-format, 8K only) @@ -1410,8 +1417,13 @@ int main(int argc, char **argv) registerevent(events,buf.length,"Inflate + Write Delay (2000 Hz)"); } - if(i==1) // seek time for track 0, just in case - j+=2; + if(i==1) { + j+=2; // seek time for track 0, just in case + if (!noformat) { + registerevent(events,buf.length,"Format Track 0 Delay (2000 Hz)"); + j+=3; // track 0 format time; determines inter-sector padding + } + } /* count down code for(;j>=0;j--) { diff --git a/c2t.c b/c2t.c index 3a11ffa..40fbb33 100644 --- a/c2t.c +++ b/c2t.c @@ -266,11 +266,15 @@ int main(int argc, char **argv) if(strcmp(ext,"dsk") == 0) inputtype = DSK; -//TODO: Windows needs "rb", check UNIX/Linux - - if ((ifp = fopen(segments[numseg].filename, "rb")) == NULL) { - fprintf(stderr,"Cannot read: %s\n\n",segments[numseg].filename); - return 1; + { + const char* mode = "r"; + // Windows needs "b" for binary files; Linux/BSD will simply ignore "b" (see fopen(3)) + if(inputtype != MONITOR) + mode = "rb"; + if ((ifp = fopen(segments[numseg].filename, mode)) == NULL) { + fprintf(stderr,"Cannot read: %s\n\n",segments[numseg].filename); + return 1; + } } fprintf(stderr,"Reading %s, type %s, segment %d, start: ",segments[numseg].filename,filetypes[inputtype],numseg+1); @@ -287,7 +291,7 @@ int main(int argc, char **argv) segments[numseg].length = 0; for(i=0;i<5;i++) { //segments[numseg].start=i*(140 * 1024 / 5); - segments[numseg].start=0x1000; + segments[numseg].start = diskload2_data; while(fread(&b, 1, 1, ifp) == 1 && segments[numseg].length < (140 * 1024 / 5)) data[segments[numseg].length++]=b; @@ -457,7 +461,11 @@ int main(int argc, char **argv) ofp=stdout; if(fileoutput) { - if ((ofp = fopen(OUTFILE, "w")) == NULL) { + const char* mode = "w"; + // Windows needs "b" for binary files; Linux/BSD will simply ignore "b". + if(outputtype == AIFF || outputtype == WAVE) + mode = "wb"; + if ((ofp = fopen(OUTFILE, mode)) == NULL) { fprintf(stderr,"\nCannot write: %s\n\n",OUTFILE); return 1; } @@ -598,6 +606,7 @@ int main(int argc, char **argv) unsigned long cmp_ones=0, cmp_zeros=0; double inflate_time = 0; unsigned int endj; + const unsigned int simaddr = 0xBF00; cmp_data = tdefl_compress_mem_to_heap(segments[0].data, segments[0].length, &cmp_len, TDEFL_MAX_PROBES_MASK); @@ -625,33 +634,41 @@ int main(int argc, char **argv) } //compute inflate time + const unsigned int dataorg = autoload3_org - cmp_len; //load up inflate data checksum = 0xff; for(j=0;j<cmp_len;j++) { - ram[0xBA00 - cmp_len + j] = cmp_data[j]; + ram[dataorg + j] = cmp_data[j]; checksum ^= cmp_data[j]; } //load up inflate code for(j=0;j<sizeof(inflatecode)/sizeof(char);j++) { - ram[0xBA00 + j] = inflatecode[j]; + ram[autoload3_org + j] = inflatecode[j]; checksum ^= inflatecode[j]; } - ram[0xBA00 + j] = checksum; - endj = 0xBA00 + j + 1; + ram[autoload3_org + j] = checksum; + endj = autoload3_org + j + 1; if(k8) { - for(j=(0x823 - 0x80C);j<sizeof(fastload8000)/sizeof(char);j++) - ram[0xBE80 - (0x823 - 0x80C) + j] = fastload8000[j]; - ram[0xBE80 - (0x823 - 0x80C) + j++] = (0xBA00 - cmp_len) & 0xFF; - ram[0xBE80 - (0x823 - 0x80C) + j++] = (0xBA00 - cmp_len) >> 8; - ram[0xBE80 - (0x823 - 0x80C) + j++] = endj & 0xFF; - ram[0xBE80 - (0x823 - 0x80C) + j++] = endj >> 8; - ram[0x00] = 0xFF; - ram[0xBF09] = 0x00; //BRK - + const unsigned int flmofs = 0x823 /*moved:*/ - 0x80C /*move:*/; + for(j=flmofs;j<sizeof(fastload8000)/sizeof(char);j++) + ram[fastload_org - flmofs + j] = fastload8000[j]; + ram[fastload_org - flmofs + j++] = dataorg & 0xFF; + ram[fastload_org - flmofs + j++] = dataorg >> 8; + ram[fastload_org - flmofs + j++] = endj & 0xFF; + ram[fastload_org - flmofs + j++] = endj >> 8; + ram[0x00] = 0xFF; // chksum initial value + + if(ram[fastload_org + 0x008D] != 0xA5 /*LDA zp*/) + fprintf(stderr,"WARNING: unexpected opcode ($%02X) at 0x%04X. Verify fastload8000 object\n",ram[fastload_org+0x008D],fastload_org+0x008D); + ram[fastload_org + 0x008D] = 0x00; // BRK @ LDA $00 [chksum] + + if(ram[fastload_org + 0x0063] != 0xA9 /*LDA #imm*/) + fprintf(stderr,"WARNING: unexpected opcode ($%02X) at 0x%04X. Verify fastload8000 object\n",ram[fastload_org+0x0063],fastload_org+0x0063); + reset6502(); - exec6502(0xBEE3); + exec6502(fastload_org + 0x0063); // addr of sumcheck: LDA #0 if(ram[0x00] != 0) fprintf(stderr,"WARNING: simulated checksum failed: %02X\n",ram[0x00]); @@ -660,28 +677,28 @@ int main(int argc, char **argv) } //zero page src - ram[0x0] = (0xBA00 - cmp_len) & 0xFF; - ram[0x1] = (0xBA00 - cmp_len) >> 8; + ram[autoload3_zp + 0] = dataorg & 0xFF; + ram[autoload3_zp + 1] = dataorg >> 8; //zero page dst - ram[0x2] = (segments[0].start) & 0xFF; - ram[0x3] = (segments[0].start) >> 8; + ram[autoload3_zp + 2] = (segments[0].start) & 0xFF; + ram[autoload3_zp + 3] = (segments[0].start) >> 8; //setup JSR - ram[0xBF00] = 0x20; // JSR $9B00 - ram[0xBF01] = 0x00; - ram[0xBF02] = 0xBA; - ram[0xBF03] = 0x00; //BRK to stop simulation + ram[simaddr + 0] = 0x20; // JSR autoload3 inflate + ram[simaddr + 1] = autoload3_org & 0xFF; + ram[simaddr + 2] = autoload3_org >> 8; + ram[simaddr + 3] = 0x00; //BRK to stop simulation //run it reset6502(); - exec6502(0xBF00); + exec6502(simaddr); //compare (just to be safe) for(j=0;j<segments[0].length;j++) if(ram[segments[0].start + j] != segments[0].data[j]) { - fprintf(stderr,"WARNING: simulated inflate failed at %04X\n",j+0x1000); + fprintf(stderr,"WARNING: simulated inflate failed at %04X\n",segments[0].start+j); break; } inflate_time += clockticks6502/1023000.0; - fprintf(stderr,"start: 0x%04X, length: %5d, deflated: %.02f%%, data time:%.02f, inflate time:%.02f\n",(unsigned int)(0xB9FF - cmp_len),(unsigned int)cmp_len,100.0*(1-cmp_len/(float)segments[0].length),cmp_ones/(float)freq1 + cmp_zeros/(float)freq0,inflate_time); + fprintf(stderr,"start: 0x%04X, length: %5d, deflated: %.02f%%, data time:%.02f, inflate time:%.02f\n",dataorg,(unsigned int)cmp_len,100.0*(1-cmp_len/(float)segments[0].length),cmp_ones/(float)freq1 + cmp_zeros/(float)freq0,inflate_time); if((ones/(float)freq1 + zeros/(float)freq0) < inflate_time + (cmp_ones/(float)freq1 + cmp_zeros/(float)freq0)) { fprintf(stderr,"WARNING: compression disabled: no significant gain (%.02f)\n",ones/(float)freq1 + zeros/(float)freq0); @@ -766,7 +783,7 @@ int main(int argc, char **argv) // write out move and load code if(compress) { - unsigned int cmp_start = 0xBA00 - segments[0].length; + unsigned int cmp_start = autoload3_org - segments[0].length; //load start table[0] = cmp_start & 0xff; @@ -1027,8 +1044,9 @@ int main(int argc, char **argv) } } - // compute pad length, assuming 4 pages max for code - zeros += 8*(4 * 256 - sizeof(diskloadcode2)/sizeof(char)); + // compute pad length; pad to end of last page + // XXX: This ignores the trailing infdata table appended later; not a problem for time estimates + zeros += 8*(((sizeof(diskloadcode2)/sizeof(char) + 0xFF) & 0xFF00) - sizeof(diskloadcode2)/sizeof(char)); for(j=0;j<sizeof(diskloadcode3)/sizeof(char);j++) { byte=diskloadcode3[j]; @@ -1041,19 +1059,8 @@ int main(int argc, char **argv) } } - for(j=0;j<sizeof(dosboot1)/sizeof(char);j++) { - byte=dosboot1[j]; - for(i=0;i<8;i++) { - if(byte & 0x80) - ones++; - else - zeros++; - byte <<= 1; - } - } - - for(j=0;j<sizeof(dosboot2)/sizeof(char);j++) { - byte=dosboot2[j]; + for(j=0;j<sizeof(dosrwts)/sizeof(char);j++) { + byte=dosrwts[j]; for(i=0;i<8;i++) { if(byte & 0x80) ones++; @@ -1123,11 +1130,8 @@ int main(int argc, char **argv) appendtone(&output,&outputlength,6000,rate,0.25,0,&offset); } + // reset checksum for stage 2 checksum = 0xff; - for(i=0;i<sizeof(dosboot1)/sizeof(char);i++) { - WRITEBYTE(dosboot1[i]); - checksum ^= dosboot1[i]; - } // time to compress and compute start location and length // patch loadcode2 with start locations and ETA @@ -1135,74 +1139,82 @@ int main(int argc, char **argv) int k, err; double orig_len; unsigned char checksum=0xff; + const unsigned int dataend = diskload1_org; // cmp data loaded just below diskload1 object + const unsigned int datachkaddr = dataend - 1; // loaded chksum location inflate_times[i] = 0; cmp_data = tdefl_compress_mem_to_heap(segments[i].data, segments[i].length, &cmp_len, TDEFL_MAX_PROBES_MASK); //compute inflate time + const unsigned int dataorg = datachkaddr - cmp_len; //load up inflate code for(j=0;j<sizeof(diskloadcode3)/sizeof(char);j++) - ram[0x9B00 + j] = diskloadcode3[j]; + ram[diskload3_org + j] = diskloadcode3[j]; //load up inflate data for(j=0;j<cmp_len;j++) { - ram[0x8FFF - cmp_len + j] = cmp_data[j]; + ram[dataorg + j] = cmp_data[j]; checksum ^= cmp_data[j]; } - ram[0x8FFF] = checksum; + ram[dataorg + j] = checksum; //compute chksum time if(k8) { - for(j=(0x859 - 0x80C);j<diskloadcode_len;j++) - ram[0x9000 - (0x859 - 0x80C) + j] = diskloadcode[j]; - ram[0x00] = (0x8FFF - cmp_len) & 0xFF; - ram[0x01] = (0x8FFF - cmp_len) >> 8; - ram[0x02] = 0x00; - ram[0x03] = 0x90; - ram[0x04] = 0xFF; - ram[0x9089] = 0x85; //STA - ram[0x908A] = 0x04; //zero page $04 - ram[0x908B] = 0x00; //BRK + const unsigned int dlmofs = 0x859 /*moved:*/ - 0x80C /*move:*/; + for(j=dlmofs;j<diskloadcode_len;j++) + ram[diskload1_org - dlmofs + j] = diskloadcode[j]; + ram[diskload1_zp + 0] = dataorg & 0xFF; + ram[diskload1_zp + 1] = dataorg >> 8; + ram[diskload1_zp + 2] = dataend & 0xFF; + ram[diskload1_zp + 3] = dataend >> 8; + ram[diskload1_zp + 4] = 0xFF; // chksum initial value + + if(ram[diskload1_org + 0x008A] != 0xA5 /*LDA zp*/) + fprintf(stderr,"WARNING: unexpected opcode ($%02X) at 0x%04X. Verify diskload8000 object\n",ram[diskload1_org+0x008A],diskload1_org+0x008A); + ram[diskload1_org + 0x008A] = 0x00; // BRK @ LDA $04 [chksum] + + if(ram[diskload1_org + 0x0065] != 0xA9 /*LDA #imm*/) + fprintf(stderr,"WARNING: unexpected opcode ($%02X) at 0x%04X. Verify diskload8000 object\n",ram[diskload1_org+0x0065],diskload1_org+0x0065); reset6502(); - exec6502(0x9065); + exec6502(diskload1_org + 0x0065); // addr of LDA #0 below sumcheck: - if(ram[0x04] != 0) + if(ram[diskload1_zp + 4] != 0) fprintf(stderr,"WARNING: simulated checksum failed: %02X\n",ram[0x04]); inflate_times[i] += clockticks6502/1023000.0; } //zero page src - ram[0x10] = (0x8FFF - cmp_len) & 0xFF; - ram[0x11] = (0x8FFF - cmp_len) >> 8; + ram[diskload3_zp + 0] = dataorg & 0xFF; + ram[diskload3_zp + 1] = dataorg >> 8; //zero page dst - ram[0x12] = 0x00; - ram[0x13] = 0x10; - //setup JSR - ram[0x9000] = 0x20; // JSR $9B00 - ram[0x9001] = 0x00; - ram[0x9002] = 0x9B; - ram[0x9003] = 0x00; //BRK to stop simulation + ram[diskload3_zp + 2] = diskload2_data & 0xFF; + ram[diskload3_zp + 3] = diskload2_data >> 8; + //setup JSR (overwrites diskload1 object which is no longer needed) + ram[diskload1_org + 0] = 0x20; // JSR diskload3 inflate + ram[diskload1_org + 1] = diskload3_org & 0xFF; + ram[diskload1_org + 2] = diskload3_org >> 8; + ram[diskload1_org + 3] = 0x00; //BRK to stop simulation //run it reset6502(); - exec6502(0x9000); + exec6502(diskload1_org); //compare (just to be safe) err=0; for(j=0;j<7 * 4096;j++) - if(ram[0x1000 + j] != segments[i].data[j]) { + if(ram[diskload2_data + j] != segments[i].data[j]) { err = 1; break; } if(err) - fprintf(stderr,"WARNING: simulated inflate failed at %04X\n",j+0x1000); + fprintf(stderr,"WARNING: simulated inflate failed at %04X\n",diskload2_data+j); inflate_times[i] += clockticks6502/1023000.0; free(segments[i].data); segments[i].data = cmp_data; orig_len = segments[i].length; segments[i].length = cmp_len; - segments[i].start = 0x8FFF - segments[i].length; + segments[i].start = dataorg; // compress ? // need to see what is faster, defaulting to compress for now @@ -1249,7 +1261,9 @@ int main(int argc, char **argv) checksum ^= start_table[i]; } - for(i=0;i<4*256 - sizeof(diskloadcode2)/sizeof(char) - start_table_len;i++) { + // pad diskload2 to the end of last page + const int diskload2pad = ((sizeof(diskloadcode2)/sizeof(char) + start_table_len + 0xFF) & 0xFF00) - (sizeof(diskloadcode2)/sizeof(char) + start_table_len); + for(i=0;i<diskload2pad;i++) { WRITEBYTE(0x00); checksum ^= 0x00; } @@ -1259,9 +1273,9 @@ int main(int argc, char **argv) checksum ^= diskloadcode3[i]; } - for(i=0;i<sizeof(dosboot2)/sizeof(char);i++) { - WRITEBYTE(dosboot2[i]); - checksum ^= dosboot2[i]; + for(i=0;i<sizeof(dosrwts)/sizeof(char);i++) { + WRITEBYTE(dosrwts[i]); + checksum ^= dosrwts[i]; } WRITEBYTE(checksum); @@ -1278,13 +1292,8 @@ int main(int argc, char **argv) //appendtone(&output,&outputlength,6000,rate,1,0,&offset); //timing - if(i==0) { - if(!noformat) - j=28; - else - j=0; - } - else { + j=0; + if(i>0) { //j = 6 + ceil(inflate_times[i-1]); // 6 = write track time, may need to make it 7 // disk ][ verified (format and no-format) // Virtual ][ emulator verified (format and no-format, 8K only) @@ -1297,8 +1306,12 @@ int main(int argc, char **argv) // CFFA3000 3.1 failed with IBM 4GB Microdrive (too slow) // Nishida Radio SDISK // (no-format only) } - if(i==1) // seek time for track 0, just in case - j+=2; + if(i==1) { + j+=2; // seek time for track 0, just in case + if (!noformat) { + j+=3; // track 0 format time; determines inter-sector padding + } + } /* count down code for(;j>=0;j--) { diff --git a/c2t.h b/c2t.h index 475924d..0844c1c 100644 --- a/c2t.h +++ b/c2t.h @@ -169,31 +169,31 @@ unsigned int fastload9600_len = 337; unsigned char fastload8000[] = { 0xa2, 0x00, 0xbd, 0x23, 0x08, 0x9d, 0x80, 0xbe, 0xe8, 0xd0, 0xf7, 0xbd, 0x23, 0x09, 0x9d, 0x80, 0xbf, 0xe8, 0x10, 0xf7, 0x4c, 0x80, 0xbe, 0xa9, - 0x98, 0xa0, 0xbf, 0x20, 0x60, 0xbf, 0xad, 0x8c, 0xbf, 0x8d, 0xb4, 0xbe, - 0xad, 0x8d, 0xbf, 0x8d, 0xb5, 0xbe, 0xa2, 0x00, 0xa9, 0x01, 0x2c, 0x60, + 0x9c, 0xa0, 0xbf, 0x20, 0x64, 0xbf, 0xad, 0x90, 0xbf, 0x8d, 0xb4, 0xbe, + 0xad, 0x91, 0xbf, 0x8d, 0xb5, 0xbe, 0xa2, 0x00, 0xa9, 0x01, 0x2c, 0x60, 0xc0, 0x10, 0xfb, 0xa0, 0x00, 0x2c, 0x60, 0xc0, 0x30, 0xfb, 0xc8, 0x2c, 0x60, 0xc0, 0x10, 0xfa, 0xc0, 0x40, 0x10, 0x19, 0xc0, 0x15, 0x10, 0xeb, 0xc0, 0x07, 0x3e, 0xb4, 0xbe, 0xa0, 0x00, 0x0a, 0xd0, 0xe1, 0xa9, 0x01, 0xe8, 0xd0, 0xdc, 0xee, 0xb5, 0xbe, 0x4c, 0x9c, 0xbe, 0x8a, 0x18, 0x6d, - 0xb4, 0xbe, 0x8d, 0xb4, 0xbe, 0x90, 0x03, 0xee, 0xb5, 0xbe, 0xad, 0x8e, - 0xbf, 0xcd, 0xb4, 0xbe, 0xd0, 0x7b, 0xad, 0x8f, 0xbf, 0xcd, 0xb5, 0xbe, - 0xd0, 0x73, 0xa9, 0x00, 0x85, 0x06, 0xad, 0x8d, 0xbf, 0x85, 0x07, 0xa9, - 0xff, 0xac, 0x8c, 0xbf, 0x51, 0x06, 0xa6, 0x07, 0xec, 0x8f, 0xbf, 0xf0, - 0x07, 0xc8, 0xd0, 0xf4, 0xe6, 0x07, 0xd0, 0xf0, 0xc8, 0xcc, 0x8e, 0xbf, - 0x90, 0xea, 0x85, 0x00, 0xa5, 0x00, 0xd0, 0x3f, 0xad, 0x96, 0xbf, 0xf0, - 0x2f, 0x20, 0x8e, 0xfd, 0xa9, 0x81, 0xa0, 0xbf, 0x20, 0x60, 0xbf, 0xad, - 0x90, 0xbf, 0x85, 0x00, 0xad, 0x91, 0xbf, 0x85, 0x01, 0xad, 0x92, 0xbf, - 0x85, 0x02, 0xad, 0x93, 0xbf, 0x85, 0x03, 0x20, 0x00, 0xba, 0xad, 0x94, - 0xbf, 0xc5, 0x02, 0xd0, 0x1c, 0xad, 0x95, 0xbf, 0xc5, 0x03, 0xd0, 0x15, - 0xad, 0x97, 0xbf, 0xd0, 0x03, 0x6c, 0x92, 0xbf, 0x4c, 0x69, 0xff, 0x20, - 0x8e, 0xfd, 0xa9, 0x73, 0xa0, 0xbf, 0x20, 0x60, 0xbf, 0xa9, 0x7b, 0xa0, - 0xbf, 0x20, 0x60, 0xbf, 0x4c, 0x69, 0xff, 0x85, 0x06, 0x84, 0x07, 0xa0, - 0x00, 0xb1, 0x06, 0x09, 0x80, 0x20, 0xed, 0xfd, 0xc8, 0xb1, 0x06, 0xd0, - 0xf6, 0x60, 0x43, 0x48, 0x4b, 0x53, 0x55, 0x4d, 0x20, 0x00, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x00, 0x49, 0x4e, 0x46, 0x4c, 0x41, 0x54, 0x49, 0x4e, - 0x47, 0x20, 0x00 + 0xb4, 0xbe, 0x8d, 0xb4, 0xbe, 0x90, 0x03, 0xee, 0xb5, 0xbe, 0xad, 0x92, + 0xbf, 0xcd, 0xb4, 0xbe, 0xd0, 0x7f, 0xad, 0x93, 0xbf, 0xcd, 0xb5, 0xbe, + 0xd0, 0x77, 0xa9, 0x00, 0x85, 0x06, 0xae, 0x91, 0xbf, 0x86, 0x07, 0xa9, + 0xff, 0xac, 0x90, 0xbf, 0x51, 0x06, 0xec, 0x93, 0xbf, 0xf0, 0x0d, 0xc8, + 0xd0, 0xf6, 0xe8, 0x86, 0x07, 0xec, 0x93, 0xbf, 0xd0, 0xee, 0xf0, 0x01, + 0xc8, 0xcc, 0x92, 0xbf, 0x90, 0xe6, 0x85, 0x00, 0xa5, 0x00, 0xd0, 0x3f, + 0xad, 0x9a, 0xbf, 0xf0, 0x2f, 0x20, 0x8e, 0xfd, 0xa9, 0x85, 0xa0, 0xbf, + 0x20, 0x64, 0xbf, 0xad, 0x94, 0xbf, 0x85, 0x00, 0xad, 0x95, 0xbf, 0x85, + 0x01, 0xad, 0x96, 0xbf, 0x85, 0x02, 0xad, 0x97, 0xbf, 0x85, 0x03, 0x20, + 0x00, 0xba, 0xad, 0x98, 0xbf, 0xc5, 0x02, 0xd0, 0x1c, 0xad, 0x99, 0xbf, + 0xc5, 0x03, 0xd0, 0x15, 0xad, 0x9b, 0xbf, 0xd0, 0x03, 0x6c, 0x96, 0xbf, + 0x4c, 0x69, 0xff, 0x20, 0x8e, 0xfd, 0xa9, 0x77, 0xa0, 0xbf, 0x20, 0x64, + 0xbf, 0xa9, 0x7f, 0xa0, 0xbf, 0x20, 0x64, 0xbf, 0x4c, 0x69, 0xff, 0x85, + 0x06, 0x84, 0x07, 0xa0, 0x00, 0xb1, 0x06, 0x09, 0x80, 0x20, 0xed, 0xfd, + 0xc8, 0xb1, 0x06, 0xd0, 0xf6, 0x60, 0x43, 0x48, 0x4b, 0x53, 0x55, 0x4d, + 0x20, 0x00, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x00, 0x49, 0x4e, 0x46, 0x4c, + 0x41, 0x54, 0x49, 0x4e, 0x47, 0x20, 0x00 }; -unsigned int fastload8000_len = 291; +unsigned int fastload8000_len = 295; unsigned char fastloadcd[] = { 0xa2, 0x00, 0xbd, 0x23, 0x08, 0x9d, 0x80, 0xbe, 0xe8, 0xd0, 0xf7, 0xbd, 0x23, 0x09, 0x9d, 0x80, 0xbf, 0xe8, 0x10, 0xf7, 0x4c, 0x80, 0xbe, 0xa9, @@ -228,15 +228,15 @@ unsigned char fastloadcd[] = { unsigned int fastloadcd_len = 342; unsigned char diskload9600[] = { 0xa2, 0x00, 0xbd, 0x59, 0x08, 0x9d, 0x00, 0x90, 0xe8, 0xd0, 0xf7, 0x20, - 0x8e, 0xfd, 0xa9, 0x37, 0xa0, 0x08, 0x20, 0xce, 0x90, 0xa9, 0xd0, 0x85, - 0x00, 0xa9, 0x96, 0x85, 0x01, 0xa9, 0x00, 0x85, 0x02, 0xa9, 0xc0, 0x85, - 0x03, 0x20, 0x00, 0x90, 0x4c, 0x00, 0x97, 0x4c, 0x4f, 0x41, 0x44, 0x49, + 0x8e, 0xfd, 0xa9, 0x37, 0xa0, 0x08, 0x20, 0xce, 0x90, 0xa9, 0x00, 0x85, + 0x00, 0xa9, 0xae, 0x85, 0x01, 0xa9, 0xd1, 0x85, 0x02, 0xa9, 0xbf, 0x85, + 0x03, 0x20, 0x00, 0x90, 0x4c, 0x00, 0xae, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x2d, 0x44, 0x49, 0x53, 0x4b, 0x2c, 0x20, 0x45, 0x54, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x8d, 0x20, 0x90, 0xa5, 0x01, 0x8d, 0x21, 0x90, 0xa9, 0xff, 0x85, 0x04, 0x2c, 0x60, 0xc0, 0x10, 0xfb, 0x2c, 0x60, 0xc0, 0x30, 0xfb, 0xa9, 0x01, 0xa2, 0x00, 0x18, 0x90, 0x09, - 0x9d, 0x00, 0x10, 0x45, 0x04, 0x85, 0x04, 0xa9, 0x01, 0x2c, 0x60, 0xc0, + 0x9d, 0x20, 0x90, 0x45, 0x04, 0x85, 0x04, 0xa9, 0x01, 0x2c, 0x60, 0xc0, 0x10, 0xfb, 0x90, 0x12, 0xe8, 0xd0, 0x14, 0xee, 0x21, 0x90, 0xd0, 0x14, 0x38, 0x2a, 0x4c, 0x1d, 0x90, 0x18, 0x2a, 0x4c, 0x1d, 0x90, 0x2c, 0x60, 0xc0, 0x10, 0xf6, 0x2c, 0x60, 0xc0, 0x10, 0xf1, 0x2c, 0x60, 0xc0, 0x10, @@ -258,9 +258,9 @@ unsigned char diskload9600[] = { unsigned int diskload9600_len = 319; unsigned char diskload8000[] = { 0xa2, 0x00, 0xbd, 0x59, 0x08, 0x9d, 0x00, 0x90, 0xe8, 0xd0, 0xf7, 0x20, - 0x8e, 0xfd, 0xa9, 0x37, 0xa0, 0x08, 0x20, 0x9c, 0x90, 0xa9, 0xd0, 0x85, - 0x00, 0xa9, 0x96, 0x85, 0x01, 0xa9, 0x00, 0x85, 0x02, 0xa9, 0xc0, 0x85, - 0x03, 0x20, 0x00, 0x90, 0x4c, 0x00, 0x97, 0x4c, 0x4f, 0x41, 0x44, 0x49, + 0x8e, 0xfd, 0xa9, 0x37, 0xa0, 0x08, 0x20, 0x9f, 0x90, 0xa9, 0x00, 0x85, + 0x00, 0xa9, 0xae, 0x85, 0x01, 0xa9, 0xd1, 0x85, 0x02, 0xa9, 0xbf, 0x85, + 0x03, 0x20, 0x00, 0x90, 0x4c, 0x00, 0xae, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x2d, 0x44, 0x49, 0x53, 0x4b, 0x2c, 0x20, 0x45, 0x54, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x8d, 0x2b, 0x90, 0xa5, 0x01, @@ -270,136 +270,202 @@ unsigned char diskload8000[] = { 0x2b, 0x90, 0xa0, 0x00, 0x0a, 0xd0, 0xe1, 0xa9, 0x01, 0xe8, 0xd0, 0xdc, 0xee, 0x2c, 0x90, 0x4c, 0x13, 0x90, 0x8a, 0x18, 0x6d, 0x2b, 0x90, 0x8d, 0x2b, 0x90, 0x90, 0x03, 0xee, 0x2c, 0x90, 0xa5, 0x02, 0xcd, 0x2b, 0x90, - 0xd0, 0x3d, 0xa5, 0x03, 0xcd, 0x2c, 0x90, 0xd0, 0x36, 0x20, 0x98, 0x90, - 0x20, 0x8e, 0xfd, 0xa9, 0xaf, 0xa0, 0x90, 0x20, 0x9c, 0x90, 0xa9, 0x00, - 0x85, 0x0c, 0xa5, 0x01, 0x85, 0x0d, 0xa9, 0xff, 0xa4, 0x00, 0x51, 0x0c, - 0xa6, 0x0d, 0xe4, 0x03, 0xf0, 0x07, 0xc8, 0xd0, 0xf5, 0xe6, 0x0d, 0xd0, - 0xf1, 0xc8, 0xc4, 0x02, 0x90, 0xec, 0xa0, 0x00, 0x51, 0x02, 0xd0, 0x03, - 0x4c, 0x98, 0x90, 0xa9, 0xba, 0xa0, 0x90, 0x20, 0x9c, 0x90, 0x4c, 0x69, - 0xff, 0xa9, 0xb7, 0xa0, 0x90, 0x85, 0x0c, 0x84, 0x0d, 0xa0, 0x00, 0xb1, - 0x0c, 0x09, 0x80, 0x20, 0xed, 0xfd, 0xc8, 0xb1, 0x0c, 0xd0, 0xf6, 0x60, - 0x43, 0x48, 0x4b, 0x53, 0x55, 0x4d, 0x20, 0x00, 0x4f, 0x4b, 0x00, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x00 + 0xd0, 0x40, 0xa5, 0x03, 0xcd, 0x2c, 0x90, 0xd0, 0x39, 0x20, 0x9b, 0x90, + 0x20, 0x8e, 0xfd, 0xa9, 0xb2, 0xa0, 0x90, 0x20, 0x9f, 0x90, 0xa9, 0x00, + 0x85, 0x0c, 0xa6, 0x01, 0x86, 0x0d, 0xa9, 0xff, 0xa4, 0x00, 0x51, 0x0c, + 0xe4, 0x03, 0xf0, 0x0c, 0xc8, 0xd0, 0xf7, 0xe8, 0x86, 0x0d, 0xe4, 0x03, + 0xd0, 0xf0, 0xf0, 0x01, 0xc8, 0xc4, 0x02, 0x90, 0xe9, 0x85, 0x04, 0xa5, + 0x04, 0xd0, 0x03, 0x4c, 0x9b, 0x90, 0xa9, 0xbd, 0xa0, 0x90, 0x20, 0x9f, + 0x90, 0x4c, 0x69, 0xff, 0xa9, 0xba, 0xa0, 0x90, 0x85, 0x0c, 0x84, 0x0d, + 0xa0, 0x00, 0xb1, 0x0c, 0x09, 0x80, 0x20, 0xed, 0xfd, 0xc8, 0xb1, 0x0c, + 0xd0, 0xf6, 0x60, 0x43, 0x48, 0x4b, 0x53, 0x55, 0x4d, 0x20, 0x00, 0x4f, + 0x4b, 0x00, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x00 }; -unsigned int diskload8000_len = 269; +unsigned int diskload8000_len = 272; unsigned char diskloadcode2[] = { - 0xa2, 0x00, 0xbd, 0xd0, 0x96, 0x9d, 0xd0, 0x03, 0xe8, 0xe0, 0x30, 0xd0, - 0xf5, 0xa9, 0xb3, 0x8d, 0xff, 0xbf, 0x20, 0x58, 0xfc, 0xa9, 0x4c, 0xa0, - 0x99, 0x20, 0x13, 0x99, 0xa9, 0x13, 0x85, 0x24, 0xa9, 0x00, 0x20, 0x5b, - 0xfb, 0xa9, 0xe5, 0xa0, 0x99, 0x20, 0x39, 0x99, 0xa9, 0xec, 0xa0, 0x99, - 0x20, 0x39, 0x99, 0xa2, 0x23, 0x20, 0x05, 0x99, 0xa9, 0x41, 0xa0, 0x9a, - 0x20, 0x39, 0x99, 0x20, 0xe3, 0x03, 0x84, 0x0a, 0x85, 0x0b, 0xa9, 0x01, - 0xa0, 0x00, 0x91, 0x0a, 0xa9, 0x60, 0xa0, 0x01, 0x91, 0x0a, 0xa9, 0x01, - 0xa0, 0x02, 0x91, 0x0a, 0xa9, 0xfe, 0xa0, 0x03, 0x91, 0x0a, 0xad, 0xa6, - 0x9a, 0xd0, 0x47, 0x20, 0xc2, 0x98, 0xa9, 0xb3, 0xa0, 0x99, 0x20, 0x39, - 0x99, 0x20, 0xdc, 0x03, 0x84, 0x0e, 0x85, 0x0f, 0xa9, 0x0b, 0xa0, 0x00, - 0x91, 0x0e, 0xa9, 0x9d, 0xa0, 0x01, 0x91, 0x0e, 0xa9, 0xfe, 0xa0, 0x04, - 0x91, 0x0e, 0xa9, 0x01, 0xa0, 0x05, 0x91, 0x0e, 0xa9, 0x06, 0xa0, 0x06, - 0x91, 0x0e, 0xa9, 0x00, 0xa0, 0x0c, 0x91, 0x0e, 0xa9, 0x92, 0xa0, 0x0d, - 0x91, 0x0e, 0x20, 0xd6, 0x03, 0xa0, 0x0a, 0xb1, 0x0e, 0xf0, 0x03, 0x4c, - 0xb1, 0x98, 0xa9, 0x00, 0xa0, 0x0b, 0x91, 0x0a, 0xa9, 0x00, 0xa0, 0x08, - 0x91, 0x0a, 0xa9, 0x00, 0x85, 0x06, 0xa9, 0x05, 0x85, 0x07, 0x20, 0xc2, - 0x98, 0xa9, 0x98, 0xa0, 0x99, 0x20, 0x26, 0x99, 0xa9, 0xa5, 0xa0, 0x99, - 0x20, 0x39, 0x99, 0x38, 0xa9, 0x05, 0xe5, 0x07, 0x0a, 0x0a, 0xaa, 0x86, - 0x1e, 0xbd, 0x94, 0x9a, 0x20, 0xed, 0xfd, 0xbd, 0x95, 0x9a, 0xf0, 0x03, - 0x20, 0xed, 0xfd, 0xa9, 0xac, 0xa0, 0x99, 0x20, 0x39, 0x99, 0xa6, 0x1e, - 0xbd, 0x92, 0x9a, 0x85, 0x00, 0xbd, 0x93, 0x9a, 0x85, 0x01, 0xa9, 0x00, - 0x85, 0x02, 0xa9, 0x90, 0x85, 0x03, 0x20, 0x00, 0x90, 0xa2, 0x60, 0xbd, - 0x89, 0xc0, 0x20, 0xc2, 0x98, 0xa9, 0x88, 0xa0, 0x99, 0x20, 0x39, 0x99, - 0xa6, 0x1e, 0xbd, 0x92, 0x9a, 0x85, 0x10, 0xbd, 0x93, 0x9a, 0x85, 0x11, - 0xa9, 0x00, 0x85, 0x12, 0xa9, 0x10, 0x85, 0x13, 0x20, 0x00, 0x9b, 0xa9, - 0x00, 0xc5, 0x12, 0xd0, 0x71, 0xa9, 0x80, 0xc5, 0x13, 0xd0, 0x6b, 0x20, - 0xc2, 0x98, 0xa9, 0xd7, 0xa0, 0x99, 0x20, 0x39, 0x99, 0xa9, 0x10, 0x85, - 0x08, 0xa9, 0x07, 0x85, 0x09, 0xa5, 0x06, 0xa0, 0x04, 0x91, 0x0a, 0xa9, - 0x0f, 0x85, 0x05, 0x20, 0xec, 0x98, 0xa5, 0x05, 0xa0, 0x05, 0x91, 0x0a, - 0xa5, 0x08, 0x18, 0x65, 0x05, 0xa0, 0x09, 0x91, 0x0a, 0xa9, 0x02, 0xa0, - 0x0c, 0x91, 0x0a, 0x20, 0xe3, 0x03, 0x20, 0xd9, 0x03, 0xb0, 0x3e, 0xa9, - 0x00, 0x85, 0x48, 0xc6, 0x05, 0x10, 0xd8, 0xa5, 0x08, 0x18, 0x69, 0x10, - 0x85, 0x08, 0xe6, 0x06, 0xc6, 0x09, 0xd0, 0xc1, 0xc6, 0x07, 0xf0, 0x03, - 0x4c, 0xbe, 0x97, 0x20, 0xc2, 0x98, 0xa9, 0x68, 0xa0, 0x99, 0x20, 0x39, - 0x99, 0x20, 0xdd, 0xfb, 0x20, 0x0c, 0xfd, 0x4c, 0xa6, 0xfa, 0xa2, 0x60, - 0xbd, 0x88, 0xc0, 0xa9, 0x57, 0xa0, 0x99, 0x20, 0x39, 0x99, 0x4c, 0x69, - 0xff, 0xa9, 0x00, 0x85, 0x48, 0x20, 0xc2, 0x98, 0xa9, 0x5d, 0xa0, 0x99, - 0x20, 0x39, 0x99, 0x4c, 0x69, 0xff, 0xa9, 0x00, 0x85, 0x24, 0xa9, 0x16, - 0x20, 0x5b, 0xfb, 0x4c, 0x42, 0xfc, 0x18, 0xa9, 0x04, 0x65, 0x05, 0xa8, - 0xa9, 0x04, 0x65, 0x06, 0xa2, 0x57, 0x4c, 0xf8, 0x98, 0x18, 0xa9, 0x04, - 0x65, 0x05, 0xa8, 0xa9, 0x04, 0x65, 0x06, 0xa2, 0x52, 0x4c, 0xf8, 0x98, - 0x18, 0xa9, 0x04, 0x65, 0x05, 0xa8, 0xa9, 0x04, 0x65, 0x06, 0xa2, 0x60, - 0x85, 0x24, 0x98, 0x20, 0x5b, 0xfb, 0x8a, 0x49, 0x40, 0x20, 0xed, 0xfd, - 0x60, 0xa9, 0x2d, 0x09, 0x80, 0x20, 0xed, 0xfd, 0xca, 0xd0, 0xfa, 0x20, - 0x8e, 0xfd, 0x60, 0x85, 0x0c, 0x84, 0x0d, 0xa0, 0x00, 0xb1, 0x0c, 0x29, - 0x3f, 0x20, 0xed, 0xfd, 0xc8, 0xb1, 0x0c, 0xd0, 0xf6, 0x60, 0x85, 0x0c, - 0x84, 0x0d, 0xa0, 0x00, 0xb1, 0x0c, 0x09, 0x40, 0x20, 0xed, 0xfd, 0xc8, - 0xb1, 0x0c, 0xd0, 0xf6, 0x60, 0x85, 0x0c, 0x84, 0x0d, 0xa0, 0x00, 0xb1, - 0x0c, 0x09, 0x80, 0x20, 0xed, 0xfd, 0xc8, 0xb1, 0x0c, 0xd0, 0xf6, 0x60, - 0x49, 0x4e, 0x53, 0x54, 0x41, 0x2d, 0x44, 0x49, 0x53, 0x4b, 0x00, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x00, 0x44, 0x49, 0x53, 0x4b, 0x20, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x00, 0x44, 0x4f, 0x4e, 0x45, 0x2e, 0x20, 0x50, 0x52, - 0x45, 0x53, 0x53, 0x20, 0x5b, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5d, - 0x20, 0x54, 0x4f, 0x20, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, 0x2e, 0x00, - 0x49, 0x4e, 0x46, 0x4c, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x20, 0x44, 0x41, - 0x54, 0x41, 0x20, 0x00, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x20, - 0x44, 0x41, 0x54, 0x41, 0x00, 0x2c, 0x20, 0x45, 0x54, 0x41, 0x20, 0x00, - 0x20, 0x53, 0x45, 0x43, 0x2e, 0x20, 0x00, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x54, 0x49, 0x4e, 0x47, 0x20, 0x44, 0x49, 0x53, 0x4b, 0x20, 0x00, - 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x20, 0x46, 0x4f, 0x52, 0x20, - 0x44, 0x41, 0x54, 0x41, 0x3a, 0x20, 0x00, 0x57, 0x52, 0x49, 0x54, 0x49, - 0x4e, 0x47, 0x20, 0x44, 0x41, 0x54, 0x41, 0x20, 0x00, 0x54, 0x52, 0x41, - 0x43, 0x4b, 0x0d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, - 0x32, 0x32, 0x33, 0x33, 0x33, 0x33, 0x33, 0x0d, 0x20, 0x20, 0x20, 0x20, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, + 0x20, 0x58, 0xfc, 0xa9, 0xce, 0xa0, 0xb0, 0x20, 0x63, 0xb0, 0xa9, 0x13, + 0x85, 0x24, 0xa9, 0x00, 0x20, 0x5b, 0xfb, 0xa9, 0x67, 0xa0, 0xb1, 0x20, + 0x89, 0xb0, 0xa9, 0x6e, 0xa0, 0xb1, 0x20, 0x89, 0xb0, 0xa2, 0x23, 0x20, + 0x55, 0xb0, 0xa9, 0xc3, 0xa0, 0xb1, 0x20, 0x89, 0xb0, 0xa9, 0x00, 0x85, + 0x0a, 0xa2, 0xff, 0xe8, 0xbd, 0x43, 0xb2, 0xf0, 0x19, 0x09, 0xc0, 0x85, + 0x0b, 0xa0, 0x07, 0xb1, 0x0a, 0xd9, 0x3b, 0xb2, 0xd0, 0xed, 0x88, 0x88, + 0x10, 0xf5, 0xbd, 0x43, 0xb2, 0x8d, 0x38, 0xb2, 0xd0, 0x02, 0xa9, 0x06, + 0x8d, 0x39, 0xb2, 0x0a, 0x0a, 0x0a, 0x0a, 0x8d, 0x3a, 0xb2, 0xa9, 0x0c, + 0x85, 0x24, 0xa9, 0x14, 0x20, 0x5b, 0xfb, 0xa9, 0x14, 0xa0, 0xb2, 0x20, + 0x89, 0xb0, 0xad, 0x39, 0xb2, 0x18, 0x69, 0x30, 0x8d, 0x1c, 0xb2, 0xa9, + 0x01, 0x69, 0x30, 0x8d, 0x1f, 0xb2, 0xa9, 0x1b, 0xa0, 0xb2, 0x20, 0x63, + 0xb0, 0xad, 0x38, 0xb2, 0xf0, 0x06, 0xa9, 0x21, 0xa0, 0xb2, 0xd0, 0x04, + 0xa9, 0x2d, 0xa0, 0xb2, 0x20, 0x89, 0xb0, 0xac, 0x39, 0xb2, 0xa9, 0x50, + 0x99, 0x78, 0x04, 0x99, 0xf8, 0x04, 0xa9, 0x01, 0x85, 0x46, 0xa0, 0xe8, + 0xa9, 0xb7, 0x84, 0x0a, 0x85, 0x0b, 0xa9, 0x01, 0xa0, 0x00, 0x91, 0x0a, + 0xad, 0x3a, 0xb2, 0xa0, 0x01, 0x91, 0x0a, 0xa0, 0x0f, 0x91, 0x0a, 0xa9, + 0x01, 0xa0, 0x02, 0x91, 0x0a, 0xa0, 0x10, 0x91, 0x0a, 0xa9, 0xfe, 0xa0, + 0x03, 0x91, 0x0a, 0xa0, 0x0e, 0x91, 0x0a, 0xa9, 0x00, 0xa0, 0x0b, 0x91, + 0x0a, 0xa9, 0x00, 0xa0, 0x08, 0x91, 0x0a, 0xa9, 0x00, 0x85, 0x06, 0xa9, + 0x05, 0x85, 0x07, 0x20, 0x06, 0xb0, 0xa9, 0x1a, 0xa0, 0xb1, 0x20, 0x76, + 0xb0, 0xa9, 0x27, 0xa0, 0xb1, 0x20, 0x89, 0xb0, 0x38, 0xa9, 0x05, 0xe5, + 0x07, 0x0a, 0x0a, 0xaa, 0x86, 0x1e, 0xbd, 0xb4, 0xb4, 0x20, 0xed, 0xfd, + 0xbd, 0xb5, 0xb4, 0xf0, 0x03, 0x20, 0xed, 0xfd, 0xa9, 0x2e, 0xa0, 0xb1, + 0x20, 0x89, 0xb0, 0xa6, 0x1e, 0xbd, 0xb2, 0xb4, 0x85, 0x00, 0xbd, 0xb3, + 0xb4, 0x85, 0x01, 0xa9, 0x00, 0x85, 0x02, 0xa9, 0x90, 0x85, 0x03, 0x20, + 0x00, 0x90, 0xae, 0x3a, 0xb2, 0xbd, 0x89, 0xc0, 0x20, 0x06, 0xb0, 0xa9, + 0x0a, 0xa0, 0xb1, 0x20, 0x89, 0xb0, 0xa6, 0x1e, 0xbd, 0xb2, 0xb4, 0x85, + 0x10, 0xbd, 0xb3, 0xb4, 0x85, 0x11, 0xa9, 0x00, 0x85, 0x12, 0xa9, 0x10, + 0x85, 0x13, 0x20, 0x00, 0xb5, 0xa9, 0x00, 0xc5, 0x12, 0xd0, 0x06, 0xa9, + 0x80, 0xc5, 0x13, 0xf0, 0x03, 0x4c, 0xe5, 0xaf, 0x20, 0x06, 0xb0, 0xad, + 0xc6, 0xb4, 0xf0, 0x06, 0xa9, 0x59, 0xa0, 0xb1, 0xd0, 0x04, 0xa9, 0x35, + 0xa0, 0xb1, 0x20, 0x89, 0xb0, 0xa9, 0x10, 0x85, 0x08, 0xa9, 0x07, 0x85, + 0x09, 0xa5, 0x06, 0xa0, 0x04, 0x91, 0x0a, 0xad, 0xc6, 0xb4, 0xd0, 0x08, + 0x20, 0x9c, 0xb0, 0x20, 0xae, 0xb0, 0xb0, 0x61, 0xa9, 0x0f, 0x85, 0x05, + 0x20, 0x3c, 0xb0, 0xad, 0xc6, 0xb4, 0xf0, 0x1a, 0xa5, 0x05, 0xa0, 0x05, + 0x91, 0x0a, 0xa5, 0x08, 0x18, 0x65, 0x05, 0xa0, 0x09, 0x91, 0x0a, 0xa9, + 0x02, 0x20, 0x12, 0xb0, 0xb0, 0x3f, 0xa9, 0x00, 0x85, 0x48, 0xc6, 0x05, + 0x10, 0xda, 0xa5, 0x08, 0x18, 0x69, 0x10, 0x85, 0x08, 0xe6, 0x06, 0xc6, + 0x09, 0xd0, 0xb6, 0xc6, 0x07, 0xf0, 0x03, 0x4c, 0xe7, 0xae, 0x20, 0x06, + 0xb0, 0xa9, 0xea, 0xa0, 0xb0, 0x20, 0x89, 0xb0, 0x20, 0xdd, 0xfb, 0x20, + 0x0c, 0xfd, 0x4c, 0xa6, 0xfa, 0xae, 0x3a, 0xb2, 0xbd, 0x88, 0xc0, 0xa9, + 0xd9, 0xa0, 0xb0, 0x20, 0x89, 0xb0, 0x4c, 0x69, 0xff, 0xa9, 0x00, 0x85, + 0x48, 0x20, 0x06, 0xb0, 0xa9, 0xdf, 0xa0, 0xb0, 0x20, 0x89, 0xb0, 0x4c, + 0x69, 0xff, 0xa9, 0x00, 0x85, 0x24, 0xa9, 0x16, 0x20, 0x5b, 0xfb, 0x4c, + 0x42, 0xfc, 0xa0, 0x0c, 0x91, 0x0a, 0xa4, 0x0a, 0xa5, 0x0b, 0x20, 0xb5, + 0xb7, 0x60, 0x18, 0xa9, 0x04, 0x65, 0x05, 0xa8, 0xa9, 0x04, 0x65, 0x06, + 0xa2, 0x57, 0x4c, 0x48, 0xb0, 0x18, 0xa9, 0x04, 0x65, 0x05, 0xa8, 0xa9, + 0x04, 0x65, 0x06, 0xa2, 0x52, 0x4c, 0x48, 0xb0, 0x18, 0xa9, 0x04, 0x65, + 0x05, 0xa8, 0xa9, 0x04, 0x65, 0x06, 0xa2, 0x60, 0x85, 0x24, 0x98, 0x20, + 0x5b, 0xfb, 0x8a, 0x49, 0x40, 0x20, 0xed, 0xfd, 0x60, 0xa9, 0x2d, 0x09, + 0x80, 0x20, 0xed, 0xfd, 0xca, 0xd0, 0xfa, 0x20, 0x8e, 0xfd, 0x60, 0x85, + 0x0c, 0x84, 0x0d, 0xa0, 0x00, 0xb1, 0x0c, 0x29, 0x3f, 0x20, 0xed, 0xfd, + 0xc8, 0xb1, 0x0c, 0xd0, 0xf6, 0x60, 0x85, 0x0c, 0x84, 0x0d, 0xa0, 0x00, + 0xb1, 0x0c, 0x09, 0x40, 0x20, 0xed, 0xfd, 0xc8, 0xb1, 0x0c, 0xd0, 0xf6, + 0x60, 0x85, 0x0c, 0x84, 0x0d, 0xa0, 0x00, 0xb1, 0x0c, 0x09, 0x80, 0x20, + 0xed, 0xfd, 0xc8, 0xb1, 0x0c, 0xd0, 0xf6, 0x60, 0xa9, 0x00, 0x85, 0x00, + 0x85, 0x02, 0xa5, 0x08, 0x85, 0x01, 0xa9, 0x92, 0x85, 0x03, 0x20, 0x47, + 0xb2, 0x60, 0xa9, 0x00, 0x20, 0x12, 0xb0, 0xb0, 0x18, 0xa9, 0x00, 0xa0, + 0x08, 0x91, 0x0a, 0xa9, 0x92, 0xc8, 0x91, 0x0a, 0xa9, 0x06, 0xa0, 0x0c, + 0x91, 0x0a, 0xa4, 0x0a, 0xa5, 0x0b, 0x20, 0x9d, 0xb2, 0x60, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x2d, 0x44, 0x49, 0x53, 0x4b, 0x00, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x00, 0x44, 0x49, 0x53, 0x4b, 0x20, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x00, 0x44, 0x4f, 0x4e, 0x45, 0x2e, 0x20, 0x50, 0x52, 0x45, 0x53, + 0x53, 0x20, 0x5b, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5d, 0x20, 0x54, + 0x4f, 0x20, 0x52, 0x45, 0x42, 0x4f, 0x4f, 0x54, 0x2e, 0x00, 0x49, 0x4e, + 0x46, 0x4c, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x20, 0x44, 0x41, 0x54, 0x41, + 0x20, 0x00, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x44, 0x41, + 0x54, 0x41, 0x00, 0x2c, 0x20, 0x45, 0x54, 0x41, 0x20, 0x00, 0x20, 0x53, + 0x45, 0x43, 0x2e, 0x20, 0x00, 0x46, 0x4f, 0x52, 0x4d, 0x52, 0x49, 0x54, + 0x49, 0x4e, 0x47, 0x20, 0x44, 0x41, 0x54, 0x41, 0x20, 0x00, 0x57, 0x41, + 0x49, 0x54, 0x49, 0x4e, 0x47, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x44, 0x41, + 0x54, 0x41, 0x3a, 0x20, 0x00, 0x57, 0x52, 0x49, 0x54, 0x49, 0x4e, 0x47, + 0x20, 0x44, 0x41, 0x54, 0x41, 0x20, 0x00, 0x54, 0x52, 0x41, 0x43, 0x4b, + 0x0d, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x0d, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, - 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x0d, - 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, 0x30, 0x7c, 0x0d, 0x20, 0x20, - 0x31, 0x7c, 0x0d, 0x20, 0x20, 0x32, 0x7c, 0x0d, 0x20, 0x20, 0x33, 0x7c, - 0x0d, 0x20, 0x20, 0x34, 0x7c, 0x0d, 0x53, 0x20, 0x35, 0x7c, 0x0d, 0x45, - 0x20, 0x36, 0x7c, 0x0d, 0x43, 0x20, 0x37, 0x7c, 0x0d, 0x54, 0x20, 0x38, - 0x7c, 0x0d, 0x4f, 0x20, 0x39, 0x7c, 0x0d, 0x52, 0x20, 0x41, 0x7c, 0x0d, - 0x20, 0x20, 0x42, 0x7c, 0x0d, 0x20, 0x20, 0x43, 0x7c, 0x0d, 0x20, 0x20, - 0x44, 0x7c, 0x0d, 0x20, 0x20, 0x45, 0x7c, 0x0d, 0x20, 0x20, 0x46, 0x7c, - 0x0d, 0x00 + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x0d, 0x20, 0x20, + 0x20, 0x20, 0x00, 0x20, 0x20, 0x30, 0x7c, 0x0d, 0x20, 0x20, 0x31, 0x7c, + 0x0d, 0x20, 0x20, 0x32, 0x7c, 0x0d, 0x20, 0x20, 0x33, 0x7c, 0x0d, 0x20, + 0x20, 0x34, 0x7c, 0x0d, 0x53, 0x20, 0x35, 0x7c, 0x0d, 0x45, 0x20, 0x36, + 0x7c, 0x0d, 0x43, 0x20, 0x37, 0x7c, 0x0d, 0x54, 0x20, 0x38, 0x7c, 0x0d, + 0x4f, 0x20, 0x39, 0x7c, 0x0d, 0x52, 0x20, 0x41, 0x7c, 0x0d, 0x20, 0x20, + 0x42, 0x7c, 0x0d, 0x20, 0x20, 0x43, 0x7c, 0x0d, 0x20, 0x20, 0x44, 0x7c, + 0x0d, 0x20, 0x20, 0x45, 0x7c, 0x0d, 0x20, 0x20, 0x46, 0x7c, 0x0d, 0x00, + 0x44, 0x49, 0x53, 0x4b, 0x3a, 0x20, 0x00, 0x53, 0x36, 0x2c, 0x44, 0x31, + 0x00, 0x20, 0x28, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x29, + 0x00, 0x20, 0x28, 0x41, 0x53, 0x53, 0x55, 0x4d, 0x45, 0x44, 0x29, 0x00, + 0x00, 0x06, 0x60, 0xff, 0x20, 0xff, 0x00, 0xff, 0x03, 0xff, 0x3c, 0x06, + 0x05, 0x04, 0x00, 0xa9, 0x00, 0x85, 0x2a, 0x85, 0x26, 0xaa, 0xbd, 0xb8, + 0xbf, 0x85, 0x27, 0x18, 0x65, 0x03, 0x85, 0x2b, 0xa9, 0x02, 0x85, 0x3c, + 0xa5, 0x27, 0x4a, 0x66, 0x3c, 0x69, 0x10, 0x65, 0x03, 0x85, 0x3d, 0x20, + 0x75, 0xb2, 0xe6, 0x01, 0xe6, 0x26, 0xa5, 0x26, 0xc9, 0x10, 0x90, 0xd9, + 0x60, 0xa2, 0x00, 0xa0, 0x02, 0x88, 0xb1, 0x00, 0x4a, 0x3e, 0x00, 0xbc, + 0x4a, 0x3e, 0x00, 0xbc, 0x91, 0x2a, 0xe8, 0xe0, 0x56, 0x90, 0xee, 0xa2, + 0x00, 0x98, 0xd0, 0xe9, 0xa0, 0x55, 0xb9, 0x00, 0xbc, 0x29, 0x3f, 0x91, + 0x3c, 0x88, 0x10, 0xf6, 0x60, 0x08, 0x78, 0x20, 0xaa, 0xb2, 0xb0, 0x03, + 0x28, 0x18, 0x60, 0x28, 0x38, 0x60, 0x84, 0x48, 0x85, 0x49, 0xa0, 0x01, + 0xb1, 0x48, 0xaa, 0xa0, 0x0f, 0xd1, 0x48, 0xf0, 0x04, 0xa9, 0x20, 0xd0, + 0x19, 0xbd, 0x89, 0xc0, 0xa0, 0x0c, 0xb1, 0x48, 0xc9, 0x06, 0xf0, 0x04, + 0xa9, 0x08, 0xd0, 0x0a, 0x20, 0xdf, 0xb2, 0xa9, 0x08, 0xb0, 0x03, 0x18, + 0x90, 0x05, 0x38, 0xa0, 0x0d, 0x91, 0x48, 0xbd, 0x88, 0xc0, 0x60, 0xa0, + 0x03, 0xb1, 0x48, 0x85, 0x41, 0xa0, 0x04, 0xb1, 0x48, 0x85, 0x44, 0xd0, + 0x04, 0xa9, 0x28, 0x85, 0x45, 0xa9, 0x00, 0x85, 0x3f, 0x85, 0x2a, 0x85, + 0x3c, 0xa0, 0x09, 0xb1, 0x48, 0x85, 0x2b, 0x18, 0x69, 0x10, 0x85, 0x3d, + 0xa9, 0xaa, 0x85, 0x3e, 0xa0, 0x80, 0xd0, 0x02, 0xa4, 0x45, 0x20, 0x56, + 0xbc, 0xb0, 0x6e, 0x20, 0x00, 0xb4, 0xb0, 0x69, 0xe6, 0x3f, 0xa5, 0x3f, + 0xc9, 0x10, 0x90, 0xec, 0xa0, 0x0f, 0x84, 0x3f, 0xa9, 0x30, 0x8d, 0x78, + 0x05, 0x99, 0xa8, 0xbf, 0x88, 0x10, 0xfa, 0xa4, 0x45, 0x20, 0x81, 0xb3, + 0x20, 0x81, 0xb3, 0x20, 0x81, 0xb3, 0x48, 0x68, 0xea, 0x88, 0xd0, 0xf1, + 0x20, 0x44, 0xb9, 0xb0, 0x23, 0xa5, 0x2d, 0xf0, 0x15, 0xa9, 0x10, 0xc5, + 0x45, 0xa5, 0x45, 0xe9, 0x01, 0x85, 0x45, 0xc9, 0x05, 0xb0, 0x11, 0x38, + 0x60, 0x20, 0x44, 0xb9, 0xb0, 0x05, 0x20, 0xdc, 0xb8, 0x90, 0x1f, 0xce, + 0x78, 0x05, 0xd0, 0xf1, 0x20, 0x44, 0xb9, 0xb0, 0x0e, 0xa5, 0x2d, 0xc9, + 0x0f, 0xd0, 0x08, 0x20, 0xdc, 0xb8, 0xb0, 0x03, 0x4c, 0xf1, 0xb2, 0xce, + 0x78, 0x05, 0xd0, 0xe8, 0x38, 0x60, 0xa4, 0x2d, 0xb9, 0xa8, 0xbf, 0x30, + 0xda, 0xa9, 0xff, 0x99, 0xa8, 0xbf, 0xc6, 0x3f, 0x10, 0xc7, 0xa5, 0x44, + 0xd0, 0x0a, 0xa5, 0x45, 0xc9, 0x10, 0x90, 0xe5, 0xc6, 0x45, 0xc6, 0x45, + 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x86, 0x27, 0xbd, 0x8d, 0xc0, 0xbd, 0x8e, 0xc0, 0x10, 0x03, 0x4c, + 0x9f, 0xb4, 0xa5, 0x3c, 0xa5, 0x3c, 0x8d, 0x46, 0xb4, 0xa9, 0xff, 0x9d, + 0x8f, 0xc0, 0x1d, 0x8c, 0xc0, 0xa5, 0x3d, 0x8d, 0x47, 0xb4, 0xa9, 0xff, + 0xa0, 0x04, 0x20, 0xa3, 0xb4, 0x88, 0xd0, 0xfa, 0xa5, 0x2b, 0x8d, 0x69, + 0xb4, 0xa9, 0xd5, 0x20, 0xaa, 0xb4, 0xa9, 0xaa, 0x20, 0xa6, 0xb4, 0xa9, + 0xad, 0x20, 0xa6, 0xb4, 0x98, 0xa0, 0x56, 0xea, 0xea, 0x59, 0x00, 0x20, + 0xaa, 0xbd, 0x29, 0xba, 0xa6, 0x27, 0x9d, 0x8d, 0xc0, 0xbd, 0x8c, 0xc0, + 0xb1, 0x3c, 0x88, 0xd0, 0xec, 0x51, 0x2a, 0xaa, 0xbd, 0x29, 0xba, 0xa6, + 0x27, 0x9d, 0x8d, 0xc0, 0xbd, 0x8c, 0xc0, 0xb9, 0x00, 0x10, 0xc8, 0xd0, + 0xec, 0xaa, 0xbd, 0x29, 0xba, 0xa6, 0x27, 0x20, 0xab, 0xb4, 0xe6, 0x2b, + 0xa5, 0x3c, 0xa8, 0x49, 0x80, 0x85, 0x3c, 0xa9, 0xde, 0x9d, 0x8d, 0xc0, + 0xbd, 0x8c, 0xc0, 0x98, 0x0a, 0x65, 0x3d, 0x85, 0x3d, 0xa9, 0xaa, 0x20, + 0xa8, 0xb4, 0xa9, 0xeb, 0x20, 0xa6, 0xb4, 0xa9, 0xff, 0x20, 0xa6, 0xb4, + 0xbd, 0x8e, 0xc0, 0xbd, 0x8c, 0xc0, 0x60, 0x18, 0x90, 0x00, 0x18, 0xea, + 0x24, 0xff, 0xea, 0x9d, 0x8d, 0xc0, 0x1d, 0x8c, 0xc0, 0x60 }; -unsigned int diskloadcode2_len = 914; +unsigned int diskloadcode2_len = 1714; unsigned char diskloadcode3[] = { - 0xa0, 0x00, 0x84, 0x14, 0x84, 0x15, 0xa9, 0x84, 0x20, 0xa3, 0x9c, 0x4a, - 0x08, 0xaa, 0xd0, 0x1f, 0x84, 0x14, 0x20, 0xac, 0x9c, 0x20, 0xac, 0x9c, - 0x85, 0x15, 0xb0, 0x08, 0x20, 0xb0, 0x9c, 0x20, 0xd2, 0x9c, 0x90, 0x75, + 0xa0, 0x00, 0x84, 0x14, 0x84, 0x15, 0xa9, 0x84, 0x20, 0xa3, 0xb6, 0x4a, + 0x08, 0xaa, 0xd0, 0x1f, 0x84, 0x14, 0x20, 0xac, 0xb6, 0x20, 0xac, 0xb6, + 0x85, 0x15, 0xb0, 0x08, 0x20, 0xb0, 0xb6, 0x20, 0xd2, 0xb6, 0x90, 0x75, 0xe8, 0xd0, 0xf5, 0xe6, 0x15, 0xd0, 0xf1, 0x28, 0x90, 0xd6, 0x60, 0xa9, - 0x04, 0xc0, 0x90, 0x2a, 0x99, 0x00, 0x92, 0xc0, 0x3e, 0xb0, 0x0d, 0xa9, - 0x15, 0xc0, 0x20, 0xb0, 0x04, 0xc0, 0x18, 0x69, 0xf2, 0x99, 0x00, 0x93, + 0x04, 0xc0, 0x90, 0x2a, 0x99, 0x00, 0xab, 0xc0, 0x3e, 0xb0, 0x0d, 0xa9, + 0x15, 0xc0, 0x20, 0xb0, 0x04, 0xc0, 0x18, 0x69, 0xf2, 0x99, 0x00, 0xac, 0xc8, 0xd0, 0xe4, 0xa9, 0x20, 0x85, 0x19, 0xca, 0xf0, 0x44, 0x20, 0xf5, - 0x9b, 0xa2, 0x00, 0x08, 0x86, 0x16, 0x20, 0x73, 0x9c, 0xaa, 0x10, 0x14, - 0x20, 0xa3, 0x9c, 0x69, 0x01, 0xe0, 0xc0, 0x90, 0x02, 0x69, 0x07, 0xa8, + 0xb5, 0xa2, 0x00, 0x08, 0x86, 0x16, 0x20, 0x73, 0xb6, 0xaa, 0x10, 0x14, + 0x20, 0xa3, 0xb6, 0x69, 0x01, 0xe0, 0xc0, 0x90, 0x02, 0x69, 0x07, 0xa8, 0xa9, 0x00, 0xe0, 0x84, 0xb0, 0x02, 0xa5, 0x17, 0xc8, 0xa6, 0x16, 0x28, - 0x90, 0x0d, 0x9d, 0x00, 0x92, 0xe8, 0xe0, 0x01, 0x88, 0xd0, 0xf5, 0x85, - 0x17, 0xf0, 0xd0, 0xe4, 0x19, 0x90, 0x02, 0x09, 0x10, 0x9d, 0x00, 0x93, - 0xe8, 0xe4, 0x18, 0x90, 0xeb, 0x88, 0x20, 0x24, 0x9c, 0x20, 0x73, 0x9c, + 0x90, 0x0d, 0x9d, 0x00, 0xab, 0xe8, 0xe0, 0x01, 0x88, 0xd0, 0xf5, 0x85, + 0x17, 0xf0, 0xd0, 0xe4, 0x19, 0x90, 0x02, 0x09, 0x10, 0x9d, 0x00, 0xac, + 0xe8, 0xe4, 0x18, 0x90, 0xeb, 0x88, 0x20, 0x24, 0xb6, 0x20, 0x73, 0xb6, 0x90, 0x81, 0xaa, 0xf0, 0x8a, 0x84, 0x15, 0xc9, 0x09, 0x90, 0x14, 0x98, 0xe0, 0x1d, 0xb0, 0x0f, 0xca, 0x8a, 0x4a, 0x66, 0x15, 0xe6, 0x15, 0x4a, - 0x26, 0x15, 0x20, 0x99, 0x9c, 0x69, 0x00, 0x85, 0x18, 0xa2, 0x10, 0x20, - 0x75, 0x9c, 0xe5, 0x19, 0xaa, 0xc9, 0x04, 0x90, 0x06, 0xe6, 0x15, 0x4a, - 0x20, 0x99, 0x9c, 0x49, 0xff, 0x85, 0x16, 0xa5, 0x15, 0xe0, 0x0a, 0x90, - 0x07, 0xbd, 0xd3, 0x9c, 0x20, 0xa3, 0x9c, 0x18, 0x49, 0xff, 0x65, 0x13, - 0x85, 0x17, 0x20, 0xcc, 0x9c, 0x20, 0xcc, 0x9c, 0x20, 0xcc, 0x9c, 0xc6, - 0x18, 0xd0, 0xf9, 0xf0, 0xa4, 0x98, 0x99, 0x00, 0x92, 0x99, 0x3e, 0x92, - 0xc8, 0xd0, 0xf7, 0xa2, 0x03, 0xbd, 0xf6, 0x9c, 0x20, 0xa3, 0x9c, 0x7d, - 0xf9, 0x9c, 0x95, 0x16, 0x8d, 0xfb, 0x9c, 0xca, 0xd0, 0xef, 0xa9, 0x84, - 0x20, 0xa3, 0x9c, 0xbc, 0xe4, 0x9c, 0x99, 0x00, 0x92, 0xa0, 0x00, 0xe8, - 0xe4, 0x17, 0x90, 0xee, 0x98, 0x99, 0x3e, 0x93, 0xc8, 0xd0, 0xfa, 0xbe, - 0x00, 0x92, 0xfe, 0x5e, 0x93, 0xfe, 0x3e, 0x93, 0xc0, 0x3e, 0xb0, 0x09, - 0xbe, 0x00, 0x93, 0xfe, 0x6e, 0x93, 0xfe, 0x3e, 0x93, 0xc8, 0xd0, 0xe7, - 0xa2, 0xd0, 0x9d, 0xbe, 0x92, 0x18, 0x7d, 0x8e, 0x92, 0xe8, 0xd0, 0xf6, - 0x98, 0xbe, 0x00, 0x92, 0xbc, 0x8e, 0x93, 0xfe, 0x8e, 0x93, 0x99, 0xbe, - 0x93, 0xa8, 0xc0, 0x3e, 0xb0, 0x0d, 0xbe, 0x00, 0x93, 0xbc, 0x9e, 0x93, - 0xfe, 0x9e, 0x93, 0x99, 0xbe, 0x94, 0xa8, 0xc8, 0xd0, 0xde, 0x60, 0xa2, - 0x00, 0x98, 0x20, 0xb9, 0x9c, 0x2a, 0xe8, 0x38, 0xfd, 0x3e, 0x93, 0xb0, - 0xf5, 0x7d, 0x6e, 0x93, 0xb0, 0x09, 0x7d, 0x8e, 0x93, 0xaa, 0xbd, 0xbe, - 0x93, 0x18, 0x60, 0x18, 0x7d, 0x9d, 0x93, 0xaa, 0xbd, 0xbe, 0x94, 0x38, - 0x60, 0x26, 0x15, 0xaa, 0xc9, 0x09, 0xb0, 0x10, 0xbd, 0xdb, 0x9c, 0x20, - 0xb2, 0x9c, 0x46, 0x15, 0x6a, 0x90, 0xfb, 0x60, 0x20, 0xb0, 0x9c, 0xaa, - 0xa9, 0x80, 0x20, 0xb9, 0x9c, 0x6a, 0x90, 0xfa, 0x60, 0x46, 0x14, 0xd0, + 0x26, 0x15, 0x20, 0x99, 0xb6, 0x69, 0x00, 0x85, 0x18, 0xa2, 0x10, 0x20, + 0x75, 0xb6, 0xe5, 0x19, 0xaa, 0xc9, 0x04, 0x90, 0x06, 0xe6, 0x15, 0x4a, + 0x20, 0x99, 0xb6, 0x49, 0xff, 0x85, 0x16, 0xa5, 0x15, 0xe0, 0x0a, 0x90, + 0x07, 0xbd, 0xd3, 0xb6, 0x20, 0xa3, 0xb6, 0x18, 0x49, 0xff, 0x65, 0x13, + 0x85, 0x17, 0x20, 0xcc, 0xb6, 0x20, 0xcc, 0xb6, 0x20, 0xcc, 0xb6, 0xc6, + 0x18, 0xd0, 0xf9, 0xf0, 0xa4, 0x98, 0x99, 0x00, 0xab, 0x99, 0x3e, 0xab, + 0xc8, 0xd0, 0xf7, 0xa2, 0x03, 0xbd, 0xf6, 0xb6, 0x20, 0xa3, 0xb6, 0x7d, + 0xf9, 0xb6, 0x95, 0x16, 0x8d, 0xfb, 0xb6, 0xca, 0xd0, 0xef, 0xa9, 0x84, + 0x20, 0xa3, 0xb6, 0xbc, 0xe4, 0xb6, 0x99, 0x00, 0xab, 0xa0, 0x00, 0xe8, + 0xe4, 0x17, 0x90, 0xee, 0x98, 0x99, 0x3e, 0xac, 0xc8, 0xd0, 0xfa, 0xbe, + 0x00, 0xab, 0xfe, 0x5e, 0xac, 0xfe, 0x3e, 0xac, 0xc0, 0x3e, 0xb0, 0x09, + 0xbe, 0x00, 0xac, 0xfe, 0x6e, 0xac, 0xfe, 0x3e, 0xac, 0xc8, 0xd0, 0xe7, + 0xa2, 0xd0, 0x9d, 0xbe, 0xab, 0x18, 0x7d, 0x8e, 0xab, 0xe8, 0xd0, 0xf6, + 0x98, 0xbe, 0x00, 0xab, 0xbc, 0x8e, 0xac, 0xfe, 0x8e, 0xac, 0x99, 0xbe, + 0xac, 0xa8, 0xc0, 0x3e, 0xb0, 0x0d, 0xbe, 0x00, 0xac, 0xbc, 0x9e, 0xac, + 0xfe, 0x9e, 0xac, 0x99, 0xbe, 0xad, 0xa8, 0xc8, 0xd0, 0xde, 0x60, 0xa2, + 0x00, 0x98, 0x20, 0xb9, 0xb6, 0x2a, 0xe8, 0x38, 0xfd, 0x3e, 0xac, 0xb0, + 0xf5, 0x7d, 0x6e, 0xac, 0xb0, 0x09, 0x7d, 0x8e, 0xac, 0xaa, 0xbd, 0xbe, + 0xac, 0x18, 0x60, 0x18, 0x7d, 0x9d, 0xac, 0xaa, 0xbd, 0xbe, 0xad, 0x38, + 0x60, 0x26, 0x15, 0xaa, 0xc9, 0x09, 0xb0, 0x10, 0xbd, 0xdb, 0xb6, 0x20, + 0xb2, 0xb6, 0x46, 0x15, 0x6a, 0x90, 0xfb, 0x60, 0x20, 0xb0, 0xb6, 0xaa, + 0xa9, 0x80, 0x20, 0xb9, 0xb6, 0x6a, 0x90, 0xfa, 0x60, 0x46, 0x14, 0xd0, 0x0e, 0x48, 0xb1, 0x10, 0xe6, 0x10, 0xd0, 0x02, 0xe6, 0x11, 0x38, 0x6a, 0x85, 0x14, 0x68, 0x60, 0xa4, 0x12, 0xb1, 0x16, 0xa0, 0x00, 0x91, 0x12, 0xe6, 0x12, 0xd0, 0x04, 0xe6, 0x13, 0xe6, 0x17, 0x60, 0x81, 0x82, 0x84, @@ -409,1136 +475,337 @@ unsigned char diskloadcode3[] = { }; unsigned int diskloadcode3_len = 512; -//DOS 3.3 -unsigned char dosboot1[] = { - 0x4C,0xBF,0x9D,0x4C,0x84,0x9D,0x4C,0xFD, - 0xAA,0x4C,0xB5,0xB7,0xAD,0x0F,0x9D,0xAC, - 0x0E,0x9D,0x60,0xAD,0xC2,0xAA,0xAC,0xC1, - 0xAA,0x60,0x4C,0x51,0xA8,0xEA,0xEA,0x4C, - 0x59,0xFA,0xBF,0x9D,0x38,0x4C,0x58,0xFF, - 0x4C,0x65,0xFF,0x4C,0x65,0xFF,0x65,0xFF, +// DOS 3.3 RWTS rip +unsigned char dosrwts[] = { + /*B700:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B708:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B710:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B718:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B720:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B728:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B730:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B738:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B740:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B748:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B750:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B758:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B760:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B768:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B770:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B778:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B780:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B788:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B790:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B798:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B7A0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B7A8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*B7B0:*/ 0x00,0x00,0x00,0x00,0x00,0x08,0x78,0x20, + /*B7B8:*/ 0x00,0xBD,0xB0,0x03,0x28,0x18,0x60,0x28, + /*B7C0:*/ 0x38,0x60,0xAD,0xBC,0xB5,0x8D,0xF1,0xB7, + /*B7C8:*/ 0xA9,0x00,0x8D,0xF0,0xB7,0xAD,0xF9,0xB5, + /*B7D0:*/ 0x49,0xFF,0x8D,0xEB,0xB7,0x60,0xA9,0x00, + /*B7D8:*/ 0xA8,0x91,0x42,0xC8,0xD0,0xFB,0x60,0xFF, + /*B7E0:*/ 0xFF,0x00,0x00,0x00,0xE8,0xB7,0xFF,0xFF, + /*B7E8:*/ 0x01,0x60,0x01,0xFF,0x00,0x00,0xFB,0xB7, + /*B7F0:*/ 0xFF,0xFF,0x00,0x00,0x00,0x00,0xFE,0x60, + /*B7F8:*/ 0x01,0x00,0x00,0x00,0x01,0xEF,0xD8,0x00, + /*B800:*/ 0xA2,0x00,0xA0,0x02,0x88,0xB1,0x3E,0x4A, + /*B808:*/ 0x3E,0x00,0xBC,0x4A,0x3E,0x00,0xBC,0x99, + /*B810:*/ 0x00,0xBB,0xE8,0xE0,0x56,0x90,0xED,0xA2, + /*B818:*/ 0x00,0x98,0xD0,0xE8,0xA2,0x55,0xBD,0x00, + /*B820:*/ 0xBC,0x29,0x3F,0x9D,0x00,0xBC,0xCA,0x10, + /*B828:*/ 0xF5,0x60,0x38,0x86,0x27,0x8E,0x78,0x06, + /*B830:*/ 0xBD,0x8D,0xC0,0xBD,0x8E,0xC0,0x30,0x7C, + /*B838:*/ 0xAD,0x00,0xBC,0x85,0x26,0xA9,0xFF,0x9D, + /*B840:*/ 0x8F,0xC0,0x1D,0x8C,0xC0,0x48,0x68,0xEA, + /*B848:*/ 0xA0,0x04,0x48,0x68,0x20,0xB9,0xB8,0x88, + /*B850:*/ 0xD0,0xF8,0xA9,0xD5,0x20,0xB8,0xB8,0xA9, + /*B858:*/ 0xAA,0x20,0xB8,0xB8,0xA9,0xAD,0x20,0xB8, + /*B860:*/ 0xB8,0x98,0xA0,0x56,0xD0,0x03,0xB9,0x00, + /*B868:*/ 0xBC,0x59,0xFF,0xBB,0xAA,0xBD,0x29,0xBA, + /*B870:*/ 0xA6,0x27,0x9D,0x8D,0xC0,0xBD,0x8C,0xC0, + /*B878:*/ 0x88,0xD0,0xEB,0xA5,0x26,0xEA,0x59,0x00, + /*B880:*/ 0xBB,0xAA,0xBD,0x29,0xBA,0xAE,0x78,0x06, + /*B888:*/ 0x9D,0x8D,0xC0,0xBD,0x8C,0xC0,0xB9,0x00, + /*B890:*/ 0xBB,0xC8,0xD0,0xEA,0xAA,0xBD,0x29,0xBA, + /*B898:*/ 0xA6,0x27,0x20,0xBB,0xB8,0xA9,0xDE,0x20, + /*B8A0:*/ 0xB8,0xB8,0xA9,0xAA,0x20,0xB8,0xB8,0xA9, + /*B8A8:*/ 0xEB,0x20,0xB8,0xB8,0xA9,0xFF,0x20,0xB8, + /*B8B0:*/ 0xB8,0xBD,0x8E,0xC0,0xBD,0x8C,0xC0,0x60, + /*B8B8:*/ 0x18,0x48,0x68,0x9D,0x8D,0xC0,0x1D,0x8C, + /*B8C0:*/ 0xC0,0x60,0xA0,0x00,0xA2,0x56,0xCA,0x30, + /*B8C8:*/ 0xFB,0xB9,0x00,0xBB,0x5E,0x00,0xBC,0x2A, + /*B8D0:*/ 0x5E,0x00,0xBC,0x2A,0x91,0x3E,0xC8,0xC4, + /*B8D8:*/ 0x26,0xD0,0xEB,0x60,0xA0,0x20,0x88,0xF0, + /*B8E0:*/ 0x61,0xBD,0x8C,0xC0,0x10,0xFB,0x49,0xD5, + /*B8E8:*/ 0xD0,0xF4,0xEA,0xBD,0x8C,0xC0,0x10,0xFB, + /*B8F0:*/ 0xC9,0xAA,0xD0,0xF2,0xA0,0x56,0xBD,0x8C, + /*B8F8:*/ 0xC0,0x10,0xFB,0xC9,0xAD,0xD0,0xE7,0xA9, + /*B900:*/ 0x00,0x88,0x84,0x26,0xBC,0x8C,0xC0,0x10, + /*B908:*/ 0xFB,0x59,0x00,0xBA,0xA4,0x26,0x99,0x00, + /*B910:*/ 0xBC,0xD0,0xEE,0x84,0x26,0xBC,0x8C,0xC0, + /*B918:*/ 0x10,0xFB,0x59,0x00,0xBA,0xA4,0x26,0x99, + /*B920:*/ 0x00,0xBB,0xC8,0xD0,0xEE,0xBC,0x8C,0xC0, + /*B928:*/ 0x10,0xFB,0xD9,0x00,0xBA,0xD0,0x13,0xBD, + /*B930:*/ 0x8C,0xC0,0x10,0xFB,0xC9,0xDE,0xD0,0x0A, + /*B938:*/ 0xEA,0xBD,0x8C,0xC0,0x10,0xFB,0xC9,0xAA, + /*B940:*/ 0xF0,0x5C,0x38,0x60,0xA0,0xFC,0x84,0x26, + /*B948:*/ 0xC8,0xD0,0x04,0xE6,0x26,0xF0,0xF3,0xBD, + /*B950:*/ 0x8C,0xC0,0x10,0xFB,0xC9,0xD5,0xD0,0xF0, + /*B958:*/ 0xEA,0xBD,0x8C,0xC0,0x10,0xFB,0xC9,0xAA, + /*B960:*/ 0xD0,0xF2,0xA0,0x03,0xBD,0x8C,0xC0,0x10, + /*B968:*/ 0xFB,0xC9,0x96,0xD0,0xE7,0xA9,0x00,0x85, + /*B970:*/ 0x27,0xBD,0x8C,0xC0,0x10,0xFB,0x2A,0x85, + /*B978:*/ 0x26,0xBD,0x8C,0xC0,0x10,0xFB,0x25,0x26, + /*B980:*/ 0x99,0x2C,0x00,0x45,0x27,0x88,0x10,0xE7, + /*B988:*/ 0xA8,0xD0,0xB7,0xBD,0x8C,0xC0,0x10,0xFB, + /*B990:*/ 0xC9,0xDE,0xD0,0xAE,0xEA,0xBD,0x8C,0xC0, + /*B998:*/ 0x10,0xFB,0xC9,0xAA,0xD0,0xA4,0x18,0x60, + /*B9A0:*/ 0x86,0x2B,0x85,0x2A,0xCD,0x78,0x04,0xF0, + /*B9A8:*/ 0x53,0xA9,0x00,0x85,0x26,0xAD,0x78,0x04, + /*B9B0:*/ 0x85,0x27,0x38,0xE5,0x2A,0xF0,0x33,0xB0, + /*B9B8:*/ 0x07,0x49,0xFF,0xEE,0x78,0x04,0x90,0x05, + /*B9C0:*/ 0x69,0xFE,0xCE,0x78,0x04,0xC5,0x26,0x90, + /*B9C8:*/ 0x02,0xA5,0x26,0xC9,0x0C,0xB0,0x01,0xA8, + /*B9D0:*/ 0x38,0x20,0xEE,0xB9,0xB9,0x11,0xBA,0x20, + /*B9D8:*/ 0x00,0xBA,0xA5,0x27,0x18,0x20,0xF1,0xB9, + /*B9E0:*/ 0xB9,0x1D,0xBA,0x20,0x00,0xBA,0xE6,0x26, + /*B9E8:*/ 0xD0,0xC3,0x20,0x00,0xBA,0x18,0xAD,0x78, + /*B9F0:*/ 0x04,0x29,0x03,0x2A,0x05,0x2B,0xAA,0xBD, + /*B9F8:*/ 0x80,0xC0,0xA6,0x2B,0x60,0x00,0x00,0x00, + /*BA00:*/ 0xA2,0x11,0xCA,0xD0,0xFD,0xE6,0x46,0xD0, + /*BA08:*/ 0x02,0xE6,0x47,0x38,0xE9,0x01,0xD0,0xF0, + /*BA10:*/ 0x60,0x01,0x30,0x28,0x24,0x20,0x1E,0x1D, + /*BA18:*/ 0x1C,0x1C,0x1C,0x1C,0x1C,0x70,0x2C,0x26, + /*BA20:*/ 0x22,0x1F,0x1E,0x1D,0x1C,0x1C,0x1C,0x1C, + /*BA28:*/ 0x1C,0x96,0x97,0x9A,0x9B,0x9D,0x9E,0x9F, + /*BA30:*/ 0xA6,0xA7,0xAB,0xAC,0xAD,0xAE,0xAF,0xB2, + /*BA38:*/ 0xB3,0xB4,0xB5,0xB6,0xB7,0xB9,0xBA,0xBB, + /*BA40:*/ 0xBC,0xBD,0xBE,0xBF,0xCB,0xCD,0xCE,0xCF, + /*BA48:*/ 0xD3,0xD6,0xD7,0xD9,0xDA,0xDB,0xDC,0xDD, + /*BA50:*/ 0xDE,0xDF,0xE5,0xE6,0xE7,0xE9,0xEA,0xEB, + /*BA58:*/ 0xEC,0xED,0xEE,0xEF,0xF2,0xF3,0xF4,0xF5, + /*BA60:*/ 0xF6,0xF7,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE, + /*BA68:*/ 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BA70:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BA78:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BA80:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BA88:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BA90:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + /*BA98:*/ 0x98,0x99,0x02,0x03,0x9C,0x04,0x05,0x06, + /*BAA0:*/ 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0x07,0x08, + /*BAA8:*/ 0xA8,0xA9,0xAA,0x09,0x0A,0x0B,0x0C,0x0D, + /*BAB0:*/ 0xB0,0xB1,0x0E,0x0F,0x10,0x11,0x12,0x13, + /*BAB8:*/ 0xB8,0x14,0x15,0x16,0x17,0x18,0x19,0x1A, + /*BAC0:*/ 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + /*BAC8:*/ 0xC8,0xC9,0xCA,0x1B,0xCC,0x1C,0x1D,0x1E, + /*BAD0:*/ 0xD0,0xD1,0xD2,0x1F,0xD4,0xD5,0x20,0x21, + /*BAD8:*/ 0xD8,0x22,0x23,0x24,0x25,0x26,0x27,0x28, + /*BAE0:*/ 0xE0,0xE1,0xE2,0xE3,0xE4,0x29,0x2A,0x2B, + /*BAE8:*/ 0xE8,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, + /*BAF0:*/ 0xF0,0xF1,0x33,0x34,0x35,0x36,0x37,0x38, + /*BAF8:*/ 0xF8,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + /*BB00:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB08:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB10:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB18:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB20:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB28:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB30:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB38:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB40:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB48:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB50:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB58:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB60:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB68:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB70:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB78:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB80:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB88:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB90:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BB98:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBA0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBA8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBB0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBB8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBC0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBC8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBD0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBD8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBE0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBE8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBF0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BBF8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC00:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC08:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC10:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC18:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC20:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC28:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC30:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC38:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC40:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC48:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BC50:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xBD, + /*BC58:*/ 0x8D,0xC0,0xBD,0x8E,0xC0,0x30,0x5E,0xA9, + /*BC60:*/ 0xFF,0x9D,0x8F,0xC0,0xDD,0x8C,0xC0,0x48, + /*BC68:*/ 0x68,0x20,0xC3,0xBC,0x20,0xC3,0xBC,0x9D, + /*BC70:*/ 0x8D,0xC0,0xDD,0x8C,0xC0,0xEA,0x88,0xD0, + /*BC78:*/ 0xF0,0xA9,0xD5,0x20,0xD5,0xBC,0xA9,0xAA, + /*BC80:*/ 0x20,0xD5,0xBC,0xA9,0x96,0x20,0xD5,0xBC, + /*BC88:*/ 0xA5,0x41,0x20,0xC4,0xBC,0xA5,0x44,0x20, + /*BC90:*/ 0xC4,0xBC,0xA5,0x3F,0x20,0xC4,0xBC,0xA5, + /*BC98:*/ 0x41,0x45,0x44,0x45,0x3F,0x48,0x4A,0x05, + /*BCA0:*/ 0x3E,0x9D,0x8D,0xC0,0xBD,0x8C,0xC0,0x68, + /*BCA8:*/ 0x09,0xAA,0x20,0xD4,0xBC,0xA9,0xDE,0x20, + /*BCB0:*/ 0xD5,0xBC,0xA9,0xAA,0x20,0xD5,0xBC,0xA9, + /*BCB8:*/ 0xEB,0x20,0xD5,0xBC,0x18,0xBD,0x8E,0xC0, + /*BCC0:*/ 0xBD,0x8C,0xC0,0x60,0x48,0x4A,0x05,0x3E, + /*BCC8:*/ 0x9D,0x8D,0xC0,0xDD,0x8C,0xC0,0x68,0xEA, + /*BCD0:*/ 0xEA,0xEA,0x09,0xAA,0xEA,0xEA,0x48,0x68, + /*BCD8:*/ 0x9D,0x8D,0xC0,0xDD,0x8C,0xC0,0x60,0x00, + /*BCE0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BCE8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BCF0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BCF8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BD00:*/ 0x84,0x48,0x85,0x49,0xA0,0x02,0x8C,0xF8, + /*BD08:*/ 0x06,0xA0,0x04,0x8C,0xF8,0x04,0xA0,0x01, + /*BD10:*/ 0xB1,0x48,0xAA,0xA0,0x0F,0xD1,0x48,0xF0, + /*BD18:*/ 0x1B,0x8A,0x48,0xB1,0x48,0xAA,0x68,0x48, + /*BD20:*/ 0x91,0x48,0xBD,0x8E,0xC0,0xA0,0x08,0xBD, + /*BD28:*/ 0x8C,0xC0,0xDD,0x8C,0xC0,0xD0,0xF6,0x88, + /*BD30:*/ 0xD0,0xF8,0x68,0xAA,0xBD,0x8E,0xC0,0xBD, + /*BD38:*/ 0x8C,0xC0,0xA0,0x08,0xBD,0x8C,0xC0,0x48, + /*BD40:*/ 0x68,0x48,0x68,0x8E,0xF8,0x05,0xDD,0x8C, + /*BD48:*/ 0xC0,0xD0,0x03,0x88,0xD0,0xEE,0x08,0xBD, + /*BD50:*/ 0x89,0xC0,0xA0,0x06,0xB1,0x48,0x99,0x36, + /*BD58:*/ 0x00,0xC8,0xC0,0x0A,0xD0,0xF6,0xA0,0x03, + /*BD60:*/ 0xB1,0x3C,0x85,0x47,0xA0,0x02,0xB1,0x48, + /*BD68:*/ 0xA0,0x10,0xD1,0x48,0xF0,0x06,0x91,0x48, + /*BD70:*/ 0x28,0xA0,0x00,0x08,0x6A,0x90,0x05,0xBD, + /*BD78:*/ 0x8A,0xC0,0xB0,0x03,0xBD,0x8B,0xC0,0x66, + /*BD80:*/ 0x35,0x28,0x08,0xD0,0x0B,0xA0,0x07,0x20, + /*BD88:*/ 0x00,0xBA,0x88,0xD0,0xFA,0xAE,0xF8,0x05, + /*BD90:*/ 0xA0,0x04,0xB1,0x48,0x20,0x5A,0xBE,0x28, + /*BD98:*/ 0xD0,0x11,0xA4,0x47,0x10,0x0D,0xA0,0x12, + /*BDA0:*/ 0x88,0xD0,0xFD,0xE6,0x46,0xD0,0xF7,0xE6, + /*BDA8:*/ 0x47,0xD0,0xF3,0xA0,0x0C,0xB1,0x48,0xF0, + /*BDB0:*/ 0x5A,0xC9,0x04,0xF0,0x58,0x6A,0x08,0xB0, + /*BDB8:*/ 0x03,0x20,0x00,0xB8,0xA0,0x30,0x8C,0x78, + /*BDC0:*/ 0x05,0xAE,0xF8,0x05,0x20,0x44,0xB9,0x90, + /*BDC8:*/ 0x24,0xCE,0x78,0x05,0x10,0xF3,0xAD,0x78, + /*BDD0:*/ 0x04,0x48,0xA9,0x60,0x20,0x95,0xBE,0xCE, + /*BDD8:*/ 0xF8,0x06,0xF0,0x28,0xA9,0x04,0x8D,0xF8, + /*BDE0:*/ 0x04,0xA9,0x00,0x20,0x5A,0xBE,0x68,0x20, + /*BDE8:*/ 0x5A,0xBE,0x4C,0xBC,0xBD,0xA4,0x2E,0xCC, + /*BDF0:*/ 0x78,0x04,0xF0,0x1C,0xAD,0x78,0x04,0x48, + /*BDF8:*/ 0x98,0x20,0x95,0xBE,0x68,0xCE,0xF8,0x04, + /*BE00:*/ 0xD0,0xE5,0xF0,0xCA,0x68,0xA9,0x40,0x28, + /*BE08:*/ 0x4C,0x48,0xBE,0xF0,0x39,0x4C,0xAF,0xBE, + /*BE10:*/ 0xA0,0x03,0xB1,0x48,0x48,0xA5,0x2F,0xA0, + /*BE18:*/ 0x0E,0x91,0x48,0x68,0xF0,0x08,0xC5,0x2F, + /*BE20:*/ 0xF0,0x04,0xA9,0x20,0xD0,0xE1,0xA0,0x05, + /*BE28:*/ 0xB1,0x48,0xA8,0xB9,0xB8,0xBF,0xC5,0x2D, + /*BE30:*/ 0xD0,0x97,0x28,0x90,0x1C,0x20,0xDC,0xB8, + /*BE38:*/ 0x08,0xB0,0x8E,0x28,0xA2,0x00,0x86,0x26, + /*BE40:*/ 0x20,0xC2,0xB8,0xAE,0xF8,0x05,0x18,0x24, + /*BE48:*/ 0x38,0xA0,0x0D,0x91,0x48,0xBD,0x88,0xC0, + /*BE50:*/ 0x60,0x20,0x2A,0xB8,0x90,0xF0,0xA9,0x10, + /*BE58:*/ 0xB0,0xEE,0x48,0xA0,0x01,0xB1,0x3C,0x6A, + /*BE60:*/ 0x68,0x90,0x08,0x0A,0x20,0x6B,0xBE,0x4E, + /*BE68:*/ 0x78,0x04,0x60,0x85,0x2A,0x20,0x8E,0xBE, + /*BE70:*/ 0xB9,0x78,0x04,0x24,0x35,0x30,0x03,0xB9, + /*BE78:*/ 0xF8,0x04,0x8D,0x78,0x04,0xA5,0x2A,0x24, + /*BE80:*/ 0x35,0x30,0x05,0x99,0xF8,0x04,0x10,0x03, + /*BE88:*/ 0x99,0x78,0x04,0x4C,0xA0,0xB9,0x8A,0x4A, + /*BE90:*/ 0x4A,0x4A,0x4A,0xA8,0x60,0x48,0xA0,0x02, + /*BE98:*/ 0xB1,0x48,0x6A,0x66,0x35,0x20,0x8E,0xBE, + /*BEA0:*/ 0x68,0x0A,0x24,0x35,0x30,0x05,0x99,0xF8, + /*BEA8:*/ 0x04,0x10,0x03,0x99,0x78,0x04,0x60,0xA0, + /*BEB0:*/ 0x03,0xB1,0x48,0x85,0x41,0xA9,0xAA,0x85, + /*BEB8:*/ 0x3E,0xA0,0x56,0xA9,0x00,0x85,0x44,0x99, + /*BEC0:*/ 0xFF,0xBB,0x88,0xD0,0xFA,0x99,0x00,0xBB, + /*BEC8:*/ 0x88,0xD0,0xFA,0xA9,0x50,0x20,0x95,0xBE, + /*BED0:*/ 0xA9,0x28,0x85,0x45,0xA5,0x44,0x20,0x5A, + /*BED8:*/ 0xBE,0x20,0x0D,0xBF,0xA9,0x08,0xB0,0x24, + /*BEE0:*/ 0xA9,0x30,0x8D,0x78,0x05,0x38,0xCE,0x78, + /*BEE8:*/ 0x05,0xF0,0x19,0x20,0x44,0xB9,0xB0,0xF5, + /*BEF0:*/ 0xA5,0x2D,0xD0,0xF1,0x20,0xDC,0xB8,0xB0, + /*BEF8:*/ 0xEC,0xE6,0x44,0xA5,0x44,0xC9,0x23,0x90, + /*BF00:*/ 0xD3,0x18,0x90,0x05,0xA0,0x0D,0x91,0x48, + /*BF08:*/ 0x38,0xBD,0x88,0xC0,0x60,0xA9,0x00,0x85, + /*BF10:*/ 0x3F,0xA0,0x80,0xD0,0x02,0xA4,0x45,0x20, + /*BF18:*/ 0x56,0xBC,0xB0,0x6B,0x20,0x2A,0xB8,0xB0, + /*BF20:*/ 0x66,0xE6,0x3F,0xA5,0x3F,0xC9,0x10,0x90, + /*BF28:*/ 0xEC,0xA0,0x0F,0x84,0x3F,0xA9,0x30,0x8D, + /*BF30:*/ 0x78,0x05,0x99,0xA8,0xBF,0x88,0x10,0xFA, + /*BF38:*/ 0xA4,0x45,0x20,0x87,0xBF,0x20,0x87,0xBF, + /*BF40:*/ 0x20,0x87,0xBF,0x48,0x68,0xEA,0x88,0xD0, + /*BF48:*/ 0xF1,0x20,0x44,0xB9,0xB0,0x23,0xA5,0x2D, + /*BF50:*/ 0xF0,0x15,0xA9,0x10,0xC5,0x45,0xA5,0x45, + /*BF58:*/ 0xE9,0x01,0x85,0x45,0xC9,0x05,0xB0,0x11, + /*BF60:*/ 0x38,0x60,0x20,0x44,0xB9,0xB0,0x05,0x20, + /*BF68:*/ 0xDC,0xB8,0x90,0x1C,0xCE,0x78,0x05,0xD0, + /*BF70:*/ 0xF1,0x20,0x44,0xB9,0xB0,0x0B,0xA5,0x2D, + /*BF78:*/ 0xC9,0x0F,0xD0,0x05,0x20,0xDC,0xB8,0x90, + /*BF80:*/ 0x8C,0xCE,0x78,0x05,0xD0,0xEB,0x38,0x60, + /*BF88:*/ 0xA4,0x2D,0xB9,0xA8,0xBF,0x30,0xDD,0xA9, + /*BF90:*/ 0xFF,0x99,0xA8,0xBF,0xC6,0x3F,0x10,0xCA, + /*BF98:*/ 0xA5,0x44,0xD0,0x0A,0xA5,0x45,0xC9,0x10, + /*BFA0:*/ 0x90,0xE5,0xC6,0x45,0xC6,0x45,0x18,0x60, + /*BFA8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BFB0:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + /*BFB8:*/ 0x00,0x0D,0x0B,0x09,0x07,0x05,0x03,0x01, + /*BFC0:*/ 0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x0F, + /*BFC8:*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; -//DOS 3.3 -unsigned char dosboot2[] = { - 0xD3,0x9C,0x81,0x9E,0xBD,0x9E,0x75,0xAA, - 0x93,0xAA,0x60,0xAA,0x00,0x9D,0xBB,0xB5, - 0xEA,0x9E,0x11,0x9F,0x22,0x9F,0x2E,0x9F, - 0x51,0x9F,0x60,0x9F,0x70,0x9F,0x4E,0xA5, - 0x12,0xA4,0x96,0xA3,0xD0,0xA4,0xEF,0xA4, - 0x62,0xA2,0x70,0xA2,0x74,0xA2,0xE9,0xA2, - 0x1A,0xA5,0xC5,0xA5,0x0F,0xA5,0xDC,0xA5, - 0xA2,0xA2,0x97,0xA2,0x80,0xA2,0x6D,0xA5, - 0x32,0xA2,0x3C,0xA2,0x28,0xA2,0x2D,0xA2, - 0x50,0xA2,0x79,0xA5,0x9D,0xA5,0x30,0xA3, - 0x5C,0xA3,0x8D,0xA3,0x7C,0xA2,0xFC,0xA4, - 0xFC,0xA4,0x65,0xD8,0x00,0xE0,0x3C,0xD4, - 0xF2,0xD4,0x36,0xE8,0xE5,0xA4,0xE3,0xE3, - 0x00,0xE0,0x03,0xE0,0xFC,0xA4,0xFC,0xA4, - 0x65,0xD8,0x00,0xE0,0x3C,0xD4,0xF2,0xD4, - 0x06,0xA5,0x06,0xA5,0x67,0x10,0x84,0x9D, - 0x3C,0x0C,0xF2,0x0C,0xAD,0xE9,0xB7,0x4A, - 0x4A,0x4A,0x4A,0x8D,0x6A,0xAA,0xAD,0xEA, - 0xB7,0x8D,0x68,0xAA,0xAD,0x00,0xE0,0x49, - 0x20,0xD0,0x11,0x8D,0xB6,0xAA,0xA2,0x0A, - 0xBD,0x61,0x9D,0x9D,0x55,0x9D,0xCA,0xD0, - 0xF7,0x4C,0xBC,0x9D,0xA9,0x40,0x8D,0xB6, - 0xAA,0xA2,0x0C,0xBD,0x6B,0x9D,0x9D,0x55, - 0x9D,0xCA,0xD0,0xF7,0x38,0xB0,0x12,0xAD, - 0xB6,0xAA,0xD0,0x04,0xA9,0x20,0xD0,0x05, - 0x0A,0x10,0x05,0xA9,0x4C,0x20,0xB2,0xA5, - 0x18,0x08,0x20,0x51,0xA8,0xA9,0x00,0x8D, - 0x5E,0xAA,0x8D,0x52,0xAA,0x28,0x6A,0x8D, - 0x51,0xAA,0x30,0x03,0x6C,0x5E,0x9D,0x6C, - 0x5C,0x9D,0x0A,0x10,0x19,0x8D,0xB6,0xAA, - 0xA2,0x0C,0xBD,0x77,0x9D,0x9D,0x55,0x9D, - 0xCA,0xD0,0xF7,0xA2,0x1D,0xBD,0x93,0xAA, - 0x9D,0x75,0xAA,0xCA,0x10,0xF7,0xAD,0xB1, - 0xAA,0x8D,0x57,0xAA,0x20,0xD4,0xA7,0xAD, - 0xB3,0xAA,0xF0,0x09,0x48,0x20,0x9D,0xA6, - 0x68,0xA0,0x00,0x91,0x40,0x20,0x5B,0xA7, - 0xAD,0x5F,0xAA,0xD0,0x20,0xA2,0x2F,0xBD, - 0x51,0x9E,0x9D,0xD0,0x03,0xCA,0x10,0xF7, - 0xAD,0x53,0x9E,0x8D,0xF3,0x03,0x49,0xA5, - 0x8D,0xF4,0x03,0xAD,0x52,0x9E,0x8D,0xF2, - 0x03,0xA9,0x06,0xD0,0x05,0xAD,0x62,0xAA, - 0xF0,0x06,0x8D,0x5F,0xAA,0x4C,0x80,0xA1, - 0x60,0x4C,0xBF,0x9D,0x4C,0x84,0x9D,0x4C, - 0xFD,0xAA,0x4C,0xB5,0xB7,0xAD,0x0F,0x9D, - 0xAC,0x0E,0x9D,0x60,0xAD,0xC2,0xAA,0xAC, - 0xC1,0xAA,0x60,0x4C,0x51,0xA8,0xEA,0xEA, - 0x4C,0x59,0xFA,0x4C,0x65,0xFF,0x4C,0x58, - 0xFF,0x4C,0x65,0xFF,0x4C,0x65,0xFF,0x65, - 0xFF,0x20,0xD1,0x9E,0xAD,0x51,0xAA,0xF0, - 0x15,0x48,0xAD,0x5C,0xAA,0x91,0x28,0x68, - 0x30,0x03,0x4C,0x26,0xA6,0x20,0xEA,0x9D, - 0xA4,0x24,0xA9,0x60,0x91,0x28,0xAD,0xB3, - 0xAA,0xF0,0x03,0x20,0x82,0xA6,0xA9,0x03, - 0x8D,0x52,0xAA,0x20,0xBA,0x9F,0x20,0xBA, - 0x9E,0x8D,0x5C,0xAA,0x8E,0x5A,0xAA,0x4C, - 0xB3,0x9F,0x6C,0x38,0x00,0x20,0xD1,0x9E, - 0xAD,0x52,0xAA,0x0A,0xAA,0xBD,0x11,0x9D, - 0x48,0xBD,0x10,0x9D,0x48,0xAD,0x5C,0xAA, - 0x60,0x8D,0x5C,0xAA,0x8E,0x5A,0xAA,0x8C, - 0x5B,0xAA,0xBA,0xE8,0xE8,0x8E,0x59,0xAA, - 0xA2,0x03,0xBD,0x53,0xAA,0x95,0x36,0xCA, - 0x10,0xF8,0x60,0xAE,0xB7,0xAA,0xF0,0x03, - 0x4C,0x78,0x9F,0xAE,0x51,0xAA,0xF0,0x08, - 0xC9,0xBF,0xF0,0x75,0xC5,0x33,0xF0,0x27, - 0xA2,0x02,0x8E,0x52,0xAA,0xCD,0xB2,0xAA, - 0xD0,0x19,0xCA,0x8E,0x52,0xAA,0xCA,0x8E, - 0x5D,0xAA,0xAE,0x5D,0xAA,0x9D,0x00,0x02, - 0xE8,0x8E,0x5D,0xAA,0xC9,0x8D,0xD0,0x75, - 0x4C,0xCD,0x9F,0xC9,0x8D,0xD0,0x7D,0xA2, - 0x00,0x8E,0x52,0xAA,0x4C,0xA4,0x9F,0xA2, - 0x00,0x8E,0x52,0xAA,0xC9,0x8D,0xF0,0x07, - 0xAD,0xB3,0xAA,0xF0,0x67,0xD0,0x5E,0x48, - 0x38,0xAD,0xB3,0xAA,0xD0,0x03,0x20,0x5E, - 0xA6,0x68,0x90,0xEC,0xAE,0x5A,0xAA,0x4C, - 0x15,0x9F,0xC9,0x8D,0xD0,0x05,0xA9,0x05, - 0x8D,0x52,0xAA,0x20,0x0E,0xA6,0x4C,0x99, - 0x9F,0xCD,0xB2,0xAA,0xF0,0x85,0xC9,0x8A, - 0xF0,0xF1,0xA2,0x04,0x8E,0x52,0xAA,0xD0, - 0xE1,0xA9,0x00,0x8D,0x52,0xAA,0xF0,0x25, - 0xA9,0x00,0x8D,0xB7,0xAA,0x20,0x51,0xA8, - 0x4C,0xDC,0xA4,0xAD,0x00,0x02,0xCD,0xB2, - 0xAA,0xF0,0x0A,0xA9,0x8D,0x8D,0x00,0x02, - 0xA2,0x00,0x8E,0x5A,0xAA,0xA9,0x40,0xD0, - 0x06,0xA9,0x10,0xD0,0x02,0xA9,0x20,0x2D, - 0x5E,0xAA,0xF0,0x0F,0x20,0xBA,0x9F,0x20, - 0xC5,0x9F,0x8D,0x5C,0xAA,0x8C,0x5B,0xAA, - 0x8E,0x5A,0xAA,0x20,0x51,0xA8,0xAE,0x59, - 0xAA,0x9A,0xAD,0x5C,0xAA,0xAC,0x5B,0xAA, - 0xAE,0x5A,0xAA,0x38,0x60,0x6C,0x36,0x00, - 0xA9,0x8D,0x4C,0xC5,0x9F,0xA0,0xFF,0x8C, - 0x5F,0xAA,0xC8,0x8C,0x62,0xAA,0xEE,0x5F, - 0xAA,0xA2,0x00,0x08,0xBD,0x00,0x02,0xCD, - 0xB2,0xAA,0xD0,0x01,0xE8,0x8E,0x5D,0xAA, - 0x20,0xA4,0xA1,0x29,0x7F,0x59,0x84,0xA8, - 0xC8,0x0A,0xF0,0x02,0x68,0x08,0x90,0xF0, - 0x28,0xF0,0x20,0xB9,0x84,0xA8,0xD0,0xD6, - 0xAD,0x00,0x02,0xCD,0xB2,0xAA,0xF0,0x03, - 0x4C,0xA4,0x9F,0xAD,0x01,0x02,0xC9,0x8D, - 0xD0,0x06,0x20,0x5B,0xA7,0x4C,0x95,0x9F, - 0x4C,0xC4,0xA6,0x0E,0x5F,0xAA,0xAC,0x5F, - 0xAA,0x20,0x5E,0xA6,0x90,0x0C,0xA9,0x02, - 0x39,0x09,0xA9,0xF0,0x05,0xA9,0x0F,0x4C, - 0xD2,0xA6,0xC0,0x06,0xD0,0x02,0x84,0x33, - 0xA9,0x20,0x39,0x09,0xA9,0xF0,0x61,0x20, - 0x95,0xA0,0x08,0x20,0xA4,0xA1,0xF0,0x1E, - 0x0A,0x90,0x05,0x30,0x03,0x4C,0x00,0xA0, - 0x6A,0x4C,0x59,0xA0,0x20,0x93,0xA1,0xF0, - 0x0D,0x99,0x75,0xAA,0xC8,0xC0,0x3C,0x90, - 0xF3,0x20,0x93,0xA1,0xD0,0xFB,0x28,0xD0, - 0x0F,0xAC,0x5F,0xAA,0xA9,0x10,0x39,0x09, - 0xA9,0xF0,0x0C,0xA0,0x1E,0x08,0xD0,0xCB, - 0xAD,0x93,0xAA,0xC9,0xA0,0xF0,0x13,0xAD, - 0x75,0xAA,0xC9,0xA0,0xD0,0x4B,0xAC,0x5F, - 0xAA,0xA9,0xC0,0x39,0x09,0xA9,0xF0,0x02, - 0x10,0x3F,0x4C,0x00,0xA0,0xA0,0x3C,0xA9, - 0xA0,0x99,0x74,0xAA,0x88,0xD0,0xFA,0x60, - 0x8D,0x75,0xAA,0xA9,0x0C,0x39,0x09,0xA9, - 0xF0,0x27,0x20,0xB9,0xA1,0xB0,0x1F,0xA8, - 0xD0,0x17,0xE0,0x11,0xB0,0x13,0xAC,0x5F, - 0xAA,0xA9,0x08,0x39,0x09,0xA9,0xF0,0x06, - 0xE0,0x08,0xB0,0xCE,0x90,0x0B,0x8A,0xD0, - 0x08,0xA9,0x02,0x4C,0xD2,0xA6,0x4C,0xC4, - 0xA6,0xA9,0x00,0x8D,0x65,0xAA,0x8D,0x74, - 0xAA,0x8D,0x66,0xAA,0x8D,0x6C,0xAA,0x8D, - 0x6D,0xAA,0x20,0xDC,0xBF,0xAD,0x5D,0xAA, - 0x20,0xA4,0xA1,0xD0,0x1F,0xC9,0x8D,0xD0, - 0xF7,0xAE,0x5F,0xAA,0xAD,0x65,0xAA,0x1D, - 0x0A,0xA9,0x5D,0x0A,0xA9,0xD0,0x93,0xAE, - 0x63,0xAA,0xF0,0x76,0x8D,0x63,0xAA,0x8E, - 0x5D,0xAA,0xD0,0xDC,0xA2,0x0A,0xDD,0x40, - 0xA9,0xF0,0x05,0xCA,0xD0,0xF8,0xF0,0xB6, - 0xBD,0x4A,0xA9,0x30,0x47,0x0D,0x65,0xAA, - 0x8D,0x65,0xAA,0xCA,0x8E,0x64,0xAA,0x20, - 0xB9,0xA1,0xB0,0xA2,0xAD,0x64,0xAA,0x0A, - 0x0A,0xA8,0xA5,0x45,0xD0,0x09,0xA5,0x44, - 0xD9,0x55,0xA9,0x90,0x8C,0xA5,0x45,0xD9, - 0x58,0xA9,0x90,0x0B,0xD0,0x83,0xA5,0x44, - 0xD9,0x57,0xA9,0x90,0x02,0xD0,0xF5,0xAD, - 0x63,0xAA,0xD0,0x94,0x98,0x4A,0xA8,0xA5, - 0x45,0x99,0x67,0xAA,0xA5,0x44,0x99,0x66, - 0xAA,0x4C,0xE8,0xA0,0x48,0xA9,0x80,0x0D, - 0x65,0xAA,0x8D,0x65,0xAA,0x68,0x29,0x7F, - 0x0D,0x74,0xAA,0x8D,0x74,0xAA,0xD0,0xE9, - 0xF0,0x9C,0x20,0x80,0xA1,0x4C,0x83,0x9F, - 0x20,0x5B,0xA7,0x20,0xAE,0xA1,0xAD,0x5F, - 0xAA,0xAA,0xBD,0x1F,0x9D,0x48,0xBD,0x1E, - 0x9D,0x48,0x60,0xAE,0x5D,0xAA,0xBD,0x00, - 0x02,0xC9,0x8D,0xF0,0x06,0xE8,0x8E,0x5D, - 0xAA,0xC9,0xAC,0x60,0x20,0x93,0xA1,0xF0, - 0xFA,0xC9,0xA0,0xF0,0xF7,0x60,0xA9,0x00, - 0xA0,0x16,0x99,0xBA,0xB5,0x88,0xD0,0xFA, - 0x60,0xA9,0x00,0x85,0x44,0x85,0x45,0x20, - 0xA4,0xA1,0x08,0xC9,0xA4,0xF0,0x3C,0x28, - 0x4C,0xCE,0xA1,0x20,0xA4,0xA1,0xD0,0x06, - 0xA6,0x44,0xA5,0x45,0x18,0x60,0x38,0xE9, - 0xB0,0x30,0x21,0xC9,0x0A,0xB0,0x1D,0x20, - 0xFE,0xA1,0x65,0x44,0xAA,0xA9,0x00,0x65, - 0x45,0xA8,0x20,0xFE,0xA1,0x20,0xFE,0xA1, - 0x8A,0x65,0x44,0x85,0x44,0x98,0x65,0x45, - 0x85,0x45,0x90,0xCF,0x38,0x60,0x06,0x44, - 0x26,0x45,0x60,0x28,0x20,0xA4,0xA1,0xF0, - 0xC5,0x38,0xE9,0xB0,0x30,0xEE,0xC9,0x0A, - 0x90,0x08,0xE9,0x07,0x30,0xE6,0xC9,0x10, - 0xB0,0xE2,0xA2,0x04,0x20,0xFE,0xA1,0xCA, - 0xD0,0xFA,0x05,0x44,0x85,0x44,0x4C,0x04, - 0xA2,0xA5,0x44,0x4C,0x95,0xFE,0xA5,0x44, - 0x4C,0x8B,0xFE,0xAD,0x5E,0xAA,0x0D,0x74, - 0xAA,0x8D,0x5E,0xAA,0x60,0x2C,0x74,0xAA, - 0x50,0x03,0x20,0xC8,0x9F,0xA9,0x70,0x4D, - 0x74,0xAA,0x2D,0x5E,0xAA,0x8D,0x5E,0xAA, - 0x60,0xA9,0x00,0x8D,0xB3,0xAA,0xA5,0x44, - 0x48,0x20,0x16,0xA3,0x68,0x8D,0x57,0xAA, - 0x4C,0xD4,0xA7,0xA9,0x05,0x20,0xAA,0xA2, - 0x20,0x64,0xA7,0xA0,0x00,0x98,0x91,0x40, - 0x60,0xA9,0x07,0xD0,0x02,0xA9,0x08,0x20, - 0xAA,0xA2,0x4C,0xEA,0xA2,0xA9,0x0C,0xD0, - 0xF6,0xAD,0x08,0x9D,0x8D,0xBD,0xB5,0xAD, - 0x09,0x9D,0x8D,0xBE,0xB5,0xA9,0x09,0x8D, - 0x63,0xAA,0x20,0xC8,0xA2,0x4C,0xEA,0xA2, - 0x20,0xA3,0xA2,0x20,0x8C,0xA6,0xD0,0xFB, - 0x4C,0x71,0xB6,0xA9,0x00,0x4C,0xD5,0xA3, - 0xA9,0x01,0x8D,0x63,0xAA,0xAD,0x6C,0xAA, - 0xD0,0x0A,0xAD,0x6D,0xAA,0xD0,0x05,0xA9, - 0x01,0x8D,0x6C,0xAA,0xAD,0x6C,0xAA,0x8D, - 0xBD,0xB5,0xAD,0x6D,0xAA,0x8D,0xBE,0xB5, - 0x20,0xEA,0xA2,0xA5,0x45,0xD0,0x03,0x4C, - 0xC8,0xA6,0x85,0x41,0xA5,0x44,0x85,0x40, - 0x20,0x43,0xA7,0x20,0x4E,0xA7,0x20,0x1A, - 0xA7,0xAD,0x63,0xAA,0x8D,0xBB,0xB5,0x4C, - 0xA8,0xA6,0xAD,0x75,0xAA,0xC9,0xA0,0xF0, - 0x25,0x20,0x64,0xA7,0xB0,0x3A,0x20,0xFC, - 0xA2,0x4C,0xEA,0xA2,0x20,0xAF,0xA7,0xD0, - 0x05,0xA9,0x00,0x8D,0xB3,0xAA,0xA0,0x00, - 0x98,0x91,0x40,0x20,0x4E,0xA7,0xA9,0x02, - 0x8D,0xBB,0xB5,0x4C,0xA8,0xA6,0x20,0x92, - 0xA7,0xD0,0x05,0x20,0x9A,0xA7,0xF0,0x10, - 0x20,0xAF,0xA7,0xF0,0xF6,0x20,0xAA,0xA7, - 0xF0,0xF1,0x20,0xFC,0xA2,0x4C,0x16,0xA3, - 0x60,0xA9,0x09,0x2D,0x65,0xAA,0xC9,0x09, - 0xF0,0x03,0x4C,0x00,0xA0,0xA9,0x04,0x20, - 0xD5,0xA3,0xAD,0x73,0xAA,0xAC,0x72,0xAA, - 0x20,0xE0,0xA3,0xAD,0x6D,0xAA,0xAC,0x6C, - 0xAA,0x20,0xE0,0xA3,0xAD,0x73,0xAA,0xAC, - 0x72,0xAA,0x4C,0xFF,0xA3,0x20,0xA8,0xA2, - 0xA9,0x7F,0x2D,0xC2,0xB5,0xC9,0x04,0xF0, - 0x03,0x4C,0xD0,0xA6,0xA9,0x04,0x20,0xD5, - 0xA3,0x20,0x7A,0xA4,0xAA,0xAD,0x65,0xAA, - 0x29,0x01,0xD0,0x06,0x8E,0x72,0xAA,0x8C, - 0x73,0xAA,0x20,0x7A,0xA4,0xAE,0x72,0xAA, - 0xAC,0x73,0xAA,0x4C,0x71,0xA4,0x20,0x5D, - 0xA3,0x20,0x51,0xA8,0x6C,0x72,0xAA,0xAD, - 0xB6,0xAA,0xF0,0x20,0xA5,0xD6,0x10,0x03, - 0x4C,0xCC,0xA6,0xA9,0x02,0x20,0xD5,0xA3, - 0x38,0xA5,0xAF,0xE5,0x67,0xA8,0xA5,0xB0, - 0xE5,0x68,0x20,0xE0,0xA3,0xA5,0x68,0xA4, - 0x67,0x4C,0xFF,0xA3,0xA9,0x01,0x20,0xD5, - 0xA3,0x38,0xA5,0x4C,0xE5,0xCA,0xA8,0xA5, - 0x4D,0xE5,0xCB,0x20,0xE0,0xA3,0xA5,0xCB, - 0xA4,0xCA,0x4C,0xFF,0xA3,0x8D,0xC2,0xB5, - 0x48,0x20,0xA8,0xA2,0x68,0x4C,0xC4,0xA7, - 0x8C,0xC1,0xB5,0x8C,0xC3,0xB5,0x8D,0xC2, - 0xB5,0xA9,0x04,0x8D,0xBB,0xB5,0xA9,0x01, - 0x8D,0xBC,0xB5,0x20,0xA8,0xA6,0xAD,0xC2, - 0xB5,0x8D,0xC3,0xB5,0x4C,0xA8,0xA6,0x8C, - 0xC3,0xB5,0x8D,0xC4,0xB5,0xA9,0x02,0x4C, - 0x86,0xB6,0x20,0xA8,0xA6,0x4C,0xEA,0xA2, - 0x4C,0xD0,0xA6,0x20,0x16,0xA3,0x20,0xA8, - 0xA2,0xA9,0x23,0x2D,0xC2,0xB5,0xF0,0xF0, - 0x8D,0xC2,0xB5,0xAD,0xB6,0xAA,0xF0,0x28, - 0xA9,0x02,0x20,0xB1,0xA4,0x20,0x7A,0xA4, - 0x18,0x65,0x67,0xAA,0x98,0x65,0x68,0xC5, - 0x74,0xB0,0x70,0x85,0xB0,0x85,0x6A,0x86, - 0xAF,0x86,0x69,0xA6,0x67,0xA4,0x68,0x20, - 0x71,0xA4,0x20,0x51,0xA8,0x6C,0x60,0x9D, - 0xA9,0x01,0x20,0xB1,0xA4,0x20,0x7A,0xA4, - 0x38,0xA5,0x4C,0xED,0x60,0xAA,0xAA,0xA5, - 0x4D,0xED,0x61,0xAA,0x90,0x45,0xA8,0xC4, - 0x4B,0x90,0x40,0xF0,0x3E,0x84,0xCB,0x86, - 0xCA,0x8E,0xC3,0xB5,0x8C,0xC4,0xB5,0x4C, - 0x0A,0xA4,0xAD,0x0A,0x9D,0x8D,0xC3,0xB5, - 0xAD,0x0B,0x9D,0x8D,0xC4,0xB5,0xA9,0x00, - 0x8D,0xC2,0xB5,0xA9,0x02,0x8D,0xC1,0xB5, - 0xA9,0x03,0x8D,0xBB,0xB5,0xA9,0x02,0x8D, - 0xBC,0xB5,0x20,0xA8,0xA6,0xAD,0x61,0xAA, - 0x8D,0xC2,0xB5,0xA8,0xAD,0x60,0xAA,0x8D, - 0xC1,0xB5,0x60,0x20,0xEA,0xA2,0x4C,0xCC, - 0xA6,0xCD,0xC2,0xB5,0xF0,0x1A,0xAE,0x5F, - 0xAA,0x8E,0x62,0xAA,0x4A,0xF0,0x03,0x4C, - 0x9E,0xA5,0xA2,0x1D,0xBD,0x75,0xAA,0x9D, - 0x93,0xAA,0xCA,0x10,0xF7,0x4C,0x7A,0xA5, - 0x60,0xAD,0xB6,0xAA,0xF0,0x03,0x8D,0xB7, - 0xAA,0x20,0x13,0xA4,0x20,0xC8,0x9F,0x20, - 0x51,0xA8,0x6C,0x58,0x9D,0xA5,0x4A,0x85, - 0xCC,0xA5,0x4B,0x85,0xCD,0x6C,0x56,0x9D, - 0x20,0x16,0xA4,0x20,0xC8,0x9F,0x20,0x51, - 0xA8,0x6C,0x56,0x9D,0x20,0x65,0xD6,0x85, - 0x33,0x85,0xD8,0x4C,0xD2,0xD7,0x20,0x65, - 0x0E,0x85,0x33,0x85,0xD8,0x4C,0xD4,0x0F, - 0x20,0x26,0xA5,0xA9,0x05,0x8D,0x52,0xAA, - 0x4C,0x83,0x9F,0x20,0x26,0xA5,0xA9,0x01, - 0x8D,0x51,0xAA,0x4C,0x83,0x9F,0x20,0x64, - 0xA7,0x90,0x06,0x20,0xA3,0xA2,0x4C,0x34, - 0xA5,0x20,0x4E,0xA7,0xAD,0x65,0xAA,0x29, - 0x06,0xF0,0x13,0xA2,0x03,0xBD,0x6E,0xAA, - 0x9D,0xBD,0xB5,0xCA,0x10,0xF7,0xA9,0x0A, - 0x8D,0xBB,0xB5,0x20,0xA8,0xA6,0x60,0xA9, - 0x40,0x2D,0x65,0xAA,0xF0,0x05,0xAD,0x66, - 0xAA,0xD0,0x05,0xA9,0xFE,0x8D,0x66,0xAA, - 0xAD,0x0D,0x9D,0x8D,0xBC,0xB5,0xA9,0x0B, - 0x20,0xAA,0xA2,0x4C,0x97,0xA3,0xA9,0x06, - 0x20,0xAA,0xA2,0xAD,0xBF,0xB5,0x8D,0x66, - 0xAA,0x60,0xA9,0x4C,0x20,0xB2,0xA5,0xF0, - 0x2E,0xA9,0x00,0x8D,0xB6,0xAA,0xA0,0x1E, - 0x20,0x97,0xA0,0xA2,0x09,0xBD,0xB7,0xAA, - 0x9D,0x74,0xAA,0xCA,0xD0,0xF7,0xA9,0xC0, - 0x8D,0x51,0xAA,0x4C,0xD1,0xA4,0xA9,0x20, - 0x20,0xB2,0xA5,0xF0,0x05,0xA9,0x01,0x4C, - 0xD2,0xA6,0xA9,0x00,0x8D,0xB7,0xAA,0x4C, - 0x84,0x9D,0xCD,0x00,0xE0,0xF0,0x0E,0x8D, - 0x80,0xC0,0xCD,0x00,0xE0,0xF0,0x06,0x8D, - 0x81,0xC0,0xCD,0x00,0xE0,0x60,0x20,0xA3, - 0xA2,0xAD,0x4F,0xAA,0x8D,0xB4,0xAA,0xAD, - 0x50,0xAA,0x8D,0xB5,0xAA,0xAD,0x75,0xAA, - 0x8D,0xB3,0xAA,0xD0,0x0E,0x20,0x64,0xA7, - 0x90,0x06,0x20,0xA3,0xA2,0x4C,0xEB,0xA5, - 0x20,0x4E,0xA7,0xAD,0x65,0xAA,0x29,0x04, - 0xF0,0x1B,0xAD,0x6E,0xAA,0xD0,0x08,0xAE, - 0x6F,0xAA,0xF0,0x11,0xCE,0x6F,0xAA,0xCE, - 0x6E,0xAA,0x20,0x8C,0xA6,0xF0,0x38,0xC9, - 0x8D,0xD0,0xF7,0xF0,0xE5,0x60,0x20,0x5E, - 0xA6,0xB0,0x66,0xAD,0x5C,0xAA,0x8D,0xC3, - 0xB5,0xA9,0x04,0x8D,0xBB,0xB5,0xA9,0x01, - 0x8D,0xBC,0xB5,0x4C,0xA8,0xA6,0x20,0x5E, - 0xA6,0xB0,0x4E,0xA9,0x06,0x8D,0x52,0xAA, - 0x20,0x8C,0xA6,0xD0,0x0F,0x20,0xFC,0xA2, - 0xA9,0x03,0xCD,0x52,0xAA,0xF0,0xCE,0xA9, - 0x05,0x4C,0xD2,0xA6,0xC9,0xE0,0x90,0x02, - 0x29,0x7F,0x8D,0x5C,0xAA,0xAE,0x5A,0xAA, - 0xF0,0x09,0xCA,0xBD,0x00,0x02,0x09,0x80, - 0x9D,0x00,0x02,0x4C,0xB3,0x9F,0x48,0xAD, - 0xB6,0xAA,0xF0,0x0E,0xA6,0x76,0xE8,0xF0, - 0x0D,0xA6,0x33,0xE0,0xDD,0xF0,0x07,0x68, - 0x18,0x60,0xA5,0xD9,0x30,0xF9,0x68,0x38, - 0x60,0x20,0xFC,0xA2,0x20,0x5B,0xA7,0x4C, - 0xB3,0x9F,0x20,0x9D,0xA6,0x20,0x4E,0xA7, - 0xA9,0x03,0xD0,0xA1,0xA9,0x03,0x8D,0xBB, - 0xB5,0xA9,0x01,0x8D,0xBC,0xB5,0x20,0xA8, - 0xA6,0xAD,0xC3,0xB5,0x60,0xAD,0xB5,0xAA, - 0x85,0x41,0xAD,0xB4,0xAA,0x85,0x40,0x60, - 0x20,0x06,0xAB,0x90,0x16,0xAD,0xC5,0xB5, - 0xC9,0x05,0xF0,0x03,0x4C,0x5E,0xB6,0x4C, - 0x92,0xB6,0xEA,0x20,0x69,0xBA,0xA2,0x00, - 0x8E,0xC3,0xB5,0x60,0xA9,0x0B,0xD0,0x0A, - 0xA9,0x0C,0xD0,0x06,0xA9,0x0E,0xD0,0x02, - 0xA9,0x0D,0x8D,0x5C,0xAA,0x20,0xE6,0xBF, - 0xAD,0xB6,0xAA,0xF0,0x04,0xA5,0xD8,0x30, - 0x0E,0xA2,0x00,0x20,0x02,0xA7,0xAE,0x5C, - 0xAA,0x20,0x02,0xA7,0x20,0xC8,0x9F,0x20, - 0x51,0xA8,0x20,0x5E,0xA6,0xAE,0x5C,0xAA, - 0xA9,0x03,0xB0,0x03,0x6C,0x5A,0x9D,0x6C, - 0x5E,0x9D,0xBD,0x3F,0xAA,0xAA,0x8E,0x63, - 0xAA,0xBD,0x71,0xA9,0x48,0x09,0x80,0x20, - 0xC5,0x9F,0xAE,0x63,0xAA,0xE8,0x68,0x10, - 0xED,0x60,0xAD,0x66,0xAA,0x8D,0xBF,0xB5, - 0xAD,0x68,0xAA,0x8D,0xC0,0xB5,0xAD,0x6A, - 0xAA,0x8D,0xC1,0xB5,0xAD,0x06,0x9D,0x8D, - 0xC3,0xB5,0xAD,0x07,0x9D,0x8D,0xC4,0xB5, - 0xA5,0x40,0x8D,0x4F,0xAA,0xA5,0x41,0x8D, - 0x50,0xAA,0x60,0xA0,0x1D,0xB9,0x75,0xAA, - 0x91,0x40,0x88,0x10,0xF8,0x60,0xA0,0x1E, - 0xB1,0x40,0x99,0xA9,0xB5,0xC8,0xC0,0x26, - 0xD0,0xF6,0x60,0xA0,0x00,0x8C,0x51,0xAA, - 0x8C,0x52,0xAA,0x60,0xA9,0x00,0x85,0x45, - 0x20,0x92,0xA7,0x4C,0x73,0xA7,0x20,0x9A, - 0xA7,0xF0,0x1D,0x20,0xAA,0xA7,0xD0,0x0A, - 0xA5,0x40,0x85,0x44,0xA5,0x41,0x85,0x45, - 0xD0,0xEC,0xA0,0x1D,0xB1,0x40,0xD9,0x75, - 0xAA,0xD0,0xE3,0x88,0x10,0xF6,0x18,0x60, - 0x38,0x60,0xAD,0x00,0x9D,0xAE,0x01,0x9D, - 0xD0,0x0A,0xA0,0x25,0xB1,0x40,0xF0,0x09, - 0xAA,0x88,0xB1,0x40,0x86,0x41,0x85,0x40, - 0x8A,0x60,0xA0,0x00,0xB1,0x40,0x60,0xAD, - 0xB3,0xAA,0xF0,0x0E,0xAD,0xB4,0xAA,0xC5, - 0x40,0xD0,0x08,0xAD,0xB5,0xAA,0xC5,0x41, - 0xF0,0x01,0xCA,0x60,0x4D,0xC2,0xB5,0xF0, - 0x0A,0x29,0x7F,0xF0,0x06,0x20,0xEA,0xA2, - 0x4C,0xD0,0xA6,0x60,0x38,0xAD,0x00,0x9D, - 0x85,0x40,0xAD,0x01,0x9D,0x85,0x41,0xAD, - 0x57,0xAA,0x8D,0x63,0xAA,0xA0,0x00,0x98, - 0x91,0x40,0xA0,0x1E,0x38,0xA5,0x40,0xE9, - 0x2D,0x91,0x40,0x48,0xA5,0x41,0xE9,0x00, - 0xC8,0x91,0x40,0xAA,0xCA,0x68,0x48,0xC8, - 0x91,0x40,0x8A,0xC8,0x91,0x40,0xAA,0xCA, - 0x68,0x48,0xC8,0x91,0x40,0xC8,0x8A,0x91, - 0x40,0xCE,0x63,0xAA,0xF0,0x17,0xAA,0x68, - 0x38,0xE9,0x26,0xC8,0x91,0x40,0x48,0x8A, - 0xE9,0x00,0xC8,0x91,0x40,0x85,0x41,0x68, - 0x85,0x40,0x4C,0xE5,0xA7,0x48,0xA9,0x00, - 0xC8,0x91,0x40,0xC8,0x91,0x40,0xAD,0xB6, - 0xAA,0xF0,0x0B,0x68,0x85,0x74,0x85,0x70, - 0x68,0x85,0x73,0x85,0x6F,0x60,0x68,0x85, - 0x4D,0x85,0xCB,0x68,0x85,0x4C,0x85,0xCA, - 0x60,0xA5,0x39,0xCD,0x03,0x9D,0xF0,0x12, - 0x8D,0x56,0xAA,0xA5,0x38,0x8D,0x55,0xAA, - 0xAD,0x02,0x9D,0x85,0x38,0xAD,0x03,0x9D, - 0x85,0x39,0xA5,0x37,0xCD,0x05,0x9D,0xF0, - 0x12,0x8D,0x54,0xAA,0xA5,0x36,0x8D,0x53, - 0xAA,0xAD,0x04,0x9D,0x85,0x36,0xAD,0x05, - 0x9D,0x85,0x37,0x60,0x49,0x4E,0x49,0xD4, - 0x4C,0x4F,0x41,0xC4,0x53,0x41,0x56,0xC5, - 0x52,0x55,0xCE,0x43,0x48,0x41,0x49,0xCE, - 0x44,0x45,0x4C,0x45,0x54,0xC5,0x4C,0x4F, - 0x43,0xCB,0x55,0x4E,0x4C,0x4F,0x43,0xCB, - 0x43,0x4C,0x4F,0x53,0xC5,0x52,0x45,0x41, - 0xC4,0x45,0x58,0x45,0xC3,0x57,0x52,0x49, - 0x54,0xC5,0x50,0x4F,0x53,0x49,0x54,0x49, - 0x4F,0xCE,0x4F,0x50,0x45,0xCE,0x41,0x50, - 0x50,0x45,0x4E,0xC4,0x52,0x45,0x4E,0x41, - 0x4D,0xC5,0x43,0x41,0x54,0x41,0x4C,0x4F, - 0xC7,0x4D,0x4F,0xCE,0x4E,0x4F,0x4D,0x4F, - 0xCE,0x50,0x52,0xA3,0x49,0x4E,0xA3,0x4D, - 0x41,0x58,0x46,0x49,0x4C,0x45,0xD3,0x46, - 0xD0,0x49,0x4E,0xD4,0x42,0x53,0x41,0x56, - 0xC5,0x42,0x4C,0x4F,0x41,0xC4,0x42,0x52, - 0x55,0xCE,0x56,0x45,0x52,0x49,0x46,0xD9, - 0x00,0x21,0x70,0xA0,0x70,0xA1,0x70,0xA0, - 0x70,0x20,0x70,0x20,0x70,0x20,0x70,0x20, - 0x70,0x60,0x00,0x22,0x06,0x20,0x74,0x22, - 0x06,0x22,0x04,0x23,0x78,0x22,0x70,0x30, - 0x70,0x40,0x70,0x40,0x80,0x40,0x80,0x08, - 0x00,0x08,0x00,0x04,0x00,0x40,0x70,0x40, - 0x00,0x21,0x79,0x20,0x71,0x20,0x71,0x20, - 0x70,0xD6,0xC4,0xD3,0xCC,0xD2,0xC2,0xC1, - 0xC3,0xC9,0xCF,0x40,0x20,0x10,0x08,0x04, - 0x02,0x01,0xC0,0xA0,0x90,0x00,0x00,0xFE, - 0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x07, - 0x00,0x01,0x00,0xFF,0x7F,0x00,0x00,0xFF, - 0x7F,0x00,0x00,0xFF,0x7F,0x00,0x00,0xFF, - 0xFF,0x0D,0x07,0x8D,0x4C,0x41,0x4E,0x47, - 0x55,0x41,0x47,0x45,0x20,0x4E,0x4F,0x54, - 0x20,0x41,0x56,0x41,0x49,0x4C,0x41,0x42, - 0x4C,0xC5,0x52,0x41,0x4E,0x47,0x45,0x20, - 0x45,0x52,0x52,0x4F,0xD2,0x57,0x52,0x49, - 0x54,0x45,0x20,0x50,0x52,0x4F,0x54,0x45, - 0x43,0x54,0x45,0xC4,0x45,0x4E,0x44,0x20, - 0x4F,0x46,0x20,0x44,0x41,0x54,0xC1,0x46, - 0x49,0x4C,0x45,0x20,0x4E,0x4F,0x54,0x20, - 0x46,0x4F,0x55,0x4E,0xC4,0x56,0x4F,0x4C, - 0x55,0x4D,0x45,0x20,0x4D,0x49,0x53,0x4D, - 0x41,0x54,0x43,0xC8,0x49,0x2F,0x4F,0x20, - 0x45,0x52,0x52,0x4F,0xD2,0x44,0x49,0x53, - 0x4B,0x20,0x46,0x55,0x4C,0xCC,0x46,0x49, - 0x4C,0x45,0x20,0x4C,0x4F,0x43,0x4B,0x45, - 0xC4,0x53,0x59,0x4E,0x54,0x41,0x58,0x20, - 0x45,0x52,0x52,0x4F,0xD2,0x4E,0x4F,0x20, - 0x42,0x55,0x46,0x46,0x45,0x52,0x53,0x20, - 0x41,0x56,0x41,0x49,0x4C,0x41,0x42,0x4C, - 0xC5,0x46,0x49,0x4C,0x45,0x20,0x54,0x59, - 0x50,0x45,0x20,0x4D,0x49,0x53,0x4D,0x41, - 0x54,0x43,0xC8,0x50,0x52,0x4F,0x47,0x52, - 0x41,0x4D,0x20,0x54,0x4F,0x4F,0x20,0x4C, - 0x41,0x52,0x47,0xC5,0x4E,0x4F,0x54,0x20, - 0x44,0x49,0x52,0x45,0x43,0x54,0x20,0x43, - 0x4F,0x4D,0x4D,0x41,0x4E,0xC4,0x8D,0x00, - 0x03,0x19,0x19,0x24,0x33,0x3E,0x4C,0x5B, - 0x64,0x6D,0x78,0x84,0x98,0xAA,0xBB,0x2D, - 0x98,0x00,0x02,0x02,0xC1,0x1B,0xFD,0x03, - 0x03,0xF0,0x58,0x00,0xA0,0x06,0x00,0x1B, - 0x44,0x04,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x10,0x00,0x00,0xCF,0xC1, - 0xC4,0xC5,0xD2,0xAE,0xCF,0xC2,0xCA,0xB0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0x03,0x84,0x00,0x00,0x00,0x40,0x00, - 0xC1,0xD0,0xD0,0xCC,0xC5,0xD3,0xCF,0xC6, - 0xD4,0xE8,0xB7,0xBB,0xB3,0xBB,0xB4,0x00, - 0xC0,0x7E,0xB3,0x21,0xAB,0x05,0xAC,0x57, - 0xAC,0x6F,0xAC,0x2A,0xAD,0x97,0xAD,0xEE, - 0xAC,0xF5,0xAC,0x39,0xAC,0x11,0xAD,0x8D, - 0xAE,0x17,0xAD,0x7E,0xB3,0x7E,0xB3,0x89, - 0xAC,0x95,0xAC,0x86,0xAC,0x92,0xAC,0x7E, - 0xB3,0x7E,0xB3,0xBD,0xAC,0xC9,0xAC,0xBA, - 0xAC,0xC6,0xAC,0x7E,0xB3,0xE0,0x00,0xF0, - 0x02,0xA2,0x02,0x8E,0x5F,0xAA,0xBA,0x8E, - 0x9B,0xB3,0x20,0x6A,0xAE,0xAD,0xBB,0xB5, - 0xC9,0x0D,0xB0,0x0B,0x0A,0xAA,0xBD,0xCA, - 0xAA,0x48,0xBD,0xC9,0xAA,0x48,0x60,0x4C, - 0x63,0xB3,0x20,0x28,0xAB,0x4C,0x7F,0xB3, - 0x20,0xDC,0xAB,0xA9,0x01,0x8D,0xE3,0xB5, - 0xAE,0xBE,0xB5,0xAD,0xBD,0xB5,0xD0,0x05, - 0xE0,0x00,0xD0,0x01,0xE8,0x8D,0xE8,0xB5, - 0x8E,0xE9,0xB5,0x20,0xC9,0xB1,0x90,0x5E, - 0x8E,0x9C,0xB3,0xAE,0x5F,0xAA,0xBD,0x09, - 0xA9,0xAE,0x9C,0xB3,0x4A,0xB0,0x0D,0xAD, - 0x51,0xAA,0xC9,0xC0,0xD0,0x03,0x4C,0x5F, - 0xB3,0x4C,0x73,0xB3,0xA9,0x00,0x9D,0xE8, - 0xB4,0xA9,0x01,0x9D,0xE7,0xB4,0x8E,0x9C, - 0xB3,0x20,0x44,0xB2,0xAE,0x9C,0xB3,0x9D, - 0xC7,0xB4,0x8D,0xD2,0xB5,0x8D,0xD4,0xB5, - 0xAD,0xF1,0xB5,0x9D,0xC6,0xB4,0x8D,0xD1, - 0xB5,0x8D,0xD3,0xB5,0xAD,0xC2,0xB5,0x9D, - 0xC8,0xB4,0x20,0x37,0xB0,0x20,0x0C,0xAF, - 0x20,0xD6,0xB7,0x20,0x3A,0xAF,0xAE,0x9C, - 0xB3,0xA9,0x06,0x8D,0xC5,0xB5,0xBD,0xC6, - 0xB4,0x8D,0xD1,0xB5,0xBD,0xC7,0xB4,0x8D, - 0xD2,0xB5,0xBD,0xC8,0xB4,0x8D,0xC2,0xB5, - 0x8D,0xF6,0xB5,0xBD,0xE7,0xB4,0x8D,0xEE, - 0xB5,0xBD,0xE8,0xB4,0x8D,0xEF,0xB5,0x8E, - 0xD9,0xB5,0xA9,0xFF,0x8D,0xE0,0xB5,0x8D, - 0xE1,0xB5,0xAD,0xE2,0xB3,0x8D,0xDA,0xB5, - 0x18,0x4C,0x5E,0xAF,0xA9,0x00,0xAA,0x9D, - 0xD1,0xB5,0xE8,0xE0,0x2D,0xD0,0xF8,0xAD, - 0xBF,0xB5,0x49,0xFF,0x8D,0xF9,0xB5,0xAD, - 0xC0,0xB5,0x8D,0xF8,0xB5,0xAD,0xC1,0xB5, - 0x0A,0x0A,0x0A,0x0A,0xAA,0x8E,0xF7,0xB5, - 0xA9,0x11,0x8D,0xFA,0xB5,0x60,0x20,0x1D, - 0xAF,0x20,0x34,0xAF,0x20,0xC3,0xB2,0xA9, - 0x02,0x2D,0xD5,0xB5,0xF0,0x21,0x20,0xF7, - 0xAF,0xA9,0x00,0x18,0x20,0x11,0xB0,0x38, - 0xCE,0xD8,0xB5,0xD0,0xF7,0xAE,0xD9,0xB5, - 0xAD,0xEE,0xB5,0x9D,0xE7,0xB4,0xAD,0xEF, - 0xB5,0x9D,0xE8,0xB4,0x20,0x37,0xB0,0x4C, - 0x7F,0xB3,0x20,0x28,0xAB,0xAD,0xF6,0xB5, - 0x30,0x2B,0xAD,0xBD,0xB5,0x85,0x42,0xAD, - 0xBE,0xB5,0x85,0x43,0xAE,0x9C,0xB3,0x20, - 0x1C,0xB2,0x20,0x37,0xB0,0x4C,0x7F,0xB3, - 0xAD,0xBC,0xB5,0xC9,0x05,0xB0,0x0B,0x0A, - 0xAA,0xBD,0xE6,0xAA,0x48,0xBD,0xE5,0xAA, - 0x48,0x60,0x4C,0x67,0xB3,0x4C,0x7B,0xB3, - 0xAD,0xF6,0xB5,0x30,0xF8,0xAD,0xBC,0xB5, - 0xC9,0x05,0xB0,0xEE,0x0A,0xAA,0xBD,0xF2, - 0xAA,0x48,0xBD,0xF1,0xAA,0x48,0x60,0x20, - 0x00,0xB3,0x20,0xA8,0xAC,0x8D,0xC3,0xB5, - 0x4C,0x7F,0xB3,0x20,0x00,0xB3,0x20,0xB5, - 0xB1,0x20,0xA8,0xAC,0x48,0x20,0xA2,0xB1, - 0xA0,0x00,0x68,0x91,0x42,0x4C,0x96,0xAC, - 0x20,0xB6,0xB0,0xB0,0x0B,0xB1,0x42,0x48, - 0x20,0x5B,0xB1,0x20,0x94,0xB1,0x68,0x60, - 0x4C,0x6F,0xB3,0x20,0x00,0xB3,0xAD,0xC3, - 0xB5,0x20,0xDA,0xAC,0x4C,0x7F,0xB3,0x20, - 0x00,0xB3,0x20,0xA2,0xB1,0xA0,0x00,0xB1, - 0x42,0x20,0xDA,0xAC,0x20,0xB5,0xB1,0x4C, - 0xCA,0xAC,0x48,0x20,0xB6,0xB0,0x68,0x91, - 0x42,0xA9,0x40,0x0D,0xD5,0xB5,0x8D,0xD5, - 0xB5,0x20,0x5B,0xB1,0x4C,0x94,0xB1,0xA9, - 0x80,0x8D,0x9E,0xB3,0xD0,0x05,0xA9,0x00, - 0x8D,0x9E,0xB3,0x20,0x28,0xAB,0xAE,0x9C, - 0xB3,0xBD,0xC8,0xB4,0x29,0x7F,0x0D,0x9E, - 0xB3,0x9D,0xC8,0xB4,0x20,0x37,0xB0,0x4C, - 0x7F,0xB3,0x20,0x00,0xB3,0x4C,0x7F,0xB3, - 0x20,0x28,0xAB,0x20,0xB6,0xB0,0xB0,0xEF, - 0xEE,0xE4,0xB5,0xD0,0xF6,0xEE,0xE5,0xB5, - 0x4C,0x1B,0xAD,0x20,0x28,0xAB,0xAE,0x9C, - 0xB3,0xBD,0xC8,0xB4,0x10,0x03,0x4C,0x7B, - 0xB3,0xAE,0x9C,0xB3,0xBD,0xC6,0xB4,0x8D, - 0xD1,0xB5,0x9D,0xE6,0xB4,0xA9,0xFF,0x9D, - 0xC6,0xB4,0xBC,0xC7,0xB4,0x8C,0xD2,0xB5, - 0x20,0x37,0xB0,0x18,0x20,0x5E,0xAF,0xB0, - 0x2A,0x20,0x0C,0xAF,0xA0,0x0C,0x8C,0x9C, - 0xB3,0xB1,0x42,0x30,0x0B,0xF0,0x09,0x48, - 0xC8,0xB1,0x42,0xA8,0x68,0x20,0x89,0xAD, - 0xAC,0x9C,0xB3,0xC8,0xC8,0xD0,0xE7,0xAD, - 0xD3,0xB5,0xAC,0xD4,0xB5,0x20,0x89,0xAD, - 0x38,0xB0,0xD1,0x20,0xFB,0xAF,0x4C,0x7F, - 0xB3,0x38,0x20,0xDD,0xB2,0xA9,0x00,0xA2, - 0x05,0x9D,0xF0,0xB5,0xCA,0x10,0xFA,0x60, - 0x20,0xDC,0xAB,0xA9,0xFF,0x8D,0xF9,0xB5, - 0x20,0xF7,0xAF,0xA9,0x16,0x8D,0x9D,0xB3, - 0x20,0x2F,0xAE,0x20,0x2F,0xAE,0xA2,0x0B, - 0xBD,0xAF,0xB3,0x20,0xED,0xFD,0xCA,0x10, - 0xF7,0x86,0x45,0xAD,0xF6,0xB7,0x85,0x44, - 0x20,0x42,0xAE,0x20,0x2F,0xAE,0x20,0x2F, - 0xAE,0x18,0x20,0x11,0xB0,0xB0,0x5D,0xA2, - 0x00,0x8E,0x9C,0xB3,0xBD,0xC6,0xB4,0xF0, - 0x53,0x30,0x4A,0xA0,0xA0,0xBD,0xC8,0xB4, - 0x10,0x02,0xA0,0xAA,0x98,0x20,0xED,0xFD, - 0xBD,0xC8,0xB4,0x29,0x7F,0xA0,0x07,0x0A, - 0x0A,0xB0,0x03,0x88,0xD0,0xFA,0xB9,0xA7, - 0xB3,0x20,0xED,0xFD,0xA9,0xA0,0x20,0xED, - 0xFD,0xBD,0xE7,0xB4,0x85,0x44,0xBD,0xE8, - 0xB4,0x85,0x45,0x20,0x42,0xAE,0xA9,0xA0, - 0x20,0xED,0xFD,0xE8,0xE8,0xE8,0xA0,0x1D, - 0xBD,0xC6,0xB4,0x20,0xED,0xFD,0xE8,0x88, - 0x10,0xF6,0x20,0x2F,0xAE,0x20,0x30,0xB2, - 0x90,0xA7,0xB0,0x9E,0x4C,0x7F,0xB3,0xA9, - 0x8D,0x20,0xED,0xFD,0xCE,0x9D,0xB3,0xD0, - 0x08,0x20,0x0C,0xFD,0xA9,0x15,0x8D,0x9D, - 0xB3,0x60,0xA0,0x02,0xA9,0x00,0x48,0xA5, - 0x44,0xD9,0xA4,0xB3,0x90,0x12,0xF9,0xA4, - 0xB3,0x85,0x44,0xA5,0x45,0xE9,0x00,0x85, - 0x45,0x68,0x69,0x00,0x48,0x4C,0x47,0xAE, - 0x68,0x09,0xB0,0x20,0xED,0xFD,0x88,0x10, - 0xDB,0x60,0x20,0x08,0xAF,0xA0,0x00,0x8C, - 0xC5,0xB5,0xB1,0x42,0x99,0xD1,0xB5,0xC8, - 0xC0,0x2D,0xD0,0xF6,0x18,0x60,0x20,0x08, - 0xAF,0xA0,0x00,0xB9,0xD1,0xB5,0x91,0x42, - 0xC8,0xC0,0x2D,0xD0,0xF6,0x60,0x20,0xDC, - 0xAB,0xA9,0x04,0x20,0x58,0xB0,0xAD,0xF9, - 0xB5,0x49,0xFF,0x8D,0xC1,0xB3,0xA9,0x11, - 0x8D,0xEB,0xB3,0xA9,0x01,0x8D,0xEC,0xB3, - 0xA2,0x38,0xA9,0x00,0x9D,0xBB,0xB3,0xE8, - 0xD0,0xFA,0xA2,0x0C,0xE0,0x8C,0xF0,0x14, - 0xA0,0x03,0xB9,0xA0,0xB3,0x9D,0xF3,0xB3, - 0xE8,0x88,0x10,0xF6,0xE0,0x44,0xD0,0xEC, - 0xA2,0x48,0xD0,0xE8,0x20,0xFB,0xAF,0xA2, - 0x00,0x8A,0x9D,0xBB,0xB4,0xE8,0xD0,0xFA, - 0x20,0x45,0xB0,0xA9,0x11,0xAC,0xF0,0xB3, - 0x88,0x88,0x8D,0xEC,0xB7,0x8D,0xBC,0xB4, - 0x8C,0xBD,0xB4,0xC8,0x8C,0xED,0xB7,0xA9, - 0x02,0x20,0x58,0xB0,0xAC,0xBD,0xB4,0x88, - 0x30,0x05,0xD0,0xEC,0x98,0xF0,0xE6,0x20, - 0xC2,0xB7,0x20,0x4A,0xB7,0x4C,0x7F,0xB3, - 0xA2,0x00,0xF0,0x06,0xA2,0x02,0xD0,0x02, - 0xA2,0x04,0xBD,0xC7,0xB5,0x85,0x42,0xBD, - 0xC8,0xB5,0x85,0x43,0x60,0x2C,0xD5,0xB5, - 0x70,0x01,0x60,0x20,0xE4,0xAF,0xA9,0x02, - 0x20,0x52,0xB0,0xA9,0xBF,0x2D,0xD5,0xB5, - 0x8D,0xD5,0xB5,0x60,0xAD,0xD5,0xB5,0x30, - 0x01,0x60,0x20,0x4B,0xAF,0xA9,0x02,0x20, - 0x52,0xB0,0xA9,0x7F,0x2D,0xD5,0xB5,0x8D, - 0xD5,0xB5,0x60,0xAD,0xC9,0xB5,0x8D,0xF0, - 0xB7,0xAD,0xCA,0xB5,0x8D,0xF1,0xB7,0xAE, - 0xD3,0xB5,0xAC,0xD4,0xB5,0x60,0x08,0x20, - 0x34,0xAF,0x20,0x4B,0xAF,0x20,0x0C,0xAF, - 0x28,0xB0,0x09,0xAE,0xD1,0xB5,0xAC,0xD2, - 0xB5,0x4C,0xB5,0xAF,0xA0,0x01,0xB1,0x42, - 0xF0,0x08,0xAA,0xC8,0xB1,0x42,0xA8,0x4C, - 0xB5,0xAF,0xAD,0xBB,0xB5,0xC9,0x04,0xF0, - 0x02,0x38,0x60,0x20,0x44,0xB2,0xA0,0x02, - 0x91,0x42,0x48,0x88,0xAD,0xF1,0xB5,0x91, - 0x42,0x48,0x20,0x3A,0xAF,0x20,0xD6,0xB7, - 0xA0,0x05,0xAD,0xDE,0xB5,0x91,0x42,0xC8, - 0xAD,0xDF,0xB5,0x91,0x42,0x68,0xAA,0x68, - 0xA8,0xA9,0x02,0xD0,0x02,0xA9,0x01,0x8E, - 0xD3,0xB5,0x8C,0xD4,0xB5,0x20,0x52,0xB0, - 0xA0,0x05,0xB1,0x42,0x8D,0xDC,0xB5,0x18, - 0x6D,0xDA,0xB5,0x8D,0xDE,0xB5,0xC8,0xB1, - 0x42,0x8D,0xDD,0xB5,0x6D,0xDB,0xB5,0x8D, - 0xDF,0xB5,0x18,0x60,0x20,0xE4,0xAF,0xA9, - 0x01,0x4C,0x52,0xB0,0xAC,0xCB,0xB5,0xAD, - 0xCC,0xB5,0x8C,0xF0,0xB7,0x8D,0xF1,0xB7, - 0xAE,0xD6,0xB5,0xAC,0xD7,0xB5,0x60,0xA9, - 0x01,0xD0,0x02,0xA9,0x02,0xAC,0xC3,0xAA, - 0x8C,0xF0,0xB7,0xAC,0xC4,0xAA,0x8C,0xF1, - 0xB7,0xAE,0xFA,0xB5,0xA0,0x00,0x4C,0x52, - 0xB0,0x08,0x20,0x45,0xB0,0x28,0xB0,0x08, - 0xAC,0xBD,0xB3,0xAE,0xBC,0xB3,0xD0,0x0A, - 0xAE,0xBC,0xB4,0xD0,0x02,0x38,0x60,0xAC, - 0xBD,0xB4,0x8E,0x97,0xB3,0x8C,0x98,0xB3, - 0xA9,0x01,0x20,0x52,0xB0,0x18,0x60,0x20, - 0x45,0xB0,0xAE,0x97,0xB3,0xAC,0x98,0xB3, - 0xA9,0x02,0x4C,0x52,0xB0,0xAD,0xC5,0xAA, - 0x8D,0xF0,0xB7,0xAD,0xC6,0xAA,0x8D,0xF1, - 0xB7,0x60,0x8E,0xEC,0xB7,0x8C,0xED,0xB7, - 0x8D,0xF4,0xB7,0xC9,0x02,0xD0,0x06,0x0D, - 0xD5,0xB5,0x8D,0xD5,0xB5,0xAD,0xF9,0xB5, - 0x49,0xFF,0x8D,0xEB,0xB7,0xAD,0xF7,0xB5, - 0x8D,0xE9,0xB7,0xAD,0xF8,0xB5,0x8D,0xEA, - 0xB7,0xAD,0xE2,0xB5,0x8D,0xF2,0xB7,0xAD, - 0xE3,0xB5,0x8D,0xF3,0xB7,0xA9,0x01,0x8D, - 0xE8,0xB7,0xAC,0xC1,0xAA,0xAD,0xC2,0xAA, - 0x20,0xB5,0xB7,0xAD,0xF6,0xB7,0x8D,0xBF, - 0xB5,0xA9,0xFF,0x8D,0xEB,0xB7,0xB0,0x01, - 0x60,0xAD,0xF5,0xB7,0xA0,0x07,0xC9,0x20, - 0xF0,0x08,0xA0,0x04,0xC9,0x10,0xF0,0x02, - 0xA0,0x08,0x98,0x4C,0x85,0xB3,0xAD,0xE4, - 0xB5,0xCD,0xE0,0xB5,0xD0,0x08,0xAD,0xE5, - 0xB5,0xCD,0xE1,0xB5,0xF0,0x66,0x20,0x1D, - 0xAF,0xAD,0xE5,0xB5,0xCD,0xDD,0xB5,0x90, - 0x1C,0xD0,0x08,0xAD,0xE4,0xB5,0xCD,0xDC, - 0xB5,0x90,0x12,0xAD,0xE5,0xB5,0xCD,0xDF, - 0xB5,0x90,0x10,0xD0,0x08,0xAD,0xE4,0xB5, - 0xCD,0xDE,0xB5,0x90,0x06,0x20,0x5E,0xAF, - 0x90,0xD7,0x60,0x38,0xAD,0xE4,0xB5,0xED, - 0xDC,0xB5,0x0A,0x69,0x0C,0xA8,0x20,0x0C, - 0xAF,0xB1,0x42,0xD0,0x0F,0xAD,0xBB,0xB5, - 0xC9,0x04,0xF0,0x02,0x38,0x60,0x20,0x34, - 0xB1,0x4C,0x20,0xB1,0x8D,0xD6,0xB5,0xC8, - 0xB1,0x42,0x8D,0xD7,0xB5,0x20,0xDC,0xAF, - 0xAD,0xE4,0xB5,0x8D,0xE0,0xB5,0xAD,0xE5, - 0xB5,0x8D,0xE1,0xB5,0x20,0x10,0xAF,0xAC, - 0xE6,0xB5,0x18,0x60,0x8C,0x9D,0xB3,0x20, - 0x44,0xB2,0xAC,0x9D,0xB3,0xC8,0x91,0x42, - 0x8D,0xD7,0xB5,0x88,0xAD,0xF1,0xB5,0x91, - 0x42,0x8D,0xD6,0xB5,0x20,0x10,0xAF,0x20, - 0xD6,0xB7,0xA9,0xC0,0x0D,0xD5,0xB5,0x8D, - 0xD5,0xB5,0x60,0xAE,0xEA,0xB5,0x8E,0xBD, - 0xB5,0xAE,0xEB,0xB5,0x8E,0xBE,0xB5,0xAE, - 0xEC,0xB5,0xAC,0xED,0xB5,0x8E,0xBF,0xB5, - 0x8C,0xC0,0xB5,0xE8,0xD0,0x01,0xC8,0xCC, - 0xE9,0xB5,0xD0,0x11,0xEC,0xE8,0xB5,0xD0, - 0x0C,0xA2,0x00,0xA0,0x00,0xEE,0xEA,0xB5, - 0xD0,0x03,0xEE,0xEB,0xB5,0x8E,0xEC,0xB5, - 0x8C,0xED,0xB5,0x60,0xEE,0xE6,0xB5,0xD0, - 0x08,0xEE,0xE4,0xB5,0xD0,0x03,0xEE,0xE5, - 0xB5,0x60,0xAC,0xC3,0xB5,0xAE,0xC4,0xB5, - 0x84,0x42,0x86,0x43,0xEE,0xC3,0xB5,0xD0, - 0x03,0xEE,0xC4,0xB5,0x60,0xAC,0xC1,0xB5, - 0xD0,0x08,0xAE,0xC2,0xB5,0xF0,0x07,0xCE, - 0xC2,0xB5,0xCE,0xC1,0xB5,0x60,0x4C,0x7F, - 0xB3,0x20,0xF7,0xAF,0xAD,0xC3,0xB5,0x85, - 0x42,0xAD,0xC4,0xB5,0x85,0x43,0xA9,0x01, - 0x8D,0x9D,0xB3,0xA9,0x00,0x8D,0xD8,0xB5, - 0x18,0xEE,0xD8,0xB5,0x20,0x11,0xB0,0xB0, - 0x51,0xA2,0x00,0x8E,0x9C,0xB3,0xBD,0xC6, - 0xB4,0xF0,0x1F,0x30,0x22,0xA0,0x00,0xE8, - 0xE8,0xE8,0xB1,0x42,0xDD,0xC6,0xB4,0xD0, - 0x0A,0xC8,0xC0,0x1E,0xD0,0xF3,0xAE,0x9C, - 0xB3,0x18,0x60,0x20,0x30,0xB2,0x90,0xDB, - 0xB0,0xCF,0xAC,0x9D,0xB3,0xD0,0xC1,0xAC, - 0x9D,0xB3,0xD0,0xEF,0xA0,0x00,0xE8,0xE8, - 0xE8,0xB1,0x42,0x9D,0xC6,0xB4,0xC8,0xC0, - 0x1E,0xD0,0xF5,0xAE,0x9C,0xB3,0x38,0x60, - 0x18,0xAD,0x9C,0xB3,0x69,0x23,0xAA,0xE0, - 0xF5,0x60,0xA9,0x00,0xAC,0x9D,0xB3,0xD0, - 0x97,0x4C,0x77,0xB3,0xAD,0xF1,0xB5,0xF0, - 0x21,0xCE,0xF0,0xB5,0x30,0x17,0x18,0xA2, - 0x04,0x3E,0xF1,0xB5,0xCA,0xD0,0xFA,0x90, - 0xF0,0xEE,0xEE,0xB5,0xD0,0x03,0xEE,0xEF, - 0xB5,0xAD,0xF0,0xB5,0x60,0xA9,0x00,0x8D, - 0xF1,0xB5,0xA9,0x00,0x8D,0x9E,0xB3,0x20, - 0xF7,0xAF,0x18,0xAD,0xEB,0xB3,0x6D,0xEC, - 0xB3,0xF0,0x09,0xCD,0xEF,0xB3,0x90,0x14, - 0xA9,0xFF,0xD0,0x0A,0xAD,0x9E,0xB3,0xD0, - 0x37,0xA9,0x01,0x8D,0x9E,0xB3,0x8D,0xEC, - 0xB3,0x18,0x69,0x11,0x8D,0xEB,0xB3,0x8D, - 0xF1,0xB5,0xA8,0x0A,0x0A,0xA8,0xA2,0x04, - 0x18,0xB9,0xF6,0xB3,0x9D,0xF1,0xB5,0xF0, - 0x06,0x38,0xA9,0x00,0x99,0xF6,0xB3,0x88, - 0xCA,0xD0,0xEE,0x90,0xBD,0x20,0xFB,0xAF, - 0xAD,0xF0,0xB3,0x8D,0xF0,0xB5,0xD0,0x89, - 0x4C,0x77,0xB3,0xAD,0xF1,0xB5,0xD0,0x01, - 0x60,0x48,0x20,0xF7,0xAF,0xAC,0xF0,0xB5, - 0x68,0x18,0x20,0xDD,0xB2,0xA9,0x00,0x8D, - 0xF1,0xB5,0x4C,0xFB,0xAF,0xA2,0xFC,0x7E, - 0xF6,0xB4,0xE8,0xD0,0xFA,0xC8,0xCC,0xF0, - 0xB3,0xD0,0xF2,0x0A,0x0A,0xA8,0xF0,0x0F, - 0xA2,0x04,0xBD,0xF1,0xB5,0x19,0xF6,0xB3, - 0x99,0xF6,0xB3,0x88,0xCA,0xD0,0xF3,0x60, - 0xAD,0xBD,0xB5,0x8D,0xE6,0xB5,0x8D,0xEA, - 0xB5,0xAD,0xBE,0xB5,0x8D,0xE4,0xB5,0x8D, - 0xEB,0xB5,0xA9,0x00,0x8D,0xE5,0xB5,0xA0, - 0x10,0xAA,0xAD,0xE6,0xB5,0x4A,0xB0,0x03, - 0x8A,0x90,0x0E,0x18,0xAD,0xE5,0xB5,0x6D, - 0xE8,0xB5,0x8D,0xE5,0xB5,0x8A,0x6D,0xE9, - 0xB5,0x6A,0x6E,0xE5,0xB5,0x6E,0xE4,0xB5, - 0x6E,0xE6,0xB5,0x88,0xD0,0xDB,0x18,0xAD, - 0xBF,0xB5,0x8D,0xEC,0xB5,0x6D,0xE6,0xB5, - 0x8D,0xE6,0xB5,0xAD,0xC0,0xB5,0x8D,0xED, - 0xB5,0x6D,0xE4,0xB5,0x8D,0xE4,0xB5,0x90, - 0x03,0xEE,0xE5,0xB5,0x60,0x00,0x00,0xA9, - 0x01,0xD0,0x22,0xA9,0x02,0xD0,0x1E,0xA9, - 0x03,0xD0,0x1A,0xA9,0x04,0xD0,0x16,0xA9, - 0x05,0xD0,0x12,0xA9,0x06,0xD0,0x0E,0x4C, - 0xED,0xBF,0xEA,0xA9,0x0A,0xD0,0x06,0xAD, - 0xC5,0xB5,0x18,0x90,0x01,0x38,0x08,0x8D, - 0xC5,0xB5,0xA9,0x00,0x85,0x48,0x20,0x7E, - 0xAE,0x28,0xAE,0x9B,0xB3,0x9A,0x60,0x11, - 0x0F,0x00,0x00,0xEC,0x46,0x01,0x00,0x00, - 0x00,0x00,0xFF,0xFF,0x01,0x0A,0x64,0xD4, - 0xC9,0xC1,0xC2,0xD3,0xD2,0xC1,0xC2,0xA0, - 0xC5,0xCD,0xD5,0xCC,0xCF,0xD6,0xA0,0xCB, - 0xD3,0xC9,0xC4,0x04,0x11,0x0F,0x03,0x00, - 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x7A,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x13,0x01,0x00,0x00,0x23, - 0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, - 0xFF,0x00,0x00,0x3F,0xFF,0x00,0x00,0x3F, - 0xFF,0x00,0x00,0x00,0x7F,0x00,0x00,0xFF, - 0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF, - 0xFF,0x00,0x00,0x0F,0xFF,0x00,0x00,0x01, - 0xFF,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00, - 0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x03, - 0xFF,0x00,0x00,0x1F,0xFF,0x00,0x00,0x03, - 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00, - 0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x1F, - 0xFF,0x00,0x00,0x00,0x7F,0x00,0x00,0x1F, - 0xFF,0x00,0x00,0x00,0x03,0x00,0x00,0x1F, - 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x1F, - 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x11,0x0E,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0F, - 0x82,0xC8,0xC5,0xCC,0xCC,0xCF,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0x03, - 0x00,0x14,0x0F,0x81,0xC1,0xD0,0xD0,0xCC, - 0xC5,0xD3,0xCF,0xC6,0xD4,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0x03,0x00,0x15,0x0F,0x84,0xCC, - 0xCF,0xC1,0xC4,0xC5,0xD2,0xAE,0xCF,0xC2, - 0xCA,0xB0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0x06,0x00,0x16, - 0x0F,0x84,0xC6,0xD0,0xC2,0xC1,0xD3,0xC9, - 0xC3,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0x2A,0x00,0x17,0x0F,0x84,0xC9,0xCE,0xD4, - 0xC2,0xC1,0xD3,0xC9,0xC3,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0x2A,0x00,0x18,0x0F,0x82, - 0xCD,0xC1,0xD3,0xD4,0xC5,0xD2,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0x03,0x00, - 0x19,0x0F,0x84,0xCD,0xC1,0xD3,0xD4,0xC5, - 0xD2,0xA0,0xC3,0xD2,0xC5,0xC1,0xD4,0xC5, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0, - 0xA0,0x09,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x15,0x0F,0x15,0x0F,0x00,0x15,0x0A, - 0x01,0x46,0x7A,0x00,0x00,0x00,0x7A,0x00, - 0x04,0x00,0x00,0x01,0x04,0x00,0x48,0x00, - 0x01,0x00,0x48,0x04,0x00,0x00,0x06,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x60, - 0x01,0xFF,0x11,0x00,0x00,0x00,0xFD,0xFE, - 0x01,0xA5,0x27,0xC9,0x09,0xD0,0x18,0xA5, - 0x2B,0x4A,0x4A,0x4A,0x4A,0x09,0xC0,0x85, - 0x3F,0xA9,0x5C,0x85,0x3E,0x18,0xAD,0xFE, - 0x08,0x6D,0xFF,0x08,0x8D,0xFE,0x08,0xAE, - 0xFF,0x08,0x30,0x15,0xBD,0x4D,0x08,0x85, - 0x3D,0xCE,0xFF,0x08,0xAD,0xFE,0x08,0x85, - 0x27,0xCE,0xFE,0x08,0xA6,0x2B,0x6C,0x3E, - 0x00,0xEE,0xFE,0x08,0xEE,0xFE,0x08,0x20, - 0x89,0xFE,0x20,0x93,0xFE,0x20,0x2F,0xFB, - 0xA6,0x2B,0x6C,0xFD,0x08,0x00,0x0D,0x0B, - 0x09,0x07,0x05,0x03,0x01,0x0E,0x0C,0x0A, - 0x08,0x06,0x04,0x02,0x0F,0x00,0x20,0x64, - 0xA7,0xB0,0x08,0xA9,0x00,0xA8,0x8D,0x5D, - 0xB6,0x91,0x40,0xAD,0xC5,0xB5,0x4C,0xD2, - 0xA6,0xAD,0x5D,0xB6,0xF0,0x08,0xEE,0xBD, - 0xB5,0xD0,0x03,0xEE,0xBE,0xB5,0xA9,0x00, - 0x8D,0x5D,0xB6,0x4C,0x84,0xBA,0x8D,0xBC, - 0xB5,0x20,0xA8,0xA6,0x20,0xEA,0xA2,0x4C, - 0x7D,0xA2,0xA0,0x13,0xB1,0x42,0xD0,0x14, - 0xC8,0xC0,0x17,0xD0,0xF7,0xA0,0x19,0xB1, - 0x42,0x99,0xA4,0xB5,0xC8,0xC0,0x1D,0xD0, - 0xF6,0x4C,0xBB,0xA6,0xA2,0xFF,0x8E,0x5D, - 0xB6,0xD0,0xF6,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x09, - 0x8E,0xE9,0xB7,0x8E,0xF7,0xB7,0xA9,0x01, - 0x8D,0xF8,0xB7,0x8D,0xEA,0xB7,0xAD,0xE0, - 0xB7,0x8D,0xE1,0xB7,0xA9,0x02,0x8D,0xEC, - 0xB7,0xA9,0x04,0x8D,0xED,0xB7,0xAC,0xE7, - 0xB7,0x88,0x8C,0xF1,0xB7,0xA9,0x01,0x8D, - 0xF4,0xB7,0x8A,0x4A,0x4A,0x4A,0x4A,0xAA, - 0xA9,0x00,0x9D,0xF8,0x04,0x9D,0x78,0x04, - 0x20,0x93,0xB7,0xA2,0xFF,0x9A,0x8E,0xEB, - 0xB7,0x4C,0xC8,0xBF,0x20,0x89,0xFE,0x4C, - 0x84,0x9D,0xAD,0xE7,0xB7,0x38,0xED,0xF1, - 0xB7,0x8D,0xE1,0xB7,0xAD,0xE7,0xB7,0x8D, - 0xF1,0xB7,0xCE,0xF1,0xB7,0xA9,0x02,0x8D, - 0xEC,0xB7,0xA9,0x04,0x8D,0xED,0xB7,0xA9, - 0x02,0x8D,0xF4,0xB7,0x20,0x93,0xB7,0xAD, - 0xE7,0xB7,0x8D,0xFE,0xB6,0x18,0x69,0x09, - 0x8D,0xF1,0xB7,0xA9,0x0A,0x8D,0xE1,0xB7, - 0x38,0xE9,0x01,0x8D,0xFF,0xB6,0x8D,0xED, - 0xB7,0x20,0x93,0xB7,0x60,0x00,0x00,0x00, - 0x00,0x00,0x00,0xAD,0xE5,0xB7,0xAC,0xE4, - 0xB7,0x20,0xB5,0xB7,0xAC,0xED,0xB7,0x88, - 0x10,0x07,0xA0,0x0F,0xEA,0xEA,0xCE,0xEC, - 0xB7,0x8C,0xED,0xB7,0xCE,0xF1,0xB7,0xCE, - 0xE1,0xB7,0xD0,0xDF,0x60,0x08,0x78,0x20, - 0x00,0xBD,0xB0,0x03,0x28,0x18,0x60,0x28, - 0x38,0x60,0xAD,0xBC,0xB5,0x8D,0xF1,0xB7, - 0xA9,0x00,0x8D,0xF0,0xB7,0xAD,0xF9,0xB5, - 0x49,0xFF,0x8D,0xEB,0xB7,0x60,0xA9,0x00, - 0xA8,0x91,0x42,0xC8,0xD0,0xFB,0x60,0x00, - 0x1B,0x00,0x0A,0x1B,0xE8,0xB7,0x00,0xB6, - 0x01,0x60,0x01,0xFF,0x15,0x0A,0xFB,0xB7, - 0x00,0x96,0x00,0x01,0x01,0x00,0xFE,0x60, - 0x01,0x00,0x00,0x00,0x01,0xEF,0xD8,0x00, - 0xA2,0x00,0xA0,0x02,0x88,0xB1,0x3E,0x4A, - 0x3E,0x00,0xBC,0x4A,0x3E,0x00,0xBC,0x99, - 0x00,0xBB,0xE8,0xE0,0x56,0x90,0xED,0xA2, - 0x00,0x98,0xD0,0xE8,0xA2,0x55,0xBD,0x00, - 0xBC,0x29,0x3F,0x9D,0x00,0xBC,0xCA,0x10, - 0xF5,0x60,0x38,0x86,0x27,0x8E,0x78,0x06, - 0xBD,0x8D,0xC0,0xBD,0x8E,0xC0,0x30,0x7C, - 0xAD,0x00,0xBC,0x85,0x26,0xA9,0xFF,0x9D, - 0x8F,0xC0,0x1D,0x8C,0xC0,0x48,0x68,0xEA, - 0xA0,0x04,0x48,0x68,0x20,0xB9,0xB8,0x88, - 0xD0,0xF8,0xA9,0xD5,0x20,0xB8,0xB8,0xA9, - 0xAA,0x20,0xB8,0xB8,0xA9,0xAD,0x20,0xB8, - 0xB8,0x98,0xA0,0x56,0xD0,0x03,0xB9,0x00, - 0xBC,0x59,0xFF,0xBB,0xAA,0xBD,0x29,0xBA, - 0xA6,0x27,0x9D,0x8D,0xC0,0xBD,0x8C,0xC0, - 0x88,0xD0,0xEB,0xA5,0x26,0xEA,0x59,0x00, - 0xBB,0xAA,0xBD,0x29,0xBA,0xAE,0x78,0x06, - 0x9D,0x8D,0xC0,0xBD,0x8C,0xC0,0xB9,0x00, - 0xBB,0xC8,0xD0,0xEA,0xAA,0xBD,0x29,0xBA, - 0xA6,0x27,0x20,0xBB,0xB8,0xA9,0xDE,0x20, - 0xB8,0xB8,0xA9,0xAA,0x20,0xB8,0xB8,0xA9, - 0xEB,0x20,0xB8,0xB8,0xA9,0xFF,0x20,0xB8, - 0xB8,0xBD,0x8E,0xC0,0xBD,0x8C,0xC0,0x60, - 0x18,0x48,0x68,0x9D,0x8D,0xC0,0x1D,0x8C, - 0xC0,0x60,0xA0,0x00,0xA2,0x56,0xCA,0x30, - 0xFB,0xB9,0x00,0xBB,0x5E,0x00,0xBC,0x2A, - 0x5E,0x00,0xBC,0x2A,0x91,0x3E,0xC8,0xC4, - 0x26,0xD0,0xEB,0x60,0xA0,0x20,0x88,0xF0, - 0x61,0xBD,0x8C,0xC0,0x10,0xFB,0x49,0xD5, - 0xD0,0xF4,0xEA,0xBD,0x8C,0xC0,0x10,0xFB, - 0xC9,0xAA,0xD0,0xF2,0xA0,0x56,0xBD,0x8C, - 0xC0,0x10,0xFB,0xC9,0xAD,0xD0,0xE7,0xA9, - 0x00,0x88,0x84,0x26,0xBC,0x8C,0xC0,0x10, - 0xFB,0x59,0x00,0xBA,0xA4,0x26,0x99,0x00, - 0xBC,0xD0,0xEE,0x84,0x26,0xBC,0x8C,0xC0, - 0x10,0xFB,0x59,0x00,0xBA,0xA4,0x26,0x99, - 0x00,0xBB,0xC8,0xD0,0xEE,0xBC,0x8C,0xC0, - 0x10,0xFB,0xD9,0x00,0xBA,0xD0,0x13,0xBD, - 0x8C,0xC0,0x10,0xFB,0xC9,0xDE,0xD0,0x0A, - 0xEA,0xBD,0x8C,0xC0,0x10,0xFB,0xC9,0xAA, - 0xF0,0x5C,0x38,0x60,0xA0,0xFC,0x84,0x26, - 0xC8,0xD0,0x04,0xE6,0x26,0xF0,0xF3,0xBD, - 0x8C,0xC0,0x10,0xFB,0xC9,0xD5,0xD0,0xF0, - 0xEA,0xBD,0x8C,0xC0,0x10,0xFB,0xC9,0xAA, - 0xD0,0xF2,0xA0,0x03,0xBD,0x8C,0xC0,0x10, - 0xFB,0xC9,0x96,0xD0,0xE7,0xA9,0x00,0x85, - 0x27,0xBD,0x8C,0xC0,0x10,0xFB,0x2A,0x85, - 0x26,0xBD,0x8C,0xC0,0x10,0xFB,0x25,0x26, - 0x99,0x2C,0x00,0x45,0x27,0x88,0x10,0xE7, - 0xA8,0xD0,0xB7,0xBD,0x8C,0xC0,0x10,0xFB, - 0xC9,0xDE,0xD0,0xAE,0xEA,0xBD,0x8C,0xC0, - 0x10,0xFB,0xC9,0xAA,0xD0,0xA4,0x18,0x60, - 0x86,0x2B,0x85,0x2A,0xCD,0x78,0x04,0xF0, - 0x53,0xA9,0x00,0x85,0x26,0xAD,0x78,0x04, - 0x85,0x27,0x38,0xE5,0x2A,0xF0,0x33,0xB0, - 0x07,0x49,0xFF,0xEE,0x78,0x04,0x90,0x05, - 0x69,0xFE,0xCE,0x78,0x04,0xC5,0x26,0x90, - 0x02,0xA5,0x26,0xC9,0x0C,0xB0,0x01,0xA8, - 0x38,0x20,0xEE,0xB9,0xB9,0x11,0xBA,0x20, - 0x00,0xBA,0xA5,0x27,0x18,0x20,0xF1,0xB9, - 0xB9,0x1D,0xBA,0x20,0x00,0xBA,0xE6,0x26, - 0xD0,0xC3,0x20,0x00,0xBA,0x18,0xAD,0x78, - 0x04,0x29,0x03,0x2A,0x05,0x2B,0xAA,0xBD, - 0x80,0xC0,0xA6,0x2B,0x60,0x00,0x00,0x00, - 0xA2,0x11,0xCA,0xD0,0xFD,0xE6,0x46,0xD0, - 0x02,0xE6,0x47,0x38,0xE9,0x01,0xD0,0xF0, - 0x60,0x01,0x30,0x28,0x24,0x20,0x1E,0x1D, - 0x1C,0x1C,0x1C,0x1C,0x1C,0x70,0x2C,0x26, - 0x22,0x1F,0x1E,0x1D,0x1C,0x1C,0x1C,0x1C, - 0x1C,0x96,0x97,0x9A,0x9B,0x9D,0x9E,0x9F, - 0xA6,0xA7,0xAB,0xAC,0xAD,0xAE,0xAF,0xB2, - 0xB3,0xB4,0xB5,0xB6,0xB7,0xB9,0xBA,0xBB, - 0xBC,0xBD,0xBE,0xBF,0xCB,0xCD,0xCE,0xCF, - 0xD3,0xD6,0xD7,0xD9,0xDA,0xDB,0xDC,0xDD, - 0xDE,0xDF,0xE5,0xE6,0xE7,0xE9,0xEA,0xEB, - 0xEC,0xED,0xEE,0xEF,0xF2,0xF3,0xF4,0xF5, - 0xF6,0xF7,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE, - 0xFF,0xAE,0x5F,0xAA,0xE0,0x1C,0xF0,0x05, - 0xA2,0x00,0x8E,0x5D,0xB6,0x60,0xA9,0xFF, - 0x8D,0xFB,0x04,0x8D,0x0C,0xC0,0x8D,0x0E, - 0xC0,0x4C,0x2F,0xFB,0xAD,0xBD,0xB5,0x8D, - 0xE6,0xB5,0x8D,0xEA,0xB5,0xBA,0x8E,0x9B, - 0xB3,0x4C,0x7F,0xB3,0x00,0x00,0x00,0x01, - 0x98,0x99,0x02,0x03,0x9C,0x04,0x05,0x06, - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0x07,0x08, - 0xA8,0xA9,0xAA,0x09,0x0A,0x0B,0x0C,0x0D, - 0xB0,0xB1,0x0E,0x0F,0x10,0x11,0x12,0x13, - 0xB8,0x14,0x15,0x16,0x17,0x18,0x19,0x1A, - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, - 0xC8,0xC9,0xCA,0x1B,0xCC,0x1C,0x1D,0x1E, - 0xD0,0xD1,0xD2,0x1F,0xD4,0xD5,0x20,0x21, - 0xD8,0x22,0x23,0x24,0x25,0x26,0x27,0x28, - 0xE0,0xE1,0xE2,0xE3,0xE4,0x29,0x2A,0x2B, - 0xE8,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32, - 0xF0,0xF1,0x33,0x34,0x35,0x36,0x37,0x38, - 0xF8,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, - 0x3F,0x3F,0x3F,0x3F,0x3A,0x20,0x12,0x34, - 0x05,0x29,0x0F,0x29,0x0F,0x34,0x00,0x22, - 0x32,0x22,0x06,0x39,0x0E,0x21,0x0F,0x04, - 0x00,0x32,0x26,0x39,0x0E,0x34,0x1A,0x29, - 0x0B,0x2E,0x0F,0x00,0x24,0x0E,0x22,0x04, - 0x3E,0x08,0x06,0x3F,0x08,0x06,0x3F,0x08, - 0x34,0x3E,0x08,0x14,0x3E,0x21,0x0E,0x21, - 0x0E,0x13,0x25,0x3D,0x08,0x2F,0x3F,0x29, - 0x0D,0x08,0x29,0x3F,0x21,0x0D,0x28,0x05, - 0x22,0x0C,0x12,0x36,0x33,0x3F,0x34,0x3E, - 0x30,0x05,0x34,0x3A,0x29,0x0C,0x28,0x00, - 0x31,0x0D,0x08,0x00,0x3F,0x13,0x25,0x3D, - 0x29,0x0F,0x08,0x23,0x3E,0x2A,0x2F,0x00, - 0x3E,0x31,0x10,0x34,0x04,0x2F,0x30,0x3E, - 0x31,0x10,0x34,0x03,0x29,0x11,0x29,0x0B, - 0x30,0x27,0x3C,0x22,0x31,0x0B,0x3C,0x27, - 0x31,0x0F,0x34,0x37,0x39,0x11,0x31,0x0D, - 0x3C,0x35,0x29,0x0D,0x26,0x2A,0x08,0x12, - 0x3E,0x2A,0x37,0x08,0x3B,0x3F,0x08,0x0E, - 0x3F,0x2A,0x28,0x21,0x0C,0x08,0x19,0x3F, - 0x08,0x31,0x3F,0x2B,0x00,0x00,0x32,0x28, - 0x3C,0x04,0x32,0x32,0x29,0x3C,0x24,0x22, - 0x08,0x29,0x3F,0x32,0x24,0x34,0x35,0x22, - 0x3C,0x34,0x08,0x1E,0x3F,0x2A,0x00,0x21, - 0x0F,0x08,0x0D,0x3D,0x02,0x3A,0x2F,0x32, - 0x30,0x24,0x30,0x02,0x02,0x28,0x01,0x02, - 0x09,0x10,0x09,0x10,0x32,0x04,0x3E,0x31, - 0x0F,0x3C,0x3D,0x04,0x39,0x28,0x01,0x08, - 0x0D,0x3D,0x21,0x0D,0x37,0x2D,0x3E,0x34, - 0x04,0x08,0x0D,0x3D,0x37,0x2E,0x3E,0x3C, - 0x03,0x2F,0x2E,0x3E,0x3C,0x01,0x32,0x29, - 0x3C,0x00,0x29,0x0D,0x06,0x22,0x09,0x11, - 0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xBD, - 0x8D,0xC0,0xBD,0x8E,0xC0,0x30,0x5E,0xA9, - 0xFF,0x9D,0x8F,0xC0,0xDD,0x8C,0xC0,0x48, - 0x68,0x20,0xC3,0xBC,0x20,0xC3,0xBC,0x9D, - 0x8D,0xC0,0xDD,0x8C,0xC0,0xEA,0x88,0xD0, - 0xF0,0xA9,0xD5,0x20,0xD5,0xBC,0xA9,0xAA, - 0x20,0xD5,0xBC,0xA9,0x96,0x20,0xD5,0xBC, - 0xA5,0x41,0x20,0xC4,0xBC,0xA5,0x44,0x20, - 0xC4,0xBC,0xA5,0x3F,0x20,0xC4,0xBC,0xA5, - 0x41,0x45,0x44,0x45,0x3F,0x48,0x4A,0x05, - 0x3E,0x9D,0x8D,0xC0,0xBD,0x8C,0xC0,0x68, - 0x09,0xAA,0x20,0xD4,0xBC,0xA9,0xDE,0x20, - 0xD5,0xBC,0xA9,0xAA,0x20,0xD5,0xBC,0xA9, - 0xEB,0x20,0xD5,0xBC,0x18,0xBD,0x8E,0xC0, - 0xBD,0x8C,0xC0,0x60,0x48,0x4A,0x05,0x3E, - 0x9D,0x8D,0xC0,0xDD,0x8C,0xC0,0x68,0xEA, - 0xEA,0xEA,0x09,0xAA,0xEA,0xEA,0x48,0x68, - 0x9D,0x8D,0xC0,0xDD,0x8C,0xC0,0x60,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x84,0x48,0x85,0x49,0xA0,0x02,0x8C,0xF8, - 0x06,0xA0,0x04,0x8C,0xF8,0x04,0xA0,0x01, - 0xB1,0x48,0xAA,0xA0,0x0F,0xD1,0x48,0xF0, - 0x1B,0x8A,0x48,0xB1,0x48,0xAA,0x68,0x48, - 0x91,0x48,0xBD,0x8E,0xC0,0xA0,0x08,0xBD, - 0x8C,0xC0,0xDD,0x8C,0xC0,0xD0,0xF6,0x88, - 0xD0,0xF8,0x68,0xAA,0xBD,0x8E,0xC0,0xBD, - 0x8C,0xC0,0xA0,0x08,0xBD,0x8C,0xC0,0x48, - 0x68,0x48,0x68,0x8E,0xF8,0x05,0xDD,0x8C, - 0xC0,0xD0,0x03,0x88,0xD0,0xEE,0x08,0xBD, - 0x89,0xC0,0xA0,0x06,0xB1,0x48,0x99,0x36, - 0x00,0xC8,0xC0,0x0A,0xD0,0xF6,0xA0,0x03, - 0xB1,0x3C,0x85,0x47,0xA0,0x02,0xB1,0x48, - 0xA0,0x10,0xD1,0x48,0xF0,0x06,0x91,0x48, - 0x28,0xA0,0x00,0x08,0x6A,0x90,0x05,0xBD, - 0x8A,0xC0,0xB0,0x03,0xBD,0x8B,0xC0,0x66, - 0x35,0x28,0x08,0xD0,0x0B,0xA0,0x07,0x20, - 0x00,0xBA,0x88,0xD0,0xFA,0xAE,0xF8,0x05, - 0xA0,0x04,0xB1,0x48,0x20,0x5A,0xBE,0x28, - 0xD0,0x11,0xA4,0x47,0x10,0x0D,0xA0,0x12, - 0x88,0xD0,0xFD,0xE6,0x46,0xD0,0xF7,0xE6, - 0x47,0xD0,0xF3,0xA0,0x0C,0xB1,0x48,0xF0, - 0x5A,0xC9,0x04,0xF0,0x58,0x6A,0x08,0xB0, - 0x03,0x20,0x00,0xB8,0xA0,0x30,0x8C,0x78, - 0x05,0xAE,0xF8,0x05,0x20,0x44,0xB9,0x90, - 0x24,0xCE,0x78,0x05,0x10,0xF3,0xAD,0x78, - 0x04,0x48,0xA9,0x60,0x20,0x95,0xBE,0xCE, - 0xF8,0x06,0xF0,0x28,0xA9,0x04,0x8D,0xF8, - 0x04,0xA9,0x00,0x20,0x5A,0xBE,0x68,0x20, - 0x5A,0xBE,0x4C,0xBC,0xBD,0xA4,0x2E,0xCC, - 0x78,0x04,0xF0,0x1C,0xAD,0x78,0x04,0x48, - 0x98,0x20,0x95,0xBE,0x68,0xCE,0xF8,0x04, - 0xD0,0xE5,0xF0,0xCA,0x68,0xA9,0x40,0x28, - 0x4C,0x48,0xBE,0xF0,0x39,0x4C,0xAF,0xBE, - 0xA0,0x03,0xB1,0x48,0x48,0xA5,0x2F,0xA0, - 0x0E,0x91,0x48,0x68,0xF0,0x08,0xC5,0x2F, - 0xF0,0x04,0xA9,0x20,0xD0,0xE1,0xA0,0x05, - 0xB1,0x48,0xA8,0xB9,0xB8,0xBF,0xC5,0x2D, - 0xD0,0x97,0x28,0x90,0x1C,0x20,0xDC,0xB8, - 0x08,0xB0,0x8E,0x28,0xA2,0x00,0x86,0x26, - 0x20,0xC2,0xB8,0xAE,0xF8,0x05,0x18,0x24, - 0x38,0xA0,0x0D,0x91,0x48,0xBD,0x88,0xC0, - 0x60,0x20,0x2A,0xB8,0x90,0xF0,0xA9,0x10, - 0xB0,0xEE,0x48,0xA0,0x01,0xB1,0x3C,0x6A, - 0x68,0x90,0x08,0x0A,0x20,0x6B,0xBE,0x4E, - 0x78,0x04,0x60,0x85,0x2A,0x20,0x8E,0xBE, - 0xB9,0x78,0x04,0x24,0x35,0x30,0x03,0xB9, - 0xF8,0x04,0x8D,0x78,0x04,0xA5,0x2A,0x24, - 0x35,0x30,0x05,0x99,0xF8,0x04,0x10,0x03, - 0x99,0x78,0x04,0x4C,0xA0,0xB9,0x8A,0x4A, - 0x4A,0x4A,0x4A,0xA8,0x60,0x48,0xA0,0x02, - 0xB1,0x48,0x6A,0x66,0x35,0x20,0x8E,0xBE, - 0x68,0x0A,0x24,0x35,0x30,0x05,0x99,0xF8, - 0x04,0x10,0x03,0x99,0x78,0x04,0x60,0xA0, - 0x03,0xB1,0x48,0x85,0x41,0xA9,0xAA,0x85, - 0x3E,0xA0,0x56,0xA9,0x00,0x85,0x44,0x99, - 0xFF,0xBB,0x88,0xD0,0xFA,0x99,0x00,0xBB, - 0x88,0xD0,0xFA,0xA9,0x50,0x20,0x95,0xBE, - 0xA9,0x28,0x85,0x45,0xA5,0x44,0x20,0x5A, - 0xBE,0x20,0x0D,0xBF,0xA9,0x08,0xB0,0x24, - 0xA9,0x30,0x8D,0x78,0x05,0x38,0xCE,0x78, - 0x05,0xF0,0x19,0x20,0x44,0xB9,0xB0,0xF5, - 0xA5,0x2D,0xD0,0xF1,0x20,0xDC,0xB8,0xB0, - 0xEC,0xE6,0x44,0xA5,0x44,0xC9,0x23,0x90, - 0xD3,0x18,0x90,0x05,0xA0,0x0D,0x91,0x48, - 0x38,0xBD,0x88,0xC0,0x60,0xA9,0x00,0x85, - 0x3F,0xA0,0x80,0xD0,0x02,0xA4,0x45,0x20, - 0x56,0xBC,0xB0,0x6B,0x20,0x2A,0xB8,0xB0, - 0x66,0xE6,0x3F,0xA5,0x3F,0xC9,0x10,0x90, - 0xEC,0xA0,0x0F,0x84,0x3F,0xA9,0x30,0x8D, - 0x78,0x05,0x99,0xA8,0xBF,0x88,0x10,0xFA, - 0xA4,0x45,0x20,0x87,0xBF,0x20,0x87,0xBF, - 0x20,0x87,0xBF,0x48,0x68,0xEA,0x88,0xD0, - 0xF1,0x20,0x44,0xB9,0xB0,0x23,0xA5,0x2D, - 0xF0,0x15,0xA9,0x10,0xC5,0x45,0xA5,0x45, - 0xE9,0x01,0x85,0x45,0xC9,0x05,0xB0,0x11, - 0x38,0x60,0x20,0x44,0xB9,0xB0,0x05,0x20, - 0xDC,0xB8,0x90,0x1C,0xCE,0x78,0x05,0xD0, - 0xF1,0x20,0x44,0xB9,0xB0,0x0B,0xA5,0x2D, - 0xC9,0x0F,0xD0,0x05,0x20,0xDC,0xB8,0x90, - 0x8C,0xCE,0x78,0x05,0xD0,0xEB,0x38,0x60, - 0xA4,0x2D,0xB9,0xA8,0xBF,0x30,0xDD,0xA9, - 0xFF,0x99,0xA8,0xBF,0xC6,0x3F,0x10,0xCA, - 0xA5,0x44,0xD0,0x0A,0xA5,0x45,0xC9,0x10, - 0x90,0xE5,0xC6,0x45,0xC6,0x45,0x18,0x60, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x0D,0x0B,0x09,0x07,0x05,0x03,0x01, - 0x0E,0x0C,0x0A,0x08,0x06,0x04,0x02,0x0F, - 0x20,0x93,0xFE,0xAD,0x81,0xC0,0xAD,0x81, - 0xC0,0xA9,0x00,0x8D,0x00,0xE0,0x20,0x76, - 0xBA,0x4C,0x44,0xB7,0x8D,0x63,0xAA,0x8D, - 0x70,0xAA,0x8D,0x71,0xAA,0x60,0x20,0x5B, - 0xA7,0x8C,0xB7,0xAA,0x60,0x20,0x7E,0xAE, - 0xAE,0x9B,0xB3,0x9A,0x20,0x16,0xA3,0xBA, - 0x8E,0x9B,0xB3,0xA9,0x09,0x4C,0x85, -}; +// autoload.inc +// Autoload bootstrapper object config + +#define autoload_org 0xBF00 // origin, should be $BF00 for now + +// inflate.inc +// Autoload Inflate object config + +#define autoload3_org 0xBA00 // origin, should be $BA00 for now +#define autoload3_zp 0x0 + + +// fastload.inc +// Fastload object config + +#define fastload_org 0xBE80 // origin, should be $BE80 for now + +// diskload1.inc +// Diskload bootstrapper object config + +#define diskload1_org 0x9000 // origin, should be $9000 for now +#define diskload1_zp 0x00 // object's ZP usage + + +// diskload2.inc +// Diskload object config + +#define diskload2_org 0xAE00 // origin; 7 pages +#define diskload2_data 0x1000 // sector data start + +// NB: Currently ends at 0xA9FF, but diskload3 inflate_data segment ($AB00-ADFF) can +// also be reused. The two buffers are not used at the same time. +#define nybbdata_org 0x9200 // Nybblized track data +#define nybbdata_size 0x1800 // 16*1.5=24 pages + + +// diskload3.inc +// Diskload Inflate object config + +#define diskload3_org 0xB500 // origin; 2 pages; DOS begins at $B700 +#define diskload3_zp 0x10 + + +// dosrwts.inc +// DOS 3.3 RWTS rip object config + +#define dosrwts_org 0xB700 // origin, should be $B700 +#define dosrwts_end 0xBFD0 // end of object diff --git a/makeheader b/makeheader index 8110180..1c940d5 100755 --- a/makeheader +++ b/makeheader @@ -26,31 +26,50 @@ header diskload3 diskloadcode3 8 cd .. -cat <<EOF >c2t.h.2 - -//DOS 3.3 -unsigned char dosboot1[] = { -EOF +monheader() +{ + FILE=$1 + VAR=$2 + COMMENT=$3 -cat mon/dos33.boot1.mon | \ - perl -p -e 's/ /,0x/g' | \ - perl -p -e 's/$/,/' | \ - perl -p -e 's/^....../\t/' >>c2t.h.2 + echo "" + echo "// ${COMMENT}" + echo "unsigned char ${VAR}[] = {" + cat ${FILE} | \ + sed 's/ /,0x/g' | \ + sed 's/$/,/' | \ + sed -E 's/^(..*:)./\t\/*\1*\/ /' + echo "};" +} -cat <<EOF >>c2t.h.2 -}; +( +#monheader mon/dos33.boot1.mon dosboot1 "DOS 3.3 page 3 vectors" +#monheader mon/dos33.boot2.mon dosboot2 "DOS 3.3 boot 2" +monheader mon/dos33.rwts.mon dosrwts "DOS 3.3 RWTS rip" +) > c2t.h.2 -//DOS 3.3 -unsigned char dosboot2[] = { -EOF +incheader() +{ + FILE=$1 -cat mon/dos33.boot2.mon | \ - perl -p -e 's/ /,0x/g' | \ - perl -p -e 's/$/,/' | \ - perl -p -e 's/^....../\t/' >>c2t.h.2 + echo "" + cat ${FILE} \ + | sed -n '/;[[:space:]]*--END-OF-H/q; p;' \ + | sed 's/;/\/\//' \ + | sed -E 's|[[:space:]]*([[:alnum:]_]+)[[:space:]]*=[[:space:]]*(.+)|#define \1 \2|' \ + | sed 's/[[:space:]]\$/ 0x/' +} -echo "};" >>c2t.h.2 +( +incheader asm/autoload.inc +incheader asm/inflate.inc +incheader asm/fastload.inc +incheader asm/diskload1.inc +incheader asm/diskload2.inc +incheader asm/diskload3.inc +incheader asm/dosrwts.inc +) > c2t.h.3 -cat c2t.h.[012] > c2t.h +cat c2t.h.[0123] > c2t.h -rm -f c2t.h.[12] +rm -f c2t.h.[123] diff --git a/mon/dos33.rwts.diff b/mon/dos33.rwts.diff new file mode 100644 index 0000000..1015df6 --- /dev/null +++ b/mon/dos33.rwts.diff @@ -0,0 +1,95 @@ +--- dos33.boot2.img.mon 2025-03-24 13:33:40.384132200 -0400 ++++ dos33.rwts.mon 2025-03-24 14:13:54.592154400 -0400 +@@ -1,34 +1,34 @@ +-B700: 8E E9 B7 8E F7 B7 A9 01 +-B708: 8D F8 B7 8D EA B7 AD E0 +-B710: B7 8D E1 B7 A9 02 8D EC +-B718: B7 A9 04 8D ED B7 AC E7 +-B720: B7 88 8C F1 B7 A9 01 8D +-B728: F4 B7 8A 4A 4A 4A 4A AA +-B730: A9 00 9D F8 04 9D 78 04 +-B738: 20 93 B7 A2 FF 9A 8E EB +-B740: B7 4C C8 BF 20 89 FE 4C +-B748: 84 9D AD E7 B7 38 ED F1 +-B750: B7 8D E1 B7 AD E7 B7 8D +-B758: F1 B7 CE F1 B7 A9 02 8D +-B760: EC B7 A9 04 8D ED B7 A9 +-B768: 02 8D F4 B7 20 93 B7 AD +-B770: E7 B7 8D FE B6 18 69 09 +-B778: 8D F1 B7 A9 0A 8D E1 B7 +-B780: 38 E9 01 8D FF B6 8D ED +-B788: B7 20 93 B7 60 00 00 00 +-B790: 00 00 00 AD E5 B7 AC E4 +-B798: B7 20 B5 B7 AC ED B7 88 +-B7A0: 10 07 A0 0F EA EA CE EC +-B7A8: B7 8C ED B7 CE F1 B7 CE +-B7B0: E1 B7 D0 DF 60 08 78 20 ++B700: 00 00 00 00 00 00 00 00 ++B708: 00 00 00 00 00 00 00 00 ++B710: 00 00 00 00 00 00 00 00 ++B718: 00 00 00 00 00 00 00 00 ++B720: 00 00 00 00 00 00 00 00 ++B728: 00 00 00 00 00 00 00 00 ++B730: 00 00 00 00 00 00 00 00 ++B738: 00 00 00 00 00 00 00 00 ++B740: 00 00 00 00 00 00 00 00 ++B748: 00 00 00 00 00 00 00 00 ++B750: 00 00 00 00 00 00 00 00 ++B758: 00 00 00 00 00 00 00 00 ++B760: 00 00 00 00 00 00 00 00 ++B768: 00 00 00 00 00 00 00 00 ++B770: 00 00 00 00 00 00 00 00 ++B778: 00 00 00 00 00 00 00 00 ++B780: 00 00 00 00 00 00 00 00 ++B788: 00 00 00 00 00 00 00 00 ++B790: 00 00 00 00 00 00 00 00 ++B798: 00 00 00 00 00 00 00 00 ++B7A0: 00 00 00 00 00 00 00 00 ++B7A8: 00 00 00 00 00 00 00 00 ++B7B0: 00 00 00 00 00 08 78 20 + B7B8: 00 BD B0 03 28 18 60 28 + B7C0: 38 60 AD BC B5 8D F1 B7 + B7C8: A9 00 8D F0 B7 AD F9 B5 + B7D0: 49 FF 8D EB B7 60 A9 00 +-B7D8: A8 91 42 C8 D0 FB 60 00 +-B7E0: 1B 00 0A 1B E8 B7 00 B6 +-B7E8: 01 60 01 FF 15 0A FB B7 +-B7F0: 00 96 00 01 01 00 FE 60 ++B7D8: A8 91 42 C8 D0 FB 60 FF ++B7E0: FF 00 00 00 E8 B7 FF FF ++B7E8: 01 60 01 FF 00 00 FB B7 ++B7F0: FF FF 00 00 00 00 FE 60 + B7F8: 01 00 00 00 01 EF D8 00 + B800: A2 00 A0 02 88 B1 3E 4A + B808: 3E 00 BC 4A 3E 00 BC 99 +@@ -107,12 +107,12 @@ + BA50: DE DF E5 E6 E7 E9 EA EB + BA58: EC ED EE EF F2 F3 F4 F5 + BA60: F6 F7 F9 FA FB FC FD FE +-BA68: FF AE 5F AA E0 1C F0 05 +-BA70: A2 00 8E 5D B6 60 A9 FF +-BA78: 8D FB 04 8D 0C C0 8D 0E +-BA80: C0 4C 2F FB AD BD B5 8D +-BA88: E6 B5 8D EA B5 BA 8E 9B +-BA90: B3 4C 7F B3 00 00 00 01 ++BA68: FF 00 00 00 00 00 00 00 ++BA70: 00 00 00 00 00 00 00 00 ++BA78: 00 00 00 00 00 00 00 00 ++BA80: 00 00 00 00 00 00 00 00 ++BA88: 00 00 00 00 00 00 00 00 ++BA90: 00 00 00 00 00 00 00 01 + BA98: 98 99 02 03 9C 04 05 06 + BAA0: A0 A1 A2 A3 A4 A5 07 08 + BAA8: A8 A9 AA 09 0A 0B 0C 0D +@@ -279,10 +279,4 @@ + BFB0: 00 00 00 00 00 00 00 00 + BFB8: 00 0D 0B 09 07 05 03 01 + BFC0: 0E 0C 0A 08 06 04 02 0F +-BFC8: 20 93 FE AD 81 C0 AD 81 +-BFD0: C0 A9 00 8D 00 E0 20 76 +-BFD8: BA 4C 44 B7 8D 63 AA 8D +-BFE0: 70 AA 8D 71 AA 60 20 5B +-BFE8: A7 8C B7 AA 60 20 7E AE +-BFF0: AE 9B B3 9A 20 16 A3 BA +-BFF8: 8E 9B B3 A9 09 4C 85 B3 ++BFC8: 00 00 00 00 00 00 00 00 diff --git a/mon/dos33.rwts.mon b/mon/dos33.rwts.mon new file mode 100644 index 0000000..6940efe --- /dev/null +++ b/mon/dos33.rwts.mon @@ -0,0 +1,282 @@ +B700: 00 00 00 00 00 00 00 00 +B708: 00 00 00 00 00 00 00 00 +B710: 00 00 00 00 00 00 00 00 +B718: 00 00 00 00 00 00 00 00 +B720: 00 00 00 00 00 00 00 00 +B728: 00 00 00 00 00 00 00 00 +B730: 00 00 00 00 00 00 00 00 +B738: 00 00 00 00 00 00 00 00 +B740: 00 00 00 00 00 00 00 00 +B748: 00 00 00 00 00 00 00 00 +B750: 00 00 00 00 00 00 00 00 +B758: 00 00 00 00 00 00 00 00 +B760: 00 00 00 00 00 00 00 00 +B768: 00 00 00 00 00 00 00 00 +B770: 00 00 00 00 00 00 00 00 +B778: 00 00 00 00 00 00 00 00 +B780: 00 00 00 00 00 00 00 00 +B788: 00 00 00 00 00 00 00 00 +B790: 00 00 00 00 00 00 00 00 +B798: 00 00 00 00 00 00 00 00 +B7A0: 00 00 00 00 00 00 00 00 +B7A8: 00 00 00 00 00 00 00 00 +B7B0: 00 00 00 00 00 08 78 20 +B7B8: 00 BD B0 03 28 18 60 28 +B7C0: 38 60 AD BC B5 8D F1 B7 +B7C8: A9 00 8D F0 B7 AD F9 B5 +B7D0: 49 FF 8D EB B7 60 A9 00 +B7D8: A8 91 42 C8 D0 FB 60 FF +B7E0: FF 00 00 00 E8 B7 FF FF +B7E8: 01 60 01 FF 00 00 FB B7 +B7F0: FF FF 00 00 00 00 FE 60 +B7F8: 01 00 00 00 01 EF D8 00 +B800: A2 00 A0 02 88 B1 3E 4A +B808: 3E 00 BC 4A 3E 00 BC 99 +B810: 00 BB E8 E0 56 90 ED A2 +B818: 00 98 D0 E8 A2 55 BD 00 +B820: BC 29 3F 9D 00 BC CA 10 +B828: F5 60 38 86 27 8E 78 06 +B830: BD 8D C0 BD 8E C0 30 7C +B838: AD 00 BC 85 26 A9 FF 9D +B840: 8F C0 1D 8C C0 48 68 EA +B848: A0 04 48 68 20 B9 B8 88 +B850: D0 F8 A9 D5 20 B8 B8 A9 +B858: AA 20 B8 B8 A9 AD 20 B8 +B860: B8 98 A0 56 D0 03 B9 00 +B868: BC 59 FF BB AA BD 29 BA +B870: A6 27 9D 8D C0 BD 8C C0 +B878: 88 D0 EB A5 26 EA 59 00 +B880: BB AA BD 29 BA AE 78 06 +B888: 9D 8D C0 BD 8C C0 B9 00 +B890: BB C8 D0 EA AA BD 29 BA +B898: A6 27 20 BB B8 A9 DE 20 +B8A0: B8 B8 A9 AA 20 B8 B8 A9 +B8A8: EB 20 B8 B8 A9 FF 20 B8 +B8B0: B8 BD 8E C0 BD 8C C0 60 +B8B8: 18 48 68 9D 8D C0 1D 8C +B8C0: C0 60 A0 00 A2 56 CA 30 +B8C8: FB B9 00 BB 5E 00 BC 2A +B8D0: 5E 00 BC 2A 91 3E C8 C4 +B8D8: 26 D0 EB 60 A0 20 88 F0 +B8E0: 61 BD 8C C0 10 FB 49 D5 +B8E8: D0 F4 EA BD 8C C0 10 FB +B8F0: C9 AA D0 F2 A0 56 BD 8C +B8F8: C0 10 FB C9 AD D0 E7 A9 +B900: 00 88 84 26 BC 8C C0 10 +B908: FB 59 00 BA A4 26 99 00 +B910: BC D0 EE 84 26 BC 8C C0 +B918: 10 FB 59 00 BA A4 26 99 +B920: 00 BB C8 D0 EE BC 8C C0 +B928: 10 FB D9 00 BA D0 13 BD +B930: 8C C0 10 FB C9 DE D0 0A +B938: EA BD 8C C0 10 FB C9 AA +B940: F0 5C 38 60 A0 FC 84 26 +B948: C8 D0 04 E6 26 F0 F3 BD +B950: 8C C0 10 FB C9 D5 D0 F0 +B958: EA BD 8C C0 10 FB C9 AA +B960: D0 F2 A0 03 BD 8C C0 10 +B968: FB C9 96 D0 E7 A9 00 85 +B970: 27 BD 8C C0 10 FB 2A 85 +B978: 26 BD 8C C0 10 FB 25 26 +B980: 99 2C 00 45 27 88 10 E7 +B988: A8 D0 B7 BD 8C C0 10 FB +B990: C9 DE D0 AE EA BD 8C C0 +B998: 10 FB C9 AA D0 A4 18 60 +B9A0: 86 2B 85 2A CD 78 04 F0 +B9A8: 53 A9 00 85 26 AD 78 04 +B9B0: 85 27 38 E5 2A F0 33 B0 +B9B8: 07 49 FF EE 78 04 90 05 +B9C0: 69 FE CE 78 04 C5 26 90 +B9C8: 02 A5 26 C9 0C B0 01 A8 +B9D0: 38 20 EE B9 B9 11 BA 20 +B9D8: 00 BA A5 27 18 20 F1 B9 +B9E0: B9 1D BA 20 00 BA E6 26 +B9E8: D0 C3 20 00 BA 18 AD 78 +B9F0: 04 29 03 2A 05 2B AA BD +B9F8: 80 C0 A6 2B 60 00 00 00 +BA00: A2 11 CA D0 FD E6 46 D0 +BA08: 02 E6 47 38 E9 01 D0 F0 +BA10: 60 01 30 28 24 20 1E 1D +BA18: 1C 1C 1C 1C 1C 70 2C 26 +BA20: 22 1F 1E 1D 1C 1C 1C 1C +BA28: 1C 96 97 9A 9B 9D 9E 9F +BA30: A6 A7 AB AC AD AE AF B2 +BA38: B3 B4 B5 B6 B7 B9 BA BB +BA40: BC BD BE BF CB CD CE CF +BA48: D3 D6 D7 D9 DA DB DC DD +BA50: DE DF E5 E6 E7 E9 EA EB +BA58: EC ED EE EF F2 F3 F4 F5 +BA60: F6 F7 F9 FA FB FC FD FE +BA68: FF 00 00 00 00 00 00 00 +BA70: 00 00 00 00 00 00 00 00 +BA78: 00 00 00 00 00 00 00 00 +BA80: 00 00 00 00 00 00 00 00 +BA88: 00 00 00 00 00 00 00 00 +BA90: 00 00 00 00 00 00 00 01 +BA98: 98 99 02 03 9C 04 05 06 +BAA0: A0 A1 A2 A3 A4 A5 07 08 +BAA8: A8 A9 AA 09 0A 0B 0C 0D +BAB0: B0 B1 0E 0F 10 11 12 13 +BAB8: B8 14 15 16 17 18 19 1A +BAC0: C0 C1 C2 C3 C4 C5 C6 C7 +BAC8: C8 C9 CA 1B CC 1C 1D 1E +BAD0: D0 D1 D2 1F D4 D5 20 21 +BAD8: D8 22 23 24 25 26 27 28 +BAE0: E0 E1 E2 E3 E4 29 2A 2B +BAE8: E8 2C 2D 2E 2F 30 31 32 +BAF0: F0 F1 33 34 35 36 37 38 +BAF8: F8 39 3A 3B 3C 3D 3E 3F +BB00: 00 00 00 00 00 00 00 00 +BB08: 00 00 00 00 00 00 00 00 +BB10: 00 00 00 00 00 00 00 00 +BB18: 00 00 00 00 00 00 00 00 +BB20: 00 00 00 00 00 00 00 00 +BB28: 00 00 00 00 00 00 00 00 +BB30: 00 00 00 00 00 00 00 00 +BB38: 00 00 00 00 00 00 00 00 +BB40: 00 00 00 00 00 00 00 00 +BB48: 00 00 00 00 00 00 00 00 +BB50: 00 00 00 00 00 00 00 00 +BB58: 00 00 00 00 00 00 00 00 +BB60: 00 00 00 00 00 00 00 00 +BB68: 00 00 00 00 00 00 00 00 +BB70: 00 00 00 00 00 00 00 00 +BB78: 00 00 00 00 00 00 00 00 +BB80: 00 00 00 00 00 00 00 00 +BB88: 00 00 00 00 00 00 00 00 +BB90: 00 00 00 00 00 00 00 00 +BB98: 00 00 00 00 00 00 00 00 +BBA0: 00 00 00 00 00 00 00 00 +BBA8: 00 00 00 00 00 00 00 00 +BBB0: 00 00 00 00 00 00 00 00 +BBB8: 00 00 00 00 00 00 00 00 +BBC0: 00 00 00 00 00 00 00 00 +BBC8: 00 00 00 00 00 00 00 00 +BBD0: 00 00 00 00 00 00 00 00 +BBD8: 00 00 00 00 00 00 00 00 +BBE0: 00 00 00 00 00 00 00 00 +BBE8: 00 00 00 00 00 00 00 00 +BBF0: 00 00 00 00 00 00 00 00 +BBF8: 00 00 00 00 00 00 00 00 +BC00: 00 00 00 00 00 00 00 00 +BC08: 00 00 00 00 00 00 00 00 +BC10: 00 00 00 00 00 00 00 00 +BC18: 00 00 00 00 00 00 00 00 +BC20: 00 00 00 00 00 00 00 00 +BC28: 00 00 00 00 00 00 00 00 +BC30: 00 00 00 00 00 00 00 00 +BC38: 00 00 00 00 00 00 00 00 +BC40: 00 00 00 00 00 00 00 00 +BC48: 00 00 00 00 00 00 00 00 +BC50: 00 00 00 00 00 00 38 BD +BC58: 8D C0 BD 8E C0 30 5E A9 +BC60: FF 9D 8F C0 DD 8C C0 48 +BC68: 68 20 C3 BC 20 C3 BC 9D +BC70: 8D C0 DD 8C C0 EA 88 D0 +BC78: F0 A9 D5 20 D5 BC A9 AA +BC80: 20 D5 BC A9 96 20 D5 BC +BC88: A5 41 20 C4 BC A5 44 20 +BC90: C4 BC A5 3F 20 C4 BC A5 +BC98: 41 45 44 45 3F 48 4A 05 +BCA0: 3E 9D 8D C0 BD 8C C0 68 +BCA8: 09 AA 20 D4 BC A9 DE 20 +BCB0: D5 BC A9 AA 20 D5 BC A9 +BCB8: EB 20 D5 BC 18 BD 8E C0 +BCC0: BD 8C C0 60 48 4A 05 3E +BCC8: 9D 8D C0 DD 8C C0 68 EA +BCD0: EA EA 09 AA EA EA 48 68 +BCD8: 9D 8D C0 DD 8C C0 60 00 +BCE0: 00 00 00 00 00 00 00 00 +BCE8: 00 00 00 00 00 00 00 00 +BCF0: 00 00 00 00 00 00 00 00 +BCF8: 00 00 00 00 00 00 00 00 +BD00: 84 48 85 49 A0 02 8C F8 +BD08: 06 A0 04 8C F8 04 A0 01 +BD10: B1 48 AA A0 0F D1 48 F0 +BD18: 1B 8A 48 B1 48 AA 68 48 +BD20: 91 48 BD 8E C0 A0 08 BD +BD28: 8C C0 DD 8C C0 D0 F6 88 +BD30: D0 F8 68 AA BD 8E C0 BD +BD38: 8C C0 A0 08 BD 8C C0 48 +BD40: 68 48 68 8E F8 05 DD 8C +BD48: C0 D0 03 88 D0 EE 08 BD +BD50: 89 C0 A0 06 B1 48 99 36 +BD58: 00 C8 C0 0A D0 F6 A0 03 +BD60: B1 3C 85 47 A0 02 B1 48 +BD68: A0 10 D1 48 F0 06 91 48 +BD70: 28 A0 00 08 6A 90 05 BD +BD78: 8A C0 B0 03 BD 8B C0 66 +BD80: 35 28 08 D0 0B A0 07 20 +BD88: 00 BA 88 D0 FA AE F8 05 +BD90: A0 04 B1 48 20 5A BE 28 +BD98: D0 11 A4 47 10 0D A0 12 +BDA0: 88 D0 FD E6 46 D0 F7 E6 +BDA8: 47 D0 F3 A0 0C B1 48 F0 +BDB0: 5A C9 04 F0 58 6A 08 B0 +BDB8: 03 20 00 B8 A0 30 8C 78 +BDC0: 05 AE F8 05 20 44 B9 90 +BDC8: 24 CE 78 05 10 F3 AD 78 +BDD0: 04 48 A9 60 20 95 BE CE +BDD8: F8 06 F0 28 A9 04 8D F8 +BDE0: 04 A9 00 20 5A BE 68 20 +BDE8: 5A BE 4C BC BD A4 2E CC +BDF0: 78 04 F0 1C AD 78 04 48 +BDF8: 98 20 95 BE 68 CE F8 04 +BE00: D0 E5 F0 CA 68 A9 40 28 +BE08: 4C 48 BE F0 39 4C AF BE +BE10: A0 03 B1 48 48 A5 2F A0 +BE18: 0E 91 48 68 F0 08 C5 2F +BE20: F0 04 A9 20 D0 E1 A0 05 +BE28: B1 48 A8 B9 B8 BF C5 2D +BE30: D0 97 28 90 1C 20 DC B8 +BE38: 08 B0 8E 28 A2 00 86 26 +BE40: 20 C2 B8 AE F8 05 18 24 +BE48: 38 A0 0D 91 48 BD 88 C0 +BE50: 60 20 2A B8 90 F0 A9 10 +BE58: B0 EE 48 A0 01 B1 3C 6A +BE60: 68 90 08 0A 20 6B BE 4E +BE68: 78 04 60 85 2A 20 8E BE +BE70: B9 78 04 24 35 30 03 B9 +BE78: F8 04 8D 78 04 A5 2A 24 +BE80: 35 30 05 99 F8 04 10 03 +BE88: 99 78 04 4C A0 B9 8A 4A +BE90: 4A 4A 4A A8 60 48 A0 02 +BE98: B1 48 6A 66 35 20 8E BE +BEA0: 68 0A 24 35 30 05 99 F8 +BEA8: 04 10 03 99 78 04 60 A0 +BEB0: 03 B1 48 85 41 A9 AA 85 +BEB8: 3E A0 56 A9 00 85 44 99 +BEC0: FF BB 88 D0 FA 99 00 BB +BEC8: 88 D0 FA A9 50 20 95 BE +BED0: A9 28 85 45 A5 44 20 5A +BED8: BE 20 0D BF A9 08 B0 24 +BEE0: A9 30 8D 78 05 38 CE 78 +BEE8: 05 F0 19 20 44 B9 B0 F5 +BEF0: A5 2D D0 F1 20 DC B8 B0 +BEF8: EC E6 44 A5 44 C9 23 90 +BF00: D3 18 90 05 A0 0D 91 48 +BF08: 38 BD 88 C0 60 A9 00 85 +BF10: 3F A0 80 D0 02 A4 45 20 +BF18: 56 BC B0 6B 20 2A B8 B0 +BF20: 66 E6 3F A5 3F C9 10 90 +BF28: EC A0 0F 84 3F A9 30 8D +BF30: 78 05 99 A8 BF 88 10 FA +BF38: A4 45 20 87 BF 20 87 BF +BF40: 20 87 BF 48 68 EA 88 D0 +BF48: F1 20 44 B9 B0 23 A5 2D +BF50: F0 15 A9 10 C5 45 A5 45 +BF58: E9 01 85 45 C9 05 B0 11 +BF60: 38 60 20 44 B9 B0 05 20 +BF68: DC B8 90 1C CE 78 05 D0 +BF70: F1 20 44 B9 B0 0B A5 2D +BF78: C9 0F D0 05 20 DC B8 90 +BF80: 8C CE 78 05 D0 EB 38 60 +BF88: A4 2D B9 A8 BF 30 DD A9 +BF90: FF 99 A8 BF C6 3F 10 CA +BF98: A5 44 D0 0A A5 45 C9 10 +BFA0: 90 E5 C6 45 C6 45 18 60 +BFA8: 00 00 00 00 00 00 00 00 +BFB0: 00 00 00 00 00 00 00 00 +BFB8: 00 0D 0B 09 07 05 03 01 +BFC0: 0E 0C 0A 08 06 04 02 0F +BFC8: 00 00 00 00 00 00 00 00 diff --git a/tests/images/null.dsk b/tests/images/null.dsk new file mode 100644 index 0000000..634d6db Binary files /dev/null and b/tests/images/null.dsk differ