-
Notifications
You must be signed in to change notification settings - Fork 0
/
flashjacks.asm
1997 lines (1665 loc) · 47.4 KB
/
flashjacks.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
; Device-based driver for the FLASHJACKS SD interface for Nextor
;
; By Aquijacks v2.2 2023
; Based on version 0.1 by Konamiman and 0.15 by Piter Punk
output "FlashJacks_driver.bin"
org $4000
ds 256, $FF ; 256 dummy bytes
DRV_START:
TESTADD equ 0F3F5h
;-----------------------------------------------------------------------------
;
; Driver configuration constants
;
DEBUG equ 0 ;Set to 1 for debugging, 0 to normal operation
;Driver version
VER_MAIN equ 2
VER_SEC equ 2
VER_REV equ 0
;This is a very barebones driver. It has important limitations:
;- CHS mode not supported, disks must support LBA mode.
;- 48 bit addresses are not supported
; (do the Sunrise IDE hardware support them anyway?)
;- ATAPI devices not supported, only ATA disks.
;-----------------------------------------------------------------------------
;
; IDE registers and bit definitions
IDE_BANK equ 4104h ;bit 0: enable (1) or disable (0) IDE registers
;bits 5-7: select 16K ROM bank
IDE_DATA equ 7C00h ;Data registers, this is a 512 byte area
IDE_ERROR equ 7E01h ;Error register
IDE_FEAT equ 7E01h ;Feature register
IDE_SECCNT equ 7E02h ;Sector count
IDE_SECNUM equ 7E03h ;Sector number (CHS mode)
IDE_LBALOW equ 7E03h ;Logical sector low (LBA mode)
IDE_CYLOW equ 7E04h ;Cylinder low (CHS mode)
IDE_LBAMID equ 7E04h ;Logical sector mid (LBA mode)
IDE_CYHIGH equ 7E05h ;Cylinder high (CHS mode)
IDE_LBAHIGH equ 7E05h ;Logical sector high (LBA mode)
IDE_HEAD equ 7E06h ;bits 0-3: Head (CHS mode), logical sector higher (LBA mode)
IDE_STATUS equ 7E07h ;Status register
IDE_CMD equ 7E07h ;Command register
IDE_FLASHJACKS equ 7E09h ;Registro FlashJacks
IDE_IDIOMA equ 7E0Ah ;Idioma Seleccionado
IDE_RAM1 equ 7E0Bh ;Byte RAM libre uso 1
IDE_RAM2 equ 7E0Ch ;Byte RAM libre uso 2
IDE_DEVCTRL equ 7E0Eh ;Device control register
; Bits in the error register
WP equ 6 ;Write protected
MC equ 5 ;Media Changed
IDNF equ 4 ;ID Not Found
MCR equ 3 ;Media Change Requested
ABRT equ 2 ;Aborted Command
NM equ 1 ;No media
; Bits in the head register
DEV equ 4 ;Device select: 0=master, 1=slave
LBA equ 6 ;0=use CHS mode, 1=use LBA mode
M_DEV equ (1 SHL DEV)
M_LBA equ (1 SHL LBA)
; Bits in the status register
BSY equ 7 ;Busy
DRDY equ 6 ;Device ready
DF equ 5 ;Device fault
DRQ equ 3 ;Data request
ERR equ 0 ;Error
M_BSY equ (1 SHL BSY)
M_DRDY equ (1 SHL DRDY)
M_DF equ (1 SHL DF)
M_DRQ equ (1 SHL DRQ)
M_ERR equ (1 SHL ERR)
; Bits in the device control register register
SRST equ 2 ;Software reset
M_SRST equ (1 SHL SRST)
; Routine to Bypass the HB-F1, HB-F1II and HB-F9P/S Firmware
H_STKE equ 0FEDAh
RDSLT equ 0000Ch ; Read a byte in a slot
WRSLT equ 00014h ; Write a byte in a slot
;-----------------------------------------------------------------------------
;
; Standard BIOS and work area entries
CHPUT equ 00A2h ;Character output
CHGET equ 009Fh
CLS equ 00C3h
MSXVER equ 002Dh
;-----------------------------------------------------------------------------
; Macros:
;-----------------------------------------------------------------------------
;
; Envía al puerto de salida DE el puerto de HL e incrementa el puntero de ambos.
; Copia de memoria.
macro ldi_1
;ld a,(hl)
;ld (de),a
;inc hl
;inc de
ldi
endmacro
macro ldi_10
ldi_1
ldi_1
ldi_1
ldi_1
ldi_1
ldi_1
ldi_1
ldi_1
ldi_1
ldi_1
endmacro
macro ldi_100
ldi_10
ldi_10
ldi_10
ldi_10
ldi_10
ldi_10
ldi_10
ldi_10
ldi_10
ldi_10
endmacro
macro ldi_512
ldi_100
ldi_100
ldi_100
ldi_100
ldi_100
ldi_10
ldi_1
ldi_1
endmacro
;-----------------------------------------------------------------------------
;
; Fin de las macros.
;
;------------------------------------------------------------------------------
;-----------------------------------------------------------------------------
;
; Work area definition
;
;+0: Device and logical units types for master device
; bits 0,1: Device type
; 00: No device connected
; 01: ATA hard disk, CHS only
; 10: ATA hard disk, LBA supported
; 11: ATAPI device
; bits 2,3: Device type for LUN 1 on master device
; 00: Block device
; 01: Other, non removable
; 10: CD-ROM
; 11: Other, removable
; bits 4,5: Device type for LUN 2 on master device
; bits 6,7: Device type for LUN 3 on master device
;
;+1: Logical unit types for master device
; bits 0,1: Device type for LUN 4 on master device
; bits 2,3: Device type for LUN 5 on master device
; bits 4,5: Device type for LUN 6 on master device
; bits 6,7: Device type for LUN 7 on master device
;
;+2,3: Reserved for CHS data for the master device (to be implemented)
;
;+4..+7: Same as +0..+3, for the slave device
;
; Note: Actually, due to driver limitations, currently only the
; "device type" bits are used, and with possible values 00 and 10 only.
; LUN type bits are always 00.
;-----------------------------------------------------------------------------
;
; Error codes for DEV_RW and DEV_FORMAT
;
NCOMP equ 0FFh
WRERR equ 0FEh
DISK equ 0FDh
NRDY equ 0FCh
DATA equ 0FAh
RNF equ 0F9h
WPROT equ 0F8h
UFORM equ 0F7h
SEEK equ 0F3h
IFORM equ 0F0h
IDEVL equ 0B5h
IPARM equ 08Bh
;-----------------------------------------------------------------------------
;
; Routines available on kernel page 0
;
;* Get in A the current slot for page 1. Corrupts F.
; Must be called by using CALBNK to bank 0:
; xor a
; ld ix,GSLOT1
; call CALBNK
GSLOT1 equ 402Dh
;* This routine reads a byte from another bank.
; Must be called by using CALBNK to the desired bank,
; passing the address to be read in HL:
; ld a,bank
; ld hl,address
; ld ix,RDBANK
; call CALBNK
RDBANK equ 403Ch
;* This routine temporarily switches kernel bank 0/3,
; then jumps to CALBAS in MSX BIOS.
; This is necessary so that kernel bank is correct in case of BASIC error.
CALBAS equ 403Fh
;* Call a routine in another bank.
; Must be used if the driver spawns across more than one bank.
; Input: A = bank
; IX = routine address
; AF' = AF for the routine
; BC, DE, HL, IY = input for the routine
CALBNK equ 4042h
;* Get in IX the address of the SLTWRK entry for the slot passed in A,
; which will in turn contain a pointer to the allocated page 3
; work area for that slot (0 if no work area was allocated).
; If A=0, then it uses the slot currently switched in page 1.
; Returns A=current slot for page 1, if A=0 was passed.
; Corrupts F.
; Must be called by using CALBNK to bank 0:
; ld a,slot
; ex af,af'
; xor a
; ld ix,GWORK
; call CALBNK
GWORK equ 4045h
;* Call a routine in the driver bank.
; Input: (BK4_ADD) = routine address
; AF, BC, DE, HL, IY = input for the routine
;
; Calls a routine in the driver bank. This routine is the same as CALBNK,
; except that the routine address is passed in address BK4_ADD (#F2ED)
; instead of IX, and the bank number is always 5. This is useful when used
; in combination with CALSLT to call a driver routine from outside
; the driver itself.
;
; Note that register IX can't be used as input parameter, it is
; corrupted before reaching the invoked code.
CALDRV equ 4048h
;-----------------------------------------------------------------------------
;
; Built-in format choice strings
;
NULL_MSG equ 741Fh ;Null string (disk can't be formatted)
SING_DBL equ 7420h ;"1-Single side / 2-Double side"
;-----------------------------------------------------------------------------
;
; Driver signature
;
db "NEXTOR_DRIVER",0
; Driver flags:
; bit 0: 0 for drive-based, 1 for device-based
; bit 1: 1 for hot-plug devices supported (device-based drivers only)
; bit 2: 1 if the driver implements the DRV_CONFIG routine
; (used by Nextor from v2.0.5)
;db 1+2+4 ; El 1 para 1 en bit 0, el 2 para 1 en bit 1 y el 4 para 1 en bit 2.
db 1+2
;Reserved byte
db 0
;Driver name
DRV_NAME:
db "Flashjacks SD"
ds 32-($-DRV_NAME)," "
;Jump table
jp DRV_TIMI
jp DRV_VERSION
jp DRV_INIT
jp DRV_BASSTAT
jp DRV_BASDEV
jp DRV_EXTBIO
jp DRV_DIRECT0
jp DRV_DIRECT1
jp DRV_DIRECT2
jp DRV_DIRECT3
jp DRV_DIRECT4
jp DRV_CONFIG
ds 12
jp DEV_RW
jp DEV_INFO
jp DEV_STATUS
jp LUN_INFO
jp DEV_FORMAT
jp DEV_CMD
;-----------------------------------------------------------------------------
;
; Timer interrupt routine, it will be called on each timer interrupt
; (at 50 or 60Hz), but only if DRV_INIT returns Cy=1 on its first execution.
DRV_TIMI:
ret
;-----------------------------------------------------------------------------
;
; Driver initialization, it is called twice:
;
; 1) First execution, for information gathering.
; Input:
; A = 0
; B = number of available drives (drive-based drivers only)
; HL = maximum size of allocatable work area in page 3
; Output:
; A = number of required drives (for drive-based driver only)
; HL = size of required work area in page 3
; Cy = 1 if DRV_TIMI must be hooked to the timer interrupt, 0 otherwise
;
; 2) Second execution, for work area and hardware initialization.
; Input:
; A = 1
; B = number of allocated drives for this controller
; (255 if device-based driver, unless 4 is pressed at boot)
;
; The work area address can be obtained by using GWORK.
;
; If first execution requests more work area than available,
; second execution will not be done and DRV_TIMI will not be hooked
; to the timer interrupt.
;
; If first execution requests more drives than available,
; as many drives as possible will be allocated, and the initialization
; procedure will continue the normal way
; (for drive-based drivers only. Device-based drivers always
; get two allocated drives.)
TEMP_WORK equ 0C000h
DRV_INIT:
;--- If first execution, just inform that no work area is needed
; (the 8 bytes in SLTWRK are enough)
or a
ld hl,0
ld a,2
ret z ;Note that Cy is 0 (no interrupt hooking needed)
;xor a
;ld (TESTADD),a
;--- Borra la pantalla. En los MSX1 hay que decirselo ya que no lo tiene implementado de serie.
push af ; Guarda las variables de inicio.
push bc
push hl
;bit 0,a ; Pone a cero el flag Z
;xor a ; Pone a cero a
;call CLS
;--- Este método de borrado es mejor. Aportado por Victor.
ld a,40 ; 40 columnas
ld (0F3AEh),a
xor a
call 005Fh ; Screen 0
;--- Comprueba el bit de doble reset y lo ejecuta en caso de estar en on.
call IDE_ON
ld a,(IDE_FLASHJACKS) ; Trae el registro de Flashjacks.
and 00000100b ; Anula los bits de freq mas segundo slot y deja solo los bits de marca de opciones.
cp 004h ; Comprueba marca de bit de reset
jp nz,CONTPRG ; No ha detectado una marca correcta del registro flashjacks por lo que no ejecuta nada del reset.
call IDE_OFF
pop hl ; Retorno de las variables de inicio.
pop bc
pop af
rst 0 ; Fuerza un reset. A partir de aquí hace un soft reset y no continua con el programa.
CONTPRG:
call IDE_OFF
;----------------------------------------------
;Compruba las teclas F4 y F5 (VDP FREQ y fuerza TURBOCPU)
push af
push hl
push de
push bc
; Compara tecla pulsada
ld b,7 ;row 7 RET SELECT BS STOP TAB ESC F5 F4
in a,(0AAh)
and 11110000b
or b
out (0AAh),a
in a,(0A9h)
bit 0,a ;F4 -- Si es tecla pulsada turbo va a la rutina de activaci�n del turbo.
jp nz,Fin_ini ; Salta si no se pulsa tecla de turbo.
push af
call putTURBO_CPU ; Ejecuta el turbo CPU.
pop af
Fin_ini:pop bc
pop de
pop hl
pop af
;--- Comienza la escritura en pantalla del driver.
ld de,INFO_S
call PRINT
;--- Saca por pantalla el modelo de ordenador.
ld de,MODELO ; Escribre Modelo:
call PRINT
ld a,(MSXVER) ; Trae el registro de version de MSX de la BIOS
cp 00h ; Si es un MSX1 realiza un salto a la escritura de MSX1.
jp z,IMP_MSX1
cp 01h ; Si es un MSX2 realiza un salto a la escritura de MSX2.
jp z,IMP_MSX2
cp 02h ; Si es un MSX2+ realiza un salto a la escritura de MSX2+.
jp z,IMP_MSX2M
cp 03h ; Si es un MSX TurboR realiza un salto a la escritura de MSX TurboR.
jp z,IMP_MSXR
cp 04h ; Si es un OCM realiza un salto a la escritura de OCM.
jp z,IMP_OCM
jp NO_DETEC ; Si no es ninguna de las versiones mencionadas, imprime un no detectado.
IMP_MSX1:
ld de,M_MSX1
call PRINT
jp FIN_IMP;
IMP_MSX2:
ld de,M_MSX2
call PRINT
jp FIN_IMP;
IMP_MSX2M:
ld de,M_MSX2M
call PRINT
jp FIN_IMP;
IMP_MSXR:
ld de,M_MSXR
call PRINT
jp FIN_IMP;
IMP_OCM:
ld de,M_OCM
call PRINT
jp FIN_IMP;
NO_DETEC:
ld de,M_NDTC
call PRINT
FIN_IMP:
pop hl ; Retorno de las variables de inicio.
pop bc
pop af
;-- Búsqueda de la unidad por pantalla.
ld de,SEARCH_S
call PRINT
ld a,1
call MY_GWORK
call IDE_ON
ld (ix),0 ;Assume both devices empty
ld (ix+4),0
ld a,M_SRST ;Do a software reset
ld (IDE_DEVCTRL),a
nop ;Wait 5 us
xor a
ld (IDE_DEVCTRL),a
WAIT_RESET:
ld de,7640 ;Timeout after 30 s
WAIT_RESET1:
ld a,0
cp e
jp nz,WAIT_DOT ;Print dots while waiting
ld a,46
call CHPUT
WAIT_DOT:
call CHECK_ESC
jp c,INIT_NO_DEV
ld b,255
WAIT_RESET2:
ld a,(IDE_STATUS)
and M_BSY+M_DRDY
cp M_DRDY
jp z,WAIT_RESET_END ;Wait for BSY to clear and DRDY to set
djnz WAIT_RESET2
dec de
ld a,d
or e
jp nz,WAIT_RESET1
jp INIT_NO_DEV
WAIT_RESET_END:
ld a,1 ;Flag the device 0
ld (ix),a
MASTER_CHECK1_END:
ld a,46 ;Print dot
call CHPUT
ld a,M_SRST ; Do ANOTHER software reset
ld (IDE_DEVCTRL),a
nop ;Wait 5 us
xor a
ld (IDE_DEVCTRL),a
nop ;Wait 5 us
ld a,46 ;Print dot
call CHPUT
ld de,CRLF_S
call PRINT
;--- Get info and show the name for the MASTER
ld de,MASTER_S
call PRINT
WSKIPMAS: ; If ESC is pressed, ignore this device
ld de,624 ; Wait 1s to read the keyboard
WSKIPMAS1:
call CHECK_ESC
jp c,NODEV_MASTER
ld b,64
WSKIPMAS2:
ex (sp),hl
ex (sp),hl
djnz WSKIPMAS2
dec de
ld a,d
or e
jp nz,WSKIPMAS1
ld a,(ix) ;If the device isn't flagged it doesn't exists
cp 1
jp nz,NODEV_MASTER
ld a,46 ;Print FIRST dot
call CHPUT
call WAIT_CMD_RDY
jp c,NODEV_MASTER
ld a,0
ld (IDE_HEAD),a ;Select device 0
ld a,46 ;Print SECOND dot
call CHPUT
ld a,0ECh ;Send IDENTIFY commad
call DO_IDE
jp c,NODEV_MASTER
ld a,46 ;Print THIRD dot
call CHPUT
call INIT_CHECK_DEV ;Check if the device is ATA or ATAPI
jp c,NODEV_MASTER
ld a,46 ;Print FOURTH dot
call CHPUT
; Prueba comandos IDIOMA, RAM1 y RAM2. Esto se ha de entrar con su call IDE_ON y su IDE_OFF al final. <-- Borrar este trozo de programa una vez probado.
;ld a,(IDE_IDIOMA) ; Lee la variable idioma 0 a 255 (0 Castellano , 1 Ingles)
;add a, 30h
;call CHPUT
;ld a,6 ; Pone un 6
;ld (IDE_RAM1), a ; Lo transfiere a un byte de RAM FPGA (RAM1)
;xor a ; Borra acumulador
;ld a,(IDE_RAM1) ; Recupera un byte de RAM FPGA (RAM1)
;add a, 30h
;call CHPUT
;ld a,9
;ld (IDE_RAM2), a ; Lo transfiere a un byte de RAM FPGA (RAM1)
;xor a ; Borra acumulador
;ld a,(IDE_RAM2) ; Recupera un byte de RAM FPGA (RAM1)
;add a, 30h
;call CHPUT
; Fin prueba comandos IDIOMA, RAM1 y RAM2.
call WAIT_CMD_RDY ;Try to select the device
jp c,NODEV_MASTER ;this is our last chance to *NOT* detect it
ld a,0
ld (IDE_HEAD),a ;Select device 0
ld a,46 ;Print FIFTH dot
call CHPUT
call INIT_PRINT_NAME
ld (ix),2 ;ATA device with LBA
jp OK_MASTER
NODEV_MASTER:
call CHECK_ESC
jp c,NODEV_MASTER
ld (ix),0
ld de,NODEVS_S
call PRINT
OK_MASTER:
ld a,M_SRST ;Last software reset before we go
ld (IDE_DEVCTRL),a ;some times a faulty slave leaves
;BSY set forever (30s)
nop ;Wait 5 us
xor a
ld (IDE_DEVCTRL),a
jp DRV_INIT_END
INIT_NO_DEV:
call CHECK_ESC
jp c,INIT_NO_DEV
ld de,CRLF_S
call PRINT
ld de,MASTER_S
call PRINT
ld de,NODEVS_S
call PRINT
;--- Fin del procedimiento de inicialización.
DRV_INIT_END:
ld (ix+4),0 ; Marca que no hay unidad esclava.
call IDE_OFF
;--- Retardo de espera de 2 Segundos para que se vea el texto de carga del driver en pantalla.
;--- Si es un MSXTurboR no lo hace. Este ya tiene retardo de por si en el arranque.
push de
push bc
ld a,(MSXVER) ; Trae el registro de version de MSX de la BIOS
cp 03h ; Si es un MSX TurboR realiza un salto ya que este equipo es lento de por si al arranque.
jp z,ESPERA_FIN ; Omite la espera de 2s para el TurboR
ld de,1861 ;Contador cargado para 2s
ESPERA_RDY1:
ld b,255
ESPERA_RDY2:
djnz ESPERA_RDY2 ;Bucle ESPERA_RDY2
dec de
ld a,d
or e
jp nz,ESPERA_RDY1 ;Bucle ESPERA_RDY1
ESPERA_FIN:
pop bc
pop de
;--- Codigo asistencia a la unidad FLASHJACKS. Se ejecuta despues del inicio de NEXTOR.
call IDE_ON
ld a,(MSXVER) ; Trae el registro de version de MSX de la BIOS
cp 00h ; Si es un MSX1 salta la operación de forzado del VDP por incompatibilidad del mismo.
jp z,DEV_FLASH_FIN
; Compara tecla pulsada
ld b,7 ;row 7 RET SELECT BS STOP TAB ESC F5 F4
in a,(0AAh)
and 11110000b
or b
out (0AAh),a
in a,(0A9h)
bit 1,a ;F5 -- Si es tecla pulsada VDP va a la rutina de permutación de frecuencia.
jp z,DEV_VDP_FIN ; Salta la gestión del VDP para la permutación del VDP por tecla pulsada.
ld a,(IDE_FLASHJACKS) ; Trae el registro de Flashjacks.
and 00000011b ; Deja pasar los bits de forzado mas frecuencia.
cp 003h ; Forzado a 60Hz. Bit de Forzado a 1 + Bit de 60 Hz a 1
jp z,DEV_FLASH60 ; Salta al forzado a 60 Hz.
cp 002h ; Forzado a 50Hz. Bit de Forzado a 1 + Bit de 50 Hz a 0
jp z,DEV_FLASH50 ; Salta al forzado a 50 Hz.
jp DEV_FLASH_FIN ; Otras opciones son ignoradas y no hace cambio alguno.
DEV_FLASH50:
ld a,02h ; 02h a 50hz y 00h a 60hz
jp DEV_FLASHVDP;
DEV_FLASH60:
ld a,00h ; 02h a 50hz y 00h a 60hz
DEV_FLASHVDP:
out (099h),a ;Salida directa del VPD
ld (0ffe8h), a ;Salida por BIOS del VDP registro 9
ld a,89h
out (099h),a
DEV_FLASH_FIN:
call IDE_OFF
jp NO_FIRM_BOOT ; Salta a comprobación salto boot del firm de algunos MSX.
DEV_VDP_FIN:
; Ejecuta la permutación del VDP existente
ld hl,0ffe8h;VDP register value
ld a,(hl)
xor 2
ld (hl),a
di
out (99h),a ;Set VDP Frequency
ld a,9+128
ei
out (099h),a
call IDE_OFF
jp NO_FIRM_BOOT ; Salta a comprobación salto boot del firm de algunos MSX.
NO_FIRM_BOOT:; Comprobación salto boot del firm de algunos MSX.
call IDE_ON
ld a,(IDE_FLASHJACKS) ; Trae el registro de Flashjacks.
and 00010000b ; Deja pasar la marca de salto boot firm MSX
cp 010h ; Comprueba bit de salto boot firm MSX.
jp nz,NULL_OTHER_SLOT ; No ha detectado una marca correcta del registro flashjacks por lo que no ejecuta nada salto boot firm MSX.
call IDE_OFF
;---- Anulación del boot interno. Para seguir marcar un break en el Hook #FEDA.(Memory write watchpoint)
;---- Creado integramente por Aquijacks (Flashjacks) 16/12/2023.
;---- Verifica a través del hook que no es un Panasonic.
ld a,(#FEFE)
cp #87
jp nz, No_Panasonic
;Si es un Panasonic, Bypass FS-A1, FS-A1F y FS-A1mk2.
ld a,#23
ld (#CBD8),a ; Bypass FS-A1 firmware
ld (#C3CE),a ; Bypass FS-A1F firmware
ld (#C3D2),a ; Bypass FS-A1mk2 firmware
jp NULL_OTHER_SLOT ; Fin de la pelicula. No hace falta mas.
No_Panasonic:
;Verifica que no es Sony hb-55/75p continuando con el resto de modelos.
ld a,0 ; Slot 0
ld hl,#8010 ; Lectura de la ROM menu.
call RDSLT
ei ; El RDSLT lleva un DI pero no un EI. Se lo ponemos.
cp #F3 ; dato a comparar
jp nz, No_HB_75
ld a,0 ; Slot 0
ld hl,#8011 ; Lectura de la ROM menu.
call RDSLT
ei ; El RDSLT lleva un DI pero no un EI. Se lo ponemos.
cp #3E ; dato a comparar
jp nz, No_HB_75
jp NULL_OTHER_SLOT ; Devuelve el control si es un HB-75p sin parchear ya que estos modelos detectan disk y desactivan menu.
No_HB_75:
; Rutina que hace Bypass en ROM de los modelos HB-F9P/S, HB-F1, HB-101/201P, Mitsubishi G1 Series, Toshiba Series H, National FS-4000/4500 y otros con el mismo sistema.
; Parchea la instrucción de la dirección F38Fh call #F398 a call #F460 (Memoria libre)
ld a,060h
ld (#F390),a
ld a,0F4h
ld (#F391),a
; En la memoria #F460 añade el código "Adding" de parcheo a ejecutar.
ld hl,Adding
ld de,#F460
ld bc,7Fh ; Numero de bytes a copiar. No es exacto pero si sobrado para el código a insertar.
ldir
; Este es un contador que creamos para abortar tras x intentos de búsqueda del parcheo. Si hace llamada a la dirección 00XX a traves del salto F390 aborta y restaura su estado inicial.
ld a, 30h ; Número de intentos en hexadecimal.
ld (#F4E0),a ; Una dirección de memoria libre cualquiera.
jp NULL_OTHER_SLOT ; Devuelve el control. Y ya tendriamos parcheada la RAM con el programita. Ahora a esperar que caiga la CPU por este sitio.
Adding:
; Solo al acceso al menú del firm hace el parcheo. En los demás accesos a las direcciones F390 salta a ix como si nada.
; En ix se encuentra la dirección de salto. Esa rutina no solo sirve para salto al menu del firm. Por lo que solo actuaremos en el salto a este. El resto somos invisibles.
push af ; Almacena acumulador y flags ya que algunos modelos de MSX se ven sensibles en esta parte del código a mantener acumulador y flags.
ld a,ixh
cp #00
jr z, Adding3 ;Si apunta a la memoria 00xxh descuenta en el contador de intentos fallidos y si es el último desparchea y fin.
ld a,ixh
cp #40
jr nz, Adding2 ;Si no apunta a la memoria 40xxh salta.
ld a,ixl
cp #49 ; 4049h inicio dirección del HB-F1
jr z, Adding4
cp #10 ; 4010h inicio dirección del HB-F9s / Mitsubishi G1 / Toshiba Series H
jr z, Adding4
cp #43 ; 4043h inicio dirección del HB-201
jr z, Adding4
cp #4C ; 404Ch inicio dirección del HB-F1II
jr z, Adding4
cp #3B ; 403Bh inicio dirección del National FS-4500
jr z, Adding4
cp #1B ; 401Bh inicio dirección del National FS-4000
jr z, Adding4
Adding2:
pop af ; Devuelve af restaurando valores iniciales para resto de operaciones del MSX.
jp (ix) ; Salta como si nada hubiera pasado a la espera del próximo intento.
Adding3:
; Proceso de contaje decreciente y aborto tras x intentos para retirar parche por no encontrar modelo satisfactorio de MSX para parchear.
ld a,(#F4E0) ; Recuperamos contador.
dec a ; Resta 1 al contador.
ld (#F4E0),a ; Almacenamos contador.
jr nz, Adding2 ; Si no es cero hacemos otro ciclo completo.
; Ejecuta otro parcheo en la dirección F38F para que quede como inicialmente un call #F398. Aquí no ha pasado nada. ;-)
ld a,098h
ld (#F390),a
ld a,0F3h
ld (#F391),a
pop af ; Devuelve af restaurando valores iniciales para resto de operaciones del MSX.
jp (ix) ; Salta como si nada hubiera pasado ya que no procede parchear los philips y similares.
Adding4:
; Ejecuta otro parcheo en la dirección F38F para que quede como inicialmente un call #F398. Aquí no ha pasado nada. ;-)
ld a,098h
ld (#F390),a
ld a,0F3h
ld (#F391),a
pop af ; Devuelve af restaurando valores iniciales para resto de operaciones del MSX.
ret ; Hace el ret tan deseado dejando todo intacto. (Es el ret que devuelve la carga sin ejecutar la rom interna)
ret ; Con el ret realizado se parchea de nuevo a su estado original para dejar intacto el código y salir limpios.
ret
;---- Fin de la anulación del Boot interno. Creado integramente por Aquijacks (Flashjacks)
NULL_OTHER_SLOT:; Comprobación anular ejecución de otro cartucho en slot2 o superiores.
call IDE_ON
ld a,(IDE_FLASHJACKS) ; Trae el registro de Flashjacks.
and 00001000b ; Deja pasar la marca de anulación de slot 2.
cp 008h ; Comprueba bit de anulación de slot2
jp nz,NULL_OTHER_SLOT_EXIT ; No ha detectado una marca correcta del registro flashjacks por lo que no ejecuta nada del reset.
call IDE_OFF
;Ejecunta la anulación de ejecución en slots 2 y superiores.
ld a,#40
cp h
jp z, NULL_OTHER_SLOT_EXIT
ld IX,(0f674h)
ld (IX-6),0C3h
ld (IX-8),0EBh
ld (IX-12),2
jp NULL_OTHER_SLOT_EXIT ; Devuelve el control.
NULL_OTHER_SLOT_EXIT:
call IDE_OFF
ret ; Devuelve el control.
;--- Subroutines for the INIT procedure
; Chequea que pone FLASHJACKS en la dirección 457 en adelante del ID del driver SD.
; Devuelve cero en a si lo encuentra o activa la bandera de carry si no lo encuentra.
; También vuelca el contendio del ID del driver SD en TEMP_WORK los primeros 100 bytes.
INIT_CHECK_DEV:
ld hl,IDE_DATA
ld de,TEMP_WORK
ld bc,50*2 ;Coge los primeros 100 valores del ID del driver SD
ldir
ld a,(IDE_STATUS) ;Check status
cp 01111111b ;Usually this means "no device"
jp z,INIT_CHECK_NODEV
TEST_FOR_FLASHJACKS:
ld hl,TEMP_WORK+27*2 ; Va a donde pone FLASHJACKS
ld b,10 ; Número de bytes de comparación.
ld de,DRIVER_N ; Nombre de comparación (FLASHJACKS)
TESTNAME_LOOP:
ld a,(de) ; Extrae donde apunta la constante FLASHJACKS
inc de ; Incrementa al siguiente byte
ld c,a ; Lo guarda en c
ld a,(hl) ; Extrae el dato leido del ID driver SD
inc hl ; Incrementa al siguiente byte
cp c ; Compara a con c
jp nz,INIT_CHECK_NODEV ; Si no es igual va a devolver no encontrado.
djnz TESTNAME_LOOP ; Si le faltan bytes de comparación va al siguiente
xor a ; Saca un cero en a
ret ; Devuelve el control.
INIT_CHECK_NODEV:
scf ; Pone la bandera de carry a 1.
ret ; Devuelve el control.
;Print a device name.
;Input: 50 first bytes of IDENTIFY device on TEMP_WORK.
INIT_PRINT_NAME:
ld hl,TEMP_WORK+27*2
ld b,20
DEVNAME_LOOP:
ld c,(hl)
inc hl
ld a,(hl)
inc hl
call CHPUT
ld a,c
call CHPUT
djnz DEVNAME_LOOP
ld de,CRLF_S
call PRINT
ret
;-----------------------------------------------------------------------------
;
; Obtain driver version
;
; Input: -
; Output: A = Main version number
; B = Secondary version number
; C = Revision number
DRV_VERSION:
ld a,VER_MAIN
ld b,VER_SEC
ld c,VER_REV
ret
;-----------------------------------------------------------------------------
;
; BASIC expanded statement ("CALL") handler.
; Works the expected way, except that CALBAS in kernel page 0
; must be called instead of CALBAS in MSX BIOS.
DRV_BASSTAT:
scf
ret
;-----------------------------------------------------------------------------
;
; BASIC expanded device handler.
; Works the expected way, except that CALBAS in kernel page 0
; must be called instead of CALBAS in MSX BIOS.
DRV_BASDEV:
scf
ret
;-----------------------------------------------------------------------------
;
; Extended BIOS hook.
; Works the expected way, except that it must return
; D'=1 if the old hook must be called, D'=0 otherwise.
; It is entered with D'=1.
DRV_EXTBIO:
ret