;**************************************************************************** ;** ** ;** SmartFiler 2000 -- BOOT block ** ;** ** ;** reverse-engineered by ** ;** Richard F. Drushel (drushel@apk.net) ** ;** ** ;**************************************************************************** ;version history ;01 0008.18 ;Began revisions to make ADAMserve- and ADAMEM-friendly. ; ;Fixed LOAD_BLOCKS to use _READ_BLOCK and bail out to ; ;SmartWriter if an error. ; ;Added REPORT macro and end-pad of block with 0. ; ;Removed orphaned and unneeded code, especially the ; ;tricky tape rewind by calling _START_RD_1_BLOCK just ; ;once. ; ;Updated boot string year to 2000. ; ;Added WAIT delay subroutine, to allow the boot block ; ;graphics to be seen in ADAMEM (it's too fast otherwise). ; ;Some day it needs to actually access the files via the ; ;directory instead of by assuming certain blocks. ;00 0008.05 ;Initial disassembly of SmartFiler 27D boot block ;**************************************************************************** ; ; SmartFiler 27D boot block ; SFBOOT -> Source re-created by Z80DIS 2.2 ; Z80DIS was written by Kenneth Gielow ; Palo Alto, CA ; ;**************************************************************************** .Z80 ;**************************************************************************** ; ;REPORT MACRO TO SHOW WHERE THINGS ARE ; REPORT MACRO MESSAGE,VALUE .PRINTX MESSAGE = VALUE ENDM ; ;**************************************************************************** I.0000 EQU 0000H ; ----I I$017F EQU 017FH ; ----I I$0204 EQU 0204H ; ----I I$037F EQU 037FH ; ----I I$0400 EQU 0400H ; ----I I$3FFF EQU 3FFFH ; ----I ;misc BLOCK_1_ADDR EQU 0000H BLOCK_2_ADDR EQU 8400H PROG_START EQU 0100H ZERO EQU 0000H TRADET$ EQU 5CH ;trademark symbol T TRADEM$ EQU 5DH ;trademark symbol M COPY$ EQU 5EH ;copyright symbol (C) REG$ EQU 5FH ;registered symbol (R) ;blocks to read BLOCK_1 EQU 0001H ;directory BLOCK_2 EQU 0002H ;file1 BLOCK_5 EQU 0005H ;file2 ;OS-7 equates PUTFRAME EQU 080BH ;internal OS-7 entry point, not jump table!!! LOAD_ASCII EQU 1F7FH FILL_VRAM EQU 1F82H MODE_1 EQU 1F85H WRITE_REGISTER EQU 1FD9H WRITE_VRAM EQU 1FDFH VDP_MODE_WORD EQU 73C3H ;EOS equates _READ_BLOCK EQU 0FCF3H _GOTO_WP EQU 0FCE7H WRITE_REGISTER_EOS EQU 0FD20H ;**************************************************************************** ;** ** ;** code begins here ** ;** ** ;**************************************************************************** COLD_BOOT_ADDR EQU 0C800H ORG COLD_BOOT_ADDR COLD_BOOT: LD A,B ;get boot device number LD (BOOT_DEVICE),A ;save it LD SP,COLD_BOOT ;set up stack CALL C$C85C ;draw initial boot screen ; CALL WAIT ;wait so we can see screen under ADAMem ; ;Load boot graphics code and data (LOGOS) ;This is *evil* because it doesn't use the directory! It assumes that ;the file occupies certain blocks. LD HL,BLOCK_2_ADDR ;load address for LOGOS LD DE,BLOCK_2 ;start block of LOGOS LD B,03H ;length of LOGOS CALL LOAD_BLOCKS ;load LOGOS ; ;Show the boot graphics screen. CALL BLOCK_2_ADDR ;run LOGOS to load SmartFiler graphic ; CALL WAIT ;wait so we can see screen under ADAMem ; ;Load the rest of SmartFiler, assuming a certain start block and length. LD HL,PROG_START ;load address for SMART_FILER LD DE,BLOCK_5 ;start block of SMART_FILER LD B,1EH ;length of SMART_FILER CALL LOAD_BLOCKS ;load SMART_FILER ; LD C,00H LD B,01H ; 1 CALL WRITE_REGISTER_EOS ;write C to VDP register B (EOS version) ; LD BC,I$017F OUT (C),B ;bank switch to 32K RAM/32K RAM LD A,(BOOT_DEVICE) ;get drive LD B,A ;into B JP PROG_START ;and begin SmartFiler ; ; ----------------- ABORT: JP _GOTO_WP ;error exit to SmartWriter ; ; ----------------- ;Load a contiguous series of blocks. On entry, B=number of blocks, ;HL=load address, DE=loword of start block (hiword is forced to 0) and ;(BOOT_DEVICE)=device to load from. On exit, the blocks are loaded. ;Note: this code is short-sighted because it assumes that the hiword ;of the block is zero. This is bad for large hard drives. LOAD_BLOCKS: PUSH BC ;save block counter (in B) LD A,(BOOT_DEVICE) ;get drive LD BC,ZERO ;force hiword of block to zero PUSH DE PUSH HL CALL _READ_BLOCK ;read it ; JR NZ,ABORT ;failed, so abort to SmartWriter POP HL POP DE LD BC,I$0400 ;length of one block ADD HL,BC ;offset to next address INC DE ;point to next block POP BC ;restore block counter (in B) DJNZ LOAD_BLOCKS ;keep going until no more blocks ; RET ; ; ----------------- BOOT_DEVICE: DEFB 20H ;where we save our boot device # ; ----------------- ; ;Pause routine. Delay is about 5 seconds with B=10. WAIT: LD B,10 ;change to vary the total delay WAIT1: PUSH BC ;save outer loop counter LD HL,0 ;initialize inner loop counter WAIT2: DEC HL ;one less LD A,H OR L ;is HL=0? JR NZ,WAIT2 ;no, keep going POP BC ;yes, so restore outer loop counter DJNZ WAIT1 ;keep going until B=0 ; RET ;all done ; ; ----------------- ; ; Subroutine __________________________ ; Inputs ________________________ ; Outputs ________________________ ; C$C85C: LD BC,I$037F OUT (C),B CALL C$C8ED ;bank switch to OS7-24 K RAM/32K RAM ; LD HL,I.0000 LD DE,I$3FFF XOR A CALL FILL_VRAM ;wipe VRAM ; CALL MODE_1 ; CALL LOAD_ASCII ; LD IX,I$C9F4 CALL C.C8B3 ; LD IX,I$C9DA CALL C.C8B3 ; LD HL,I$C900 LD DE,I$0204 CALL C$C8AB ; LD HL,BOOT_TEXT CALL C.C895 ; CALL C$C8F9 ; RET ; ; ----------------- ; ; Subroutine __________________________ ; Inputs ________________________ ; Outputs ________________________ ; C.C895: LD A,(HL) INC A RET Z ; LD D,(HL) INC HL LD E,(HL) INC HL LD C,(HL) INC HL PUSH HL LD B,00H ADD HL,BC EX (SP),HL LD B,01H ; 1 CALL PUTFRAME ;internal OS-7 ref!!! ; POP HL JR C.C895 ; ; ----------------- ; ; Subroutine __________________________ ; Inputs ________________________ ; Outputs ________________________ ; C$C8AB: LD B,(HL) INC HL LD C,(HL) INC HL CALL PUTFRAME ;internal OS-7 ref!!! ; RET ; ; ----------------- ; ; Subroutine __________________________ ; Inputs ________________________ ; Outputs ________________________ ; C.C8B3: LD H,(IX+1) LD L,(IX) LD D,(IX+3) LD E,(IX+2) LD B,(IX+5) LD C,(IX+4) PUSH BC PUSH HL PUSH DE INC C DEC C JR Z,J$C8D1 ; LD B,00H CALL WRITE_VRAM ; J$C8D1: POP DE POP HL POP BC INC B DEC B RET Z ; PUSH BC LD B,00H ADD HL,BC EX DE,HL ADD HL,BC EX DE,HL POP BC LD C,00H CALL WRITE_VRAM ; RET ; ; ----------------- ; ; Subroutine __________________________ ; Inputs ________________________ ; Outputs ________________________ ; C$C8ED: LD A,(VDP_MODE_WORD+1) ;saved VDP register 1 value RES 5,A ;clear bit 5 J$C8F2: LD C,A ;into C so we can write it LD B,01H ; 1 CALL WRITE_REGISTER ;update VDP register 1 ; RET ; ; ----------------- ; ; Subroutine __________________________ ; Inputs ________________________ ; Outputs ________________________ ; C$C8F9: LD A,(VDP_MODE_WORD+1) ;saved VDP register 1 value SET 6,A ;set bit 6 JR J$C8F2 ;write it back ; ; ----------------- I$C900: DEFB 5,25 ;number of data units, length of each data unit ; DEFB 00H,61H,63H,63H,64H DEFB 00H,61H,63H,63H,63H DEFB 6EH,00H,61H,63H,63H DEFB 64H,00H,61H,63H,64H DEFB 00H,7AH,63H,7EH,7FH ; DEFB 00H,62H,60H,66H,65H DEFB 00H,62H,60H,6FH,70H DEFB 60H,00H,62H,60H,66H DEFB 65H,00H,62H,60H,65H DEFB 00H,6AH,60H,00H,00H ; DEFB 00H,69H,67H,68H,60H DEFB 7CH,00H,60H,71H,72H DEFB 60H,00H,69H,67H,68H DEFB 60H,7CH,00H,60H,60H DEFB 79H,60H,60H,00H,00H ; DEFB 00H,6AH,60H,60H,60H DEFB 65H,00H,60H,73H,74H DEFB 60H,00H,6AH,60H,60H DEFB 60H,65H,00H,60H,75H DEFB 60H,77H,60H,00H,00H ; DEFB 69H,60H,6BH,6CH,6DH DEFB 60H,7CH,60H,60H,60H DEFB 7DH,69H,60H,6BH,6CH DEFB 6DH,60H,7CH,60H,76H DEFB 60H,78H,60H,00H,00H BOOT_TEXT: ;row, column, length of string, string data DEFB 9,14,3,"THE" DEFB 10,10,13,"COLECOVISION",REG$ DEFB 11,5,22,"FAMILY COMPUTER SYSTEM" DEFB 13,12,8,"PRESENTS" DEFB 15,7,18,"SMART FILER",TRADET$,TRADEM$," 2000" DEFB 17,10,13,COPY$," 1984 COLECO" DEFB 19,3,25,COPY$," 2000 RICHARD F. DRUSHEL" DEFB 0FFH ;end of data I$C9DA: DEFW I$C9E0 ;RAM source address DEFW 2000H ;VRAM destination address DEFW 20 ;count I$C9E0: DEFB 50H,50H,50H,50H DEFB 0F0H,0F0H,0F0H,0F0H DEFB 0F0H,0F0H,0F0H,0F0H DEFB 50H,50H,50H,50H DEFB 50H,50H,50H,50H I$C9F4: DEFW I$C9FA ;RAM source address DEFW 02E0H ;VRAM destination address DEFW 288 ;count I$C9FA: DEFB 0FAH,23H,22H,22H,00H,00H,00H,00H DEFB 20H,60H,0A0H,20H,00H,00H,00H,00H DEFB 7CH,82H,0BAH,0A2H,0BAH,82H,7CH,00H DEFB 3CH,42H,0B9H,0A5H,0B9H,0ADH,42H,3CH DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DEFB 00H,00H,00H,00H,0FH,0FH,1FH,1FH DEFB 3FH,3FH,7FH,7FH,01H,00H,00H,00H DEFB 00H,00H,00H,00H,0FFH,0FFH,0FFH,0FFH DEFB 00H,00H,00H,00H,0C0H,0C0H,0E0H,0E0H DEFB 0F0H,0F0H,0F8H,0F8H,0FCH,0FCH,0FEH,0FEH DEFB 0FFH,0FFH,0FFH,0FFH,0CFH,0CFH,87H,87H DEFB 0FFH,0FFH,0FFH,0FFH,0FEH,0FEH,0FCH,0FCH DEFB 87H,03H,03H,03H,01H,01H,00H,00H DEFB 00H,00H,01H,01H,03H,03H,07H,07H DEFB 0FH,0FH,1FH,1FH,3FH,3FH,7FH,7FH DEFB 0FFH,0FFH,0C0H,0C0H,80H,80H,00H,00H DEFB 0FFH,0FFH,00H,00H,00H,00H,00H,00H DEFB 0FFH,0FFH,03H,03H,01H,01H,00H,00H DEFB 00H,00H,00H,00H,0F0H,0FCH,0FEH,0FEH DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,80H,80H,80H DEFB 0FFH,0FFH,0FFH,0FFH,0FFH,03H,01H,01H DEFB 80H,80H,80H,80H,80H,80H,80H,80H DEFB 01H,01H,01H,01H,01H,01H,01H,01H DEFB 80H,80H,80H,80H,80H,80H,80H,0FFH DEFB 01H,01H,01H,01H,01H,01H,03H,0FFH DEFB 7FH,7FH,3FH,3FH,1FH,1FH,0FH,0FH DEFB 07H,07H,03H,03H,01H,01H,00H,00H DEFB 0FEH,0FEH,0FCH,0FCH,0F8H,0F8H,0F0H,0F0H DEFB 0E0H,0E0H,0C0H,0C0H,80H,80H,00H,00H DEFB 00H,00H,81H,81H,0C3H,0C3H,0E7H,0E7H DEFB 00H,00H,00H,00H,03H,03H,07H,07H DEFB 0F3H,55H,51H,51H,00H,00H,00H,00H DEFB 00H,00H,80H,80H,0C0H,0C0H,0E0H,0E0H DEFB 0FFH,0FFH,0FFH,0FFH,0FEH,0FEH,0FCH,0F0H DEFB 0FAH,23H,22H,22H,00H,00H,00H,00H DEFB 20H,60H,0A0H,20H,00H,00H,00H,00H ; ----------------- ;re-create original credit string DEFB "@ PROGRAM BY SIERRA ON-LINE @" DEFB "@ PROGRAMMED BY DON MCGLAUFLIN @" DEFB "@ (c) 1984 SIERRA ON-LINE, INC. @" ; ----------------- ; BOOTSPACE EQU 0CC00H-$ DS BOOTSPACE ;zero-fill rest of block REPORT ,%BOOTSPACE ;**************************************************************************** END