               TEXT
               INCLUDE '\LIB\GEMDOS.S'
               INCLUDE '\LIB\XBIOS.S'
               INCLUDE '\LIB\BIOS.S'
               INCLUDE '\LIB\ESCCHAR.S'
               XDEF EDIT_SECTOR
               CNOP 0,4
EDIT_SECTOR    BSR      TURN_CURSOR_OFF
               BSR      TURN_CAPS_ON
               MOVE.W   #0,PAGE_OFFSET
               MOVE.W   #0,DRIVE
               MOVE.B   #0,SEARCH_KEY_LEN
               LEA      SECTOR_SCREEN,A0
               BSR      WRITE_STRING
               BSR      PRINT_OFFSET
               BSR      PRINT_DRIVE
               BSR      ZERO_BUFFER
               BSR      BUILD_DATA_SCREEN
               BSR      GET_BOOT_SECTOR
               BSR      MOVE_CURSOR_HOME
               BRA      SCREEN_ROW_COL_SET
EDIT_SECTOR_EXIT
               ADDQ.L   #4,SP
               RTS
SCREEN_ROW_COL_SET
               BSR      CALC_BUFFER_LOCATION
               BSR      CALC_HEX_LOCATION
               BSR      CALC_ASCII_LOCATION
               MOVE.B   HEX_ROW,CURSOR_SET_ROW
               MOVE.B   HEX_COL,CURSOR_SET_COL
               LEA      CURSOR_SET,A0
               BSR      WRITE_STRING
               BSR      TURN_CURSOR_ON
               BSR      KEYBOARD_READ
               BRA      SCREEN_ROW_COL_SET
KEYBOARD_READ  MOVE.W   #$FF,-(SP)
               MOVE.W   #RAWCONIO,-(SP)
               TRAP     #GEMDOS
               ADDQ.L   #4,SP
               TST.L    D0
               BEQ      KEYBOARD_READ_1
               CMP.B    #$5C,SCAN_CODE
               BEQ      KEYBOARD_READ_2
               CMP.B    #$5D,SCAN_CODE
               BEQ      KEYBOARD_READ_2
               BRA      KEYBOARD_READ
KEYBOARD_READ_1
               MOVE.W   #CONIN_WO_ECHO,-(SP)
               TRAP     #GEMDOS
               ADDQ.L   #2,SP
               MOVE.B   D0,CHAR_CODE
               SWAP     D0
               MOVE.B   D0,SCAN_CODE
KEYBOARD_READ_2
               BSR      TURN_CURSOR_OFF
               CMP.B    #0,MSG_ERROR_FLAG
               BEQ      CHECK_SPECIAL_KEY
               MOVE.B   #0,MSG_ERROR_FLAG
               LEA      MSG_STATUS_OK,A0
               BSR      WRITE_STRING
               MOVE.B   HEX_ROW,CURSOR_SET_ROW
               MOVE.B   HEX_COL,CURSOR_SET_COL
               LEA      CURSOR_SET,A0
               BSR      WRITE_STRING
CHECK_SPECIAL_KEY
               MOVE.B   SCAN_CODE,D0
               CMP.B    #$3B,D0
               BEQ      SECTOR_GET
               CMP.B    #$55,D0
               BEQ      SECTOR_PUT
               CMP.B    #$3D,D0
               BEQ      SECTOR_PRINT
               CMP.B    #$3E,D0
               BEQ      EDIT_SECTOR_EXIT
               CMP.B    #$3F,D0
               BEQ      FIND_STRING
               CMP.B    #$40,D0
               BEQ      FIND_NEXT
               CMP.B    #$41,D0
               BEQ      NEXT_DRIVE
               CMP.B    #$42,D0
               BEQ      NEXT_PAGE
               CMP.B    #$43,D0
               BEQ      NEXT_SECTOR
               CMP.B    #$44,D0
               BEQ      NEXT_TRACK
               CMP.B    #$5C,D0
               BEQ      PREV_SECTOR
               CMP.B    #$5D,D0
               BEQ      PREV_TRACK
               CMP.B    #$48,D0
               BEQ      MOVE_CURSOR_UP
               CMP.B    #$50,D0
               BEQ      MOVE_CURSOR_DOWN
               CMP.B    #$4B,D0
               BEQ      MOVE_CURSOR_LEFT
               CMP.B    #$4D,D0
               BEQ      MOVE_CURSOR_RIGHT
               CMP.B    #$1C,D0
               BEQ      MOVE_CURSOR_RETURN
               MOVE.B   CHAR_CODE,D0
CHECK_NORMAL_KEY
               CMP.B    #'0',D0
               BLT      RING_BELL
               CMP.B    #$3A,D0
               BLT      CHECK_NORMAL_1
               CMP.B    #'A',D0
               BLT      RING_BELL
               CMP.B    #'F',D0
               BGT      RING_BELL
               SUB.B    #7,D0
CHECK_NORMAL_1 SUB.B    #$30,D0
               LEA      BUFFER,A1
               ADD.W    BUFFER_OFFSET,A1
               MOVE.B   (A1),D1
               CMP.B    #0,LEFT_RIGHT_FLAG
               BNE      CHECK_NORMAL_2
               AND.B    #$0F,D1
               ASL      #4,D0
               AND.B    #$F0,D0
               BRA      CHECK_NORMAL_3
CHECK_NORMAL_2 AND.B    #$F0,D1
               AND.B    #$0F,D0
CHECK_NORMAL_3 OR.B     D0,D1
               MOVE.B   D1,(A1)
               MOVE.B   CHAR_CODE,D0
               BSR      WRITE_CHARACTER
               MOVE.B   ASCII_ROW,CURSOR_SET_ROW
               MOVE.B   ASCII_COL,CURSOR_SET_COL
               LEA      CURSOR_SET,A0
               BSR      WRITE_STRING
               MOVE.B   #'.',D0
               CMP.B    #32,D1
               BLT      CHECK_NORMAL_4
               CMP.B    #127,D1
               BGT      CHECK_NORMAL_4
               MOVE.B   D1,D0
CHECK_NORMAL_4 BSR      WRITE_CHARACTER
               BRA      MOVE_CURSOR_RIGHT
RING_BELL      LEA      MSG_INVALID_CHAR,A0
               BSR      WRITE_STRING
               MOVE.B   #1,MSG_ERROR_FLAG
               RTS
BIN_TO_HEX_DIGIT
               AND.B    #$0F,D0
               CMP.B    #10,D0
               BLT      BIN_TO_HEX_DIGIT1
               ADD.B    #7,D0
BIN_TO_HEX_DIGIT1
               ADD.B    #48,D0
               RTS
TURN_CURSOR_ON MOVE.W   #20,-(SP)
               MOVE.W   #1,-(SP)
               MOVE.W   #CURSCONF,-(SP)
               TRAP     #XBIOS
               ADDQ.L   #6,SP
               RTS
TURN_CURSOR_OFF
               MOVE.W   #20,-(SP)
               MOVE.W   #0,-(SP)
               MOVE.W   #CURSCONF,-(SP)
               TRAP     #XBIOS
               ADDQ.L   #6,SP
               RTS
TURN_CAPS_ON   MOVE.W   #16,-(SP)
               MOVE.W   #KBSHIFT,-(SP)
               TRAP     #BIOS
               ADDQ.L   #4,SP
               RTS
PRINT_OFFSET   MOVEM.L  D1-D3,-(SP)
               MOVE.B   #36,CURSOR_SET_ROW
               MOVE.B   #32,CURSOR_SET_COL
               LEA      CURSOR_SET,A0
               BSR      WRITE_STRING
               MOVE.W   PAGE_OFFSET,D2
               MOVE.W   #15,D3
PRINT_OFFSET1  MOVE.W   D2,D0
               MOVE.W   #3,D1
               LEA      SECTOR_PAGE_OFFSET,A0
               BSR      BIN_TO_HEX
               LEA      SECTOR_PAGE,A0
               BSR      WRITE_STRING
               ADD.W    #$10,D2
               DBRA     D3,PRINT_OFFSET1
               MOVEM.L  (SP)+,D1-D3
               RTS
MOVE_CURSOR_RIGHT
               CMP.B    #0,LEFT_RIGHT_FLAG
               BNE      MOVE_RIGHT_1
               MOVE.B   #1,LEFT_RIGHT_FLAG
               BRA      MOVE_RIGHT_2
MOVE_RIGHT_1   MOVE.B   #0,LEFT_RIGHT_FLAG
               ADD.W    #1,COL
               CMP.W    #16,COL
               BLT      MOVE_RIGHT_2
               MOVE.W   #0,COL
               BRA      MOVE_CURSOR_DOWN
MOVE_RIGHT_2   RTS
MOVE_CURSOR_LEFT
               CMP.B    #0,LEFT_RIGHT_FLAG
               BEQ      MOVE_LEFT_1
               MOVE.B   #0,LEFT_RIGHT_FLAG
               BRA      MOVE_LEFT_2
MOVE_LEFT_1    MOVE.B   #1,LEFT_RIGHT_FLAG
               SUB.W    #1,COL
               BPL      MOVE_LEFT_2
               MOVE.W   #15,COL
               BRA      MOVE_CURSOR_UP
MOVE_LEFT_2    RTS
MOVE_CURSOR_DOWN
               ADD.W    #1,ROW
               CMP.W    #16,ROW
               BLT      MOVE_DOWN_1
               MOVE.W   #0,ROW
MOVE_DOWN_1    RTS
MOVE_CURSOR_UP SUB.W    #1,ROW
               BPL      MOVE_UP_1
               MOVE.W   #15,ROW
MOVE_UP_1      RTS
MOVE_CURSOR_RETURN
               MOVE.W   #0,COL
               MOVE.B   #0,LEFT_RIGHT_FLAG
               BRA      MOVE_CURSOR_DOWN
MOVE_CURSOR_HOME
               MOVE.W   #0,COL
               MOVE.W   #0,ROW
               MOVE.B   #0,LEFT_RIGHT_FLAG
               RTS
CALC_BUFFER_LOCATION
               MOVEM.L  D0,-(SP)
               CLR.L    D0
               MOVE.W   ROW,D0
               MULU     #16,D0
               ADD.W    COL,D0
               ADD.W    PAGE_OFFSET,D0
               MOVE.W   D0,BUFFER_OFFSET
               MOVEM.L  (SP)+,D0
               RTS
CALC_HEX_LOCATION
               MOVEM.L  D0,-(SP)
               MOVE.W   ROW,D0
               ADD.W    #36,D0
               MOVE.B   D0,HEX_ROW
               CLR.L    D0
               MOVE.W   COL,D0
               MULU     #3,D0
               ADD.W    #42,D0
               ADD.B    LEFT_RIGHT_FLAG,D0
               MOVE.B   D0,HEX_COL
               MOVEM.L  (SP)+,D0
               RTS
CALC_ASCII_LOCATION
               MOVEM.L  D0,-(SP)
               MOVE.W   ROW,D0
               ADD.W    #36,D0
               MOVE.B   D0,ASCII_ROW
               MOVE.W   COL,D0
               ADD.W    #93,D0
               MOVE.B   D0,ASCII_COL
               MOVEM.L  (SP)+,D0
               RTS
SECTOR_GET     LEA      MSG_LOAD_SECTOR,A0
               BSR      WRITE_STRING
               MOVE.W   #0,SIDE
               MOVE.W   SECTOR,TEMP_SECTOR
               CMP.W    #10,SECTOR
               BLT      SECTOR_GET_1
               MOVE.W   #1,SIDE
               SUB.W    #9,TEMP_SECTOR
SECTOR_GET_1   MOVE.W   #1,-(SP)
               MOVE.W   SIDE,-(SP)
               MOVE.W   TRACK,-(SP)
               MOVE.W   TEMP_SECTOR,-(SP)
               MOVE.W   DRIVE,-(SP)
               MOVE.L   #0,-(SP)
               MOVE.L   #BUFFER,-(SP)
               MOVE.W   #FLOPRD,-(SP)
               TRAP     #XBIOS
               ADD.L    #20,SP
               TST.W    D0
               BMI      SECTOR_DISK_ERROR
               MOVE.W   #0,PAGE_OFFSET
               BSR      PRINT_OFFSET
               BSR      BUILD_DATA_SCREEN
               BSR      MOVE_CURSOR_HOME
               MOVE.B   #0,MSG_ERROR_FLAG
               LEA      MSG_STATUS_OK,A0
               BSR      WRITE_STRING
               RTS
SECTOR_PUT     LEA      MSG_SAVE_SECTOR,A0
               BSR      WRITE_STRING
               MOVE.W   #0,SIDE
               MOVE.W   SECTOR,TEMP_SECTOR
               CMP.W    #10,SECTOR
               BLT      SECTOR_PUT_1
               MOVE.W   #1,SIDE
               SUB.W    #9,TEMP_SECTOR
SECTOR_PUT_1   MOVE.W   #1,-(SP)
               MOVE.W   SIDE,-(SP)
               MOVE.W   TRACK,-(SP)
               MOVE.W   TEMP_SECTOR,-(SP)
               MOVE.W   DRIVE,-(SP)
               MOVE.L   #0,-(SP)
               MOVE.L   #BUFFER,-(SP)
               MOVE.W   #FLOPWR,-(SP)
               TRAP     #XBIOS
               ADD.L    #20,SP
               TST.W    D0
               BMI      SECTOR_DISK_ERROR
               MOVE.W   #0,PAGE_OFFSET
               BSR      PRINT_OFFSET
               BSR      BUILD_DATA_SCREEN
               BSR      MOVE_CURSOR_HOME
               MOVE.B   #0,MSG_ERROR_FLAG
               LEA      MSG_STATUS_OK,A0
               BSR      WRITE_STRING
               RTS
SECTOR_DISK_ERROR
               NEG.W    D0
               AND.W    #$1F,D0
               MOVE.W   #2,D1
               LEA      MSG_DISK_ERROR_NO,A0
               BSR      BIN_TO_DEC
               LEA      MSG_DISK_ERROR,A0
               BSR      WRITE_STRING
               MOVE.B   #1,MSG_ERROR_FLAG
               RTS
SECTOR_PRINT   LEA      MSG_PRINT,A0
               BSR      WRITE_STRING
               MOVE.B   DISPLAY_DRIVE_NO,HC_DRIVE
               LEA      DISPLAY_SECTOR_NO,A0
               LEA      HC_SECTOR,A1
               MOVE.B   (A0)+,(A1)+
               MOVE.B   (A0)+,(A1)+
               LEA      DISPLAY_TRACK_NO,A0
               LEA      HC_TRACK,A1
               MOVE.B   (A0)+,(A1)+
               MOVE.B   (A0)+,(A1)+
               LEA      HC_TITLE,A1
               BSR      WRITE_HC_STRING
               TST.W    D0
               BMI      SECTOR_PRINT_6
               CLR.W    D2
               LEA      BUFFER,A2
               MOVE.W   #31,D4
SECTOR_PRINT_1 MOVE.W   D2,D0
               MOVE.W   #3,D1
               LEA      HC_OFFSET,A0
               BSR      BIN_TO_HEX
               LEA      HC_HEX,A0
               LEA      HC_ASCII,A1
               MOVE.W   #15,D3
SECTOR_PRINT_2 MOVE.B   (A2),D0
               CMP.B    #$20,D0
               BLT      SECTOR_PRINT_3
               CMP.B    #$7F,D0
               BGT      SECTOR_PRINT_3
               BRA      SECTOR_PRINT_4
SECTOR_PRINT_3 MOVE.B   #'.',D0
SECTOR_PRINT_4 MOVE.B   D0,(A1)+
               MOVE.B   (A2)+,D0
               MOVE.B   D0,D1
               AND.B    #$F0,D0
               LSR.B    #4,D0
               BSR      BIN_TO_HEX_DIGIT
               MOVE.B   D0,(A0)+
               MOVE.B   D1,D0
               BSR      BIN_TO_HEX_DIGIT
               MOVE.B   D0,(A0)+
               MOVE.B   #' ',(A0)+
               DBRA     D3,SECTOR_PRINT_2
               LEA      HC_DATA_LINE,A1
               BSR      WRITE_HC_STRING
               TST.W    D0
               BMI      SECTOR_PRINT_6
               ADD.W    #16,D2
               CMP.W    #16,D4
               BNE      SECTOR_PRINT_5
               LEA      HC_CR,A1
               BSR      WRITE_HC_STRING
SECTOR_PRINT_5 DBRA     D4,SECTOR_PRINT_1
               LEA      HC_FF,A1
               BSR      WRITE_HC_STRING
               LEA      MSG_STATUS_OK,A0
               BSR      WRITE_STRING
               MOVE.B   #0,MSG_ERROR_FLAG
               BRA      SECTOR_PRINT_7
SECTOR_PRINT_6 LEA      MSG_PRINT_ERROR,A0
               BSR      WRITE_STRING
               MOVE.B   #1,MSG_ERROR_FLAG
SECTOR_PRINT_7 RTS
WRITE_HC_STRING
               CLR.W    D0
               MOVE.B   (A1)+,D0
               TST.W    D0
               BEQ      WRITE_HC_STRING_1
               MOVE.W   D0,-(SP)
               MOVE.W   #PRINTEROUT,-(SP)
               TRAP     #GEMDOS
               ADDQ.L   #4,SP
               TST.W    D0
               BMI      WRITE_HC_STRING
               MOVE.W   #-1,D0
WRITE_HC_STRING_1
               RTS
SECTOR_SEARCH  MOVE.W   BUFFER_OFFSET,D4
               CLR.W    D3
               MOVE.B   SEARCH_KEY_LEN,D3
               SUB.W    #1,D3
               LEA      MSG_SEARCHING,A0
               BSR      WRITE_STRING
SECTOR_SEARCH_1
               MOVE.W   #0,SIDE
               MOVE.W   SECTOR,TEMP_SECTOR
               CMP.W    #10,SECTOR
               BLT      SECTOR_SEARCH_1A
               MOVE.W   #1,SIDE
               SUB.W    #9,TEMP_SECTOR
SECTOR_SEARCH_1A
               MOVE.W   #1,-(SP)
               MOVE.W   SIDE,-(SP)
               MOVE.W   TRACK,-(SP)
               MOVE.W   TEMP_SECTOR,-(SP)
               MOVE.W   DRIVE,-(SP)
               MOVE.L   #0,-(SP)
               MOVE.L   #BUFFER,-(SP)
               MOVE.W   #FLOPRD,-(SP)
               TRAP     #XBIOS
               ADD.L    #20,SP
               TST.W    D0
               BMI      SECTOR_DISK_ERROR
SECTOR_SEARCH_2
               MOVE.W   D4,D0
               ADD.W    D3,D0
               CMP.W    #510,D0
               BGT      SECTOR_SEARCH_5
               LEA      BUFFER,A0
               ADD.W    D4,A0
               LEA      SEARCH_KEY,A1
               MOVE.W   D3,D0
SECTOR_SEARCH_3
               CMP.B    (A0)+,(A1)+
               BNE      SECTOR_SEARCH_4
               DBRA     D0,SECTOR_SEARCH_3
               MOVE.W   D4,D0
               AND.W    #$0100,D0
               MOVE.W   D0,PAGE_OFFSET
               MOVE.W   D4,D0
               LSR.B    #4,D0
               AND.W    #$0F,D0
               MOVE.W   D0,ROW
               MOVE.W   D4,D0
               AND.W    #$0F,D0
               MOVE.W   D0,COL
               MOVE.B   #0,LEFT_RIGHT_FLAG
               BSR      PRINT_OFFSET
               BSR      BUILD_DATA_SCREEN
               MOVE.B   #1,MSG_ERROR_FLAG
               LEA      MSG_FOUND,A0
               BSR      WRITE_STRING
               BRA      SECTOR_SEARCH_9
SECTOR_SEARCH_4
               ADDQ.W   #1,D4
               BRA      SECTOR_SEARCH_2
SECTOR_SEARCH_5
               MOVE.W   #0,D4
               MOVE.W   #CONSTAT,-(SP)
               TRAP     #GEMDOS
               ADD.L    #2,SP
               TST.W    D0
               BEQ      SECTOR_SEARCH_6
               BSR      RESTORE_KEYS
               BSR      PRINT_TRACK
               BSR      PRINT_SECTOR
               LEA      MSG_FIND_ABORT,A0
               BSR      WRITE_STRING
               MOVE.B   #1,MSG_ERROR_FLAG
               BRA      SECTOR_SEARCH_9
SECTOR_SEARCH_6
               ADDQ.W   #1,SECTOR
               MOVE.W   SECTOR,D0
               CMP.W    SECTOR_LIMIT,D0
               BGT      SECTOR_SEARCH_7
               BSR      PRINT_SECTOR
               BRA      SECTOR_SEARCH_1
SECTOR_SEARCH_7
               MOVE.W   #1,SECTOR
               BSR      PRINT_SECTOR
               ADDQ.W   #1,TRACK
               CMP.W    #80,TRACK
               BEQ      SECTOR_SEARCH_8
               BSR      PRINT_TRACK
               BRA      SECTOR_SEARCH_1
SECTOR_SEARCH_8
               BSR      RESTORE_KEYS
               BSR      PRINT_TRACK
               BSR      PRINT_SECTOR
               LEA      MSG_NOT_FOUND,A0
               BSR      WRITE_STRING
               MOVE.B   #1,MSG_ERROR_FLAG
SECTOR_SEARCH_9 RTS
FIND_STRING    LEA      MSG_FIND,A0
               BSR      WRITE_STRING
               BSR      TURN_CURSOR_ON
               MOVE.B   #70,KB_BUFFER
               LEA      KB_BUFFER,A0
               BSR      READ_STRING
               AND.W    #$FF,D0
               MOVE.B   D0,SEARCH_KEY_LEN
               TST.W    D0
               BEQ      FIND_STRING_ABORTED
               SUB.W    #1,D0
               LEA      KB_BUFFER_DATA,A0
               LEA      SEARCH_KEY,A1
               CMP.B    #'X',(A0)
               BNE      FIND_STRING_2
               TST.W    D0
               BEQ      FIND_STRING_1
               MOVE.W   D0,D1
               AND.W    #1,D1
               CMP.W    #1,D1
               BEQ      FIND_STRING_1
               BSR      CONVERT_TO_HEX
               TST.W    D0
               BEQ      FIND_STRING_3
FIND_STRING_1  MOVE.B   #0,SEARCH_KEY_LEN
               LEA      MSG_INVALID_HEX,A0
               BSR      WRITE_STRING
               MOVE.B   #1,MSG_ERROR_FLAG
               BRA      FIND_STRING_4
FIND_STRING_2  MOVE.B   (A0)+,(A1)+
               DBRA     D0,FIND_STRING_2
FIND_STRING_3  BSR      SAVE_KEYS
               BSR      TURN_CURSOR_OFF
               BRA      SECTOR_SEARCH
FIND_STRING_4  RTS
FIND_STRING_ABORTED
               LEA      MSG_FIND_ABORT,A0
               BSR      WRITE_STRING
               MOVE.B   #1,MSG_ERROR_FLAG
               RTS
FIND_NEXT      CMP.B    #0,SEARCH_KEY_LEN
               BEQ      FIND_STRING_ABORTED
               BSR      SAVE_KEYS
               ADD.W    #1,BUFFER_OFFSET
               CMP.W    #512,BUFFER_OFFSET
               BNE      SECTOR_SEARCH
               MOVE.W   #0,BUFFER_OFFSET
               ADD.W    #1,SECTOR
               MOVE.W   SECTOR,D0
               CMP.W    SECTOR_LIMIT,D0
               BGT      FIND_NEXT_1
               BSR      PRINT_SECTOR
               BRA      SECTOR_SEARCH
FIND_NEXT_1    MOVE.W   #1,SECTOR
               BSR      PRINT_SECTOR
               ADD.W    #1,TRACK
               CMP.W    #80,TRACK
               BEQ      FIND_NEXT_2
               BSR      PRINT_TRACK
               BRA      SECTOR_SEARCH
FIND_NEXT_2    MOVE.W   #0,TRACK
               BSR      PRINT_TRACK
               BRA      SECTOR_SEARCH
CONVERT_TO_HEX MOVE.W   D0,D2
               SUB.W    #1,D2
               MOVE.B   #0,SEARCH_KEY_LEN
               MOVE.B   (A0)+,D0
CONVERT_TO_HEX_1
               MOVE.B   (A0)+,D0
               BSR      HEX_TO_BIN
               TST.W    D0
               BMI      CONVERT_TO_HEX_2
               MOVE.B   D0,D1
               ASL.B    #4,D1
               MOVE.B   (A0)+,D0
               BSR      HEX_TO_BIN
               TST.W    D0
               BMI      CONVERT_TO_HEX_2
               ADD.B    D0,D1
               MOVE.B   D1,(A1)+
               ADD.B    #1,SEARCH_KEY_LEN
               SUB.W    #1,D2
               DBRA     D2,CONVERT_TO_HEX_1
               CLR.W    D0
CONVERT_TO_HEX_2
               RTS
HEX_TO_BIN     CMP.B    #'0',D0
               BLT      HEX_TO_BIN_3
               CMP.B    #'9',D0
               BGT      HEX_TO_BIN_1
               BRA      HEX_TO_BIN_2
HEX_TO_BIN_1   CMP.B    #'A',D0
               BLT      HEX_TO_BIN_3
               CMP.B    #'F',D0
               BGT      HEX_TO_BIN_3
               SUB.B    #$37,D0
HEX_TO_BIN_2   AND.B    #$0F,D0
               BRA      HEX_TO_BIN_4
HEX_TO_BIN_3   MOVE.W   #-1,D0
HEX_TO_BIN_4   RTS
               
SAVE_KEYS      MOVE.W   PAGE_OFFSET,PAGE_OFFSET_SAVE
               MOVE.W   ROW,ROW_SAVE
               MOVE.W   COL,COL_SAVE
               MOVE.W   TRACK,TRACK_SAVE
               MOVE.W   SECTOR,SECTOR_SAVE
               RTS
RESTORE_KEYS   MOVE.W   PAGE_OFFSET_SAVE,PAGE_OFFSET
               MOVE.W   ROW_SAVE,ROW
               MOVE.W   COL_SAVE,COL
               MOVE.W   TRACK_SAVE,TRACK
               MOVE.W   SECTOR_SAVE,SECTOR
               RTS
GET_BOOT_SECTOR
               LEA      MSG_DRIVE,A0
               BSR      WRITE_STRING
               MOVE.W   #0,TRACK
               MOVE.W   #1,SECTOR
               BSR      PRINT_TRACK
               BSR      PRINT_SECTOR
               MOVE.W   #9,SECTOR_LIMIT
               MOVE.W   #1,-(SP)
               MOVE.W   #0,-(SP)
               MOVE.W   #0,-(SP)
               MOVE.W   #1,-(SP)
               MOVE.W   DRIVE,-(SP)
               MOVE.L   #0,-(SP)
               MOVE.L   #BOOT_BUFFER,-(SP)
               MOVE.W   #FLOPRD,-(SP)
               TRAP     #XBIOS
               ADD.L    #20,SP
               TST.W    D0
               BMI      GET_BOOT_SECTOR_1
               LEA      BOOT_BUFFER,A0
               CMP.B    #1,26(A0)
               BEQ      GET_BOOT_SECTOR_2
               MOVE.W   #18,SECTOR_LIMIT
               BRA      GET_BOOT_SECTOR_2
GET_BOOT_SECTOR_1
               BSR      SECTOR_DISK_ERROR
               BRA      GET_BOOT_SECTOR_3
GET_BOOT_SECTOR_2
               LEA      MSG_STATUS_OK,A0
               BSR      WRITE_STRING
               MOVE.B   #0,MSG_ERROR_FLAG
GET_BOOT_SECTOR_3
               RTS
NEXT_PAGE      CMP.W    #0,PAGE_OFFSET
               BEQ      NEXT_PAGE_1
               MOVE.W   #0,PAGE_OFFSET
               BRA      NEXT_PAGE_2
NEXT_PAGE_1    MOVE.W   #256,PAGE_OFFSET
NEXT_PAGE_2    BSR      PRINT_OFFSET
               BSR      BUILD_DATA_SCREEN
               BSR      MOVE_CURSOR_HOME
               RTS
NEXT_DRIVE     ADD.W    #1,DRIVE
               CMP.W    #2,DRIVE
               BNE      NEXT_DRIVE_1
               MOVE.W   #0,DRIVE
NEXT_DRIVE_1   BSR      PRINT_DRIVE
               BSR      GET_BOOT_SECTOR
               RTS
NEXT_SECTOR    ADD.W    #1,SECTOR
               MOVE.W   SECTOR,D0
               CMP.W    SECTOR_LIMIT,D0
               BGT      NEXT_SECTOR_1
               BRA      NEXT_SECTOR_2
NEXT_SECTOR_1  MOVE.W   #1,SECTOR
NEXT_SECTOR_2  BSR      PRINT_SECTOR
               RTS
PREV_SECTOR    SUB.W    #1,SECTOR
               CMP.W    #0,SECTOR
               BNE      PREV_SECTOR_1
               MOVE.W   #9,SECTOR
PREV_SECTOR_1  BSR      PRINT_SECTOR
               RTS
NEXT_TRACK     ADD.W    #1,TRACK
               CMP.W    #80,TRACK
               BLT      NEXT_TRACK_1
               MOVE.W   #0,TRACK
NEXT_TRACK_1   BSR      PRINT_TRACK
               RTS
PREV_TRACK     SUB.W    #1,TRACK
               BPL      PREV_TRACK_1
               MOVE.W   #79,TRACK
PREV_TRACK_1   BSR      PRINT_TRACK
               RTS
PRINT_TRACK    MOVEM.L  D1,-(SP)
               MOVE.W   TRACK,D0
               MOVE.W   #2,D1
               LEA      DISPLAY_TRACK_NO,A0
               BSR      BIN_TO_DEC
               LEA      DISPLAY_TRACK,A0
               BSR      WRITE_STRING
               MOVEM.L  (SP)+,D1
               RTS
PRINT_SECTOR   MOVEM.L  D1,-(SP)
               MOVE.W   SECTOR,D0
               MOVE.W   #2,D1
               LEA      DISPLAY_SECTOR_NO,A0
               BSR      BIN_TO_DEC
               LEA      DISPLAY_SECTOR,A0
               BSR      WRITE_STRING
               MOVEM.L  (SP)+,D1
               RTS
PRINT_DRIVE    MOVE.W   DRIVE,D0
               ADD.W    #'A',D0
               MOVE.B   D0,DISPLAY_DRIVE_NO
               LEA      DISPLAY_DRIVE,A0
               BSR      WRITE_STRING
               RTS
ZERO_BUFFER    MOVE.L   #127,D0
               LEA      BUFFER,A0
ZERO_BUFFER_LOOP
               MOVE.L   #0,(A0)+
               DBRA     D0,ZERO_BUFFER_LOOP
               RTS
BUILD_DATA_SCREEN
               MOVEM.L  D1-D3/A1-A3,-(SP)
               MOVE.W   #15,D2
               LEA      BUFFER,A1
               ADD.W    PAGE_OFFSET,A1
               MOVE.B   #36,DATA_LINE_ROW
               MOVE.B   #42,DATA_LINE_COL
BUILD_DS_1     MOVE.W   #15,D3
               LEA      DATA_LINE_HEX,A2
               LEA      DATA_LINE_ASCII,A3
BUILD_DS_2     MOVE.B   (A1),D0
               CMP.B    #$20,D0
               BLT      BUILD_DS_3
               CMP.B    #$7F,D0
               BGT      BUILD_DS_3
               BRA      BUILD_DS_4
BUILD_DS_3     MOVE.B   #'.',D0
BUILD_DS_4     MOVE.B   D0,(A3)+
               MOVE.B   (A1)+,D0
               MOVE.B   D0,D1
               AND.B    #$F0,D0
               LSR.B    #4,D0
               BSR      BIN_TO_HEX_DIGIT
               MOVE.B   D0,(A2)+
               MOVE.B   D1,D0
               BSR      BIN_TO_HEX_DIGIT
               MOVE.B   D0,(A2)+
               MOVE.B   #' ',(A2)+
               DBRA     D3,BUILD_DS_2
               LEA      DATA_LINE,A0
               BSR      WRITE_STRING
               ADD.B    #1,DATA_LINE_ROW
               DBRA     D2,BUILD_DS_1
               MOVEM.L  (SP)+,D1-D3/A1-A3
               RTS
BIN_TO_HEX     MOVEM.L  D0-D2/A0,-(SP)
               ADD.W    D1,A0
               SUB.W    #1,D1
               MOVE.L   D0,D2
BIN_TO_HEX1    MOVE.B   D2,D0
               BSR      BIN_TO_HEX_DIGIT
               MOVE.B   D0,-(A0)
               LSR.L    #4,D2
               DBRA     D1,BIN_TO_HEX1
               MOVEM.L  (SP)+,D0-D2/A0
               RTS
BIN_TO_DEC     MOVEM.L  D0-D1/A0,-(SP)
               ADD.W    D1,A0
               SUBQ.W   #1,D1
BIN_TO_DEC2    EXT.L    D0
               DIVS     #10,D0
               SWAP     D0
               MOVE.B   D0,-(A0)
               ADD.B    #'0',(A0)
               SWAP     D0
               DBRA     D1,BIN_TO_DEC2
               MOVEM.L  (SP)+,D0-D1/A0
               RTS
WRITE_STRING   MOVE.L   A0,-(SP)
               MOVE.W   #CONWS,-(SP)
               TRAP     #GEMDOS
               ADDQ.L   #6,SP
               RTS
READ_STRING    MOVE.L   A0,-(SP)
               MOVE.W   #CONRS,-(SP)
               TRAP     #GEMDOS
               ADDQ.L   #6,SP
               RTS
WRITE_CHARACTER
               MOVE.W   D0,-(SP)
               MOVE.W   #CONOUT,-(SP)
               TRAP     #GEMDOS
               ADDQ.L   #4,SP
               RTS
READ_CHARACTER MOVE.W   #CONIN,-(SP)
               TRAP     #GEMDOS
               ADDQ.L   #2,SP
               RTS

               DATA
SECTOR_SCREEN  DC.B  27,CLEAR_HOME
               DC.B  27,'p'
               DC.B  ' Doctor Flop E. Disk       Sector '
               DC.B  'Editor       '
               DC.B  'Drive A    Track 00    Sector 00 '
               DC.B  27,'q'
               DC.B  27,'Y',34,43
               DC.B  '0  1  2  3  4  5  6  7  '
               DC.B  '8  9  A  B  C  D  E  F    '
               DC.B  '0123456789ABCDEF'
               DC.B  27,'Y',53,40
               DC.B  'F1=Get      F3=Print   F5=Find '
               DC.B  '   F7=Drive   F9 =Sector'
               DC.B  27,'Y',54,40
               DC.B  'F2=Put      F4=Exit    F6=Next '
               DC.B  '   F8=Page    F10=Track'
               DC.B  0
SECTOR_PAGE    DC.B  '    '
SECTOR_PAGE_OFFSET
               DC.B  '000'
               DC.B  CR,LF
               DC.B  0
DATA_LINE      DC.B  27,'Y'
DATA_LINE_ROW  DC.B  36
DATA_LINE_COL  DC.B  42
DATA_LINE_HEX  DC.B  '00 00 00 00 00 00 00 00 '
               DC.B  '00 00 00 00 00 00 00 00   |'
DATA_LINE_ASCII
               DC.B  '................|'
               DC.B  0
CURSOR_SET     DC.B  27,'Y'
CURSOR_SET_ROW DC.B  32
CURSOR_SET_COL DC.B  32
               DC.B  0
MSG_STATUS_OK  DC.B  27,'Y',56,32
               DC.B  '> OK.'
               DC.B  27,'K'
               DC.B  0
MSG_INVALID_CHAR
               DC.B  27,'Y',56,32
               DC.B  '> Invalid character.'
               DC.B  27,'K'
               DC.B  BEL
               DC.B  0
MSG_DISK_ERROR DC.B  27,'Y',56,32
               DC.B  '> Disk error #'
MSG_DISK_ERROR_NO
               DC.B  '00 has occurred.'
               DC.B  27,'K'
               DC.B  0
MSG_PRINT_ERROR
               DC.B  27,'Y',56,32
               DC.B  '> Printer is not responding.'
               DC.B  27,'K'
               DC.B  0
MSG_PRINT      DC.B  27,'Y',56,32
               DC.B  '> Printing.  '
               DC.B  27,'K'
               DC.B  0
MSG_LOAD_SECTOR
               DC.B  27,'Y',56,32
               DC.B  '> Reading sector.  '
               DC.B  27,'K'
               DC.B  0
MSG_SAVE_SECTOR
               DC.B  27,'Y',56,32
               DC.B  '> Writing sector.  '
               DC.B  27,'K'
               DC.B  0
MSG_FIND       DC.B  27,'Y',56,32
               DC.B  '> Find:  '
               DC.B  27,'K'
               DC.B  0
MSG_FIND_ABORT DC.B  27,'Y',56,32
               DC.B  '> Find was aborted.'
               DC.B  27,'K'
               DC.B  0
              
MSG_SEARCHING  DC.B  27,'Y',56,32
               DC.B  '> Searching.  '
               DC.B  27,'K'
               DC.B  0
MSG_FOUND      DC.B  27,'Y',56,32
               DC.B  '> String was found.'
               DC.B  27,'K'
               DC.B  0
MSG_NOT_FOUND  DC.B  27,'Y',56,32
               DC.B  '> End of disk reached.'
               DC.B  27,'K'
               DC.B  0
MSG_INVALID_HEX
               DC.B  27,'Y',56,32
               DC.B  '> Invalid hex string.'
               DC.B  27,'K'
               DC.B  0
MSG_DRIVE      DC.B  27,'Y',56,32
               DC.B  '> Setting drive.'
               DC.B  27,'K'
               DC.B  0
DISPLAY_TRACK  DC.B  27,'Y',32,96
               DC.B  27,'p'
DISPLAY_TRACK_NO
               DC.B  '00'
               DC.B  27,'q'
               DC.B  0
DISPLAY_SECTOR DC.B  27,'Y',32,109
               DC.B  27,'p'
DISPLAY_SECTOR_NO
               DC.B  '01'
               DC.B  27,'q'
               DC.B  0
DISPLAY_DRIVE  DC.B  27,'Y',32,85
               DC.B  27,'p'
DISPLAY_DRIVE_NO
               DC.B  'A'
               DC.B  27,'q'
               DC.B  0
HC_TITLE       DC.B  CR,LF,LF
               DC.B  ' Doctor Flop E. Disk       Sector '
               DC.B  'Editor       '
               DC.B  'Drive '
HC_DRIVE       DC.B  'A'
               DC.B  '    Track '
HC_TRACK       DC.B  '00'
               DC.B  '    Sector '
HC_SECTOR      DC.B  '00'
               DC.B  CR,LF,LF,LF,LF
               DC.B  '           0  1  2  3  4  5  6  7  '
               DC.B  '8  9  A  B  C  D  E  F    '
               DC.B  '0123456789ABCDEF'
               DC.B  CR,LF,LF,LF
               DC.B  0
HC_DATA_LINE   DC.B  '    '
HC_OFFSET      DC.B  '000'
               DC.B  '   '
HC_HEX         DC.B  '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'
               DC.B  '   |'
HC_ASCII       DC.B  '................|'
               DC.B  CR,LF
               DC.B  0
HC_CR          DC.B  CR,LF,0
HC_FF          DC.B  12,0
CHAR_CODE      DS.B  1
SCAN_CODE      DS.B  1
LEFT_RIGHT_FLAG
               DS.B  1
MSG_ERROR_FLAG DS.B  1
HEX_ROW        DS.B  1
HEX_COL        DS.B  1
ASCII_ROW      DS.B  1
ASCII_COL      DS.B  1
COL_SAVE       DS.W  1
ROW_SAVE       DS.W  1
TRACK_SAVE     DS.W  1
SECTOR_SAVE    DS.W  1
PAGE_OFFSET_SAVE
               DS.W  1
COL            DS.W  1
ROW            DS.W  1
DRIVE          DS.W  1
SIDE           DS.W  1
TRACK          DS.W  1
SECTOR         DS.W  1
SECTOR_LIMIT   DS.W  1
TEMP_SECTOR    DS.W  1
SEARCH_OFFSET  DS.W  1
TEMP_OFFSET    DS.W  1
PAGE_OFFSET    DS.W  1
BUFFER_OFFSET  DS.W  1
KB_BUFFER      DS.B  1
KB_BUFFER_LEN  DS.B  1
KB_BUFFER_DATA DS.B  80
SEARCH_KEY_LEN DS.B  1
SEARCH_KEY     DS.B  80
BOOT_BUFFER    DS.W  512
BUFFER         DS.W  512
               END

