CON
_CLKMODE     = XTAL1 + PLL16X
_XINFREQ     = 5_000_000


'Signaldefinitionen
'signaldefinition regnatix
#0,     D0,D1,D2,D3,D4,D5,D6,D7                         'datenbus
#8,     A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10               'adressbus
#19,    REG_RAM1,REG_RAM2                               'selektionssignale rambank 1 und 2
#21,    REG_PROP1,REG_PROP2                             'selektionssignale für administra und bellatrix
#23,    REG_AL                                          'strobesignal für adresslatch
#24,    REG_PROP3                                       'Venatrix-Chipselect Signal
        BUSCLK                                          'bustakt
        BUS_WR                                          '/wr - schreibsignal
        BUS_HS '                                        '/hs - quittungssignal
DIR_RAM   = $10000 '....$5FFF
caseBit     = !32

CON 'Sonstiges
'CNT_HBEAT       = 5_000_0000                            'blinkgeschw. front-led
DB_IN           = %00000111_11111111_11111111_00000000  'maske: dbus-eingabe
DB_OUT          = %00000111_11111111_11111111_11111111  'maske: dbus-ausgabe


var
  long dirmarker
  long snafiles
  byte block
  byte buff[3]
  byte name[13]

obj
    ios         :"reg-ios-spec"
    gc          :"glob-con"

dat

    SYSTEM byte "SPECCY",0
    ROM    byte "SPECTRUM.ROM",0
    snaext byte "SNA",0

PUB start(pins) : okay | c,a,b

        ios.start
        block:=0
        dirmarker:= get_dirmarker                                                   'usermarker von administra holen
        ios.admreset
        waitcnt(clkfreq+cnt)
        activate_dirmarker(dirmarker)
        ios.belload(string("SPECCY.BEL"))
        ios.ram_fill(0,$8000,0)
        waitcnt(clkfreq+cnt)
        cmd_dir                                                                       'Dateiliste einlesen

        repeat
             c:=ios.bus_getchar2
             if c
                case c
                     1:speccy_rom_put
                     6:ios.bus_putlong2(snafiles)
                     7:send_sna_names
                     8:read_sna_screen
                     9:read_sna_file

PRI Speccy_rom_put|i,a,b,stradr
    'stradr:=ios.bus_getstr2
    i:=ios.sdopen("R",@rom)
    ios.bus_putchar2(i)
    ios.sdxgetblk(0,$4000)
    ios.sdclose
    a:=0
    b:=0
    repeat 16
           repeat while ios.bus_getchar2<>88                                      'block senden, macht sich besser zur synchronisation
           repeat $400
                a:=ios.ram_rdbyte(b++)
                ios.bus_putchar2(a)
    'ios.sdclose

pri read_sna_file|stradr,a,i,adr,ln
    stradr:=ios.bus_getstr2
    ios.sdopen("R",stradr)
    'ln:=ios.sdfattrib(0)
    'ios.sdxgetblk(0,ln)
    'ios.sdclose
    adr:=0
    repeat 48'i from 0 to $5f
         repeat while ios.bus_getchar2<>88                                      'block senden, macht sich besser zur synchronisation
         repeat $400
                   a:=ios.sdgetc'ios.ram_rdbyte(adr++)
                   ios.bus_putchar2(a)
    repeat while ios.bus_getchar2<>88                                           'block senden, macht sich besser zur synchronisation
    repeat 27
         a:=ios.sdgetc'ios.ram_rdbyte(adr++)
         ios.bus_putchar2(a)
    ios.sdclose
pri read_sna_screen|stradr,a,i,adr
    stradr:=ios.bus_getstr2
    ios.sdopen("R",stradr)
    ios.sdxgetblk(0,$1C00)
    ios.sdclose
    adr:=0
    repeat i from $0 to $0D
         repeat while ios.bus_getchar2<>88                                      'block senden, macht sich besser zur synchronisation
         repeat $200
                a:=ios.ram_rdbyte(adr++)
                ios.bus_putchar2(a)

pri send_sna_names|i,stradr
    repeat i from 1 to snafiles
           readram(i)

pri readram(nummer)|position,adress,c,i
    i:=0
    position:=(nummer-1)*16
    adress:=DIR_RAM+position
    bytefill(@name,13,0)
    repeat
            c:=ios.ram_rdbyte(adress++)
            if c==0
               quit
            name[i++]:=c

    name[i]:=0
    ios.bus_putstr2(@name)

PRI cmd_dir|stradr,n,d,c',sh                                                'cmd: verzeichnis anzeigen
{{sddir - anzeige verzeichnis}}
  n:=0
  d:=0
  snafiles:=0
  ios.sdmount
  activate_dirmarker(dirmarker)
  ios.sddir                                                                 'kommando: verzeichnis öffnen
  ios.ram_fill(DIR_RAM,$1BFF,0)                                             'Variablen,Dir-Speicher,löschen

  repeat  'while stradr<> 0                                                 'Begrenzung der Einträge auf die mit DIR_ENTRY vereinbarte
      stradr:=ios.sdnext
      if stradr <> 0
         if ios.sdfattrib(17)                                               'unsichtbare Dateien ausblenden
            next
         scanstr(stradr,1)
         if strcomp(@buff,string("SNA"))
            snafiles++
            WriteNameToRam(stradr,snafiles)                                 'Dateiname zur spaeteren Verwendung in ERam speichern an adresse n
      else
         quit
  ios.sdclose

PRI WriteNameToRam(st,nummer)|adress,position,c             'Dateiliste in ERam schreiben
    position:=(nummer-1)*16
    adress:=DIR_RAM+position
    repeat strsize(st)
            c:=byte[st++]
            ios.ram_wrbyte(c,adress++)
    ios.ram_wrbyte(0,adress++)

PRI scanstr(f,mode) | z ,c                                                                                    'Dateiendung extrahieren
   if mode==1
      repeat while strsize(f)
             if c:=byte[f++] == "."                                                                           'bis punkt springen
                quit

   z:=0
   repeat 3                                                                                                   'dateiendung lesen
        c:=byte[f++]
        buff[z++] := c & caseBit
   buff[z++] := 0

   return @buff

PRI activate_dirmarker(mark)                                                    'USER-Marker setzen

     ios.sddmput(ios#DM_USER,mark)                                              'usermarker wieder in administra setzen
     ios.sddmact(ios#DM_USER)                                                   'u-marker aktivieren

PRI get_dirmarker:dm                                                            'USER-Marker lesen

    ios.sddmset(ios#DM_USER)
    dm:=ios.sddmget(ios#DM_USER)
