; Source for Einstein BACKUP utility (dissassembled from DOS2.05) CPU Z80 ;------------------------------------------------------------------------ ; Reset RESET EQU $0000 ; DOS functions DOS_FUNCTION EQU $0005 ; MOS rst code and commands used BIOS_CALL EQU $08 BIOS_DISC_READ EQU $80+$22 ; read sectors from disc BIOS_DISC_WRITE EQU $80+$23 ; write sectors to disc BIOS_DISC_CMD EQU $80+$2e ; send command to disc controller BIOS_DISC_RESET EQU $80+$3d ; reset disc? (sends 0 to $23 and makes some noise!) ; codes used when calling RST ; dfb $2f|$80 ; dfb $2f|$80 ; MOS working parameters MOS_DRIVE_NUM EQU $FB50 ; current drive number (0-3) MOS_TRACK_NUM EQU $FB51 ; current track number (0-39 or 0-79) MOS_SECTOR_NUM EQU $FB52 ; current sector number (0-9 or 0-19) MOS_BUFADR_LO EQU $FB53 ; lo byte of data address buffer MOS_BUFADR_HI EQU $FB54 ; hi byte of data address buffer MOS_ERROR_CODE EQU $FB56 ; error code returned from MOS MOS_DRIVE_POS EQU $FB58 ; current head location (4 entries, one for each drive) ; MOS reference vars MOS_DRIVE_TYPES EQU $FBB1 ; bits specify sides and tracks for all four drives, ; bit number 76543210 ; drive 32103210 ; tracks XXXX.... where X=0 for 40, X=1 for 80 ; sides ....XXXX where X=0 for single, X=1 for MOS_OS_DRIVE EQU $FB7D ; drive to load OS from ; IO ports - output PORT_DRIVE_SEL EQU $23 PORT_DRIVE_CMD EQU $18 PORT_DRIVE_DATA EQU $1b ; IO ports - input PORT_DRIVE_STAT EQU $18 ;------------------------------------------------------------------------ ORG $100 ENTRY_POINT LD SP,$AFF ; 0100H CALL pop_mess DFB $0c DFB "EINSTEIN DISC BACKUP & FORMAT V2.02" DFB $0d,$0a DFB "(C) 1984-86 Xtal" DFB $0d,$0a,$0a|$80 ENTRY_POINT2 LD SP,$AFF CALL show_drives CALL pop_mess DFB $0d,$0a DFB "Press 'B' for BACKUP" DFB $0d,$0a,$0a DFB " or 'F' for FORMAT" DFB $0d,$0a,$0a DFB " or 'X' to exit" DFB $0d,$0a,$0a DFB "Which (B/F/X)",'?'|$80 entry_loop CALL get_char AND $5F ; mask out lowercase CP 'X' JP Z,RESET CP 'B' JR Z,backup CP 'F' JP Z,format LD A,$08 CALL put_char JR entry_loop ;------------------------------------------------------------------------ backup LD SP,$AFF ; 01B4H CALL pop_mess DFB $0c DFB "BACKUP DISC" DFB $0d,$0a,$0a|$80 CALL show_drives CALL pop_mess DFB "Sourc",'e'|$80 CALL input_drive_num JR NC,backup LD (src_drive),A LD (MOS_DRIVE_NUM),A ADD A,'0' LD (mess_drive_src),A CALL get_drive_type CALL pop_mess DFB "Destinatio",'n'|$80 CALL input_drive_num JR NC,backup LD (dest_drive),A LD (MOS_DRIVE_NUM),A PUSH AF CALL drive_nib_lo LD HL,(num_tracks) PUSH HL CALL get_drive_type LD HL,(num_tracks) POP DE OR A SBC HL,DE JP NZ,err_mismatch POP AF ADD A,'0' LD (mess_drive_dest),A CALL pop_mess DFB "Source drive " mess_drive_src DFB "0" ; 022c DFB ", Destination drive " mess_drive_dest DFB "0" ; 0241 DFB ",",$0d,$0a|$80 CALL continue CALL pop_mess DFB $0d,$0a,$0a|$80 XOR A LD (current_track),A JR backup_process backup_loop CALL pop_mess ; 0254 DFB "Put in SOURC",'E'|$80 CALL disc_anykey CALL pop_mess DFB $0d,$0a,$0a|$80 backup_process CALL pop_mess ; 026d DFB $0d,$0b DFB "Reading: " DFB $0d,$0a|$80 ; load track and sector into BC LD A,(current_track) LD B,0 LD C,A ; load drive number into A LD A,(src_drive) PUSH BC PUSH AF LD HL,$0B00 LD DE,$0AB00 CALL read_disc JP NZ,back_read_err POP BC LD A,(dest_drive) CP B POP BC PUSH AF JR NZ,backup_same_dsk CALL pop_mess DFB "Put in DESTINATIO",'N'|$80 CALL disc_anykey backup_same_dsk CALL pop_mess ; 02b6 DFB $0d,$0b DFB "Copying: " DFB $0d,$0a|$80 LD HL,$B00 LD DE,$AB00 POP AF PUSH AF PUSH BC CALL write_disc JP NZ,back_write_err POP BC LD HL,$B00 backup_verify CALL pop_mess DFB $0d,$0b DFB "Verifying:" DFB $0d,$0a|$80 POP AF PUSH AF PUSH BC PUSH HL LD HL,$AB00 LD DE,$D300 CALL read_disc JP NZ,back_read_err POP HL POP BC LD (MOS_TRACK_NUM),BC PUSH BC LD DE,$AB00 LD C,$50 backup_verify1 LD B,$80 backup_verify2 LD A,(DE) CP (HL) JR NZ,back_verify_err INC HL INC DE DJNZ backup_verify2 PUSH HL PUSH DE PUSH BC CALL inc_sector POP BC POP DE POP HL DEC C JR NZ,backup_verify1 POP BC INC BC LD A,(num_sides) OR A JR NZ,backup_verify3 INC BC backup_verify3 LD DE,$AB00 SBC HL,DE ADD HL,DE JR NZ,backup_verify ; continue processing disc PUSH BC ; if double side then 4 tracks have been processed, otherwise 8 tracks have been done LD C,4 LD A,(num_sides) OR A JR NZ,backup_cont1 LD C,8 backup_cont1 LD A,(current_track) ADD A,C LD (current_track),A LD B,A LD A,(num_tracks) CP B POP BC JR Z,backup_done JR C,backup_done POP AF JP NZ,backup_process JP backup_loop backup_done CALL pop_mess ; 0351 DFB $0d,$0a DFB "Disc Backed up -- O",'K'|$80 CALL more CP 'Y' JP Z,backup JP ENTRY_POINT back_verify_err CALL err_verify ; 0375 JP backup back_read_err CALL disc_error ; 037b JP backup back_write_err CP 3 ; 0381 JR NZ,back_read_err CALL pop_mess DFB "Unformatted -- Format first" DFB $0d,$0a DFB "and then retry Backup" DFB $0d,$8a JP ENTRY_POINT2 err_mismatch CALL pop_mess ; 03bf DFB "Drive Type Mismatch" DFB $0d,$0a|$80 CALL continue JP backup err_verify CALL pop_mess ; 03dd DFB $0d,$0a DFB "Verify Erro",'r'|$80 JR err_show_loc disc_error CALL pop_mess ; 03f0 DFB $0d,$0a DFB "Disc:",' '|$80 LD A,($FB56) DEC A JR Z,err_bad_data DEC A JR Z,err_protected DEC A JR Z,err_no_sector DEC A JR Z,err_not_ready ; default error code is "No Drive" CALL pop_mess DFB "No Driv",'e'|$80 JR err_restart err_not_ready CALL pop_mess ; 0417 DFB "Not Read",'y'|$80 JR err_restart err_bad_data CALL pop_mess ; 0425 DFB "Bad Data Erro",'r'|$80 JR err_show_loc err_protected CALL pop_mess ; 0438 DFB "Protecte",'d'|$80 JR err_restart err_no_sector CALL pop_mess ; 0446 DFB "No Secto",'r'|$80 ; drop throw to show error location err_show_loc CALL err_trk_sec ; 0452 CALL pop_mess DFB ", Track " mess_err_trk DFB "00" ; 0460 DFB ", Sector " mess_err_sec DFB "00" ; 046b DFB '.'|$80 err_restart RST BIOS_CALL:DFB BIOS_DISC_RESET CALL pop_mess DFB $0d,$0a DFB "Press 'X' to restart" DFB $07|$80 CALL input_anykey JR err_restart err_trk_sec LD A,(MOS_TRACK_NUM) ; 048f LD HL,mess_err_trk CALL store_decimal LD A,(MOS_SECTOR_NUM) LD HL,mess_err_sec ; drop through to decimal store function store_decimal LD BC,10 ; 049e stdec_count SUB C INC B JR NC,stdec_count ADD A,C DEC B ADD A,'0' INC HL ; store 10's LD (HL),A DEC HL LD A,B ADD A,'0' ; store 1's LD (HL),A RET ;------------------------------------------------------------------------ format LD SP,$AFF ; 04b1 CALL pop_mess DFB $0c DFB "FORMAT DISC" DFB $0d,$0a,$0a|$80 ; show all available drives CALL show_drives CALL pop_mess DFB "Ensure that disc with desired" DFB $0d,$0a DFB " system tracks is in drive" DFB ' '|$80 ; show system drive LD A,(MOS_OS_DRIVE) PUSH AF LD (MOS_DRIVE_NUM),A ADD A,'0' CALL put_char CALL continue CALL get_drive_type POP AF ; read system from disc LD BC,0 LD HL,$B00 LD DE,$3300 CALL read_disc_Q JP NZ,format_error format_restart CALL pop_mess ; 0528 DFB $0d,$0a DFB "Ok -- Forma",'t'|$80 ; select drive to format CALL input_drive_num JP NC,format LD (MOS_DRIVE_NUM),A LD (dest_drive),A ADD A,'0' LD (mess_form_drv),A CALL pop_mess DFB $0b,$15 DFB "Format Drive " mess_form_drv DFB "0" DFB $0d,$0a|$80 ; check before processing CALL continue CALL drive_status LD (MOS_ERROR_CODE),A JR NZ,format_blank LD C,A CALL pop_mess DFB $0d,$0a DFB "Previously Formatted," DFB $0d,$0a DFB " Continue anyway (Y/N)",'?'|$80 ; check before formatting previously formatted disc CALL input_anykey CP 'Y' LD A,C JP NZ,ENTRY_POINT CALL drive_status format_blank CP 2 JR Z,format_error CP 4 JR NC,format_error CALL pop_mess DFB $0d,$0a DFB "Formatting:" DFB $0d,$0a|$80 LD HL,0 LD (MOS_TRACK_NUM),HL CALL show_track_in CALL get_drive_type CALL set_drive LD E,0 JR format_enter format_error CALL disc_error ; 05d7 JP format format_loop CALL set_drive ; 05dd LD A,E ; track OUT (PORT_DRIVE_DATA),A LD (MOS_TRACK_NUM),A CALL show_track_in LD A,$10 RST BIOS_CALL:DFB BIOS_DISC_CMD CALL Z,wait_ready CALL Z,delay JR NZ,format_error IN A,(PORT_DRIVE_STAT) AND $F9 CP $A0 JP NZ,ftrack_error format_enter LD IX,interleave LD A,(num_sides) OR A LD A,0 JR Z,format_skip1 CALL ftrack_side LD A,1 format_skip1 CALL ftrack_side INC E LD A,(num_tracks) CP E JR NZ,format_loop CALL get_pos_addr LD A,(num_tracks) DEC A LD (HL),A ; write OS to disk LD A,(dest_drive) LD BC,0 LD HL,$B00 LD DE,$3300 PUSH HL PUSH DE PUSH BC PUSH AF CALL write_disc_Q ; read OS back from disk and check its ok CALL pop_mess DFB $0d,$0b DFB "Verifying: " DFB $0d,$0a|$80 POP AF POP BC POP HL PUSH HL LD DE,$5B00 CALL read_disc LD BC,$2800 POP HL POP DE format_verify LD A,(DE) CP (HL) INC HL INC DE JP NZ,form_verify_err DEC BC LD A,B OR C JR NZ,format_verify ; verify blank tracks LD BC,2 LD A,(num_sides) OR A JR Z,format_00 LD C,1 format_00 LD HL,$3300 ; 066c PUSH HL LD DE,$1400 ADD HL,DE LD A,(num_sides) OR A JR Z,format_01 ADD HL,DE format_01 EX DE,HL POP HL LD A,(dest_drive) PUSH BC PUSH HL CALL read_disc POP HL LD A,(num_sides) OR A LD B,0 LD C,20 JR Z,format_02 SLA C format_02 LD A,$E5 format_03 CP (HL) LD (HL),0 JR NZ,form_verify_err INC HL DJNZ format_03 DEC C JR NZ,format_03 POP BC INC BC LD A,(num_tracks) CP C JR NZ,format_00 RST BIOS_CALL DFB $2f|$80 CALL pop_mess DFB $0d,$0a DFB "Disc Formatted and Verified -- O",'K'|$80 CALL more CP 'Y' JP Z,format_restart JP ENTRY_POINT form_verify_err CALL err_verify ; 06da JP format_restart ftrack_side LD (format_side),A ; 06e0 CALL set_drive LD HL,ftrack_error ; address to return to if bad things happen! (see 'send_data') PUSH HL DI LD A,$F0 RST BIOS_CALL:DFB BIOS_DISC_CMD JP NZ,format_error ; send track lead in LD HL,(32*256)|$4E CALL send_data ; ten sectors per track (on each surface) LD B,10 ftrack_loop LD HL,(12*256)|$00 ; 06fa CALL send_data LD HL,(3*256)|$F5 CALL send_data LD HL,(1*256)|$FE CALL send_data LD H,1 LD L,E ; track number CALL send_data LD HL,(format_side) ; side CALL send_data LD H,1 LD L,(IX+0) ; interleaved sector number INC IX CALL send_data LD HL,(1*256)|$02 ; length of sector CALL send_data LD HL,(1*256)|$F7 CALL send_data ; send sector lead in LD HL,(22*256)|$4E CALL send_data LD HL,(12*256)|$00 CALL send_data ; send crc LD HL,(3*256)|$F5 CALL send_data LD HL,(1*256)|$FB CALL send_data ; send the 512 data bytes LD HL,(0*256)|$E5 ; 0=256 bytes CALL send_data LD HL,(0*256)|$E5 ; 0=256 bytes CALL send_data ; send crc LD HL,(1*256)|$F7 CALL send_data ; send sector lead out LD HL,(44*256)|$4E CALL send_data DJNZ ftrack_loop LD HL,ftrack_done ; change the return address pushed onto stack for 'send_data' EX (SP),HL ftrack_end LD HL,$4E CALL send_data JR ftrack_end ftrack_done LD A,$D0 OUT (PORT_DRIVE_CMD),A EI RET ftrack_error LD (MOS_ERROR_CODE),A ; 0772 LD A,$D0 OUT (PORT_DRIVE_CMD),A JP format_error ;------------------------------------------------------------------------ disc_anykey CALL pop_mess ; 077c DFB " disc and press ENTER",':'|$80 ; drop through... input_anykey CALL get_char ; 0795 CP 3 ; Ctrl-BREAK JP Z,RESET CP ' ' ; the following line does nowt, it looks like it used to skip the 'print_ret' ; but may have been hacked in binary to not do so JR C,input_anykey2 input_anykey2 PUSH AF CALL print_ret POP AF CP 'A'-1 RET C AND $5F ; mask out lowercase CP 'X' RET NZ JP ENTRY_POINT ;------------------------------------------------------------------------ continue CALL pop_mess ; 07b1 DFB $0d,$0a DFB "Press ENTER to continue" DFB $0d,$0a DFB " or 'X' to abando",'n'|$80 CALL input_anykey PUSH AF CALL pop_mess DFB $0b,$15,$0b,$15|$80 POP AF CP 13 JR NZ,continue RET ;------------------------------------------------------------------------ more CALL pop_mess ; 07f2 DFB $0d,$0a DFB "More (Y/N)",'?'|$80 CALL input_anykey CP 'Y' RET Z CP 'N' RET Z JR more ;------------------------------------------------------------------------ input_drive_num CALL pop_mess ; 080d DFB " Drive (0-3 or X)",'?'|$80 CALL input_anykey SUB '0' CP 4 RET C CALL pop_mess DFB "Invalid Drive" DFB $07,$0d,$0a|$80 JR input_drive_num ;------------------------------------------------------------------------ drive_status CALL set_drive ; 083f RST BIOS_CALL DFB $2f|$80 RET NZ LD B,A IN A,(PORT_DRIVE_STAT) BIT 6,A LD A,2 ; error code for write protect RET NZ LD A,B OR A RET ;------------------------------------------------------------------------ set_drive PUSH HL ; 0850 ; get drive bit (bit 0=drive 0 to bit 3=drive3) CALL drive_nib_lo LD L,A LD A,(format_side) OR A JR Z,set_drive0 ; set bit 4 for second side SET 4,L set_drive0 LD A,L OUT (PORT_DRIVE_SEL),A ; select drive and side POP HL RET ;------------------------------------------------------------------------ drive_nib_hi LD HL,nibble_hi ; 0862 JR drive_nib_both drive_nib_lo LD HL,nibble_lo ; 0867 drive_nib_both LD A,(MOS_DRIVE_NUM) AND 3 ADD A,L LD L,A JR NC,drive_nib1 INC H ; in bin version this can't happen! drive_nib1 LD A,(HL) RET ;------------------------------------------------------------------------ get_drive_type PUSH HL ; 0876 CALL drive_nib_lo LD A,(MOS_DRIVE_TYPES) AND (HL) JR Z,gdt_1 LD A,1 ; double sided gdt_1 LD (num_sides),A CALL drive_nib_hi LD A,(MOS_DRIVE_TYPES) AND (HL) LD A,40 JR Z,gdt_40 ADD A,A ; 80 track gdt_40 LD (num_tracks),A POP HL RET ;------------------------------------------------------------------------ send_data IN A,(PORT_DRIVE_STAT) ; 0896 ; check if drive is busy RRCA JR NC,pop_ret RRCA JR NC,send_data ; not ready LD A,L OUT (PORT_DRIVE_DATA),A DEC H JP NZ,send_data RET ; pop return address off stack and return to function that called that (not nice!) pop_ret POP HL RET wait_ready PUSH BC ; 08a8 PUSH DE LD DE,0 LD B,4 wait_ready_lp IN A,(PORT_DRIVE_STAT) RRCA JR C,wait_busy POP DE POP BC ; no error XOR A RET wait_busy DEC DE LD A,D OR E JR NZ,wait_ready_lp DJNZ wait_ready_lp POP DE POP BC ; timed out error XOR A INC A RET delay PUSH DE ; 08c4 LD DE,$1100 delay_loop DEC DE LD A,D OR E JR NZ,delay_loop POP DE RET get_pos_addr LD A,(MOS_DRIVE_NUM) ; 08cf LD C,A LD B,0 LD HL,MOS_DRIVE_POS ADD HL,BC RET ;------------------------------------------------------------------------ ; A=disc, C=track, B=sector, HL=addr of buffer, DE=end of buffer read_disc_Q PUSH AF ; 08da XOR A JR read_disc_in ;------------------------------------------------------------------------ ; A=disc, C=track, B=sector, HL=addr of buffer, DE=end of buffer read_disc PUSH AF ; 08de LD A,1 read_disc_in LD (show_track_flag),A POP AF CALL set_rw_param read_disc_loop CALL show_track PUSH DE RST BIOS_CALL:DFB BIOS_DISC_READ POP DE JR NZ,rwdisc_done CALL inc_sector JR C,read_disc_loop JR rwdisc_done ;------------------------------------------------------------------------ ; A=disc, C=track, B=sector, HL=addr of buffer, DE=end of buffer write_disc_Q PUSH AF ; 08f8 XOR A JR write_disc_in ;------------------------------------------------------------------------ ; A=disc, C=track, B=sector, HL=addr of buffer, DE=end of buffer write_disc PUSH AF ; 08FC LD A,1 write_disc_in LD (show_track_flag),A ; 08ff POP AF CALL set_rw_param write_disc_lp CALL show_track PUSH DE RST BIOS_CALL:DFB BIOS_DISC_WRITE POP DE JR NZ,rwdisc_done CALL inc_sector JR C,write_disc_lp rwdisc_done LD A,(MOS_ERROR_CODE) ; 0914 OR A RET ;------------------------------------------------------------------------ show_track LD A,(show_track_flag) ; 0919 OR A RET Z show_track_in LD A,(MOS_SECTOR_NUM) OR A RET NZ PUSH HL PUSH DE PUSH BC LD A,(MOS_TRACK_NUM) LD HL,mess_track CALL store_decimal CALL pop_mess DFB $0d DFB "Track " mess_track DFB "00" DFB ' '|$80 POP BC POP DE POP HL RET ;------------------------------------------------------------------------ set_rw_param LD (MOS_DRIVE_NUM),A ; 0940 LD (MOS_BUFADR_LO),HL LD (MOS_TRACK_NUM),BC RET ;------------------------------------------------------------------------ inc_sector LD HL,MOS_SECTOR_NUM ; 094b INC (HL) LD C,10 LD A,(num_sides) OR A JR Z,inc_sector1 SLA C ; double sided discs have 20 sectors inc_sector1 LD A,(HL) CP C JR C,inc_sector2 ; increment track number LD (HL),0 DEC HL INC (HL) inc_sector2 LD HL,(MOS_BUFADR_LO) LD BC,$200 ADD HL,BC LD (MOS_BUFADR_LO),HL XOR A SBC HL,DE LD (MOS_ERROR_CODE),A RET ;------------------------------------------------------------------------ show_drives CALL pop_mess DFB $0d,$0a DFB "Drive Configuration:" DFB $0d,$0a,$0a|$80 ; now process all four drives XOR A show_loop LD (MOS_DRIVE_NUM),A ADD A,'0' CALL put_char CALL get_drive_type LD A,(num_sides) OR A JR NZ,show_sides2 CALL pop_mess DFB ": Sin",'g'|$80 ; skip over double message JR show_gotsides show_sides2 CALL pop_mess DFB ": Dou",'b'|$80 ; printed start of sided message now finish it show_gotsides LD A,(num_tracks) CP 40 LD A,'4' JR Z,show_is40 LD A,'8' show_is40 LD (show_numtrk),A CALL pop_mess DFB "le Sided, " show_numtrk DFB "4" DFB "0-Track" DFB $0d,$0a|$80 ; process all four drives LD A,(MOS_DRIVE_NUM) INC A CP 4 JR C,show_loop ; print a return and then return print_ret CALL pop_mess DFB $0d,$0a|$80 RET ;------------------------------------------------------------------------ pop_mess EX (SP),HL ; 09e7 pop_mess2 LD A,(HL) INC HL BIT 7,A RES 7,A PUSH AF CALL put_char POP AF JR Z,pop_mess2 EX (SP),HL RET ;------------------------------------------------------------------------ put_char PUSH HL ; 09f7 PUSH DE PUSH BC LD E,A LD C,2 CALL DOS_FUNCTION POP BC POP DE POP HL RET ;------------------------------------------------------------------------ get_char PUSH HL ; 0a04 PUSH DE PUSH BC LD C,1 CALL DOS_FUNCTION POP BC POP DE POP HL RET ;------------------------------------------------------------------------ nibble_lo DFB $01,$02,$04,$08 ; 0a10 nibble_hi DFB $10,$20,$40,$80 ; 0a14 ; sector interleave table (last 10 are only used on double sided drives) interleave DFB $00,$05,$01,$06,$02,$07,$03,$08,$04,$09 ; 0a18 DFB $0f,$0a,$10,$0b,$11,$0c,$12,$0d,$13,$0e ; drive numbers src_drive DFB $00 ; read drive 0-3 ; 0a2c dest_drive DFB $00 ; write drive 0-3 ; 0a2d ; used by backup current_track DFB $00 ; track number (0-num_tracks) ; 0a2e ; following two bytes are drive type (set by 'get_drive_type') and are occaisionally accessed as a word num_tracks DFB 40 ; 40 or 80 ; 0a2f num_sides DFB $4c ; 0=single sides, 1=double sided ; 0a30 ; show track count during read/write operations show_track_flag DFB $4c ; 0=dont show, 1=show ; 0a31 ; which side is currently being formated format_side DFB $07 ; 0=side 1, 1=side 2 ; 0a32 ; This is just file noise (ie this is only required to pad to next page and is never accessed ; it's only here so this file can be verified against the original) HEX 013A2F0AFE283E3428023E3832 ; 0a33 HEX CF09CDE7096C652053696465642C2034 ; 0a40 HEX 302D547261636B0D8A3A50FB3CFE0438 ; 0a50 HEX AECDE7090D8AC9E37E23CB7FCBBFF5CD ; 0a60 HEX F709F128F3E3C9E5D5C55F0E02CD0500 ; 0a70 HEX CB322C023A9A02C606322E02CD1E0532 ; 0a80 HEX 2D02C3960F3ECB322B023A9A02C60632 ; 0a90 HEX 2C02C35D11CD2108FE282840CD8A1428 ; 0aa0 HEX 173A9A02322B02CD37083E03322802CD ; 0ab0 HEX 2105222C02C362113A9A02E6C6322B02 ; 0ac0 HEX 2ACF1422A602CD3708CD6E1421D11422 ; 0ad0 HEX A602473A2B02B0322B0218CECDC41428 ; 0ae0 HEX 0B322B023EE9322C02C35D113EE9C310 ; 0af0 stack DFS 256,0 ; 0b00 MEMSAVE "BACKUP.COM.ein",$100,stack END