home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 25 / CD_ASCQ_25_1095.iso / dos / prg / cpe50 / cpe2 / ipe1.asm next >
Assembly Source File  |  1995-09-11  |  49KB  |  2,467 lines

  1. ; *******************************************************************
  2. ; * Amstrad CPC emulator v4.9i,                                     *
  3. ; * (c) 1991-95 Bernd Schmidt                                       *
  4. ; *                                                                 *
  5. ; *******************************************************************
  6.  
  7.     IDEAL
  8.  
  9. PUBLIC amsdos,basic,rom7,sysstat,scrbase,scroff,modetab,normramseg
  10. PUBLIC inp,outp,memmap,scrbankpt,emulr,dowait,intcount,DoJoystick
  11. PUBLIC intreq,ffly,refreshrate,usevesa,smallvesa,borders
  12. PUBLIC cleanup,reset
  13. PUBLIC RethinkCRTC,colmode,SetColors,ResetVesaPage,IncVesaPage
  14. PUBLIC SetPCsCRTC
  15. PUBLIC SaveSnap,LoadSnap
  16. PUBLIC crtcvtotal,crtcscrwidth,crtchsync,doublelinmode
  17. PUBLIC CRTCregs,pcrtcscrwidth,crtc32state
  18. PUBLIC GenModeTab,needmodetab
  19.  
  20. PUBLIC SBinstalled,SBport,usesound,PSGcount,psgregmod,psgregs,sbdelay,noisy
  21. PUBLIC cpctype,quietcas,germkey
  22. EXTRN  SB_Reset:PROC,DoSound:PROC,RethinkPSG:PROC,SOUND_Init:PROC,Sound_Cleanup:PROC
  23.  
  24. EXTRN  inpFB:PROC,outFA:PROC,outFB:PROC
  25. EXTRN  OpenDriveA:PROC,CloseDisk:PROC,DiskChange:WORD,DCstat:BYTE
  26. EXTRN  DiskBuf:BYTE,fha:WORD
  27.  
  28. EXTRN simz80:PROC,interrupt:PROC,ClearInterruptCounter:PROC
  29. EXTRN simstack:WORD,sAFx:WORD,sBCx:WORD,sDEx:WORD,sHLx:WORD,ix:WORD,iy:WORD
  30. EXTRN srF:WORD,srFhi:WORD,srI:WORD,imode:WORD,sIFF1:BYTE,sIFF2:BYTE
  31. EXTRN intflag:WORD,simz80l:PROC,sz80_instend:PROC
  32. EXTRN swapemulr:PROC,imode:WORD,count52:WORD
  33. EXTRN inpiob:PROC
  34.  
  35. PUBLIC MenuScr,MenuItems,MenuVars,FixPrefs
  36.  
  37. PUBLIC OpenTextScr,PutChar,ResetScreen,RestoreScreen
  38.  
  39. ; *** Code from files.asm
  40. EXTRN GetDirs:PROC,GetSnapDir:PROC,SelFile:PROC,SelSnap:PROC,GetSaveSnapName:PROC
  41. EXTRN InitTape:PROC,CloseTape:PROC
  42.  
  43. ; *** Data from files.asm
  44. EXTRN snapdir:BYTE,snaname:BYTE,snapha:WORD
  45.  
  46. ; *** Code from misc.asm
  47. EXTRN LoadROMs:PROC,Menu:PROC,ClearKeyMap:PROC,Video:PROC,MyKeyInt:PROC,SetLEDs:PROC
  48.  
  49. ; *** Data from misc.asm
  50. EXTRN KeyMatrix:BYTE
  51. EXTRN ColorTab:DWORD,ColorTabA:DWORD
  52.  
  53. ; *** Code from comp386.asm
  54. EXTRN UnpackArea:PROC,PackArea:PROC
  55.  
  56. P386
  57.  
  58. GROUP   DGROUP _stack,_data
  59.  
  60.       INCLUDE "macros.inc"
  61.  
  62. SEGMENT _text PAGE PUBLIC 'CODE'
  63. ASSUME CS:_text
  64. ASSUME DS:DGROUP
  65.  
  66. start:
  67.       ;  STARTUPCODE
  68.     MOV     DX,DGROUP
  69.     MOV     DS,DX
  70.     MOV     DX,SEG stck
  71.     MOV     SS,DX
  72.     MOV     DX,OFFSET stckend
  73.     MOV     SP,DX
  74.  
  75.     XOR     EAX,EAX
  76.     XOR     EBX,EBX
  77.     XOR     ECX,ECX
  78.     XOR     EDX,EDX
  79.     XOR     ESI,ESI
  80.     XOR     EDI,EDI
  81.     XOR     EBP,EBP
  82.  
  83.     MOV     [fha],0ffffh
  84.     MOV     [snapha],0ffffh
  85.  
  86.     CALL    GetDirs
  87.  
  88.     CALL    GetOldKeyInt
  89.     CALL    GetOld8253Int
  90.  
  91.     CALL    GetScrMode
  92.  
  93.     MOV     DX,OFFSET prefname        ; load prefs
  94.     MOV     AX,3d00h
  95.     INT     21h
  96.     JC      cleanup
  97.  
  98.     MOV     BX,AX
  99.     MOV     AH,3Fh
  100.     MOV     DX,OFFSET CPEPrefs
  101.     MOV     CX,42
  102.     INT     21h
  103.  
  104.     MOV     AH,3Fh
  105.     MOV     DX,OFFSET joystuff
  106.     MOV     CX,8
  107.     INT     21h
  108.     MOV     AH,3Eh
  109.     INT     21h
  110.  
  111.         CALL    FixPrefs
  112.  
  113.     CALL    InitRamSegs
  114.  
  115.         CALL    LoadROMs
  116.  
  117.     MOV     AX,CS
  118.     MOV     DS,AX
  119.     MOV     DX,OFFSET MyKeyInt
  120.     MOV     AX,2509h
  121.     INT     21h                     ; set interrupt
  122.     MOV     AX,DGROUP
  123.     MOV     DS,AX
  124.  
  125.     MOV     AX,[normramseg]
  126.     MOV     ES,AX
  127.  
  128.     CALL    Set8253Int
  129.  
  130.     CALL    SOUND_Init
  131.     CALL    SB_reset
  132.  
  133.     CALL    OpenDriveA
  134.     CALL    InitHardware
  135.     CALL    reset
  136.  
  137.     JMP     simz80
  138.  
  139. print:
  140.     PUSHAW
  141.     PUSH    ES
  142.     PUSH    DS
  143.     POP     ES
  144.     XOR     AX,AX
  145.     MOV     CX,0ffffh
  146.     MOV     DI,DX
  147.     REPNZ   SCASB
  148.     NEG     CX
  149.     SUB     CX,2
  150.     MOV     AX,4000h
  151.     MOV     BX,1
  152.     INT     21h
  153.     POP     ES
  154.     POPAW
  155.     RET
  156.  
  157. GetOldKeyInt:
  158.     MOV     AX,3509h
  159.     INT     21h
  160.     MOV     [oldintseg],ES
  161.     MOV     [oldintadd],BX
  162.     RET
  163.  
  164. DisableInt:
  165.     PUSHAD
  166.     MOV     DX,[oldintadd]
  167.     MOV     AX,[oldintseg]
  168.     MOV     DS,AX
  169.     MOV     AX,2509h
  170.     INT     21h                     ; set interrupt
  171.     MOV     AX,DGROUP
  172.     MOV     DS,AX
  173.     POPAD
  174.     RET
  175.  
  176. GetOld8253Int:
  177.     MOV     AX,3508h
  178.     INT     21h
  179.     MOV     [old8253seg],ES
  180.     MOV     [old8253add],BX
  181.     RET
  182.  
  183. Set8253Int:
  184.     MOV     AX,CS
  185.     MOV     DS,AX
  186.     MOV     DX,OFFSET My8253Int
  187.     MOV     AX,2508h
  188.     INT     21h
  189.     CLI
  190.     MOV     AX,DGROUP
  191.     MOV     DS,AX
  192.  
  193.     MOV     DX,43h
  194.     MOV     AL,36h
  195.     OUT     DX,AL
  196.     MOV     DX,40h
  197.     MOV     AX,[timerval]
  198.     OUT     DX,AL
  199.     MOV     AL,AH
  200.     OUT     DX,AL
  201.     STI
  202.     RET
  203.  
  204. Res8253Int:
  205.     CLI
  206.     MOV     DX,43h
  207.     MOV     AL,36h
  208.     OUT     DX,AL
  209.     MOV     DX,40h
  210.     MOV     AL,000h
  211.     OUT     DX,AL
  212.     MOV     AL,000h
  213.     OUT     DX,AL
  214.  
  215.     MOV     AX,[old8253seg]
  216.     MOV     DX,[old8253add]
  217.     MOV     DS,AX
  218.     MOV     AX,2508h
  219.     INT     21h
  220.     MOV     AX,DGROUP
  221.     MOV     DS,AX
  222.     STI
  223.     RET
  224.  
  225. My8253Int:
  226.     PUSH    DS
  227.     PUSH    EAX
  228.  
  229.     PUSH    DGROUP
  230.     POP     DS
  231.  
  232.     CALL    My8253Handler
  233.  
  234.     MOV     AX,[timerval]
  235.     ADD     [timercount],AX
  236.     JNC     M8253_Ret
  237.     POP     EAX
  238.     POP     DS
  239.     JMP     [old8253]
  240.  
  241. M8253_Ret:
  242.     MOV     AL,20h
  243.     OUT     20h,AL
  244.     POP     EAX
  245.     POP     DS
  246.     IRET
  247.  
  248. LABEL old8253 DWORD
  249. old8253add  dw    0
  250. old8253seg  dw    0
  251.  
  252. My8253Handler:
  253.     PUSH    EAX
  254.     PUSH    DS
  255.     PUSH    DX
  256.  
  257.     MOV     AX,DGROUP
  258.     MOV     DS,AX
  259.  
  260.     CMP     [doingems],0
  261.     JNE     MII_NotInt
  262.  
  263.         INC     [intcount]
  264.         AND     [intcount],07fh
  265. MII_NotInt:
  266.     POP     DX
  267.     POP     DS
  268.     POP     EAX
  269.     RET
  270.  
  271. DoJoystick:
  272.     CMP     [usejoy],0
  273.     JE      DJOY_End
  274.     PUSHAD
  275.     MOV     DX,201h
  276.     IN      AL,DX
  277.     XOR     ESI,ESI
  278.     XOR     EDI,EDI
  279.     CLI
  280.     XOR     AX,AX
  281.     OUT     DX,AL
  282.  
  283. DJOY_l: IN      AL,DX
  284.     AND     AL,3
  285.     JZ      DJOY_lend
  286.     BT      AX,0
  287.     JNC     DJOY_notx
  288.     INC     ESI
  289. DJOY_notx:
  290.     BT      AX,1
  291.     JNC     DJOY_noty
  292.     INC     EDI
  293. DJOY_noty:
  294.     JMP     DJOY_l
  295. DJOY_lend:
  296.     IN      AL,DX
  297.     STI
  298.     MOV     CL,[KeyMatrix+9]
  299.     OR      CL,03fh
  300.     CMP     SI,[joyr]
  301.     JNC     DJOY_notright
  302.     XOR     CL,4
  303. DJOY_notright:
  304.     CMP     [joyl],SI
  305.     JNC     DJOY_notleft
  306.     XOR     CL,8
  307. DJOY_notleft:
  308.     CMP     DI,[joyu]
  309.     JNC     DJOY_notup
  310.     XOR     CL,1
  311. DJOY_notup:
  312.     CMP     [joyd],DI
  313.     JNC     DJOY_notdn
  314.     XOR     CL,2
  315. DJOY_notdn:
  316.     AND     AL,48
  317.     AND     CL,0CFh
  318.     OR      CL,AL
  319.     MOV     [KeyMatrix+9],CL
  320.     POPAD
  321. DJOY_End:
  322.     RET
  323.  
  324. GetScrMode:
  325.     MOV     AH,0FH
  326.     CALL    Video
  327.     PUSH    AX
  328.     MOV     AX,1130H
  329.     MOV     BH,0
  330.     MOV     DL,0
  331.     CALL    Video
  332.     POP     AX
  333.     MOV     DH,AH
  334.     CMP     DL,25
  335.     SBB     AH,AH
  336.     INC     AH
  337.     MOV     [OldVideo],AX
  338.     RET
  339.  
  340. SetOldMode:
  341.     MOV     AX,[OldVideo]
  342.     MOV     BX,40h
  343.     MOV     ES,BX
  344.     MOV     BL,20H
  345.     CMP     AL,7            ; smMono
  346.     JNE     @@1
  347.     MOV     BL,30H
  348.  
  349. @@1:    AND     [BYTE PTR ES:10h],0CFH     ; Equipmentbyte
  350.     OR      [ES:10h],BL
  351.     AND     [BYTE PTR ES:87h],0FEH     ; CrtInfo
  352.     PUSH    AX
  353.     MOV     AH,0
  354.     CALL    Video
  355.     POP     AX
  356.     OR      AH,AH
  357.     JE      @@2
  358.     MOV     AX,1112H
  359.     MOV     BL,0
  360.     CALL    Video
  361.     MOV     AX,1130H
  362.     MOV     BH,0
  363.     MOV     DL,0
  364.     CALL    Video
  365.     CMP     DL,42
  366.     JNE     @@2
  367.     OR      [BYTE PTR ES:87h],1
  368.     MOV     AH,1
  369.     MOV     CX,600H
  370.     CALL    Video
  371.     MOV     AH,12H
  372.     MOV     BL,20H
  373.     CALL    Video
  374. @@2:
  375.     RET
  376.  
  377. cleanup:
  378.     CALL    SB_reset
  379.     CALL    SOUND_Cleanup
  380.     CALL    CloseTape
  381.     CALL    CloseDisk
  382.     CALL    DisableInt
  383.     CALL    Res8253Int
  384.     CALL    SetOldMode
  385.     CALL    CleanupEMM
  386.     EXITCODE
  387.  
  388. OpenTextScr:
  389.         CMP     [usevesa],0
  390.         JE      OTSC_Standard
  391.         CMP     [graphmenu],0
  392.         JE      OTSC_Standard
  393.         MOV     AX,[vesapage]
  394.         MOV     [savedvesapage],AX
  395.         CALL    ClearVesaScreen
  396.         PUSH    SEG amsdos
  397.         POP     FS
  398.         RET
  399. OTSC_Standard:
  400.         MOV     AX,3
  401.         CALL    Video
  402.         PUSH    0B800h
  403.         POP     FS
  404.         RET
  405.  
  406. PutChar:
  407.         CMP     [usevesa],0
  408.         JE      PTCH_Standard
  409.         CMP     [graphmenu],0
  410.         JE      PTCH_Standard
  411.         PUSHAD
  412.         PUSH    ES
  413.         CMP     AL,10h
  414.         JNE     PTCH_NoArrow
  415.         MOV     AL,243
  416. PTCH_NoArrow:
  417.         XOR     AH,AH
  418.         MOV     SI,AX
  419.         ADD     SI,SI
  420.         ADD     SI,SI
  421.         ADD     SI,SI
  422.         ADD     SI,03800h  ; SI now contains the character's position in ROM
  423.  
  424.         MOV     AX,DX
  425.         MOV     CL,80
  426.         DIV     CL
  427.         MOV     CL,AH
  428.         XOR     CH,CH
  429.         ADD     CX,CX
  430.         ADD     CX,CX
  431.         ADD     CX,CX
  432.         XOR     AH,AH
  433.         MOV     DI,6400
  434.         MUL     DI      ; one line is 6400 bytes
  435.         ADD     AX,CX
  436.         ADC     DX,0
  437.         MOV     [vesapage],DX
  438.         CALL    SetVesaPage
  439.         MOV     DI,AX      ; DI contains the offset to VGA memory
  440.  
  441.         PUSH    0A000h
  442.         POP     ES
  443.         MOV     CX,8
  444. PTCH_LineLoop:
  445.         MOV     BL,[FS:SI]
  446.         INC     SI
  447.         MOV     BH,8
  448. PTCH_BitLoop:
  449.         MOV     AL,20
  450.         ROL     BL,1
  451.         JNC     PTCH_CharOK
  452.         MOV     AL,11
  453. PTCH_CharOK:
  454.         STOSB
  455.         DEC     BH
  456.         JNZ     PTCH_BitLoop
  457.  
  458.         ADD     DI,792
  459.         JNC     PTCH_LineOK
  460.         CALL    IncVesaPage
  461. PTCH_LineOK:
  462.         LOOP    PTCH_LineLoop
  463.         POP     ES
  464.         POPAD
  465.         RET
  466. PTCH_Standard:
  467.         MOV     [FS:EDX*2],AX
  468.         RET
  469.  
  470. RestoreScreen:
  471.         CMP     [usevesa],0
  472.         JE      RSSC_Standard
  473.         CMP     [graphmenu],0
  474.         JE      RSSC_Standard
  475.         CALL    ClearVesaScreen
  476.         PUSH    AX
  477.         MOV     AX,[savedvesapage]
  478.         MOV     [vesapage],AX
  479.         POP     AX
  480.         CALL    SetVesaPage
  481.         RET                     ; SetPCsCRTC not needed here
  482. RSSC_Standard:
  483.         CALL    ResetScreen
  484.         RET
  485.  
  486. ResetScreen:
  487.     MOV     [scrtype],0ffffh
  488.     CALL    SetPCsCRTC
  489.         RET
  490.  
  491. ClearVesaScreen:
  492.         PUSHAD
  493.         PUSH    ES
  494.         CALL    ResetVesaPage
  495.         PUSH    0A000h
  496.         POP     ES
  497.         XOR     DI,DI
  498.         MOV     CX,60000
  499.         MOV     EAX,014141414h
  500. OTSC_Clear_Loop:
  501.         STOSD
  502.         OR      DI,DI
  503.         JNE     OTSC_Clear_OK
  504.         CALL    IncVesaPage
  505. OTSC_Clear_OK:
  506.         LOOP    OTSC_Clear_Loop
  507.         POP     ES
  508.         POPAD
  509.         RET
  510.  
  511. FixPrefs:
  512.         CMP     [havejoy],0f00bh
  513.         JNE     FPRF_JoyCalibrated
  514.         MOV     [havejoy],0ffffh
  515.  
  516.         MOV     AX,8400h                  ; check joystick
  517.         MOV     DX,1
  518.         INT     15h
  519.         JC      FPRF_nojoy
  520.  
  521.         CMP     [joyr],4
  522.         JNC     FPRF_JoyCalibrated
  523. FPRF_nojoy:
  524.         MOV     [havejoy],0
  525. FPRF_JoyCalibrated:
  526.         CMP     [SBinstalled],0
  527.     JNE     FPRF_DontClearSB
  528.     MOV     [usesound],0
  529. FPRF_DontClearSB:
  530.  
  531.         MOV     BP,[havejoy]
  532.         AND     [usejoy],BP
  533.  
  534.     MOV     AX,[refreshrate]        ; force reasonable values
  535.     MOV     [refreshrate],1
  536.     CMP     AX,1
  537.     JC      FPRF_RRateOK
  538.     CMP     AX,10
  539.     JNC     FPRF_RRateOK
  540.     MOV     [refreshrate],AX
  541. FPRF_RRateOK:
  542.         MOV     AX,[usevesa]
  543.         NOT     AX
  544.         OR      [smallvesa],AX
  545.         RET
  546.  
  547. InitHardware:
  548.     MOV     [ffly],0
  549.     MOV     [scrbase],0ffffh
  550.     MOV     [colmode],0
  551.     MOV     [scrtype],0
  552.     MOV     [bordercol],0ffffh
  553.     CALL    InitTape
  554.     CALL    GenModeTabs
  555.  
  556.     RET
  557.  
  558. reset:  PUSH    40h
  559.     POP     FS
  560.     CLI
  561.     MOV     AL,[FS:17h]
  562.     OR      AL,96
  563.     XOR     AL,64
  564.     MOV     [FS:17h],AL
  565.     SHR     AL,4
  566.     AND     AL,7
  567.     AND     [BYTE PTR FS:97h],0f8h
  568.     OR      [FS:97h],AL
  569.     STI
  570.     CALL    SetLEDs
  571.     CALL    ClearKeyMap
  572.  
  573.     MOV     [WORD PTR sysstat],9
  574.     MOV     [memstate],9
  575.     MOV     [romnum],0
  576.     MOV     [doingems],0
  577.     CALL    InitCRTC
  578.     CALL    GenModeTab
  579.     CALL    RethinkMemMap
  580.     CALL    ResetRAMState
  581.     CALL    RethinkRamState
  582.     MOV     sPC,0
  583.     InitPCSeg
  584.     MOV     [sIFF1],0
  585.     MOV     [sIFF2],0
  586.     MOV     [intreq],0
  587.     MOV     [dcstat],0
  588.     MOV     [imode],1
  589.     MOV     [intflag],0
  590.  
  591.     RET
  592.  
  593. InitCRTC:
  594.     MOV     BP,OFFSET CRTCregs
  595.     MOV     [DWORD PTR BP],08e2e283fh
  596.     MOV     [DWORD PTR BP+4],01e190026h
  597.     MOV     [DWORD PTR BP+8],00000700h
  598.     MOV     [DWORD PTR BP+12],00c00030h
  599.  
  600.         MOV     [crtc32state],0
  601.  
  602.     MOV     [crtcvtotal],312
  603.     MOV     [crtcscrwidth],40
  604.         MOV     [crtchsync],20
  605.     MOV     [scroff],0
  606.     MOV     [scrbase],0C000h
  607.     MOV     [scrtype],0ffffh
  608.  
  609.     MOV     [videomode],1
  610.  
  611.     CALL    SetPCsCRTC
  612.     RET
  613.  
  614. RethinkCRTC:
  615.     PUSH    sFree
  616.         CMP     [usevesa],0
  617.         JNE     CRTC_nonewborder
  618.     MOV     sFree,[newborcol]
  619.     CMP     [bordercol],sFree
  620.     JE      CRTC_nonewborder
  621.     CMP     [borchanges],2
  622.     JNC     CRTC_clearborchg
  623.     MOV     [bordercol],sFree
  624.     CALL    SetBorder
  625. CRTC_clearborchg:
  626.     MOV     [borchanges],0
  627. CRTC_nonewborder:
  628.  
  629.     XOR     sFree,sFree  ; 8: SetPCsCRTC
  630.  
  631.     PUSH    AX
  632.     PUSH    BP
  633.     MOV     BP,[WORD PTR CRTCregs+12]
  634.     ROL     BP,8
  635.     ADD     BP,BP
  636.     MOV     AX,BP
  637.     ADD     BP,BP
  638.     AND     AX,7FEh
  639.     AND     BP,0C000h
  640.     MOV     [scrbase],BP
  641.     MOV     [scroff],AX
  642.  
  643.     MOV     BP,[WORD PTR CRTCregs+12]
  644.     ROL     BP,8
  645.         AND     BP,[crtc32mask]
  646.         MOV     [crtc32state],BP
  647.  
  648.     PUSH    ES
  649.     PUSH    DI
  650.     CALL    GetScrBankPt
  651.     POP     DI
  652.     POP     ES
  653.  
  654.     MOV     AL,[BYTE PTR CRTCregs+1]
  655. ;    MOV     [crtcscrwidth],AL
  656.  
  657.     CALL    SetPCsCRTC
  658.  
  659.     POP     BP
  660.     POP     AX
  661. CRTC_Ret:
  662.     POP     sFree
  663.     RET
  664.  
  665. outp:   BT      AX,14
  666.     JC      OUT_noCRTC
  667.     BT      AX,9
  668.     JC      OUT_End
  669.     BT      AX,8
  670.     JC      OUT_CRTC_wr
  671.     CALL    outCRTCreg
  672.     JMP     OUT_End
  673. OUT_CRTC_wr:
  674.     CALL    outCRTCwr
  675.     JMP     OUT_End
  676. OUT_noCRTC:
  677.  
  678.     BT      AX,11
  679.     JC      OUT_noPIO
  680.     PUSH    AX
  681.     AND     AH,3
  682.     CMP     AH,0
  683.     JNE     OUT_NotPIOa
  684.     CALL    out8255a
  685.     JMP     OUT_PIOend
  686. OUT_NotPIOa:
  687.     CMP     AH,1
  688.     JNE     OUT_NotPIOb
  689.     CALL    out8255b
  690.     JMP     OUT_PIOend
  691. OUT_NotPIOb:
  692.     CMP     AH,2
  693.     JNE     OUT_NotPIOc
  694.     CALL    out8255c
  695.     JMP     OUT_PIOend
  696. OUT_NotPIOc:
  697.     CALL    out8255control
  698. OUT_PIOEnd:
  699.     POP     AX
  700.         JMP     OUT_noGary
  701. OUT_noPIO:
  702.  
  703.     BT      AX,15
  704.     JC      OUT_noGary
  705.     PUSH    AX
  706.     CALL    outga
  707.     POP     AX
  708. OUT_noGary:
  709.  
  710.     BT      AX,10
  711.     JC      OUT_noDiskStuff
  712.     PUSH    AX
  713.     BT      AX,8
  714.     JC      OUT_Disk_cmd
  715.     CALL    outFA
  716.     JMP     OUT_Disk_End
  717. OUT_Disk_Cmd:
  718.     CALL    outFB
  719. OUT_Disk_End:
  720.     POP     AX
  721. OUT_NoDiskStuff:
  722.  
  723.     BT      AX,13
  724.     JC      OUT_noROMnum
  725.     PUSH    AX
  726.     CALL    outROMnum
  727.     POP     AX
  728. OUT_noROMnum:
  729. OUT_end:
  730.     RET
  731.  
  732. outROMnum:
  733.     MOV     AH,0
  734.     CMP     AX,[romnum]
  735.     JE      outROM_old
  736.     MOV     [romnum],AX
  737.     CALL    RethinkMemMap
  738. outROM_old:
  739.     RET
  740.  
  741. outCRTCreg:
  742.     MOV     [CRTCregnum],AL
  743.     RET
  744.  
  745. outCRTCwr:
  746.     MOVZX   BP,[BYTE PTR CRTCregnum]
  747.         AND     BP,31
  748.     MOV     [BYTE PTR BP+CRTCregs],AL
  749.         RET
  750.  
  751. out8255a:
  752.     BT      [WORD PTR control8255],4
  753.     JC      o8255aend
  754.     MOV     [port8255a],AL
  755.     MOV     sFree,[WORD PTR port8255c]
  756.     SHR     sFree,6
  757.     AND     sFree,3
  758.     JE      inactivepsg
  759.     CMP     sFree,3
  760.     JE      latchpsg
  761.     CMP     sFree,2
  762.     JE      writepsg
  763. o8255aend:
  764.     RET
  765.  
  766. out8255b:
  767.     MOV     [port8255b],AL
  768.     RET
  769.  
  770. out8255c:
  771.     PUSH    DX
  772.     PUSH    AX
  773.     XOR     DL,DL
  774.     BT      [WORD PTR control8255],0
  775.     JC      o8255clin
  776.     OR      DL,15
  777. o8255clin:
  778.     BT      [WORD PTR control8255],3
  779.     JC      o8255chin
  780.     OR      DL,240
  781. o8255chin:
  782.     OR      [port8255c],DL
  783.     XOR     [port8255c],DL
  784.     AND     AL,DL
  785.     OR      [port8255c],AL
  786.     MOV     AH,AL
  787.     SHR     AH,4
  788.     AND     AH,2
  789.     MOV     BP,DX
  790.     CLI
  791.     MOV     DX,61h
  792.     IN      AL,DX
  793.     AND     AL,0fch
  794.     OR      AL,AH
  795.     OUT     DX,AL
  796.     STI
  797.  
  798.     POP     AX
  799.     POP     DX
  800.     AND     BP,0C0h
  801.     JZ      inactivepsg
  802.     MOV     sFree,AX
  803.     SHR     sFree,6
  804.     AND     sFree,3
  805.     JE      inactivepsg
  806.     CMP     sFree,3
  807.     JE      latchpsg
  808.     CMP     sFree,2
  809.     JE      writepsg
  810.     RET
  811.  
  812. out8255control:
  813.     BT      AX,7
  814.     JNC     out8255control_SF
  815.     MOV     [control8255],AL
  816.     CALL    UpdatePIOA
  817.     CALL    UpdatePIOC
  818.     RET
  819. out8255control_SF:
  820.     BT      AX,0
  821.     JC      o8255cSFset
  822.     PUSH    AX
  823.     SHR     AL,1
  824.     AND     AX,7
  825.     MOV     BP,AX                     ; is it in output mode?
  826.     AND     BP,4
  827.     SHR     BP,1
  828.     BT      [WORD PTR control8255],BP
  829.     JNC     o8255cSFnores
  830.     BTR     [WORD PTR port8255c],AX
  831.     MOV     AL,[port8255c]
  832.     CALL    out8255c
  833. o8255cSFnores:
  834.     POP     AX
  835.     RET
  836. o8255cSFset:
  837.     PUSH    AX
  838.     SHR     AL,1
  839.     AND     AX,7
  840.     MOV     BP,AX                     ; is it in output mode?
  841.     AND     BP,4
  842.     SHR     BP,1
  843.     BT      [WORD PTR control8255],BP
  844.     JNC     o8255cSFnoset
  845.     BTS     [WORD PTR port8255c],AX
  846.     MOV     AL,[port8255c]
  847.     CALL    out8255c
  848. o8255cSFnoset:
  849.     POP     AX
  850.     RET
  851.  
  852. inactivepsg:
  853.     RET
  854.  
  855. writepsg:
  856.     MOV     BP,[WORD PTR psgregnum]
  857.     AND     BP,00Fh
  858.     MOV     AL,[port8255a]
  859.     MOV     [BP+OFFSET psgregs],AL
  860.     MOV     [BYTE PTR BP+OFFSET psgregmod],255
  861.     CALL    DoSound
  862.     CALL    UpdatePIOA
  863.     RET
  864.  
  865. latchpsg:
  866.     MOV     AL,[port8255a]
  867.     AND     AL,15
  868.     MOV     [psgregnum],AL
  869.     CALL    UpdatePIOA
  870.     RET
  871.  
  872. outga:  MOV     BP,AX
  873.     SHR     BP,6
  874.     AND     BP,3
  875.     AND     AL,3Fh
  876.     CMP     [BYTE PTR BP+rgsgarr],AL
  877.     JE      outga_end
  878.     MOV     [BYTE PTR BP+rgsgarr],AL
  879.     CMP     BP,2
  880.     JNE     outga1
  881.     CMP     AL,[memstate]
  882.     JE      outga_end
  883.     MOV     [memstate],AL
  884.     AND     [memstate],0EFh
  885.     AND     AL,10h
  886.     JZ      outga_nocli
  887.         CALL    ClearInterruptCounter
  888. outga_nocli:
  889.     CALL    RethinkMemMap
  890.     InitPCSeg
  891.     CALL    RethinkMode
  892.     JMP     outga_end
  893. outga1: CMP     BP,1
  894.     JE      ga_setcol
  895.     CMP     BP,0
  896.     JE      outga_colreg
  897.     CMP     BP,3
  898.     JE      RethinkRamState
  899.     JMP     outga_end
  900. outga_colreg:
  901.     MOV     [BYTE PTR rgsgarr+1],255
  902. outga_end:
  903.     RET
  904.  
  905. ga_setcol:
  906.     PUSH    AX
  907.     PUSH    EBX
  908.     PUSH    DX
  909.     MOV     AL,[BYTE PTR rgsgarr]
  910.     CMP     AL,16
  911.     JNC     ga_sc_border
  912.     AND     EAX,1Fh         ; *?*
  913.     MOV     BL,[BYTE PTR (rgsgarr+1)]
  914.     AND     BX,01Fh
  915.     CMP     [EAX+garrcols],BL
  916.     JE      ga_sc_end
  917.     MOV     [EAX+garrcols],BL
  918.     MOV     [needmodetab],1
  919. ga_sc_end:
  920.     POP     DX
  921.     POP     EBX
  922.     POP     AX
  923.     RET
  924. ga_sc_border:
  925.     AND     EAX,0ffh
  926.     CMP     AL,16
  927.     JNE     ga_sc_end
  928.     MOV     BL,[BYTE PTR (rgsgarr+1)]
  929.     AND     BX,01Fh
  930.     CMP     [EAX+garrcols],BL
  931.     JE      ga_sc_end
  932.     MOV     [EAX+garrcols],BL
  933.     MOV     [newborcol],BX
  934.     INC     [borchanges]
  935.         CMP     [smallvesa],0
  936.         JNE     ga_sc_end
  937.         MOV     AL,[garrcols+16]
  938.         MOV     AH,AL
  939.         MOV     [WORD PTR modetab+2048],AX
  940.         MOV     [WORD PTR modetab+2050],AX
  941.         MOV     [WORD PTR modetab+2052],AX
  942.         MOV     [WORD PTR modetab+2054],AX
  943.     JMP     ga_sc_end
  944.  
  945. SetColors:
  946.     PUSH    AX
  947.     PUSH    EBX
  948.     PUSH    DX
  949.  
  950.     MOV     AX,31
  951. SCL_Loop:
  952.     PUSH    AX
  953.     CMP     [colmode],0
  954.     JE      SCL_normcols
  955.     MOV     EBX,[EAX*4+ColorTabA]
  956.     JMP     SCL_colsok
  957. SCL_normcols:
  958.     MOV     EBX,[EAX*4+ColorTab]
  959. SCL_colsok:
  960.     PUSH    AX
  961.     MOV     AX,1010h
  962.     MOV     CX,BX
  963.     ROL     EBX,16
  964.     MOV     DH,BL
  965.     XOR     EBX,EBX
  966.     POP     BX
  967.     CALL    Video
  968.     XOR     EBX,EBX
  969.     POP     AX
  970.     DEC     AX
  971.     JNS     SCL_Loop
  972.  
  973.     POP     DX
  974.     POP     EBX
  975.     POP     AX
  976.     RET
  977.  
  978. SetBorder:
  979.     PUSH    AX
  980.     PUSH    EBX
  981.     PUSH    DX
  982.  
  983.     MOV     BX,[bordercol]
  984.     MOV     BH,BL
  985.     MOV     AX,1001h
  986.     CALL    Video
  987.  
  988.     POP     DX
  989.     POP     EBX
  990.     POP     AX
  991.     RET
  992.  
  993. GenModeTab:
  994.     PUSHAW
  995.     PUSH    ES
  996.     PUSH    DS
  997.     POP     ES
  998.     MOV     [needmodetab],0
  999.     MOV     SI,OFFSET mode0tab
  1000.     CMP     [videomode],0
  1001.     JE      GMT_OK
  1002.     MOV     SI,OFFSET mode1tab
  1003.     CMP     [videomode],1
  1004.     JE      GMT_OK
  1005.     MOV     SI,OFFSET mode2tab
  1006. GMT_OK: MOV     CX,1024
  1007.     MOV     DI,OFFSET modetab
  1008.     MOV     BX,OFFSET garrcols
  1009.         CMP     [usevesa],0
  1010.         JE      GMT_Loop
  1011.         CMP     [smallvesa],0
  1012.         JNE     GMT_Loop
  1013.         ADD     CX,CX
  1014. GMT_Loop:
  1015.     LODSB
  1016.     XLATB
  1017.     STOSB
  1018.     LOOP    GMT_Loop
  1019.         MOV     AL,[garrcols+16]
  1020.         MOV     AH,AL
  1021.         MOV     [DI],AX
  1022.         MOV     [DI+2],AX
  1023.         MOV     [DI+4],AX
  1024.         MOV     [DI+6],AX
  1025.     POP     ES
  1026.     POPAW
  1027.     RET
  1028.  
  1029. GenModeTabs:
  1030.         CMP     [usevesa],0
  1031.         JE      GMTB_NoVesa
  1032.         CMP     [smallvesa],0
  1033.         JNE     GMTB_NoVesa
  1034.  
  1035. GMTV2:  PUSHAW
  1036.         MOV     AX,0
  1037.     MOV     DI,OFFSET mode2tab
  1038. GMTV2_Loop:
  1039.     MOV     CX,8
  1040.     XOR     DX,DX   ; DL = 0: no shift, 1: one set left, 2: one clr left
  1041.     CMP     AX,0BCh
  1042.     JNE     GMTV2_InnerLoop
  1043.     NOP
  1044. GMTV2_InnerLoop:
  1045.         XOR     DX,DX
  1046.     ROL     AL,1
  1047.         RCL     DX,1
  1048.         MOV     [DI],DL
  1049.         INC     DI
  1050.         LOOP    GMTV2_InnerLoop
  1051.     INC     AL
  1052.     JNE     GMTV2_Loop
  1053.  
  1054. GMTV0:
  1055.     MOV     SI,OFFSET garrcols
  1056.     MOV     AX,0
  1057.     MOV     DI,OFFSET mode0tab
  1058. GMTV0_Loop:
  1059.     MOV     AH,AL
  1060.     XOR     BX,BX
  1061.     ROL     AL,7
  1062.     RCL     BL,1
  1063.     ROL     AL,4
  1064.     RCL     BL,1
  1065.     ROL     AL,2
  1066.     RCL     BL,1
  1067.     ROL     AL,4
  1068.     RCL     BL,1
  1069.     MOV     BH,BL
  1070.     MOV     [DI],BX
  1071.     MOV     [DI+2],BX
  1072.     ADD     DI,4
  1073.  
  1074.     XOR     BX,BX
  1075.     ROL     AL,7
  1076.     RCL     BL,1
  1077.     ROL     AL,4
  1078.     RCL     BL,1
  1079.     ROL     AL,2
  1080.     RCL     BL,1
  1081.     ROL     AL,4
  1082.     RCL     BL,1
  1083.     MOV     BH,BL
  1084.     MOV     [DI],BX
  1085.     MOV     [DI+2],BX
  1086.     ADD     DI,4
  1087.     MOV     AL,AH
  1088.     INC     AL
  1089.     JNE     GMTV0_Loop
  1090.  
  1091. GMTV1:
  1092.     MOV     SI,OFFSET garrcols
  1093.     MOV     AX,0
  1094.     MOV     DI,OFFSET mode1tab
  1095. GMTV1_Loop:
  1096.     MOV     DX,AX
  1097. GMTV1_InnerLoop:
  1098.     XOR     BX,BX
  1099.     ROL     AL,5
  1100.     RCL     BL,1
  1101.     ROL     AL,4
  1102.     RCL     BL,1
  1103.         MOV     BH,BL
  1104.     MOV     [DI],BX
  1105.  
  1106.     XOR     BX,BX
  1107.     ROL     AL,5
  1108.     RCL     BL,1
  1109.     ROL     AL,4
  1110.     RCL     BL,1
  1111.         MOV     BH,BL
  1112.     MOV     [DI+2],BX
  1113.  
  1114.     XOR     BX,BX
  1115.     ROL     AL,5
  1116.     RCL     BL,1
  1117.     ROL     AL,4
  1118.     RCL     BL,1
  1119.         MOV     BH,BL
  1120.     MOV     [DI+4],BX
  1121.  
  1122.     XOR     BX,BX
  1123.     ROL     AL,5
  1124.     RCL     BL,1
  1125.     ROL     AL,4
  1126.     RCL     BL,1
  1127.         MOV     BH,BL
  1128.     MOV     [DI+6],BX
  1129.  
  1130.     ADD     DI,8
  1131.  
  1132.     MOV     AX,DX
  1133.     INC     AL
  1134.     JNE     GMTV1_Loop
  1135.     POPAW
  1136.     RET
  1137.  
  1138. GMTB_NoVesa:
  1139. GMT2:   PUSHAW
  1140.  
  1141.     MOV     AX,0
  1142.     MOV     DI,OFFSET mode2tab
  1143. GMT2_Loop:
  1144.     MOV     CX,4
  1145.     XOR     DX,DX   ; DL = 0: no shift, 1: one set left, 2: one clr left
  1146.     CMP     AX,0BCh
  1147.     JNE     GMT2_InnerLoop
  1148.     NOP
  1149. GMT2_InnerLoop:
  1150.     ROL     AL,2
  1151.     MOV     SI,AX
  1152.     AND     SI,3
  1153.     CMP     SI,3
  1154.     JE      GMT2_11
  1155.     CMP     SI,0
  1156.     JE      GMT2_00
  1157.     CMP     SI,2
  1158.     JE      GMT2_10
  1159.     JMP     GMT2_01
  1160. GMT2_11:
  1161.   ;      MOV     DL,0
  1162.     JMP     GMT2_Set
  1163.  
  1164. GMT2_00:
  1165.   ;      MOV     DL,0
  1166.     JMP     GMT2_Clr
  1167.  
  1168. GMT2_01:
  1169.     CMP     DL,0            ; pattern 01
  1170.     JNE     GMT2_01_DLnot0
  1171.     CMP     DH,1
  1172.     JNE     GMT2_01_normal
  1173.     MOV     DL,2
  1174.     JMP     GMT2_Clr        ; 1101 -> 1100, 1 clr left
  1175. GMT2_01_Normal:
  1176.     MOV     DL,1            ; 0001 -> 0011 , 1 set left
  1177.     JMP     GMT2_Set
  1178. GMT2_01_DLnot0:
  1179.     CMP     DL,1
  1180.     JNE     GMT2_01_DL2
  1181.     MOV     DL,2
  1182.     JMP     GMT2_Clr        ; 0101 -> 1100 , 1 clr left
  1183. GMT2_01_DL2:
  1184.     MOV     DL,1            ; 1001 -> 0011 , 1 set left
  1185.     JMP     GMT2_Set
  1186.  
  1187. GMT2_10:                        ; pattern 10
  1188.     CMP     DL,0
  1189.     JNE     GMT2_10_DLnot0
  1190.     CMP     DH,2
  1191.     JNE     GMT2_10_Normal
  1192.     MOV     DL,1
  1193.     JMP     GMT2_Set        ; 0010 -> 0011, 1 set left
  1194. GMT2_10_Normal:
  1195.     MOV     DL,2            ; 1110 -> 1100, 1 clr left
  1196.     JMP     GMT2_Clr
  1197. GMT2_10_DLnot0:
  1198.     CMP     DL,1
  1199.     JNE     GMT2_10_DL2
  1200.     MOV     DL,2
  1201.     JMP     GMT2_Clr        ; 0110 -> 1100, 1 clr left
  1202. GMT2_10_DL2:
  1203.     MOV     DL,1
  1204.     JMP     GMT2_Set        ; 1010 -> 0011, 1 set left
  1205.  
  1206. GMT2_Clr:
  1207.     MOV     [BYTE PTR DI],0
  1208.     MOV     DH,2
  1209.     JMP     GMT2_OK
  1210. GMT2_Set:
  1211.     MOV     [BYTE PTR DI],1
  1212.     MOV     DH,1
  1213. GMT2_OK:
  1214.     INC     DI
  1215.     LOOP    GMT2_InnerLoop
  1216.     INC     AL
  1217.     JNE     GMT2_Loop
  1218.  
  1219. GMT0:
  1220.     MOV     SI,OFFSET garrcols
  1221.     MOV     AX,0
  1222.     MOV     DI,OFFSET mode0tab
  1223. GMT0_Loop:
  1224.     MOV     AH,AL
  1225.     XOR     BX,BX
  1226.     ROL     AL,7
  1227.     RCL     BL,1
  1228.     ROL     AL,4
  1229.     RCL     BL,1
  1230.     ROL     AL,2
  1231.     RCL     BL,1
  1232.     ROL     AL,4
  1233.     RCL     BL,1
  1234.  ;       MOV     BL,[SI+BX]
  1235.     MOV     BH,BL
  1236.     MOV     [DI],BX
  1237.     ADD     DI,2
  1238.  
  1239.     XOR     BX,BX
  1240.     ROL     AL,7
  1241.     RCL     BL,1
  1242.     ROL     AL,4
  1243.     RCL     BL,1
  1244.     ROL     AL,2
  1245.     RCL     BL,1
  1246.     ROL     AL,4
  1247.     RCL     BL,1
  1248.  ;       MOV     BL,[SI+BX]
  1249.     MOV     BH,BL
  1250.     MOV     [DI],BX
  1251.     ADD     DI,2
  1252.     MOV     AL,AH
  1253.     INC     AL
  1254.     JNE     GMT0_Loop
  1255.  
  1256. GMT1:
  1257.     MOV     SI,OFFSET garrcols
  1258.     MOV     AX,0
  1259.     MOV     DI,OFFSET mode1tab
  1260. GMT1_Loop:
  1261.     MOV     DX,AX
  1262. GMT1_InnerLoop:
  1263.     XOR     BX,BX
  1264.     ROL     AL,5
  1265.     RCL     BL,1
  1266.     ROL     AL,4
  1267.     RCL     BL,1
  1268.     MOV     [DI],BL
  1269.  
  1270.     XOR     BX,BX
  1271.     ROL     AL,5
  1272.     RCL     BL,1
  1273.     ROL     AL,4
  1274.     RCL     BL,1
  1275.     MOV     [DI+1],BL
  1276.  
  1277.     XOR     BX,BX
  1278.     ROL     AL,5
  1279.     RCL     BL,1
  1280.     ROL     AL,4
  1281.     RCL     BL,1
  1282.     MOV     [DI+2],BL
  1283.  
  1284.     XOR     BX,BX
  1285.     ROL     AL,5
  1286.     RCL     BL,1
  1287.     ROL     AL,4
  1288.     RCL     BL,1
  1289.     MOV     [DI+3],BL
  1290.  
  1291.     ADD     DI,4
  1292.  
  1293.     MOV     AX,DX
  1294.     INC     AL
  1295.     JNE     GMT1_Loop
  1296.     POPAW
  1297.     RET
  1298.  
  1299. SetPCsCRTC:
  1300.     PUSHAW
  1301.  
  1302.     CALL    OpenScr
  1303.     MOV     AL,[BYTE PTR CRTCregs+9]
  1304.         INC     AL
  1305.     MOV     AH,[BYTE PTR CRTCregs+6]
  1306.     MUL     AH
  1307.         CMP     [vertoverscn],0
  1308.         JE      SPCC_HeightL25
  1309.     CMP     AX,201
  1310.     JC      SPCC_HeightL25
  1311.     MOV     [doublelinmode],0
  1312.     MOV     AL,[BYTE PTR CRTCregs+1]
  1313.         CMP     AL,41
  1314.         JNC     SPCC_WidthL40
  1315.     MOV     [pcrtcscrwidth],AL
  1316.     JMP     SPCC_ScrOpen
  1317. SPCC_HeightL25:
  1318.     MOV     [doublelinmode],1
  1319. SPCC_WidthL40:
  1320.     MOV     [pcrtcscrwidth],40
  1321.     JMP     SPCC_ScrOpen
  1322. SPCC_ScrOpen:
  1323.         CMP     [usevesa],0
  1324.         JNE     SPCC_Vesa
  1325.  
  1326.     MOV     AL,[pcrtcscrwidth]
  1327.     CMP     AL,0
  1328.     JE      SPCC_WidthOK
  1329.     CLI
  1330.     MOV     DX,3d4h
  1331.     PUSH    AX
  1332.     MOV     AL,13h
  1333.     OUT     DX,AL
  1334.     INC     DX
  1335.     IN      AL,DX
  1336.     POP     AX
  1337.     OUT     DX,AL
  1338.     STI
  1339.  
  1340.     CMP     AL,50
  1341.     JNC     SPCC_WidthOK
  1342.  
  1343.     ADD     AL,AL
  1344.     DEC     AL
  1345.     DEC     DX
  1346.     PUSH    AX
  1347.     MOV     AL,1
  1348.     CLI
  1349.     OUT     DX,AL
  1350.     INC     DX
  1351.     IN      AL,DX
  1352.     POP     AX
  1353.     OUT     DX,AL
  1354.     STI
  1355. SPCC_WidthOK:
  1356.         MOV     AX,[doublelinmode]
  1357.         CMP     [dlmode],AX
  1358.         JE      SPCC_End
  1359.         MOV     [dlmode],AX
  1360.  
  1361.     CLI                             ; 400 Zeilen
  1362.     MOV     DX,03d4h
  1363.     MOV     AL,9
  1364.     OUT     DX,AL
  1365.     INC     DX
  1366.     IN      AL,DX
  1367.     AND     AL,70h
  1368.     OUT     DX,AL
  1369.  
  1370.     MOV     DX,3D4h
  1371.     MOV     AL,9
  1372.     OUT     DX,AL
  1373.     INC     DX
  1374.     IN      AL,DX
  1375.     AND     AL,07fh
  1376.     CMP     [doublelinmode],0
  1377.     JE      SPCC_DLOK
  1378.     OR      AL,80h
  1379. SPCC_DLOK:
  1380.     OUT     DX,AL
  1381.         JMP     SPCC_End
  1382.  
  1383. SPCC_Vesa:
  1384.         MOV     [pcrtcscrwidth],50
  1385.  
  1386.         CMP     [smallvesa],0
  1387.         JNE     SPCC_End
  1388.                                 ; turn on double lines
  1389.     CLI
  1390.     MOV     DX,3D4h
  1391.     MOV     AL,9
  1392.     OUT     DX,AL
  1393.     INC     DX
  1394.     IN      AL,DX
  1395.     AND     AL,07fh
  1396.     OR      AL,80h
  1397.     OUT     DX,AL
  1398.  
  1399. SPCC_End:
  1400.     POPAW
  1401.     STI
  1402.     RET
  1403.  
  1404. inp:    CMP     AH,0F4h
  1405.     JE      inpioA
  1406.     CMP     AH,0F5h
  1407.     JE      inpioB
  1408.     CMP     AH,0F6h
  1409.     JE      inpioC
  1410.     CMP     AH,0FBh
  1411.     JE      inpFB
  1412.     RET
  1413.  
  1414. UpdatePIOA:
  1415.     BT      [WORD PTR control8255],4
  1416.     JNC     UPIA_Ret
  1417.     BT      [WORD PTR port8255c],7
  1418.     JC      UPIA_Ret
  1419.     PUSH    AX
  1420.     CALL    readpsg
  1421.     MOV     [port8255a],AL
  1422.     POP     AX
  1423. UPIA_Ret:
  1424.     RET
  1425.  
  1426. inpioA: CALL    UpdatePIOA
  1427.     MOV     AL,[port8255a]
  1428.     RET
  1429.  
  1430. readpsg:
  1431.     CMP     [psgregnum],14
  1432.     JE      readpsgext
  1433.     MOVZX   BP,[psgregnum]
  1434.     MOV     AL,[BYTE PTR BP+psgregs]
  1435.     RET
  1436.  
  1437. readpsgext:
  1438.     PUSH    BX                           ; *?*
  1439.     MOV     BL,[port8255c]
  1440.     AND     BX,15
  1441.     MOV     AL,[BX+KeyMatrix]
  1442.     CMP     BL,9
  1443.     JNE     rpex_nojoy0
  1444.     MOV     BH,AL
  1445.     AND     BH,12
  1446.     JNE     rpex_jhok0
  1447.     OR      AL,12
  1448. rpex_jhok0:
  1449.     MOV     BH,AL
  1450.     AND     BH,3
  1451.     JNE     rpex_jvok0
  1452.     OR      AL,3
  1453. rpex_jvok0:
  1454. rpex_nojoy0:
  1455.     CMP     BL,6
  1456.     JNE     rpex_nojoy1
  1457.     MOV     BH,AL
  1458.     AND     BH,12
  1459.     JNE     rpex_jhok1
  1460.     OR      AL,12
  1461. rpex_jhok1:
  1462.     MOV     BH,AL
  1463.     AND     BH,3
  1464.     JNE     rpex_jvok1
  1465.     OR      AL,3
  1466. rpex_jvok1:
  1467. rpex_nojoy1:
  1468.     POP     BX
  1469.     RET
  1470.  
  1471. UpdatePIOC:
  1472.     MOV     AL,[port8255c]
  1473.     BT      [WORD PTR control8255],0
  1474.     JC      inpioc_lowok
  1475.     AND     AL,240
  1476.     OR      AL,0
  1477. inpioc_lowok:
  1478.     BT      [WORD PTR control8255],3
  1479.     JC      inpioc_hiok
  1480.     AND     AL,15
  1481.     OR      AL,0
  1482. inpioc_hiok:
  1483.     MOV     [port8255c],AL
  1484.     RET
  1485. inpioC:
  1486.     MOV     AL,[port8255c]
  1487.     RET
  1488.  
  1489. RethinkMode:
  1490.     PUSH    AX
  1491.     MOV     BP,[WORD PTR sysstat]
  1492.     AND     BP,3
  1493.     MOV     AL,[MoTable+BP]
  1494.     CMP     [videomode],AL
  1495.     JE      RTM_End
  1496.     MOV     [videomode],AL
  1497.     CALL    GenModeTab
  1498. RTM_End:
  1499.     POP     AX
  1500.     RET
  1501.  
  1502. OpenScr:
  1503.     CMP     [scrtype],1
  1504.     JE      OS_DontReopen
  1505.     MOV     [scrtype],1
  1506.         MOV     [dlmode],1
  1507.     CALL    SetMode
  1508.     CALL    SetColors
  1509.     CALL    SetBorder
  1510. OS_DontReopen:
  1511.  
  1512.     RET
  1513.  
  1514. SetMode:
  1515.     PUSH    ES
  1516.  
  1517.         CMP     [usevesa],0
  1518.         JNE     SMOD_UseVesa
  1519.  
  1520.     MOV     AX,13h
  1521.     CALL    Video
  1522.         POP     ES
  1523.         RET
  1524. SMOD_UseVesa:
  1525.  
  1526.         MOV     AX,4f02h
  1527.         MOV     BX,0103h
  1528.         PUSH    BX
  1529.         CALL    Video
  1530.         POP     CX
  1531.         PUSH    SEG vesabuffer
  1532.         POP     ES
  1533.         MOV     DI,OFFSET vesabuffer
  1534.         MOV     AX,4f01h
  1535.         CALL    Video
  1536.         CMP     [DWORD PTR vesabuffer+0ch],0
  1537.         JNE     SMOD_Happy
  1538.         MOV     [WORD PTR vesabuffer+0ch],OFFSET MySetWin
  1539.         MOV     [WORD PTR vesabuffer+0eh],SEG MySetWin
  1540. SMOD_Happy:
  1541.     POP     ES
  1542.     RET
  1543.  
  1544. ResetVesaPage:
  1545.         CMP     [usevesa],0
  1546.         JE      VESA_End
  1547.     MOV     [vesapage],0
  1548.     JMP     SetVesaPage
  1549. IncVesaPage:
  1550.         CMP     [usevesa],0
  1551.         JE      VESA_End
  1552.     INC     [vesapage]
  1553.     JMP     SetVesaPage
  1554. SetVesaPage:
  1555.     PUSHAD
  1556.     MOV     BX,0
  1557.     MOV     DX,[vesapage]
  1558.     MOV     AX,[WORD PTR vesabuffer+4]
  1559.     OR      AX,AX
  1560.     JE      SVEP_LEnd
  1561.     ADD     AX,AX
  1562. SVEP_Loop:
  1563.     ROL     AL,1
  1564.     JC      SVEP_LEnd
  1565.     ADD     DX,DX
  1566.     JMP     SVEP_Loop
  1567. SVEP_LEnd:
  1568.     CALL    [DWORD PTR vesabuffer+0ch]
  1569.     POPAD
  1570. VESA_End:
  1571.     RET
  1572.  
  1573. MySetWin:
  1574.     PUSH    AX
  1575.     MOV     AX,4f05h
  1576.     CALL    Video
  1577.     POP     AX
  1578.     RETF
  1579.  
  1580.  ; ******************************************************** RAM banking
  1581.  
  1582. InitRAMSegs:
  1583.     PUSH    ES
  1584.     MOV     [haveEMM],0
  1585.     CMP     [useems],0
  1586.     JE      IRAS_noEMS
  1587.     MOV     AX,3567h
  1588.     INT     21h
  1589.     CMP     [DWORD PTR ES:10],'XMME'
  1590.     JNE     IRAS_noEMS
  1591.     CMP     [DWORD PTR ES:14],'0XXX'
  1592.     JNE     IRAS_noEMS
  1593.     MOV     AH,41h
  1594.     INT     67h
  1595.     CMP     AH,0
  1596.     JNE     IRAS_noEMS
  1597.     MOV     [normramseg],BX
  1598.     MOV     AH,46h
  1599.     INT     67h
  1600.     OR      AH,AH
  1601.     JNE     IRAS_noEMS
  1602.     CMP     AL,040h
  1603.     JC      IRAS_noEMS
  1604.     MOV     AX,05801h
  1605.     INT     67h
  1606.     OR      AH,AH
  1607.     JNE     IRAS_noEMS
  1608.     CMP     CX,5
  1609.     JC      IRAS_noEMS
  1610.     CMP     CX,500
  1611.     JNC     IRAS_noEMS      ; panic!
  1612.  
  1613.     MOV     AX,5800h
  1614.     MOV     DI,SEG DiskBuf
  1615.     MOV     ES,DI
  1616.     MOV     DI,OFFSET DiskBuf
  1617.     INT     67h
  1618.     OR      AH,AH
  1619.     JNE     IRAS_noEMS
  1620.     XOR     AX,AX
  1621.     MOV     [emsscrmem],AX
  1622.     MOV     BX,[normramseg]
  1623.     MOV     SI,OFFSET DiskBuf
  1624. IRAS_EMSCheckL:
  1625.     LODSW
  1626.     MOV     DI,AX
  1627.     LODSW
  1628.     CMP     DI,BX
  1629.     JNE     IRAS_EMSCL_NotPF
  1630.     CMP     AX,0                    ; just a safety check
  1631.     JNE     IRAS_noEMS
  1632. IRAS_EMSCL_NotPF:
  1633.     CMP     [emsscrmem],0
  1634.     JNE     IRAS_EMSCL_Not4
  1635.     CMP     AX,4
  1636.     JC      IRAS_EMSCL_Not4
  1637.     MOV     DX,SEG hiram
  1638.     CMP     DI,DX
  1639.     JC      IRAS_EMSCL_Not4
  1640.     ADD     DX,0C00h
  1641.     CMP     DI,DX
  1642.     JNC     IRAS_EMSCL_Not4
  1643.  
  1644.     MOV     [emsscrmem],DI
  1645.     MOV     [emsscrpage],AX
  1646.  
  1647.         INC     AX                      ; now, see if we can have two pages
  1648.         CMP     [SI+2],AX
  1649.         JNE     IRAS_FoundOne_ButHalfBad
  1650.         XOR     AX,AX
  1651.         SUB     DX,0400h
  1652.         CMP     DI,DX
  1653.         JNC     IRAS_FoundOne_ButHalfBad
  1654.         CMP     CX,1
  1655.         JE      IRAS_FoundOne_ButHalfBad
  1656.  
  1657.         MOV     AX,0C00h
  1658. IRAS_FoundOne_ButHalfBad:
  1659.         MOV     [crtc32mask],AX
  1660.  
  1661.         JMP     IRAS_OK
  1662. IRAS_EMSCL_Not4:
  1663.     LOOP    IRAS_EMSCheckL
  1664.     CMP     [emsscrmem],0
  1665.     JE      IRAS_noEMS
  1666. IRAS_OK:
  1667.     MOV     AX,4E03h
  1668.     INT     67h
  1669.     OR      AH,AH
  1670.     JNE     IRAS_noEMS
  1671.     MOV     AX,4E00h
  1672.     MOV     DI,OFFSET pgtable
  1673.     PUSH    DS
  1674.     POP     ES
  1675.     INT     67h
  1676.     OR      AH,AH
  1677.     JNE     IRAS_noEMS
  1678.     MOV     AH,43h
  1679.     MOV     BX,8
  1680.     INT     67h
  1681.     CMP     AH,0
  1682.     JNE     IRAS_noEMS
  1683.     MOV     [haveEMM],1
  1684.     MOV     [emmha],DX
  1685.     MOV     BX,0
  1686.     MOV     AX,4400h
  1687.         PUSH    DX
  1688.     INT     67h
  1689.         POP     DX
  1690.     MOV     BX,1
  1691.     MOV     AX,4401h
  1692.         PUSH    DX
  1693.     INT     67h
  1694.         POP     DX
  1695.     MOV     BX,2
  1696.     MOV     AX,4402h
  1697.         PUSH    DX
  1698.     INT     67h
  1699.         POP     DX
  1700.     MOV     BX,3
  1701.     MOV     AX,4403h
  1702.         PUSH    DX
  1703.     INT     67h
  1704.         POP     DX
  1705.     MOV     BX,3
  1706.     MOV     AX,[emsscrpage]
  1707.     MOV     AH,044h
  1708.     INT     67h
  1709.     MOV     [mappedscr],3
  1710.     JMP     IRAS_End
  1711. IRAS_noEMS:
  1712.         MOV     [crtc32mask],0
  1713.     MOV     [normramseg],SEG rambase
  1714.     MOV     DX,OFFSET emsfail
  1715.     CALL    print
  1716. IRAS_End:
  1717.     POP     ES
  1718.     RET
  1719.  
  1720. CleanupEMM:
  1721.     CMP     [haveEMM],0
  1722.     JE      CEMM_Ret
  1723.     MOV     AH,45h
  1724.     MOV     DX,[emmha]
  1725.     INT     67h
  1726.     PUSH    ES
  1727.     MOV     AX,4E01h
  1728.     MOV     SI,OFFSET pgtable
  1729.     PUSH    DS
  1730.     POP     ES
  1731.     INT     67h
  1732.     POP     ES
  1733. CEMM_Ret:
  1734.     RET
  1735.  
  1736. ResetRAMState:
  1737.     PUSH    EAX
  1738.     MOV     EAX,[DWORD PTR ramstatetab]
  1739.     MOV     [DWORD PTR ramstate],EAX
  1740.     MOV     EAX,[DWORD PTR ramstatetab+4]
  1741.     MOV     [DWORD PTR ramstate+4],EAX
  1742.     POP     EAX
  1743.     RET
  1744.  
  1745. RethinkRamState:
  1746.     CMP     [haveEMM],0
  1747.     JNE     RTRS_EMM
  1748.     PUSHAD
  1749.     PUSH    ES
  1750.  
  1751.     MOV     AL,[BYTE PTR sysstat+1]
  1752.     AND     AX,7
  1753.     MOV     [BYTE PTR sysstat+1],AL
  1754.     ADD     AX,AX
  1755.     ADD     AX,AX
  1756.     ADD     AX,AX
  1757.     MOV     SI,AX
  1758.     ADD     SI,OFFSET ramstatetab
  1759.     MOV     DI,OFFSET ramstate
  1760.     MOV     CX,8
  1761. RTRS_Loop:
  1762.     LODSB
  1763.     CMP     AL,[DI]
  1764.     JE      RTRS_Equal
  1765.     MOV     AH,[DI]
  1766.     CALL    ExBanks
  1767. RTRS_Equal:
  1768.     INC     DI
  1769.     LOOP    RTRS_Loop
  1770.     CALL    GetScrBankPt
  1771.     POP     ES
  1772.     POPAD
  1773.     RET
  1774. RTRS_EMM:
  1775.     PUSHAW
  1776.     MOV     [doingems],1
  1777.     MOV     AL,[BYTE PTR sysstat+1]
  1778.     AND     AX,7
  1779.     MOV     [BYTE PTR sysstat+1],AL
  1780.     ADD     AX,AX
  1781.     ADD     AX,AX
  1782.     ADD     AX,AX
  1783.     MOV     SI,AX
  1784.     ADD     SI,OFFSET ramstatetab
  1785.     MOV     DI,OFFSET ramstate
  1786.     PUSH    DI
  1787.     XOR     BH,BH
  1788.     MOV     BL,[SI]
  1789.     MOV     AX,4400h
  1790.     MOV     DX,[emmha]
  1791.     PUSH    SI
  1792.     INT     67h
  1793.     POP     SI
  1794.  
  1795.     XOR     BH,BH
  1796.     MOV     BL,[SI+1]
  1797.     MOV     AX,4401h
  1798.     MOV     DX,[emmha]
  1799.     PUSH    SI
  1800.     INT     67h
  1801.     POP     SI
  1802.  
  1803.     XOR     BH,BH
  1804.     MOV     BL,[SI+2]
  1805.     MOV     AX,4402h
  1806.     MOV     DX,[emmha]
  1807.     PUSH    SI
  1808.     INT     67h
  1809.     POP     SI
  1810.  
  1811.     XOR     BH,BH
  1812.     MOV     BL,[SI+3]
  1813.     MOV     AX,4403h
  1814.     MOV     DX,[emmha]
  1815.     PUSH    SI
  1816.     INT     67h
  1817.     POP     SI
  1818.  
  1819.     POP     DI
  1820.     LODSD
  1821.     MOV     [DS:DI],EAX
  1822.     LODSD
  1823.     MOV     [DS:DI+4],EAX
  1824.     XOR     EAX,EAX
  1825.     POPAW
  1826.     MOV     [doingems],0
  1827.     RET
  1828.  
  1829. ExBanks:                ; IN: AL = Bank1, AH = Bank2 / corrects RamState
  1830.     PUSH    SI
  1831.     PUSH    DI
  1832.     PUSH    CX
  1833.     CALL    GetBankAddr
  1834.     XCHG    AL,AH
  1835.     PUSH    ES
  1836.     POP     FS
  1837.     MOV     SI,DI
  1838.     CALL    GetBankAddr
  1839.     MOV     CX,1000h
  1840.     PUSH    EAX
  1841.     PUSH    DX
  1842.     MOV     DX,4
  1843. EXBA_ExLoop:
  1844.     MOV     EAX,[ES:DI]
  1845.     XCHG    EAX,[FS:SI]
  1846.     STOSD
  1847.     ADD     SI,DX
  1848.     LOOP    EXBA_ExLoop
  1849.     POP     DX
  1850.     POP     EAX
  1851.     MOV     CX,8
  1852.     MOV     SI,OFFSET ramstate
  1853. EXBA_Correct:
  1854.     CMP     [SI],AL
  1855.     JNE     EXBA_NotAL
  1856.     MOV     [SI],AH
  1857.     JMP     EXBA_CorrectL
  1858. EXBA_NotAL:
  1859.     CMP     [SI],AH
  1860.     JNE     EXBA_CorrectL
  1861.     MOV     [SI],AL
  1862. EXBA_CorrectL:
  1863.     INC     SI
  1864.     LOOP    EXBA_Correct
  1865.     POP     CX
  1866.     POP     DI
  1867.     POP     SI
  1868.     RET
  1869.  
  1870. GetScrBankPt:
  1871.     CMP     [haveEMM],0
  1872.     JE      GSBP_noEMS
  1873.         MOV     AX,[crtc32state]
  1874.         CMP     [map32state],AX
  1875.         JNE     GSBP_NeedMapping
  1876.  
  1877.     MOV     AX,[scrbase]
  1878.     SHR     AX,14
  1879.     CMP     AX,[mappedscr]
  1880.  
  1881.     JE      GSBP_MappingOK
  1882. GSBP_NeedMapping:
  1883.     PUSHAW
  1884.     MOV     BX,[scrbase]
  1885.     SHR     BX,14
  1886.     MOV     [mappedscr],BX
  1887.     MOV     AX,[emsscrpage]
  1888.     MOV     AH,044h
  1889.     MOV     DX,[emmha]
  1890.     INT     67h
  1891.  
  1892.         MOV     AX,[crtc32state]
  1893.         MOV     [map32state],AX
  1894.         CMP     AX,0C00h
  1895.         JNE     GSBP_No32Scr
  1896.         MOV     BX,[mappedscr]
  1897.         INC     BX
  1898.         AND     BX,3
  1899.     MOV     AX,[emsscrpage]
  1900.         INC     AL
  1901.     MOV     AH,044h
  1902.     MOV     DX,[emmha]
  1903.     INT     67h
  1904. GSBP_No32Scr:
  1905.  
  1906.     POPAW
  1907. GSBP_MappingOK:
  1908.     MOV     AX,[emsscrmem]
  1909.     MOV     [WORD PTR scrbankpt+2],AX
  1910.     XOR     AX,AX
  1911.     MOV     [WORD PTR scrbankpt],AX
  1912.     RET
  1913. GSBP_noEMS:
  1914.     MOV     AX,[scrbase]
  1915.     SHR     AX,14
  1916.     CALL    GetBankAddr
  1917.     MOV     [WORD PTR scrbankpt],DI
  1918.     MOV     [WORD PTR scrbankpt+2],ES
  1919.     RET
  1920.  
  1921. GetBankAddr:            ; IN: AL = Bank / OUT: ES:DI Bankaddr
  1922.     PUSH    DS
  1923.     POP     ES
  1924.     PUSH    CX
  1925.     MOV     DI,OFFSET ramstate
  1926.     MOV     CX,8
  1927.     REPNE   SCASB
  1928.     SUB     DI,OFFSET ramstate+1
  1929.     CMP     DI,4
  1930.     JC      GBAD_Lo
  1931.     AND     DI,3
  1932.     ROR     DI,2
  1933.     PUSH    SEG hiram
  1934.     POP     ES
  1935.     JMP     GBAD_End
  1936. GBAD_Lo:
  1937.     ROR     DI,2
  1938.     PUSH    SEG rambase
  1939.     POP     ES
  1940. GBAD_End:
  1941.     POP     CX
  1942.     RET
  1943.  
  1944. RethinkMemMap:
  1945.     MOV     BP,[normramseg]
  1946.     BT      [sysstat],2
  1947.     JC      RMM_LOK
  1948.     MOV     BP,SEG amsdos
  1949. RMM_LOK:
  1950.     MOV     [memmap],BP
  1951. RMM_TestUpper:
  1952.     MOV     BP,[normramseg]
  1953.     MOV     [memmap+2],BP
  1954.     MOV     [memmap+4],BP
  1955.  
  1956.     BT      [sysstat],3
  1957.     JC      RMM_UOK
  1958.     CMP     [romnum],7
  1959.     JE      RMM_SetFloppy
  1960.     MOV     BP,SEG basic
  1961.     SUB     BP,0C00h
  1962.     JMP     RMM_UOK
  1963. RMM_SetFloppy:
  1964.     MOV     BP,SEG rom7
  1965.     SUB     BP,0C00h
  1966. RMM_UOK:
  1967.     MOV     [memmap+6],BP
  1968.  
  1969.     RET
  1970.  
  1971.  ; **************************************************************** Snapshots
  1972.  
  1973. LoadSnap:
  1974.     PUSHAD
  1975.     MOV     [snapha],0ffffh
  1976.     MOV     DX,OFFSET snapdir
  1977.     MOV     AX,3d02h
  1978.     INT     21h
  1979.     JC      LOSN_End
  1980.     MOV     [snapha],AX
  1981.  
  1982.     MOV     BX,AX
  1983.     MOV     AH,3fh
  1984.     MOV     CX,256
  1985.     MOV     DX,OFFSET SnapBuffer
  1986.     INT     21h
  1987.     JC      LOSN_Close
  1988.     CMP     [DWORD PTR SnapBuffer+4],'ANS ' ; check file id
  1989.     JNE     LOSN_Close
  1990.     CMP     [DWORD PTR SnapBuffer],'- VM'
  1991.     JNE     LOSN_Close
  1992.     CMP     [BYTE PTR SnapBuffer+10h],1   ; snapshot version (1/2)?
  1993.     JE      LOSN_Ver1
  1994.     CMP     [BYTE PTR SnapBuffer+10h],2
  1995.     JE      LOSN_Ver2
  1996.     JMP     LOSN_Close
  1997.  
  1998. LOSN_Ver2:
  1999.  
  2000. LOSN_Ver1:
  2001.     CALL    reset
  2002.  
  2003.     POPAD                                 ; read Z80 registers
  2004.     MOV     AX,[SnapBuffer+11h]
  2005.     ROL     AX,8
  2006.     MOV     sBC,[SnapBuffer+13h]
  2007.     MOV     sDE,[SnapBuffer+15h]
  2008.     MOV     nsHL,[SnapBuffer+17h]
  2009.     MOV     sPC,[SnapBuffer+23h]
  2010.     PUSHAD
  2011.  
  2012.     MOV     AL,[BYTE PTR SnapBuffer+19h]
  2013.     MOV     [BYTE PTR srF],AL
  2014.     AND     AL,80h
  2015.     MOV     [BYTE PTR srFhi],AL
  2016.     MOV     AL,[BYTE PTR SnapBuffer+1Ah]
  2017.     MOV     [BYTE PTR srI],AL
  2018.     MOV     AL,[BYTE PTR SnapBuffer+1Bh]
  2019.     MOV     [sIFF1],AL
  2020.     MOV     AL,[BYTE PTR SnapBuffer+1Ch]
  2021.     MOV     [sIFF2],AL
  2022.     MOV     AX,[SnapBuffer+1Dh]
  2023.     MOV     [ix],AX
  2024.     MOV     AX,[SnapBuffer+1Fh]
  2025.     MOV     [iy],AX
  2026.     MOV     AX,[SnapBuffer+21h]
  2027.     MOV     [simstack],AX
  2028.     MOVZX   AX,[BYTE PTR SnapBuffer+25h]
  2029.     MOV     [imode],AX
  2030.     MOV     AX,[SnapBuffer+26h]
  2031.     ROL     AX,8
  2032.     MOV     [sAFx],AX
  2033.     MOV     AX,[SnapBuffer+28h]
  2034.     MOV     [sBCx],AX
  2035.     MOV     AX,[SnapBuffer+2Ah]
  2036.     MOV     [sDEx],AX
  2037.     MOV     AX,[SnapBuffer+2Ch]
  2038.     MOV     [sHLx],AX
  2039.  
  2040.     MOV     BX,0                            ; set gary
  2041. LOSN_SetCols:
  2042.     MOV     AL,[BYTE PTR EBX+SnapBuffer+2Fh]
  2043.     MOV     [BYTE PTR rgsgarr],BL
  2044.     MOV     [BYTE PTR rgsgarr+1],AL
  2045.     CALL    ga_setcol
  2046.     INC     BX
  2047.     CMP     BX,17
  2048.     JNE     LOSN_SetCols
  2049.     MOV     AL,[BYTE PTR SnapBuffer+2eh]
  2050.     MOV     [BYTE PTR rgsgarr],AL
  2051.     MOV     AL,[BYTE PTR SnapBuffer+40h]
  2052.     MOV     [BYTE PTR rgsgarr+2],AL
  2053.     MOV     AL,[BYTE PTR SnapBuffer+41h]
  2054.     MOV     [BYTE PTR rgsgarr+3],AL
  2055.  
  2056.     MOV     AL,[BYTE PTR SnapBuffer+42h]             ; set CRTC
  2057.     MOV     [CRTCregnum],AL
  2058.     PUSH    ES
  2059.     PUSH    DS
  2060.     POP     ES
  2061.     MOV     SI,OFFSET SnapBuffer+43h
  2062.     MOV     DI,OFFSET CRTCregs
  2063.     MOV     CX,9
  2064.     REP     MOVSW
  2065.  
  2066.     MOV     AL,[BYTE PTR SnapBuffer+55h]
  2067.     MOV     [BYTE PTR romnum],AL
  2068.     MOV     AL,[BYTE PTR SnapBuffer+56h]
  2069.     MOV     [port8255a],AL
  2070.     MOV     AL,[BYTE PTR SnapBuffer+57h]
  2071.     MOV     [port8255b],AL
  2072.     MOV     AL,[BYTE PTR SnapBuffer+58h]
  2073.     MOV     [port8255c],AL
  2074.     MOV     AL,[BYTE PTR SnapBuffer+59h]
  2075.     MOV     [control8255],AL
  2076.     MOV     AL,[BYTE PTR SnapBuffer+5Ah]
  2077.     MOV     [psgregnum],AL
  2078.     MOV     SI,OFFSET SnapBuffer+5Bh
  2079.     MOV     DI,OFFSET PSGregs
  2080.     MOV     CX,8
  2081.     REP     MOVSW
  2082.     POP     ES
  2083.  
  2084.     MOV     BX,[snapha]                     ; read the RAM
  2085.     PUSH    DS
  2086.     PUSH    [normramseg]
  2087.     POP     DS
  2088.     MOV     DX,0
  2089.     MOV     CX,32768
  2090.     MOV     AH,3fh
  2091.     INT     21h
  2092.     ADD     DX,CX
  2093.     MOV     AH,3fh
  2094.     INT     21h
  2095.     POP     DS
  2096.  
  2097.     MOV     BP,0                            ; now we can use all the new
  2098. LOSN_SetPSG:                                    ; values
  2099.     PUSH    BP
  2100.     CALL    DoSound
  2101.     POP     BP
  2102.     INC     BP
  2103.     CMP     BP,14
  2104.     JNE     LOSN_SetPSG
  2105.  
  2106.     CALL    RethinkMemMap
  2107.     CALL    RethinkRamState
  2108.     POPAD
  2109.     InitPCSeg
  2110.     PUSHAD
  2111.     CALL    RethinkCRTC
  2112.     CALL    RethinkMode
  2113.     CALL    GenModeTab
  2114.     MOV     [scrtype],0ffffh
  2115.     MOV     [intflag],0
  2116. LOSN_Close:
  2117.     MOV     BX,[snapha]
  2118.     MOV     AH,3Eh
  2119.     INT     21h
  2120. LOSN_End:
  2121.     POPAD
  2122.     RET
  2123.  
  2124. SaveSnap:
  2125.     PUSHAD
  2126.         CALL    GetSaveSnapName
  2127.  
  2128.         CMP     [snaname],0
  2129.     JE      SASN_End
  2130.  
  2131.     MOV     [snapha],0ffffh
  2132.     MOV     DX,OFFSET snapdir
  2133.     MOV     AX,3c00h
  2134.     XOR     CX,CX
  2135.     INT     21h
  2136.     JC      SASN_End
  2137.     MOV     [snapha],AX
  2138.  
  2139.     MOV     DX,OFFSET SnapBuffer
  2140.     MOV     [DWORD PTR EDX],'- VM'
  2141.     MOV     [DWORD PTR EDX+4],'ANS '
  2142.     MOV     [BYTE PTR EDX+10h],1    ; snapshot version must be 1
  2143.  
  2144.     POPAD
  2145.     ROL     AX,8                              ; read Z80 registers
  2146.     MOV     [SnapBuffer+11h],AX
  2147.     ROL     AX,8
  2148.     MOV     [SnapBuffer+13h],sBC
  2149.     MOV     [SnapBuffer+15h],sDE
  2150.     MOV     [SnapBuffer+17h],nsHL
  2151.     MOV     [SnapBuffer+23h],sPC
  2152.     PUSHAD
  2153.  
  2154.     MOV     AL,[BYTE PTR srF]
  2155.     AND     AL,7fh
  2156.     OR      AL,[BYTE PTR srFhi]
  2157.     MOV     [BYTE PTR SnapBuffer+19h],AL
  2158.     MOV     AL,[BYTE PTR srI]
  2159.     MOV     [BYTE PTR SnapBuffer+1Ah],AL
  2160.  
  2161.     MOV     AL,[sIFF1]
  2162.     MOV     [BYTE PTR SnapBuffer+1Bh],AL
  2163.     MOV     AL,[sIFF2]
  2164.     MOV     [BYTE PTR SnapBuffer+1Ch],AL
  2165.     MOV     AX,[ix]
  2166.     MOV     [SnapBuffer+1Dh],AX
  2167.     MOV     AX,[iy]
  2168.     MOV     [SnapBuffer+1Fh],AX
  2169.     MOV     AX,[simstack]
  2170.     MOV     [SnapBuffer+21h],AX
  2171.     MOV     AX,[imode]
  2172.     MOV     [BYTE PTR SnapBuffer+25h],AL
  2173.     MOV     AX,[sAFx]
  2174.     ROL     AX,8
  2175.     MOV     [SnapBuffer+26h],AX
  2176.     MOV     AX,[sBCx]
  2177.     MOV     [SnapBuffer+28h],AX
  2178.     MOV     AX,[sDEx]
  2179.     MOV     [SnapBuffer+2Ah],AX
  2180.     MOV     AX,[sHLx]
  2181.     MOV     [SnapBuffer+2Ch],AX
  2182.  
  2183.     MOV     BX,0                            ; set gary
  2184. SASN_SetCols:
  2185.     MOV     AL,[BYTE PTR EBX+garrcols]
  2186.     MOV     [BYTE PTR EBX+SnapBuffer+02Fh],AL
  2187.     INC     BX
  2188.     CMP     BX,17
  2189.     JNE     SASN_SetCols
  2190.     MOV     AL,[BYTE PTR rgsgarr]
  2191.     MOV     [BYTE PTR SnapBuffer+2eh],AL
  2192.     MOV     AL,[BYTE PTR rgsgarr+2]
  2193.     MOV     [BYTE PTR SnapBuffer+40h],AL
  2194.     MOV     AL,[BYTE PTR rgsgarr+3]
  2195.     MOV     [BYTE PTR SnapBuffer+41h],AL
  2196.  
  2197.     MOV     AL,[CRTCregnum]
  2198.     MOV     [BYTE PTR SnapBuffer+42h],AL             ; set CRTC
  2199.     PUSH    ES
  2200.     PUSH    DS
  2201.     POP     ES
  2202.     MOV     DI,OFFSET SnapBuffer+43h
  2203.     MOV     SI,OFFSET CRTCregs
  2204.     MOV     CX,9
  2205.     REP     MOVSW
  2206.  
  2207.     MOV     AL,[BYTE PTR romnum]
  2208.     MOV     [BYTE PTR SnapBuffer+55h],AL
  2209.     MOV     AL,[port8255a]
  2210.     MOV     [BYTE PTR SnapBuffer+56h],AL
  2211.     MOV     AL,[port8255b]
  2212.     MOV     [BYTE PTR SnapBuffer+57h],AL
  2213.     MOV     AL,[port8255c]
  2214.     MOV     [BYTE PTR SnapBuffer+58h],AL
  2215.     MOV     AL,[control8255]
  2216.     MOV     [BYTE PTR SnapBuffer+59h],AL
  2217.     MOV     AL,[psgregnum]
  2218.     MOV     [BYTE PTR SnapBuffer+5Ah],AL
  2219.     MOV     DI,OFFSET SnapBuffer+5Bh
  2220.     MOV     SI,OFFSET PSGregs
  2221.     MOV     CX,8
  2222.     REP     MOVSW
  2223.     POP     ES
  2224.  
  2225.     MOV     [SnapBuffer+06bh],64
  2226.     MOV     [SnapBuffer+06ch],0
  2227.  
  2228.     MOV     BX,[snapha]
  2229.     MOV     CX,256
  2230.     MOV     DX,OFFSET SnapBuffer
  2231.     MOV     AX,4000h
  2232.     INT     21h
  2233.  
  2234.     PUSH    DS
  2235.     PUSH    [normramseg]
  2236.     POP     DS
  2237.     MOV     DX,0
  2238.     MOV     CX,32768
  2239.     MOV     AH,40h
  2240.     INT     21h
  2241.     ADD     DX,CX
  2242.     MOV     AH,40h
  2243.     INT     21h
  2244.     POP     DS
  2245.  
  2246.     MOV     BX,[snapha]
  2247.     MOV     AH,3Eh
  2248.     INT     21h
  2249. SASN_End:
  2250.     POPAD
  2251.     CALL    GetSnapDir
  2252.     RET
  2253. ENDS
  2254.  
  2255. SEGMENT _data PAGE PUBLIC 'DATA'
  2256.  
  2257. emsfail  db 'EMS not available',13,10,0
  2258.  
  2259. prefname db 'prefs.cpe',0
  2260.  
  2261. SnapBuffer dw 256 DUP (?)
  2262.  
  2263. LABEL MenuScr BYTE
  2264.     db '               CPE Preferences                                                  '
  2265.     db '                                                                                '
  2266.     db '  Borders (only relevant in full 800x600 mode)                                  '
  2267.     db '  Green monitor                                                                 '
  2268.     db '  Use sound card                                                                '
  2269.     db '  Use Soundblaster noise generator                                              '
  2270.     db '  German keyboard                                                               '
  2271.     db '  Use joystick                                                                  '
  2272.     db '  Emulate R register                                                            '
  2273.     db '  Wait for frame fly (recommended)                                              '
  2274.     db '  Permit vertical overscan (turn off when possible)                             '
  2275.     db 80 DUP (' ')
  2276.     db 80 DUP (' ')
  2277.     db 80 DUP (' ')
  2278.     db 80 DUP (' ')
  2279.     db 80 DUP (' ')
  2280.     db 80 DUP (' ')
  2281.     db 80 DUP (' ')
  2282.     db 80 DUP (' ')
  2283.     db 80 DUP (' ')
  2284.     db 80 DUP (' ')
  2285.     db 80 DUP (' ')
  2286.     db 80 DUP (' ')
  2287.     db 80 DUP (' ')
  2288.     db 80 DUP (' ')
  2289.     db 80 DUP (' ')
  2290.     db 80 DUP (' ')
  2291.     db 80 DUP (' ')
  2292.     db 80 DUP (' ')
  2293.     db 80 DUP (' ')
  2294.     db 80 DUP (' ')
  2295.  
  2296. MenuItems   dw 9
  2297.  
  2298. LABEL CPEPrefs WORD
  2299. sbdelay     dw 23h
  2300. bogoval     dw 52h
  2301. bogoval2    dw 1
  2302. SBInstalled dw 0ffffh
  2303. SBport      dw 220h
  2304. lptnum      dw 1
  2305. bogoval3    dw 62h
  2306. cpctype     dw 3
  2307. refreshrate dw 1
  2308. usevesa     dw 0
  2309. smallvesa   dw 0
  2310. graphmenu   dw 0ffffh
  2311. useems      dw 0ffffh
  2312. gusint      dw 0bh
  2313. quietcas    dw 0ffffh
  2314.  
  2315. LABEL MenuVars WORD
  2316. borders     dw 0ffffh
  2317. colmode     dw 0
  2318. usesound    dw 0ffffh
  2319. noisy       dw 0ffffh
  2320. germkey     dw 0ffffh
  2321. usejoy      dw 0
  2322. emulr       dw 0ffffh
  2323. dowait      dw 0ffffh
  2324. vertoverscn dw 0
  2325.  
  2326. LABEL joystuff WORD
  2327. joyr        dw 0
  2328. joyu        dw 0
  2329. joyl        dw 0
  2330. joyd        dw 0
  2331.  
  2332. havejoy     dw 0f00bh
  2333.  
  2334. MoTable db 0,1,2,0
  2335.  
  2336. vesabuffer  db    256 DUP (?)
  2337. vesapage    dw    0
  2338. savedvesapage dw  0
  2339.  
  2340.     EVEN
  2341.  
  2342.  ; CPC-Ports
  2343.  ; ************************************************ CRTC 6845
  2344.         EVEN
  2345. CRTCregnum  db    ?,?           ; BCxx
  2346. CRTCregs    dw    16 DUP (?)    ; BDxx/BFxx 18 regs of video controller
  2347.  
  2348. scrbase     dw    0C000h        ; extract from CRTC regs 12/13
  2349. scroff      dw    0             ;  "       "    "    "     "
  2350. pcrtcscrwidth db   ?
  2351. crtcscrwidth db   ?             ; copy of CRTC reg 1
  2352. crtchsync   dw    0
  2353. crtcvtotal  dw    ?
  2354. scrtype     dw    0             ; 1,2: normal/normal 50Hz; 3: extended
  2355. doublelinmode dw  0             ; active screen uses double lines
  2356. dlmode      dw    0
  2357. videomode   db    0             ; CPC mode 0,1,2 - for fullscr modes only
  2358.  
  2359. crtc32mask  dw    0             ; for 32K screens
  2360. crtc32state dw    0
  2361.  
  2362. scrbankpt   dd    0
  2363.  ; ************************************************ 8255, PSG
  2364.         EVEN
  2365. port8255a   db    ?   ; F4
  2366. port8255b   db    ?   ; F5
  2367. port8255c   db    ?   ; F6
  2368. control8255 db    ?   ; F7
  2369. psgregnum   db    ?,?
  2370. psgregs     dw    128 DUP (?)
  2371. psgregmod   dw    128 DUP (?)
  2372. channeloff  dw    0
  2373. PSGcount    dw    0
  2374.  
  2375.  ; ************************************************ GATE ARRAY
  2376.         EVEN
  2377. romnum      dw    ?             ; this is the DFxx port
  2378. rgsgarr     dw    ?             ; 7Fxx 4  regs of gate array
  2379. sysstat     dw    ?   ; 7Fxx this and the last line MUST be kept together
  2380. memstate    db    0,0
  2381. ramstate    db    0,1,2,3,4,5,6,7
  2382.  
  2383. ramstatetab db    0,1,2,3,4,5,6,7
  2384.         db    0,1,2,7,4,5,6,3
  2385.         db    4,5,6,7,0,1,2,3
  2386.         db    0,3,2,7,4,5,6,1
  2387.         db    0,4,2,3,1,5,6,7
  2388.         db    0,5,2,3,4,1,6,7
  2389.         db    0,6,2,3,4,5,1,7
  2390.         db    0,7,2,3,4,5,6,1
  2391.  
  2392. memmap      dw    SEG amsdos,SEG rambase,SEG rambase,SEG rambase
  2393.  
  2394. haveEMM     dw    0
  2395. normramseg  dw    0
  2396. emmha       dw    0
  2397. doingems    dw    0
  2398.  
  2399. emsscrmem   dw    0
  2400. emsscrpage  dw    0
  2401. mappedscr   dw    0
  2402. map32state  dw    0
  2403. emsmalloc   dw    0
  2404.  
  2405. needmodetab dw    0
  2406. garrcols    db    20 DUP (?)
  2407.  
  2408. modetab     dd    520 DUP (?)
  2409.  
  2410. mode0tab    dd    520 DUP (?)
  2411. mode1tab    dd    520 DUP (?)
  2412. mode2tab    dd    520 DUP (?)
  2413.  
  2414. bordercol   dw    0
  2415. newborcol   dw    0
  2416. borchanges  dw    0
  2417.  
  2418.  ; ************************************************ Interrupts
  2419.         EVEN
  2420. intreq      dw    ?
  2421. ffly        dw    ?
  2422.  
  2423.  ; ************************************************ cleanup area
  2424. oldintadd   dw    0             ; 86 interrupt torture
  2425. oldintseg   dw    0
  2426. oldnoiadd   dw    0
  2427. oldnoiseg   dw    0
  2428. timercount  dw    0
  2429. timerval    dw    0f84h
  2430. pcffcount   dw    0
  2431. OldVideo    dw    3
  2432.  
  2433. ffly_dec_std dw   2
  2434. ffly_dec     dw   0
  2435.  
  2436. intcount     dw   0
  2437.  
  2438. pgtable     dw    256 DUP (?)           ; hopefully large enough
  2439.  
  2440. ENDS
  2441.  
  2442. SEGMENT _stack PARA STACK 'STACK'
  2443.  
  2444. TapeBuffer  dw    800h DUP (?)
  2445. TapeLoadBuf dw    800h DUP (?)
  2446.  
  2447. stck    dw 1000 dup (?)
  2448. stckend dw ?
  2449. ENDS
  2450.  
  2451. SEGMENT SEGRAM PRIVATE PARA USE32
  2452. rambase db      65536 DUP (?)
  2453. ENDS
  2454. SEGMENT SEGLOROM PRIVATE PARA
  2455. amsdos  db      16386 DUP (?)
  2456. ENDS
  2457. SEGMENT SEGBASIC PRIVATE PARA
  2458. basic   db      16386 DUP (?)
  2459. ENDS
  2460. SEGMENT SEGROM7 PRIVATE PARA
  2461. rom7    db      16386 DUP (?)
  2462. ENDS
  2463. SEGMENT SEGHIRAM PRIVATE PARA USE32
  2464. hiram   db      65536 DUP (?)
  2465. ENDS
  2466.  
  2467.     END