;TITLE   AZMON   Andys ZMON
;
; Special version for REMEMOTECH or REMEMOrizer
; Modified Feb 2013, A.Key
;
; Attempts autoboot from B:18, .. B:1F, in that order.
;
; Doesn`t bother with foreign keyboards
; kills the CTC to ensure that when disc routines EI, they
; do not leave AZMON wide open to interrupts from basic
; only perform drive head wiggle if an FDX
; Modified for MTXplus+ MA 2015

org &2100
offset &e100
.top_of_ram
DB 25
.setup
LD   SP,top_of_ram
LD   A,&80
OUT  (&00),A                ;swap to RAM mode
.setup2
LD   A,&C3
LD   (&0000),A              ;poke a JP instruction into location 0
LD   HL,reboot
LD   (&0001),HL             ;followed by the re-boot address

;signon
LD   HL,msg0
CALL print_0
LD   HL,serno
LD   B,&06
.serlp
LD   A,(HL)
INC  HL
CALL print_c
dec b
jp nz serlp   

LD   A,+ASC"-"
CALL print_c
LD   A,+ASC"V"
CALL print_c
LD   A,(version)
CALL opbtc
LD   HL,MsgMT
CALL print_0
.mem_test
LD   HL,mem_test
.mtl2
LD   A,(HL)
CPL
LD   (HL),A
CP   (HL)
Jp   NZ,MUMone
CPL
LD   (HL),A
CP   (HL)
Jp   NZ,MUMone
DEC  HL
LD   A,L
AND  H
INC  A
Jp   NZ,mtl2
LD   HL,msg1
CALL print_0
CALL csts                    ;is there a char pressed
Jp   Z,autob                 ;no - so boot
CALL cio                     ;what is it
Jp   NZ,autob                ;not a <CR> so boot

.reboot
LD   SP,top_of_ram
LD   HL,msg3
CALL print_0
CALL cio
CP   +ASC"B"
JP   Z,boot

CP   +ASC"D"
JP   Z,dial01

CP   +ASC"G"
JP   Z,goto0

CP   +ASC"S"
JP   Z,subs0

CP   +ASC"R"
JP   Z,zread0
.MUMone
LD   A,&07
CALL print_c
Jp   reboot

.msg0
DB   &18,&17
DS   "MTX Bootstrap Prom #"
DB   &00

.MsgMT
DB   &16,&0D,&0A,&0A
DS   "Ram Test - "
DB   &00

.msg1
DS   "OK"
DB   &0A,&07,&00

.msg2
DB   &0d,&0A
DS   "Boot "
DB    &00

.msg3
DB   &0D,&0A
DS   ">"
DB   &00

.msg4
DB 8,8,8,8,0

.msg11
DB   &18,&17
DS   "Please Insert System Disc"
DB   &16,&0D,&0a,&00
    ;Z if JP &0140 was found

.autob  
LD   HL,msg2
CALL print_0
; look on all partitions of the CF Card
.AUTOB1
LD      BC,&0018        ;0*100H+18H   ;B:18
CALL    AUTOB2
LD      BC,&0019        ;0*100H+19H   ;B:19
CALL    AUTOB2
LD      BC,&001A        ;0*100H+1AH   ;B:1A
CALL    AUTOB2
LD      BC,&001B        ;0*100H+1BH   ;B:1B
CALL    AUTOB2
LD      BC,&001C        ;0*100H+1CH   ;B:1C
CALL    AUTOB2
LD      BC,&001D        ;0*100H+1DH   ;B:1D
CALL    AUTOB2
LD      BC,&001E        ;0*100H+1EH   ;B:1E
CALL    AUTOB2
LD      BC,&001F        ;0*100H+1FH   ;B:1F
CALL    AUTOB2
JP      AUTOB1


;Attempt to boot from drive B of config type C
;This subroutine does not return if boot is successful
.AUTOB2
PUSH    BC
CALL    CSTS            ;is there a char pressed
JR      Z,AUTOB4        ;no - so boot
CALL    CIO             ;what is it
JP      Z,MUMONE        ;is a <CR> so abort
.AUTOB4
POP     BC
LD      A,C
LD      (CPMcfgbyt),A       ;set up drive type
LD      A,B
LD      (CPMdrvrq),A       ;set up drive number B=0,C=1,..
PUSH    AF
CALL    do_initialise   ;call initialise disk routines via high entry point
CALL    do_configure    ;configure the drive
                        ;ignore return code, always able to configure
POP     AF
ADD     A,+ASC"B"
CALL    CO              ;"D"
LD      A,(CPMcfgbyt)
CALL    OPBTC           ;"13"
LD      A,32
CALL    CO
CALL    SETUPD
CALL    do_read_sec
AND     A               ;Z=>successful
Jp      Z,BOOTM2
LD      HL,MSG4         ;failed, so backspace
jp      print_0



.boot
CALL cio
Jp   Z,autob
CP   +ASC"B"
JP   C,MUMone
CP   +ASC"J"    ; one more than "I"
JP   NC,MUMone
sub  +ASC"B"
LD   (CPMdrvrq),A
CALL GEThex
LD   A,L
LD   (frigC+1),A  ; poke into code ahead
.bdflt
CALL CR_LF
CALL  do_initialise
.frigC
LD   A,&18
LD   (CPMcfgbyt),A
LD A,(CPMdrvrq)
CALL do_configure
OR   A
JP   NZ,MUMone
call setupd
LD   C,&01
.bootl
CALL do_read_sec
AND  A
JR   Z,bootm
LD   HL,msg11
DEC  C
CALL Z,print_0
LD   C,&64
JR   bootl

.BOOTM2
CALL    CR_LF
.bootm
LD   SP,&0200
JP   &0100          ;cold start loader

.SETUPD
LD      A,(serno+1)
CP      +ASC"F"                 ; F from the @FDX version number
JR      NZ,NOT3
LD      A,(CPMcfgbyt)               ; frigged around for lousy QUME drives
CP      3
JR      NZ,NOT3
LD      HL,20
LD      (CPMTRKRQ),HL
CALL    RWGO                    ; in FDX DISC.MAC module
.NOT3
LD      HL,0
LD      (CPMTRKRQ),HL
INC     HL
LD      (CPMSECRQ),HL
LD      HL,&100         ;TPA start
LD      (CPMDMARQ),HL
RET


.CR_LF
LD   A,&0D
CALL print_c
LD   A,&0A

.co
.print_C
PUSH BC
LD   C,A
PUSH AF
CALL do_vdu_output
POP  AF
POP  BC
RET

.dial01
CALL cio
JP   NZ,MUMone
CALL CR_LF
.dialog
CALL csts
Jp   NZ,ctp 
CALL Rstatus
JP   NZ,RTC
Jp   dialog 

.ctp
CALL do_kbd_input
AND  &7F
CP   &11
JP   Z,reboot
CALL p0
Jp   dialog  

.RTC
CALL SIO2in
CALL print_c
Jp   dialog 

.zread0
CALL cio
JP   NZ,MUMone
CALL CR_LF
.zread1
CALL pri
CP   +ASC":"
Jp   NZ,zread1 
LD   D,&00
CALL byte
OR   A
Jp   Z,EOFm
LD   E,A
LD   A,+ASC"."
CALL print_c
CALL byte
LD   H,A
CALL byte
LD   L,A
CALL byte
.zread2
CALL byte
LD   (HL),A
INC  HL
DEC  E
Jp   NZ,zread2
CALL byte
Jp   Z,zread1
JP   MUMone

.EOFm
CALL byte
LD   H,A
CALL byte
LD   L,A
CALL byte
CALL byte
JP   NZ,MUMone
CALL CR_LF
JP   (HL)

.byte
PUSH DE
.byte1
CALL pri
CALL CHKhex
JP   NZ,byte1
LD   A,E
RLCA
RLCA
RLCA
RLCA
PUSH AF
.byte2
CALL pri
CALL CHKhex
JP   NZ,byte2 
POP  AF
ADD  A,E
LD   B,A
POP  DE
ADD  A,D
LD   D,A
LD   A,B
RET

.subs0
CALL GEThex
CALL CR_LF
CALL zdispl
LD   C,&0F
.subs1
CALL ci
CALL CHKhex
JP   Z,dpst 
CP   &20
JP   Z,nnbl
CP   &0A
JP   Z,nblk
CP   &0D
PUSH AF
CALL Z,CR_LF
POP  AF
JP   Z,reboot
JP   subs1

.zdispl
PUSH HL
PUSH BC
LD   A,L
LD   C,L
AND  &F0
LD   L,A
CALL CR_LF
LD   A,H
CALL opbtc
LD   A,L
CALL opbtc
LD   A,+ASC":"
CALL print_c
LD   B,&10
.zdisp1
LD   A,&20
CALL print_c
LD   A,(HL)
CALL opbtc
INC  HL
DEC  B
JP   NZ,zdisp1 
LD   A,C
AND  &0F
LD   A,&0D
CALL print_c
LD   A,C
AND  &0F
LD   C,A
ADD  A,C
ADD  A,C
ADD  A,&06
LD   B,A
LD   A,(top_of_ram)
.chxn
CALL print_c
dec b
jp nz chxn
POP  BC
POP  HL
RET

.advnc
LD   A,C
CPL
LD   C,A
CP   &0F
RET  NZ
INC  HL
LD   A,L
AND  &0F
JP   Z,zdispl
LD   A,(top_of_ram)
CALL print_c
RET

.dpst
LD   A,C
CP   &F0
JP   Z,dpst1
LD   A,E
RLCA
RLCA
RLCA
RLCA
LD   E,A
.dpst1
LD   A,(HL)
AND  C
OR   E
LD   (HL),A
CP   (HL)
JP   NZ,subs1
LD   A,B
CALL print_c
CALL advnc
JP   subs1

.NNBL
LD   A,(top_of_ram)
CALL print_c
CALL advnc
JP   subs1

.NBLK
LD   C,&0F
LD   A,L
OR   &0F
LD   L,A
INC  HL
CALL zdispl
JP   subs1

.goto0
CALL GEThex
CALL CR_LF
JP   (HL)

.gethex
LD   HL,&0000
LD   E,H
.gethex1
LD   D,&00
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
ADD  HL,DE
CALL cio
CALL CHKhex
Jp   Z,gethex1 
CP   &0D
JP   NZ,MUMone
RET

.opstc
.print_0
LD   A,(HL)
OR   A
RET  Z
CALL print_c
INC  HL
Jp  print_0 

.opbtc
PUSH BC
CALL hxaj
LD   A,B
CALL print_c
LD   A,C
CALL print_c
POP  BC
RET

.hxaj
PUSH AF
PUSH AF
AND  &F0
RRCA
RRCA
RRCA
RRCA
ADD  A,&30
CP   &3A
Jp   C,hxaj0
ADD  A,&07
.hxaj0
LD   B,A
POP  AF
AND  &0F
ADD  A,&30
CP   &3A
Jp   C,hxaj1
ADD  A,&07
.hxaj1
LD   C,A
POP  AF
RET

.CHKhex
CP   +ASC"0"
Jp   C,sit

CP   &3A          ; "9" +1
Jp   NC,hext

LD   B,A
SUB  +ASC"0"
.chhx1
LD   E,A
LD   A,B
CP   A
RET               ;A=ASCII/B=ASCII/E=BINARY

.HEXT
CP   +ASC"A"
Jp   C,sit

CP   +ASC"G"       ; "F"+1
Jp   NC,sit

LD   B,A
SUB  &37
Jp   chhx1 

.sit
CP   +ASC"0"
RET

.ci
CALL do_kbd_input
AND  &7F
PUSH BC
LD   B,A
AND  &40
LD   A,B
POP  BC
RET  Z
AND  &DF
RET

.cio
CALL ci
CALL print_c
CP   &0D
RET

.pri
CALL Rstatus
JP   NZ,SIO2in
CALL csts
Jp   Z,pri 
Jp   ci

.p0
PUSH BC
LD   C,A
CALL SIO2out
POP  BC
RET

.SIO2in
IN   A,(&0F)
AND  &01
Jp   z,SIO2in
IN   A,(&0D)
RET

.SIO2out
IN   A,(&0F)
AND  &04
Jp   Z,SIO2out
LD   A,C
OUT  (&0D),A
RET

.Rstatus
IN   A,(&0F)
AND  &01
RET



END
