-
Notifications
You must be signed in to change notification settings - Fork 16
/
pmbios.asm
2918 lines (2288 loc) · 58 KB
/
pmbios.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
;******************************************************************
;* PicoMEM BIOS by Freddy VETELE
;*
;* To Build :
;* COM : nasm -f bin -o pmbios.com -l pmbios.lst pmbios.asm -dFTYPE=1
;* ROM :
;* The final .bin file need to have a null CheckSum
;
; - Test Port > ToDo Automatic port test and Config
; - Test BIOS Memory ! Fatal error if not Ok > ToDo Inform the PM Board of the failure (Enter "DIAG" Mode ?)
; - Then, reroute Int19h for Configuration code.
; In Int19h:
; - If First Boot :
; > Read the PC Memory size
; > Read the Disk and Floppy Drive NB
; IRQ 2B : DOS "Mirror"
; Copyright (C) 2023 Freddy VETELE
;This program is free software; you can redistribute it and/or
;modify it under the terms of the GNU General Public License
;as published by the Free Software Foundation; either version 2
;of the License, or (at your option) any later version.
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;You should have received a copy of the GNU General Public License
;along with this program; if not, write to the Free Software
;Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
[BITS 16]
CPU 186
%assign DOS_COM FTYPE ; Come from the compile command line
%define FORCE_INT19h 1
%define POST_DisplayPCRAMSize 0
; "Debug" mode options
%define Display_Intermediate 0 ; Display more messages (Debug)
%define DISPLAY_MAXCONV 0
%define ENABLE_IRQ 1
%define DISPLAY_IRQNb 0
%define ADD_Debug 0
%if DOS_COM=1
%define FORCE_INT19h 0
%endif
; Compile as a .COM (For test)
%if DOS_COM=1
ORG 0x0100
%else
ORG 0X0000
; 0xAA55 Header
DB 0x55
DB 0xAA
; Uses 0x20 512-byte pages : 16Kb
;DB 0x18
DB 0x20
%endif ; DOS_COM=1
JMP PM_START
DB 'PMBIOS'
STR_PICOMEM DB 'PicoMEM',0
STR_Init DB ' BIOS (Date ',__DATE__,')',0
STR_SPACECRLF DB ' '
STR_CRLF DB 0x0D,0x0A,0
STR_TESTOK DB ' - Init: ',0
STR_InitEnd DB ' End',0x0D,0x0A,0
STR_PICOMEMSTART DB ' BIOS by FreddyV ',__DATE__,0
STR_SEGMENT DB 0x0D,0x0A,' ',254,' ROM @',0
STR_IOPORT DB ' - Port' ; Don't move !
STR_DDOT DB ' :'
STR_SPACE DB ' ',0
STR_DDOTNS DB ':',0
STR_BOOTCOUNT DB ' - Boot Count : ',0
STR_PSRAM DB ' ',254,' Memory : ',0
STR_SD DB ' - MicroSD : ',0
STR_USB DB ' - USB : ',0
STR_CONFIG DB ' - Config : ',0
%if POST_DisplayPCRAMSize=1
STR_MEM DB ' ',254,' PC Memory : ',0
%endif
STR_Wifi DB ' ',254,' Wifi : ',0
;STR_MAC DB ' - MAC : ',0
STR_SSID DB ' - SSID : ',0
STR_IRQNB DB ' - IRQ : ',0
;STR_MAXMEM DB ' ',254,' Max Conventional Mem : ',0
STR_WAITCOM DB 0x0D,0x0A,'USB DEBUG Mode: Connect a terminal to the USB Serial Port.',0x0D,0x0A,0
STR_SUP DB ' > ',0
STR_KB DB 'kB',0
STR_OK DB 'Ok ',0
STR_FAILURE DB 'Fail ',0
STR_DISABLED DB 'Disabled',0
STR_SKIP DB 'Skipped',0
STR_FATAL DB 0x0D,0x0A,' Fatal '
STR_ERROR DB 'Error: ',0
STR_DONE DB 'Done',0
STR_EmulStart DB 'PicoMEM Emulation : ',0
STR_PMNOTDETECTED DB 'IO Port Error',0x0D,0x0A,0
STR_PMROMRAMERR DB 'BIOS Memory Error',0x0D,0x0A,0
STR_PMDISKBERR DB 'DISK Buffer Error',0x0D,0x0A,0
;STR_OLDBIOS DB ' ',254,' Old BIOS > Start the setup later',0x0D,0x0A,0
STR_PressAny DB 'Press Any Key',0
STR_PressS DB '> Press S for Setup, Other to continue ',0
STR_HDD DB ' ',254,' HDD',0
STR_FDD DB ' ',254,' FDD',0
; BV_IRQSource Values defines (Interrupt Source/Command)
%define IRQ_None 0 ; IRQ was fired, but not intentionally or nothing to do
%define IRQ_RedirectHW 1 ; Directly call another HW interrupt (ne2000, other)
%define IRQ_RedirectSW 2 ; Directly call a Software Interrupt
%define IRQ_StartPCCMD 3
%define IRQ_USBMouse 4
%define IRQ_Keyboard 5
%define IRQ_IRQ3 6
%define IRQ_IRQ4 7
%define IRQ_IRQ5 8
%define IRQ_IRQ6 9
%define IRQ_IRQ7 10
%define IRQ_IRQ9 11
%define IRQ_IRQ10 12
%define IRQ_NE2000 20
%define IRQ_Total 11
IRQ_Table DW IRQCMD_None ;0
DW IRQCMD_RedirectHW ;1
DW IRQCMD_RedirectSW ;2
DW IRQCMD_StartPCCMD ;3
DW IRQCMD_USBMouse ;4
DW IRQCMD_Keyboard ;5
DW IRQCMD_IRQ3
DW IRQCMD_IRQ4
DW IRQCMD_IRQ5
DW IRQCMD_IRQ6
DW IRQCMD_IRQ7
; Various/Test messages
%if Display_Intermediate=1
STR_InstInt13h DB 'Install Int13h',0x0D,0x0A,0
STR_InstInt19h DB 'Install Int19h',0x0D,0x0A,0
STR_DiskMount DB 'Mount Disks',0x0D,0x0A,0
%endif
STR_STATUS DB 'Status : ',0
STR_Tandy DB 'Tandy',0x0D,0x0A,0
;STR_DISKTEST DB 'HDD Test : ',0x0D,0x0A,0
;STR_HDDLIST DB 'CMD_HDD_Getlist',0x0D,0x0A,0
;STR_CMDINT13 DB 'CMD_Int13h',0x0D,0x0A,0
;DEBUG :
;STR_CSET DB 'C Set ',0
;STR_CCL DB 'C Clear ',0
%macro BIOSPOST 1
PUSH AX
MOV AL,%1
OUT 80h,AL
POP AX
%endmacro
%macro printstr_w 1 ; Print String in White
MOV SI,%1
CALL BIOS_Printstr
%endmacro
%macro printstr_lw 1 ; Print String in light White
MOV SI,%1
MOV BL,15 ; Attribute
CALL BIOS_Printstrc
%endmacro
%macro printstr_r 1 ; Print String in Red
MOV SI,%1
MOV BL,4 ; Attribute
CALL BIOS_Printstrc
%endmacro
%macro printchar_w 1
MOV AL,%1
MOV BL,15
CALL BIOS_Printchar
%endmacro
%macro push_all 0
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DS
PUSH SI
PUSH ES
PUSH DI
PUSH BP
%endmacro
%macro pop_all 0
POP BP
POP DI
POP ES
POP SI
POP DS
POP DX
POP CX
POP BX
POP AX
%endmacro
%macro push_all_exceptbx 0
PUSH AX
PUSH CX
PUSH DX
PUSH DS
PUSH SI
PUSH ES
PUSH DI
PUSH BP
%endmacro
%macro pop_all_exceptbx 0
POP BP
POP DI
POP ES
POP SI
POP DS
POP DX
POP CX
POP AX
%endmacro
;%include "bioscall.asm"
%include "pm_hw.asm"
%include "bios_text.asm"
%include "bios_kb.asm"
%include "bios_disk.asm"
%include "pm_mem.asm"
%include "pm_cmd.asm"
%include "bios_menu.asm"
; PicoMEM BIOS "Boot Sequence :
;
; - Simple HW Diagnostic (Port, Shared RAM and Disk Buffer RAM)
; - Wait the end of the Initialisation : Wait for COM Port and Wait for Init End
; - Check if the Status Port is invalid and Reset if not.
;
WaitKey_Loop:
CALL BIOS_Keypressed
JZ WaitKey_Loop ; End pause if key pressed
CALL BIOS_ReadKey
RET
; Code starts here. Save everything before we start.
PM_START:
; MOV BX,0102h
; PUSH BX
; PUSH BP
; MOV BP,SP
; MOV byte SS:[BP+2],0AAh
; POP BP
; POP BX
PUSHF
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
PUSH CS
POP DS
BIOSPOST 0xFF
%if DOS_COM=1
; Code test Zone, in COM Version only
;jmp WordInputTest
;jmp StrInputTest
;CALL BM_ChangeFDD0Image
;JMP BIOS_Exit
jmp Skip_test
MOV byte [BV_IRQ],3
%if ENABLE_IRQ=1
CALL PM_InstallIRQ3_5_7
%endif
MOV AX,8+5
MOV DX,PM_TestInt05h
MOV BX,OldInt5h
CALL BIOS_HookIRQ
MOV AX,8+7
MOV DX,PM_TestInt07h
MOV BX,OldInt7h
CALL BIOS_HookIRQ
call WaitKey_Loop
mov byte CS:[BV_IRQSource],IRQ_None
int 3+8
call WaitKey_Loop
mov byte CS:[BV_IRQSource],IRQ_RedirectHW
mov byte CS:[BV_IRQArg],5
int 3+8
call WaitKey_Loop
mov byte CS:[BV_IRQSource],IRQ_RedirectSW
mov byte CS:[BV_IRQArg],7+8
int 3+8
call WaitKey_Loop
mov byte CS:[BV_IRQSource],IRQ_StartPCCMD
mov byte CS:[Int_SelfMod+1],3+8
Int_SelfMod:
int 0
call WaitKey_Loop
mov byte CS:[BV_IRQSource],IRQ_USBMouse
MOV BL,3+8
CALL Call_Int
JMP BIOS_Exit
WordInputTest:
; CX : Number of Digit needed (Max 5)
; ES:DI Pointer to a Memory zone, to store the string
; DX : Screen Position
; BL : Text Attribute
PUSH DS
POP ES
MOV DI,PCCR_Param
MOV BL,7
MOV DX,10
MOV CX,3
CALL BIOS_WordInput
CALL BIOS_PrintAX_Dec
JMP BIOS_Exit
StrInputTest:
; CX : Number of Digit needed (Max 5)
; ES:DI Pointer to a Memory zone, to store the string
; DX : Screen Position
; BL : Text Attribute
PUSH DS
POP ES
MOV DI,PCCR_Param
MOV BL,7
MOV DX,10
MOV CX,13
CALL BIOS_StringInput
CALL BIOS_Printstr
JMP BIOS_Exit
Skip_test:
%endif ; DOS_COM=1
; ***** PicoMEM Board initial test sequence *****
printstr_w STR_PICOMEM
printstr_w STR_Init
; *** PicoMEM Test : BIOS RAM Test (16x AA/55)
MOV CX,16
MOV SI,BV_MEMTst
ROMRAM_TestLoop:
MOV AL,0AAh
MOV byte [SI],AL
CMP AL,byte [SI]
JNE ROMRAM_Error
MOV AL,055h
MOV byte [SI],AL
CMP AL,byte [SI]
JNE ROMRAM_Error
LOOP ROMRAM_TestLoop
JMP ROMRAM_Ok
ROMRAM_Error:
BIOSPOST 0x80
MOV AX,STR_PMROMRAMERR
CALL PM_FatalError ; Fatal Error
JMP BIOS_Exit
ROMRAM_Ok:
BIOSPOST 0x00
; *** PicoMEM Test : Disk Buffer RAM Test (16x AA55/55AA)
MOV CX,16
MOV SI,PM_DISKB
DISKRAM_TestLoop:
MOV BX,[SI] ; Save the Value
MOV AX,0AA55h
MOV [SI],AX
CMP AX,[SI]
JNE DBuffer_Error
MOV AX,055AAh
MOV [SI],AX
CMP AX,[SI]
JNE DBuffer_Error
MOV [SI],BX ; Restore the Value
INC SI
LOOP DISKRAM_TestLoop
JMP DBuffer_Ok
DBuffer_Error:
BIOSPOST 0x81
MOV AX,STR_PMDISKBERR
CALL PM_FatalError ; Fatal Error
JMP BIOS_Exit
DBuffer_Ok:
BIOSPOST 0x01
; Now we can start using the RAM
; *** PicoMEM Test : Port Test
; I/O Port test and Display (Currently test one Hardcoded port)
MOV DX,PM_BasePort
CALL PM_TestReadPort
%if DOS_COM=1
MOV AL,1
%endif ; DOS_COM=1
CMP AL,1
JE .PM_Detected
BIOSPOST 0x82
MOV AX,STR_PMNOTDETECTED
CALL PM_FatalError ; Fatal Error
JMP BIOS_Exit
.PM_Detected:
BIOSPOST 0x02
printstr_w STR_TESTOK
; ** As the BIOS RAM is Ok, increment the Init Counter
INC byte [BV_InitCount]
; *** POST: Initialize the BIOS Vars (Default values)
MOV byte [PM_NeedReboot],0
MOV byte [ListLoaded],0
MOV byte [FDD0_Attribute],0
MOV byte [FDD1_Attribute],0
MOV byte [HDD0_Attribute],0
MOV byte [HDD1_Attribute],0
MOV byte [HDD2_Attribute],0
MOV byte [HDD3_Attribute],0
MOV byte [Int13h_Flag],0
MOV byte [BOOT_FDDFirst],0
MOV byte [PMCFG_SD_Speed],24
MOV byte [PMCFG_RAM_Speed],100
MOV byte [Int19h_SkipSetup],0 ; Ask to not start in the Boot Strap Int19h
; *** POST : Wait the end of the PicoMEM Initialisazion ***
; Read Command Status, then :
; 1) Check if in Wait COM Mode
printchar_w '.' ; Check if in Debug mode (Wait COM)
%if DOS_COM=1
MOV AH,0
%else
MOV DX,PM_BasePort
IN AL,DX
%endif ; DOS_COM=1
CMP AL,STAT_WAITCOM
JNE POST_NoWaitCOM
printstr_w STR_WAITCOM
POST_WaitCOMLoop:
MOV DX,PM_BasePort
IN AL,DX
CMP AL,STAT_WAITCOM
JE POST_WaitCOMLoop
POST_NoWaitCOM:
BIOSPOST 0x03
; 2) If in Init mode, wait for the end
CMP AL,STAT_INIT
JNE POST_InitCompleted
POST_WaitInitLoop:
MOV DX,PM_BasePort
IN AL,DX
CMP AL,STAT_INIT
JE POST_WaitInitLoop ; If the Init never finish, the PC is crashed !!
POST_InitCompleted:
%if DOS_COM=1
JMP StatusAtBootOk
%endif ; DOS_COM=1
; 3) If not in Ready Status, Initialize
BIOSPOST 0x10
printchar_w '.' ; Check Command Port Status (Must be 0)
MOV DX,PM_BasePort
IN AL,DX
CMP AL,STAT_READY
JE StatusAtBootOk
PUSH AX
printstr_w STR_CRLF
printstr_w STR_STATUS
POP AX
CALL BIOS_PrintAL_Hex ; display the Status number
printstr_w STR_CRLF
CALL PM_Reset
StatusAtBootOk:
; *** Tandy RAM Mode : Perform the RAM Scan, then initialise Conventionnal RAM and Reboot ***
CMP byte CS:[BV_TdyRAM],0
JE POST_NoTandyRAM
CMP byte CS:[BV_InitCount],1
JNE POST_TandyRAMTest2
; Detect the RAM confir before the PMRAM is used
CALL PM_Memory_FirstBoot
; Ask the PicoMEM to add the RAM
CLI ; Stop IRQ to avoid problem
MOV AH,CMD_TDY_Init
CALL PM_SendCMD
CALL PM_WaitCMDEnd
JMP PM_Reboot
POST_TandyRAMTest2:
CMP byte CS:[BV_InitCount],2
JA POST_NoTandyRAM
; 2nd Tandy BOOT : Check if emulation worked and update the RAM MAP
POST_NoTandyRAM:
; 4) Detect IRQ
BIOSPOST 0x11
printchar_w '.' ; Detect IRQ
%if ENABLE_IRQ=1
CALL PM_DetectIRQ
%endif
BIOSPOST 0x12
CMP byte CS:[PMCFG_PREBOOT],1
JNE PM_NoPreBootSetup
MOV byte CS:[Int19h_SkipSetup],1 ; Ask to not start in the Boot Strap Int19h
printstr_w STR_CRLF
CALL PM_Do_Setup
PM_NoPreBootSetup:
%if DOS_COM=1
JMP BIOS_Exit
%endif ; DOS_COM=1
BIOSPOST 0x13
CMP byte CS:[PMCFG_PREBOOT],1
JE PM_Skipdot
printchar_w '.' ; Install IRQ19h
PM_Skipdot:
CALL PM_InstallIRQ19 ; Install the Boot Strap IRQ
BIOSPOST 0x20
CMP byte CS:[PMCFG_PREBOOT],1
JE BIOS_Exit
printstr_w STR_InitEnd
BIOS_Exit: ; The BIOS Jump here after a Fatal Error (Board not working)
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POPF
%if DOS_COM=1
mov ax,4c00h
int 21h ;exit to DOS
%endif ; DOS_COM=1
RETF ;RETURN to the Computer BIOS
STR_CFGErr DB '! Config File Write Error: Check/Replace the MicroSD',0x0D,0x0A,0
; Do the PicoMEM Initialisation (At the end of the BIOS Init Code)
PM_FinalConfig:
; ** Save the Config File **
MOV AH,CMD_SaveCfg
CALL PM_SendCMD ; Do CMD_SaveCfg Command
CALL PM_WaitCMDEnd ; Wait for the command End
JNC SaveConfigOk
printstr_w STR_CFGErr
CALL PM_Reset ; Need to Reset after an error
SaveConfigOk:
; *** Configure the Memory interface
MOV AH,CMD_MEM_Init
CALL PM_SendCMD ; Do CMD_MEM_Init Command
CALL PM_WaitCMDEnd ; Wait for the command End
CALL MEM_GetMaxConv
%if DISPLAY_MAXCONV=1
PUSH AX
printstr_w STR_MAXMEM
POP AX
PUSH AX
MOV BL,7 ; Light Grey
CALL BIOS_PrintAX_Dec
printstr_w STR_CRLF
POP AX
%endif
CMP AX,16 ; Error !! Don't touch the BIOS RAM Size (PC Minimum RAM Size is 16Kb)
JBE NotUpdateBIOSRAMSize
CMP byte CS:[BV_Tandy],1
JE NotUpdateBIOSRAMSize
; *** Update the BIOS with the new memory size
CMP AX,640
JB Not640kRAM
CMP byte CS:[PMCFG_Max_Conv],1
JE Not640kRAM ; Maximize the RAM Size
MOV AX,640
Not640kRAM:
MOV BX,040h
MOV ES,BX
MOV word ES:[BIOSVAR_MEMORY],AX ; 640Kb if 640 or more, or Memory size
NotUpdateBIOSRAMSize:
; Keyboard IRQ no more installed in the BIOS
; CALL PM_InstallIRQ9 ; Install the KB HotKey interrupt
;Initialise all the other PicoMEM Devices
MOV AH,CMD_DEV_Init
CALL PM_SendCMD ; Do CMD_DEV_Init Command
CALL PM_WaitCMDEnd ; Wait for the command End
%if ENABLE_IRQ=1
CALL PM_InstallIRQ3_5_7
%endif
RET ; PM_FinalConfig End
; END of the PicoMEM Init
; ******************* Install the IRQ 13h ************************
;STR_DiskPresent DB 'Warning: HDD already present : Disable the conflicting PicoMEM Disks',0
;STR_Skip DB 'Skip IRQ13h 3',0x0D,0x0A,0
PM_InstallIRQ13:
PUSH CS
POP DS
; Print the current number of HDD
%if Display_Intermediate=1
printstr_w STR_InstInt13h
%endif
; !!! If there is already disks, this is not supported !!!
; 1) Send the Mount Disks Command (Based on the PM Config variables)
%if Display_Intermediate=1
printstr_w STR_DiskMount
%endif
CALL BIOS_MountFDD
MOV AH,CMD_HDD_Mount
CALL PM_SendCMD ; Do CMD_HDD_Mount Command
CALL PM_WaitCMDEnd ; Wait for the command End
; CMP byte [PC_DiskNB],0 ; If there is already a disk, do nothing (For the moment)
; JE DiskMount_End
; printstr_w STR_DiskPresent
; printstr_w STR_CRLF
; XOR CX,CX
; MOV CL,byte [PC_DiskNB]
; PUSH CS
; POP ES
; MOV DI,HDD0_Attribute
; XOR AL,AL
; REP STOSB ; Disable "PC_DiskNB" Emulated disk
DiskMount_End:
; 2) Hook the DPT0 and DPT1 if the disk are Enabled
; And increment the Disk number count (Initialized by the BIOS at each reboot)
; http://www.techhelpmanual.com/259-int_41h_and_int_46h__hard_disk_parameter_pointers.html
CMP byte [HDD0_Attribute],0x80 ; Emulated HDD0 ?
JB DiskInit_NoHDD0
;HDD0 Present
MOV AX,41h ; Define the new DPT address
MOV DX,PM_DPT_0
MOV BX,OLD_DPT0
CALL BIOS_HookIRQ
MOV AX,040h ; ! Useless now
MOV ES,AX
MOV byte ES:[BIOSVAR_DISKNB],1 ; Set the Nb of disk in the BIOS
DiskInit_NoHDD0:
CMP byte [HDD1_Attribute],0x80 ; Emulated HDD1 ?
JB DiskInit_NoHDD1
MOV AX,46h ; Define the new DPT address
MOV DX,PM_DPT_1
MOV BX,OLD_DPT1
CALL BIOS_HookIRQ
MOV AX,040h ; ! Useless now
MOV ES,AX
INC byte ES:[BIOSVAR_DISKNB]
DiskInit_NoHDD1:
CMP byte [HDD2_Attribute],0x80 ; Emulated HDD2 ?
JB DiskInit_NoHDD2
INC byte ES:[BIOSVAR_DISKNB] ; ! Useless now
DiskInit_NoHDD2:
CMP byte [HDD3_Attribute],0x80 ; Emulated HDD3 ?
JB DiskInit_NoHDD3
INC byte ES:[BIOSVAR_DISKNB] ; ! Useless now
DiskInit_NoHDD3:
MOV AL,CS:[New_DiskNB]
MOV ES:[BIOSVAR_DISKNB],AL ; Set the Nb of disk as computer by the PicoMEM
; 3) Modify the Floppy number
CALL FDD_UpdateBIOSVar
; 4) Save previous IRQ13h and Install the new IRQ Vector
MOV AX,13h
MOV DX,PM_Int13h
MOV BX,OldInt13h
CALL BIOS_HookIRQ
;printstr_w STR_Skip
RET ; PM_InstallIRQ13 End
; ****** Display the emulated Disk list (FDD and HDD) ******
Display_DisksList:
; ** Display the FDD Images list **
XOR BX,BX
DisplayMountedFDDList_Loop:
PUSH BX
CMP byte [FDD0_Attribute+BX],0x80
JB No_Display_FDDImageName
PUSH BX ; Display "HDDx :"
printstr_w STR_FDD
POP BX
MOV AX,BX
PUSH BX
MOV BL,7 ; Light Grey
CALL BIOS_PrintAX_Dec
printstr_w STR_DDOT
POP BX
MOV SI,PMCFG_FDD0Size
MOV CL,4
SHL BX,CL
ADD SI,BX
PUSH SI
LODSW ; Load the Disk Size
MOV BL,7 ; Light Grey
CALL BIOS_PrintAX_Dec ; Display the Disk Size
MOV SI,STR_KB
CALL BIOS_Printstrc ; Display 'Kb'
printstr_w STR_SPACE
POP SI
ADD SI,2
CALL BIOS_Printstrc ; Display the Disk name
printstr_w STR_CRLF
No_Display_FDDImageName:
POP BX
INC BX
CMP BX,2 ; 2 FDD Images max
JNE DisplayMountedFDDList_Loop
; ** Display the HDD Images list **
XOR BX,BX
DisplayMountedHDDList_Loop:
PUSH BX
CMP byte [HDD0_Attribute+BX],0x80
JB No_Display_ImageName
PUSH BX ; Display HDDx :
printstr_w STR_HDD
POP BX
MOV AX,BX
PUSH BX
MOV BL,7 ; Light Grey
CALL BIOS_PrintAX_Dec
printstr_w STR_DDOT
POP BX
MOV SI,PMCFG_HDD0Size
MOV CL,4
SHL BX,CL
ADD SI,BX
PUSH SI
LODSW ; Load the Disk Size
MOV BL,7 ; Light Grey
CALL BIOS_PrintAX_Dec ; Display the Disk Size
MOV SI,STR_MB
CALL BIOS_Printstrc ; Display 'Mb'
printstr_w STR_SPACE
POP SI
ADD SI,2
CALL BIOS_Printstrc ; Display the Disk name
printstr_w STR_CRLF
No_Display_ImageName:
POP BX
INC BX
CMP BX,4 ; 4 HDD Images max
JNE DisplayMountedHDDList_Loop
RET ; Display_DisksList End
;STR_DetIRQ DB 'IRQ ',0
;STR_Detected DB 'Detected:',0
PM_DetectIRQ:
; Hook Test Interrupts
CMP byte [BV_IRQ],0 ; 06/07/24 : Skip IRQ Detection if already set in config
JE PM_DoDetectIRQ
RET
PM_DoDetectIRQ:
; printstr_w STR_DetIRQ
CLI
MOV AX,8+3
MOV DX,PM_TestInt03h
MOV BX,OldInt3h
CALL BIOS_HookIRQ
MOV AX,8+5
MOV DX,PM_TestInt05h
MOV BX,OldInt5h
CALL BIOS_HookIRQ
MOV AX,8+7
MOV DX,PM_TestInt07h
MOV BX,OldInt7h
CALL BIOS_HookIRQ
; Enable the Interrupts
IN AL,21h
MOV CS:[PM_I],AL ; Save the IRQ Mask register
AND AL,01010111b ; IRQ 3+5+7 Mask
OUT 21h,AL
STI
; Wait for the IRQ
MOV byte [BV_IRQ],0
MOV AH,CMD_SendIRQ
CALL PM_SendCMD ; Do CMD_SendIRQ Command
CALL PM_WaitCMDEnd ; !! WARNING, Crash if the Pico command does not end
MOV CX,0
WaitTestIRQ:
CMP byte [BV_IRQ],0
JNE IRQ_Detected
LOOP WaitTestIRQ
JMP Detect_IRQ_End
IRQ_Detected:
; printstr_w STR_Detected
; XOR AH,AH
; MOV AL,byte [BV_IRQ]
; CALL BIOS_PrintAX_Dec
Detect_IRQ_End:
CLI
MOV AH,CMD_IRQAck
CALL PM_SendCMD ; Do CMD_FDD_Mount Command
CALL PM_WaitCMDEnd ; !! WARNING, Crash if the Pico command does not end
; Restore the Interrupt Controller Mask
MOV AL,CS:[PM_I] ; Get the Previous IRQ Mask
OUT 21h,AL
; Restore IRQ Interrupts
MOV AX,8+3
MOV DX,OldInt3h
CALL BIOS_RestoreIRQ
MOV AX,8+5
MOV DX,OldInt5h
CALL BIOS_RestoreIRQ
MOV AX,8+7
MOV DX,OldInt7h
CALL BIOS_RestoreIRQ
STI
RET
; Interrupt used to detect the HW IRQ number
; Return the Physical IRQ Number
PM_TestInt03h: ; (serial port 2 interrupt)
MOV byte CS:[BV_IRQ],3
JMP IRQ_Test_End
PM_TestInt05h: ; (XT HDD port interrupt)
MOV byte CS:[BV_IRQ],5
JMP IRQ_Test_End